github.com/Konstantin8105/c4go@v0.0.0-20240505174241-768bb1c65a51/scripts/gsl.sh (about)

     1  #!/bin/bash
     2  
     3  set -e
     4  
     5  go build
     6  
     7  mkdir -p ./testdata/
     8  
     9  
    10  
    11  # prepare variables
    12  	export C4GO_DIR=$GOPATH/src/github.com/Konstantin8105/c4go
    13  	export C4GO=$C4GO_DIR/c4go
    14  	export TEMP_FOLDER="./testdata/gsl"
    15  	export CFILE=$TEMP_FOLDER/gsl.c
    16  	export GOFILE=$TEMP_FOLDER/gsl.go
    17  
    18  # prepare C code
    19      if [ ! -d $TEMP_FOLDER ]; then
    20  		mkdir -p $TEMP_FOLDER
    21  		touch $CFILE 
    22  		echo '
    23  #include <stdio.h>
    24  #include <gsl/gsl_errno.h>
    25  #include <gsl/gsl_matrix.h>
    26  #include <gsl/gsl_odeiv2.h>
    27  
    28  int
    29  func (double t, const double y[], double f[],
    30        void *params)
    31  {
    32    (void)(t); /* avoid unused parameter warning */
    33    double mu = *(double *)params;
    34    f[0] = y[1];
    35    f[1] = -y[0] - mu*y[1]*(y[0]*y[0] - 1);
    36    return GSL_SUCCESS;
    37  }
    38  
    39  int
    40  jac (double t, const double y[], double *dfdy,
    41       double dfdt[], void *params)
    42  {
    43    (void)(t); /* avoid unused parameter warning */
    44    double mu = *(double *)params;
    45    gsl_matrix_view dfdy_mat
    46      = gsl_matrix_view_array (dfdy, 2, 2);
    47    gsl_matrix * m = &dfdy_mat.matrix;
    48    gsl_matrix_set (m, 0, 0, 0.0);
    49    gsl_matrix_set (m, 0, 1, 1.0);
    50    gsl_matrix_set (m, 1, 0, -2.0*mu*y[0]*y[1] - 1.0);
    51    gsl_matrix_set (m, 1, 1, -mu*(y[0]*y[0] - 1.0));
    52    dfdt[0] = 0.0;
    53    dfdt[1] = 0.0;
    54    return GSL_SUCCESS;
    55  }
    56  
    57  int
    58  main (void)
    59  {
    60    double mu = 10;
    61    gsl_odeiv2_system sys = {func, jac, 2, &mu};
    62  
    63    gsl_odeiv2_driver * d =
    64      gsl_odeiv2_driver_alloc_y_new (&sys, gsl_odeiv2_step_rk8pd,
    65                                    1e-6, 1e-6, 0.0);
    66    int i;
    67    double t = 0.0, t1 = 100.0;
    68    double y[2] = { 1.0, 0.0 };
    69  
    70    for (i = 1; i <= 100; i++)
    71      {
    72        double ti = i * t1 / 100.0;
    73        int status = gsl_odeiv2_driver_apply (d, &t, ti, y);
    74  
    75        if (status != GSL_SUCCESS)
    76          {
    77            printf ("error, return value=%d\n", status);
    78            break;
    79          }
    80  
    81        printf ("%.5e %.5e %.5e\n", t, y[0], y[1]);
    82      }
    83  
    84    gsl_odeiv2_driver_free (d);
    85    return 0;
    86  }
    87  ' > $CFILE
    88  	fi
    89  
    90  # remove go files from last transpilation
    91  	echo "***** remove go files"
    92  	rm -f $TEMP_FOLDER/*.go
    93  	rm -f $TEMP_FOLDER/*.app
    94  # ast 
    95  if [ "$1" == "-a" ]; then
    96  	$C4GO ast		-clang-flag="-lgsl  -lgslcblas"  \
    97  					 $CFILE
    98  fi
    99  
   100  # transpilation 
   101  $C4GO transpile  -s           \
   102  	             -clang-flag="-lgsl  -lgslcblas"  \
   103  	             -o="$GOFILE" \
   104  				 $CFILE
   105  
   106  echo "Calculate warnings : $TEMP_FOLDER"
   107  # show warnings comments in Go source
   108  	WARNINGS=`cat $GOFILE | grep "^// Warning" | sort | uniq | wc -l`
   109  	echo "		After transpiling : $WARNINGS warnings."
   110  # show amount error from `go build`:
   111  	WARNINGS_GO=`go build -o $TEMP_FOLDER/gsl.app -gcflags="-e" $FILE 2>&1 | wc -l`
   112  	echo "		Go build : $WARNINGS_GO warnings"
   113  # amount unsafe
   114  	UNSAFE=`cat $GOFILE | grep "unsafe\." | wc -l`
   115  	echo "		Unsafe   : $UNSAFE"
   116  # amount Go code lines
   117  	LINES=`wc $GOFILE`
   118  	echo "(lines,words,bytes)	 : $LINES"
   119  # defers
   120  	DEFER=`cat $GOFILE | grep "defer func" | wc -l`
   121  	echo "defer func           	 : $DEFER"
   122  
   123  # Arguments menu
   124  echo "    -s for show detail of Go build errors"
   125  if [ "$1" == "-s" ]; then
   126  	# show go build warnings	
   127  		for f in $TEMP_FOLDER/*.go ; do
   128  			# iteration by Go files
   129  				echo "	file : $f"
   130  			# c4go warnings
   131  				cat $f | grep "^// Warning" | sort | uniq
   132  			# show amount error from `go build`:
   133  				go build -o $f.app -gcflags="-e" $f 2>&1 | sort 
   134  		done
   135  fi
   136