-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmake_cl_solver.qlua
79 lines (63 loc) · 2.26 KB
/
make_cl_solver.qlua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
require "stdlib"
require "timer"
require "defl_util"
-- Chebyshev polynomial acceleration parameters
-- cheb = {cheb_n, cheb_a, cheb_b, cheb_x0}
-- Lanczos algorithm parameters
-- lanczos_param = {
-- ["nev"] = 10,
-- ["ncv"] = 20,
-- ["maxiter"] = 10000,
-- ["tol"] = 1.e-08
-- }
-- Chebyshev polynomial acceleration parameters
-- cheb_param = { ["which"] = "LR", -- default: "SR"
-- ["arpack_logfile"] = "arpack_log_file" -- ARPACK verbose printing
-- ["cheb_accel"] = {n, a, b, x0}, -- poly.acceleration
-- ["inplace"] = true, -- default: false
-- ["eigcg"] = {vmax, nev, tol, umax},
-- }
-- mixed solver parameters
--mixed_solver_param = {
-- ["eps_i"] = 1.e-10,
-- ["max_iter_i"] = 50000,
-- ["eps_f"] = 1.e-22,
-- ["dirac_max_iter"] = 50000
--}
-- eigenspace parameters
--evec_param = {
-- ["read_eigenspace"] = true,
-- ["evec_pack_eopc"] = ,
-- ["evec_file"] = ,
--}
function make_cl_solver (L, u, kappa, csw, bc, evec_param, lanczos_param, cheb_param, mixed_solver_param)
local D_CL = qcd.Clover(u, kappa, csw, bc)
if evec_param["read_eigenspace"] then
-- construct a deflator
Defl_CL = D_CL:eig_deflator(eigcg_param["vmax"], eigcg_param["nev"], eigcg_parma["tol"], eigcg_param["umax"])
df_load_timer = timer("load_df_space")
qdp_r = open_qdpc_read(L, evec_param["evec_file"])
deflator_read_espace_d4(Defl_CL, qdp_r, eigcg_param["umax"], evec_param["evec_pack_eopc"])
qdp_r:close()
printf("# df_cur_dim = %d\n", Defl_CL:current_dim())
df_load_timer("done")
else
Defl_CL = D_CL:eig_deflator_lanczos(
lanczos_param["nev"], lanczos_param["ncv"], lanczos_param["max_iter"], lanczos_param["tol"],
cheb_param)
end
-- print eigenvalues
local evals = Defl_CL:eigenvalues()
printf("# str(evals) = %s\n", tostring(evals))
for i=0, #evals-1 do
printf("# eval[%04d] = %e\n", i, evals[i])
end
-- construct a solver
solver = Defl_CL:mixed_solver(
mixed_solver_param["eps_i"],
mixed_solver_param["max_iter_i"],
mixed_solver_param["eps_f"],
mixed_solver_param["dirac_max_iter"]
)
return solver
end