Exemple #1
0
    def test_euler(self):
        graph = Graph()
        graph.add_nodes("A,B,C")
        graph.add_link("A", "B")
        graph.add_link("A", "C")
        graph.add_link("B", "C")
        node_a = graph.node("A")
        euler = Euler(graph, node_a)
        path = []
        success = euler.euler(node_a, node_a, path)
        self.assertTrue(success)

        node_b = graph.node("B")
        euler = Euler(graph, node_a)
        path = []
        success = euler.euler(node_a, node_b, path)
        self.assertFalse(success)

        graph.add_nodes("D,E")
        graph.add_link("B", "D")
        graph.add_link("B", "E")
        graph.add_link("E", "D")
        euler = Euler(graph, node_b)
        path = []
        success = euler.euler(node_b, node_b, path)
        self.assertTrue(success)
Exemple #2
0
    def test_remove_link(self):
        graph = Graph()

        node_a = Node("A")
        euler = Euler(graph, node_a)
        node_b = Node("B")
        link = Link(node_a, node_b)

        euler.unused_links.add(link)

        euler.add_link(link)

        self.assertEqual(len(euler.unused_links), 0)
        self.assertEqual(euler.link_count[link], 1)

        euler.remove_link(link)
        self.assertEqual(len(euler.unused_links), 1)
        self.assertEqual(euler.link_count[link], 0)

        euler.add_link(link)
        euler.add_link(link)

        self.assertEqual(len(euler.unused_links), 0)
        self.assertEqual(euler.link_count[link], 2)

        euler.remove_link(link)
        self.assertEqual(len(euler.unused_links), 0)
        self.assertEqual(euler.link_count[link], 1)

        euler.remove_link(link)
        self.assertEqual(len(euler.unused_links), 1)
        self.assertTrue(link in euler.unused_links)
        self.assertEqual(euler.link_count[link], 0)
def test_Euler(data):
    initial_x = data[0]
    initial_y = data[1]
    intervals = data[2]
    final_x = data[3]
    exp = data[4]
    exp = exp.replace('m', '*')
    exp = exp.replace('p', '**')
    exp = exp[1:len(exp)]
    # print(str(exp))
    f = sympy.sympify(exp)
    assume(final_x > initial_x)
    assume(intervals > 0)
    y1 = Euler(exp, initial_x, initial_y, final_x, intervals)
    t = []
    last = initial_x
    step = (final_x - initial_x) / intervals
    # print(step)
    for i in range(intervals):
        last += step
        t.append(last)
    x = sympy.symbols('x')
    y = sympy.symbols('y')
    fx = lambdify([x, y], f)
    # print(f)
    y2 = odeint(fx, initial_y, np.asarray(t))
    # print(len(result))
    # print(exp,initial_x,initial_y,final_x,intervals)
    # print(len(y1),len(y2))
    for i in range(len(y2)):
        note("numpy sol %r" % y2[i][0])
        note("app solution %r" % y1[i])
        assert y2[i][0] == y1[i]
Exemple #4
0
    def test_init(self):
        graph = Graph()
        graph.add_nodes("A,B,C")
        graph.add_link("A", "B")
        graph.add_link("A", "C")
        graph.add_link("B", "C")

        node = graph.node("A")
        euler = Euler(graph, node)
        self.assertEqual(euler.graph, graph)
        self.assertIsNotNone(euler.unused_links)
        self.assertEqual(len(euler.unused_links), 3)
        self.assertIsNotNone(euler.link_count)
        self.assertEqual(len(euler.link_count), 0)
Exemple #5
0
def decodeValue(jsonData):
    """Returns a constructed math value based on the provided json data.

    Args:
        jsondata (dict): The JSON data to use to decode into a Math value.

    Returns:
        object: The constructed math value

    """

    if type(jsonData) is not dict:
        return jsonData

    if '__mathObjectClass__' not in jsonData:
        raise Exception("Invalid JSON data for constructing value:" +
                        str(jsonData))

    if jsonData['__mathObjectClass__'] == 'Vec2':
        val = Vec2()
        val.jsonDecode(jsonData, decodeValue)
    elif jsonData['__mathObjectClass__'] == 'Vec3':
        val = Vec3()
        val.jsonDecode(jsonData, decodeValue)
    elif jsonData['__mathObjectClass__'] == 'Vec4':
        val = Vec4()
        val.jsonDecode(jsonData, decodeValue)
    elif jsonData['__mathObjectClass__'] == 'Euler':
        val = Euler()
        val.jsonDecode(jsonData, decodeValue)
    elif jsonData['__mathObjectClass__'] == 'Quat':
        val = Quat()
        val.jsonDecode(jsonData, decodeValue)
    elif jsonData['__mathObjectClass__'] == 'Xfo':
        val = Xfo()
        val.jsonDecode(jsonData, decodeValue)
    elif jsonData['__mathObjectClass__'] == 'Mat33':
        val = Mat33()
        val.jsonDecode(jsonData, decodeValue)
    elif jsonData['__mathObjectClass__'] == 'Mat44':
        val = Mat44()
        val.jsonDecode(jsonData, decodeValue)
    else:
        raise Exception("Unsupported Math type:" +
                        jsonData['__mathObjectClass__'])

    return val
Exemple #6
0
    def __init__(self, parent=None):
        super(GUI, self).__init__(parent)

        self.euler = Euler(1.0, 1.0, 9.5, 100)
        self.exact = Exact(1.0, 1.0, 9.5, 100)
        self.improved_euler = Improved_euler(1.0, 1.0, 9.5, 100)
        self.rungekutta = RungeKutta(1.0, 1.0, 9.5, 100)

        self.createTopGroupBox()
        self.createSelectInitialBox()
        self.createMethodBox()
        self.createTabBox()

        mainLayout = QGridLayout()
        mainLayout.addWidget(self.topGroupBox, 0, 0)
        mainLayout.addWidget(self.selectInitialBox, 1, 0)
        mainLayout.addWidget(self.methodBox, 2, 0)
        mainLayout.addWidget(self.bottomTabWidget, 3, 0)

        self.setLayout(mainLayout)
Exemple #7
0
    def __init__(self, param, grid):

        self.list_param = [
            'modelname', 'tend', 'fixed_dt', 'dt', 'cfl', 'plot_var', 'cax',
            'colorscheme', 'plot_interactive', 'fixed_dt', 'dtmax',
            'freq_save', 'freq_plot'
        ]

        param.copy(self, self.list_param)

        self.list_grid = ['dx', 'nh', 'msk']
        grid.copy(self, self.list_grid)

        if param.modelname == 'euler':
            from euler import Euler
            self.model = Euler(param, grid)

        if param.modelname == 'advection':
            from advection import Advection
            self.model = Advection(param, grid)

        if param.modelname == 'boussinesq':
            from boussinesq import Boussinesq
            self.model = Boussinesq(param, grid)

        if param.modelname == 'quasigeostrophic':
            from quasigeostrophic import QG
            self.model = QG(param, grid)

        self.diag = Diag(param, grid)
        self.plotting = Plotting(param)

        # here's a shortcut to the model state
        self.state = self.model.var.state

        self.t = 0.
        self.kt = 0

        self.output = Output(param, grid, self.diag)
Exemple #8
0
 def setUp(self):
     self.euler = Euler("y'=y*cos(x),\ny(0)=1\n\n")
Exemple #9
0
    if opc == "1":
        a = Area()
        while True:
            print("\n1. Area cuadrado")
            print("2. Area triangulo")
            print("3. Area circulo")
            op = input("Elige una opcion: ")

            if op == "1":
                a.areaCuadrado()
            elif op == "2":
                a.areaTriangulo()
            elif op == "3":
                a.areaCirculo()
            elif op == "0":
                break

    elif opc == "2":
        print("\n")
        z = Zodiaco()
        z.signo()

    elif opc == "3":
        e = Euler()
        print("\n")
        limite = int(input("Limite: "))
        n = e.numeroe(limite)
        print("e: ", n)
    else:
        break
Exemple #10
0
from euler import Euler

geom = rotate(loadtxt('../data/n0012c.dat'), 30*pi/180)
nE = 1000
dt = 0.001
Mach = 0.3
HiRes = 1.

if not os.path.exists('fig'): os.mkdir('fig')

for iAdapt in range(4):
    print 'Adapt cycle {0}'.format(iAdapt)
    
    if iAdapt == 0:
        v, t, b = initMesh(geom, nE)
        solver = Euler(v, t, b, Mach, HiRes)
        solver.integrate(1E-8, solver.freeStream())
    else:
        xt0, W0 = solver.mesh.xt(), solver.soln
        v, t, b = adaptMesh(geom, v, t, b, nE, metric)
        solver = Euler(v, t, b, Mach, HiRes)
        W0 = griddata(xt0, W0, solver.mesh.xt(), method='nearest')
        solver.integrate(1E-8, W0)

    metric = zeros([v.shape[0], 2, 2]) # metric for next adaptation

    for T in arange(1,21) * dt:
        solver.integrate(T)
        metric += solver.metric()
        clf()
        solver.mesh.plotTriScalar(solver.soln[:,0])
Exemple #11
0
    def __init__(self, param, grid):

        # let's first check that no param is obviously incorrect
        param.checkall()

        # copy the launch script into 'expname.py' to allow
        # for experiment reproducibility
        launchscript = sys.argv[0]
        param.datadir = param.datadir.replace('~', os.getenv("HOME"))
        param.expdir = '%s/%s' % (param.datadir, param.expname)
        if param.myrank == 0:
            if os.path.isdir(param.expdir):
                pass
            else:
                os.makedirs(param.expdir)
            savedscript = '%s/%s.py' % (param.expdir, param.expname)
            outfile = '%s/output.txt' % param.expdir
            if os.path.exists(outfile):
                print(
                    'Warning: this experiment has already been ran, output.txt already exists'
                )
                print('dummy.txt will be used instead')
                outfile = '%s/dummy.txt' % param.expdir

            sys.stdout = Logger(outfile)

            if os.path.exists(savedscript):
                print('Warning: the python script already exists in %s' %
                      param.expdir)
                print('the script won' 't be copied')
                pass
            else:
                self.savedscript = savedscript
                call(['cp', launchscript, savedscript])

        self.list_param = [
            'modelname', 'tend', 'adaptable_dt', 'dt', 'cfl', 'dtmax',
            'myrank', 'nprint', 'exacthistime', 'rescaledtime', 'noslip',
            'geometry', 'diag_fluxes', 'print_param', 'enforce_momentum',
            'forcing', 'decay', 'plotting_module', 'freq_save', 'freq_plot',
            'plot_interactive', 'nbproc', 'isisland', 'npx', 'npy', 'nx', 'ny'
        ]

        param.copy(self, self.list_param)

        self.dt0 = self.dt

        grid.finalize_msk()
        # print('momentum=',self.enforce_momentum)
        self.list_grid = ['dx', 'dy', 'nh', 'msk', 'xr0', 'yr0', 'x2', 'y2']
        grid.copy(self, self.list_grid)

        if param.modelname == 'euler':
            if self.geometry not in ['closed', 'disc']:
                self.enforce_momentum = False
            from euler import Euler
            self.model = Euler(param, grid)
        else:
            # not yet implemented in other models
            self.enforce_momentum = False

        if param.modelname == 'advection':
            from advection import Advection
            self.model = Advection(param, grid)

        if param.modelname == 'boussinesq':
            from boussinesq import Boussinesq
            self.model = Boussinesq(param, grid)

        if param.modelname == 'boussinesqTS':
            from boussinesqTS import BoussinesqTS
            self.model = BoussinesqTS(param, grid)

        if param.modelname == 'quasigeostrophic':
            from quasigeostrophic import QG
            self.model = QG(param, grid)

        if param.modelname == 'thermalwind':
            from thermalwind import Thermalwind
            self.model = Thermalwind(param, grid)

        if self.modelname == 'quasigeostrophic':
            self.enstrophyname = 'pv2'
        else:
            self.enstrophyname = 'enstrophy'

        if self.isisland:
            grid.island.finalize(self.model.ope.mskp)
            self.model.ope.rhsp = grid.island.rhsp
            self.model.ope.psi = grid.island.psi
            # self.diag = Diag(param,grid)

        if self.diag_fluxes:
            self.flx = Flx.Fluxes(param, grid, self.model.ope)
            flxlist = self.flx.fullflx_list
        else:
            flxlist = None

        if self.plot_interactive:
            try:
                p = import_module(self.plotting_module)
                # print(self.plotting_module)
            except ImportError:
                print('problem with the interactive plotting')
                print('this might be due to a backend issue')
                print('try to rerun the code with')
                print('param.plot_interactive = False')
                exit(0)

            self.plotting = p.Plotting(param, grid, self.model.var,
                                       self.model.diags)

        self.tracer_list = param.tracer_list
        # here's a shortcut to the model state
        self.state = self.model.var.state

        self.t = 0.
        self.kt = 0

        self.output = Output(param, grid, self.model.diags, flxlist=flxlist)
        self.print_config(param, start=True)
Exemple #12
0
 def setUp(self):
     self.e = Euler()
     self.problem1 = 'If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23. Find the sum of all the multiples of 3 or 5 below 1000.'
     self.problem2 = '''Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be: 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms.'''
Exemple #13
0
    def update(self):
        """時間発展(タイムオーダーは成長よりも短くすること)

        各点にかかる力は,それぞれに付いているバネから受ける力の合力。
        Runge-Kutta法を用いて運動方程式を解く。
        この内部でglow関数を呼ぶ

        --- Arguments ---
        point (class): 参照するPointクラスを指定する
        h     (float): シミュレーションの時間発展の刻み
        t_max (float): シミュレーションを終了する時間
        """

        # 初期条件
        X = np.array([
            self.point.position_x, self.point.position_y, self.point.vel_x,
            self.point.vel_y
        ])
        # X = [[x0, x1, ... , xN-1],
        #      [y1, y2, ... , yN-1],
        #      [x'0, x'1, ... , x'N-1],
        #      [y'1, y'2, ..., y'N-1]]

        # solver = RK4(self.force)  # Runge-Kutta method
        # solver = RK4(self.force_with_more_viscosity)  # Runge-Kutta method
        # solver = Euler(self.force)  # Euler method
        solver = Euler(self.force_with_more_viscosity)  # Euler method

        t_count, frame = 0, 0
        while self.t < self.t_max:
            if not self.pause:
                X = solver.solve(X, self.t, self.h)
                # update values
                self.point.position_x, self.point.position_y = X[0], X[1]
                self.point.vel_x, self.point.vel_y = X[2], X[3]

                # 各バネの自然長を増加させる & バネ定数を変化させる
                self.point.grow(self.grow_func, self.grow_func_k)

                # 各点間の距離が基準値を超えていたら,間に新たな点を追加する
                X = self.point.divide_if_extended(X)

                # self avoiding
                if self.self_avoiding:
                    self.update_position_self_avoiding()

                # 一定の間隔で描画を行う
                if self.t > self.h * 12 * frame:  # TODO: 要検討
                    log.info(self.t)
                    log.info("N: " + str(self.point.N))
                    log.info("x: " + str(self.point.position_x))
                    log.info("y: " + str(self.point.position_y))
                    log.info("d: " + str(
                        self.point.get_distances(self.point.position_x,
                                                 self.point.position_y)))
                    log.info("nl: " + str(self.point.natural_length))
                    log.info("K: " + str(self.point.K))
                    if self.point.is_open:
                        yield [self.point.position_x, self.point.position_y]
                    else:
                        yield [
                            np.append(self.point.position_x,
                                      self.point.position_x[0]),
                            np.append(self.point.position_y,
                                      self.point.position_y[0])
                        ]
                    frame += 1
                t_count += 1
                self.t = self.h * t_count
            else:
                time.sleep(0.1)
                if self.point.is_open:
                    yield [self.point.position_x, self.point.position_y]
                else:
                    yield [
                        np.append(self.point.position_x,
                                  self.point.position_x[0]),
                        np.append(self.point.position_y,
                                  self.point.position_y[0])
                    ]
        print "Done!"
Exemple #14
0
from euler import Euler
from math import pi

if __name__ == "__main__":
    equation = input("enter first order differential equation: ")
    curve = input("curve: ")
    x0 = float(input("x0: "))
    y0 = float(input("y0: "))
    if curve == "":
        e = Euler(equation, x0, y0)
    else:
        e = Euler(equation, x0, y0, curve)

    while True:
        x_final = eval(input("find value at: "))
        step_size = float(input("step_size: "))
        e.compare_errors(x_final, step_size)
Exemple #15
0
    def update(self):
        """時間発展(タイムオーダーは成長よりも短くすること)

        各点にかかる力は,それぞれに付いているバネから受ける力の合力。
        Runge-Kutta法を用いて運動方程式を解く。
        この内部でglow関数を呼ぶ

        --- Arguments ---
        point (class): 参照するPointクラスを指定する
        h     (float): シミュレーションの時間発展の刻み
        t_max (float): シミュレーションを終了する時間
        """

        # 初期条件
        X = np.array([self.point.position_x, self.point.position_y,
                      self.point.vel_x, self.point.vel_y
                      ])
        # X = [[x0, x1, ... , xN-1],
        #      [y1, y2, ... , yN-1],
        #      [x'0, x'1, ... , x'N-1],
        #      [y'1, y'2, ..., y'N-1]]

        # solver = RK4(self.force)  # Runge-Kutta method
        # solver = RK4(self.force_with_more_viscosity)  # Runge-Kutta method
        # solver = Euler(self.force)  # Euler method
        solver = Euler(self.force_with_more_viscosity)  # Euler method

        count_grow, frame = 1, 0
        grow_interval = 1000
        plot_interval = 8
        while self.t < self.t_max:
            print self.t
            if not self.pause:
                print "solver"
                X = solver.solve(X, self.t, self.h)
                # update values
                self.point.position_x, self.point.position_y = X[0], X[1]
                self.point.vel_x, self.point.vel_y = X[2], X[3]

                # ある時間間隔で新しく線素を追加する
                print self.h * grow_interval * count_grow
                if self.t > self.h * grow_interval * count_grow:
                    print "add point"
                    X = self.point.add()
                    count_grow += 1

                # self avoiding
                if self.self_avoiding:
                    self.update_position_self_avoiding()

                # 一定の間隔で描画を行う
                if self.t > self.h * plot_interval * frame:
                    log.info(self.t)
                    log.info("N: " + str(self.point.N))
                    log.info("x: " + str(self.point.position_x))
                    log.info("y: " + str(self.point.position_y))
                    log.info("d: " + str(self.point.distances(
                        self.point.position_x, self.point.position_y)))
                    log.info("nl: " + str(self.point.natural_length))
                    log.info("K: " + str(self.point.K))
                    if self.point.is_open:
                        yield [self.point.position_x, self.point.position_y]
                    else:
                        yield [np.append(self.point.position_x,
                                         self.point.position_x[0]),
                               np.append(self.point.position_y,
                                         self.point.position_y[0])]
                    frame += 1
                self.t = self.t + self.h
            else:
                time.sleep(0.1)
                if self.point.is_open:
                    yield [self.point.position_x, self.point.position_y]
                else:
                    yield [np.append(self.point.position_x,
                                     self.point.position_x[0]),
                           np.append(self.point.position_y,
                                     self.point.position_y[0])]
        print "Done!"
Exemple #16
0
    def __init__(self, param, grid):

        self.list_param = [
            'modelname', 'tend', 'adaptable_dt', 'dt', 'cfl', 'dtmax',
            'myrank', 'nprint', 'rescaledtime', 'noslip', 'geometry',
            'enforce_momentum', 'forcing', 'plotting_module', 'freq_save',
            'freq_plot', 'plot_interactive', 'nbproc', 'isisland'
        ]

        param.copy(self, self.list_param)

        grid.finalize_msk()
        #print('momentum=',self.enforce_momentum)
        self.list_grid = ['dx', 'nh', 'msk', 'xr0', 'yr0', 'x2', 'y2']
        grid.copy(self, self.list_grid)

        if param.modelname == 'euler':
            if not (self.geometry in ['square', 'disc']):
                self.enforce_momentum = False
            from euler import Euler
            self.model = Euler(param, grid)
        else:
            # not yet implemented in other models
            self.enforce_momentum = False

        if param.modelname == 'advection':
            from advection import Advection
            self.model = Advection(param, grid)

        if param.modelname == 'boussinesq':
            from boussinesq import Boussinesq
            self.model = Boussinesq(param, grid)

        if param.modelname == 'quasigeostrophic':
            from quasigeostrophic import QG
            self.model = QG(param, grid)

        if self.isisland:
            grid.island.finalize(self.model.ope.mskp)
            self.model.ope.rhsp = grid.island.rhsp
            self.model.ope.psi = grid.island.psi
#        self.diag = Diag(param,grid)

        if self.plot_interactive:
            try:
                p = import_module(self.plotting_module)
            except:
                print('module %s for plotting cannot be found' %
                      self.plotting_module)
                print('make sure file **%s.py** exists' % self.plotting_module)
                exit(0)

            self.plotting = p.Plotting(param, grid, self.model.var,
                                       self.model.diags)

        # here's a shortcut to the model state
        self.state = self.model.var.state

        self.t = 0.
        self.kt = 0

        self.output = Output(param, grid, self.model.diags)