Hidraulica
Hidraulica
Hidraulica
Ayacucho Perú
2009
PRESENTACIÓN
La presente tesis lleva por tı́tulo Programa Lluvia Escorrentı́a Para Simulación de De-
fensas Ribereñas con ObjectARX C++, como una contribución a la investigación y pro-
gramación en el área de la ingenierı́a hidráulica. La realización de esta investigación sale
a luz luego de haber trabajado en múltiples problemas relacionados con el estudio de
defensas ribereñas y tránsito de flujos en cauces naturales, con el afán de plasmar me-
diante un programa informático que involucre análisis hidrológico, análisis hidráulico y
finalmente hidráulica fluvial, se plantea el desarrollo informático mediante el lenguaje de
programación C++ y ObjectARX. Esperando que su aplicación sirva a todos aquellos
profesionales y estudiantes inmersos a la hidráulica.
i
DEDICATORIA
ii
AGRADECIMIENTOS
iii
Al Ingeniero Jaime Bendezú Prado, por su entusiasmo, dinamismo y sobre
todo empeño en las clases académicas.
Al Dr. Hugo Scaletti, Dr. Julio Kuroiwa, Dr. Jorge Abad, personas de gran
conocimiento y sobre todo demostrando sencillez, a ellos por atender mis con-
sultas y despejar mis dudas en mi formación profesional.
Especı́ficamente, la tesis trata del desarrollo de un programa llamado PLEDER, que viene
a ser las iniciales del nombre de la investigación realizada. EL lenguaje de programación
utilizado es C++ con enlaces de librerı́as ObjectARX, el cual facilita el acceso a las
estructuras de la base de datos de AutoCAD, siendo el acceso directo, también facilita
el acceso al sistema gráfico, permitiendo definir comandos nativos dentro de programa
AutoCAD, además crea objetos personalizados en la base de datos para las aplicaciones
especificas.
El contenido teórico de la presente tesis de investigación, explica los pasos y los procedi-
mientos a seguir mediante la utilización de los diferentes métodos que se desarrollan en los
capı́tulos 2, 3, 4 y 5, más adelante se resume el contenido de éstos capı́tulos divididos en
etapas. En el capı́tulo 6, se hace referencia a la aplicación práctica mediante el programa
elaborado, el cual permitirá comprobar la relación teórico-práctico. Finalmente se adjunta
los diagramas de flujo y el código fuente del programa.
v
En la etapa Hidrológica, se desarrolla la programación de los modelos matemáticos para
simulación precipitación escorrentı́a desde generación de hietogramas, en el cual se utiliza
dos metodologı́as como el método de IILA-SENAMHI-UNI mediante el método del bloque
alterno propuesto por Ven Te Chow, método de los hietogramas sintéticos de tormentas
desarrollado por el Servicio de Conservación de Suelos del Departamento de Agricultura
de los EEUU (1986), en la actualidad (NRCS). Determinación de abstracciones, mediante
el modelo del número de curva propuesto por el NRCS de los EEUU. Determinación de
hidrogramas unitarios, donde se emplea los modelos del Hidrograma Unitario Sintético de
Snyder y del NRCS. Determinación de hidrogramas de máximas avenidas: Esta etapa se
desarrollará mediante el método de convolución directa.
Portada
Presentación I
Dedicatoria II
Agradecimientos III
Resumen V
Índice de Figuras XV
1. INTRODUCCIÓN 1
1.1. Antecedentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
vii
ÍNDICE GENERAL
1.3.1. Generales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3.2. Especı́ficos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2.1. IILA-SENAMHI-UNI . . . . . . . . . . . . . . . . . . . . . . . . . . 9
viii
ÍNDICE GENERAL
3.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
4.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
ix
ÍNDICE GENERAL
5.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
x
ÍNDICE GENERAL
Bibliografı́a 132
E. PLANOS 370
xi
Índice de cuadros
xii
ÍNDICE DE CUADROS
xiii
ÍNDICE DE CUADROS
xiv
Índice de figuras
(P −0,2S)2
2.4. Solución gráfica de la ecuación Pe = P +0,8S
, (Fuente: Chapter 10 Esti-
mation of Direct Runoff from Storm Rainfall ) . . . . . . . . . . . . . . . . 16
xv
ÍNDICE DE FIGURAS
xvi
ÍNDICE DE FIGURAS
xvii
Capı́tulo 1
INTRODUCCIÓN
1.1. Antecedentes
A inicios de los años 60, con la aparición de las primeras computadoras se realizaron
numerosos programas para calcular y/o transformar la lluvia-escorrentı́a y tránsito de
flujos en canales, aplicando distintas metodologı́as, pero en estos años, aún era limitado
desarrollar programas con variables múltiples debido a las limitaciones de las memorias
que ofrecı́an en ese entonces; tal es el caso del desarrollo de programas para la hidrologı́a
determinı́stica y algunos estocásticos con series limitadas debido a las dimensiones cortas
de sus matrices. Conforme pasaron los tiempos y paralelo al avance de la tecnologı́a, se
mejoró considerablemente metodologı́as computacionales dentro del área de hidráulica e
hidrologı́a, realizando softwares en su máxima expresión, considerando modelos tridimen-
sionales en el espacio y no permanentes en el tiempo, con soluciones numéricas avanzadas
tales como el Método de los Elementos Finitos y/o soluciones mediante la utilización de
Inteligencia Artificial, tales como Algoritmos Genéticos, Redes Neuronales Artificiales,
entre otros.
1
1.2. Necesidad o motivación de la investigación
Se espera que el trabajo constituya una herramienta útil, no sólo para profesionales in-
mersos en el área de hidráulica e hidrologı́a, sino que también se convierta en una ayuda
para los estudiantes interesados en el tema.
Este tema de investigación, surge con la necesidad de contar con una herramienta de tra-
bajo con múltiples opciones, de tal forma que faciliten la elaboración de diversos proyectos
como es el caso de obras hidráulicas e hidrológicas propios de la Ingenierı́a Civil; por otro
lado el interés de ampliar y profundizar mis conocimientos de programación aplicada,
permitieron hacer una realidad y lograr el producto final como es PLEDER en su primera
versión.
2
1.3. Objetivos de la tesis
1.3.1. Generales
1.3.2. Especı́ficos
3
1.4. Organización de la tesis
• Programación del método del paso estándar para simulación de cauces aluviales
en flujo permanente gradualmente variado a través de n secciones transversales
de un rı́o.
Todos los tres aspectos anteriores serán enlazados de tal manera de contar con una
herramienta de programación sumamente útil que permita diseñar en forma segura
y óptima una defensa ribereña.
4
1.4. Organización de la tesis
5
1.4. Organización de la tesis
6
Capı́tulo 2
TEORÍA HIDROLÓGICA Y
DIAGRAMAS DE FLUJO
2.1. Introducción
En este capı́tulo se hace referencia los datos necesarios que considera el programa para
transformar la lluvia o precipitaciones netas en caudales (hidrogramas) para distintas
variaciones de tiempo, ası́ mismo, se detalla mediante diagramas de flujo el procedimiento
7
2.2. Desarrollo de Hietogramas de diseño
La palabra Hietograma proviene del término griego Hietos, que significa lluvia. Es un
resumen gráfico escalonado de un conjunto de datos, donde nos permite ver pautas que
son difı́ciles de observar en una simple tabla numérica (expresa precipitación en función
del tiempo). En ordenadas puede figurar la precipitación caı́da (mm), o bien la intensidad
de precipitación (mm/hora). Generalmente se representa como un histograma (gráfico
barras), aunque a veces también se expresa como un gráfico de lı́neas.
8
2.2. Desarrollo de Hietogramas de diseño
2.2.1. IILA-SENAMHI-UNI
para 3 ≤ t ≤ 24 horas:
Pt,T = a (1 + KLogT ) tn (2.2.1)
para t ≤ 3 horas:
Pt,T = a (1 + KLogT ) (t + b)n−1 t (2.2.3)
Donde Pt,T , it,T son la precipitación y la intensidad de tormenta para una duración t (en
horas) y de periodo de retorno T (en años) dados; a,K y n son constantes regionales. El
parámetro b se clasifica según las regiones naturales del Perú
El valor 0.40 horas (sierra), fue determinado en base a estudios de pluviógrafos en las
estaciones de Abancay y Chuquibamba.
El Natural Resources Conservation Service del US (NRCS) o conocido antes como (SCS)
Soil Conservation Service, desarrolló hidrogramas sintéticos de tormentas para utilizarse
9
2.2. Desarrollo de Hietogramas de diseño
Los tipos I y IA corresponde al clima marı́timo del pacı́fico con inviernos húmedos y
veranos secos, el tipo III representa zonas a lo largo del Golfo de Mexico y de las zonas
costeras del Atlántico, donde las tormentas tropicales a las 24 horas del dı́a son grandes
cantidades de precipitación, y el tipo II representa el resto del paı́s (NRCS,1986).
10
2.2. Desarrollo de Hietogramas de diseño
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)
11
2.3. Tasas de Infiltración - Método del NRCS
Pt/P24
1
0.9
0.8
0.7
0.6
0.5
0.4
0.3
Tipo I
Tipo IA
0.2
Tipo II
Tipo III
0.1
0
0 2 4 6 8 10 12 14 16 18 20 22 24
Tiempo (horas)
Para obtener estas precipitaciones, empleamos el método del NRCS, cuyo procedimiento
1
Precipitación Neta: generalmente se utiliza para la precipitación que produce escorrentı́a directa,
aunque en otros estudios se refiere a la diferencia precipitación - evaporación
12
2.3. Tasas de Infiltración - Método del NRCS
(P − Ia )2
Pe = (2.3.1)
(P − Ia ) + S
y cuando P ≤ Ia
Pe = 0 (2.3.2)
Donde:
13
2.3. Tasas de Infiltración - Método del NRCS
Fa Pe
= (2.3.3)
S P
Donde:
F a = P − Pe (2.3.4)
P − Pe Pe
= (2.3.5)
S P
Despejando Pe
P2
Pe = (2.3.6)
P +S
Fa Pe
= (2.3.7)
S P − Ia
Donde:
14
2.3. Tasas de Infiltración - Método del NRCS
Fa ≤ S y Pe ≤ (P − Ia )
F = (P − Ia ) − Pe (2.3.8)
(P − Ia ) − Pe Pe
= (2.3.9)
S P − Ia
(P − Ia )2
Pe = (2.3.10)
(P − Ia ) + S
Ia = 0,2S (2.3.11)
(P − 0,2S)2
Pe = (2.3.12)
P + 0,8S
1
Resultado obtenido al estudiar muchas cuencas experimentales pequeñas
15
2.3. Tasas de Infiltración - Método del NRCS
(P −0,2S)2
Figura 2.4: Solución gráfica de la ecuación Pe = P +0,8S
, (Fuente: Chapter 10 Estimation
of Direct Runoff from Storm Rainfall )
1000
S= − 10 (2.3.13)
CN
16
2.3. Tasas de Infiltración - Método del NRCS
25400
CN = (2.3.14)
254 + S
Los números de curva que se muestran en la figura 2.4 se aplican para condiciones an-
tecedentes de Humedad (AMC, por sus siglas en inglés) normales (AMC II). Para condi-
ciones secas (AMC I) o condiciones húmedas (AMC III), los números 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)
En el cuadro 2.2 se muestra el rango para las condiciones antecedentales de humedad para
cada clase. Los números de curva han sido tabulados por el NRCS con base en el tipo de
suelo y uso de la tierra. Se definen cuatro tipos de suelo( ver tabla 2.3). Los valores de
CN para varios tipos de uso de tierra en estos tipos de suelo, se pueden obtener la tabla
5.5.2 Hidrologı́a Aplicada Vent Te Chow, Pág. 154.
17
2.4. Hidrogramas Unitarios Sintéticos: NRCS y Snyder
der
18
2.4. Hidrogramas Unitarios Sintéticos: NRCS y Snyder
La lluvia en exceso está distribuida de manera uniforme sobre toda el área de drena-
je. El área de drenaje no debe ser muy grande o bien deberá ser subdividida en
2
subcuencas de modo que se cumpla esta suposición
La duración del escurrimiento directo (tiempo base del hidrograma unitario) que
resulta del exceso de lluvia de duración conocida es constante.
19
2.4. Hidrogramas Unitarios Sintéticos: NRCS y Snyder
Principios Básicos
La derivación y aplicación del Hidrograma Unitario está basada en una teorı́a empı́rica
que está conformada por dos teoremas o principios básicos que se aplican en todos los
casos:
20
2.4. Hidrogramas Unitarios Sintéticos: NRCS y Snyder
Pe1 ie Qe
= 1 = 1 =k (2.4.1)
Pe2 ie2 Qe2
Para emplear el método del hidrograma unitario es necesario conocer los registros de pre-
cipitación y tener al menos un hidrograma medido a la salida de la cuenca. Sin embargo
en la mayorı́a de las cuencas, especialmente en nuestro paı́s, no se cuenta con estaciones
hidrométricas o registros pluviográficos que sirven para generar dicho dato importante en
la utilización del método hidrograma unitario. Para estos casos, podemos utilizar algu-
nas fórmulas empı́ricas que, basándose en las caracterı́sticas fı́sicas 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 sintéticos.
21
2.4. Hidrogramas Unitarios Sintéticos: NRCS y Snyder
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
La figura 2.6 muestra uno de éstos hidrogramas adimensionales, con una forma similar a la
que puede esperarse en una cuenca real. Basándose en una gran cantidad de hidrogramas
unitarios, el NRCS sugiere que el tiempo de recesión puede aproximarse a 1,67Tp . Como
el área del hidrograma es igual a 1cm, se demuestra que:
2,08A
qp = (2.4.2)
Tp
Bajo esta condición se obtiene el tiempo de ocurrencia del pico Tp que se expresa en
términos del tiempo de retardo tp y de la duración de la lluvia efectiva tr .
22
2.4. Hidrogramas Unitarios Sintéticos: NRCS y Snyder
tr
Tp = + tp (2.4.4)
2
Snyder (1938), realizó estudios en cuencas de los Montes Apalaches (USA), con áreas
de 30 a 30000 km2 y encontró relaciones sintéticas de un hidrograma unitarios sintético
estándar, como se muestra en la figura 2.7a, a partir de las cuales pueden calcularse las
caracterı́sticas de un hidrograma unitarios requerido 2.7b.
Figura 2.7: a) Hidrograma Unitario estándar (tp = 5,5tr ); b) Hidrograma Unitario re-
querido (tp 6= 5,5tr ). Fuente [11]
Para una duración de lluvia efectiva determinada, los parámetros del hidrograma unitario
requerido son:
Tiempo base, tb .
23
2.4. Hidrogramas Unitarios Sintéticos: NRCS y Snyder
Snyder definió el hidrograma unitario estándar como aquel que cumple que:
tp
tr = (2.4.5)
5,5
Donde L es la longitud del cauce principal hasta la divisoria de aguas arriba [km], Lc es
la distancia desde la salida de la cuenca hasta el punto del cauce principal más cercano al
centroide del área de la cuenca [km] y Ct es un coeficiente que varı́a entre 1.35 (pendientes
altas) y 1.65 (pendientes bajas). También para el hidrograma unitario estándar se encontró
que el caudal pico por unidad de área [m3 /s · km2 ] es:
2,75Cp
qp = (2.4.7)
tp
Una forma de calcular los parámetros Ct y Cp , es a partir de los datos: área de cuenca A
[km2 ], longitud del cauce principal L [km], Longitud hasta el centroide de la cuenca Lc
[km], duración tR [h], retardo de la cuenca tpR [h] y Qp [m3 /s/cm], donde:
tR = tr
Si tpR = 5,5tR tpR = tP (2.4.8)
qpR = qp
24
2.4. Hidrogramas Unitarios Sintéticos: NRCS y Snyder
tr −tR tpR −0,25tR
tp = tpR + , con tr =
4 5,25
Si tpR 6= 5,5tR tpR = tP (2.4.9)
qpR = qp
Para ambos casos Ct y Cp son calculados mediante las ecuaciones 2.4.6 y 2.4.7.
El programa PLEDER, emplea ecuaciones para cada intervalo de tiempo, según la figura
2.8, cuyo hidrograma se divide en 6 intervalos (siete vértices).
25
2.4. Hidrogramas Unitarios Sintéticos: NRCS y Snyder
Cálculo de las ecuaciones lineales para cada tramo del hidrograma unitario
sintético Snyder
tR
Tramo AB: 0 ≤ T ≤ 2
+ tpR − 31 W50
0,5QpR
Q= tR T (2.4.10)
2
+ tpR − 13 W50
tR tR
Tramo BC: 2
+ tpR − 13 W50 < T ≤ 2
+ tpR − 31 W75
3QpR tR 1
Q = 0,5QpR + T− − tpR + W50 (2.4.11)
4(W50 − W75 ) 2 3
tR tR
Tramo CD: 2
+ tpR − 31 W75 < T ≤ 2
+ tpR
3QpR tR 1
Q = 0,75QpR + T− − tpR + W75 (2.4.12)
4W75 2 3
tR tR
Tramo DE: 2
+ tpR < T ≤ 2
+ tpR + 32 W75
3QpR tR
Q = QpR − T− − tpR (2.4.13)
8W75 2
tR tR
Tramo EF: 2
+ tpR + 23 W75 < T ≤ 2
+ tpR + 23 W50
3QpR tR 2
Q = 0,75QpR − T− − tpR − W75 (2.4.14)
8(W50 − W75 ) 2 3
tR
Tramo FG: 2
+ tpR + 32 W50 < T ≤ tb
26
2.5. Método de Convolución discreta para transformación precipitación-escorrentı́a
0,5QpR tR 2
Q = 0,50QpR − tR T− − tpR − W50 (2.4.15)
tb − 2 − tpR − 23 W50 2 3
Donde: T , es el tiempo que se distribuye a lo ancho del tiempo base tb con un intervalo
fijo en horas.
Q, es la ordenada del hidrograma unitarios sintético.
mación precipitación-escorrentı́a
dS
=I −Q (2.5.1)
dt
dI d2 I dQ d2 Q
S = f I, , 2 , ...Q, , (2.5.2)
dt dt dt dt2
27
2.5. Método de Convolución discreta para transformación precipitación-escorrentı́a
dI d2 I dn−1 I dQ d2 Q dm−1 Q
S = a1 I + a2 + a3 2 + ... + an n−1 + b1 Q + b2 + b3 2 + ... + bm m−1 (2.5.3)
dt dt dt dt dt dt
Donde a1 , a2 , ...an , b1 , b2 , ...bm , son constantes y las derivadas de orden superior se despre-
cian.
dn I dn−1 I d2 I dI
an n
+ ... + a n−1 n−1
+ ... + a 2 2
+ a1 − I+
dt dt dt dt (2.5.4)
dm Q dm−1 Q d2 Q dQ
bm m + ... + bm−1 m−1 + ... + b2 2 + b1 +Q=0
dt dt dt dt
dn dn−1 d2 d
N (D) = an n
+ ... + a n−1 n−1
+ ... + a 2 2
+ a1 − 1
dt dt dt dt
28
2.5. Método de Convolución discreta para transformación precipitación-escorrentı́a
y
dm dm−1 d2 d
M (D) = −bm m
− ... − b m−1 m−1
− ... − b 2 2
− b1 − 1
dt dt dt dt
Resolviendo queda.
N (D)
Q(t) = I(t) (2.5.6)
M (D)
La relación N (D)/M (D) es llamado función de transferencia del sistema, que describe la
respuesta de la salida a una secuencia de entrada dada (CHOW and VENT T [11]), ası́
1
mismo la ecuación 2.5.4, representa el modelo general del sistema hidrológico.
En Las aplicaciones prácticas, las salidas de los resultados se requieren en intervalos tiempo
discretos 2 , ya que la entrada al sistema se especifica como una función de tiempo discreto,
por ejemplo, un hietograma de lluvia efectiva que se dan en intervalos de tiempos ∆t; Es
decir, los datos de la lluvia se dan como un conjunto de datos pulso (sistema de información
por pulso). Éste sistema se utiliza para la precipitación y el valor de su función de entrada
discreta para el m-ésimo intervalo de tiempo es:
Z m∆t
Pm = I(τ )dt , m = 1, 2, 3, ... (2.5.7)
(m−1)∆t
1
Presentada por Chow y Kulandaiswamy
2
Debido a que la mayor parte de la información hidrológica solamente está disponible en intervalos de
tiempo discretos.
29
2.5. Método de Convolución discreta para transformación precipitación-escorrentı́a
Z (n−m+1)∆t
1
h[(n − m + 1)∆t] = u(l)dl (2.5.9)
∆t (n−m)∆t
Para el pulso m
Pm
I(τ ) = , (m − 1)∆t ≤ τ ≤ m∆t
∆t
I(τ ) = 0 , τ > M ∆t
Z n∆t
Qn = I(τ )u(n∆t − τ )dτ
0
P1 ∆t P2 2∆t
Z Z
= u(n∆t − τ )dτ + u(n∆t − τ )dτ + ... (2.5.10)
∆t 0 ∆t ∆t
Pm m∆t PM M ∆t
Z Z
= u(n∆ − τ )dτ + ... + u(n∆t − τ )dτ
∆t (m−1)∆ ∆t (M −1)∆t
30
2.5. Método de Convolución discreta para transformación precipitación-escorrentı́a
Z m∆t Z (n−m)∆t
Pm Pm
u(n∆t − τ )dτ = −u(l)dl
∆t (m−1)∆t ∆t (n−m+1)∆t
Z (n−m+1)∆t
Pm (2.5.11)
= u(l)dl
∆t (n−m)∆
= Pm h[(n − m + 1)∆t]
volución Discreta
Se entiende que Un = h[n∆t], Un−1 = h[(n − 1)∆t]... y Un−M +1 = h[(n − M + 1)∆t]. Reem-
plazando en la ecuación 2.5.12 la versión en tiempo discreto de la integral de convolución
es:
31
2.5. Método de Convolución discreta para transformación precipitación-escorrentı́a
M
X
Qn = P1 Un + P2 Un−1 + ... + Pm Un−m+1 + .. + PM Un−M +1 = Pm Un−m+1 (2.5.14)
m=1
n≤M
X
Qn = Pm Un−m+1 (2.5.15)
m=1
min(n,M )
X
Qn = Pm Un−m+1 (2.5.16)
m=max(1,n−nU +1)
Está ecuación facilita la solución numérica, ası́ mismo cabe señalar que dicha ecuación
es generalizada para resolver problemas que involucren el método de convolución, por
ejemplo, Matlab contiene el algoritmo (conv.m) para la convolución discreta, el cual usa
la ecuación 2.5.16. El programa PLEDER, emplea el mismo algoritmo, mediante la clase
convolución, con el objetivo de resolver la transformación lluvia escorrentı́a mediante esta
ecuación.
32
2.6. Diagramas de Flujo
33
2.6. Diagramas de Flujo
34
Hietograma IILA Hietograma NRCS
SENAMHI
INICIO PLEDER HIDROLOGIA
Parámetros regionales a, b, k, Precipitaciones máximas de 24
n, Δt, t, período de retorno tr. horas (P24), Tipo de tormenta.
V
T ≤ 3 horas F Tipo de Tormenta
Tipo I Tipo IA Tipo II Tipo III
Ecuación 2.2.3. Cálculo de Ecuación 2.2.1. Cálculo de
precipitaciones acumuladas, precipitaciones acumuladas,
incrementales y alternas. incrementales y alternas. Precipitaciones acumuladas, incrementales
Exportar a .csv
Exportar a .csv
Cálculo de Pulsos o Cálculo Lluvia
Cálculo de hidrogramas
escorrentía directa. Escorrentía. Unitarios Sintéticos
Modelos Meteorológicos.
Hidrograma Unitario Sintético
Tormenta NRCS IILA SENAMHI
H.U.S. NRCS H.U.S. SNYDER
Precipitaciones máximas de 24 Parámetros regionales a, b, k,
Tiempo de Tiempo de retardo
horas (P24), Tipo de tormenta. n, Δt, t, período de retorno tr.
retardo (Tlag) Coeficiente Cp
Abstracciones mediante Convolución Discreta
el método NRCS Ordenadas del Hidrograma Unitario (U)
í ,
P U
Pulsos (P) ó á ,
escorrentía directa
Caudales (m³/s)
35
2.6. Diagramas de Flujo
FIN PLEDER HIDROLOGIA
2.6. Diagramas de Flujo
INICIO HIETOGRAMA IILA SENAMHI
N, a, b, k, n, dt, Var, Tr, D
i = 1, hasta N,
i = i+1
V F
3
1 1
i = 1, hasta N,
i = i+1
V F
/2
1 2 2
Precipitaciones
Alternas (mm)
FIN HIETOGRAMA IILA SENAMHI
36
2.6. Diagramas de Flujo
INICIO HIETOGRAMA NRCS
P24, Ndt, Tormenta
24
/60
24
Datos hidrológicos,
Tormenta NRCS
i = 0, hasta N+1,
i = i+1
1 24 1
1 1
Precipitaciones
Incrementales (mm)
FIN HIETOGRAMA NRCS
37
2.6. Diagramas de Flujo
INICIO HIDROGRAMA UNITARIO
SINTÉTICO NRCS
Tlag, DT, dt
2
12.48
Datos Hidrograma Unitario
adimensional NRCS
i = 1, hasta nU,
i = i+1
ó nU, q, t, DT x i
Ordenadas del
Hidrograma Unitario
FIN HIDROGRAMA UNITARIO
SINTÉTICO NRCS
38
2.6. Diagramas de Flujo
INICIO HIDROGRAMA UNITARIO
SINTÉTICO SNYDER
, , , ,
4
2.75
2.14 .
1.22 .
i = 1, hasta nU,
i = i+1
/60
, , , , ,
Ordenadas del
Hidrograma Unitario
FIN HIDROGRAMA UNITARIO
SINTÉTICO NRCS
39
2.6. Diagramas de Flujo
INICIO ABSTRACCIONES NRCS
Palterna , CN, nP
25400 254
0.2
i= 1, hasta nP,
i = i+1
1 alterna
V F
Pacum i
V F
i
0.0
)
1
Precipitación en
Exceso (mm)
FIN ABSTRACCIONES NRCS
40
2.6. Diagramas de Flujo
INICIO CONVOLUCIÓN DISCRETA
Ordenadas Hidrograma
Unitario [U], Pulsos [P], nP, nU
M = nP
nQ = M+nU‐1
A = máx(1,n‐nU+1)
B = mín(n, M)
n = 1, hasta nQ,
n = n+1
0.0
m = A, hasta B,
m = m+1
P m xU n m 1
Caudales (m³/s)
FIN CONVOLUCIÓN DISCRETA
41
Capı́tulo 3
TEORÍA HIDRÁULICA Y
SECCIONES TRANSVERSALES
EN RÍOS
3.1. Introducción
42
3.2. Bases teóricos para el cálculo de flujo unidimensional
sional
Se entiende por flujo unidimensional cuando se ignora las variaciones de los cambios en la
velocidad y la presión en el sentido perpendicular a la dirección principal del flujo. Para
su solución numérica se tiene como base fundamental los tres principios derivados de la
fı́sica:
Conservación de la Masa.
Conservación de la Energı́a.
Es importante mencionar las ecuaciones que provocan el movimiento de una masa ele-
mental, para caso nuestro la masa elemental es el fluido. De la segunda ley de Newton se
sabe que la fuerza es igual a la masa por la aceleración (resultado vectorial):
F = ma (3.2.1)
Z s2 Z s2
1
F ds = m ads = m(v22 − v12 ) (3.2.2)
s1 s1 2
43
3.2. Bases teóricos para el cálculo de flujo unidimensional
Z t2 Z t2
1
F dt = m adt = m(v2 − v1 ) (3.2.3)
t1 t1 2
Esta última expresión muestra que el impulso (fuerza por tiempo) aplicado a un cuerpo
es igual al momentum (masa por velocidad).
Estos enfoques son importantes en las aplicaciones para el movimiento de los flujos
(Ecuación de la Energı́a, Ecuación de Momentum).
44
3.2. Bases teóricos para el cálculo de flujo unidimensional
p∆n (3.2.4)
∂p
(p + ∆s)∆n (3.2.5)
∂s
ρg∆s∆nsin(θ) (3.2.7)
∂p ∂Z
Fr = p∆n − (p + ∆s)∆n − ρg∆s∆n (3.2.8)
∂s ∂s
∂p ∂Z
Fr = − ∆s∆n − ρg∆s∆n (3.2.9)
∂s ∂s
Aplicando la segunda ley de movimiento, la fuerza resultante es igual a la masa del fluido
45
3.2. Bases teóricos para el cálculo de flujo unidimensional
∂P ∂Z
ρ∆s∆nas = − ∆s − ρg∆s∆n (3.2.10)
∂s ∂s
Simplificando
∂p ∂Z ∂
ρas = − − ρg = (p + γZ) (3.2.11)
∂s ∂s ∂s
∂Vs
El término ∂t
se denomina aceleración local y se anula cuando el flujo es Permanente
o Estacionario, es decir, independiente del tiempo. El término siguiente forma la acel-
eración convectiva, que aparece cuando la partı́cula se mueve a través de regiones donde
la velocidad varı́a.
∂Vs ∂Vs ∂
ρ( + Vs ) + (p + γZ) = 0 (3.2.13)
∂t ∂s ∂s
46
3.2. Bases teóricos para el cálculo de flujo unidimensional
∂Vs
Los flujos permanentes ocurren cuando las aceleraciones locales, son cero, esto es, si ∂t
dVs d
ρVs + (p + γZ) = 0 (3.2.14)
ds ds
1 2
ρV + p + γZ = Constante (3.2.15)
2 s
Dividiendo entre γ
p Vs2
Z+ + = H = Constante (3.2.16)
γ 2g
Es una de las formas alternativas de la ecuación de Bernoulli. Esta ecuación puede apli-
carse a lo largo de una lı́nea de corriente, en un fluido ideal sin rozamiento, pero la
1
aplicación de la misma en otra dirección exige que el fluido sea irrotacional.
En una superficie libre se presenta el flujo uniforme, cuando en sus diferentes secciones,
las caracterı́sticas de circulación, velocidad, distribución de presiones, profundidad de
circulación, etc son iguales. En los cauces naturales, que corresponde a la aplicación de
esta tesis, en algunos casos puede considerarse la existencia del régimen uniforme en
1
Flujo Irrotacional: Se da cuando la vorticidad resulta cero, la velocidad debe de ser igual a la
gradiente de un escalar, φ, conocido como potencial de velocidad: ∇x(∇φ) = 0
47
3.3. Secciones Transversales en Cauces Naturales y Cálculo Numérico.
En el flujo uniforme, la aceleración local y convectiva son cero, por lo tanto, la ecuación
3.2.13 se reduce.
d
(p + γZ) = 0 (3.2.17)
ds
Integrando se tiene.
p
+ Z = Constante (3.2.18)
γ
Cálculo Numérico.
48
3.3. Secciones Transversales en Cauces Naturales y Cálculo Numérico.
por una serie de puntos o coordenadas (X ,Y), cuyos valores de X forman la longitud de la
sección transversal y los valor de Y las alturas con respecto a un DATUM. En principio,
las formas de estas secciones pueden variar a lo largo del canal (canal no prismático).
El programa PLEDER, divide las secciones transversales en tres partes (i, j, k), donde ”i”
representa las caracterı́sticas geométricas de la sección margen izquierda, ”j” los trapecios
conformados por los puntos sucesivos con el lı́mite de la superficie libre de agua o cota
tirante, finalmente ”k” representa la geometrı́a de las sección en la margen derecha.
49
3.3. Secciones Transversales en Cauces Naturales y Cálculo Numérico.
En una sección transversal natural de los cauces, es importantes representar de esta mane-
ra, ya que simplifica las operaciones matemáticas para obtener los resultados geométricos
de cada sección transversal que más adelante se presenta. En la figura anterior se mues-
tra que, en los extremos se forman triángulos (i, k), esto ocurre cuando existe un ángulo
entre la lı́nea del terreno (plantilla del canal) y la superficie libre. En la parte central se
forman trapecios, cuya área hidráulica y perı́metro hidráulico se obtienen después de una
sumatoria en cada una de ellas.
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
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)
1 2 Xk+1 − Xk
A = Ak = (Y − Yk ) (3.3.5)
2 Yk+1 − Yk
50
3.4. Cálculo del Tirante Normal
s 2
(Y − Yk )(Xk+1 − Xk )
P = Pk = (Y − Yk )2 + (3.3.6)
Yk+1 − Yk
Para el análisis y diseño de canales abiertos es necesario conocer el Tirante Normal, que
forma parte de las caracterı́sticas hidráulicas de un canal. En la mayorı́a de los textos
exponen los cálculos numéricos solo para canales con secciones transversales conocidos
tales como rectangulares, triangulares, trapezoidales, parabólicos y otros que derivan a
ecuaciones lineales en la solución del tirante normal, entonces, para el análisis en cauces
naturales aproximan a estas secciones mencionadas perdiendo precisión y garantı́a en
la obtención de sus resultados. La mejor forma de representar es a través de los puntos
coordenados, ası́ se puede generalizar estas secciones transversales obteniéndose resultados
mas precisos y más compactos. Parte del objetivo de esta tesis es tratar en lo posible de
generalizar las ecuaciones, en tal forma que sus resultados cumplan para todo tipo de
secciones transversales (desde los más comunes hasta las más complejas).
Para la solución del tirante normal se tomará en cuenta las ecuaciones de Manning Strick-
ler, Chezy (Antoine de Chézy) y Darcy-Weisbach.
1/2
R2/3 Sf
v= (3.4.1)
n
p
v=C RSf (3.4.2)
51
3.4. Cálculo del Tirante Normal
1/2 ks 1,255υ
v = −(32gRSf ) log + (3.4.3)
14,8R R(32gRSf )1/2
Estas tres ecuaciones presentan ecuaciones no lineales, que para su solución en cauces
naturales requieren de métodos numéricos avanzados. Existen varios métodos para resolver
ecuaciones no lineales, tales como el Método de Bisección, Método de Aproximaciones
Sucesivas, Método de Newton Raphson, entre otros mas y menos eficientes. En esta tesis
usamos el Método de Newton Raphson, cuya sintaxis es la siguiente.
F (y) = 0 (3.4.4)
y = Y + ∆Y (3.4.5)
F (y)
∆Y = − (3.4.6)
F 0 (y)
Manning Strickler
52
3.4. Cálculo del Tirante Normal
nQ
F (Y ) = A5/3 P −2/3 − √ =0 (3.4.8)
S
|{z}
Constante
dF
Derivando la función F(Y) con respecto a “Y” ( dY )se tiene:
dF d 5/3 −2/3 nQ 5 −2/3 2/3 dA 2 5/3 −5/3 dP
= A P −√ = P A − A P (3.4.9)
dY dy S 3 dY 3 dY
X
A = Ai + Aj + Ak (3.4.10)
dA dAi d X dAk
= + Aj + (3.4.11)
dY dY dY dY
dAi
Cálculo de dY
dAi d 1 2 Xi+1 − Xi
= (Y − Yi+1 )
dY dY 2 Yi − Yi+1
1 Xi+1 − Xi
= 2 (Y − Yi+1 ) (3.4.12)
Yi − Yi+1
2
Xi+1 − Xi
= (Y − Yi+1 )
Yi − Yi+1
53
3.4. Cálculo del Tirante Normal
representar en función al área del triángulo izquierdo (Ai ), éste se obtendrá dividi-
endo la expresión (3.4.12)con (3.3.1).
Xi+1 −Xi
dAi (Y − Yi+1 )
:
:
:
2 i−
(Y Yi+1 (Y−
) Yi+1 )
(Xi+1 −Xi )
dY Yi −Yi+1
= = 1
Ai 1
(Y − Yi+1 ) 2 Xi+1 −Xi
− Yi+1 )2
: :
2 Yi −Yi+1 (Y (Xi+1
−Xi ) i−
(Y Yi+1
)
dAi 2Ai
= (3.4.13)
dY (Y − Yi+1 )
d
P
Cálculo de dY
Aj
d X d X1
Aj = [(Y − Yj ) + (Y − Yj+1 )] (Xj+1 − Xj )
dY dY 2
X
d X
Aj = (Xj+1 − Xj ) (3.4.14)
dY
dAk
Cálculo de dY
dAk d 1 2 Xk+1 − Xk
= (Y − Yk )
dY dY 2 Yk+1 − Yk
1 Xk+1 − Xk
= 2 (Y − Yk )
(3.4.15)
2
Yk+1 − Yk
Xk+1 − Xk
= (Y − Yk )
Yk+1 − Yk
Xk+1 −Xk
dAk (Y − Yk ) :
:
− (Y− −Xk )
:
dY Yk+1 −Yk 2
(Y
k+1 Yk ) Yk )
(Xk+1
= = 1 (3.4.16)
Ak 1
(Y − Yk )2 Xk+1 −Xk
2 : :
2 Yk+1 −Yk (Y − Yk ) (X
k+1
−X
k )
(Y
k+1 −
Yk )
54
3.4. Cálculo del Tirante Normal
dAk 2Ak
= (3.4.17)
dY (Y − Yk )
dA 2Ai X 2Ak
= + (Xj+1 − Xj ) + (3.4.18)
dY (Y − Yi+1 ) (Y − Yk )
De la misma forma calculamos la derivada del Perı́metro mojando con respecto al tirante
dP
“Y” ( dY )
*0
dP dPi d X dPk
= + Pj +
dY dY dY
dY
dP dPi dPk
= + (3.4.19)
dY dY dY
dPi
Cálculo de dY
s
2
dPi d (Y − Yi+1 )(Xi+1 − Xi )
= (Y − Yi+1 )2 +
dY dY Yi − Yi+1
:
2 (Y − Yi+1 ) + 2 (Y −Yi+1 )(X i+1 −Xi ) −Y −X )
(Y )(X
: i i+1 2 i+1 i
−Y i+1 )(Yi −Yi+1 )
(Yi
= s
2
2
(Y − Yi+1 )(Xi+1 − Xi )
2 (Y − Yi+1 ) +
Yi − Yi+1
| {z }
P erimetro(Pi )
(Y −Yi+1 )(Xi+1 −Xi )2
(Y − Yi+1 ) + (Yi −Yi+1 )2
=
Pi
55
3.4. Cálculo del Tirante Normal
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
Note que la expresión de la derecha viene a ser igual a la ecuación (3.4.20), por lo
tanto reemplazando se tiene.
Pi dPi
=
(Y − Yi+1 ) dY
dPi Pi
= = cosec (θ1) (3.4.22)
dY (Y − Yi+1 )
dPk
Cálculo de dY
Análogamente:
56
3.4. Cálculo del Tirante Normal
Pk dPk
=
(Y − Yi ) dY
dPk Pk
= = cosec (θ2) (3.4.23)
dY (Y − Yk )
dP Pi Pk
= + = cosec (θ1) + cosec (θ2) (3.4.24)
dY (Y − Yi+1 ) (Y − Yk )
57
3.4. Cálculo del Tirante Normal
Chezy
p
Q = AC RSf (3.4.25)
Q
F (Y ) = A3/2 P −1/2 − p =0 (3.4.26)
C Sf
| {z }
Constante
dF
Derivando la función F(Y) con respecto a “Y” ( dY )se tiene:
!
dF d Q 3 dA 1 dP
= A3/2 P −1/2 − p = P −1/2 A1/2 − A3/2 P −3/2
dY dy C Sf 2 dY 2 dY
(3.4.27)
Darcy-Weisbach
1/2 ks 1,255υ
Q = −A(32gRSf ) log + (3.4.28)
14,8R R(32gRSf )1/2
Despejando las variables constantes, para formar la Función principal “F(Y)”, e igualando
esta función cero.
1/2 ks 1,255υ Q
F (Y ) = −A(R) log + 1/2
− =0 (3.4.29)
14,8R R(32gRSf ) (32gRSf )1/2
58
3.4. Cálculo del Tirante Normal
dF
Derivando la función F(Y) con respecto a “Y” ( dY )se tiene:
√ √
−A Rlog(C) − 12 RLn(C) dA dP
dF dY
− R dY A R(D)
= √ − (3.4.30)
dY RLn(10) CLn(10)
Donde:
A
R: Radio Hidráulico R = P
C, D: Constantes.
√ dA dP
!
5Ks 251 v 32 dY
C= + p − A dY2
74R 6400 R 3/2 gSf P P
√
5Ks 251 Rv 32 dA dP
= + −R
74R 6400 AR >p
3/2
gSf dY dY
Donde:
√
5Ks 251 v 32 dA dP
C= + p −R (3.4.31)
74R 6400 A RgSf dY dY
√ dA dP
753 v 32 P − A
dA dP dY dY
5 Ks P dY 5 Ks dY P2
D= − + − √
74 A2 74
A 12800 R5/2 gs
√
dA dP
753 v 32 R dA dP
5 Ks dY 5 Ks dY A dY
− R dY
=− + − √
74 RA 74 A 12800 R5/2 gs
Donde:
√ dA dP
− R dY
5Ks dP 1 dA 753 v 32 dY
D= − − p (3.4.32)
74A dY R dy 12800 AR3/2 gSf
59
3.5. Caracterı́sticas y Clasificación de los Perfiles del Flujo Gradualmente Variado
αV 2
H =Z +Y + (3.5.1)
2g
αQ2 d
dH dZ dY 1
= + + (3.5.2)
dX dX dX 2g dX A2
60
3.5. Caracterı́sticas y Clasificación de los Perfiles del Flujo Gradualmente Variado
dH
= −Sf (3.5.3)
dX
dZ
= −S0 (3.5.4)
dX
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
dY S0 − Sf
= (3.5.6)
dX 1 − (αBQ2 )/(gA3 )
Donde:
2αBQ2 (Q/A)2
F = = (3.5.7)
gA3 (gA)/(αB)
dY S0 − Sf
= (3.5.8)
dX 1 − F2
61
3.5. Caracterı́sticas y Clasificación de los Perfiles del Flujo Gradualmente Variado
Sf ≷ S0 Correspondiente a Y ≶ Yn (3.5.9)
F ≷ 1 Correspondiente a Y ≶ Yc (3.5.10)
Estas desigualdades dividen al canal en tres secciones en la dimensión vertical, tal como se
62
3.5. Caracterı́sticas y Clasificación de los Perfiles del Flujo Gradualmente Variado
muestra en la figura 3.7. Por convención, estas secciones se enumeran del 1 al 3 empezando
desde arriba.
63
3.6. Ecuaciones para el cálculo de perfiles básicos.
Estos datos son necesarios para calcular los tirantes del cauce, empleando el método del
paso estándar.
α1 V12 α2 V22
Z 1 + Y1 + = Z 2 + Y2 + + hf (3.6.1)
2g 2g
Para un caudal dado, el tirante Y1 es conocido en la sección 01. El método del paso
Estándar consiste en determinar el tirante en la sección 02 a una distancia X2 . Primero
64
3.6. Ecuaciones para el cálculo de perfiles básicos.
Q
determinamos la velocidad V1 en la sección 01, V = A
, y en la ecuación de la energı́a (Ec.
3.6.1) representamos de la forma siguiente:
α1 V12
H1 = Z1 + Y1 + (3.6.2)
2g
H2 = H1 − hf (3.6.3)
1
Donde hf , corresponde a la pérdida total entre las secciones 1 y 2
1
H2 = H1 − (Sf1 + Sf2 )(X2 − X1 ) (3.6.5)
2
α2 Q2 1
Z 2 + Y2 + + (Sf1 + Sf2 )(X2 − X1 ) − H1 = 0
2gA22 2
α2 Q2 1 1
Y2 + 2
+ Sf2 (X2 − X1 ) + Z2 − H1 + Sf1 (X2 − X1 ) = 0 (3.6.6)
2gA2 2 2
En la ecuación 3.6.6, A2 y Sf2 son funciones de Y2 y todos los términos restantes son
conocidos (calculados en la sección 01). El tirante Y2 puede ser determinado, resolviendo
la siguiente ecuación algebraica NO-LINEAL con método conocidos tales como Bisección
o el método de Newton Raphson.
1
Pérdida por fricción + pérdida local
65
3.6. Ecuaciones para el cálculo de perfiles básicos.
α2 Q 2 1 1
F (Y2 ) = Y2 + 2
+ Sf2 (X2 − X1 ) + Z2 − H1 + Sf1 (X2 − X1 ) = 0 (3.6.7)
2gA2 2 2
Para usa el método de Newton Raphson, es necesario contar la derivada de la función con
respecto al tirantes por conocer (Y2 ).Éste se obtiene al diferenciar la expresión 3.6.7
dF α2 Q2 dA2 1 dSf2
=1− 3
+ (X2 − X1 ) +0−0+0
dY2 gA2 dY2 2 dY2
También se sabe:
Q2 n2
Sf2 = 4/3
A22 R2
!
dF α2 Q2 dA2 1 d Q2 n2
=1− 3
+ (X2 − X1 ) 4/3
(3.6.8)
dY2 gA2 dY2 2 dY2 A22 R2
!
d Q 2 n2 −2Q2 n2 dA2 4Q2 n2 dR2
4/3
= 4/3
− 7/3
dY2 A22 R2 A32 R2 dY2 3A22 R2 dY2
−2 Q2 n2 dA2 4 Q2 n2 dR2
= −
A2 A22 R24/3 dY2 3R2 A22 R24/3 dY2
| {z } | {z } (3.6.9)
Sf2 Sf2
−2 dA2 4 dR2
= Sf2 − Sf2
A2 dY2 3R2 dY2
Sf2 dA2 2Sf2 dR2
= −2 +
A2 dY2 3R2 dY2
α2 Q2 dA2 1
dF Sf2 dA2 2Sf2 dR2
=1− + (X2 − X1 )(−2) +
dY2 gA32 dY2 2 A2 dY2 3R2 dY2
α2 Q2 dA2
dF Sf2 dA2 2Sf2 dR2
=1− − (X2 − X1 ) + (3.6.10)
dY2 gA32 dY2 A2 dY2 3R2 dY2
66
3.6. Ecuaciones para el cálculo de perfiles básicos.
dR2
La expresión dY2
puede ser reemplazado en función del área y el perı́metro. Ası́:
A
R=
P
dR2 d A2 1 dA2 d 1
= = + A2
dY2 dY2 P2 P2 dY2 dY2 P2
(3.6.11)
1 dA2 A2 dP2
= − 2
P2 dY2 P2 dY2
α2 Q 2
dF B2 2 P2 B2 A2 dP2
=1− B2 − (X2 − X1 ) Sf2 + Sf2 − 2
dY2 gA32 A2 3 A2 P2 P2 dY2
α2 Q2
dF B2 2 Sf2 A2 dP2
=1− B2 − (X2 − X1 ) Sf2 + B2 −
dY2 gA32 A2 3 A2 P2 dY2
α2 Q2
dF 1 B2 2 dP2
=1− B2 − Sf2 (X2 − X1 ) 5 − (3.6.12)
dY2 gA32 3 A2 P2 dY2
Estas ecuaciones sirven para calcular la superficie libre de agua (curva de remanso en un
flujo gradualmente variado) en secciones prismáticas y no prismáticas.
67
Capı́tulo 4
4.1. Introducción
68
4.2. Formulación de Flujos en 1D
El modelo de la onda dinámica en 1D, para flujos en canales abiertos son gobernados por
las ecuaciones de Barre Saint Venant considerando flujos laterales (inflow/outflow). Se
tiene:
∂A ∂Q
+ = ql (4.2.1)
∂t ∂x
βQ2
∂A ∂ ∂Zs
+ + gA + gASf = ql Ux (4.2.2)
∂t ∂x A ∂x
Q|Q|
Sf = (4.2.3)
K2
AR2/3
Donde K viene a ser la conductividad. Para una simple sección transversal, K = n
;
con R Radio Hidráulico y n el coeficiente de rugosidad de Manning del canal.
69
4.2. Formulación de Flujos en 1D
2/3
Aj Rj
Kj = (4.2.4)
nj
∂Zs
gA + gASf = ql Ux (4.2.5)
∂x
Este modelo es más Estable que el modelo de la onda dinámica, pero este último es más
exacto y puede ser aplicado en rangos amplios de condiciones de flujo.
Para este modelo, las variaciones en la velocidad del flujo y el tirante son Insignificantes en
comparación con la variación en la elevación del lecho del cauce y por lo tanto la ecuación
de momentum puede ser simplificado como:
Sf = S0 (4.2.6)
A 2/3 1/2
Q= R S0 (4.2.7)
n
70
4.2. Formulación de Flujos en 1D
V
g S0
> 10 (4.2.8)
U2
V
Donde , representa la longitud del canal en estudio y U es la velocidad promedio del flujo
uniforme. La Ecuación 4.2.8 implica que el modelo de la onda cinemática sea aplicado en
canales empinados o pronunciados (steep).
Método Alpha
1
Aj = Zs − (Zb,j + Zb,j+1 ) ∆yj (4.2.9)
2
q
Pj = (Zb,j − Zb,j+1 )2 + ∆yj2 (4.2.10)
71
4.2. Formulación de Flujos en 1D
Aj
Rj = (4.2.11)
Pj
2/3
Aj Rj
Kj = (4.2.12)
nj
Donde Zb,j , es la elevación del fondo en la estación j, ∆yj es la distancia entre estaciones
j, j + 1, nj es coeficiente de la rugosidad de manning en la franja j.
La sección transversal compuesta del área del flujo, es definido como la sumatoria de todos
las franjas (sub áreas en los paneles).
M
X Rj Kj
R= PM (4.2.13)
j=1 j=1 Kj
72
4.2. Formulación de Flujos en 1D
El Método Alpha se limita debido a que ignora el efecto de los muros verticales, lo cual
no es adecuado en situaciones donde existen superficies laterales verticales o pendientes
empinadas, pronunciados en los bancos.
Propuesto por Einstein (1950), es un método más adecuado para determinar las
propiedades hidráulicas compuestas para la sección transversal con superficies verticales
rugosos o pendientes pronunciados en los bancos basados en la división del radio hidráuli-
co. Este método asume velocidades iguales en todas las franjas y calcula todas las variables
hidráulicas en un modo normal, excepto para el coeficiente de la rugosidad de Manning.
M
X
τ
X = Pj τ j (4.2.14)
j=1
Donde:
P = Perı́metro mojado.
τ = γRSf (4.2.15)
τj = γRj Sf (4.2.16)
73
4.2. Formulación de Flujos en 1D
!3/2 !3/2
nU nj U
R= 1/2
, Rj = 1/2
(4.2.17)
Sf Sf
M 3/2
!2/3
X Pj nj
n= (4.2.18)
j=1
P
τj = γRSf,j (4.2.19)
2 2
nU nj U
Sf = , Sf,j = (4.2.20)
R2/3 R2/3
Insertando las ecuaciones 4.2.15, 4.2.19 y 4.2.20 en la ecuación 4.2.14 se tiene la siguiente
ecuación para un Manning n compuesto.
"M #1/2
X Pj n2j
n= (4.2.21)
j=1
P
74
4.2. Formulación de Flujos en 1D
Para un canal compuesto con inundaciones, las velocidades en el canal principal y playas de
inundación pueden ser significativamente diferentes. Una forma o un método más adecuado
para determinar las propiedades hidráulicas compuestas en canales complejos es el método
de transporte (Conveyence Method).
Este método divide la sección transversal en sub secciones de tal forma, que la asunción
de las velocidades iguales puede ser aproximadamente válida en cada sub sección. Y
estas sub secciones pueden aun ser ser dividido entre mas franjas. El área del flujo, el
perı́metro mojado y la conducción de cada sub sección puede ser calculada de manera
normal. Las conducciones de todas las sub secciones se suman para establecer el total de
la transportabilidad para la sección transversal entera.
En la figura 4.2 se divide en tres secciones canal principal, llanura de inundación izquierda
y llanura de inundación derecha; y el total de la transportabilidad K es determinado por:
75
4.2. Formulación de Flujos en 1D
Para cada sub sección, el coeficiente de rugosidad de Manning puede ser determinado
usando el radio hidráulico o el método de la división pendiente energı́a (energy slope
division method).
j=RCB
!
X 3/2
nM C = Pj nj /PM C (4.2.23)
j=LCB
Donde: LCB y RCB representan franjas adyacentes del canal principal hacia la izquierda
y derecha bordes de las llanuras de inundación (denominados como en LF y RF según la
figura 4.2).
Z Z
1 1
β= u2 dA = (QLF ULF + QM C UM C + QRF URF ) (4.2.24)
QU A QA
76
4.3. Cálculos Uni-dimensionales para flujos en canales o cauces abiertos
2
K2 K2
A KLF
β= 2 + M C + RF (4.2.25)
K ALF AM C ARF
Para flujos permanentes en canales abiertos sin considerar ingresos y/o salidas de flujos
laterales, la ecuación 4.2.1 se reduce a:
∂Q
=0 (4.3.1)
∂x
Y da lugar a una descarga del flujo constante. Mientras la ecuación 4.2.2 puede ser reescrito
como la ecuación de la Energı́a.
β 0 Q2
∂ ∂Zs Q|Q|
+g +g 2 =0 (4.3.2)
∂x 2A2 ∂x K
77
4.3. Cálculos Uni-dimensionales para flujos en canales o cauces abiertos
1
β0 = 2 2 2
2
QLF ULF + QM C UM C + QRF URF (4.3.3)
QU
A2 3 3 3
0 KLF KM C KRF
β = 3 + + (4.3.4)
K A2LF A2M C A2RF
Para un canal simple, la longitud de alcance mide la ruta del flujo principal o canal
Thalweg 1 . Para un canal complejo, las rutas del flujo en el canal principal y llanuras de
inundación pueden ser significativamente diferentes y un promedio (tal como el promedio
de la descarga ponderada) de sus longitudes pueden ser usados como la longitud del
alcance.
Aplicando el método del paso standard para discretizar la ecuación 4.3.2 se tiene.
0
βi0 Q2i Q2i+1
βi+1 ∆xi+1/2 Qi+1 |Qi+1 | Qi |Qi |
2
+ Zs,i = 2
+ Zs,i+1 + 2
+ (4.3.5)
2gAi 2gAi+1 2 Ki+1 Ki2
Donde xi + 1/2 representa la longitud de cada tramo entre las secciones transversales i y
i + 1.
1
En términos cientı́ficos se utiliza el nombre de Thalweg, voz procedente del alemán que significa
”camino del valle”, esta lı́nea que se encuentra en medio de la parte más profunda del rı́o y donde la
corriente es más rápida.
78
4.3. Cálculos Uni-dimensionales para flujos en canales o cauces abiertos
Media Aritmética.
1 Qi+1 |Qi+1 | Qi |Qi |
Sf,i+1/2 = 2
+ (4.3.6)
2 Ki+1 Ki2
Media Armónica.
2
Ki2
Ki+1
Sf,i+1/2 = 2/ + (4.3.7)
Qi+1 |Qi+1 | Qi |Qi |
Media Geométrica.
1/2
Qi+1 |Qi+1 | Qi |Qi |
Sf,i+1/2 = 2
(4.3.8)
Ki+1 Ki2
Transporte Medio.
2
Qi+1 + Qi
Sf,i+1/2 = (4.3.9)
Ki+1 + Ki
Si las secciones transversales del estudio, presentan contracciones y/o expansiones, una
perdida local es considerado en la ecuación 4.3.5, el cual la ecuación final se tiene:
79
4.3. Cálculos Uni-dimensionales para flujos en canales o cauces abiertos
0
βi0 Q2i Q2i+1
βi+1 ∆xi+1/2 Qi+1 |Qi+1 | Qi |Qi |
2
+ Zs,i = 2
+ Zs,i+1 + 2
+
2gAi 2gAi+1 2 Ki+1 Ki2
0 2 0 2
(4.3.10)
βi+1 Qi+1 βi Qi
+ λi+1/2
−
2gA2
i+1 2gA2
i
La solución para la ecuación 4.3.10 difiere en casos de flujos sub crı́ticos y super crı́ticos.
Para el flujo Subcrı́tico: Una descarga del flujo es usualmente especificado en el ingreso y
una estación del agua es especificado en la salida. Consecuentemente la descarga del flujo
es calculando aplicando la continuidad de masa y la estación del agua (tirante) puede ser
determinado por cálculos de remanso usando la ecuación 4.3.10. Como se ve, esta ecuación
es no lineal, por lo tanto, necesita ser resuelto iterativamente bajo un margen de error.
β 0 Q2 β 0 Q2
∆xi+1/2 Qi+1 |Qi+1 | Qi |Qi |
F = i+1 2 i+1 − i i2 + Zs,i+1 − Zs,i + 2
(4.3.11)
2gAi+1 2gAi 2 Ki+1 Ki2
Puesto que Zs,i+1 y la correspondiente Ai+1 y Ki+1 en la sección transversal i+1 se obtuvo
del cálculo previo en el tramo entre las secciones i + 1 y i + 2 o del tirante (o estación del
agua) dado en la salida, ahora el problema es determinar Zs,i y la correspondiente área
Ai y Ki , garantizando F = 0. Aquı́ se usa el método de Bisección.
Para el flujo Supercrı́tico: La descarga del flujo y la estación del agua (tirante) son ingre-
sadas usualmente en el ingreso (upstream). El procedimiento para los cálculos es el mismo
del flujo subcrı́tico, con la diferencia del sentido de cálculo (upstream - downstream).
80
4.3. Cálculos Uni-dimensionales para flujos en canales o cauces abiertos
Método de Bisección
Los Zmiddle = (Zupper + Zlower )/2 y se calcula Fmiddle . Los valores de F correspondi-
ente a Zmiddle (Zintermedio ).
Note que la búsqueda en el paso (1) para los lı́mites inferior y superior (lower, upper)
Zlower y Zupper del segmento inicial donde las soluciones existan puedan estar desde
cualquier elevación o fondo del canal Zs,i+1 .
81
4.3. Cálculos Uni-dimensionales para flujos en canales o cauces abiertos
DER
β 0 Q2 β 0 Q2
∆xi+1/2 Qi+1 |Qi+1 | Qi |Qi |
F = i+1 2 i+1 − i i2 + Zs,i+1 − Zs,i + 2
(4.3.12)
2gAi+1 2gAi 2 Ki+1 Ki2
1 Qi+1 |Qi+1 | Qi |Qi |
Media Aritmética: 2 2
Ki+1
+ Ki2
2
Media Armónica : Ki+1 K2
2/ + Qi |Qi i |
Qi+1 |Qi+1 |
Sf,i+1/2 = 1/2 (4.3.13)
Qi+1 |Qi+1 | Qi |Qi |
Media Geométrica: 2
Ki+1 K2
2 i
Transporte Medio: Qi+1 +Qi
Ki+1 +Ki
0 0 2
βi+1 Q2i+1
βi Qi
hc,i+1/2 = λi+1/2 − (4.3.15)
2gA2i+1 2gA2i
!
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
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.
Diagrama de flujo Condiciones Aguas Abajo: Viene a ser la elección del flujo
Subcrı́tico, donde los cálculos son a partir de la última sección transversal hasta
la primera sección. En el diagrama se toma como dato al tirante hidráulico, área
hidráulica, perı́metro mojado y demás caracterı́sticas que se muestra. Ası́ mismo
contiene una función para calcular los niveles mediante el método bisección que se
detalla posteriormente.
83
4.4. Diagramas de flujo
84
4.4. Diagramas de flujo
Gráficos, que corresponde a los niveles de superficie libre de agua, tanto en las secciones
transversales como en los perfiles longitudinales.
Tabulares, (tablas) resumen de las caracterı́sticas hidráulicas del flujo, tales como, caudal
de diseño, tirante, área, perı́metro, velocidad, número de froude, ancho o espejo de agua,
etc.
85
4.4. Diagramas de flujo
INICIO CÁLCULO DE LA SUPERFICIE LIBRE
METODO DEL PASO ESTANDARD
Datos de las secciones
transversales (geometría)
Ordenar consecutivamente
las secciones transversales
nST = Número de secciones
transversales.
Tipo de Flujo, Caudal de diseño
(m3/s), Nivel inicial (m)
Tipo de Flujo
F. Subcrítico F. Supercrítico F. Mixto
Condición Condición Condición Aguas Arriba
Aguas Abajo *(A) Aguas Arriba *(B) y Aguas Abajo
Niveles de la superficie libre
de agua y las características
hidráulicas.
FIN CÁLCULO DE LA SUPERFICIE
86
4.4. Diagramas de flujo
(A) INICIO CONDICIÓN
AGUAS ABAJO
i= nST ‐1, hasta i = 0,
i = i‐1
Zsi Cota tirante
Area, Perímetro GetAreaPerimeter * C .
K GetConveyanceK * D .
Beta GetCorrectionFactorBeta * E
Zlower Cota mínima de la sección actual.
Zupper Zsi Valor superior.
Datos Geométricos de la sección transversal:
BL Vértice llanura izquierda.
BR Vértice llanura derecha.
nL Coeficiente de Manning llanura izquierda.
nC Coeficiente de Manning canal central.
nR Coeficiente de Manning llanura derecha.
LL Longitud por la llanura izquierda.
LC Longitud por el canal central.
LR Longitud por la llanura derecha.
CC Coeficiente de contracción.
CE Coeficiente de expansión.
Cálculo método de Bisección * F
Reasignar valores:
Beta Cálculos Beta
Area Cálculos Area
Zsi Cálculos Zsi
K Cálculos K
Niveles de la superficie libre
de agua y las características
hidráulicas.
FIN CONDICIÓN AGUAS ABAJO
87
4.4. Diagramas de flujo
(B) INICIO CONDICIÓN
AGUAS ARRIBA
i= 1, hasta i = nST,
i = i+1
Zsi Cota tirante
Area, Perímetro GetAreaPerimeter * C .
K GetConveyanceK * D .
Beta GetCorrectionFactorBeta * E
Zlower Cota mínima de la sección actual.
Zupper Zsi Valor superior.
Datos Geométricos de la sección transversal:
BL Vértice llanura izquierda.
BR Vértice llanura derecha.
nL Coeficiente de Manning llanura izquierda.
nC Coeficiente de Manning canal central.
nR Coeficiente de Manning llanura derecha.
LL Longitud por la llanura izquierda.
LC Longitud por el canal central.
LR Longitud por la llanura derecha.
CC Coeficiente de contracción.
CE Coeficiente de expansión.
Cálculo método de Bisección * F
Reasignar valores:
Beta Cálculos Beta
Area Cálculos Area
Zsi Cálculos Zsi
K Cálculos K
Niveles de la superficie libre
de agua y las características
hidráulicas.
FIN CONDICIÓN AGUAS ARRIBA
88
4.4. Diagramas de flujo
(C) INICIO
GETAREAPERIMETER
Cota Tirante, Vértices de la
sección transversal, BL, BR.
Inundación vértice derecho = falso.
Inundación vértice izquierdo = falso.
Cota Tirante >
V F
PrimerVértice[Y]
Incrementar un vértice inicial con
coordenadas:
X = PrimerVértice[X].
Y = Cota Tirante.
Inundación vértice izquierdo = verdadero.
V F
Cota Tirante >
PrimerVértice[Y]
Incrementar un vértice Final con
coordenadas:
X = ÚltimoVértice[X].
Y = Cota Tirante.
Inundación vértice derecho = verdadero.
1
89
4.4. Diagramas de flujo
... 1
j = 1, hasta N° de
Vértices, j= j+1
Cota Tirante <=
V
Vertices[j].y F
Y = Cota Tirante
Condición = Verdadero
F
Condición = Verdadero
V
∑
J = J+1
V Vertices[j+1].y F
>= Cota Tirante
V Vertices[j+1].y F
< Cota Tirante
Condición = Verdadero Condición = Falso
Area (m2), Perímetro (m)
FIN GETAREAPERIMETER
90
4.4. Diagramas de flujo
(D) INICIO
GETCONVEYANCEK
ALF = Área llanura izquierda.
AMC = Área Canal Central.
ALR = Área llanura derecha.
PLF = Perímetro llanura izquierda.
PMC = Perímetro Canal Central.
PLR = Perímetro llanura derecha.
nLF = Coeficiente de Manning llanura izquierda.
nMC = Coeficiente de Manning Canal Central.
nLR = Coeficiente de Manning llanura derecha.
KLF = KMC = KRF = 0.0
V PLF != 0.0 F
/
/
V PMC != 0.0 F
/
/
V PRF != 0.0 F
/
/
K = KLF + KMC + KRF
FIN GETCONVEYANCEK
91
4.4. Diagramas de flujo
(E) INICIO
GETCORRECTIONFACTORBETA
ALF = Área llanura izquierda.
AMC = Área Canal Central.
ALR = Área llanura derecha.
KLF = Perímetro llanura izquierda.
KMC = Perímetro Canal Central.
KLR = Perímetro llanura derecha.
K = KLF+KMC+KRF
A = ALF+AMC+ARF
BetaLF = 0.0
BetaMC = 0.0
BetaRF = 0.0
V ALF != 0.0 F
BetaLF
V F
AMC != 0.0
BetaMC
V ARF != 0.0 F
BetaRF
FIN GETCORRECTIONFACTORBETA
92
4.4. Diagramas de flujo
(F) INICIO MÉTODO DE
BISECCIÓN
Zlower = Extremo valor inferior.
Zupper = Extremo valor superior.
Variables hidráulicas.
NoEncontrado = verdadero
F
NoEncontrado = Verdadero
V
Area, Perímetro GetAreaPerimeter * C .
K GetConveyanceK * D .
Beta GetCorrectionFactorBeta * E
Fmiddle FuncionF * G
V Abs(Fmiddle) < TOL F
Nivel = Zmiddle
NoEncontrado = falso
Flower FuncionF
Fupper FuncionF
V Abs(Fmiddle) < TOL
F
Zupper = Zmiddle Zlower = Zmiddle
V Abs(Zupper ‐Zlower) F
< TOL
NoEncontrado = falso
Niveles de superficie libre
Variables Hidráulicas
FIN MÉTODO DE BISECCIÓN
93
4.4. Diagramas de flujo
(G) INICIO FUNCIÓNF
Bi1 = Factor de Correción Beta en la estación i+1.
Bi = Factor de Correción Beta en la estación i.
Qi1 = Descarga del flujo en la estación i+1.
Qi = Descarga del flujo en la estación i
Ai1 = Area de la sección transversal en la estación i+1.
Ai = Area de la sección transversal en la estación i.
Zi1 = Cota del nivel de agua en la estación i+1. (valor a encontrar)
Zi = Cota del nivel de agua en la estación i.
hfi12 = Pérdida por fricción en el tramo i+1/2.
hci12 = Pérdida Local en el tramo i+1/2.
∆ / | | | |
, ,
2 2 2
F
FIN FUNCIÓNF
94
Capı́tulo 5
SOCAVACIÓN EN RÍOS Y
DIAGRAMAS DE FLUJO
5.1. Introducción
95
5.2. Clasificación de los Rı́os
Se trata de cauces con tres elementos bien definidos, canal principal (main channel),
llanura de inundación izquierda (Left Floodplain), llanura de inundación derecha (Right
Floodplain).
En periodos de estiaje, las llanuras de inundación en muchas ocasiones suelen estar cu-
biertas de vegetación o arbustos de pequeña estatura. El canal principal es por lo general
estable y algo profundo entres las llanuras.
Este cauce es cuando existe una superficie casi plana donde el rı́o escurre por varias partes
al mismo tiempo.
96
5.3. Socavación General en cauces definidos
El criterio de erosión es producto del incremento del caudal del flujo (mayor velocidad,
siempre en cuando se mantiene el área de la sección transversal mojada), aumentando la
capacidad de arrastre de la corriente, con la que se inicia a degradar el material de fondo
(generalmente en la lı́nea de thalweg). Ahora, al descender el fondo, aumenta gradualmente
el área hidráulica, donde se reduce paulatinamente el valor medio de la velocidad de la
corriente y por ende la capacidad de arrastre, hasta el momento en que se alcanza un
estado de equilibrio.
Este equilibrio, existe cuando son iguales la velocidad media real de la corriente Ur , y
la velocidad media que se requiere para que un material de caracterı́sticas dadas sea
arrastrado Ue .
La velocidad Ur , está dada en función de las caracterı́sticas hidráulicas del cauce (pen-
diente, tirante, flujo, rugosidad, etc.). Con respecto a la velocidad Ue está en función de
las caracterı́sticas del material del fondo y del tirante del flujo. Para valuarla, las caracte-
rı́sticas representativas que se toman en cuenta tratándose de material no cohesivo, es el
diámetro medio dm . No se considera el peso especı́fico, ya que se supone que para todas
las arenas y gravas una densidad uniforme. Si el suelo es cohesivo, se toma en cuenta el
peso especı́fico del material seco.
97
5.3. Socavación General en cauces definidos
Donde:
ϕ: 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.
98
5.3. Socavación General en cauces definidos
Donde:
99
5.3. Socavación General en cauces definidos
Desde la franja considera en la figura 5.3 con espesor ∆B, el caudal del flujo que pasa por
esta sección está dada según la ecuación de Manning.
1 1/2 5/3
∆Q = U ∆A = S H0 ∆B (5.3.2)
n f
Hj +Hj+1
Donde para H0 = 2
Algunos textos para simplificar operaciones, asumen en las secciones transversales como
rectangulares o trapezoidales, de tal forma que el área del flujo es el ancho de la superficie
por una altura media. Estos criterios son manejados debido a las geometrı́as complejas
que se presentan en los cauces naturales.
100
5.3. Socavación General en cauces definidos
A continuación se muestra las ecuaciones sin alterar éstas caracterı́sticas, por lo tanto:
Donde:
1/2
Sf QP 2/3
= (5.3.4)
n µA5/3
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
∆Q = Ur Hs ∆B (5.3.6)
101
5.3. Socavación General en cauces definidos
5/3
QP 2/3 H0 ∆B
= Ur Hs ∆B (5.3.7)
µA5/3
Donde se tiene:
5/3
QP 2/3 H0
Ur = (5.3.8)
µA5/3 Hs
Lo que indica que la erosión se detendrá cuando a una profundidad cualquiera alcanzada,
el valor de Ur , velocidad de la corriente capaz de producir arrastre, y Ue , velocidad que
se necesita para que el fondo se degrade sean iguales (Condición de equilibrio).
Ue = Ur (5.3.9)
Por lo tanto
5/3
QP 2/3 H0
0,60γs1,18 ϕHsX =
µA5/3 Hs
5/3
QP 2/3 H0
Hs1+X =
0,60ϕµA5/3 γs1,18
1
! 1+X
5/3
2/3
QP H0
Hs = (5.3.10)
0,60ϕµA5/3 γs1,18
El fenómeno fı́sico es el mismo para estos tipos de suelos (granos sueltos, arena, gravas,
etc), manteniendo la misma fórmula para la velocidad real, lo que sı́ cambia es la velocidad
media que se requiere para degradar el fondo Ue
Ue = 0,68ϕd0,28
m Hs
X
(5.3.11)
102
5.3. Socavación General en cauces definidos
Donde:
dm , diámetro medio de los granos del fondo, obtenidos según la expresión (mm).
X
dm = 0,01 (di Pi ) (5.3.12)
Donde:
di , diámetro de una fracción en una curva granulométrica de la muestra total que se analiza
(mm). Pi , porcentaje del peso de esta misma porción, comparada con el peso total de la
muestra. Las fracciones escogidas no deben ser necesariamente iguales entre sı́.
5/3
0,28 X QP 2/3 H0
0,68ϕdm Hs =
µA5/3 Hs
5/3
QP 2/3 H0
Hs1+X =
0,68ϕµA5/3 d0,28
m
1
! 1+X
5/3
QP 2/3 H0
Hs = (5.3.13)
0,68ϕµA5/3 d0,28
m
103
5.4. Diagramas de flujo
104
5.4. Diagramas de flujo
INICIO CÁLCULO DE LA
SOCAVACIÓN GENERAL
i= 1, hasta i = nST,
i = i+1
Niveles de la superficie libre de agua y las
características hidráulicas.
Tipo de material.
% de probabilidad de gasto.
Cálculo del coeficiente X: CoeficienteX *(H)
Cálculo socavación por LischtvanLebeviev :
LischtvanLebeviev *(I)
Altura de socavación de las
secciones transversales
FIN CÁLCULO DE LA
SOCAVACIÓN GENERAL
105
5.4. Diagramas de flujo
(H) INICIO CÁLCULO DEL
COEFICIENTE X
Tipo de Material
Cohesivo No Cohesivo
C = Material Cohesivos (Ton/m3) NC = Material No Cohesivos (mm)
1 2
J
Valor del coeficiente X
FIN CÁLCULO DEL
COEFICIENTE X
106
5.4. Diagramas de flujo
... 1
V 0 < C < 0.80 F
0.0973C 0.539 1.113 1.117
V 0.8 ≤ C ≤ 2.00
F
X = Interpolación (C)
V F
C > 2.00
0.0973C 0.539 1.113 1.117
J
107
5.4. Diagramas de flujo
... 2
V 0 <NC < 0.05 F
0.43
V 0.05 ≤ NC ≤ 1000
F
X = Interpolación (NC)
V F
NC > 1000
1.30 10 NC 2.44 10 0.304
J
108
5.4. Diagramas de flujo
(I) INICIO CÁLCULO SOCAVACIÓN
LISCHTVANLEBEVIEV
Tipo de Material
Cohesivo No Cohesivo
Material Cohesivos Material No Cohesivos
/ / / /
0.60 / .
0.68 / .
Niveles de socavación en
cada vértice de la sección
transversal
FIN CÁLCULO SOCAVACIÓN
LISCHTVANLEBEVIEV
109
Capı́tulo 6
6.1. Introducción
110
6.2. Descripción General de Programa PLEDER
El estudio de Hidráulica Fluvial, permite determinar el ancho estable del cauce, transporte
de sedimentos, socavaciones generales.
Cada uno de éstos componentes, serán llevados a cabo mediante el programa PLEDER,
obteniendo los resultados finales gráficas y tabulares, que son necesarios para su inter-
pretación.
111
6.2. Descripción General de Programa PLEDER
112
6.2. Descripción General de Programa PLEDER
113
6.2. Descripción General de Programa PLEDER
PLHSOC: Componente Hidráulica Fluvial, éste comando permite ingresar los datos
de las secciones transversales para calcular las socavaciones generales.
114
6.3. Cálculos y Resultados Hidrológicos
PLEDER, organizada los comandos descritos dentro del AutoCAD en menús, toolbars y
paneles Ribbon. La opción Ribbon se utiliza a partir de la versión 2009, quien muestra
una mejor organización, visualización en los comandos personalizados.
Los datos de la cuenca se resume en la tabla 6.1, ası́ también se adjunta en el apéndice E
la cartografı́a, red topológica, altitud y el perfil longitudinal del cauce principal.
115
6.3. Cálculos y Resultados Hidrológicos
Mediante el comando PLLLES o el ı́cono de la figura 6.3, muestra el interfaz gráfico para
calcular la transformación de lluvia - escorrentı́a. Contiene 3 parámetros importantes de
ingreso:
Dentro de éste parámetro, PLEDER presenta utilitarios tales como el calcular las áreas
mediante polilı́neas cerradas, distancias longitudinales, puntos de referencia en coorde-
nadas UTM, dentro del ambiente AutoCAD.
116
6.3. Cálculos y Resultados Hidrológicos
117
6.3. Cálculos y Resultados Hidrológicos
La sumatoria de las áreas tiene que ser igual al área de la cuenca. En la figura 6.17,
PLEDER presenta hasta 6 subdivisiones para calcular La Curva número Compuesto.
En la presente aplicación se usa el hidrograma unitario sintético NRCS, cuyos datos son el
área de la cuenca y el tiempo de retardo que está en función al tiempo de concentración de
la cuenca. La Figura 6.18 muestra el cálculo de tiempo de retardo, bajo dato o resultado
del tiempo de concentración. El tiempo de concentración se puede calcular mediante la
fórmula de Kirpich o también este valor lo puede asignar directamente el usuario. Por lo
tanto, cabe resaltar que el tiempo de concentración viene a ser resultado, si es calculado
mediante la fórmula de Kirpich y por otro lado es dato si es asignado por el usuario.
118
6.3. Cálculos y Resultados Hidrológicos
Es el intervalo de tiempo para calcular lluvia escorrentı́a. Ésta opción indica el incremento
de tiempo para que el programa tenga que realizar los cálculos cada 10 minutos según la
figura 6.15.
El programa controla los posible errores de entrada de los datos ([U], [P] y [T]), especifi-
cando dentro de la consola del AutoCAD el tipo de error o el ingreso de dato incorrecto.
Mediante el botón aceptar y asignado el punto de referencia para los resultados, pro-
cedemos a calcular el hidrograma de salida y el caudal máximo de diseño para los datos
ingresados. Las figuras 6.20, 6.21, 6.22 y 6.23 corresponden a los hidrogramas de salida
para los perı́odos de retorno 50, 100, 200 y 500 respectivamente.
Los resultados de las coordenadas del hidrograma para los distintos perı́odos de retorno
mencionados se adjunta en el apéndice D.
119
6.3. Cálculos y Resultados Hidrológicos
120
6.3. Cálculos y Resultados Hidrológicos
121
6.4. Cálculos y Resultados Hidráulicos
Ésta sección corresponde a transitar el caudal de diseño (QT R=100 = 340m3 /s), para
determinar el perfil de la superficie libre de agua, los mismos en cada una de las secciones
transversales. En realidad el tránsito de caudales será para los 4 perı́odos de retorno
considerados en la determinación de los hidrogramas.
La batimetrı́a del proyecto viene a ser el dato más importante y primordial para esta
sección; con ella representamos el proyecto fı́sico a escala normal en un proyecto digital y
a escala conveniente para realizar todos los cálculos correspondientes. El proyecto cuenta
con una batimetrı́a minuciosa con densos puntos topográficos y sobre todo dirigidos con
propiedad y conocimientos hidráulicos durante el levantamiento.
En la figura 6.24, muestra la planta del rı́o Huallaga con las 125 secciones transversales dis-
tribuidos cada 20 metros en 2480 metros lineales del cauce. La estación 0 + 00 corresponde
al puente Acobamba y la estación 2 + 480 al centro poblado Yanacocha.
122
6.4. Cálculos y Resultados Hidráulicos
Mediante la opción de las secciones transversales, se ingresan los datos fı́sicos del proyec-
to, tales como las coordenadas de los vértices que lo conforman, lı́mites de las llanuras de
inundación, longitudes izquierda, central y derecha, coeficientes de Manning y los coefi-
cientes de contracción y expansión; todo ello para cada una de las secciones transversales
del cauce.
El programa PLEDER, presenta opciones gráficas muy eficientes para crear las secciones
transversales a partir de polilı́neas, asignando los puntos de referencia tales como estación,
elevación y permitiendo calcular las coordenadas locales de cada uno de los vértices, tal
como se muestra en la figura 6.25.
Quizá esta opción de crear las secciones transversales, diferencia mucho de los programas
comerciales existentes en la actualidad, ya que estos programas dependen de otros para
123
6.4. Cálculos y Resultados Hidráulicos
facilitar los datos que en este caso viene a ser los vértices locales de cada una de las
secciones transversales.
Cada vértice es enumerado de izquierda a derecha, con el fin de almacenar en una ma-
triz ordenada, además elegir los lı́mites de inundación izquierda derecha mediante la nu-
meración de los vértices.
La ventana del gráfico 6.27, muestra las opciones de los parámetros de borde y la asig-
nación del caudal de diseño para transitar el flujo a través de las secciones transversales
124
6.4. Cálculos y Resultados Hidráulicos
descritas anteriormente. Para la aplicación se analiza como flujo subcrı́tico, por la tanto
la opción del tirante aguas abajo es habilitado.
Los procedimiento para calcular los niveles de la superficie libre de agua se describe
mediante diagramas de flujo en el capı́tulo 4, tanto para los flujo subcrı́ticos y supercrı́ticos.
125
6.4. Cálculos y Resultados Hidráulicos
126
6.5. Cálculos y Resultados de Socavaciones Generales
les
Para calcular las socavaciones generales en las secciones transversales, es necesario conocer
el tipo de material (cohesivo y no cohesivo) y el coeficiente según la probabilidad de
gasto. Para la aplicación se realizó las curva granulométricas de los materiales incluyendo
cantos rodados y guijarros, de los cuales se obtuvo como resultados los diámetro medios
aproximadamente 150 mm y 180 mm.
Una vez completado estos datos, se puede calcular las socavaciones mediante el ı́cono de la
figura 6.13 o equivalente al comando PLHSCC, cuyos resultados son gráficos (lı́nea de la
127
6.5. Cálculos y Resultados de Socavaciones Generales
nueva sección transversal socavada) y tabulares (nuevos vértices de las secciones transver-
sales). Estos resultados son necesarios para estimar la profundidad de las cimentaciones
de las estructuras hidráulicas o estructuras de protección ante avenidas máximas, y siendo
más especı́ficos en la instalación de gaviones y enrocados (riprap) representa la profundi-
dad del colchón reno y la profundidad de las uñas respectivamente.
128
Capı́tulo 7
CONCLUSIONES Y
RECOMENDACIONES
7.1. Conclusiones
3. Importancia de la asignación del Número de Curva, dependiente del tipo o las ca-
racterı́sticas de suelo.
129
7.1. Conclusiones
10. Los perfiles de superficie libre de agua, determinan el dimensionamiento de las es-
tructuras hidráulicas de protección.
11. Las ecuaciones discretizadas para los cálculos de los perfiles de la superficie libre de
agua, son ecuaciones no lineales, por lo tanto, se emplean técnicas numéricas tales
130
7.2. Recomendaciones
12. La socavación general en cauces naturales dependerá mucho del tipo de material
que lo conforma en cada estación del cauce, por lo general, se uniformiza en una
estación.
13. Para calcular la socavación general del cauce se necesita utilizar criterios prudentes,
ya que existe mucha incertidumbre involucrada en los modelos que se emplea.
7.2. Recomendaciones
131
Bibliografı́a
[1] A. OSMAN AKAN. Open Channel Hydraulics. Elsevier Ltd, Oxford UK, 2006.
[5] JOSÉ LUIS SANCHEZ BRIBIESCA. Doce algoritmos para resolver problemas de
hidráulica. Universidad Nacional Autónoma de México, Agosto 1978.
[6] GARY W. BRUNNER. Hec-Ras River Analysis System User’s Manual. US Army
Corps of Engineers EEUU, 2001.
[9] HUBERT CHANSON. Hidráulica del Flujo en Canales Abiertos. McGraw-Hill In-
teramericana, S.A., 2002.
132
BIBLIOGRAFÍA
[11] CHOW, VENT T., MAIDMENT, D.R., and MAYS L. Hidrologı́a Aplicada. Mac
Graw Hill Interamericana S.A. Santafé de Bogotá, 1994.
[12] VENT TE CHOW. Hidráulica de canales abiertos. Mac Graw Hill Interamericana
S.A. Colombia, 2000.
[13] JAIME SUÁREZ DÍAS. Control de erosión en zonas tropicales. Instituto de Inves-
tigaciones sobre Erosión y Deslizamientos-Ingenierı́a de suelos, Noviembre, 2001.
[14] ROSENDO CHÁVEZ DÍAS. Hidrologı́a para Ingenieros. Fondo Editorial de la Pon-
tificia Universidad. Lima Perú, 1994.
[17] F. M. HENDERSON. Open Channel Flow. Macmillan Publishing Co., Inc. New York
USA, 1966.
[18] CHARLES HIRSCH. Numerical Computation of Internal and External Flows. John
Wiley and Sons Ltd, 2007.
[19] IVOR HORTON. Beginning Visual C++ 2005. Wiley Publishing USA, 2006.
[20] JOEL ORE IWANAGA. Apuntes de clase hidrogı́a general. Universidad Nacional
de San Cristóbal de Huamanga, 2004.
[21] JOEL ORE IWANAGA. Apuntes de clase estructuras hidráulicas. Universidad Na-
cional de San Cristóbal de Huamanga, Noviembre, 2006.
133
BIBLIOGRAFÍA
[22] PIERRE Y. JULIEN. Erosion and Sedimentation. Cambrigde University Press. USA,
1995.
[23] PIERRE Y. JULIEN. River Mechanics. Cambrigde University Press. USA, 2002.
[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.
[31] ADRIAN ILINCA MARECELO REGGIO, ANDRÉ HESS. 3-d múltiple-level simu-
lation of free surface flows. Journal of Hydraulic Research, Vol 40, December, 2002.
[33] RICHARD H. McCUEN. Hydrologic Analysis and Design. Person Education, 1998.
134
BIBLIOGRAFÍA
[35] JULIAN AGUIRRE PE. Hidráulica de Canales. CIDIAT. Mérida, Venezuela, 1974.
[36] JOSÉ RAMÓN TÉMEZ PELÁEZ. Facetas del cálculo hidrometeorológico y estadı́s-
tico de máximos caudales. Revista de Obras Públicas, Febrero, 2003.
[37] VICTOR MIGUEL PONCE. Engineering Hydrology Principles and Practices. Pren-
tice Hall, 1989.
[39] CRISTIAN CASTRO PÉREZ. Apuntes de clase métodos numéricos aplicados. Uni-
versidad Nacional de San Cristóbal de Huamanga, Noviembre, 2003.
[40] JEFF PROSISE. Programming Windows with MFC. Microsoft Press USA, 1999.
[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.
135
BIBLIOGRAFÍA
[46] DARLY B. SIMONS and FUAT SENTÜRK. Sediment Transport Technology. Water
Resources Publications. USA, 1976.
[47] BJARNE STROUSTRUP. The C++ Programming Language. Addisn Wesley USA,
1997.
[49] K.T. TANG. Mathematical Methods for Engineers and Scientists. Springer-Verlag
Berlin Heidelberg. USA, 2007.
[50] JUAN P. MARTIN VIDE. Ingenierı́a de Rı́os. Alfa Omega Grupo Editor S.A. de
C.A. México, 2003.
[52] YORICK HARDY WILLI HANS STEEB. Problems and Solutions in Scientific Com-
puting with C++ and Java simulations. World Scientific Publishing Co. Pte Ltd,
2004.
[53] WEIMING WU. Computational River Dynamics. Taylor & Francis Group, London,
UK, 2008.
[54] CHIH TED YANG. Sediment Transport theory of practice. The McGraw-Hill Com-
panies, Inc, USA, 1996.
136
Apéndice A
137
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
ARCHIVOS DE CABECERA:
PLEDERCurvaNumeroDlg.h
#pragma once
#include "resource.h"
public:
CPLEDERCurvaNumeroDlg(CWnd *pParent =NULL, HINSTANCE hInstance
=NULL); // Constructor estándar
virtual ~CPLEDERCurvaNumeroDlg();
// Cajas de texto
CAcUiNumericEdit m_Edit_AREA1;
CString m_a1;
CAcUiNumericEdit m_Edit_CN1;
CString m_cn1;
CAcUiNumericEdit m_Edit_AREA2;
CString m_a2;
CAcUiNumericEdit m_Edit_CN2;
CString m_cn2;
CAcUiNumericEdit m_Edit_AREA3;
CString m_a3;
CAcUiNumericEdit m_Edit_CN3;
CString m_cn3;
CAcUiNumericEdit m_Edit_AREA4;
CString m_a4;
CAcUiNumericEdit m_Edit_CN4;
CString m_cn4;
CAcUiNumericEdit m_Edit_AREA5;
CString m_a5;
CAcUiNumericEdit m_Edit_CN5;
CString m_cn5;
CAcUiNumericEdit m_Edit_AREA6;
CString m_a6;
CAcUiNumericEdit m_Edit_CN6;
CString m_cn6;
CAcUiNumericEdit m_Edit_CNC;
138
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
CString m_cnc;
protected:
virtual void DoDataExchange(CDataExchange* pDX);
afx_msg LRESULT OnAcadKeepFocus (WPARAM, LPARAM) ;
public:
virtual BOOL OnInitDialog();
afx_msg void OnBnClickedOk();
DECLARE_MESSAGE_MAP()
};
PLEDERHidrogramaUnitariosDlg.h
#pragma once
#include "adui.h"
#include "resource.h"
public:
CPLEDERHidrogramaUnitariosDlg(CWnd *pParent =NULL, HINSTANCE
hInstance =NULL); // Constructor estándar
virtual ~CPLEDERHidrogramaUnitariosDlg();
enum { IDD = IDD_PLHU };
protected:
virtual void DoDataExchange(CDataExchange* pDX);
afx_msg LRESULT OnAcadKeepFocus (WPARAM, LPARAM) ;
//Botones
afx_msg void OnButtonImportarHU();
afx_msg void OnButtonImportarPulsos();
public:
virtual BOOL OnInitDialog();
139
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
PLEDERHidrologiaBufer.h
#pragma once
//Clases Bufer para hidrologia
class HidrogramaUnitarioBufer
{
public:
HidrogramaUnitarioBufer();
HidrogramaUnitarioBufer (int n, double HU, double PULSO);
public:
HidrogramaUnitarioBufer *ObtenerSiguiente();
void PonerSiguiente(HidrogramaUnitarioBufer *p);
virtual ~HidrogramaUnitarioBufer();
public:
HidrogramaUnitarioBufer *Siguiente;
int n;
double HU, PULSO;
};
PLEDERHidrologiaCalculos.h
#pragma once
class CPLEDERHidrologiaCalculos
{
public:
CPLEDERHidrologiaCalculos(void);
public:
~CPLEDERHidrologiaCalculos(void);
public:
// Calcula las precipitaciones acumulas, incrementales y
alternas según IILA SENAMHI-UNI.
float HietogramaIILA(int N, float a, float b, float k, float n,
float dt, float var, float Tr, float* D, float* Pacum, float*
Pincr, float* Palte);
140
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
float PulsosP(int NP, int DT, int dt, float* Pexceso, float*
Pulsos, int *nP);
};
PLEDERHidrologiaDatos.h
#pragma once
public:
CPLEDERHidrologiaDatos(void);
public:
~CPLEDERHidrologiaDatos(void);
public:
public:
public:
// Variables HU
141
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
};
/*------------------------------------------------------------------*/
PLEDERHietogramaIilaSenamhiDlg.h
#pragma once
#include "resource.h"
public:
CPLEDERIilaSenamhiDlg(CWnd *pParent =NULL, HINSTANCE hInstance
=NULL); // Constructor estándar
virtual ~CPLEDERIilaSenamhiDlg();
CAcUiNumericEdit m_Edit_a;
CString m_a;
CAcUiNumericEdit m_Edit_k;
CString m_k;
CAcUiNumericEdit m_Edit_n;
CString m_n;
CAcUiNumericEdit m_Edit_duracion;
CString m_duracion;
CAcUiNumericEdit m_Edit_tr;
CString m_tr;
CAcUiNumericEdit m_Edit_PX;
CString m_PX;
CAcUiNumericEdit m_Edit_PY;
CString m_PY;
// Combo Box
CComboBox m_Combo_b;
CString m_b;
CComboBox m_Combo_Var;
CString m_variacion;
142
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
// Botones
CAcUiPickButton m_PickButton_PUNTO;
protected:
virtual void DoDataExchange(CDataExchange* pDX);
afx_msg LRESULT OnAcadKeepFocus (WPARAM, LPARAM) ;
afx_msg void OnKillfocusEdit_a();
afx_msg void OnKillfocusEdit_k();
afx_msg void OnKillfocusEdit_n();
afx_msg void OnKillfocusEdit_duracion();
afx_msg void OnKillfocusEdit_tr();
public:
virtual BOOL OnInitDialog();
afx_msg void OnBnClickedOk();
DECLARE_MESSAGE_MAP()
};
PLEDERHietogramaNrcsDlg.h
#pragma once
#include "resource.h"
public:
CPLEDERNrcsDlg(CWnd *pParent =NULL, HINSTANCE hInstance =NULL);
// Constructor estándar
virtual ~CPLEDERNrcsDlg();
CAcUiNumericEdit m_Edit_P24;
CString m_P24;
CAcUiNumericEdit m_Edit_NPX;
CString m_NPX;
CAcUiNumericEdit m_Edit_NPY;
CString m_NPY;
// Combo Box
CComboBox m_Combo_Ndt;
CString m_Ndt;
CComboBox m_Combo_Tormenta;
143
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
CString m_Tipo;
int m_Tormenta;
//Botones
CAcUiPickButton m_PickButton_NPUNTO;
protected:
virtual void DoDataExchange(CDataExchange* pDX); //
Compatibilidad con DDX/DDV
afx_msg LRESULT OnAcadKeepFocus (WPARAM, LPARAM) ;
public:
virtual BOOL OnInitDialog();
afx_msg void OnBnClickedOk();
DECLARE_MESSAGE_MAP()
};
PLEDERHUNRCSDlg.h
#pragma once
#include "resource.h"
public:
CPLEDERHUNRCSDlg(CWnd *pParent =NULL, HINSTANCE hInstance
=NULL); // Constructor estándar
virtual ~CPLEDERHUNRCSDlg();
int m_TipoTc;
// Cajas de texto
CAcUiNumericEdit m_Edit_long;
CString m_long;
CAcUiNumericEdit m_Edit_pend;
CString m_pend;
CAcUiNumericEdit m_Edit_tc;
CString m_tc;
CAcUiNumericEdit m_Edit_tlag1;
CString m_tlag1;
144
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
// Botones (CAD)
CAcUiPickButton m_PickButton_Long;
CAcUiPickButton m_PickButton_Pend;
protected:
virtual void DoDataExchange(CDataExchange* pDX); //
Compatibilidad con DDX/DDV
afx_msg LRESULT OnAcadKeepFocus (WPARAM, LPARAM) ;
// 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();
DECLARE_MESSAGE_MAP()
};
PLEDERHUSnyderDlg.h
#pragma once
#include "resource.h"
public:
CPLEDERHUSNYDERDlg(CWnd *pParent =NULL, HINSTANCE hInstance
=NULL); // Constructor estándar
virtual ~CPLEDERHUSNYDERDlg();
int m_TipoCalc;
// Cajas de texto
CAcUiNumericEdit m_Edit_Area;
CString m_area;
CAcUiNumericEdit m_Edit_L;
CString m_L;
145
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
CAcUiNumericEdit m_Edit_Lc;
CString m_Lc;
CAcUiNumericEdit m_Edit_TR;
CString m_TR;
CAcUiNumericEdit m_Edit_TpR;
CString m_TpR;
CAcUiNumericEdit m_Edit_Qp;
CString m_Qp;
CAcUiNumericEdit m_Edit_Ct;
CString m_Ct;
CAcUiNumericEdit m_Edit_tp;
CString m_tp;
CAcUiNumericEdit m_Edit_Cp;
CString m_Cp;
protected:
virtual void DoDataExchange(CDataExchange* pDX); //
Compatibilidad con DDX/DDV
afx_msg LRESULT OnAcadKeepFocus (WPARAM, LPARAM) ;
// 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();
DECLARE_MESSAGE_MAP()
};
PLEDERLluviaEscorrentiaDlg.h
#pragma once
#include "resource.h"
146
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
public:
CPLEDERLluviaEscorrentiaDlg(CWnd *pParent =NULL, HINSTANCE
hInstance =NULL); // Constructor estándar
virtual ~CPLEDERLluviaEscorrentiaDlg();
// 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;
147
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
protected:
public:
virtual BOOL OnInitDialog();
afx_msg void OnBnClickedOk();
DECLARE_MESSAGE_MAP()
};
148
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
ARCHIVOS Cpp:
PLEDERCurvaNumeroDlg.cpp
/*--------------------------------------------------------------------
PLEDERCurvaNumeroDlg.cpp: archivo de implementación
Cuadro de diálogo de CPLEDERCurvaNumeroDlg -> Calcula el número de
curva compuesto.
--------------------------------------------------------------------*/
#include "stdafx.h"
#include "PLEDERCurvaNumeroDlg.h"
/*------------------------------------------------------------------*/
IMPLEMENT_DYNAMIC(CPLEDERCurvaNumeroDlg, CAdUiDialog)
CPLEDERCurvaNumeroDlg::CPLEDERCurvaNumeroDlg(CWnd *pParent
/*=NULL*/,HINSTANCE hInstance /*=NULL*/)
: CAdUiDialog (CPLEDERCurvaNumeroDlg::IDD, pParent, hInstance)
{
m_a1 = _T("0.0");
m_cn1 = _T("0.0");
m_a2 = _T("0.0");
m_cn2 = _T("0.0");
m_a3 = _T("0.0");
m_cn3 = _T("0.0");
m_a4 = _T("0.0");
m_cn4 = _T("0.0");
m_a5 = _T("0.0");
m_cn5 = _T("0.0");
m_a6 = _T("0.0");
m_cn6 = _T("0.0");
m_cnc = _T("0.0");
}
CPLEDERCurvaNumeroDlg::~CPLEDERCurvaNumeroDlg()
{
BEGIN_MESSAGE_MAP(CPLEDERCurvaNumeroDlg, CAdUiDialog)
// Cajas de Texto
ON_EN_KILLFOCUS(IDC_EDIT_a1, OnKillfocusEdit_AREA1)
ON_EN_KILLFOCUS(IDC_EDIT_a2, OnKillfocusEdit_AREA2)
ON_EN_KILLFOCUS(IDC_EDIT_a3, OnKillfocusEdit_AREA3)
ON_EN_KILLFOCUS(IDC_EDIT_a4, OnKillfocusEdit_AREA4)
ON_EN_KILLFOCUS(IDC_EDIT_a5, OnKillfocusEdit_AREA5)
ON_EN_KILLFOCUS(IDC_EDIT_a6, OnKillfocusEdit_AREA6)
ON_EN_KILLFOCUS(IDC_EDIT_cn1, OnKillfocusEdit_CN1)
ON_EN_KILLFOCUS(IDC_EDIT_cn2, OnKillfocusEdit_CN2)
ON_EN_KILLFOCUS(IDC_EDIT_cn3, OnKillfocusEdit_CN3)
ON_EN_KILLFOCUS(IDC_EDIT_cn4, OnKillfocusEdit_CN4)
ON_EN_KILLFOCUS(IDC_EDIT_cn5, OnKillfocusEdit_CN5)
ON_EN_KILLFOCUS(IDC_EDIT_cn6, OnKillfocusEdit_CN6)
149
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
ON_BN_CLICKED(IDOK, &CPLEDERCurvaNumeroDlg::OnBnClickedOk)
END_MESSAGE_MAP()
// 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();
m_Edit_CN1.SetWindowText(m_cn1);
m_Edit_CN1.SetRange(0, 100);
m_Edit_CN2.SetWindowText(m_cn2);
m_Edit_CN2.SetRange(0, 100);
m_Edit_CN3.SetWindowText(m_cn3);
m_Edit_CN3.SetRange(0, 100);
m_Edit_CN4.SetWindowText(m_cn4);
m_Edit_CN4.SetRange(0, 100);
m_Edit_CN5.SetWindowText(m_cn5);
m_Edit_CN5.SetRange(0, 100);
m_Edit_CN6.SetWindowText(m_cn6);
m_Edit_CN6.SetRange(0, 100);
m_Edit_CNC.SetWindowText(m_cnc);
return TRUE;
}
void CPLEDERCurvaNumeroDlg::OnKillfocusEdit_AREA1()
150
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
{
onCALCCalcularCNC();
}
void CPLEDERCurvaNumeroDlg::OnKillfocusEdit_AREA2()
{
onCALCCalcularCNC();
}
void CPLEDERCurvaNumeroDlg::OnKillfocusEdit_AREA3()
{
onCALCCalcularCNC();
}
void CPLEDERCurvaNumeroDlg::OnKillfocusEdit_AREA4()
{
onCALCCalcularCNC();
}
void CPLEDERCurvaNumeroDlg::OnKillfocusEdit_AREA5()
{
onCALCCalcularCNC();
}
void CPLEDERCurvaNumeroDlg::OnKillfocusEdit_AREA6()
{
onCALCCalcularCNC();
}
void CPLEDERCurvaNumeroDlg::OnKillfocusEdit_CN1()
{
m_Edit_CN1.Convert();
if (!m_Edit_CN1.Validate())
{
::AfxMessageBox(_T("Curva Número no válida, \nrango = 1 @
100"));
m_Edit_CN1.SetFocus();
m_Edit_CN1.SetSel(0, -1);
}
CString str;
m_Edit_CN1.GetWindowText(m_cn1);
acdbRToS(::_wtof(m_cn1), 2, 0, str.GetBuffer(80));
m_Edit_CN1.SetWindowText(str);
onCALCCalcularCNC();
}
void CPLEDERCurvaNumeroDlg::OnKillfocusEdit_CN2()
{
m_Edit_CN2.Convert();
if (!m_Edit_CN2.Validate())
{
::AfxMessageBox(_T("Curva Número no válida, \nrango = 1 @
100"));
m_Edit_CN2.SetFocus();
m_Edit_CN2.SetSel(0, -1);
}
CString str;
m_Edit_CN2.GetWindowText(m_cn2);
acdbRToS(::_wtof(m_cn2), 2, 0, str.GetBuffer(80));
-- m_Edit_CN2.SetWindowText(str);
onCALCCalcularCNC();
}
void CPLEDERCurvaNumeroDlg::OnKillfocusEdit_CN3()
{
m_Edit_CN3.Convert();
if (!m_Edit_CN3.Validate())
151
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
{
::AfxMessageBox(_T("Curva Número no válida, \nrango = 1 @
100"));
m_Edit_CN3.SetFocus();
m_Edit_CN3.SetSel(0, -1);
}
CString str;
m_Edit_CN3.GetWindowText(m_cn3);
acdbRToS(::_wtof(m_cn3), 2, 0, str.GetBuffer(80));
m_Edit_CN3.SetWindowText(str);
onCALCCalcularCNC();
}
void CPLEDERCurvaNumeroDlg::OnKillfocusEdit_CN4()
{
m_Edit_CN4.Convert();
if (!m_Edit_CN4.Validate())
{
::AfxMessageBox(_T("Curva Número no válida, \nrango = 1 @
100"));
m_Edit_CN4.SetFocus();
m_Edit_CN4.SetSel(0, -1);
}
CString str;
m_Edit_CN4.GetWindowText(m_cn4);
acdbRToS(::_wtof(m_cn4), 2, 0, str.GetBuffer(80));
m_Edit_CN4.SetWindowText(str);
onCALCCalcularCNC();
}
void CPLEDERCurvaNumeroDlg::OnKillfocusEdit_CN5()
{
m_Edit_CN5.Convert();
if (!m_Edit_CN5.Validate())
{
::AfxMessageBox(_T("Curva Número no válida, \nrango = 1 @
100"));
m_Edit_CN5.SetFocus();
m_Edit_CN5.SetSel(0, -1);
}
CString str;
m_Edit_CN5.GetWindowText(m_cn5);
acdbRToS(::_wtof(m_cn5), 2, 0, str.GetBuffer(80));
m_Edit_CN5.SetWindowText(str);
onCALCCalcularCNC();
}
void CPLEDERCurvaNumeroDlg::OnKillfocusEdit_CN6()
{
m_Edit_CN6.Convert();
if (!m_Edit_CN6.Validate())
{
::AfxMessageBox(_T("Curva Número no válida, \nrango = 1 @
100"));
m_Edit_CN6.SetFocus();
m_Edit_CN6.SetSel(0, -1);
}
CString str;
m_Edit_CN6.GetWindowText(m_cn6);
acdbRToS(::_wtof(m_cn6), 2, 0, str.GetBuffer(80));
m_Edit_CN6.SetWindowText(str);
onCALCCalcularCNC();
}
152
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
void CPLEDERCurvaNumeroDlg::onCALCLimpiar()
{
m_Edit_AREA1.SetWindowText(_T("0.0"));
m_Edit_AREA2.SetWindowText(_T("0.0"));
m_Edit_AREA3.SetWindowText(_T("0.0"));
m_Edit_AREA4.SetWindowText(_T("0.0"));
m_Edit_AREA5.SetWindowText(_T("0.0"));
m_Edit_AREA6.SetWindowText(_T("0.0"));
m_Edit_CN1.SetWindowText(_T("0.0"));
m_Edit_CN2.SetWindowText(_T("0.0"));
m_Edit_CN3.SetWindowText(_T("0.0"));
m_Edit_CN4.SetWindowText(_T("0.0"));
m_Edit_CN5.SetWindowText(_T("0.0"));
m_Edit_CN6.SetWindowText(_T("0.0"));
m_Edit_CNC.SetWindowText(_T("0.0"));
}
void CPLEDERCurvaNumeroDlg::onCALCCalcularCNC()
{
m_Edit_AREA1.GetWindowText(m_a1);
m_Edit_CN1.GetWindowText(m_cn1);
m_Edit_AREA2.GetWindowText(m_a2);
m_Edit_CN2.GetWindowText(m_cn2);
m_Edit_AREA3.GetWindowText(m_a3);
m_Edit_CN3.GetWindowText(m_cn3);
m_Edit_AREA4.GetWindowText(m_a4);
m_Edit_CN4.GetWindowText(m_cn4);
m_Edit_AREA5.GetWindowText(m_a5);
m_Edit_CN5.GetWindowText(m_cn5);
m_Edit_AREA6.GetWindowText(m_a6);
m_Edit_CN6.GetWindowText(m_cn6);
a1 = _wtof(m_a1);
a2 = _wtof(m_a2);
a3 = _wtof(m_a3);
a4 = _wtof(m_a4);
a5 = _wtof(m_a5);
a6 = _wtof(m_a6);
cn1 = _wtof(m_cn1);
cn2 = _wtof(m_cn2);
cn3 = _wtof(m_cn3);
cn4 = _wtof(m_cn4);
cn5 = _wtof(m_cn5);
cn6 = _wtof(m_cn6);
//Cálculo de CNC
AT = a1+a2+a3+a4+a5+a6;
if(AT > 0)
{
cnc = (a1*cn1 +a2*cn2+a3*cn3+a4*cn4+a5*cn5+a6*cn6)/AT;
CString str;
m_cnc.Format(_T("%g"), cnc);
acdbRToS(::_wtof(m_cnc), 2, 0, str.GetBuffer(80));
153
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
m_Edit_CNC.SetWindowText(str);
}
else
{
m_Edit_CNC.SetWindowText(_T("0"));
void CPLEDERCurvaNumeroDlg::OnBnClickedOk()
{
// Coge los valores despues de pulsar OK
// Cajas de texto
m_Edit_AREA1.GetWindowText(m_a1);
m_Edit_CN1.GetWindowText(m_cn1);
m_Edit_AREA2.GetWindowText(m_a2);
m_Edit_CN2.GetWindowText(m_cn2);
m_Edit_AREA3.GetWindowText(m_a3);
m_Edit_CN3.GetWindowText(m_cn3);
m_Edit_AREA4.GetWindowText(m_a4);
m_Edit_CN4.GetWindowText(m_cn4);
m_Edit_AREA5.GetWindowText(m_a5);
m_Edit_CN5.GetWindowText(m_cn5);
m_Edit_AREA6.GetWindowText(m_a6);
m_Edit_CN6.GetWindowText(m_cn6);
m_Edit_CNC.GetWindowText(m_cnc);
CDialog::OnOK();
}
PLEDERHidrogramaUnitariosDlg.cpp
/*--------------------------------------------------------------------
PLEDERHidrogramaUnitariosDlg.cpp: archivo de implementación
Cuadro de diálogo de CPLEDERHidrogramaUnitariosDlg
--------------------------------------------------------------------*/
#include "stdafx.h"
#include "PLEDERHidrogramaUnitariosDlg.h"
#include "PLEDERHidrologiaDatos.h"
#include "PLEDERRecursosCad.h"
/*------------------------------------------------------------------*/
//Creando objetos
CPLEDERHidrologiaDatos HU;
CRecursosCad RecursosHU;
/*------------------------------------------------------------------*/
IMPLEMENT_DYNAMIC(CPLEDERHidrogramaUnitariosDlg, CDialog)
BEGIN_MESSAGE_MAP(CPLEDERHidrogramaUnitariosDlg, CDialog)
//ON_EN_KILLFOCUS(IDC_EDIT_t, OnKillfocusEdit_t)
ON_BN_CLICKED(IDC_BUTTON_HU, OnButtonImportarHU)
ON_BN_CLICKED(IDC_BUTTON_PULSOS, OnButtonImportarPulsos)
154
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
ON_BN_CLICKED(IDOK,
&CPLEDERHidrogramaUnitariosDlg::OnBnClickedOk)
END_MESSAGE_MAP()
/*------------------------------------------------------------------*/
CPLEDERHidrogramaUnitariosDlg::CPLEDERHidrogramaUnitariosDlg (CWnd
*pParent /*=NULL*/, HINSTANCE hInstance /*=NULL*/) : CAdUiDialog
(CPLEDERHidrogramaUnitariosDlg::IDD, pParent, hInstance)
{
//m_t = _T("6.0");
CPLEDERHidrogramaUnitariosDlg::~CPLEDERHidrogramaUnitariosDlg()
{
/*------------------------------------------------------------------*/
/*------------------------------------------------------------------*/
BOOL CPLEDERHidrogramaUnitariosDlg::OnInitDialog()
{
CDialog::OnInitDialog();
return TRUE;
}
/*------------------------------------------------------------------*/
void CPLEDERHidrogramaUnitariosDlg::OnButtonImportarHU()
{
// mensaje de consola
acutPrintf(_T("\nPLEDER: Importar datos de Hidrogramas
Unitarios."));
long NumeroVertHU; //Número de ordenadas del H.U.
struct resbuf *rb; // resbufs
if (!rb)
{
//MDITopoLGCAD.RestSystemVars();
acdbFail(_T("\nError de asignación de memoria [IMPORTAR
HU][rb]."));
return;
}
155
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
acutRelRb(rb);
//MDITopoLGCAD.RestSystemVars();
return;
}
if (!pNombreArchivo)
{
acutRelRb(rb);
//MDITopoLGCAD.RestSystemVars();
acdbFail(_T("\nError de asignación de memoria [IMPORTAR
HU][pNombreArchivo]."));
return;
}
acutRelRb(rb);
if (HU.ImportarHidrogramaUnitario(pNombreArchivo, &NumeroVertHU)
!= RTNORM)
{
if (pNombreArchivo)
{
acad_free(pNombreArchivo);
}
//MDITopoLGCAD.RestSystemVars();
return;
}
if (pNombreArchivo)
{
acad_free(pNombreArchivo);
}
/*------------------------------------------------------------------*/
void CPLEDERHidrogramaUnitariosDlg::OnButtonImportarPulsos()
{
acutPrintf(_T("\nPLEDER: Importa datos de Pulsos."));
/*------------------------------------------------------------------*/
void CPLEDERHidrogramaUnitariosDlg::OnBnClickedOk()
{
156
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
if ( HU.EscorrentiaDirecta1(HU.pPrimerHU) != RTNORM)
{
RecursosHU.RestaurarVariables();
acdbFail(_T("\nError: Escorrentia directa"));
return;
}
RecursosHU.RestaurarVariables();
CDialog::OnOK();
}
/*------------------------------------------------------------------*/
PLEDERHidrologiaBufer.cpp
#include "StdAfx.h"
#include "PLEDERHidrologiaBufer.h"
/*------------------------------------------------------------------*/
HidrogramaUnitarioBufer::HidrogramaUnitarioBufer()
{
Siguiente = NULL;
}
//Constructor que inicializa a CoorXX, CoordYY, ns y siguiente = NULL
HidrogramaUnitarioBufer::HidrogramaUnitarioBufer(int nn, double HUU,
double PULSOP)
{
Siguiente = NULL;
n = nn;
HU = HUU;
PULSO = PULSOP;
}
//Destructor
HidrogramaUnitarioBufer::~HidrogramaUnitarioBufer() {}
PLEDERHidrologiaCalculos.cpp
#include "StdAfx.h"
#include "PLEDERHidrologiaCalculos.h"
#include "PLEDERHidrologiaDatos.h"
// objetos
CPLEDERHidrologiaDatos HidrologiaDatos;
CPLEDERHidrologiaCalculos::CPLEDERHidrologiaCalculos(void)
157
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
{
}
CPLEDERHidrologiaCalculos::~CPLEDERHidrologiaCalculos(void)
{
}
if (dt <= 3)
{
Pacum[i]=a*(1+k*log10(Tr))* pow((D[i]/60+b),(n-
1))*D[i]/60;
}
else
{
Pacum[i]=a*(1+k*log10(Tr))* pow((D[i]/60),n);
}
Pincr[i]=Pacum[i]-Pacum[i-1];
//Precipitación Incremental
} //For i
158
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
{
j =N+1-2*i;
Palte[i]=Pincr[j];
//Precipitacion Alterna
}
else
{
j =2*i-N;
Palte[i]=Pincr[j];
//Precipitacion Alterna
}
//acutPrintf (_T("\n Palte[%d] %0.3f"), i , Palte[i]);
} //For i
return RTNORM;
}
NPacum[0]= 0.0;
//Condicion Inicial
float dt = 24/N;
159
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
NPincr[i+1]=NPacum[i+1]-NPacum[i];
//Precipitación Incremental
} //For i
return RTNORM;
}
{
int i;
float Iai, S;
else
{
Ia[i]=Iai;
}
160
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
} //for i
return RTNORM;
}
j=1;
k = 2;
161
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
}// for j
Pulsos[i]=PulsoSum;
k++;
//acutPrintf(_T("\nPulsos[%d]: %0.5f"),i, Pulsos[i]);
cont++; // Contador del número de pulsos.
}//for i
*nP = cont;
return RTNORM;
}
int CPLEDERHidrologiaCalculos::Convolucion(int nP, int nU, float *P,
float *U, float *Q)
/*--------------------------------------------------------------------
Ingreso : nP = Cantidad de Pulsos en la lista [P].
nU = Cantidad de ordenadas de la lista [U].
P = Lista de Pulso ó Precipitación Efectiva
-> exceso de lluvia.
U = Lista de la función respuesta a un
pulso (HU) o los caudales por unidad de
precipitación efectiva del Hidrograma
Unitario
Salida : Q = Lista de Caudal de escorrentia directa
(SALIDA)
RTNORM si no se produce ningún error.
Propósito : Calcula los caudales de escorrentía directa mediante en
método de convolución discreta de la ecuación 2.5.15. Q = suma(PxU)
--------------------------------------------------------------------*/
{
float Qsum;
int n, m, nQ, M;
M = nP;
nQ = M + nU - 1;
Q[n] = Qsum;
} //for n
return RTNORM;
}
PLEDERHidrologiaDatos.cpp
#include "StdAfx.h"
#include "PLEDERHidrologiaDatos.h"
162
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
#include "PLEDERRecursosCad.h"
#include "PLEDERHidrologiaBufer.h"
#include "PLEDERHidrologiaCalculos.h"
#include <iostream>
#include <fstream> // Para exportar atributos
#include <cstdlib>
#include <new>
/*------------------------------------------------------------------*/
//Creando objetos
CPLEDERHidrologiaCalculos CalcHidrologia;
/*------------------------------------------------------------------*/
CPLEDERHidrologiaDatos::CPLEDERHidrologiaDatos(void)
{
CPLEDERHidrologiaDatos::~CPLEDERHidrologiaDatos(void)
{
delete [] P;
delete [] U;
delete [] Q;
}
int
CPLEDERHidrologiaDatos::EscorrentiaDirecta1(HidrogramaUnitarioBufer
*pPrimerHU)
/*-------------------------------------------------------------------
Ingreso : pPrimerHU = Puntero al primer elemento del
buffer(HidrogramaUnitarioBufer).
Salida : RTNORM si no se produce ningún error.
RTERROR en otro caso.
Propósito : Calcula la escorrentía directa a partir del Hidrograma
Unitario y pusos o escorrentia directa
--------------------------------------------------------------------*/
{
// Verificar los argumentos
if (!pPrimerHU)
{
acdbFail(_T("\nPuntero Nulo de la importación"));
return RTERROR;
}
HidrogramaUnitarioBufer *pHU;
pPrimerHU = pPrimerHU->Siguiente;
163
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
{
nP++;
}
}
int nQ = nP+nU-1;
P = new float[nP+1];
U = new float[nU+1];
Q = new float[nQ+1];
return RTNORM;
}
164
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
if (!pNombreArchivo)
{
acdbFail(_T("\nArgumento de función no válido
[ImportarHidrogramaUnitario]."));
return RTERROR;
}
if (infile.fail() != 0)
{
*NumeroVertHU = 0;
acdbFail(_T("\nError de E/S al abrir el fichero
[IImportarHidrogramaUnitario][open]."));
return RTERROR;
}
if (!buffer)
{
*NumeroVertHU = 0;
infile.close();
acdbFail(_T("\nError de asignación de memoria [Importar
HU][buffer]."));
return RTERROR;
}
while (!infile.eof())
{
infile.getline(buffer, GETLINEMAXBUFF, '\n');
if (infile.eof())
{
// limpiar el flag eof
infile.clear();
break;
}
np++;
}
np = 0;
165
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
catch(const std::bad_alloc&)
{
acedRestoreStatusBar();
acdbFail(_T("\nError de asignación de memoria [Importar
HU][pPrimerHU]."));
return RTERROR;
}
// recorrer el fichero
while (!infile.eof())
{
// leer una línea del fichero
infile.getline(buffer, GETLINEMAXBUFF, '\n');
if (infile.eof())
break;
if (!token)
{
*NumeroVertHU = np;
infile.close();
acad_free(buffer);
acedRestoreStatusBar();
acdbFail(_T("\nFichero de Hidrograma Unitario No
válido [Importar HU]"));
return RTERROR;
}
n = atoi(token);
// Ordenada del HU
token = ::strtok(NULL, seps);
if (!token)
{
*NumeroVertHU = np;
infile.close();
acad_free(buffer);
acedRestoreStatusBar();
acdbFail(_T("\nFichero de Hidrograma Unitario No
válido -n- [Importar HU]"));
return RTERROR;
}
x = atof(token);
// PULSOS
token = ::strtok(NULL, seps);
if (!token)
{
166
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
*NumeroVertHU = np;
infile.close();
acad_free(buffer);
acedRestoreStatusBar();
acdbFail(_T("\nFichero de Hidrograma Unitario No
válido -n- [Importar HU]"));
return RTERROR;
}
y = atof(token);
int contador = 1;
catch(const std::bad_alloc&)
{
LiberarBufferHidrogramaUnitario();
acedRestoreStatusBar();
acdbFail(_T("\nError de asignación de memoria
[Importar HU][nHU]."));
return RTERROR;
}
nbprevious->Siguiente = nHU;
nbprevious = nHU;
} // while
infile.close();
acad_free(buffer);
acedRestoreStatusBar();
return RTNORM;
}
167
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
{
// Distribución Tipo I
float TipoI[241]=
{0.0,0.00174,0.00348,0.00522,0.00697,0.00871,0.01046,0.0122,0.01
395,0.0157,0.01745,0.0192,0.02095,0.0227,0.02446,0.02621,0.02797
,0.02972,0.03148,0.03324,0.035,0.03677,0.03858,0.04041,0.04227,0
.04416,0.04608,0.04803,0.05001,0.05201,0.05405,0.05611,0.05821,0
.06033,0.06248,0.06466,0.06687,0.06911,0.07138,0.07367,0.076,0.0
7835,0.0807,0.08307,0.08545,0.08784,0.09024,0.09265,0.09507,0.09
751,0.09995,0.10241,0.10487,0.10735,0.10984,0.11234,0.11485,0.11
737,0.1199,0.12245,0.125,0.12761,0.13034,0.13317,0.1361,0.13915,
0.1423,0.14557,0.14894,0.15241,0.156,0.15966,0.16334,0.16706,0.1
7082,0.1746,0.17842,0.18226,0.18614,0.19006,0.194,0.19817,0.2027
5,0.20775,0.21317,0.219,0.22523,0.23185,0.23885,0.24623,0.254,0.
26233,0.27139,0.28119,0.29173,0.303,0.31942,0.34542,0.38784,0.46
316,0.515,0.5322,0.5476,0.5612,0.573,0.583,0.59188,0.60032,0.608
32,0.61588,0.623,0.62982,0.63648,0.64298,0.64932,0.6555,0.66152,
0.66738,0.67308,0.67862,0.684,0.68925,0.6944,0.69945,0.7044,0.70
925,0.714,0.71865,0.7232,0.72765,0.732,0.73625,0.7404,0.74445,0.
7484,0.75225,0.756,0.75965,0.7632,0.76665,0.77,0.77329,0.77656,0
.77981,0.78304,0.78625,0.78944,0.79261,0.79576,0.79889,0.802,0.8
0509,0.80816,0.81121,0.81424,0.81725,0.82024,0.82321,0.82616,0.8
2909,0.832,0.83489,0.83776,0.84061,0.84344,0.84625,0.84904,0.851
81,0.85456,0.85729,0.86,0.86269,0.86536,0.86801,0.87064,0.87325,
0.87584,0.87841,0.88096,0.88349,0.886,0.88849,0.89096,0.89341,0.
89584,0.89825,0.90064,0.90301,0.90536,0.90769,0.91,0.91229,0.914
56,0.91681,0.91904,0.92125,0.92344,0.92561,0.92776,0.92989,0.932
,0.93409,0.93616,0.93821,0.94024,0.94225,0.94424,0.94621,0.94816
,0.95009,0.952,0.95389,0.95576,0.95761,0.95944,0.96125,0.96304,0
.96481,0.96656,0.96829,0.97,0.97169,0.97336,0.97501,0.97664,0.97
825,0.97984,0.98141,0.98296,0.98449,0.986,0.98749,0.98896,0.9904
1,0.99184,0.99325,0.99464,0.99601,0.99736,0.99869,1.0};
// Distribución Tipo IA
float TipoIA[241]=
{0.0,0.00224,0.00432,0.00628,0.00816,0.01,0.01184,0.01372,0.0156
8,0.01776,0.02,0.02276,0.02568,0.02872,0.03184,0.035,0.03797,0.0
4095,0.04394,0.04695,0.05,0.05315,0.05633,0.05954,0.06276,0.066,
0.0692,0.0724,0.0756,0.0788,0.082,0.08514,0.08829,0.09147,0.0947
1,0.098,0.10147,0.10502,0.10862,0.11229,0.116,0.11969,0.12342,0.
12721,0.13107,0.135,0.13901,0.1431,0.14729,0.15159,0.156,0.16059
,0.1653,0.17011,0.17501,0.18,0.18494,0.18999,0.19517,0.20049,0.2
06,0.21196,0.21808,0.22432,0.23064,0.237,0.24285,0.24878,0.2549,
0.26127,0.268,0.27517,0.28287,0.29118,0.30019,0.31,0.33142,0.354
69,0.37876,0.40255,0.425,0.43936,0.45168,0.46232,0.47164,0.48,0.
48904,0.49752,0.50548,0.51296,0.52,0.52664,0.53292,0.53888,0.544
56,0.55,0.55564,0.56116,0.56656,0.57184,0.577,0.58198,0.58685,0.
59163,0.59635,0.601,0.60576,0.61044,0.61504,0.61956,0.624,0.6283
6,0.63264,0.63684,0.64096,0.645,0.64889,0.65272,0.65651,0.66026,
0.664,0.66773,0.67148,0.67527,0.6791,0.683,0.68665,0.69027,0.693
86,0.69744,0.701,0.70473,0.70838,0.71198,0.71551,0.719,0.72245,0
.72586,0.72926,0.73263,0.736,0.73939,0.74277,0.74613,0.74948,0.7
5281,0.75613,0.75943,0.76271,0.76598,0.76924,0.77248,0.77571,0.7
7892,0.78211,0.78529,0.78845,0.7916,0.79474,0.79786,0.80096,0.80
405,0.80712,0.81018,0.81322,0.81625,0.81926,0.82226,0.82524,0.82
821,0.83116,0.8341,0.83702,0.83992,0.84281,0.84569,0.84855,0.851
4,0.85423,0.85704,0.85984,0.86262,0.86539,0.86815,0.87089,0.8736
1,0.87632,0.87901,0.88169,0.88435,0.887,0.88963,0.89225,0.89485,
0.89744,0.90001,0.90257,0.90511,0.90763,0.91014,0.91264,0.91512,
0.91759,0.92004,0.92247,0.92489,0.92729,0.92968,0.93206,0.93442,
0.93676,0.93909,0.9414,0.9437,0.94598,0.94825,0.9505,0.95274,0.9
168
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
5496,0.95717,0.95936,0.96154,0.9637,0.96584,0.96797,0.97009,0.97
219,0.97428,0.97635,0.9784,0.98044,0.98246,0.98447,0.98647,0.988
45,0.99041,0.99236,0.99429,0.99621,0.99811,1.0};
// Distribución Tipo II
float TipoII[241]=
{0.0,0.00101,0.00202,0.00305,0.00408,0.00513,0.00618,0.00725,0.0
0832,0.00941,0.0105,0.01161,0.01272,0.01385,0.01498,0.01613,0.01
728,0.01845,0.01962,0.02081,0.022,0.02321,0.02442,0.02565,0.0268
8,0.02813,0.02938,0.03065,0.03192,0.03321,0.0345,0.03581,0.03712
,0.03845,0.03978,0.04113,0.04248,0.04385,0.04522,0.04661,0.048,0
.04941,0.05084,0.05229,0.05376,0.05525,0.05676,0.05829,0.05984,0
.06141,0.063,0.06461,0.06624,0.06789,0.06956,0.07125,0.07296,0.0
7469,0.07644,0.07821,0.08,0.08181,0.08364,0.08549,0.08736,0.0892
5,0.09116,0.09309,0.09504,0.09701,0.099,0.10101,0.10304,0.10509,
0.10716,0.10925,0.11136,0.11349,0.11564,0.11781,0.12,0.12225,0.1
246,0.12705,0.1296,0.13225,0.135,0.13785,0.1408,0.14385,0.147,0.
1502,0.1534,0.1566,0.1598,0.163,0.16628,0.16972,0.17332,0.17708,
0.181,0.18512,0.18948,0.19408,0.19892,0.204,0.2094,0.2152,0.2214
,0.228,0.235,0.24268,0.25132,0.26092,0.27148,0.283,0.30684,0.354
36,0.43079,0.56786,0.663,0.68196,0.69864,0.71304,0.72516,0.735,0
.74344,0.75136,0.75876,0.76564,0.772,0.77796,0.78364,0.78904,0.7
9416,0.799,0.8036,0.808,0.8122,0.8162,0.82,0.82367,0.82726,0.830
79,0.83424,0.83763,0.84094,0.84419,0.84736,0.85047,0.8535,0.8564
7,0.85936,0.86219,0.86494,0.86763,0.87024,0.87279,0.87526,0.8776
7,0.88,0.88229,0.88455,0.88679,0.889,0.89119,0.89335,0.89549,0.8
976,0.89969,0.90175,0.90379,0.9058,0.90779,0.90975,0.91169,0.913
6,0.91549,0.91735,0.91919,0.921,0.92279,0.92455,0.92629,0.928,0.
92969,0.93135,0.93299,0.9346,0.93619,0.93775,0.93929,0.9408,0.94
229,0.94375,0.94519,0.9466,0.94799,0.94935,0.95069,0.952,0.9533,
0.95459,0.95588,0.95716,0.95844,0.95971,0.96098,0.96224,0.9635,0
.96475,0.966,0.96724,0.96848,0.96971,0.97094,0.97216,0.97338,0.9
7459,0.9758,0.977,0.9782,0.97939,0.98058,0.98176,0.98294,0.98411
,0.98528,0.98644,0.9876,0.98875,0.9899,0.99104,0.99218,0.99331,0
.99444,0.99556,0.99668,0.99779,0.9989,1.0};
169
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
.95303,0.95437,0.95569,0.957,0.95829,0.95958,0.96085,0.96211,0.9
6336,0.9646,0.96582,0.96704,0.96824,0.96944,0.97062,0.97179,0.97
295,0.9741,0.97523,0.97636,0.97747,0.97858,0.97967,0.98075,0.981
82,0.98288,0.98392,0.98496,0.98598,0.987,0.988,0.98899,0.98997,0
.99094,0.99189,0.99284,0.99377,0.9947,0.99561,0.99651,0.9974,0.9
9828,0.99914,1.0};
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;
}
170
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
acutPrintf(_T("\nFuera de Rango"));
} //switch (Tormenta)
return RTNORM;
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};
return RTNORM;
}
// Tramo AB
if ( T>=0 && T <= P-(1.0/3.0)*W50)
{
171
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
Q = (0.5*QpR/(P-(1.0/3.0)*W50))*T;
Q = Q/10.0; // [ m³/(sxmm)]
}
// Tramo BC
if ( T> P-(1.0/3.0)*W50 && T <= P-(1.0/3.0)*W75)
{
Q = 0.5*QpR + (0.75*QpR/(W50-W75))*(T-P+(1.0/3.0)*W50);
Q = Q/10.0; // [ m³/(sxmm)]
}
// Tramo CD
if ( T > P-(1.0/3.0)*W75 && T <= P)
{
Q = 0.75*QpR + (0.75*QpR/W75)*(T-P+(1.0/3.0)*W75);
Q = Q/10.0; // [ m³/(sxmm)]
}
// Tramo DE
if ( T > P && T <= P + (2.0/3.0)*W75)
{
Q = QpR - 3*QpR/(8*W75)*(T-P);
Q = Q/10.0; // [ m³/(sxmm)]
}
// Tramo EF
if ( T > P + (2.0/3.0)*W75 && T <= P + (2.0/3.0)*W50)
{
Q = 0.75*QpR - 3*QpR/(8*(W50-W75))*(T-P-(2.0/3.0)*W75);
Q = Q/10.0; // [ m³/(sxmm)]
}
// Tramo FG
if ( T > P + (2.0/3.0)*W50 && T <= tb)
{
Q = 0.50*QpR - (0.5*QpR/(tb-P-(2.0/3.0)*W50))*(T-P-
(2.0/3.0)*W50);
Q = Q/10.0; // [ m³/(sxmm)]
}
return Q;
}
void CPLEDERHidrologiaDatos::LiberarBufferHidrogramaUnitario()
/*--------------------------------------------------------------------
Ingreso : Vacío.
Salida : Vacío.
Propósito : Libera el buffer en ristra HidrogramaUnitarioBufer al que
apunta el miembro pPrimerHU. Llamar a esta función para liberar
el buffer con las ordenasas del HU , obtenidos mediante una llamada a
la función ImportarHidrogramaUnitario().
--------------------------------------------------------------------*/
{
if (!pPrimerHU)
return;
// liberar la ristra
while (Siguiente = nHU->Siguiente)
172
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
{
delete nHU;
nHU = Siguiente;
}
delete nHU;
pPrimerHU = NULL;
}
PLEDERHietogramaIilaSenamhiDlg.cpp
/*--------------------------------------------------------------------
PLEDERIilaSenamhiDlg.cpp: archivo de implementación
Cuadro de diálogo CPLEDERIilaSenamhiDlg -> para obtener Hietogramas
mediante el método IILA SENAMHI UNI
-------------------------------------------------------------------*/
#include "stdafx.h"
#include "resource.h"
#include "PLEDERHietogramaIilaSenamhiDlg.h"
#include "PLEDERHidrologiaDatos.h"
#include "PLEDERRecursosCad.h"
/*-----------------------------------------------------------------*/
//Creando objetos
CRecursosCad RecursosIILA;
/*-----------------------------------------------------------------*/
IMPLEMENT_DYNAMIC(CPLEDERIilaSenamhiDlg, CAdUiDialog)
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)
173
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
//ON_CBN_SELCHANGE(IDC_COMB_b, OnKillfocusCombob)
// Botones
ON_BN_CLICKED(IDC_BUTTON_Punto, OnButtonPUNTO)
ON_BN_CLICKED(IDOK, &CPLEDERIilaSenamhiDlg::OnBnClickedOk)
END_MESSAGE_MAP()
/*------------------------------------------------------------------*/
void CPLEDERIilaSenamhiDlg::DoDataExchange (CDataExchange *pDX)
{
CAdUiDialog::DoDataExchange (pDX) ;
//Botones
DDX_Control(pDX, IDC_BUTTON_Punto, m_PickButton_PUNTO);
//ComboBox
DDX_Control(pDX, IDC_COMB_b, m_Combo_b);
DDX_Control(pDX, IDC_COMB_Var, m_Combo_Var);
}
/*------------------------------------------------------------------*/
// Controladores de mensajes de CALC_HIDRAULIC_DLG
BOOL CPLEDERIilaSenamhiDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_Edit_a.SetWindowText(m_a);
m_Edit_a.SetRange(0, 1000.0);
m_Edit_k.SetWindowText(m_k);
m_Edit_k.SetRange(0, 1000);
m_Edit_n.SetWindowText(m_n);
m_Edit_n.SetRange(0, 1000);
m_Edit_duracion.SetWindowText(m_duracion);
m_Edit_duracion.SetRange(0, 24);
m_Edit_tr.SetWindowText(m_tr);
m_Edit_tr.SetRange(0, 100000.0);
m_Edit_PX.SetWindowText(m_PX);
m_Edit_PY.SetWindowText(m_PY);
m_PickButton_PUNTO.AutoLoad();
m_Combo_b.SetCurSel(1);
m_Combo_Var.SetCurSel(3);
174
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
return TRUE;
}
void CPLEDERIilaSenamhiDlg::OnKillfocusEdit_a()
{
m_Edit_a.Convert();
if (!m_Edit_a.Validate())
{
::AfxMessageBox(_T("Entrada no válida, rango = 1 @
1000.0"));
m_Edit_a.SetFocus();
m_Edit_a.SetSel(0, -1);
}
CString str;
m_Edit_a.GetWindowText(m_a);
acdbRToS(::_wtof(m_a), 2, 3, str.GetBuffer(80));
m_Edit_a.SetWindowText(str);
}
void CPLEDERIilaSenamhiDlg::OnKillfocusEdit_k()
{
m_Edit_k.Convert();
if (!m_Edit_k.Validate())
{
::AfxMessageBox(_T("Entrada no válida, rango = 1 @
1000.0"));
m_Edit_k.SetFocus();
m_Edit_k.SetSel(0, -1);
}
CString str;
m_Edit_k.GetWindowText(m_k);
acdbRToS(::_wtof(m_k), 2, 3, str.GetBuffer(80));
m_Edit_k.SetWindowText(str);
}
void CPLEDERIilaSenamhiDlg::OnKillfocusEdit_n()
{
m_Edit_n.Convert();
if (!m_Edit_n.Validate())
{
::AfxMessageBox(_T("Entrada no válida, rango = 1 @
1000.0"));
m_Edit_n.SetFocus();
m_Edit_n.SetSel(0, -1);
}
CString str;
m_Edit_n.GetWindowText(m_n);
acdbRToS(::_wtof(m_n), 2, 3, str.GetBuffer(80));
m_Edit_n.SetWindowText(str);
}
void CPLEDERIilaSenamhiDlg::OnKillfocusEdit_duracion()
{
m_Edit_duracion.Convert();
if (!m_Edit_duracion.Validate())
{
::AfxMessageBox(_T("Entrada no válida, rango = 1 @ 24"));
175
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
m_Edit_duracion.SetFocus();
m_Edit_duracion.SetSel(0, -1);
}
CString str;
m_Edit_duracion.GetWindowText(m_duracion);
acdbRToS(::_wtof(m_duracion), 2, 3, str.GetBuffer(80));
m_Edit_duracion.SetWindowText(str);
}
void CPLEDERIilaSenamhiDlg::OnKillfocusEdit_tr()
{
m_Edit_tr.Convert();
if (!m_Edit_tr.Validate())
{
::AfxMessageBox(_T("Entrada no válida, rango = 1 @
1000.0"));
m_Edit_tr.SetFocus();
m_Edit_tr.SetSel(0, -1);
}
CString str;
m_Edit_tr.GetWindowText(m_tr);
acdbRToS(::_wtof(m_tr), 2, 3, str.GetBuffer(80));
m_Edit_tr.SetWindowText(str);
}
void CPLEDERIilaSenamhiDlg::OnButtonPUNTO()
{
//Clase que habilita CAD
//AcAxDocLock docLock;
CAcModuleResourceOverride resourceOverride;
// Esconde el diálogo
BeginEditorCommand();
ads_point p1;
// Coge el Punto P1
if (acedGetPoint (NULL, _T("\nPique un Punto para la tabla
[Resultados IILA]"), p1) != RTNORM )
{
acutPrintf(_T("\nError al ingresar el Punto"));
// si no cancela el comando(incluyendo el diálogo)
// CancelEditorCommand();
CompleteEditorCommand();
return;
}
CompleteEditorCommand();
m_PX.Format(_T("%g"), p1[X] );
m_Edit_PX.SetWindowText(m_PX);
m_PY.Format(_T("%g"), p1[Y] );
m_Edit_PY.SetWindowText(m_PY);
}
void CPLEDERIilaSenamhiDlg::OnBnClickedOk()
{
// TODO : Add extra validation here
m_Edit_a.GetWindowText(m_a);
176
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
m_Edit_k.GetWindowText(m_k);
m_Edit_n.GetWindowText(m_n);
m_Edit_duracion.GetWindowText(m_duracion);
m_Edit_tr.GetWindowText(m_tr);
m_Edit_PX.GetWindowText(m_PX);
m_Edit_PY.GetWindowText(m_PY);
nIndex = m_Combo_Var.GetCurSel();
m_Combo_Var.GetLBText(nIndex,m_variacion);
CDialog::OnOK();
PLEDERHietogramaNrcsDlg.cpp
/*--------------------------------------------------------------------
PLEDERNRCSDlg.cpp: archivo de implementación
Cuadro de diálogo CPLEDERNrcsDlg -> para obtener Hietogramas
mediante el método NRCS
--------------------------------------------------------------------*/
#include "stdafx.h"
#include "PLEDERHietogramaNrcsDlg.h"
#include "PLEDERRecursosCad.h"
#include "PLEDERHidrologiaCalculos.h"
/*------------------------------------------------------------------*/
//Creando objetos
CRecursosCad RecursosNRCS;
CPLEDERHidrologiaCalculos HidrologiaNRCS;
/*------------------------------------------------------------------*/
IMPLEMENT_DYNAMIC(CPLEDERNrcsDlg, CAdUiDialog)
{
m_P24 = _T("56.75");
m_NPX = _T("0.00");
m_NPY = _T("0.00");
CPLEDERNrcsDlg::~CPLEDERNrcsDlg()
{
}
BEGIN_MESSAGE_MAP(CPLEDERNrcsDlg, CAdUiDialog)
ON_EN_KILLFOCUS(IDC_EDIT_P24, OnKillfocusEdit_P24)
177
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
// Botones
ON_BN_CLICKED(IDC_BUTTON_Npunto, OnButtonNPUNTO)
ON_BN_CLICKED(IDOK, &CPLEDERNrcsDlg::OnBnClickedOk)
END_MESSAGE_MAP()
//ComboBox
DDX_Control(pDX, IDC_COMBO_Ndt, m_Combo_Ndt);
DDX_Control(pDX, IDC_COMBO_Ntormenta, m_Combo_Tormenta);
//Botones
DDX_Control(pDX, IDC_BUTTON_Npunto, m_PickButton_NPUNTO);
}
BOOL CPLEDERNrcsDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_Edit_P24.SetWindowText(m_P24);
m_Edit_P24.SetRange(0, 10000.0);
m_Edit_NPX.SetWindowText(m_NPX);
m_Edit_NPY.SetWindowText(m_NPY);
m_PickButton_NPUNTO.AutoLoad();
m_Combo_Ndt.SetCurSel(3);
m_Combo_Tormenta.SetCurSel(2);
return TRUE;
}
void CPLEDERNrcsDlg::OnKillfocusEdit_P24()
{
m_Edit_P24.Convert();
if (!m_Edit_P24.Validate())
{
::AfxMessageBox(_T("Entrada no válida, rango = 1 @
10000.0"));
m_Edit_P24.SetFocus();
m_Edit_P24.SetSel(0, -1);
}
CString str;
m_Edit_P24.GetWindowText(m_P24);
acdbRToS(::_wtof(m_P24), 2, 3, str.GetBuffer(80));
m_Edit_P24.SetWindowText(str);
}
void CPLEDERNrcsDlg::OnButtonNPUNTO()
{
//Clase que habilita CAD
178
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
//AcAxDocLock docLock;
CAcModuleResourceOverride resourceOverride;
// Esconde el diálogo
BeginEditorCommand();
ads_point p1;
// Coge el Punto P1
if (acedGetPoint (NULL, _T("\nPique un Punto para la tabla
[Resultados NRCS]"), p1) != RTNORM )
{
acutPrintf(_T("\nError al ingresar el Punto"));
// si no cancela el comando(incluyendo el diálogo)
// CancelEditorCommand();
CompleteEditorCommand();
return;
}
CompleteEditorCommand();
m_NPX.Format(_T("%g"), p1[X] );
m_Edit_NPX.SetWindowText(m_NPX);
m_NPY.Format(_T("%g"), p1[Y] );
m_Edit_NPY.SetWindowText(m_NPY);
}
void CPLEDERNrcsDlg::OnBnClickedOk()
{
// TODO : Add extra validation here
m_Edit_P24.GetWindowText(m_P24);
m_Edit_NPX.GetWindowText(m_NPX);
m_Edit_NPY.GetWindowText(m_NPY);
CDialog::OnOK();
PLEDERHUNRCSDlg.cpp
#include "stdafx.h"
#include "PLEDERHUNRCSDlg.h"
179
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
IMPLEMENT_DYNAMIC(CPLEDERHUNRCSDlg, CDialog)
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)
ON_BN_CLICKED(IDOK, &CPLEDERHUNRCSDlg::OnBnClickedOk)
END_MESSAGE_MAP()
// Cajas de Texto.
DDX_Control(pDX, IDC_EDIT_long, m_Edit_long);
DDX_Control(pDX, IDC_EDIT_pend, m_Edit_pend);
DDX_Control(pDX, IDC_EDIT_tc, m_Edit_tc);
DDX_Control(pDX, IDC_EDIT_tlag1, m_Edit_tlag1);
// Radio
DDX_Radio(pDX, IDC_RADIO_Kirpich, m_TipoTc);
// Botones (CAD)
DDX_Control(pDX, IDC_BUTTON_Long, m_PickButton_Long);
DDX_Control(pDX, IDC_BUTTON_Pend, m_PickButton_Pend);
BOOL CPLEDERHUNRCSDlg::OnInitDialog()
{
CDialog::OnInitDialog();
180
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
m_Edit_tc.SetWindowText(m_tc);
m_Edit_tlag1.SetWindowText(m_tlag1);
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);
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);
Tlag = 0.6*Tc;
181
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
m_tlag1.Format(_T("%g"), Tlag);
m_Edit_tlag1.SetWindowText(m_tlag1);
void CPLEDERHUNRCSDlg::OnKillfocusEdit_tc()
{
// Calcula el Tiempo de retardo (tlag)
m_Edit_tc.GetWindowText(m_tc);
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);
void CPLEDERHUNRCSDlg::OnRadioUsuario()
{
// Desactiva las casillas de la ventana
m_Edit_long.EnableWindow(0);
m_Edit_pend.EnableWindow(0);
CStatic *pPend;
pPend = (CStatic *)GetDlgItem(IDC_STATIC_pend);
pPend->EnableWindow(0);
CStatic *pLong;
pLong = (CStatic *)GetDlgItem(IDC_STATIC_long);
pLong->EnableWindow(0);
182
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
CButton *pBLong;
pBLong = (CButton *)GetDlgItem(IDC_BUTTON_Long);
pBLong->EnableWindow(0);
CButton *pBPend;
pBPend = (CButton *)GetDlgItem(IDC_BUTTON_Pend);
pBPend->EnableWindow(0);
void CPLEDERHUNRCSDlg::OnButtonLong()
{
//Esconde el diálogo
BeginEditorCommand();
int rc;
double area;
ads_point punto; ads_name nombrep;
AcDbObjectId ID;
AcDbEntity *pEnt;
//Retorna al diálogo
CompleteEditorCommand();
183
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
if (numVerts <= 2)
{
pPolyline->close();
CompleteEditorCommand();
return acdbFail(_T("\nPLEDER: !ERROR!\nPolyline no válida
"));
}
AcGeLineSeg2d ls;
AcGePoint2d start, end;
ads_point v0, v1;
unsigned int i;
double Lc=0.00; //longitud de la cuenca
v0[Z] = v1[Z] = 0;
v0[X] = start.x;
v0[Y] = start.y;
v1[X] = end.x;
v1[Y] = end.y;
Lc = Lc + acutDistance(v0 , v1);
}
pPolyline->close();
void CPLEDERHUNRCSDlg::OnButtonPend()
{
//Esconde el diálogo
BeginEditorCommand();
184
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
while (true)
{
// Cogen los puntos siguienes
if (acedGetPoint(p1, _T("\nSiguiente punto: "), p2) !=
RTNORM)
{
// se canceló o pulsó enter
s = abs((p1[Y]-p2[Y]))/abs((p2[X]-p1[X]));
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
185
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
L = _wtof(m_long);
S = _wtof(m_pend);
void CPLEDERHUNRCSDlg::onCalcularTlag()
{
m_Edit_long.GetWindowText(m_long);
m_Edit_pend.GetWindowText(m_pend);
L = _wtof(m_long);
S = _wtof(m_pend);
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
#include "stdafx.h"
#include "PLEDERHUSnyderDlg.h"
IMPLEMENT_DYNAMIC(CPLEDERHUSNYDERDlg, CDialog)
186
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
m_L = _T("150.00");
m_Lc = _T("75.00");
m_TR = _T("12.00");
m_TpR = _T("34.00");
m_Qp = _T("157.50");
m_Ct = _T("2.64");
m_tp = _T("32.51");
m_Cp = _T("0.56");
CPLEDERHUSNYDERDlg::~CPLEDERHUSNYDERDlg()
{
}
BEGIN_MESSAGE_MAP(CPLEDERHUSNYDERDlg, CAdUiDialog)
// Cajas de texto
ON_EN_KILLFOCUS(IDC_EDIT_SNa, OnKillfocusEdit_Area)
ON_EN_KILLFOCUS(IDC_EDIT_SNl, OnKillfocusEdit_L)
ON_EN_KILLFOCUS(IDC_EDIT_SNlc, OnKillfocusEdit_Lc)
ON_EN_KILLFOCUS(IDC_EDIT_SNtr, OnKillfocusEdit_TR)
ON_EN_KILLFOCUS(IDC_EDIT_SNtpr, OnKillfocusEdit_TpR)
ON_EN_KILLFOCUS(IDC_EDIT_SNqp, OnKillfocusEdit_Qp)
ON_EN_KILLFOCUS(IDC_EDIT_SNct, OnKillfocusEdit_Ct)
ON_EN_KILLFOCUS(IDC_EDIT_SNtp, OnKillfocusEdit_tp)
ON_EN_KILLFOCUS(IDC_EDIT_SNcp, OnKillfocusEdit_Cp)
ON_BN_CLICKED(IDOK, &CPLEDERHUSNYDERDlg::OnBnClickedOk)
END_MESSAGE_MAP()
// 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();
187
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
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);
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);
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);
void CPLEDERHUSNYDERDlg::OnKillfocusEdit_TR()
{
CString str;
m_Edit_TR.GetWindowText(m_TR);
acdbRToS(::_wtof(m_TR), 2, 3, str.GetBuffer(80));
m_Edit_TR.SetWindowText(str);
188
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
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);
void CPLEDERHUSNYDERDlg::OnKillfocusEdit_Ct()
{
CString str;
m_Edit_Ct.GetWindowText(m_Ct);
acdbRToS(::_wtof(m_Ct), 2, 3, str.GetBuffer(80));
m_Edit_Ct.SetWindowText(str);
void CPLEDERHUSNYDERDlg::OnKillfocusEdit_tp()
{
CString str;
m_Edit_tp.GetWindowText(m_tp);
acdbRToS(::_wtof(m_tp), 2, 3, str.GetBuffer(80));
m_Edit_tp.SetWindowText(str);
}
void CPLEDERHUSNYDERDlg::OnKillfocusEdit_Cp()
{
m_Edit_Cp.Convert();
if (!m_Edit_Cp.Validate())
{
::AfxMessageBox(_T("Coeficiente Cp no Válido, \nrango = 0.1
@ 1"));
m_Edit_Cp.SetFocus();
m_Edit_Cp.SetSel(0, -1);
}
CString str;
m_Edit_Cp.GetWindowText(m_Cp);
acdbRToS(::_wtof(m_Cp), 2, 3, str.GetBuffer(80));
189
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
m_Edit_Cp.SetWindowText(str);
A = _wtof(m_area);
L = _wtof(m_L);
Lc = _wtof(m_Lc);
tR = _wtof(m_TR);
tpR = _wtof(m_TpR);
Qp = _wtof(m_Qp);
qp = Qp/A;
if (tpR == 5.5*tR)
{
tr = tR;
tp = tpR;
Ct = tp/(0.75*pow(L*Lc,exp1));
qpR = qp;
Cp = qpR*tpR/2.75;
}
else
{
tr = (tpR - 0.25*tR)/5.25;
tp = 5.5*tr;
Ct = tp/(0.75*pow(L*Lc,exp1));
qpR = qp;
Cp = qpR*tpR/2.75;
}
m_Ct.Format(_T("%g"), Ct);
m_Edit_Ct.SetWindowText(m_Ct);
m_tp.Format(_T("%g"), tp);
m_Edit_tp.SetWindowText(m_tp);
m_Cp.Format(_T("%g"), Cp);
190
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
m_Edit_Cp.SetWindowText(m_Cp);
void CPLEDERHUSNYDERDlg::onMensajesCp()
{
float Cp = _wtof(m_Cp);
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);
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);
void CPLEDERHUSNYDERDlg::OnBnClickedOk()
{
// TODO : Add extra validation here
m_Edit_Ct.GetWindowText(m_Ct);
m_Edit_Cp.GetWindowText(m_Cp);
CDialog::OnOK();
m_Edit_Cp.GetWindowText(m_Cp);
float Cp = _wtof(m_Cp);
191
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
PLEDERLluviaEscorrentiaDlg.cpp
/*--------------------------------------------------------------------
PLEDERLluviaEscorrentiaDlg.cpp: archivo de implementación
Cuadro de diálogo CPLEDERLluviaEscorrentiaDlg -> Calcula la
transformación de la lluvia escorrentía (hietogramas -> Hidrogramas)
-------------------------------------------------------------------*/
#include "stdafx.h"
#include "PLEDERLluviaEscorrentiaDlg.h"
#include "PLEDERRecursosCad.h"
#include "PLEDERHidrologiaCalculos.h"
#include "PLEDERHUNRCSDlg.h"
#include "PLEDERHUSnyderDlg.h"
#include "PLEDERHidrologiaDatos.h"
#include "PLEDERCurvaNumeroDlg.h"
#include "PLEDERHietogramaNrcsDlg.h"
#include "PLEDERHietogramaIilaSenamhiDlg.h"
/*------------------------------------------------------------------*/
//Creando objetos
CRecursosCad RecursosLLES;
CPLEDERHidrologiaCalculos HidrologiaLLES;
/*------------------------------------------------------------------*/
IMPLEMENT_DYNAMIC(CPLEDERLluviaEscorrentiaDlg, CAdUiDialog)
CPLEDERLluviaEscorrentiaDlg::CPLEDERLluviaEscorrentiaDlg(CWnd *pParent
/*=NULL*/, HINSTANCE hInstance /*=NULL*/)
: CAdUiDialog (CPLEDERLluviaEscorrentiaDlg::IDD, pParent, hInstance)
{
m_area = _T("1810.34");
m_qb = _T("0.00");
m_cn = _T("73");
m_ppx = _T("0.0");
m_ppy = _T("0.0");
computadoMM = false;
computadoHU = false;
}
CPLEDERLluviaEscorrentiaDlg::~CPLEDERLluviaEscorrentiaDlg()
{
BEGIN_MESSAGE_MAP(CPLEDERLluviaEscorrentiaDlg, CAdUiDialog)
192
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
// Cajas de Texto
//ON_EN_KILLFOCUS(IDC_EDIT_area, OnKillfocusEdit_AREA)
//ON_EN_KILLFOCUS(IDC_EDIT_qb, OnKillfocusEdit_QB)
ON_EN_KILLFOCUS(IDC_EDIT_cn, OnKillfocusEdit_CN)
// Combo Box
ON_CBN_SELCHANGE(IDC_COMBO_hus, OnKillfocusComboHUS)
ON_CBN_SELCHANGE(IDC_COMBO_mm, OnKillfocusComboMM)
ON_CBN_SELCHANGE(IDC_COMBO_intert, OnKillfocusComboINTERT)
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()
// 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);
//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 (Diálogo)
DDX_Control(pDX, IDC_BUTTON_hus, m_Button_HUS);
BOOL CPLEDERLluviaEscorrentiaDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_Edit_QB.SetWindowText(m_qb);
m_Edit_CN.SetWindowText(m_cn);
m_Edit_CN.SetRange(1, 100);
193
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
m_Edit_PPX.SetWindowText(m_ppx);
m_Edit_PPY.SetWindowText(m_ppy);
return
TRUE;
}
void CPLEDERLluviaEscorrentiaDlg::OnKillfocusEdit_CN()
{
m_Edit_CN.Convert();
if (!m_Edit_CN.Validate())
{
::AfxMessageBox(_T("Entrada no válida, rango = 1 @
100.0"));
m_Edit_CN.SetFocus();
m_Edit_CN.SetSel(0, -1);
}
CString str;
m_Edit_CN.GetWindowText(m_cn);
acdbRToS(::_wtof(m_cn), 2, 0, str.GetBuffer(80));
m_Edit_CN.SetWindowText(str);
}
void CPLEDERLluviaEscorrentiaDlg::OnKillfocusComboHUS()
{
void CPLEDERLluviaEscorrentiaDlg::OnKillfocusComboMM()
{
}
void CPLEDERLluviaEscorrentiaDlg::OnKillfocusComboINTERT()
{
void CPLEDERLluviaEscorrentiaDlg::OnButtonAREA()
{
//Esconde el diálogo
BeginEditorCommand();
int rc;
194
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
double area;
ads_point punto; ads_name nombrep;
//Retorna al diálogo
CompleteEditorCommand();
pPolyline->getArea(area);
pPolyline->close();
m_area.Format(_T("%g"),area/1000000.0);//Conversión a km2
m_Edit_AREA.SetWindowText(m_area);
}
void CPLEDERLluviaEscorrentiaDlg::OnButtonPPUNTO()
{
//Clase que habilita CAD
//AcAxDocLock docLock;
CAcModuleResourceOverride resourceOverride;
// Esconde el diálogo
BeginEditorCommand();
ads_point p1;
195
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
// Coge el Punto P1
if (acedGetPoint (NULL, _T("\nPique un Punto para la tabla
[Resultados PLEDER]"), p1) != RTNORM )
{
acutPrintf(_T("\nError al ingresar el Punto"));
// si no cancela el comando(incluyendo el diálogo)
// CancelEditorCommand();
CompleteEditorCommand();
return;
}
CompleteEditorCommand();
m_ppx.Format(_T("%g"), p1[X] );
m_Edit_PPX.SetWindowText(m_ppx);
m_ppy.Format(_T("%g"), p1[Y] );
m_Edit_PPY.SetWindowText(m_ppy);
}
void CPLEDERLluviaEscorrentiaDlg::OnCALCCurvaNumero()
{
//Declaracion de Objetos diálogos
CPLEDERCurvaNumeroDlg
dlgCNC(CWnd::FromHandle(adsw_acadMainWnd()));
if (dlgCNC.DoModal() != IDOK)
{
acutPrintf(_T("\nPLEDER: Se Canceló la Operación"));
return;
}
m_Edit_CN.SetWindowText(dlgCNC.m_cnc);
void CPLEDERLluviaEscorrentiaDlg::OnCALCHidrogramaUnitario()
{
m_hus = m_Combo_HUS.GetCurSel(); // Coge la posición del combo
hus
switch (m_hus)
{
case 0: // HUS NRCS
{
//Declaracion de Objetos diálogos
CPLEDERHUNRCSDlg
dlgHUNRCS(CWnd::FromHandle(adsw_acadMainWnd()));
if (dlgHUNRCS.DoModal() != IDOK)
{
acutPrintf(_T("\nPLEDER: Se Canceló la
Operación[HUS NRCS]"));
return;
}
Tretardo = _wtof(dlgHUNRCS.m_tlag1);
computadoHU = true;
break;
}
196
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
computadoHU = true;
break;
}
default:
acutPrintf(_T("\nFuera de Rango"));
} //switch (m_hus)
}
void CPLEDERLluviaEscorrentiaDlg::OnCALCPrecipitaciones()
{
pNP = 0;
switch (m_mm)
{
case 0: // Tormenta NRCS
{
CPLEDERNrcsDlg
dlgNRCS(CWnd::FromHandle(adsw_acadMainWnd()));
if (dlgNRCS.DoModal() != IDOK)
{
pNP = 0; // Una forma de saber si se calculó
o no
acutPrintf(_T("\nPLEDER: Se Canceló la
Operación"));
return;
}
// Variables Hietograma NRCS
float P24, // Precipitación máxima de 24 horas.
Ndt, // Intervalo de tiempo de la lluvia (min)
PX, // Punto de referencia X.
PY; // Punto de referencia Y.
P24 = _wtof(dlgNRCS.m_P24);
Ndt = _wtof(dlgNRCS.m_Ndt);
Tormenta =dlgNRCS.m_Tormenta;
PX =_wtof(dlgNRCS.m_NPX);
197
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
PY =_wtof(dlgNRCS.m_NPY);
computadoMM = true;
delete [] ND;
delete [] TipoT;
delete [] NPacum;
delete [] NPincr;
break;
}
case 1: // IILA
{
CPLEDERIilaSenamhiDlg
dlgIILA(CWnd::FromHandle(adsw_acadMainWnd()));
if (dlgIILA.DoModal() != IDOK)
{
pNP = 0; // Una forma de saber si se calculó
o no
acutPrintf(_T("\nPLEDER: Se Canceló la
Operación"));
return;
}
198
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
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);
PaltAcum[1] = 0.0;
Palternaincremental[1] = 0.0;
// Traspasa los resultados a la variable global
}// For i
computadoMM = true;
199
Apéndice A. HIDROLOGÍA CÓDIGO FUENTE C++
delete [] D;
delete [] Pacum;
delete [] Pincr;
delete [] Palte;
break;
}
case 2: // Especificado por el usuario
{
break;
}
default:
acutPrintf(_T("\nFuera de Rango"));
} //switch (m_mm)
void CPLEDERLluviaEscorrentiaDlg::OnBnClickedOk()
{
// Coge los valores despues de pulsar OK
// Cajas de texto
m_Edit_AREA.GetWindowText(m_area);
m_Edit_QB.GetWindowText(m_qb);
m_Edit_CN.GetWindowText(m_cn);
m_Edit_PPX.GetWindowText(m_ppx);
m_Edit_PPY.GetWindowText(m_ppy);
CDialog::OnOK();
}
200
Apéndice B
201
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
ARCHIVOS DE CABECERA:
PLEDERFlujoPermanente.h
#pragma once
//class polilineabuffer;
class CrossSectionsBufer;
class FGVResultadosBufer;
class CPLEDERFlujoPermanente
{
public:
CPLEDERFlujoPermanente(void);
~CPLEDERFlujoPermanente(void);
public:
202
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
public:
//struct CrossSection* m_pSections; // buffer con las
secciones transv.
struct Vertex* m_pSections; //
buffer con las secciones transv.
long m_Sections_len;
int m_MetodoSf; //
Método para calcular la pendiente de fricción
float m_htexto;
bool computado;
public:
//FGVResultadosBufer* m_theFirstR;
};
PLEDERFlujoPermanenteDlg.h
#pragma once
#include "resource.h"
public:
CPLEDERFlujoPermanenteDlg(CWnd* pParent = NULL); //
Constructor estándar
virtual ~CPLEDERFlujoPermanenteDlg();
// 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) ;
// Cajas de texto
203
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
public:
virtual BOOL OnInitDialog();
afx_msg void OnBnClickedOk();
DECLARE_MESSAGE_MAP()
};
PLEDERHidraB#pragma once
};
double IdST, // Id
h, // Tirante.
Zs, // Cota Tirante.
Beta, // Coeciente de corrección.
ALF, // Area llanura Izquierda.
AMC, // Area Canal central.
ARF, // Area llanura derecha.
PLF, // Perímetro llanura izquierdo.
PMC, // Perímetro canal central.
204
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
};
AcGePoint3d Vertice[MAX_VERTICES];
};
public:
CrossSectionsBufer *nbnext; // siguiente
205
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
};
public:
CrossSectionsSocavacionBufer *nbnext; // siguiente
206
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
public:
FGVResultadosBufer *pRnext; // siguiente
public:
double m_IdST; // Id
int m_nV;
double
m_h, // Tirante.
m_Zs, // Cota Tirante.
m_Beta, // Coeciente de corrección.
m_ALF, // Area llanura Izquierda.
m_AMC, // Area Canal central.
m_ARF, // Area llanura derecha.
m_PLF, // Perímetro llanura izquierdo.
m_PMC, // Perímetro canal central.
m_PRF, // Perímetro llanura derecho
m_KLF, // Conductividad llanura izquierdo.
m_KMC, // Conductividad canal central.
m_KRF, // Conductividad llanura derecho
m_Q, // Descarga del flujo.
m_hf12, // Pérdida por fircción.
m_hc12, // Pérdida local.
m_TopW, // Espejo de Agua.
m_LMC; // Longitud del canal central.
};
public:
public:
207
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
class PerfilesBufer
{
public:
PerfilesBufer(); //Constructor por defecto
PerfilesBufer(int nST, ads_point v0, ads_point v1);
virtual ~PerfilesBufer(); // Destructor
public:
PerfilesBufer *SiguienteP;// Puntero a SeccionesBufer Siguiente
float nST;
ads_point start; // inicio
ads_point end; // final
};
uffer.h
PLEDERHidraSecTrasnv.h
#pragma once
//class polilineabuffer;
class SeccionesBufer;
//Clase HidraSecTrasnv
class HidraSecTrasnv
{
public:
HidraSecTrasnv(void);
public:
~HidraSecTrasnv(void);
public:
208
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
public:
};
PLEDERRecursosSuperficieLibre.h
#pragma once
#include "PLEDERSuperficieLibre.h"
class CRecursosSuperficieLibre
{
public:
CRecursosSuperficieLibre(void);
public:
~CRecursosSuperficieLibre(void);
public:
public:
// Calcula el Area y el Perímetro.
int AreaPerimetro(int inicio, int fin, float CotaTirante, float
*CX, float *CY, double *Area, double *Perimetro);
209
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
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 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;
protected:
virtual void DoDataExchange (CDataExchange *pDX) ;
afx_msg LRESULT OnAcadKeepFocus (WPARAM, LPARAM) ;
afx_msg void OnButtonRPunto();
public:
virtual BOOL OnInitDialog();
afx_msg void OnBnClickedOk();
public:
FGVResultadosBufer* m_theFirstR;
struct Resultados* m_pRHidraulicos; // Struct buffer para
los resultados.
210
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
long m_Result_len;
DECLARE_MESSAGE_MAP()
//--------------------------------------------------------------------
// Funciones extras para los resultados
public:
// Libera los datos de los niveles calculados
void FreeAllResultBufs();
PLEDERSeccionesTransversales.h
#pragma once
class CrossSectionsBufer;
class CrossSectionsSocavacionBufer;
class CPLEDERSeccionesTransversales
{
public:
CPLEDERSeccionesTransversales(void);
~CPLEDERSeccionesTransversales(void);
public:
211
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
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"
public:
static BOOL CALLBACK ItemdataProc(DWORD dwData, LPARAM lParam);
CPLEDERSeccionesTransversalesDlg(CWnd* pParent = NULL); //
Constructor estándar
virtual ~CPLEDERSeccionesTransversalesDlg();
// DAtos Tabla
CReportCtrl m_wndList;
BOOL m_bFullRow;
BOOL m_bGridLines;
212
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
BOOL m_bCheckboxes;
// Cajas de texto
CAcUiNumericEdit m_Edit_LI;
CString m_LI;
CAcUiNumericEdit m_Edit_LC;
CString m_LC;
CAcUiNumericEdit m_Edit_LD;
CString m_LD;
CAcUiNumericEdit m_Edit_BI;
CString m_BI;
CAcUiNumericEdit m_Edit_BD;
CString m_BD;
CAcUiNumericEdit m_Edit_NI;
CString m_NI;
CAcUiNumericEdit m_Edit_NC;
CString m_NC;
CAcUiNumericEdit m_Edit_ND;
CString m_ND;
CAcUiNumericEdit m_Edit_CC;
CString m_CC;
CAcUiNumericEdit m_Edit_CE;
CString m_CE;
// Combo Box
CComboBox m_Combo_ST;
CString m_Id_ST;
double m_IdST;
CAcUiPickButton m_PickButton_LI;
CAcUiPickButton m_PickButton_LC;
CAcUiPickButton m_PickButton_LD;
CAcUiPickButton m_PickButton_BI;
CAcUiPickButton m_PickButton_BD;
protected:
213
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
// Botones
afx_msg void OnCommandAPLICAR();
// Botones Menú
afx_msg void OnCommandSTN();
public:
virtual BOOL OnInitDialog();
public:
double OnButtonDistancia();
public:
struct Vertex* m_pSections;// buffer con las secciones transv.
long m_Sections_len;
// Variables Socavación
Adesk::Int32 m_Material, // Tipo de material, Cohesivo
= 0, No Cohesivo = 1.
m_CoefProb; // Ubicación en la lista (combo)
coeficiente de probabilidad de gasto.
double m_CoefMaterial; // Peso específico ó diámetro medio
del material de fondo.
DECLARE_MESSAGE_MAP()
};
/*------------------------------------------------------------------*/
public:
CPLEDERST1Dlg(CWnd* pParent = NULL); // Constructor estándar
virtual ~CPLEDERST1Dlg();
// Cajas de texto
CAcUiNumericEdit m_Edit_NST;
214
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
CString m_NST;
protected:
virtual void DoDataExchange(CDataExchange* pDX); //
Compatibilidad con DDX/DDV
public:
afx_msg void OnBnClickedOk();
DECLARE_MESSAGE_MAP()
};
215
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
ARCHIVOS Cpp:
PLEDERFlujoPermanente.cpp
#include "StdAfx.h"
#include "PLEDERFlujoPermanente.h"
#include "PLEDERSeccionesTransversales.h"
#include "PLEDERHidraBuffer.h"
#include "PLEDERRecursosCad.h"
CPLEDERSeccionesTransversales CST;
CRecursosCad RecursosFGV;
CPLEDERFlujoPermanente::CPLEDERFlujoPermanente(void)
{
m_MetodoSf = 0; // Por defecto, método de la media aritmética.
m_htexto = 0.50;
}
CPLEDERFlujoPermanente::~CPLEDERFlujoPermanente(void)
{
}
216
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
AcGePoint3d Vertex;
AcGePoint2dArray Poligon; // Poligono de la S.T.
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);
LC = (m_pSections + m_Sections_len-1)->LC;
217
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
catch(const std::bad_alloc&)
{
acdbFail(_T("\nError de asignación de memoria."));
return RTERROR;
}
AcDbObjectId ID;
218
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
RHidraulicos[0] = Zlower;
FGVBiseccionMethod(Zlower, Zupper, Vertices, BL, BR, nL,
nC, nR, LL, LC, LR, CC, CE, Betai, Qi,Ai, Zsi, Ki,
RHidraulicos);
acutPrintf(_T("\nZsi = %0.3f"),Zsi);
Poligon.removeAll(); // Eliminar todos lo datos de esta
natriz
catch(const std::bad_alloc&)
{
acdbFail(_T("\nError de asignación de memoria."));
return RTERROR;
}
AcDbObjectId ID;
} // for j
219
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
return RTNORM;
}
BL = m_pSections->BL;
BR = m_pSections->BR;
nL = m_pSections->nL;
nC = m_pSections->nC;
nR = m_pSections->nR;
220
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
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);
LC = m_pSections->LC;
catch(const std::bad_alloc&)
{
acdbFail(_T("\nError de asignación de memoria."));
return RTERROR;
}
AcDbObjectId ID;
221
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
if
(RecursosFGV.AñadirEntidadBlockTableRecord((AcDbEntity*)pResultados,
ID) != Acad::eOk)
{
if (pResultados)
{
delete pResultados;
}
RHidraulicos[0] = Zlower;
FGVBiseccionMethod(Zlower, Zupper, Vertices, BL, BR, nL,
nC, nR, LL, LC, LR, CC, CE, Betai, Qi,
Ai, Zsi, Ki, RHidraulicos);
acutPrintf(_T("\nZsi = %0.3f"),Zsi);
Poligon.removeAll(); // Eliminar todos lo datos de esta
natriz
222
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
catch(const std::bad_alloc&)
{
acdbFail(_T("\nError de asignación de memoria."));
return RTERROR;
}
AcDbObjectId ID;
} // for j
return RTNORM;
}
223
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
RHidraulicos[5] = ARF.
RHidraulicos[6] = PLF.
RHidraulicos[7] = PMC.
RHidraulicos[8] = PRF.
RHidraulicos[9] = KLF.
RHidraulicos[10] = KMC.
RHidraulicos[11] = KRF.
RHidraulicos[12] = Qi.
RHidraulicos[13] = hfi12.
RHidraulicos[14] = hci12.
RHidraulicos[14] = TopWith.
Propósito : Calcula El nivel del agua mediante el método de
Bisección.
--------------------------------------------------------------------*/
{
double Zmiddle, // Cota promedio entre ambos cotas
estremas de ingreso.
Flower, // Cota inferior (siempre inicia
desde la cota mínima o thalweg)
Fmiddle, // Función que se evalúa con la cota
promedio.
Fupper, // Función que se evalúa con la cota
superior
double ALF, AMC, ARF, Ai1, PLF, PMC, PRF, Pi1, KLF, KMC, KRF,
Ki1, Betai1;
double Zsi1;
Qi1 = Qi; // para este caso
while(NOencontrado)
{
cont++;
//acutPrintf(_T("\nIteracion en Biseccion = %d"),cont);
Zmiddle = (Zlower + Zupper)/2;
// Primera verificación
if (abs(Fmiddle) < TOL)
{
Zsi1 = Zmiddle;
224
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
NOencontrado = false;
acutPrintf(_T("\nLo encontre en 01, en %d
iteraciones"), cont);
}
} // While
return RTNORM;
}
225
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
return RTNORM;
}
{
double BetaLF = 0.0, BetaMC = 0.0, BetaRF = 0.0,
Ai = ALF + AMC + ARF,
Ki = KLF + KMC + KRF;
226
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
// (Izquierdo)
if (ALF != 0.0)
{
BetaLF = pow(KLF,3.0) / pow(ALF,2.0);
}
// (Principal)
if (AMC != 0.0)
{
BetaMC = pow(KMC,3.0) / pow(AMC,2.0);
}
// (Derecha)
if (ARF != 0.0)
{
BetaRF = pow(KRF,3.0) / pow(ARF,2.0);
}
return RTNORM;
}
return RTNORM;
}
227
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
--------------------------------------------------------------------*/
{
switch (m_MetodoSf)
{
case 0: // Media Aritmética.
{
*hfi12 = 0.5*dX*( Qi1*abs(Qi1)/(Ki1*Ki1)
+ Qi*abs(Qi)/(Ki*Ki));
break;
}
} //switch (m_MetodoSf))
return RTNORM;
}
228
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
return F;
}
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;
229
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
LVertices.append(Vertex);
Vertex[X] = GlobalVertices[k].x;
Vertex[Y] = GlobalVertices[k].y;
GVertices.append(Vertex);
}
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);
LVertices.append(Vertex);
Vertex[X] = GlobalVertices[k].x;
Vertex[Y] = GlobalVertices[k].y;
GVertices.append(Vertex);
}
InundIzquierdo = true;
}
230
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
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;
}
CSPoligon.append(Vertex);
231
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
}//While
//RecursosFGV.DibujarLinea(p1,p2,PLEDER_CAPA_NIVELES);
*TopWith = Tw;
RecursosFGV.RestaurarVariables();
return RTNORM;
}
void
CPLEDERFlujoPermanente::FreeAllFGVResultadosBufer(FGVResultadosBufer
*theFirstResult)
232
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
/*--------------------------------------------------------------------
Ingreso : theFirstResult = puntero al primer elemento del buffer.
Salida : Vacío.
Propósito : Llamar a esta función para liberar un buffer
FGVResultadosBufer
--------------------------------------------------------------------*/
{
if (!theFirstResult)
return;
// liberar la ristra
while (pResulNext = pResult->pRnext)
{
delete pResult;
pResult = pResulNext;
}
delete pResult;
theFirstResult = NULL;
}
PLEDERFlujoPermanenteDlg.cpp
#include "stdafx.h"
#include "PLEDERFlujoPermanenteDlg.h"
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()
{
}
// Cajas de Texto.
DDX_Control(pDX, IDC_EDIT_TDOW, m_Edit_Ydowstream);
DDX_Control(pDX, IDC_EDIT_TUPS, m_Edit_Yupstream);
DDX_Control(pDX, IDC_EDIT_CAUDAL, m_Edit_Caudal);
233
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
// Radio
DDX_Radio(pDX, IDC_RADIO_FSUB, m_TipoFlujo);
}
BEGIN_MESSAGE_MAP(CPLEDERFlujoPermanenteDlg, CAdUiDialog)
ON_BN_CLICKED(IDOK, &CPLEDERFlujoPermanenteDlg::OnBnClickedOk)
END_MESSAGE_MAP()
return TRUE;
}
void CPLEDERFlujoPermanenteDlg::OnRadioFlujoSubcritico()
{
// Activa y desactiva las casillas de la ventana
m_Edit_Ydowstream.EnableWindow(1);
m_Edit_Yupstream.EnableWindow(0);
m_TipoFlujo = 0;
}
void CPLEDERFlujoPermanenteDlg::OnRadioFlujoSupercritico()
{
// Activa las casillas de la ventana
m_Edit_Ydowstream.EnableWindow(0);
m_Edit_Yupstream.EnableWindow(1);
m_TipoFlujo = 1;
}
void CPLEDERFlujoPermanenteDlg::OnRadioFlujoMixto()
{
// Activa las casillas de la ventana
m_Edit_Ydowstream.EnableWindow(1);
m_Edit_Yupstream.EnableWindow(1);
m_TipoFlujo = 2;
}
234
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
void CPLEDERFlujoPermanenteDlg::OnBnClickedOk()
{
// TODO : Add extra validation here
m_Edit_Ydowstream.GetWindowText(m_Ydowstream);
m_Edit_Yupstream.GetWindowText(m_Yupstream);
m_Edit_Caudal.GetWindowText(m_Caudal);
CDialog::OnOK();
}
PLEDERHidraBuffer.cpp
#include "StdAfx.h"
#include "PLEDERHidraBuffer.h"
m_IdST = 0;
m_nVST = 0;
m_HminG = HminG;
m_HminL = HminL;
m_IdST = IdST;
m_nVST = nVST;
m_LL = LL;
m_LC = LC;
m_LR = LR;
m_NL = NL;
m_NC = NC;
m_NR = NR;
m_BL = BL;
m_BR = BR;
m_CC = CC;
m_CE = CE;
// Vértices globales
235
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
ads_point v1;
// Vértices locales
for(int i=0; i <m_nVST; i++)
{
v1[X]= X1 + (m_GlobalVertice[i].x - P1[X]); // Suma la
posición inicial X + la distancia X
v1[Y]= Y1 - (P1[Y] - m_GlobalVertice[i].y); // Resta la
posición inicial Y - la distancia Y
m_LocalVertice[i].x = v1[X];
m_LocalVertice[i].y = v1[Y];
m_LocalVertice[i].z = 0.0;
X1 = v1[X];
Y1 = v1[Y];
P1[X]= m_GlobalVertice[i].x;
P1[Y]= m_GlobalVertice[i].y;
}
}
CrossSectionsBufer::~CrossSectionsBufer()
{
//-------------------------------------------------------------------
/*Clase CrossSectionsSocavacionBufer: Bufer para seciones
transversales que se desaloja mediante la función
FreeAllCrossSectionsSocavacion()*/
CrossSectionsSocavacionBufer::CrossSectionsSocavacionBufer()
{
nbnext = NULL;
}
CrossSectionsSocavacionBufer::CrossSectionsSocavacionBufer(double
IdST, int Material, int CoefProb, double CoefMaterial)
{
nbnext = NULL;
m_IdST = IdST;
m_Material = Material;
m_CoefMaterial = CoefMaterial;
m_CoefProb = CoefProb;
}
CrossSectionsSocavacionBufer::~CrossSectionsSocavacionBufer()
{
236
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
//-------------------------------------------------------------------
/*Clase FGVResultadosBufer: Bufer los resultados que se desaloja
mediante la función FreeAllResultados()*/
FGVResultadosBufer::FGVResultadosBufer()
{
pRnext = NULL;
}
m_IdST = IdST;
m_nV = nV;
m_h = h; // Tirante.
m_Zs = Zs; // Cota Tirante.
m_Beta = Beta; // Coeciente de corrección.
m_ALF = ALF; // Area llanura Izquierda.
m_AMC = AMC; // Area Canal central.
m_ARF = ARF; // Area llanura derecha.
m_PLF = PLF; // Perímetro llanura izquierdo.
m_PMC = PMC; // Perímetro canal central.
m_PRF = PRF; // Perímetro llanura derecho
m_KLF = KLF; // Conductividad llanura izquierdo.
m_KMC = KMC; // Conductividad canal central.
m_KRF = KRF; // Conductividad llanura derecho
m_Q = Q ; // Descarga del flujo.
m_hf12 = hf12; // Pérdida por fircción.
m_hc12 = hc12; // Pérdida local.
m_TopW = TopW; // Espejo de agua
m_LMC = LMC; // Longitud del canal central.
// Vértices Calculados
for(int i = 0; i < m_nV; i++)
{
m_ResultVertice[i].x = Vertice[i].x;
m_ResultVertice[i].y = Vertice[i].y;
m_ResultVertice[i].z = 0.0;
//acutPrintf(_T("\nm_ResultVertice[%d], X = %0.3f , Y =
%0.3f"), i, m_ResultVertice[i].x, m_ResultVertice[i].y );
}
// Destructor
FGVResultadosBufer::~FGVResultadosBufer()
{
//-------------------------------------------------------------------
SeccionesBufer::SeccionesBufer()
{
237
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
Siguiente = NULL;
}
//Constructor que inicializa a CoorXX, CoordYY, ns y siguiente = NULL
SeccionesBufer::SeccionesBufer(int nss, double CoordXX, double
CoordYY, double Coefmanning)
{
Siguiente = NULL;
ns = nss;
CoordX = CoordXX;
CoordY = CoordYY;
manning = Coefmanning;
}
//Destructor
SeccionesBufer::~SeccionesBufer() {}
PerfilesBufer::PerfilesBufer()
{
SiguienteP = NULL;
}
PerfilesBufer::PerfilesBufer(int nST, ads_point v0, ads_point v1)
{
SiguienteP = NULL;
start[X] = v0[X];
start[Y] = v0[Y];
start[Z] = v0[Z];
end[X] = v1[X];
end[Y] = v1[Y];
end[Z] = v1[Z];
}
PerfilesBufer::~PerfilesBufer()
{
PLEDERHidraSecTrasnv.cpp
#include "StdAfx.h"
#include "PLEDERHidraSecTrasnv.h"
#include "PLEDERHidraBuffer.h"
#include "PLEDERRecursosCad.h"
238
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
#include <iostream>
#include <fstream> // Para exportar atributos
#include <cstdlib>
#include <new>
//Constructor
HidraSecTrasnv::HidraSecTrasnv(void)
{
// inicializar la clase
pPrimerST = NULL;
}
//Destructor
HidraSecTrasnv::~HidraSecTrasnv(void)
{
LiberarBufferSeccionesTransv();
}
{
unsigned int k, numVerts;
AcDbObjectId ID;
AcDbEntity *pEnt;
*nVST = 0;
239
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
return RTNORM;
}
{
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;
240
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
if (numVerts <= 2)
{
pPolyline->close();
acdbFail(_T("\nPolyline no válida "));
return RTERROR;
}
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);
X1= v1[X];
Y1= v1[Y];
p1[X]= pt[X];
p1[Y]= pt[Y];
numof++;
241
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
} // for k
pPolyline->close();
return RTNORM;
}
{
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;
242
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
pEnt->close();
acdbFail(_T("\nTipo de entidad inesperada "));
return RTCAN;
}
if (numVerts <= 2)
{
pPolyline->close();
acdbFail(_T("\nPolyline no válida "));
return RTERROR;
}
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);
X1= v1[X];
Y1= v1[Y];
p1[X]= pt[X];
p1[Y]= pt[Y];
numof++;
} // for k
243
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
pPolyline->close();
return RTNORM;
}
{
ads_point v1, v2 ;
v2[Z] = 0.0;
AcGePoint2d pt ;
unsigned int k, numVerts;
AcDbObjectId ID;
AcDbEntity *pEnt;
CRecursosCad Cad;
244
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
if (numVerts <= 2)
{
pPolyline->close();
acdbFail(_T("\nPolyline no válida "));
return RTERROR;
}
CX[k+1] = pt[X];
CY[k+1] = pt[Y];
} // for k
pPolyline->close();
return RTNORM;
}
if (!pNombreArchivo)
{
acdbFail(_T("\nArgumento de función no válido
[ImportarSeccionesTransversales]."));
return RTERROR;
}
245
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
if (infile.fail() != 0)
{
*NumeroVertST = 0;
acdbFail(_T("\nError de E/S al abrir el fichero
[ImportarSeccionesTransversales][open]."));
return RTERROR;
}
if (!buffer)
{
*NumeroVertST = 0;
infile.close();
acdbFail(_T("\nError de asignación de memoria [Importar
ST][buffer]."));
return RTERROR;
}
while (!infile.eof())
{
infile.getline(buffer, GETLINEMAXBUFF, '\n');
if (infile.eof())
{
// limpiar el flag eof
infile.clear();
break;
}
np++;
}
np = 0;
catch(const std::bad_alloc&)
{
acedRestoreStatusBar();
acdbFail(_T("\nError de asignación de memoria [Importar
ST][pPrimerST]."));
return RTERROR;
}
246
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
// recorrer el fichero
while (!infile.eof())
{
// leer una línea del fichero
infile.getline(buffer, GETLINEMAXBUFF, '\n');
if (infile.eof())
break;
if (!token)
{
*NumeroVertST = np;
infile.close();
acad_free(buffer);
acedRestoreStatusBar();
acdbFail(_T("\nFichero de Secciones Trasnv. No válido
[Importar ST]"));
return RTERROR;
}
n = atoi(token);
// Coordenada x
token = ::strtok(NULL, seps);
if (!token)
{
*NumeroVertST = np;
infile.close();
acad_free(buffer);
acedRestoreStatusBar();
acdbFail(_T("\nFichero de Secciones Trasnv. No válido
-n- [Importar ST]"));
return RTERROR;
}
x = atof(token);
// Coordenada y o Cota
token = ::strtok(NULL, seps);
if (!token)
{
*NumeroVertST = np;
infile.close();
acad_free(buffer);
acedRestoreStatusBar();
acdbFail(_T("\nFichero de Secciones Trasnv. No válido
-x- [Importar ST]"));
return RTERROR;
}
y = atof(token);
// Coeficiente de Manning
token = ::strtok(NULL, seps);
if (!token)
247
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
{
*NumeroVertST = np;
infile.close();
acad_free(buffer);
acedRestoreStatusBar();
acdbFail(_T("\nFichero de Secciones Trasnv. No válido
-manning- [Importar ST]"));
return RTERROR;
}
manning = atof(token);
int contador = 1;
catch(const std::bad_alloc&)
{
LiberarBufferSeccionesTransv();
acedRestoreStatusBar();
acdbFail(_T("\nError de asignación de memoria
[Importar ST][nST]."));
return RTERROR;
}
nbprevious->Siguiente = nST;
nbprevious = nST;
} // while
infile.close();
acad_free(buffer);
acedRestoreStatusBar();
return RTNORM;
}
int HidraSecTrasnv::ObtenerSeccionesTransversales()
/*--------------------------------------------------------------------
Ingreso : Vacío.
Salida : RTNORM si no se produce ningún error.
RTERROR en otro caso.
Propósito : Capta los datos del buffer SeccionesBufer, obtenidos al
importar los datos de las secciones transversales.
--------------------------------------------------------------------*/
{
//Chequear los argumentos
if (!pPrimerST)
{
acdbFail(_T("\nPuntero Nulo de la importación"));
248
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
return RTERROR;
}
SeccionesBufer *pSeccTrasv;
pPrimerST = pPrimerST->Siguiente;
return RTNORM;
}
void HidraSecTrasnv::LiberarBufferSeccionesTransv()
/*-------------------------------------------------------------------
Ingreso : Vacío.
Salida : Vacío.
Propósito : Libera el buffer en ristra SeccionesBufer al que apunta
el miembro pPrimerST. Llamar a esta función para liberar el
buffer con los vértives de las secciones transversales obtenidos
mediante una llamada a la función ImportarSeccionesTransversales().
--------------------------------------------------------------------*/
{
if (!pPrimerST)
return;
// 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)
{
249
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
/*--------------------------------------------------------------------
Ingreso : V = Lista de Vértices de las S. T. Totales
n = Número de vértices de las secciones transversales.
nST = Número de Secciones Transversales.
nVert = Lista de Números de los Vértices de las Secciones
Transversales. Ingresa vacío, para luego ser
almacenado (leer Propósito).
Salida : RTNORM si no se produce ningún error.
RTERROR en otro caso.
Propósito : Calcula los números de los Vértices para cada Secciones
Transversales y los almacena en una lista (nVert) de dimensiones nST.
-------------------------------------------------------------------*/
{
int i, cont = 1, contador = 1;
return RTNORM;
}
Mayor = ListaC[inicio];
Menor = ListaC[inicio];
250
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
{
if ( Menor > ListaC[j])
{
Menor = ListaC[j];
}
}//For j
return RTNORM;
}
/*--------------------------------------------------------------------
Ingreso : K1 = Factor de Transporte en la primera sección de
análisis.
K2 = Factor de Transporte en la segunda sección de
análisis.
Q = Caudal del flujo.
nn = Coeficiente de Manning.
MetodoSfm = Método a usar
Salida : Sfm = Pendiente Motriz.
Propósito : Calcula la Pendiente Motriz entre dos secciones
transversales por los para los cuatro métodos.
--------------------------------------------------------------------*/
{
double Sfm, I1, I2;
I1 = pow(Q/K1,2);
I2 = pow(Q/K2,2);
switch (MetodoSfm)
{
case 1: // Ecuación de Factor de transporte Medio.
{
Sfm = pow(((Q+Q)/(K1+K2)),2);
break;
}
251
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
break;
}
} //switch (MetodoSfm)
return Sfm;
}
/*--------------------------------------------------------------------
Ingreso : inicio = Principio para la interación.
fin = Final de la iteración.
CotaTirante = Cota del tirante de la sección transversal.
Dato importante para determinar el área y
el perímetro de la S.T.
CX = Datos de las Distancicias (eje X).
CY = Datos de las cotas (eje Y).
Salida : Area = Área Transversal para un tirante que se
ingresó (CotaTirante).
Perímetro = Perímetro Transversal para un tirante que
se ingresó (CotaTirante).
RTNORM si no se produce ningún error.
RTERROR en otro caso.
Propósito : Calcula el Área y el Perímetro de una sección transversal
a partir de una cota tirante.
-------------------------------------------------------------------*/
252
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
{
int j,k;
float Xi, Xd;
cont = 2;
for (k =inicio; k <= fin; k++)
{
YY[cont] = CY[k];
XX[cont] = CX[k];
cont++;
}
end++;
InundIzquierdo = true;
}
// Inundación Margen Derecha?
if (CotaTirante > CY[fin])
{
YY[end+1] = CotaTirante;
XX[end+1] = CX[fin];
//acutPrintf(_T("\nNuevos Valores de Y: %0.3f"), Y[k-1]);
end++;
253
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
InundDerecho = true;
}
254
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
}//While
} //if
}//For j
return RTNORM;
}
int j,k;
float Xi, Xd;
255
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
cont = 2;
for (k =inicio; k <= fin; k++)
{
YY[cont] = CY[k];
XX[cont] = CX[k];
cont++;
}
end++;
InundIzquierdo = true;
}
// Inundación Margen Derecha?
if (CotaTirante > CY[fin])
{
YY[end+1] = CotaTirante;
XX[end+1] = CX[fin];
//acutPrintf(_T("\nNuevos Valores de Y: %0.3f"), Y[k-1]);
end++;
InundDerecho = true;
}
256
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
257
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
}//While
} //if
}//For j
return RTNORM;
}
PLEDERResutadosDlg.cpp
#include "StdAfx.h"
#include "resource.h"
#include "PLEDERResutadosDlg.h"
#include "PLEDERHidraBuffer.h"
#include "PLEDERRecursosCad.h"
#include "axlock.h" // Tabla
CRecursosCad RecursosR;
//--------------------------------------------------------------------
IMPLEMENT_DYNAMIC (CPLEDERResutadosDlg, CAdUiDialog)
//--------------------------------------------------------------------
CPLEDERResutadosDlg::CPLEDERResutadosDlg (CWnd *pParent /*=NULL*/,
HINSTANCE hInstance /*=NULL*/)
258
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
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);
BEGIN_MESSAGE_MAP(CPLEDERResutadosDlg, CAdUiDialog)
ON_MESSAGE(WM_ACAD_KEEPFOCUS, OnAcadKeepFocus)
END_MESSAGE_MAP()
BOOL CPLEDERResutadosDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_Edit_Rx.SetWindowText(m_Rx);
m_Edit_Ry.SetWindowText(m_Ry);
m_PickButton_RPunto.AutoLoad();
259
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
{
m_wndListR.InsertItem(0, _T(""), _T(""),_T(""),_T(""),
_T(""), _T(""),_T(""),_T(""), _T(""), _T(""),_T(""),_T(""), _T(""),
_T(""),_T(""),_T(""), _T(""), _T(""),_T(""),_T(""));
}
m_wndListR.SetGridLines(TRUE);
//m_wndListR.SetCheckboxes(TRUE);
acdbRToS(Vm , 2, 3, strV);
acdbRToS(Fr , 2, 3, strF);
acdbRToS(Kt , 2, 3, strK);
//acdbRToS((m_pRHidraulicos + i)->KLF , 2, 3, strKLF);
//acdbRToS((m_pRHidraulicos + i)->KMC , 2, 3, strKMC);
260
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
return TRUE;
}
void CPLEDERResutadosDlg::OnButtonRPunto()
{
//Clase que habilita CAD
//AcAxDocLock docLock;
CAcModuleResourceOverride resourceOverride;
// Esconde el diálogo
BeginEditorCommand();
ads_point p1;
// Coge el Punto P1
if (acedGetPoint (NULL, _T("\nPique un Punto para la tabla
[Resultados PLEDER]"), p1) != RTNORM )
{
acutPrintf(_T("\nError al ingresar el Punto"));
// si no cancela el comando(incluyendo el diálogo)
// CancelEditorCommand();
CompleteEditorCommand();
return;
}
CompleteEditorCommand();
m_Rx.Format(_T("%g"), p1[X] );
m_Edit_Rx.SetWindowText(m_Rx);
m_Ry.Format(_T("%g"), p1[Y] );
m_Edit_Ry.SetWindowText(m_Ry);
}
261
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
// Cajas de texto
m_Edit_Rx.GetWindowText(m_Rx);
m_Edit_Ry.GetWindowText(m_Ry);
CDialog::OnOK();
RecursosR.T_pRHidraulicos = m_pRHidraulicos;
//...............RESULTADOS
TABLA..........................................
float PX, PY;
PX =_wtof(m_Rx);
PY =_wtof(m_Ry);
ads_point p1;
p1[X] = PX; p1[Y] = PY; p1[Z] = 0.0;
if (Acad::eOk ==
RecursosR.GenerarTablaHidraulicodesdeBlock((TCHAR
*)strNameBlock.GetBuffer(), pRwData, m_Result_len))
{
// Crear la tabla
AcDbTable *pTbl = NULL;
262
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
pTbl->setPosition(AcGePoint3d(p1[X], p1[Y],
p1[Z]));
// Cierra la tabla
pTbl->close();
} //if
else
{
// Limpiar, si pTbl no es agregado al model
space
delete pTbl;
}
} //if
else
{
acutPrintf(_T("\nNo se pudo crear la tabla"));
}
} //if
acedRestoreStatusBar();
}
//--------------------------------------------------------------------
// Funciones extras para los resultados
void CPLEDERResutadosDlg::FreeAllResultBufs()
/*--------------------------------------------------------------------
Ingreso : theFirstResult = puntero al primer elemento del
buffer.
Salida : Vacío.
Propósito : Llamar a esta función para liberar un buffer
FGVResultadosBufer
--------------------------------------------------------------------*/
{
if (!m_theFirstR)
return;
// liberar la ristra
while (pResulNext = pResult->pRnext)
{
delete pResult;
pResult = pResulNext;
}
delete pResult;
m_theFirstR = NULL;
}
263
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
if (filter == NULL)
{
acdbFail(_T("\nError al construir el filtro
[AcquireLevelFreeSurface][acutBuildList]."));
return RTERROR;
}
ads_name ss; // ss
long sslen = 0; // longitud del ss
acutRelRb(filter);
CPLEDERHydraulicResult *pResult;
ads_name ename;
AcDbObjectId ID;
264
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
long nL = 0;
AcGePoint2d P1;
Adesk::Int32 nV;
double IdST; // Id
double h, // Tirante.
Zs, // Cota Tirante.
Beta, // Coeciente de corrección.
ALF, // Area llanura Izquierda.
AMC, // Area Canal central.
ARF, // Area llanura derecha.
PLF, // Perímetro llanura
izquierdo.
PMC, // Perímetro canal central.
PRF, // Perímetro llanura derecho
KLF, // Conductividad llanura
izquierdo.
KMC, // Conductividad canal
central.
KRF, // Conductividad llanura
derecho
Q, // Descarga del flujo.
hf12, // Pérdida por fircción.
hc12, // Pérdida local.
TopW, // Espejo de agua
LMC; // Longitud del canal central
265
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
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;
pResult->close();
266
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
vertexArray.removeAll();
// recorrer el ss
for (int i = 1; i < sslen; i++)
{
// tomar el nombre de la entidad
if (acedSSName(ss, i, ename) != RTNORM)
{
acedSSFree(ss);
FreeAllResultBufs();
acedRestoreStatusBar();
acdbFail(_T("\nError al tomar el nombre de la entidad
PLEDERCrossSections [AcquireCrossSections][acedSSName]."));
return RTERROR;
}
pResult->Depth(h);
pResult->WaterElevation(Zs);
pResult->BetaCoeficient(Beta);
pResult->LeftArea(ALF);
pResult->MainArea(AMC);
pResult->RightArea(ARF);
pResult->LeftPerimeter(PLF);
pResult->MainPerimeter(PMC);
pResult->RightPerimeter(PRF);
pResult->LeftConveyance(KLF);
pResult->MainConveyance(KMC);
pResult->RightConveyance(KRF);
pResult->WaterFlow(Q);
pResult->FrictionLess(hf12);
pResult->LocalLess(hc12);
pResult->TopWidth(TopW);
pResult->LengthMainChannel(LMC);
267
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
pResult->close();
nRprevious->pRnext = nR;
nRprevious = nR;
} // for i
acedSSFree(ss);
acedRestoreStatusBar();
*numberL = nL;
return RTNORM;
}
268
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
if (!filter)
{
acdbFail(_T("\nError al construir el filtro
[DeleteLevelFreeSurface][acutBuildList]."));
return RTERROR;
}
ads_name ss; // ss
long sslen = 0; // longitud del ss
acutRelRb(filter);
CPLEDERHydraulicResult *pResult;
ads_name ename;
AcDbObjectId ID;
long n, np, progress = 0;
np = 100;
// recorrer el ss
269
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
pResult->close();
// borrar la entidad
acdbEntDel(ename);
} // for i
acedSetStatusBarProgressMeterPos((int)np);
acedSSFree(ss);
acedRestoreStatusBar();
return RTNORM;
}
PLEDERSeccionesTransversales.cpp
#include "StdAfx.h"
#include "PLEDERSeccionesTransversales.h"
#include "PLEDERRecursosCad.h"
#include "PLEDERHidraBuffer.h"
CPLEDERSeccionesTransversales::CPLEDERSeccionesTransversales(void)
270
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
{
// inicializar la clase
m_theFirstST = NULL;
m_theFirstSOC = NULL;
m_STTextHeight = 0.20;
m_STDiameter = 0.20;
CPLEDERSeccionesTransversales::~CPLEDERSeccionesTransversales(void)
{
FreeAllCrossSectionsBufs();
FreeAllCrossSectionsSocavacionBufs();
}
void CPLEDERSeccionesTransversales::FreeAllCrossSectionsBufs()
/*--------------------------------------------------------------------
Ingreso : Vacío.
Salida : Vacío.
Propósito : Libera el buffer en ristra CrossSectionsBuf al que apunta
el miembro m_theFirstST. Llamar a esta función para liberar el
buffer con las S.T. obtenidas mediante una llamada a la función
AcquireCrossSections().
-------------------------------------------------------------------*/
{
if (!m_theFirstST)
return;
// liberar la ristra
while (nbnext = nb->nbnext)
{
delete nb;
nb = nbnext;
}
delete nb;
m_theFirstST = NULL;
}
void
CPLEDERSeccionesTransversales::FreeAllCrossSectionsSocavacionBufs()
/*--------------------------------------------------------------------
Ingreso : Vacío.
Salida : Vacío.
Propósito : Libera el buffer en ristra CrossSectionsSocavacionBuf al
que apunta el miembro m_theFirstSOC. Llamar a esta función para
liberar el buffer con las S.T. obtenidas mediante una llamada a la
función AcquireCrossSectionsSocavacion().
--------------------------------------------------------------------*/
{
if (!m_theFirstSOC)
return;
271
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
// liberar la ristra
while (nbnext = nb->nbnext)
{
delete nb;
nb = nbnext;
}
delete nb;
m_theFirstSOC = NULL;
}
int CPLEDERSeccionesTransversales::AcquireCrossSections(long
*numberof)
/*--------------------------------------------------------------------
Ingreso : numberof = Puntero a Long para sobreescribir el
resultado
Salida : numberof = Representa el número de Secciones
Transversales que se encontraron.
RTNORM si no se produce ningún error.
RTERROR en otro caso.
Propósito : Lee el conjunto de Secciones transversales definidas en
el drawing. Llamar a esta función para obtener el puntero al buffer
CrossSectionsBuf con la nube de S.T. El buffer quedará apuntado por
el miembro m_theFirstST. Para desalojar el buffer se deberá llamar a
la función FreeAllCrossSectionsBufs(). Las S.T. que se añadan al
buffer no estarán ordenados por su número de orden. Se toman las S.T.
en bruto.
-------------------------------------------------------------------*/
{
FreeAllCrossSectionsBufs();
if (filter == NULL)
{
acdbFail(_T("\nError al construir el filtro
[AcquireCrossSections][acutBuildList]."));
return RTERROR;
}
ads_name ss; // ss
long sslen = 0; // longitud del ss
272
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
acutRelRb(filter);
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;
273
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
pSecciones->MinVerticeGlobal(HminG);
pSecciones->MinVerticeLocal(HminL);
pSecciones->IdCrossSections(IdST);
pSecciones->nVST(nVST);
pSecciones->LengthLeft(LL);
pSecciones->LengthCenter(LC);
pSecciones->LengthRight(LR);
pSecciones->ManningLeft(NL);
pSecciones->ManningCenter(NC);
pSecciones->ManningRight(NR);
pSecciones->BankLeft(BL);
pSecciones->BankRight(BR);
pSecciones->CoeficentCont(CC);
pSecciones->CoeficentExp(CE);
AcGePoint2dArray vertexArray;
AcGePoint2d vertex;
pSecciones->close();
vertexArray.removeAll();
// recorrer el ss
for (int i = 1; i < sslen; i++)
274
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
{
// tomar el nombre de la entidad
if (acedSSName(ss, i, ename) != RTNORM)
{
acedSSFree(ss);
FreeAllCrossSectionsBufs();
acedRestoreStatusBar();
acdbFail(_T("\nError al tomar el nombre de la entidad
PLEDERCrossSections [AcquireCrossSections][acedSSName]."));
return RTERROR;
}
pSecciones->MinVerticeGlobal(HminG);
pSecciones->MinVerticeLocal(HminL);
pSecciones->IdCrossSections(IdST);
pSecciones->nVST(nVST);
pSecciones->LengthLeft(LL);
pSecciones->LengthCenter(LC);
pSecciones->LengthRight(LR);
pSecciones->ManningLeft(NL);
pSecciones->ManningCenter(NC);
pSecciones->ManningRight(NR);
pSecciones->BankLeft(BL);
pSecciones->BankRight(BR);
pSecciones->CoeficentCont(CC);
pSecciones->CoeficentExp(CE);
275
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
pSecciones->close();
// añadir las secciones transversales al buffer
try
{
nb = new CrossSectionsBufer(P1, X1, Y1, IdST, nVST,
vertexArray, HminG, HminL, LL,
LC, LR, NL,
NC, NR, BL, BR, CC, CE);
}
catch(const std::bad_alloc&)
{
acedSSFree(ss);
FreeAllCrossSectionsBufs();
acedRestoreStatusBar();
acdbFail(_T("\nError de asignación de memoria
[AcquireCrossSections][nb]."));
return RTERROR;
}
nbprevious->nbnext = nb;
nbprevious = nb;
acedSSFree(ss);
acedRestoreStatusBar();
*numberof = np;
return RTNORM;
}
int CPLEDERSeccionesTransversales::AcquireCrossSectionsSocavacion(long
*numberof)
/*--------------------------------------------------------------------
Ingreso : numberof = Puntero a Long para sobreescribir el
resultado
Salida : numberof = Representa el número de Secciones
Transversales que se encontraron.
RTNORM si no se produce ningún error.
RTERROR en otro caso.
Propósito : Lee el conjunto de Secciones transversales definidas en
el drawing. Llamar a esta función para obtener el puntero al buffer
CrossSectionsBuf con la nube de S.T. El buffer quedará apuntado por
el miembro m_theFirstST. Para desalojar el buffer se deberá llamar a
la función FreeAllCrossSectionsBufs(). Las S.T. que se añadan al
buffer no estarán ordenados por su número de orden. Se toman las S.T.
en bruto.
-------------------------------------------------------------------*/
{
276
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
FreeAllCrossSectionsSocavacionBufs();
if (filter == NULL)
{
acdbFail(_T("\nError al construir el filtro
[AcquireCrossSections][acutBuildList]."));
return RTERROR;
}
ads_name ss; // ss
long sslen = 0; // longitud del ss
acutRelRb(filter);
CPLEDERCrossSections *pSecciones;
ads_name ename;
AcDbObjectId ID;
long nVST, np = 0;
double IdST;
Adesk::Int32 Material,
CoefProb;
double CoefMaterial;
277
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
return RTERROR;
}
pSecciones->close();
// recorrer el ss
for (int i = 1; i < sslen; i++)
{
// tomar el nombre de la entidad
if (acedSSName(ss, i, ename) != RTNORM)
{
acedSSFree(ss);
FreeAllCrossSectionsSocavacionBufs();
278
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
acedRestoreStatusBar();
acdbFail(_T("\nError al tomar el nombre de la entidad
PLEDERCrossSections [AcquireCrossSections][acedSSName]."));
return RTERROR;
}
pSecciones->close();
nbprevious->nbnext = nb;
nbprevious = nb;
} // for i
279
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
acedSSFree(ss);
acedRestoreStatusBar();
*numberof = np;
return RTNORM;
}
int CPLEDERSeccionesTransversales::GetFirstNumberCrossSections(long
*nfirst)
/*--------------------------------------------------------------------
Ingreso : nfirst = Puntero a Long para sobreescribir el
resultado
Salida : nfirst = número de orden de la primera S.T. Si
no hay Secciones Transv. definidos tomará el valor de cero.
RTNORM si no se produce ningún error.
RTERROR en otro caso.
Propósito : Busca el número de orden el último nombre de la S.T. en
el Drawing. Nos podríamos basar en el buffer, pero para asegurar la
búsqueda nos basaremos en el drawing, ya que el buffer puede no estar
actualizado
-------------------------------------------------------------------*/
{
struct resbuf *filter; // resbufs
if (filter == NULL)
{
acdbFail(_T("\nError al construir el filtro
[GetFirstNumberCrossSections][acutBuildList]."));
return RTERROR;
}
ads_name ss; // ss
long sslen = 0; // longitud del ss
280
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
CPLEDERCrossSections *pSecciones;
ads_name ename;
AcDbObjectId ID;
long np = 0;
double n;
// 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;
}
// chequearlo
if (n > np)
np = n;
} // for i
acedSSFree(ss);
*nfirst = np;
281
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
return RTNORM;
int CPLEDERSeccionesTransversales::GetLastNumberCrossSections(long
*nlast)
/*--------------------------------------------------------------------
Ingreso : nlast= Puntero a Long para sobreescribir el resultado
Salida : nlast= número de orden del último S.T. Si no hay
Secciones Transv. definidos tomará el valor de cero.
RTNORM si no se produce ningún error.
RTERROR en otro caso.
Propósito : Busca el número de orden el último nombre de la S.T. en
el Drawing.
-------------------------------------------------------------------*/
{
struct resbuf *filter; // resbufs
if (filter == NULL)
{
acdbFail(_T("\nError al construir el filtro
[GetLastNumberCrossSections][acutBuildList]."));
return RTERROR;
}
ads_name ss; // ss
long sslen = 0; // longitud del ss
acutRelRb(filter);
CPLEDERCrossSections *pSecciones;
ads_name ename;
AcDbObjectId ID;
long np = 0;
double n;
282
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
// recorrer el ss
for (int i = 0; i < sslen; i++)
{
// tomar el nombre de la entidad
if (acedSSName(ss, i, ename) != RTNORM)
{
acedSSFree(ss);
acdbFail(_T("\nError al tomar el nombre de la entidad
CPLEDERCrossSections [GetLastNumberCrossSections][acedSSName]."));
return RTERROR;
}
// chequearlo
if (n > np)
np = n;
} // for i
acedSSFree(ss);
*nlast = np;
return RTNORM;
int CPLEDERSeccionesTransversales::GetNumberofCrossSections(long
*numberof)
/*--------------------------------------------------------------------
Ingreso : numberof = Puntero a Long para sobreescribir el
resultado
Salida : numberof = (Out) el número de secciones
transversales que se encontraron.
RTNORM si no se produce ningún error.
RTERROR en otro caso.
283
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
if (filter == NULL)
{
acdbFail(_T("\nError al construir el filtro
[GetNumberofCrossSections][acutBuildList]."));
return RTERROR;
}
ads_name ss; // ss
long sslen = 0; // longitud del ss
acutRelRb(filter);
acedSSFree(ss);
*numberof = sslen;
return RTNORM;
}
int CPLEDERSeccionesTransversales::GetCrossSectionsAttributes()
/*--------------------------------------------------------------------
Ingreso : vacío
Salida : RTNORM si no se produce ningún error.
RTERROR en otro caso.
Propósito : Obtiene el valor del diámetro de los círculos y la altura
del texto de las entidades Secciones transversales. Los valores son
alojados en las variables miembro m_STDiameter y m_STTextHeight.
-------------------------------------------------------------------*/
284
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
if (filter == NULL)
{
acdbFail(_T("\nError al construir el filtro
[GetCrossSectionsAttributes][acutBuildList]."));
return RTERROR;
}
ads_name ss; // ss
long sslen = 0; // longitud del ss
acutRelRb(filter);
CPLEDERCrossSections *pSecciones;
ads_name ename;
AcDbObjectId ID;
acedSSFree(ss);
285
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
// tomar el Diámetro
if (pSecciones->diameter(m_STDiameter) != Acad::eOk)
{
pSecciones->close();
acdbFail(_T("\nError al tomar los atributos del nodo
[GetCrossSectionsAttributes]."));
return RTERROR;
}
pSecciones->close();
return RTNORM;
}
if (!m_theFirstST)
{
acutPrintf(_T("\nERROR PLEDER: No hay secciones
transversales definidos."));
286
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
return RTERROR;
}
CrossSectionsBufer *nb;
bool encontrado;
encontrado = false;
if (!encontrado)
{
acutPrintf(_T("\nPLEDER ERROR: Sección transveral no
encontrado."));
FreeAllCrossSectionsBufs();
return RTERROR;
}
if (rb != NULL)
{
acedCmd(rb);
acutRelRb(rb);
}
FreeAllCrossSectionsBufs();
return RTNORM;
}
int CPLEDERSeccionesTransversales::GetIdCrossSectionsAttributes(double
IdST, long *nVST, AcGePoint2dArray& LvertexArray,
287
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
if (!m_theFirstST)
{
acutPrintf(_T("\nERROR PLEDER: No hay secciones
transversales definidos."));
return RTERROR;
}
CrossSectionsBufer *nb;
bool encontrado;
encontrado = false;
if (!encontrado)
{
acutPrintf(_T("\nPLEDER ERROR: Sección Transversal no
encontrado."));
FreeAllCrossSectionsBufs();
return RTERROR;
}
*nVST = nb->m_nVST;
*LL = nb->m_LL;
*LC = nb->m_LC;
*LR = nb->m_LR;
*NL = nb->m_NL;
*NC = nb->m_NC;
288
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
*NR = nb->m_NR;
*BL = nb->m_BL;
*BR = nb->m_BR;
*CC = nb->m_CC;
*CE = nb->m_CE;
AcGePoint2d vertex;
// Vértices locales
vertex[X] = nb->m_LocalVertice[i].x;
vertex[Y] = nb->m_LocalVertice[i].y;
LvertexArray.append(vertex);
}
FreeAllCrossSectionsBufs();
return RTNORM;
}
int
CPLEDERSeccionesTransversales::GetIdCrossSectionsAttributesSocavacion(
double IdST, int *Material, int *CoefProb,
double *CoefMaterial)
/*--------------------------------------------------------------------
Ingreso : IdnST: Nombre o Id de la sección transversal
Salida : RTNORM si no se produce ningún error.
RTERROR en otro caso.
Propósito : Recepciona los atributos de la sección transversal desde
su ID
-------------------------------------------------------------------*/
{
long numof;
if (!m_theFirstSOC)
{
acutPrintf(_T("\nERROR PLEDER: No hay secciones
transversales definidos."));
return RTERROR;
}
CrossSectionsSocavacionBufer *nb;
bool encontrado = false;
289
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
if (!encontrado)
{
acutPrintf(_T("\nPLEDER ERROR: Sección Transversal no
encontrado."));
FreeAllCrossSectionsSocavacionBufs();
return RTERROR;
}
FreeAllCrossSectionsSocavacionBufs();
return RTNORM;
}
Mayor = VerticeY[1];
Menor = VerticeY[1];
290
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
}//For j
return RTNORM;
}
int CPLEDERSeccionesTransversales::GetAreaPerimeter(double
CotaTirante, AcGePoint3dArray LvertexArray,
long BL, long BR, double *ALF , double *AMC, double *ARF,
double *PLF, double *PMC, double *PRF, double *A, double *P)
/*--------------------------------------------------------------------
Ingreso : CotaTirante = Cota del tirante de la sección
transversal. Dato importante para determinar el área y el perímetro
de la S.T.
LvertexArray = Vértices de la sección transversal (X, Y,
Manning)
{
int j,k;
double Ai = 0.0, At = 0.0, Ad = 0.0, // Áreas
: Izquierda, trapecios, y derecha.
Pi = 0.0, Pt = 0.0, Pd = 0.0; // Perímetros
: Izquierda, trapecios y derecha.
Vertices.append(Vertex);
}
291
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
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;
}
Vertices.append(Vertex);
InundDerecho = true;
}
292
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
293
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
//acutPrintf(_T("\nValores de Area
Derecha: %0.6f"), Ad);
}//While
} //if
}//For j
294
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
{
*Area = 0.0;
long N = VPoligon.length();
return RTNORM;
}
PLEDERSeccionesTransversalesDlg.cpp
#include "PLEDERRecursosCad.h"
#include "PLEDERHidraSecTrasnv.h"
//Objetos PLEDER
CRecursosCad RecursosST;
CPLEDERSeccionesTransversales CS;
HidraSecTrasnv GeometriaST;
IMPLEMENT_DYNAMIC(CPLEDERSeccionesTransversalesDlg, CAdUiDialog)
CPLEDERSeccionesTransversalesDlg::CPLEDERSeccionesTransversalesDlg(CWn
d* pParent /*=NULL*/)
: CAdUiDialog(CPLEDERSeccionesTransversalesDlg::IDD, pParent)
{
m_bFullRow = TRUE;
m_bGridLines = TRUE;
m_bCheckboxes = TRUE;
m_LI = _T("20.00");
m_LC = _T("20.00");
m_LD = _T("20.00");
m_BI = _T("1");
m_BD = _T("");
m_NI = _T("0.025");
m_NC = _T("0.017");
m_ND = _T("0.025");
295
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
m_CC = _T("0.1");
m_CE = _T("0.3");
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);
//ComboBox.
DDX_Control(pDX, IDC_COMBO_ST, m_Combo_ST);
// Botones (CAD)
DDX_Control(pDX, IDC_BUTTON_ST, m_PickButton_ST);
// Botones Menú
//DDX_Control(pDX, IDR_MENU_ST, OnCommandSTN);
BEGIN_MESSAGE_MAP(CPLEDERSeccionesTransversalesDlg, CAdUiDialog)
ON_EN_KILLFOCUS(IDC_EDIT_BI, OnKillfocusEdit_BI)
ON_EN_KILLFOCUS(IDC_EDIT_BD, OnKillfocusEdit_BD)
296
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
ON_EN_KILLFOCUS(IDC_EDIT_CC, OnKillfocusEdit_CC)
ON_EN_KILLFOCUS(IDC_EDIT_CE, OnKillfocusEdit_CE)
// Combo Box
ON_CBN_SELCHANGE(IDC_COMBO_ST, OnKillfocusComboST)
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)
//ON_BN_CLICKED(IDOK,
&CPLEDERLluviaEscorrentiaDlg::OnBnClickedOk)
END_MESSAGE_MAP()
BOOL CPLEDERSeccionesTransversalesDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_wndList.SetGridLines(TRUE);
//m_wndList.SetCheckboxes(TRUE);
m_Edit_BI.SetWindowText(m_BI);
m_Edit_BI.SetRange(1, MAX_VERTICES);
m_Edit_BD.SetWindowText(m_BD);
m_Edit_BD.SetRange(1, MAX_VERTICES);
m_Edit_NI.SetWindowText(m_NI);
m_Edit_NC.SetWindowText(m_NC);
m_Edit_ND.SetWindowText(m_ND);
m_Edit_CC.SetWindowText(m_CC);
m_Edit_CC.SetRange(0, 1);
297
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
m_Edit_CE.SetWindowText(m_CE);
m_Edit_CE.SetRange(0, 1);
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;
return TRUE;
}
void CPLEDERSeccionesTransversalesDlg::OnKillfocusEdit_BI()
{
m_Edit_BI.Convert();
if (!m_Edit_BI.Validate())
{
::AfxMessageBox(_T("Entrada no válida, Fuera de rango"));
m_Edit_BI.SetFocus();
m_Edit_BI.SetSel(0, -1);
}
298
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
CString str;
m_Edit_BI.GetWindowText(m_BI);
acdbRToS(::_wtof(m_BI), 2, 0, str.GetBuffer(80));
m_Edit_BI.SetWindowText(str);
}
void CPLEDERSeccionesTransversalesDlg::OnKillfocusEdit_BD()
{
m_Edit_BD.Convert();
if (!m_Edit_BD.Validate())
{
::AfxMessageBox(_T("Entrada no válida, Fuera de rango"));
m_Edit_BD.SetFocus();
m_Edit_BD.SetSel(0, -1);
}
CString str;
m_Edit_BD.GetWindowText(m_BD);
acdbRToS(::_wtof(m_BD), 2, 0, str.GetBuffer(80));
m_Edit_BD.SetWindowText(str);
}
void CPLEDERSeccionesTransversalesDlg::OnKillfocusEdit_CC()
{
m_Edit_CC.Convert();
if (!m_Edit_CC.Validate())
{
::AfxMessageBox(_T("Entrada no válida, rango = 0 @ 1"));
m_Edit_CC.SetFocus();
m_Edit_CC.SetSel(0, -1);
}
CString str;
m_Edit_CC.GetWindowText(m_CC);
acdbRToS(::_wtof(m_CC), 2, 2, str.GetBuffer(80));
m_Edit_CC.SetWindowText(str);
}
void CPLEDERSeccionesTransversalesDlg::OnKillfocusEdit_CE()
{
m_Edit_CE.Convert();
if (!m_Edit_CE.Validate())
{
::AfxMessageBox(_T("Entrada no válida, rango = 0 @ 1"));
m_Edit_CE.SetFocus();
m_Edit_CE.SetSel(0, -1);
}
CString str;
m_Edit_CE.GetWindowText(m_CE);
acdbRToS(::_wtof(m_CE), 2, 2, str.GetBuffer(80));
m_Edit_CE.SetWindowText(str);
}
void CPLEDERSeccionesTransversalesDlg::OnKillfocusComboST()
{
double Id_ST;
// Obtener el valor del combo seleccionado
int nIndex = m_Combo_ST.GetCurSel();
m_Combo_ST.GetLBText(nIndex,m_Id_ST);
Id_ST = _wtof(m_Id_ST);
double X1, Y1, LL, LC, LR, NL, NC, NR, CC, CE;
long BL, BR, nVST;
299
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
AcGePoint2dArray GlobalVertices;
AcGePoint2dArray LocalVertices;
TCHAR strN[100];
TCHAR strX[100];
TCHAR strY[100];
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);
void CPLEDERSeccionesTransversalesDlg::OnButtonST()
{
if(m_Combo_ST.GetCount() == 0)
{
::AfxMessageBox(_T("PLEDER ERROR: \n Ingresar Una Nueva
sección"));
return;
}
//Esconde el diálogo
BeginEditorCommand();
300
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
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);
// Selecciona la polilinea
if (acedEntSel(_T("\nSeleccionar Polilinea: "), nombrep, punto)
!= RTNORM)
{
RecursosST.RestaurarVariables();
acutPrintf(_T("\nError al seleccionar la Polilinea"));
301
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
CompleteEditorCommand();
return;
}
302
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
RecursosST.RestaurarVariables();
acutPrintf(_T("\nError al ingresar el Punto Y"));
CompleteEditorCommand();
return;
}
case RTKWORD: //Ingresó un texto
{
RecursosST.RestaurarVariables();
acutPrintf(_T("\nError al ingresar el Punto Y"));
CompleteEditorCommand();
return;
}
default:
return;
} //switch (valor2)
long nVST = 0;
if ( GeometriaST.NumeroVerticesPolilinea(nombrep, &nVST) !=
RTNORM)
{
acdbFail(_T("\nError [NumeroVerticesPolilinea()]"));
CompleteEditorCommand();
return;
}
303
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
CPLEDERCrossSections *pPolilinea;
// crear la nueva entidad
try
{
pPolilinea = new CPLEDERCrossSections(p1, X1, Y1, m_IdST,
nVST, CX, CY, HminG, HminL, Diametro, AlturaTexto,
LI,
LC, LD, NI, NC, ND, BI, BD, CC, CE, m_Material,
m_CoefProb, m_CoefMaterial);
}
catch(const std::bad_alloc&)
{
acdbFail(_T("\nError de asignación de memoria
[pPolilinea]."));
return ;
}
AcDbObjectId ID;
ads_point v1;
for (int i = 1; i<= nVST; i++)
{
v1[X]= X1 + (CX[i] - p1[X]); // Suma la posición inicial X
+ la distancia X
v1[Y]= Y1 - (p1[Y] - CY[i]); // Resta la posición inicial Y
- la distancia Y
acdbRToS(i , 2, 0, strN);
acdbRToS(v1[X], 2, 3, strX);
acdbRToS(v1[Y], 2, 3, strY);
m_wndList.InsertItem(nVST, strN,strX,strY);
304
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
//Retorna al diálogo
CompleteEditorCommand();
delete [] CX;
delete [] CY;
}
void CPLEDERSeccionesTransversalesDlg::OnButtonLI()
{
double L = OnButtonDistancia();
m_LI.Format(_T("%g"), L );
m_Edit_LI.SetWindowText(m_LI);
void CPLEDERSeccionesTransversalesDlg::OnButtonLC()
{
double L = OnButtonDistancia();
m_LC.Format(_T("%g"), L );
m_Edit_LC.SetWindowText(m_LC);
}
void CPLEDERSeccionesTransversalesDlg::OnButtonLD()
{
double L = OnButtonDistancia();
m_LD.Format(_T("%g"), L );
m_Edit_LD.SetWindowText(m_LD);
}
void CPLEDERSeccionesTransversalesDlg::OnButtonBI()
{
double Id_ST;
// Obtener el valor del combo seleccionado
int nIndex = m_Combo_ST.GetCurSel();
m_Combo_ST.GetLBText(nIndex,m_Id_ST);
Id_ST = _wtof(m_Id_ST);
double X1, Y1, LL, LC, LR, NL, NC, NR, CC, CE;
long BL, BR;
AcGePoint2dArray GlobalVertices;
AcGePoint2dArray LocalVertices;
long nVST;
//Esconde el diálogo
BeginEditorCommand();
int nV;
acedInitGet(RSG_NONULL, NULL);
305
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
// No se permite nV = 0
if (nV <= 0)
{
::AfxMessageBox(_T("\nEntrada no válida."));
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;
//Esconde el diálogo
BeginEditorCommand();
int nVD;
acedInitGet(RSG_NONULL, NULL);
306
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
{
CompleteEditorCommand();
return;
}
// No se permite nVD = 0
if (nVD <= 0)
{
::AfxMessageBox(_T("\nEntrada no válida."));
CompleteEditorCommand();
return;
}
// Si todo es correcto
CompleteEditorCommand();
m_BD.Format(_T("%d"), nVD );
m_Edit_BD.SetWindowText(m_BD);
307
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
if (IdST == iST)
{
::AfxMessageBox(_T("PLEDER ERROR: \nNo se permite
duplicar"));
acutPrintf(_T("\nNo se permite duplicar"));
return;
}
}
m_Combo_ST.AddString(dlgSTN.m_NST);
int pos = 0;
// Buscar la posicion para la seleción actual
for(int i = 0; i < m_Combo_ST.GetCount(); i++)
{
m_Combo_ST.GetLBText(i,m_Id_ST); iST = _wtof(m_Id_ST);
if (IdST == iST) { break;}
pos++;
}
m_Combo_ST.SetCurSel(pos);
double CPLEDERSeccionesTransversalesDlg::OnButtonDistancia()
/*--------------------------------------------------------------------
Ingreso : Vacío.
Salida : Vacío
Propósito : Calcula la distancia entre varios puntos
--------------------------------------------------------------------*/
{
//Esconde el diálogo
BeginEditorCommand();
while (true)
{
// Cogen los puntos siguienes
if (acedGetPoint(p1, _T("\nSiguiente punto: "), p2) !=
RTNORM)
{
CompleteEditorCommand();
return L;
}
contador++; // siguiente
ls = acutDistance(p1,p2);
L = L + ls;
308
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
}//while
return RTNORM;
}
void CPLEDERSeccionesTransversalesDlg::OnCommandAPLICAR()
{
// Coge los atributos de los textos de la ventana.
Double LL, // Longitud izquierdo.
LC, // Longitud central.
LR, // Longitud derecho.
NL, // Coeficiente de manning Banco izquierdo.
NC, // Coeficiente de manning canal central.
NR, // Coeficiente de manning Banco derecho
CC, // Coeficiente de contracción.
CE; // Coeficiente de expansión.
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 (!filter)
{
309
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
ads_name ss; // ss
long sslen = 0; // longitud del ss
acutRelRb(filter);
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;
}
310
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
double Id_Seccion;
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;
}
/*-----------------------------------------------------------------
------------------------------------------------------------------*/
// PLEDERST1Dlg.cpp: archivo de implementación
311
Apéndice B. HIDRÁULICA CÓDIGO FUENTE C++
IMPLEMENT_DYNAMIC(CPLEDERST1Dlg, CDialog)
CPLEDERST1Dlg::~CPLEDERST1Dlg()
{
BEGIN_MESSAGE_MAP(CPLEDERST1Dlg, CDialog)
ON_BN_CLICKED(IDOK, &CPLEDERST1Dlg::OnBnClickedOk)
END_MESSAGE_MAP()
// Cajas de texto
m_Edit_NST.GetWindowText(m_NST);
CDialog::OnOK();
//algo.EnableWindow( FALSE );
}
312
Apéndice C
313
Apéndice C. HIDRÁULICA FLUVIAL CÓDIGO FUENTE C++
ARCHIVOS DE CABECERA:
PLEDERSocavacionGeneral.h
#pragma once
class CPLEDERSocavacionGeneral
{
public:
CPLEDERSocavacionGeneral(void);
~CPLEDERSocavacionGeneral(void);
public:
// Cálculo de la variable X.
int SGCoeficienteX(int Material, float CoefMaterial, float *X);
};
PLEDERSocavacionGeneralDlg.h
//--------------------------------------------------------------------
//----- PLEDERSocavacionGeneralDlg.h : Declaration of the
CPLEDERSocavacionGeneralDlg
//--------------------------------------------------------------------
#pragma once
//--------------------------------------------------------------------
class FGVResultadosBufer;
#include "adui.h"
#include "PLEDERReportCtrl.h"
#include "resource.h"
//--------------------------------------------------------------------
class CPLEDERSocavacionGeneralDlg : public CAdUiDialog
{
DECLARE_DYNAMIC (CPLEDERSocavacionGeneralDlg)
public:
static BOOL CALLBACK ItemdataProc(DWORD dwData, LPARAM lParam);
CPLEDERSocavacionGeneralDlg (CWnd *pParent =NULL, HINSTANCE
hInstance =NULL) ;
virtual ~CPLEDERSocavacionGeneralDlg();
314
Apéndice C. HIDRÁULICA FLUVIAL CÓDIGO FUENTE C++
// 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();
// Botones
afx_msg void OnCommandSOCAPLICAR();
public:
virtual BOOL OnInitDialog();
public:
FGVResultadosBufer* m_theFirstT;
struct Socavacion* m_pSocavacion; // Struct buffer para
los resultados.
long m_Socavacion_len;
DECLARE_MESSAGE_MAP()
afx_msg void OnEnChangeEditSoccoef();
};
315
Apéndice C. HIDRÁULICA FLUVIAL CÓDIGO FUENTE C++
ARCHIVOS Cpp:
PLEDERSocavacionGeneral.cpp
#include "StdAfx.h"
#include "PLEDERSocavacionGeneral.h"
#include "PLEDERMetodosNumericos.h"
CMetodosNumericos CN;
CPLEDERSocavacionGeneral::CPLEDERSocavacionGeneral(void)
{
CPLEDERSocavacionGeneral::~CPLEDERSocavacionGeneral(void)
{
}
int CPLEDERSocavacionGeneral::SGDatosMaterial(int Material, float
*DatosMaterialX, float *DatosMaterialY)
/*--------------------------------------------------------------------
Ingreso : Material = Tipo de material del lecho
1 -> No cohesivo.
0 -> Cohesivo.
Salida : DatosMaterialX = Recibe en una lista los valores de las
coordenadas X. Dependiendo del tipo del
material.
DatosMaterialX = Recibe en una lista los valores de las
coordenadas Y. Dependiendo del tipo del
material.
Propósito : Prepara los datos en listas, dependiendo del tipo de
material del lecho
.------------------------------------------------------------------ */
{
int i;
float Coh_X[26] =
{0.80,0.83,0.86,0.88,0.90,0.93,0.96,0.98,1.00,1.04,1.08,1.12,1.1
6,1.20,1.24,1.28,1.34,1.40,1.46,1.52,1.58,1.64,1.71,1.80,1.89,2.
00};
float Coh_Y[26] =
{0.52,0.51,0.50,0.49,0.48,0.47,0.46,0.45,0.44,0.43,0.42,0.41,0.4
0,0.39,0.38,0.37,0.36,0.35,0.34,0.33,0.32,0.31,0.30,0.29,0.28,0.
27};
float NoCoh_X[25] =
{0.05,0.15,0.50,1.00,1.50,2.50,4.00,6.00,8.00,10.00,15.00,20.00,
25.00,40.00,60.00,90.00,140.00,190.00,250.00,310.00,370.00,450.0
0,570.00,750.00,1000.00};
float NoCoh_Y[25] =
{0.43,0.42,0.41,0.40,0.39,0.38,0.37,0.36,0.35,0.34,0.33,0.32,0.3
1,0.30,0.29,0.28,0.27,0.26,0.25,0.24,0.23,0.22,0.21,0.20,0.19};
}
} // if 1
316
Apéndice C. HIDRÁULICA FLUVIAL CÓDIGO FUENTE C++
}
} // if 0
return RTNORM;
}
// Interpolaciones lineales.
*X =
CN.InterpolacionLineal(25,DatosMaterialY,DatosMaterialX,
CoefMaterial);
}
317
Apéndice C. HIDRÁULICA FLUVIAL CÓDIGO FUENTE C++
// Interpolaciones lineales.
*X =
CN.InterpolacionLineal(25,DatosMaterialY,DatosMateria
lX, CoefMaterial);
}
delete [] DatosMaterialX;
delete [] DatosMaterialY;
return RTNORM;
}
return RTNORM;
}
318
Apéndice C. HIDRÁULICA FLUVIAL CÓDIGO FUENTE C++
int k;
AcGePoint2d Vertex;
switch (CoefProb)
{
case 0:
{
v = 0.77;
break;
}
case 1:
{
v = 0.82;
break;
}
case 2:
{
v = 0.86;
break;
}
case 3:
{
v = 0.90;
break;
}
case 4:
319
Apéndice C. HIDRÁULICA FLUVIAL CÓDIGO FUENTE C++
{
v = 0.94;
break;
}
case 5:
{
v = 0.97;
break;
}
case 6:
{
v = 1.00;
break;
}
case 7:
{
v = 1.03;
break;
}
case 8:
{
v = 1.05;
break;
}
case 9:
{
v = 1.07;
break;
}
default:
acutPrintf(_T("\nFuera de Rango"));
} //switch (CoefProb)
Vertex[X] = 0.0;
Vertex[Y] = Hs;
VerticesSoc.append(Vertex);
} // for k
} //if
320
Apéndice C. HIDRÁULICA FLUVIAL CÓDIGO FUENTE C++
H0 = VerticesH0[k].x;
Hs = Q*pow(P,Exp23)*pow(H0,Exp53)/
(0.60*v*pow(A,Exp53)*pow(CoefMaterial,ExpMatC));
Hs = pow(Hs,Exp1X);
Vertex[X] = 0.0;
Vertex[Y] = Hs;
VerticesSoc.append(Vertex);
} // For k
} // if
return RTNORM;
}
PLEDERSocavacionGeneralDlg.cpp
//--------------------------------------------------------------------
//----- PLEDERTranSediFormaFondoDlg.cpp : Implementation of
CPLEDERTranSediFormaFondoDlg
//--------------------------------------------------------------------
#include "StdAfx.h"
#include "resource.h"
#include "PLEDERSocavacionGeneralDlg.h"
#include "PLEDERSeccionesTransversales.h"
#include "PLEDERHidraBuffer.h"
#include "PLEDERRecursosCad.h"
#include "axlock.h" // Tabla
CRecursosCad RSOC;
CPLEDERSeccionesTransversales STSOC;
//--------------------------------------------------------------------
---------
IMPLEMENT_DYNAMIC (CPLEDERSocavacionGeneralDlg, CAdUiDialog)
BEGIN_MESSAGE_MAP(CPLEDERSocavacionGeneralDlg, CAdUiDialog)
ON_MESSAGE(WM_ACAD_KEEPFOCUS, OnAcadKeepFocus)
ON_EN_KILLFOCUS(IDC_EDIT_SOCPes, OnKillfocusEdit_SOCPes)
ON_EN_KILLFOCUS(IDC_EDIT_SOCDm, OnKillfocusEdit_SOCDm)
// Combo Box
ON_CBN_SELCHANGE(IDC_COMBO_SOCId, OnKillfocusComboSOCId)
ON_CBN_SELCHANGE(IDC_COMBO_SOCProbg, OnKillfocusComboSOCProbg)
ON_EN_CHANGE(IDC_EDIT_SOCCoef,
&CPLEDERSocavacionGeneralDlg::OnEnChangeEditSoccoef)
END_MESSAGE_MAP()
//--------------------------------------------------------------------
321
Apéndice C. HIDRÁULICA FLUVIAL CÓDIGO FUENTE C++
CPLEDERSocavacionGeneralDlg::CPLEDERSocavacionGeneralDlg (CWnd
*pParent /*=NULL*/, HINSTANCE hInstance /*=NULL*/) : CAdUiDialog
(CPLEDERSocavacionGeneralDlg::IDD, pParent, hInstance)
{
m_Material = 0;
m_SOCPes = _T("0.0");
m_SOCDm = _T("0.0");
m_SOCCoef = _T("1.00");
}
CPLEDERSocavacionGeneralDlg::~CPLEDERSocavacionGeneralDlg()
{
}
//--------------------------------------------------------------------
void CPLEDERSocavacionGeneralDlg::DoDataExchange (CDataExchange *pDX)
{
CAdUiDialog::DoDataExchange (pDX) ;
// Cajas de Texto.
DDX_Control(pDX, IDC_EDIT_SOCPes, m_Edit_SOCPes);
DDX_Control(pDX, IDC_EDIT_SOCDm, m_Edit_SOCDm);
DDX_Control(pDX, IDC_EDIT_SOCCoef, m_Edit_SOCCoef);
// Radio
DDX_Control(pDX, IDC_RADIO_SOCNocoh, m_Button_MaterialNoCoh);
DDX_Control(pDX, IDC_RADIO_SOCCoh, m_Button_MaterialCoh);
//DDX_Radio(pDX, IDC_RADIO_SOCNocoh, m_Material);
//ComboBox
DDX_Control(pDX, IDC_COMBO_SOCId, m_Combo_SOCId);
DDX_Control(pDX, IDC_COMBO_SOCProbg, m_Combo_SOCProbg);
//--------------------------------------------------------------------
//----- Needed for modeless dialogs to keep focus.
//----- Return FALSE to not keep the focus, return TRUE to keep the
focus
LRESULT CPLEDERSocavacionGeneralDlg::OnAcadKeepFocus (WPARAM, LPARAM)
{
return (TRUE) ;
}
BOOL CPLEDERSocavacionGeneralDlg::OnInitDialog()
{
CDialog::OnInitDialog();
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);
322
Apéndice C. HIDRÁULICA FLUVIAL CÓDIGO FUENTE C++
m_Edit_SOCDm.EnableWindow(1);
m_Material = 1;
long i;
CString str_IdST;
return TRUE;
}
void CPLEDERSocavacionGeneralDlg::OnKillfocusEdit_SOCPes()
{
m_Edit_SOCPes.Convert();
if (!m_Edit_SOCPes.Validate())
{
::AfxMessageBox(_T("Entrada no válida, Fuera de rango"));
m_Edit_SOCPes.SetFocus();
m_Edit_SOCPes.SetSel(0, -1);
}
CString str;
m_Edit_SOCPes.GetWindowText(m_SOCPes);
acdbRToS(::_wtof(m_SOCPes), 2, 3, str.GetBuffer(80));
m_Edit_SOCPes.SetWindowText(str);
}
void CPLEDERSocavacionGeneralDlg::OnKillfocusEdit_SOCDm()
{
m_Edit_SOCDm.Convert();
323
Apéndice C. HIDRÁULICA FLUVIAL CÓDIGO FUENTE C++
if (!m_Edit_SOCDm.Validate())
{
::AfxMessageBox(_T("Entrada no válida, Fuera de rango"));
m_Edit_SOCDm.SetFocus();
m_Edit_SOCDm.SetSel(0, -1);
}
CString str;
m_Edit_SOCDm.GetWindowText(m_SOCDm);
acdbRToS(::_wtof(m_SOCDm), 2, 3, str.GetBuffer(80));
m_Edit_SOCDm.SetWindowText(str);
}
void CPLEDERSocavacionGeneralDlg::OnRadioMaterialCohesivo()
{
// Activa y desactiva las casillas de la ventana
m_Edit_SOCPes.EnableWindow(1);
m_Edit_SOCDm.EnableWindow(0);
m_Material = 0;
}
void CPLEDERSocavacionGeneralDlg::OnRadioMaterialNoCohesivo()
{
// Activa las casillas de la ventana
m_Edit_SOCPes.EnableWindow(0);
m_Edit_SOCDm.EnableWindow(1);
m_Material = 1;
}
void CPLEDERSocavacionGeneralDlg::OnEnChangeEditSoccoef()
{
// TODO: Si éste es un control RICHEDIT, el control no
// enviará esta notificación a menos que se invalide
CAdUiDialog::OnInitDialog()
// función y llamada CRichEditCtrl().SetEventMask()
// con el marcador ENM_CHANGE ORed en la máscara.
void CPLEDERSocavacionGeneralDlg::OnCommandSOCAPLICAR()
{
// Parámetros para socavación
int Material, // Tipo de material, Cohesivo = 0, No
Cohesivo = 1.
CoefProb; // Coeficiente de probabilidad de gasto.
double CoefMaterial; // Peso específico ó diámetro medio
del material de fondo.
CoefProb = m_Combo_SOCProbg.GetCurSel();
324
Apéndice C. HIDRÁULICA FLUVIAL CÓDIGO FUENTE C++
if (!filter)
{
acdbFail(_T("\nError al construir el filtro
[acutBuildList]."));
return ;
}
ads_name ss; // ss
long sslen = 0; // longitud del ss
acutRelRb(filter);
CPLEDERCrossSections *pSecciones;
ads_name ename;
AcDbObjectId ID;
325
Apéndice C. HIDRÁULICA FLUVIAL CÓDIGO FUENTE C++
// recorrer el ss
for (int i = 0; i < sslen; i++)
{
// tomar el nombre de la entidad
if (acedSSName(ss, i, ename) != RTNORM)
{
acedSSFree(ss);
acdbFail(_T("\nError al tomar el nombre de la entidad
CPLEDERCrossSections [acedSSName]."));
return;
}
// cambiar el nombre por el ObjectId
if (acdbGetObjectId(ID, ename) != Acad::eOk)
{
acedSSFree(ss);
acdbFail(_T("\nError al tomar el ObjectId de la
entidad CPLEDERCrossSections [acdbGetObjectId]."));
return;
}
// abrir el objeto para escritura
if (acdbOpenObject(pSecciones, ID, /*AcDb::kForRead*/
AcDb::kForWrite) != Acad::eOk)
{
acedSSFree(ss);
acdbFail(_T("\nError al abrir el Objeto
CPLEDERCrossSections [acdbOpenObject]."));
return ;
}
// chequear el tipo de objeto
if (pSecciones->isKindOf(CPLEDERCrossSections::desc()) !=
Adesk::kTrue)
{
pSecciones->close();
acedSSFree(ss);
acdbFail(_T("\nError Objeto CPLEDERCrossSections "));
return;
}
double Id_Seccion;
}// if
pSecciones->close();
} // for i
acedSSFree(ss);
acutPrintf(_T("\n....Datos modificados en forma Exitosa...."));
return;
}
326
Apéndice C. HIDRÁULICA FLUVIAL CÓDIGO FUENTE C++
void CPLEDERSocavacionGeneralDlg::OnKillfocusComboSOCId()
{
double Id_ST;
// Obtener el valor del combo seleccionado
int nIndex = m_Combo_SOCId.GetCurSel();
m_Combo_SOCId.GetLBText(nIndex,m_SOCId);
Id_ST = _wtof(m_SOCId);
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);
m_SOCPes.Format(_T("%g"), CoefMaterial);
m_Edit_SOCPes.SetWindowText(m_SOCPes);
}
}
void CPLEDERSocavacionGeneralDlg::OnKillfocusComboSOCProbg()
{
switch (m_Combo_SOCProbg.GetCurSel())
{
327
Apéndice C. HIDRÁULICA FLUVIAL CÓDIGO FUENTE C++
case 0:
{
m_Edit_SOCCoef.SetWindowText(_T("0.77"));
break;
}
case 1:
{
m_Edit_SOCCoef.SetWindowText(_T("0.82"));
break;
}
case 2:
{
m_Edit_SOCCoef.SetWindowText(_T("0.86"));
break;
}
case 3:
{
m_Edit_SOCCoef.SetWindowText(_T("0.90"));
break;
}
case 4:
{
m_Edit_SOCCoef.SetWindowText(_T("0.94"));
break;
}
case 5:
{
m_Edit_SOCCoef.SetWindowText(_T("0.97"));
break;
}
case 6:
{
m_Edit_SOCCoef.SetWindowText(_T("1.00"));
break;
}
case 7:
{
m_Edit_SOCCoef.SetWindowText(_T("1.03"));
break;
}
case 8:
{
m_Edit_SOCCoef.SetWindowText(_T("1.05"));
break;
}
case 9:
{
m_Edit_SOCCoef.SetWindowText(_T("1.07"));
break;
}
default:
acutPrintf(_T("\nFuera de Rango"));
} //switch (m_Combo_SOCProbg.GetCurSel())
}
328
Apéndice D
Duración (min) Q total (m3 /s) Duración (min) Q total (m3 /s)
Duración (min) Q total (m3 /s) Duración (min) Q total (m3 /s)
330
Apéndice D. RESULTADOS DEL PROGRAMA
Duración (min) Q total (m3 /s) Duración (min) Q total (m3 /s)
331
Apéndice D. RESULTADOS DEL PROGRAMA
Duración (min) Q total (m3 /s) Duración (min) Q total (m3 /s)
332
Apéndice D. RESULTADOS DEL PROGRAMA
Duración (min) Q total (m3 /s) Duración (min) Q total (m3 /s)
(Fin de la tabla)
Duración (min) Q total (m3 /s) Duración (min) Q total (m3 /s)
333
Apéndice D. RESULTADOS DEL PROGRAMA
Duración (min) Q total (m3 /s) Duración (min) Q total (m3 /s)
334
Apéndice D. RESULTADOS DEL PROGRAMA
Duración (min) Q total (m3 /s) Duración (min) Q total (m3 /s)
335
Apéndice D. RESULTADOS DEL PROGRAMA
Duración (min) Q total (m3 /s) Duración (min) Q total (m3 /s)
336
Apéndice D. RESULTADOS DEL PROGRAMA
Duración (min) Q total (m3 /s) Duración (min) Q total (m3 /s)
(Fin de la tabla)
Duración (min) Q total (m3 /s) Duración (min) Q total (m3 /s)
337
Apéndice D. RESULTADOS DEL PROGRAMA
Duración (min) Q total (m3 /s) Duración (min) Q total (m3 /s)
338
Apéndice D. RESULTADOS DEL PROGRAMA
Duración (min) Q total (m3 /s) Duración (min) Q total (m3 /s)
339
Apéndice D. RESULTADOS DEL PROGRAMA
Duración (min) Q total (m3 /s) Duración (min) Q total (m3 /s)
340
Apéndice D. RESULTADOS DEL PROGRAMA
Duración (min) Q total (m3 /s) Duración (min) Q total (m3 /s)
(Fin de la tabla)
Duración (min) Q total (m3 /s) Duración (min) Q total (m3 /s)
341
Apéndice D. RESULTADOS DEL PROGRAMA
Duración (min) Q total (m3 /s) Duración (min) Q total (m3 /s)
342
Apéndice D. RESULTADOS DEL PROGRAMA
Duración (min) Q total (m3 /s) Duración (min) Q total (m3 /s)
343
Apéndice D. RESULTADOS DEL PROGRAMA
Duración (min) Q total (m3 /s) Duración (min) Q total (m3 /s)
344
Apéndice D. RESULTADOS DEL PROGRAMA
Duración (min) Q total (m3 /s) Duración (min) Q total (m3 /s)
(Fin de la tabla)
Sta Q (m3 /s) Elev (m) Area(m2 ) Perı́m (m) V(m/s) Froude Ancho (m)
345
Apéndice D. RESULTADOS DEL PROGRAMA
Sta Q (m3 /s) Elev (m) Area(m2 ) Perı́m (m) V(m/s) Froude Ancho (m)
346
Apéndice D. RESULTADOS DEL PROGRAMA
Sta Q (m3 /s) Elev (m) Area(m2 ) Perı́m (m) V(m/s) Froude Ancho (m)
347
Apéndice D. RESULTADOS DEL PROGRAMA
Sta Q (m3 /s) Elev (m) Area(m2 ) Perı́m (m) V(m/s) Froude Ancho (m)
348
Apéndice D. RESULTADOS DEL PROGRAMA
Sta Q (m3 /s) Elev (m) Area(m2 ) Perı́m (m) V(m/s) Froude Ancho (m)
349
Apéndice D. RESULTADOS DEL PROGRAMA
Sta Q (m3 /s) Elev (m) Area(m2 ) Perı́m (m) V(m/s) Froude Ancho (m)
350
Apéndice D. RESULTADOS DEL PROGRAMA
Sta Q (m3 /s) Elev (m) Area(m2 ) Perı́m (m) V(m/s) Froude Ancho (m)
(Fin de la tabla)
Sta Q (m3 /s) Elev (m) Area(m2 ) Perı́m (m) V(m/s) Froude Ancho (m)
351
Apéndice D. RESULTADOS DEL PROGRAMA
Sta Q (m3 /s) Elev (m) Area(m2 ) Perı́m (m) V(m/s) Froude Ancho (m)
352
Apéndice D. RESULTADOS DEL PROGRAMA
Sta Q (m3 /s) Elev (m) Area(m2 ) Perı́m (m) V(m/s) Froude Ancho (m)
353
Apéndice D. RESULTADOS DEL PROGRAMA
Sta Q (m3 /s) Elev (m) Area(m2 ) Perı́m (m) V(m/s) Froude Ancho (m)
354
Apéndice D. RESULTADOS DEL PROGRAMA
Sta Q (m3 /s) Elev (m) Area(m2 ) Perı́m (m) V(m/s) Froude Ancho (m)
355
Apéndice D. RESULTADOS DEL PROGRAMA
Sta Q (m3 /s) Elev (m) Area(m2 ) Perı́m (m) V(m/s) Froude Ancho (m)
356
Apéndice D. RESULTADOS DEL PROGRAMA
Sta Q (m3 /s) Elev (m) Area(m2 ) Perı́m (m) V(m/s) Froude Ancho (m)
(Fin de la tabla)
Sta Q (m3 /s) Elev (m) Area(m2 ) Perı́m (m) V(m/s) Froude Ancho (m)
357
Apéndice D. RESULTADOS DEL PROGRAMA
Sta Q (m3 /s) Elev (m) Area(m2 ) Perı́m (m) V(m/s) Froude Ancho (m)
358
Apéndice D. RESULTADOS DEL PROGRAMA
Sta Q (m3 /s) Elev (m) Area(m2 ) Perı́m (m) V(m/s) Froude Ancho (m)
359
Apéndice D. RESULTADOS DEL PROGRAMA
Sta Q (m3 /s) Elev (m) Area(m2 ) Perı́m (m) V(m/s) Froude Ancho (m)
360
Apéndice D. RESULTADOS DEL PROGRAMA
Sta Q (m3 /s) Elev (m) Area(m2 ) Perı́m (m) V(m/s) Froude Ancho (m)
361
Apéndice D. RESULTADOS DEL PROGRAMA
Sta Q (m3 /s) Elev (m) Area(m2 ) Perı́m (m) V(m/s) Froude Ancho (m)
362
Apéndice D. RESULTADOS DEL PROGRAMA
Sta Q (m3 /s) Elev (m) Area(m2 ) Perı́m (m) V(m/s) Froude Ancho (m)
(Fin de la tabla)
Sta Q (m3 /s) Elev (m) Area(m2 ) Perı́m (m) V(m/s) Froude Ancho (m)
363
Apéndice D. RESULTADOS DEL PROGRAMA
Sta Q (m3 /s) Elev (m) Area(m2 ) Perı́m (m) V(m/s) Froude Ancho (m)
364
Apéndice D. RESULTADOS DEL PROGRAMA
Sta Q (m3 /s) Elev (m) Area(m2 ) Perı́m (m) V(m/s) Froude Ancho (m)
365
Apéndice D. RESULTADOS DEL PROGRAMA
Sta Q (m3 /s) Elev (m) Area(m2 ) Perı́m (m) V(m/s) Froude Ancho (m)
366
Apéndice D. RESULTADOS DEL PROGRAMA
Sta Q (m3 /s) Elev (m) Area(m2 ) Perı́m (m) V(m/s) Froude Ancho (m)
367
Apéndice D. RESULTADOS DEL PROGRAMA
Sta Q (m3 /s) Elev (m) Area(m2 ) Perı́m (m) V(m/s) Froude Ancho (m)
368
Apéndice D. RESULTADOS DEL PROGRAMA
Sta Q (m3 /s) Elev (m) Area(m2 ) Perı́m (m) V(m/s) Froude Ancho (m)
(Fin de la tabla)
369
Apéndice E
PLANOS
Componente hidrológico
Componente hidráulico
370