void insert(int u, int v, int c, int w, int d = 0) { n = max(n, max(u, v) + 1); adj[u].push_back(Adj(v, c, w, adj[v].size())); adj[v].push_back(Adj(u, 0, -w, adj[u].size() - 1)); if (d) { adj[v].push_back(Adj(u, c, w, adj[u].size())); adj[u].push_back(Adj(v, 0, -w, adj[v].size() - 1)); } }
void add_ents2verts(Mesh* mesh, Int edim, LOs ev2v, Read<GO> vert_globals) { auto comm = mesh->comm(); Remotes owners; if (comm->size() > 1) { auto deg = edim + 1; if (edim < mesh->dim()) { resolve_derived_copies(comm, vert_globals, deg, &ev2v, &owners); } else { auto ne = ev2v.size() / deg; owners = identity_remotes(comm, ne); } } if (edim == 1) { mesh->set_ents(edim, Adj(ev2v)); } else { auto ldim = edim - 1; auto lv2v = mesh->ask_verts_of(ldim); auto v2l = mesh->ask_up(VERT, ldim); auto down = reflect_down(ev2v, lv2v, v2l, edim, ldim); mesh->set_ents(edim, down); } if (comm->size() > 1) { mesh->set_owners(edim, owners); globals_from_owners(mesh, edim); } else { mesh->ask_globals(edim); } }
void resolve_derived_copies(CommPtr comm, Read<GO> verts2globs, Int deg, LOs* p_ent_verts2verts, Remotes* p_ents2owners) { auto ev2v = *p_ent_verts2verts; auto ev2vg = unmap(ev2v, verts2globs, 1); auto canon_codes = get_codes_to_canonical(deg, ev2vg); auto ev2v_canon = align_ev2v(deg, ev2v, canon_codes); *p_ent_verts2verts = ev2v_canon; auto ev2vg_canon = align_ev2v(deg, ev2vg, canon_codes); auto e2fv = get_component(ev2v_canon, deg, 0); auto total_verts = find_total_globals(comm, verts2globs); auto v2ov = globals_to_linear_owners(comm, verts2globs, total_verts); auto e2ov = unmap(e2fv, v2ov); auto linsize = linear_partition_size(comm, total_verts); auto in_dist = Dist(comm, e2ov, linsize); auto sev2vg = in_dist.exch(ev2vg_canon, deg); auto out_dist = in_dist.invert(); auto sv2svse = out_dist.roots2items(); auto nse = out_dist.nitems(); auto svse2se = LOs(nse, 0, 1); auto sv2se_codes = Read<I8>(nse, make_code(false, 0, 0)); auto sv2se = Adj(sv2svse, svse2se, sv2se_codes); auto se2fsv = invert_fan(sv2svse); LOs se2ose; Read<I8> se2ose_codes; find_matches_ex(deg, se2fsv, sev2vg, sev2vg, sv2se, &se2ose, &se2ose_codes); auto ose2oe = out_dist.items2dests(); auto se2oe = unmap(se2ose, ose2oe); out_dist.set_roots2items(LOs()); auto e2oe = out_dist.exch(se2oe, 1); *p_ents2owners = e2oe; }
void unmap_down(Mesh* old_mesh, Mesh* new_mesh, Int ent_dim, LOs new_ents2old_ents, LOs old_lows2new_lows) { auto deg = simplex_degrees[ent_dim][ent_dim - 1]; auto old_ents2old_lows = old_mesh->ask_down(ent_dim, ent_dim - 1); auto oel2ol = old_ents2old_lows.ab2b; auto oe2l_codes = old_ents2old_lows.codes; auto nel2ol = unmap(new_ents2old_ents, oel2ol, deg); auto nel2nl = compound_maps(nel2ol, old_lows2new_lows); auto new_ents2new_lows = Adj(nel2nl); if (oe2l_codes.exists()) { auto ne2l_codes = unmap(new_ents2old_ents, oe2l_codes, deg); new_ents2new_lows.codes = ne2l_codes; } new_mesh->set_ents(ent_dim, new_ents2new_lows); }
// adj Matrix3 Adj(const Matrix3& m) { Matrix3 r; r.mat = Adj(m.mat); return r; }
void force(const Gauge_Field &U, Gauge_Field &f_U, const Twist_Fermion &F, Twist_Fermion &f_F, int fermion){ Lattice_Vector x,e_mu,e_nu; int sites,mu,nu,i,j,a; Twist_Fermion sol[DEGREE],psol[DEGREE]; Gauge_Field Udag,utmp,U2,UdU,ft; USite_Field DmuUmu; UPlaq_Field Fmunu; Twist_Fermion ptmp,stmp; Umatrix tmp,tmp2,ftmp; Complex trace; // gauge force - boson contribution Udag=Adj(U); DmuUmu=USite_Field(); Fmunu=UPlaq_Field(); f_U=Gauge_Field(); //SIMON: beta term modification sites=0; while(loop_over_lattice(x,sites)){ for(mu=0;mu<NUMLINK;mu++){ e_mu=Lattice_Vector(mu); trace=Tr(U.get(x,mu)*Udag.get(x,mu)); DmuUmu.set(x,DmuUmu.get(x)+(1.0+C1)*U.get(x,mu)*Udag.get(x,mu)- Udag.get(x-e_mu,mu)*U.get(x-e_mu,mu)-(C1/NCOLOR)*trace*Umatrix(1));} } sites=0; while(loop_over_lattice(x,sites)){ for(mu=0;mu<NUMLINK;mu++){ e_mu=Lattice_Vector(mu); f_U.set(x,mu,f_U.get(x,mu)+(1.0+C1)*U.get(x,mu)*Udag.get(x,mu)*DmuUmu.get(x)); f_U.set(x,mu,f_U.get(x,mu)-U.get(x,mu)*DmuUmu.get(x+e_mu)*Udag.get(x,mu)); f_U.set(x,mu,f_U.get(x,mu)-(C1/NCOLOR)*Tr(DmuUmu.get(x))*Udag.get(x,mu)); f_U.set(x,mu,C2*f_U.get(x,mu)); } } sites=0; while(loop_over_lattice(x,sites)){ for(mu=0;mu<NUMLINK;mu++){ e_mu=Lattice_Vector(mu); for(nu=mu+1;nu<NUMLINK;nu++){ e_nu=Lattice_Vector(nu); Fmunu.set(x,mu,nu,U.get(x,mu)*U.get(x+e_mu,nu)-U.get(x,nu)*U.get(x+e_nu,mu)); Fmunu.set(x,nu,mu,-1.0*Fmunu.get(x,mu,nu)); } } } sites=0; while(loop_over_lattice(x,sites)){ for(mu=0;mu<NUMLINK;mu++){ e_mu=Lattice_Vector(mu); for(nu=0;nu<NUMLINK;nu++){ e_nu=Lattice_Vector(nu); if(mu==nu) continue; f_U.set(x,mu,f_U.get(x,mu)+2.0*U.get(x,mu)*U.get(x+e_mu,nu)*Adj(Fmunu.get(x,mu,nu))); f_U.set(x,mu,f_U.get(x,mu)-2.0*U.get(x,mu)*Adj(Fmunu.get(x-e_nu,mu,nu))*U.get(x-e_nu,nu)); }}} sites=0; while(loop_over_lattice(x,sites)){ for(mu=0;mu<NUMLINK;mu++){ f_U.set(x,mu,KAPPA*f_U.get(x,mu)); }} // U(1) mass term sites=0; while(loop_over_lattice(x,sites)){ for(mu=0;mu<NUMLINK;mu++){ UdU.set(x,mu,U.get(x,mu)*Udag.get(x,mu)-Umatrix(1)); }} sites=0; while(loop_over_lattice(x,sites)){ for(mu=0;mu<NUMLINK;mu++){ f_U.set(x,mu,f_U.get(x,mu)+ (2*KAPPA*BMASS*BMASS)*U.get(x,mu)*Udag.get(x,mu)*UdU.get(x,mu)); }} force_det(U,ft); sites=0; while(loop_over_lattice(x,sites)){ for(mu=0;mu<NUMLINK;mu++){ f_U.set(x,mu,f_U.get(x,mu)+ft.get(x,mu)); }} sites=0; while(loop_over_lattice(x,sites)){ for(mu=0;mu<NUMLINK;mu++){ f_U.set(x,mu,-1.0*Adj(f_U.get(x,mu))); }} // SU(N) case if(NUMGEN==(NCOLOR*NCOLOR-1)){ sites=0; while(loop_over_lattice(x,sites)){ for(mu=0;mu<NUMLINK;mu++){ f_U.set(x,mu,f_U.get(x,mu)-(1.0/NCOLOR)*Tr(f_U.get(x,mu))*Umatrix(1)); } } } // add in contributions from pseudofermions // use partial fraction approx to inverse square root of operator f_F=Twist_Fermion(); if(FERMIONS && (fermion==1)){ f_U=Gauge_Field(); //cout << "fermion forces " << endl; f_F=-ampdeg*Cjg(F); MCG_solver(U,F,shift,sol,psol); for(int n=0;n<DEGREE;n++){ stmp=sol[n]; ptmp=psol[n]; fermion_forces(U,utmp,stmp,ptmp); f_F=f_F-amp[n]*Cjg(sol[n]); // add in kick from fermion effective action sites=0; while(loop_over_lattice(x,sites)){ for(int mu=0;mu<NUMLINK;mu++){ f_U.set(x,mu,f_U.get(x,mu)+amp[n]*utmp.get(x,mu)); }} } f_F=Cjg(f_F); } return; }