23 void jacobi(
int level, std::string name) {
28 std::cerr <<
"No blocks in level " << level << std::endl;
32 double global_res = 1.0;
46 for (std::list<Octree*>::iterator it =
level_nodes[level].begin(), end =
level_nodes[level].end(); it != end; ++it) {
50 Field *f = (*it)->get_block_data()->scalarfields[l];
53 if( f->
name == name ) {
61 std::cout <<
"Residual " << global_res << std::endl;
74 std::cerr <<
"No blocks in level " << level << std::endl;
78 double global_res = 1.0;
84 while(global_res > pow(10,-7)) {
92 for (std::list<Octree*>::iterator it =
level_nodes[level].begin(), end =
level_nodes[level].end(); it != end; ++it) {
96 Field *f = (*it)->get_block_data()->scalarfields[l];
97 if( f->
name == name ) {
109 for (std::list<Octree*>::iterator it =
level_nodes[level].begin(), end =
level_nodes[level].end(); it != end; ++it) {
113 Field *f = (*it)->get_block_data()->scalarfields[l];
114 if( f->
name == name ) {
122 std::cout <<
"Residual " << global_res << std::endl;
127 std::cout <<
"No of loops " << loop << std::endl;
134 double ue, uw, un, us, ut, ub, up;
151 ue = f->
val[i+1][j][k];
152 uw = f->
val[i-1][j][k];
153 un = f->
val[i][j+1][k];
154 us = f->
val[i][j-1][k];
155 ut = f->
val[i][j][k+1];
156 ub = f->
val[i][j][k-1];
157 up = f->
val[i][j][k];
160 if(i==pad) temp.
val[i][j][k] += (2.0*uw - up)/pow(dx,2);
161 else temp.
val[i][j][k] += uw/pow(dx,2);
162 if(i==
nx_block+pad-1) temp.
val[i][j][k] += (2.0*ue - up)/pow(dx,2);
163 else temp.
val[i][j][k] += ue/pow(dx,2);
164 if(j==pad) temp.
val[i][j][k] += (2.0*us - up)/pow(dy,2);
165 else temp.
val[i][j][k] += us/pow(dy,2);
166 if(j==
ny_block+pad-1) temp.
val[i][j][k] += (2.0*un - up)/pow(dy,2);
167 else temp.
val[i][j][k] += un/pow(dy,2);
168 if(k==pad) temp.
val[i][j][k] += (2.0*ub - up)/pow(dz,2);
169 else temp.
val[i][j][k] += ub/pow(dz,2);
170 if(k==
nz_block+pad-1) temp.
val[i][j][k] += (2.0*ut - up)/pow(dz,2);
171 else temp.
val[i][j][k] += ut/pow(dz,2);
173 temp.
val[i][j][k] -= force;
174 temp.
val[i][j][k] /= 2.0;
175 temp.
val[i][j][k] /= (1.0/pow(dx,2) + 1.0/pow(dy,2) + 1.0/pow(dz,2));
180 err = std::abs(temp.
val[i][j][k] - f->
val[i][j][k]);
181 if(err>res) res = err;
193 f->
val[i][j][k] = temp.
val[i][j][k];
200 if(res>global_res) global_res = res;
211 double ue, uw, un, us, ut, ub, up;
212 double prev_val, curr_val;
213 double force = 100.0;
233 ue = f->
val[i+1][j][k];
234 uw = f->
val[i-1][j][k];
235 un = f->
val[i][j+1][k];
236 us = f->
val[i][j-1][k];
237 ut = f->
val[i][j][k+1];
238 ub = f->
val[i][j][k-1];
239 up = f->
val[i][j][k];
242 if(i==pad) temp.
val[i][j][k] += (2.0*uw - up)/pow(dx,2);
243 else temp.
val[i][j][k] += uw/pow(dx,2);
244 if(i==
nx_block+pad-1) temp.
val[i][j][k] += (2.0*ue - up)/pow(dx,2);
245 else temp.
val[i][j][k] += ue/pow(dx,2);
246 if(j==pad) temp.
val[i][j][k] += (2.0*us - up)/pow(dy,2);
247 else temp.
val[i][j][k] += us/pow(dy,2);
248 if(j==
ny_block+pad-1) temp.
val[i][j][k] += (2.0*un - up)/pow(dy,2);
249 else temp.
val[i][j][k] += un/pow(dy,2);
250 if(k==pad) temp.
val[i][j][k] += (2.0*ub - up)/pow(dz,2);
251 else temp.
val[i][j][k] += ub/pow(dz,2);
252 if(k==
nz_block+pad-1) temp.
val[i][j][k] += (2.0*ut - up)/pow(dz,2);
253 else temp.
val[i][j][k] += ut/pow(dz,2);
255 temp.
val[i][j][k] -= force;
256 temp.
val[i][j][k] /= 2.0;
257 temp.
val[i][j][k] /= (1.0/pow(dx,2) + 1.0/pow(dy,2) + 1.0/pow(dz,2));
259 prev_val = f->
val[i][j][k];
261 f->
val[i][j][k] = (1.0 - relax) * f->
val[i][j][k] + relax * temp.
val[i][j][k];
263 curr_val = f->
val[i][j][k];
266 err = std::abs(curr_val - prev_val);
267 if(err>res) res = err;
276 if(res>global_res) global_res = res;
287 double ue, uw, un, us, ut, ub, up;
288 double prev_val, curr_val;
289 double force = 100.0;
308 ue = f->
val[i+1][j][k];
309 uw = f->
val[i-1][j][k];
310 un = f->
val[i][j+1][k];
311 us = f->
val[i][j-1][k];
312 ut = f->
val[i][j][k+1];
313 ub = f->
val[i][j][k-1];
314 up = f->
val[i][j][k];
317 if(i==pad) temp.
val[i][j][k] += (2.0*uw - up)/pow(dx,2);
318 else temp.
val[i][j][k] += uw/pow(dx,2);
319 if(i==
nx_block+pad-1) temp.
val[i][j][k] += (2.0*ue - up)/pow(dx,2);
320 else temp.
val[i][j][k] += ue/pow(dx,2);
321 if(j==pad) temp.
val[i][j][k] += (2.0*us - up)/pow(dy,2);
322 else temp.
val[i][j][k] += us/pow(dy,2);
323 if(j==
ny_block+pad-1) temp.
val[i][j][k] += (2.0*un - up)/pow(dy,2);
324 else temp.
val[i][j][k] += un/pow(dy,2);
325 if(k==pad) temp.
val[i][j][k] += (2.0*ub - up)/pow(dz,2);
326 else temp.
val[i][j][k] += ub/pow(dz,2);
327 if(k==
nz_block+pad-1) temp.
val[i][j][k] += (2.0*ut - up)/pow(dz,2);
328 else temp.
val[i][j][k] += ut/pow(dz,2);
330 temp.
val[i][j][k] -= force;
331 temp.
val[i][j][k] /= 2.0;
332 temp.
val[i][j][k] /= (1.0/pow(dx,2) + 1.0/pow(dy,2) + 1.0/pow(dz,2));
334 prev_val = f->
val[i][j][k];
336 f->
val[i][j][k] = (1.0 - relax) * f->
val[i][j][k] + relax * temp.
val[i][j][k];
338 curr_val = f->
val[i][j][k];
341 err = std::abs(curr_val - prev_val);
342 if(err>res) res = err;
350 if(res>global_res) global_res = res;
void gauss_seidel(int level, std::string name)
std::vector< std::string > scalar_fields
Template class for any vector field variable in the domain.
std::list< Octree * > level_nodes[20]
double gauss_seidel_black(Octree *node, Field *f, double global_res)
Template class for any scalar field variable in the domain.
void exchange_ghost_val(int level, std::string name)
double gauss_seidel_red(Octree *node, Field *f, double global_res)
Class to store octree datastructure as nodes of the tree.
void create_lists_of_level_nodes()
void jacobi(int level, std::string name)
double jacobi_for_field(Octree *node, Field *f, double global_res)