19 #if defined(QMP_COMMS) 21 #elif defined(MPI_COMMS) 25 #include <gtest/gtest.h> 45 #define MAX(a,b) ((a)>(b)?(a):(b)) 46 #define DABS(a) ((a)<(0.)?(-(a)):(a)) 55 gauge_param.
X[0] =
xdim;
56 gauge_param.
X[1] =
ydim;
57 gauge_param.
X[2] =
zdim;
58 gauge_param.
X[3] =
tdim;
78 int x_face_size = gauge_param.
X[1]*gauge_param.
X[2]*gauge_param.
X[3]/2;
79 int y_face_size = gauge_param.
X[0]*gauge_param.
X[2]*gauge_param.
X[3]/2;
80 int z_face_size = gauge_param.
X[0]*gauge_param.
X[1]*gauge_param.
X[3]/2;
81 int t_face_size = gauge_param.
X[0]*gauge_param.
X[1]*gauge_param.
X[2]/2;
82 int pad_size =
MAX(x_face_size, y_face_size);
83 pad_size =
MAX(pad_size, z_face_size);
84 pad_size =
MAX(pad_size, t_face_size);
85 gauge_param.
ga_pad = pad_size;
94 const double max_error = 1e-10;
100 reunit_allow_svd, reunit_svd_only,
101 svd_rel_error, svd_abs_error);
112 a0 =
DABS(a.x - b.x);
115 double prec_val = 1.0e-5;
117 if( (a0 < prec_val) && (a1 < prec_val) && (a2 < prec_val) )
return true;
122 double prec_val = 5e-8;
124 if(
DABS(1.0 - detu.x) < prec_val &&
DABS(detu.y) < prec_val)
return true;
134 errorQuda(
"Error in the unitarization\n");
177 int R[4] = {0,0,0,0};
179 for(
int dir=0; dir<4; ++dir) y[dir] =
param.
X[dir] + 2 * R[dir];
184 gParamEx.order = gParam.
order;
188 for(
int dir=0; dir<4; ++dir) gParamEx.r[dir] = R[dir];
194 randstates =
new RNG(gParam, 1234);
203 a0.Start(__func__, __FILE__, __LINE__);
204 a1.Start(__func__, __FILE__, __LINE__);
207 cudaMemset(num_failures_dev, 0,
sizeof(
int));
208 if(num_failures_dev == NULL)
errorQuda(
"cudaMalloc failed for dev_pointer\n");
214 SetReunitarizationConsts();
217 for(
int step=1; step<=nsteps; ++step){
219 Monte( *cudaInGauge, *randstates, beta_value, nhbsteps, novrsteps);
224 a1.Stop(__func__, __FILE__, __LINE__);
226 printfQuda(
"Time Monte -> %.6f s\n", a1.Last());
228 printfQuda(
"Plaq: %.16e , %.16e, %.16e\n", plaq.x, plaq.y, plaq.z);
234 printfQuda(
"Det: %.16e:%.16e\n", detu.x, detu.y);
235 printfQuda(
"Tr: %.16e:%.16e\n", tru.x/3.0, tru.y/3.0);
243 a0.Stop(__func__, __FILE__, __LINE__);
245 randstates->Release();
269 bool testgen =
false;
271 if(plaq.x < 0.614 && plaq.x > 0.611 && plaq.y < 0.614 && plaq.y > 0.611) testgen =
true;
274 ASSERT_TRUE(CheckDeterminant(detu));
279 const int reunit_interval = 10;
280 printfQuda(
"Landau gauge fixing with overrelaxation\n");
281 gaugefixingOVR(*cudaInGauge, 4, 100, 10, 1.5, 0, reunit_interval, 1);
282 ASSERT_TRUE(comparePlaquette(plaq,
plaquette(*cudaInGauge)));
286 const int reunit_interval = 10;
287 printfQuda(
"Coulomb gauge fixing with overrelaxation\n");
288 gaugefixingOVR(*cudaInGauge, 3, 100, 10, 1.5, 0, reunit_interval, 1);
289 ASSERT_TRUE(comparePlaquette(plaq,
plaquette(*cudaInGauge)));
293 if(!checkDimsPartitioned()){
294 printfQuda(
"Landau gauge fixing with steepest descent method with FFTs\n");
296 ASSERT_TRUE(comparePlaquette(plaq,
plaquette(*cudaInGauge)));
301 if(!checkDimsPartitioned()){
302 printfQuda(
"Coulomb gauge fixing with steepest descent method with FFTs\n");
304 ASSERT_TRUE(comparePlaquette(plaq,
plaquette(*cudaInGauge)));
309 int main(
int argc,
char **argv){
311 ::testing::InitGoogleTest(&argc, argv);
316 for (i=1; i<argc; i++){
321 fprintf(stderr,
"ERROR: Invalid option:%s\n", argv[i]);
327 test_rc = RUN_ALL_TESTS();
static bool reunit_allow_svd
QudaReconstructType reconstruct_sloppy
QudaGhostExchange ghostExchange
enum QudaPrecision_s QudaPrecision
QudaPrecision & cuda_prec
bool comparePlaquette(double3 a, double3 b)
double2 getLinkDeterminant(cudaGaugeField &data)
Calculate the Determinant.
void setUnitarizeLinksConstants(double unitarize_eps, double max_error, bool allow_svd, bool svd_only, double svd_rel_error, double svd_abs_error)
int process_command_line_option(int argc, char **argv, int *idx)
QudaGaugeParam gauge_param
QudaGaugeFieldOrder gauge_order
void gaugefixingOVR(cudaGaugeField &data, const int gauge_dir, const int Nsteps, const int verbose_interval, const double relax_boost, const double tolerance, const int reunit_interval, const int stopWtheta)
Gauge fixing with overrelaxation with support for single and multi GPU.
void cpuSetGaugeParam(QudaGaugeParam &gauge_param)
QudaReconstructType link_recon_sloppy
static double svd_rel_error
void initQuda(int device)
void unitarizeLinks(cudaGaugeField &outfield, const cudaGaugeField &infield, int *fails)
void PGaugeExchangeFree()
Release all allocated memory used to exchange data between nodes.
void CallUnitarizeLinks(quda::cudaGaugeField *cudaInGauge)
static bool reunit_svd_only
QudaReconstructType link_recon
Class declaration to initialize and hold CURAND RNG states.
QudaPrecision prec_sloppy
QudaGaugeFieldOrder order
void CallUnitarizeLinks(cudaGaugeField *cudaInGauge)
double2 getLinkTrace(cudaGaugeField &data)
Calculate the Trace.
QudaPrecision & cuda_prec_sloppy
QudaPrecision cuda_prec_sloppy
void InitGaugeField(cudaGaugeField &data)
Perform a cold start to the gauge field, identity SU(3) matrix, also fills the ghost links in multi-G...
static double svd_abs_error
bool checkDimsPartitioned()
QudaReconstructType reconstruct
void SetReunitarizationConsts()
void gaugefixingFFT(cudaGaugeField &data, const int gauge_dir, const int Nsteps, const int verbose_interval, const double alpha, const int autotune, const double tolerance, const int stopWtheta)
Gauge fixing with Steepest descent method with FFTs with support for single GPU only.
bool CheckDeterminant(double2 detu)
enum QudaReconstructType_s QudaReconstructType
Main header file for the QUDA library.
static double unitarize_eps
TEST_F(GaugeAlgTest, Generation)
int main(int argc, char **argv)
cudaGaugeField * cudaInGauge
QudaReconstructType reconstruct
void Monte(cudaGaugeField &data, RNG &rngstate, double Beta, int nhb, int nover)
Perform heatbath and overrelaxation. Performs nhb heatbath steps followed by nover overrelaxation ste...
int gridsize_from_cmdline[]
void initComms(int argc, char **argv, int *const commDims)
void setVerbosity(QudaVerbosity verbosity)
double3 plaquette(const GaugeField &U)
Compute the plaquette of the gauge field.
int comm_dim_partitioned(int dim)
QudaGaugeParam newQudaGaugeParam(void)