AMR-Solver  1.0
Block-based Octree AMR grid flow solver
ghost.cpp
Go to the documentation of this file.
1 #include "octreegrid.h"
2 #include "direction.h"
3 #include <iostream>
4 #include <stdlib.h>
5 #include <string>
6 
7 namespace myOctree {
8 
10 void exchange_ghost_val(int level, std::string name) {
11 
13 
14  if(level_nodes[level].empty()) {
15  std::cerr << "Warning!: No blocks to exchange ghost values in level " << level << std::endl;
16  exit(1);
17  }
18 
19  for (std::list<Octree*>::iterator it = level_nodes[level].begin(), end = level_nodes[level].end(); it != end; ++it) {
20 
21  for(int l = 0; l<scalar_fields.size() ; l++) {
22 
23  Field *f = (*it)->get_block_data()->scalarfields[l];
24 
25  if( f->name == name ) {
26 
27  //exchanging ghost cells
28  for (int m=0; m<3; m++) {
29  for (int n=0; n<2; n++) {
30 
31  if((*it)->bc[m][n] == NONE && (*it)->neighbour[m][n] != NULL) {
32 
33 
34  if(n==RIGHT && m==XDIR) {
35 
36  for(int i=nx_block+pad; i<f->Nx; i++) {
37  for(int j=pad; j<ny_block+pad; j++) {
38  for(int k=pad; k<nz_block+pad; k++) {
39 
40  f->val[i][j][k] = \
41  (*it)->neighbour[m][n]->get_block_data()->scalarfields[l]->val[i-nx_block][j][k];
42  }
43  }
44  }
45  }
46  if(n==LEFT && m==XDIR) {
47 
48  for(int i=0; i<pad; i++) {
49  for(int j=pad; j<ny_block+pad; j++) {
50  for(int k=pad; k<nz_block+pad; k++) {
51 
52  f->val[i][j][k] = \
53  (*it)->neighbour[m][n]->get_block_data()->scalarfields[l]->val[i+nx_block][j][k];
54  }
55  }
56  }
57  }
58  if(n==RIGHT && m==YDIR) {
59 
60  for(int i=pad; i<nx_block+pad; i++) {
61  for(int j=ny_block+pad; j<f->Ny; j++) {
62  for(int k=pad; k<nz_block+pad; k++) {
63 
64  f->val[i][j][k] = \
65  (*it)->neighbour[m][n]->get_block_data()->scalarfields[l]->val[i][j-ny_block][k];
66  }
67  }
68  }
69  }
70  if(n==LEFT && m==YDIR) {
71 
72  for(int i=pad; i<nx_block+pad; i++) {
73  for(int j=0; j<pad; j++) {
74  for(int k=pad; k<nz_block+pad; k++) {
75 
76  f->val[i][j][k] = \
77  (*it)->neighbour[m][n]->get_block_data()->scalarfields[l]->val[i][j+ny_block][k];
78  }
79  }
80  }
81  }
82  if(n==RIGHT && m==ZDIR) {
83 
84  for(int i=pad; i<nx_block+pad; i++) {
85  for(int j=pad; j<ny_block+pad; j++) {
86  for(int k=nz_block+pad; k<f->Nz; k++) {
87 
88  f->val[i][j][k] = \
89  (*it)->neighbour[m][n]->get_block_data()->scalarfields[l]->val[i][j][k-nz_block];
90  }
91  }
92  }
93  }
94  if(n==LEFT && m==ZDIR) {
95 
96  for(int i=pad; i<nx_block+pad; i++) {
97  for(int j=pad; j<ny_block+pad; j++) {
98  for(int k=0; k<pad; k++) {
99 
100  f->val[i][j][k] = \
101  (*it)->neighbour[m][n]->get_block_data()->scalarfields[l]->val[i][j][k+nz_block];
102  }
103  }
104  }
105  }
106  }
107  }
108  }
109  }
110  }
111 
112  for(int l = 0; l<vector_fields.size() ; l++) {
113 
114  VecField *f = (*it)->get_block_data()->vectorfields[l];
115 
116  if( f->name == name ) {
117 
118  //exchanging ghost cells
119  for (int m=0; m<3; m++) {
120  for (int n=0; n<2; n++) {
121 
122  if((*it)->bc[m][n] == NONE && (*it)->neighbour[m][n] != NULL) {
123 
124 
125  if(n==RIGHT && m==XDIR) {
126 
127  for(int i=nx_block+pad; i<f->Nx; i++) {
128  for(int j=pad; j<ny_block+pad; j++) {
129  for(int k=pad; k<nz_block+pad; k++) {
130 
131  f->x[i][j][k] = \
132  (*it)->neighbour[m][n]->get_block_data()->vectorfields[l]->x[i-nx_block][j][k];
133  f->y[i][j][k] = \
134  (*it)->neighbour[m][n]->get_block_data()->vectorfields[l]->y[i-nx_block][j][k];
135  f->z[i][j][k] = \
136  (*it)->neighbour[m][n]->get_block_data()->vectorfields[l]->z[i-nx_block][j][k];
137  }
138  }
139  }
140  }
141  if(n==LEFT && m==XDIR) {
142 
143  for(int i=0; i<pad; i++) {
144  for(int j=pad; j<ny_block+pad; j++) {
145  for(int k=pad; k<nz_block+pad; k++) {
146 
147  f->x[i][j][k] = \
148  (*it)->neighbour[m][n]->get_block_data()->vectorfields[l]->x[i+nx_block][j][k];
149  f->y[i][j][k] = \
150  (*it)->neighbour[m][n]->get_block_data()->vectorfields[l]->y[i+nx_block][j][k];
151  f->z[i][j][k] = \
152  (*it)->neighbour[m][n]->get_block_data()->vectorfields[l]->z[i+nx_block][j][k];
153  }
154  }
155  }
156  }
157  if(n==RIGHT && m==YDIR) {
158 
159  for(int i=pad; i<nx_block+pad; i++) {
160  for(int j=ny_block+pad; j<f->Ny; j++) {
161  for(int k=pad; k<nz_block+pad; k++) {
162 
163  f->x[i][j][k] = \
164  (*it)->neighbour[m][n]->get_block_data()->vectorfields[l]->x[i][j-ny_block][k];
165  f->y[i][j][k] = \
166  (*it)->neighbour[m][n]->get_block_data()->vectorfields[l]->y[i][j-ny_block][k];
167  f->z[i][j][k] = \
168  (*it)->neighbour[m][n]->get_block_data()->vectorfields[l]->z[i][j-ny_block][k];
169  }
170  }
171  }
172  }
173  if(n==LEFT && m==YDIR) {
174 
175  for(int i=pad; i<nx_block+pad; i++) {
176  for(int j=0; j<pad; j++) {
177  for(int k=pad; k<nz_block+pad; k++) {
178 
179  f->x[i][j][k] = \
180  (*it)->neighbour[m][n]->get_block_data()->vectorfields[l]->x[i][j+ny_block][k];
181  f->y[i][j][k] = \
182  (*it)->neighbour[m][n]->get_block_data()->vectorfields[l]->y[i][j+ny_block][k];
183  f->z[i][j][k] = \
184  (*it)->neighbour[m][n]->get_block_data()->vectorfields[l]->z[i][j+ny_block][k];
185  }
186  }
187  }
188  }
189  if(n==RIGHT && m==ZDIR) {
190 
191  for(int i=pad; i<nx_block+pad; i++) {
192  for(int j=pad; j<ny_block+pad; j++) {
193  for(int k=nz_block+pad; k<f->Nz; k++) {
194 
195  f->x[i][j][k] = \
196  (*it)->neighbour[m][n]->get_block_data()->vectorfields[l]->x[i][j][k-nz_block];
197  f->y[i][j][k] = \
198  (*it)->neighbour[m][n]->get_block_data()->vectorfields[l]->y[i][j][k-nz_block];
199  f->z[i][j][k] = \
200  (*it)->neighbour[m][n]->get_block_data()->vectorfields[l]->z[i][j][k-nz_block];
201  }
202  }
203  }
204  }
205  if(n==LEFT && m==ZDIR) {
206 
207  for(int i=pad; i<nx_block+pad; i++) {
208  for(int j=pad; j<ny_block+pad; j++) {
209  for(int k=0; k<pad; k++) {
210 
211  f->x[i][j][k] = \
212  (*it)->neighbour[m][n]->get_block_data()->vectorfields[l]->x[i][j][k+nz_block];
213  f->y[i][j][k] = \
214  (*it)->neighbour[m][n]->get_block_data()->vectorfields[l]->y[i][j][k+nz_block];
215  f->z[i][j][k] = \
216  (*it)->neighbour[m][n]->get_block_data()->vectorfields[l]->z[i][j][k+nz_block];
217  }
218  }
219  }
220  }
221 
222 
223 
224 
225 
226 
227  }
228  }
229  }
230  }
231  }
232  }
233 }
234 
235 }
std::vector< std::string > scalar_fields
Definition: block.cpp:8
int ny_block
Definition: block.cpp:11
std::string name
Definition: field.h:21
double *** z
Definition: vecfield.h:27
Template class for any vector field variable in the domain.
Definition: vecfield.h:13
std::list< Octree * > level_nodes[20]
Definition: octreegrid.cpp:17
Template class for any scalar field variable in the domain.
Definition: field.h:11
std::vector< std::string > vector_fields
Definition: block.cpp:9
void exchange_ghost_val(int level, std::string name)
Definition: ghost.cpp:10
int pad
Definition: block.cpp:7
double *** val
Definition: field.h:20
int nz_block
Definition: block.cpp:12
int nx_block
Definition: block.cpp:10
AMR grid stuff.
Definition: adapt.cpp:6
std::string name
Definition: vecfield.h:31
double *** x
Definition: vecfield.h:25
double *** y
Definition: vecfield.h:26
void create_lists_of_level_nodes()
Definition: octreegrid.cpp:43