Программа определения места повреждения на воздушной линии электропередачи, страница 15

use UnitName – Модуль  описания дескрипторов рабочих файлов

use Global – Модуль описания глобальных переменных

use Dimensio – Модуль  описания констант, задающих размерности гло­бальных массивов

use DamageLine – Модуль формирования матрицы Y поврежденного много­полюсника

use MSIMSL – Математическая  библиотека Фортрана

use Ynet – Модуль описания массивов, где хранится матрица Y сети

implicit none

private

public:: FaultLoc

real*4::X(2) – вектор искомых переменных

          Contains

subroutine FaultLoc(NumMPDam_ ,kindKZ_,Distance,R)

После того, как пользователь произвел заказ на расчет режима ОМП, запус­кается главная процедура определения места повреждения FaultLoc. Входными параметрами, которой являются: номер поврежденного многополюсника NumMPDam, вид короткого замыкания kindKZ. Выходными параметрами явля­ются: расстояние до места повреждения Distance и сопротивление короткого за­мыкания R.

При заказе на расчет режима ОМП для сколь угодно сложной сети должен указываться только один поврежденный многополюсник, при этом узлы сети должны иметь  тип IФ либо VФ (балансирующий узел). IФ – многофазный источник тока. Для каждой из его фаз задается модуль и угол подтекающего тока. Так как при наличии в сети узлов этих типов расчет режима сводится к решению системы линейных уравнений.

integer*2:: kfm,mpb,indi,AddMPforY,ZAns[allocatable](:)

real*4:: Distance,R

integer*4,parameter:: N=2 – количество переменных

integer*4::IBTYPE, MAXFCN

real*4::FTol, Fvalue, X(N), Xguess(N), XLB(N), XUB(N)

external BCPOL,FCN – Целевая функция

integer*2::NumMPDam_,KindKZ_

NumMPDam=NumMPDam_ 

KindKZ=KindKZ_

Считаем, что сеть состоит из большого количества многополюсников и уз­лов, тогда для такой сети определим общее количество узлов  kuz.

kuz = Uzel(0)

По определенному количеству узлов определим число фаз в узлах сети

kfs=Anb(kuz+1)-1 

Матрица сети Z хранится в упакованном виде для чего необходимо выде­лить память под следующие блоки:

 DiagZ – массив, в котором хранятся значения диагональных блоков мат­рицы Z.

Zn – наддиагональные блоки матрицы Z

Zv – поддиагональные блоки матрицы Z

NextZ – адрес, по которому хранится информация о следующем в столбце блока матрицы Z

AnbZ – адреса  начал блоков в массивах Zn,Zv

 IbsZ – индекс блочной строки матрицы Z

AnsZ – адреса начал блочных столбцов матрицы Z

Allocate (DiagZ(AnbD(Uzel(0)+1)-1),Zn(kZv),Zv(kZv),NextZ(kIbsZ), &

          AnbZ(kIbsZ),IbsZ(kIbsZ),AnsZ(kfs),stat=ier)

Если матрица Z сети сложна, то при выделении память код ошибки полу­чает не нулевое значение, тогда выводим пользователю следующее сообщение «Слишком сложна матрица Z сети.» и выходим из процедуры ОМП.

if (ier/=0) then

  call NoMemory('Слишком сложна матрица Z сети.')

  goto 99

end if

После того, как память под матрицу Z была выделена,  необходимо произ­вести расчёт скелета Y сети.

 Выделяем память под ZAns адреса начал блочных строк матрицы Z.

   Allocate(ZAns(nnn+1))

  Формируем скелета матрицы Y сети

  call ForYSk (Diag,Yv,Yn,ZAns,AnbD,ier)

 Если удалось сформировать скелет матрицы Y, то запускаем процедуру имитации её двойной факторизации. Это делается однажды, а не при каждом рас­чёте целевой функции в процессе её минимизации.

  if (ier==0) call DFakBS(Diag,Yv,Yn,ZAns,kZv,kIbsZ,ier)

    Deallocate(ZAns)

  if (ier/=0) goto 99         

По схемному номеру определим банковский номер неповрежденного мно­гополюсника матрица, которого хранится в Y файле. Для этого обращаемся к функции поиска INDI: аргументами которой являются

 CoctYM(1,1) - номер многополюсника для 1-й матрицы Y,

 CoctYM(0,1) - число матриц Y многополюсников в Y-файле,

 NumMPDam - пользовательский номер неповрежденного многополюсника, результатом же этой функции будет банковский номер матрицы Y неповрежден­ного многополюсника

  mpb=indi(Coctym(1,1),Coctym(0,1),NumMPDam)

Если окажется, что банковский номер матрицы Y неповрежденного много­полюсника меньше или равен нулю, то выводим пользователю сообщение: «'Mатрицы Y многополюсника',NumMPDam,' в банке нет» и выходим из проце­дуры ОМП.