AMR-Solver  1.0
Block-based Octree AMR grid flow solver
block.cpp
Go to the documentation of this file.
1 #include "block.h"
2 #include <stdio.h>
3 #include <iostream>
4 
5 namespace myOctree {
6 
7 int pad = 2;
8 std::vector<std::string> scalar_fields;
9 std::vector<std::string> vector_fields;
10 int nx_block = 20;
11 int ny_block = 20;
12 int nz_block = 10;
13 int Block::iNx = nx_block;
14 int Block::iNy = ny_block;
15 int Block::iNz = nz_block;
16 
17 //parametrized constructor with initialization fields
18 Block::Block( double x1, double x2, double y1, double y2, double z1, double z2 ) : x_min(x1), x_max(x2), y_min(y1), y_max(y2), z_min(z1), z_max(z2) {
19 // std::cerr << "Parametrized constructor of block is working" << std::endl;
20 
21  max_gradient = 0.0;
22 
23  dx = ( x_max - x_min ) / iNx;
24  dy = ( y_max - y_min ) / iNy;
25  dz = ( z_max - z_min ) / iNz;
26 
27  //std::cerr << dz << std::endl;
28 
29  //printf("dx=%g, dy=%g, dz=%g \n", dx, dy, dz);
30 
31  x_centre = (x_min + x_max ) / 2.0;
32  y_centre = (y_min + y_max ) / 2.0;
33  z_centre = (z_min + z_max ) / 2.0;
34 
35  //dynamical allocation of the objects
36  VecField mesh_field(iNx+2*pad,iNy+2*pad,iNz+2*pad, "mesh");
37  mesh = new VecField(mesh_field);
38 
39  Field field_field(iNx+2*pad,iNy+2*pad,iNz+2*pad, "field");
40  field = new Field(field_field);
41 
42  scalarfields = new Field* [scalar_fields.size()];
43  for(int i = 0; i<scalar_fields.size() ; i++) {
44  Field field_field(iNx+2*pad,iNy+2*pad,iNz+2*pad, scalar_fields[i]);
45  scalarfields[i] = new Field(field_field);
46  }
47 
48  vectorfields = new VecField* [vector_fields.size()];
49  for(int i = 0; i<vector_fields.size() ; i++) {
50  VecField vec_field(iNx+2*pad,iNy+2*pad,iNz+2*pad, vector_fields[i]);
51  vectorfields[i] = new VecField(vec_field);
52  }
53 
54  //std::cerr << "Hi" << z_max << std::endl;
55 
56  //storing cell centre locations in mesh vector field
57  for(int i=0;i<mesh->Nx;i++) {
58  for(int j=0;j<mesh->Ny;j++) {
59  for(int k=0;k<mesh->Nz;k++) {
60  mesh->x[i][j][k] = x_min - pad*dx + dx*(i + 0.5);
61  mesh->y[i][j][k] = y_min - pad*dy + dy*(j + 0.5);
62  mesh->z[i][j][k] = z_min - pad*dz + dz*(k + 0.5);
63  }
64  }
65  }
66 
67 }
68 
69 //default constructor
71  // std::cerr << "default constructor of block is working" << std::endl;
72 
73  VecField mesh_field(iNx+2*pad,iNy+2*pad,iNz+2*pad, "mesh");
74  mesh = new VecField(mesh_field);
75 
76  Field field_field(iNx+2*pad,iNy+2*pad,iNz+2*pad, "field");
77  field = new Field(field_field);
78 
79  scalarfields = new Field* [scalar_fields.size()];
80  for(int i = 0; i<scalar_fields.size() ; i++) {
81  Field field_field(iNx+2*pad,iNy+2*pad,iNz+2*pad, scalar_fields[i]);
82  scalarfields[i] = new Field(field_field);
83  }
84 
85  vectorfields = new VecField* [vector_fields.size()];
86  for(int i = 0; i<vector_fields.size() ; i++) {
87  VecField vec_field(iNx+2*pad,iNy+2*pad,iNz+2*pad, vector_fields[i]);
88  vectorfields[i] = new VecField(vec_field);
89  }
90 }
91 
92 //Copy constructor
93 Block::Block(const Block &obj) {
94  // std::cerr << "copy constructor of block is working" << std::endl;
95 
96  x_centre = obj.x_centre;
97  y_centre = obj.y_centre;
98  z_centre = obj.z_centre;
99  x_min = obj.x_min;
100  y_min = obj.y_min;
101  z_min = obj.z_min;
102  x_max = obj.x_max;
103  y_max = obj.y_max;
104  z_max = obj.z_max;
105  dx = obj.dx;
106  dy = obj.dy;
107  dz = obj.dz;
108  iNx = obj.iNx;
109  iNy = obj.iNy;
110  iNz = obj.iNz;
111  mesh = new VecField(*(obj.mesh));
112  field = new Field(*(obj.field));
114 
115  scalarfields = new Field* [scalar_fields.size()];
116  for(int i = 0; i<scalar_fields.size() ; i++) {
117  scalarfields[i] = new Field(*((obj.scalarfields)[i]));
118  }
119 
120  vectorfields = new VecField* [vector_fields.size()];
121  for(int i = 0; i<vector_fields.size() ; i++) {
122  vectorfields[i] = new VecField(*((obj.vectorfields)[i]));
123  }
124 
125 }
126 
127 //Destructor
129  // std::cerr << "destructor of block is working" << std::endl;
130 
131  delete mesh;
132  delete field;
133 
134  for (int i = 0; i < scalar_fields.size(); ++i)
135  delete scalarfields[i];
136 
137  delete scalarfields;
138 
139  for (int i = 0; i < vector_fields.size(); ++i)
140  delete vectorfields[i];
141 
142  delete vectorfields;
143 
144 }
145 
146 
147 }
double y_centre
Definition: block.h:42
This class is a generic data block of a octree node in the block-based AMR mesh.
Definition: block.h:26
std::vector< std::string > scalar_fields
Definition: block.cpp:8
double dy
Definition: block.h:57
VecField * mesh
Definition: block.h:30
int ny_block
Definition: block.cpp:11
double y_max
Definition: block.h:44
double x_min
Definition: block.h:43
VecField ** vectorfields
Definition: block.h:35
double *** z
Definition: vecfield.h:27
double dx
Definition: block.h:57
static int iNy
Definition: block.h:51
double x_max
Definition: block.h:43
Template class for any vector field variable in the domain.
Definition: vecfield.h:13
double z_max
Definition: block.h:45
double x_centre
Definition: block.h:42
Template class for any scalar field variable in the domain.
Definition: field.h:11
std::vector< std::string > vector_fields
Definition: block.cpp:9
int pad
Definition: block.cpp:7
int nz_block
Definition: block.cpp:12
double z_min
Definition: block.h:45
int nx_block
Definition: block.cpp:10
double y_min
Definition: block.h:44
static int iNx
Definition: block.h:50
AMR grid stuff.
Definition: adapt.cpp:6
double dz
Definition: block.h:57
static int iNz
Definition: block.h:52
double *** x
Definition: vecfield.h:25
double max_gradient
Definition: block.h:38
double *** y
Definition: vecfield.h:26
double z_centre
Definition: block.h:42
Field * field
Definition: block.h:31
Field ** scalarfields
Definition: block.h:34