ADDA > tool > read_chpoint.c > to read the file made by SaveIterChpoint() > v0.1-v0.4

```txt:My_Environment
Ubuntu 14.04 LTS Japanese Remix
on VMWare Fusion v8.5.2 (4635224)
on OS X El Captian v10.11.4

GNU bash, version 4.3.11(1)-release

gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4 
(also for g++)
ADDA v.1.3b6
```

This article is related to [ADDA (light scattering simulator based on the discrete dipole approximation)](https://github.com/adda-team/adda/).

Related: [ADDA > runtime parameter > grid > Sets dimensions of the computation grid](http://qiita.com/7of9/items/9537252c79f5318d8f55)
Related: [ADDA > chp_time > used to trigger SaveIterChpoint() > chp_time / chpoint](http://qiita.com/7of9/items/4966f131d405cd89ee07)

### v0.1

Work in progress.

```read_chpoint.c
#include <stdio.h>
#include <stdlib.h>

/*
v0.1 Nov. 30, 2016
	- add read_chpoint_file();
*/

static void read_chpoint_file(char *filename)
{
	int ind_m;
	size_t local_nRows;
	FILE *rdfp;

	rdfp = fopen(filename, "rb");
	if (rdfp == NULL) {
		printf("ERROR: file is not found\r\n");
		return;
	}
	fread(&ind_m,sizeof(int),1,rdfp);
	fread(&local_nRows, sizeof(size_t), 1, rdfp);
	fclose(rdfp);

	printf("ind_m:%d\r\n", ind_m);
	printf("local_nRows:%zu\r\n", local_nRows);
}

int main(int argc, char *argv[])
{
//	printf("argc=%d\n", argc);
	char *filename;

	if (argc < 2) {
		printf("ERROR: chpoint file is not specified\r\n");
		printf("   [cmd] [chpoint file]\r\n");
		exit(1);
	}

	read_chpoint_file(argv[1]);
}
```

```txt:run
$ gcc read_chpoint.c
$ ./a.out  LN-CHP 
ind_m:5
local_nRows:27984
```

### v0.3

```read_chpoint.c
#include <stdio.h>
#include <stdlib.h>

/*
v0.3 Dec. 14, 2016
    - read [sc_N],[sc_size],[vec_N],[vec_size]
    - add [auxiliary] file read option
v0.2 Dec. 14, 2016
    - read [niter],[counter],[inprodR],[prev_err],[resid_scale]
v0.1 Nov. 30, 2016
    - add read_chpoint_file();
*/

static void read_chpoint_file(char *chpFilename, char *auxFilename)
{
    int ind_m; // index of iterative method
    size_t local_nRows; // number of local rows of decomposition (only real dipoles)
    int niter; // iteration count
    int counter; // number of successive iterations without residual decrease
    double inprodR; // used as |r_0|^2 and best squared norm of residual up to some iteration
    double prev_err; // previous relative error; used in ProgressReport, initialized in IterativeSolver
    double resid_scale; // scale to get square of relative error
    //
    #define MAX_SIZE (20) // 20: arbitrary
    int sc_N; // 
    int sc_size[MAX_SIZE]; //
    int vec_N; // 
    int vec_size[MAX_SIZE]; // 
    //
    FILE *chpfp; // checkpoint file
    FILE *auxfp; // auxiliary file
    // 
    int idx; // for loop

    chpfp = fopen(chpFilename, "r");
    if (chpfp == NULL) {
        printf("ERROR: checkpoint file is not found\r\n");
        return;
    }
    auxfp = fopen(auxFilename, "r");
    if (auxfp == NULL) {
        printf("ERROR: auxiliary file is not found\r\n");
        return;
    }

    fread(&ind_m,sizeof(int),1,chpfp);
    fread(&local_nRows, sizeof(size_t), 1, chpfp);
    fread(&niter,sizeof(int),1,chpfp);
    fread(&counter,sizeof(int),1,chpfp);
    fread(&inprodR,sizeof(double),1,chpfp);
    fread(&prev_err,sizeof(double),1,chpfp);
    fread(&resid_scale,sizeof(double),1,chpfp);
    //
    fread(&sc_N, sizeof(int), 1, auxfp);
    fread(&sc_size[0], sizeof(int), sc_N, auxfp);
    fread(&vec_N, sizeof(int), 1, auxfp);
    fread(&vec_size[0], sizeof(int), vec_N, auxfp);
    //
    fclose(chpfp);
    fclose(auxfp);

    printf("ind_m:%d\r\n", ind_m);
    printf("local_nRows:%zu\r\n", local_nRows);
    printf("niter:%d\r\n", niter);
    printf("counter:%d\r\n", counter);
    printf("inprodR:%.3f\r\n", inprodR);
    printf("prev_err:%.3f\r\n", prev_err);
    printf("resid_scale:%.3f\r\n", resid_scale);
    //
    printf("sc_N:%d\r\n", sc_N);
    for(idx=0; idx<sc_N; idx++) {
        printf("sc_size[]:%d\r\n", sc_size[idx]);
    }
    printf("vec_N:%d\r\n", vec_N);
    for(idx=0; idx<vec_N; idx++) {
        printf("vec_size[]:%d\r\n", vec_size[idx]);
    }   
}

int main(int argc, char *argv[])
{
//  printf("argc=%d\n", argc);
    char *filename;

    if (argc < 3) {
        printf("ERROR: chpoint file is not specified\r\n");
        printf("   [cmd] [chpoint file] [auxiliary file]\r\n");
        exit(1);
    }

    read_chpoint_file(/*chpFilename=*/argv[1], /*auxFilename=*/argv[2]);
}
```

```txt:run
$ ln -fs seq/chpoint/chp.0 LN-CHP
$ ln -fs seq/chpoint/aux.0 LN-AUX

$ gcc read_chpoint.c

$ ./a.out  LN-CHP LN-AUX
ind_m:5
local_nRows:27984
niter:187
counter:117
inprodR:4.317
prev_err:0.321
resid_scale:0.020
sc_N:8
sc_size[]:8
sc_size[]:8
sc_size[]:8
sc_size[]:8
sc_size[]:16
sc_size[]:16
sc_size[]:16
sc_size[]:16
vec_N:3
vec_size[]:16
vec_size[]:16
vec_size[]:16
```

where, the size 8 means [double] type while the 16 means [double complex] type based on the ADDA source code.

### v0.4

```read_chpoint.c
#include <stdio.h>
#include <stdlib.h>
#include <complex.h>

/*
v0.4 Dec. 17, 2016
    - read vectors[]
    - read [xvec],[rvec],[pvec]
    - read scalars[]
v0.3 Dec. 14, 2016
    - read [sc_N],[sc_sizes],[vec_N],[vec_sizes]
    - add [auxiliary] file read option
v0.2 Dec. 14, 2016
    - read [niter],[counter],[inprodR],[prev_err],[resid_scale]
v0.1 Nov. 30, 2016
    - add read_chpoint_file();
*/

#define SIZE_DOUBLE (8)
#define SIZE_DCOMPLEX (16)

static void read_chpoint_file(char *chpFilename, char *auxFilename)
{
    int ind_m; // index of iterative method
    size_t local_nRows; // number of local rows of decomposition (only real dipoles)
    int niter; // iteration count
    int counter; // number of successive iterations without residual decrease
    double inprodR; // used as |r_0|^2 and best squared norm of residual up to some iteration
    double prev_err; // previous relative error; used in ProgressReport, initialized in IterativeSolver
    double resid_scale; // scale to get square of relative error
    //
    #define MAXNUM_SIZEINFO (20) // 20: arbitrary
    int sc_N; // the number of scalars' sizes
    int sc_sizes[MAXNUM_SIZEINFO]; // scalars' sizes
    int vec_N; // the number of vercotrs' sizes
    int vec_sizes[MAXNUM_SIZEINFO]; // vectors' sizes
    //
    #define MAXNUM_SCALARS (20) // 20: arbitrary
    double complex scalars[MAXNUM_SCALARS];
    //
    #define MAXNUM_XRP_VECTORS (30000) // 30000: arbitrary
    double complex xvec[MAXNUM_XRP_VECTORS]; // total electric field on the dipoles
    double complex rvec[MAXNUM_XRP_VECTORS]; // current residual
    double complex pvec[MAXNUM_XRP_VECTORS]; // polarization of dipoles, also an auxiliary vector in iterative solvers
    #define MAXNUM_VECTORS (20) // 20: arbitrary
    double complex vectors[MAXNUM_VECTORS][MAXNUM_XRP_VECTORS];
    //
    FILE *chpfp; // checkpoint file
    FILE *auxfp; // auxiliary file
    // 
    int idx; // for loop (for C89)

    // 1. read from files
    chpfp = fopen(chpFilename, "r");
    if (chpfp == NULL) {
        printf("ERROR: checkpoint file is not found\r\n");
        return;
    }
    auxfp = fopen(auxFilename, "r");
    if (auxfp == NULL) {
        printf("ERROR: auxiliary file is not found\r\n");
        return;
    }

    fread(&ind_m,sizeof(int),1,chpfp);
    fread(&local_nRows, sizeof(size_t), 1, chpfp);
    fread(&niter,sizeof(int),1,chpfp);
    fread(&counter,sizeof(int),1,chpfp);
    fread(&inprodR,sizeof(double),1,chpfp);
    fread(&prev_err,sizeof(double),1,chpfp);
    fread(&resid_scale,sizeof(double),1,chpfp);
    //
    fread(&sc_N, sizeof(int), 1, auxfp);
    fread(&sc_sizes[0], sizeof(int), sc_N, auxfp);
    fread(&vec_N, sizeof(int), 1, auxfp);
    fread(&vec_sizes[0], sizeof(int), vec_N, auxfp);
    for(idx=0; idx<sc_N; idx++) {
        fread(&(scalars[idx]), sc_sizes[idx], 1, chpfp);
    }
    fread(xvec,sizeof(double complex),local_nRows,chpfp);
    fread(rvec,sizeof(double complex),local_nRows,chpfp);
    fread(pvec,sizeof(double complex),local_nRows,chpfp);
    for(idx=0; idx<vec_N; idx++) {
        fread(&(vectors[idx][0]), vec_sizes[idx], local_nRows, chpfp);
    }    
    //
    fclose(chpfp);
    fclose(auxfp);

    // 2. debug print
    printf("ind_m:%d\n", ind_m);
    printf("local_nRows:%zu\n", local_nRows);
    printf("niter:%d\n", niter);
    printf("counter:%d\n", counter);
    printf("inprodR:%.3f\n", inprodR);
    printf("prev_err:%.3f\n", prev_err);
    printf("resid_scale:%.3f\n", resid_scale);
    //
    printf("sc_N:%d\n", sc_N);
    for(idx=0; idx<sc_N; idx++) {
        printf("sc_sizes[]:%d\n", sc_sizes[idx]);
    }
    printf("vec_N:%d\n", vec_N);
    for(idx=0; idx<vec_N; idx++) {
        printf("vec_sizes[]:%d\n", vec_sizes[idx]);
    }   

    for(idx=0; idx<sc_N; idx++) {
        // debug print
        if (sc_sizes[idx] == SIZE_DCOMPLEX) {
            printf( "scalars:(%f,%f)\n", creal(scalars[idx]), cimag(scalars[idx]) );
        } else if (sc_sizes[idx] == SIZE_DOUBLE) {
            printf( "scalars:%f\n", creal(scalars[idx]) );
        } else {
            printf( "scalars: in other type\n" );
        }
    }

    for(idx=0; idx<5; idx++) { // only first 5 among 30000
        printf( "xvec:(%f,%f), rvec:(%f,%f), pvec:(%f,%f)\n", 
            creal(xvec[idx]), cimag(xvec[idx]),
            creal(rvec[idx]), cimag(rvec[idx]),
            creal(pvec[idx]), cimag(pvec[idx])
        );
    }

    for(idx=0; idx<vec_N; idx++) { // only first 3 among local_nRows
        printf( "vectors 1:(%f,%f), 2:(%f,%f), 3:(%f,%f)\n",
            creal(vectors[idx][0]), cimag(vectors[idx][0]),
            creal(vectors[idx][1]), cimag(vectors[idx][1]),
            creal(vectors[idx][2]), cimag(vectors[idx][2])
        );
    }
}

int main(int argc, char *argv[])
{
//  printf("argc=%d\n", argc);
    char *filename;

    if (argc < 3) {
        printf("ERROR: chpoint file is not specified\r\n");
        printf("   [cmd] [chpoint file] [auxiliary file]\r\n");
        exit(1);
    }

    read_chpoint_file(/*chpFilename=*/argv[1], /*auxFilename=*/argv[2]);
}
```

```txt:setting(to_avoid_core_dump)
$ ulimit -s unlimited
```

```
$ ln -fs seq/chpoint/chp.0 LN-CHP
$ ln -fs seq/chpoint/aux.0 LN-AUX
```
where `aux.0` is created using 
http://qiita.com/7of9/items/4e5b299ad405819af5f0

```txt:run
$ gcc read_chpoint.c && ./a.out LN-CHP LN-AUX 
ind_m:5
local_nRows:27984
niter:230
counter:160
inprodR:4.317
prev_err:0.316
resid_scale:0.020
sc_N:8
sc_sizes[]:8
sc_sizes[]:8
sc_sizes[]:8
sc_sizes[]:8
sc_sizes[]:16
sc_sizes[]:16
sc_sizes[]:16
sc_sizes[]:16
vec_N:3
vec_sizes[]:16
vec_sizes[]:16
vec_sizes[]:16
scalars:7.159807
scalars:12.236596
scalars:0.052110
scalars:0.038853
scalars:(2.581055,2.848436)
scalars:(-0.281006,0.239659)
scalars:(-0.800018,-0.597709)
scalars:(0.966484,-0.253771)
xvec:(0.000856,-0.000519), rvec:(-0.001961,0.001694), pvec:(-0.005346,0.005240)
xvec:(0.034051,0.088220), rvec:(0.004734,-0.019609), pvec:(0.021339,-0.016807)
xvec:(-0.004780,-0.003816), rvec:(0.005126,-0.004015), pvec:(0.015493,-0.013204)
xvec:(-0.000856,0.000519), rvec:(0.001961,-0.001694), pvec:(0.005346,-0.005240)
xvec:(0.034051,0.088220), rvec:(0.004734,-0.019609), pvec:(0.021339,-0.016807)
vectors 1:(-0.001543,-0.012333), 2:(0.076928,-0.018896), 3:(0.042558,0.058127)
vectors 1:(-0.085713,0.030229), 2:(0.307545,-0.248557), 3:(0.244432,-0.029081)
vectors 1:(-0.000710,0.000439), 2:(-0.005362,0.000514), 3:(0.003159,-0.007757)
```