Пример #1
0
def test_verify():
    """
    Verify that scalar, vectorized, F77, weave implementations
    give the same answer in a test problem.
    """
    Lx = 10;  Ly = 10;  c = 1.0

    def I(x, y):
        return exp(-pow(x-Lx/2.0,2)/2.0 -pow(y-Ly/2.0,2)/2.0)
    def f(x, y, t):
        return sin(2*x) + y
    def bc(x, y, t):
        return sin(t)

    # use string formulas instead so also weave can be tested:
    # (need to transfer globals() so that vectorized versions work)
    I = StringFunction('exp(-pow(x-Lx/2.0,2)/2.0 - pow(y-Ly/2.0,2)/2.0)',
                       independent_variables=('x', 'y'),
                       Lx=Lx, Ly=Ly, globals=globals())
    f = StringFunction('sin(2*x) + y',
                       independent_variables=('x', 'y', 't'),
                       globals=globals())
    bc = StringFunction('sin(t)',
                        independent_variables=('x', 'y', 't'),
                        globals=globals())

    #nx = 15;  ny = 10; tstop = 2
    nx = 4;  ny = 3; tstop = 16
    verify_implementations(I, f, c, bc, Lx, Ly, nx, ny, tstop)
Пример #2
0
def benchmark(nx, tstop):
    """Initial Gaussian bell in the middle of the domain."""
    Lx = 10
    Ly = 10
    c = 1.0
    ny = nx

    # our use of weave requires string formulas:
    Is = StringFunction('exp(-pow(x-Lx/2.0,2)/2.0 -pow(y-Ly/2.0,2)/2.0)',
                        independent_variables=('x','y'),
                        Lx=Lx, Ly=Ly, globals=globals())
    fs = StringFunction('0.0', independent_variables=('x', 'y', 't'),
                        globals=globals())
    BCs = StringFunction('0.0', independent_variables=('x', 'y', 't'),
                         globals=globals())

    def action(u, xv, yv, t):
        #print t
        pass

    implementation = {}
    cpu = []
    for ic in 'f77', 'vec', 'scalar', 'weave':
        for bc in 'f77', 'vec', 'scalar', 'weave':
            for inner in 'f77', 'vec', 'scalar', 'weave':
                implementation['ic'] = ic
                implementation['inner'] = inner
                implementation['bc'] = bc
                # optimize StringFunction functions for the non-weave case:
                # implementation:
                if 'weave' in (ic, bc, inner) or 'f77' in (ic, bc, inner):
                    I = Is;  f = fs;  BC = BCs
                else:
                    I = Is.__call__;  f = fs.__call__;  BC = BCs.__call__

                t0 = time.clock()
                dt, cpu_ic, cpu_inner, cpu_bc = \
                    solver(I, f, c, BC, Lx, Ly, nx, ny, 0, tstop,
                           user_action=None,
                           implementation=implementation,
                           verbose=False)
                t1 = time.clock()
                cpu_total = cpu_ic + cpu_inner + cpu_bc
                overhead = (t1-t0)-cpu_total
                cpu.append([implementation.copy(), cpu_total,
                            cpu_ic, cpu_inner, cpu_bc, overhead])
                print t1-t0, implementation, 'overhead:', overhead
    # normalize CPU-times:
    cpu_min = min([abs(c) for i, c, c1, c2, c3, c4 in cpu])
    print '\n\nMinimum CPU time:', cpu_min
    print 'no of time steps:', int(tstop/dt)
    print 'interior/boundary ratio:', int(nx*ny*1.0/max(nx,ny))
    for impl, cpu, cpu_ic, cpu_inner, cpu_bc, overhead in cpu:
        # normalized-CPU  ic  inner  bc  overhead
        print "%8.2f" % (cpu/cpu_min),
        print "%-10s %8.2f; " % (impl['ic'], cpu_ic),
        print "%-10s %8.2f; " % (impl['inner'], cpu_inner),
        print "%-10s %8.2f; " % (impl['bc'], cpu_bc),
        print "%d%%" % (overhead/cpu*100)
Пример #3
0
def parsedesc(string):
    expr, rest = string.split(' is a function of ')
    var_and_params = rest.split(' with parameter ')
    func = StringFunction(expr, independent_variable=var_and_params[0])
    if len(var_and_params) > 1:
        parameters = eval("dict(%s)" % var_and_params[1])
        func.set_parameters(**parameters)
    return func
Пример #4
0
def test_plot1(plot=1, version='scalar'):
    """
    Initial Gaussian bell in the middle of the domain.
    plot: 0 = no plot; 1 = on the screen, 2 = hardcopy too
    """
    Lx = 10
    Ly = 10
    c = 1.0

    def I2(x, y):
        return exp(-(x-Lx/2.0)**2/2.0 -(y-Ly/2.0)**2/2.0)
    def f(x, y, t):
        return 0.0
    def bc(x, y, t):
        return 0.0

    I2 = StringFunction('exp(-(x-Lx/2.0)**2/2.0 -(y-Ly/2.0)**2/2.0)',
                        independent_variables=('x', 'y'),
                        Lx=Lx, Ly=Ly, globals=globals())
    f = StringFunction('0.0', independent_variables=('x', 'y', 't'),
                       globals=globals())
    bc = StringFunction('0.0', independent_variables=('x', 'y', 't'),
                        globals=globals())
                        
    if plot:
        g = Gnuplot.Gnuplot(persist=1)
        g('set parametric')
        g('set data style lines')
        g('set hidden')
        g('set contour base')
        g('set zrange [-0.7:0.7]') # nice plot...
        
    def action(u, xv, yv, t):
        #print 'action, t=',t,'\nu=',u, '\nx=',x, '\ny=', y
        if plot:
            data = Gnuplot.GridData(u, xv[:,0], yv[0,:], binary=0)
            g.splot(data)
            g('set title "t=%g"' % t)
            if plot == 2:
                g.hardcopy(filename='tmp_%020f.ps' % t, enhanced=1, mode='eps',
                           color=0, fontname='Times-Roman', fontsize=14)
                time.sleep(1)
            time.sleep(0.2) # pause between frames

    t0 = time.clock()
    implementation = {'ic': version, 'inner': version, 'bc': version}
    nx = 40; ny = 40; tstop = 700
    solver(I2, f, c, bc, Lx, Ly, nx, ny, 0, tstop,
           user_action=action, implementation=implementation)
    t1 = time.clock()
    cpu = t1 - t0
    print 'CPU time: %s version =' % version, cpu
    time.sleep(3)
Пример #5
0
def init_prms(m, b, L, k, beta, S0, dt, g, w_formula, N):
    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument('--m', '--mass',
                        type=float, default=m)
    parser.add_argument('--b', '--boxheight',
                        type=float, default=b)
    parser.add_argument('--L', '--spring-length',
                        type=float, default=L)
    parser.add_argument('--k', '--spring-stiffness',
                        type=float, default=k)
    parser.add_argument('--beta', '--spring-damping',
                        type=float, default=beta)
    parser.add_argument('--dt','--timestep',
                        type=float, default=dt)
    parser.add_argument('--g', '--gravity',
                        type=float, default=g)
    parser.add_argument('--S0', '--initial-position', type=str, default=str(S0)) #So that S0 can be an expression of other parameters (ex: m*g/k)
    parser.add_argument('--w', type=str, default=w_formula)
    parser.add_argument('--N', type=int, default=N)
    args = parser.parse_args()

    from scitools.StringFunction import StringFunction
    w = StringFunction(args.w, independent_variables='t')
    return args.m, args.b, args.L, args.k, args.beta, \
           args.S0, args.dt, args.g, w, args.N
Пример #6
0
def test(argv=sys.argv):
    f_formula = argv[1]
    a = eval(argv[2])
    b = eval(argv[3])
    n = int(argv[4])
    f = StringFunction(f_formula)
    I = trapezoidal(f, a, b, n)
    print 'Approximation of the integral: ', I
Пример #7
0
def equal(expr1, expr2, A, B, n=500):
    failures = []
    for t in range(1, n + 1) :
        a = random.uniform(A, B)
        b = random.uniform(A, B)
        f = StringFunction(expr1, independent_variables=('a','b'))
        s = StringFunction(expr2, independent_variables=('a','b'))
        
        first = f(a, b)
        second = s(a,b)
        
        if first != second:
            result = abs(first - second)
            failures.append(result)

    nFailures = float(len(failures))
    percentage = (nFailures/n)*100
    return n, nFailures, percentage
Пример #8
0
def test(argv=sys.argv):
    try:
        f_formula = argv[1]
        a = eval(argv[2])
        b = eval(argv[3])
        n = int(argv[4])
    except:
        print "usage: %s 'f(x)' a b n" % sys.argv[0]
        sys.exit(1)

    f = StringFunction(f_formula)
    I = trapezoidal(f, a, b, n)
    print 'Approximation of the integral: ', I
Пример #9
0
def verify1():
    g = Grid2D()
    from scitools.StringFunction import StringFunction
    expression = StringFunction('x + a*y',
                                independent_variables=('x', 'y'),
                                globals=globals(),
                                a=2)
    f = g(expression)
    print g, f
    f = g.gridloop(expression)
    print g, f
    g = Grid2D(dx=0.05, dy=0.025)
    f = g.vectorized_eval(expression)
    plot_easyviz(g, f)
Пример #10
0
def deriv():
    """
    On the fly, allows user input of symblic expression
    prints derivative, returns derivative as string expression
    """
    expression = raw_input('Enter an expression involving x: ')

    from scitools.StringFunction import StringFunction

    from sympy import diff, Symbol

    x = Symbol('x')
    f = StringFunction(expression)
    df = diff(f, x)
    print('The derivative of %s with respect to x is %s' % (expression, df))
    return df
Пример #11
0
def verify1():
    """Basic test of the extension module."""
    g = Grid2Deff(dx=0.5, dy=1)
    f_exact = g(f1)  # NumPy computation

    expression1 = StringFunction('x + 2*y',
                                 independent_variables=('x', 'y'),
                                 globals=globals())

    f = g.ext_gridloop1(f1)
    print 'f computed by external gridloop1 function and f1:\n', f
    if allclose(f, f_exact, atol=1.0E-10, rtol=1.0E-12):
        print 'f is correct'

    f = g.ext_gridloop2(f1)
    print 'f computed by external gridloop2 function and f1:\n', f
    if allclose(f, f_exact, atol=1.0E-10, rtol=1.0E-12):
        print 'f is correct'

    f = g.ext_gridloop1(expression1)
    print 'f computed by external gridloop1 function and StringFunction:\n', f
    if allclose(f, f_exact, atol=1.0E-10, rtol=1.0E-12):
        print 'f is correct'

    f = g.ext_gridloop2(expression1)
    print 'f computed by external gridloop2 function and StringFunction:\n', f
    if allclose(f, f_exact, atol=1.0E-10, rtol=1.0E-12):
        print 'f is correct'

    fast_func = expression1.__call__
    f = g.ext_gridloop2(fast_func)
    print 'f computed by external gridloop2 function and StringFunction.__call__:\n', f
    if allclose(f, f_exact, atol=1.0E-10, rtol=1.0E-12):
        print 'f is correct'

    f = g(expression1)
    print 'f computed by __call__ and StringFunction:\n', f
    if allclose(f, f_exact, atol=1.0E-10, rtol=1.0E-12):
        print 'f is correct'

    # check printing:
    print 'array seen from Python:'
    g.dump(f)
    if 'dump' in dir(ext_gridloop):
        print 'array seen from Fortran (transposed, but right values):'
        ext_gridloop.dump(f, g.xcoor, g.ycoor)
Пример #12
0
def main():
    from scitools.StringFunction import StringFunction
    import sys

    try:
        formula = sys.argv[1]
        difftype = sys.argv[2]
        difforder = sys.argv[3]
        x = float(sys.argv[4])
    except IndexError:
        print 'Usage:   Diff.py formula difftype difforder x'
        print 'Example: Diff.py "sin(x)*exp(-x)" Central 4 3.14'
        sys.exit(1)

    classname = difftype + difforder
    f = StringFunction(formula)
    df = eval(classname)(f)
    print df(x)
Пример #13
0
def integrate_function():
    """Integration function

    Using scitools.StringFunction to do integration.

    >>> integration.py 'sin(x)' 0 pi/2
    integral of sin(x) on [0, 1.5708] with n=200: 1
    """
    def midpoint_integration(f, a, b, n=100):
        h = (b - a) / float(n)
        I = 0
        for i in range(n):
            I += f(a + i * h + 0.5 * h)
        return h * I

    f_formula = sys.argv[1]
    a = eval(sys.argv[2])
    b = eval(sys.argv[3])
    if len(sys.argv) >= 5:
        n = int(sys.arvg[4])
    else:
        n = 200

    from scitools.StringFunction import StringFunction
    f = StringFunction(f_formula)  # turn formula into f(x) func.
    """
    >>> g = StringFunction('A*exp(-a*t)*sin(omega*x)',
                       independent_variable='t',
                       A=1, a=0.1, omega=pi, x=0.5)
    >>> g.set_parameters(omega=0.1)
    >>> g.set_parameters(omega=0.1, A=5, x=0)
    >>> g(0)
    0.0
    >>> g(pi)
    2.8382392288852166e-15
    """

    I = midpoint_integration(f, a, b, n)
    print("Integral of {:s} on [{:g}, {:g}] with n ={:d}: {:g}" \
          .format(f_formula, a, b, n, I))
Пример #14
0
            k = float(value)
        elif option in ('--beta', '--spring-damping'):
            beta = float(value)
        elif option in ('--S0', '--initial-position'):
            S0 = float(value)
        elif option in ('--dt', '--timestep'):
            dt = float(value)
        elif option in ('--g', '--gravity'):
            g = float(value)
        elif option in ('--w',):
            w_formula = value  # string
        elif option == '--N':
            N = int(value)

    from scitools.StringFunction import StringFunction
    w = StringFunction(w_formula, independent_variables='t')
    return m, b, L, k, beta, S0, dt, g, w, N


def solve(m, k, beta, S0, dt, g, w, N,
          user_action=lambda S, time, time_step_no: None):
    """Calculate N steps forward. Return list S."""
    S = [0.0]*(N+1)      # output list
    gamma = beta*dt/2.0  # short form
    t = 0
    S[0] = S0
    user_action(S, t, 0)
    # special formula for first time step:
    i = 0
    S[i+1] = (1/(2.0*m))*(2*m*S[i] - dt**2*k*S[i] + 
             m*(w(t+dt) - 2*w(t) + w(t-dt)) + dt**2*m*g)
Пример #15
0
 def __init__(self):
     # Set default parameter values
     self.alpha = 1.
     self.R = StringFunction('1.0', independent_variable='t')
     self.U0 = 0.01
     self.T = 4.
Пример #16
0
# Exercise 5.33
from numpy import *
import matplotlib.pyplot as plt
import sys
from scitools.StringFunction import StringFunction

f = StringFunction(sys.argv[1])
f.vectorize(globals())
x = linspace(eval(sys.argv[2]), eval(sys.argv[3]), 501)

plt.plot(x, f(x))
plt.xlabel('x')
plt.ylabel('f(x)')
plt.legend(['f(x) = %s' % sys.argv[1]])
plt.show()

raw_input()
Пример #17
0
try:
    k = float(sys.argv[1])
    m = float(sys.argv[2])
    x0 = float(sys.argv[3])
    force_formula = sys.argv[4]
    tstart = float(sys.argv[5])
    tstop = float(sys.argv[6])
    dt = float(sys.argv[7])
except IndexError, e:
    print e, '\n', usage
    sys.exit(1)

if force_formula != '0':
    from scitools.StringFunction import StringFunction
    F = StringFunction(formula)
else:
    F = None

print F

t = tstart
x = [x0, x0]
while t <= tstop:
    t += dt
    if F is not None:
        try:
            F_value = F(t)
        except:
            raise ValueError('Could not evaluate %s for t=%g' \
                             % (force_formula, t))
Пример #18
0
import sys
usage = '%s f-formula a b [epsilon]' % sys.argv[0]
try:
    f_formula = sys.argv[1]
    a = float(sys.argv[2])
    b = float(sys.argv[3])
except IndexError:
    print usage
    sys.exit(1)

try:  # is epsilon given on the command-line?
    epsilon = float(sys.argv[4])
except IndexError:
    epsilon = 1E-6  # default value

from scitools.StringFunction import StringFunction
from math import *  # might be needed for f_formula
f = StringFunction(f_formula)
from bisection import bisection

root, iter = bisection(f, a, b, epsilon)
if root == None:
    print 'The interval [%g, %g] does not contain a root' % (a, b)
    sys.exit(1)
print 'Found root %g\nof %s = 0 in [%g, %g] in %d iterations' % \
      (root, f_formula, a, b, iter)
('a/b', '1/(b/a)'),\
('(a*b)**4', 'a**4*b**4'),\
('(a+b)**2', 'a**2 + 2*a*b + b**2'),\
('(a+b)*(a-b)', 'a**2 - b**2'),\
('log(a*b)', 'log(a) + log(b)'),\
('a*b', 'exp(log(a) + log(b))'),\
('1/(1/a + 1/b)', 'a*b/(a+b)'),\
('a*(sin(b)**2+cos(b)**2)', 'a'),\
('tan(a+b)', 'sin(a+b)/cos(a+b)'),\
('sin(a+b)', 'sin(a)*cos(b)+sin(b)*cos(a)')
             )

print '%30s %30s %5s %5s %15s' % ('expression 1', 'expression 2', 'A', 'B',
                                  'Success Rate')
A = 0
B = 1
for i in functions:
    fn1 = StringFunction(i[0], independent_variables=('a', 'b'))
    fn2 = StringFunction(i[1], independent_variables=('a', 'b'))
    x = equal(fn1, fn2, A, B)
    print '%30s %30s %5d %5d %15f' % (i[0], i[1], A, B, x)
print '%30s %30s %5s %5s %15s' % ('expression 1', 'expression 2', 'A', 'B',
                                  'Success Rate')
A = 1E-7
B = 1E+7
for i in functions:
    fn1 = StringFunction(i[0], independent_variables=('a', 'b'))
    fn2 = StringFunction(i[1], independent_variables=('a', 'b'))
    x = equal(fn1, fn2, A, B)
    print '%30s %30s %5g %5g %15f' % (i[0], i[1], A, B, x)
Пример #20
0
"""
TODO
Exercise 3.13. Extend a program from Ch. 3.2.1.
How can you modify the add_cml.py program from the end of Chap-
ter 3.1.2 such that it accepts input like sqrt(2) and sin(1.2)?
"""
import math
import sys
from scitools.StringFunction import StringFunction

i1 = StringFunction(sys.argv[1])
i2 = StringFunction(sys.argv[2])
print i1, i2
#print '%s + %s becomes %s\nwith value %s' % \
#        (type(i1), type(i2), type(r), r)
Пример #21
0
import sys
from scitools.StringFunction import StringFunction
parameters = {}
for prm in sys.argv[4:]:
	key, value = prm.split('=')
	parameters[key] = eval(value)
f = StringFunction(sys.argv[1], independent_valiable=sys.argv[2],
		   **parameters)
var = float(sys.argv[3])
print f
print f(var)

"""
The program accepts system arguments. It interperets the first
one as a function definition, the second one as the variable of
the function and the third one as where the function should be
evaluated. The rest of the arguments are also passed on to the
function.
"""

f = eval('StringFunction(sys.argv[1], ' + \
	 'independent_valiables=sys.argv[2], %s)' % \
	 (', '.join(sys.argv[4:]) ))
var = float(sys.argv[3])
print f(var)

"""
The second program does the same as the first one, only more directly
and compactly.
"""
Пример #22
0
# Exercise 5.32
# Author: Noah Waterfield Price

from numpy import *
import matplotlib.pyplot as plt
import sys
from scitools.StringFunction import StringFunction

f = StringFunction(sys.argv[1])
f.vectorize(globals())

if len(sys.argv) == 5:
    n = sys.argv[4]
else:
    n = 501

x = linspace(eval(sys.argv[2]), eval(sys.argv[3]), n)

plt.plot(x, f(x))
plt.xlabel('x')
plt.ylabel('f(x)')
plt.legend(['f(x) = %s' % sys.argv[1]])
plt.show()

raw_input()
Пример #23
0
#------------------------------------------------------------------------------#
# UI Management                                                                #
#------------------------------------------------------------------------------#

# Clear the terminal for readability
print("\033c" + "*************************************************")
print("CS 101 James Scholar Project By Kenneth Tochihara")
print("*************************************************")
print("\nCtrl + C to exit at anytime. ")

# Infinite loop until KeyboardInterrupt
while True:

    try:
        # Taking in the values
        f = StringFunction(input("f(u, t) =  "),
                           independent_variables=('u', 't'))
        u0 = float(input("u0 =  "))  #initial condition
        dt = float(input("dt = "))  #time step
        T = float(input("T = "))  #Final time of simulation
        type = str(input("Solve Method: "))

        #Initializing the u array, arrU and time array, arrT
        arrU = []
        currentT = 0
        arrT = [currentT]
        while (currentT < T) or (np.isclose(currentT, T)):
            currentT += dt
            arrT.append(currentT)

#------------------------------------------------------------------------------#
# Deciding which method to use                                                 #
Пример #24
0
 def test_set_parameters(self):
     f = StringFunction('a+b*x', a=1)
     f.set_parameters(b=4)
     v = f(2)
     self.failUnlessEqual(v, 9, 'wrong value')
Пример #25
0
    print usage
    sys.exit(1)

try:  # is epsilon given on the command-line?
    epsilon = float(sys.argv[4])
except IndexError:
    epsilon = 1E-6  # default value

# clean up all plot files:
import glob, os
for filename in glob.glob('tmp_*.eps'):
    os.remove(filename)

from scitools.StringFunction import StringFunction
from scitools.std import *  # might be needed for f_formula
f = StringFunction(f_formula)
f.vectorize(globals())

results = bisection_evolution(f, a, b, epsilon)
if results is None:
    print 'f does not change sign in [%g, %g]' % (a, b)
    sys.exit(1)

# plot:
x = linspace(a, b, 501)
y = f(x)
ymin = min(y)
ymax = max(y)
itcount = 1
for interval, m in results:
    a, b = interval
Пример #26
0
        if dfdx is not None:
            print '%15f' % (dfdx(x))
        else:
            print ''


from scitools.std import *
f = ['x**2', 'sin(pi*x)**6', 'tanh(10*x)']
df = ['2*x', '6*pi*sin(pi*x)**5*cos(pi*x)', '10*(1-tanh(10*x)**2)']
hlist = [1E-1, 1E-3, 1E-5, 1E-7]
from scitools.StringFunction import StringFunction
x = [0, 0.25]
for a in range(2):
    for b in range(3):
        print 'x = %.2f, f = %s' % (x[a], f[b])
        table(StringFunction(f[b]), x[a], hlist, \
         StringFunction(df[b]))
        print ''

x = linspace(-1, 1, 500)
for a in f:
    figure()
    plot(x, vectorize(StringFunction(a))(x), title='%s' % a)
raw_input('Press Enter to quit:')
'''
python Derivative_comparisons.py
x = 0.00, f = x**2
              h      Derivative         Central            True
            0.1             0.1               0        0.000000
          0.001           0.001               0        0.000000
          1e-05           1e-05               0        0.000000
Пример #27
0
        K1 = dt * f(u[k], t[k])
        K2 = dt * f(u[k] + 0.5 * K1, t[k] + dt2)
        K3 = dt * f(u[k] + 0.5 * K2, t[k] + dt2)
        K4 = dt * f(u[k] + K3, t[k] + dt)
        u_new = u[k] + (1 / 6.0) * (K1 + 2 * K2 + 2 * K3 + K4)
        return u_new


import sys
from scitools.StringFunction import StringFunction
try:
    f_formula = sys.argv[1]
    U0 = float(sys.argv[2])
    dt = float(sys.argv[3])
    T = float(sys.argv[4])
    f = StringFunction(f_formula, independent_variables=('u', 't'))
except:
    print("Usage: %s f U0 dt T" % sys.argv[0])
    print("Optional 5° argument: numerical method")
    sys.exit(1)

try:
    method = eval(sys.argv[5])
except:
    method = ForwardEuler  #Default method

n = int(T / dt) + 1
times = np.linspace(
    0, n * dt,
    n + 1)  #This way we respect the dt. The last point will be T' in [T;T+dt]
Пример #28
0
def verify2(n=3):
    """
    Test of some methods in class Grid2Deff that call up
    some F77 routines for improving the efficiency of callbacks
    to Python.
    """

    if not 'gridloop_vec2' in dir(ext_gridloop):
        raise ImportError, 'verify2 works only for F77 module'
    dx = 1.0 / n
    g = Grid2Deff(dx=dx, dy=dx)

    from StringIO import StringIO
    from scitools.numpyutils import arr
    a_exact = arr(file_=StringIO("""
    
       0.          0.          0.          0.        
       2.66666667  2.7775493   2.88706441  2.99386136
       5.33333333  5.55373108  5.7632897   5.95170314
       8.          8.3271947   8.6183698   8.84147098"""))

    def _check():
        if not allclose(a, a_exact):
            print 'ERROR, a is wrong, correct a reads\n', a_exact
        else:
            print 'correct array'

    a = g.ext_gridloop_vec1(myfuncf1)
    print "g.ext_gridloop_vec1(myfuncf1): a=\n", a
    _check()
    a = g.ext_gridloop_vec2(myfuncf2)
    print "g.ext_gridloop_vec2(myfuncf2): a=\n", a
    _check()
    # need f2py version > 2.42 (callback to class method):
    a = g.ext_gridloop_vec3(g.myfuncf3)
    print "g.ext_gridloop_vec3(g.myfuncf3): a=\n", a
    _check()
    a = g.ext_gridloop2_str('myfunc')
    print "g.ext_gridloop_str('myfunc'): a=\n", a
    _check()
    a = g.ext_gridloop_noalloc('myfunc', a)
    print "g.ext_gridloop_str_noalloc('myfunc'): a=\n", a
    _check()

    fstr = 'sin(x*y) + 8*x'
    g.ext_gridloop2_fcb_compile(fstr)
    a = g.ext_gridloop2_fcb()
    print "g.gridloop2_fcb: a=\n", a
    _check()
    import callback
    print 'contents of callback module:', dir(callback)

    fstr = StringFunction('sin(x*y) + 8*x')
    g.ext_gridloop2_fcb_ptr_compile(fstr)
    a = g.ext_gridloop2_fcb_ptr()
    print "g.gridloop2_fcb_ptr: a=\n", a
    _check()
    import callback
    print 'fcb callback module:', dir(callback), dir(callback.fcb)

    g.ext_gridloop2_compile(fstr)
    a = g.ext_gridloop2_v2()
    print "g.gridloop2_v2: a=\n", a
    _check()
    a = g.ext_gridloop2_weave(fstr)
    print "g.gridloop2_weave: a=\n", a
    _check()
    g.gridloop_psyco_init(g.gridloop)
    a = g.gridloop_psyco(fstr)
    print "g.gridloop_psyco(str): a=\n", a
    _check()
    a = g.gridloop_psyco(myfunc)
    print "g.gridloop_psyco(func): a=\n", a
    _check()
    g.ext_gridloop1_instant(fstr)
    g.gridloop1_instant(a, g.nx, g.ny, g.xcoor, g.ycoor)
    print "g.gridloop1_instant: a=\n", a
Пример #29
0
 def __init__(self, input):
     self.function = StringFunction(input)
     self.input = input
Пример #30
0
def timing2(n=2000, best_time=1.0):
    """Time different implementations of the extension module."""
    print 'Grid2Deff.timing2: reference CPU time = %g' % best_time

    dx = 1.0 / n
    g = Grid2Deff(dx=dx, dy=dx)

    # here we use straight NumPy sin in a scalar context:
    def myfunc1(x, y):
        return sin(x * y) + 8 * x

    def myfunc2(x, y):
        return math.sin(x * y) + 8 * x

    expression1 = StringFunction('sin(x*y) + 8*x',
                                 independent_variables=('x', 'y'),
                                 globals=globals())
    expression1_f = expression1.__call__  # for efficiency and F77 callback

    expression2 = StringFunction('math.sin(x*y) + 8*x',
                                 independent_variables=('x', 'y'),
                                 globals=globals())
    expression2_f = expression2.__call__  # for efficiency and F77 callback

    from scitools.misc import timer
    from scitools.EfficiencyTable import EfficiencyTable
    e = EfficiencyTable('Grid2Deff tests, %dx%d grid' % (n, n), best_time)

    t0a = timer(g.gridloop, (myfunc1, ), repetitions=1)
    e.add('g.gridloop, myfunc1', t0a)
    t0b = timer(g.gridloop, (myfunc2, ), repetitions=1)
    e.add('g.gridloop, myfunc2', t0b)
    t0c = timer(g.__call__, (myfunc1, ), repetitions=1)
    e.add('g.__call__, myfunc1', t0c)
    t0d = timer(g.__call__, (expression1_f, ), repetitions=1)
    e.add('g.__call__, expression1_f', t0d)
    t0e = timer(g.gridloop_itemset, (myfunc2, ), repetitions=1)
    e.add('g.gridloop_itemset, myfunc2', t0e)

    t1a = timer(g.ext_gridloop1, (myfunc1, ), repetitions=1)
    e.add('g.ext_gridloop1, myfunc1', t1a)
    t1b = timer(g.ext_gridloop1, (myfunc2, ), repetitions=1)
    e.add('g.ext_gridloop1, myfunc2', t1b)
    t2a = timer(g.ext_gridloop2, (myfunc1, ), repetitions=1)
    e.add('g.ext_gridloop2, myfunc1', t2a)
    t2b = timer(g.ext_gridloop2, (myfunc2, ), repetitions=1)
    e.add('g.ext_gridloop2, myfunc2', t2b)
    t3a = timer(g.ext_gridloop2, (expression1_f, ), repetitions=1)
    e.add('g.ext_gridloop2, expression1_f', t3a)
    t3b = timer(g.ext_gridloop2, (expression2_f, ), repetitions=1)
    e.add('g.ext_gridloop2, expression2_f', t3b)
    nrep = 20

    # try the improved functions (works only for the F77 module):
    if 'gridloop_vec2' in dir(ext_gridloop):
        t4 = timer(g.ext_gridloop_vec2, (myfuncf2, ), repetitions=nrep)
        e.add('g.ext_gridloop_vec2, myfuncf2', t4)

    if 'gridloop2_str' in dir(ext_gridloop):
        t5 = timer(g.ext_gridloop2_str, ('myfunc', ), repetitions=nrep)
        e.add('g.ext_gridloop2_str, myfunc', t5)

        # try the version without allocation (first, make an a array):
        a = g.ext_gridloop2(myfunc1)  # a has now Fortran storage
        t5b = timer(g.ext_gridloop_noalloc, ('myfunc', a), repetitions=nrep)
        e.add('g.ext_gridloop_noalloc, myfunc', t5b)

        # try 'inline' F77 compiled callback too:
        # (give F77 source for core of callback function as argument)

        g.ext_gridloop2_fcb_compile(str(expression1))
        t6 = timer(g.ext_gridloop2_fcb, (), repetitions=nrep)
        e.add('g.ext_gridloop2_fcb(%s)' % repr(str(expression1)), t6)

        g.ext_gridloop2_fcb_ptr_compile(expression1)
        t6b = timer(g.ext_gridloop2_fcb_ptr, (), repetitions=nrep)
        e.add('g.ext_gridloop2_fcb_ptr(%s)' % repr(expression1), t6b)

        g.ext_gridloop2_compile(str(expression1))
        t7 = timer(g.ext_gridloop2_v2, (), repetitions=nrep)
        e.add('g.ext_gridloop2_v2(%s)' % repr(str(expression1)), t7)

    # weave version:
    t8 = timer(g.ext_gridloop2_weave, (str(expression1), ), repetitions=nrep)
    e.add('g.ext_gridloop2_weave(%s)' % repr(str(expression1)), t8)

    # psyco:
    g.gridloop_psyco_init(g.gridloop)
    if g.gridloop_psyco != g.gridloop:  # has psyco
        t9a = timer(g.gridloop_psyco, (myfunc2, ), repetitions=1)
        e.add('g.gridloop_psyco, myfunc2', t9a)
        t9b = timer(g.gridloop_psyco, (expression2_f, ), repetitions=1)
        e.add('g.gridloop_psyco, expression2_f', t9b)

    g.gridloop_psyco_init(g.gridloop_itemset)
    if g.gridloop_psyco != g.gridloop_itemset:  # has psyco
        t9a = timer(g.gridloop_psyco, (myfunc2, ), repetitions=1)
        e.add('g.gridloop_psyco (itemset), myfunc2', t9a)
        t9b = timer(g.gridloop_psyco, (expression2_f, ), repetitions=1)
        e.add('g.gridloop_psyco (itemset), expression2_f', t9b)

    # instant:
    g.ext_gridloop1_instant(str(expression1))
    if g.gridloop1_instant is not None:
        a = zeros((self.nx, self.ny))
        t10 = timer(g.gridloop1_instant, (a, self.nx, g.ny, g.xcoor, g.ycoor),
                    repetitions=nrep)
        e.add('g.gridloop1_instant', t10)

    print '\n\n\n\nrun from directory', os.getcwd()
    print e
Пример #31
0
import sys
from scitools.StringFunction import StringFunction
from Newton import Newton
from Secant import Secant
from bisection import bisection_evolution
from scitools.std import *

usage = 'f(x) f\'(x) a b x0 x1'
try:
    f = StringFunction(sys.argv[1])
    df = StringFunction(sys.argv[2])
    a = float(eval(sys.argv[3]))
    b = float(eval(sys.argv[4]))
    x0 = float(eval(sys.argv[5]))
    x1 = float(eval(sys.argv[6]))
except:
    print usage
    sys.exit(1)


def printRootConvergence(x_values, f_values, method_name=None):
    if method_name is not None:
        print method_name
    print '%5s %15s %15s' % ('n', 'root', 'f(x)')
    for i in range(len(f_values)):
        print '%5d %15.10f %15.10f' % (i + 1, x_values[i], f_values[i])


N = 100
epsilon = 1e-10
Пример #32
0
 def toStringFunction(text):
     return StringFunction(text, independent_variable='t')