# include # include # include # include "r8ss.h" int main ( ); void r8ss_dif2_test ( ); void r8ss_indicator_test ( ); void r8ss_mv_test ( ); void r8ss_print_test ( ); void r8ss_print_some_test ( ); void r8ss_random_test ( ); void r8ss_to_r8ge_test ( ); void r8ss_zeros_test ( ); /******************************************************************************/ int main ( ) /******************************************************************************/ /* Purpose: MAIN is the main program for R8SS_TEST. Discussion: R8SS_TEST tests R8SS. Licensing: This code is distributed under the GNU LGPL license. Modified: 04 July 2016 Author: John Burkardt */ { timestamp ( ); printf ( "\n" ); printf ( "R8SS_TEST\n" ); printf ( " C version\n" ); printf ( " Test the R8SS library.\n" ); r8ss_dif2_test ( ); r8ss_indicator_test ( ); r8ss_mv_test ( ); r8ss_print_test ( ); r8ss_print_some_test ( ); r8ss_random_test ( ); r8ss_to_r8ge_test ( ); r8ss_zeros_test ( ); /* Terminate. */ printf ( "\n" ); printf ( "R8SS_TEST\n" ); printf ( " Normal end of execution.\n" ); printf ( "\n" ); timestamp ( ); return 0; } /******************************************************************************/ void r8ss_dif2_test ( ) /******************************************************************************/ /* Purpose: R8SS_DIF2_TEST tests R8SS_DIF2. Licensing: This code is distributed under the GNU LGPL license. Modified: 01 July 2016 Author: John Burkardt */ { double *a; int *diag; int i; int n = 5; int na; printf ( "\n" ); printf ( "R8SS_DIF2_TEST\n" ); printf ( " R8SS_DIF2 returns a second difference matrix in R8SS format,\n" ); printf ( "\n" ); printf ( " Matrix order N = %d\n", n ); /* Set the matrix. */ diag = ( int * ) malloc ( n * sizeof ( int ) ); a = ( double * ) malloc ( ( 2 * n - 1 ) * sizeof ( double ) ); r8ss_dif2 ( n, &na, diag, a ); printf ( "\n" ); printf ( " Number of nonzero entries stored is %d\n", na ); printf ( "\n" ); printf ( " Diagonal storage indices:\n" ); printf ( "\n" ); for ( i = 0; i < n; i++ ) { printf ( "%6d %d\n", i + 1, diag[i] ); } r8ss_print ( n, na, diag, a, " The R8SS matrix:" ); free ( a ); free ( diag ); return; # undef N } /******************************************************************************/ void r8ss_indicator_test ( ) /******************************************************************************/ /* Purpose: R8SS_INDICATOR_TEST tests R8SS_INDICATOR. Licensing: This code is distributed under the GNU LGPL license. Modified: 01 July 2016 Author: John Burkardt */ { double *a; int *diag; int n = 5; int na; printf ( "\n" ); printf ( "R8SS_INDICATOR_TEST\n" ); printf ( " R8SS_INDICATOR sets up an R8SS indicator matrix.\n" ); printf ( "\n" ); printf ( " Matrix order N = %d\n", n ); diag = ( int * ) malloc ( n * sizeof ( int ) ); a = r8ss_indicator ( n, &na, diag ); r8ss_print ( n, na, diag, a, " The R8SS indicator matrix:" ); free ( a ); free ( diag ); return; } /******************************************************************************/ void r8ss_mv_test ( ) /******************************************************************************/ /* Purpose: R8SS_MV_TEST tests R8SS_MV. Licensing: This code is distributed under the GNU LGPL license. Modified: 11 April 2013 Author: John Burkardt */ { double *a; double *a_r8ge; double *b; double *b_r8ge; int *diag; int i; int ij; int ilo; int j; int n = 5; int na; int seed = 123456789; double *x; printf ( "\n" ); printf ( "R8SS_MV_TEST\n" ); printf ( " R8SS_MV computes A*x for an R8SS matrix.\n" ); printf ( "\n" ); printf ( " Matrix order N = %d\n", n ); /* Set the matrix. */ diag = ( int * ) malloc ( n * sizeof ( int ) ); a = r8vec_zeros_new ( ( n * ( n + 1 ) ) / 2 ); r8ss_random ( n, &na, diag, a, &seed ); /* Replace the random entries by marker values. */ ij = 0; for ( j = 0; j < n; j++ ) { if ( j == 0 ) { ilo = 0; } else { ilo = j + 1 - ( diag[j] - diag[j-1] ); } for ( i = ilo; i <= j; i++ ) { a[ij] = ( double ) ( 10 * ( i + 1 ) + ( j + 1 ) ); ij = ij + 1; } } /* Print. */ printf ( "\n" ); printf ( " Number of nonzero entries stored is %d\n", na ); i4vec_print ( n, diag, " Diagonal storage indices:" ); r8ss_print ( n, na, diag, a, " The R8SS matrix:" ); /* Copy the matrix into a general matrix. */ a_r8ge = r8ss_to_r8ge ( n, na, diag, a ); /* Set the vector X. */ x = r8vec_indicator1_new ( n ); /* Compute the product. */ b = r8ss_mv ( n, na, diag, a, x ); /* Compute the product using the general matrix. */ b_r8ge = r8ge_mv ( n, n, a_r8ge, x ); /* Compare the results. */ r8vec2_print ( n, b, b_r8ge, " R8SS_MV verse R8GE_MV" ); free ( a_r8ge ); free ( b ); free ( b_r8ge ); free ( diag ); free ( x ); return; # undef N } /******************************************************************************/ void r8ss_print_test ( ) /******************************************************************************/ /* Purpose: R8SS_PRINT_TEST tests R8SS_PRINT. Licensing: This code is distributed under the GNU LGPL license. Modified: 04 June 2016 Author: John Burkardt */ { # define N 5 double a[(N*(N+1))/2]; int diag[N]; int i; int na; int seed = 123456789; printf ( "\n" ); printf ( "R8SS_PRINT_TEST\n" ); printf ( " R8SS_PRINT prints an R8SS matrix.\n" ); printf ( "\n" ); printf ( " Matrix order N = %d\n", N ); /* Set the matrix. */ r8ss_random ( N, &na, diag, a, &seed ); printf ( "\n" ); printf ( " Number of nonzero entries stored is %d\n", na ); printf ( "\n" ); printf ( " Diagonal storage indices:\n" ); printf ( "\n" ); for ( i = 0; i < N; i++ ) { printf ( "%6d %d\n", i, diag[i] ); } r8ss_print ( N, na, diag, a, " The R8SS matrix:" ); return; # undef N } /******************************************************************************/ void r8ss_print_some_test ( ) /******************************************************************************/ /* Purpose: R8SS_PRINT_SOME_TEST tests R8SS_PRINT_SOME. Licensing: This code is distributed under the GNU LGPL license. Modified: 01 July 2016 Author: John Burkardt */ { double *a; int *diag; int i; int ij; int ilo; int j; int n = 9; int na; int seed = 123456789; printf ( "\n" ); printf ( "R8SS_PRINT_SOME_TEST\n" ); printf ( " R8SS_PRINT_SOME prints some of an R8SS matrix.\n" ); printf ( "\n" ); printf ( " Matrix order N = %d\n", n ); /* Set the matrix. */ diag = ( int * ) malloc ( n * sizeof ( int ) ); a = r8vec_zeros_new ( ( n * ( n + 1 ) ) / 2 ); r8ss_random ( n, &na, diag, a, &seed ); /* Replace the random entries by marker values. */ ij = 0; for ( j = 0; j < n; j++ ) { if ( j == 0 ) { ilo = 0; } else { ilo = j + 1 - ( diag[j] - diag[j-1] ); } for ( i = ilo; i <= j; i++ ) { a[ij] = ( double ) ( 10 * ( i + 1 ) + ( j + 1 ) ); ij = ij + 1; } } printf ( "\n" ); printf ( " Number of nonzero entries stored is %d\n", na ); i4vec_print ( n, diag, " Diagonal storage indices:" ); r8ss_print_some ( n, na, diag, a, 1, 0, 7, 4, " Rows 1-7, Cols 0:4" ); free ( a ); free ( diag ); return; } /******************************************************************************/ void r8ss_random_test ( ) /******************************************************************************/ /* Purpose: R8SS_RANDOM_TEST tests R8SS_RANDOM. Licensing: This code is distributed under the GNU LGPL license. Modified: 11 April 2013 Author: John Burkardt */ { # define N 5 double a[(N*(N+1))/2]; int diag[N]; int i; int na; int seed = 123456789; printf ( "\n" ); printf ( "R8SS_RANDOM_TEST\n" ); printf ( " R8SS_RANDOM produces a random R8SS matrix,\n" ); printf ( "\n" ); printf ( " Matrix order N = %d\n", N ); /* Set the matrix. */ r8ss_random ( N, &na, diag, a, &seed ); printf ( "\n" ); printf ( " Number of nonzero entries stored is %d\n", na ); printf ( "\n" ); printf ( " Diagonal storage indices:\n" ); printf ( "\n" ); for ( i = 0; i < N; i++ ) { printf ( "%6d %d\n", i + 1, diag[i] ); } r8ss_print ( N, na, diag, a, " The R8SS matrix:" ); return; # undef N } /******************************************************************************/ void r8ss_to_r8ge_test ( ) /******************************************************************************/ /* Purpose: R8SS_TO_R8GE_TEST tests R8SS_TO_R8GE. Licensing: This code is distributed under the GNU LGPL license. Modified: 01 July 2016 Author: John Burkardt */ { double *a; double *a_r8ge; int *diag; int i; int n = 5; int na; int seed = 123456789; printf ( "\n" ); printf ( "R8SS_TO_R8GE_TEST\n" ); printf ( " R8SS_TO_R8GE converts an R8SS matrix to R8GE format.\n" ); printf ( "\n" ); printf ( " Matrix order N = %d\n", n ); /* Set the matrix. */ diag = ( int * ) malloc ( n * sizeof ( int ) ); a = r8vec_zeros_new ( ( n * ( n + 1 ) ) / 2 ); r8ss_random ( n, &na, diag, a, &seed ); printf ( "\n" ); printf ( " Number of nonzero entries stored is %d\n", na ); printf ( "\n" ); printf ( " Diagonal storage indices:\n" ); printf ( "\n" ); for ( i = 0; i < n; i++ ) { printf ( "%6d %d\n", i + 1, diag[i] ); } r8ss_print ( n, na, diag, a, " The R8SS matrix:" ); a_r8ge = r8ss_to_r8ge ( n, na, diag, a ); r8ge_print ( n, n, a_r8ge, " The R8GE matrix:" ); free ( a_r8ge ); return; } /******************************************************************************/ void r8ss_zeros_test ( ) /******************************************************************************/ /* Purpose: R8SS_ZEROS_TEST tests R8SS_ZEROS. Licensing: This code is distributed under the GNU LGPL license. Modified: 01 July 2016 Author: John Burkardt */ { double *a; int diag[5] = { 0, 2, 5, 9, 14 }; int n = 5; int na; printf ( "\n" ); printf ( "R8SS_ZEROS_TEST\n" ); printf ( " R8SS_ZEROS sets up an R8SS zero matrix.\n" ); printf ( "\n" ); printf ( " Matrix order N = %d\n", n ); na = ( n * ( n + 1 ) ) / 2; a = r8ss_zeros ( n, na, diag ); r8ss_print ( n, na, diag, a, " The R8SS zero matrix:" ); free ( a ); return; }