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