diff --git a/include/main.h b/include/main.h
index dfc04f7991a7c2f9241c10dca576c3648f53d43b..a78e860894ed1154a7dc302db5b3c24cba3ae1f0 100644
--- a/include/main.h
+++ b/include/main.h
@@ -456,6 +456,7 @@ int         HCHAMELEON_generate_matrix( cham_flttype_t flttype, int NB, int PQ[2
 					hmat_interface_t *hi );
 int          HCHAMELEON_destroy_matrix( HCHAM_desc_t *hdescA );
 hmat_info_t  HCHAMELEON_getinfo( HCHAM_desc_t *hdesc );
+void         HCHAMELEON_getrank( HCHAM_desc_t *hdesc, char *name );
 CHAM_desc_t *HCHAMELEON_uncompress_matrix( HCHAM_desc_t *hdesc );
 void         HCHAMELEON_lapmr( char forward, char trans, int nrhs,
 			       HCHAM_desc_t *hdesc,
diff --git a/src/hchameleon.c b/src/hchameleon.c
index 7d701637f71798a4cad5766a65bae51cd0427089..f21dc4fbbc12d022321c2ebfbfdbd0161006e3e9 100644
--- a/src/hchameleon.c
+++ b/src/hchameleon.c
@@ -10,6 +10,8 @@
 #include <coreblas.h>
 #include <pthread.h>
 
+static FILE *rankfile = NULL;
+
 /**
  * Detect if the tile is local or not
  */
@@ -414,6 +416,57 @@ hmat_info_t HCHAMELEON_getinfo( HCHAM_desc_t *hdesc )
   return ginfo;
 }
 
+static int
+HCHAMELEON_map_getrank( const CHAM_desc_t *desc,
+			cham_uplo_t uplo, int m, int n,
+			CHAM_tile_t *tile, void *op_args )
+{
+    size_t lr_size = -1;
+
+    switch( desc->dtyp ) {
+    case ChamComplexDouble:
+	lr_size = hmat_zcoefsize( tile->mat );
+	break;
+    case ChamComplexFloat:
+	lr_size = hmat_ccoefsize( tile->mat );
+	break;
+    case ChamRealDouble:
+	lr_size = hmat_dcoefsize( tile->mat );
+	break;
+    case ChamRealFloat:
+	lr_size = hmat_scoefsize( tile->mat );
+	break;
+    default:
+	fprintf( stderr, "ERROR: unknown data type to get compressed size\n" );
+    }
+
+    fprintf( rankfile, "%p;%p;%ld;%ld;%ld;%ld\n",
+	     op_args, tile, (long)m, (long)n,
+	     lr_size, (long)tile->m * (long)tile->n );
+
+    return 0;
+}
+
+void HCHAMELEON_getrank( HCHAM_desc_t *hdesc, char *name )
+{
+    cham_uplo_t uplo = symMatSolver ? ChamLower : ChamUpperLower;
+    char *rankfilename;
+
+    asprintf( &rankfilename, "initial_size_%s.csv", name );
+    rankfile = fopen( rankfilename, "w" );
+    free(rankfilename);
+
+    fprintf( rankfile, "matrix_ptr;tile_ptr;tile_m;tile_n;tile_lrsze;tile_frsze\n" );
+
+    CHAMELEON_map_Tile( uplo, hdesc->super,
+			HCHAMELEON_map_getrank, hdesc->hi );
+
+    fclose( rankfile );
+    rankfile = NULL;
+	
+    return;
+}
+
 void HCHAMELEON_lapmr( char forward, char trans, int nrhs,
                        HCHAM_desc_t *hdesc,
                        char *Bptr )
diff --git a/src/testHCHAMELEON.c b/src/testHCHAMELEON.c
index cfc81db79394ff25edf47490574e233ab9fc2cb6..a351bf59d851397b4b721e071dbed87bb9203ec8 100644
--- a/src/testHCHAMELEON.c
+++ b/src/testHCHAMELEON.c
@@ -79,6 +79,7 @@ int testHCHAMELEON(void) {
   // Assembly driven by chameleon
   HCHAM_desc_t hdescA;
   HCHAMELEON_generate_matrix( chameleonType, NB, dims, &hdescA, hi );
+  HCHAMELEON_getrank( &hdescA, "A" );
   temps_final = getTime ();
   temps_cpu = temps_final - temps_initial ;
 
@@ -124,8 +125,10 @@ int testHCHAMELEON(void) {
 	{
 	    HCHAM_desc_t hdescB;
 	    HCHAMELEON_generate_matrix( chameleonType, NB, dims, &hdescB, hi );
+	    HCHAMELEON_getrank( &hdescB, "B" );
 	    HCHAM_desc_t hdescC;
 	    HCHAMELEON_generate_matrix( chameleonType, NB, dims, &hdescC, hi );
+	    HCHAMELEON_getrank( &hdescC, "C" );
 
 	    /* ===================================================================================== */
 	    /* Appelle le produit mat.vec : A.rhs -> solHMAT */