• Stars
    star
    42
  • Rank 633,876 (Top 13 %)
  • Language
    Go
  • License
    MIT License
  • Created almost 6 years ago
  • Updated 9 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Transpiling fortran code to golang code

f4go

Build Status Go Report Card codecov GitHub license GoDoc Maintainability

Example of use

> # Install golang
> # Compile f4go
> go get -u github.com/Konstantin8105/f4go
> cd $GOPATH/src/github.com/Konstantin8105/f4go
> go build
> ./f4go ./testdata/blas/caxpy.f
> # Look on Go result source
> less ./testdata/blas/caxpy.go

Transpiling fortran code to golang code

Present result:

*> \brief \b CAXPY
*
*  =========== DOCUMENTATION ===========
*
* Online html documentation available at
*            http://www.netlib.org/lapack/explore-html/
*
*  Definition:
*  ===========
*
*       SUBROUTINE CAXPY(N,CA,CX,INCX,CY,INCY)
*
*       .. Scalar Arguments ..
*       COMPLEX CA
*       INTEGER INCX,INCY,N
*       ..
*       .. Array Arguments ..
*       COMPLEX CX(*),CY(*)
*       ..
*
*
*> \par Purpose:
*  =============
*>
*> \verbatim
*>
*>    CAXPY constant times a vector plus a vector.
*> \endverbatim
*
*  Arguments:
*  ==========
*
*> \param[in] N
*> \verbatim
*>          N is INTEGER
*>         number of elements in input vector(s)
*> \endverbatim
*>
*> \param[in] CA
*> \verbatim
*>          CA is COMPLEX
*>           On entry, CA specifies the scalar alpha.
*> \endverbatim
*>
*> \param[in] CX
*> \verbatim
*>          CX is COMPLEX array, dimension ( 1 + ( N - 1 )*abs( INCX ) )
*> \endverbatim
*>
*> \param[in] INCX
*> \verbatim
*>          INCX is INTEGER
*>         storage spacing between elements of CX
*> \endverbatim
*>
*> \param[in,out] CY
*> \verbatim
*>          CY is COMPLEX array, dimension ( 1 + ( N - 1 )*abs( INCY ) )
*> \endverbatim
*>
*> \param[in] INCY
*> \verbatim
*>          INCY is INTEGER
*>         storage spacing between elements of CY
*> \endverbatim
*
*  Authors:
*  ========
*
*> \author Univ. of Tennessee
*> \author Univ. of California Berkeley
*> \author Univ. of Colorado Denver
*> \author NAG Ltd.
*
*> \date November 2017
*
*> \ingroup complex_blas_level1
*
*> \par Further Details:
*  =====================
*>
*> \verbatim
*>
*>     jack dongarra, linpack, 3/11/78.
*>     modified 12/3/93, array(1) declarations changed to array(*)
*> \endverbatim
*>
*  =====================================================================
      SUBROUTINE CAXPY(N,CA,CX,INCX,CY,INCY)
*
*  -- Reference BLAS level1 routine (version 3.8.0) --
*  -- Reference BLAS is a software package provided by Univ. of Tennessee,    --
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
*     November 2017
*
*     .. Scalar Arguments ..
      COMPLEX CA
      INTEGER INCX,INCY,N
*     ..
*     .. Array Arguments ..
      COMPLEX CX(*),CY(*)
*     ..
*
*  =====================================================================
*
*     .. Local Scalars ..
      INTEGER I,IX,IY
*     ..
*     .. External Functions ..
      REAL SCABS1
      EXTERNAL SCABS1
*     ..
      IF (N.LE.0) RETURN
      IF (SCABS1(CA).EQ.0.0E+0) RETURN
      IF (INCX.EQ.1 .AND. INCY.EQ.1) THEN
*
*        code for both increments equal to 1
*
         DO I = 1,N
            CY(I) = CY(I) + CA*CX(I)
         END DO
      ELSE
*
*        code for unequal increments or equal increments
*          not equal to 1
*
         IX = 1
         IY = 1
         IF (INCX.LT.0) IX = (-N+1)*INCX + 1
         IF (INCY.LT.0) IY = (-N+1)*INCY + 1
         DO I = 1,N
            CY(IY) = CY(IY) + CA*CX(IX)
            IX = IX + INCX
            IY = IY + INCY
         END DO
      END IF
*
      RETURN
      END

Go code:

package main

//*> \brief \b CAXPY
//*
//*  =========== DOCUMENTATION ===========
//*
//* Online html documentation available at
//*            http://www.netlib.org/lapack/explore-html/
//*
//*  Definition:
//*  ===========
//*
//*       SUBROUTINE CAXPY(N,CA,CX,INCX,CY,INCY)
//*
//*       .. Scalar Arguments ..
//*       COMPLEX CA
//*       INTEGER INCX,INCY,N
//*       ..
//*       .. Array Arguments ..
//*       COMPLEX CX(*),CY(*)
//*       ..
//*
//*
//*> \par Purpose:
//*  =============
//*>
//*> \verbatim
//*>
//*>    CAXPY constant times a vector plus a vector.
//*> \endverbatim
//*
//*  Arguments:
//*  ==========
//*
//*> \param[in] N
//*> \verbatim
//*>          N is INTEGER
//*>         number of elements in input vector(s)
//*> \endverbatim
//*>
//*> \param[in] CA
//*> \verbatim
//*>          CA is COMPLEX
//*>           On entry, CA specifies the scalar alpha.
//*> \endverbatim
//*>
//*> \param[in] CX
//*> \verbatim
//*>          CX is COMPLEX array, dimension ( 1 + ( N - 1 )*abs( INCX ) )
//*> \endverbatim
//*>
//*> \param[in] INCX
//*> \verbatim
//*>          INCX is INTEGER
//*>         storage spacing between elements of CX
//*> \endverbatim
//*>
//*> \param[in,out] CY
//*> \verbatim
//*>          CY is COMPLEX array, dimension ( 1 + ( N - 1 )*abs( INCY ) )
//*> \endverbatim
//*>
//*> \param[in] INCY
//*> \verbatim
//*>          INCY is INTEGER
//*>         storage spacing between elements of CY
//*> \endverbatim
//*
//*  Authors:
//*  ========
//*
//*> \author Univ. of Tennessee
//*> \author Univ. of California Berkeley
//*> \author Univ. of Colorado Denver
//*> \author NAG Ltd.
//*
//*> \date November 2017
//*
//*> \ingroup complex_blas_level1
//*
//*> \par Further Details:
//*  =====================
//*>
//*> \verbatim
//*>
//*>     jack dongarra, linpack, 3/11/78.
//*>     modified 12/3/93, array(1) declarations changed to array(*)
//*> \endverbatim
//*>
//*  =====================================================================
func CAXPY(N *int, CA *complex128, CX *[]complex128, INCX *int, CY *[]complex128, INCY *int) {
	I := new(int)
	IX := new(int)
	IY := new(int)
	//*
	//*  -- Reference BLAS level1 routine (version 3.8.0) --
	//*  -- Reference BLAS is a software package provided by Univ. of Tennessee,    --
	//*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
	//*     November 2017
	//*
	//*     .. Scalar Arguments ..
	//*     ..
	//*     .. Array Arguments ..
	//*     ..
	//*
	//*  =====================================================================
	//*
	//*     .. Local Scalars ..
	//*     ..
	//*     .. External Functions ..
	//*     ..
	if (*(N)) <= 0 {
		return
	}
	if (*SCABS1((CA))) == 0.0e+0 {
		return
	}
	if (*(INCX)) == 1 && (*(INCY)) == 1 {
		//*
		//*        code for both increments equal to 1
		//*
		for (*I) = 1; (*I) <= (*(N)); (*I)++ {
			(*(CY))[(*I)-(1)] = (*(CY))[(*I)-(1)] + (*(CA))*(*(CX))[(*I)-(1)]
		}
	} else {
		//*
		//*        code for unequal increments or equal increments
		//*          not equal to 1
		//*
		(*IX) = 1
		(*IY) = 1
		if (*(INCX)) < 0 {
			(*IX) = (-(*(N))+1)*(*(INCX)) + 1
		}
		if (*(INCY)) < 0 {
			(*IY) = (-(*(N))+1)*(*(INCY)) + 1
		}
		for (*I) = 1; (*I) <= (*(N)); (*I)++ {
			(*(CY))[(*IY)-(1)] = (*(CY))[(*IY)-(1)] + (*(CA))*(*(CX))[(*IX)-(1)]
			(*IX) = (*IX) + (*(INCX))
			(*IY) = (*IY) + (*(INCY))
		}
	}
	//*
	return
}

Example of simplification Go code(comments removed for short view):

package main

func CAXPY(N int, CA *complex128, CX []complex128, INCX int, CY []complex128, INCY int) {
	var I int
	var IX int
	var IY int

	if N <= 0 {
		return
	}
	if (*SCABS1((CA))) == 0.0e+0 {
		return
	}
	if INCX == 1 && INCY == 1 {

		for I = 1; I <= N; I++ {
			CY[I-1] = CY[I-1] + CA*CX[I-1]
		}
	} else {

		IX = 1
		IY = 1
		if INCX < 0 {
			IX = (-N+1)*INCX + 1
		}
		if INCY < 0 {
			IY = (-N+1)*INCY + 1
		}
		for I = 1; I <= N; I++ {
			CY[IY-1] = CY[IY-1] + CA*CX[IX-1]
			IX = IX + INCX
			IY = IY + INCY
		}
	}

	return
}

Notes

Fortran 77 Golang
all arguments of function are pointers ?
all arguments of intrisic function are pointers ?
all internal function variables are pointers ?

IDENT:

  • constants
  • arrays, matrixes

Operations:

  • assign
  • initialization
  • boolean

Fortran test sources

More Repositories

1

Effective_Go_RU

Перевод - Эффективный Go
HTML
701
star
2

c4go

Transpiling C code to Go code
C
352
star
3

DDoS

DDoS attack. Creating infinite http GET requests.
Go
142
star
4

Go-pipelines

Перевод https://blog.golang.org/pipelines
Go
46
star
5

Contribution_Guide_RU

Перевод "Руководство сотрудничества" https://golang.org/doc/contribute.html
HTML
14
star
6

Matrix-Multiply-Part1

Optimization of matrix multiplication
Go
9
star
7

Go-Concurrency-Patterns-Timing-out-moving-on

Перевод https://blog.golang.org/go-concurrency-patterns-timing-out-and
7
star
8

hd

FEM(finite element method) for structural engineer
Go
5
star
9

matpi

Convert matrix to picture
Go
4
star
10

SliceTricks

Перевод https://github.com/golang/go/wiki/SliceTricks
4
star
11

py4go

transpile python to golang
Go
3
star
12

FreePort

Return a free tcp port
Go
3
star
13

gomin

minimal colorscheme for vim
Vim Script
3
star
14

sm

symbolic math on Go
Go
3
star
15

IANAparser

Root Zone Database Parser from IANA
Go
3
star
16

pow

replace golang math.Pow to optimal
Go
3
star
17

sd-old

FEA for steel structural engineer on golang
Go
2
star
18

gog

geometry library on golang
Go
2
star
19

tree

tree viewer
Go
2
star
20

golis

Golang implementation of lis
Go
2
star
21

radio

terminal radio
Go
2
star
22

History_Aladdin

Not official repository http://www.isr.umd.edu/~austin/aladdin.html
C
2
star
23

NLP-modeling-Android

NLP modeling
Java
1
star
24

port

simple port scanner
Go
1
star
25

Matrix-Multiply-Part2

Go
1
star
26

GoFeaGUI

Graphical user interface for GoFea
HTML
1
star
27

binaryexpr

check *ast.BinaryExpr in golang code
Go
1
star
28

blog

HTML
1
star
29

ms

mesh/fem software tui/opengl
Go
1
star
30

History_Shellbuckling

History of programs BOSOR4, BIGBOSOR4, HUGEBOSOR4, BOSOR5, PANDA2, and GENOPT (not official)
PostScript
1
star
31

sparse

Transpilated CSparse from C to Go
Go
1
star
32

ad

autodocumentation Go code process
1
star
33

GoLinAlg

Linear algebra
Go
1
star
34

dotfiles

Dotfiles
Vim Script
1
star
35

pe

programming editor on Golang
Go
1
star
36

SimpleTTL

Simple TTL on golang
Go
1
star
37

gccecho

Echo for gcc compiler
Go
1
star