28 double dxfac, dyfac, dzfac;
29 double coefficient_solid;
30 double alpha_solid_x, alpha_solid_y, alpha_solid_z;
31 double *temperature_1D, *temperature_1D_future;
33 double energy_left, energy_right;
34 double temperature_right_gas, temerpature_left_gas;
36 double heat_transfer_coefficient;
40 int i_local_min, i_local_max;
46 temperature_right_gas = 0.0;
47 temerpature_left_gas = 0.0;
49 heat_transfer_coefficient = 0.0;
57 if (
dimension == 2) volume = dxfac * dyfac;
58 if (
dimension == 3) volume = dxfac * dyfac * dzfac;
67 if (
dimension > 0) alpha_solid_x = coefficient_solid *
dt / (dxfac);
68 if (
dimension > 1) alpha_solid_y = coefficient_solid *
dt / (dyfac);
69 if (
dimension > 2) alpha_solid_z = coefficient_solid *
dt / (dzfac);
72 if ((alpha_solid_x >= 0.3) && (
dimension > 0)) {
73 dt = (0.3 * dxfac) / coefficient_solid;
75 if ((alpha_solid_y >= 0.3) && (
dimension > 1)) {
76 dt = (0.3 * dyfac) / coefficient_solid;
78 if ((alpha_solid_z >= 0.3) && (
dimension > 2)) {
79 dt = (0.3 * dzfac) / coefficient_solid;
85 #pragma omp parallel default(none) \
86 private(j, i, k, n, temperature_1D, dom_1D, \
87 temperature_1D_future, mass, dom_counter, \
88 i_local_min, i_local_max, energy_left, energy_right, \
89 condition, heat_transfer_coefficient) \
90 shared(x, y, z, dom, rho, pre, dt, dxfac, \
91 dyfac, dzfac, alpha_solid_x, gasconstant, A, \
93 specific_heat_capacity_gas, \
94 specific_heat_capacity_obstacle)
98 init_diffusion(&temperature_1D, &temperature_1D_future, &mass, &dom_1D);
106 for (k = 0; k <
z; k++) {
110 #pragma omp for schedule(static)
113 for (j = 0; j <
y; j++) {
119 while (condition == 0) {
125 for (i = i_local_min; i <
x; i++) {
129 dom_1D[i] =
dom[i][j][k];
131 if (dom_1D[i] == 1) {
133 if (dom_counter == 0) i_local_min = i;
136 if (dom_counter > 0) {
143 if (dom_counter == 0) i_local_min = i;
153 if (i_local_min != 0) {
155 energy_left = heat_transfer_coefficient * A * (temperature_1D[i_local_min - 1] - temperature_1D[i_local_min]) *
dt;
157 if (i_local_max != (x - 1)) {
159 energy_right = heat_transfer_coefficient * A * (temperature_1D[i_local_max + 1] - temperature_1D[i_local_max]) *
dt;
163 if ((energy_left <= 0) && (i_local_min != 0)) {
164 temperature_1D[i_local_min - 1] = temperature_1D[i_local_min - 1] + fabs(energy_left / (
specific_heat_capacity_gas * mass[i_local_min - 1]));
167 pre[i_local_min - 1][j][k] = (
gasconstant *
rho[i_local_min - 1][j][k]) * temperature_1D[i_local_min - 1];
168 pre[i_local_min][j][k] = (
gasconstant *
rho[i_local_min][j][k]) * temperature_1D[i_local_min];
173 if ((energy_left > 0) && (i_local_min != 0)) {
174 temperature_1D[i_local_min - 1] = temperature_1D[i_local_min - 1] - fabs(energy_left / (
specific_heat_capacity_gas * mass[i_local_min - 1]));
177 pre[i_local_min - 1][j][k] = (
gasconstant *
rho[i_local_min - 1][j][k]) * temperature_1D[i_local_min - 1];
178 pre[i_local_min][j][k] = (
gasconstant *
rho[i_local_min][j][k]) * temperature_1D[i_local_min];
183 if ((energy_right > 0) && (i_local_max != (x - 1))) {
185 temperature_1D[i_local_max + 1] = temperature_1D[i_local_max + 1] - fabs(energy_right / (
specific_heat_capacity_gas * mass[i_local_max + 1]));
187 pre[i_local_max][j][k] = (
gasconstant *
rho[i_local_max][j][k]) * temperature_1D[i_local_max];
188 pre[i_local_max + 1][j][k] = (
gasconstant *
rho[i_local_max + 1][j][k]) * temperature_1D[i_local_max + 1];
193 if ((energy_right <= 0) && (i_local_max != (x - 1))) {
195 temperature_1D[i_local_max + 1] = temperature_1D[i_local_max + 1] + fabs(energy_right / (
specific_heat_capacity_gas * mass[i_local_max + 1]));
197 pre[i_local_max][j][k] = (
gasconstant *
rho[i_local_max][j][k]) * temperature_1D[i_local_max];
198 pre[i_local_max + 1][j][k] = (
gasconstant *
rho[i_local_max + 1][j][k]) * temperature_1D[i_local_max + 1];
202 if (dom_counter > 2) {
203 for (n = i_local_min + 1; n < i_local_max; n++) {
204 temperature_1D_future[n] = alpha_solid_x * temperature_1D[n + 1] +
205 (1 - 2 * alpha_solid_x) * temperature_1D[n] +
206 alpha_solid_x * temperature_1D[n - 1];
209 for (i = i_local_min + 1; i < i_local_max; i++) {
214 for (i = i_local_min; i < i_local_max; i++) {
215 temperature_1D[i] = 0.0;
216 temperature_1D_future[i] = 0.0;
221 i_local_min = i_local_max + 1;
225 free_diffusion(&temperature_1D, &temperature_1D_future, &mass, &dom_1D);
234 #pragma omp parallel default(none) \
235 private(j, i, k, n, temperature_1D, dom_1D, \
236 temperature_1D_future, mass, dom_counter, \
237 i_local_min, i_local_max, energy_left, \
238 condition, energy_right, \
239 heat_transfer_coefficient) \
240 shared(x, y, z, dom, rho, pre, dt, dxfac, \
241 dyfac, dzfac, alpha_solid_y, \
242 gasconstant, A, dimension, volume, \
243 specific_heat_capacity_gas, \
244 specific_heat_capacity_obstacle)
248 init_diffusion(&temperature_1D, &temperature_1D_future, &mass, &dom_1D);
255 for (k = 0; k <
z; k++) {
258 #pragma omp for schedule(static)
261 for (i = 0; i <
x; i++) {
267 while (condition == 0) {
274 for (j = i_local_min; j <
y; j++) {
278 dom_1D[j] =
dom[i][j][k];
280 if (dom_1D[j] == 1) {
282 if (dom_counter == 0) i_local_min = j;
285 if (dom_counter > 0) {
292 if (dom_counter == 0) i_local_min = j;
303 if (i_local_min != 0) {
305 energy_left = heat_transfer_coefficient * A * (temperature_1D[i_local_min - 1] - temperature_1D[i_local_min]) *
dt;
307 if (i_local_max != (y - 1)) {
309 energy_right = heat_transfer_coefficient * A * (temperature_1D[i_local_max + 1] - temperature_1D[i_local_max]) *
dt;
313 if ((energy_left <= 0) && (i_local_min != 0)) {
314 temperature_1D[i_local_min - 1] = temperature_1D[i_local_min - 1] + fabs(energy_left / (
specific_heat_capacity_gas * mass[i_local_min - 1]));
317 pre[i][i_local_min - 1][k] = (
gasconstant *
rho[i][i_local_min - 1][k]) * temperature_1D[i_local_min - 1];
318 pre[i][i_local_min][k] = (
gasconstant *
rho[i][i_local_min][k]) * temperature_1D[i_local_min];
322 if ((energy_left > 0) && (i_local_min != 0)) {
323 temperature_1D[i_local_min - 1] = temperature_1D[i_local_min - 1] - fabs(energy_left / (
specific_heat_capacity_gas * mass[i_local_min - 1]));
326 pre[i][i_local_min - 1][k] = (
gasconstant *
rho[i][i_local_min - 1][k]) * temperature_1D[i_local_min - 1];
327 pre[i][i_local_min][k] = (
gasconstant *
rho[i][i_local_min][k]) * temperature_1D[i_local_min];
331 if ((energy_right > 0) && (i_local_max != (y - 1))) {
333 temperature_1D[i_local_max + 1] = temperature_1D[i_local_max + 1] - fabs(energy_right / (
specific_heat_capacity_gas * mass[i_local_max + 1]));
335 pre[i][i_local_max][k] = (
gasconstant *
rho[i][i_local_max][k]) * temperature_1D[i_local_max];
336 pre[i][i_local_max + 1][k] = (
gasconstant *
rho[i][i_local_max + 1][k]) * temperature_1D[i_local_max + 1];
340 if ((energy_right <= 0) && (i_local_max != (y - 1))) {
342 temperature_1D[i_local_max + 1] = temperature_1D[i_local_max + 1] + fabs(energy_right / (
specific_heat_capacity_gas * mass[i_local_max + 1]));
344 pre[i][i_local_max][k] = (
gasconstant *
rho[i][i_local_max][k]) * temperature_1D[i_local_max];
345 pre[i][i_local_max + 1][k] = (
gasconstant *
rho[i][i_local_max + 1][k]) * temperature_1D[i_local_max + 1];
350 if (dom_counter > 2) {
352 for (n = i_local_min + 1; n < i_local_max; n++) {
354 temperature_1D_future[n] = alpha_solid_y * temperature_1D[n + 1] +
355 (1 - 2 * alpha_solid_y) * temperature_1D[n] +
356 alpha_solid_y * temperature_1D[n - 1];
359 for (j = i_local_min + 1; j < i_local_max; j++) {
364 for (j = i_local_min; j < i_local_max; j++) {
365 temperature_1D[j] = 0.0;
366 temperature_1D_future[j] = 0.0;
372 i_local_min = i_local_max + 1;
377 free_diffusion(&temperature_1D, &temperature_1D_future, &mass, &dom_1D);
385 #pragma omp parallel default(none) \
386 private(j, i, k, n, temperature_1D, dom_1D, \
387 temperature_1D_future, mass, dom_counter, \
388 i_local_min, i_local_max, energy_left, \
389 condition, energy_right, \
390 heat_transfer_coefficient) \
391 shared(x, y, z, dom, rho, pre, dt, dxfac, \
392 dyfac, dzfac, alpha_solid_z, gasconstant, A, \
394 specific_heat_capacity_gas, \
395 specific_heat_capacity_obstacle)
398 init_diffusion(&temperature_1D, &temperature_1D_future, &mass, &dom_1D);
405 for (j = 0; j <
y; j++) {
408 #pragma omp for schedule(static)
411 for (i = 0; i <
x; i++) {
417 while (condition == 0) {
423 for (k = i_local_min; k <
z; k++) {
427 dom_1D[k] =
dom[i][j][k];
429 if (dom_1D[k] == 1) {
431 if (dom_counter == 0) i_local_min = k;
434 if (dom_counter > 0) {
441 if (dom_counter == 0) i_local_min = k;
452 if (i_local_min != 0) {
454 energy_left = heat_transfer_coefficient * A * (temperature_1D[i_local_min - 1] - temperature_1D[i_local_min]) *
dt;
456 if (i_local_max != (z - 1)) {
458 energy_right = heat_transfer_coefficient * A * (temperature_1D[i_local_max + 1] - temperature_1D[i_local_max]) *
dt;
462 if ((energy_left <= 0) && (i_local_min != 0)) {
463 temperature_1D[i_local_min - 1] = temperature_1D[i_local_min - 1] + fabs(energy_left / (
specific_heat_capacity_gas * mass[i_local_min - 1]));
466 pre[i][j][i_local_min - 1] = (
gasconstant *
rho[i][j][i_local_min - 1]) * temperature_1D[i_local_min - 1];
467 pre[i][j][i_local_min] = (
gasconstant *
rho[i][j][i_local_min]) * temperature_1D[i_local_min ];
471 if ((energy_left > 0) && (i_local_min != 0)) {
472 temperature_1D[i_local_min - 1] = temperature_1D[i_local_min - 1] - fabs(energy_left / (
specific_heat_capacity_gas * mass[i_local_min - 1]));
475 pre[i][j][i_local_min - 1] = (
gasconstant *
rho[i][j][i_local_min - 1]) * temperature_1D[i_local_min - 1];
476 pre[i][j][i_local_min] = (
gasconstant *
rho[i][j][i_local_min]) * temperature_1D[i_local_min ];
480 if ((energy_right > 0) && (i_local_max != (z - 1))) {
482 temperature_1D[i_local_max + 1] = temperature_1D[i_local_max + 1] - fabs(energy_right / (
specific_heat_capacity_gas * mass[i_local_max + 1]));
484 pre[i][j][i_local_max] = (
gasconstant *
rho[i][j][i_local_max]) * temperature_1D[i_local_max ];
485 pre[i][j][i_local_max + 1] = (
gasconstant *
rho[i][j][i_local_max + 1]) * temperature_1D[i_local_max + 1];
489 if ((energy_right <= 0) && (i_local_max != (z - 1))) {
491 temperature_1D[i_local_max + 1] = temperature_1D[i_local_max + 1] + fabs(energy_right / (
specific_heat_capacity_gas * mass[i_local_max + 1]));
493 pre[i][j][i_local_max] = (
gasconstant *
rho[i][j][i_local_max]) * temperature_1D[i_local_max ];
494 pre[i][j][i_local_max + 1] = (
gasconstant *
rho[i][j][i_local_max + 1]) * temperature_1D[i_local_max + 1];
500 if (dom_counter > 2) {
502 for (n = i_local_min + 1; n < i_local_max; n++) {
504 temperature_1D_future[n] = alpha_solid_z * temperature_1D[n + 1] +
505 (1 - 2 * alpha_solid_z) * temperature_1D[n] +
506 alpha_solid_z * temperature_1D[n - 1];
509 for (k = i_local_min + 1; k < i_local_max; k++) {
513 for (k = i_local_min; k < i_local_max; k++) {
514 temperature_1D[k] = 0.0;
515 temperature_1D_future[k] = 0.0;
521 i_local_min = i_local_max + 1;
527 free_diffusion(&temperature_1D, &temperature_1D_future, &mass, &dom_1D);