Source code for sympy.codegen.ffunctions

"""
Functions with corresponding implementations in Fortran.

The functions defined in this module allows the user to express functions such as ``dsign``
as a SymPy function for symbolic manipulation.

"""
from sympy.core.function import Function
from sympy.core.numbers import Float

[docs]class FFunction(Function): _required_standard = 77 def _fcode(self, printer): name = self.__class__.__name__ if printer._settings['standard'] < self._required_standard: raise NotImplementedError("%s requires Fortran %d or newer" % (name, self._required_standard)) return '{0}({1})'.format(name, ', '.join(map(printer._print, self.args)))
[docs]class F95Function(FFunction): _required_standard = 95
[docs]class isign(FFunction): """ Fortran sign intrinsic with for integer arguments. """ nargs = 2
[docs]class dsign(FFunction): """ Fortran sign intrinsic with for double precision arguments. """ nargs = 2
[docs]class cmplx(FFunction): """ Fortran complex conversion function. """ nargs = 2 # may be extended to (2, 3) at a later point
[docs]class kind(FFunction): """ Fortran kind function. """ nargs = 1
[docs]class merge(F95Function): """ Fortran merge function """ nargs = 3
class _literal(Float): _token = None _decimals = None def _fcode(self, printer): mantissa, sgnd_ex = ('%.{0}e'.format(self._decimals) % self).split('e') mantissa = mantissa.strip('0').rstrip('.') ex_sgn, ex_num = sgnd_ex[0], sgnd_ex[1:].lstrip('0') ex_sgn = '' if ex_sgn == '+' else ex_sgn return (mantissa or '0') + self._token + ex_sgn + (ex_num or '0')
[docs]class literal_sp(_literal): """ Fortran single precision real literal """ _token = 'e' _decimals = 9
[docs]class literal_dp(_literal): """ Fortran double precision real literal """ _token = 'd' _decimals = 17