/* * Copyright (C) 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 "allocate.h" #include "comm.h" #include "parameter.h" #include "progress.h" #include "solver.h" #include "timing.h" static void writeResults(Solver* s) { #ifdef _MPI size_t bytesize = (s->imax + 2) * (s->jmax + 2) * sizeof(double); double* ug = allocate(64, bytesize); double* vg = allocate(64, bytesize); double* pg = allocate(64, bytesize); commCollectResult(&s->comm, ug, vg, pg, s->u, s->v, s->p, s->imax, s->jmax); writeResult(s, ug, vg, pg); free(ug); free(vg); free(pg); #else writeResult(s, s->u, s->v, s->p); #endif } int main(int argc, char** argv) { int rank; double timeStart, timeStop; Parameter p; Solver s; commInit(&s.comm, argc, argv); initParameter(&p); if (argc != 2) { printf("Usage: %s \n", argv[0]); exit(EXIT_SUCCESS); } readParameter(&p, argv[1]); commPartition(&s.comm, p.jmax, p.imax); if (commIsMaster(&s.comm)) { printParameter(&p); } initSolver(&s, &p); #ifdef TEST commPrintConfig(&s.comm); commTestInit(&s.comm, s.p, s.f, s.g); commExchange(&s.comm, s.p); commShift(&s.comm, s.f, s.g); commTestWrite(&s.comm, s.p, s.f, s.g); writeResults(&s); commFinalize(&s.comm); exit(EXIT_SUCCESS); #endif #ifndef VERBOSE initProgress(s.te); #endif double tau = s.tau; double te = s.te; double t = 0.0; timeStart = getTimeStamp(); while (t <= te) { if (tau > 0.0) computeTimestep(&s); setBoundaryConditions(&s); setSpecialBoundaryCondition(&s); computeFG(&s); computeRHS(&s); solve(&s); adaptUV(&s); t += s.dt; #ifdef VERBOSE if (commIsMaster(&s.comm)) { printf("TIME %f , TIMESTEP %f\n", t, s.dt); } #else printProgress(t); #endif } timeStop = getTimeStamp(); #ifndef VERBOSE stopProgress(); #endif if (commIsMaster(&s.comm)) { printf("Solution took %.2fs\n", timeStop - timeStart); } writeResults(&s); commFinalize(&s.comm); return EXIT_SUCCESS; }