You are on page 1of 388

Universidad Nacional San Cristóbal 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ón de

Defensas Ribereñas con ObjectARX C++

Presentado por : Ayala Bizarro, Iván Arturo

Ayacucho Perú
2009
PRESENTACIÓN

La presente tesis lleva por tı́tulo Programa Lluvia Escorrentı́a Para Simulación de Defen-
sas Ribereñas con ObjectARX C++, como una contribución a la investigación y progra-
mación en el área de la ingenierı́a hidráulica. La realización de esta investigación sale a luz
luego de haber trabajado en múltiples problemas relacionados con el estudio de defensas
ribereñas y tránsito de flujos en cauces naturales, con el afán de plasmar mediante un
programa informático que involucre análisis hidrológico, análisis hidráulico y finalmente
hidráulica fluvial, se plantea el desarrollo informático mediante el lenguaje de programa-
ción C++ y ObjectARX. Esperando que su aplicación sirva a todos aquellos profesionales
y estudiantes inmersos a la hidráulica.

Ayala Bizarro, Iván Arturo


ayalabizarro@gmail.com

Escuela Profesional de Ingenierı́a Civil


Universidad Nacional San Cristóbal de Huamanga
Ayacucho, Agosto de 2009.

i
DEDICATORIA

A DIOS por iluminar y bendecir mi camino. A mis


padres, Manuel Ayala Toscano y Marı́a Bizarro Ortı́z,
quienes me apoyaron de manera incondicional en mi for-
mación académica; gracias a ustedes por apostar siem-
pre en la educación. A mis hermanos y a ti Jessica por
darme una felicidad y alegrı́a incomparable.

ii
AGRADECIMIENTOS

A los docentes de la Universidad Nacional de San Cristóbal de Huamanga -


Facultad de Ingenierı́a de Minas Geologı́a y Civil, por su contribución durante
mi desarrollo académico y profesional.

Al Ingeniero Joel Oré Iwanaga, que durante mi formación profesional no sólo


se ha dedicado a incentivarme en la investigación de la ingenierı́a hidráulica,
sino que también orientó mi futuro académico y personal, a quien considero un
modelo de docente universitario, y muy aparte de ser mi asesor en el presente
proyecto de investigación es un gran amigo.

Como dejar de agradecer al Ingeniero Cristian Castro Pérez, talentoso ami-


go, con muchas ganas de compartir informaciones a todos aquellos que están
interesados en la investigación; sus conocimientos son dignos de admiración.

A la Ingeniera Jessica Zúñiga Mendoza, por su colaboración en la realización


de la presente tesis, muchos detalles importantes y primordiales de la presente
investigación son gracias a sus cualidades de las que no cuento. Gracias por
tu ayuda y tu tiempo desinteresado.

Al Ingeniero Ernesto Estrada Cárdenas, por su colaboración y orientación y


por permitirme conocer a esa gran persona que hay detrás del profesional que
nos muestra.

iii
Al Ingeniero Jaime Bendezú Prado, por su entusiasmo, dinamismo y sobre
todo empeño en las clases académicas.

A mis compañeros de la Universidad Nacional de San Cristóbal de Huamanga:


Juan Luis Taype Carrasco, Edmundo Canchari Gutierrez, César Yupanqui,
Odiger Tacas, por compartir muchos momentos agradables durante nuestra
permanencia en la Universidad.

A la Universidad Nacional de San Cristóbal de Huamanga, alma máter, 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 formación profesional.

Al Dr. Arturo Leon Cuba por apoyar en la investigación y brindar oportuni-


dades al respecto.

A mis compañeros de la Maestrı́a de la Universidad Nacional de Ingenierı́a:


Juan Carlos Rodriguez, Freddy Velazquez, Edwin Arapa, grandes amigos y
compañeros de carpeta.

En general, agradecer a todos aquellos que no menciono, pero sı́ contribuyeron


con sus palabras de ánimos y consejos para seguir siempre adelante, como la
Sra. Cecilia.
RESUMEN

Este proyecto de investigación nace con el objetivo de contribuir a la Ingenierı́a Civil


dentro del área de hidráulica y su desarrollo concierne a trabajos hidrológicos, hidráulicos
e hidráulica fluvial, para ello se crea una herramienta, pretendiendo facilitar y disminuir
aquellos procedimientos tediosos que se nos presentan al momento de realizar el análisis
en los tres parámetros mencionados anteriormente.

Especı́ficamente, la tesis trata del desarrollo de un programa llamado PLEDER, que viene
a ser las iniciales del nombre de la investigación realizada. EL lenguaje de programación
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, también facilita
el acceso al sistema gráfico, permitiendo definir comandos nativos dentro de programa
AutoCAD, además crea objetos personalizados en la base de datos para las aplicaciones
especificas.

El contenido teórico de la presente tesis de investigación, explica los pasos y los procedi-
mientos a seguir mediante la utilización de los diferentes métodos que se desarrollan en los
capı́tulos 2, 3, 4 y 5, más adelante se resume el contenido de éstos capı́tulos divididos en
etapas. En el capı́tulo 6, se hace referencia a la aplicación práctica mediante el programa
elaborado, el cual permitirá comprobar la relación teórico-práctico. Finalmente se adjunta
los diagramas de flujo y el código fuente del programa.

v
En la etapa Hidrológica, se desarrolla la programación de los modelos matemáticos para
simulación precipitación escorrentı́a desde generación de hietogramas, en el cual se utiliza
dos metodologı́as como el método de IILA-SENAMHI-UNI mediante el método del bloque
alterno propuesto por Ven Te Chow, método de los hietogramas sintéticos de tormentas
desarrollado por el Servicio de Conservación de Suelos del Departamento de Agricultura
de los EEUU (1986), en la actualidad (NRCS). Determinación de abstracciones, mediante
el modelo del número de curva propuesto por el NRCS de los EEUU. Determinación de
hidrogramas unitarios, donde se emplea los modelos del Hidrograma Unitario Sintético de
Snyder y del NRCS. Determinación de hidrogramas de máximas avenidas: Esta etapa se
desarrollará mediante el método de convolución directa.

La etapa Hidráulica, es la parte fundamental de la presente investigación, que consiste


en transitar los caudales de máximas avenidas a través de las secciones transversales
naturales, considerando para el caso flujo permanente gradualmente variado y su solución
numérica mediante el método del paso estándar. La etapa hidráulica permite conocer las
caracterı́sticas hidráulicas de diseño como son el tirante, velocidades máximas en el canal
principal y las llanuras izquierdo y derecho.

En la etapa Hidráulica 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 gráfico correspondiente.

Se debe tener en cuenta que la programación 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.
Índice general

Portada

Presentación I

Dedicatoria II

Agradecimientos III

Resumen V

Índice General VII

Índice de Cuadros XII

Índice de Figuras XV

1. INTRODUCCIÓN 1

1.1. Antecedentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

1.2. Necesidad o motivación de la investigación . . . . . . . . . . . . . . . . . . 2

1.3. Objetivos de la tesis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

vii
ÍNDICE GENERAL

1.3.1. Generales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

1.3.2. Especı́ficos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

1.4. Organización de la tesis . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

2. TEORÍA HIDROLÓGICA Y DIAGRAMAS DE FLUJO 7

2.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

2.2. Desarrollo de Hietogramas de diseño . . . . . . . . . . . . . . . . . . . . . 8

2.2.1. IILA-SENAMHI-UNI . . . . . . . . . . . . . . . . . . . . . . . . . . 9

2.2.2. Hietogramas sintéticos del NRCS . . . . . . . . . . . . . . . . . . . 9

2.3. Tasas de Infiltración - Método del NRCS . . . . . . . . . . . . . . . . . . . 12

2.4. Hidrogramas Unitarios Sintéticos: NRCS y Snyder . . . . . . . . . . . . . . 18

2.4.1. Hidrograma Unitario . . . . . . . . . . . . . . . . . . . . . . . . . . 18

2.4.2. Hidrograma Unitario Sintético . . . . . . . . . . . . . . . . . . . . . 21

2.5. Método de Convolución discreta para transformación precipitación-


escorrentı́a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

2.5.1. Sistema Lineal en el tiempo continuo . . . . . . . . . . . . . . . . . 28

2.5.2. Sistema Lineal en tiempo discreto . . . . . . . . . . . . . . . . . . . 29

2.5.3. Función respuesta de pulso discreto y Ecuación de Convolución Dis-


creta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

2.6. Diagramas de Flujo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

viii
ÍNDICE GENERAL

3. TEORÍA HIDRÁULICA Y SECCIONES TRANSVERSALES EN


RÍOS 42

3.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

3.2. Bases teóricos para el cálculo de flujo unidimensional . . . . . . . . . . . . 43

3.2.1. Ecuación de Movimiento General. . . . . . . . . . . . . . . . . . . . 43

3.2.2. Ecuación de Movimiento del flujo. . . . . . . . . . . . . . . . . . . . 44

3.2.3. Flujo Permanente. . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

3.2.4. Flujo Uniforme. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

3.3. Secciones Transversales en Cauces Naturales y Cálculo Numérico. . . . . . 48

3.4. Cálculo del Tirante Normal . . . . . . . . . . . . . . . . . . . . . . . . . . 51

3.4.1. Cálculo Numérico . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

3.5. Caracterı́sticas y Clasificación de los Perfiles del Flujo Gradualmente Variado 60

3.6. Ecuaciones para el cálculo de perfiles básicos. . . . . . . . . . . . . . . . . 64

4. MODELOS NUMÉRICOS EN RÍOS Y DIAGRAMAS DE FLUJO 68

4.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

4.2. Formulación de Flujos en 1D . . . . . . . . . . . . . . . . . . . . . . . . . . 69

4.2.1. Ecuaciones Hidrodinámicas 1D . . . . . . . . . . . . . . . . . . . . 69

4.2.2. Propiedades Hidráulicas Compuestas . . . . . . . . . . . . . . . . . 71

4.2.3. Propiedades Hidráulicas Compuestas . . . . . . . . . . . . . . . . . 76

4.3. Cálculos Uni-dimensionales para flujos en canales o cauces abiertos . . . . 77

4.3.1. Cálculos de Flujos Permanentes 1-D . . . . . . . . . . . . . . . . . 77

4.3.2. Resumen de ecuaciones empleados en el programa PLEDER . . . . 82

4.4. Diagramas de flujo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

ix
ÍNDICE GENERAL

5. SOCAVACIÓN EN RÍOS Y DIAGRAMAS DE FLUJO 95

5.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95

5.2. Clasificación de los Rı́os . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95

5.2.1. Cauce principal definido . . . . . . . . . . . . . . . . . . . . . . . . 96

5.2.2. Cauce principal indefinido . . . . . . . . . . . . . . . . . . . . . . . 96

5.3. Socavación General en cauces definidos . . . . . . . . . . . . . . . . . . . . 97

5.3.1. Socavación General para Suelos Cohesivos . . . . . . . . . . . . . . 97

5.3.2. Socavación General para Suelos No Cohesivos . . . . . . . . . . . . 102

5.4. Diagramas de flujo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104

6. APLICACIÓN PRÁCTICA DEL PROGRAMA DESARROLLADO 110

6.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110

6.2. Descripción General de Programa PLEDER . . . . . . . . . . . . . . . . . 111

6.3. Cálculos y Resultados Hidrológicos . . . . . . . . . . . . . . . . . . . . . . 115

6.3.1. Parámetro Cuenca [U] . . . . . . . . . . . . . . . . . . . . . . . . . 116

6.3.2. Parámetro Precipitación [P] . . . . . . . . . . . . . . . . . . . . . . 118

6.3.3. Parámetro Tiempo [T] . . . . . . . . . . . . . . . . . . . . . . . . . 119

6.3.4. Hidrogramas de Salida . . . . . . . . . . . . . . . . . . . . . . . . . 119

6.4. Cálculos y Resultados Hidráulicos . . . . . . . . . . . . . . . . . . . . . . . 122

6.4.1. Secciones Transversales . . . . . . . . . . . . . . . . . . . . . . . . . 123

6.4.2. Flujo Permanente . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

6.4.3. Resultados y Perfil de superficie libre . . . . . . . . . . . . . . . . . 125

6.5. Cálculos y Resultados de Socavaciones Generales . . . . . . . . . . . . . . 127

x
ÍNDICE GENERAL

7. CONCLUSIONES Y RECOMENDACIONES 129

7.1. Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129

7.2. Recomendaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131

Bibliografı́a 132

A. HIDROLOGÍA CÓDIGO FUENTE C++ 137

B. HIDRÁULICA CÓDIGO FUENTE C++ 201

C. HIDRÁULICA FLUVIAL CÓDIGO FUENTE C++ 313

D. RESULTADOS DEL PROGRAMA 329

E. PLANOS 370

xi
Índice de cuadros

2.1. Parámetro regional b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

2.2. Clasificación de clases antecedentes de humedad (AMC) para el método de


abstracciones de lluvia del NRCS . . . . . . . . . . . . . . . . . . . . . . . 17

2.3. Grupo de suelo hidrológico, para el cálculo del CN . . . . . . . . . . . . . 18

5.1. Valores del coeficiente ϕ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98

5.2. Valores de X , para suelos cohesivos y no cohesivos . . . . . . . . . . . . . 99

6.1. Datos de la cuenca principal . . . . . . . . . . . . . . . . . . . . . . . . . 115

6.2. Caudales máximos para diferentes Perı́odos de Retorno . . . . . . . . . . . 122

D.1. Coordenadas hidrograma TR = 50 años . . . . . . . . . . . . . . . . . . . . 329

D.1. Continuación de la tabla Coordenadas hidrograma TR = 50 años . . . . . . 330

D.1. Continuación de la tabla Coordenadas hidrograma TR = 50 años . . . . . . 331

D.1. Continuación de la tabla Coordenadas hidrograma TR = 50 años . . . . . . 332

D.1. Continuación de la tabla Coordenadas hidrograma TR = 50 años . . . . . . 333

D.2. Coordenadas hidrograma TR = 100 años . . . . . . . . . . . . . . . . . . . 333

D.2. Continuación de la tabla Coordenadas hidrograma TR = 100 años . . . . . 334

xii
ÍNDICE DE CUADROS

D.2. Continuación de la tabla Coordenadas hidrograma TR = 100 años . . . . . 335

D.2. Continuación de la tabla Coordenadas hidrograma TR = 100 años . . . . . 336

D.2. Continuación de la tabla Coordenadas hidrograma TR = 100 años . . . . . 337

D.3. Coordenadas hidrograma TR = 200 años . . . . . . . . . . . . . . . . . . . 337

D.3. Continuación de la tabla Coordenadas hidrograma TR = 200 años . . . . . 338

D.3. Continuación de la tabla Coordenadas hidrograma TR = 200 años . . . . . 339

D.3. Continuación de la tabla Coordenadas hidrograma TR = 200 años . . . . . 340

D.3. Continuación de la tabla Coordenadas hidrograma TR = 200 años . . . . . 341

D.4. Coordenadas hidrograma TR = 500 años . . . . . . . . . . . . . . . . . . . 341

D.4. Continuación de la tabla Coordenadas hidrograma TR = 500 años . . . . . 342

D.4. Continuación de la tabla Coordenadas hidrograma TR = 500 años . . . . . 343

D.4. Continuación de la tabla Coordenadas hidrograma TR = 500 años . . . . . 344

D.4. Continuación de la tabla Coordenadas hidrograma TR = 500 años . . . . . 345

D.5. Resultados parámetros hidráulicos TR = 50 años . . . . . . . . . . . . . . . 345

D.5. Continuación de la tabla parámetros hidráulicos TR = 50 años . . . . . . . 346

D.5. Continuación de la tabla parámetros hidráulicos TR = 50 años . . . . . . . 347

D.5. Continuación de la tabla parámetros hidráulicos TR = 50 años . . . . . . . 348

D.5. Continuación de la tabla parámetros hidráulicos TR = 50 años . . . . . . . 349

D.5. Continuación de la tabla parámetros hidráulicos TR = 50 años . . . . . . . 350

D.5. Continuación de la tabla parámetros hidráulicos TR = 50 años . . . . . . . 351

D.6. Resultados parámetros hidráulicos TR = 100 años . . . . . . . . . . . . . . 351

D.6. Continuación de la tabla parámetros hidráulicos TR = 100 años . . . . . . . 352

xiii
ÍNDICE DE CUADROS

D.6. Continuación de la tabla parámetros hidráulicos TR = 100 años . . . . . . . 353

D.6. Continuación de la tabla parámetros hidráulicos TR = 100 años . . . . . . . 354

D.6. Continuación de la tabla parámetros hidráulicos TR = 100 años . . . . . . . 355

D.6. Continuación de la tabla parámetros hidráulicos TR = 100 años . . . . . . . 356

D.6. Continuación de la tabla parámetros hidráulicos TR = 100 años . . . . . . . 357

D.7. Resultados parámetros hidráulicos TR = 200 años . . . . . . . . . . . . . . 357

D.7. Continuación de la tabla parámetros hidráulicos TR = 200 años . . . . . . . 358

D.7. Continuación de la tabla parámetros hidráulicos TR = 200 años . . . . . . . 359

D.7. Continuación de la tabla parámetros hidráulicos TR = 200 años . . . . . . . 360

D.7. Continuación de la tabla parámetros hidráulicos TR = 200 años . . . . . . . 361

D.7. Continuación de la tabla parámetros hidráulicos TR = 200 años . . . . . . . 362

D.7. Continuación de la tabla parámetros hidráulicos TR = 200 años . . . . . . . 363

D.8. Resultados parámetros hidráulicos TR = 500 años . . . . . . . . . . . . . . 363

D.8. Continuación de la tabla parámetros hidráulicos TR = 500 años . . . . . . . 364

D.8. Continuación de la tabla parámetros hidráulicos TR = 500 años . . . . . . . 365

D.8. Continuación de la tabla parámetros hidráulicos TR = 500 años . . . . . . . 366

D.8. Continuación de la tabla parámetros hidráulicos TR = 500 años . . . . . . . 367

D.8. Continuación de la tabla parámetros hidráulicos TR = 500 años . . . . . . . 368

D.8. Continuación de la tabla parámetros hidráulicos TR = 500 años . . . . . . . 369

xiv
Índice de figuras

2.1. Hietograma: Intensidad-Tiempo . . . . . . . . . . . . . . . . . . . . . . . . 8

2.2. Distribución de tormenta de 24 horas NRCS . . . . . . . . . . . . . . . . . 11

2.3. Distribución de tormenta de los cuatro tipos NRCS . . . . . . . . . . . . . 12

(P −0,2S)2
2.4. Solución gráfica de la ecuación Pe = P +0,8S
, (Fuente: Chapter 10 Esti-
mation of Direct Runoff from Storm Rainfall ) . . . . . . . . . . . . . . . . 16

2.5. Hidrograma Unitario: Principio de Proporcionalidad . . . . . . . . . . . . . 20

2.6. Hidrograma Unitario Sintético del NRCS . . . . . . . . . . . . . . . . . . . 22

2.7. a) Hidrograma Unitario estándar (tp = 5,5tr ); b) Hidrograma Unitario


requerido (tp 6= 5,5tr ). Fuente [11] . . . . . . . . . . . . . . . . . . . . . . . 23

2.8. PLEDER: Coordenadas del Hidrograma Unitario Sintético Snyder . . . . 25

2.9. Sistema hidrológico: continuidad de agua almacenada. . . . . . . . . . . . . 28

3.1. Fuerza Actuante en un Fluido . . . . . . . . . . . . . . . . . . . . . . . . . 44

3.2. Sección Transversal en Cauces Naturales . . . . . . . . . . . . . . . . . . . 49

3.3. Elementos geométricos de las Secciones Transversales en: i, j, k . . . . . . . 49

3.4. Pendiente del banco izquierdo a la superficie libre . . . . . . . . . . . . . . 57

3.5. Pendiente del banco derecho a la superficie libre . . . . . . . . . . . . . . . 57

xv
ÍNDICE DE FIGURAS

3.6. Esquema para superficie libre de agua . . . . . . . . . . . . . . . . . . . . . 60

3.7. Sistema de clasificación de perfiles de flujo gradualmente variado . . . . . . 62

3.8. Balance de Energı́a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

4.1. Representación de la sección transversal en el Método Alpha . . . . . . . . 72

4.2. Sección transversal compuesta con llanuras de inundación . . . . . . . . . . 75

4.3. Malla Uni-dimensional, Modelo de cauce en 1D . . . . . . . . . . . . . . . 79

5.1. Sección transversal en cauce principal definido . . . . . . . . . . . . . . . . 96

5.2. Sección transversal en cauce principal indefinido . . . . . . . . . . . . . . . 96

5.3. Sección transversal, Socavación general . . . . . . . . . . . . . . . . . . . . 100

5.4. Franja en estudio para la socavación . . . . . . . . . . . . . . . . . . . . . 100

6.1. Ícono: PLIILA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111

6.2. Ícono: PLNRCS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112

6.3. Ícono: PLLLES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112

6.4. Ícono: PLCNC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112

6.5. Ícono: PLHU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112

6.6. Ícono: PLHSTC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113

6.7. Ícono: PLHCAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113

6.8. Ícono: PLHPSL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113

6.9. Ícono: PLHTST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

6.10. Ícono: PLHRES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

6.11. Ícono: PLHDEL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

xvi
ÍNDICE DE FIGURAS

6.12. Ícono: PLHSOC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

6.13. Ícono: PLHSCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115

6.14. PLEDER, paneles Ribbon . . . . . . . . . . . . . . . . . . . . . . . . . . . 115

6.15. PLEDER, datos Transformación Lluvia Escorrentı́a . . . . . . . . . . . . . 116

6.16. PLEDER, área desde una polilı́nea . . . . . . . . . . . . . . . . . . . . . . 117

6.17. PLEDER, curva Número Compuesto . . . . . . . . . . . . . . . . . . . . . 117

6.18. PLEDER, cálculo del tiempo de retardo . . . . . . . . . . . . . . . . . . . 118

6.19. PLEDER, modelo meteorológico NRCS . . . . . . . . . . . . . . . . . . . . 119

6.20. Hidrograma TR = 50 años . . . . . . . . . . . . . . . . . . . . . . . . . . . 120

6.21. Hidrograma TR = 100 años . . . . . . . . . . . . . . . . . . . . . . . . . . . 120

6.22. Hidrograma TR = 200 años . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

6.23. Hidrograma TR = 500 años . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

6.24. Planta Rı́o Huallaga . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122

6.25. PLEDER, secciones transversales . . . . . . . . . . . . . . . . . . . . . . . 123

6.26. AutoCAD secciones transversales . . . . . . . . . . . . . . . . . . . . . . . 124

6.27. PLEDER, cálculo del flujo permanente . . . . . . . . . . . . . . . . . . . . 125

6.28. PLEDER, resultados-parámetros hidráulicos . . . . . . . . . . . . . . . . . 126

6.29. Niveles de superficie libre en las secciones transversales . . . . . . . . . . . 126

6.30. PLEDER, parámetros socavación general . . . . . . . . . . . . . . . . . . . 127

6.31. Socavaciones en las secciones transversales . . . . . . . . . . . . . . . . . . 128

xvii
Capı́tulo 1

INTRODUCCIÓN

1.1. Antecedentes

A inicios de los años 60, con la aparición de las primeras computadoras se realizaron
numerosos programas para calcular y/o transformar la lluvia-escorrentı́a y tránsito de
flujos en canales, aplicando distintas metodologı́as, pero en estos años, aún era limitado
desarrollar programas con variables múltiples 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 estocásticos con series limitadas debido a las dimensiones cortas
de sus matrices. Conforme pasaron los tiempos y paralelo al avance de la tecnologı́a, se
mejoró considerablemente metodologı́as computacionales dentro del área de hidráulica e
hidrologı́a, realizando softwares en su máxima expresión, considerando modelos tridimen-
sionales en el espacio y no permanentes en el tiempo, con soluciones numéricas avanzadas
tales como el Método de los Elementos Finitos y/o soluciones mediante la utilización de
Inteligencia Artificial, tales como Algoritmos Genéticos, Redes Neuronales Artificiales,
entre otros.

1
1.2. Necesidad o motivación de la investigación

En la actualidad, existen numerosos programas de otras latitudes, tales como el HEC


RAS, HEC HMS, GSTAR, MIKE 11, RIVER CAD y muchos más, los mismos que se
utilizan directamente sin conocer el fundamento teórico al detalle, lo que nos conlleva en
muchos casos a una interpretación inadecuada. Problemas que surgen debido a que éstos
programas en su gran mayorı́a se encuentran en idioma extranjero y algunos casos con
parámetros de acuerdo a su zona de estudio.

PLEDER, en su primera versión trata de mejorar muchas dificultades como es la recepción


de datos dentro del programa AutoCAD, aprovechando las bondades y herramientas que
ofrece este programa, tales como creación de secciones transversales a partir de polilı́neas,
cálculo de área de un polı́gono (cuencas hidrológicas), cálculos de distancias automáticas
a escalas reales, puntos de referencia en coordenadas UTM y más. Todo esto es posible
gracias a que PLEDER está 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 útil, no sólo para profesionales in-
mersos en el área de hidráulica e hidrologı́a, sino que también se convierta en una ayuda
para los estudiantes interesados en el tema.

1.2. Necesidad o motivación de la investigación

Este tema de investigación, surge con la necesidad de contar con una herramienta de tra-
bajo con múltiples opciones, de tal forma que faciliten la elaboración de diversos proyectos
como es el caso de obras hidráulicas e hidrológicas propios de la Ingenierı́a Civil; por otro
lado el interés de ampliar y profundizar mis conocimientos de programación aplicada,
permitieron hacer una realidad y lograr el producto final como es PLEDER en su primera
versión.

2
1.3. Objetivos de la tesis

1.3. Objetivos de la tesis

1.3.1. Generales

Contribuir con las investigaciones de la ingenierı́a hidráulica, desarrollando un pro-


grama que incluya el estudio hidrológico, hidráulico e hidráulica fluvial para de-
terminar los niveles de la superficie libre de agua en cauces naturales. La etapa
hidrológica se desarrolla teniendo en cuenta la programación desde la generación
de hietogramas hasta la obtención de hidrogramas de máximas avenidas. La etapa
hidráulica tiene un acercamiento al modelo HEC 2 (en la actualidad HECRAS), pe-
ro en versión nacional de la Escuela de Ingenierı́a Civil de la Universidad Nacional
de San Cristóbal de Huamanga. Finalmente la etapa de Hidráulica Fluvial, permite
determinar la socavación 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 presentación de la tesis Programa Lluvia Escorrentı́a Para Si-


mulación de Defensas Ribereñas con ObjectARX C++, es el de obtener el Tı́tulo
Profesional de Ingeniero Civil.

Realizar la programación en a nivel hidrológico, considerando para ello la transfor-


mación lluvia escorrentı́a a través de los siguientes modelos:

• Generación de Hietogramas: IILA - SENAMHI - UNI y Hietograma sintético


del SCS.

• Generación de Hidrogramas unitarios sintéticos: SCS y Snyder.

• Generación de Hidrogama de máximas avenidas: Método de convolución dis-


creta

3
1.4. Organización de la tesis

Realizar la programación a nivel hidráulico considerando para ello la programa-


ción de un método adecuado para la simulación de flujo permanente gradualmente
variado, teniendo en cuenta lo siguiente:

• Programación del método del paso estándar para simulación de cauces aluviales
en flujo permanente gradualmente variado a través de n secciones transversales
de un rı́o.

• Incorporación de coeficientes de rugosidad de manning por tramos en la sección


transversal que permita acercarse mas a una situación real de tránsito del flujo
a través de un rı́o.

• Perdidas por contracción y expansión.

Realizar la programación a nivel de hidráulica fluvial, que permita obtener la so-


cavación 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 serán enlazados de tal manera de contar con una
herramienta de programación sumamente útil que permita diseñar en forma segura
y óptima una defensa ribereña.

1.4. Organización de la tesis

El Capı́tulo 1, describe en forma general la tesis en introducción, motivación de la


investigación, los objetivos de la tesis y la organización de la presente investigación.

En el Capı́tulo 2, se presenta conceptos hidrológicos y diagramas de flujos de la


programación realizada. Este capı́tulo resume los método empleados en el progra-
ma, ası́ como la teorı́a necesaria tales como hietogramas IILA, NRCS, hidrogramas

4
1.4. Organización de la tesis

unitarios sintéticos del NRCS, Snyder y el método de convolución para realizar la


transformación Lluvia - Escorrentı́a.

El Capı́tulo 3, enfoca la teorı́a básica y esencial de la hidráulica, desde conceptos


básicos necesarios para la interpretación de los flujos en cauces naturales o rı́os, tales
como la ecuación de movimiento y tipos de flujo. Ası́ mismo, contiene el análisis de
las secciones transversales en cauces naturales principalmente para calcular tirantes
normales en secciones complejas mediante el método de Newton Raphson. Estos
resultados son importantes para la ejecución del perfil de la superficie libre de agua
(ver capı́tulo 4) como condición 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 numéricos y los diagramas de flujo


del componente hidráulico, conteniendo la formulación de los flujos 1D con propie-
dades hidráulicas compuestas del rı́o. Es este capı́tulo se discretizan las ecuaciones
no lineales de la superficie libre de agua, indicando el método de solución.

El Capı́tulo 5, corresponde a la teorı́a del componente hidráulica 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 múl-
tiples parámetros o datos necesarios para este fin.

El Capı́tulo 6, es la aplicación práctica de la herramienta en los tres componentes


mencionados, especificando las distintas funciones para su correcto uso. Se detalla La
aplicación práctica desde el ingreso de los datos, ejecución del programa y obtención
de los resultados en los tres componentes.

El Capı́tulo 7, abarca las conclusiones que se obtuvieron durante la realización


de la presente investigación, ası́ mismo las recomendaciones según las experiencias
adquiridas.

5
1.4. Organización de la tesis

Bibliografı́a, Ofrece una amplia relación de bibliografı́a empleada para la realiza-


ción de la investigación, en los componentes Hidrologı́a, Hidráulica, Método Numé-
ricos, Programación C++, Matemáticas Avanzadas, Papers, Journals, Manuales de
Aplicación y algunos Apuntes de Clase.

Apéndice A, presenta el contenido del código fuente C++ en el componente Hi-


drológico.

Apéndice B, presenta el contenido del código fuente C++ en el componente Hi-


dráulico.

Apéndice C, presenta el contenido del código fuente C++ en el componente Hi-


dráulica Fluvial.

Apéndice D, contiene los resultados de la aplicación práctica del programa.

Apéndice E, corresponde a los planos, cartográficos, red topológico, altitudinal,


perfiles longitudinales y los planos planta-perfil del rı́o Huallaga.

6
Capı́tulo 2

TEORÍA HIDROLÓGICA Y
DIAGRAMAS DE FLUJO

2.1. Introducción

En la mayorı́a de los proyectos de sistema de recursos hı́dricos, tales como análisis o


simulación de cuenca, prevención de avenidas, diseño de embalses, aliviaderos, entre otros
muchos, conllevan a sustentar un sistema hidrológico que comprende desde la entrada de
datos tales como precipitaciones y/o caudales de registro en el punto de interés, circulación
o propagación de flujos (cuenca, tramo del canal, embalse) y finalmente el caudal de salida,
que es el parámetro importante para los diseños de prevención 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 métodos garantizándonos y/o acercándonos lo
más 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

7
2.2. Desarrollo de Hietogramas de diseño

o comportamiento que realiza PLEDER en ésta transformación, obteniendo los resultados


en tablas dinámicas que facilitan su exportación a extensiones tipo excel y resultados
gráficos del hidrograma.

2.2. Desarrollo de Hietogramas de diseño

La palabra Hietograma proviene del término griego Hietos, que significa lluvia. Es un
resumen gráfico escalonado de un conjunto de datos, donde nos permite ver pautas que
son difı́ciles de observar en una simple tabla numérica (expresa precipitación en función
del tiempo). En ordenadas puede figurar la precipitación caı́da (mm), o bien la intensidad
de precipitación (mm/hora). Generalmente se representa como un histograma (gráfico
barras), aunque a veces también se expresa como un gráfico de lı́neas.

Figura 2.1: Hietograma: Intensidad-Tiempo

8
2.2. Desarrollo de Hietogramas de diseño

2.2.1. IILA-SENAMHI-UNI

Las precipitaciones máximas e intensidades máximas de tormentas han sido estudiadas


regionalmente por el Instituto Italiano Latino Americano IILA (Convenio Internacional
IILA-SENAMHI-UNI) “Estudio de la Hidrologı́a del Perú“ 1983, cuyas fórmulas 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 precipitación y la intensidad de tormenta para una duración t (en
horas) y de periodo de retorno T (en años) dados; a,K y n son constantes regionales. El
parámetro b se clasifica según las regiones naturales del Perú

Cuadro 2.1: Parámetro regional b


Región Parámetro b
Costa, Centro y Sur 0.50
Sierra 0.40
Costa Norte y selva 0.20

El valor 0.40 horas (sierra), fue determinado en base a estudios de pluviógrafos en las
estaciones de Abancay y Chuquibamba.

2.2.2. Hietogramas sintéticos del NRCS

El Natural Resources Conservation Service del US (NRCS) o conocido antes como (SCS)
Soil Conservation Service, desarrolló hidrogramas sintéticos de tormentas para utilizarse

9
2.2. Desarrollo de Hietogramas de diseño

en los Estados Unidos con duraciones de tormentas de 6 y 24 horas. Estos hietogramas se


dedujeron al utilizar la información presentada por Hershfield (1961) y Miller Frederick y
Tracey (1973) y datos de tormentas adicionales (Fuente [11]).
La distribución de precipitaciones SCS tiene una larga historia y éste ha demostrado tener
éxito a través de los años. 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, también
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 húmedos y
veranos secos, el tipo III representa zonas a lo largo del Golfo de Mexico y de las zonas
costeras del Atlántico, donde las tormentas tropicales a las 24 horas del dı́a son grandes
cantidades de precipitación, y el tipo II representa el resto del paı́s (NRCS,1986).

10
2.2. Desarrollo de Hietogramas de diseño

Pt/P24 TORMENTA TIPO I Pt/P24 TORMENTA TIPO IA


1 1

0.8 0.8

0.6 0.6

0.4 0.4

0.2 0.2

0 0
0 2 4 6 8 10 12 14 16 18 20 22 24 0 2 4 6 8 10 12 14 16 18 20 22 24
Tiempo (horas) Tiempo (horas)

Pt/P24 Pt/P24
TORMENTA TIPO II TORMENTA TIPO III
1 1

0.8 0,8

0.6 0,6

0.4 0,4

0.2 0,2

0 0
0 2 4 6 8 10 12 14 16 18 20 22 24 0 2 4 6 8 10 12 14 16 18 20 22 24
Tiempo (horas) Tiempo (horas)

Figura 2.2: Distribución 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 precipitación 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 más intensa.

11
2.3. Tasas de Infiltración - Método del NRCS

Pt/P24
1

0.9

0.8

0.7

0.6

0.5

0.4

0.3
Tipo I
Tipo IA
0.2
Tipo II
Tipo III
0.1

0
0 2 4 6 8 10 12 14 16 18 20 22 24
Tiempo (horas)

Figura 2.3: Distribución de tormenta de los cuatro tipos NRCS

2.3. Tasas de Infiltración - Método del NRCS

El objetivo de esta sección es conseguir la precipitación neta1 o precipitación efectiva la


que produce escorrentı́a directa, por lo tanto, previamente debemos separar, qué parte de
la precipitación total va a generar escorrentı́a directa. Ası́ mismo identificar el resto de la
precipitación que se ha infiltrado o una pequeña parte pudo haberse quedado retenida en
depresiones superficiales.

Para obtener estas precipitaciones, empleamos el método del NRCS, cuyo procedimiento
1
Precipitación Neta: generalmente se utiliza para la precipitación que produce escorrentı́a directa,
aunque en otros estudios se refiere a la diferencia precipitación - evaporación

12
2.3. Tasas de Infiltración - Método del NRCS

se estableció empı́ricamente USA (1964). Este método fue producto de investigación de


años, donde participaron numerosos investigadores tales como Mockus 1949, Sherman
1942, Andrews 1954 y Ogrosky 1956. 2 .

La ecuación de la escorrentı́a efectiva cuando P > Ia es:

(P − Ia )2
Pe = (2.3.1)
(P − Ia ) + S

y cuando P ≤ Ia
Pe = 0 (2.3.2)

Donde:

Pe = Profundidad en exceso de precipitación o escorrentı́a directa.


P = Profundidad de precipitación.
Ia = Abstracción inicial.
S = Potencial de retención máxima.

Estas relaciones son basados en la conservación de masa (Mockus) La escorrentı́a directa Pe


es siempre menor o igual a la profundidad de precipitación P , de manera similar, después
de que la escorrentı́a se inicia, la profundidad adicional del agua retenida en la cuenca
Fa es menor o igual a alguna retención potencial máxima S. Existe una cierta cantidad
de precipitación Ia (Abstracción inicial antes del estrechamiento) en donde no ocurrirá
escorrentı́a, luego la escorrentı́a potencial es P − Ia . La hipótesis del método de NRCS,
consiste en que las relaciones de las dos cantidades reales y las dos cantidades potenciales
sean iguales. Mockus determinó estas relaciones primero, considerando la condición en
que la abstracción inicial Ia = 0 y obtuvo.
2
Chapter 10. Estimation of Direct Runoff from Storm Rainfall

13
2.3. Tasas de Infiltración - Método del NRCS

Fa Pe
= (2.3.3)
S P

Donde:

Fa = Retención actual después de la escorrentı́a dada.

Para satisfacer la conservación de masa se tiene.

F a = P − Pe (2.3.4)

Sustituyendo la ecuación 2.3.4 en 2.3.3 se tiene.

P − Pe Pe
= (2.3.5)
S P

Despejando Pe

P2
Pe = (2.3.6)
P +S

Este es la relación precipitación-escorrentı́a bajo la condición de que la abstracción inicial


es cero (Ia = 0).

Cuando la abstracción inicial no es cero, la cantidad de la precipitación disponible para


la escorrentı́a es (P − Ia ) en lugar de P . Sustituyendo (P − Ia ) para P en la ecuación
2.3.3 resulta.

Fa Pe
= (2.3.7)
S P − Ia

Donde:

14
2.3. Tasas de Infiltración - Método del NRCS

Fa ≤ S y Pe ≤ (P − Ia )

Para este caso la conservación de masa es dado por:

F = (P − Ia ) − Pe (2.3.8)

Sustituyendo la ecuación 2.3.8 en 2.3.7.

(P − Ia ) − Pe Pe
= (2.3.9)
S P − Ia

Resolviendo para la profundidad en exceso de precipitación o escorrentı́a directa Pe .

(P − Ia )2
Pe = (2.3.10)
(P − Ia ) + S

Es la ecuación básica para estimar la profundidad en exceso de precipitación o escorren-


tı́a directa de una tormenta utilizando el método NRCS. La abstracción inicial consiste
principalmente en intercepción, infiltración durante los comienzos de la tormenta, y las
1
depresiones o almacenamientos en la superficie. Establecen una relación empı́rica para
estimar ésta abstracción inicial Ia , que está en función al potencial máximo de retención
S.

Ia = 0,2S (2.3.11)

Reemplazando en la ecuación 2.3.10.

(P − 0,2S)2
Pe = (2.3.12)
P + 0,8S
1
Resultado obtenido al estudiar muchas cuencas experimentales pequeñas

15
2.3. Tasas de Infiltración - Método del NRCS

AL presentar en gráficas la información de P y Pe para muchas cuencas, el NRCS encontró


curvas como las que se muestra en la figura 2.4. Para estandarizar estas curvas, se define un
número adimensional de curva CN , tal que 0 ≤ CN ≤ 100. Para superficies impermeables
y superficies de agua CN = 100, para superficies naturales CN < 100.

(P −0,2S)2
Figura 2.4: Solución gráfica de la ecuación Pe = P +0,8S
, (Fuente: Chapter 10 Estimation
of Direct Runoff from Storm Rainfall )

El Número de Curva CN en relación a S en pulgadas (in).

1000
S= − 10 (2.3.13)
CN

El Número de Curva CN en relación a S en milı́metros (mm).

16
2.3. Tasas de Infiltración - Método del NRCS

25400
CN = (2.3.14)
254 + S

Los números de curva que se muestran en la figura 2.4 se aplican para condiciones antece-
dentes de Humedad (AMC, por sus siglas en inglés) normales (AMC II). Para condiciones
secas (AMC I) o condiciones húmedas (AMC III), los números de curva equivalente pue-
den calcularse por

4,2CN (II)
CN (I) = (2.3.15)
10 − 0,058CN (II)

23CN (II)
CN (III) = (2.3.16)
10 − 0,13CN (II)

Cuadro 2.2: Clasificación de clases antecedentes de humedad (AMC) para el método de


abstracciones de lluvia del NRCS
Lluvia antecedente total de 5 dı́as (pulg)
Grupo AMC Estación Estación
Inactiva de crecimiento
I Menor que 0.5 Menor que 1.4
II 0.5 a 1.1 1.4 a 2.1
III 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 números 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, Pág. 154.

17
2.4. Hidrogramas Unitarios Sintéticos: NRCS y Snyder

Cuadro 2.3: Grupo de suelo hidrológico, para el cálculo del CN


GRUPOS DESCRIPCIÓN
Grupo A : Bajo potencial de escurrimiento. Suelos que tienen al-
tas velocidades de infiltración cuando están mojados y
consisten principalmente de arena y gravas profundas,
con bueno a exceso drenaje. Estos suelos tienen altas
velocidades de transmisión del agua.
Grupo B : Suelos con moderada velocidad de infiltración cuando
están mojados y consisten principalmente de suelos con
cantidades moderadas de texturas finas y gruesas, con
drenaje medio y algo profundo. Son básicamente suelos
arenosos.
Grupo C : Suelos que tienen bajas velocidades de infiltración cuan-
do están mojados, consisten principalmente de suelos
que tienen un estrato que impide el flujo del agua. Son
suelos con texturas finas (margas arcillosas, margas are-
nosas poco profundas). Estos suelos tienen bajas veloci-
dades de transmisión.
Grupo D : Alto potencial de escurrimiento. Suelos que tienen muy
bajas velocidades de infiltración cuando están mojados
y consisten principalmente de suelos arcillosos con alto
potencial de hinchamiento, suelos con nivel freático y
permanente, suelos con estratos arcillosos cerca de sus
superficie, o bien, suelos someros sobre horizontes im-
permeables.

2.4. Hidrogramas Unitarios Sintéticos: NRCS y Sny-

der

2.4.1. Hidrograma Unitario

El Hidrograma Unitario es ampliamente utilizado como algoritmo de solución para la


1
transformación lluvia escorrentı́a o lluvia efectiva en caudal. El hidrograma unitarios
es el hidrograma de escurrimiento superficial que resulta de una lluvia efectiva en exceso
1
Conocido originalmente como gráfica unitaria. Fué Propuesto por primera vez por Sherman en 1932.

18
2.4. Hidrogramas Unitarios Sintéticos: NRCS y Snyder

unitaria, distribuida uniformemente durante un perı́odo de tiempo especificado, en un


punto de un curso de agua.

Este método se basa en dos hipótesis:

1. La respuesta de la cuenca ante el proceso de escorrentı́a directa presenta un com-


portamiento lineal, empleándose los principios de proporcionalidad y superposición.

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.

Estás hipótesis presenta las siguientes condiciones:

La lluvia en exceso o lluvia efectiva es de intensidad constante dentro de una duración


efectiva, exigiendo que las tormentas sean de corta duración (tiempo base corto y
un caudal pico único).

La lluvia en exceso está distribuida de manera uniforme sobre toda el área de dre-
naje. El área de drenaje no debe ser muy grande o bien deberá ser subdividida en
2
subcuencas de modo que se cumpla esta suposición

La duración del escurrimiento directo (tiempo base del hidrograma unitario) que
resulta del exceso de lluvia de duración conocida es constante.

El hidrograma unitario de una duración determinada es único 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).
2
El orden de magnitud del lı́mite superior que se maneja es de 300 a 400 km2 (Martı́nez Martı́n 1994)

19
2.4. Hidrogramas Unitarios Sintéticos: NRCS y Snyder

Principios Básicos

La derivación y aplicación del Hidrograma Unitario está basada en una teorı́a empı́rica
que está conformada por dos teoremas o principios básicos que se aplican en todos los
casos:

Principio de Proporcionalidad: Para una lluvia efectiva de una duración 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 duración, tienen el mismo tiempo base, se concluye que las
ordenadas de dichos hidrogramas serán proporcionales a la intensidad de la lluvia efectiva
(figura 2.5).

Figura 2.5: Hidrograma Unitario: Principio de Proporcionalidad

20
2.4. Hidrogramas Unitarios Sintéticos: NRCS y Snyder

Pe1 ie Qe
= 1 = 1 =k (2.4.1)
Pe2 ie2 Qe2

Donde Pe es el volumen de lluvia efectiva, ie la intensidad efectiva y Qe , el caudal de


escorrentı́a directa.

Principio de Superposición: 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 Sintético

Para emplear el método del hidrograma unitario es necesario conocer los registros de pre-
cipitación 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
hidrométricas o registros pluviográficos que sirven para generar dicho dato importante en
la utilización del método hidrograma unitario. Para estos casos, podemos utilizar algunas
fórmulas empı́ricas que, basándose 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
sintéticos.

Hidrograma Unitario Sintético NRCS

También conocido como el hidrograma adimensional del NRCS, es un hidrograma en el


cual se expresa por la relación del caudal q con respecto al caudal pico qp y el tiempo por
la relación del tiempo t con respecto al tiempo de ocurrencia del pico en el hidrograma
unitario, Tp . Para este método es necesario conocer el caudal pico y el tiempo de retardo

21
2.4. Hidrogramas Unitarios Sintéticos: NRCS y Snyder

para la duración de exceso de precipitación, ası́ se construye el hidrograma unitario a


partir del hidrograma sintético adimensional para la cuenca dada.

0.9

0.8

0.7

0.6
q/qp

0.5

0.4

0.3

0.2

0.1

0
0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5
t/Tp

Figura 2.6: Hidrograma Unitario Sintético del NRCS

La figura 2.6 muestra uno de éstos hidrogramas adimensionales, con una forma similar a la
que puede esperarse en una cuenca real. Basándose en una gran cantidad de hidrogramas
unitarios, el NRCS sugiere que el tiempo de recesión puede aproximarse a 1,67Tp . Como
el área del hidrograma es igual a 1cm, se demuestra que:

2,08A
qp = (2.4.2)
Tp

Donde qp es el caudal pico [m3 /s · cm], A es el área de drenaje [km2 ] y Tp es el tiempo


pico [h]. Un estudio de muchas cuencas rurales grandes y pequeñas indica que el tiempo
de retardo o también llamado tlag es igual al 60 % del tiempo de concentración.

tp = tlag = 0,60Tc (2.4.3)

Bajo esta condición se obtiene el tiempo de ocurrencia del pico Tp que se expresa en
términos del tiempo de retardo tp y de la duración de la lluvia efectiva tr .

22
2.4. Hidrogramas Unitarios Sintéticos: NRCS y Snyder

tr
Tp = + tp (2.4.4)
2

Hidrograma Unitario Sintético de Snyder

Snyder (1938), realizó estudios en cuencas de los Montes Apalaches (USA), con áreas
de 30 a 30000 km2 y encontró relaciones sintéticas de un hidrograma unitarios sintético
estándar, 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 estándar (tp = 5,5tr ); b) Hidrograma Unitario reque-
rido (tp 6= 5,5tr ). Fuente [11]

Para una duración de lluvia efectiva determinada, los parámetros 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 área de la cuenca, qpR .

Tiempo base, tb .

23
2.4. Hidrogramas Unitarios Sintéticos: 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 definió el hidrograma unitario estándar como aquel que cumple que:

tp
tr = (2.4.5)
5,5

donde tr es la duración de la lluvia efectiva y tp el tiempo de retardo, ambos del hidrograma


unitario estándard. Además encontró que para un hidrograma unitario estándar 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 más cercano al
centroide del área de la cuenca [km] y Ct es un coeficiente que varı́a entre 1.35 (pendientes
altas) y 1.65 (pendientes bajas). También para el hidrograma unitario estándar se encontró
que el caudal pico por unidad de área [m3 /s · km2 ] es:

2,75Cp
qp = (2.4.7)
tp

Una forma de calcular los parámetros Ct y Cp , es a partir de los datos: área de cuenca A
[km2 ], longitud del cauce principal L [km], Longitud hasta el centroide de la cuenca Lc
[km], duración tR [h], retardo de la cuenca tpR [h] y Qp [m3 /s/cm], donde:


 tR = tr




Si tpR = 5,5tR tpR = tP (2.4.8)



 qpR = qp

24
2.4. Hidrogramas Unitarios Sintéticos: NRCS y Snyder


tr −tR tpR −0,25tR
tp = tpR + , con tr =



 4 5,25

Si tpR 6= 5,5tR tpR = tP (2.4.9)



 qpR = qp

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, según la figura
2.8, cuyo hidrograma se divide en 6 intervalos (siete vértices).

Figura 2.8: PLEDER: Coordenadas del Hidrograma Unitario Sintético Snyder

25
2.4. Hidrogramas Unitarios Sintéticos: NRCS y Snyder

Cálculo de las ecuaciones lineales para cada tramo del hidrograma unitario
sintético Snyder

PLEDER, evalúa para cada tramo mediante la ecuación de la recta Y − Y1 = m(X − X1 )


en el hidrograma dado.

tR
Tramo AB: 0 ≤ T ≤ 2
+ tpR − 31 W50

0,5QpR
Q= tR T (2.4.10)
2
+ tpR − 13 W50

tR tR
Tramo BC: 2
+ tpR − 13 W50 < T ≤ 2
+ tpR − 31 W75

 
3QpR tR 1
Q = 0,5QpR + T− − tpR + W50 (2.4.11)
4(W50 − W75 ) 2 3

tR tR
Tramo CD: 2
+ tpR − 31 W75 < T ≤ 2
+ tpR

 
3QpR tR 1
Q = 0,75QpR + T− − tpR + W75 (2.4.12)
4W75 2 3

tR tR
Tramo DE: 2
+ tpR < T ≤ 2
+ tpR + 32 W75

 
3QpR tR
Q = QpR − T− − tpR (2.4.13)
8W75 2

tR tR
Tramo EF: 2
+ tpR + 23 W75 < T ≤ 2
+ tpR + 23 W50

 
3QpR tR 2
Q = 0,75QpR − T− − tpR − W75 (2.4.14)
8(W50 − W75 ) 2 3

tR
Tramo FG: 2
+ tpR + 32 W50 < T ≤ tb

26
2.5. Método de Convolución discreta para transformación precipitación-escorrentı́a

 
0,5QpR tR 2
Q = 0,50QpR − tR T− − tpR − W50 (2.4.15)
tb − 2 − tpR − 23 W50 2 3

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 sintético.

2.5. Método de Convolución discreta para transfor-

mación precipitación-escorrentı́a

Antes de demostrar la ecuación de la convolución, es necesario conocer la circulación hi-


drológica del flujo o también conocida como Circulación de flujos a través de sistemas
globales. Éste se refiere a que el agua almacenada en sistema hidrológico S, puede relacio-
narse a los caudales de entrada I y de salida Q, mediante la ecuación de continuidad.

dS
=I −Q (2.5.1)
dt

El almacenamiento S, en cualquier instante, puede expresarse por una función 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, d2 I/dt2 , ...dQ/dt, d2 Q/dt2 , ....

dI d2 I dQ d2 Q
 
S = f I, , 2 , ...Q, , (2.5.2)
dt dt dt dt2

27
2.5. Método de Convolución discreta para transformación precipitación-escorrentı́a

Figura 2.9: Sistema hidrológico: continuidad de agua almacenada.

2.5.1. Sistema Lineal en el tiempo continuo

La función de almacenamiento, ecuación 2.5.2, puede expresarse por la ecuación diferencial


lineal con coeficientes constantes

dI d2 I dn−1 I dQ d2 Q dm−1 Q
S = a1 I + a2 + a3 2 + ... + an n−1 + b1 Q + b2 + b3 2 + ... + bm m−1 (2.5.3)
dt dt dt dt dt dt

Donde a1 , a2 , ...an , b1 , b2 , ...bm , son constantes y las derivadas de orden superior se despre-
cian.

Diferenciando esta ecuación 2.5.3 y reemplazando en la ecuación de continuidad 2.5.1.

dn I dn−1 I d2 I dI
an n
+ ... + a n−1 n−1
+ ... + a 2 2
+ a1 − I+
dt dt dt dt (2.5.4)
dm Q dm−1 Q d2 Q dQ
bm m + ... + bm−1 m−1 + ... + b2 2 + b1 +Q=0
dt dt dt dt

simplificando términos en las operaciones diferenciales se tiene.

dn dn−1 d2 d
N (D) = an n
+ ... + a n−1 n−1
+ ... + a 2 2
+ a1 − 1
dt dt dt dt

28
2.5. Método de Convolución discreta para transformación precipitación-escorrentı́a

y
dm dm−1 d2 d
M (D) = −bm m
− ... − b m−1 m−1
− ... − b 2 2
− b1 − 1
dt dt dt dt

por lo tanto la ecuación 2.5.4 en forma compacta es.

N (D)I − M (D)Q = 0 (2.5.5)

Resolviendo queda.
N (D)
Q(t) = I(t) (2.5.6)
M (D)

La relación N (D)/M (D) es llamado función de transferencia del sistema, que describe la
respuesta de la salida a una secuencia de entrada dada (CHOW and VENT T [11]), ası́
1
mismo la ecuación 2.5.4, representa el modelo general del sistema hidrológico.

2.5.2. Sistema Lineal en tiempo discreto

En Las aplicaciones prácticas, las salidas de los resultados se requieren en intervalos tiempo
discretos 2 , ya que la entrada al sistema se especifica como una función 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 información
por pulso). Éste sistema se utiliza para la precipitación y el valor de su función de entrada
discreta para el m-ésimo intervalo de tiempo es:

Z m∆t
Pm = I(τ )dt , m = 1, 2, 3, ... (2.5.7)
(m−1)∆t

1
Presentada por Chow y Kulandaiswamy
2
Debido a que la mayor parte de la información hidrológica solamente está disponible en intervalos de
tiempo discretos.

29
2.5. Método de Convolución discreta para transformación precipitación-escorrentı́a

Pm es la profundidad de la precipitación que cae durante el intervalo de tiempo [L]. El


valor de la salida del sistema en el n-ésimo intervalo de tiempo (t = n∆t) es:

Qn = Q(n∆t) , n = 1, 2, 3, ... (2.5.8)

Qn es el valor instantáneo de la tasa de flujo al final de n-ésimo intervalo de tiempo


[L3 T −1 ]. El efecto de un pulso de entrada de duración ∆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 función
de respuesta de pulso unitario h[t − (m − 1)∆t] = h[n∆t − (m − 1)∆t] = h[(n − m + 1)∆t].

Z (n−m+1)∆t
1
h[(n − m + 1)∆t] = u(l)dl (2.5.9)
∆t (n−m)∆t

Para el pulso m

Pm
I(τ ) = , (m − 1)∆t ≤ τ ≤ m∆t
∆t
I(τ ) = 0 , τ > M ∆t

De la integral de convolución y separando la integral

Z n∆t
Qn = I(τ )u(n∆t − τ )dτ
0
P1 ∆t P2 2∆t
Z Z
= u(n∆t − τ )dτ + u(n∆t − τ )dτ + ... (2.5.10)
∆t 0 ∆t ∆t
Pm m∆t PM M ∆t
Z Z
= u(n∆ − τ )dτ + ... + u(n∆t − τ )dτ
∆t (m−1)∆ ∆t (M −1)∆t

Realizando la sustitución de l = n∆t − τ luego dτ = −dl. La m-ésima integral en la


ecuación 2.5.10 se escribe como

30
2.5. Método de Convolución discreta para transformación precipitación-escorrentı́a

Z m∆t Z (n−m)∆t
Pm Pm
u(n∆t − τ )dτ = −u(l)dl
∆t (m−1)∆t ∆t (n−m+1)∆t
Z (n−m+1)∆t
Pm (2.5.11)
= u(l)dl
∆t (n−m)∆

= Pm h[(n − m + 1)∆t]

Reemplazando de la ecuación 2.5.8 y 2.5.10 se obtiene

Qn = P1 h[(n∆t)] + P2 h[(n − 1)∆t] + Pm h[(n − m + 1)∆t] + PM h[(n − M + 1)∆t] (2.5.12)

Ésta representa la ecuación de convolución con entrada Pm en pulsos y salida Qn como


una función temporal de información por muestra.

2.5.3. Función respuesta de pulso discreto y Ecuación de Con-

volución Discreta

La función de datos instantáneos 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 ecuación 2.5.12 la versión en tiempo discreto de la integral de convolución
es:

31
2.5. Método de Convolución discreta para transformación precipitación-escorrentı́a

M
X
Qn = P1 Un + P2 Un−1 + ... + Pm Un−m+1 + .. + PM Un−M +1 = Pm Un−m+1 (2.5.14)
m=1

Donde M es el número de pulsos de intensidad constante, de la función de entrada, es


decir, el número de datos de pulso del hietograma. El resultado final es la ecuación de
convolución discreta para un sistema lineal.

n≤M
X
Qn = Pm Un−m+1 (2.5.15)
m=1

Donde Qn es el caudal de escorrentı́a directa en el instante n ;Pm la precipitación efectiva


del bloque m y Un+m+1 los caudales por unidad de precipitación efectiva del hidrograma
unitario. El lı́mite superior n ≤ M indica que los términos 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 expresión 2.5.15 se puede expresar de la forma siguiente:

min(n,M )
X
Qn = Pm Un−m+1 (2.5.16)
m=max(1,n−nU +1)

Está ecuación facilita la solución numérica, ası́ mismo cabe señalar que dicha ecuación
es generalizada para resolver problemas que involucren el método de convolución, por
ejemplo, Matlab contiene el algoritmo (conv.m) para la convolución discreta, el cual usa
la ecuación 2.5.16. El programa PLEDER, emplea el mismo algoritmo, mediante la clase
convolución, con el objetivo de resolver la transformación lluvia escorrentı́a mediante esta
ecuación.

32
2.6. Diagramas de Flujo

2.6. Diagramas de Flujo

A continuación se presenta la esquematización gráfica que corresponde a la programación


hidrológica.

Diagrama de flujo General: Muestra la organización del programa en forma


general. El objetivo de este diagrama es obtener los caudales totales (transformación
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 método
del bloque alterno.

Diagrama de flujo Hietograma NRCS: Recibe como datos, la precipitación


máxima de 24 horas (obtenidas ya sea mediante análisis de frecuencias) y el tipo de
tormenta (Tipo I, IA, II, III); realizando una multiplicación directa con las ordenadas
de la tormenta, se obtienen las precipitaciones incrementales (mm).

Diagrama de flujo Hidrograma Unitario Sintético 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 variación de tiempo del hidrograma, donde
se obtienen las ordenadas del hidrograma Unitario Sintético.

Diagrama de flujo Hidrograma Unitario Sintético Snyder: Es el mismo ob-


jetivo que el anterior, recibiendo los datos de los coeficientes tp , Cp , variación del
tiempo y el área 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 sintético mediante interpolaciones lineales para cada intervalo o variación
del tiempo a lo largo del tiempo base (tb ).

33
2.6. Diagramas de Flujo

Diagrama de flujo Abstracciones NRCS: EL programa PLEDER separa la pre-


cipitación total de las infiltraciones o retenciones dadas, según el método 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 éste
dato se obtienen las precipitaciones directas o en exceso que también se les llama
pulsos de ingreso.

Diagrama de flujo Convolución discreta: Transforma la lluvia en escorrentı́a


directa, a partir de las ordenadas del hidrograma unitarios (U) y los pulsos de ingreso
(P).

34
 

  Hietograma IILA  Hietograma NRCS 
SENAMHI 
INICIO PLEDER HIDROLOGIA
                 

  Parámetros regionales a, b, k,  Precipitaciones máximas de 24 
n, Δt, t, período  de retorno tr. horas (P24),  Tipo de tormenta. 
 

              V     
 T ≤ 3 horas              F        Tipo de Tormenta                 
Tipo I   Tipo IA   Tipo II Tipo III   
     
 Ecuación 2.2.3. Cálculo de    Ecuación 2.2.1. Cálculo de 
precipitaciones acumuladas,  precipitaciones acumuladas, 
  incrementales y alternas. incrementales y alternas. Precipitaciones acumuladas, incrementales 

  Exportar a .csv 
Exportar a .csv 
 
Cálculo de Pulsos o  Cálculo Lluvia 
Cálculo de hidrogramas 
  escorrentía directa.  Escorrentía. Unitarios Sintéticos

 
      Modelos Meteorológicos.        
   Hidrograma Unitario Sintético    
  Tormenta NRCS    IILA SENAMHI    
H.U.S.   NRCS         H.U.S. SNYDER    

 
Precipitaciones máximas de 24  Parámetros regionales a, b, k, 
Tiempo de  Tiempo de retardo 
  horas (P24),  Tipo de tormenta.  n, Δt, t, período  de retorno tr.
retardo (Tlag) Coeficiente Cp  

  Abstracciones mediante  Convolución Discreta                 
el método  NRCS Ordenadas del Hidrograma Unitario (U) 
  í ,

P U  
Pulsos (P)  ó  á ,
escorrentía directa

Caudales (m³/s) 

35
2.6. Diagramas de Flujo

FIN PLEDER  HIDROLOGIA 
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 
 

   

   
V F
             3

 
1 1
 

 
i = 1, hasta N,
  i = i+1 
 
V F
  /2

 
1 2   2  
     

 
Precipitaciones 
  Alternas (mm) 

  FIN  HIETOGRAMA  IILA SENAMHI 
 

 
36
2.6. Diagramas de Flujo

 
INICIO  HIETOGRAMA NRCS 
 

 
P24, Ndt,  Tormenta 
 

  24
 
/60
 
 
24
   

  Datos hidrológicos,
Tormenta NRCS
 

  i = 0, hasta N+1, 
i = i+1 
 

 
   
1 24 1
 
1 1
 

  Precipitaciones 
  Incrementales (mm) 

  FIN  HIETOGRAMA NRCS 

37
2.6. Diagramas de Flujo

  INICIO  HIDROGRAMA UNITARIO 
  SINTÉTICO NRCS

 
Tlag, DT, dt 
 

 
 
  2
 
12.48
   

  Datos Hidrograma Unitario 
adimensional  NRCS 
 

 
i = 1, hasta nU, 
  i = i+1 

 
ó nU, q, t, DT x i
 

 
Ordenadas del 
  Hidrograma Unitario 

 
FIN  HIDROGRAMA UNITARIO 
  SINTÉTICO NRCS

38
2.6. Diagramas de Flujo

  INICIO  HIDROGRAMA UNITARIO 
SINTÉTICO SNYDER
 

 
, , , ,
 

   
4
2.75  
 
 
  2.14 .
 
1.22 .  
 
 
 

  i = 1, hasta nU, 
i = i+1 
 

 
/60
  , , , , ,

 
Ordenadas del 
 
Hidrograma Unitario 
 

 
FIN  HIDROGRAMA UNITARIO 
 
SINTÉTICO NRCS
 

  39

 
2.6. Diagramas de Flujo
  INICIO  ABSTRACCIONES NRCS 
 

  Palterna , CN,  nP

 
  
 
25400 254
 
0.2
                     

 
i= 1, hasta nP,
  i = i+1 

         
   
                1 alterna

               V             F 
Pacum i
                    
      
 

             V                       F 
i
 

        
0.0
 

     

  1

 
Precipitación en 
 
Exceso (mm)
 

  FIN  ABSTRACCIONES NRCS

  40

 
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)
 

  n = 1, hasta nQ, 
n = n+1 
 

 
  
0.0
 

 
m = A, hasta B, 
  m = m+1 

    
P m xU n m 1
 

     

 
Caudales (m³/s) 
 

 
FIN  CONVOLUCIÓN DISCRETA 
 

41
Capı́tulo 3

TEORÍA HIDRÁULICA Y
SECCIONES TRANSVERSALES
EN RÍOS

3.1. Introducción

Para conocer el comportamiento del flujo en cauces naturales o simplemente en canales


con secciones conocidas, es necesario contar con la teorı́a básica de la hidráulica y las
leyes fı́sicas que gobiernan su comportamiento. De las ecuaciones básicas y los principios
fı́sicos de movimiento de fluidos, se aplican a la solución del flujo gradualmente variado,
obteniendo como resultados los niveles o tirantes a lo largo del cauce. También es nece-
sario contar con metodologı́as para calcular el área y el perı́metro mojado en una sección
transversal. El propósito de esta sección es revisar las definiciones básicas, principios y
leyes con la intención de aplicarlos en los capı́tulos posteriores al estudio de tránsito de
flujos en rı́os.

42
3.2. Bases teóricos para el cálculo de flujo unidimensional

3.2. Bases teóricos para el cálculo de flujo unidimen-

sional

Se entiende por flujo unidimensional cuando se ignora las variaciones de los cambios en la
velocidad y la presión en el sentido perpendicular a la dirección principal del flujo. Para
su solución numérica se tiene como base fundamental los tres principios derivados de la
fı́sica:

Conservación de la Masa.

Conservación de la Energı́a.

Impulso-Cantidad de Movimiento: Conservación del Momentum

3.2.1. Ecuación 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 aceleración (resultado vectorial):

F = ma (3.2.1)

Multiplicando ambos miembros por la componente longitud ’s’ paralela a la dirección


de la fuerza y la aceleración, e integrando estas expresiones se tiene como resultado la
Ecuación de Energı́a (expresión escalar):

Z s2 Z s2
1
F ds = m ads = m(v22 − v12 ) (3.2.2)
s1 s1 2

43
3.2. Bases teóricos para el cálculo de flujo unidimensional

De la misma forma multiplicando ambos miembros por el factor tiempo a la ecuación


(3.2.1), e integrando se tiene la Ecuación de Momentum.

Z t2 Z t2
1
F dt = m adt = m(v2 − v1 ) (3.2.3)
t1 t1 2

Esta última expresión 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-
ción de la Energı́a, Ecuación de Momentum).

3.2.2. Ecuación 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

44
3.2. Bases teóricos para el cálculo de flujo unidimensional

Si p es igual a la intensidad de la presión en la sección 1, entonces la presión en la sección


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 actúa en la cara aguas abajo es:

∂p
(p + ∆s)∆n (3.2.5)
∂s

El peso del fluido es:


ρg∆s∆n (3.2.6)

La componente de este peso en la dirección 0 s0 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 actúa en
el elemento en la dirección aguas abajo es:

∂p ∂Z
Fr = p∆n − (p + ∆s)∆n − ρg∆s∆n (3.2.8)
∂s ∂s

Simplificando la ecuación se tiene:

∂p ∂Z
Fr = − ∆s∆n − ρg∆s∆n (3.2.9)
∂s ∂s

Aplicando la segunda ley de movimiento, la fuerza resultante es igual a la masa del fluido

45
3.2. Bases teóricos para el cálculo de flujo unidimensional

por una aceleración as

∂P ∂Z
ρ∆s∆nas = − ∆s − ρg∆s∆n (3.2.10)
∂s ∂s

Simplificando
∂p ∂Z ∂
ρas = − − ρg = (p + γZ) (3.2.11)
∂s ∂s ∂s

la aceleración 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.

dVs ∂Vs ∂Vs ds ∂Vs ∂Vs


as = = + = + Vs (3.2.12)
dt ∂t ∂s dt |{z}
∂t | {z∂s}
Local Convectiva

∂Vs
El término ∂t
se denomina aceleración local y se anula cuando el flujo es Permanente
o Estacionario, es decir, independiente del tiempo. El término siguiente forma la acele-
ración convectiva, que aparece cuando la partı́cula se mueve a través de regiones donde
la velocidad varı́a.

Sustituyendo las ecuación 3.2.12 en la ecuación 3.2.11 se tiene:

∂Vs ∂Vs ∂
ρ( + Vs ) + (p + γZ) = 0 (3.2.13)
∂t ∂s ∂s

La ecuación 3.2.13, es la conocida ecuación propuesta en el siglo XVIII, por el matemático


suizo Leonardo Euler y reconocida universalmente como la ecuación de Euler. En la tesis
está ecuación se simplifica la aceleración local, debido a que el análisis es para flujos
Permanentes.

46
3.2. Bases teóricos para el cálculo de flujo unidimensional

3.2.3. Flujo Permanente.

∂Vs
Los flujos permanentes ocurren cuando las aceleraciones locales, son cero, esto es, si ∂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 ecuación 3.2.13 se reduce una función que solo depende
de s, entonces las derivadas parciales se pueden expresar como derivadas ordinarias.

dVs d
ρVs + (p + γZ) = 0 (3.2.14)
ds ds

Multiplicando por el factor ds a toda la expresión e integrando se tiene:

1 2
ρV + p + γZ = Constante (3.2.15)
2 s

Dividiendo entre γ
p Vs2
Z+ + = H = Constante (3.2.16)
γ 2g

Es una de las formas alternativas de la ecuación de Bernoulli. Esta ecuación puede aplicar-
se a lo largo de una lı́nea de corriente, en un fluido ideal sin rozamiento, pero la aplicación
1
de la misma en otra dirección exige que el fluido sea irrotacional.

3.2.4. Flujo Uniforme.

En una superficie libre se presenta el flujo uniforme, cuando en sus diferentes secciones,
las caracterı́sticas de circulación, velocidad, distribución de presiones, profundidad de
circulación, etc son iguales. En los cauces naturales, que corresponde a la aplicación de
esta tesis, en algunos casos puede considerarse la existencia del régimen uniforme en
1
Flujo Irrotacional: Se da cuando la vorticidad resulta cero, la velocidad debe de ser igual a la
gradiente de un escalar, φ, conocido como potencial de velocidad: ∇x(∇φ) = 0

47
3.3. Secciones Transversales en Cauces Naturales y Cálculo Numérico.

ciertos tramos donde se ha alcanzado un equilibrio en la sección transversal y esta es


sensiblemente constante en una zona recta y sin obstáculos, lo cual posibilita el estudio
de estas conducciones con resultados satisfactorios.

En el flujo uniforme, la aceleración local y convectiva son cero, por lo tanto, la ecuación
3.2.13 se reduce.
d
(p + γZ) = 0 (3.2.17)
ds

Integrando se tiene.
p
+ Z = Constante (3.2.18)
γ

Esta ecuación representa a la distribución de la Presión Hidrostática, donde el término


P
γ
+ Z, es la altura piezométrica (piezometric head).

En resumen, el flujo Uniforme ocurre cuando:

EL Tirante, el área hidráulica 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

Cálculo Numérico.

El estudio de las propiedades de las secciones transversales en cauces naturales tiene


singular importancia ya que dicha sección es la que define muchas de las caracterı́sticas
de la conducción. Estas secciones representan la geometrı́a del cauce que están formados

48
3.3. Secciones Transversales en Cauces Naturales y Cálculo Numérico.

por una serie de puntos o coordenadas (X ,Y), cuyos valores de X forman la longitud de la
sección 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 prismático).

Figura 3.2: Sección Transversal en Cauces Naturales

El programa PLEDER, divide las secciones transversales en tres partes (i, j, k), donde ”i”
representa las caracterı́sticas geométricas de la sección 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 sección en la margen derecha.

Figura 3.3: Elementos geométricos de las Secciones Transversales en: i, j, k

49
3.3. Secciones Transversales en Cauces Naturales y Cálculo Numérico.

En una sección transversal natural de los cauces, es importantes representar de esta mane-
ra, ya que simplifica las operaciones matemáticas para obtener los resultados geométricos
de cada sección transversal que más adelante se presenta. En la figura anterior se mues-
tra que, en los extremos se forman triángulos (i, k), esto ocurre cuando existe un ángulo
entre la lı́nea del terreno (plantilla del canal) y la superficie libre. En la parte central se
forman trapecios, cuya área hidráulica y perı́metro hidráulico se obtienen después de una
sumatoria en cada una de ellas.

Las fórmulas para cada elemento geométricos de la figura son.

Analizando en el Triángulo Izquierdo (A,P):

  
1 2 Xi+1 − Xi
A = Ai = (Y − Yi+1 ) (3.3.1)
2 Yi − Yi+1

s  2
(Y − Yi+1 )(Xi+1 − Xi )
P = Pi = (Y − Yi+1 )2 + (3.3.2)
Yi − Yi+1

Análisis de los Trapecios (A,P):

X X1
A= Aj = [(Y − Yj ) + (Y − Yj+1 )] (Xj+1 − Xj ) (3.3.3)
2

X Xq
P = Pj = (Xj+1 − Xj )2 + (Yj+1 − Yj )2 (3.3.4)

Análisis del Triángulo Derecho(A,P):

  
1 2 Xk+1 − Xk
A = Ak = (Y − Yk ) (3.3.5)
2 Yk+1 − Yk

50
3.4. Cálculo del Tirante Normal

s  2
(Y − Yk )(Xk+1 − Xk )
P = Pk = (Y − Yk )2 + (3.3.6)
Yk+1 − Yk

3.4. Cálculo del Tirante Normal

Para el análisis y diseño de canales abiertos es necesario conocer el Tirante Normal, que
forma parte de las caracterı́sticas hidráulicas de un canal. En la mayorı́a de los textos
exponen los cálculos numéricos solo para canales con secciones transversales conocidos
tales como rectangulares, triangulares, trapezoidales, parabólicos y otros que derivan a
ecuaciones lineales en la solución del tirante normal, entonces, para el análisis en cauces
naturales aproximan a estas secciones mencionadas perdiendo precisión y garantı́a en
la obtención de sus resultados. La mejor forma de representar es a través de los puntos
coordenados, ası́ se puede generalizar estas secciones transversales obteniéndose resultados
mas precisos y más 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 más comunes hasta las más complejas).

3.4.1. Cálculo Numérico

Para la solución del tirante normal se tomará en cuenta las ecuaciones de Manning Stric-
kler, Chezy (Antoine de Chézy) y Darcy-Weisbach.

1/2
R2/3 Sf
v= (3.4.1)
n

p
v=C RSf (3.4.2)

51
3.4. Cálculo del Tirante Normal

 
1/2 ks 1,255υ
v = −(32gRSf ) log + (3.4.3)
14,8R R(32gRSf )1/2

Estas tres ecuaciones presentan ecuaciones no lineales, que para su solución en cauces
naturales requieren de métodos numéricos avanzados. Existen varios métodos para resolver
ecuaciones no lineales, tales como el Método de Bisección, Método de Aproximaciones
Sucesivas, Método de Newton Raphson, entre otros mas y menos eficientes. En esta tesis
usamos el Método de Newton Raphson, cuya sintaxis es la siguiente.

F (y) = 0 (3.4.4)

y = Y + ∆Y (3.4.5)

F (y)
∆Y = − (3.4.6)
F 0 (y)

El propósito en esta sección es ampliar la aplicación del método de Newton-Raphson


aplicado a las ecuaciones anteriores. Donde F (y) es la función principal cuya variable
0
dependiente es el valor de ”y” (Para este caso Tirante Normal) y F (y) es la primera
derivada de la función principal. Este método es iterativo hasta que el valor de (3.4.6)
tienda a cero ó que se evalúe a un error permisible que el usuarios asigna como conveniente.

Manning Strickler

La Ecuación de Manning Strickler representado en función al caudal viene a ser:

A5/3 P −2/3 S 1/2


Q= (3.4.7)
n

52
3.4. Cálculo del Tirante Normal

Despejando las variables constantes, para formar la Función principal.

nQ
F (Y ) = A5/3 P −2/3 − √ =0 (3.4.8)
S
|{z}
Constante

dF
Derivando la función F(Y) con respecto a “Y” ( dY )se tiene:

     
dF d 5/3 −2/3 nQ 5 −2/3 2/3 dA 2 5/3 −5/3 dP
= A P −√ = P A − A P (3.4.9)
dY dy S 3 dY 3 dY

En la sección transversal, el Area Total es:

X
A = Ai + Aj + Ak (3.4.10)

Cuya derivada del Área Total en función del tirante ”Y”.

       
dA dAi d X dAk
= + Aj + (3.4.11)
dY dY dY dY

dAi

Cálculo de dY

     
dAi d 1 2 Xi+1 − Xi
= (Y − Yi+1 )
dY dY 2 Yi − Yi+1
  
1 Xi+1 − Xi
= 2 (Y − Yi+1 ) (3.4.12)
Yi − Yi+1
2


 
Xi+1 − Xi
= (Y − Yi+1 )
Yi − Yi+1

Es muy importante simplificar expresiones al mı́nimo, de esta forma se logra opti-


mizar el tiempo de ejecución (runtime). Por lo tanto, la ecuación anterior se puede

53
3.4. Cálculo del Tirante Normal

representar en función al área del triángulo izquierdo (Ai ), éste se obtendrá divi-
diendo la expresión (3.4.12)con (3.3.1).

 
Xi+1 −Xi
dAi (Y − Yi+1 )
 :

 :
 
:
2 i−
(Y Yi+1 (Y−
) Yi+1 )
(Xi+1 −Xi )
 
dY Yi −Yi+1   
=  = 1
Ai 1
(Y − Yi+1 ) 2 Xi+1 −Xi
− Yi+1 )2

: :

2 Yi −Yi+1 (Y (Xi+1
 −Xi ) i−
(Y Yi+1
 )

 
dAi 2Ai
= (3.4.13)
dY (Y − Yi+1 )

d
P 
Cálculo de dY
Aj

   
d X d X1
Aj = [(Y − Yj ) + (Y − Yj+1 )] (Xj+1 − Xj )
dY dY 2

  X
d X
Aj = (Xj+1 − Xj ) (3.4.14)
dY

dAk

Cálculo de dY

    
dAk d 1 2 Xk+1 − Xk
= (Y − Yk )
dY dY 2 Yk+1 − Yk
  
1 Xk+1 − Xk
= 2 (Y − Yk )

 (3.4.15)
2
 Yk+1 − Yk
  
Xk+1 − Xk
= (Y − Yk )
Yk+1 − Yk

Para simplificar dividimos (3.4.15) entre (3.3.5).

 
Xk+1 −Xk
dAk (Y − Yk ) :

 :


− (Y− −Xk )
:


dY Yk+1 −Yk 2
(Y 
k+1 Yk ) Yk )
(Xk+1

=  = 1 (3.4.16)
Ak 1
(Y − Yk )2 Xk+1 −Xk
2  : :


2 Yk+1 −Yk (Y − Yk ) (X
 k+1
 −X
k )
(Y
k+1 −
Yk )

54
3.4. Cálculo del Tirante Normal

 
dAk 2Ak
= (3.4.17)
dY (Y − Yk )

Reemplazando en la ecuación (3.4.11) se obtendrá la derivada del Área total:

 
dA 2Ai X 2Ak
= + (Xj+1 − Xj ) + (3.4.18)
dY (Y − Yi+1 ) (Y − Yk )

De la misma forma calculamos la derivada del Perı́metro mojando con respecto al tirante
dP
“Y” ( dY )

     *0
  
dP dPi d X  dPk
= + Pj +
dY dY dY
 dY


     
dP dPi dPk
= + (3.4.19)
dY dY dY

dPi

Cálculo de dY

s 
   2
dPi d  (Y − Yi+1 )(Xi+1 − Xi )
= (Y − Yi+1 )2 + 
dY dY Yi − Yi+1
:

2 (Y − Yi+1 ) + 2 (Y −Yi+1 )(X i+1 −Xi ) −Y −X )
(Y  )(X 
: i i+1 2 i+1 i

−Y i+1 )(Yi −Yi+1 )
(Yi  
= s 

2
2
(Y − Yi+1 )(Xi+1 − Xi )
2 (Y − Yi+1 ) +
Yi − Yi+1
| {z }
P erimetro(Pi )
(Y −Yi+1 )(Xi+1 −Xi )2
(Y − Yi+1 ) + (Yi −Yi+1 )2
=
Pi

(Y − Yi+1 ) (Yi − Yi+1 )2 + (Y − Yi+1 ) (Xi+1 − Xi )2


 
dPi
= (3.4.20)
dY Pi (Yi − Yi+1 )2

55
3.4. Cálculo del Tirante Normal

Esta ecuación aún r


es posible simplificar haciendo algunos arreglos
h i2
Se sabe que: Pi = (Y − Yi+1 )2 + (Y −Yi+1 )(Xi+1 −Xi )
Yi −Yi+1
,

donde

 2
2 (Y − Yi+1 )(Xi+1 − Xi )
2
(Pi ) = (Y − Yi+1 ) +
Yi − Yi+1
(Y − Yi+1 )2 (Yi − Yi+1 )2 + (Y − Yi+1 )2 (Xi+1 − Xi )2
=
(Yi − Yi+1 )2

Dividiendo la expresión anterior entre (Pi ) (Y − Yi+1 )

(Pi )2 (Y − Yi+1 ) (Yi − Yi+1 )2 + (Y − Yi+1 ) (Xi+1 − Xi )2


= (3.4.21)
i ) (Y − Yi+1 )
(P

 (Pi ) (Yi − Yi+1 )2

Note que la expresión de la derecha viene a ser igual a la ecuación (3.4.20), por lo
tanto reemplazando se tiene.

 
Pi dPi
=
(Y − Yi+1 ) dY

Esta ecuación, también podrá ser representada en función trigonométrica, según la


figura que se muestra:

 
dPi Pi
= = cosec (θ1) (3.4.22)
dY (Y − Yi+1 )

dPk

Cálculo de dY
Análogamente:

56
3.4. Cálculo del Tirante Normal

Figura 3.4: Pendiente del banco izquierdo a la superficie libre

 
Pk dPk
=
(Y − Yi ) dY

Figura 3.5: Pendiente del banco derecho a la superficie libre

 
dPk Pk
= = cosec (θ2) (3.4.23)
dY (Y − Yk )

Reemplazando en la ecuación (3.4.19) se obtendrá la derivada del Perı́metro total:

 
dP Pi Pk
= + = cosec (θ1) + cosec (θ2) (3.4.24)
dY (Y − Yi+1 ) (Y − Yk )

57
3.4. Cálculo del Tirante Normal

Chezy

La Ecuación de Chezy en términos de caudal:

p
Q = AC RSf (3.4.25)

Despejando las variables constantes, para formar la Función principal “F(Y)”.

Q
F (Y ) = A3/2 P −1/2 − p =0 (3.4.26)
C Sf
| {z }
Constante

dF
Derivando la función F(Y) con respecto a “Y” ( dY )se tiene:

!    
dF d Q 3 dA 1 dP
= A3/2 P −1/2 − p = P −1/2 A1/2 − A3/2 P −3/2
dY dy C Sf 2 dY 2 dY

(3.4.27)

Darcy-Weisbach

Dada la ecuación de Darcy en función del caudal se tiene:

 
1/2 ks 1,255υ
Q = −A(32gRSf ) log + (3.4.28)
14,8R R(32gRSf )1/2

Despejando las variables constantes, para formar la Función principal “F(Y)”, e igualando
esta función cero.

 
1/2 ks 1,255υ Q
F (Y ) = −A(R) log + 1/2
− =0 (3.4.29)
14,8R R(32gRSf ) (32gRSf )1/2

58
3.4. Cálculo del Tirante Normal

dF
Derivando la función F(Y) con respecto a “Y” ( dY )se tiene:

√ √
−A Rlog(C) − 12 RLn(C) dA dP

dF dY
− R dY A R(D)
= √ − (3.4.30)
dY RLn(10) CLn(10)

Donde:

A
R: Radio Hidráulico R = P

C, D: Constantes.

√ dA dP
!
5Ks 251 v 32 dY
C= + p − A dY2
74R 6400 R 3/2 gSf P P
√  
5Ks 251 Rv 32 dA dP
= + −R
74R 6400 AR >p
3/2

gSf dY dY

Donde:
√  
5Ks 251 v 32 dA dP
C= + p −R (3.4.31)
74R 6400 A RgSf dY dY

√  dA dP

753 v 32 P − A
dA dP dY dY
5 Ks P dY 5 Ks dY P2
D= − + − √
74 A2 74
A 12800 R5/2 gs

dA dP
753 v 32 R dA dP

5 Ks dY 5 Ks dY A dY
− R dY
=− + − √
74 RA 74 A 12800 R5/2 gs

Donde:

√ dA dP

− R dY
 
5Ks dP 1 dA 753 v 32 dY
D= − − p (3.4.32)
74A dY R dy 12800 AR3/2 gSf

59
3.5. Caracterı́sticas y Clasificación de los Perfiles del Flujo Gradualmente Variado

3.5. Caracterı́sticas y Clasificación de los Perfiles del

Flujo Gradualmente Variado

Al examinar el cómputo de perfiles de flujo gradualmente variado, se necesita primero


desarrollar un método sistemático 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:

αV 2
H =Z +Y + (3.5.1)
2g

Diferenciando con respecto a X y las velocidad V expresando en función del caudal Q

αQ2 d
 
dH dZ dY 1
= + + (3.5.2)
dX dX dX 2g dX A2

60
3.5. Caracterı́sticas y Clasificación de los Perfiles del Flujo Gradualmente Variado

Ahora, por definición.

dH
= −Sf (3.5.3)
dX

dZ
= −S0 (3.5.4)
dX

Donde Sf es la pendiente de la gradiente de energı́a y S0 es la pendiente del fondo del


cauce.

   
d 1 d 1 dA
=
dX A2 dA A dX2
 
d 1 dA dY
= (3.5.5)
dA A2 dY dX
2B dY
=− 3
A dX

Donde dA/dY = B. De las ecuaciones anteriores se tiene la ecuación de la variación del


tirante Y con respecto a la distancia X.

dY S0 − Sf
= (3.5.6)
dX 1 − (αBQ2 )/(gA3 )

Donde:
2αBQ2 (Q/A)2
F = = (3.5.7)
gA3 (gA)/(αB)

dY S0 − Sf
= (3.5.8)
dX 1 − F2

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

61
3.5. Caracterı́sticas y Clasificación de los Perfiles del Flujo Gradualmente Variado

dependencia inversa en el área de flujo. Además, al aumentar Y , F y Sf decrecerán. Por


definición Sf = Sf cuando Y = Yn , por ende el siguiente juego de desigualdades debe
cumplirse:

Figura 3.7: Sistema de clasificación 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 dimensión vertical, tal como se

62
3.5. Caracterı́sticas y Clasificación de los Perfiles del Flujo Gradualmente Variado

muestra en la figura 3.7. Por convención, 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 rápida que es comúnmente muy corta. En la frontera de aguas
abajo, este perfil es tangente al tirante normal. El perfil S3 es también 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 asintótico 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.

63
3.6. Ecuaciones para el cálculo de perfiles básicos.

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 cálculo de perfiles básicos.

Estos datos son necesarios para calcular los tirantes del cauce, empleando el método del
paso estándar.

Flujo Gradualmente Variado: Método del paso Estándar

Figura 3.8: Balance de Energı́a

De la ecuación de energı́a se tiene:

α1 V12 α2 V22
Z 1 + Y1 + = Z 2 + Y2 + + hf (3.6.1)
2g 2g

Para un caudal dado, el tirante Y1 es conocido en la sección 01. El método del paso
Estándar consiste en determinar el tirante en la sección 02 a una distancia X2 . Primero

64
3.6. Ecuaciones para el cálculo de perfiles básicos.

Q
determinamos la velocidad V1 en la sección 01, V = A
, y en la ecuación de la energı́a (Ec.
3.6.1) representamos de la forma siguiente:

α1 V12
H1 = Z1 + Y1 + (3.6.2)
2g

H2 = H1 − hf (3.6.3)

1
Donde hf , corresponde a la pérdida total entre las secciones 1 y 2

Ası́ mismo se conoce


1
hf = (Sf1 + Sf2 )(X2 − X1 ) (3.6.4)
2

Reemplazando en la ecuación 3.6.3 tenemos

1
H2 = H1 − (Sf1 + Sf2 )(X2 − X1 ) (3.6.5)
2

Sustituyendo las ecuaciones

α2 Q2 1
Z 2 + Y2 + + (Sf1 + Sf2 )(X2 − X1 ) − H1 = 0
2gA22 2

α2 Q2 1 1
Y2 + 2
+ Sf2 (X2 − X1 ) + Z2 − H1 + Sf1 (X2 − X1 ) = 0 (3.6.6)
2gA2 2 2

En la ecuación 3.6.6, A2 y Sf2 son funciones de Y2 y todos los términos restantes son
conocidos (calculados en la sección 01). El tirante Y2 puede ser determinado, resolviendo
la siguiente ecuación algebraica NO-LINEAL con método conocidos tales como Bisección
o el método de Newton Raphson.
1
Pérdida por fricción + pérdida local

65
3.6. Ecuaciones para el cálculo de perfiles básicos.

α2 Q 2 1 1
F (Y2 ) = Y2 + 2
+ Sf2 (X2 − X1 ) + Z2 − H1 + Sf1 (X2 − X1 ) = 0 (3.6.7)
2gA2 2 2

Para usa el método de Newton Raphson, es necesario contar la derivada de la función con
respecto al tirantes por conocer (Y2 ).Éste se obtiene al diferenciar la expresión 3.6.7

dF α2 Q2 dA2 1 dSf2
=1− 3
+ (X2 − X1 ) +0−0+0
dY2 gA2 dY2 2 dY2

También se sabe:
Q2 n2
Sf2 = 4/3
A22 R2

!
dF α2 Q2 dA2 1 d Q2 n2
=1− 3
+ (X2 − X1 ) 4/3
(3.6.8)
dY2 gA2 dY2 2 dY2 A22 R2

!
d Q 2 n2 −2Q2 n2 dA2 4Q2 n2 dR2
4/3
= 4/3
− 7/3
dY2 A22 R2 A32 R2 dY2 3A22 R2 dY2
−2 Q2 n2 dA2 4 Q2 n2 dR2
= −
A2 A22 R24/3 dY2 3R2 A22 R24/3 dY2
| {z } | {z } (3.6.9)
Sf2 Sf2
−2 dA2 4 dR2
= Sf2 − Sf2
A2 dY2 3R2 dY2
 
Sf2 dA2 2Sf2 dR2
= −2 +
A2 dY2 3R2 dY2

Reemplazando la ecuación 3.6.9 en 3.6.8

α2 Q2 dA2 1
 
dF Sf2 dA2 2Sf2 dR2
=1− + (X2 − X1 )(−2) +
dY2 gA32 dY2 2 A2 dY2 3R2 dY2

α2 Q2 dA2
 
dF Sf2 dA2 2Sf2 dR2
=1− − (X2 − X1 ) + (3.6.10)
dY2 gA32 dY2 A2 dY2 3R2 dY2

66
3.6. Ecuaciones para el cálculo de perfiles básicos.

dR2
La expresión dY2
puede ser reemplazado en función del área y el perı́metro. Ası́:

A
R=
P

   
dR2 d A2 1 dA2 d 1
= = + A2
dY2 dY2 P2 P2 dY2 dY2 P2
    (3.6.11)
1 dA2 A2 dP2
= − 2
P2 dY2 P2 dY2

Reemplazando la derivada dA2 /dY2 = B2

α2 Q 2
   
dF B2 2 P2 B2 A2 dP2
=1− B2 − (X2 − X1 ) Sf2 + Sf2 − 2
dY2 gA32 A2 3 A2 P2 P2 dY2

α2 Q2
  
dF B2 2 Sf2 A2 dP2
=1− B2 − (X2 − X1 ) Sf2 + B2 −
dY2 gA32 A2 3 A2 P2 dY2

α2 Q2
 
dF 1 B2 2 dP2
=1− B2 − Sf2 (X2 − X1 ) 5 − (3.6.12)
dY2 gA32 3 A2 P2 dY2

Estas ecuaciones sirven para calcular la superficie libre de agua (curva de remanso en un
flujo gradualmente variado) en secciones prismáticas y no prismáticas.

67
Capı́tulo 4

MODELOS NUMÉRICOS EN RÍOS


Y DIAGRAMAS DE FLUJO

4.1. Introducción

En la actualidad existen diversos modelos numéricos para simulaciones de flujos en rı́os,


desde modelos simples hasta modelos complejos. En este capı́tulo se describe los modelos
clásicos tales como el modelo de la onda dinámica, modelo de la onda de difusión y el
modelo de la onda cinemática, como también se describe las propiedades hidráulicas y los
cálculos unidimensionales para los flujos permanentes, discretizando las ecuaciones para
su programación computacional.

68
4.2. Formulación de Flujos en 1D

4.2. Formulación de Flujos en 1D

4.2.1. Ecuaciones Hidrodinámicas 1D

Modelo de la Onda Dinámica

El modelo de la onda dinámica en 1D, para flujos en canales abiertos son gobernados por
las ecuaciones de Barre Saint Venant considerando flujos laterales (inflow/outflow). Se
tiene:

∂A ∂Q
+ = ql (4.2.1)
∂t ∂x

βQ2
 
∂A ∂ ∂Zs
+ + gA + gASf = ql Ux (4.2.2)
∂t ∂x A ∂x

La variable x representa la distancia a lo largo de la misma coordenada espacial, A es


el área mojada de la sección transversal del flujo y Q viene a ser la descarga del flujo
definido como Q = AU , siendo U la velocidad promedio, sobre la sección transversal;
Zs es la estación del agua; β es el factor de corrección para el momentum debido a la
uniformidad de las (corrientes) distribuciones de velocidades sobre al sección transversal;
ql es el flujo lateral por unidad de largo del canal. Ux es la velocidad de los flujos laterales
en la dirección del eje xi y Sf es la pendiente de fricción, denominado o representado
como:

Q|Q|
Sf = (4.2.3)
K2

AR2/3
Donde K viene a ser la conductividad. Para una simple sección transversal, K = n
;
con R Radio Hidráulico y n el coeficiente de rugosidad de Manning del canal.

69
4.2. Formulación de Flujos en 1D

Para una sección transversal compuesta.

2/3
Aj Rj
Kj = (4.2.4)
nj

Modelo de la Onda Difusión

El modelo de la onda de difusión asume que las aceleraciones local y convectiva en la


ecuación del momentum son insignificantes, por lo tanto se tiene:

∂Zs
gA + gASf = ql Ux (4.2.5)
∂x

La ecuación de continuidad, aun se usa en este modelo.

Este modelo es más Estable que el modelo de la onda dinámica, pero este último es más
exacto y puede ser aplicado en rangos amplios de condiciones de flujo.

Modelo de la Onda Cinemática

Para este modelo, las variaciones en la velocidad del flujo y el tirante son Insignificantes en
comparación con la variación en la elevación del lecho del cauce y por lo tanto la ecuación
de momentum puede ser simplificado como:

Sf = S0 (4.2.6)

Donde So es la pendiente del fondo del canal en la dirección longitudinal.

Usando la ecuación de Manning, la ecuación 4.2.6 puede ser reescrito.

A 2/3 1/2
Q= R S0 (4.2.7)
n

70
4.2. Formulación de Flujos en 1D

La ecuación de continuidad 4.2.1 aún es usada en este modelo de la onda cinemática.

Este modelo generalmente se aplica si se cumple que:

V
g S0
> 10 (4.2.8)
U2
V
Donde , representa la longitud del canal en estudio y U es la velocidad promedio del flujo
uniforme. La Ecuación 4.2.8 implica que el modelo de la onda cinemática sea aplicado en
canales empinados o pronunciados (steep).

4.2.2. Propiedades Hidráulicas Compuestas

Si las propiedades hidráulicas, tales como rugosidad, conducción, no son uniformes, a


través del canal, sus valores compuestos necesitan ser calculados. Existen varios métodos
que se usan frecuentemente, tales como: El método Alpha, Método de la división Radio
Hidráulico, Método de la división de la pendiente energı́a y el método de la conducción o
transportabilidad.

Método Alpha

En el método Alpha, la sección transversal es dividida dentro de paneles o franjas entre


dos puntos de coordenadas (estaciones) tal como se muestra en la figura 4.1. La división
entre los paneles son asumidos para ser verticales. En este método la sección transversal
no se distingue entre el canal principal y los bancos de inundación.

 
1
Aj = Zs − (Zb,j + Zb,j+1 ) ∆yj (4.2.9)
2

q
Pj = (Zb,j − Zb,j+1 )2 + ∆yj2 (4.2.10)

71
4.2. Formulación de Flujos en 1D

Figura 4.1: Representación de la sección transversal en el Método Alpha

Aj
Rj = (4.2.11)
Pj

Donde Aj es el área del flujo Pj , perı́metro mojado, Rj Radio hidráulico. Para Kj de la


franja j, son calculados por las ecuaciones 4.2.9, 4.2.10, 4.2.11 y:

2/3
Aj Rj
Kj = (4.2.12)
nj

Donde Zb,j , es la elevación del fondo en la estación j, ∆yj es la distancia entre estaciones
j, j + 1, nj es coeficiente de la rugosidad de manning en la franja j.

La sección transversal compuesta del área del flujo, es definido como la sumatoria de todos
las franjas (sub áreas en los paneles).

La velocidad compuesta es definida como la división de la descarga total entre el área de la


sección conservando continuidad. El radio hidráulico compuesto (transporte ponderado):

M
X Rj Kj
R= PM (4.2.13)
j=1 j=1 Kj

Donde M es el número de franjas mojadas.

72
4.2. Formulación de Flujos en 1D

El Método 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.

División de Radio Hidráulico

Propuesto por Einstein (1950), es un método más adecuado para determinar las propie-
dades hidráulicas compuestas para la sección transversal con superficies verticales rugosos
o pendientes pronunciados en los bancos basados en la división del radio hidráulico. Es-
te método asume velocidades iguales en todas las franjas y calcula todas las variables
hidráulicas en un modo normal, excepto para el coeficiente de la rugosidad de Manning.

El esfuerzo de corte en la sección transversal puede ser calculado como:

M
X
τ
X = Pj τ j (4.2.14)
j=1

Donde:

P = Perı́metro mojado.

El método de Einstein determina:

τ = γRSf (4.2.15)

τj = γRj Sf (4.2.16)

Aplicando y asumiendo las velocidades iguales y la ecuación de Manning en la sección


transversal entera y para cada franja se tiene:

73
4.2. Formulación de Flujos en 1D

!3/2 !3/2
nU nj U
R= 1/2
, Rj = 1/2
(4.2.17)
Sf Sf

Insertando las ecuaciones 4.2.15y 4.2.17 en la ecuación 4.2.14 se tiene:

M 3/2
!2/3
X Pj nj
n= (4.2.18)
j=1
P

Método de la división pendiente Energı́a

Este método es basado en la división de la pendiente energı́a originado por Engelund


(1966), es otra opción para determinar las propiedades hidráulicas compuestas para una
sección transversal con superficies laterales verticales rugosas o pendientes pronunciadas
en los bancos.

Este método da:

τj = γRSf,j (4.2.19)

Y aplica la asunción de la velocidad igual y la ecuación de Manning en la sección trans-


versal entera y cada franja es:

 2  2
nU nj U
Sf = , Sf,j = (4.2.20)
R2/3 R2/3

Insertando las ecuaciones 4.2.15, 4.2.19 y 4.2.20 en la ecuación 4.2.14 se tiene la siguiente
ecuación para un Manning n compuesto.

"M  #1/2
X Pj n2j 
n= (4.2.21)
j=1
P

74
4.2. Formulación de Flujos en 1D

Método de la Transportabilidad - Conveyance

La asunción de las velocidades iguales usados en los métodos anteriores, basado en la


división de cualquiera de los dos radios hidráulicos 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
inundación pueden ser significativamente diferentes. Una forma o un método más adecuado
para determinar las propiedades hidráulicas compuestas en canales complejos es el método
de transporte (Conveyence Method).

Este método divide la sección transversal en sub secciones de tal forma, que la asunción
de las velocidades iguales puede ser aproximadamente válida en cada sub sección. Y
estas sub secciones pueden aun ser ser dividido entre mas franjas. El área del flujo, el
perı́metro mojado y la conducción de cada sub sección puede ser calculada de manera
normal. Las conducciones de todas las sub secciones se suman para establecer el total de
la transportabilidad para la sección transversal entera.

Por ejemplo en una sección transversal compleja.

Figura 4.2: Sección transversal compuesta con llanuras de inundación

En la figura 4.2 se divide en tres secciones canal principal, llanura de inundación izquierda
y llanura de inundación derecha; y el total de la transportabilidad K es determinado por:

75
4.2. Formulación de Flujos en 1D

5/3 5/3 5/3


ALF AM C ARF
K= 2/3
+ 2/3
+ 2/3
(4.2.22)
nLF PLF nM C PM C nRF PRF

Donde los subı́ndices LF denota llanura de inundación izquierda (Left Foodplain), M C


el canal o cauce principal (Main channel) y RF llanura de inundación derecha (Right
Floodplain).

Para cada sub sección, el coeficiente de rugosidad de Manning puede ser determinado
usando el radio hidráulico o el método de la división 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 métodos como sigue:

j=RCB
!
X 3/2
nM C = Pj nj /PM C (4.2.23)
j=LCB

Donde: LCB y RCB representan franjas adyacentes del canal principal hacia la izquierda
y derecha bordes de las llanuras de inundación (denominados como en LF y RF según la
figura 4.2).

4.2.3. Propiedades Hidráulicas Compuestas

El factor de corrección β para la ecuación del momentum en la ecuación 4.2.2 es consi-


derado solo para una sección transversal simple. Para una sección transversal compuesta,
tal como en la figura anterior, el factor β es determinado por:

Z Z
1 1
β= u2 dA = (QLF ULF + QM C UM C + QRF URF ) (4.2.24)
QU A QA

76
4.3. Cálculos Uni-dimensionales para flujos en canales o cauces abiertos

2
K2 K2
 
A KLF
β= 2 + M C + RF (4.2.25)
K ALF AM C ARF

4.3. Cálculos Uni-dimensionales para flujos en cana-

les o cauces abiertos

4.3.1. Cálculos de Flujos Permanentes 1-D

Discretización de ecuaciones para Flujos Permanentes

Para flujos permanentes en canales abiertos sin considerar ingresos y/o salidas de flujos
laterales, la ecuación 4.2.1 se reduce a:

∂Q
=0 (4.3.1)
∂x

Y da lugar a una descarga del flujo constante. Mientras la ecuación 4.2.2 puede ser reescrito
como la ecuación de la Energı́a.

β 0 Q2
 
∂ ∂Zs Q|Q|
+g +g 2 =0 (4.3.2)
∂x 2A2 ∂x K

Donde β 0 es el factor de corrección de la energı́a cinética debido a la no uniformidad de la


dirección de la corriente en la sección transversal. Para una sección transversal compleja
como se muestra en la figura anterior, β 0 puede ser determinado mediante el promedio de
la descarga ponderada de la energı́a cinética.

77
4.3. Cálculos Uni-dimensionales para flujos en canales o cauces abiertos

1
β0 = 2 2 2

2
QLF ULF + QM C UM C + QRF URF (4.3.3)
QU

A2 3 3 3
 
0 KLF KM C KRF
β = 3 + + (4.3.4)
K A2LF A2M C A2RF

Donde todos los parámetros son iguales que en la ecuación 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 dirección aguas abajo desde 1 hasta I.
Cada sección transversal es representado por un número 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 elevación 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
inundación 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 método del paso standard para discretizar la ecuación 4.3.2 se tiene.

0
βi0 Q2i Q2i+1
 
βi+1 ∆xi+1/2 Qi+1 |Qi+1 | Qi |Qi |
2
+ Zs,i = 2
+ Zs,i+1 + 2
+ (4.3.5)
2gAi 2gAi+1 2 Ki+1 Ki2

Donde xi + 1/2 representa la longitud de cada tramo entre las secciones transversales i y
i + 1.
1
En términos cientı́ficos se utiliza el nombre de Thalweg, voz procedente del alemán que significa
”camino del valle”, esta lı́nea que se encuentra en medio de la parte más profunda del rı́o y donde la
corriente es más rápida.

78
4.3. Cálculos Uni-dimensionales para flujos en canales o cauces abiertos

Figura 4.3: Malla Uni-dimensional, Modelo de cauce en 1D

En la ecuación 4.3.5 la pendiente de fricción es representado por la media aritmética entre


las secciones transversales i e i + 1. Este puede ser representado por:

Media Aritmética.

 
1 Qi+1 |Qi+1 | Qi |Qi |
Sf,i+1/2 = 2
+ (4.3.6)
2 Ki+1 Ki2

Media Armónica.

2
Ki2
 
Ki+1
Sf,i+1/2 = 2/ + (4.3.7)
Qi+1 |Qi+1 | Qi |Qi |

Media Geométrica.

 1/2
Qi+1 |Qi+1 | Qi |Qi |
Sf,i+1/2 = 2
(4.3.8)
Ki+1 Ki2

Transporte Medio.

 2
Qi+1 + Qi
Sf,i+1/2 = (4.3.9)
Ki+1 + Ki

Si las secciones transversales del estudio, presentan contracciones y/o expansiones, una
perdida local es considerado en la ecuación 4.3.5, el cual la ecuación final se tiene:

79
4.3. Cálculos Uni-dimensionales para flujos en canales o cauces abiertos

0
βi0 Q2i Q2i+1
 
βi+1 ∆xi+1/2 Qi+1 |Qi+1 | Qi |Qi |
2
+ Zs,i = 2
+ Zs,i+1 + 2
+
2gAi 2gAi+1 2 Ki+1 Ki2
0 2 0 2
(4.3.10)
βi+1 Qi+1 βi Qi
+ λi+1/2

2gA2
i+1 2gA2
i

Donde λi+1/2 es el coeficiente de la pérdida local debido a la expansión o contracción en


el tramo entre las secciones transversales i y i + 1.

Solución de las Ecuaciones del Flujo Permanente Discretizados

La solución para la ecuación 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 estación del agua es especificado en la salida. Consecuentemente la descarga del flujo
es calculando aplicando la continuidad de masa y la estación del agua (tirante) puede ser
determinado por cálculos de remanso usando la ecuación 4.3.10. Como se ve, esta ecuación
es no lineal, por lo tanto, necesita ser resuelto iterativamente bajo un margen de error.

Definimos la siguiente función:

β 0 Q2 β 0 Q2
 
∆xi+1/2 Qi+1 |Qi+1 | Qi |Qi |
F = i+1 2 i+1 − i i2 + Zs,i+1 − Zs,i + 2
(4.3.11)
2gAi+1 2gAi 2 Ki+1 Ki2

Puesto que Zs,i+1 y la correspondiente Ai+1 y Ki+1 en la sección transversal i+1 se obtuvo
del cálculo previo en el tramo entre las secciones i + 1 y i + 2 o del tirante (o estación del
agua) dado en la salida, ahora el problema es determinar Zs,i y la correspondiente área
Ai y Ki , garantizando F = 0. Aquı́ se usa el método de Bisección.

Para el flujo Supercrı́tico: La descarga del flujo y la estación del agua (tirante) son ingre-
sadas usualmente en el ingreso (upstream). El procedimiento para los cálculos es el mismo
del flujo subcrı́tico, con la diferencia del sentido de cálculo (upstream - downstream).

80
4.3. Cálculos Uni-dimensionales para flujos en canales o cauces abiertos

Método de Bisección

Es un método de búsqueda incremental que divide el intervalo siempre en 2. Si la función


cambia de signo un intervalo, se evalúa el valor de la función en el punto medio. La
posición de la raı́z se determina situándola en el punto medio del sub intervalo, donde
exista cambio de signo. El proceso se repite hasta mejorar la aproximación.

Encontrar un segmento, eligiendo los valores iniciales [Zlower , Zupper ], en el cual la


sección de Zs,i existan, por ejemplo: Fupper Flower < 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 solución de Zs,i y si


Fupper Fmiddle < 0, entonces el Zlower = Zmiddle .

Si Zupper − Zlower es inferior a la tolerancia razonable, entonces (Zupper + Zlower )/2


puede ser la solución de Zs,i y para la iteración; de otro modo repetir desde el paso
(2) hasta que la solución converja.

Note que la búsqueda 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 elevación o fondo del canal Zs,i+1 .

81
4.3. Cálculos Uni-dimensionales para flujos en canales o cauces abiertos

4.3.2. Resumen de ecuaciones empleados en el programa PLE-

DER

β 0 Q2 β 0 Q2
 
∆xi+1/2 Qi+1 |Qi+1 | Qi |Qi |
F = i+1 2 i+1 − i i2 + Zs,i+1 − Zs,i + 2
(4.3.12)
2gAi+1 2gAi 2 Ki+1 Ki2

  
1 Qi+1 |Qi+1 | Qi |Qi |


 Media Aritmética: 2 2
Ki+1
+ Ki2

 2
 

 Media Armónica : Ki+1 K2
2/ + Qi |Qi i |

Qi+1 |Qi+1 |
Sf,i+1/2 =  1/2 (4.3.13)
Qi+1 |Qi+1 | Qi |Qi |


 Media Geométrica: 2
Ki+1 K2
2 i


 

 Transporte Medio: Qi+1 +Qi
Ki+1 +Ki

hf,i+1/2 = ∆xi+1/2 Sf,i+1/2 (4.3.14)

0 0 2
βi+1 Q2i+1

βi Qi
hc,i+1/2 = λi+1/2 − (4.3.15)
2gA2i+1 2gA2i

5/3 5/3 5/3


ALF,i AM C,i ARF,i
Ki = 2/3
+ 2/3
+ 2/3
(4.3.16)
nLF,i PLF,i nM C,i PM C,i nRF,i PRF,i

!
3 3 3
A2i KLF,i KM C,i KRF,i
βi0 = + 2 + 2 (4.3.17)
Ki3 A2LF,i AM C,i ARF,i

82
4.4. Diagramas de flujo

4.4. Diagramas de flujo

Para este componente (Hidráulica) se emplea objetos personalizados con aplicaciones de


ObjectDBX. Éste es una librerı́a dinámica 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 Cálculo de la Superficie Libre Método del Paso Están-


dar: Recibe los datos de las secciones transversales, geometrı́a, caudal de diseño,
condición 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 elección del flujo
Subcrı́tico, donde los cálculos son a partir de la última sección transversal hasta
la primera sección. En el diagrama se toma como dato al tirante hidráulico, área
hidráulica, perı́metro mojado y demás caracterı́sticas que se muestra. Ası́ mismo
contiene una función para calcular los niveles mediante el método bisección 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 única diferencia de
que el análisis es desde la primera sección transversal (upstream) hasta la última
sección.

83
4.4. Diagramas de flujo

Diagrama de flujo Cálculo del Área y Perı́metro hidráulico: A partir del


tirante asignado o calculado (nivel de superficie libre), en cada sección transversal
se obtiene las áreas y los perı́metros. El método que emplea es mediante franjas
verticales entre vértices adyacentes. En los extremos de la sección transversal, se
forman triángulos y en el intermedio pequeños trapecios, donde la sumatoria de ellos
representa el área y el perı́metro según corresponda. El método es muy adecuado
para secciones transversales complejas controlando inundaciones laterales (izquierda,
derecha) en cada sección transversal.

Diagrama de flujo Cálculo del Factor de Transporte K: El método para cal-


cular el factor de transporte es una fracción entre el area y el perı́metro multiplicado
por el coeficiente de manning. En programación es recomendable no tener valores
nulos o ceros en el denominador de una fracción. El diagrama controla este posible
error.

Diagrama de flujo Cálculo del Factor de corrección β 0 : Calcula el factor de


corrección β 0 en cada sección transversal, previniendo los posibles valores nulos en
los denominadores de las fracciones.

Diagrama de flujo Método de la Bisección: El método de la Bisección también


es conocido como el método de partición en dos intervalos iguales. Este método busca
la raı́z de una función en un intervalo propuesto, usando la técnica de búsqueda
incremental, para encontrar donde la función cambie de signo, o sea, cuando la
función cruza el eje de la coordenada x, por lo tanto, será el valor de la raı́z buscada.

Diagrama de flujo Función F : Este diagrama corresponde al calcular en forma


directa la función F , que es la ecuación del balance de energı́a.

Los resultados son:

84
4.4. Diagramas de flujo

Gráficos, 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 hidráulicas del flujo, tales como, caudal
de diseño, tirante, área, perı́metro, velocidad, número de froude, ancho o espejo de agua,
etc.

85
4.4. Diagramas de flujo

 
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   Condición   Condición Aguas Arriba 
 
Aguas Abajo *(A) Aguas Arriba *(B) y Aguas Abajo
 

 
Niveles de la superficie libre 
  de agua y las características 
hidráulicas.
 

 
FIN  CÁLCULO DE LA SUPERFICIE 
 

86
4.4. Diagramas de flujo

  (A) INICIO  CONDICIÓN  
AGUAS ABAJO
 

  i= nST ‐1, hasta i = 0, 
i = i‐1 
 

 
Zsi   Cota tirante
  Area, 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  

 
Niveles de la superficie libre 
 
de agua y las características 
  hidráulicas.

  FIN CONDICIÓN AGUAS ABAJO 

87
4.4. Diagramas de flujo

  (B) INICIO  CONDICIÓN  
AGUAS ARRIBA
 

  i= 1, hasta i = nST, 
i = i+1 
 

 
Zsi   Cota tirante
  Area, 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  

 
Niveles de la superficie libre 
 
de agua y las características 
  hidráulicas.

  FIN CONDICIÓN AGUAS ARRIBA 

88
4.4. Diagramas de flujo

  (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 > 
              V                                                                                           F 
PrimerVértice[Y]

 
Incrementar un vértice inicial con 
  coordenadas: 
X = PrimerVértice[X]. 
  Y = Cota Tirante. 
Inundación vértice izquierdo = verdadero. 
 

               V                                                        F 
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
 

89
4.4. Diagramas de flujo

 
... 1
 
j = 1, hasta N° de 
  Vértices,  j= j+1

 
Cota Tirante <= 
                  V       
Vertices[j].y      F 

Y = Cota Tirante 
                                                                      
 
 
 

   Condición = Verdadero   

                        F
Condición = Verdadero
  V
    ∑

 
 
 J = J+1 
 
V Vertices[j+1].y  F
 
>= Cota Tirante
 
   
 
   
 

  V Vertices[j+1].y  F
< Cota Tirante
 

   Condición = Verdadero Condición = Falso

 
Area (m2), Perímetro (m) 

FIN GETAREAPERIMETER 

90
4.4. Diagramas de flujo

  (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 

 
V PLF != 0.0  F
 

  /  
     /
 
   

 
V PMC != 0.0  F
 
/
    /

  V PRF != 0.0  F
   
/
 
  /
 

  K = KLF + KMC + KRF 

 
FIN GETCONVEYANCEK 
 

91
4.4. Diagramas de flujo

 
(E) INICIO  
  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 
 

 
V ALF != 0.0  F
 

   BetaLF  
 

   

  V F  
AMC != 0.0 
 
 BetaMC  
 
 

  V ARF != 0.0  F

 
 BetaRF
 

  β' BetaLF   BetaMC BetaRF  

  FIN GETCORRECTIONFACTORBETA 

92
4.4. Diagramas de flujo

 
(F) INICIO  MÉTODO DE 
  BISECCIÓN

  Zlower  = Extremo valor inferior. 
Zupper  = Extremo valor superior. 
  Variables hidráulicas. 
NoEncontrado = verdadero 
 
F
NoEncontrado = Verdadero
 
V
 
   
Area, Perímetro    GetAreaPerimeter  * C .
  K   GetConveyanceK  * D . 
Beta   GetCorrectionFactorBeta  * E
  Fmiddle   FuncionF * G

 
V Abs(Fmiddle) < TOL  F
 

   Nivel = Zmiddle 
NoEncontrado = falso 
 
Flower   FuncionF
Fupper   FuncionF
 

  V Abs(Fmiddle) < TOL 
F

 
 Zupper = Zmiddle  Zlower = Zmiddle 
 

  V Abs(Zupper ‐Zlower)  F
< TOL 
    
NoEncontrado = falso 
 

  Niveles de superficie libre 
Variables Hidráulicas 
 

 
FIN MÉTODO DE BISECCIÓN 

93
4.4. Diagramas de flujo

  (G) INICIO  FUNCIÓNF 

  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. 
 
∆ / | | | |
  , ,  
2 2 2

  F

 
FIN FUNCIÓNF 
 

94
Capı́tulo 5

SOCAVACIÓN EN RÍOS Y
DIAGRAMAS DE FLUJO

5.1. Introducción

El fenómeno de la socavación en cauces naturales, ocurre generalmente en presencia de las


máximas 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 socavación 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 éstos lo conforman.

5.2. Clasificación de los Rı́os

Se clasifica en cauce principal definido y cauce principal indefinido.

95
5.2. Clasificación 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 inundación izquierda (Left Floodplain), llanura de inundación derecha (Right
Floodplain).

Figura 5.1: Sección transversal en cauce principal definido

En periodos de estiaje, las llanuras de inundación en muchas ocasiones suelen estar cu-
biertas de vegetación o arbustos de pequeña 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: Sección transversal en cauce principal indefinido

96
5.3. Socavación 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. Socavación General en cauces definidos

El criterio de erosión es producto del incremento del caudal del flujo (mayor velocidad,
siempre en cuando se mantiene el área de la sección 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 área hidráulica, 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 , está dada en función de las caracterı́sticas hidráulicas del cauce (pen-
diente, tirante, flujo, rugosidad, etc.). Con respecto a la velocidad Ue está en función 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 tratándose de material no cohesivo, es el
diámetro 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. Socavación General para Suelos Cohesivos

La magnitud de la erosión es suelos limosos y arcillosos dependen principalmente del peso


volumétrico del suelo seco. El valor de la velocidad media que se requiere para degradar

97
5.3. Socavación General en cauces definidos

el fondo está dado por la ecuación.

Ue = 0,60γs1,18 ϕHsX (5.3.1)

Donde:

Hs : Tirante considerado a cuya profundidad se desea conocer qué valor de Ue se requiere


para arrastrar y levantar el material.

X: Exponente variable está en función 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 volumétrico 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 diseño
100 0.77
50 0.82
20 0.86
10 0.90
5 0.94
2 0.97
1 1.00
0.3 1.03
0.2 1.05
0.1 1.07

98
5.3. Socavación 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.43
0.83 0.51 0.15 0.42
0.86 0.50 0.50 0.41
0.88 0.49 1.00 0.40
0.90 0.48 1.50 0.39
0.93 0.47 2.50 0.38
0.96 0.46 4.00 0.37
0.98 0.45 6.00 0.36
1.00 0.44 8.00 0.35
1.04 0.43 10.00 0.34
1.08 0.42 15.00 0.33
1.12 0.41 20.00 0.32
1.16 0.40 25.00 0.31
1.20 0.39 40.00 0.30
1.24 0.38 60.00 0.29
1.28 0.37 90.00 0.28
1.34 0.36 140.00 0.27
1.40 0.35 190.00 0.26
1.46 0.34 250.00 0.25
1.52 0.33 310.00 0.24
1.58 0.32 370.00 0.23
1.64 0.31 450.00 0.22
1.71 0.30 570.00 0.21
1.80 0.29 750.00 0.20
1.89 0.28 1000.00 0.19
2.00 0.27

La variación de la velocidad media Ur de la corriente en función de la profundidad y para


cada punto de la sección transversal, puede ser obtenida analizando una franja vertical.
La hipótesis que se formula para realizar el cálculo es que el gasto unitario es cada franja
permanece constante mientras dura el proceso de erosión.

Donde:

B, representa el ancho de la superficie, H0 tirante en el punto P antes de la erosión, Hs


tirante supuesto, para el cual se desea conocer el muevo valor de la velocidad, P punto

99
5.3. Socavación General en cauces definidos

Figura 5.3: Sección transversal, Socavación general

cualquiera, en el cual se desea conocer el cambio de velocidad al aumentar el tirante.

Ecuaciones para la socavación general

Desde la franja considera en la figura 5.3 con espesor ∆B, el caudal del flujo que pasa por
esta sección está dada según la ecuación de Manning.

1 1/2 5/3
∆Q = U ∆A = S H0 ∆B (5.3.2)
n f
Hj +Hj+1
Donde para H0 = 2

Figura 5.4: Franja en estudio para la socavación

Algunos textos para simplificar operaciones, asumen en las secciones transversales como
rectangulares o trapezoidales, de tal forma que el área 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.

100
5.3. Socavación General en cauces definidos

A continuación se muestra las ecuaciones sin alterar éstas caracterı́sticas, por lo tanto:

µ 1/2 5/3 −2/3


Q= S A P (5.3.3)
n f

Donde:

µ, es el coeficiente de contracción por las turbulencias que se presentan. A, es el área total


del flujo en la sección transversal. P , perı́metro total de la sección transversal.

De las ecuaciones 5.3.2 y 5.3.3 se tiene.

1/2
Sf QP 2/3
= (5.3.4)
n µA5/3

De las ecuaciones 5.3.4 y 5.3.2, se tiene

1/2
Sf 5/3 QP 2/3 5/3
∆Q = H0 ∆B = H ∆B
n µA5/3 0

5/3
QP 2/3 H0 ∆B
∆Q = (5.3.5)
µA5/3

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, está en función (directamente proporcional) de esta velocidad y el tirante
se expresa por:

∆Q = Ur Hs ∆B (5.3.6)

igualando la ecuación 5.3.5 y 5.3.6

101
5.3. Socavación General en cauces definidos

5/3
QP 2/3 H0 ∆B
= Ur Hs ∆B (5.3.7)
µA5/3

Donde se tiene:
5/3
QP 2/3 H0
Ur = (5.3.8)
µA5/3 Hs

Lo que indica que la erosión se detendrá 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 (Condición de equilibrio).

Ue = Ur (5.3.9)

Por lo tanto
5/3
QP 2/3 H0
0,60γs1,18 ϕHsX =
µA5/3 Hs
5/3
QP 2/3 H0
Hs1+X =
0,60ϕµA5/3 γs1,18

1
! 1+X
5/3
2/3
QP H0
Hs = (5.3.10)
0,60ϕµA5/3 γs1,18

Esta ecuación 5.3.10, cumple para suelos Homogéneos.

5.3.2. Socavación General para Suelos No Cohesivos

El fenómeno fı́sico es el mismo para estos tipos de suelos (granos sueltos, arena, gravas,
etc), manteniendo la misma fórmula para la velocidad real, lo que sı́ cambia es la velocidad
media que se requiere para degradar el fondo Ue

Ue = 0,68ϕd0,28
m Hs
X
(5.3.11)

102
5.3. Socavación General en cauces definidos

Donde:

dm , diámetro medio de los granos del fondo, obtenidos según la expresión (mm).

X
dm = 0,01 (di Pi ) (5.3.12)

Donde:

di , diámetro de una fracción en una curva granulométrica de la muestra total que se analiza
(mm). Pi , porcentaje del peso de esta misma porción, 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:

5/3
0,28 X QP 2/3 H0
0,68ϕdm Hs =
µA5/3 Hs
5/3
QP 2/3 H0
Hs1+X =
0,68ϕµA5/3 d0,28
m

1
! 1+X
5/3
QP 2/3 H0
Hs = (5.3.13)
0,68ϕµA5/3 d0,28
m

103
5.4. Diagramas de flujo

5.4. Diagramas de flujo

Diagrama de flujo Cálculo de la Socavación General: El diagrama, corres-


ponde al cálculo de la socavación general mediante el método de Lischtvan-Lebeviev
para cada sección transversal considerado. Para calcular la socavación general, es ne-
cesario como dato principal las caracterı́sticas fı́sicas del las secciones transversales
y las caracterı́sticas hidráulicas tales como el área hidráulica, perı́metro mojado y el
caudal de diseño. Finalmente obtiene las coordenadas de la nueva sección transversal
socavada y las alturas en cada vértice.

Diagrama de flujo Coeficiente X: El coeficiente X, es un dato importante que


se emplea en la solución de la altura de socavación en lecho cohesivo y no cohesivo
(ecuación 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 diámetro medio
dm de las partı́culas en mm. Para cada intervalo se realizó ajustes polinómicas, con
coeficientes de regresión muy aceptables (R2 = 0,99).

Diagrama de flujo Lischtvan-Lebeviev: Corresponde a las aplicación directa


de las ecuaciones 5.3.10 y 5.3.13, dependiendo del tipo de material asignado en la
sección transversal.

Los resultados son:

Gráficos, (polilı́neas) en casa una de las secciones transversales.


Tabulares, (tablas) altura de socavación en cada vértice de la sección transversal.

104
5.4. Diagramas de flujo

 
INICIO  CÁLCULO DE LA 
  SOCAVACIÓN GENERAL
 

  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) 
 

 
Altura de socavación de las 
  secciones transversales
 

  FIN  CÁLCULO DE LA 
SOCAVACIÓN GENERAL 
 

105
5.4. Diagramas de flujo

  (H) INICIO  CÁLCULO DEL 
COEFICIENTE X
 

 
Tipo de Material
 
        Cohesivo                         No Cohesivo     
 

 
C =  Material Cohesivos (Ton/m3) NC =  Material No Cohesivos (mm)
 

  1   2  
 

 
J
 

  Valor del coeficiente X 

 
FIN  CÁLCULO DEL 
  COEFICIENTE X

106
5.4. Diagramas de flujo

 
... 1
 

 
V 0 < C < 0.80 F
 

 
  0.0973C 0.539 1.113 1.117
 

 
V 0.8 ≤ C ≤ 2.00 
F
 

   X = Interpolación (C)

 
V F
 C > 2.00 
 

 
  0.0973C 0.539 1.113 1.117
 
J
 

107
5.4. Diagramas de flujo

  ... 2

  V 0 <NC < 0.05 F

 
0.43 
  
 

 
V 0.05 ≤ NC ≤ 1000
F
 

   X = Interpolación (NC)

 
V F
 NC > 1000 
 

 
  1.30 10 NC 2.44 10 0.304
 

 

108
5.4. Diagramas de flujo

  (I) INICIO  CÁLCULO SOCAVACIÓN 
LISCHTVANLEBEVIEV
 

 
Tipo de Material
 
        Cohesivo                         No Cohesivo     
 

 
Material Cohesivos   Material No Cohesivos  
 

 
/ / / /

  0.60 / .
0.68 / .

 
Niveles  de  socavación  en 
  cada  vértice  de  la  sección 
transversal 
 

  FIN  CÁLCULO SOCAVACIÓN 
LISCHTVANLEBEVIEV
 

109
Capı́tulo 6

APLICACIÓN PRÁCTICA DEL


PROGRAMA DESARROLLADO

6.1. Introducción

La aplicación práctica hace referencia al proyecto Construcción de la Defensa Ribereña


Rı́o Huallaga-Huariaca en el estudio hidrológico - hidráulico e hidráulica fluvial, con el
objetivo de determinar los caudales de máximas avenidas para realizar los dimensiona-
mientos adecuados y óptimos de la defensa ribereña de la ciudad de Huariaca que se ubica
adyacente al Rı́o Huallaga en 2.5 km.

El estudio Hidrológico, corresponde a determinar el caudal de máximas avenidas a partir


de datos de precipitación máxima de 24 horas registrados en la estación Yanahuanca,
latitud 10◦ 29’S, longitud 76◦ 30’W y altitud 3473 m.s.n.m., en el departamento de Pasco,
provincia Daniel A. Carrión y distrito Yanahuanca.

El estudio Hidráulico, concierne a transitar el caudal de diseño para un perı́odo de re-


torno asignado, a través de las 125 secciones transversales del cauce, espaciadas cada 20.0
metros en tramos longitudinales rectos a través de la lı́nea thalweg. El tránsito del caudal

110
6.2. Descripción General de Programa PLEDER

máximo determina encontrar el perfil de la superficie libre de agua, incluyendo parámetros


hidráulicos de diseño en cada una de las secciones transversales, a partir de los cuales se
podrá proyectarse eficientemente las estructuras hidráulicas de protección.

El estudio de Hidráulica Fluvial, permite determinar el ancho estable del cauce, transporte
de sedimentos, socavaciones generales.

Cada uno de éstos componentes, serán llevados a cabo mediante el programa PLEDER,
obteniendo los resultados finales gráficas y tabulares, que son necesarios para su interpre-
tación.

6.2. Descripción General de Programa PLEDER

El programa Lluvia Escorrentı́a para Simulación de Defensas Ribereñas (PLEDER), reali-


za el proceso hidrológico, hidráulico e hidráulica fluvial, este último abarca las socavaciones
generales de las secciones transversales, en el ambiente AutoCAD. PLEDER en su prime-
ra versión contiene 13 commandos, 5 en el componente hidrológico, 6 en el componente
hidráulico y 2 comandos en hidráulica fluvial.

PLIILA: Componente Hidrológico, muestra la ventana para calcular Hietogramas


mediante el método IILA SENAMHI UNI.

Figura 6.1: Ícono: PLIILA

PLNRCS: Componente Hidrológico, muestra la ventana para calcular Hietogramas


mediante el método NRCS.

111
6.2. Descripción General de Programa PLEDER

Figura 6.2: Ícono: PLNRCS

PLLLES: Componente Hidrológico, comando principal que muestra la ventana para


calcular la transformación Lluvia - Escorrentı́a.

Figura 6.3: Ícono: PLLLES

PLCNC: Componente Hidrológico, comando alternativo para calcular el Número


de Curva Compuesto.

Figura 6.4: Ícono: PLCNC

PLHU: Componente Hidrológico, importar los datos de las coordenadas hidrograma


unitario [U ] y y pulso [P ], para realizar la convolución discreta.

Figura 6.5: Ícono: PLHU

PLHSTC: Componente Hidráulico, comando principal para crear y almacenar


los vértices de las secciones transversales, a partir de una polilı́nea. Median-
te este comando, el programa PLEDER, crear el objeto personalizado llamado

112
6.2. Descripción General de Programa PLEDER

CPLEDERCROSSSECTIONS , quien contiene la base de datos de los parámetros


de ingreso en las secciones transversales.

Figura 6.6: Ícono: PLHSTC

PLHCAL: Componente Hidráulico, calcula los parámetros hidráulicos y los niveles


de la superficie libre, mediante el método del paso estándar en flujo permanente.
El comando crea el segundo objeto personalizado PLEDERHYDRAULICRESULT ,
donde los resultados se almacena en su base de datos.

Figura 6.7: Ícono: PLHCAL

PLHPSL: Componente Hidráulico, 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: Ícono: PLHPSL

PLHTST: Componente Hidráulico, comando alternativo y utilitario para realizar


informes de las secciones transversales en tablas editables y con opciones a ser ex-
portado a archivos con extensión csv.

113
6.2. Descripción General de Programa PLEDER

Figura 6.9: Ícono: PLHTST

PLHRES: Componente Hidráulico, muestra en un cuadro de diálogo los resultados


o parámetros hidráulicos calculados en cada sección transversal.

Figura 6.10: Ícono: PLHRES

PLHDEL: Componente Hidráulico, elimina los niveles calculados en


las secciones transversales y la base de datos del objeto personalizado
PLEDERHYDRAULICRESULT .

Figura 6.11: Ícono: PLHDEL

PLHSOC: Componente Hidráulica Fluvial, éste comando permite ingresar los datos
de las secciones transversales para calcular las socavaciones generales.

Figura 6.12: Ícono: PLHSOC

PLHSCC: Componente Hidráulica Fluvial, comando principal para calcular las


socavaciones generales en las secciones transversales. Éste comando plotea y muestra
los resultados tabulares de las socavaciones en cada una de las secciones.

114
6.3. Cálculos y Resultados Hidrológicos

Figura 6.13: Ícono: PLHSCC

PLEDER, organizada los comandos descritos dentro del AutoCAD en menús, toolbars y
paneles Ribbon. La opción Ribbon se utiliza a partir de la versión 2009, quien muestra
una mejor organización, visualización en los comandos personalizados.

Figura 6.14: PLEDER, paneles Ribbon

6.3. Cálculos y Resultados Hidrológicos

De las informaciones cartográficas, pluviométrica de la zona de estudio, se determina el


caudal de máximas avenidas para diferentes perı́odos de retorno, considerando para este
caso los hietogramas sintéticos elaborados por el NRCS en la curva tipo II.

Los datos de la cuenca se resume en la tabla 6.1, ası́ también se adjunta en el apéndice E
la cartografı́a, red topológica, altitud y el perfil longitudinal del cauce principal.

Cuadro 6.1: Datos de la cuenca principal


Descripción Medida
Área de la cuenca 581.587 km2 .
Perı́metro de la cuenca 128.713 km.
Longitud del cauce 47.110 km.
Cota más baja 2970.000 m.s.n.m.
Cota más alta 4500.000 m.s.n.m.
Tiempo de Concentración 289.350 min

115
6.3. Cálculos y Resultados Hidrológicos

Mediante el comando PLLLES o el ı́cono de la figura 6.3, muestra el interfaz gráfico para
calcular la transformación de lluvia - escorrentı́a. Contiene 3 parámetros importantes de
ingreso:

6.3.1. Parámetro Cuenca [U]

Parámetro Cuenca [U] corresponde a la obtención de las coordenadas del hidrograma


unitario, mediante las caracterı́sticas fı́sicas de la cuenca y el tipo del hidrograma unitario
sintético (hidrograma unitario NRCS e hidrograma unitario Snyder).

Figura 6.15: PLEDER, datos Transformación Lluvia Escorrentı́a

Dentro de éste parámetro, PLEDER presenta utilitarios tales como el calcular las áreas
mediante polilı́neas cerradas, distancias longitudinales, puntos de referencia en coordena-
das UTM, dentro del ambiente AutoCAD.

116
6.3. Cálculos y Resultados Hidrológicos

Figura 6.16: PLEDER, área desde una polilı́nea

El programa contiene una herramienta para calcular en Número de Curva Compuesto


(expuestos en el capitulo 2), que en una mayorı́a de las cuencas la uniformidad de la
vegetación o tipo de suelo no se presenta en su totalidad, por lo tanto, la subdivisión de
las cuencas con las mismas caracterı́sticas son necesarios para ponderar y obtener este
valor compuesto.

Figura 6.17: PLEDER, curva Número Compuesto

117
6.3. Cálculos y Resultados Hidrológicos

La sumatoria de las áreas tiene que ser igual al área de la cuenca. En la figura 6.17,
PLEDER presenta hasta 6 subdivisiones para calcular La Curva número Compuesto.

En la presente aplicación se usa el hidrograma unitario sintético NRCS, cuyos datos son el
área de la cuenca y el tiempo de retardo que está en función al tiempo de concentración de
la cuenca. La Figura 6.18 muestra el cálculo de tiempo de retardo, bajo dato o resultado
del tiempo de concentración. El tiempo de concentración se puede calcular mediante la
fórmula de Kirpich o también este valor lo puede asignar directamente el usuario. Por lo
tanto, cabe resaltar que el tiempo de concentración viene a ser resultado, si es calculado
mediante la fórmula de Kirpich y por otro lado es dato si es asignado por el usuario.

Figura 6.18: PLEDER, cálculo del tiempo de retardo

6.3.2. Parámetro Precipitación [P]

Corresponde a asignar el modelo meteorológico (Tormenta NRCS, IILA SENAMHI).

El modelo meteorológico elegido es la tormenta NRCS, tal como se muestra en la figura


6.19, donde la distribución de tormenta es el tipo II en intervalos de una hora (60 minutos),
con un precipitación máxima de 24 horas igual a 64.54 mm, calculados para un perı́odo
de retorno de 100 años y ajustando a una distribución probabilı́stica de Gumbel para un
95 % de probabilidad (Smirnov-Kolmogorov).

118
6.3. Cálculos y Resultados Hidrológicos

Figura 6.19: PLEDER, modelo meteorológico NRCS

6.3.3. Parámetro Tiempo [T]

Es el intervalo de tiempo para calcular lluvia escorrentı́a. Ésta opción indica el incremento
de tiempo para que el programa tenga que realizar los cálculos cada 10 minutos según 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 botón aceptar y asignado el punto de referencia para los resultados, proce-
demos a calcular el hidrograma de salida y el caudal máximo de diseño 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 apéndice D.

119
6.3. Cálculos y Resultados Hidrológicos

Figura 6.20: Hidrograma TR = 50 años

Figura 6.21: Hidrograma TR = 100 años

120
6.3. Cálculos y Resultados Hidrológicos

Figura 6.22: Hidrograma TR = 200 años

Figura 6.23: Hidrograma TR = 500 años

121
6.4. Cálculos y Resultados Hidráulicos

6.4. Cálculos y Resultados Hidráulicos

Ésta sección corresponde a transitar el caudal de diseño (QT R=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 tránsito de caudales será para los 4 perı́odos de retorno
considerados en la determinación de los hidrogramas.

Cuadro 6.2: Caudales máximos para diferentes Perı́odos de Retorno


TR Caudal (m3 /s)
50 240.69
100 339.23
200 449.19
500 609.92

La batimetrı́a del proyecto viene a ser el dato más importante y primordial para esta
sección; con ella representamos el proyecto fı́sico a escala normal en un proyecto digital y
a escala conveniente para realizar todos los cálculos correspondientes. El proyecto cuenta
con una batimetrı́a minuciosa con densos puntos topográficos y sobre todo dirigidos con
propiedad y conocimientos hidráulicos 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 estación 0 + 00 corresponde
al puente Acobamba y la estación 2 + 480 al centro poblado Yanacocha.

122
6.4. Cálculos y Resultados Hidráulicos

6.4.1. Secciones Transversales

Mediante la opción de las secciones transversales, se ingresan los datos fı́sicos del proyec-
to, tales como las coordenadas de los vértices que lo conforman, lı́mites de las llanuras de
inundación, longitudes izquierda, central y derecha, coeficientes de Manning y los coefi-
cientes de contracción y expansión; todo ello para cada una de las secciones transversales
del cauce.

El programa PLEDER, presenta opciones gráficas muy eficientes para crear las secciones
transversales a partir de polilı́neas, asignando los puntos de referencia tales como estación,
elevación y permitiendo calcular las coordenadas locales de cada uno de los vértices, tal
como se muestra en la figura 6.25.

Figura 6.25: PLEDER, secciones transversales

Quizá esta opción de crear las secciones transversales, diferencia mucho de los programas
comerciales existentes en la actualidad, ya que estos programas dependen de otros para

123
6.4. Cálculos y Resultados Hidráulicos

facilitar los datos que en este caso viene a ser los vértices locales de cada una de las
secciones transversales.

Figura 6.26: AutoCAD secciones transversales

Cada vértice es enumerado de izquierda a derecha, con el fin de almacenar en una matriz
ordenada, además elegir los lı́mites de inundación izquierda derecha mediante la numera-
ción de los vértices.

En la figura 6.25, la ventana presenta multiples opciones y utilitarios de enlace gráfico


con el ambiente AutoCAD, tales como calcular las distancias automáticas, selector de
polilı́neas, puntos de referencia entre otros. Ası́ también, el botón Aplicar guarda los
parámetros 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 aplicación, tal
como se muestra en los planos del apéndice E.

6.4.2. Flujo Permanente

La ventana del gráfico 6.27, muestra las opciones de los parámetros de borde y la asig-
nación del caudal de diseño para transitar el flujo a través de las secciones transversales

124
6.4. Cálculos y Resultados Hidráulicos

descritas anteriormente. Para la aplicación se analiza como flujo subcrı́tico, por la tanto
la opción del tirante aguas abajo es habilitado.

Figura 6.27: PLEDER, cálculo 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 exportación a otros archivos. PLEDER, presenta dos tipos
de resultados, resultados numéricos que son los parámetros hidráulicos en cada uno de las
secciones transversales y los resultados gráficos que viene a ser el perfil de la superficie
libre de agua a escala normal y los niveles en cada sección transversal (figura 6.29). Para
el perfil, la cota de terreno es la cota mı́nima de la sección transversal o en otros términos
es cota de la lı́nea thalweg, por lo tanto para la construcción del perfil, la longitud del
canal central de las secciones es acumulado.

125
6.4. Cálculos y Resultados Hidráulicos

Figura 6.28: PLEDER, resultados-parámetros hidráulicos

Figura 6.29: Niveles de superficie libre en las secciones transversales

126
6.5. Cálculos y Resultados de Socavaciones Generales

6.5. Cálculos 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 según la probabilidad de
gasto. Para la aplicación se realizó las curva granulométricas de los materiales incluyendo
cantos rodados y guijarros, de los cuales se obtuvo como resultados los diámetro medios
aproximadamente 150 mm y 180 mm.

Es importante mencionar que el programa PLEDER, habilita la ventana de la figura 6.30,


sólo si existe el objeto personalizado de los niveles de la superficie libre de agua dentro
del AutoCAD, es decir, si el cálculos de los niveles fueron ejecutados.

Figura 6.30: PLEDER, parámetros socavación 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 gráficos (lı́nea
de la nueva sección transversal socavada) y tabulares (nuevos vértices de las secciones

127
6.5. Cálculos y Resultados de Socavaciones Generales

transversales). Estos resultados son necesarios para estimar la profundidad de las cimen-
taciones de las estructuras hidráulicas o estructuras de protección ante avenidas máximas,
y siendo más especı́ficos en la instalación de gaviones y enrocados (riprap) representa la
profundidad del colchón reno y la profundidad de las uñas respectivamente.

Figura 6.31: Socavaciones en las secciones transversales

128
Capı́tulo 7

CONCLUSIONES Y
RECOMENDACIONES

7.1. Conclusiones

La investigación desarrollada en esta tesis ha llegado a las siguientes conclusiones :

1. Se ha elaborado un programa (PLEDER) que permite calcular los componentes


hidrológicos, hidráulicos e hidráulica fluvial, en un ambiente totalmente organizado,
amigable y sobre todo gráfico (AutoCAD).

2. Las caracterı́sticas de la herramienta, permite disponer de diferentes comandos para


cada componente.

3. Importancia de la asignación del Número de Curva, dependiente del tipo o las ca-
racterı́sticas de suelo.

4. Para emplear el método de la convolución 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 elección.

129
7.1. Conclusiones

5. Las precipitaciones acumuladas según la ecuación 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 éxito (R2 → 1) a ninguna función conocida, ası́ se eleve el grado del polinomio
(aunque no siempre los resultados del ajuste son mejores a mayor grado polinómi-
co), lo que exige a realizar interpolaciones para obtener las ordenadas de diferentes
duraciones de tiempo.

dT →Variación del tiempo en el hidrograma.


7. Si C = dt→Variación 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 variación de tiempo en el hietograma será siempre igual a la
variación del tiempo en el hidrograma (C = 1).

8. En todo Hidrograma Unitarios Sintético, 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 Sintético de Snyder, la mejor manera de emplear éstas


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 hidráulicas de protección.

11. Las ecuaciones discretizadas para los cálculos de los perfiles de la superficie libre de
agua, son ecuaciones no lineales, por lo tanto, se emplean técnicas numéricas tales

130
7.2. Recomendaciones

como el Método de la Secante (HECRAS), Newton Raphson (GSTAR), Método de


Bisección (PLEDER) , entre otros.

12. La socavación general en cauces naturales dependerá mucho del tipo de material
que lo conforma en cada estación del cauce, por lo general, se uniformiza en una
estación.

13. Para calcular la socavación 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-


posición 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
edición profesionales.

2. Realizar librerı́as o clases para las distintas aplicaciones ingenieriles en el lenguaje


de programación C++, ası́ facilita los diversos procedimientos que en muchos casos
son repetitivos y de uso perenne.

3. Importancia en el empleo de la programación y métodos numéricos 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.

131
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 México,D.F., 2003.

[3] AUTODESK. ObjectARX Developer’s Guide. Autodesk Developer Center EEUU,


1999.

[4] JHON BIRD. Higher Engineering Mathematics. Elsevier Ltd, 2006.

[5] JOSÉ LUIS SANCHEZ BRIBIESCA. Doce algoritmos para resolver problemas de
hidráulica. Universidad Nacional Autónoma de México, 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. Métodos numéricos para ingenie-


ros. McGraw-Hill México, 1999.

[9] HUBERT CHANSON. Hidráulica del Flujo en Canales Abiertos. McGraw-Hill In-
teramericana, S.A., 2002.

132
BIBLIOGRAFÍA

[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. Santafé de Bogotá, 1994.

[12] VENT TE CHOW. Hidráulica de canales abiertos. Mac Graw Hill Interamericana
S.A. Colombia, 2000.

[13] JAIME SUÁREZ DÍAS. Control de erosión en zonas tropicales. Instituto de Inves-
tigaciones sobre Erosión y Deslizamientos-Ingenierı́a de suelos, Noviembre, 2001.

[14] ROSENDO CHÁVEZ DÍAS. Hidrologı́a para Ingenieros. Fondo Editorial de la Pon-
tificia Universidad. Lima Perú, 1994.

[15] ANIL W. DATE. Introduction Computational Fluid Dynamics. Cambridge University


Press, 2005.

[16] RICHARD H. FRENCH. Hidráulica del Canales Abiertos. McGraw-Hill Interamerica


de México, 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 Cristóbal de Huamanga, 2004.

[21] JOEL ORE IWANAGA. Apuntes de clase estructuras hidráulicas. Universidad Na-
cional de San Cristóbal de Huamanga, Noviembre, 2006.

133
BIBLIOGRAFÍA

[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. FERRÁNDEZ M. VIDE, L. QUEROL. Uso de


modelos uni-y bidimensionales en llanuras de inundación, aplicación del rı́o tajo en
talavera de la reina. Ingenierı́a del Agua Vol 10, Marzo 2003.

[30] HERON MORALES MARCHENA. Matlab, Métodos numéricos y visualización grá-


fica. Editorial Megabyte Perú, 1999.

[31] ADRIAN ILINCA MARECELO REGGIO, ANDRÉ HESS. 3-d múltiple-level si-
mulation of free surface flows. Journal of Hydraulic Research, Vol 40, December,
2002.

[32] ANTONIO CRESPO MARTÍNEZ. Mecánica de Fluidos. Thomson Editores, 2006.

134
BIBLIOGRAFÍA

[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. Hidráulica de Canales. CIDIAT. Mérida, Venezuela, 1974.

[36] JOSÉ RAMÓN TÉMEZ PELÁEZ. Facetas del cálculo hidrometeorológico y estadı́s-
tico de máximos caudales. Revista de Obras Públicas, Febrero, 2003.

[37] VICTOR MIGUEL PONCE. Engineering Hydrology Principles and Practices. Pren-
tice Hall, 1989.

[38] CRISTIAN CASTRO PÉREZ. Apuntes de clase programación digital. Universidad


Nacional de San Cristóbal de Huamanga, 2002.

[39] CRISTIAN CASTRO PÉREZ. Apuntes de clase métodos numéricos aplicados. Uni-
versidad Nacional de San Cristóbal 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.

135
BIBLIOGRAFÍA

[45] MICHAEL SCHAFER. Computational Engineering-Introduction to Numerical Met-


hods. Springer-Verlag Berlin Heidelberg, 2006.

[46] DARLY B. SIMONS and FUAT SENTÜRK. 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. México, 2003.

[51] FRANK M. WHITE. Mecánica de Fluidos. McGraw-Hill Interamericana de España,


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.

136
Apéndice A

HIDROLOGÍA CÓDIGO FUENTE


C++

EL componente Hidrológico se organiza en 10 librerı́as con múltiples funciones y 07 ven-


tanas gráficas

137
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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;

138
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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();

139
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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.

140
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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

141
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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;

142
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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

143
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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;

144
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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

145
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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

146
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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

147
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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

};

148
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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)

149
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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

150
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

{
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())

151
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

{
::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();
}

152
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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

153
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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)

154
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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ó

155
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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();

156
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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)

157
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

{
}

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)

158
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

{
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];

159
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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

160
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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

161
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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

162
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

#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)

163
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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

164
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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;

165
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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

166
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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

167
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

{
// Distribución Tipo I
float TipoI[241]=
{0.0,0.00174,0.00348,0.00522,0.00697,0.00871,0.01046,0.0122,0.01
395,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.0
7835,0.0807,0.08307,0.08545,0.08784,0.09024,0.09265,0.09507,0.09
751,0.09995,0.10241,0.10487,0.10735,0.10984,0.11234,0.11485,0.11
737,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.1
7082,0.1746,0.17842,0.18226,0.18614,0.19006,0.194,0.19817,0.2027
5,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.46
316,0.515,0.5322,0.5476,0.5612,0.573,0.583,0.59188,0.60032,0.608
32,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.70
925,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.8
0509,0.80816,0.81121,0.81424,0.81725,0.82024,0.82321,0.82616,0.8
2909,0.832,0.83489,0.83776,0.84061,0.84344,0.84625,0.84904,0.851
81,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.914
56,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.97
825,0.97984,0.98141,0.98296,0.98449,0.986,0.98749,0.98896,0.9904
1,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.0156
8,0.01776,0.02,0.02276,0.02568,0.02872,0.03184,0.035,0.03797,0.0
4095,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.0947
1,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.2
06,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.354
69,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.544
56,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.6283
6,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.693
86,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.7
5281,0.75613,0.75943,0.76271,0.76598,0.76924,0.77248,0.77571,0.7
7892,0.78211,0.78529,0.78845,0.7916,0.79474,0.79786,0.80096,0.80
405,0.80712,0.81018,0.81322,0.81625,0.81926,0.82226,0.82524,0.82
821,0.83116,0.8341,0.83702,0.83992,0.84281,0.84569,0.84855,0.851
4,0.85423,0.85704,0.85984,0.86262,0.86539,0.86815,0.87089,0.8736
1,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

168
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

5496,0.95717,0.95936,0.96154,0.9637,0.96584,0.96797,0.97009,0.97
219,0.97428,0.97635,0.9784,0.98044,0.98246,0.98447,0.98647,0.988
45,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.0
0832,0.00941,0.0105,0.01161,0.01272,0.01385,0.01498,0.01613,0.01
728,0.01845,0.01962,0.02081,0.022,0.02321,0.02442,0.02565,0.0268
8,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.0
7469,0.07644,0.07821,0.08,0.08181,0.08364,0.08549,0.08736,0.0892
5,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.1
246,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.354
36,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.7
9416,0.799,0.8036,0.808,0.8122,0.8162,0.82,0.82367,0.82726,0.830
79,0.83424,0.83763,0.84094,0.84419,0.84736,0.85047,0.8535,0.8564
7,0.85936,0.86219,0.86494,0.86763,0.87024,0.87279,0.87526,0.8776
7,0.88,0.88229,0.88455,0.88679,0.889,0.89119,0.89335,0.89549,0.8
976,0.89969,0.90175,0.90379,0.9058,0.90779,0.90975,0.91169,0.913
6,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.94
229,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.9
7459,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.021
01,0.02203,0.02307,0.02412,0.02519,0.02627,0.02737,0.02848,0.029
61,0.03075,0.03191,0.03308,0.03427,0.03547,0.03669,0.03792,0.039
17,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.090
5,0.09263,0.0948,0.09703,0.0993,0.10163,0.104,0.10643,0.1089,0.1
1143,0.114,0.11666,0.11943,0.12232,0.12532,0.12844,0.13167,0.135
02,0.13848,0.14206,0.14575,0.14956,0.15348,0.15752,0.16167,0.165
94,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.2
6644,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.8
4248,0.84652,0.85044,0.85425,0.85794,0.86152,0.86498,0.86833,0.8
7156,0.87468,0.87768,0.88057,0.88334,0.886,0.88858,0.8911,0.8935
8,0.896,0.89838,0.9007,0.90298,0.9052,0.90738,0.9095,0.91158,0.9
136,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

169
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

.95303,0.95437,0.95569,0.957,0.95829,0.95958,0.96085,0.96211,0.9
6336,0.9646,0.96582,0.96704,0.96824,0.96944,0.97062,0.97179,0.97
295,0.9741,0.97523,0.97636,0.97747,0.97858,0.97967,0.98075,0.981
82,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.9
9828,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:

170
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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.2
0,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.00
0,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)
{

171
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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)

172
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

{
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

173
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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

174
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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"));

175
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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

176
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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)

177
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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

178
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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

179
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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();

180
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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

181
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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

182
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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();

183
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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

184
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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;

185
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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");

186
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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;

187
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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

188
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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

189
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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

190
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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

191
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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)

192
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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

193
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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;

194
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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;

195
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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

196
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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

197
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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

198
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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;

199
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++

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

200
Apéndice B

HIDRÁULICA CÓDIGO FUENTE


C++

EL componente Hidráulico se organiza en 09 librerı́as con múltiples funciones y 03 ven-


tanas gráficas

201
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

202
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

203
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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.

204
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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.

205
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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,

206
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

207
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

208
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

209
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

210
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

211
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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;

212
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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();

213
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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;

214
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

CString m_NST;
protected:
virtual void DoDataExchange(CDataExchange* pDX); //
Compatibilidad con DDX/DDV

public:
afx_msg void OnBnClickedOk();

DECLARE_MESSAGE_MAP()
};

215
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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;

216
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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;

217
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

// 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*)pResulta
dos, 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;

218
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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*)pRe
sultados, 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

219
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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;

220
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

221
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

222
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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*)pRe
sultados, 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.

223
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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;

224
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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.

225
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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;

226
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

227
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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.

228
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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;

229
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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?

230
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

231
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

232
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

233
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

234
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

235
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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()
{

236
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

//-------------------------------------------------------------------
/*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()
{

237
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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"

238
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

#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;

239
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

*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;
}

240
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

241
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

242
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

243
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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();

244
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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"));

245
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

246
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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)

247
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

{
*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"));

248
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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)

249
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

250
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

251
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

252
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

{
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++;

253
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

254
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

255
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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]))

256
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

257
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

258
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

: 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++)

259
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

{
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);

260
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

261
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

262
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

263
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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;

264
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

265
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

266
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

267
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

268
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

269
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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)

270
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

271
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

272
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

273
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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++)

274
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

275
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

276
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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]."));

277
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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();

278
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

279
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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;

280
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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;

281
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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;

282
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

283
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

284
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

285
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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."));

286
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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,

287
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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;

288
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

289
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

290
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

291
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

292
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

*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));

293
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

294
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

{
*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(CWn
d* 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");

295
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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)

296
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

297
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

298
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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;

299
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

300
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

301
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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
{

302
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

303
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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];
}

304
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

305
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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)

306
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

{
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

307
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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;

308
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

309
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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 ;

310
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

311
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++

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

312
Apéndice C

HIDRÁULICA FLUVIAL CÓDIGO


FUENTE C++

EL componente Hidráulica Fluvial se organiza en 02 librerı́as con múltiples funciones y


01 ventana gráfica

313
Apéndice C. HIDRÁULICA FLUVIAL CÓDIGO FUENTE C++

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();

314
Apéndice C. HIDRÁULICA FLUVIAL CÓDIGO FUENTE C++

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

315
Apéndice C. HIDRÁULICA FLUVIAL CÓDIGO FUENTE C++

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.1
6,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.4
0,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.0
0,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.3
1,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

316
Apéndice C. HIDRÁULICA FLUVIAL CÓDIGO FUENTE C++

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

317
Apéndice C. HIDRÁULICA FLUVIAL CÓDIGO FUENTE C++

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,DatosMateria
lX, 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;
}

318
Apéndice C. HIDRÁULICA FLUVIAL CÓDIGO FUENTE C++

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:

319
Apéndice C. HIDRÁULICA FLUVIAL CÓDIGO FUENTE C++

{
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++)
{

320
Apéndice C. HIDRÁULICA FLUVIAL CÓDIGO FUENTE C++

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

//--------------------------------------------------------------------

321
Apéndice C. HIDRÁULICA FLUVIAL CÓDIGO FUENTE C++

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

322
Apéndice C. HIDRÁULICA FLUVIAL CÓDIGO FUENTE C++

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();

323
Apéndice C. HIDRÁULICA FLUVIAL CÓDIGO FUENTE C++

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;

324
Apéndice C. HIDRÁULICA FLUVIAL CÓDIGO FUENTE C++

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;

325
Apéndice C. HIDRÁULICA FLUVIAL CÓDIGO FUENTE C++

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

326
Apéndice C. HIDRÁULICA FLUVIAL CÓDIGO FUENTE C++

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())
{

327
Apéndice C. HIDRÁULICA FLUVIAL CÓDIGO FUENTE C++

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())
}

328
Apéndice D

RESULTADOS DEL PROGRAMA

Cuadro D.1: Coordenadas hidrograma TR = 50 años

Duración (min) Q total (m3 /s) Duración (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 página siguiente)
329
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.1: Continuación de la tabla Coordenadas hi-


drograma TR = 50 años

Duración (min) Q total (m3 /s) Duración (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 página siguiente)

330
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.1: Continuación de la tabla Coordenadas hi-


drograma TR = 50 años

Duración (min) Q total (m3 /s) Duración (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 página siguiente)

331
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.1: Continuación de la tabla Coordenadas hi-


drograma TR = 50 años

Duración (min) Q total (m3 /s) Duración (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 página siguiente)

332
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.1: Continuación de la tabla Coordenadas hi-


drograma TR = 50 años

Duración (min) Q total (m3 /s) Duración (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 años

Duración (min) Q total (m3 /s) Duración (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 página siguiente)

333
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.2: Continuación de la tabla Coordenadas hi-


drograma TR = 100 años

Duración (min) Q total (m3 /s) Duración (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 página siguiente)

334
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.2: Continuación de la tabla Coordenadas hi-


drograma TR = 100 años

Duración (min) Q total (m3 /s) Duración (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 página siguiente)

335
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.2: Continuación de la tabla Coordenadas hi-


drograma TR = 100 años

Duración (min) Q total (m3 /s) Duración (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 página siguiente)

336
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.2: Continuación de la tabla Coordenadas hi-


drograma TR = 100 años

Duración (min) Q total (m3 /s) Duración (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 años

Duración (min) Q total (m3 /s) Duración (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 página siguiente)

337
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.3: Continuación de la tabla Coordenadas hi-


drograma TR = 200 años

Duración (min) Q total (m3 /s) Duración (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 página siguiente)

338
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.3: Continuación de la tabla Coordenadas hi-


drograma TR = 200 años

Duración (min) Q total (m3 /s) Duración (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 página siguiente)

339
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.3: Continuación de la tabla Coordenadas hi-


drograma TR = 200 años

Duración (min) Q total (m3 /s) Duración (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 página siguiente)

340
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.3: Continuación de la tabla Coordenadas hi-


drograma TR = 200 años

Duración (min) Q total (m3 /s) Duración (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 años

Duración (min) Q total (m3 /s) Duración (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 página siguiente)

341
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.4: Continuación de la tabla Coordenadas hi-


drograma TR = 500 años

Duración (min) Q total (m3 /s) Duración (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 página siguiente)

342
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.4: Continuación de la tabla Coordenadas hi-


drograma TR = 500 años

Duración (min) Q total (m3 /s) Duración (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 página siguiente)

343
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.4: Continuación de la tabla Coordenadas hi-


drograma TR = 500 años

Duración (min) Q total (m3 /s) Duración (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 página siguiente)

344
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.4: Continuación de la tabla Coordenadas hi-


drograma TR = 500 años

Duración (min) Q total (m3 /s) Duración (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 parámetros hidráulicos TR = 50


años

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 página siguiente)

345
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.5: Continuación de la tabla parámetros hidráu-


licos TR = 50 años

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 página siguiente)

346
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.5: Continuación de la tabla parámetros hidráu-


licos TR = 50 años

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 página siguiente)

347
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.5: Continuación de la tabla parámetros hidráu-


licos TR = 50 años

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 página siguiente)

348
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.5: Continuación de la tabla parámetros hidráu-


licos TR = 50 años

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 página siguiente)

349
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.5: Continuación de la tabla parámetros hidráu-


licos TR = 50 años

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 página siguiente)

350
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.5: Continuación de la tabla parámetros hidráu-


licos TR = 50 años

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 parámetros hidráulicos TR = 100


años

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 página siguiente)

351
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.6: Continuación de la tabla parámetros hidráu-


licos TR = 100 años

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 página siguiente)

352
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.6: Continuación de la tabla parámetros hidráu-


licos TR = 100 años

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 página siguiente)

353
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.6: Continuación de la tabla parámetros hidráu-


licos TR = 100 años

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 página siguiente)

354
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.6: Continuación de la tabla parámetros hidráu-


licos TR = 100 años

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 página siguiente)

355
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.6: Continuación de la tabla parámetros hidráu-


licos TR = 100 años

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 página siguiente)

356
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.6: Continuación de la tabla parámetros hidráu-


licos TR = 100 años

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 parámetros hidráulicos TR = 200


años

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 página siguiente )

357
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.7: Continuación de la tabla parámetros hidráu-


licos TR = 200 años

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 página siguiente )

358
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.7: Continuación de la tabla parámetros hidráu-


licos TR = 200 años

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 página siguiente )

359
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.7: Continuación de la tabla parámetros hidráu-


licos TR = 200 años

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 página siguiente )

360
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.7: Continuación de la tabla parámetros hidráu-


licos TR = 200 años

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 página siguiente )

361
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.7: Continuación de la tabla parámetros hidráu-


licos TR = 200 años

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 página siguiente )

362
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.7: Continuación de la tabla parámetros hidráu-


licos TR = 200 años

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 parámetros hidráulicos TR = 500


años

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 página siguiente)

363
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.8: Continuación de la tabla parámetros hidráu-


licos TR = 500 años

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 página siguiente)

364
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.8: Continuación de la tabla parámetros hidráu-


licos TR = 500 años

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 página siguiente)

365
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.8: Continuación de la tabla parámetros hidráu-


licos TR = 500 años

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 página siguiente)

366
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.8: Continuación de la tabla parámetros hidráu-


licos TR = 500 años

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 página siguiente)

367
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.8: Continuación de la tabla parámetros hidráu-


licos TR = 500 años

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 página siguiente)

368
Apéndice D. RESULTADOS DEL PROGRAMA

Cuadro D.8: Continuación de la tabla parámetros hidráu-


licos TR = 500 años

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)

369
Apéndice E

PLANOS

Los planos corresponden a:

Componente hidrológico

Plano Cartográfico del cuenca

Plano Red Topológico de la cuenca

Plano Altitudinal de la cuenca.

Plano perfil longitudinal del cauce principal

Componente hidráulico

Planos planta y secciones transversales del rı́o Huallaga.

370

You might also like