Ginkgo: The ginkgo-ranges program (original) (raw)

The ranges and accessor example..

Table of contents
Introduction About the example The commented program Results Comments about programming and debugging The plain program

Introduction

About the example

The commented program

a utility function for printing the factorization on screen

template

{

std::cout << std::setprecision(2) << std::fixed;

std::cout << "L = [";

for (int i = 0; i < A.length(0); ++i) {

std::cout << "\n ";

for (int j = 0; j < A.length(1); ++j) {

std::cout << (i > j ? A(i, j) : (i == j) * 1.) << " ";

}

}

std::cout << "\n]\n\nU = [";

for (int i = 0; i < A.length(0); ++i) {

std::cout << "\n ";

for (int j = 0; j < A.length(1); ++j) {

std::cout << (i <= j ? A(i, j) : 0.) << " ";

}

}

std::cout << "\n]" << std::endl;

}

int main(int argc, char* argv[])

{

using ValueType = double;

using IndexType = int;

Print version information

Create some test data, add some padding just to demonstrate how to use it with ranges. clang-format off

ValueType data[] = {

2., 4., 5., -1.0,

4., 11., 12., -1.0,

6., 24., 24., -1.0

};

clang-format on

Create a 3-by-3 range, with a 2D row-major accessor using data as the underlying storage. Set the stride (a.k.a. "LDA") to 4.

use the LU factorization routine defined above to factorize the matrix

print the factorization on screen

Results

This is the expected output:

L = [

1.00 0.00 0.00

2.00 1.00 0.00

3.00 4.00 1.00

]

U = [

2.00 4.00 5.00

0.00 3.00 2.00

0.00 0.00 1.00

]

Comments about programming and debugging

The plain program

#include

#include

#include <ginkgo/ginkgo.hpp>

template

{

const auto trail = span{i + 1, A.length(0)};

A(trail, i) = A(trail, i) / A(i, i);

A(trail, trail) = A(trail, trail) - mmul(A(trail, i), A(i, trail));

}

}

template

{

std::cout << std::setprecision(2) << std::fixed;

std::cout << "L = [";

for (int i = 0; i < A.length(0); ++i) {

std::cout << "\n ";

for (int j = 0; j < A.length(1); ++j) {

std::cout << (i > j ? A(i, j) : (i == j) * 1.) << " ";

}

}

std::cout << "\n]\n\nU = [";

for (int i = 0; i < A.length(0); ++i) {

std::cout << "\n ";

for (int j = 0; j < A.length(1); ++j) {

std::cout << (i <= j ? A(i, j) : 0.) << " ";

}

}

std::cout << "\n]" << std::endl;

}

int main(int argc, char* argv[])

{

using ValueType = double;

using IndexType = int;

ValueType data[] = {

2., 4., 5., -1.0,

4., 11., 12., -1.0,

6., 24., 24., -1.0

};

auto A =

factorize(A);

print_lu(A);

}