Sei sulla pagina 1di 388

bal de Huamanga

Universidad Nacional San Cristo


Facultad de Ingeniera de Minas, Geologa y Civil
Escuela Profesional de Ingeniera Civil

Tesis Para Optar el Ttulo de Ingeniero Civil

Programa Lluvia Escorrenta Para Simulaci


on de

Defensas Ribere
nas con ObjectARX C++

Presentado por : Ayala Bizarro, Ivan Arturo

Ayacucho
Peru
2009

PRESENTACION

La presente tesis lleva por ttulo Programa Lluvia Escorrenta Para Simulacion de De-
fensas Ribere
nas con ObjectARX C++, como una contribucion a la investigacion y pro-
gramacion en el area de la ingeniera hidraulica. La realizacion de esta investigacion sale
a luz luego de haber trabajado en m
ultiples problemas relacionados con el estudio de
defensas ribere
nas y transito de flujos en cauces naturales, con el afan de plasmar me-
diante un programa informatico que involucre analisis hidrologico, analisis hidraulico y
finalmente hidraulica fluvial, se plantea el desarrollo informatico mediante el lenguaje de
programacion C++ y ObjectARX. Esperando que su aplicacion sirva a todos aquellos
profesionales y estudiantes inmersos a la hidraulica.

Ayala Bizarro, Ivan Arturo


ayalabizarro@gmail.com

Escuela Profesional de Ingeniera Civil


bal de Huamanga
Universidad Nacional San Cristo
Ayacucho, Agosto de 2009.

i
DEDICATORIA

A DIOS por iluminar y bendecir mi camino. A mis


padres, Manuel Ayala Toscano y Mara Bizarro Ortz,
quienes me apoyaron de manera incondicional en mi for-
macion academica; gracias a ustedes por apostar siem-
pre en la educacion. A mis hermanos y a ti Jessica por
darme una felicidad y alegra incomparable.

ii
AGRADECIMIENTOS

A los docentes de la Universidad Nacional de San Cristobal de Huamanga -


Facultad de Ingeniera de Minas Geologa y Civil, por su contribucion durante
mi desarrollo academico y profesional.

Al Ingeniero Joel Ore Iwanaga, que durante mi formacion profesional no solo


se ha dedicado a incentivarme en la investigacion de la ingeniera hidraulica,
sino que tambien oriento mi futuro academico y personal, a quien considero un
modelo de docente universitario, y muy aparte de ser mi asesor en el presente
proyecto de investigacion es un gran amigo.

Como dejar de agradecer al Ingeniero Cristian Castro Perez, talentoso ami-


go, con muchas ganas de compartir informaciones a todos aquellos que estan
interesados en la investigacion; sus conocimientos son dignos de admiracion.

A la Ingeniera Jessica Z
uniga Mendoza, por su colaboracion en la realizacion
de la presente tesis, muchos detalles importantes y primordiales de la presente
investigacion son gracias a sus cualidades de las que no cuento. Gracias por
tu ayuda y tu tiempo desinteresado.

Al Ingeniero Ernesto Estrada Cardenas, por su colaboracion y orientacion y


por permitirme conocer a esa gran persona que hay detras del profesional que
nos muestra.

iii
Al Ingeniero Jaime Bendez
u Prado, por su entusiasmo, dinamismo y sobre
todo empe
no en las clases academicas.

A mis compa
neros de la Universidad Nacional de San Cristobal de Huamanga:
Juan Luis Taype Carrasco, Edmundo Canchari Gutierrez, Cesar Yupanqui,
Odiger Tacas, por compartir muchos momentos agradables durante nuestra
permanencia en la Universidad.

A la Universidad Nacional de San Cristobal de Huamanga, alma mater, del


cual me siento muy orgulloso haber pertenecido y egresado de sus aulas.

Al Dr. Hugo Scaletti, Dr. Julio Kuroiwa, Dr. Jorge Abad, personas de gran
conocimiento y sobre todo demostrando sencillez, a ellos por atender mis con-
sultas y despejar mis dudas en mi formacion profesional.

Al Dr. Arturo Leon Cuba por apoyar en la investigacion y brindar oportu-


nidades al respecto.

A mis compa
neros de la Maestra de la Universidad Nacional de Ingeniera:
Juan Carlos Rodriguez, Freddy Velazquez, Edwin Arapa, grandes amigos y
compa
neros de carpeta.

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


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

Este proyecto de investigacion nace con el objetivo de contribuir a la Ingeniera Civil


dentro del area de hidraulica y su desarrollo concierne a trabajos hidrologicos, hidraulicos
e hidraulica fluvial, para ello se crea una herramienta, pretendiendo facilitar y disminuir
aquellos procedimientos tediosos que se nos presentan al momento de realizar el analisis
en los tres parametros mencionados anteriormente.

Especficamente, la tesis trata del desarrollo de un programa llamado PLEDER, que viene
a ser las iniciales del nombre de la investigacion realizada. EL lenguaje de programacion
utilizado es C++ con enlaces de libreras ObjectARX, el cual facilita el acceso a las
estructuras de la base de datos de AutoCAD, siendo el acceso directo, tambien facilita
el acceso al sistema grafico, permitiendo definir comandos nativos dentro de programa
AutoCAD, ademas crea objetos personalizados en la base de datos para las aplicaciones
especificas.

El contenido teorico de la presente tesis de investigacion, explica los pasos y los procedi-
mientos a seguir mediante la utilizacion de los diferentes metodos que se desarrollan en los
captulos 2, 3, 4 y 5, mas adelante se resume el contenido de estos captulos divididos en
etapas. En el captulo 6, se hace referencia a la aplicacion practica mediante el programa
elaborado, el cual permitira comprobar la relacion teorico-practico. Finalmente se adjunta
los diagramas de flujo y el codigo fuente del programa.

v
En la etapa Hidrologica, se desarrolla la programacion de los modelos matematicos para
simulacion precipitacion escorrenta desde generacion de hietogramas, en el cual se utiliza
dos metodologas como el metodo de IILA-SENAMHI-UNI mediante el metodo del bloque
alterno propuesto por Ven Te Chow, metodo de los hietogramas sinteticos de tormentas
desarrollado por el Servicio de Conservacion de Suelos del Departamento de Agricultura
de los EEUU (1986), en la actualidad (NRCS). Determinacion de abstracciones, mediante
el modelo del n
umero de curva propuesto por el NRCS de los EEUU. Determinacion de
hidrogramas unitarios, donde se emplea los modelos del Hidrograma Unitario Sintetico de
Snyder y del NRCS. Determinacion de hidrogramas de maximas avenidas: Esta etapa se
desarrollara mediante el metodo de convolucion directa.

La etapa Hidraulica, es la parte fundamental de la presente investigacion, que consiste


en transitar los caudales de maximas avenidas a traves de las secciones transversales
naturales, considerando para el caso flujo permanente gradualmente variado y su solucion
numerica mediante el metodo del paso estandar. La etapa hidraulica permite conocer las
caractersticas hidraulicas de dise
no como son el tirante, velocidades maximas en el canal
principal y las llanuras izquierdo y derecho.

En la etapa Hidraulica Fluvial, corresponde a obtener las socavaciones generales en cada


una de las secciones transversales incluyendo para ello las partculas inherentes en la zona
en estudio, permitiendo realizar su grafico correspondiente.

Se debe tener en cuenta que la programacion realizada en la presente tesis es a nivel


general, es decir, se puede aplicar a cualquier zona de nuestro pas o fuera de ella, solamente
se necesita tener criterios prudentes en el ingreso de datos.
Indice general

Portada

Presentaci
on I

Dedicatoria II

Agradecimientos III

Resumen V

Indice General VII

Indice de Cuadros XII

Indice de Figuras XV


1. INTRODUCCION 1

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

1.2. Necesidad o motivacion de la investigacion . . . . . . . . . . . . . . . . . . 2

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

vii
INDICE GENERAL

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

1.3.2. Especficos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

1.4. Organizacion de la tesis . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

2. TEORIA HIDROLOGICA
Y DIAGRAMAS DE FLUJO 7

2.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

2.2. Desarrollo de Hietogramas de dise


no . . . . . . . . . . . . . . . . . . . . . 8

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

2.2.2. Hietogramas sinteticos del NRCS . . . . . . . . . . . . . . . . . . . 9

2.3. Tasas de Infiltracion - Metodo del NRCS . . . . . . . . . . . . . . . . . . . 12

2.4. Hidrogramas Unitarios Sinteticos: NRCS y Snyder . . . . . . . . . . . . . . 18

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

2.4.2. Hidrograma Unitario Sintetico . . . . . . . . . . . . . . . . . . . . . 21

2.5. Metodo de Convolucion discreta para transformacion precipitacion-


escorrenta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

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

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

2.5.3. Funcion respuesta de pulso discreto y Ecuacion de Convolucion Dis-


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

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

viii
INDICE GENERAL

3. TEORIA HIDRAULICA
Y SECCIONES TRANSVERSALES EN
RIOS 42

3.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

3.2. Bases teoricos para el calculo de flujo unidimensional . . . . . . . . . . . . 43

3.2.1. Ecuacion de Movimiento General. . . . . . . . . . . . . . . . . . . . 43

3.2.2. Ecuacion 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 Calculo Numerico. . . . . . 48

3.4. Calculo del Tirante Normal . . . . . . . . . . . . . . . . . . . . . . . . . . 51

3.4.1. Calculo Numerico . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

3.5. Caractersticas y Clasificacion de los Perfiles del Flujo Gradualmente Variado 60

3.6. Ecuaciones para el calculo de perfiles basicos. . . . . . . . . . . . . . . . . 64


4. MODELOS NUMERICOS EN RIOS Y DIAGRAMAS DE FLUJO 68

4.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

4.2. Formulacion de Flujos en 1D . . . . . . . . . . . . . . . . . . . . . . . . . . 69

4.2.1. Ecuaciones Hidrodinamicas 1D . . . . . . . . . . . . . . . . . . . . 69

4.2.2. Propiedades Hidraulicas Compuestas . . . . . . . . . . . . . . . . . 71

4.2.3. Propiedades Hidraulicas Compuestas . . . . . . . . . . . . . . . . . 76

4.3. Calculos Uni-dimensionales para flujos en canales o cauces abiertos . . . . 77

4.3.1. Calculos 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
INDICE GENERAL

EN RIOS Y DIAGRAMAS DE FLUJO


5. SOCAVACION 95

5.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95

5.2. Clasificacion de los Ros . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95

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

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

5.3. Socavacion General en cauces definidos . . . . . . . . . . . . . . . . . . . . 97

5.3.1. Socavacion General para Suelos Cohesivos . . . . . . . . . . . . . . 97

5.3.2. Socavacion General para Suelos No Cohesivos . . . . . . . . . . . . 102

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

PRACTICA
6. APLICACION DEL PROGRAMA DESARROLLADO 110

6.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110

6.2. Descripcion General de Programa PLEDER . . . . . . . . . . . . . . . . . 111

6.3. Calculos y Resultados Hidrologicos . . . . . . . . . . . . . . . . . . . . . . 115

6.3.1. Parametro Cuenca [U] . . . . . . . . . . . . . . . . . . . . . . . . . 116

6.3.2. Parametro Precipitacion [P] . . . . . . . . . . . . . . . . . . . . . . 118

6.3.3. Parametro Tiempo [T] . . . . . . . . . . . . . . . . . . . . . . . . . 119

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

6.4. Calculos y Resultados Hidraulicos . . . . . . . . . . . . . . . . . . . . . . . 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. Calculos y Resultados de Socavaciones Generales . . . . . . . . . . . . . . 127

x
INDICE GENERAL

7. CONCLUSIONES Y RECOMENDACIONES 129

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

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

Bibliografa 132

A. HIDROLOGIA CODIGO
FUENTE C++ 137


B. HIDRAULICA
CODIGO FUENTE C++ 201


C. HIDRAULICA
FLUVIAL CODIGO FUENTE C++ 313

D. RESULTADOS DEL PROGRAMA 329

E. PLANOS 370

xi
Indice de cuadros

2.1. Parametro regional b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

2.2. Clasificacion de clases antecedentes de humedad (AMC) para el metodo de


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

2.3. Grupo de suelo hidrologico, para el calculo 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 maximos para diferentes Perodos de Retorno . . . . . . . . . . . 122

D.1. Coordenadas hidrograma TR = 50 a


nos . . . . . . . . . . . . . . . . . . . . 329

D.1. Continuacion de la tabla Coordenadas hidrograma TR = 50 a


nos . . . . . . 330

D.1. Continuacion de la tabla Coordenadas hidrograma TR = 50 a


nos . . . . . . 331

D.1. Continuacion de la tabla Coordenadas hidrograma TR = 50 a


nos . . . . . . 332

D.1. Continuacion de la tabla Coordenadas hidrograma TR = 50 a


nos . . . . . . 333

D.2. Coordenadas hidrograma TR = 100 a


nos . . . . . . . . . . . . . . . . . . . 333

D.2. Continuacion de la tabla Coordenadas hidrograma TR = 100 a


nos . . . . . 334

xii
INDICE DE CUADROS

D.2. Continuacion de la tabla Coordenadas hidrograma TR = 100 a


nos . . . . . 335

D.2. Continuacion de la tabla Coordenadas hidrograma TR = 100 a


nos . . . . . 336

D.2. Continuacion de la tabla Coordenadas hidrograma TR = 100 a


nos . . . . . 337

D.3. Coordenadas hidrograma TR = 200 a


nos . . . . . . . . . . . . . . . . . . . 337

D.3. Continuacion de la tabla Coordenadas hidrograma TR = 200 a


nos . . . . . 338

D.3. Continuacion de la tabla Coordenadas hidrograma TR = 200 a


nos . . . . . 339

D.3. Continuacion de la tabla Coordenadas hidrograma TR = 200 a


nos . . . . . 340

D.3. Continuacion de la tabla Coordenadas hidrograma TR = 200 a


nos . . . . . 341

D.4. Coordenadas hidrograma TR = 500 a


nos . . . . . . . . . . . . . . . . . . . 341

D.4. Continuacion de la tabla Coordenadas hidrograma TR = 500 a


nos . . . . . 342

D.4. Continuacion de la tabla Coordenadas hidrograma TR = 500 a


nos . . . . . 343

D.4. Continuacion de la tabla Coordenadas hidrograma TR = 500 a


nos . . . . . 344

D.4. Continuacion de la tabla Coordenadas hidrograma TR = 500 a


nos . . . . . 345

D.5. Resultados parametros hidraulicos TR = 50 a


nos . . . . . . . . . . . . . . . 345

D.5. Continuacion de la tabla parametros hidraulicos TR = 50 a


nos . . . . . . . 346

D.5. Continuacion de la tabla parametros hidraulicos TR = 50 a


nos . . . . . . . 347

D.5. Continuacion de la tabla parametros hidraulicos TR = 50 a


nos . . . . . . . 348

D.5. Continuacion de la tabla parametros hidraulicos TR = 50 a


nos . . . . . . . 349

D.5. Continuacion de la tabla parametros hidraulicos TR = 50 a


nos . . . . . . . 350

D.5. Continuacion de la tabla parametros hidraulicos TR = 50 a


nos . . . . . . . 351

D.6. Resultados parametros hidraulicos TR = 100 a


nos . . . . . . . . . . . . . . 351

D.6. Continuacion de la tabla parametros hidraulicos TR = 100 a


nos . . . . . . . 352

xiii
INDICE DE CUADROS

D.6. Continuacion de la tabla parametros hidraulicos TR = 100 a


nos . . . . . . . 353

D.6. Continuacion de la tabla parametros hidraulicos TR = 100 a


nos . . . . . . . 354

D.6. Continuacion de la tabla parametros hidraulicos TR = 100 a


nos . . . . . . . 355

D.6. Continuacion de la tabla parametros hidraulicos TR = 100 a


nos . . . . . . . 356

D.6. Continuacion de la tabla parametros hidraulicos TR = 100 a


nos . . . . . . . 357

D.7. Resultados parametros hidraulicos TR = 200 a


nos . . . . . . . . . . . . . . 357

D.7. Continuacion de la tabla parametros hidraulicos TR = 200 a


nos . . . . . . . 358

D.7. Continuacion de la tabla parametros hidraulicos TR = 200 a


nos . . . . . . . 359

D.7. Continuacion de la tabla parametros hidraulicos TR = 200 a


nos . . . . . . . 360

D.7. Continuacion de la tabla parametros hidraulicos TR = 200 a


nos . . . . . . . 361

D.7. Continuacion de la tabla parametros hidraulicos TR = 200 a


nos . . . . . . . 362

D.7. Continuacion de la tabla parametros hidraulicos TR = 200 a


nos . . . . . . . 363

D.8. Resultados parametros hidraulicos TR = 500 a


nos . . . . . . . . . . . . . . 363

D.8. Continuacion de la tabla parametros hidraulicos TR = 500 a


nos . . . . . . . 364

D.8. Continuacion de la tabla parametros hidraulicos TR = 500 a


nos . . . . . . . 365

D.8. Continuacion de la tabla parametros hidraulicos TR = 500 a


nos . . . . . . . 366

D.8. Continuacion de la tabla parametros hidraulicos TR = 500 a


nos . . . . . . . 367

D.8. Continuacion de la tabla parametros hidraulicos TR = 500 a


nos . . . . . . . 368

D.8. Continuacion de la tabla parametros hidraulicos TR = 500 a


nos . . . . . . . 369

xiv
Indice de figuras

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

2.2. Distribucion de tormenta de 24 horas NRCS . . . . . . . . . . . . . . . . . 11

2.3. Distribucion de tormenta de los cuatro tipos NRCS . . . . . . . . . . . . . 12

(P 0,2S)2
2.4. Solucion grafica de la ecuacion 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 Sintetico del NRCS . . . . . . . . . . . . . . . . . . . 22

2.7. a) Hidrograma Unitario estandar (tp = 5,5tr ); b) Hidrograma Unitario


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

2.8. PLEDER: Coordenadas del Hidrograma Unitario Sintetico Snyder . . . . 25

2.9. Sistema hidrologico: continuidad de agua almacenada. . . . . . . . . . . . . 28

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

3.2. Seccion Transversal en Cauces Naturales . . . . . . . . . . . . . . . . . . . 49

3.3. Elementos geometricos 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
INDICE DE FIGURAS

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

3.7. Sistema de clasificacion de perfiles de flujo gradualmente variado . . . . . . 62

3.8. Balance de Energa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

4.1. Representacion de la seccion transversal en el Metodo Alpha . . . . . . . . 72

4.2. Seccion transversal compuesta con llanuras de inundacion . . . . . . . . . . 75

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

5.1. Seccion transversal en cauce principal definido . . . . . . . . . . . . . . . . 96

5.2. Seccion transversal en cauce principal indefinido . . . . . . . . . . . . . . . 96

5.3. Seccion transversal, Socavacion general . . . . . . . . . . . . . . . . . . . . 100

5.4. Franja en estudio para la socavacion . . . . . . . . . . . . . . . . . . . . . 100

6.1. Icono: PLIILA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111

6.2. Icono: PLNRCS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112

6.3. Icono: PLLLES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112

6.4. Icono: PLCNC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112

6.5. Icono: PLHU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112

6.6. Icono: PLHSTC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113

6.7. Icono: PLHCAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113

6.8. Icono: PLHPSL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113

6.9. Icono: PLHTST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

6.10. Icono: PLHRES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

6.11. Icono: PLHDEL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

xvi
INDICE DE FIGURAS

6.12. Icono: PLHSOC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

6.13. Icono: PLHSCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115

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

6.15. PLEDER, datos Transformacion Lluvia Escorrenta . . . . . . . . . . . . . 116

6.16. PLEDER, area desde una polilnea . . . . . . . . . . . . . . . . . . . . . . 117

6.17. PLEDER, curva N


umero Compuesto . . . . . . . . . . . . . . . . . . . . . 117

6.18. PLEDER, calculo del tiempo de retardo . . . . . . . . . . . . . . . . . . . 118

6.19. PLEDER, modelo meteorologico NRCS . . . . . . . . . . . . . . . . . . . . 119

6.20. Hidrograma TR = 50 a
nos . . . . . . . . . . . . . . . . . . . . . . . . . . . 120

6.21. Hidrograma TR = 100 a


nos . . . . . . . . . . . . . . . . . . . . . . . . . . . 120

6.22. Hidrograma TR = 200 a


nos . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

6.23. Hidrograma TR = 500 a


nos . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

6.24. Planta Ro Huallaga . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122

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

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

6.27. PLEDER, calculo del flujo permanente . . . . . . . . . . . . . . . . . . . . 125

6.28. PLEDER, resultados-parametros hidraulicos . . . . . . . . . . . . . . . . . 126

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

6.30. PLEDER, parametros socavacion general . . . . . . . . . . . . . . . . . . . 127

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

xvii
Captulo 1


INTRODUCCION

1.1. Antecedentes

A inicios de los a
nos 60, con la aparicion de las primeras computadoras se realizaron
numerosos programas para calcular y/o transformar la lluvia-escorrenta y transito de
flujos en canales, aplicando distintas metodologas, pero en estos a
nos, a
un era limitado
desarrollar programas con variables m
ultiples debido a las limitaciones de las memorias
que ofrecan en ese entonces; tal es el caso del desarrollo de programas para la hidrologa
determinstica y algunos estocasticos con series limitadas debido a las dimensiones cortas
de sus matrices. Conforme pasaron los tiempos y paralelo al avance de la tecnologa, se
mejoro considerablemente metodologas computacionales dentro del area de hidraulica e
hidrologa, realizando softwares en su maxima expresion, considerando modelos tridimen-
sionales en el espacio y no permanentes en el tiempo, con soluciones numericas avanzadas
tales como el Metodo de los Elementos Finitos y/o soluciones mediante la utilizacion de
Inteligencia Artificial, tales como Algoritmos Geneticos, Redes Neuronales Artificiales,
entre otros.

1
1.2. Necesidad o motivacion de la investigacion

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


RAS, HEC HMS, GSTAR, MIKE 11, RIVER CAD y muchos mas, los mismos que se
utilizan directamente sin conocer el fundamento teorico al detalle, lo que nos conlleva en
muchos casos a una interpretacion inadecuada. Problemas que surgen debido a que estos
programas en su gran mayora se encuentran en idioma extranjero y algunos casos con
parametros de acuerdo a su zona de estudio.

PLEDER, en su primera version trata de mejorar muchas dificultades como es la recepcion


de datos dentro del programa AutoCAD, aprovechando las bondades y herramientas que
ofrece este programa, tales como creacion de secciones transversales a partir de polilneas,
calculo de area de un polgono (cuencas hidrologicas), calculos de distancias automaticas
a escalas reales, puntos de referencia en coordenadas UTM y mas. Todo esto es posible
gracias a que PLEDER esta programado en el lenguaje C++ y libreras ObjectARX,
facilitando de manera directa el enlace con el programa AutoCAD.

Se espera que el trabajo constituya una herramienta u


til, no solo para profesionales in-
mersos en el area de hidraulica e hidrologa, sino que tambien se convierta en una ayuda
para los estudiantes interesados en el tema.

1.2. Necesidad o motivaci


on de la investigaci
on

Este tema de investigacion, surge con la necesidad de contar con una herramienta de tra-
bajo con m
ultiples opciones, de tal forma que faciliten la elaboracion de diversos proyectos
como es el caso de obras hidraulicas e hidrologicas propios de la Ingeniera Civil; por otro
lado el interes de ampliar y profundizar mis conocimientos de programacion aplicada,
permitieron hacer una realidad y lograr el producto final como es PLEDER en su primera
version.

2
1.3. Objetivos de la tesis

1.3. Objetivos de la tesis

1.3.1. Generales

Contribuir con las investigaciones de la ingeniera hidraulica, desarrollando un pro-


grama que incluya el estudio hidrologico, hidraulico e hidraulica fluvial para de-
terminar los niveles de la superficie libre de agua en cauces naturales. La etapa
hidrologica se desarrolla teniendo en cuenta la programacion desde la generacion
de hietogramas hasta la obtencion de hidrogramas de maximas avenidas. La eta-
pa hidraulica tiene un acercamiento al modelo HEC 2 (en la actualidad HECRAS),
pero en version nacional de la Escuela de Ingeniera Civil de la Universidad Nacional
de San Cristobal de Huamanga. Finalmente la etapa de Hidraulica Fluvial, permite
determinar la socavacion general de tal manera que se pueda instalar una estructura
fluvial como gaviones o enrocado de manera eficiente y segura.

1.3.2. Especficos

El objetivo de la presentacion de la tesis Programa Lluvia Escorrenta Para Si-


mulacion de Defensas Ribere
nas con ObjectARX C++, es el de obtener el Ttulo
Profesional de Ingeniero Civil.

Realizar la programacion en a nivel hidrologico, considerando para ello la transfor-


macion lluvia escorrenta a traves de los siguientes modelos:

Generacion de Hietogramas: IILA - SENAMHI - UNI y Hietograma sintetico


del SCS.

Generacion de Hidrogramas unitarios sinteticos: SCS y Snyder.

Generacion de Hidrogama de maximas avenidas: Metodo de convolucion dis-


creta

3
1.4. Organizacion de la tesis

Realizar la programacion a nivel hidraulico considerando para ello la programacion


de un metodo adecuado para la simulacion de flujo permanente gradualmente va-
riado, teniendo en cuenta lo siguiente:

Programacion del metodo del paso estandar para simulacion de cauces aluviales
en flujo permanente gradualmente variado a traves de n secciones transversales
de un ro.

Incorporacion de coeficientes de rugosidad de manning por tramos en la seccion


transversal que permita acercarse mas a una situacion real de transito del flujo
a traves de un ro.

Perdidas por contraccion y expansion.

Realizar la programacion a nivel de hidraulica fluvial, que permita obtener la so-


cavacion general en cada una de las secciones transversales naturales de un rio,
considerando para ello los datos del material que lo conforman cada una de las
secciones.

Todos los tres aspectos anteriores seran enlazados de tal manera de contar con una
herramienta de programacion sumamente u
til que permita dise
nar en forma segura
y optima una defensa ribere
na.

1.4. Organizaci
on de la tesis

El Captulo 1, describe en forma general la tesis en introduccion, motivacion de la


investigacion, los objetivos de la tesis y la organizacion de la presente investigacion.

En el Captulo 2, se presenta conceptos hidrologicos y diagramas de flujos de la


programacion realizada. Este captulo resume los metodo empleados en el progra-
ma, as como la teora necesaria tales como hietogramas IILA, NRCS, hidrogramas

4
1.4. Organizacion de la tesis

unitarios sinteticos del NRCS, Snyder y el metodo de convolucion para realizar la


transformacion Lluvia - Escorrenta.

El Captulo 3, enfoca la teora basica y esencial de la hidraulica, desde conceptos


basicos necesarios para la interpretacion de los flujos en cauces naturales o ros, tales
como la ecuacion de movimiento y tipos de flujo. As mismo, contiene el analisis de
las secciones transversales en cauces naturales principalmente para calcular tirantes
normales en secciones complejas mediante el metodo de Newton Raphson. Estos
resultados son importantes para la ejecucion del perfil de la superficie libre de agua
(ver captulo 4) como condicion de borde, ya sea para flujos subcrticos (downstream)
o flujos supercrticos (upstream).

El Captulo 4, emprende la teora de los modelos numericos y los diagramas de


flujo del componente hidraulico, conteniendo la formulacion de los flujos 1D con
propiedades hidraulicas compuestas del ro. Es este captulo se discretizan las ecua-
ciones no lineales de la superficie libre de agua, indicando el metodo de solucion.

El Captulo 5, corresponde a la teora del componente hidraulica fluvial y su res-


pectivo diagrama de flujo. Se establecen las ecuaciones de las socavaciones generales
mediante el criterio propuesto por Lischtvan-Lebeviev, teniendo en cuenta los m
ulti-
ples parametros o datos necesarios para este fin.

El Captulo 6, es la aplicacion practica de la herramienta en los tres componentes


mencionados, especificando las distintas funciones para su correcto uso. Se detalla La
aplicacion practica desde el ingreso de los datos, ejecucion del programa y obtencion
de los resultados en los tres componentes.

El Captulo 7, abarca las conclusiones que se obtuvieron durante la realizacion


de la presente investigacion, as mismo las recomendaciones seg
un las experiencias
adquiridas.

5
1.4. Organizacion de la tesis

Bibliografa, Ofrece una amplia relacion de bibliografa empleada para la realiza-


cion de la investigacion, en los componentes Hidrologa, Hidraulica, Metodo Numeri-
cos, Programacion C++, Matematicas Avanzadas, Papers, Journals, Manuales de
Aplicacion y algunos Apuntes de Clase.

Ap
endice A, presenta el contenido del codigo fuente C++ en el componente
Hidrologico.

Ap
endice B, presenta el contenido del codigo fuente C++ en el componente
Hidraulico.

Ap
endice C, presenta el contenido del codigo fuente C++ en el componente
Hidraulica Fluvial.

Ap
endice D, contiene los resultados de la aplicacion practica del programa.

Ap
endice E, corresponde a los planos, cartograficos, red topologico, altitudinal,
perfiles longitudinales y los planos planta-perfil del ro Huallaga.

6
Captulo 2

TEORIA HIDROLOGICA
Y
DIAGRAMAS DE FLUJO

2.1. Introducci
on

En la mayora de los proyectos de sistema de recursos hdricos, tales como analisis o


simulacion de cuenca, prevencion de avenidas, dise
no de embalses, aliviaderos, entre otros
muchos, conllevan a sustentar un sistema hidrologico que comprende desde la entrada de
datos tales como precipitaciones y/o caudales de registro en el punto de interes, circulacion
o propagacion de flujos (cuenca, tramo del canal, embalse) y finalmente el caudal de salida,
que es el parametro importante para los dise
nos de prevencion o simulaciones descritas.
En hidrologa superficial el objetivo central es la de obtener estos caudales de las corrientes
superficiales, para este fin se emplea varios metodos garantizandonos y/o acercandonos lo
mas real posible.

En este captulo 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
no

o comportamiento que realiza PLEDER en esta transformacion, obteniendo los resultados


en tablas dinamicas que facilitan su exportacion a extensiones tipo excel y resultados
graficos del hidrograma.

2.2. Desarrollo de Hietogramas de dise


no

La palabra Hietograma proviene del termino griego Hietos, que significa lluvia. Es un
resumen grafico escalonado de un conjunto de datos, donde nos permite ver pautas que
son difciles de observar en una simple tabla numerica (expresa precipitacion en funcion
del tiempo). En ordenadas puede figurar la precipitacion cada (mm), o bien la intensidad
de precipitacion (mm/hora). Generalmente se representa como un histograma (grafico
barras), aunque a veces tambien se expresa como un grafico de lneas.

Figura 2.1: Hietograma: Intensidad-Tiempo

8
2.2. Desarrollo de Hietogramas de dise
no

2.2.1. IILA-SENAMHI-UNI

Las precipitaciones maximas e intensidades maximas de tormentas han sido estudiadas


regionalmente por el Instituto Italiano Latino Americano IILA (Convenio Internacional
IILA-SENAMHI-UNI) Estudio de la Hidrologa del Per
u 1983, cuyas formulas son:

para 3 t 24 horas:
Pt,T = a (1 + KLogT ) tn (2.2.1)

it,T = a (1 + KLogT ) tn1 (2.2.2)

para t 3 horas:
Pt,T = a (1 + KLogT ) (t + b)n1 t (2.2.3)

it,T = a (1 + KLogT ) (t + b)n1 (2.2.4)

Donde Pt,T , it,T son la precipitacion y la intensidad de tormenta para una duracion t (en
horas) y de periodo de retorno T (en a
nos) dados; a,K y n son constantes regionales. El
parametro b se clasifica seg
un las regiones naturales del Per
u

Cuadro 2.1: Parametro regional b


Region Parametro 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 pluviografos en las
estaciones de Abancay y Chuquibamba.

2.2.2. Hietogramas sint


eticos del NRCS

El Natural Resources Conservation Service del US (NRCS) o conocido antes como (SCS)
Soil Conservation Service, desarrollo hidrogramas sinteticos de tormentas para utilizarse

9
2.2. Desarrollo de Hietogramas de dise
no

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


dedujeron al utilizar la informacion presentada por Hershfield (1961) y Miller Frederick y
Tracey (1973) y datos de tormentas adicionales (Fuente [11]).
La distribucion de precipitaciones SCS tiene una larga historia y este ha demostrado tener
exito a traves de los a
nos. Se ha desarrollado cuatro tipos de hietogramas Tipo I, Tipo
IA, Tipo II y finalmente el Tipo III, cuyas distribuciones son para 6 y 24 horas, tambien
se incluye un hietograma de 48 horas para el Tipo II.

Los tipos I y IA corresponde al clima martimo del pacfico con inviernos h


umedos y
veranos secos, el tipo III representa zonas a lo largo del Golfo de Mexico y de las zonas
costeras del Atlantico, donde las tormentas tropicales a las 24 horas del da son grandes
cantidades de precipitacion, y el tipo II representa el resto del pas (NRCS,1986).

10
2.2. Desarrollo de Hietogramas de dise
no

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: Distribucion de tormenta de 24 horas NRCS

En la figura, cada tipo de tormenta se distribuye en 24 horas que permite compararlos, en


particular, en las pendientes de las curva durante intervalos de tiempo determinados nos
indica la intensidad de la precipitacion media de ese intervalo de tiempo. Por ejemplo, la
tormenta del tipo tipo IA es la menos intensa, mientras que el tipo II es la mas intensa.

11
2.3. Tasas de Infiltracion - Metodo 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: Distribucion de tormenta de los cuatro tipos NRCS

2.3. Tasas de Infiltraci


on - M
etodo del NRCS

El objetivo de esta seccion es conseguir la precipitacion neta1 o precipitacion efectiva la


que produce escorrenta directa, por lo tanto, previamente debemos separar, que parte de
la precipitacion total va a generar escorrenta directa. As mismo identificar el resto de la
precipitacion que se ha infiltrado o una peque
na parte pudo haberse quedado retenida en
depresiones superficiales.

Para obtener estas precipitaciones, empleamos el metodo del NRCS, cuyo procedimiento
1
Precipitaci
on Neta: generalmente se utiliza para la precipitacion que produce escorrenta directa,
aunque en otros estudios se refiere a la diferencia precipitacion - evaporacion

12
2.3. Tasas de Infiltracion - Metodo del NRCS

se establecio empricamente USA (1964). Este metodo fue producto de investigacion de


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

La ecuacion de la escorrenta 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 precipitacion o escorrenta directa.


P = Profundidad de precipitacion.
Ia = Abstraccion inicial.
S = Potencial de retencion maxima.

Estas relaciones son basados en la conservacion de masa (Mockus) La escorrenta directa Pe


es siempre menor o igual a la profundidad de precipitacion P , de manera similar, despues
de que la escorrenta se inicia, la profundidad adicional del agua retenida en la cuenca
Fa es menor o igual a alguna retencion potencial maxima S. Existe una cierta cantidad
de precipitacion Ia (Abstraccion inicial antes del estrechamiento) en donde no ocurrira
escorrenta, luego la escorrenta potencial es P Ia . La hipotesis del metodo de NRCS,
consiste en que las relaciones de las dos cantidades reales y las dos cantidades potenciales
sean iguales. Mockus determino estas relaciones primero, considerando la condicion en
que la abstraccion inicial Ia = 0 y obtuvo.
2
Chapter 10. Estimation of Direct Runoff from Storm Rainfall

13
2.3. Tasas de Infiltracion - Metodo del NRCS

Fa Pe
= (2.3.3)
S P

Donde:

Fa = Retencion actual despues de la escorrenta dada.

Para satisfacer la conservacion de masa se tiene.

F a = P Pe (2.3.4)

Sustituyendo la ecuacion 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 relacion precipitacion-escorrenta bajo la condicion de que la abstraccion inicial


es cero (Ia = 0).

Cuando la abstraccion inicial no es cero, la cantidad de la precipitacion disponible para


la escorrenta es (P Ia ) en lugar de P . Sustituyendo (P Ia ) para P en la ecuacion
2.3.3 resulta.

Fa Pe
= (2.3.7)
S P Ia

Donde:

14
2.3. Tasas de Infiltracion - Metodo del NRCS

Fa S y Pe (P Ia )

Para este caso la conservacion de masa es dado por:

F = (P Ia ) Pe (2.3.8)

Sustituyendo la ecuacion 2.3.8 en 2.3.7.

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

Resolviendo para la profundidad en exceso de precipitacion o escorrenta directa Pe .

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

Es la ecuacion basica para estimar la profundidad en exceso de precipitacion o escorren-


ta directa de una tormenta utilizando el metodo NRCS. La abstraccion inicial consiste
principalmente en intercepcion, infiltracion durante los comienzos de la tormenta, y las
1
depresiones o almacenamientos en la superficie. Establecen una relacion emprica para
estimar esta abstraccion inicial Ia , que esta en funcion al potencial maximo de retencion
S.

Ia = 0,2S (2.3.11)

Reemplazando en la ecuacion 2.3.10.

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

15
2.3. Tasas de Infiltracion - Metodo del NRCS

AL presentar en graficas la informacion de P y Pe para muchas cuencas, el NRCS encontro


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

(P 0,2S)2
Figura 2.4: Solucion grafica de la ecuacion Pe = P +0,8S
, (Fuente: Chapter 10 Estimation
of Direct Runoff from Storm Rainfall )

El N
umero de Curva CN en relacion a S en pulgadas (in).

1000
S= 10 (2.3.13)
CN

El N
umero de Curva CN en relacion a S en milmetros (mm).

16
2.3. Tasas de Infiltracion - Metodo del NRCS

25400
CN = (2.3.14)
254 + S

Los n
umeros de curva que se muestran en la figura 2.4 se aplican para condiciones an-
tecedentes de Humedad (AMC, por sus siglas en ingles) normales (AMC II). Para condi-
ciones secas (AMC I) o condiciones h
umedas (AMC III), los n
umeros de curva equivalente
pueden 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: Clasificacion de clases antecedentes de humedad (AMC) para el metodo de


abstracciones de lluvia del NRCS
Lluvia antecedente total de 5 das (pulg)
Grupo AMC Estacion Estacion
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
umeros 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 Hidrologa Aplicada Vent Te Chow, Pag. 154.

17
2.4. Hidrogramas Unitarios Sinteticos: NRCS y Snyder

Cuadro 2.3: Grupo de suelo hidrologico, para el calculo del CN


GRUPOS DESCRIPCION
Grupo A : Bajo potencial de escurrimiento. Suelos que tienen al-
tas velocidades de infiltracion cuando estan mojados y
consisten principalmente de arena y gravas profundas,
con bueno a exceso drenaje. Estos suelos tienen altas
velocidades de transmision del agua.
Grupo B : Suelos con moderada velocidad de infiltracion cuando
estan mojados y consisten principalmente de suelos con
cantidades moderadas de texturas finas y gruesas, con
drenaje medio y algo profundo. Son basicamente suelos
arenosos.
Grupo C : Suelos que tienen bajas velocidades de infiltracion cuan-
do estan mojados, consisten principalmente de suelos
que tienen un estrato que impide el flujo del agua.
Son suelos con texturas finas (margas arcillosas, mar-
gas arenosas poco profundas). Estos suelos tienen bajas
velocidades de transmision.
Grupo D : Alto potencial de escurrimiento. Suelos que tienen muy
bajas velocidades de infiltracion cuando estan mojados
y consisten principalmente de suelos arcillosos con alto
potencial de hinchamiento, suelos con nivel freatico y
permanente, suelos con estratos arcillosos cerca de sus
superficie, o bien, suelos someros sobre horizontes im-
permeables.

2.4. Hidrogramas Unitarios Sint


eticos: NRCS y Sny-

der

2.4.1. Hidrograma Unitario

El Hidrograma Unitario es ampliamente utilizado como algoritmo de solucion para la


1
transformacion lluvia escorrenta 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
afica unitaria. Fue Propuesto por primera vez por Sherman en 1932.

18
2.4. Hidrogramas Unitarios Sinteticos: NRCS y Snyder

unitaria, distribuida uniformemente durante un perodo de tiempo especificado, en un


punto de un curso de agua.

Este metodo se basa en dos hipotesis:

1. La respuesta de la cuenca ante el proceso de escorrenta directa presenta un com-


portamiento lineal, empleandose los principios de proporcionalidad y superposicion.

2. No se tiene en cuenta la variabilidad temporal de las caractersticas de la cuenca,


de manera que una misma lluvia efectiva produce siempre el mismo hidrograma de
escorrenta directa.

Estas hipotesis presenta las siguientes condiciones:

La lluvia en exceso o lluvia efectiva es de intensidad constante dentro de una duracion


efectiva, exigiendo que las tormentas sean de corta duracion (tiempo base corto y
un caudal pico u
nico).

La lluvia en exceso esta distribuida de manera uniforme sobre toda el area de drena-
je. El area de drenaje no debe ser muy grande o bien debera ser subdividida en
2
subcuencas de modo que se cumpla esta suposicion

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

El hidrograma unitario de una duracion determinada es u


nico para una cuenca e
invariante en el tiempo. las caractersticas del cauce no deben tener cambios y la
cuenca no debe tener almacenamientos apreciables (no debe tener embalses).
2
El orden de magnitud del lmite superior que se maneja es de 300 a 400 km2 (Martnez Martn 1994)

19
2.4. Hidrogramas Unitarios Sinteticos: NRCS y Snyder

Principios B
asicos

La derivacion y aplicacion del Hidrograma Unitario esta basada en una teora emprica
que esta conformada por dos teoremas o principios basicos que se aplican en todos los
casos:

Principio de Proporcionalidad: Para una lluvia efectiva de una duracion dada, el


volumen de lluvia, que es igual al volumen de escorrenta directa, es proporcional a la
intensidad de dicha lluvia. Como los hidrogramas de escorrenta directa correspondiente
a lluvias efectivas de la misma duracion, tienen el mismo tiempo base, se concluye que las
ordenadas de dichos hidrogramas seran proporcionales a la intensidad de la lluvia efectiva
(figura 2.5).

Figura 2.5: Hidrograma Unitario: Principio de Proporcionalidad

20
2.4. Hidrogramas Unitarios Sinteticos: 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


escorrenta directa.

Principio de Superposici
on: Los caudales de un hidrograma total de escorrenta direc-
ta producidos por lluvias efectivas sucesivas pueden ser hallados sumando los caudales de
los hidrogramas de escorrenta directa correspondientes a las lluvias efectivas individuales,
teniendo en cuenta los tiempos en que ocurren tales lluvias.

2.4.2. Hidrograma Unitario Sint


etico

Para emplear el metodo del hidrograma unitario es necesario conocer los registros de pre-
cipitacion y tener al menos un hidrograma medido a la salida de la cuenca. Sin embargo
en la mayora de las cuencas, especialmente en nuestro pas, no se cuenta con estaciones
hidrometricas o registros pluviograficos que sirven para generar dicho dato importante en
la utilizacion del metodo hidrograma unitario. Para estos casos, podemos utilizar algu-
nas formulas empricas que, basandose en las caractersticas fsicas de la cuenca (super-
ficie, pendiente media, longitud del cauce, etc.) proporcionan una idea del hidrograma
resultante. Los hidrogramas unitarios obtenidos de esta forma se denominan hidrogramas
unitarios sinteticos.

Hidrograma Unitario Sint


etico NRCS

Tambien conocido como el hidrograma adimensional del NRCS, es un hidrograma en el


cual se expresa por la relacion del caudal q con respecto al caudal pico qp y el tiempo por
la relacion del tiempo t con respecto al tiempo de ocurrencia del pico en el hidrograma
unitario, Tp . Para este metodo es necesario conocer el caudal pico y el tiempo de retardo

21
2.4. Hidrogramas Unitarios Sinteticos: NRCS y Snyder

para la duracion de exceso de precipitacion, as se construye el hidrograma unitario a


partir del hidrograma sintetico adimensional para la cuenca dada.

0.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 Sintetico del NRCS

La figura 2.6 muestra uno de estos hidrogramas adimensionales, con una forma similar a la
que puede esperarse en una cuenca real. Basandose en una gran cantidad de hidrogramas
unitarios, el NRCS sugiere que el tiempo de recesion puede aproximarse a 1,67Tp . Como
el area del hidrograma es igual a 1cm, se demuestra que:

2,08A
qp = (2.4.2)
Tp

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


pico [h]. Un estudio de muchas cuencas rurales grandes y peque
nas indica que el tiempo
de retardo o tambien llamado tlag es igual al 60 % del tiempo de concentracion.

tp = tlag = 0,60Tc (2.4.3)

Bajo esta condicion se obtiene el tiempo de ocurrencia del pico Tp que se expresa en
terminos del tiempo de retardo tp y de la duracion de la lluvia efectiva tr .

22
2.4. Hidrogramas Unitarios Sinteticos: NRCS y Snyder

tr
Tp = + tp (2.4.4)
2

Hidrograma Unitario Sint


etico de Snyder

Snyder (1938), realizo estudios en cuencas de los Montes Apalaches (USA), con areas
de 30 a 30000 km2 y encontro relaciones sinteticas de un hidrograma unitarios sintetico
estandar, como se muestra en la figura 2.7a, a partir de las cuales pueden calcularse las
caractersticas de un hidrograma unitarios requerido 2.7b.

Figura 2.7: a) Hidrograma Unitario estandar (tp = 5,5tr ); b) Hidrograma Unitario re-
querido (tp 6= 5,5tr ). Fuente [11]

Para una duracion de lluvia efectiva determinada, los parametros del hidrograma unitario
requerido son:

Retardo de la cuenca, tpR : diferencia de tiempo entre el centroide del hietograma


efectivo y el pico del hidrograma unitario.

Caudal punta o pico por unidad de area de la cuenca, qpR .

Tiempo base, tb .

23
2.4. Hidrogramas Unitarios Sinteticos: NRCS y Snyder

Ancho W50 [T] del tiempo unitario al 50 % del caudal pico.

Ancho W75 [T] del tiempo unitario al 75 % del caudal pico.

Snyder definio el hidrograma unitario estandar como aquel que cumple que:

tp
tr = (2.4.5)
5,5

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


unitario estandard. Ademas encontro que para un hidrograma unitario estandar el tiempo
de retardo en horas es:

tp = 0,75Ct (LLc )0,3 (2.4.6)

Donde L es la longitud del cauce principal hasta la divisoria de aguas arriba [km], Lc es
la distancia desde la salida de la cuenca hasta el punto del cauce principal mas cercano al
centroide del area de la cuenca [km] y Ct es un coeficiente que vara entre 1.35 (pendientes
altas) y 1.65 (pendientes bajas). Tambien para el hidrograma unitario estandar se encontro
que el caudal pico por unidad de area [m3 /s km2 ] es:

2,75Cp
qp = (2.4.7)
tp

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


tR = tr




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



qpR = qp

24
2.4. Hidrogramas Unitarios Sinteticos: 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


un la figura
2.8, cuyo hidrograma se divide en 6 intervalos (siete vertices).

Figura 2.8: PLEDER: Coordenadas del Hidrograma Unitario Sintetico Snyder

25
2.4. Hidrogramas Unitarios Sinteticos: NRCS y Snyder

C
alculo de las ecuaciones lineales para cada tramo del hidrograma unitario
sint
etico Snyder

ua para cada tramo mediante la ecuacion de la recta Y Y1 = m(X X1 )


PLEDER, eval
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. Metodo de Convolucion discreta para transformacion precipitacion-escorrenta

 
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 sintetico.

2.5. M
etodo de Convoluci
on discreta para transfor-

maci
on precipitaci
on-escorrenta

Antes de demostrar la ecuacion de la convolucion, es necesario conocer la circulacion


hidrologica del flujo o tambien conocida como Circulacion de flujos a traves de sistemas

globales. Este se refiere a que el agua almacenada en sistema hidrologico S, puede rela-
cionarse a los caudales de entrada I y de salida Q, mediante la ecuacion de continuidad.

dS
=I Q (2.5.1)
dt

El almacenamiento S, en cualquier instante, puede expresarse por una funcion de al-


macenamiento (CHOW and VENT T [11]) , donde S vara 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. Metodo de Convolucion discreta para transformacion precipitacion-escorrenta

Figura 2.9: Sistema hidrologico: continuidad de agua almacenada.

2.5.1. Sistema Lineal en el tiempo continuo

La funcion de almacenamiento, ecuacion 2.5.2, puede expresarse por la ecuacion diferencial


lineal con coeficientes constantes

dI d2 I dn1 I dQ d2 Q dm1 Q
S = a1 I + a2 + a3 2 + ... + an n1 + b1 Q + b2 + b3 2 + ... + bm m1 (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 ecuacion 2.5.3 y reemplazando en la ecuacion de continuidad 2.5.1.

dn I dn1 I d2 I dI
an n
+ ... + a n1 n1
+ ... + a 2 2
+ a1 I+
dt dt dt dt (2.5.4)
dm Q dm1 Q d2 Q dQ
bm m + ... + bm1 m1 + ... + b2 2 + b1 +Q=0
dt dt dt dt

simplificando terminos en las operaciones diferenciales se tiene.

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

28
2.5. Metodo de Convolucion discreta para transformacion precipitacion-escorrenta

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

por lo tanto la ecuacion 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 relacion N (D)/M (D) es llamado funcion de transferencia del sistema, que describe la
respuesta de la salida a una secuencia de entrada dada (CHOW and VENT T [11]), as
1
mismo la ecuacion 2.5.4, representa el modelo general del sistema hidrologico.

2.5.2. Sistema Lineal en tiempo discreto

En Las aplicaciones practicas, las salidas de los resultados se requieren en intervalos tiempo
discretos 2 , ya que la entrada al sistema se especifica como una funcion de tiempo discreto,
por ejemplo, un hietograma de lluvia efectiva que se dan en intervalos de tiempos t; Es
decir, los datos de la lluvia se dan como un conjunto de datos pulso (sistema de informacion

por pulso). Este sistema se utiliza para la precipitacion y el valor de su funcion de entrada
discreta para el m-esimo intervalo de tiempo es:

Z mt
Pm = I( )dt , m = 1, 2, 3, ... (2.5.7)
(m1)t

1
Presentada por Chow y Kulandaiswamy
2
Debido a que la mayor parte de la informacion hidrologica solamente esta disponible en intervalos de
tiempo discretos.

29
2.5. Metodo de Convolucion discreta para transformacion precipitacion-escorrenta

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


valor de la salida del sistema en el n-esimo intervalo de tiempo (t = nt) es:

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

Qn es el valor instantaneo de la tasa de flujo al final de n-esimo intervalo de tiempo


[L3 T 1 ]. El efecto de un pulso de entrada de duracion t que empieza en el tiempo
(m 1)t sobre la salida en el tiempo t = nt, se mide utilizando el valor de la funcion
de respuesta de pulso unitario h[t (m 1)t] = h[nt (m 1)t] = h[(n m + 1)t].

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

Para el pulso m

Pm
I( ) = , (m 1)t mt
t
I( ) = 0 , > M t

De la integral de convolucion y separando la integral

Z nt
Qn = I( )u(nt )d
0
P1 t P2 2t
Z Z
= u(nt )d + u(nt )d + ... (2.5.10)
t 0 t t
Pm mt PM M t
Z Z
= u(n )d + ... + u(nt )d
t (m1) t (M 1)t

Realizando la sustitucion de l = nt luego d = dl. La m-esima integral en la


ecuacion 2.5.10 se escribe como

30
2.5. Metodo de Convolucion discreta para transformacion precipitacion-escorrenta

Z mt Z (nm)t
Pm Pm
u(nt )d = u(l)dl
t (m1)t t (nm+1)t
Z (nm+1)t
Pm (2.5.11)
= u(l)dl
t (nm)

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

Reemplazando de la ecuacion 2.5.8 y 2.5.10 se obtiene

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

Esta representa la ecuacion de convolucion con entrada Pm en pulsos y salida Qn como


una funcion temporal de informacion por muestra.

2.5.3. Funci
on respuesta de pulso discreto y Ecuaci
on de Con-

voluci
on Discreta

La funcion de datos instantaneos de la salida o respuesta a un pulso de volumen unitario


viene expresado por:

Unm+1 = h[(n m + 1)t] (2.5.13)

Se entiende que Un = h[nt], Un1 = h[(n 1)t]... y UnM +1 = h[(n M + 1)t]. Reem-
plazando en la ecuacion 2.5.12 la version en tiempo discreto de la integral de convolucion
es:

31
2.5. Metodo de Convolucion discreta para transformacion precipitacion-escorrenta

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

Donde M es el n
umero de pulsos de intensidad constante, de la funcion de entrada, es
decir, el n
umero de datos de pulso del hietograma. El resultado final es la ecuacion de
convolucion discreta para un sistema lineal.

nM
X
Qn = Pm Unm+1 (2.5.15)
m=1

Donde Qn es el caudal de escorrenta directa en el instante n ;Pm la precipitacion efectiva


del bloque m y Un+m+1 los caudales por unidad de precipitacion efectiva del hidrograma
unitario. El lmite superior n M indica que los terminos han de sumarse para m =
1, 2, 3, ...n, siempre que n > M y estando limitada la suma a m = 1, 2, 3, ...M , cuando
n > M.

La misma expresion 2.5.15 se puede expresar de la forma siguiente:

min(n,M )
X
Qn = Pm Unm+1 (2.5.16)
m=max(1,nnU +1)

Esta ecuacion facilita la solucion numerica, as mismo cabe se


nalar que dicha ecuacion
es generalizada para resolver problemas que involucren el metodo de convolucion, por
ejemplo, Matlab contiene el algoritmo (conv.m) para la convolucion discreta, el cual usa
la ecuacion 2.5.16. El programa PLEDER, emplea el mismo algoritmo, mediante la clase
convolucion, con el objetivo de resolver la transformacion lluvia escorrenta mediante esta
ecuacion.

32
2.6. Diagramas de Flujo

2.6. Diagramas de Flujo

A continuacion se presenta la esquematizacion grafica que corresponde a la programacion


hidrologica.

Diagrama de flujo General: Muestra la organizacion del programa en forma


general. El objetivo de este diagrama es obtener los caudales totales (transformacion
lluvia escorrenta), a partir de los datos de precipitaciones y datos de la cuenca.

Diagrama de flujo Hietograma IILA SENAMHI: El objetivo es calcular las


precipitaciones alternas (mm) a partir de los datos regionales, empleando el metodo
del bloque alterno.

Diagrama de flujo Hietograma NRCS: Recibe como datos, la precipitacion


maxima de 24 horas (obtenidas ya sea mediante analisis de frecuencias) y el tipo de
tormenta (Tipo I, IA, II, III); realizando una multiplicacion directa con las ordenadas
de la tormenta, se obtienen las precipitaciones incrementales (mm).

Diagrama de flujo Hidrograma Unitario Sint


etico NRCS: El objetivo es cal-
cular las ordenas del hidrograma unitario, tomando los datos del tiempo de retraso
(tlag) y las variaciones de los tiempos (hietograma - hidrograma); realizando inter-
polaciones lineales para cada intervalo o variacion de tiempo del hidrograma, donde
se obtienen las ordenadas del hidrograma Unitario Sintetico.

Diagrama de flujo Hidrograma Unitario Sint


etico Snyder: Es el mismo ob-
jetivo que el anterior, recibiendo los datos de los coeficientes tp , Cp , variacion del
tiempo y el area de la cuenca para calcular las siete coordenadas (A, B, C, D, E, F y
G de la figura 2.8) del hidrograma unitario, as obtener las ordenadas del hidrograma
unitarios sintetico mediante interpolaciones lineales para cada intervalo o variacion
del tiempo a lo largo del tiempo base (tb ).

33
2.6. Diagramas de Flujo

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


cipitacion total de las infiltraciones o retenciones dadas, seg
un el metodo NRCS, que
depende directamente como dato de valor Curva Numero, este factor es dependiente
del las caractersticas de la cuenca, tal como se explica en este captulo. Bajo este
dato se obtienen las precipitaciones directas o en exceso que tambien se les llama
pulsos de ingreso.

Diagrama de flujo Convoluci


on discreta: Transforma la lluvia en escorrenta
directa, a partir de las ordenadas del hidrograma unitarios (U) y los pulsos de ingreso
(P).

34

HietogramaIILA HietogramaNRCS
SENAMHI
INICIOPLEDERHIDROLOGIA

Parmetrosregionalesa,b,k, Precipitacionesmximasde24
n, t,t,perododeretornotr. horas(P24),Tipodetormenta.

V
T3horas F TipodeTormenta
TipoI TipoIA TipoIITipo III

Ecuacin2.2.3.Clculode Ecuacin2.2.1.Clculode
precipitacionesacumuladas, precipitacionesacumuladas,
incrementalesyalternas. incrementalesyalternas. Precipitacionesacumuladas,incrementales

Exportara.csv
Exportara.csv

ClculodePulsoso ClculoLluvia
Clculodehidrogramas
escorrentadirecta. Escorrenta. UnitariosSintticos

ModelosMeteorolgicos.
HidrogramaUnitarioSinttico
TormentaNRCSIILASENAMHI
H.U.S.NRCSH.U.S.SNYDER

Precipitacionesmximasde24 Parmetrosregionalesa,b,k,
Tiempode Tiempoderetardo
horas(P24),Tipodetormenta. n, t,t,perododeretorno tr.
retardo(Tlag) CoeficienteCp

Abstraccionesmediante ConvolucinDiscreta
elmtodoNRCS OrdenadasdelHidrogramaUnitario(U)
,

P U
Pulsos(P) ,
escorrentadirecta

Caudales(m/s)

35
2.6. Diagramas de Flujo

FINPLEDERHIDROLOGIA
2.6. Diagramas de Flujo

INICIOHIETOGRAMAIILASENAMHI

N,a,b,k,n,dt,Var,Tr,D

i=1,hastaN,
i=i+1


V F
3

1 1

i =1,hastaN,
i=i+1

V F
/2

1 2 2

Precipitaciones
Alternas(mm)

FINHIETOGRAMAIILASENAMHI

36
2.6. Diagramas de Flujo

INICIOHIETOGRAMANRCS

P24,Ndt,Tormenta

24

/60


24

Datos hidrolgicos,
Tormenta NRCS

i=0,hastaN+1,
i=i+1


1 24 1

1 1

Precipitaciones
Incrementales(mm)

FINHIETOGRAMANRCS

37
2.6. Diagramas de Flujo

INICIOHIDROGRAMAUNITARIO
SINTTICONRCS

Tlag,DT,dt


2

12.48

DatosHidrogramaUnitario
adimensionalNRCS

i=1,hastanU,
i=i+1

nU, q, t, DT x i

Ordenadasdel
HidrogramaUnitario

FINHIDROGRAMAUNITARIO
SINTTICONRCS

38
2.6. Diagramas de Flujo

INICIOHIDROGRAMAUNITARIO
SINTTICOSNYDER

, , , ,


4
2.75


2.14 .

1.22 .

i=1,hastanU,
i=i+1

/60
, , , , ,

Ordenadasdel

HidrogramaUnitario

FINHIDROGRAMAUNITARIO

SINTTICONRCS

39

2.6. Diagramas de Flujo


INICIOABSTRACCIONESNRCS

Palterna,CN,nP

25400 254

0.2

i=1,hastanP,
i=i+1



1 alterna

V F
Pacum i

V F
i


0.0


)
1

Precipitacinen

Exceso(mm)

FINABSTRACCIONESNRCS

40

2.6. Diagramas de Flujo

INICIOCONVOLUCINDISCRETA

OrdenadasHidrograma
Unitario[U],Pulsos[P],nP,nU

M=nP

nQ=M+nU1
A=mx(1,nnU+1)
B=mn(n,M)

n=1,hastanQ,
n=n+1


0.0

m=A,hastaB,
m=m+1


P m xU n m 1

Caudales(m/s)

FINCONVOLUCINDISCRETA

41
Captulo 3

TEORIA HIDRAULICA
Y
SECCIONES TRANSVERSALES
EN RIOS

3.1. Introducci
on

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


con secciones conocidas, es necesario contar con la teora basica de la hidraulica y las
leyes fsicas que gobiernan su comportamiento. De las ecuaciones basicas y los principios
fsicos de movimiento de fluidos, se aplican a la solucion del flujo gradualmente variado,
obteniendo como resultados los niveles o tirantes a lo largo del cauce. Tambien es nece-
sario contar con metodologas para calcular el area y el permetro mojado en una seccion
transversal. El proposito de esta seccion es revisar las definiciones basicas, principios y
leyes con la intencion de aplicarlos en los captulos posteriores al estudio de transito de
flujos en ros.

42
3.2. Bases teoricos para el calculo de flujo unidimensional

3.2. Bases te
oricos para el c
alculo de flujo unidimen-

sional

Se entiende por flujo unidimensional cuando se ignora las variaciones de los cambios en la
velocidad y la presion en el sentido perpendicular a la direccion principal del flujo. Para
su solucion numerica se tiene como base fundamental los tres principios derivados de la
fsica:

Conservacion de la Masa.

Conservacion de la Energa.

Impulso-Cantidad de Movimiento: Conservacion del Momentum

3.2.1. Ecuaci
on de Movimiento General.

Es importante mencionar las ecuaciones que provocan el movimiento de una masa ele-
mental, para caso nuestro la masa elemental es el fluido. De la segunda ley de Newton se
sabe que la fuerza es igual a la masa por la aceleracion (resultado vectorial):

F = ma (3.2.1)

Multiplicando ambos miembros por la componente longitud s paralela a la direccion


de la fuerza y la aceleracion, e integrando estas expresiones se tiene como resultado la
Ecuacion de Energa (expresion escalar):

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

43
3.2. Bases teoricos para el calculo de flujo unidimensional

De la misma forma multiplicando ambos miembros por el factor tiempo a la ecuacion


(3.2.1), e integrando se tiene la Ecuacion de Momentum.

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

Esta u
ltima expresion muestra que el impulso (fuerza por tiempo) aplicado a un cuerpo
es igual al momentum (masa por velocidad).

Estos enfoques son importantes en las aplicaciones para el movimiento de los flujos
(Ecuacion de la Energa, Ecuacion de Momentum).

3.2.2. Ecuaci
on de Movimiento del flujo.

Considerando un fluido elemental a lo largo de una lnea de corriente, donde la longitud de


este cuerpo es S, normal a la lnea 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 teoricos para el calculo de flujo unidimensional

Si p es igual a la intensidad de la presion en la seccion 1, entonces la presion en la seccion


2 es p + ( p
s
)s. As mismo la Fuerza actuante en cara aguas arriba es:

pn (3.2.4)

y la fuerza que act


ua en la cara aguas abajo es:

p
(p + s)n (3.2.5)
s

El peso del fluido es:


gsn (3.2.6)

La componente de este peso en la direccion 0 s0 es

gsnsin() (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
ua en
el elemento en la direccion aguas abajo es:

p Z
Fr = pn (p + s)n gsn (3.2.8)
s s

Simplificando la ecuacion se tiene:

p Z
Fr = sn gsn (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 teoricos para el calculo de flujo unidimensional

por una aceleracion as

P Z
snas = s gsn (3.2.10)
s s

Simplificando
p Z
as = g = (p + Z) (3.2.11)
s s s

la aceleracion as es fundamental en el flujo ya que aparece al aplicar la segunda ley de


Newton a un sistema fluido infinitesimal. Por lo tanto se necesita calcular la derivada del
vector velocidad con respecto al tiempo.

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

Vs
El termino t
se denomina aceleracion local y se anula cuando el flujo es Permanente
o Estacionario, es decir, independiente del tiempo. El termino siguiente forma la acel-
eracion convectiva, que aparece cuando la partcula se mueve a traves de regiones donde
la velocidad vara.

Sustituyendo las ecuacion 3.2.12 en la ecuacion 3.2.11 se tiene:

Vs Vs
( + Vs ) + (p + Z) = 0 (3.2.13)
t s s

La ecuacion 3.2.13, es la conocida ecuacion propuesta en el siglo XVIII, por el matematico


suizo Leonardo Euler y reconocida universalmente como la ecuacion de Euler. En la tesis
esta ecuacion se simplifica la aceleracion local, debido a que el analisis es para flujos
Permanentes.

46
3.2. Bases teoricos para el calculo 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 ecuacion 3.2.13 se reduce una funcion 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 expresion 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 ecuacion de Bernoulli. Esta ecuacion puede apli-
carse a lo largo de una lnea de corriente, en un fluido ideal sin rozamiento, pero la
1
aplicacion de la misma en otra direccion 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 caractersticas de circulacion, velocidad, distribucion de presiones, profundidad de
circulacion, etc son iguales. En los cauces naturales, que corresponde a la aplicacion de
esta tesis, en algunos casos puede considerarse la existencia del regimen uniforme en
1
Flujo Irrotacional: Se da cuando la vorticidad resulta cero, la velocidad debe de ser igual a la
gradiente de un escalar, , conocido como potencial de velocidad: x() = 0

47
3.3. Secciones Transversales en Cauces Naturales y Calculo Numerico.

ciertos tramos donde se ha alcanzado un equilibrio en la seccion transversal y esta es


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

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

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

Esta ecuacion representa a la distribucion de la Presion Hidrostatica, donde el termino


P

+ Z, es la altura piezometrica (piezometric head).

En resumen, el flujo Uniforme ocurre cuando:

EL Tirante, el area hidraulica y la velocidad en cada secciones transversal, son


constantes.

La lnea de gradiente de energa, 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
lnea de energa, 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
alculo Num
erico.

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


singular importancia ya que dicha seccion es la que define muchas de las caractersticas
de la conduccion. Estas secciones representan la geometra del cauce que estan formados

48
3.3. Secciones Transversales en Cauces Naturales y Calculo Numerico.

por una serie de puntos o coordenadas (X ,Y), cuyos valores de X forman la longitud de la
seccion transversal y los valor de Y las alturas con respecto a un DATUM. En principio,
las formas de estas secciones pueden variar a lo largo del canal (canal no prismatico).

Figura 3.2: Seccion Transversal en Cauces Naturales

El programa PLEDER, divide las secciones transversales en tres partes (i, j, k), donde i
representa las caractersticas geometricas de la seccion margen izquierda, j los trapecios
conformados por los puntos sucesivos con el lmite de la superficie libre de agua o cota
tirante, finalmente k representa la geometra de las seccion en la margen derecha.

Figura 3.3: Elementos geometricos de las Secciones Transversales en: i, j, k

49
3.3. Secciones Transversales en Cauces Naturales y Calculo Numerico.

En una seccion transversal natural de los cauces, es importantes representar de esta mane-
ra, ya que simplifica las operaciones matematicas para obtener los resultados geometricos
de cada seccion transversal que mas adelante se presenta. En la figura anterior se mues-
tra que, en los extremos se forman triangulos (i, k), esto ocurre cuando existe un angulo
entre la lnea del terreno (plantilla del canal) y la superficie libre. En la parte central se
forman trapecios, cuya area hidraulica y permetro hidraulico se obtienen despues de una
sumatoria en cada una de ellas.

Las formulas para cada elemento geometricos de la figura son.

Analizando en el Triangulo Izquierdo (A,P):

  
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

Analisis 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)

Analisis del Triangulo Derecho(A,P):

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

50
3.4. Calculo del Tirante Normal

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

3.4. C
alculo del Tirante Normal

Para el analisis y dise


no de canales abiertos es necesario conocer el Tirante Normal, que
forma parte de las caractersticas hidraulicas de un canal. En la mayora de los textos
exponen los calculos numericos solo para canales con secciones transversales conocidos
tales como rectangulares, triangulares, trapezoidales, parabolicos y otros que derivan a
ecuaciones lineales en la solucion del tirante normal, entonces, para el analisis en cauces
naturales aproximan a estas secciones mencionadas perdiendo precision y garanta en
la obtencion de sus resultados. La mejor forma de representar es a traves de los puntos
coordenados, as se puede generalizar estas secciones transversales obteniendose resultados
mas precisos y mas compactos. Parte del objetivo de esta tesis es tratar en lo posible de
generalizar las ecuaciones, en tal forma que sus resultados cumplan para todo tipo de
secciones transversales (desde los mas comunes hasta las mas complejas).

3.4.1. C
alculo Num
erico

Para la solucion del tirante normal se tomara en cuenta las ecuaciones de Manning Strick-
ler, Chezy (Antoine de Chezy) y Darcy-Weisbach.

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

p
v=C RSf (3.4.2)

51
3.4. Calculo 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 solucion en cauces
naturales requieren de metodos numericos avanzados. Existen varios metodos para resolver
ecuaciones no lineales, tales como el Metodo de Biseccion, Metodo de Aproximaciones
Sucesivas, Metodo de Newton Raphson, entre otros mas y menos eficientes. En esta tesis
usamos el Metodo de Newton Raphson, cuya sintaxis es la siguiente.

F (y) = 0 (3.4.4)

y = Y + Y (3.4.5)

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

El proposito en esta seccion es ampliar la aplicacion del metodo de Newton-Raphson


aplicado a las ecuaciones anteriores. Donde F (y) es la funcion principal cuya variable
0
dependiente es el valor de y (Para este caso Tirante Normal) y F (y) es la primera
derivada de la funcion principal. Este metodo es iterativo hasta que el valor de (3.4.6)
tienda a cero o que se eval
ue a un error permisible que el usuarios asigna como conveniente.

Manning Strickler

La Ecuacion de Manning Strickler representado en funcion al caudal viene a ser:

A5/3 P 2/3 S 1/2


Q= (3.4.7)
n

52
3.4. Calculo del Tirante Normal

Despejando las variables constantes, para formar la Funcion principal.

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

dF
Derivando la funcion 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 seccion transversal, el Area Total es:

X
A = Ai + Aj + Ak (3.4.10)


Cuya derivada del Area Total en funcion del tirante Y.

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

dAi

Calculo 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 mnimo, de esta forma se logra opti-


mizar el tiempo de ejecucion (runtime). Por lo tanto, la ecuacion anterior se puede

53
3.4. Calculo del Tirante Normal

representar en funcion al area del triangulo izquierdo (Ai ), este se obtendra dividi-
endo la expresion (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 
Calculo 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

Calculo 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. Calculo del Tirante Normal

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


Reemplazando en la ecuacion (3.4.11) se obtendra la derivada del Area 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 Permetro 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

Calculo 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. Calculo del Tirante Normal

Esta ecuacion a
un 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 expresion 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 expresion de la derecha viene a ser igual a la ecuacion (3.4.20), por lo
tanto reemplazando se tiene.

 
Pi dPi
=
(Y Yi+1 ) dY

Esta ecuacion, tambien podra ser representada en funcion trigonometrica, seg


un la
figura que se muestra:

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

dPk

Calculo de dY
Analogamente:

56
3.4. Calculo 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 ecuacion (3.4.19) se obtendra la derivada del Permetro total:

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

57
3.4. Calculo del Tirante Normal

Chezy

La Ecuacion de Chezy en terminos de caudal:

p
Q = AC RSf (3.4.25)

Despejando las variables constantes, para formar la Funcion principal F(Y).

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

dF
Derivando la funcion 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 ecuacion de Darcy en funcion 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 Funcion principal F(Y), e igualando
esta funcion 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. Calculo del Tirante Normal

dF
Derivando la funcion 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 Hidraulico 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. Caractersticas y Clasificacion de los Perfiles del Flujo Gradualmente Variado

3.5. Caractersticas y Clasificaci


on de los Perfiles del

Flujo Gradualmente Variado

Al examinar el computo de perfiles de flujo gradualmente variado, se necesita primero


desarrollar un metodo sistematico para clasificar los perfiles que pueden presentarse en
un cauce dado.

Figura 3.6: Esquema para superficie libre de agua

De la figura 3.6, se deduce las ecuaciones:

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

Diferenciando con respecto a X y las velocidad V expresando en funcion del caudal Q

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

60
3.5. Caractersticas y Clasificacion de los Perfiles del Flujo Gradualmente Variado

Ahora, por definicion.

dH
= Sf (3.5.3)
dX

dZ
= S0 (3.5.4)
dX

Donde Sf es la pendiente de la gradiente de energa 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 ecuacion de la variacion del


tirante Y con respecto a la distancia X.

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

Donde:
2BQ2 (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 varan


casi en la misma forma que Y dado que P = B y tanto Sf como F tienen una fuerte

61
3.5. Caractersticas y Clasificacion de los Perfiles del Flujo Gradualmente Variado

dependencia inversa en el area de flujo. Ademas, al aumentar Y , F y Sf decreceran. Por


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

Figura 3.7: Sistema de clasificacion de perfiles de flujo gradualmente variado

Sf S0 Correspondiente a Y Yn (3.5.9)

F 1 Correspondiente a Y Yc (3.5.10)

Estas desigualdades dividen al canal en tres secciones en la dimension vertical, tal como se

62
3.5. Caractersticas y Clasificacion de los Perfiles del Flujo Gradualmente Variado

muestra en la figura 3.7. Por convencion, estas secciones se enumeran del 1 al 3 empezando
desde arriba.

Los perfiles del flujo gradualmente variado, se clasifica en cinco categoras:

Suave (Mild): Corresponde al perfil M , se refiere a canales con pendientes suaves o


subcrticas. Se obtiene los siguientes resultados donde Y es el tirante real del flujo:

Zona 1: Y > Yn > Yc ; S0 > Sf , F < 1; dY /dX > 0

Zona 2: Yn > Y > Yc ; S0 < Sf , F < 1; dY /dX < 0

Zona 3: Yn > Yc > Y ; S0 < Sf , F > 1; dY /dX > 0

Fuerte (Steep): Corresponde al perfil S. En estos perfiles, S0 > Sc y Yn < Yc . El


perfil S1 por lo general comienza con un salto en la frontera de aguas arriba y
termina con un perfil tangente a la horizontal en la frontera aguas abajo. El perfil
S2 es una curva de rapida que es com
unmente muy corta. En la frontera de aguas
abajo, este perfil es tangente al tirante normal. El perfil S3 es tambien transicional
ya que conecta un flujo supercrtico con el tirante normal.

Crtica (Critical): Corresponde al perfil C. En estos perfiles, S0 = Sc y Yn = Yc . El


perfil C1 es asintotico a una linea horizontal, por ejemplo un perfil que conecta a
un canal de pendiente crtica con un canal de pendiente suave. El perfil C3 puede
conectar un flujo supercrtico con un almacenamiento en una pendiente crtica.

Horizontal (pendiente cero): Corresponde al perfil H. En este caso S0 = 0, y los


perfiles H pueden considerarse como un caso lmite de los M . El perfil de la curva
de abatimiento H2 puede encontrarse aguas arriba de una cada libre, mientras que
el perfil H3 puede conectar un flujo supercrtico bajo una compuerta con un nivel
en vaso.

63
3.6. Ecuaciones para el calculo de perfiles basicos.

Adverso (Adverse): Corresponde al perfil A. En estos perfiles S0 < 0, En general los


perfiles A2 y A3 se presentan con poca frecuencia y son similares a los H2 y H3.

3.6. Ecuaciones para el c


alculo de perfiles b
asicos.

Estos datos son necesarios para calcular los tirantes del cauce, empleando el metodo del
paso estandar.

Flujo Gradualmente Variado: Metodo del paso Estandar

Figura 3.8: Balance de Energa

De la ecuacion de energa 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 seccion 01. El metodo del paso
Estandar consiste en determinar el tirante en la seccion 02 a una distancia X2 . Primero

64
3.6. Ecuaciones para el calculo de perfiles basicos.

Q
determinamos la velocidad V1 en la seccion 01, V = A
, y en la ecuacion de la energa (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 perdida total entre las secciones 1 y 2

As mismo se conoce
1
hf = (Sf1 + Sf2 )(X2 X1 ) (3.6.4)
2

Reemplazando en la ecuacion 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 ecuacion 3.6.6, A2 y Sf2 son funciones de Y2 y todos los terminos restantes son
conocidos (calculados en la seccion 01). El tirante Y2 puede ser determinado, resolviendo
la siguiente ecuacion algebraica NO-LINEAL con metodo conocidos tales como Biseccion
o el metodo de Newton Raphson.
1
Perdida por fricci
on + perdida local

65
3.6. Ecuaciones para el calculo de perfiles basicos.

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 metodo de Newton Raphson, es necesario contar la derivada de la funcion con

respecto al tirantes por conocer (Y2 ).Este se obtiene al diferenciar la expresion 3.6.7

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

Tambien 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 ecuacion 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 calculo de perfiles basicos.

dR2
La expresion dY2
puede ser reemplazado en funcion del area y el permetro. 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 prismaticas y no prismaticas.

67
Captulo 4


MODELOS NUMERICOS EN RIOS
Y DIAGRAMAS DE FLUJO

4.1. Introducci
on

En la actualidad existen diversos modelos numericos para simulaciones de flujos en ros,


desde modelos simples hasta modelos complejos. En este captulo se describe los modelos
clasicos tales como el modelo de la onda dinamica, modelo de la onda de difusion y el
modelo de la onda cinematica, como tambien se describe las propiedades hidraulicas y los
calculos unidimensionales para los flujos permanentes, discretizando las ecuaciones para
su programacion computacional.

68
4.2. Formulacion de Flujos en 1D

4.2. Formulaci
on de Flujos en 1D

4.2.1. Ecuaciones Hidrodin


amicas 1D

Modelo de la Onda Din


amica

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

A 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 area mojada de la seccion transversal del flujo y Q viene a ser la descarga del flujo
definido como Q = AU , siendo U la velocidad promedio, sobre la seccion transversal;
Zs es la estacion del agua; es el factor de correccion para el momentum debido a la
uniformidad de las (corrientes) distribuciones de velocidades sobre al seccion transversal;
ql es el flujo lateral por unidad de largo del canal. Ux es la velocidad de los flujos laterales
en la direccion del eje xi y Sf es la pendiente de friccion, denominado o representado
como:

Q|Q|
Sf = (4.2.3)
K2

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

69
4.2. Formulacion de Flujos en 1D

Para una seccion transversal compuesta.

2/3
Aj Rj
Kj = (4.2.4)
nj

Modelo de la Onda Difusi


on

El modelo de la onda de difusion asume que las aceleraciones local y convectiva en la


ecuacion del momentum son insignificantes, por lo tanto se tiene:

Zs
gA + gASf = ql Ux (4.2.5)
x

La ecuacion de continuidad, aun se usa en este modelo.

Este modelo es mas Estable que el modelo de la onda dinamica, pero este u
ltimo es mas
exacto y puede ser aplicado en rangos amplios de condiciones de flujo.

Modelo de la Onda Cinem


atica

Para este modelo, las variaciones en la velocidad del flujo y el tirante son Insignificantes en
comparacion con la variacion en la elevacion del lecho del cauce y por lo tanto la ecuacion
de momentum puede ser simplificado como:

Sf = S0 (4.2.6)

Donde So es la pendiente del fondo del canal en la direccion longitudinal.

Usando la ecuacion de Manning, la ecuacion 4.2.6 puede ser reescrito.

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

70
4.2. Formulacion de Flujos en 1D

La ecuacion de continuidad 4.2.1 a


un es usada en este modelo de la onda cinematica.

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 Ecuacion 4.2.8 implica que el modelo de la onda cinematica sea aplicado en
canales empinados o pronunciados (steep).

4.2.2. Propiedades Hidr


aulicas Compuestas

Si las propiedades hidraulicas, tales como rugosidad, conduccion, no son uniformes, a


traves del canal, sus valores compuestos necesitan ser calculados. Existen varios metodos
que se usan frecuentemente, tales como: El metodo Alpha, Metodo de la division Radio
Hidraulico, Metodo de la division de la pendiente energa y el metodo de la conduccion o
transportabilidad.

M
etodo Alpha

En el metodo Alpha, la seccion transversal es dividida dentro de paneles o franjas entre


dos puntos de coordenadas (estaciones) tal como se muestra en la figura 4.1. La division
entre los paneles son asumidos para ser verticales. En este metodo la seccion transversal
no se distingue entre el canal principal y los bancos de inundacion.

 
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. Formulacion de Flujos en 1D

Figura 4.1: Representacion de la seccion transversal en el Metodo Alpha

Aj
Rj = (4.2.11)
Pj

Donde Aj es el area del flujo Pj , permetro mojado, Rj Radio hidraulico. Para Kj de la


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

2/3
Aj Rj
Kj = (4.2.12)
nj

Donde Zb,j , es la elevacion del fondo en la estacion j, yj es la distancia entre estaciones


j, j + 1, nj es coeficiente de la rugosidad de manning en la franja j.

La seccion transversal compuesta del area del flujo, es definido como la sumatoria de todos
las franjas (sub areas en los paneles).

La velocidad compuesta es definida como la division de la descarga total entre el area de la


seccion conservando continuidad. El radio hidraulico compuesto (transporte ponderado):

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

Donde M es el n
umero de franjas mojadas.

72
4.2. Formulacion de Flujos en 1D

El Metodo Alpha se limita debido a que ignora el efecto de los muros verticales, lo cual
no es adecuado en situaciones donde existen superficies laterales verticales o pendientes
empinadas, pronunciados en los bancos.

Divisi
on de Radio Hidr
aulico

Propuesto por Einstein (1950), es un metodo mas adecuado para determinar las
propiedades hidraulicas compuestas para la seccion transversal con superficies verticales
rugosos o pendientes pronunciados en los bancos basados en la division del radio hidrauli-
co. Este metodo asume velocidades iguales en todas las franjas y calcula todas las variables
hidraulicas en un modo normal, excepto para el coeficiente de la rugosidad de Manning.

El esfuerzo de corte en la seccion transversal puede ser calculado como:

M
X

X = Pj j (4.2.14)
j=1

Donde:

P = Permetro mojado.

El metodo de Einstein determina:

= RSf (4.2.15)

j = Rj Sf (4.2.16)

Aplicando y asumiendo las velocidades iguales y la ecuacion de Manning en la seccion


transversal entera y para cada franja se tiene:

73
4.2. Formulacion 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 ecuacion 4.2.14 se tiene:

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

M
etodo de la divisi
on pendiente Energa

Este metodo es basado en la division de la pendiente energa originado por Engelund


(1966), es otra opcion para determinar las propiedades hidraulicas compuestas para una
seccion transversal con superficies laterales verticales rugosas o pendientes pronunciadas
en los bancos.

Este metodo da:

j = RSf,j (4.2.19)

Y aplica la asuncion de la velocidad igual y la ecuacion de Manning en la seccion transver-


sal 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 ecuacion 4.2.14 se tiene la siguiente
ecuacion para un Manning n compuesto.

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

74
4.2. Formulacion de Flujos en 1D

M
etodo de la Transportabilidad - Conveyance

La asuncion de las velocidades iguales usados en los metodos anteriores, basado en la


division de cualquiera de los dos radios hidraulicos o pendiente de energa es solamente
aplicable en canales o cauces simples.

Para un canal compuesto con inundaciones, las velocidades en el canal principal y playas de
inundacion pueden ser significativamente diferentes. Una forma o un metodo mas adecuado
para determinar las propiedades hidraulicas compuestas en canales complejos es el metodo
de transporte (Conveyence Method).

Este metodo divide la seccion transversal en sub secciones de tal forma, que la asuncion
de las velocidades iguales puede ser aproximadamente valida en cada sub seccion. Y
estas sub secciones pueden aun ser ser dividido entre mas franjas. El area del flujo, el
permetro mojado y la conduccion de cada sub seccion puede ser calculada de manera
normal. Las conducciones de todas las sub secciones se suman para establecer el total de
la transportabilidad para la seccion transversal entera.

Por ejemplo en una seccion transversal compleja.

Figura 4.2: Seccion transversal compuesta con llanuras de inundacion

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

75
4.2. Formulacion 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 subndices LF denota llanura de inundacion izquierda (Left Foodplain), M C


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

Para cada sub seccion, el coeficiente de rugosidad de Manning puede ser determinado
usando el radio hidraulico o el metodo de la division pendiente energa (energy slope
division method).

Para el ejemplo el coeficiente de rugosidad de Manning n en el canal principal es deter-


minado usando estos dos metodos como sigue:

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 inundacion (denominados como en LF y RF seg
un la
figura 4.2).

4.2.3. Propiedades Hidr


aulicas Compuestas

El factor de correccion para la ecuacion del momentum en la ecuacion 4.2.2 es consid-


erado solo para una seccion transversal simple. Para una seccion 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. Calculos 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
alculos Uni-dimensionales para flujos en

canales o cauces abiertos

4.3.1. C
alculos de Flujos Permanentes 1-D

Discretizaci
on de ecuaciones para Flujos Permanentes

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

Q
=0 (4.3.1)
x

Y da lugar a una descarga del flujo constante. Mientras la ecuacion 4.2.2 puede ser reescrito
como la ecuacion de la Energa.

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

Donde 0 es el factor de correccion de la energa cinetica debido a la no uniformidad de la


direccion de la corriente en la seccion transversal. Para una seccion transversal compleja
como se muestra en la figura anterior, 0 puede ser determinado mediante el promedio de
la descarga ponderada de la energa cinetica.

77
4.3. Calculos 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 parametros son iguales que en la ecuacion 4.2.25

Asumimos que el dominio computacional de un canal simple es dividido en I 1 tramos


por I secciones transversales (puntos computacionales) como se muestra en la figura 4.3.
Las secciones transversales son numeradas en la direccion aguas abajo desde 1 hasta I.
Cada seccion transversal es representado por un n
umero adecuado de puntos (estaciones)
como se muestra en la figura 3.2, con cada punto caracterizado por un par de valores o
coordenadas locales (z, y) distancia elevacion del fondo.

Para un canal simple, la longitud de alcance mide la ruta del flujo principal o canal
Thalweg 1 . Para un canal complejo, las rutas del flujo en el canal principal y llanuras de
inundacion pueden ser significativamente diferentes y un promedio (tal como el promedio
de la descarga ponderada) de sus longitudes pueden ser usados como la longitud del
alcance.

Aplicando el metodo del paso standard para discretizar la ecuacion 4.3.2 se tiene.

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 terminos cientficos se utiliza el nombre de Thalweg, voz procedente del aleman que significa
camino del valle, esta lnea que se encuentra en medio de la parte mas profunda del ro y donde la
corriente es m
as r
apida.

78
4.3. Calculos Uni-dimensionales para flujos en canales o cauces abiertos

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

En la ecuacion 4.3.5 la pendiente de friccion es representado por la media aritmetica entre


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

Media Aritmetica.

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

Media Armonica.

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

Media Geometrica.

 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 ecuacion 4.3.5, el cual la ecuacion final se tiene:

79
4.3. Calculos 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 perdida local debido a la expansion o contraccion en


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

Soluci
on de las Ecuaciones del Flujo Permanente Discretizados

La solucion para la ecuacion 4.3.10 difiere en casos de flujos sub crticos y super crticos.

Para el flujo Subcrtico: Una descarga del flujo es usualmente especificado en el ingreso y
una estacion del agua es especificado en la salida. Consecuentemente la descarga del flujo
es calculando aplicando la continuidad de masa y la estacion del agua (tirante) puede ser
determinado por calculos de remanso usando la ecuacion 4.3.10. Como se ve, esta ecuacion
es no lineal, por lo tanto, necesita ser resuelto iterativamente bajo un margen de error.

Definimos la siguiente funcion:

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 seccion transversal i+1 se obtuvo
del calculo previo en el tramo entre las secciones i + 1 y i + 2 o del tirante (o estacion del
agua) dado en la salida, ahora el problema es determinar Zs,i y la correspondiente area
Ai y Ki , garantizando F = 0. Aqu se usa el metodo de Biseccion.

Para el flujo Supercrtico: La descarga del flujo y la estacion del agua (tirante) son ingre-
sadas usualmente en el ingreso (upstream). El procedimiento para los calculos es el mismo
del flujo subcrtico, con la diferencia del sentido de calculo (upstream - downstream).

80
4.3. Calculos Uni-dimensionales para flujos en canales o cauces abiertos

M
etodo de Bisecci
on

Es un metodo de b
usqueda incremental que divide el intervalo siempre en 2. Si la funcion
cambia de signo un intervalo, se eval
ua el valor de la funcion en el punto medio. La
posicion de la raz se determina situandola en el punto medio del sub intervalo, donde
exista cambio de signo. El proceso se repite hasta mejorar la aproximacion.

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


seccion de Zs,i existan, por ejemplo: 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 correspondi-
ente a Zmiddle (Zintermedio ).

Si Fmiddle = 0 (o inferior a la tolerancia prudente), Zmiddle es la solucion 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 solucion de Zs,i y para la iteracion; de otro modo repetir desde el paso
(2) hasta que la solucion converja.

Note que la b
usqueda en el paso (1) para los lmites inferior y superior (lower, upper)
Zlower y Zupper del segmento inicial donde las soluciones existan puedan estar desde
cualquier elevacion o fondo del canal Zs,i+1 .

81
4.3. Calculos 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 Aritmetica: 2 2
Ki+1
+ Ki2

2
 

Media Armonica : 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 Geometrica: 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 (Hidraulica) se emplea objetos personalizados con aplicaciones de



ObjectDBX. Este es una librera dinamica DLL, que es cargado dentro del ambiente
AutoCAD, permitiendo el acceso de los objetos o recurso CAD.

ObjectBDX, es el nombre del API Autodesk que sirve para los desarroladores que usan
la lectura y escritura del autoCAD DWG, DXF, incluyendo soportes para crear entidades
personalizadas.

Los diagramas de flujos son:

Diagrama de flujo C
alculo de la Superficie Libre M
etodo del Paso Est
an-
dar: Recibe los datos de las secciones transversales, geometra, caudal de dise
no,
condicion de borde inicial dependiendo del tipo de flujo. Para el Flujo Subcrtico,
las condiciones iniciales son aguas abajo (downstream) y para el Flujo Supercrtico
las condiciones iniciales son aguas arriba (upstream).

Diagrama de flujo Condiciones Aguas Abajo: Viene a ser la eleccion del flujo
Subcrtico, donde los calculos son a partir de la u
ltima seccion transversal hasta
la primera seccion. En el diagrama se toma como dato al tirante hidraulico, area
hidraulica, permetro mojado y demas caractersticas que se muestra. As mismo
contiene una funcion para calcular los niveles mediante el metodo biseccion que se
detalla posteriormente.

Diagrama de flujo Condiciones Aguas Arriba: El diagrama corresponde al


flujo Supercrtico. El mecanismo es el mismo del anterior, con la u
nica diferencia de
que el analisis es desde la primera seccion transversal (upstream) hasta la u
ltima
seccion.

83
4.4. Diagramas de flujo

Diagrama de flujo C
alculo del Area y Permetro hidr
aulico: A partir del
tirante asignado o calculado (nivel de superficie libre), en cada seccion transversal
se obtiene las areas y los permetros. El metodo que emplea es mediante franjas
verticales entre vertices adyacentes. En los extremos de la seccion transversal, se
forman triangulos y en el intermedio peque
nos trapecios, donde la sumatoria de ellos
representa el area y el permetro seg
un corresponda. El metodo es muy adecuado
para secciones transversales complejas controlando inundaciones laterales (izquierda,
derecha) en cada seccion transversal.

Diagrama de flujo C
alculo del Factor de Transporte K: El metodo para cal-
cular el factor de transporte es una fraccion entre el area y el permetro multiplicado
por el coeficiente de manning. En programacion es recomendable no tener valores
nulos o ceros en el denominador de una fraccion. El diagrama controla este posible
error.

Diagrama de flujo C on 0 : Calcula el factor de


alculo del Factor de correcci
correccion 0 en cada seccion transversal, previniendo los posibles valores nulos en
los denominadores de las fracciones.

Diagrama de flujo M
etodo de la Bisecci
on: El metodo de la Biseccion tambien
es conocido como el metodo de particion en dos intervalos iguales. Este metodo busca
la raz de una funcion en un intervalo propuesto, usando la tecnica de b
usqueda
incremental, para encontrar donde la funcion cambie de signo, o sea, cuando la
funcion cruza el eje de la coordenada x, por lo tanto, sera el valor de la raz buscada.

Diagrama de flujo Funci


on F : Este diagrama corresponde al calcular en forma
directa la funcion F , que es la ecuacion del balance de energa.

Los resultados son:

84
4.4. Diagramas de flujo

Graficos, que corresponde a los niveles de superficie libre de agua, tanto en las secciones
transversales como en los perfiles longitudinales.
Tabulares, (tablas) resumen de las caractersticas hidraulicas del flujo, tales como, caudal
de dise
no, tirante, area, permetro, velocidad, n
umero de froude, ancho o espejo de agua,
etc.

85
4.4. Diagramas de flujo

INICIOCLCULODELASUPERFICIELIBRE
METODODELPASOESTANDARD

Datosdelassecciones

transversales(geometra)

Ordenarconsecutivamente
lasseccionestransversales

nST=Nmerodesecciones
transversales.

TipodeFlujo,Caudaldediseo

(m3/s),Nivelinicial(m)

TipodeFlujo

F.Subcrtico F.Supercrtico F. Mixto

Condicin Condicin CondicinAguasArriba

Aguas Abajo *(A) Aguas Arriba *(B) y Aguas Abajo

Nivelesdelasuperficielibre
deaguaylascaractersticas
hidrulicas.

FINCLCULODELASUPERFICIE

86
4.4. Diagramas de flujo

(A)INICIOCONDICIN
AGUASABAJO

i=nST1,hastai=0,
i=i1

Zsi Cotatirante
Area,Permetro GetAreaPerimeter * C .
K GetConveyanceK* D .
Beta GetCorrectionFactorBeta* E

Zlower Cotamnimadelaseccinactual.
Zupper Zsi Valorsuperior.

DatosGeomtricosdelaseccintransversal:

BL Vrticellanuraizquierda.
BR Vrticellanuraderecha.
nL CoeficientedeManningllanuraizquierda.
nC CoeficientedeManningcanalcentral.
nR CoeficientedeManningllanuraderecha.
LL Longitudporlallanuraizquierda.
LC Longitudporelcanalcentral.
LR Longitudporlallanuraderecha.
CC Coeficientedecontraccin.
CE Coeficientedeexpansin.

ClculomtododeBiseccin * F

Reasignarvalores:
Beta Clculos Beta
Area Clculos Area
Zsi Clculos Zsi
K Clculos K

Nivelesdelasuperficielibre

deaguaylascaractersticas
hidrulicas.

FINCONDICINAGUASABAJO

87
4.4. Diagramas de flujo

(B)INICIOCONDICIN
AGUASARRIBA

i=1,hastai=nST,
i=i+1

Zsi Cotatirante
Area,Permetro GetAreaPerimeter * C .
K GetConveyanceK* D .
Beta GetCorrectionFactorBeta* E

Zlower Cotamnimadelaseccinactual.
Zupper Zsi Valorsuperior.

DatosGeomtricosdelaseccintransversal:

BL Vrticellanuraizquierda.
BR Vrticellanuraderecha.
nL CoeficientedeManningllanuraizquierda.
nC CoeficientedeManningcanalcentral.
nR CoeficientedeManningllanuraderecha.
LL Longitudporlallanuraizquierda.
LC Longitudporelcanalcentral.
LR Longitudporlallanuraderecha.
CC Coeficientedecontraccin.
CE Coeficientedeexpansin.

ClculomtododeBiseccin * F

Reasignarvalores:
Beta Clculos Beta
Area Clculos Area
Zsi Clculos Zsi
K Clculos K

Nivelesdelasuperficielibre

deaguaylascaractersticas
hidrulicas.

FINCONDICINAGUASARRIBA

88
4.4. Diagramas de flujo

(C)INICIO
GETAREAPERIMETER

CotaTirante,Vrticesdela
seccintransversal,BL,BR.

Inundacinvrticederecho=falso.
Inundacinvrticeizquierdo=falso.


CotaTirante>
VF
PrimerVrtice[Y]

Incrementarunvrticeinicialcon
coordenadas:
X=PrimerVrtice[X].
Y=CotaTirante.
Inundacinvrticeizquierdo=verdadero.

V F
CotaTirante>
PrimerVrtice[Y]

IncrementarunvrticeFinalcon
coordenadas:
X=ltimoVrtice[X].
Y=CotaTirante.
Inundacinvrticederecho=verdadero.

89
4.4. Diagramas de flujo

... 1

j=1,hastaNde
Vrtices,j=j+1

CotaTirante<=
V
Vertices[j].y F

Y=CotaTirante

Condicin=Verdadero

F
Condicin=Verdadero
V

J=J+1

V Vertices[j+1].y F

>= Cota Tirante

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

Condicin=Verdadero Condicin=Falso

Area(m2),Permetro(m)

FINGETAREAPERIMETER

90
4.4. Diagramas de flujo

(D)INICIO
GETCONVEYANCEK

ALF =reallanuraizquierda.
AMC =reaCanalCentral.
ALR =reallanuraderecha.
PLF =Permetrollanuraizquierda.
PMC =PermetroCanalCentral.
PLR =Permetrollanuraderecha.
nLF =CoeficientedeManningllanuraizquierda.
nMC =CoeficientedeManningCanalCentral.
nLR =CoeficientedeManningllanuraderecha.

KLF=KMC=KRF=0.0

V PLF!=0.0 F

/
/

V PMC!=0.0 F

/
/

V PRF!=0.0 F

/

/

K=KLF+KMC+KRF

FINGETCONVEYANCEK

91
4.4. Diagramas de flujo

(E)INICIO
GETCORRECTIONFACTORBETA

ALF =reallanuraizquierda.
AMC =reaCanalCentral.
ALR =reallanuraderecha.
KLF =Permetrollanuraizquierda.
KMC =PermetroCanalCentral.
KLR =Permetrollanuraderecha.

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

FINGETCORRECTIONFACTORBETA

92
4.4. Diagramas de flujo

(F)INICIOMTODODE
BISECCIN

Zlower =Extremovalorinferior.
Zupper =Extremovalorsuperior.
Variableshidrulicas.
NoEncontrado=verdadero

F
NoEncontrado = Verdadero


Area,Permetro 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(ZupperZlower) F
<TOL

NoEncontrado=falso

Nivelesdesuperficielibre
VariablesHidrulicas

FINMTODODEBISECCIN

93
4.4. Diagramas de flujo

(G)INICIOFUNCINF

Bi1 =FactordeCorrecinBetaenlaestacini+1.
Bi =FactordeCorrecinBetaenlaestacini.
Qi1 =Descargadelflujoenlaestacini+1.

Qi =Descargadelflujoenlaestacini
Ai1 =Areadelaseccintransversalenlaestacini+1.
Ai =Areadelaseccintransversalenlaestacini.
Zi1 =Cotadelniveldeaguaenlaestacini+1.(valoraencontrar)
Zi =Cotadelniveldeaguaenlaestacini.
hfi12 =Prdidaporfriccineneltramoi+1/2.
hci12 =PrdidaLocaleneltramoi+1/2.

/ | | | |
, ,
2 2 2

FINFUNCINF

94
Captulo 5

EN RIOS Y
SOCAVACION
DIAGRAMAS DE FLUJO

5.1. Introducci
on

El fenomeno de la socavacion en cauces naturales, ocurre generalmente en presencia de las


maximas avenidas (Max Flood), produciendo alteraciones de la geometra de las secciones
transversales tanto en el fondo como en las riberas del cauce. El programa PLEDER, para
determinar la socavacion general utiliza el criterio propuesto por Lischtvan-Lebeviev, para
el cual es necesario conocer las clasificaciones de los cauces de los ros y de los materiales
que estos lo conforman.

5.2. Clasificaci
on de los Ros

Se clasifica en cauce principal definido y cauce principal indefinido.

95
5.2. Clasificacion de los Ros

5.2.1. Cauce principal definido

Se trata de cauces con tres elementos bien definidos, canal principal (main channel),
llanura de inundacion izquierda (Left Floodplain), llanura de inundacion derecha (Right
Floodplain).

Figura 5.1: Seccion transversal en cauce principal definido

En periodos de estiaje, las llanuras de inundacion en muchas ocasiones suelen estar cu-
biertas de vegetacion o arbustos de peque
na 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 ro escurre por varias partes
al mismo tiempo.

Figura 5.2: Seccion transversal en cauce principal indefinido

96
5.3. Socavacion General en cauces definidos

En muchos casos se tiene aguas estancadas debido al cambio en el caudal y a la topografa


del cauce.

5.3. Socavaci
on General en cauces definidos

El criterio de erosion es producto del incremento del caudal del flujo (mayor velocidad,
siempre en cuando se mantiene el area de la seccion transversal mojada), aumentando la
capacidad de arrastre de la corriente, con la que se inicia a degradar el material de fondo
(generalmente en la lnea de thalweg). Ahora, al descender el fondo, aumenta gradualmente
el area hidraulica, donde se reduce paulatinamente el valor medio de la velocidad de la
corriente y por ende la capacidad de arrastre, hasta el momento en que se alcanza un
estado de equilibrio.

Este equilibrio, existe cuando son iguales la velocidad media real de la corriente Ur , y
la velocidad media que se requiere para que un material de caractersticas dadas sea
arrastrado Ue .

La velocidad Ur , esta dada en funcion de las caractersticas hidraulicas del cauce (pen-
diente, tirante, flujo, rugosidad, etc.). Con respecto a la velocidad Ue esta en funcion de
las caractersticas del material del fondo y del tirante del flujo. Para valuarla, las caracte-
rsticas representativas que se toman en cuenta tratandose de material no cohesivo, es el
diametro medio dm . No se considera el peso especfico, 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 especfico del material seco.

5.3.1. Socavaci
on General para Suelos Cohesivos

La magnitud de la erosion es suelos limosos y arcillosos dependen principalmente del peso


volumetrico del suelo seco. El valor de la velocidad media que se requiere para degradar

97
5.3. Socavacion General en cauces definidos

el fondo esta dado por la ecuacion.

Ue = 0,60s1,18 HsX (5.3.1)

Donde:

Hs : Tirante considerado a cuya profundidad se desea conocer que valor de Ue se requiere


para arrastrar y levantar el material.

X: Exponente variable esta en funcion del s , el cual se encuentra en el cuadro 5.2. Se


indica el valor del coeficiente X.

: Coeficiente de paso, que depende de la frecuencia con que se repite la avenida que se
estudia y cuyo valor se dan en en cuadro 5.1.

s : Peso volumetrico del material seco que se encuentra a la profundidad Hs (ton/m3 )

Cuadro 5.1: Valores del coeficiente


Probabilidad en %,
que se presente Coeficiente
el gasto de dise
no
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. Socavacion General en cauces definidos

Cuadro 5.2: Valores de X , para suelos cohesivos y no cohesivos


SUELOS COHESIVOS SUELOS NO COHESIVOS
s X dm X
0.80 0.52 0.05 0.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 variacion de la velocidad media Ur de la corriente en funcion de la profundidad y para


cada punto de la seccion transversal, puede ser obtenida analizando una franja vertical.
La hipotesis que se formula para realizar el calculo es que el gasto unitario es cada franja
permanece constante mientras dura el proceso de erosion.

Donde:

B, representa el ancho de la superficie, H0 tirante en el punto P antes de la erosion, Hs


tirante supuesto, para el cual se desea conocer el muevo valor de la velocidad, P punto

99
5.3. Socavacion General en cauces definidos

Figura 5.3: Seccion transversal, Socavacion general

cualquiera, en el cual se desea conocer el cambio de velocidad al aumentar el tirante.

Ecuaciones para la socavaci


on general

Desde la franja considera en la figura 5.3 con espesor B, el caudal del flujo que pasa por
esta seccion esta dada seg
un la ecuacion 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 socavacion

Algunos textos para simplificar operaciones, asumen en las secciones transversales como
rectangulares o trapezoidales, de tal forma que el area del flujo es el ancho de la superficie
por una altura media. Estos criterios son manejados debido a las geometras complejas
que se presentan en los cauces naturales.

100
5.3. Socavacion General en cauces definidos

A continuacion se muestra las ecuaciones sin alterar estas caractersticas, por lo tanto:

1/2 5/3 2/3


Q= S A P (5.3.3)
n f

Donde:

, es el coeficiente de contraccion por las turbulencias que se presentan. A, es el area total


del flujo en la seccion transversal. P , permetro total de la seccion 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


cualquiera Hs , la velocidad disminuye a un nuevo valor Ur . El caudal del flujo Q en la
misma franja, esta en funcion (directamente proporcional) de esta velocidad y el tirante
se expresa por:

Q = Ur Hs B (5.3.6)

igualando la ecuacion 5.3.5 y 5.3.6

101
5.3. Socavacion 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 erosion se detendra cuando a una profundidad cualquiera alcanzada,
el valor de Ur , velocidad de la corriente capaz de producir arrastre, y Ue , velocidad que
se necesita para que el fondo se degrade sean iguales (Condicion de equilibrio).

Ue = Ur (5.3.9)

Por lo tanto
5/3
QP 2/3 H0
0,60s1,18 HsX =
A5/3 Hs
5/3
QP 2/3 H0
Hs1+X =
0,60A5/3 s1,18

1
! 1+X
5/3
2/3
QP H0
Hs = (5.3.10)
0,60A5/3 s1,18

Esta ecuacion 5.3.10, cumple para suelos Homogeneos.

5.3.2. Socavaci
on General para Suelos No Cohesivos

El fenomeno fsico es el mismo para estos tipos de suelos (granos sueltos, arena, gravas,
etc), manteniendo la misma formula para la velocidad real, lo que s cambia es la velocidad
media que se requiere para degradar el fondo Ue

Ue = 0,68d0,28
m Hs
X
(5.3.11)

102
5.3. Socavacion General en cauces definidos

Donde:

dm , diametro medio de los granos del fondo, obtenidos seg


un la expresion (mm).

X
dm = 0,01 (di Pi ) (5.3.12)

Donde:

di , diametro de una fraccion en una curva granulometrica de la muestra total que se analiza
(mm). Pi , porcentaje del peso de esta misma porcion, comparada con el peso total de la
muestra. Las fracciones escogidas no deben ser necesariamente iguales entre s.

Usando el mismo criterio de equilibrio de velocidades Ue = Ur , se tiene:

5/3
0,28 X QP 2/3 H0
0,68dm Hs =
A5/3 Hs
5/3
QP 2/3 H0
Hs1+X =
0,68A5/3 d0,28
m

1
! 1+X
5/3
QP 2/3 H0
Hs = (5.3.13)
0,68A5/3 d0,28
m

103
5.4. Diagramas de flujo

5.4. Diagramas de flujo

Diagrama de flujo C
alculo de la Socavaci
on General: El diagrama, corres-
ponde al calculo de la socavacion general mediante el metodo de Lischtvan-Lebeviev
para cada seccion transversal considerado. Para calcular la socavacion general, es
necesario como dato principal las caractersticas fsicas del las secciones transversales
y las caractersticas hidraulicas tales como el area hidraulica, permetro mojado y el
caudal de dise
no. Finalmente obtiene las coordenadas de la nueva seccion transversal
socavada y las alturas en cada vertice.

Diagrama de flujo Coeficiente X: El coeficiente X, es un dato importante que


se emplea en la solucion de la altura de socavacion en lecho cohesivo y no cohesivo
(ecuacion 5.3.10, 5.3.13). El diagrama, depende de dos tipos de materiales (cohesivo
y no cohesivo). Para el material cohesivos, como dato principal es el peso especfico
del material ingresados en ton/m3 y para el material no cohesivo es el diametro medio
dm de las partculas en mm. Para cada intervalo se realizo ajustes polinomicas, con
coeficientes de regresion muy aceptables (R2 = 0,99).

Diagrama de flujo Lischtvan-Lebeviev: Corresponde a las aplicacion directa


de las ecuaciones 5.3.10 y 5.3.13, dependiendo del tipo de material asignado en la
seccion transversal.

Los resultados son:

Graficos, (polilneas) en casa una de las secciones transversales.


Tabulares, (tablas) altura de socavacion en cada vertice de la seccion transversal.

104
5.4. Diagramas de flujo

INICIOCLCULODELA
SOCAVACINGENERAL

i=1,hastai=nST,
i=i+1

Nivelesdelasuperficielibredeaguaylas
caractersticashidrulicas.

Tipodematerial.
%deprobabilidaddegasto.

ClculodelcoeficienteX:CoeficienteX*(H)
ClculosocavacinporLischtvanLebeviev:
LischtvanLebeviev*(I)

Alturadesocavacindelas
seccionestransversales

FINCLCULODELA
SOCAVACINGENERAL

105
5.4. Diagramas de flujo

(H)INICIOCLCULODEL
COEFICIENTE X

TipodeMaterial

Cohesivo NoCohesivo

C=MaterialCohesivos(Ton/m3) NC=MaterialNoCohesivos(mm)

1 2

ValordelcoeficienteX

FINCLCULODEL
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.8C2.00
F

X=Interpolacin(C)

V F
C >2.00

0.0973C 0.539 1.113 1.117

107
5.4. Diagramas de flujo

... 2

V 0<NC<0.05 F

0.43

V 0.05 NC 1000
F

X=Interpolacin(NC)

V F
NC >1000

1.30 10 NC 2.44 10 0.304

108
5.4. Diagramas de flujo

(I)INICIOCLCULOSOCAVACIN
LISCHTVANLEBEVIEV

TipodeMaterial

Cohesivo NoCohesivo

MaterialCohesivos MaterialNoCohesivos

/ / / /

0.60 / .
0.68 / .

Niveles de socavacin en
cada vrtice de la seccin
transversal

FINCLCULOSOCAVACIN
LISCHTVANLEBEVIEV

109
Captulo 6

PRACTICA
APLICACION DEL
PROGRAMA DESARROLLADO

6.1. Introducci
on

La aplicacion practica hace referencia al proyecto Construccion de la Defensa Ribere


na
Ro Huallaga-Huariaca en el estudio hidrologico - hidraulico e hidraulica fluvial, con el
objetivo de determinar los caudales de maximas avenidas para realizar los dimension-
amientos adecuados y optimos de la defensa ribere
na de la ciudad de Huariaca que se
ubica adyacente al Ro Huallaga en 2.5 km.

El estudio Hidrologico, corresponde a determinar el caudal de maximas avenidas a partir


de datos de precipitacion maxima de 24 horas registrados en la estacion Yanahuanca,
latitud 10 29S, longitud 76 30W y altitud 3473 m.s.n.m., en el departamento de Pasco,
provincia Daniel A. Carrion y distrito Yanahuanca.

El estudio Hidraulico, concierne a transitar el caudal de dise


no para un perodo de re-
torno asignado, a traves de las 125 secciones transversales del cauce, espaciadas cada 20.0
metros en tramos longitudinales rectos a traves de la lnea thalweg. El transito del caudal

110
6.2. Descripcion General de Programa PLEDER

maximo determina encontrar el perfil de la superficie libre de agua, incluyendo parametros


hidraulicos de dise
no en cada una de las secciones transversales, a partir de los cuales se
podra proyectarse eficientemente las estructuras hidraulicas de proteccion.

El estudio de Hidraulica Fluvial, permite determinar el ancho estable del cauce, transporte
de sedimentos, socavaciones generales.

Cada uno de estos componentes, seran llevados a cabo mediante el programa PLEDER,
obteniendo los resultados finales graficas y tabulares, que son necesarios para su inter-
pretacion.

6.2. Descripci
on General de Programa PLEDER

El programa Lluvia Escorrenta para Simulacion de Defensas Ribere


nas (PLEDER), rea-
liza el proceso hidrologico, hidraulico e hidraulica fluvial, este u
ltimo abarca las socava-
ciones generales de las secciones transversales, en el ambiente AutoCAD. PLEDER en su
primera version contiene 13 commandos, 5 en el componente hidrologico, 6 en el compo-
nente hidraulico y 2 comandos en hidraulica fluvial.

PLIILA: Componente Hidrologico, muestra la ventana para calcular Hietogramas


mediante el metodo IILA SENAMHI UNI.

Figura 6.1: Icono: PLIILA

PLNRCS: Componente Hidrologico, muestra la ventana para calcular Hietogramas


mediante el metodo NRCS.

111
6.2. Descripcion General de Programa PLEDER

Figura 6.2: Icono: PLNRCS

PLLLES: Componente Hidrologico, comando principal que muestra la ventana para


calcular la transformacion Lluvia - Escorrenta.

Figura 6.3: Icono: PLLLES

PLCNC: Componente Hidrologico, comando alternativo para calcular el N


umero
de Curva Compuesto.

Figura 6.4: Icono: PLCNC

PLHU: Componente Hidrologico, importar los datos de las coordenadas hidrograma


unitario [U ] y y pulso [P ], para realizar la convolucion discreta.

Figura 6.5: Icono: PLHU

PLHSTC: Componente Hidraulico, comando principal para crear y almace-


nar los vertices de las secciones transversales, a partir de una polilnea. Medi-
ante este comando, el programa PLEDER, crear el objeto personalizado llamado

112
6.2. Descripcion General de Programa PLEDER

CPLEDERCROSSSECTIONS , quien contiene la base de datos de los parametros


de ingreso en las secciones transversales.

Figura 6.6: Icono: PLHSTC

PLHCAL: Componente Hidraulico, calcula los parametros hidraulicos y los niveles


de la superficie libre, mediante el metodo del paso estandar en flujo permanente.
El comando crea el segundo objeto personalizado PLEDERHYDRAULICRESULT ,
donde los resultados se almacena en su base de datos.

Figura 6.7: Icono: PLHCAL

PLHPSL: Componente Hidraulico, plotea la superficie libre de agua en un punto


especificado por el usuario en coordenadas y escalas inalteradas. Este comando es
habilitado, una vez computado o calculado los niveles de las secciones transversales.

Figura 6.8: Icono: PLHPSL

PLHTST: Componente Hidraulico, comando alternativo y utilitario para realizar


informes de las secciones transversales en tablas editables y con opciones a ser ex-
portado a archivos con extension csv.

113
6.2. Descripcion General de Programa PLEDER

Figura 6.9: Icono: PLHTST

PLHRES: Componente Hidraulico, muestra en un cuadro de dialogo los resultados


o parametros hidraulicos calculados en cada seccion transversal.

Figura 6.10: Icono: PLHRES

PLHDEL: Componente Hidraulico, elimina los niveles calculados en


las secciones transversales y la base de datos del objeto personalizado
PLEDERHYDRAULICRESULT .

Figura 6.11: Icono: PLHDEL

PLHSOC: Componente Hidraulica Fluvial, este comando permite ingresar los datos
de las secciones transversales para calcular las socavaciones generales.

Figura 6.12: Icono: PLHSOC

PLHSCC: Componente Hidraulica Fluvial, comando principal para calcular las



socavaciones generales en las secciones transversales. Este comando plotea y muestra
los resultados tabulares de las socavaciones en cada una de las secciones.

114
6.3. Calculos y Resultados Hidrologicos

Figura 6.13: Icono: PLHSCC

PLEDER, organizada los comandos descritos dentro del AutoCAD en men


us, toolbars y
paneles Ribbon. La opcion Ribbon se utiliza a partir de la version 2009, quien muestra
una mejor organizacion, visualizacion en los comandos personalizados.

Figura 6.14: PLEDER, paneles Ribbon

6.3. C
alculos y Resultados Hidrol
ogicos

De las informaciones cartograficas, pluviometrica de la zona de estudio, se determina el


caudal de maximas avenidas para diferentes perodos de retorno, considerando para este
caso los hietogramas sinteticos elaborados por el NRCS en la curva tipo II.

Los datos de la cuenca se resume en la tabla 6.1, as tambien se adjunta en el apendice E


la cartografa, red topologica, altitud y el perfil longitudinal del cauce principal.

Cuadro 6.1: Datos de la cuenca principal


Descripcion Medida

Area de la cuenca 581.587 km2 .
Permetro de la cuenca 128.713 km.
Longitud del cauce 47.110 km.
Cota mas baja 2970.000 m.s.n.m.
Cota mas alta 4500.000 m.s.n.m.
Tiempo de Concentracion 289.350 min

115
6.3. Calculos y Resultados Hidrologicos

Mediante el comando PLLLES o el cono de la figura 6.3, muestra el interfaz grafico para
calcular la transformacion de lluvia - escorrenta. Contiene 3 parametros importantes de
ingreso:

6.3.1. Par
ametro Cuenca [U]

Parametro Cuenca [U] corresponde a la obtencion de las coordenadas del hidrograma


unitario, mediante las caractersticas fsicas de la cuenca y el tipo del hidrograma unitario
sintetico (hidrograma unitario NRCS e hidrograma unitario Snyder).

Figura 6.15: PLEDER, datos Transformacion Lluvia Escorrenta

Dentro de este parametro, PLEDER presenta utilitarios tales como el calcular las areas
mediante polilneas cerradas, distancias longitudinales, puntos de referencia en coorde-
nadas UTM, dentro del ambiente AutoCAD.

116
6.3. Calculos y Resultados Hidrologicos

Figura 6.16: PLEDER, area desde una polilnea

El programa contiene una herramienta para calcular en N


umero de Curva Compuesto
(expuestos en el capitulo 2), que en una mayora de las cuencas la uniformidad de la
vegetacion o tipo de suelo no se presenta en su totalidad, por lo tanto, la subdivision de
las cuencas con las mismas caractersticas son necesarios para ponderar y obtener este
valor compuesto.

Figura 6.17: PLEDER, curva N


umero Compuesto

117
6.3. Calculos y Resultados Hidrologicos

La sumatoria de las areas tiene que ser igual al area de la cuenca. En la figura 6.17,
PLEDER presenta hasta 6 subdivisiones para calcular La Curva n
umero Compuesto.

En la presente aplicacion se usa el hidrograma unitario sintetico NRCS, cuyos datos son el
area de la cuenca y el tiempo de retardo que esta en funcion al tiempo de concentracion de
la cuenca. La Figura 6.18 muestra el calculo de tiempo de retardo, bajo dato o resultado
del tiempo de concentracion. El tiempo de concentracion se puede calcular mediante la
formula de Kirpich o tambien este valor lo puede asignar directamente el usuario. Por lo
tanto, cabe resaltar que el tiempo de concentracion viene a ser resultado, si es calculado
mediante la formula de Kirpich y por otro lado es dato si es asignado por el usuario.

Figura 6.18: PLEDER, calculo del tiempo de retardo

6.3.2. Par
ametro Precipitaci
on [P]

Corresponde a asignar el modelo meteorologico (Tormenta NRCS, IILA SENAMHI).

El modelo meteorologico elegido es la tormenta NRCS, tal como se muestra en la figura


6.19, donde la distribucion de tormenta es el tipo II en intervalos de una hora (60 minutos),
con un precipitacion maxima de 24 horas igual a 64.54 mm, calculados para un perodo
de retorno de 100 a
nos y ajustando a una distribucion probabilstica de Gumbel para un
95 % de probabilidad (Smirnov-Kolmogorov).

118
6.3. Calculos y Resultados Hidrologicos

Figura 6.19: PLEDER, modelo meteorologico NRCS

6.3.3. Par
ametro Tiempo [T]


Es el intervalo de tiempo para calcular lluvia escorrenta. Esta opcion indica el incremento
de tiempo para que el programa tenga que realizar los calculos cada 10 minutos seg
un la
figura 6.15.

El programa controla los posible errores de entrada de los datos ([U], [P] y [T]), especifi-
cando dentro de la consola del AutoCAD el tipo de error o el ingreso de dato incorrecto.

6.3.4. Hidrogramas de Salida

Mediante el boton aceptar y asignado el punto de referencia para los resultados, pro-
cedemos a calcular el hidrograma de salida y el caudal maximo de dise
no para los datos
ingresados. Las figuras 6.20, 6.21, 6.22 y 6.23 corresponden a los hidrogramas de salida
para los perodos de retorno 50, 100, 200 y 500 respectivamente.

Los resultados de las coordenadas del hidrograma para los distintos perodos de retorno
mencionados se adjunta en el apendice D.

119
6.3. Calculos y Resultados Hidrologicos

Figura 6.20: Hidrograma TR = 50 a


nos

Figura 6.21: Hidrograma TR = 100 a


nos

120
6.3. Calculos y Resultados Hidrologicos

Figura 6.22: Hidrograma TR = 200 a


nos

Figura 6.23: Hidrograma TR = 500 a


nos

121
6.4. Calculos y Resultados Hidraulicos

6.4. C
alculos y Resultados Hidr
aulicos

Esta no (QT R=100 = 340m3 /s), para


seccion corresponde a transitar el caudal de dise
determinar el perfil de la superficie libre de agua, los mismos en cada una de las secciones
transversales. En realidad el transito de caudales sera para los 4 perodos de retorno
considerados en la determinacion de los hidrogramas.

Cuadro 6.2: Caudales maximos para diferentes Perodos de Retorno


TR Caudal (m3 /s)
50 240.69
100 339.23
200 449.19
500 609.92

La batimetra del proyecto viene a ser el dato mas importante y primordial para esta
seccion; con ella representamos el proyecto fsico a escala normal en un proyecto digital y
a escala conveniente para realizar todos los calculos correspondientes. El proyecto cuenta
con una batimetra minuciosa con densos puntos topograficos y sobre todo dirigidos con
propiedad y conocimientos hidraulicos durante el levantamiento.

Figura 6.24: Planta Ro Huallaga

En la figura 6.24, muestra la planta del ro Huallaga con las 125 secciones transversales dis-
tribuidos cada 20 metros en 2480 metros lineales del cauce. La estacion 0 + 00 corresponde
al puente Acobamba y la estacion 2 + 480 al centro poblado Yanacocha.

122
6.4. Calculos y Resultados Hidraulicos

6.4.1. Secciones Transversales

Mediante la opcion de las secciones transversales, se ingresan los datos fsicos del proyec-
to, tales como las coordenadas de los vertices que lo conforman, lmites de las llanuras de
inundacion, longitudes izquierda, central y derecha, coeficientes de Manning y los coefi-
cientes de contraccion y expansion; todo ello para cada una de las secciones transversales
del cauce.

El programa PLEDER, presenta opciones graficas muy eficientes para crear las secciones
transversales a partir de polilneas, asignando los puntos de referencia tales como estacion,
elevacion y permitiendo calcular las coordenadas locales de cada uno de los vertices, tal
como se muestra en la figura 6.25.

Figura 6.25: PLEDER, secciones transversales

Quiza esta opcion de crear las secciones transversales, diferencia mucho de los programas
comerciales existentes en la actualidad, ya que estos programas dependen de otros para

123
6.4. Calculos y Resultados Hidraulicos

facilitar los datos que en este caso viene a ser los vertices locales de cada una de las
secciones transversales.

Figura 6.26: AutoCAD secciones transversales

Cada vertice es enumerado de izquierda a derecha, con el fin de almacenar en una ma-
triz ordenada, ademas elegir los lmites de inundacion izquierda derecha mediante la nu-
meracion de los vertices.

En la figura 6.25, la ventana presenta multiples opciones y utilitarios de enlace grafico


con el ambiente AutoCAD, tales como calcular las distancias automaticas, selector de
polilneas, puntos de referencia entre otros. As tambien, el boton Aplicar guarda los
parametros de la ventana actual, en la base de datos del objeto personalizado dentro del
AutoCAD. De esta manera se crea las 125 secciones transversales de la aplicacion, tal
como se muestra en los planos del apendice E.

6.4.2. Flujo Permanente

La ventana del grafico 6.27, muestra las opciones de los parametros de borde y la asig-
nacion del caudal de dise
no para transitar el flujo a traves de las secciones transversales

124
6.4. Calculos y Resultados Hidraulicos

descritas anteriormente. Para la aplicacion se analiza como flujo subcrtico, por la tanto
la opcion del tirante aguas abajo es habilitado.

Figura 6.27: PLEDER, calculo del flujo permanente

Los procedimiento para calcular los niveles de la superficie libre de agua se describe
mediante diagramas de flujo en el captulo 4, tanto para los flujo subcrticos y supercrticos.

6.4.3. Resultados y Perfil de superficie libre

Los resultados son presentados en ventanas independientes de programa AutoCAD y en el


mismo Autocad con opciones de exportacion a otros archivos. PLEDER, presenta dos tipos
de resultados, resultados numericos que son los parametros hidraulicos en cada uno de las
secciones transversales y los resultados graficos que viene a ser el perfil de la superficie
libre de agua a escala normal y los niveles en cada seccion transversal (figura 6.29). Para
el perfil, la cota de terreno es la cota mnima de la seccion transversal o en otros terminos
es cota de la lnea thalweg, por lo tanto para la construccion del perfil, la longitud del
canal central de las secciones es acumulado.

125
6.4. Calculos y Resultados Hidraulicos

Figura 6.28: PLEDER, resultados-parametros hidraulicos

Figura 6.29: Niveles de superficie libre en las secciones transversales

126
6.5. Calculos y Resultados de Socavaciones Generales

6.5. C
alculos 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
un la probabilidad de
gasto. Para la aplicacion se realizo las curva granulometricas de los materiales incluyendo
cantos rodados y guijarros, de los cuales se obtuvo como resultados los diametro medios
aproximadamente 150 mm y 180 mm.

Es importante mencionar que el programa PLEDER, habilita la ventana de la figura 6.30,


solo si existe el objeto personalizado de los niveles de la superficie libre de agua dentro
del AutoCAD, es decir, si el calculos de los niveles fueron ejecutados.

Figura 6.30: PLEDER, parametros socavacion general

Una vez completado estos datos, se puede calcular las socavaciones mediante el cono de la
figura 6.13 o equivalente al comando PLHSCC, cuyos resultados son graficos (lnea de la

127
6.5. Calculos y Resultados de Socavaciones Generales

nueva seccion transversal socavada) y tabulares (nuevos vertices de las secciones transver-
sales). Estos resultados son necesarios para estimar la profundidad de las cimentaciones
de las estructuras hidraulicas o estructuras de proteccion ante avenidas maximas, y siendo
mas especficos en la instalacion de gaviones y enrocados (riprap) representa la profundi-
dad del colchon reno y la profundidad de las u
nas respectivamente.

Figura 6.31: Socavaciones en las secciones transversales

128
Captulo 7

CONCLUSIONES Y
RECOMENDACIONES

7.1. Conclusiones

La investigacion desarrollada en esta tesis ha llegado a las siguientes conclusiones :

1. Se ha elaborado un programa (PLEDER) que permite calcular los componentes


hidrologicos, hidraulicos e hidraulica fluvial, en un ambiente totalmente organizado,
amigable y sobre todo grafico (AutoCAD).

2. Las caractersticas de la herramienta, permite disponer de diferentes comandos para


cada componente.

3. Importancia de la asignacion del N


umero de Curva, dependiente del tipo o las ca-
ractersticas de suelo.

4. Para emplear el metodo de la convolucion discreta, el factor tiempo o intervalo de


tiempo, selecciona los pulso de entrada y salida mediante interpolaciones lineales.
El cual es determinante y se exige el buen criterio de su eleccion.

129
7.1. Conclusiones

5. Las precipitaciones acumuladas seg


un la ecuacion regional IILA SENAMHI muestra
un incremento tipo exponencial, que facilita el procedimiento del bloque alterno
propuesto por Ven Te Chow.

6. En las tormentas NRCS (Tipo II), las precipitaciones acumuladas no se ajustan


con exito (R2 1) a ninguna funcion conocida, as se eleve el grado del polinomio
(aunque no siempre los resultados del ajuste son mejores a mayor grado polinomi-
co), lo que exige a realizar interpolaciones para obtener las ordenadas de diferentes
duraciones de tiempo.

dT Variaci
on del tiempo en el hidrograma.
7. Si C = dtVariacion del tiempo en el hietograma.
1, se obtiene los Pulsos de ingreso di-
rectamente si C = 1 o en forma acumulativa si C > 1. Si C 1, se interpolan las
precipitaciones totales, y se obtienen las precipitaciones en exceso, donde la canti-
dad de elementos o variacion de tiempo en el hietograma sera siempre igual a la
variacion del tiempo en el hidrograma (C = 1).

8. En todo Hidrograma Unitarios Sintetico, un factor importante es el tiempo de re-


tardo de la cuenca drenante, definido como el tiempo desde el centro de gravedad
del hietograma de lluvia hasta el pico del hidrograma.

9. En el Hidrograma Unitario Sintetico de Snyder, la mejor manera de emplear estas


ecuaciones, es deducir valores de Ct y Cp , a partir de los hidrogramas unitarios de
cuencas medidas (cuencas instrumentadas) de caractersticas similares a la cuenca
problema (cuenca no instrumentada).

10. Los perfiles de superficie libre de agua, determinan el dimensionamiento de las es-
tructuras hidraulicas de proteccion.

11. Las ecuaciones discretizadas para los calculos de los perfiles de la superficie libre de
agua, son ecuaciones no lineales, por lo tanto, se emplean tecnicas numericas tales

130
7.2. Recomendaciones

como el Metodo de la Secante (HECRAS), Newton Raphson (GSTAR), Metodo de


Biseccion (PLEDER) , entre otros.

12. La socavacion general en cauces naturales dependera mucho del tipo de material
que lo conforma en cada estacion del cauce, por lo general, se uniformiza en una
estacion.

13. Para calcular la socavacion general del cauce se necesita utilizar criterios prudentes,
ya que existe mucha incertidumbre involucrada en los modelos que se emplea.

7.2. Recomendaciones

1. Para componer artculos cientficos o la propia tesis, emplear programas de com-


posicion de textos tal como LATEX o similares, de modo que los textos presenten
alta calidad para publicaciones de todo tipo. Los documentos que producen tienen
una calidad inmejorable, equivalente a la obtenida con las mejores herramientas de
edicion profesionales.

2. Realizar libreras o clases para las distintas aplicaciones ingenieriles en el lenguaje


de programacion C++, as facilita los diversos procedimientos que en muchos casos
son repetitivos y de uso perenne.

3. Importancia en el empleo de la programacion y metodos numericos aplicados en


la ingeniera. De preferencia usar programas orientado a objetos, generando clases
abstractas de lo que uno quiere automatizar o controlar con un programa.

131
Bibliografa

[1] A. OSMAN AKAN. Open Channel Hydraulics. Elsevier Ltd, Oxford UK, 2006.

[2] FRANCISCO JAVIER APARACIO. Fundamentos de Hidrolola de Superficie.


Mimusa Noriega Editores Mexico,D.F., 2003.

[3] AUTODESK. ObjectARX Developers Guide. Autodesk Developer Center EEUU,


1999.

[4] JHON BIRD. Higher Engineering Mathematics. Elsevier Ltd, 2006.

LUIS SANCHEZ BRIBIESCA. Doce algoritmos para resolver problemas de


[5] JOSE
hidraulica. Universidad Nacional Autonoma de Mexico, Agosto 1978.

[6] GARY W. BRUNNER. Hec-Ras River Analysis System Users Manual. US Army
Corps of Engineers EEUU, 2001.

[7] JR C. R. WYLIE. Advanced Engineering Mathematics. McGraw-Hill, Inc. New york


USA, 1960.

[8] STEVEN C. CHAPRA RAYMOND P. CANALE. Metodos numericos para inge-


nieros. McGraw-Hill Mexico, 1999.

[9] HUBERT CHANSON. Hidraulica del Flujo en Canales Abiertos. McGraw-Hill In-
teramericana, S.A., 2002.

132
BIBLIOGRAFIA

[10] M. HANIF CHAUDHRY. Open - Channel Flow. Springer Science+Business Media,


LLC. New York, USA, 2008.

[11] CHOW, VENT T., MAIDMENT, D.R., and MAYS L. Hidrologa Aplicada. Mac
Graw Hill Interamericana S.A. Santafe de Bogota, 1994.

[12] VENT TE CHOW. Hidraulica de canales abiertos. Mac Graw Hill Interamericana
S.A. Colombia, 2000.


[13] JAIME SUAREZ DIAS. Control de erosion en zonas tropicales. Instituto de Inves-
tigaciones sobre Erosion y Deslizamientos-Ingeniera de suelos, Noviembre, 2001.


[14] ROSENDO CHAVEZ DIAS. Hidrologa para Ingenieros. Fondo Editorial de la Pon-
tificia Universidad. Lima Per
u, 1994.

[15] ANIL W. DATE. Introduction Computational Fluid Dynamics. Cambridge University


Press, 2005.

[16] RICHARD H. FRENCH. Hidraulica del Canales Abiertos. McGraw-Hill Interamerica


de Mexico, S.A. de C.V., 1988.

[17] F. M. HENDERSON. Open Channel Flow. Macmillan Publishing Co., Inc. New York
USA, 1966.

[18] CHARLES HIRSCH. Numerical Computation of Internal and External Flows. John
Wiley and Sons Ltd, 2007.

[19] IVOR HORTON. Beginning Visual C++ 2005. Wiley Publishing USA, 2006.

[20] JOEL ORE IWANAGA. Apuntes de clase hidroga general. Universidad Nacional
de San Cristobal de Huamanga, 2004.

[21] JOEL ORE IWANAGA. Apuntes de clase estructuras hidraulicas. Universidad Na-
cional de San Cristobal de Huamanga, Noviembre, 2006.

133
BIBLIOGRAFIA

[22] PIERRE Y. JULIEN. Erosion and Sedimentation. Cambrigde University Press. USA,
1995.

[23] PIERRE Y. JULIEN. River Mechanics. Cambrigde University Press. USA, 2002.

[24] TSUTOMU KAMBE. Elementary Fluid Mechanics. World Scientidic Publishing,


2007.

[25] JAAN KIUSALAAS. Numerical Methods in Engineering with Matlab. Cambridge


University Press, 2005.

[26] NICHOLAS A. SOLTER-SCOTT J. KLEPER. Professional C++. Wiley Publishing


USA, 2005.

[27] ERWIN KREYSZIG. Advanced Engineering Mathematics. John Wiley & Sons, Inc.
USA, 2006.

[28] CUI-LEUNG LU, ZHANG. A numerical analysis of free surface flow in curved
open channel with velocity-pressure-free-surface correction. Computation Mechan-
ics Springer Verlag, 2003.


[29] M. MORENA G. GRANDE G. FERRANDEZ M. VIDE, L. QUEROL. Uso de
modelos uni-y bidimensionales en llanuras de inundacion, aplicacion del ro tajo en
talavera de la reina. Ingeniera del Agua Vol 10, Marzo 2003.

[30] HERON MORALES MARCHENA. Matlab, Metodos numericos y visualizaci


on gr
a-
fica. Editorial Megabyte Per
u, 1999.

HESS. 3-d m
[31] ADRIAN ILINCA MARECELO REGGIO, ANDRE ultiple-level simu-
lation of free surface flows. Journal of Hydraulic Research, Vol 40, December, 2002.

[32] ANTONIO CRESPO MARTINEZ. Mecanica de Fluidos. Thomson Editores, 2006.

[33] RICHARD H. McCUEN. Hydrologic Analysis and Design. Person Education, 1998.

134
BIBLIOGRAFIA

[34] NATURAL RESOURSES CONSERVATION SERVICE (NRCS). Hydrology national


engineering hanbook, chapter 10, estimation of direct runoff from storm rainfall.
USDA-NRCS, July, 2004.

[35] JULIAN AGUIRRE PE. Hidraulica de Canales. CIDIAT. Merida, Venezuela, 1974.

RAMON
[36] JOSE TEMEZ

PELAEZ. Facetas del calculo hidrometeorologico y estads-
tico de maximos caudales. Revista de Obras P
ublicas, Febrero, 2003.

[37] VICTOR MIGUEL PONCE. Engineering Hydrology Principles and Practices. Pren-
tice Hall, 1989.


[38] CRISTIAN CASTRO PEREZ. Apuntes de clase programacion digital. Universidad
Nacional de San Cristobal de Huamanga, 2002.


[39] CRISTIAN CASTRO PEREZ. Apuntes de clase metodos numericos aplicados. Uni-
versidad Nacional de San Cristobal de Huamanga, Noviembre, 2003.

[40] JEFF PROSISE. Programming Windows with MFC. Microsoft Press USA, 1999.

[41] H. M. RAGHUNATH. Hydrology Principles Analysis Design. New Age International


Publishers, 2006.

[42] DAVID G. RHODES. Gradually varied flow solutions in newton raphson form. Jour-
nal of Irrigation and Drainage Engineering, July/August, 1998.

[43] LEO C. VAN RIJN. Principles of Sediment Transport in River Estuaries and Coastal
Seas. Aqua Publications. The Netherlands, 1993.

[44] DAVID HANSEN RIZWANUL BARL. Application of gradually-varied flow algo-


rithms to simulate buried streams. Journal of Hydraulic Research, Vol 40, April,
2002.

135
BIBLIOGRAFIA

[45] MICHAEL SCHAFER. Computational Engineering-Introduction to Numerical Meth-


ods. Springer-Verlag Berlin Heidelberg, 2006.


[46] DARLY B. SIMONS and FUAT SENTURK. Sediment Transport Technology. Water
Resources Publications. USA, 1976.

[47] BJARNE STROUSTRUP. The C++ Programming Language. Addisn Wesley USA,
1997.

[48] TERRY W. STURM. Open Channel Hydraulics. McGraw-Hill Books, 2001.

[49] K.T. TANG. Mathematical Methods for Engineers and Scientists. Springer-Verlag
Berlin Heidelberg. USA, 2007.

[50] JUAN P. MARTIN VIDE. Ingeniera de Ros. Alfa Omega Grupo Editor S.A. de
C.A. Mexico, 2003.

[51] FRANK M. WHITE. Mecanica de Fluidos. McGraw-Hill Interamericana de Espa


na,
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
endice A

HIDROLOGIA CODIGO
FUENTE
C++

EL componente Hidrologico se organiza en 10 libreras con m


ultiples funciones y 07 ven-
tanas graficas

137
Apendice A. HIDROLOGIA CODIGO
FUENTE C++

ARCHIVOS DE CABECERA:
PLEDERCurvaNumeroDlg.h

#pragma once
#include "resource.h"

// Cuadro de dilogo de CPLEDERCurvaNumeroDlg

class CPLEDERCurvaNumeroDlg : public CAdUiDialog


{
DECLARE_DYNAMIC(CPLEDERCurvaNumeroDlg)

public:
CPLEDERCurvaNumeroDlg(CWnd *pParent =NULL, HINSTANCE hInstance
=NULL); // Constructor estndar
virtual ~CPLEDERCurvaNumeroDlg();

// Datos del cuadro de dilogo


enum { IDD = IDD_HIDRO_PLCN };

//Declaramos variables del cuadro de dilogo.

// 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
Apendice A. HIDROLOGIA CODIGO
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 dilogo


virtual void onCALCLimpiar();
virtual void onCALCCalcularCNC();

DECLARE_MESSAGE_MAP()
};

PLEDERHidrogramaUnitariosDlg.h

#pragma once
#include "adui.h"
#include "resource.h"

// Cuadro de dilogo de CPLEDERHidrogramaUnitariosDlg

class CPLEDERHidrogramaUnitariosDlg : public CAdUiDialog


{
DECLARE_DYNAMIC(CPLEDERHidrogramaUnitariosDlg)

public:
CPLEDERHidrogramaUnitariosDlg(CWnd *pParent =NULL, HINSTANCE
hInstance =NULL); // Constructor estndar
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
Apendice A. HIDROLOGIA CODIGO
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 segn 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 segn 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 segn


NRCS.
float AbstraccionesHietogramaNRCS(int NP,int CN, float* Palt,
float* Pacum, float* Ia, float* Fa, float* PexcesoAcum, float*
Pexceso);

// Clculo los Pulsos de ingreso.

140
Apendice A. HIDROLOGIA CODIGO
FUENTE C++

float PulsosP(int NP, int DT, int dt, float* Pexceso, float*
Pulsos, int *nP);

// Clculos mediante la convolucin 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:

// Clculo de la escorrenta 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 distribucin de Tormentas segn el NRCS.


float TormentasNRCS(int Tormenta, float *TipoT, float Ndt);

// Datos Hidrograma Sinttico NRCS.


float HidrogramaSinteticoNRCS(float Tp, float qp,float *t, float
*q);

// Datos Hidrograma Sinttico 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
Apendice A. HIDROLOGIA CODIGO
FUENTE C++

float *P, // Lista de Pulsos.


*U, // Lista de Funcin respuesta al Pulso.
*Q; // Lista de Caudal de escorrentia directa
(SALIDA)

};
/*------------------------------------------------------------------*/

PLEDERHietogramaIilaSenamhiDlg.h

#pragma once

#include "resource.h"

// Cuadro de dilogo de CPLEDERIilaSenamhiDlg

class CPLEDERIilaSenamhiDlg : public CAdUiDialog


{
DECLARE_DYNAMIC(CPLEDERIilaSenamhiDlg)

public:
CPLEDERIilaSenamhiDlg(CWnd *pParent =NULL, HINSTANCE hInstance
=NULL); // Constructor estndar
virtual ~CPLEDERIilaSenamhiDlg();

// Datos del cuadro de dilogo


enum { IDD = IDD_HIDRO_IILA };

//Declaramos variables del cuadro de dilogo.

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
Apendice A. HIDROLOGIA CODIGO
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 dilogo de CPLEDERNRCSDlg

class CPLEDERNrcsDlg : public CAdUiDialog


{
DECLARE_DYNAMIC(CPLEDERNrcsDlg)

public:
CPLEDERNrcsDlg(CWnd *pParent =NULL, HINSTANCE hInstance =NULL);
// Constructor estndar
virtual ~CPLEDERNrcsDlg();

// Datos del cuadro de dilogo


enum { IDD = IDD_HIDRO_NRCS };

//Declaramos variables del cuadro de dilogo.

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
Apendice A. HIDROLOGIA CODIGO
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 dilogo de CPLEDERTiempoRetrasoDlg

class CPLEDERHUNRCSDlg : public CAdUiDialog


{
DECLARE_DYNAMIC(CPLEDERHUNRCSDlg)

public:
CPLEDERHUNRCSDlg(CWnd *pParent =NULL, HINSTANCE hInstance
=NULL); // Constructor estndar
virtual ~CPLEDERHUNRCSDlg();

// Datos del cuadro de dilogo


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
Apendice A. HIDROLOGIA CODIGO
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 clculos.


virtual void onCalcularTc();
virtual void onCalcularTlag();

DECLARE_MESSAGE_MAP()
};

PLEDERHUSnyderDlg.h
#pragma once
#include "resource.h"

// Cuadro de dilogo de CPLEDERHUSNYDERDlg

class CPLEDERHUSNYDERDlg : public CAdUiDialog


{
DECLARE_DYNAMIC(CPLEDERHUSNYDERDlg)

public:
CPLEDERHUSNYDERDlg(CWnd *pParent =NULL, HINSTANCE hInstance
=NULL); // Constructor estndar
virtual ~CPLEDERHUSNYDERDlg();

// Datos del cuadro de dilogo


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
Apendice A. HIDROLOGIA CODIGO
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 clculos.


virtual void onCalcularCtCp();
virtual void onMensajesCp();

DECLARE_MESSAGE_MAP()
};

PLEDERLluviaEscorrentiaDlg.h

#pragma once
#include "resource.h"

// Cuadro de dilogo de CPLEDERLluviaEscorrentiaDlg

146
Apendice A. HIDROLOGIA CODIGO
FUENTE C++

class CPLEDERLluviaEscorrentiaDlg : public CAdUiDialog


{
DECLARE_DYNAMIC(CPLEDERLluviaEscorrentiaDlg)

public:
CPLEDERLluviaEscorrentiaDlg(CWnd *pParent =NULL, HINSTANCE
hInstance =NULL); // Constructor estndar
virtual ~CPLEDERLluviaEscorrentiaDlg();

// Datos del cuadro de dilogo


enum { IDD = IDD_HIDRO_HPLEDER };

//Declaramos variables del cuadro de dilogo.

// 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 (Slo CAD)


CAcUiPickButton m_PickButton_AREA;
CAcUiPickButton m_PickButton_PPUNTO;

// Botones (Dialogo general)


CButton m_Button_HUS;

// Variables extras de clculos


int pNP, // Nmero de datos en la lista de precipitaciones.
Duracion; // Variacin 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
Apendice A. HIDROLOGIA CODIGO
FUENTE C++

bool computadoMM; // Boleano para verificar si se calcul metodos


meteorolgicos.
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 (Slo 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 dilogo


virtual void OnCALCCurvaNumero();
virtual void OnCALCHidrogramaUnitario();
virtual void OnCALCPrecipitaciones();

DECLARE_MESSAGE_MAP()

};

148
Apendice A. HIDROLOGIA CODIGO
FUENTE C++

ARCHIVOS Cpp:

PLEDERCurvaNumeroDlg.cpp

/*--------------------------------------------------------------------
PLEDERCurvaNumeroDlg.cpp: archivo de implementacin
Cuadro de dilogo de CPLEDERCurvaNumeroDlg -> Calcula el nmero 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
Apendice A. HIDROLOGIA CODIGO
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
Apendice A. HIDROLOGIA CODIGO
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 Nmero no vlida, \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 Nmero no vlida, \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
Apendice A. HIDROLOGIA CODIGO
FUENTE C++

{
::AfxMessageBox(_T("Curva Nmero no vlida, \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 Nmero no vlida, \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 Nmero no vlida, \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 Nmero no vlida, \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
Apendice A. HIDROLOGIA CODIGO
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);

//Clculo 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
Apendice A. HIDROLOGIA CODIGO
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 implementacin
Cuadro de dilogo 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
Apendice A. HIDROLOGIA CODIGO
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; //Nmero 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 asignacin 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
Apendice A. HIDROLOGIA CODIGO
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 asignacin 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
Apendice A. HIDROLOGIA CODIGO
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
Apendice A. HIDROLOGIA CODIGO
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 = Nmero de intervalos de tiempo.
a = Parmetro regional IILA.
b = Parmetro regional IILA.
k = Parmetro regional IILA.
n = Parmetro regional IILA.
dt = Duracin de la tormneta.
var = Variacin del tiempo.
Tr = Perodo de retorno en aos.
D = Lista de duracin 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 ningn error.

Propsito : Calcula las precipitaciones acumulas, incrementales y


alternas segn la ecuacin 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];
//Precipitacin Incremental

} //For i

for (i =1; i <= N; i++ )


{
if ( i<=N/2)

158
Apendice A. HIDROLOGIA CODIGO
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 = Precipitacin mxima 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 duracin o tiempo (min).
TipoT = Lista del tipo de distribucin (P/P24).
NPacum = Lista de Precipitaciones acumuladas
(mm).
NPincr = Lista de Precipitaciones incrementales
(mm).
RTNORM si no se produce ningn error.

Propsito : Calcula las precipitaciones acumulas, incrementales


(Hietogramas) segn 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;
//Duracin en minutos
NPacum[i+1]=P24*TipoT[i+1];

159
Apendice A. HIDROLOGIA CODIGO
FUENTE C++

NPincr[i+1]=NPacum[i+1]-NPacum[i];
//Precipitacin 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 = Nmero de datos en la lista de
precipitaciones.
Palt = Precipitaciones alternas o acumuladas
(mm).
CN = Curva Nmero

Salida : Pacum = Lista de Precipitaciones acumuladas


(mm).
Ia = Lista de Abstracciones Iniciales segn
NRCS (mm).
Fa = Lista de Abstracciones continuas segn
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 ningn error.

Propsito : Calcula las abstracciones segn el NRCS y las


precipitaciones en exceso o PULSOS de ingreso.
--------------------------------------------------------------------*/

{
int i;
float Iai, S;

S = (25400.0-254.0*CN)/CN; // Retencin Potencial mxima (mm)

Iai = 0.2*S; // Abstraccin 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 precipitacin (mm)
Pacum[i] = Pacum[i-1] + Palt[i];

// Lista de la abstracin Inicial (mm)


if (Pacum[i]<Iai)
{
Ia[i]=Pacum[i];
}

else
{
Ia[i]=Iai;
}

160
Apendice A. HIDROLOGIA CODIGO
FUENTE C++

//Lista de la abstracin 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 precipitacin acumulada (mm)


PexcesoAcum[i]= Pacum[i]-(Ia[i]+Fa[i]);

//Lista de exceso de precipitacin (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 = Nmero de datos en la lista de
precipitaciones.
DT = Variacin del tiempo para interpolar
los pulsos.
dt = Variacin del tiempo de las
precipitaciones en exceso.
Pexceso = Lista de Exceso de lluvia (mm) o PULSOS
(incluyen ceros).

Salida : Pulsos = Lista de Pulso Precipitacin Efectiva


-> exceso de lluvia.
nP = Nmero de pulsos.
RTNORM si no se produce ningn error.
Propsito : Calcula los pulsos directos de entrada a partir de las
precipitaciones en exceso (Pexceso -> dato) realizando
interpolaciones segn el intervalo de tiempo asignado. C -> es la
relacin 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, // Relacin de variacin 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
Apendice A. HIDROLOGIA CODIGO
FUENTE C++

}// for j

Pulsos[i]=PulsoSum;

k++;
//acutPrintf(_T("\nPulsos[%d]: %0.5f"),i, Pulsos[i]);
cont++; // Contador del nmero 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 Precipitacin Efectiva
-> exceso de lluvia.
U = Lista de la funcin respuesta a un
pulso (HU) o los caudales por unidad de
precipitacin efectiva del Hidrograma
Unitario
Salida : Q = Lista de Caudal de escorrentia directa
(SALIDA)
RTNORM si no se produce ningn error.
Propsito : Calcula los caudales de escorrenta directa mediante en
mtodo de convolucin discreta de la ecuacin 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
Apendice A. HIDROLOGIA CODIGO
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 ningn error.
RTERROR en otro caso.
Propsito : Calcula la escorrenta directa a partir del Hidrograma
Unitario y pusos o escorrentia directa
--------------------------------------------------------------------*/
{
// Verificar los argumentos
if (!pPrimerHU)
{
acdbFail(_T("\nPuntero Nulo de la importacin"));
return RTERROR;
}

// Conteo de los datos importados


int nU = 0, // Nmero de ordenadas de los U.
nP = 0; // Nmero 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
Apendice A. HIDROLOGIA CODIGO
FUENTE C++

{
nP++;

}
}
int nQ = nP+nU-1;

//acutPrintf(_T("\n NU: %d, NP: %d"), nU, nP);

P = new float[nP+1];
U = new float[nU+1];
Q = new float[nQ+1];

// Obtencin 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 nmeros de Vrtices 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 Convolucin 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 vrtices de las
ordenadas del H.U.
Salida : RTNORM si no se produce ningn error.
RTERROR en otro caso.
Propsito : Importar las ordenadas del Hidrograma Unitario, a partir
de un archivo. Guarda los datos en el Buffer
HidrogramaUnitarioBufer, para luego llamar desde cualquier funcin.
-------------------------------------------------------------------*/
{
std::ifstream infile;
char *buffer = NULL;
char *token = NULL;

164
Apendice A. HIDROLOGIA CODIGO
FUENTE C++

char seps[] = PUNFILESEP;


int n;
long np = 0;
double x=0, y = 0;

if (!pNombreArchivo)
{
acdbFail(_T("\nArgumento de funcin no vlido
[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 asignacin de memoria [Importar
HU][buffer]."));
return RTERROR;
}

// tomar primero el nmero 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
Apendice A. HIDROLOGIA CODIGO
FUENTE C++

// crear el buffer y aadir el primer Vrtice como puntero


try
{
pPrimerHU = new HidrogramaUnitarioBufer();
}

catch(const std::bad_alloc&)
{
acedRestoreStatusBar();
acdbFail(_T("\nError de asignacin de memoria [Importar
HU][pPrimerHU]."));
return RTERROR;
}

HidrogramaUnitarioBufer *nHU, *nbprevious = pPrimerHU;

// recorrer el fichero
while (!infile.eof())
{
// leer una lnea 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
vlido [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
vlido -n- [Importar HU]"));
return RTERROR;
}

x = atof(token);

// PULSOS
token = ::strtok(NULL, seps);
if (!token)
{

166
Apendice A. HIDROLOGIA CODIGO
FUENTE C++

*NumeroVertHU = np;
infile.close();
acad_free(buffer);
acedRestoreStatusBar();
acdbFail(_T("\nFichero de Hidrograma Unitario No
vlido -n- [Importar HU]"));
return RTERROR;
}

y = atof(token);
int contador = 1;

// aadir los vrtices de las secciones transv. al buffer


try
{
nHU = new HidrogramaUnitarioBufer(n, x, y);
}

catch(const std::bad_alloc&)
{
LiberarBufferHidrogramaUnitario();
acedRestoreStatusBar();
acdbFail(_T("\nError de asignacin 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; //Nmero de vrtices 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 ningn error.
RTERROR en otro caso.
Propsito : Retorna la tormenta elegida
-------------------------------------------------------------------*/

167
Apendice A. HIDROLOGIA CODIGO
FUENTE C++

{
// Distribucin 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};

// Distribucin 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
Apendice A. HIDROLOGIA CODIGO
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};

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

// Distribucin 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
Apendice A. HIDROLOGIA CODIGO
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; // Variacin 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
Apendice A. HIDROLOGIA CODIGO
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 ningn error.
RTERROR en otro caso.
Propsito : 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 ningn error.
RTERROR en otro caso.
Propsito : 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
Apendice A. HIDROLOGIA CODIGO
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 : Vaco.
Salida : Vaco.
Propsito : Libera el buffer en ristra HidrogramaUnitarioBufer al que
apunta el miembro pPrimerHU. Llamar a esta funcin para liberar
el buffer con las ordenasas del HU , obtenidos mediante una llamada a
la funcin ImportarHidrogramaUnitario().
--------------------------------------------------------------------*/
{
if (!pPrimerHU)
return;

HidrogramaUnitarioBufer *nHU = pPrimerHU;


HidrogramaUnitarioBufer *Siguiente = NULL;

// liberar la ristra
while (Siguiente = nHU->Siguiente)

172
Apendice A. HIDROLOGIA CODIGO
FUENTE C++

{
delete nHU;
nHU = Siguiente;
}

delete nHU;

pPrimerHU = NULL;
}

PLEDERHietogramaIilaSenamhiDlg.cpp

/*--------------------------------------------------------------------
PLEDERIilaSenamhiDlg.cpp: archivo de implementacin
Cuadro de dilogo CPLEDERIilaSenamhiDlg -> para obtener Hietogramas
mediante el mtodo 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
Apendice A. HIDROLOGIA CODIGO
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
Apendice A. HIDROLOGIA CODIGO
FUENTE C++

return TRUE;
}

void CPLEDERIilaSenamhiDlg::OnKillfocusEdit_a()
{
m_Edit_a.Convert();
if (!m_Edit_a.Validate())
{
::AfxMessageBox(_T("Entrada no vlida, 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 vlida, 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 vlida, 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 vlida, rango = 1 @ 24"));

175
Apendice A. HIDROLOGIA CODIGO
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 vlida, 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 dilogo
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 dilogo)
// 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
Apendice A. HIDROLOGIA CODIGO
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 implementacin
Cuadro de dilogo CPLEDERNrcsDlg -> para obtener Hietogramas
mediante el mtodo 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
Apendice A. HIDROLOGIA CODIGO
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 vlida, 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
Apendice A. HIDROLOGIA CODIGO
FUENTE C++

//AcAxDocLock docLock;

CAcModuleResourceOverride resourceOverride;
// Esconde el dilogo
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 dilogo)
// 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 posisin


del combo Tormenta

CDialog::OnOK();

PLEDERHUNRCSDlg.cpp

// PLEDERHUNRCSDlg.cpp: archivo de implementacin


//

#include "stdafx.h"
#include "PLEDERHUNRCSDlg.h"

// Cuadro de dilogo de PLEDERHUNRCSDlg

179
Apendice A. HIDROLOGIA CODIGO
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
Apendice A. HIDROLOGIA CODIGO
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 Concentracin


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 Concentracin


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
Apendice A. HIDROLOGIA CODIGO
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
Apendice A. HIDROLOGIA CODIGO
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 dilogo
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 dilogo
CompleteEditorCommand();

183
Apendice A. HIDROLOGIA CODIGO
FUENTE C++

AcDbPolyline *pPolyline = (AcDbPolyline*)pEnt;

// chequear si la Polyline tiene elevacin cero


if (pPolyline->elevation() != 0)
{
pPolyline->close();
CompleteEditorCommand();
acutPrintf(_T("\nLa polyline no tiene elevacin 0."));
}

unsigned int numVerts;

// Tomar el nmero de vrtices de la polyline


numVerts = pPolyline->numVerts();

if (numVerts <= 2)
{
pPolyline->close();
CompleteEditorCommand();
return acdbFail(_T("\nPLEDER: !ERROR!\nPolyline no vlida
"));
}

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 vrtices 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 dilogo
BeginEditorCommand();

ads_point p1, p2;

//Coge el Primer Punto P1


if (acedGetPoint (NULL, _T("\nIngrese el primer Punto [cota
menor]"), p1) != RTNORM )
{

184
Apendice A. HIDROLOGIA CODIGO
FUENTE C++

acutPrintf(_T("\nPLEDER: !ERROR!\nal ingresar el Punto"));


// si no cancela el comando(incluyendo el dilogo)
//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 dilogo)


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

// Clculo del tiempo de concentracin 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
Apendice A. HIDROLOGIA CODIGO
FUENTE C++

L = _wtof(m_long);
S = _wtof(m_pend);

//Clculo del tiempo de concentracin


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

//Clculo del tiempo de concentracin


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 implementacin


//

#include "stdafx.h"
#include "PLEDERHUSnyderDlg.h"

// Cuadro de dilogo 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
Apendice A. HIDROLOGIA CODIGO
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
Apendice A. HIDROLOGIA CODIGO
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
Apendice A. HIDROLOGIA CODIGO
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 Vlido, \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
Apendice A. HIDROLOGIA CODIGO
FUENTE C++

m_Edit_Cp.SetWindowText(str);

// Clculo del tiempo de concentracin 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
Apendice A. HIDROLOGIA CODIGO
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 Vlido, \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
Apendice A. HIDROLOGIA CODIGO
FUENTE C++

if ( Cp < 0.1 | Cp > 1 )


{
::AfxMessageBox(_T("Verifique el Coeficiente Cp, \nrango =
0.1 @ 1"));
}

PLEDERLluviaEscorrentiaDlg.cpp

/*--------------------------------------------------------------------
PLEDERLluviaEscorrentiaDlg.cpp: archivo de implementacin
Cuadro de dilogo CPLEDERLluviaEscorrentiaDlg -> Calcula la
transformacin de la lluvia escorrenta (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
Apendice A. HIDROLOGIA CODIGO
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 (Slo CAD)


DDX_Control(pDX, IDC_BUTTON_area, m_PickButton_AREA);
DDX_Control(pDX, IDC_BUTTON_PPunto, m_PickButton_PPUNTO);

// Botones (Dilogo)
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
Apendice A. HIDROLOGIA CODIGO
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 vlida, 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 dilogo
BeginEditorCommand();

int rc;

194
Apendice A. HIDROLOGIA CODIGO
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 dilogo
CompleteEditorCommand();

AcDbPolyline *pPolyline = (AcDbPolyline*)pEnt;

pPolyline->getArea(area);
pPolyline->close();

m_area.Format(_T("%g"),area/1000000.0);//Conversin a km2

m_Edit_AREA.SetWindowText(m_area);
}

void CPLEDERLluviaEscorrentiaDlg::OnButtonPPUNTO()
{
//Clase que habilita CAD
//AcAxDocLock docLock;

CAcModuleResourceOverride resourceOverride;
// Esconde el dilogo
BeginEditorCommand();

ads_point p1;

195
Apendice A. HIDROLOGIA CODIGO
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 dilogo)
// 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 dilogos
CPLEDERCurvaNumeroDlg
dlgCNC(CWnd::FromHandle(adsw_acadMainWnd()));
if (dlgCNC.DoModal() != IDOK)
{
acutPrintf(_T("\nPLEDER: Se Cancel la Operacin"));
return;
}
m_Edit_CN.SetWindowText(dlgCNC.m_cnc);

void CPLEDERLluviaEscorrentiaDlg::OnCALCHidrogramaUnitario()
{
m_hus = m_Combo_HUS.GetCurSel(); // Coge la posicin del combo
hus

switch (m_hus)
{
case 0: // HUS NRCS
{
//Declaracion de Objetos dilogos
CPLEDERHUNRCSDlg
dlgHUNRCS(CWnd::FromHandle(adsw_acadMainWnd()));
if (dlgHUNRCS.DoModal() != IDOK)
{
acutPrintf(_T("\nPLEDER: Se Cancel la
Operacin[HUS NRCS]"));
return;
}

Tretardo = _wtof(dlgHUNRCS.m_tlag1);
computadoHU = true;

break;
}

196
Apendice A. HIDROLOGIA CODIGO
FUENTE C++

case 1: // HUS Snyder


{
//Declaracion de Objetos dilogos
CPLEDERHUSNYDERDlg
dlgHUSN(CWnd::FromHandle(adsw_acadMainWnd()));
if (dlgHUSN.DoModal() != IDOK)
{
acutPrintf(_T("\nPLEDER: Se Cancel la
Operacin[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 posicin 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
Operacin"));
return;
}
// Variables Hietograma NRCS
float P24, // Precipitacin mxima 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 dilogo IILA

P24 = _wtof(dlgNRCS.m_P24);
Ndt = _wtof(dlgNRCS.m_Ndt);
Tormenta =dlgNRCS.m_Tormenta;
PX =_wtof(dlgNRCS.m_NPX);

197
Apendice A. HIDROLOGIA CODIGO
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 duracin o
tiempo (min).
float *TipoT = new float[241];// Lista de la
distribucin 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 distribucin 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]; //
Precipitacin alterna
PaltAcum[i+1] = PaltAcum[i]+ NPincr[i+1]; //
Precipitacin alterna acumulada
}// For i

pNP = 24/(Ndt/60); // nmero 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
Operacin"));
return;
}

//Variables Parmetros regionales

198
Apendice A. HIDROLOGIA CODIGO
FUENTE C++

float a, //Parmetro regional


k, //Parmetro regional
b, //Parmetro regional: 0.5 horas Costa
//: 0.4 horas Sierra
//: 0.2 horas Costa Norte y selava
n, //Parmetro regional
dt, //Duracin de la lluvia (hr)
var, //Variacin (min)
Tr, //Periodo de retorno (aos)
PX, //Punto de referencia X.
PY; //Punto de referencia Y.
//Coge las variables del dilogo 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; // Nmero de intervalos de tiempo.

float *D= new float[N+1];// Lista de duracin 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]; // Precipitacin alterna acumulada

}// For i

pNP = N;// nmero de elementos de la lista de


precipitaciones
Duracion = var;

computadoMM = true;

199
Apendice A. HIDROLOGIA CODIGO
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 posisin 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
endice B


HIDRAULICA
CODIGO FUENTE
C++

EL componente Hidraulico se organiza en 09 libreras con m


ultiples funciones y 03 ven-
tanas graficas

201

Apendice B. HIDRAULICA
CODIGO FUENTE C++

ARCHIVOS DE CABECERA:
PLEDERFlujoPermanente.h
#pragma once

//class polilineabuffer;
class CrossSectionsBufer;
class FGVResultadosBufer;

class CPLEDERFlujoPermanente
{
public:
CPLEDERFlujoPermanente(void);
~CPLEDERFlujoPermanente(void);

public:

//Clculo del Flujo G. V. en estado subrtico.


int FGVFlujoSubcritico(float Q, float h);

//Clculo del Flujo G. V. en estado supercrtico.


int FGVFlujoSupercritico(float Q, float h);

// Clculo mediante el mtodo de la Biseccin


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 correcin 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 prdida de friccin en el tramo i-i+1 (hf12)


int FGVGetFrictionLosshf(double dX, double Qi1, double Qi,
double Ki, double Ki1, double *hfi12);

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

Apendice B. HIDRAULICA
CODIGO 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; //
Mtodo para calcular la pendiente de friccin
float m_htexto;
bool computado;

public:
//FGVResultadosBufer* m_theFirstR;

};

PLEDERFlujoPermanenteDlg.h

#pragma once
#include "resource.h"

// Cuadro de dilogo de CPLEDERFlujoPermanenteDlg

class CPLEDERFlujoPermanenteDlg : public CAdUiDialog


{
DECLARE_DYNAMIC(CPLEDERFlujoPermanenteDlg)

public:
CPLEDERFlujoPermanenteDlg(CWnd* pParent = NULL); //
Constructor estndar
virtual ~CPLEDERFlujoPermanenteDlg();

// Datos del cuadro de dilogo


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

Apendice B. HIDRAULICA
CODIGO 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 especfico dimetro medio del
material de fondo.
};

// Estructura para datos Socavaciones hidrulicas.


struct Socavacion
{
int nV; // Nmero de vrtices calculados.
double IdST, // Id
Zs, // Cota Tirante.
At, // Area Total.
Pt, // Permetro Total.
Q; // Descarga del flujo.

AcGePoint3d GVerticeFlow[MAX_VERTICES]; // Vrtices de la


seccin hidrulica (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 correccin.
ALF, // Area llanura Izquierda.
AMC, // Area Canal central.
ARF, // Area llanura derecha.
PLF, // Permetro llanura izquierdo.
PMC, // Permetro canal central.

204

Apendice B. HIDRAULICA
CODIGO FUENTE C++

PRF, // Permetro llanura derecho


KLF, // Conductividad llanura izquierdo.
KMC, // Conductividad canal central.
KRF, // Conductividad llanura derecho
Q, // Descarga del flujo.
hf12, // Prdida por firccin.
hc12, // Prdida local.
TopW; // Espejo de Agua.

};

// Estructura para las secciones transversales


struct Vertex
{
double HminG, // Vrtice mnimo global.
HminL; // Vrtice mnimo Local.

double IdST; // ID seccin transversal


long nVST; // Nmero de vrtices de la seccin
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 contraccin.
CE; // Coeficiente de expansin.

long BL, // Lmite banco izquierdo.


BR; // Lmite 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


vrtices locales.
double m_X1, // Distancia de referencia en X.
m_Y1, // Cota de referencia en Y.
m_HminG, // Vrtice mnimo global.
m_HminL; // Vrtice mnimo Local.

205

Apendice B. HIDRAULICA
CODIGO FUENTE C++

double m_IdST; // ID seccin transversal


long m_nVST; // Nmero de vrtices de la
seccin 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 contraccin.
m_CE; // Coeficiente de expansin.

long m_BL, // Lmite banco izquierdo.


m_BR; // Lmite banco derecho.

AcGePoint3d m_GlobalVertice[MAX_VERTICES]; // Vrtices de las


secciones transversales globales
AcGePoint3d m_LocalVertice[MAX_VERTICES]; // Vrtices 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

// Parmetros para socavacin


int m_Material, // Tipo de material, Cohesivo = 0,
No Cohesivo = 1.
m_CoefProb; // Coeficiente de probabilidad de gasto.

double m_CoefMaterial; // Peso especfico dimetro medio del


material de fondo.
double m_IdST; // ID seccin 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

Apendice B. HIDRAULICA
CODIGO 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 correccin.
m_ALF, // Area llanura Izquierda.
m_AMC, // Area Canal central.
m_ARF, // Area llanura derecha.
m_PLF, // Permetro llanura izquierdo.
m_PMC, // Permetro canal central.
m_PRF, // Permetro llanura derecho
m_KLF, // Conductividad llanura izquierdo.
m_KMC, // Conductividad canal central.
m_KRF, // Conductividad llanura derecho
m_Q, // Descarga del flujo.
m_hf12, // Prdida por firccin.
m_hc12, // Prdida local.
m_TopW, // Espejo de Agua.
m_LMC; // Longitud del canal central.

AcGePoint3d m_ResultVertice[MAX_VERTICES]; // Vrtices 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;
// Nmero de secciones
double CoordX, CoordY , manning; // Cordenadas X y Y, manning
};

207

Apendice B. HIDRAULICA
CODIGO 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 Tamao de buffer de lectura
lneas 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 Nmero de Vrtices 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

Apendice B. HIDRAULICA
CODIGO 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 nmeros de vrtices para cada Seccin Transversal.


int NumeroVerticesCadaST(float *V, int n, int nST, float
*nVert);

// Calcula los Vrtices Mximos y Mnimos.


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 Permetro.
int AreaPerimetro(int inicio, int fin, float CotaTirante, float
*CX, float *CY, double *Area, double *Perimetro);

209

Apendice B. HIDRAULICA
CODIGO FUENTE C++

// Calcula el Area , Permetro, Derivada del Area y Derivada del


Permetro.
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 dilogo


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

Apendice B. HIDRAULICA
CODIGO 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 nmero ST.


int GetLastNumberCrossSections(long *nlast);

// Contabiliza el nmero 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

Apendice B. HIDRAULICA
CODIGO 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 vrtice mnino


int GetMinVertice(double *VerticeY, long nVert, double *Hmin);

// Obtener las reas-permetros laterales y rea-permetro


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 dilogo de CPLEDERSeccionesTransversalesDlg

class CPLEDERSeccionesTransversalesDlg : public CAdUiDialog


{
DECLARE_DYNAMIC(CPLEDERSeccionesTransversalesDlg)

public:
static BOOL CALLBACK ItemdataProc(DWORD dwData, LPARAM lParam);
CPLEDERSeccionesTransversalesDlg(CWnd* pParent = NULL); //
Constructor estndar
virtual ~CPLEDERSeccionesTransversalesDlg();

// Datos del cuadro de dilogo


enum { IDD = IDD_HIDRA_ST };

// DAtos Tabla
CReportCtrl m_wndList;
BOOL m_bFullRow;
BOOL m_bGridLines;

212

Apendice B. HIDRAULICA
CODIGO 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 (Slo 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

Apendice B. HIDRAULICA
CODIGO FUENTE C++

afx_msg void OnKillfocusEdit_CE();

// Combo Box (Cuando existan cambios en el combo)


afx_msg void OnKillfocusComboST();

// Botones (Slo 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 Socavacin
Adesk::Int32 m_Material, // Tipo de material, Cohesivo
= 0, No Cohesivo = 1.
m_CoefProb; // Ubicacin en la lista (combo)
coeficiente de probabilidad de gasto.
double m_CoefMaterial; // Peso especfico dimetro medio
del material de fondo.

DECLARE_MESSAGE_MAP()

};

/*------------------------------------------------------------------*/

// Cuadro de dilogo de CPLEDERST1Dlg

class CPLEDERST1Dlg : public CDialog


{
DECLARE_DYNAMIC(CPLEDERST1Dlg)

public:
CPLEDERST1Dlg(CWnd* pParent = NULL); // Constructor estndar
virtual ~CPLEDERST1Dlg();

// Datos del cuadro de dilogo


enum { IDD = IDD_HIDRA_NST };

// Cajas de texto
CAcUiNumericEdit m_Edit_NST;

214

Apendice B. HIDRAULICA
CODIGO FUENTE C++

CString m_NST;
protected:
virtual void DoDataExchange(CDataExchange* pDX); //
Compatibilidad con DDX/DDV

public:
afx_msg void OnBnClickedOk();

DECLARE_MESSAGE_MAP()
};

215

Apendice B. HIDRAULICA
CODIGO 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, mtodo de la media aritmtica.
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 ningn error.


RTERROR en otro caso.
Propsito : Calcula los miveles de la superficie libre mediante el
fluijo subcrtico. Observacin: Los resultado los alamceno en una
matriz cuya notacin 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

Apendice B. HIDRAULICA
CODIGO FUENTE C++

AcGePoint3d Vertex;
AcGePoint2dArray Poligon; // Poligono de la S.T.

// Clculos en la primera seccin transversal (Dowstream)


Qi = Q;

for (i = 0; i < (m_pSections + m_Sections_len-1)->nVST ; i++)


{
// Vrtices
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);

// Clculo de K laterales y central


FGVGetConveyanceK(ALF, AMC, ARF, PLF, PMC, PRF,nL, nC, nR, &KLF,
&KMC, &KRF , &Ki);

// Clculo del Coeficiente de Correccin (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; // Prdida por firccin.
RHidraulicos[14]= 0.0; // Prdida local.
RHidraulicos[15]= TopWith; // Espejo del Agua

LC = (m_pSections + m_Sections_len-1)->LC;

217

Apendice B. HIDRAULICA
CODIGO 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 asignacin de memoria."));
return RTERROR;
}

AcDbObjectId ID;

// aadirla a la base de datos de AutoCAD


if
(RecursosFGV.AadirEntidadBlockTableRecord((AcDbEntity*)pResulta
dos, ID) != Acad::eOk)
{
if (pResultados)
{
delete pResultados;
}

acdbFail(_T("\nError al aadir la entidad a la Base de


Datos [AadirEntidadBlockTableRecord]."));
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 Seccin transversal N:
%0.3f"),(m_pSections + j)->IdST);
for (i = 0; i < (m_pSections + j)->nVST; i++)
{
// Vrtices
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 mnima.


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

Apendice B. HIDRAULICA
CODIGO 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 vrtices 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 asignacin de memoria."));
return RTERROR;
}

AcDbObjectId ID;

// aadirla a la base de datos de AutoCAD


if
(RecursosFGV.AadirEntidadBlockTableRecord((AcDbEntity*)pRe
sultados, ID) != Acad::eOk)
{
if (pResultados)
{
delete pResultados;
}

acdbFail(_T("\nError al aadir la entidad a la Base


de Datos [AadirEntidadBlockTableRecord]."));
return RTERROR;
}

} // for j

219

Apendice B. HIDRAULICA
CODIGO 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 ningn error.


RTERROR en otro caso.
Propsito : Calcula los miveles de la superficie libre mediante el
fluijo supercrtico. Observacin: Los resultado los alamceno en una
matriz cuya notacin 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.

// Clculos en la primera seccin transversal (Upstream)


Qi = Q;

for (i = 0; i < (m_pSections + m_Sections_len-1)->nVST ; i++)


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

Apendice B. HIDRAULICA
CODIGO FUENTE C++

Zsi = m_pSections->HminL +h; // Cota del tirante


CST.GetAreaPerimeter(Zsi, Vertices, BL, BR, &ALF, &AMC, &ARF,
&PLF, &PMC, &PRF, &Ai, &Pi);

// Clculo de K laterales y central


FGVGetConveyanceK(ALF, AMC, ARF, PLF, PMC, PRF,nL, nC, nR, &KLF,
&KMC, &KRF , &Ki);

// Clculo del Coeficiente de Correccin (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; // Prdida por firccin.
RHidraulicos[14]= 0.0; // Prdida 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 asignacin de memoria."));
return RTERROR;
}

AcDbObjectId ID;

// aadirla a la base de datos de AutoCAD

221

Apendice B. HIDRAULICA
CODIGO FUENTE C++

if
(RecursosFGV.AadirEntidadBlockTableRecord((AcDbEntity*)pResultados,
ID) != Acad::eOk)
{
if (pResultados)
{
delete pResultados;
}

acdbFail(_T("\nError al aadir la entidad a la Base de


Datos [AadirEntidadBlockTableRecord]."));
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 Seccin transversal N:
%0.3f"),(m_pSections + j)->IdST);
for (i = 0; i < (m_pSections + j)->nVST; i++)
{
// Vrtices
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 mnima.


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 vrtices de la secciones transversal


calculado

222

Apendice B. HIDRAULICA
CODIGO 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 asignacin de memoria."));
return RTERROR;
}

AcDbObjectId ID;

// aadirla a la base de datos de AutoCAD


if
(RecursosFGV.AadirEntidadBlockTableRecord((AcDbEntity*)pRe
sultados, ID) != Acad::eOk)
{
if (pResultados)
{
delete pResultados;
}

acdbFail(_T("\nError al aadir la entidad a la Base


de Datos [AadirEntidadBlockTableRecord]."));
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 mnimo
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

Apendice B. HIDRAULICA
CODIGO 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.
Propsito : Calcula El nivel del agua mediante el mtodo de
Biseccin.
--------------------------------------------------------------------*/
{
double Zmiddle, // Cota promedio entre ambos cotas
estremas de ingreso.
Flower, // Cota inferior (siempre inicia
desde la cota mnima o thalweg)
Fmiddle, // Funcin que se evala con la cota
promedio.
Fupper, // Funcin que se evala con la cota
superior

hfi12, // Prdida por friccin


hci12, // Prdida 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 verificacin
if (abs(Fmiddle) < TOL)
{
Zsi1 = Zmiddle;

224

Apendice B. HIDRAULICA
CODIGO FUENTE C++

NOencontrado = false;
acutPrintf(_T("\nLo encontre en 01, en %d
iteraciones"), cont);
}

// Preparando para la siguiente iteracin


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 verificacin
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 = Permetro Left Floodplain.
PMC = Permetro Main Channel.
PRF = Permetro Right Floodplain.
nLF = Manning Left.

225

Apendice B. HIDRAULICA
CODIGO 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 ningn error.
RTERROR en otro caso.
Propsito : Calcula la conductividad
--------------------------------------------------------------------*/
{
double exp53 = 5.0/3.0, exp23 = 2.0/3.0;

*KLF = 0.0; *KMC = 0.0; *KRF = 0.0;

// Clculo de la Conductividad KLF (Izquierdo)


if (PLF != 0.0)
{
*KLF = pow(ALF,exp53)/ (nLF * pow(PLF,exp23));
}

// Clculo de la Conductividad KMC (Principal)


if (PMC != 0.0)
{
*KMC = pow(AMC,exp53)/ (nMC * pow(PMC,exp23));
}

// Clculo 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 decorrecin Beta (ver la teora)


RTNORM si no se produce ningn error.
RTERROR en otro caso.
Propsito : Calcula El factor de correcin Beta
--------------------------------------------------------------------*/

{
double BetaLF = 0.0, BetaMC = 0.0, BetaRF = 0.0,
Ai = ALF + AMC + ARF,
Ki = KLF + KMC + KRF;

226

Apendice B. HIDRAULICA
CODIGO 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 seccin
transversal
RTNORM si no se produce ningn error.
RTERROR en otro caso.
Propsito : Calcula la distancia ponderada entre una seccin
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 estacin i+1.
Qi = Descarga del flujo en la estacin i.

227

Apendice B. HIDRAULICA
CODIGO FUENTE C++

Ki1 = Factor de conductividad en la estacin i+1.


Ki = Factor de conductividad en la estacin i.
Salida : hfi12 = La prdida de friccin calculado para este
tramo.
RTNORM si no se produce ningn error.
RTERROR en otro caso.
Propsito : Calcula la prdida de friccin en el tramo i-i+1 (hf12)

--------------------------------------------------------------------*/
{

switch (m_MetodoSf)
{
case 0: // Media Aritmtica.
{
*hfi12 = 0.5*dX*( Qi1*abs(Qi1)/(Ki1*Ki1)
+ Qi*abs(Qi)/(Ki*Ki));
break;
}

case 1: // Media Armnica.


{
*hfi12 = 2.0*dX/(Ki1*Ki1 /(Qi1*abs(Qi1))
+ Ki*Ki /(Qi*abs(Qi)));
break;
}

case 2: // Ecuacin de Factor de transporte Medio.


{
*hfi12 = dX*pow((Qi1 + Qi)/(Ki1 +
Ki),2.0);
break;
}

case 3: // Media Geomtrica.


{
*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 Correcin Beta en la estacin i+1.
Bi = Factor de Correcin Beta en la estacin i.
Qi1 = Descarga del flujo en la estacin i+1.
Qi = Descarga del flujo en la estacin i
Ai1 = Area de la seccin transversal en la estacin
i+1.
Ai =Area de la seccin transv. en la estacin i.

228

Apendice B. HIDRAULICA
CODIGO FUENTE C++

Zi1 = Cota del nivel de agua en la estacin i+1.


(valor a encontrar)
Zi = Cota del nivel de agua en la estacin i.
hfi12 = Prdida por friccin en el tramo i+1/2.
hci12 = Prdida Local en el tramo i+1/2.
Salida : F = Funcin del Flujo gradualmente variado.
Propsito : Calcula la funcin F para la iteracin utilizando el
mtodo de Biseccin.
--------------------------------------------------------------------*/
{
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 estacin i.
IdST = Id de la seccin transversal
Q = Descarga del flujo (m3/s)
h = Tirante (m)

Salida : CSPoligon = Array para almacenar los datos del poligono o


seccin hidrulico.
TopWith = Espejo de agua
RTNORM si no se produce ningn error.
RTERROR en otro caso.
Propsito : 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

Apendice B. HIDRAULICA
CODIGO FUENTE C++

AcGePoint2dArray LVertices; // Variable


local para reasignar los vrtices.
AcGePoint2dArray GVertices; // Variable
Global para reasignar los vrtices.
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 Inundacin


bool InundDerecho = false; // Por defecto NO Existe Inundacin

// Son condiciones para agregar vrtices si el tirante es mayor


a los
// vrtices de las S. T. (casos de inundaciones)

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

// Inundacin Margen Derecha?

230

Apendice B. HIDRAULICA
CODIGO 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 vrtices (interpolando) recorrido con el mismo m


todo para el rea
// Inicio del recorrido de los vrtices.
for (int j = 0; j < LVertices.length()-1; j++)
{

// Condicin 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);
// Interpolacin 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++;

// Condicin para los trapecios.


//if (LVertices[j+1].y <= Zsi)
//{
Vertex[X] = GVertices[j].x; Vertex[Y] =
GVertices[j].y;
CSPoligon.append(Vertex);
//}

231

Apendice B. HIDRAULICA
CODIGO FUENTE C++

// Condicin 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);
// Interpolacin 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

Apendice B. HIDRAULICA
CODIGO FUENTE C++

/*--------------------------------------------------------------------
Ingreso : theFirstResult = puntero al primer elemento del buffer.
Salida : Vaco.
Propsito : Llamar a esta funcin 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 implementacin


//

#include "stdafx.h"
#include "PLEDERFlujoPermanenteDlg.h"

// Cuadro de dilogo 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

Apendice B. HIDRAULICA
CODIGO 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 Supcrtico


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

Apendice B. HIDRAULICA
CODIGO 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 funcin 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;

// Vrtices globales

235

Apendice B. HIDRAULICA
CODIGO 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;

// Vrtices locales
for(int i=0; i <m_nVST; i++)
{
v1[X]= X1 + (m_GlobalVertice[i].x - P1[X]); // Suma la
posicin inicial X + la distancia X
v1[Y]= Y1 - (P1[Y] - m_GlobalVertice[i].y); // Resta la
posicin 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 funcin
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

Apendice B. HIDRAULICA
CODIGO FUENTE C++

//-------------------------------------------------------------------
/*Clase FGVResultadosBufer: Bufer los resultados que se desaloja
mediante la funcin 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 correccin.
m_ALF = ALF; // Area llanura Izquierda.
m_AMC = AMC; // Area Canal central.
m_ARF = ARF; // Area llanura derecha.
m_PLF = PLF; // Permetro llanura izquierdo.
m_PMC = PMC; // Permetro canal central.
m_PRF = PRF; // Permetro 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; // Prdida por firccin.
m_hc12 = hc12; // Prdida local.
m_TopW = TopW; // Espejo de agua
m_LMC = LMC; // Longitud del canal central.

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

Apendice B. HIDRAULICA
CODIGO 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

Apendice B. HIDRAULICA
CODIGO 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 : Nmero de Vrtices de una polilinea.


RTCAN si la entidad no es una polyline o
RTERROR en otro caso.
Propsito : Retorna EL Nmero de Vrtices 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

Apendice B. HIDRAULICA
CODIGO FUENTE C++

*nVST = pPolyline->numVerts(); // Toma el nmero de vrtices 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 nmero de
secciones transversales (ST).
para este caso no se da
uso.
Salida : RTNORM si no se produce ningn error.
RTCAN si la entidad no es una polyline o
RTERROR en otro caso.
Propsito : 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

Apendice B. HIDRAULICA
CODIGO 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 elevacin cero


if (pPolyline->elevation() != 0)
{
pPolyline->close();
acutPrintf(_T("\nLa polyline no tiene elevacin 0."));
return RTCAN;
}

numVerts = pPolyline->numVerts(); // Toma el nmero de vrtices


de la polyline

if (numVerts <= 2)
{
pPolyline->close();
acdbFail(_T("\nPolyline no vlida "));
return RTERROR;
}

//Accede a los vrtices 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 posicin inicial X


+ la distancia X
v1[Y]= Y1 - (p1[Y] - pt[Y]); // Resta la posicin 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

Apendice B. HIDRAULICA
CODIGO 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 ningn error.
RTCAN si la entidad no es una polyline o
RTERROR en otro caso.
Propsito : 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

Apendice B. HIDRAULICA
CODIGO FUENTE C++

pEnt->close();
acdbFail(_T("\nTipo de entidad inesperada "));
return RTCAN;
}

AcDbPolyline *pPolyline = (AcDbPolyline*)pEnt;

// chequear si la Polyline tiene elevacin cero


if (pPolyline->elevation() != 0)
{
pPolyline->close();
acutPrintf(_T("\nLa polyline no tiene elevacin 0."));
return RTCAN;
}

numVerts = pPolyline->numVerts(); // Toma el nmero de vrtices


de la polyline

if (numVerts <= 2)
{
pPolyline->close();
acdbFail(_T("\nPolyline no vlida "));
return RTERROR;
}

//Accede a los vrtices 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 posicin inicial X


+ la distancia X
v1[Y]= Y1 - (p1[Y] - pt[Y]); // Resta la posicin 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

Apendice B. HIDRAULICA
CODIGO 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 ningn error.
RTCAN si la entidad no es una polyline o
RTERROR en otro caso.
Propsito : 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 elevacin cero


if (pPolyline->elevation() != 0)
{
pPolyline->close();

244

Apendice B. HIDRAULICA
CODIGO FUENTE C++

acutPrintf(_T("\nLa polyline no tiene elevacin 0."));


return RTCAN;
}

numVerts = pPolyline->numVerts(); // Toma el nmero de vrtices


de la polyline

if (numVerts <= 2)
{
pPolyline->close();
acdbFail(_T("\nPolyline no vlida "));
return RTERROR;
}

//Accede a los vrtices 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 vrtices de las secciones
transversales.
Salida : RTNORM si no se produce ningn error.
RTERROR en otro caso.
Propsito : Importar las Secciones Transversales desde un archivo.
Guarda los datos en el Buffer SeccionesBufer, para luego llamar desde
cualquier funcin.
--------------------------------------------------------------------*/
{
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 funcin no vlido
[ImportarSeccionesTransversales]."));
return RTERROR;
}

acutPrintf(_T("\nLeyendo el fichero ascii ...\n"));

245

Apendice B. HIDRAULICA
CODIGO 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 asignacin de memoria [Importar
ST][buffer]."));
return RTERROR;
}

// tomar primero el nmero 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 aadir el primer Vrtice como puntero


try
{
pPrimerST = new SeccionesBufer();
}

catch(const std::bad_alloc&)
{
acedRestoreStatusBar();
acdbFail(_T("\nError de asignacin de memoria [Importar
ST][pPrimerST]."));
return RTERROR;
}

246

Apendice B. HIDRAULICA
CODIGO FUENTE C++

SeccionesBufer *nST, *nbprevious = pPrimerST;

// recorrer el fichero
while (!infile.eof())
{
// leer una lnea 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 vlido
[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 vlido
-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 vlido
-x- [Importar ST]"));
return RTERROR;
}

y = atof(token);

// Coeficiente de Manning
token = ::strtok(NULL, seps);
if (!token)

247

Apendice B. HIDRAULICA
CODIGO FUENTE C++

{
*NumeroVertST = np;
infile.close();
acad_free(buffer);
acedRestoreStatusBar();
acdbFail(_T("\nFichero de Secciones Trasnv. No vlido
-manning- [Importar ST]"));
return RTERROR;
}

manning = atof(token);

int contador = 1;

// aadir los vrtices 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 asignacin 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; //Nmero de vrtices totales

return RTNORM;
}

int HidraSecTrasnv::ObtenerSeccionesTransversales()
/*--------------------------------------------------------------------
Ingreso : Vaco.
Salida : RTNORM si no se produce ningn error.
RTERROR en otro caso.
Propsito : 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 importacin"));

248

Apendice B. HIDRAULICA
CODIGO 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 : Vaco.
Salida : Vaco.
Propsito : Libera el buffer en ristra SeccionesBufer al que apunta
el miembro pPrimerST. Llamar a esta funcin para liberar el
buffer con los vrtives de las secciones transversales obtenidos
mediante una llamada a la funcin 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

Apendice B. HIDRAULICA
CODIGO FUENTE C++

/*--------------------------------------------------------------------
Ingreso : V = Lista de Vrtices de las S. T. Totales
n = Nmero de vrtices de las secciones transversales.
nST = Nmero de Secciones Transversales.
nVert = Lista de Nmeros de los Vrtices de las Secciones
Transversales. Ingresa vaco, para luego ser
almacenado (leer Propsito).
Salida : RTNORM si no se produce ningn error.
RTERROR en otro caso.
Propsito : Calcula los nmeros de los Vrtices 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


nmeros de vrtices.

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 = Nmero de Secciones Transversales.
nVert = Lista de Nmeros de los Vrtices de las Secciones
Transversales.
Vmin = Lista de Los Vrtices Mnimos de las S. T.
Vmax = Lista de Los Vrtices Mximos de las S. T.
Salida : RTNORM si no se produce ningn error.
RTERROR en otro caso.
Propsito : Busca los Vrtices Mnimos y Mximos de una lista. Los
almacena en las listas Vmin[] y Vmax[], de dimensin nST.
--------------------------------------------------------------------*/
{
int i, j,
inicio = 1, // Principio para la interacin.
fin = nVert[1]; // Final de la iteracin.
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

Apendice B. HIDRAULICA
CODIGO FUENTE C++

{
if ( Menor > ListaC[j])
{
Menor = ListaC[j];
}

if(Mayor < ListaC[j])


{
Mayor = ListaC[j];
}
Vminimo[i] = Menor;// Lista que contiene los vrtices
mnimos.
Vmaximo[i] = Mayor; // Lista que contiene los
vrtices mximos.

}//For j

inicio = inicio + nVert[i];

if (i < nST)// Prevee que en la ltima iteracin 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 seccin de
anlisis.
K2 = Factor de Transporte en la segunda seccin de
anlisis.
Q = Caudal del flujo.
nn = Coeficiente de Manning.
MetodoSfm = Mtodo a usar
Salida : Sfm = Pendiente Motriz.
Propsito : Calcula la Pendiente Motriz entre dos secciones
transversales por los para los cuatro mtodos.
--------------------------------------------------------------------*/
{
double Sfm, I1, I2;
I1 = pow(Q/K1,2);
I2 = pow(Q/K2,2);

switch (MetodoSfm)
{
case 1: // Ecuacin de Factor de transporte Medio.
{
Sfm = pow(((Q+Q)/(K1+K2)),2);
break;
}

case 2: // Media Aritmtica.


{
Sfm = (I1+I2)/2;

251

Apendice B. HIDRAULICA
CODIGO FUENTE C++

break;
}

case 3: // Media Geomtrica.


{
Sfm = sqrt(I1*I2);
break;
}

case 4: // Media Armnica.


{
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 seccin.
dA = Derivada del rea Transversal de la seccin.
Salida : NF = Nmero de Froude.
Propsito : Calcula el Nmero 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 interacin.
fin = Final de la iteracin.
CotaTirante = Cota del tirante de la seccin transversal.
Dato importante para determinar el rea y
el permetro 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).
Permetro = Permetro Transversal para un tirante que
se ingres (CotaTirante).
RTNORM si no se produce ningn error.
RTERROR en otro caso.
Propsito : Calcula el rea y el Permetro de una seccin transversal
a partir de una cota tirante.
-------------------------------------------------------------------*/

252

Apendice B. HIDRAULICA
CODIGO FUENTE C++

{
int j,k;
float Xi, Xd;

double Ai = 0, // rea en la seccin Izquierda.


At = 0, // rea en los trapecios.
Ad = 0, // rea en la seccin derecha.

Pi = 0, // Permetro en la seccin Izquierda.


Pt = 0, // Permetro en los trapecios.
Pd = 0; // Permetro en la seccin 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 Inundacin


bool InundDerecho = false; // Por defecto NO Existe Inundacin

// Son condiciones para agregar vrtices si el tirante es mayor


a los
// vrtices de las S. T. (casos de inundaciones)

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

Apendice B. HIDRAULICA
CODIGO FUENTE C++

InundDerecho = true;
}

// Inicio del recorrido de los vrtices.


for (j = star; j <= (end - 1); j++)
{
// Condicin para calcular en el tringulo izquierdo
if ((CotaTirante <= YY[j]) && (CotaTirante >= YY[j+1]))
{

// Clculo: Area del tringulo izquierdo


Ai = Ai + pow((CotaTirante-YY[j+1]),2)*(XX[j+1]-
XX[j])/(2.0*(YY[j]-YY[j+1]));

// Clculo: Permetro del tringulo 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++;

// Condicin para calcular en los trapecios.

if (YY[j+1] <= CotaTirante)


{
// Clculo: Area del trapecio
At= At + ((2.0*CotaTirante - YY[j]-
YY[j+1])/2.0)*(XX[j+1]-XX[j]);

// Clculo: Permetro del trapecio


Pt = Pt + sqrt(pow((XX[j+1]- XX[j]),2) +
pow((YY[j+1] - YY[j]),2));

// Condicin para calcular en el tringulo derecho.


if (YY[j+1] >= CotaTirante)
{

// Clculo: Area del tringulo 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);

// Clculo: Permetro del tringulo 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

Apendice B. HIDRAULICA
CODIGO FUENTE C++

}//While
} //if
}//For j

*Area = Ai + At + Ad; // Area Total


*Perimetro = Pi + Pt + Pd; // Permetro 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 interacin.
fin = Final de la iteracin.
CotaTirante = Cota del tirante de la seccin transversal.
Dato importante para determinar el rea y el permetro 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.
Permetro = Permetro Transversal para un tirante que
se ingres (CotaTirante).
dPermetro = Derivada del Permetro Transversal.
RTNORM si no se produce ningn error.
RTERROR en otro caso.
Propsito : Calcula el rea,el Permetro, la derivada del rea y la
derivada del permetro de una seccin transversal a partir de una
cota tirante.
--------------------------------------------------------------------*/

int j,k;
float Xi, Xd;

double Ai = 0, // rea en la seccin Izquierda.


At = 0, // rea en los trapecios.
Ad = 0, // rea en la seccin derecha.

dAi = 0, // Derivada del rea en la seccin


Izquierda.
dAt = 0, // Derivada del rea en los trapecios.
dAd = 0, // Derivada del rea en la seccin
derecha.

Pi = 0, // Permetro en la seccin Izquierda.


Pt = 0, // Permetro en los trapecios.
Pd = 0, // Permetro en la seccin derecha.

dPi = 0, // Derivada del Permetro en la seccin


Izquierda.

255

Apendice B. HIDRAULICA
CODIGO FUENTE C++

dPt = 0, // Derivada del Permetro en los


trapecios.
dPd = 0; // Derivada del Permetro en la seccin
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 Inundacin


bool InundDerecho = false; // Por defecto NO Existe Inundacin

// Son condiciones para agregar vrtices si el tirante es mayor


a los
// vrtices de las S. T. (casos de inundaciones)

// Inundacin 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;
}
// Inundacin 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 vrtices.


for (j = star; j <= (end - 1); j++)
{
// Condicin para calcular en el tringulo izquierdo
if ((CotaTirante <= YY[j]) && (CotaTirante >= YY[j+1]))

256

Apendice B. HIDRAULICA
CODIGO FUENTE C++

// Interpolacin para el trigulo izquierdo 'Xi'


//Xi = XX[j+1] -(XX[j+1]-XX[j])*(CotaTirante-
YY[j+1])/(YY[j]-YY[j+1]);

// Clculo: Area del tringulo 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);

// Clculo: Derivada del Area con respecto a Y del


tringulo izquierdo
dAi = dAi + 2.0*Ai/(CotaTirante - YY[j+1]);

// Clculo: Permetro del tringulo 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));

// Clculo: Derivada del Permetro con respecto a Y del


tringulo izquierdo
dPi = dPi + Pi/(CotaTirante - YY[j+1]);

bool condicion = true;


while (condicion)
{
j++;

// Condicin para calcular en los trapecios.

if (YY[j+1] <= CotaTirante)


{
// Clculo: 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);

// Clculo: Derivada del Area con respecto a Y de


los trapecios
dAt = dAt + XX[j+1] - XX[j];

// Clculo: Permetro del trapecio


Pt = Pt + sqrt(pow((XX[j+1]- XX[j]),2) +
pow((YY[j+1] - YY[j]),2));

// Condicin para calcular en el tringulo derecho.


if (YY[j+1] >= CotaTirante)
{

// Interpolacin para el trigulo derecho 'Xd'


//Xd = XX[j] +(XX[j+1]- XX[j])*(CotaTirante -
YY[j])/(YY[j+1]-YY[j]);

// Interpolacin de segmento derecho


// |(Xi+1 - Xi)(Y - Yi) |
// X = |---------------------| + Xi
/ | (Yi+1 - Yi) |

257

Apendice B. HIDRAULICA
CODIGO FUENTE C++

// Clculo: Area del tringulo 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);

// Clculo: Derivada del Area con respecto a Y del


tringulo derecho
dAd = dAd + 2.0*Ad/(CotaTirante - YY[j]);

// Clculo: Permetro del tringulo derecho.


Pd = Pd + sqrt(pow((CotaTirante - YY[j]),2)+
pow((CotaTirante-YY[j])*(XX[j+1]-XX[j])/(YY[j+1]-YY[j]),2));

// Clculo: Derivada del Perimetro con respecto a


Y del tringulo 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; // Permetro Total


*dPerimetro = dPi + dPt + dPd; // Derivada del Permetro 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

Apendice B. HIDRAULICA
CODIGO 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 (Slo 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; Permetro(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

Apendice B. HIDRAULICA
CODIGO 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;

// Clculo de la velocidad media


Vm = ((m_pRHidraulicos + i)->Q) / At;

// Clculo del Nmero 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

Apendice B. HIDRAULICA
CODIGO 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 dilogo
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 dilogo)
// 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

Apendice B. HIDRAULICA
CODIGO 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 ttulos 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

Apendice B. HIDRAULICA
CODIGO 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 : Vaco.
Propsito : Llamar a esta funcin 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

Apendice B. HIDRAULICA
CODIGO FUENTE C++

int CPLEDERResutadosDlg::AcquireLevelFreeSurface(long *numberL)


/*--------------------------------------------------------------------
Ingreso : numberof = Puntero a Long para sobreescribir el
Resultado
Salida : numberof = Representa el nmero de Secciones
Transversales que se encontraron.
RTNORM si no se produce ningn error.
RTERROR en otro caso.
Propsito : Lee el conjunto de Secciones transversales definidas en
el drawing. Llamar a esta funcin 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 funcin FreeAllCrossSectionsBufs(). Las S.T. que se aadan al
buffer no estarn ordenados por su nmero 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
seleccin [AcquireLevelFreeSurface][acedSSLength]."));
return RTERROR;
}

CPLEDERHydraulicResult *pResult;
ads_name ename;
AcDbObjectId ID;

264

Apendice B. HIDRAULICA
CODIGO 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 correccin.
ALF, // Area llanura Izquierda.
AMC, // Area Canal central.
ARF, // Area llanura derecha.
PLF, // Permetro llanura
izquierdo.
PMC, // Permetro canal central.
PRF, // Permetro llanura derecho
KLF, // Conductividad llanura
izquierdo.
KMC, // Conductividad canal
central.
KRF, // Conductividad llanura
derecho
Q, // Descarga del flujo.
hf12, // Prdida por firccin.
hc12, // Prdida local.
TopW, // Espejo de agua
LMC; // Longitud del canal central

265

Apendice B. HIDRAULICA
CODIGO 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 aade la primera seccin 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 asignacin de memoria
[AcquireCrossSections][m_theFirstNode]."));
return RTERROR;
}

FGVResultadosBufer *nR, *nRprevious = m_theFirstR;

// actualizar la barra de progreso


acedSetStatusBarProgressMeterPos((int)nL++);

266

Apendice B. HIDRAULICA
CODIGO 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

Apendice B. HIDRAULICA
CODIGO 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();

// aadir 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 asignacin 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 confimacin.
Salida : RTNORM si no se produce ningn error.
RTERROR en otro caso.
Propsito : Elimina los niveles calculados
--------------------------------------------------------------------*/
{
TCHAR result[131];

// si procede preguntar al usuario si desea eliminar los niveles


if (prompt)
{

268

Apendice B. HIDRAULICA
CODIGO FUENTE C++

acedInitGet(RSG_NONULL, _T("S N"));

if (acedGetKword(_T("\nSeguro 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
seleccin [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

Apendice B. HIDRAULICA
CODIGO 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

Apendice B. HIDRAULICA
CODIGO 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 : Vaco.
Salida : Vaco.
Propsito : Libera el buffer en ristra CrossSectionsBuf al que apunta
el miembro m_theFirstST. Llamar a esta funcin para liberar el
buffer con las S.T. obtenidas mediante una llamada a la funcin
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 : Vaco.
Salida : Vaco.
Propsito : Libera el buffer en ristra CrossSectionsSocavacionBuf al
que apunta el miembro m_theFirstSOC. Llamar a esta funcin para
liberar el buffer con las S.T. obtenidas mediante una llamada a la
funcin AcquireCrossSectionsSocavacion().
--------------------------------------------------------------------*/
{

if (!m_theFirstSOC)
return;

CrossSectionsSocavacionBufer *nb = m_theFirstSOC;


CrossSectionsSocavacionBufer *nbnext = NULL;

271

Apendice B. HIDRAULICA
CODIGO 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 nmero de Secciones
Transversales que se encontraron.
RTNORM si no se produce ningn error.
RTERROR en otro caso.
Propsito : Lee el conjunto de Secciones transversales definidas en
el drawing. Llamar a esta funcin 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 funcin FreeAllCrossSectionsBufs(). Las S.T. que se aadan al
buffer no estarn ordenados por su nmero 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

Apendice B. HIDRAULICA
CODIGO 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
seleccin [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

Apendice B. HIDRAULICA
CODIGO 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 aade la primera seccin 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 asignacin 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

Apendice B. HIDRAULICA
CODIGO 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

Apendice B. HIDRAULICA
CODIGO 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();
// aadir 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 asignacin 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 nmero de Secciones
Transversales que se encontraron.
RTNORM si no se produce ningn error.
RTERROR en otro caso.
Propsito : Lee el conjunto de Secciones transversales definidas en
el drawing. Llamar a esta funcin 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 funcin FreeAllCrossSectionsBufs(). Las S.T. que se aadan al
buffer no estarn ordenados por su nmero de orden. Se toman las S.T.
en bruto.
-------------------------------------------------------------------*/
{

276

Apendice B. HIDRAULICA
CODIGO 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
seleccin [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

Apendice B. HIDRAULICA
CODIGO 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 aade la primera seccin transversal


try
{
m_theFirstSOC = new CrossSectionsSocavacionBufer(IdST,
Material, CoefProb , CoefMaterial);
}
catch(const std::bad_alloc&)
{
acedSSFree(ss);
acedRestoreStatusBar();
acdbFail(_T("\nError de asignacin 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

Apendice B. HIDRAULICA
CODIGO 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();

// aadir 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 asignacin de memoria
[AcquireCrossSections][nb]."));
return RTERROR;
}

nbprevious->nbnext = nb;
nbprevious = nb;

// actualizar la barra de progreso


acedSetStatusBarProgressMeterPos((int)np++);

} // for i

279

Apendice B. HIDRAULICA
CODIGO 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 = nmero de orden de la primera S.T. Si
no hay Secciones Transv. definidos tomar el valor de cero.
RTNORM si no se produce ningn error.
RTERROR en otro caso.
Propsito : Busca el nmero de orden el ltimo nombre de la S.T. en
el Drawing. Nos podramos basar en el buffer, pero para asegurar la
bsqueda 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
seleccin [GetFirstNumberCrossSections][acedSSLength]."));
return RTERROR;

280

Apendice B. HIDRAULICA
CODIGO FUENTE C++

CPLEDERCrossSections *pSecciones;
ads_name ename;
AcDbObjectId ID;
long np = 0;
double n;

// tomar la ltima seccin 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 nmero de orden


pSecciones->IdCrossSections(n);
pSecciones->close();

// chequearlo
if (n > np)
np = n;

} // for i

acedSSFree(ss);

*nfirst = np;

281

Apendice B. HIDRAULICA
CODIGO FUENTE C++

return RTNORM;

int CPLEDERSeccionesTransversales::GetLastNumberCrossSections(long
*nlast)
/*--------------------------------------------------------------------
Ingreso : nlast= Puntero a Long para sobreescribir el resultado
Salida : nlast= nmero de orden del ltimo S.T. Si no hay
Secciones Transv. definidos tomar el valor de cero.
RTNORM si no se produce ningn error.
RTERROR en otro caso.
Propsito : Busca el nmero 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
seleccin [GetLastNumberCrossSections][acedSSLength]."));
return RTERROR;
}

CPLEDERCrossSections *pSecciones;
ads_name ename;
AcDbObjectId ID;
long np = 0;
double n;

282

Apendice B. HIDRAULICA
CODIGO 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 nmero 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 nmero de secciones
transversales que se encontraron.
RTNORM si no se produce ningn error.
RTERROR en otro caso.

283

Apendice B. HIDRAULICA
CODIGO FUENTE C++

Propsito : Contabiliza el nmero de Secciones Transversales en el


Drawing. Nos podramos basar en el buffer, pero para asegurar la
bsqueda 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
seleccin [GetNumberofCrossSections][acedSSLength]."));
return RTERROR;
}

acedSSFree(ss);

*numberof = sslen;

return RTNORM;
}

int CPLEDERSeccionesTransversales::GetCrossSectionsAttributes()
/*--------------------------------------------------------------------
Ingreso : vaco
Salida : RTNORM si no se produce ningn error.
RTERROR en otro caso.
Propsito : Obtiene el valor del dimetro de los crculos y la altura
del texto de las entidades Secciones transversales. Los valores son
alojados en las variables miembro m_STDiameter y m_STTextHeight.
-------------------------------------------------------------------*/

284

Apendice B. HIDRAULICA
CODIGO 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
seleccin [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

Apendice B. HIDRAULICA
CODIGO 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 Dimetro
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 seccin trasnversal
Salida : RTNORM si no se produce ningn error.
RTERROR en otro caso.
Propsito : Realiza un encuadre o zoom de la seccin 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

Apendice B. HIDRAULICA
CODIGO FUENTE C++

return RTERROR;
}

CrossSectionsBufer *nb;
bool encontrado;

encontrado = false;

// Buscar la seccin transversal


for (nb = m_theFirstST; nb != NULL; nb = nb->nbnext)
{
if (nb->m_IdST == IdnST)
{
encontrado = true;
break;
}
}

if (!encontrado)
{
acutPrintf(_T("\nPLEDER ERROR: Seccin transveral no
encontrado."));
FreeAllCrossSectionsBufs();
return RTERROR;
}

// Encuadrar la secin 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 mnimo.

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

Apendice B. HIDRAULICA
CODIGO FUENTE C++

double *NL,double *NC, double *NR, long *BL,


long *BR, double *CC, double *CE)
/*--------------------------------------------------------------------
Ingreso : IdnST: Nombre o Id de la seccin transversal
Salida : RTNORM si no se produce ningn error.
RTERROR en otro caso.
Propsito : Recepciona los atributos de la seccin 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 seccin transversal


for (nb = m_theFirstST; nb != NULL; nb = nb->nbnext)
{
if (nb->m_IdST == IdST)
{
encontrado = true;
break;
}
}

if (!encontrado)
{
acutPrintf(_T("\nPLEDER ERROR: Seccin Transversal no
encontrado."));
FreeAllCrossSectionsBufs();
return RTERROR;
}

// Guarda los atributos de la seccin transversal de la posicin


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

Apendice B. HIDRAULICA
CODIGO 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 vrtices


for(int i =0; i < *nVST; i++)
{
// Vrtices globales
vertex[X] = nb->m_GlobalVertice[i].x;
vertex[Y] = nb->m_GlobalVertice[i].y;
GvertexArray.append(vertex);

// Vrtices 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 seccin transversal
Salida : RTNORM si no se produce ningn error.
RTERROR en otro caso.
Propsito : Recepciona los atributos de la seccin 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

Apendice B. HIDRAULICA
CODIGO FUENTE C++

// Buscar la seccin transversal


for (nb = m_theFirstSOC; nb != NULL; nb = nb->nbnext)
{
if (nb->m_IdST == IdST)
{
encontrado = true;
break;
}
}

if (!encontrado)
{
acutPrintf(_T("\nPLEDER ERROR: Seccin Transversal no
encontrado."));
FreeAllCrossSectionsSocavacionBufs();
return RTERROR;
}

// Guarda los atributos de la seccin transversal de la posicin


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 Nmeros de los Vrtices de las Secciones
Transversales.
Hmin = Lista de Los Vrtices Mnimos de las S. T.
Salida : RTNORM si no se produce ningn error.
RTERROR en otro caso.
Propsito : Busca los Vrtices Mnimos y Mximos 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; // vrtice mnimo.
//Hmax = Mayor; //

290

Apendice B. HIDRAULICA
CODIGO 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 seccin
transversal. Dato importante para determinar el rea y el permetro
de la S.T.
LvertexArray = Vrtices de la seccin transversal (X, Y,
Manning)

Salida : Area = rea Transversal para un tirante que se ingres


(CotaTirante).
Permetro = Permetro Transversal para un tirante que se ingres
(CotaTirante).
K = Factor de transportabilidad.
Beta = Factor de correcin.
RTNORM si no se produce ningn error.
RTERROR en otro caso.
Propsito : Calcula el rea y el Permetro de una seccin 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; // Permetros
: 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 vrtices.
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 Inundacin


bool InundDerecho = false; // Por defecto NO Existe Inundacin

291

Apendice B. HIDRAULICA
CODIGO FUENTE C++

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

// Inundacin 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 vrtices.


for (j = 0; j < Vertices.length()-1; j++)
{
// Condicin para calcular en el tringulo izquierdo
if ((CotaTirante <= Vertices[j].y) && (CotaTirante >=
Vertices[j+1].y))
{
// Clculo: Area del tringulo 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));

// Clculo: Permetro del tringulo 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 permetros 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

Apendice B. HIDRAULICA
CODIGO 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++;

// Condicin para calcular en los trapecios.


if (Vertices[j+1].y <= CotaTirante)
{
// Clculo: Area del trapecio
At= At + ((2.0*CotaTirante -
Vertices[j].y- Vertices[j+1].y)/2.0)*(Vertices[j+1].x-Vertices[j].x);

// Clculo: Permetro 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


permetros 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;
}
}

// Condicin para calcular en el tringulo derecho.


if (Vertices[j+1].y >= CotaTirante)
{
// Clculo: Area del tringulo 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

Apendice B. HIDRAULICA
CODIGO FUENTE C++

//acutPrintf(_T("\nValores de Area
Derecha: %0.6f"), Ad);

// Clculo: Permetro del tringulo 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


permetros 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 permetro total (A,P)


*A = *ALF + *AMC + *ARF;
*P = *PLF + *PMC + *PRF;
return RTNORM;
}
int CPLEDERSeccionesTransversales::GetAreaPoligon(AcGePoint2dArray
VPoligon, double *Area)
/*--------------------------------------------------------------------
Ingreso : VPoligon = Vrtices de un poligono
Salida : Area = rea Transversal de un polgono

RTNORM si no se produce ningn error.


RTERROR en otro caso.
Propsito : Calcula el rea de un polgono
--------------------------------------------------------------------*/

294

Apendice B. HIDRAULICA
CODIGO 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 implementacin


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

Apendice B. HIDRAULICA
CODIGO 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.
(Ubicacin)
m_CoefMaterial = 0.0; // Peso especfico dimetro 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

Apendice B. HIDRAULICA
CODIGO 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; Estacin, 80; Elevacin,
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

Apendice B. HIDRAULICA
CODIGO 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 vlida, Fuera de rango"));
m_Edit_BI.SetFocus();
m_Edit_BI.SetSel(0, -1);
}

298

Apendice B. HIDRAULICA
CODIGO 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 vlida, 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 vlida, 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 vlida, 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

Apendice B. HIDRAULICA
CODIGO 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 vrtices 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 seccin transversal


CS.ZoomCrossSections(Id_ST);
}

void CPLEDERSeccionesTransversalesDlg::OnButtonST()
{
if(m_Combo_ST.GetCount() == 0)
{
::AfxMessageBox(_T("PLEDER ERROR: \n Ingresar Una Nueva
seccin"));
return;
}
//Esconde el dilogo
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

Apendice B. HIDRAULICA
CODIGO 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 contraccin.
CE; // Coeficiente de expansin.
Adesk::Int32 BI, // Lmite banco izquierdo.
BD; // lmite 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

Apendice B. HIDRAULICA
CODIGO 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

Apendice B. HIDRAULICA
CODIGO 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


(Estacin)
double *CY= new double[nVST+1]; // Lista de Coordenadas Y
(Elevacin)

if ( GeometriaST.LeerVerticesPolilinea(nombrep, CX, CY) !=


RTNORM)
{
acdbFail(_T("\nError [NumeroVerticesPolilinea()]"));
CompleteEditorCommand();
return;
}

double HminG = 0, HminL;


// Vrtice mnimo global
if (CS.GetMinVertice(CY, nVST, &HminG)!= RTNORM)
{
acdbFail(_T("\nError [GetMinVertice]"));
CompleteEditorCommand();
return;
}

// Vrtice mnimo local


HminL = Y1-(p1[Y] - HminG);

// Crea la entidad personalizada PLEDERCrossSections desde


ObjectDBX

303

Apendice B. HIDRAULICA
CODIGO 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 asignacin de memoria
[pPolilinea]."));
return ;
}

AcDbObjectId ID;

// aadirla a la base de datos de AutoCAD


if
(RecursosST.AadirEntidadBlockTableRecord((AcDbEntity*)pPolilinea, ID)
!= Acad::eOk)
{
if (pPolilinea)
{
delete pPolilinea;
}

acdbFail(_T("\nError al aadir la entidad a la Base de


Datos [AadirEntidadBlockTableRecord]."));
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 posicin inicial X
+ la distancia X
v1[Y]= Y1 - (p1[Y] - CY[i]); // Resta la posicin 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

Apendice B. HIDRAULICA
CODIGO FUENTE C++

RecursosST.RestaurarVariables(); //Restaura las variables de


sistema

//Retorna al dilogo
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 dilogo
BeginEditorCommand();

int nV;
acedInitGet(RSG_NONULL, NULL);

// Solicitar el nmero de Vrtice

305

Apendice B. HIDRAULICA
CODIGO FUENTE C++

if (acedGetInt(_T("\nVrtice del banco izquierdo: "), &nV) !=


RTNORM)
{
CompleteEditorCommand();
return;
}

// No se permite nV = 0
if (nV <= 0)
{
::AfxMessageBox(_T("\nEntrada no vlida."));
CompleteEditorCommand();
return;
}

// Verifica si esta dentro del rango de vrtices


if (nV > nVST)
{
::AfxMessageBox(_T("\nEntrada no vlida. \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 dilogo
BeginEditorCommand();

int nVD;
acedInitGet(RSG_NONULL, NULL);

// Solicitar el nmero de Vrtice


if (acedGetInt(_T("\nVrtice del banco derecho: "), &nVD) !=
RTNORM)

306

Apendice B. HIDRAULICA
CODIGO FUENTE C++

{
CompleteEditorCommand();
return;
}

// No se permite nVD = 0
if (nVD <= 0)
{
::AfxMessageBox(_T("\nEntrada no vlida."));
CompleteEditorCommand();
return;
}

// Verifica si est dentro del rango de vrtices


if (nVD > nVST)
{
::AfxMessageBox(_T("\nEntrada no vlida. \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 vlida. \nN de vrtice
Izq. > N de vrtice Der.)"));
CompleteEditorCommand();
return;
}

// Si todo es correcto
CompleteEditorCommand();

m_BD.Format(_T("%d"), nVD );
m_Edit_BD.SetWindowText(m_BD);

// Nueva Seccin Transversal


void CPLEDERSeccionesTransversalesDlg::OnCommandSTN()
{
//Declaracion de Objetos dilogos
CPLEDERST1Dlg dlgSTN(CWnd::FromHandle(adsw_acadMainWnd()));
if (dlgSTN.DoModal() != IDOK)
{
acutPrintf(_T("\nPLEDER: Se Cancel la Operacin"));
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

Apendice B. HIDRAULICA
CODIGO 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 selecin 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 : Vaco.
Salida : Vaco
Propsito : Calcula la distancia entre varios puntos
--------------------------------------------------------------------*/
{
//Esconde el dilogo
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

Apendice B. HIDRAULICA
CODIGO 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 contraccin.
CE; // Coeficiente de expansin.

Adesk::Int32 BL, // Lmite banco izquierdo.


BR; // Lmite 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: \nVrtices del banco
izquierdo >= al derecho"));
//acutPrintf(_T("\n....La Aplicacin 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

Apendice B. HIDRAULICA
CODIGO 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
seleccin [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

Apendice B. HIDRAULICA
CODIGO 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 implementacin

// Cuadro de dilogo de CPLEDERST1Dlg

311

Apendice B. HIDRAULICA
CODIGO 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
endice C


HIDRAULICA
FLUVIAL CODIGO
FUENTE C++

EL componente Hidraulica Fluvial se organiza en 02 libreras con m


ultiples funciones y
01 ventana grafica

313

Apendice C. HIDRAULICA
FLUVIAL CODIGO FUENTE C++

ARCHIVOS DE CABECERA:

PLEDERSocavacionGeneral.h

#pragma once

class CPLEDERSocavacionGeneral
{
public:
CPLEDERSocavacionGeneral(void);
~CPLEDERSocavacionGeneral(void);

public:

// Clculo de los datos para el coeficiente X.


int SGDatosMaterial(int Material, float *DatosMaterialX, float
*DatosMaterialY);

// Clculo de la variable X.
int SGCoeficienteX(int Material, float CoefMaterial, float *X);

// Clculo del tirante medio H0 encada vrtice de la seccin


transversal
int SGVerticesH0(AcGePoint2dArray Vertices, AcGePoint2dArray&
VerticesH0);

// Clculo de la socavacin mediante el mtodo 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

Apendice C. HIDRAULICA
FLUVIAL CODIGO 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

Apendice C. HIDRAULICA
FLUVIAL CODIGO 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.
Propsito : 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

Apendice C. HIDRAULICA
FLUVIAL CODIGO 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, segn la tabla que
se expone en la teora (Captulo V)
Propsito : Calcula el coeficiente X, necesario para la frmula de la
socavacin.
-------------------------------------------------------------------*/
{
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 slo valor = 0.43
*X = 0.43;
}

if(CoefMaterial >= 0.05 & CoefMaterial <= 1000.0) // mm


{
// Recibe los datos del material para una
interpolacin,
SGDatosMaterial(Material, DatosMaterialX,
DatosMaterialY);

// Interpolaciones lineales.
*X =
CN.InterpolacionLineal(25,DatosMaterialY,DatosMaterialX,
CoefMaterial);
}

if(CoefMaterial > 1000.0) // mm


{
// Para R2 = 0.99 (polinmica)
*X = 0.00000013*CoefMaterial*CoefMaterial -
0.00024369*CoefMaterial + 0.30353418;
}
} // if 1

317

Apendice C. HIDRAULICA
FLUVIAL CODIGO FUENTE C++

if(Material == 0) // Material Cohesivo.


{
if(CoefMaterial > 0.0 & CoefMaterial < 0.80) // Ton/m3
{
// Para R2 = 0.99 (polinmica) 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
interpolacin,
SGDatosMaterial(Material, DatosMaterialX,
DatosMaterialY);

// Interpolaciones lineales.
*X =
CN.InterpolacionLineal(25,DatosMaterialY,DatosMateria
lX, CoefMaterial);
}

if(CoefMaterial > 2.0) // Ton/m3


{
// Para R2 = 0.99 (polinmica) 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

Apendice C. HIDRAULICA
FLUVIAL CODIGO 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 seccin
transversal.
P = Permetro del flujo calculado en la seccin
transversal.
VerticesH0;= Vrtices 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, segn la tabla
Salida :
Propsito : Calcula la altura de la socavacin general en la seccin
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

Apendice C. HIDRAULICA
FLUVIAL CODIGO 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) // Frmula 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) // Frmula para lecho Cohesivo


{
for (k = 0; k < VerticesH0.length(); k++)
{

320

Apendice C. HIDRAULICA
FLUVIAL CODIGO 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

Apendice C. HIDRAULICA
FLUVIAL CODIGO 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

Apendice C. HIDRAULICA
FLUVIAL CODIGO FUENTE C++

m_Edit_SOCDm.EnableWindow(1);
m_Material = 1;

// Por defecto en la posicin 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 vlida, 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

Apendice C. HIDRAULICA
FLUVIAL CODIGO FUENTE C++

if (!m_Edit_SOCDm.Validate())
{
::AfxMessageBox(_T("Entrada no vlida, 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 notificacin a menos que se invalide
CAdUiDialog::OnInitDialog()
// funcin y llamada CRichEditCtrl().SetEventMask()
// con el marcador ENM_CHANGE ORed en la mscara.

// TODO: Agregue aqu el controlador de notificacin de


controles
}

void CPLEDERSocavacionGeneralDlg::OnCommandSOCAPLICAR()
{
// Parmetros para socavacin
int Material, // Tipo de material, Cohesivo = 0, No
Cohesivo = 1.
CoefProb; // Coeficiente de probabilidad de gasto.
double CoefMaterial; // Peso especfico dimetro 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

Apendice C. HIDRAULICA
FLUVIAL CODIGO 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
seleccin [acedSSLength]."));
return;
}

CPLEDERCrossSections *pSecciones;
ads_name ename;
AcDbObjectId ID;

325

Apendice C. HIDRAULICA
FLUVIAL CODIGO 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

Apendice C. HIDRAULICA
FLUVIAL CODIGO 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 seccin transversal


STSOC.ZoomCrossSections(Id_ST);

int Material, // Tipo de material, Cohesivo = 0,


No Cohesivo = 1.
CoefProb; // Coeficiente de probabilidad de gasto.
(Posicin del combo)
double CoefMaterial; // Peso especfico dimetro 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 posicin indicada.


m_Combo_SOCProbg.SetCurSel(CoefProb);
OnKillfocusComboSOCProbg();

}
void CPLEDERSocavacionGeneralDlg::OnKillfocusComboSOCProbg()
{
switch (m_Combo_SOCProbg.GetCurSel())
{

327

Apendice C. HIDRAULICA
FLUVIAL CODIGO 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
endice D

RESULTADOS DEL PROGRAMA

Cuadro D.1: Coordenadas hidrograma TR = 50 a


nos

Duracion (min) Q total (m3 /s) Duracion (min) Q total (m3 /s)

0 0.000 830 57.605.000


10 0.052 840 56.334
20 0.379 850 54.912
30 1.289 860 53.328
40 3.242 870 51.546
50 6.727 880 49.576
60 11.577 890 47.44
70 18.078 900 45.169
80 26.022 910 42.795
90 35.761 920 40.367
100 47.589 930 37.908
110 61.651 940 35.478
120 77.933 950 33.07
(sigue en la pagina siguiente)
329
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.1: Continuacion de la tabla Coordenadas hidro-


grama TR = 50 a
nos

Duracion (min) Q total (m3 /s) Duracion (min) Q total (m3 /s)

130 95.729 960 30.698


140 114.508 970 28.382
150 133.167 980 26.160
160 151.154 990 24.039
170 168.116 1000 22.023
180 183.685 1010 20.116
190 197.508 1020 18.318
200 209.631 1030 16.652
210 219.584 1040 15.121
220 227.751 1050 13.744
230 233.851 1060 12.510
240 237.903 1070 11.404
250 239.997 1080 10.402
260 240.694 1090 9.491
270 239.867 1100 8.659
280 237.561 1110 7.903
290 233.693 1120 7.213
300 228.224 1130 6.582
310 221.655 1140 6.000
320 214.426 1150 5.465
330 207.160 1160 4.977
340 200.063 1170 4.530
(sigue en la pagina siguiente)

330
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.1: Continuacion de la tabla Coordenadas hidro-


grama TR = 50 a
nos

Duracion (min) Q total (m3 /s) Duracion (min) Q total (m3 /s)

350 193.204 1180 4.122


360 186.441 1190 3.753
370 179.850 1200 3.419
380 173.505 1210 3.113
390 167.59 1220 2.831
400 162.017 1230 2.576
410 156.773 1240 2.342
420 151.649 1250 2.129
430 146.678 1260 1.934
440 141.917 1270 1.758
450 137.373 1280 1.597
460 133.049 1290 1.45
470 128.985 1300 1.317
480 125.160 1310 1.196
490 121.450 1320 1.086
500 117.898 1330 0.984
510 114.523 1340 0.893
520 111.299 1350 0.809
530 108.211 1360 0.732
540 105.260 1370 0.662
550 102.444 1380 0.599
560 99.720 1390 0.540
(sigue en la pagina siguiente)

331
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.1: Continuacion de la tabla Coordenadas hidro-


grama TR = 50 a
nos

Duracion (min) Q total (m3 /s) Duracion (min) Q total (m3 /s)

570 97.109 1400 0.487


580 94.623 1410 0.439
590 92.246 1420 0.395
600 89.947 1430 0.355
610 87.736 1440 0.319
620 85.620 1450 0.286
630 83.583 1460 0.255
640 81.632 1470 0.228
650 79.769 1480 0.202
660 77.987 1490 0.179
670 76.275 1500 0.157
680 74.647 1510 0.137
690 73.106 1520 0.118
700 71.648 1530 0.101
710 70.272 1540 0.085
720 68.975 1550 0.071
730 67.758 1560 0.058
740 66.612 1570 0.046
750 65.544 1580 0.036
760 64.550 1590 0.028
770 63.621 1600 0.020
780 62.706 1610 0.014
(sigue en la pagina siguiente)

332
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.1: Continuacion de la tabla Coordenadas hidro-


grama TR = 50 a
nos

Duracion (min) Q total (m3 /s) Duracion (min) Q total (m3 /s)

790 61.793 1620 0.009


800 60.840 1630 0.005
810 59.836 1640 0.002
820 58.766 1650 0.00

(Fin de la tabla)

Cuadro D.2: Coordenadas hidrograma TR = 100 a


nos

Duracion (min) Q total (m3 /s) Duracion (min) Q total (m3 /s)

0 0.000 840 72.931


10 0.007 850 71.284
20 0.223 860 69.450
30 0.972 870 67.414
40 2.766 880 65.130
50 6.202 890 62.611
60 11.903 900 59.887
70 19.653 910 56.995
80 29.816 920 53.981
90 42.190 930 50.905
100 57.210 940 47.794
110 75.301 950 44.723
120 96.525 960 41.683
(sigue en la pagina siguiente)

333
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.2: Continuacion de la tabla Coordenadas hidro-


grama TR = 100 a
nos

Duracion (min) Q total (m3 /s) Duracion (min) Q total (m3 /s)

130 120.681 970 38.689


140 146.671 980 35.767
150 173.676 990 32.965
160 200.117 1000 30.29
170 225.280 1010 27.749
180 248.604 1020 25.345
190 269.689 1030 23.079
200 288.119 1040 20.979
210 303.981 1050 19.050
220 316.610 1060 17.315
230 326.597 1070 15.761
240 333.632 1080 14.367
250 337.786 1090 13.105
260 339.232 1100 11.956
270 338.679 1110 10.907
280 335.974 1120 9.955
290 331.147 1130 9.085
300 324.176 1140 8.291
310 315.106 1150 7.557
320 304.711 1160 6.883
330 293.614 1170 6.268
340 282.652 1180 5.705
(sigue en la pagina siguiente)

334
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.2: Continuacion de la tabla Coordenadas hidro-


grama TR = 100 a
nos

Duracion (min) Q total (m3 /s) Duracion (min) Q total (m3 /s)

350 272.056 1190 5.191


360 261.912 1200 4.726
370 252.005 1210 4.306
380 242.447 1220 3.920
390 233.303 1230 3.565
400 224.790 1240 3.243
410 216.787 1250 2.949
420 209.268 1260 2.680
430 201.941 1270 2.435
440 194.849 1280 2.214
450 188.096 1290 2.011
460 181.680 1300 1.825
470 175.588 1310 1.658
480 169.879 1320 1.506
490 164.522 1330 1.366
500 159.343 1340 1.239
510 154.390 1350 1.124
520 149.702 1360 1.018
530 145.237 1370 0.921
540 140.968 1380 0.833
550 136.900 1390 0.753
560 133.033 1400 0.680
(sigue en la pagina siguiente)

335
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.2: Continuacion de la tabla Coordenadas hidro-


grama TR = 100 a
nos

Duracion (min) Q total (m3 /s) Duracion (min) Q total (m3 /s)

570 129.306 1410 0.613


580 125.740 1420 0.552
590 122.356 1430 0.497
600 119.130 1440 0.447
610 116.017 1450 0.401
620 113.029 1460 0.359
630 110.178 1470 0.321
640 107.438 1480 0.286
650 104.817 1490 0.254
660 102.320 1500 0.225
670 99.935 1510 0.197
680 97.647 1520 0.172
690 95.473 1530 0.148
700 93.419 1540 0.126
710 91.479 1550 0.107
720 89.648 1560 0.089
730 87.925 1570 0.073
740 86.311 1580 0.058
750 84.794 1590 0.046
760 83.379 1600 0.035
770 82.063 1610 0.025
780 80.831 1620 0.017
(sigue en la pagina siguiente)

336
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.2: Continuacion de la tabla Coordenadas hidro-


grama TR = 100 a
nos

Duracion (min) Q total (m3 /s) Duracion (min) Q total (m3 /s)

790 79.619 1630 0.011


800 78.411 1640 0.006
810 77.155 1650 0.002
820 75.838 1660 0.000
830 74.441

(Fin de la tabla)

Cuadro D.3: Coordenadas hidrograma TR = 200 a


nos

Duracion (min) Q total (m3 /s) Duracion (min) Q total (m3 /s)

0 0.000 840 88.784


10 0.076 850 86.743
20 0.574 860 84.477
30 1.962 870 81.967
40 4.943 880 79.159
50 10.246 890 76.068
60 18.657 900 72.731
70 29.893 910 69.197
80 44.441 920 65.520
90 62.073 930 61.773
100 83.334 940 57.990
110 108.728 950 54.257
(sigue en la pagina siguiente)

337
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.3: Continuacion de la tabla Coordenadas hidro-


grama TR = 200 a
nos

Duracion (min) Q total (m3 /s) Duracion (min) Q total (m3 /s)

120 138.167 960 50.564


130 171.228 970 46.929
140 206.377 980 43.382
150 242.462 990 39.980
160 277.426 1000 36.735
170 310.335 1010 33.651
180 340.464 1020 30.736
190 367.389 1030 27.988
200 390.620 1040 25.441
210 410.264 1050 23.101
220 425.492 1060 20.997
230 437.138 1070 19.112
240 444.861 1080 17.422
250 448.802 1090 15.890
260 449.191 1100 14.497
270 446.913 1110 13.225
280 441.775 1120 12.070
290 433.832 1130 11.016
300 423.153 1140 10.052
310 409.895 1150 9.162
320 395.123 1160 8.345
330 379.643 1170 7.599
(sigue en la pagina siguiente)

338
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.3: Continuacion de la tabla Coordenadas hidro-


grama TR = 200 a
nos

Duracion (min) Q total (m3 /s) Duracion (min) Q total (m3 /s)

340 364.507 1180 6.916


350 349.978 1190 6.293
360 336.15 1200 5.729
370 322.744 1210 5.220
380 309.887 1220 4.751
390 297.631 1230 4.322
400 286.232 1240 3.931
410 275.532 1250 3.575
420 265.486 1260 3.248
430 255.712 1270 2.951
440 246.283 1280 2.683
450 237.338 1290 2.437
460 228.859 1300 2.212
470 220.825 1310 2.009
480 213.313 1320 1.825
490 206.277 1330 1.656
500 199.487 1340 1.501
510 193.004 1350 1.362
520 186.884 1360 1.233
530 181.065 1370 1.116
540 175.510 1380 1.009
550 170.230 1390 0.913
(sigue en la pagina siguiente)

339
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.3: Continuacion de la tabla Coordenadas hidro-


grama TR = 200 a
nos

Duracion (min) Q total (m3 /s) Duracion (min) Q total (m3 /s)

560 165.225 1400 0.824


570 160.409 1410 0.742
580 155.813 1420 0.669
590 151.461 1430 0.602
600 147.319 1440 0.541
610 143.328 1450 0.485
620 139.505 1460 0.435
630 135.865 1470 0.389
640 132.371 1480 0.346
650 129.032 1490 0.308
660 125.857 1500 0.272
670 122.827 1510 0.239
680 119.923 1520 0.208
690 117.167 1530 0.179
700 114.567 1540 0.153
710 112.112 1550 0.129
720 109.797 1560 0.107
730 107.622 1570 0.088
740 105.587 1580 0.071
750 103.675 1590 0.055
760 101.892 1600 0.042
770 100.233 1610 0.031
(sigue en la pagina siguiente)

340
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.3: Continuacion de la tabla Coordenadas hidro-


grama TR = 200 a
nos

Duracion (min) Q total (m3 /s) Duracion (min) Q total (m3 /s)

780 98.679 1620 0.021


790 97.151 1630 0.013
800 95.631 1640 0.007
810 94.053 1650 0.003
820 92.405 1660 0.001
830 90.661

(Fin de la tabla)

Cuadro D.4: Coordenadas hidrograma TR = 500 a


nos

Duracion (min) Q total (m3 /s) Duracion (min) Q total (m3 /s)

0 0.000 840 112.708


10 0.002 850 110.322
20 0.277 860 107.737
30 1.317 870 104.876
40 3.870 880 101.716
50 8.838 890 98.190
60 17.143 900 94.315
70 29.816 910 90.142
80 46.456 920 85.734
90 67.794 930 81.156
100 93.489 940 76.499
(sigue en la pagina siguiente)

341
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.4: Continuacion de la tabla Coordenadas hidro-


grama TR = 500 a
nos

Duracion (min) Q total (m3 /s) Duracion (min) Q total (m3 /s)

110 124.302 950 71.801


120 160.724 960 67.172
130 202.402 970 62.594
140 248.566 980 58.089
150 297.059 990 53.695
160 346.221 1000 49.482
170 393.389 1010 45.463
180 437.220 1020 41.646
190 476.885 1030 38.037
200 511.901 1040 34.635
210 541.683 1050 31.483
220 566.321 1060 28.587
230 584.842 1070 25.983
240 598.431 1080 23.650
250 606.703 1090 21.558
260 609.916 1100 19.663
270 608.331 1110 17.938
280 603.121 1120 16.364
290 594.002 1130 14.935
300 581.142 1140 13.629
310 564.757 1150 12.437
320 545.201 1160 11.336
(sigue en la pagina siguiente)

342
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.4: Continuacion de la tabla Coordenadas hidro-


grama TR = 500 a
nos

Duracion (min) Q total (m3 /s) Duracion (min) Q total (m3 /s)

330 523.924 1170 10.324


340 501.983 1180 9.401
350 480.705 1190 8.557
360 460.417 1200 7.786
370 441.207 1210 7.087
380 422.719 1220 6.458
390 405.074 1230 5.877
400 388.300 1240 5.346
410 372.718 1250 4.863
420 358.110 1260 4.422
430 344.395 1270 4.018
440 331.075 1280 3.650
450 318.281 1290 3.318
460 306.183 1300 3.014
470 294.736 1310 2.736
480 283.915 1320 2.485
490 273.818 1330 2.257
500 264.375 1340 2.048
510 255.272 1350 1.857
520 246.608 1360 1.684
530 238.443 1370 1.525
540 230.692 1380 1.380
(sigue en la pagina siguiente)

343
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.4: Continuacion de la tabla Coordenadas hidro-


grama TR = 500 a
nos

Duracion (min) Q total (m3 /s) Duracion (min) Q total (m3 /s)

550 223.304 1390 1.248


560 216.303 1400 1.128
570 209.684 1410 1.018
580 203.324 1420 0.918
590 197.270 1430 0.827
600 191.550 1440 0.744
610 186.114 1450 0.669
620 180.885 1460 0.600
630 175.886 1470 0.538
640 171.136 1480 0.481
650 166.581 1490 0.428
660 162.235 1500 0.381
670 158.108 1510 0.336
680 154.175 1520 0.295
690 150.408 1530 0.257
700 146.837 1540 0.222
710 143.473 1550 0.189
720 140.300 1560 0.159
730 137.311 1570 0.133
740 134.506 1580 0.109
750 131.885 1590 0.087
760 129.423 1600 0.068
(sigue en la pagina siguiente)

344
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.4: Continuacion de la tabla Coordenadas hidro-


grama TR = 500 a
nos

Duracion (min) Q total (m3 /s) Duracion (min) Q total (m3 /s)

770 127.128 1610 0.052


780 124.991 1620 0.038
790 122.988 1630 0.026
800 121.020 1640 0.016
810 119.063 1650 0.009
820 117.039 1660 0.004
830 114.931 1670 0.001

(Fin de la tabla)

Cuadro D.5: Resultados parametros hidraulicos TR = 50


a
nos

Sta Q (m3 /s) Elev (m) Area(m2 ) Perm (m) V(m/s) Froude Ancho (m)

1 240.69 2971.691 35.645 20.133 6.752 1.33 16.653


2 240.69 2971.074 34.848 20.354 6.907 1.555 17.268
3 240.69 2972.111 58.332 29.553 4.126 0.754 35.272
4 240.69 2972.694 101.202 45.492 2.378 0.398 37.882
5 240.69 2970.189 31.792 23.108 7.571 1.657 20.926
6 240.69 2971.574 83.349 38.843 2.888 0.492 33.108
7 240.69 2969.627 34.53 23.986 6.971 1.779 21.733
8 240.69 2969.325 35.701 23.921 6.742 1.431 22.049
9 240.69 2971.118 95.874 38.898 2.51 0.398 32.936
(sigue en la pagina siguiente)

345
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.5: Continuacion de la tabla parametros


hidraulicos TR = 50 a
nos

Sta Q (m3 /s) Elev (m) Area(m2 ) Perm (m) V(m/s) Froude Ancho (m)

10 240.69 2971.165 101.04 41.111 2.382 0.376 36.091


11 240.69 2968.727 32.301 22.286 7.451 1.844 20.682
12 240.69 2968.723 37.296 25.325 6.453 1.599 23.843
13 240.69 2968.708 42.705 26.662 5.636 1.106 24.523
14 240.69 2968.119 36.628 26.865 6.571 1.463 25.921
15 240.69 2969.294 82.557 31.765 2.915 0.518 29.985
16 240.69 2967.408 36.003 24.831 6.685 1.394 24.189
17 240.69 2969.447 97.741 37.378 2.463 0.376 35.32
18 240.69 2969.406 94.376 39.959 2.55 0.391 37.722
19 240.69 2969.375 87.588 35.585 2.748 0.381 32.367
20 240.69 2969.14 73.191 27.95 3.289 0.466 24.429
21 240.69 2967.831 41.464 19.179 5.805 0.955 15.555
22 240.69 2966.601 54.955 24.51 4.38 0.743 22.578
23 240.69 2965.141 45.527 28.271 5.287 1.171 27.446
24 240.69 2966.379 93.467 31.266 2.575 0.396 27.676
25 240.69 2966.273 80.369 28.997 2.995 0.466 22.521
26 240.69 2963.511 29.868 16.506 8.058 1.644 13.661
27 240.69 2965.86 79.178 27.029 3.04 0.443 21.594
28 240.69 2962.61 28.492 17.053 8.447 1.69 14.308
29 240.69 2965.257 79.95 25.051 3.011 0.422 19.941
30 240.69 2961.762 26.873 16.991 8.957 2.193 14.559
31 240.69 2961.864 36.064 18.556 6.674 1.273 16.164
(sigue en la pagina siguiente)

346
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.5: Continuacion de la tabla parametros


hidraulicos TR = 50 a
nos

Sta Q (m3 /s) Elev (m) Area(m2 ) Perm (m) V(m/s) Froude Ancho (m)

32 240.69 2961.536 37.109 18.774 6.486 1.207 16.609


33 240.69 2961.442 40.877 19.784 5.888 1.114 17.402
34 240.69 2961.191 40.701 18.911 5.914 0.996 16.343
35 240.69 2962.188 82.727 33.607 2.909 0.433 29.928
36 240.69 2959.703 31.652 21.212 7.604 1.672 19.55
37 240.69 2961.033 70.602 36.291 3.409 0.587 35.937
38 240.69 2959.258 35.39 22.888 6.801 1.683 21.48
39 240.69 2959.253 41.397 25.19 5.814 1.138 43.862
40 240.69 2958.688 38.641 23.678 6.229 1.374 22.38
41 240.69 2959.972 78.325 40.091 3.073 0.469 35.542
42 240.69 2959.193 45.147 20.169 5.331 0.897 16.837
43 240.69 2957.793 40.275 24.296 5.976 1.287 23.199
44 240.69 2959.394 105.062 36.402 2.291 0.375 32.852
45 240.69 2959.389 108.849 38.236 2.211 0.322 33.454
46 240.69 2956.355 29.186 23.937 8.247 1.984 22.545
47 240.69 2956.64 41.236 24.795 5.837 1.303 22.658
48 240.69 2957.782 72.929 26.939 3.3 0.515 24.007
49 240.69 2956.276 37.283 20.989 6.456 1.258 19.824
50 240.69 2955.749 36.101 21.931 6.667 1.45 20.631
51 240.69 2957.217 77.161 28.24 3.119 0.523 25.344
52 240.69 2957.353 93.682 34.95 2.569 0.423 32.609
53 240.69 2957.376 99.914 35.244 2.409 0.352 32.883
(sigue en la pagina siguiente)

347
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.5: Continuacion de la tabla parametros


hidraulicos TR = 50 a
nos

Sta Q (m3 /s) Elev (m) Area(m2 ) Perm (m) V(m/s) Froude Ancho (m)

54 240.69 2954.858 31.561 19.237 7.626 1.738 17.589


55 240.69 2955.745 51.371 24.61 4.685 0.763 21.494
56 240.69 2954.595 43.196 28.408 5.572 1.083 27.147
57 240.69 2954.093 37.679 26.607 6.388 1.376 25.531
58 240.69 2955.687 78.832 29.317 3.053 0.501 26.399
59 240.69 2953.486 32.514 24.896 7.403 1.874 24.175
60 240.69 2953.259 34.833 24.198 6.91 1.435 23.478
61 240.69 2955.349 91.238 30.07 2.638 0.399 26.808
62 240.69 2955.413 99.505 28.713 2.419 0.329 23.037
63 240.69 2955.347 89.271 31.189 2.696 0.369 25.447
64 240.69 2953.285 35.414 28.569 6.796 1.036 37.963
65 240.69 2952.675 30.435 15.621 7.908 1.299 10.665
66 240.69 2953.974 62.018 36.252 3.881 0.55 29.78
67 240.69 2951.19 27.954 17.303 8.61 1.815 14.974
68 240.69 2953.073 74.809 25.336 3.217 0.452 20.097
69 240.69 2952.956 66.697 26.844 3.609 0.512 23.629
70 240.69 2953.116 81.662 34.305 2.947 0.412 31.667
71 240.69 2950.45 29.959 18.67 8.034 1.605 17.545
72 240.69 2953.113 114.584 37.902 2.101 0.294 35.491
73 240.69 2949.656 28.591 19.605 8.418 1.702 18.544
74 240.69 2952.143 97.985 32.007 2.456 0.351 27.617
75 240.69 2952.063 98.144 33.166 2.452 0.354 28.131
(sigue en la pagina siguiente)

348
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.5: Continuacion de la tabla parametros


hidraulicos TR = 50 a
nos

Sta Q (m3 /s) Elev (m) Area(m2 ) Perm (m) V(m/s) Froude Ancho (m)

76 240.69 2949.432 30.709 19.025 7.838 1.661 17.687


77 240.69 2951.247 70.532 26.021 3.413 0.483 23.406
78 240.69 2949.39 33.685 16.512 7.145 1.27 14.028
79 240.69 2949.773 48.018 20.325 5.013 0.842 17.719
80 240.69 2948.387 35.346 19.099 6.809 1.457 17.184
81 240.69 2950.067 69.216 25.042 3.477 0.501 20.991
82 240.69 2947.901 32.134 16.926 7.49 1.445 14.255
83 240.69 2947.47 32.891 17.799 7.318 1.538 15.538
84 240.69 2949.398 80.27 30.764 2.998 0.418 27.277
85 240.69 2949.565 103.449 36.83 2.327 0.32 32.25
86 240.69 2949.662 117.682 35.954 2.045 0.278 31.564
87 240.69 2945.417 25.199 16.149 9.552 2.03 13.674
88 240.69 2947.188 58.284 21.742 4.13 0.588 16.096
89 240.69 2944.605 28.728 16.312 8.378 1.442 13.134
90 240.69 2945.346 39.491 17.364 6.095 0.951 13.605
91 240.69 2944.532 38.774 21.322 6.208 1.08 19.946
92 240.69 2945.151 55.589 23.405 4.33 0.692 21.141
93 240.69 2944.143 50.041 21.215 4.81 0.77 18.668
94 240.69 2943.125 43.924 20.581 5.48 1.016 18.544
95 240.69 2943.067 50.052 20.157 4.809 0.777 16.306
96 240.69 2941.974 52.45 21.956 4.589 0.834 18.668
97 240.69 2940.062 41.141 20.758 5.85 1.097 17.953
(sigue en la pagina siguiente)

349
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.5: Continuacion de la tabla parametros


hidraulicos TR = 50 a
nos

Sta Q (m3 /s) Elev (m) Area(m2 ) Perm (m) V(m/s) Froude Ancho (m)

98 240.69 2939.898 49.988 21.93 4.815 0.795 19.29


99 240.69 2938.635 46.809 23.568 5.142 1.044 21.847
100 240.69 2937.761 43.339 23.695 5.554 1.1 22.254
101 240.69 2937.096 39.138 22.803 6.15 1.325 21.606
102 240.69 2938.689 100.21 37.138 2.402 0.394 34.44
103 240.69 2938.834 130.319 41.017 1.847 0.265 36.949
104 240.69 2936.532 33.939 17.944 7.092 1.188 13.674
105 240.69 2935.166 34.456 16.99 6.986 1.234 14.394
106 240.69 2935.613 56.24 31.952 4.28 0.709 28.339
107 240.69 2934.328 53.457 24.915 4.502 0.776 23.259
108 240.69 2932.757 40.73 22.464 5.909 1.116 20.951
109 240.69 2932.523 45.69 24.631 5.268 1.038 22.114
110 240.69 2931.897 39.577 22.819 6.082 1.374 21.191
111 240.69 2932.895 65.445 32.83 3.678 0.587 29.759
112 240.69 2931.892 48.063 31.692 5.008 0.924 29.524
113 240.69 2931.881 56.166 34.609 4.285 0.792 32.61
114 240.69 2931.853 60.348 33.829 3.988 0.64 31.009
115 240.69 2930.808 52.325 31.798 4.6 0.861 30.012
116 240.69 2930.658 86.159 36.193 2.794 0.537 32.67
117 240.69 2930.847 114.987 39.829 2.093 0.336 35.549
118 240.69 2928.601 34.213 28.969 7.035 1.722 27.722
119 240.69 2928.709 49.088 29.784 4.903 0.934 28.275
(sigue en la pagina siguiente)

350
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.5: Continuacion de la tabla parametros


hidraulicos TR = 50 a
nos

Sta Q (m3 /s) Elev (m) Area(m2 ) Perm (m) V(m/s) Froude Ancho (m)

120 240.69 2928.395 59.788 35.19 4.026 0.814 33.719


121 240.69 2927.556 46.248 35.251 5.204 1.291 34.58
122 240.69 2927.528 55.414 38.667 4.344 1.086 37.851
123 240.69 2927.419 61.383 40.272 3.921 0.789 39.406
124 240.69 2926.62 47.626 33.143 5.054 1.23 32.024
125 240.69 2926.788 60.527 34.073 3.977 0.747 30.648

(Fin de la tabla)

Cuadro D.6: Resultados parametros hidraulicos TR = 100


a
nos

Sta Q (m3 /s) Elev (m) Area(m2 ) Perm (m) V(m/s) Froude Ancho (m)

1 339.23 2973.042 66.33 35.22 5.114 0.819 29.703


2 339.23 2972.023 52.4 25.699 6.474 1.201 21.468
3 339.23 2971.959 54.836 26.327 6.186 1.16 21.525
4 339.23 2971.789 67.909 39.74 4.995 0.966 34.336
5 339.23 2971.335 64.743 35.995 5.24 0.925 31.634
6 339.23 2971.792 90.596 39.701 3.744 0.619 33.471
7 339.23 2970.202 49.233 33.314 6.89 1.504 30.032
8 339.23 2971.624 104.383 40.856 3.25 0.486 34.123
9 339.23 2969.468 45.848 25.622 7.399 1.523 23.19
10 339.23 2971.688 120.167 43.271 2.823 0.419 37.075
(sigue en la pagina siguiente)

351
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.6: Continuacion de la tabla parametros


hidraulicos TR = 100 a
nos

Sta Q (m3 /s) Elev (m) Area(m2 ) Perm (m) V(m/s) Froude Ancho (m)

11 339.23 2969.37 45.775 23.724 7.411 1.557 21.252


12 339.23 2971.296 108.622 35.816 3.123 0.485 28.745
13 339.23 2971.432 125.638 41.691 2.7 0.372 34.479
14 339.23 2971.558 152.433 43.598 2.225 0.303 36.833
15 339.23 2971.564 164.8 44.695 2.058 0.28 40
16 339.23 2971.573 185.169 47.002 1.832 0.229 40
17 339.23 2971.604 182.007 47.078 1.864 0.233 40
18 339.23 2971.591 181.327 48.139 1.871 0.234 39.941
19 339.23 2971.577 173.8 48.562 1.952 0.227 39.714
20 339.23 2971.494 156.071 47.734 2.174 0.255 40
21 339.23 2967.829 41.433 19.171 8.187 1.347 15.548
22 339.23 2966.597 54.866 24.494 6.183 1.05 22.564
23 339.23 2967.49 117.825 36.25 2.879 0.437 33.252
24 339.23 2964.359 39.575 26.226 8.572 1.806 25.037
25 339.23 2966.254 79.931 28.836 4.244 0.662 22.401
26 339.23 2965.062 52.156 19.976 6.504 1.038 15.073
27 339.23 2964.063 45.794 19.672 7.408 1.365 15.782
28 339.23 2964.067 50.336 21.482 6.739 1.075 16.825
29 339.23 2963.074 41.337 19.062 8.207 1.51 16.1
30 339.23 2963.094 47.604 20.437 7.126 1.307 16.662
31 339.23 2963.149 58.416 22.336 5.807 0.917 18.876
32 339.23 2962.238 49.136 20.584 6.904 1.155 17.684
(sigue en la pagina siguiente)

352
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.6: Continuacion de la tabla parametros


hidraulicos TR = 100 a
nos

Sta Q (m3 /s) Elev (m) Area(m2 ) Perm (m) V(m/s) Froude Ancho (m)

33 339.23 2963.313 88.641 36.102 3.827 0.563 30.485


34 339.23 2961.618 47.837 20.081 7.091 1.129 17.092
35 339.23 2963.326 117.187 37.215 2.895 0.386 30.619
36 339.23 2960.149 40.441 22.152 8.388 1.675 19.812
37 339.23 2962.819 133.342 44.513 2.544 0.355 37.017
38 339.23 2962.923 160.24 47.289 2.117 0.293 36.015
39 339.23 2959.074 37.375 23.354 9.076 1.84 22.088
40 339.23 2961.517 141.772 47.726 2.393 0.344 40
41 339.23 2961.415 133.517 47.919 2.541 0.336 40
42 339.23 2959.406 49.087 24.726 6.911 1.13 21.236
43 339.23 2958.219 50.393 25.659 6.732 1.326 24.261
44 339.23 2957.597 48.013 32.134 7.065 1.594 31.303
45 339.23 2958.609 83.291 36.147 4.073 0.649 32.15
46 339.23 2958.74 85.764 31.021 3.955 0.62 26.532
47 339.23 2956.844 45.872 25.281 7.395 1.574 22.885
48 339.23 2958.596 93.364 31.226 3.633 0.519 27.555
49 339.23 2958.544 89.36 29.954 3.796 0.545 27.251
50 339.23 2956.021 41.78 22.632 8.119 1.664 21.072
51 339.23 2958.307 109.226 38.389 3.106 0.457 34.274
52 339.23 2958.431 130.778 40.233 2.594 0.377 36.103
53 339.23 2958.442 137.865 41.95 2.461 0.325 37.938
54 339.23 2955.35 40.51 20.78 8.374 1.707 18.755
(sigue en la pagina siguiente)

353
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.6: Continuacion de la tabla parametros


hidraulicos TR = 100 a
nos

Sta Q (m3 /s) Elev (m) Area(m2 ) Perm (m) V(m/s) Froude Ancho (m)

55 339.23 2957.715 102.887 37.217 3.297 0.436 33.357


56 339.23 2954.406 38.13 27.723 8.897 1.793 26.62
57 339.23 2956.938 117.967 35.968 2.876 0.409 31.73
58 339.23 2954.287 43.003 25.965 7.889 1.629 24.782
59 339.23 2956.461 109.719 31.949 3.092 0.462 27.544
60 339.23 2956.583 127.33 35.313 2.664 0.357 30.697
61 339.23 2956.586 125.133 32.809 2.711 0.363 27.88
62 339.23 2956.607 128.702 34.999 2.636 0.325 27.883
63 339.23 2956.565 121.482 38.039 2.792 0.345 29.368
64 339.23 2953.718 46.742 34.173 7.257 1.055 27.246
65 339.23 2953.54 41.701 28.892 8.135 1.205 37.253
66 339.23 2953.184 45.53 19.145 7.451 1.149 13.83
67 339.23 2952.472 48.685 20.935 6.968 1.177 16.843
68 339.23 2953.433 82.533 29.235 4.11 0.558 23.425
69 339.23 2952.522 56.803 24.758 5.972 0.887 21.762
70 339.23 2952.148 56.447 24.588 6.01 0.931 22.212
71 339.23 2951.401 48.683 23.686 6.968 1.189 21.715
72 339.23 2950.907 47.372 25.064 7.161 1.318 23.869
73 339.23 2950.927 59.61 30.254 5.691 0.936 28.699
74 339.23 2952.206 99.743 32.148 3.401 0.483 27.661
75 339.23 2951.997 96.283 33.019 3.523 0.512 28.084
76 339.23 2952.11 93.478 31.305 3.629 0.521 28.547
(sigue en la pagina siguiente)

354
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.6: Continuacion de la tabla parametros


hidraulicos TR = 100 a
nos

Sta Q (m3 /s) Elev (m) Area(m2 ) Perm (m) V(m/s) Froude Ancho (m)

77 339.23 2951.945 87.739 28.87 3.866 0.513 25.86


78 339.23 2950.323 47.612 19.112 7.125 1.115 15.83
79 339.23 2952.26 102.329 31.982 3.315 0.429 27.85
80 339.23 2948.429 36.076 19.204 9.403 1.993 17.245
81 339.23 2950.236 72.844 25.92 4.657 0.66 21.779
82 339.23 2949.21 52.445 21.709 6.468 1.026 17.941
83 339.23 2948.26 45.722 19.917 7.419 1.346 16.941
84 339.23 2948.426 56.938 23.641 5.958 0.921 20.607
85 339.23 2947.691 50.915 24.366 6.663 1.132 21.65
86 339.23 2947.232 49.707 24.934 6.825 1.244 22.189
87 339.23 2947.351 54.398 22.046 6.236 0.973 17.698
88 339.23 2946.541 48.223 19.913 7.035 1.073 14.98
89 339.23 2945.922 46.214 18.964 7.34 1.074 13.419
90 339.23 2945.683 44.122 18.082 7.688 1.154 13.848
91 339.23 2945.207 52.714 23.302 6.435 1.022 21.374
92 339.23 2945.409 61.185 24.677 5.544 0.859 22.269
93 339.23 2944.658 60.14 23.246 5.641 0.849 20.391
94 339.23 2944.156 64.654 24.386 5.247 0.838 21.679
95 339.23 2943.153 51.457 20.411 6.592 1.054 16.486
96 339.23 2942.145 55.673 22.397 6.093 1.078 18.933
97 339.23 2940.405 47.385 21.64 7.159 1.269 18.467
98 339.23 2940.812 69.219 30.122 4.901 0.726 26.725
(sigue en la pagina siguiente)

355
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.6: Continuacion de la tabla parametros


hidraulicos TR = 100 a
nos

Sta Q (m3 /s) Elev (m) Area(m2 ) Perm (m) V(m/s) Froude Ancho (m)

99 339.23 2940.464 91.327 34.227 3.714 0.572 30.411


100 339.23 2937.594 39.666 23.119 8.552 1.75 21.797
101 339.23 2939.897 120.758 39.782 2.809 0.401 35.682
102 339.23 2940.031 147.878 42.391 2.294 0.323 36.632
103 339.23 2940.146 179.767 45.598 1.887 0.241 38.398
104 339.23 2937.091 41.98 21.774 8.081 1.26 46.087
105 339.23 2936.284 51.395 20.158 6.6 1.006 16.39
106 339.23 2935.669 57.845 32.132 5.865 0.964 28.376
107 339.23 2936.955 131.495 39.97 2.58 0.335 33.109
108 339.23 2932.433 34.067 21.378 9.958 1.997 20.11
109 339.23 2935.038 118.904 43.288 2.853 0.402 80
110 339.23 2931.907 39.778 22.846 8.528 1.922 21.211
111 339.23 2932.933 66.573 32.937 5.096 0.81 29.817
112 339.23 2931.967 50.305 31.94 6.743 1.229 29.679
113 339.23 2932.083 62.808 35.382 5.401 0.966 33.143
114 339.23 2932.392 77.348 35.589 4.386 0.661 32.105
115 339.23 2931.885 85.463 34.714 3.969 0.635 31.502
116 339.23 2930.873 93.208 36.756 3.64 0.674 32.943
117 339.23 2928.831 46.158 34.344 7.349 1.688 32.726
118 339.23 2929.629 63.087 31.252 5.377 1.039 28.442
119 339.23 2929.181 62.569 31.047 5.422 0.956 28.91
120 339.23 2929.652 103.048 38.31 3.292 0.543 35.092
(sigue en la pagina siguiente)

356
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.6: Continuacion de la tabla parametros


hidraulicos TR = 100 a
nos

Sta Q (m3 /s) Elev (m) Area(m2 ) Perm (m) V(m/s) Froude Ancho (m)

121 339.23 2927.61 48.136 35.489 7.047 1.72 34.755


122 339.23 2927.746 63.737 39.619 5.322 1.25 38.552
123 339.23 2928.29 96.216 43.397 3.526 0.611 40
124 339.23 2926.668 49.15 33.367 6.902 1.657 32.145
125 339.23 2926.978 66.42 35.207 5.107 0.929 31.378

(Fin de la tabla)

Cuadro D.7: Resultados parametros hidraulicos TR = 200


a
nos

Sta Q (m3 /s) Elev (m) Area(m2 ) Perm (m) V(m/s) Froude Ancho (m)

1 449.19 2976.109 186.375 54.084 2.41 0.29 39.788


2 449.19 2971.686 45.608 22.762 9.849 1.941 18.817
3 449.19 2974.559 149.519 50.818 3.004 0.409 38.445
4 449.19 2971.285 51.374 35.175 8.744 1.873 41.539
5 449.19 2972.955 123.434 46.667 3.639 0.525 38.412
6 449.19 2973.169 139.959 47.349 3.209 0.453 37.701
7 449.19 2973.234 146.753 48.369 3.061 0.43 37.494
8 449.19 2973.344 167.409 49.005 2.683 0.342 38.265
9 449.19 2969.605 49.18 27.928 9.134 1.829 25.363
10 449.19 2972.237 140.806 45.539 3.19 0.448 38.107
11 449.19 2970.025 60.515 30.104 7.423 1.377 26.921
(sigue en la pagina siguiente )

357
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.7: Continuacion de la tabla parametros


hidraulicos TR = 200 a
nos

Sta Q (m3 /s) Elev (m) Area(m2 ) Perm (m) V(m/s) Froude Ancho (m)

12 449.19 2969.965 70.521 31.801 6.37 1.194 28.511


13 449.19 2969.805 73.324 34.604 6.126 1.011 31.532
14 449.19 2971.044 133.67 41.818 3.36 0.481 36.284
15 449.19 2968.558 61.158 29.426 7.345 1.484 28.169
16 449.19 2971.05 164.234 45.432 2.735 0.357 40
17 449.19 2971.129 163.014 45.654 2.756 0.357 40
18 449.19 2971.096 161.552 46.654 2.78 0.361 39.941
19 449.19 2971.058 153.175 47.004 2.933 0.354 39.714
20 449.19 2970.746 126.152 45.49 3.561 0.44 40
21 449.19 2969.877 83.894 34.864 5.354 0.709 30.06
22 449.19 2966.816 59.903 25.428 7.499 1.236 23.388
23 449.19 2965.571 57.57 29.654 7.803 1.573 28.494
24 449.19 2968.102 143.27 36.361 3.135 0.407 30.824
25 449.19 2968.038 132.928 45.502 3.379 0.441 34.991
26 449.19 2965.217 54.504 20.323 8.241 1.291 15.214
27 449.19 2964.374 50.728 20.356 8.855 1.554 16.04
28 449.19 2964.894 65.339 24.825 6.875 0.999 19.56
29 449.19 2964.728 69.862 23.111 6.43 0.951 18.416
30 449.19 2964.394 71.585 24.889 6.275 0.963 20.226
31 449.19 2963.727 69.72 24.165 6.443 0.953 20.292
32 449.19 2963.392 75.411 30.58 5.957 0.868 27.13
33 449.19 2963.191 84.955 35.69 5.287 0.787 30.366
(sigue en la pagina siguiente )

358
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.7: Continuacion de la tabla parametros


hidraulicos TR = 200 a
nos

Sta Q (m3 /s) Elev (m) Area(m2 ) Perm (m) V(m/s) Froude Ancho (m)

34 449.19 2962.79 79.386 36.208 5.658 0.793 30.63


35 449.19 2962.987 106.852 36.142 4.204 0.578 30.413
36 449.19 2963.177 124.737 40.243 3.601 0.487 33.113
37 449.19 2963.366 154.063 47.383 2.916 0.387 38.707
38 449.19 2963.491 180.721 48.995 2.486 0.327 36.015
39 449.19 2963.571 199.61 51.736 2.25 0.272 37.18
40 449.19 2963.656 227.326 54.142 1.976 0.237 40
41 449.19 2963.608 221.238 54.498 2.03 0.229 40
42 449.19 2959.342 47.79 22.895 9.399 1.55 19.444
43 449.19 2958.092 47.316 25.251 9.493 1.918 23.943
44 449.19 2960.588 146.079 40.548 3.075 0.439 35.805
45 449.19 2960.55 148.835 41.413 3.018 0.395 35.477
46 449.19 2960.491 135.217 36.196 3.322 0.437 30.264
47 449.19 2960.607 148.065 44.278 3.034 0.395 80
48 449.19 2960.664 164.093 47.596 2.737 0.329 40
49 449.19 2960.652 166.058 47.487 2.705 0.325 40
50 449.19 2956.176 45.064 23.031 9.968 1.98 21.323
51 449.19 2958.926 131.642 42.636 3.412 0.472 37.194
52 449.19 2956 53.279 28.563 8.431 1.735 27.057
53 449.19 2958.221 129.589 40.598 3.466 0.467 37.054
54 449.19 2958.378 132.073 41.086 3.401 0.464 36.156
55 449.19 2958.234 121.089 41.487 3.71 0.471 41.281
(sigue en la pagina siguiente )

359
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.7: Continuacion de la tabla parametros


hidraulicos TR = 200 a
nos

Sta Q (m3 /s) Elev (m) Area(m2 ) Perm (m) V(m/s) Froude Ancho (m)

56 449.19 2958.682 179.563 45.357 2.502 0.307 40


57 449.19 2958.675 176.738 41.7 2.542 0.312 35.34
58 449.19 2958.639 166.284 40.121 2.701 0.332 33.571
59 449.19 2958.714 183.076 41.375 2.454 0.3 34.352
60 449.19 2958.77 202.518 43.826 2.218 0.252 36.024
61 449.19 2958.772 203.284 46.773 2.21 0.251 38.622
62 449.19 2958.774 207.988 49.391 2.16 0.231 39.416
63 449.19 2958.78 208.559 55.131 2.154 0.231 40
64 449.19 2953.78 48.455 34.428 9.27 1.339 27.36
65 449.19 2953.665 45.005 34.275 9.981 1.459 27.429
66 449.19 2953.435 49.058 19.912 9.156 1.372 14.294
67 449.19 2952.974 57.348 22.277 7.833 1.239 17.684
68 449.19 2954.771 120.583 40.344 3.725 0.454 31.857
69 449.19 2952.613 58.817 25.269 7.637 1.123 22.234
70 449.19 2952.331 60.61 25.702 7.411 1.124 23.258
71 449.19 2951.767 56.915 25.39 7.892 1.281 23.244
72 449.19 2953.219 118.363 38.224 3.795 0.525 35.679
73 449.19 2953.189 128.768 36.757 3.488 0.454 32.296
74 449.19 2953.489 135.779 34.986 3.308 0.42 28.542
75 449.19 2953.303 133.617 36.05 3.362 0.433 29.196
76 449.19 2953.463 134.784 35.795 3.333 0.424 31.675
77 449.19 2953.402 129.156 34.84 3.478 0.413 30.965
(sigue en la pagina siguiente )

360
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.7: Continuacion de la tabla parametros


hidraulicos TR = 200 a
nos

Sta Q (m3 /s) Elev (m) Area(m2 ) Perm (m) V(m/s) Froude Ancho (m)

78 449.19 2950.787 55.203 20.604 8.137 1.208 16.98


79 449.19 2950.413 60.123 23.054 7.471 1.157 20.116
80 449.19 2952.502 136.1 37.222 3.3 0.419 32.836
81 449.19 2952.379 130.639 37.535 3.438 0.409 32.082
82 449.19 2949.143 51.253 21.352 8.764 1.402 17.615
83 449.19 2950.781 103.377 34.286 4.345 0.585 29.776
84 449.19 2948.184 52.184 21.713 8.608 1.37 18.79
85 449.19 2949.892 114.047 37.978 3.939 0.525 32.621
86 449.19 2950.248 137.622 42.272 3.264 0.422 36.658
87 449.19 2947.388 55.063 22.186 8.158 1.267 17.814
88 449.19 2946.616 49.35 20.125 9.102 1.377 15.109
89 449.19 2946.072 48.228 19.266 9.314 1.342 13.451
90 449.19 2945.983 48.305 18.719 9.299 1.352 14.062
91 449.19 2945.806 65.91 25.156 6.815 1.01 22.747
92 449.19 2945.452 62.142 24.888 7.228 1.114 22.456
93 449.19 2944.744 61.898 23.559 7.257 1.082 20.652
94 449.19 2944.328 68.412 25.023 6.566 1.027 22.207
95 449.19 2943.495 57.228 21.424 7.849 1.204 17.207
96 449.19 2942.83 69.006 24.159 6.509 1.047 19.992
97 449.19 2941.775 75.619 30.652 5.94 0.883 26.201
98 449.19 2941.389 86.428 34.903 5.197 0.726 30.574
99 449.19 2941.619 126.947 38.005 3.538 0.484 31.32
(sigue en la pagina siguiente )

361
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.7: Continuacion de la tabla parametros


hidraulicos TR = 200 a
nos

Sta Q (m3 /s) Elev (m) Area(m2 ) Perm (m) V(m/s) Froude Ancho (m)

100 449.19 2941.959 172.648 43.076 2.602 0.319 34.728


101 449.19 2942.041 201.439 48.504 2.23 0.266 39.561
102 449.19 2942.127 228.582 50.752 1.965 0.233 40
103 449.19 2942.17 259.558 52.378 1.731 0.192 40
104 449.19 2937.17 43.386 23.93 10.353 1.6 47.434
105 449.19 2936.443 54.105 21.811 8.302 1.244 17.953
106 449.19 2935.988 66.91 33.147 6.713 1.06 28.581
107 449.19 2935.077 72.182 30.513 6.223 0.972 32.46
108 449.19 2934.257 75.519 28.833 5.948 0.91 26.42
109 449.19 2933.616 72.986 30.683 6.154 1.019 27.351
110 449.19 2934.812 128.369 38.991 3.499 0.504 33.537
111 449.19 2933.138 72.719 33.559 6.177 0.958 30.179
112 449.19 2932.377 62.652 33.322 7.17 1.227 30.56
113 449.19 2933.176 99.995 38.437 4.492 0.694 34.76
114 449.19 2932.181 70.633 34.901 6.359 0.981 31.677
115 449.19 2931.464 72.32 33.575 6.211 1.05 30.919
116 449.19 2930.03 65.912 34.551 6.815 1.49 31.872
117 449.19 2931.428 135.883 41.41 3.306 0.496 36.363
118 449.19 2929.872 70.018 31.791 6.415 1.188 28.612
119 449.19 2929.829 81.581 32.782 5.506 0.887 29.783
120 449.19 2928.759 72.154 36.095 6.225 1.175 34.117
121 449.19 2928.528 80.939 38.274 5.55 1.093 36.331
(sigue en la pagina siguiente )

362
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.7: Continuacion de la tabla parametros


hidraulicos TR = 200 a
nos

Sta Q (m3 /s) Elev (m) Area(m2 ) Perm (m) V(m/s) Froude Ancho (m)

122 449.19 2927.911 70.125 40.338 6.406 1.442 39.082


123 449.19 2928.949 122.546 45.372 3.665 0.582 40
124 449.19 2927.033 61.052 35.092 7.357 1.608 33.07
125 449.19 2928.438 116.323 43.919 3.862 0.579 36.983

(Fin de la tabla)

Cuadro D.8: Resultados parametros hidraulicos TR = 500


a
nos

Sta Q (m3 /s) Elev (m) Area(m2 ) Perm (m) V(m/s) Froude Ancho (m)

1 609.92 2973.869 97.25 47.364 6.272 0.913 39.788


2 609.92 2973.677 110.277 46.841 5.531 0.822 39.116
3 609.92 2973.294 100.866 47.021 6.047 0.939 38.445
4 609.92 2973.736 140.678 48.618 4.336 0.64 37.882
5 609.92 2971.748 78.357 39.552 7.784 1.295 34.335
6 609.92 2972.892 129.515 46.517 4.709 0.684 37.701
7 609.92 2971.227 80.079 36.756 7.616 1.367 30.487
8 609.92 2971.503 100.283 40.221 6.082 0.922 33.75
9 609.92 2970.945 90.215 38.037 6.761 1.095 32.451
10 609.92 2972.418 147.756 46.289 4.128 0.57 38.449
11 609.92 2970.843 87.746 40.802 6.951 1.141 35.79
12 609.92 2970.706 91.682 34.032 6.653 1.113 28.623
(sigue en la pagina siguiente)

363
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.8: Continuacion de la tabla parametros


hidraulicos TR = 500 a
nos

Sta Q (m3 /s) Elev (m) Area(m2 ) Perm (m) V(m/s) Froude Ancho (m)

13 609.92 2971.78 137.925 43.97 4.422 0.591 36.021


14 609.92 2972.156 175.43 48.473 3.477 0.45 40
15 609.92 2972.189 189.826 46.572 3.213 0.414 40
16 609.92 2972.192 209.946 48.86 2.905 0.347 40
17 609.92 2972.283 209.158 49.115 2.916 0.347 40
18 609.92 2972.247 207.511 50.106 2.939 0.35 39.941
19 609.92 2972.209 198.88 50.456 3.067 0.343 39.714
20 609.92 2969.719 88.234 31.616 6.913 0.928 27.745
21 609.92 2970.376 100.208 40.074 6.087 0.773 34.874
22 609.92 2967.481 76.266 28.163 7.997 1.215 25.768
23 609.92 2969.847 202.644 45.997 3.01 0.369 40
24 609.92 2969.971 214.766 50.118 2.84 0.322 40
25 609.92 2969.961 206.841 56.018 2.949 0.335 40
26 609.92 2965.808 63.67 21.751 9.579 1.404 15.962
27 609.92 2968.719 158.075 42.233 3.858 0.445 30.896
28 609.92 2964.983 67.089 25.2 9.091 1.309 19.87
29 609.92 2964.905 73.154 23.547 8.338 1.21 18.667
30 609.92 2964.749 78.937 26.093 7.727 1.14 21.185
31 609.92 2964.437 85.384 28.82 7.143 0.984 24.57
32 609.92 2964.812 119.045 37.969 5.123 0.656 32.169
33 609.92 2965.408 154.683 43.227 3.943 0.482 32.537
34 609.92 2962.465 69.499 35.023 8.776 1.27 30.206
(sigue en la pagina siguiente)

364
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.8: Continuacion de la tabla parametros


hidraulicos TR = 500 a
nos

Sta Q (m3 /s) Elev (m) Area(m2 ) Perm (m) V(m/s) Froude Ancho (m)

35 609.92 2962.337 87.208 34.081 6.994 1.025 30.019


36 609.92 2962.082 89.591 35.711 6.808 1.026 31.043
37 609.92 2961.571 88.947 39.23 6.857 1.098 34.559
38 609.92 2963.201 170.267 48.124 3.582 0.483 36.015
39 609.92 2963.403 193.367 51.233 3.154 0.386 37.18
40 609.92 2963.589 224.656 53.942 2.715 0.328 40
41 609.92 2963.487 216.4 54.135 2.818 0.32 40
42 609.92 2960.579 83.965 38.328 7.264 1.039 33.834
43 609.92 2960.565 116.887 35.776 5.218 0.747 32.424
44 609.92 2960.538 144.262 40.372 4.228 0.607 35.679
45 609.92 2960.437 144.857 41.095 4.211 0.556 35.267
46 609.92 2958.476 78.884 29.536 7.732 1.253 25.281
47 609.92 2959.949 126.323 35.593 4.828 0.666 30.697
48 609.92 2960.206 145.781 45.67 4.184 0.52 80
49 609.92 2958.057 76.823 26.96 7.939 1.2 24.454
50 609.92 2957.522 75.51 27.3 8.077 1.301 24.464
51 609.92 2959.07 137.008 43.279 4.452 0.607 37.519
52 609.92 2959.419 168.873 46.558 3.612 0.478 40
53 609.92 2956.67 77.851 31.626 7.834 1.239 29.594
54 609.92 2958.465 135.399 45.226 4.505 0.61 40
55 609.92 2958.079 115.54 39.612 5.279 0.678 35.537
56 609.92 2959.039 193.826 46.426 3.147 0.376 40
(sigue en la pagina siguiente)

365
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.8: Continuacion de la tabla parametros


hidraulicos TR = 500 a
nos

Sta Q (m3 /s) Elev (m) Area(m2 ) Perm (m) V(m/s) Froude Ancho (m)

57 609.92 2959.015 188.813 42.502 3.23 0.387 35.653


58 609.92 2958.948 176.709 40.795 3.452 0.415 33.762
59 609.92 2959.078 195.615 42.161 3.118 0.372 34.566
60 609.92 2959.171 216.989 44.645 2.811 0.312 36.142
61 609.92 2959.177 218.979 47.662 2.785 0.309 38.887
62 609.92 2959.179 224.006 50.309 2.723 0.285 39.732
63 609.92 2959.194 225.092 56.371 2.71 0.284 40
64 609.92 2954.194 59.919 36.114 10.179 1.412 28.113
65 609.92 2954.492 68.273 37.583 8.934 1.206 28.863
66 609.92 2955.088 96.312 40.774 6.333 0.813 31.785
67 609.92 2956.28 147.8 46.496 4.127 0.485 35.411
68 609.92 2956.703 184.68 53.162 3.303 0.355 40
69 609.92 2952.863 64.514 26.52 9.454 1.355 23.365
70 609.92 2952.83 73.139 30.525 8.339 1.199 27.941
71 609.92 2952.764 82.675 32.928 7.377 1.068 30.366
72 609.92 2954.023 148.279 41.906 4.113 0.531 38.372
73 609.92 2953.841 150.163 38.593 4.062 0.502 33.284
74 609.92 2954.249 157.677 36.669 3.868 0.464 29.064
75 609.92 2953.949 152.709 37.648 3.994 0.489 29.895
76 609.92 2954.243 159.86 37.835 3.815 0.458 32.665
77 609.92 2951.646 80.154 27.646 7.609 1.037 24.804
78 609.92 2952.132 80.387 25.016 7.587 0.991 20.462
(sigue en la pagina siguiente)

366
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.8: Continuacion de la tabla parametros


hidraulicos TR = 500 a
nos

Sta Q (m3 /s) Elev (m) Area(m2 ) Perm (m) V(m/s) Froude Ancho (m)

79 609.92 2953.104 127.205 35.694 4.795 0.581 31.142


80 609.92 2953.68 176.314 40.773 3.459 0.403 35.484
81 609.92 2953.499 168.111 41.073 3.628 0.401 34.822
82 609.92 2950.078 69.8 26.163 8.738 1.258 21.953
83 609.92 2949.997 81.799 29.102 7.456 1.083 25.017
84 609.92 2951.215 137.158 39.726 4.447 0.535 33.17
85 609.92 2951.772 183.146 49.922 3.33 0.385 40
86 609.92 2951.873 201.926 50.077 3.021 0.347 40
87 609.92 2951.633 174.743 48.671 3.49 0.383 40
88 609.92 2946.633 49.607 20.173 12.295 1.857 15.138
89 609.92 2946.106 48.697 19.943 12.525 1.799 14.073
90 609.92 2946.051 49.261 18.863 12.381 1.788 14.11
91 609.92 2945.942 69.035 25.79 8.835 1.29 23.295
92 609.92 2945.724 68.401 26.227 8.917 1.333 23.644
93 609.92 2948.329 166.587 42.838 3.661 0.409 33.696
94 609.92 2948.46 189.448 42.77 3.219 0.357 32.306
95 609.92 2943.46 56.621 21.319 10.772 1.659 17.133
96 609.92 2942.76 67.596 23.977 9.023 1.464 19.883
97 609.92 2941.633 71.975 29.686 8.474 1.279 25.302
98 609.92 2941.106 77.802 34.003 7.839 1.126 30.396
99 609.92 2941.053 109.353 36.143 5.578 0.805 30.858
100 609.92 2940.945 137.884 39.737 4.423 0.587 33.893
(sigue en la pagina siguiente)

367
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.8: Continuacion de la tabla parametros


hidraulicos TR = 500 a
nos

Sta Q (m3 /s) Elev (m) Area(m2 ) Perm (m) V(m/s) Froude Ancho (m)

101 609.92 2941.314 173.14 45.545 3.523 0.444 38.246


102 609.92 2941.492 203.275 48.45 3 0.373 39.397
103 609.92 2941.686 240.178 50.924 2.539 0.291 40
104 609.92 2941.45 205.149 56.747 2.973 0.325 40
105 609.92 2936.45 54.233 22.011 11.246 1.683 18.148
106 609.92 2936.002 67.317 33.193 9.06 1.428 28.59
107 609.92 2935.106 72.988 31.018 8.356 1.301 32.823
108 609.92 2934.314 77.031 29.157 7.918 1.203 26.723
109 609.92 2933.73 76.113 31.301 8.013 1.307 27.871
110 609.92 2935.116 138.639 40.545 4.399 0.615 34.709
111 609.92 2934.492 115.565 38.131 5.278 0.713 33.098
112 609.92 2935.086 153.312 42.455 3.978 0.511 36.385
113 609.92 2935.339 179.518 45.425 3.398 0.427 39.058
114 609.92 2932.248 72.763 35.12 8.382 1.283 31.813
115 609.92 2931.598 76.48 33.938 7.975 1.324 31.105
116 609.92 2930.299 74.509 35.253 8.186 1.687 32.213
117 609.92 2932.501 175.553 44.022 3.474 0.469 37.453
118 609.92 2930.336 83.358 32.821 7.317 1.26 28.936
119 609.92 2929.755 79.404 32.586 7.681 1.249 29.684
120 609.92 2931.184 158.102 42.111 3.858 0.536 36.766
121 609.92 2928.356 74.733 37.848 8.161 1.662 36.142
122 609.92 2930.732 182.649 48.464 3.339 0.485 40
(sigue en la pagina siguiente)

368
Apendice D. RESULTADOS DEL PROGRAMA

Cuadro D.8: Continuacion de la tabla parametros


hidraulicos TR = 500 a
nos

Sta Q (m3 /s) Elev (m) Area(m2 ) Perm (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
endice E

PLANOS

Los planos corresponden a:

Componente hidrologico

Plano Cartografico del cuenca

Plano Red Topologico de la cuenca

Plano Altitudinal de la cuenca.

Plano perfil longitudinal del cauce principal

Componente hidraulico

Planos planta y secciones transversales del ro Huallaga.

370

Potrebbero piacerti anche