You are on page 1of 9

Para que sirve y utilidad de la Y_Bus

Este programa que se presenta acontinuacion tiene el uso de calcular la matriz Y_BUS la
cual nos sirve para ver que tan robustos son los nodos dentro de una red electrica y por
ende llegan a ser mas eficientes que los menos robustos.

Procedimiento que realiza el programa


El programa va generando la matriz (Y_bus) con respecto al inverso de las impedancias de los
elemento conectados entre los nodos.

Para hacer esto se le debera decir cuantos elementos y entre que nodos estan conectados,
tambien se le debera especificar cuando un elemento tenga derivaciones y de ser a si, se debera
incluir en el calculo.

Modulos que integran el programa


Inmac.f90 Invierte la matriz (Z_bus)

LEEDATOS.f90 Lee los datos de modulo (mDATA01)

mDATA01.f90 variables elementales que se usaran en el programa

mDATA02.f90 variables elementales que se usaran en el programa

PORTADA.f90 Portada del programa, información general del programa

YBUS_IN.f90 Manda a llamar todas las sub-rutinas del programa principal

YBUSIN.f90 verifica cada uno de los elementos, tanto para generar los
elementos dentro y fuera de la diagonal principal
Uso del Programa
Primero se debe de realizar un archivo de datos el cual debera ser de la sigiente forma:

YBUS_IN.DAT

1) NUMERO DE NODOS, NUMERO DE ELEMENTOS

2) DATOS DE ELEMENTOS:
NODO DE SALIDA, NODO DE ENTRADA, IMPEDANCIA SERIE, SI EL ELEMENTO TIENE
COMPONENTE EN DERIVACION, TIPO=1, EN ESTE CASO SE LEE LA ADMITANCIA Y'pq/2 DE
LA LINEA O TRANSFORMADOR.
CASO CONTRARIO, PROCEDE A LEER LA IMPEDANCIA SERIE DE OTRO ELEMENTO

Ejemplo:
5 7

1 2 (0.02,0.06) 1
(0.0,0.030) ADMITANCIA PARALELO/2

1 3 (0.08,0.24) 1
(0.0,0.025) 2 <- Con admitancia en derivacion

2 3 (0.06,0.18) 1
(0.0,0.020) 2

2 4 (0.06,0.18) 1
(0.0,0.0) 1 <- Sin admitancia en derivacion

2 5 (0.04,0.12) 1
(0.0,0.015)

3 4 (0.01,0.03) 1
(0.0,0.0)

Se guardara en un bloc de notas con la extencion (ejemplo.DAT) en la misma carpeta donde esta el
ejecutable

Lo que el programa te pedira a la hora de ejecutarlo es el archivo punto .DAT que acabas de crear.
Una ves que hayas ingresado el archivo (.DAT) el programa te pedira crear un nuevo archivo de
preferencia con el MISMO NOMBRE pero con la nueva extension (ejemplo.RES) donde arrojara los
resultados.
Sintaxis

Portada
SUBROUTINE PORTADA
WRITE(*,*) 'UAM AZCAPOTZALCO'
WRITE(*,*) 'DIVISION DE CIENCIAS BASICAS E INGENIERIA'
WRITE(*,*) 'LICENCIATURA EN INGENIERIA ELECRTICA'
WRITE(*,*) 'PROGRAMACION APLICADA A SISTEMAS ELECTRICOS DE POTENCIA'
WRITE(*,*) 'PROGRAMA: CALCULO DE YBUS_IN'
WRITE(*,*) 'ALUMNO: PEREDO CASTRO SERGIO'
END SUBROUTINE PORTADA

YBUS_IN
PROGRAM YBUS_IN
!PROGRAMA PARA LA FORMACION DE LA MATRIZ DE ADMITANCIAS NODALES (YBUS)
!POR EL METODO DE INSPECCION DE LA RED
!ELABORO V. RESENDIZ
PRINT *,'INICIA PROGRAMA YBUS_IN'
CALL PORTADA
CALL PRODUCTP
CALL LEEDATOS
CALL YBUSIN
END PROGRAM YBUS_IN

mDATA01
MODULE mDATA01
IMPLICIT NONE
!VARIABLES GLOBALES
INTEGER :: n, e
INTEGER, ALLOCATABLE :: p(:), q(:), tele(:)
COMPLEX, ALLOCATABLE :: zpq(:), ypqd2(:)
END MODULE mDATA01

mDATA02
MODULE mDATA02
IMPLICIT NONE
!VARIABLES GLOBALES
COMPLEX, ALLOCATABLE :: YBUS(:,:), ZBUS(:,:)
END MODULE mDATA02
LEEDATOS

SUBROUTINE LEEDATOS
! OBJETO:
! * ABRE UNIDADES
USE mDATA01
IMPLICIT NONE
!IMPLICIT NONE INDICA QUE VOY A DECLARAR TODAS LAS VARIABLES DE LA RUTINA
!AQUI VA LA DECLARACION DE TODAS LAS VARIABLES
CHARACTER(LEN = 40) :: DATOS, RESULTADOS
INTEGER :: elemento

!LEE LOS DATOS PARA EL PROGRAMA YBUS_IN


WRITE(*,*) 'INICIA RUTINA LEE_DATOS'
WRITE(*,*) 'INGRESE EL NOMBRE DEL ARCHIVO DE DATOS (?)'
READ(*,*)DATOS
WRITE(*,*)DATOS
OPEN(UNIT = 12, FILE =DATOS)
!LEE LOS DATOS
READ(12,*) n,e
WRITE(*,*) n,e

!ASIGNA EL TAMAÑO A LOS VECTORES


ALLOCATE(p(e), q(e), zpq(e), tele(e), ypqd2(e)) !INICIALIZA AQUELLOS VECTORES QUE NO
VAN A SER COMPLETAMENTE LEIDOS
ypqd2 = (0.0, 0.0)

!LEE LOS DATOS DE LOS ELEMENTOS


DO elemento = 1, e
READ(12,*) p(elemento), q(elemento), zpq(elemento), tele(elemento)
IF(tele(elemento) .EQ. 1) THEN
READ(12,*)ypqd2(elemento)
END IF
END DO
!PIDE EL NOMBRE DE ARCHIVO DE RESULTADOS
WRITE(*,*) 'INGRESE EL NOMBRE DEL ARCHIVO DE RESULTADOS (?)'
READ(*,*)RESULTADOS
WRITE(*,*)RESULTADOS
OPEN(UNIT = 24, FILE = RESULTADOS)

!PRINT *,p
WRITE(*,*) 'TERMINA RUTINA LEE_DATOS'
END SUBROUTINE LEEDATOS
INMAC

SUBROUTINE INMAC(orden,d,ai)

! REALIZA LA INVERSION DE LA MATRIZ COMPLEJA d


! FERNANDO TOLEDO (2006)

! d MATRIZ POR INVERTIR


! ai MATRIZ INVERSA
! orden ORDEN DE LAS MATRICES COMPLEJAS

IMPLICIT NONE

!ELIMINAR -> INTEGER, PARAMETER :: NodEle=30

INTEGER :: orden,col,renglon,reng
INTEGER :: i, j
COMPLEX :: a(orden,2*orden),ai(orden,orden)
COMPLEX :: d(orden,orden),pivote
COMPLEX :: UNO, CERO, temp

CERO = (0.0,0.0)
UNO = (1.0,0.0)

! >>> GENERA MATRIZ AUMENTADA A = D|U


DO i = 1, orden
DO j = 1, orden
a(i,j) = d(i,j)
a(i,j+orden) = CERO

IF(i .EQ. j)THEN


a(i,i+orden) = UNO
ENDIF

END DO
END DO

! >>> EMPIEZA CON DIAGONALIZACION


DO 100 renglon = 1, orden

! >>> GENERA EL PIVOTE


pivote = a(renglon,renglon)
! >>> HAZ UNO EN DIAGONAL PRINCIPAL Y DIVIDE ENTRE EL PIVOTE

columnas : DO col = 1, orden*2


a(renglon,col) = a(renglon,col)/pivote
END DO columnas

! >>> HAZ CEROS ARRIBA Y ABAJO DIAGONAL PRINCIPAL


DO 60 reng = 1, orden
temp = a(reng,renglon)
IF(reng .EQ. renglon) GO TO 60

DO col = renglon, 2*orden


a(reng,col) = a(reng,col) - a(renglon,col) * temp
END DO

60 CONTINUE
100 CONTINUE

! >>> MANDA MATRIZ INVERSA ai


DO 200 i = 1, orden
DO 200 j = 1, orden
ai(i,j) = a(i,j+orden)
200 CONTINUE

RETURN

END SUBROUTINE INMAC


YBUSIN

SUBROUTINE YBUSIN
USE mDATA01
USE mDATA02
IMPLICIT NONE
INTEGER :: nodo, ele, i, j
WRITE(*,*) 'DESDE YBUS_IN, n & e'
WRITE(*,*) n, e
PRINT *,ypqd2

!ASIGNA EL TAMAÑO DE YBUS


ALLOCATE(YBUS(n,n), ZBUS(n,n))
!INICIALIZA YBUS Y ZBUS
YBUS = (0.0, 0.0)
ZBUS = (0.0, 0.0)

!GENERA LA DIAGONAL PRINCIPAL


DO nodo = 1, n
DO ele = 1, e

IF(p(ele) .EQ. nodo .OR. q(ele) .EQ. nodo) THEN


YBUS(nodo,nodo)= YBUS(nodo,nodo) + 1.0 / zpq(ele)

IF(tele(ele) .EQ. 1) THEN


!VERIFICA SI EL ELEMENTO TIENE EFECTO EN DERIVACION
YBUS(nodo,nodo) = YBUS(nodo,nodo) + ypqd2(ele)
END IF

END IF

END DO

END DO

!LLENA LOS ELEMENTOS FUERA DE LA DIAGONAL

DO i = 1,n-1

DO j = i+1,n

DO ele = 1,e

IF( (p(ele) .EQ. i) .AND. (q(ele) .EQ. j) ) THEN


!EL ELEMENTO ele ESTA CONECTADO A LOS NODOS (i,j)
YBUS(i,j) = YBUS(i,j) - (1.0 / zpq(ele))
END IF

END DO

YBUS(j,i) = YBUS(i,j)

END DO

END DO

WRITE(24,*)'MATRIZ DE ADMITANCIAS NODALES POR INSPECCION'


!IMPRIME FORMATEADAMENTE YBUS
DO i = 1,n

DO j = i,n
IF(YBUS(i,j) .NE. (0.0,0.0)) THEN
WRITE(24,10)i, j, YBUS(i,j)
10 FORMAT(6X,'YBUS(',I2,',',I2,')=',E10.4,' + j ', E10.4)
END IF
END DO
END DO

!INVIERTE YBUS Y OBTIENE ZBUS


CALL INMAC(n, YBUS, ZBUS)

WRITE(24,*)'MATRIZ DE IMPEDANCIAS NODALES'


!IMPRIME FORMATEADAMENTE YBUS
DO i = 1,n

DO j = i,n
WRITE(24,20)i, j, ZBUS(i,j)
20 FORMAT(6X,'ZBUS(',I2,',',I2,')=',E10.4,' + j ', E10.4)
END DO

END DO

!PRINT *,YBUS

END SUBROUTINE YBUSIN


Producto
SUBROUTINE Producto
USE mDATA01
USE mDATA02
IMPLICIT NONE

INTEGER :: i, j, k
COMPLEX :: c(n,n)

! ** RUTINA PARA EL PRODUCTO DE MATRICES COMPLEJAS

! ** [c] = [a] [b]

n orden de las matrices cuadradas


a matriz de pre_producto
b matriz de post_producto
c matriz producto

! REALIZA EL PRODUCTO [a] [b]

DO i = 1, n
DO j = 1, n

DO k = 1, n
c(i,j) = c(i,j) + ZBUS(i,k) * YBUS(k,j)

END DO
END DO
END DO

DO i= 1, n
DO j= i, n

WRITE (24,22)i, j, c(i, j)


22 FORMAT(6X,'producto(',I2,',',I2,')=',F10.4,' + j',F10.4)
END DO

END DO

You might also like