/* * Copyright (C) 2022 NHR@FAU, University Erlangen-Nuremberg. * All rights reserved. * Use of this source code is governed by a MIT-style * license that can be found in the LICENSE file. */ #include #include #include #include #include #include "allocate.h" #include "parameter.h" #include "progress.h" #include "solver.h" #include "timing.h" #include "vtkWriter.h" #define G(v, i, j, k) v[(k) * (imax + 2) * (jmax + 2) + (j) * (imax + 2) + (i)] static void createBulkArrays(Solver* s, double* pg, double* ug, double* vg, double* wg) { int imax = s->grid.imax; int jmax = s->grid.jmax; int kmax = s->grid.kmax; int idx = 0; for (int k = 1; k < kmax + 1; k++) { for (int j = 1; j < jmax + 1; j++) { for (int i = 1; i < imax + 1; i++) { pg[idx++] = G(s->p, i, j, k); } } } idx = 0; for (int k = 1; k < kmax + 1; k++) { for (int j = 1; j < jmax + 1; j++) { for (int i = 1; i < imax + 1; i++) { ug[idx++] = (G(s->u, i, j, k) + G(s->u, i - 1, j, k)) / 2.0; } } } idx = 0; for (int k = 1; k < kmax + 1; k++) { for (int j = 1; j < jmax + 1; j++) { for (int i = 1; i < imax + 1; i++) { vg[idx++] = (G(s->v, i, j, k) + G(s->v, i, j - 1, k)) / 2.0; } } } idx = 0; for (int k = 1; k < kmax + 1; k++) { for (int j = 1; j < jmax + 1; j++) { for (int i = 1; i < imax + 1; i++) { wg[idx++] = (G(s->w, i, j, k) + G(s->w, i, j, k - 1)) / 2.0; } } } } int main(int argc, char** argv) { double timeStart, timeStop; Parameter params; Solver solver; initParameter(¶ms); if (argc != 2) { printf("Usage: %s \n", argv[0]); exit(EXIT_SUCCESS); } readParameter(¶ms, argv[1]); printParameter(¶ms); initSolver(&solver, ¶ms); #ifndef VERBOSE initProgress(solver.te); #endif double tau = solver.tau; double te = solver.te; double t = 0.0; int nt = 0; timeStart = getTimeStamp(); while (t <= te) { if (tau > 0.0) computeTimestep(&solver); setBoundaryConditions(&solver); setSpecialBoundaryCondition(&solver); computeFG(&solver); computeRHS(&solver); solve(&solver); adaptUV(&solver); t += solver.dt; nt++; #ifdef VERBOSE printf("TIME %f , TIMESTEP %f\n", t, solver.dt); #else printProgress(t); #endif } timeStop = getTimeStamp(); #ifndef VERBOSE stopProgress(); #endif printf("Solution took %.2fs\n", timeStop - timeStart); double *pg, *ug, *vg, *wg; size_t bytesize = solver.grid.imax * solver.grid.jmax * solver.grid.kmax * sizeof(double); pg = allocate(64, bytesize); ug = allocate(64, bytesize); vg = allocate(64, bytesize); wg = allocate(64, bytesize); createBulkArrays(&s, pg, ug, vg, wg); VtkOptions opts = { .grid = solver.grid }; vtkOpen(&opts, solver.problem); vtkScalar(&opts, "pressure", pg); vtkVector(&opts, "velocity", (VtkVector) { ug, vg, wg }); vtkClose(&opts); return EXIT_SUCCESS; }