4.2 Интерфейсы представления данных

Выбор подходящего интерфейса для представления данных является важным моментом при написании программы с использованием hypre. Как отмечалось выше, каждый интерфейс предназначен для определенного класса задач. Hypre содержит четыре типа интерфейса:

Structured-Grid System Iterface подходит для решения задач на структурированных прямоугольных сетках с заданным шаблоном апроксимации. Сетки описаны с помощью глобального d-мерного индексного простанства. Решетка задается множеством индексов в центрах ячеек, описывающих их "нижний"и "верхние"углы. В каждом узле сетки можно задать только одну неизвестную. Скалярные данные сетки всегда связаны с центрами ячеек (в отличие от более общего интерфейса SStruct).


PIC


Рис. 4.1: Пример структурированной решетки


Semi-Structured-Grid System Interfaceпредназначен для решения задач на структурированных сетках, но имеющих неструктурированные участки. В каждом узле сетки можно задать несколько неизвестных. Например, блок-структурированные сетки, улучшенные структурированные адаптивные сетки.


PIC


Рис. 4.2: Система Semi-Structured решеток


FEI предназначен для представления данных в методе конечных элементов.

IJ это основной интерфейс с которым работают большинство решателей. Рассмотрим более детально интерфейс IJ. Матрица задается в распределенной форме следующим образом:

⌊    ⌋
  A0
|| A1 ||
|⌈  .. |⌉
   .
 AP- 1

где P – количество параллельно запущенных процессов. Рассмотрим пример создания матрицы:

    MPI_Comm comm; 
    HYPRE_IJMatrix ij_matrix; 
    HYPRE_ParCSRMatrix parcsr_matrix; 
    int ilower, iupper; 
    int jlower, jupper; 
    int nrows; 
    int *ncols; 
    int *rows; 
    int *cols; 
    double *values; 
    HYPRE_IJMatrixCreate(comm, ilower, iupper, jlower, jupper, &ij_matrix); 
    HYPRE_IJMatrixSetObjectType(ij_matrix, HYPRE_PARCSR); 
    HYPRE_IJMatrixInitialize(ij_matrix); 
    /* set matrix coefficients */ 
    HYPRE_IJMatrixSetValues(ij_matrix, nrows, ncols, rows, cols, values); 
    ... 
    /* add-to matrix cofficients, if desired */ 
    HYPRE_IJMatrixAddToValues(ij_matrix, nrows, ncols, rows, cols, values); 
    ... 
    HYPRE_IJMatrixAssemble(ij_matrix); 
    HYPRE_IJMatrixGetObject(ij_matrix, (void **) &parcsr_matrix);

Функция HYPRE_IJMatrixCreate создает объект матрицы, доступный в пределах коммуникатора comm. В качестве параметров передаются номера строк матрицы ilower и iupper, с которыми будет работать текущий процесс, предполагается что каждая строка содержится только в одном процессе. Параметры jlower и jupper определяющие разбиение матрицы по столбцам должны совпадать с ilower и iupper в случае квадратной матрицы.

Через вызов функции HYPRE_IJMatrixSetObjectType задается тип хранения разреженной матрицы. После вызова HYPRE_IJMatrixInitialize, которая выделяет память под матрицу, можно задавать значения элементов, после которого вызывается HYPRE_IJMatrixAssemble.

В следующем листинге показан пример создания вектора с использованием интерфейса IJ:

    MPI_Comm comm; 
    HYPRE_IJVector ij_vector; 
    HYPRE_ParVector par_vector; 
    int jlower, jupper; 
    int nvalues; 
    int *indices; 
    double *values; 
    HYPRE_IJVectorCreate(comm, jlower, jupper, &ij_vector); 
    HYPRE_IJVectorSetObjectType(ij_vector, HYPRE_PARCSR); 
    HYPRE_IJVectorInitialize(ij_vector); 
    /* set vector values */ 
    HYPRE_IJVectorSetValues(ij_vector, nvalues, indices, values); 
    ... 
    HYPRE_IJVectorAssemble(ij_vector); 
    HYPRE_IJVectorGetObject(ij_vector, (void **) &par_vector);

При вызове HYPRE_IJVectorCreate создается пустой вектор в коммуникаторе comm, так же как и при создании матрицы задаются индексы jlower и jupper. Функция HYPRE_IJVectorSetValues вызывается с параметрами nvalues – количество задаваемых элементов, values, indices – массив значений и индексов.