Отчет о выполнении 1 этапа Государственного контракта № п 1116 от 26 августа 2009 г


Разработка головной С-программы для фортран-программы с большими массивами



страница11/17
Дата31.07.2016
Размер1.18 Mb.
ТипОтчет
1   ...   7   8   9   10   11   12   13   14   ...   17

4.3.1 Разработка головной С-программы для фортран-программы с большими массивами

Для того чтобы избежать резервирования чрезмерно большого суммарного объема оперативной памяти для размещения всех массивов во всех фортран-программах SNDA, следует запрашивать память динамически (т.е. только на время выполнения SA-процедуры). Для инсталляции фортран-программ, написанных на старой версии языка, программист должен подготовить С-заголовок, специальную головную программу, написанную на С, которая перед запуском фортран-программы запрашивает необходимую для нее память, а после ее завершения освобождает ее.

С-заголовок должен иметь точно такое же имя, как и соответствующая ему фортран программа с добавлением спереди символа подчеркивания (underline). Именно это имя должно быть указано и в menusa-файле и использоваться в скрипте для вызова SA-процедуры.

В случае, когда фортран программа не использует больших массивов, составление С-заголовка не является обязательным.

SA-процедура может быть целиком написана на языке С. В этом случае ее имя не должно начинаться с символа подчеркивания.

Ниже представлен пример начального фрагмента фортран программы с объявлением массивов и соответствующий С-заголовок:

SUBROUTINE SSD(stack,NFM,NXM,NYM,LM,IPM,

$ PK,ARC,X,Y,T, TREJ,WKOR,FLIST, CMFRC,CUGF,CREJF,

$ CMP,CMFR,CMS,CIMS,CRJM,CDGF,CGOLF,CLASS,CSTMFR,

$ OUTFILEW,OUTFILEB,OUTFILER,OUTFILEC)

C

INTEGER STACK(*),NFM,NXM,NYM,LM,IPM



REAL PK(IPM,LM,LM)

REAL ARC(IPM,LM,LM)

REAL X(LM),Y(LM),T(LM),TREJ(LM),AR(1),VR(1),WKOR(IPM)

REAL FLIST(NFM)

COMPLEX CMFR(LM),CMFRC(LM),CUGF(LM),CREJF(LM)

COMPLEX CMP(LM,LM),CRESF

COMPLEX CMS(LM,LM),CIMS(LM,LM),CRJM(LM,LM)

COMPLEX DW,DB,DR,DC,DWS,DBS,DRS,DCS,CDENOM

COMPLEX CGOLF(LM),CLASS(LM),CDGF(LM),CSTMFR(LM)

REAL OUTFILEW(NYM,NXM)

REAL OUTFILEB(NYM,NXM)

REAL OUTFILER(NYM,NXM)

REAL OUTFILEC(NYM,NXM)

CHARACTER*80 TEXT

CHARACTER*40 COOFILE

/************* C-HEADER FOR SSD FORTRAN PROCEDURE *******/

#include

#include

#define NFM 3/* MAX QUANTATY OF FREQUENCIES BEING USED*/

#define NXM 101/* MAX QUANTATY OF X-POINTS FOR SCANNING */

#define NYM 101/* MAX QUANTATY OF Y-POINTS FOR SCANNING */

#define LM 25/* MAX NUMBER OF CHANNELS BEING PROCESSED */

#define IPM 16/* MAX DEGREE OF AR AND/OR MA MODELS */

void_ssd(stack) int *stack;

{

int nfm=NFM, nxm=NXM, nym=NYM, lm=LM,ipm = IPM; int i;



char *PK,*ARC,*X,*Y,*T, *TREJ,*WKOR,*FLIST,*CMFRC,*CUGF,*CREJF,

*CMP,*CMFR,*CMS,*CIMS,*CRJM,*CDGF,*CGOLF,*CLASS,*CSTMFR,

*OUTFILEW,*OUTFILEB,*OUTFILER,*OUTFILEC;

/* -------------------------------------------------------------------------------------------------*/

PK=malloc(IPM*LM*LM * 4); clearmem(PK);

ARC=malloc(IPM*LM*LM * 4); clearmem(ARC);

X=malloc(LM * 4); clearmem(X);

Y=malloc(LM * 4); clearmem(Y);

T=malloc(LM * 4); clearmem(T);

TREJ=malloc(LM * 4); clearmem(TREJ);

WKOR=malloc(IPM * 4); clearmem(WKOR);

FLIST=malloc(NFM * 4); clearmem(FLIST);

CMFRC=malloc(LM * 8); clearmem(CMFRC);

CUGF=malloc(LM * 8); clearmem(CUGF);

CREJF=malloc(LM * 8); clearmem(CREJF);

CMP=malloc(LM * LM * 8); clearmem(CMP);

CMFR=malloc(LM * 8); clearmem(CMFR);

CMS=malloc(LM * LM * 8); clearmem(CMS);

CIMS=malloc(LM * LM * 8); clearmem(CIMS);

CRJM=malloc(LM * LM * 8); clearmem(CRJM);

CDGF = malloc(LM * 8); clearmem(CDGF);

CGOL = malloc(LM * 8); clearmem(CGOLF);

CLAS=malloc(LM * 8); clearmem(CLASS);

CSTMFR=malloc(LM * 8); clearmem(CSTMFR);

OUTFILEW=malloc(NYM*NXM * 4); clearmem(OUTFILEW);

OUTFILEB=malloc(NYM*NXM * 4); clearmem(OUTFILEB);

OUTFILER=malloc(NYM*NXM * 4); clearmem(OUTFILER);

OUTFILEC=malloc(NYM*NXM * 4); clearmem(OUTFILEC);

ssd_(stack,&nfm,&nxm,&nym,&lm,&ipm,

PK,ARC,X,Y,T,TREJ,WKOR,FLIST,CMFRC,CUGF,CREJF,

CMP,CMFR,CMS,CIMS,CRJM,CDGF,CGOLF,CLASS,CSTMFR,

OUTFILEW,OUTFILEB,OUTFILER,OUTFILEC);


free(PK); free(ARC); free(X); free(Y); free(T); free(TREJ);

free(WKOR); free(FLIST); free(CMFRC); free(CUGF); free(CREJF); free(CMP);

free(CMFR); free(CMS); free(CIMS); free(CRJM); free(CDGF); free(CGOLF);

free(CLASS);free(CSTMFR);free(OUTFILEW); free(OUTFILEB);

free(OUTFILER); free(OUTFILEC);

}

4.3.2 Системные вызовы для доступа к данным стека


Имеются две пары системных программ взаимодействия со стеком. Первая пара (READMX, WRITEMX) интерпретирует передаваемые данные как ФОРТРАН-матрицу, в которой в качестве строк выступают трассы. Обращение к программе WRITEMX (Писать матрицу) имеет вид:


CALL WRITEMX (STACK,DATA,MAXNCHAN,MAXNPOINT,NCHAN,NPOINT,

+ CHLBL, TIME, TIMEMS,SAMIN, CHNPNT,HISTORY,FUNCSYM)

где:


INTEGER STACK

Системный параметр передаваемый в SA-процедуру из внешней программы

REAL DATA (MAXNCHAN,MAXNPOINT)

Зарезервированная матрица, рассчитанная на максимальное число каналов и максимальную длину трассы

INTEGER MAXNCHAN,MAXNPOINT

Размерность максимальной матрицы

INTEGER NCHAN,NPOINT

Размерность передаваемой матрицы

CHARACTER*12 CHLBL(MAXNCHAN)

Массив имен каналов

INTEGER TIME(MAXNCHAN)

Массив начальных времен трасс в секундах, отсчитываемых с начала 1970 года (Эпохальное время)

INTEGER TIMEMS(MAXNCHAN)

Массив положительных поправок в миллисекундах к Эпохальному времени

REAL SAMIN(MAXNCHAN)

Массив интервалов между отсчетами

INTEGER CHNPNT

Массив количества отсчетов в каждой трассе

CHARACTER*8 HISTORY(MAXNCHAN)

Массив строк предыстории

CHARACTER*2 FUNCSYM(MAXNCHAN)

Массив символов, обозначающих текущую обработку

Обращение к программе READMX (Читать матрицу) имеет вид:


CALL READMX(STACK,CHANNELS,NCHAN,DATA,MAXNCHAN,MAXNPOINT,

+ CHLBL,TIME,TIMEMS,SAMIN,CHNPNT,HISTORY)

где:


INTEGER STACK

Системный параметр передаваемый в SA-процедуру из внешней программы

CHAR*80 CHANNELS

Входная строка с номерами каналов

INTEGER NCHAN


Возвращаемое значение числа фактически прочитанных каналов

REAL DATA (MAXNCHAN,MAXNPOINT

Зарезервированная матрица, рассчитанная на максимальное число каналов и максимальную длину трассы

INTEGER MAXNCHAN,MAXNPOINT

Размерность максимальной матрицы

CHARACTER*12 CHLBL (MAXNCHAN)

Возвращаемый массив имен каналов

INTEGER TIME(MAXNCHAN)

Возвращаемый массив начальных времен трасс в секундах, отсчитываемых с начала 1970 года (Эпохальное время)

INTEGER TIMEMS(MAXNCHAN)

Возвращаемый массив положительных поправок в миллисекундах к Эпохальному времени

REAL SAMIN(MAXNCHAN)

Возвращаемый массив интервалов между отсчетами

INTEGER CHNPNT

Возвращаемый массив количества отсчетов в каждой трассе

CHARACTER*8 HISTORY(MAXNCHAN)

Возвращаемый массив строк предыстории

Ниже представлена ФОРТРАН-программа TESTMX, предназначенная для тестирования системных функции чтения/записи Стека. Программа может быть использована в качестве шаблона при написании пользовательской ФОРТРАН ПО-процедуры.


SUBROUTINE TESTMX (STACK)

INTEGER STACK(*)

C ------------STACK - SYSTEM VARYABLE, transmitted from main C-program ---------

PARAMETER (MAXNCHAN=25)

PARAMETER (MAXNPOINT=20000)

C ------------------------------------------------------------------------------------------------

REAL DATA (MAXNCHAN,MAXNPOINT),SAMIN(MAXNCHAN)

INTEGER*4 NCHAN,TIME(MAXNCHAN),TIMEMS(MAXNCHAN)

INTEGER*4 CHNPNT(MAXNCHAN)

CHARACTER*80 CHANNELS

CHARACTER*12 CHLBL(MAXNCHAN)

CHARACTER*8 HISTORY(MAXNCHAN)

CHARACTER*2 FUNCSYM(MAXNCHAN)

C-------------------------- READ DATA FROM INPUT FILE -------------------------

OPEN(21,FILE='inp/testmx.inp',STATUS='OLD')

READ(21,'(A)')TEXT

READ(21,'(A)')TEXT

READ(21,'(A)')CHANNELS

CLOSE(21)

PRINT *,'string CHANNELS FROM INPUT FILE= ',CHANNELS

C--------------------- READ TRACES FROM STACK INTO MATRIX DATA---------------------

CALL READMX (STACK,CHANNELS,NCHAN,DATA,MAXNCHAN,MAXNPOINT,

+ CHLBL,TIME,TIMEMS,SAMIN,CHNPNT,HISTORY)
C -----------------------------------------UNPUT DATA ----------------------------------------------------

C STACK - SYSTEM VARYABLE, transmitted from main C-program

C CHARACTER*80 CHANNELS Input string with stack number channels

C -------------------------------FIELDS FOR RETURNED DATA --------------------------------------

C INTEGER*4 NCHAN Real amount of channels, that have been read

C REAL DATA (MAXNCHAN,MAXNPOINT) Users matrix

C INTEGER MAXNCHAN Dimension of matrix (channels)

C INTEGER MAXNPOINT Dimension of matrix (points)

C CHARACTER*12 CHLBL(MAXNCHAN) Array of labels(12 bytes)

C INTEGER*4 TIME(MAXNCHAN) Array of epoch times in sec

C INTEGER*4 TIMEMS(MAXNCHAN) Array of ms

C REAL SAMIN(MAXNCHAN) Array of sampling intervals in sec

C INTEGER*4 CHNPNT(MAXNCHAN) Array of numbers of samples

C CHARACTER*8 HISTORY(MAXNCHAN) Array of histories(8 bytes)

C CHARACTER*2 FUNCSYM(MAXNCHAN) Array of Symbol - notation of action,

C to be added to history

PRINT *,'We have read from stack NCHAN = ',NCHAN,'Channels'

do 10 I=1,3

PRINT *,'CHAN',I,':', (DATA(I,J),J=1,10)

10 CONTINUE

C--------------------- WRITE TRACES FROM MATRIX DATA TO STACK----------------

NPOINT = CHNPNT(1)


CALL WRITEMX (STACK,DATA,MAXNCHAN,MAXNPOINT,NCHAN,NPOINT,

+ CHLBL,TIME, TIMEMS,SAMIN,HISTORY,FUNCSYM)


C --------------------------------ONLY UNPUT DATA -------------------------------------

C STACK - SYSTEM VARYABLE, transmitted from main C-program

C REAL DATA (MAXNCHAN,MAXNPOINT) Users whole matrix

C INTEGER MAXNCHAN Dimension of whole matrix (channels)

C INTEGER MAXNPOINT Dimension of whole matrix (points)

C INTEGER NCHAN Amount of upper rows (channels) to be written

C INTEGER NPOINT Amount of points to be written

C CHARACTER*12 CHLBL(MAXNCHAN) Array of labels(12 bytes)

C INTEGER*4 TIME(MAXNCHAN) Array of epoch times in sec

C INTEGER*4 TIMEMS(MAXNCHAN) Array of ms

C REAL SAMIN(MAXNCHAN) Array of sampling intervals in sec

C CHARACTER*8 HISTORY(MAXNCHAN) Array of histories(8 bytes)

PRINT *,'We have written to stack NCHAN = ',NCHAN,'Channels'

PRINT *,'CHECK GRAPHIC WINDOW, PLEASE '

END
Другая группа программ (writest, readst, checkst) интерпретирует передаваемые данные как непрерывный одномерный массив чисел.

Программа WRITEST помещает в стек только одну трассу. При этом ей передается начальный адрес массива и количество отсчетов. Кроме того, как и в предыдущем случае, ей передаются элементы заголовка трассы. Вновь создаваемая трасса помещается в заданное место стека. Обращение к программе WRITEST (Писать в стек) имеет вид:


CALL WRITEST(STACK,DATA,CHLBL,TIME,TIMEMS,

* CHNDEL,CHNPNT,HISTORY,FUNCSYM,POS,RC)


где:


INTEGER STACK(*)

Системный параметр передаваемый в SA-процедуру из внешней программы

REAL DATA(MAXDTLN)

Одномерный массив данных

CHARACTER*12 CHNLBL

Имя канала

INTEGER TIME

Начальное время трассы в секундах, отсчитываемых с начала 1970 года (Эпохальное время)

INTEGER TIMEMS

Положительная поправка в миллисекундах

REAL CHNDEL

Интервал между отсчетами

INTEGER CHNPNT

Количество отсчетов

CHARACTER*8 HISTORY

Предыстория обработки трассы

CHARACTER*2 FUNCSYM

Символ, обозначающий текущую обработку

INTEGER POS

Позиция в стеке для размещения новой трассы. Если POS=0, трасса помещается в начало стека; Если POS > максимальнго номера в стеке, трасса помещается в конец стека

INTEGER RC

Код возврата: 0 - норма, 1 - неверен параметр POS.

Программа READST считывает из стека несколько трасс в соответствии со строчным параметром CHANNELS, который задается так же, как и в стековых командах. Трассы считываются в указанную в программе область памяти плотно без пропусков. При этом программа возвращает фактическое число прочитанных трасс и число отсчетов в каждой из них. Кроме того, программа возвращает другие элементы из заголовков трасс и помещает их в выделенные массивы. Обращение к программе READST (Читать из стека) имеет вид:


CALLREADST(STACK,CHANNELS,MAXDTLN,REALNCHAN,DATA,CHANPOS,

+ CHLBL,TIME,TIMEMS,CHNDEL,CHNPNT,HISTORY)


где входными являются только первых два параметра: STACK и CHANNELS. Все остальные параметры возвращаются программой READST:



INTEGER STACK(*)

Системный параметр, передаваемый в SA-процедуру из внешней программы

CHARACTER(80) CHANNELS

Список требуемых каналов

INTEGER REALNCHAN

Возвращаемое число фактически прочитанных каналов

INTEGER MAXDTLN

Максимальная длина данных. Если реальное количество запрошенных отсчетов превысит это значение программа выдает диагностическое сообщение и задача SNDA снимается.

REAL DATA(MAXDTLN)

Одномерный массив для приема данных

CHARACTER*12 CHLBL(MAXNCHAN)

Возвращаемый массив имен каналов

INTEGER TIME(MAXNCHAN)

Возвращаемый массив начальных времен трасс в секундах, отсчитываемых с начала 1970 года (Эпохальное время)

INTEGER TIMEMS(MAXNCHAN)

Массив положительных поправок в миллисекундах к Эпохальному времени

REAL SAMIN(MAXNCHAN)

Массив интервалов между отсчетами

INTEGER CHNPNT(MAXNCHAN)

Массив количества отсчетов в каждой трассе

CHARACTER*8 HISTORY(MAXNCHAN)

Массив строк предыстории

При запуске процедура проверяет общее количество запрошенных данных (отсчетов). Если это значение превышает параметр maxdtln то на консоль выдается аварийное сообщение и задание SNDA завершается.

Если язык программирования, примененный для написания SA-программы, имеет средства динамического выделения памяти, то программисту следует включить обращение к подпрограмме checkst перед тем, как выдать обращение к подпрограмме readst для того, чтобы оценить необходимую память и выдать на нее запрос.

Ниже представлено обращение к подпрограмме checkst.


CALL CHECKST (STACK,CHANNELS,SUMDLEN,REALNCHAN,

* CHLBL,TIME,TIMEMS,CHNDEL,CHNPNT,HISTORY)


Два первых параметра STACK, и CHANNELS, являются входными, значения остальных параметров возвращается подпрограммой CHECKST.


INTEGER STACK(*)

Системный параметр, передаваемый в SA-процедуру из внешней программы

CHARACTER(80) CHANNELS

Список требуемых каналов

INTEGER SUMDLEN

Возвращаемое значение суммарного количества запрошенных отсчетов

INTEGER REALNCHAN

Возвращаемое число фактически прочитанных каналов

CHARACTER*12 CHLBL(MAXNCHAN)

Массив имен каналов

INTEGER TIME(MAXNCHAN)

Возвращаемый массив начальных времен трасс в секундах, отсчитываемых с начала 1970 года (Эпохальное время)

INTEGER TIMEMS(MAXNCHAN)

Массив положительных поправок в миллисекундах к Эпохальному времени

REAL SAMIN(MAXNCHAN)

Массив интервалов между отсчетами

INTEGER CHNPNT(MAXNCHAN)

Массив количества отсчетов в каждой трассе

CHARACTER*8 HISTORY(MAXNCHAN

Массив строк предыстории

Нижеприведенная фортран программа testread разработана для тестирования системных подпрограмм writest, readst, и checkst. Эта программа может быть использована в качестве шаблона при разработке SA-процедур.


SUBROUTINE TESTREAD(STACK,MNCH,MAXDTLN,

* DATA,CHANPOS,TIME,TIMEMS,CHNPNT,CHNDEL, CHLBL,HISTORY)


INTEGER STACK(*)

C --- STACK - SYSTEM VARYABLE, transmitted from main C-program

C--- INTVL

C MNCH - MAXIMAL NUMBER OF CHANNELS

C MAXDTLN - MAXIMAL NUMBER OF DATA

С-----------------------------------------------------------------------------------------------

CHARACTER*80 CHANNELS

INTEGER*4 SUMDLEN

INTEGER*4 REALNCHAN

REAL DATA (MAXDTLN)

INTEGER*4 CHANPOS(MNCH)

CHARACTER*12 CHLBL(*)

INTEGER*4 TIME(MNCH)

INTEGER*4 TIMEMS(MNCH)

REAL CHNDEL(MNCH)

INTEGER*4 CHNPNT(MNCH)

CHARACTER*8 HISTORY(*)

CHARACTER*2 FUNCSYM

INTEGER*4 POS,RC

C===========================================================

C----------------------- READ DATA FROM INPUT FILE --------------------------------

OPEN(21,FILE='inp/testread.inp',STATUS='OLD')

READ(21,'(A)')TEXT

READ(21,'(A)')TEXT

READ(21,'(A)')CHANNELS

CLOSE(21)

C--------------------------- CHECK DATA IN STACK -------------------------------------
CALL CHECKST (STACK,CHANNELS,SUMDLEN,REALNCHAN,

* CHLBL,TIME,TIMEMS,CHNDEL,CHNPNT,HISTORY)


C_________________________________________________________________________

PRINT *,'SUM AMOUNTS OF POINTS: ',SUMDLEN

C-------------------------- READ TRACES FROM STACK -------------------------------------------

CALL READST (STACK,CHANNELS,MAXDTLN,REALNCHAN,DATA,CHANPOS,

* CHLBL,TIME,TIMEMS,CHNDEL,CHNPNT,HISTORY)
IF (REALNCHAN .EQ. 0) THEN

PRINT *,'TESTREAD: NO TRACES: '

RETURN

END IF


C_________________________________________________________________

PRINT *,'REALNCHAN: ',REALNCHAN

PRINT *,'DATA: ', (DATA(I),I=1,5)

PRINT *,'CHANPOS: ', (CHANPOS(I),I=1,2)

PRINT *,'CHLBL: ', (CHLBL(I),I=1,2)

PRINT *,'TIME: ', (TIME(I),I=1,2)

PRINT *,'TIMEMS: ', (TIMEMS(I),I=1,2)

PRINT *,'CHNDEL: ', (CHNDEL(I),I=1,2)

PRINT *,'CHNPNT: ', (CHNPNT(I),I=1,2)

PRINT *,'HISTORY: ', (HISTORY(I),I=1,2)

C-------------------- WRITE FIRST TWO TRACES INTO STACK ------------------

DO 10 I =1,REALNCHAN

FUNCSYM = 'W'

POS = 77


HISTORY(I) = 'his'
CALL WRITEST(STACK,DATA((I-1)*CHNPNT(1)+1),CHLBL(I),

* TIME(I),TIMEMS(I),CHNDEL(I),CHNPNT(I),HISTORY(I),

* FUNCSYM,POS,RC)
C POS - INTEGER VARIABLE - position in stack (from 1) after that

С channel data are saved:

C IF POS > MAX NUMBER OF STACK CHANNELS (9999) THEN TO WRITE TO

С THE END OF STACK.

C IF POS = 0 THEN TO WRITE TO THE BEGINNING OF STACK.

C IF POS < 0 THEN PROGRAM FAILS.

С RC - INTEGER VARIABLE - ,RETURN CODE 0 - OK , 1 - INVALID POS C

IF (RC .NE. 0) THEN

PRINT *,'WRITEST IS FAILED, ERROR POS: '

RETURN


END IF

10 CONTINUE

END


Каталог: docs -> otchety


Поделитесь с Вашими друзьями:
1   ...   7   8   9   10   11   12   13   14   ...   17


База данных защищена авторским правом ©uverenniy.ru 2019
обратиться к администрации

    Главная страница