#include <iostream>
#include <petsc.h>
#include <petscmat.h> 
#include <private/matimpl.h>
#include <private/aij.h>

main(int argc,char* argv[])
{
    /* varibales */
    int i = 0 ;
    Mat A;
    PetscInt M=8, N=8 ;
    PetscErrorCode ierr;

	ierr = PetscInitialize(&argc,&argv,NULL,NULL); CHKERRQ(ierr);
	
    ierr = MatCreate(PETSC_COMM_WORLD,&A); CHKERRQ(ierr); 
    ierr = MatSetSizes(A,M,N,M,N); CHKERRQ(ierr);
    ierr = MatSetType(A, MATSEQAIJ); CHKERRQ(ierr);

    /* inset values the slow way!! */
    ierr = MatSetValue(A, 0, 1, 0.1, INSERT_VALUES); CHKERRQ(ierr);
    ierr = MatSetValue(A, 0, 5, 0.5, INSERT_VALUES); CHKERRQ(ierr);
    ierr = MatSetValue(A, 0, 7, 0.7, INSERT_VALUES); CHKERRQ(ierr);

    ierr = MatSetValue(A, 1, 3, 1.1, INSERT_VALUES); CHKERRQ(ierr);
    ierr = MatSetValue(A, 1, 4, 1.2, INSERT_VALUES); CHKERRQ(ierr);

    ierr = MatSetValue(A, 2, 1, 1.7, INSERT_VALUES); CHKERRQ(ierr);
    ierr = MatSetValue(A, 2, 3, 1.9, INSERT_VALUES); CHKERRQ(ierr);
    ierr = MatSetValue(A, 2, 6, 2.2, INSERT_VALUES); CHKERRQ(ierr);

    ierr = MatSetValue(A, 3, 2, 2.6, INSERT_VALUES); CHKERRQ(ierr);
    ierr = MatSetValue(A, 3, 5, 2.9, INSERT_VALUES); CHKERRQ(ierr);
    ierr = MatSetValue(A, 3, 7, 3.1, INSERT_VALUES); CHKERRQ(ierr);

    ierr = MatSetValue(A, 4, 3, 3.5, INSERT_VALUES); CHKERRQ(ierr);
    ierr = MatSetValue(A, 4, 5, 3.7, INSERT_VALUES); CHKERRQ(ierr);

    ierr = MatSetValue(A, 5, 0, 4.0, INSERT_VALUES); CHKERRQ(ierr);
    ierr = MatSetValue(A, 5, 4, 4.4, INSERT_VALUES); CHKERRQ(ierr);
    ierr = MatSetValue(A, 5, 6, 4.6, INSERT_VALUES); CHKERRQ(ierr);

    ierr = MatSetValue(A, 6, 1, 4.9, INSERT_VALUES); CHKERRQ(ierr);
    ierr = MatSetValue(A, 6, 5, 5.3, INSERT_VALUES); CHKERRQ(ierr);
    ierr = MatSetValue(A, 6, 7, 5.5, INSERT_VALUES); CHKERRQ(ierr);

    ierr = MatSetValue(A, 7, 3, 5.9, INSERT_VALUES); CHKERRQ(ierr);
    ierr = MatSetValue(A, 7, 5, 6.1, INSERT_VALUES); CHKERRQ(ierr);

    ierr = MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr);
    ierr = MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr);

    int nz =21;
    Mat_SeqAIJ  *a = (Mat_SeqAIJ*)A->data;
    MatScalar *val = a->a;
    PetscInt  *ptr = a->i;
    PetscInt  *ind = a->j;

    for(i=0;i<M;i++)
        printf("ptr[%d] = %d\n",i,ptr[i]);

    for(i=0;i<nz;i++)
         printf("ind[%d] = %d\n",i,ind[i]);

    for(i=0;i<nz;i++)
        printf("val[%d]] = %lf\n",i,val[i]);

	PetscFinalize();	
}
