15 #ifndef FIELD_INCLUDED
16 #define FIELD_INCLUDED
54 int myindex(
const int jin,
const int site,
const int jex)
55 const {
return jin +
m_Nin * (site +
m_Nvol * jex); }
65 Field(
const int Nin,
const int Nvol,
const int Nex,
74 void reset(
const int Nin,
const int Nvol,
const int Nex,
92 double cmp(
const int jin,
const int site,
const int jex)
const
97 double cmp(
const int i)
const {
return field[i]; }
101 void set(
const int jin,
const int site,
const int jex,
double v)
106 void set(
const int i,
double v) {
field[i] = v; }
108 void add(
const int jin,
const int site,
const int jex,
double v)
118 assert(exw < w.
nex());
119 for (
int site = 0; site <
m_Nvol; ++site) {
120 for (
int jin = 0; jin <
m_Nin; ++jin) {
129 assert(exw < w.
nex());
130 for (
int site = 0; site <
m_Nvol; ++site) {
131 for (
int jin = 0; jin <
m_Nin; ++jin) {
140 assert(exw < w.
nex());
141 for (
int site = 0; site <
m_Nvol; ++site) {
142 for (
int jin = 0; jin <
m_Nin; ++jin) {
169 double *yp =
const_cast<Field *
>(
this)->
ptr(0);
170 double *xp =
const_cast<Field *
>(&x)->
ptr(0);
176 for (
int i = 0; i <
m_Ntot; ++i) {
188 for (
int i = 0; i <
m_Ntot; ++i) {
198 double *xp =
const_cast<Field *
>(&x)->
ptr(0);
203 for (
int i = 0; i <
m_Ntot; ++i) {
211 double *xp =
const_cast<Field *
>(&x)->
ptr(0);
217 for (
int k = 0; k <
m_Ntot / 2; ++k) {
218 yp[2 * k] += ar * xp[2 * k] - ai * xp[2 * k + 1];
219 yp[2 * k + 1] += ai * xp[2 * k] + ar * xp[2 * k + 1];
223 for (
int k = 0; k <
m_Ntot; ++k) {
236 for (
int i = 0; i <
m_Ntot; ++i) {
243 for (
int i = 0; i <
m_Ntot; ++i) {
251 double *xp =
const_cast<Field *
>(&x)->
ptr(0);
256 for (
int i = 0; i <
m_Ntot; ++i) {
263 for (
int i = 0; i <
m_Ntot; ++i) {
273 void stat(
double& Fave,
double& Fmax,
double& Fdev);
284 #ifdef USE_EXPR_TEMPL
369 double *yp =
const_cast<Field *
>(&y)->ptr(0);
370 double *xp =
const_cast<Field *
>(&x)->ptr(0);
373 assert(x.
ntot() == Ntot);
378 for (
int k = 0; k < Ntot / 2; ++k) {
379 prdr += yp[2 * k] * xp[2 * k]
380 + yp[2 * k + 1] * xp[2 * k + 1];
381 prdi += yp[2 * k] * xp[2 * k + 1]
382 - yp[2 * k + 1] * xp[2 * k];
386 return cmplx(prdr, prdi);
389 for (
int k = 0; k < Ntot; ++k) {
390 prdr += yp[k] * xp[k];
393 return cmplx(prdr, 0.0);
416 #ifdef USE_EXPR_TEMPL
422 return Field(lhs) += rhs;
430 return Field(lhs) -= rhs;
436 static Field calc(
const Field& lhs,
const double& rhs)
438 return Field(lhs) *= rhs;
441 static Field calc(
const double& lhs,
const Field& rhs)
443 return Field(rhs) *= lhs;
447 template<
typename L,
typename Op,
typename R>
453 AdSbMc(
const L& Lhs,
const R& Rhs) : lhs(Lhs), rhs(Rhs) {}
454 Field eval()
const {
return Op::calc(lhs.eval(), rhs.eval()); }
457 template<
typename L,
typename Op>
458 class AdSbMc<L, Op,
Field> {
463 AdSbMc(
const L& Lhs,
const Field& Rhs) : lhs(Lhs), rhs(Rhs) {}
464 Field eval()
const {
return Op::calc(lhs.eval(), rhs); }
467 template<
typename Op,
typename R>
468 class AdSbMc<
Field, Op, R> {
473 AdSbMc(
const Field& Lhs,
const R& Rhs) : lhs(Lhs), rhs(Rhs) {}
474 Field eval()
const {
return Op::calc(lhs, rhs.eval()); }
478 class AdSbMc<L, Mul, double> {
483 AdSbMc(
const L& Lhs,
const double& Rhs) : lhs(Lhs), rhs(Rhs) {}
484 Field eval()
const {
return Mul::calc(lhs.eval(), rhs); }
488 class AdSbMc<
Field, Mul, double> {
493 AdSbMc(
const Field& Lhs,
const double& Rhs) : lhs(Lhs), rhs(Rhs) {}
494 Field eval()
const {
return Mul::calc(lhs, rhs); }
498 class AdSbMc<double, Mul, R> {
503 AdSbMc(
const double& Lhs,
const R& Rhs) : lhs(Lhs), rhs(Rhs) {}
504 Field eval()
const {
return Mul::calc(lhs, rhs.eval()); }
508 class AdSbMc<double, Mul,
Field> {
513 AdSbMc(
const double& Lhs,
const Field& Rhs) : lhs(Lhs), rhs(Rhs) {}
514 Field eval()
const {
return Mul::calc(lhs, rhs); }
517 template<
typename Op>
523 AdSbMc(
const Field& Lhs,
const Field& Rhs) : lhs(Lhs), rhs(Rhs) {}
524 Field eval()
const {
return Op::calc(lhs, rhs); }
527 template<
typename L,
typename R>
528 AdSbMc<L, Add, R>
operator+(
const L& lhs,
const R& rhs)
530 return AdSbMc<L, Add, R>(lhs, rhs);
534 template<
typename L,
typename R>
535 AdSbMc<L, Sub, R>
operator-(
const L& lhs,
const R& rhs)
537 return AdSbMc<L, Sub, R>(lhs, rhs);
542 AdSbMc<double, Mul, R>
operator*(
const double& lhs,
const R& rhs)
544 return AdSbMc<double, Mul, R>(lhs, rhs);
548 #else // USE_EXPR_TEMPL
581 #endif // USE_EXPR_TEMPL