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_
Считаем, что сеть состоит из большого количества многополюсников и узлов, тогда для такой сети определим общее количество узлов 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,' в банке нет» и выходим из процедуры ОМП.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.