예제 #1
0
 def _print_sign(self, expr):
     from sympy import Abs
     arg, = expr.args
     if arg.is_integer:
         new_expr = merge(0, isign(1, arg), Eq(arg, 0))
     elif arg.is_complex:
         new_expr = merge(cmplx(literal_dp(0), literal_dp(0)), arg/Abs(arg), Eq(Abs(arg), literal_dp(0)))
     else:
         new_expr = merge(literal_dp(0), dsign(literal_dp(1), arg), Eq(arg, literal_dp(0)))
     return self._print(new_expr)
예제 #2
0
 def _print_Pow(self, expr):
     PREC = precedence(expr)
     if expr.exp == -1:
         return '%s/%s' % (self._print(
             literal_dp(1)), self.parenthesize(expr.base, PREC))
     elif expr.exp == 0.5:
         if expr.base.is_integer:
             # Fortran intrinsic sqrt() does not accept integer argument
             if expr.base.is_Number:
                 return 'sqrt(%s.0d0)' % self._print(expr.base)
             else:
                 return 'sqrt(dble(%s))' % self._print(expr.base)
         else:
             return 'sqrt(%s)' % self._print(expr.base)
     else:
         return CodePrinter._print_Pow(self, expr)
예제 #3
0
 def _print_sign(self, expr):
     from sympy.functions.elementary.complexes import Abs
     arg, = expr.args
     if arg.is_integer:
         new_expr = merge(0, isign(1, arg), Eq(arg, 0))
     elif (arg.is_complex or arg.is_infinite):
         new_expr = merge(cmplx(literal_dp(0), literal_dp(0)),
                          arg / Abs(arg), Eq(Abs(arg), literal_dp(0)))
     else:
         new_expr = merge(literal_dp(0), dsign(literal_dp(1), arg),
                          Eq(arg, literal_dp(0)))
     return self._print(new_expr)
예제 #4
0
def test_Subroutine():
    # Code to generate the subroutine in the example from
    # http://www.fortran90.org/src/best-practices.html#arrays
    r = Symbol("r", real=True)
    i = Symbol("i", integer=True)
    v_r = Variable.deduced(r, attrs=(dimension(assumed_extent), intent_out))
    v_i = Variable.deduced(i)
    v_n = Variable("n", integer)
    do_loop = Do([Assignment(Element(r, [i]),
                             literal_dp(1) / i**2)], i, 1, v_n)
    sub = Subroutine(
        "f",
        [v_r],
        [
            Declaration(v_n),
            Declaration(v_i),
            Assignment(v_n, size(r)), do_loop
        ],
    )
    x = Symbol("x", real=True)
    v_x3 = Variable.deduced(x, attrs=[dimension(3)])
    mod = Module("mymod", definitions=[sub])
    prog = Program(
        "foo",
        [
            use(mod, only=[sub]),
            Declaration(v_x3),
            SubroutineCall(sub, [v_x3]),
            Print([sum_(v_x3), v_x3]),
        ],
    )

    if not has_fortran():
        skip("No fortran compiler found.")

    (stdout, stderr), info = compile_run_strings(
        [("a.f90", fcode(mod, standard=90)),
         ("b.f90", fcode(prog, standard=90))],
        clean=True,
    )
    ref = [1.0 / i**2 for i in range(1, 4)]
    assert str(sum(ref))[:-3] in stdout
    for _ in ref:
        assert str(_)[:-3] in stdout
    assert stderr == ""
예제 #5
0
파일: fcode.py 프로젝트: asmeurer/sympy
 def _print_Pow(self, expr):
     PREC = precedence(expr)
     if expr.exp == -1:
         return '%s/%s' % (
             self._print(literal_dp(1)),
             self.parenthesize(expr.base, PREC)
         )
     elif expr.exp == 0.5:
         if expr.base.is_integer:
             # Fortran intrinsic sqrt() does not accept integer argument
             if expr.base.is_Number:
                 return 'sqrt(%s.0d0)' % self._print(expr.base)
             else:
                 return 'sqrt(dble(%s))' % self._print(expr.base)
         else:
             return 'sqrt(%s)' % self._print(expr.base)
     else:
         return CodePrinter._print_Pow(self, expr)
예제 #6
0
파일: test_fnodes.py 프로젝트: Lenqth/sympy
def test_Subroutine():
    # Code to generate the subroutine in the example from
    # http://www.fortran90.org/src/best-practices.html#arrays
    r = Symbol('r', real=True)
    i = Symbol('i', integer=True)
    v_r = Variable.deduced(r, attrs=(dimension(assumed_extent), intent_out))
    v_i = Variable.deduced(i)
    v_n = Variable('n', integer)
    do_loop = Do([
        Assignment(Element(r, [i]), literal_dp(1)/i**2)
    ], i, 1, v_n)
    sub = Subroutine("f", [v_r], [
        Declaration(v_n),
        Declaration(v_i),
        Assignment(v_n, size(r)),
        do_loop
    ])
    x = Symbol('x', real=True)
    v_x3 = Variable.deduced(x, attrs=[dimension(3)])
    mod = Module('mymod', definitions=[sub])
    prog = Program('foo', [
        use(mod, only=[sub]),
        Declaration(v_x3),
        SubroutineCall(sub, [v_x3]),
        Print([sum_(v_x3), v_x3])
    ])

    if not has_fortran():
        skip("No fortran compiler found.")

    (stdout, stderr), info = compile_run_strings([
        ('a.f90', fcode(mod, standard=90)),
        ('b.f90', fcode(prog, standard=90))
    ], clean=True)
    ref = [1.0/i**2 for i in range(1, 4)]
    assert str(sum(ref))[:-3] in stdout
    for _ in ref:
        assert str(_)[:-3] in stdout
    assert stderr == ''
예제 #7
0
def test_literal_dp():
    assert fcode(literal_dp(0), source_format='free') == '0d0'
예제 #8
0
def test_dsign():
    x = Symbol('x')
    assert unchanged(dsign, 1, x)
    assert fcode(dsign(literal_dp(1), x), standard=95,
                 source_format='free') == 'dsign(1d0, x)'
예제 #9
0
def test_literal_dp():
    assert fcode(literal_dp(0), source_format="free") == "0d0"
예제 #10
0
def test_dsign():
    x = Symbol("x")
    assert unchanged(dsign, 1, x)
    assert (fcode(dsign(literal_dp(1), x), standard=95,
                  source_format="free") == "dsign(1d0, x)")
예제 #11
0
 def _print_Infinity(self, expr):
     return '(huge(%s) + 1)' % self._print(literal_dp(0))
예제 #12
0
파일: fcode.py 프로젝트: asmeurer/sympy
 def _print_Infinity(self, expr):
     return '(huge(%s) + 1)' % self._print(literal_dp(0))
예제 #13
0
파일: test_fnodes.py 프로젝트: Lenqth/sympy
def test_literal_dp():
    assert fcode(literal_dp(0), source_format='free') == '0d0'
예제 #14
0
파일: test_fnodes.py 프로젝트: Lenqth/sympy
def test_dsign():
    x = Symbol('x')
    assert dsign(1, x) == dsign(1, x)
    assert fcode(dsign(literal_dp(1), x), standard=95, source_format='free') == 'dsign(1d0, x)'