コード例 #1
0
 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));
     }
 }
コード例 #2
0
ファイル: construct.cpp プロジェクト: ibaned/omega_h2
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);
  }
}
コード例 #3
0
ファイル: construct.cpp プロジェクト: ibaned/omega_h2
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;
}
コード例 #4
0
ファイル: unmap_mesh.cpp プロジェクト: ibaned/omega_h2
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);
}
コード例 #5
0
ファイル: Matrix3.cpp プロジェクト: tocode/v5
// adj
Matrix3 Adj(const Matrix3& m)
{
	Matrix3 r;
	r.mat = Adj(m.mat);
	return r;
}
コード例 #6
0
ファイル: force.cpp プロジェクト: daschaich/susy-serial
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;
}