Последовательный и параллельный варианты программы. Теоретическое и практическое ускорение параллельной программы, страница 4

real*           IMVL_di;        // инвертированная диагональ

integer*        IMVL_col_ind;   // номера столбцов

integer*        IMVL_row_ptr;   // начала строк

real*         IMVL_Solve;     // решение СЛАУ

real*         IMVL_right;     // вектор правой части

integer         IMVL_end_list;  // конец списка

integer*        IMVL_list; // список

/***********************************************************

                   Определение методов

 ***********************************************************/

/***** Создание матрицы *****/

integer IMVL_CreateMatrix( integer Dimension,   // размер матрицы

                           integer DumpMemory,  // кусок памяти

                           real Epsilon         // точность

                         )

{

        /* Локальные перменные */

        integer i;

        /* Определяем точность */

        IMVL_EPS = Epsilon;

        /* Создаём память для программы */

        #ifdef __cplusplus

             IMVL_memory = new byte[DumpMemory];

        #else

             IMVL_memory = (byte *)malloc(DumpMemory);

        #endif

        /* Если памяти мало говорим об этом */

        if(IMVL_memory == NULL) return IMVL_OUT_OF_SPACE;

        /* Устанавливаем размер матрицы */

        IMVL_dim = Dimension;

        /* Подготавливаем список */

        IMVL_list = (integer *)IMVL_memory;

        IMVL_end_list = 2*IMVL_dim;

        for(i=0 ; i<IMVL_end_list ; i++) IMVL_list[i] = -1;

        /* Возвращаем успешное завершение */

        return IMVL_OK;

}

/***** Создание вектора *****/

real* IMVL_CreateVector(integer Dim)

{

    real *tptr = (real *)IMVL_start_ptr;

    IMVL_start_ptr += sizereal * Dim;

    return tptr;

}

/***** Создание элемента матрицы *****/

integer IMVL_CreateElement( integer i,  // номер строки

                            integer k   // номер столбца

                          )

{

        /* Локальные переменные */

        integer NextElem;

        /* Начало нужной строки */

        integer CurElem = 2*i;

        /* Пока не найдём будем искать */

        while(1)

        {

                /* Если последний элемент в списке и

                   он сам не последний*/

                if( IMVL_list[CurElem+1] == -1 &&

                    IMVL_list[CurElem] != k)

                {

                    /* Создаём элемент в списке */

                    IMVL_list[IMVL_end_list] = k;   

                    IMVL_list[IMVL_end_list+1] = -1;

                    /* Настраиваем указатель на созданный элемент */

                    IMVL_list[CurElem+1] = IMVL_end_list;

                    /* Меняем размер действительного списка */

                    IMVL_end_list += 2;

                    /* Элемент добавлен */

                    return IMVL_OK;

                }

                else

                {

                    /* Берём следующий элемент */

                    NextElem = IMVL_list[CurElem+1];

                    /* Если элемент между двумя соседями */

                    if( IMVL_list[CurElem] < k &&

                        IMVL_list[NextElem] > k)

                    {

                          /* Создаём элемент */

                          IMVL_list[IMVL_end_list] = k;

                          IMVL_list[IMVL_end_list+1] = NextElem;

                          /* Настраиваем указатель на новый элемент */

                          IMVL_list[CurElem+1] = IMVL_end_list;

                          /* Меняем размер действительного списка */

                          IMVL_end_list += 2;

                          /* Элемент добавлен */

                          return IMVL_OK;                 

                    }

                   else

                   {

                          /* Если элемент уже существует */