void env_init(t_env *env) { if (!(env->position = malloc(sizeof(*env->position)))) error_quit("Failed to malloc position struct"); env->position->x = 3; env->position->y = 2; if (!(env->direction = malloc(sizeof(*env->direction)))) error_quit("Failed to malloc rotation struct"); env->direction->x = -1; env->direction->y = 0; if (!(env->window = malloc(sizeof(*env->window)))) error_quit("Failed to malloc window struct"); if (!(env->map = malloc(sizeof(*env->window)))) error_quit("Failed to malloc map struct"); env->last_time = time_elapse(); env->tmp_fps = 0; env->fps = 0; env->plane_x = 0; env->plane_y = 1; env->left = 0; env->right = 0; env->up = 0; env->down = 0; }
CPS_START_NAMESPACE //-------------------------------------------------------------------- // CVS keywords // // $Source: /home/chulwoo/CPS/repo/CVS/cps_only/cps_pp/src/util/dirac_op/d_op_mobius/noarch/mobius_m.C,v $ // $State: Exp $ // //-------------------------------------------------------------------- //------------------------------------------------------------------ // mobius_m.C // // mobius_m is the fermion matrix. // The in, out fields are defined on the checkerboard lattice // //------------------------------------------------------------------ CPS_END_NAMESPACE #include<util/dwf.h> #include<util/mobius.h> #include<util/gjp.h> #include<util/vector.h> #include<util/verbose.h> #include<util/error.h> #include<util/dirac_op.h> #include<util/time_cps.h> #include "blas-subs.h" CPS_START_NAMESPACE //4d precond. mobius Dirac op: // M_5 - kappa_b^2 M4eo M_5^-1 M4oe void mobius_m(Vector *out, Matrix *gauge_field, Vector *in, Float mass, Dwf *mobius_lib_arg) { //------------------------------------------------------------------ // Initializations //------------------------------------------------------------------ const int f_size = 24 * mobius_lib_arg->vol_4d * mobius_lib_arg->ls / 2; const Float kappa_ratio = mobius_lib_arg->mobius_kappa_b/mobius_lib_arg->mobius_kappa_c; const Float minus_kappa_b_sq = -mobius_lib_arg->mobius_kappa_b * mobius_lib_arg->mobius_kappa_b; Vector *frm_tmp2 = (Vector *) mobius_lib_arg->frm_tmp2; //Vector *temp = (Vector *) smalloc(f_size * sizeof(Float)); Float norm; // out = [ 1 + kappa_b/kappa_c 1/2 dslash_5 - kappa_b^2 Meo M5inv Moe] in // (dslash_5 uses (1+-g5), not P_R,L, i.e. no factor of 1/2 which is here out front) // 1. ftmp2 = Meo M5inv Moe in // 2. out <- in // 3. out += -kappa_b^2 ftmp2 // 4. out += -kappa_b/kappa_c /2 dslash_5 in // (done by the dslash_5 with a5_inv = -kappa_b/kappa_c/2 *GJP.MobiusA5Inv() ) //-------------------------------------------------------------- // 1. ftmp2 = Meo M5inv Moe in //-------------------------------------------------------------- // Apply Dslash O <- E //------------------------------------------------------------------ time_elapse(); mobius_dslash_4(out, gauge_field, in, 0, 0, mobius_lib_arg, mass); DEBUG_MOBIUS_DSLASH("mobius_dslash_4 %e\n", time_elapse()); //------------------------------------------------------------------ // Apply M_5^-1 (hopping in 5th dir + diagonal) //------------------------------------------------------------------ mobius_m5inv(out, mass, 0, mobius_lib_arg); DEBUG_MOBIUS_DSLASH("mobius_m5inv %e\n", time_elapse()); //------------------------------------------------------------------ // Apply Dslash E <- O //------------------------------------------------------------------ mobius_dslash_4(frm_tmp2, gauge_field, out, 1, 0, mobius_lib_arg, mass); DEBUG_MOBIUS_DSLASH("mobius_dslash_4 %e\n", time_elapse()); //------------------------------------------------------------------ // 2. out <- in //------------------------------------------------------------------ #ifndef USE_BLAS moveFloat((IFloat*)out, (IFloat*)in, f_size); #else cblas_dcopy(f_size, (IFloat*)in, 1, (IFloat*)out, 1); #endif DEBUG_MOBIUS_DSLASH("out <- in %e\n", time_elapse()); //------------------------------------------------------------------ // 3. out += -kap2 ftmp2 //------------------------------------------------------------------ #ifndef USE_BLAS fTimesV1PlusV2((IFloat*)out, minus_kappa_b_sq, (IFloat*)frm_tmp2, (IFloat *)out, f_size); #else cblas_daxpy(f_size, minus_kappa_b_sq, (IFloat*)frm_tmp2,1, (IFloat *)out, 1); #endif DEBUG_MOBIUS_DSLASH("mobius out+= kap2 %e\n", time_elapse()); //------------------------------------------------------------------ // 4. out += kappa_b/kappa_c dslash_5 in //------------------------------------------------------------------ mobius_kappa_dslash_5_plus(out, in, mass, 0, mobius_lib_arg, kappa_ratio); DEBUG_MOBIUS_DSLASH("mobius_kappa_dslash_5_plus %e\n", time_elapse()); // Flops count in this function is two AXPY = 4 flops per vector elements //DiracOp::CGflops += 3*f_size; }
CPS_START_NAMESPACE //-------------------------------------------------------------------- // CVS keywords // // $Source: /home/chulwoo/CPS/repo/CVS/cps_only/cps_pp/src/util/dirac_op/d_op_mobius/noarch/mobius_mdag.C,v $ // $State: Exp $ // //-------------------------------------------------------------------- //------------------------------------------------------------------ // mobius_m.C // // mobius_m is the fermion matrix. // The in, out fields are defined on the checkerboard lattice // //------------------------------------------------------------------ CPS_END_NAMESPACE #include<util/dwf.h> #include<util/mobius.h> #include<util/gjp.h> #include<util/vector.h> #include<util/verbose.h> #include<util/error.h> #include<util/dirac_op.h> #include<util/time_cps.h> #include "blas-subs.h" CPS_START_NAMESPACE //4d precond. mobius Dirac op: // ( M_5 - kappa_b^2 M4eo M_5^-1 M4oe )^ dag void mobius_mdag(Vector *out, Matrix *gauge_field, Vector *in, Float mass, Dwf *mobius_lib_arg) { //------------------------------------------------------------------ // Initializations //------------------------------------------------------------------ IFloat *g_field; Wilson *wilson_p; int size_cb[2]; const int ls = mobius_lib_arg->ls; const int f_size = 24 * mobius_lib_arg->vol_4d * ls / 2; const Float minus_kappa_b_sq = -mobius_lib_arg->mobius_kappa_b * mobius_lib_arg->mobius_kappa_b; const Float kappa_ratio = mobius_lib_arg->mobius_kappa_b/mobius_lib_arg->mobius_kappa_c; const Float b_coeff = GJP.Mobius_b(); const Float c_coeff = GJP.Mobius_c(); Vector *frm_tmp2 = (Vector *) mobius_lib_arg->frm_tmp2; Vector *frm_tmp3 = (Vector *) mobius_lib_arg->frm_tmp3; Float norm; IFloat* frm_in; IFloat* frm_out; g_field = (IFloat *) gauge_field; wilson_p = mobius_lib_arg->wilson_p; size_cb[0] = 24*wilson_p->vol[0]; size_cb[1] = 24*wilson_p->vol[1]; // out = [ 1 + kappa_b/kappa_c 1/2 dslash_5 - kappa_b^2 Meo M5inv Moe] in // 1. ftmp2 = Meo M5inv Moe in // 2. out <- in // 3. out += -kappa_b^2 ftmp2 // 4. out += -kappa_b/kappa_c /2 dslash_5 in // (done by the dslash_5 with a5_inv = -kappa_b/kappa_c/2 *GJP.MobiusA5Inv() ) time_elapse(); // O <- E int parity = 0; // out = D^dag_W * frm_in frm_in = (IFloat*)in; frm_out = (IFloat*)out; for(int i=0; i<ls; i++){ // Apply on 4-dim "parity" checkerboard part //------------------------------------------------------------ wilson_dslash(frm_out, g_field, frm_in, parity, 1, wilson_p); frm_in = frm_in + size_cb[parity]; frm_out = frm_out + size_cb[parity]; } DEBUG_MOBIUS_DSLASH("mobius_dslash_4_dag %e\n", time_elapse()); //TIZB "b_coeff" part moveFloat((IFloat*)frm_tmp2, (IFloat*)out, f_size); vecTimesEquFloat( (IFloat*)out, b_coeff, f_size); DEBUG_MOBIUS_DSLASH("mobius_dslash_5_dag_b %e\n", time_elapse()); mobius_kappa_dslash_5_plus(out, frm_tmp2, mass, 1, mobius_lib_arg, c_coeff); DEBUG_MOBIUS_DSLASH("mobius_dslash_5_dag_c %e\n", time_elapse()); mobius_m5inv(out, mass, 1, mobius_lib_arg); DEBUG_MOBIUS_DSLASH("mobius_m5inv_dag %e\n", time_elapse()); // E <- O parity = 1; frm_in = (IFloat*)out; frm_out = (IFloat*)frm_tmp2; for(int i=0; i<ls; i++){ // Apply on 4-dim "parity" checkerboard part //------------------------------------------------------------ wilson_dslash(frm_out, g_field, frm_in, parity, 1, wilson_p); frm_in = frm_in + size_cb[parity]; frm_out = frm_out + size_cb[parity]; } DEBUG_MOBIUS_DSLASH("mobius_dslash_4_dag %e\n", time_elapse()); moveFloat((IFloat*)frm_tmp3, (IFloat*)frm_tmp2, f_size); DEBUG_MOBIUS_DSLASH("mobius dag moveFloat %e\n", time_elapse()); vecTimesEquFloat( (IFloat*)frm_tmp3, b_coeff, f_size); DEBUG_MOBIUS_DSLASH("mobius dag times b %e\n", time_elapse()); mobius_kappa_dslash_5_plus(frm_tmp3, frm_tmp2, mass, 1, mobius_lib_arg, c_coeff); DEBUG_MOBIUS_DSLASH("mobius_dslash_5_dag_c_plus %e\n", time_elapse()); // M_5 part, add //------------------------------------------------------------------ // 2. out <- in //------------------------------------------------------------------ #ifndef USE_BLAS moveFloat((IFloat*)out, (IFloat*)in, f_size); #else cblas_dcopy(f_size, (IFloat*)in, 1, (IFloat*)out, 1); #endif DEBUG_MOBIUS_DSLASH("mobius dag out<-in %e\n", time_elapse()); //------------------------------------------------------------------ // 3. out += -kap2 ftmp3 //------------------------------------------------------------------ #ifndef USE_BLAS fTimesV1PlusV2((IFloat*)out, minus_kappa_b_sq, (IFloat*)frm_tmp3, (IFloat *)out, f_size); #else cblas_daxpy(f_size, minus_kappa_b_sq, (IFloat*)frm_tmp3, 1, (IFloat *)out, 1); #endif DEBUG_MOBIUS_DSLASH("mobius dag += -kap2 ftmp3 %e\n", time_elapse()); //------------------------------------------------------------------ // 4. out += kap dslash_5 in //------------------------------------------------------------------ mobius_kappa_dslash_5_plus(out, in, mass, 1, mobius_lib_arg, kappa_ratio); DEBUG_MOBIUS_DSLASH("mobius_kappa_dslash_5_dag_plus %e\n", time_elapse()); // Flops count in this function is two AXPY = 4 flops per vector elements DiracOp::CGflops += 3*f_size; }