Exemplo n.º 1
0
def solver_nonlinear(G, d_, w_, wd_, bcs, T, dt, action=None, **namespace):
    dis_x = []; dis_y = []; time = []
    solver_parameters = {"newton_solver": \
                          {"relative_tolerance": 1E-8,
                           "absolute_tolerance": 1E-8,
                           "maximum_iterations": 100,
                           "relaxation_parameter": 1.0}}
    t = 0
    while t <= T:
        solve(G == 0, wd_["n"], bcs, solver_parameters=solver_parameters)

        # Update solution
        times = ["n-3", "n-2", "n-1", "n"]
        for i, t_tmp in enumerate(times[:-1]):
            wd_[t_tmp].vector().zero()
            wd_[t_tmp].vector().axpy(1, wd_[times[i+1]].vector())
            w_[t_tmp], d_[t_tmp] = wd_[t_tmp].split(True)

        # Get displacement
        if callable(action):
            action(wd_, t)

        t += dt
        if MPI.rank(mpi_comm_world()) == 0:
            print "Time: ", t
Exemplo n.º 2
0
def solver_nonlinear(G, d_, w_, wd_, bcs, T, dt, action=None, **namespace):
    dis_x = []; dis_y = []; time = []
    solver_parameters = {"newton_solver": \
                          {"relative_tolerance": 1E-8,
                           "absolute_tolerance": 1E-8,
                           "maximum_iterations": 100,
                           #"krylov_solver": {"monitor_convergence": True},
                           #"linear_solver": {"monitor_convergence": True},
                           "relaxation_parameter": 0.9}}
    t = 0
    while t < (T - dt*DOLFIN_EPS):
        solve(G == 0, wd_["n"], bcs, solver_parameters=solver_parameters)

        # Update solution
        times = ["n-3", "n-2", "n-1", "n"]
        for i, t_tmp in enumerate(times[:-1]):
            wd_[t_tmp].vector().zero()
            wd_[t_tmp].vector().axpy(1, wd_[times[i+1]].vector())
            w_[t_tmp], d_[t_tmp] = wd_[t_tmp].split(True)

        # Get displacement
        if callable(action):
            action(wd_, t)

        t += dt
        if MPI.rank(mpi_comm_world()) == 0:

            print "Time: ",t #,"dis_x: ", d(coord)[0], "dis_y: ", d(coord)[1]

    return dis_x, dis_y, time
Exemplo n.º 3
0
def Newton_manual(F, udp, bcs, atol, rtol, max_it, lmbda, udp_res, VVQ):
    #Reset counters
    Iter = 0
    residual = 1
    rel_res = residual
    dw = TrialFunction(VVQ)
    Jac = derivative(F, udp, dw)  # Jacobi

    while rel_res > rtol and residual > atol and Iter < max_it:
        A = assemble(Jac)
        A.ident_zeros()
        b = assemble(-F)

        [bc.apply(A, b, udp.vector()) for bc in bcs]

        #solve(A, udp_res.vector(), b, "superlu_dist")

        solve(A, udp_res.vector(), b)  #, "mumps")

        udp.vector()[:] = udp.vector()[:] + lmbda * udp_res.vector()[:]
        #udp.vector().axpy(1., udp_res.vector())
        [bc.apply(udp.vector()) for bc in bcs]
        rel_res = norm(udp_res, 'l2')
        residual = b.norm('l2')

        if MPI.rank(mpi_comm_world()) == 0:
            print "Newton iteration %d: r (atol) = %.3e (tol = %.3e), r (rel) = %.3e (tol = %.3e) " \
        % (Iter, residual, atol, rel_res, rtol)
        Iter += 1

    return udp
Exemplo n.º 4
0
def Newton_manual(F, vd, bcs, J, atol, rtol, max_it, lmbda\
                 , vd_res):
    #Reset counters
    Iter      = 0
    residual   = 1
    rel_res    = residual
    while rel_res > rtol and residual > atol and Iter < max_it:
        A = assemble(J, keep_diagonal = True)
        A.ident_zeros()
        b = assemble(-F)

        [bc.apply(A, b, vd.vector()) for bc in bcs]

        #solve(A, vd_res.vector(), b, "superlu_dist")
        #solve(A, vd_res.vector(), b, "mumps")
        solve(A, vd_res.vector(), b)

        vd.vector().axpy(1., vd_res.vector())
        [bc.apply(vd.vector()) for bc in bcs]
        rel_res = norm(vd_res, 'l2')
        residual = b.norm('l2')

        if MPI.rank(mpi_comm_world()) == 0:
            print "Newton iteration %d: r (atol) = %.3e (tol = %.3e), r (rel) = %.3e (tol = %.3e) " \
        % (Iter, residual, atol, rel_res, rtol)
        Iter += 1

    #Reset
    residual   = 1
    rel_res    = residual
    Iter = 0

    return vd
Exemplo n.º 5
0
def print_text(text, color='white', atrb=0, cls=None):
  """
  Print text <text> from calling class <cl> to the screen.
  """
  if cls is not None:
    color = cls.color()
  if MPI.rank(mpi_comm_world())==0:
    if atrb != 0:
      text = ('%s%s' + text + '%s') % (fg(color), attr(atrb), attr(0))
    else:
      text = ('%s' + text + '%s') % (fg(color), attr(0))
    print text
Exemplo n.º 6
0
def get_text(text, color='white', atrb=0, cls=None):
  """
  Returns text <text> from calling class <cl> for later printing.
  """
  if cls is not None:
    color = cls.color()
  if MPI.rank(mpi_comm_world())==0:
    if atrb != 0:
      text = ('%s%s' + text + '%s') % (fg(color), attr(atrb), attr(0))
    else:
      text = ('%s' + text + '%s') % (fg(color), attr(0))
    return text
Exemplo n.º 7
0
def print_min_max(u, title, color='97', cls=None):
  """
  Print the minimum and maximum values of <u>, a Vector, Function, or array.
  """
  #if cls is not None:
  #  color = cls.color()
  if isinstance(u, GenericVector):
    uMin = MPI.min(mpi_comm_world(), u.min())
    uMax = MPI.max(mpi_comm_world(), u.max())
    s    = title + ' <min, max> : <%.3e, %.3e>' % (uMin, uMax)
    print_text(s, color)
  elif isinstance(u, ndarray):
    if u.dtype != float64:
      u = u.astype(float64)
    uMin = MPI.min(mpi_comm_world(), u.min())
    uMax = MPI.max(mpi_comm_world(), u.max())
    s    = title + ' <min, max> : <%.3e, %.3e>' % (uMin, uMax)
    print_text(s, color)
  elif isinstance(u, Function):# \
    #   or isinstance(u, dolfin.functions.function.Function):
    uMin = MPI.min(mpi_comm_world(), u.vector().min())
    uMax = MPI.max(mpi_comm_world(), u.vector().max())
    s    = title + ' <min, max> : <%.3e, %.3e>' % (uMin, uMax)
    print_text(s, color)
  elif isinstance(u, int) or isinstance(u, float):
    s    = title + ' : %.3e' % u
    print_text(s, color)
  elif isinstance(u, Constant):
    s    = title + ' : %.3e' % u(0)
    print_text(s, color)
  else:
    er = title + ": print_min_max function requires a Vector, Function" \
         + ", array, int or float, not %s." % type(u)
    print_text(er, 'red', 1)
Exemplo n.º 8
0
def viz(results, runs):
    if MPI.rank(mpi_comm_world()) != 0: pass
    # TODO: Get minimum time of all to plot over consistent
    plt.figure()
    for i, r in enumerate(results):
        displacement_x = np.array(r[0])
        displacement_y = np.array(r[1])
        time = np.array(r[2])
        simulation_parameters = runs[i]
        E = simulation_parameters["E"]
        dt = simulation_parameters["dt"]
        name = simulation_parameters["name"]
        case_path = simulation_parameters["case_path"]

        plt.plot(time, displacement_y, label=name)
        plt.ylabel("Displacement y")
        plt.xlabel("Time")
        plt.legend(loc=3)
        plt.hold("on")

        plt.title("implementation: %s, dt = %g, y_displacement" % (name, dt))

        # TODO: Move this to solver and use fenicsprobe
        if MPI.rank(mpi_comm_world()) == 0:
            if not path.exists(case_path):
                makedirs(case_path)

            print case_path
            displacement_x.dump(path.join(case_path, "dis_x.np"))
            displacement_t.dump(path.join(case_path, "dis_y.np"))
            time.dump(path.join(case_path, "time.np"))

            # Store simulation parameters
            f = open(path.join(case_path, "param.dat", 'w'))
            cPickle.dump(simulation_parameters, f)
            f.close()

    # FIXME: store in a consistent manner
    plt.savefig("test.png")
Exemplo n.º 9
0
def solver_linear(G, d_, w_, wd_, bcs, T, dt, action=None, **namespace):
    a = lhs(G); L = rhs(G)
    A = assemble(a)
    b = assemble(L)
    t = 0

    #d_prec = PETScPreconditioner("default")
    #d_solver = PETScKrylovSolver("gmres", d_prec)
    #d_solver.parameters["monitor_convergence"] = True
    #from IPython import embed; embed()
    #d_solver.prec = d_prec

    # Solver loop
    while t < (T - dt*DOLFIN_EPS):
        t += dt

        # Assemble
        assemble(a, tensor=A)
        assemble(L, tensor=b)

        # Apply BC
        for bc in bcs: bc.apply(A, b)

        # Solve
        #d_solver.solve(A, wd_["n"].vector(), b)
        solve(A, wd_["n"].vector(), b)

        # Update solution
        times = ["n-3", "n-2", "n-1", "n"]
        for i, t_tmp in enumerate(times[:-1]):
            wd_[t_tmp].vector().zero()
            wd_[t_tmp].vector().axpy(1, wd_[times[i+1]].vector())

        # Get displacement
        if callable(action):
            action(wd_, t)

        if MPI.rank(mpi_comm_world()) == 0:
            print "Time: ",t
Exemplo n.º 10
0
    t0 = timer.time()
    #try:
    if r["space"] == "mixedspace":
        problem_mix(**vars())
    elif r["space"] == "singlespace":
        problem_single()
    else:
        print("Problem type %s is not implemented, only mixedspace " +
              "and singlespace are valid options") % r["space"]
        sys.exit(0)
    #except Exception as e:
    #    print "Problems for solver", r["name"]
    #    print "Unexpected error:", sys.exc_info()[0]
    #    print e
    #    print "Move on the the next solver"
    r["number_of_cores"] = MPI.max(mpi_comm_world(), MPI.rank(
        mpi_comm_world())) + 1
    r["solution_time"] = MPI.sum(mpi_comm_world(),
                                 timer.time() - t0) / (r["number_of_cores"])

    displacement = probe.array()
    probe.clear()

    # Store results
    if MPI.rank(mpi_comm_world()) == 0 and not load:
        results.append(
            (displacement[0, :], displacement[1, :], np.array(time)))
        if not path.exists(r["case_path"]):
            makedirs(r["case_path"])
        results[-1][0].dump(path.join(r["case_path"], "dis_x.np"))
        results[-1][1].dump(path.join(r["case_path"], "dis_y.np"))
        results[-1][2].dump(path.join(r["case_path"], "time.np"))
Exemplo n.º 11
0
a, L = lhs(F), rhs(F)

# Time-stepping
u_np1 = Function(V)
u_np1.rename("Temperature", "")
t = 0

# reference solution at t=0
u_ref = interpolate(u_D, V)
u_ref.rename("reference", " ")

# mark mesh w.r.t ranks
mesh_rank = MeshFunction("size_t", mesh, mesh.topology().dim())
if problem is ProblemType.NEUMANN:
    mesh_rank.set_all(MPI.rank(MPI.comm_world) + 4)
else:
    mesh_rank.set_all(MPI.rank(MPI.comm_world) + 0)
mesh_rank.rename("myRank", "")

# Generating output files
temperature_out = File("out/%s.pvd" % precice.get_participant_name())
ref_out = File("out/ref%s.pvd" % precice.get_participant_name())
error_out = File("out/error%s.pvd" % precice.get_participant_name())
ranks = File("out/ranks%s.pvd" % precice.get_participant_name())

# output solution and reference solution at t=0, n=0
n = 0
print('output u^%d and u_ref^%d' % (n, n))
temperature_out << u_n
ref_out << u_ref