10 template<
typename AFIELD>
12 =
"AFopr_CloverTerm<AFIELD>";
15 template<
typename AFIELD>
27 vout.
general(m_vl,
"%s: construction\n", class_name.c_str());
34 m_Ndf = 2 * m_Nc * m_Nc;
35 m_Ndm2 = m_Nd * m_Nd / 2,
48 set_parameters(params);
53 m_U.reset(m_Ndf, m_Nst, m_Ndim);
56 m_T.reset(m_Ndf, m_Nst, m_Ndm2);
57 m_Tinv.reset(m_Ndf, m_Nst, m_Ndm2);
60 int NinF = 2 * m_Nc * m_Nd;
61 m_v1.reset(NinF, m_Nst, 1);
62 m_v2.reset(NinF, m_Nst, 1);
65 m_ut1.reset(m_Ndf, m_Nst, 1), m_ut2.reset(m_Ndf, m_Nst, 1);
67 m_U2.reset(m_Ndf, m_Nst, 4);
68 m_F2.reset(m_Ndf, m_Nst, 1);
71 double ecrit = 1.0e-30;
72 if(
sizeof(
real_t) == 4) ecrit = 1.0e-16;
76 params_solver.
set_int(
"maximum_number_of_iteration", 100);
77 params_solver.
set_int(
"maximum_number_of_restart", 10);
78 params_solver.
set_double(
"convergence_criterion_squared", ecrit);
81 params_solver.
set_string(
"verbose_level", vlevel);
84 m_solver->set_parameters(params_solver);
93 template<
typename AFIELD>
104 template<
typename AFIELD>
122 vout.
crucial(m_vl,
"Error at %s: input parameter not found.\n",
131 vout.
general(m_vl,
" gamma_matrix_type is not given - set to Dirac\n");
133 }
else if(repr ==
"Dirac"){
135 }
else if(repr ==
"Chiral"){
138 vout.
crucial(m_vl,
"Error in %s: irrelevant gamma_matrix_type: %s\n",
139 class_name.c_str(), repr.c_str());
148 template<
typename AFIELD>
151 const std::vector<int> bc)
153 assert(bc.size() == m_Ndim);
162 m_boundary.resize(m_Ndim);
163 for (
int mu = 0; mu < m_Ndim; ++mu) {
164 m_boundary[mu] = bc[mu];
169 vout.
general(m_vl,
"Parameters of %s:\n", class_name.c_str());
171 vout.
general(m_vl,
" gamma-matrix type = Dirac\n");
173 vout.
general(m_vl,
" gamma-matrix type = Chiral\n");
177 for (
int mu = 0; mu < m_Ndim; ++mu) {
178 vout.
general(m_vl,
" boundary[%d] = %2d\n", mu, m_boundary[mu]);
185 template<
typename AFIELD>
198 template<
typename AFIELD>
208 template<
typename AFIELD>
213 vout.
detailed(m_vl,
"%s: set_config started.\n", class_name.c_str());
220 if (ith == 0) m_conf = u;
228 vout.
detailed(m_vl,
" convert: %11.6f [sec]\n", elapsed_time);
237 vout.
detailed(m_vl,
" set_csw: %11.6f [sec]\n", elapsed_time);
246 vout.
detailed(m_vl,
" set_csw_inv: %11.6f [sec]\n", elapsed_time);
248 vout.
detailed(m_vl,
"%s: set_config finished.\n", class_name.c_str());
254 template<
typename AFIELD>
259 }
else if(m_repr == CHIRAL){
262 vout.
crucial(m_vl,
"%s: unsupported representation.\n",
270 template<
typename AFIELD>
273 vout.
paranoiac(m_vl,
" %s: solving inverse of clover term started.\n",
277 solve_csw_inv_dirac();
279 solve_csw_inv_chiral();
282 vout.
paranoiac(m_vl,
" %s: solving inverse of clover term finished.\n",
320 template<
typename AFIELD>
331 m_Tinv.set_host(0.0);
333 int ith, nth, is, ns;
334 set_threadtask(ith, nth, is, ns, m_Nst);
337 for(
int id = 0;
id < Nd2; ++id){
338 for(
int ic = 0; ic < m_Nc; ++ic){
341 for(
int site = is; site < ns; ++site){
342 m_v1.set_host(index.idx_SPr(ic,
id, site, 0),
real_t(1.0));
349 m_solver->solve(m_v2, m_v1, Nconv, diff);
350 vout.
paranoiac(m_vl,
" ic = %d id = %d Nconv = %d diff = %12.4e\n",
351 ic,
id, Nconv, diff);
355 for(
int site = is; site < ns; ++site){
356 for(
int ic2 = 0; ic2 < m_Nc; ++ic2){
357 for(
int id2 = 0; id2 < m_Nd; ++id2){
358 real_t re = m_v2.cmp_host(index.idx_SPr(ic2, id2, site, 0));
359 real_t im = m_v2.cmp_host(index.idx_SPi(ic2, id2, site, 0));
360 int iT = id2 + m_Nd * id;
361 m_Tinv.set_host(index.idx_Gr(ic2, ic, site, iT), re);
362 m_Tinv.set_host(index.idx_Gi(ic2, ic, site, iT), -im);
378 template<
typename AFIELD>
389 m_Tinv.set_host(0.0);
391 int ith, nth, is, ns;
392 set_threadtask(ith, nth, is, ns, m_Nst);
395 for(
int id = 0;
id < Nd2; ++id){
396 for(
int ic = 0; ic < m_Nc; ++ic){
399 for(
int site = is; site < ns; ++site){
400 m_v1.set_host(index.idx_SPr(ic,
id, site, 0),
real_t(1.0));
401 m_v1.set_host(index.idx_SPr(ic,
id+Nd2, site, 0),
real_t(1.0));
408 m_solver->solve(m_v2, m_v1, Nconv, diff);
409 vout.
paranoiac(m_vl,
" ic = %d id = %d Nconv = %d diff = %12.4e\n",
410 ic,
id, Nconv, diff);
414 for(
int site = is; site < ns; ++site){
416 for(
int ic2 = 0; ic2 < m_Nc; ++ic2){
417 for(
int id2 = 0; id2 < Nd2; ++id2){
418 real_t re = m_v2.cmp_host(index.idx_SPr(ic2, id2, site, 0));
419 real_t im = m_v2.cmp_host(index.idx_SPi(ic2, id2, site, 0));
420 int iT = id2 + Nd2 * id;
421 m_Tinv.set_host(index.idx_Gr(ic2, ic, site, iT), re);
422 m_Tinv.set_host(index.idx_Gi(ic2, ic, site, iT), -im);
426 for(
int ic2 = 0; ic2 < m_Nc; ++ic2){
427 for(
int id2 = 0; id2 < Nd2; ++id2){
429 real_t re = m_v2.cmp_host(index.idx_SPr(ic2, jd2, site, 0));
430 real_t im = m_v2.cmp_host(index.idx_SPi(ic2, jd2, site, 0));
431 int iT = id2 + Nd2 *
id +
ND;
432 m_Tinv.set_host(index.idx_Gr(ic2, ic, site, iT), re);
433 m_Tinv.set_host(index.idx_Gi(ic2, ic, site, iT), -im);
450 template<
typename AFIELD>
454 vout.
crucial(m_vl,
"%s: in get_csw, incorrect AFIELD size.\n",
464 template<
typename AFIELD>
468 vout.
crucial(m_vl,
"%s: in get_csw_inv, incorrect AFIELD size.\n",
484 class_name.c_str(), elapsed_time);
492 template<
typename AFIELD>
496 int Nst = m_T.nvol();
499 vout.
crucial(m_vl,
"%s: in get_csw_inv, incorrect AFIELD size.\n",
505 vout.
crucial(m_vl,
"%s: in get_csw_inv, index is too large.\n",
510 copy(T, 0, m_Tinv, j);
516 template<
typename AFIELD>
547 set_fieldstrength(m_F2, m_U2, 1, 2);
556 set_fieldstrength(m_F2, m_U2, 2, 0);
563 set_fieldstrength(m_F2, m_U2, 0, 1);
571 set_fieldstrength(m_F2, m_U2, 3, 0);
579 set_fieldstrength(m_F2, m_U2, 3, 1);
586 set_fieldstrength(m_F2, m_U2, 3, 2);
593 scal(m_T, -m_CKs * m_cSW);
611 template<
typename AFIELD>
646 set_fieldstrength(m_F2, m_U2, 1, 2);
656 set_fieldstrength(m_F2, m_U2, 2, 0);
665 set_fieldstrength(m_F2, m_U2, 0, 1);
675 set_fieldstrength(m_F2, m_U2, 3, 0);
685 set_fieldstrength(m_F2, m_U2, 3, 1);
694 set_fieldstrength(m_F2, m_U2, 3, 2);
703 scal(m_T, -m_CKs * m_cSW);
718 template<
typename AFIELD>
722 m_staple->upper(m_ut2, U, mu, nu);
725 mult_Gdn(m_ut1, 0, m_ut2, 0, U, mu);
727 m_staple->lower(m_ut2, U, mu, nu);
732 m_staple->shift_forward(m_ut2, 0, m_ut1, 0, mu);
747 template<
typename AFIELD>
753 if (ith == 0) m_mode = mode;
760 template<
typename AFIELD>
767 template<
typename AFIELD>
772 }
else if(m_mode ==
"Dinv"){
774 }
else if(m_mode ==
"H"){
777 vout.
crucial(m_vl,
"%s: mode undefined.\n", class_name.c_str());
784 template<
typename AFIELD>
789 }
else if(m_mode ==
"Dinv"){
791 }
else if(m_mode ==
"H"){
794 vout.
crucial(m_vl,
"%s: mode undefined.\n", class_name.c_str());
801 template<
typename AFIELD>
803 const std::string mode)
807 }
else if(mode ==
"H"){
810 vout.
crucial(m_vl,
"%s: illegal mode is given to mult with mode\n",
818 template<
typename AFIELD>
829 template<
typename AFIELD>
836 template<
typename AFIELD>
844 template<
typename AFIELD>
850 set_thread(ith, nth);
865 template<
typename AFIELD>
871 set_thread(ith, nth);
890 template<
typename AFIELD>
900 set_thread(ith, nth);
915 template<
typename AFIELD>
925 set_thread(ith, nth);
940 template<
typename AFIELD>
948 double flop_site, flop;
950 if (m_repr == DIRAC) {
951 flop_site =
static_cast<double>(
952 m_Nc * m_Nd * (4 + 6 * (4 * m_Nc + 2) + 2 * (4 * m_Nc + 1))
953 + 8 * m_Nc * m_Nc * m_Nd * m_Nd);
954 }
else if (m_repr == CHIRAL) {
955 flop_site =
static_cast<double>(
956 m_Nc * m_Nd * (4 + 8 * (4 * m_Nc + 2))
957 + 8 * m_Nc * m_Nc * m_Nd * m_Nd);
961 vout.
crucial(m_vl,
"%s: input repr is undefined.\n");
965 flop = flop_site *
static_cast<double>(Lvol);
966 if ((m_mode ==
"DdagD") || (m_mode ==
"DDdag")) flop *= 2.0;