/** nonbonded and bonded force calculation using the verlet list */ void nsq_calculate_ia() { Particle *partl, *partg; Particle *pt1, *pt2; int p, p2, npl, npg, c; double d[3], dist2, dist; npl = local->n; partl = local->part; /* calculate bonded interactions and non bonded node-node */ for (p = 0; p < npl; p++) { pt1 = &partl[p]; add_bonded_force(pt1); #ifdef CONSTRAINTS add_constraints_forces(pt1); #endif /* other particles, same node */ for (p2 = p + 1; p2 < npl; p2++) { pt2 = &partl[p2]; get_mi_vector(d, pt1->r.p, pt2->r.p); dist2 = sqrlen(d); dist = sqrt(dist2); #ifdef EXCLUSIONS if (do_nonbonded(pt1, pt2)) #endif add_non_bonded_pair_force(pt1, pt2, d, dist, dist2); } /* calculate with my ghosts */ for (c = 0; c < me_do_ghosts.n; c++) { npg = me_do_ghosts.cell[c]->n; partg = me_do_ghosts.cell[c]->part; for (p2 = 0; p2 < npg; p2++) { pt2 = &partg[p2]; get_mi_vector(d, pt1->r.p, pt2->r.p); dist2 = sqrlen(d); dist = sqrt(dist2); #ifdef EXCLUSIONS if (do_nonbonded(pt1, pt2)) #endif add_non_bonded_pair_force(pt1, pt2, d, dist, dist2); } } } }
void calculate_verlet_ia() { int c, np, n, i; Cell *cell; Particle *p1, *p2, **pairs; double dist2, vec21[3]; /* Loop local cells */ for (c = 0; c < local_cells.n; c++) { cell = local_cells.cell[c]; p1 = cell->part; np = cell->n; /* calculate bonded interactions (loop local particles) */ for(i = 0; i < np; i++) { add_bonded_force(&p1[i]); #ifdef CONSTRAINTS add_constraints_forces(&p1[i]); #endif add_external_potential_forces(&p1[i]); } /* Loop cell neighbors */ for (n = 0; n < dd.cell_inter[c].n_neighbors; n++) { pairs = dd.cell_inter[c].nList[n].vList.pair; np = dd.cell_inter[c].nList[n].vList.n; /* verlet list loop */ for(i=0; i<2*np; i+=2) { p1 = pairs[i]; /* pointer to particle 1 */ p2 = pairs[i+1]; /* pointer to particle 2 */ dist2 = distance2vec(p1->r.p, p2->r.p, vec21); add_non_bonded_pair_force(p1, p2, vec21, sqrt(dist2), dist2); } } } }
void build_verlet_lists_and_calc_verlet_ia() { int c, np1, n, np2, i ,j, j_start; Cell *cell; IA_Neighbor *neighbor; Particle *p1, *p2; PairList *pl; double dist2, vec21[3]; #ifdef VERLET_DEBUG int estimate, sum=0; double max_range_nonbonded2 = SQR(max_cut_nonbonded + skin); fprintf(stderr,"%d: build_verlet_list_and_calc_verlet_ia:\n",this_node); /* estimate number of interactions: (0.5*n_part*ia_volume*density)/n_nodes */ estimate = 0.5*n_part*(4.0/3.0*PI*pow(max_range_nonbonded2,1.5))*(n_part/(box_l[0]*box_l[1]*box_l[2]))/n_nodes; if (!dd.use_vList) { fprintf(stderr, "%d: build_verlet_lists, but use_vList == 0\n", this_node); errexit(); } #endif /* Loop local cells */ for (c = 0; c < local_cells.n; c++) { VERLET_TRACE(fprintf(stderr,"%d: cell %d with %d neighbors\n",this_node,c, dd.cell_inter[c].n_neighbors)); cell = local_cells.cell[c]; p1 = cell->part; np1 = cell->n; /* Loop cell neighbors */ for (n = 0; n < dd.cell_inter[c].n_neighbors; n++) { neighbor = &dd.cell_inter[c].nList[n]; p2 = neighbor->pList->part; np2 = neighbor->pList->n; VERLET_TRACE(fprintf(stderr,"%d: neighbor %d contains %d parts\n",this_node,n,np2)); /* init pair list */ pl = &neighbor->vList; pl->n = 0; /* Loop cell particles */ for(i=0; i < np1; i++) { j_start = 0; /* Tasks within cell: bonded forces, store old position, avoid double counting */ if(n == 0) { #ifdef MULTI_TIMESTEP if (p1[i].p.smaller_timestep==current_time_step_is_small || smaller_time_step < 0.) #endif { add_bonded_force(&p1[i]); #ifdef CONSTRAINTS add_constraints_forces(&p1[i]); #endif add_external_potential_forces(&p1[i]); memcpy(p1[i].l.p_old, p1[i].r.p, 3*sizeof(double)); j_start = i+1; } } /* no interaction set, no need for particle pairs */ if (max_cut_nonbonded == 0.0) continue; /* Loop neighbor cell particles */ for(j = j_start; j < np2; j++) { #ifdef EXCLUSIONS if(do_nonbonded(&p1[i], &p2[j])) #endif { dist2 = distance2vec(p1[i].r.p, p2[j].r.p, vec21); VERLET_TRACE(fprintf(stderr,"%d: pair %d %d has distance %f\n",this_node,p1[i].p.identity,p2[j].p.identity,sqrt(dist2))); if(dist2 <= SQR(get_ia_param(p1[i].p.type, p2[j].p.type)->max_cut + skin)) { ONEPART_TRACE(if(p1[i].p.identity==check_id) fprintf(stderr,"%d: OPT: Verlet Pair %d %d (Cells %d,%d %d,%d dist %f)\n",this_node,p1[i].p.identity,p2[j].p.identity,c,i,n,j,sqrt(dist2))); ONEPART_TRACE(if(p2[j].p.identity==check_id) fprintf(stderr,"%d: OPT: Verlet Pair %d %d (Cells %d %d dist %f)\n",this_node,p1[i].p.identity,p2[j].p.identity,c,n,sqrt(dist2))); add_pair(pl, &p1[i], &p2[j]); #ifdef MULTI_TIMESTEP if (smaller_time_step < 0. || (p1[i].p.smaller_timestep==0 && p2[j].p.smaller_timestep==0 && current_time_step_is_small==0) || (!(p1[i].p.smaller_timestep==0 && p2[j].p.smaller_timestep==0) && current_time_step_is_small==1)) #endif { /* calc non bonded interactions */ add_non_bonded_pair_force(&(p1[i]), &(p2[j]), vec21, sqrt(dist2), dist2); } } } } } resize_verlet_list(pl); VERLET_TRACE(fprintf(stderr,"%d: neighbor %d has %d pairs\n",this_node,n,pl->n)); VERLET_TRACE(sum += pl->n); }