double sw_trace(const int ieo, const double mu) { int i,x,icx,ioff; static su3 v; static _Complex double a[6][6]; static double tra; static double ks,kc,tr,ts,tt; static _Complex double det; ks=0.0; kc=0.0; if(ieo==0) { ioff=0; } else { ioff=(VOLUME+RAND)/2; } for(icx = ioff; icx < (VOLUME/2+ioff); icx++) { x = g_eo2lexic[icx]; for(i=0;i<2;i++) { populate_6x6_matrix(a, &sw[x][0][i], 0, 0); populate_6x6_matrix(a, &sw[x][1][i], 0, 3); _su3_dagger(v, sw[x][1][i]); populate_6x6_matrix(a, &v, 3, 0); populate_6x6_matrix(a, &sw[x][2][i], 3, 3); // we add the twisted mass term if(i == 0) add_tm(a, mu); else add_tm(a, -mu); // and compute the tr log (or log det) det = six_det(a); tra = log(conj(det)*det); // we need to compute only the one with +mu // the one with -mu must be the complex conjugate! tr=tra+kc; ts=tr+ks; tt=ts-ks; ks=ts; kc=tr-tt; } } kc=ks+kc; #ifdef MPI MPI_Allreduce(&kc, &ks, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD); return(ks); #else return(kc); #endif }
void sw_invert(const int ieo, const double mu) { int ioff, err=0; int i, x; static su3 v; static _Complex double a[6][6]; if(ieo==0) { ioff=0; } else { ioff=(VOLUME+RAND)/2; } for(int icx = ioff, icy = 0; icx < (VOLUME/2+ioff); icx++, icy++) { x = g_eo2lexic[icx]; for(i = 0; i < 2; i++) { populate_6x6_matrix(a, &sw[x][0][i], 0, 0); populate_6x6_matrix(a, &sw[x][1][i], 0, 3); _su3_dagger(v, sw[x][1][i]); populate_6x6_matrix(a, &v, 3, 0); populate_6x6_matrix(a, &sw[x][2][i], 3, 3); // we add the twisted mass term if(i == 0) add_tm(a, +mu); else add_tm(a, -mu); // and invert the resulting matrix err = six_invert(a); // here we need to catch the error! if(err > 0 && g_proc_id == 0) { printf("# inversion failed in six_invert code %d\n", err); err = 0; } /* copy "a" back to sw_inv */ get_3x3_block_matrix(&sw_inv[icy][0][i], a, 0, 0); get_3x3_block_matrix(&sw_inv[icy][1][i], a, 0, 3); get_3x3_block_matrix(&sw_inv[icy][2][i], a, 3, 3); get_3x3_block_matrix(&sw_inv[icy][3][i], a, 3, 0); } if(fabs(mu) > 0.) { for(i = 0; i < 2; i++) { populate_6x6_matrix(a, &sw[x][0][i], 0, 0); populate_6x6_matrix(a, &sw[x][1][i], 0, 3); _su3_dagger(v, sw[x][1][i]); populate_6x6_matrix(a, &v, 3, 0); populate_6x6_matrix(a, &sw[x][2][i], 3, 3); // we add the twisted mass term if(i == 0) add_tm(a, -mu); else add_tm(a, +mu); // and invert the resulting matrix err = six_invert(a); // here we need to catch the error! if(err > 0 && g_proc_id == 0) { printf("# %d\n", err); err = 0; } /* copy "a" back to sw_inv */ get_3x3_block_matrix(&sw_inv[icy+VOLUME/2][0][i], a, 0, 0); get_3x3_block_matrix(&sw_inv[icy+VOLUME/2][1][i], a, 0, 3); get_3x3_block_matrix(&sw_inv[icy+VOLUME/2][2][i], a, 3, 3); get_3x3_block_matrix(&sw_inv[icy+VOLUME/2][3][i], a, 3, 0); } } } return; }
int ausearch_time_end(const char *da, const char *ti) { /* If date == NULL, use current date */ /* If ti == NULL, use current time */ int rc = 0; struct tm d, t; char *ret; if (da == NULL) set_tm_now(&d); else { if (lookup_and_set_time(da, &d) < 0) { ret = strptime(da, "%x", &d); if (ret == NULL) { fprintf(stderr, "Invalid end date (%s). Month, Day, and Year are required.\n", da); return 1; } if (*ret != 0) { fprintf(stderr, "Error parsing end date (%s)\n", da); return 1; } } else { int keyword=lookup_time(da); if (keyword == T_RECENT || keyword == T_NOW) { if (ti == NULL || strcmp(ti, "00:00:00") == 0) goto set_it; } // Special case today if (keyword == T_TODAY) { set_tm_now(&d); if (ti == NULL || strcmp(ti, "00:00:00") == 0) goto set_it; } } } if (ti != NULL) { char tmp_t[36]; if (strlen(ti) <= 5) { snprintf(tmp_t, sizeof(tmp_t), "%s:00", ti); } else { tmp_t[0]=0; strncat(tmp_t, ti, sizeof(tmp_t)-1); } ret = strptime(tmp_t, "%X", &t); if (ret == NULL) { fprintf(stderr, "Invalid end time (%s). Hour, Minute, and Second are required.\n", ti); return 1; } if (*ret != 0) { fprintf(stderr, "Error parsing end time (%s)\n", ti); return 1; } } else { time_t tt = time(NULL); struct tm *tv = localtime(&tt); clear_tm(&t); t.tm_hour = tv->tm_hour; t.tm_min = tv->tm_min; t.tm_sec = tv->tm_sec; t.tm_isdst = tv->tm_isdst; } add_tm(&d, &t); if (d.tm_year < 104) { fprintf(stderr, "Error - year is %d\n", d.tm_year+1900); return -1; } set_it: // printf("end is: %s\n", ctime(&end_time)); end_time = mktime(&d); if (end_time == -1) { fprintf(stderr, "Error converting end time\n"); rc = -1; } return rc; }
int ausearch_time_start(const char *da, const char *ti) { /* If da == NULL, use current date */ /* If ti == NULL, then use midnight 00:00:00 */ int rc = 0; struct tm d, t; char *ret; if (da == NULL) set_tm_now(&d); else { if (lookup_and_set_time(da, &d) < 0) { ret = strptime(da, "%x", &d); if (ret == NULL) { fprintf(stderr, "Invalid start date (%s). Month, Day, and Year are required.\n", da); return 1; } if (*ret != 0) { fprintf(stderr, "Error parsing start date (%s)\n", da); return 1; } } else { int keyword=lookup_time(da); if (keyword == T_RECENT || keyword == T_NOW) { if (ti == NULL || strcmp(ti, "00:00:00") == 0) goto set_it; } } } if (ti != NULL) { char tmp_t[36]; if (strlen(ti) <= 5) { snprintf(tmp_t, sizeof(tmp_t), "%s:00", ti); } else { tmp_t[0]=0; strncat(tmp_t, ti, sizeof(tmp_t)-1); } ret = strptime(tmp_t, "%X", &t); if (ret == NULL) { fprintf(stderr, "Invalid start time (%s). Hour, Minute, and Second are required.\n", ti); return 1; } if (*ret != 0) { fprintf(stderr, "Error parsing start time (%s)\n", ti); return 1; } } else clear_tm(&t); add_tm(&d, &t); if (d.tm_year < 104) { fprintf(stderr, "Error - year is %d\n", d.tm_year+1900); return -1; } set_it: // printf("start is: %s\n", ctime(&start_time)); start_time = mktime(&d); if (start_time == -1) { fprintf(stderr, "Error converting start time\n"); rc = -1; } return rc; }