36 #ifndef DEFERRED_OPERATIONS_H
37 #define DEFERRED_OPERATIONS_H
44 template <
typename real_t>
48 : nthreads(num_threads), defOp_scaling_factor(scaling_factor){
50 deferred_operations.resize(nthreads);
51 for(
int i=0; i<nthreads; ++i)
52 deferred_operations[i].resize(nthreads*defOp_scaling_factor);
58 deferred_operations[tid][hash(i) % (defOp_scaling_factor*nthreads)].
addNN.push_back(i);
59 deferred_operations[tid][hash(i) % (defOp_scaling_factor*nthreads)].
addNN.push_back(n);
63 deferred_operations[tid][hash(i) % (defOp_scaling_factor*nthreads)].
remNN.push_back(i);
64 deferred_operations[tid][hash(i) % (defOp_scaling_factor*nthreads)].
remNN.push_back(n);
68 deferred_operations[tid][hash(i) % (defOp_scaling_factor*nthreads)].
addNE.push_back(i);
69 deferred_operations[tid][hash(i) % (defOp_scaling_factor*nthreads)].
addNE.push_back(n);
73 deferred_operations[tid][hash(i) % (defOp_scaling_factor*nthreads)].
addNE_fix.push_back(i);
74 deferred_operations[tid][hash(i) % (defOp_scaling_factor*nthreads)].
addNE_fix.push_back(n);
77 inline void repEN(
const size_t pos,
const index_t n,
const int tid){
78 deferred_operations[tid][(pos/16) % (defOp_scaling_factor*nthreads)].repEN.push_back(pos);
79 deferred_operations[tid][(pos/16) % (defOp_scaling_factor*nthreads)].repEN.push_back(n);
83 deferred_operations[tid][hash(i) % (defOp_scaling_factor*nthreads)].
remNE.push_back(i);
84 deferred_operations[tid][hash(i) % (defOp_scaling_factor*nthreads)].
remNE.push_back(n);
88 deferred_operations[tid][hash(i) % (defOp_scaling_factor*nthreads)].coarsening_propagation.push_back(i);
92 deferred_operations[tid][hash(i) % (defOp_scaling_factor*nthreads)].refinement_propagation.push_back(i);
93 deferred_operations[tid][hash(i) % (defOp_scaling_factor*nthreads)].refinement_propagation.push_back(n);
97 deferred_operations[tid][hash(i) % (defOp_scaling_factor*nthreads)].swapping_propagation.push_back(i);
98 deferred_operations[tid][hash(i) % (defOp_scaling_factor*nthreads)].swapping_propagation.push_back(n);
102 deferred_operations[tid][hash(i) % (defOp_scaling_factor*nthreads)].
reset_colour.push_back(i);
106 for(
typename std::vector<index_t>::const_iterator it=deferred_operations[tid][vtid].
addNN.begin();
107 it!=deferred_operations[tid][vtid].addNN.end(); it+=2){
108 _mesh->NNList[*it].push_back(*(it+1));
111 deferred_operations[tid][vtid].addNN.clear();
115 for(
typename std::vector<index_t>::const_iterator it=deferred_operations[tid][vtid].
remNN.begin();
116 it!=deferred_operations[tid][vtid].remNN.end(); it+=2){
117 typename std::vector<index_t>::iterator position = std::find(_mesh->NNList[*it].begin(), _mesh->NNList[*it].end(), *(it+1));
118 assert(position != _mesh->NNList[*it].end());
119 _mesh->NNList[*it].erase(position);
122 deferred_operations[tid][vtid].remNN.clear();
126 for(
typename std::vector<index_t>::const_iterator it=deferred_operations[tid][vtid].
addNE.begin();
127 it!=deferred_operations[tid][vtid].addNE.end(); it+=2){
128 _mesh->NEList[*it].insert(*(it+1));
131 deferred_operations[tid][vtid].addNE.clear();
134 inline void commit_addNE_fix(std::vector<size_t>& threadIdx,
const int tid,
const int vtid){
135 for(
typename std::vector<index_t>::const_iterator it=deferred_operations[tid][vtid].
addNE_fix.begin();
136 it!=deferred_operations[tid][vtid].addNE_fix.end(); it+=2){
138 index_t fixedId = *(it+1) + threadIdx[tid];
139 _mesh->NEList[*it].insert(fixedId);
142 deferred_operations[tid][vtid].addNE_fix.clear();
146 for(
typename std::vector<index_t>::const_iterator it=deferred_operations[tid][vtid].
remNE.begin();
147 it!=deferred_operations[tid][vtid].remNE.end(); it+=2){
148 assert(_mesh->NEList[*it].count(*(it+1)) != 0);
149 _mesh->NEList[*it].erase(*(it+1));
152 deferred_operations[tid][vtid].remNE.clear();
156 for(
typename std::vector<index_t>::const_iterator it=deferred_operations[tid][vtid].
repEN.begin();
157 it!=deferred_operations[tid][vtid].repEN.end(); it+=2){
158 _mesh->_ENList[*it] = *(it+1);
161 deferred_operations[tid][vtid].repEN.clear();
165 for(
typename std::vector<index_t>::const_iterator it=deferred_operations[tid][vtid].coarsening_propagation.begin();
166 it!=deferred_operations[tid][vtid].coarsening_propagation.end(); ++it){
167 dynamic_vertex[*it] = -2;
170 deferred_operations[tid][vtid].coarsening_propagation.clear();
174 for(
typename std::vector<index_t>::const_iterator it=deferred_operations[tid][vtid].refinement_propagation.begin();
175 it!=deferred_operations[tid][vtid].refinement_propagation.end(); it+=2){
176 marked_edges[*it].insert(*(it+1));
179 deferred_operations[tid][vtid].refinement_propagation.clear();
183 for(
typename std::vector<index_t>::const_iterator it=deferred_operations[tid][vtid].swapping_propagation.begin();
184 it!=deferred_operations[tid][vtid].swapping_propagation.end(); it+=2){
185 marked_edges[*it].insert(*(it+1));
188 deferred_operations[tid][vtid].swapping_propagation.clear();
192 for(
typename std::vector<index_t>::const_iterator it=deferred_operations[tid][vtid].
reset_colour.begin();
193 it!=deferred_operations[tid][vtid].reset_colour.end(); ++it){
194 node_colour[*it] = 0;
197 deferred_operations[tid][vtid].reset_colour.clear();
207 inline uint32_t hash(
const uint32_t
id)
const{
208 return ((uint64_t)
id * 279470273UL) % 4294967291UL;
213 std::vector<index_t>
addNN;
214 std::vector<index_t>
remNN;
215 std::vector<index_t>
addNE;
216 std::vector<index_t>
remNE;
219 std::vector<index_t>
repEN;
220 std::vector<index_t> coarsening_propagation;
221 std::vector<index_t> refinement_propagation;
222 std::vector<index_t> swapping_propagation;
227 std::vector< std::vector<def_op_t> > deferred_operations;
229 const int defOp_scaling_factor;
void remNE(const index_t i, const index_t n, const int tid)
void reset_colour(const index_t i, const int tid)
void commit_addNE_fix(std::vector< size_t > &threadIdx, const int tid, const int vtid)
void addNE(const index_t i, const index_t n, const int tid)
void commit_remNE(const int tid, const int vtid)
void commit_colour_reset(int *node_colour, const int tid, const int vtid)
void commit_swapping_propagation(std::vector< std::set< index_t > > &marked_edges, const int tid, const int vtid)
void commit_addNE(const int tid, const int vtid)
void propagate_swapping(const index_t i, const index_t n, const int tid)
void commit_coarsening_propagation(index_t *dynamic_vertex, const int tid, const int vtid)
void remNN(const index_t i, const index_t n, const int tid)
void commit_remNN(const int tid, const int vtid)
void propagate_coarsening(const index_t i, const int tid)
void commit_refinement_propagation(std::vector< std::set< index_t > > &marked_edges, const int tid, const int vtid)
void propagate_refinement(const index_t i, const index_t n, const int tid)
void commit_repEN(const int tid, const int vtid)
void commit_addNN(const int tid, const int vtid)
void addNE_fix(const index_t i, const index_t n, const int tid)
DeferredOperations(Mesh< real_t > *mesh, const int num_threads, const int scaling_factor)
void addNN(const index_t i, const index_t n, const int tid)
void repEN(const size_t pos, const index_t n, const int tid)