int main(int argc, char *argv[]) { float *collide_field=NULL, *stream_field=NULL, *collide_field_d=NULL, *stream_field_d=NULL, *swap=NULL, tau, wall_velocity[D_LBM], num_cells, mlups_sum; int *flag_field=NULL, *flag_field_d=NULL, xlength, t, timesteps, timesteps_per_plotting, gpu_enabled; clock_t mlups_time; size_t field_size; /* process parameters */ ReadParameters(&xlength, &tau, wall_velocity, ×teps, ×teps_per_plotting, argc, argv, &gpu_enabled); /* check if provided parameters are legitimate */ ValidateModel(wall_velocity, xlength, tau); /* initializing fields */ num_cells = pow(xlength + 2, D_LBM); field_size = Q_LBM*num_cells*sizeof(float); collide_field = (float*) malloc(field_size); stream_field = (float*) malloc(field_size); flag_field = (int*) malloc(num_cells*sizeof(int)); InitialiseFields(collide_field, stream_field, flag_field, xlength, gpu_enabled); InitialiseDeviceFields(collide_field, stream_field, flag_field, xlength, &collide_field_d, &stream_field_d, &flag_field_d); for (t = 0; t < timesteps; t++) { printf("Time step: #%d\n", t); if (gpu_enabled){ DoIteration(collide_field, stream_field, flag_field, tau, wall_velocity, xlength, &collide_field_d, &stream_field_d, &flag_field_d, &mlups_sum); /* Copy data from devcice in memory only when we need VTK output */ if (!(t%timesteps_per_plotting)) CopyFieldsFromDevice(collide_field, stream_field, xlength, &collide_field_d, &stream_field_d); } else { mlups_time = clock(); /* Copy pdfs from neighbouring cells into collide field */ DoStreaming(collide_field, stream_field, flag_field, xlength); /* Perform the swapping of collide and stream fields */ swap = collide_field; collide_field = stream_field; stream_field = swap; /* Compute post collision distributions */ DoCollision(collide_field, flag_field, tau, xlength); /* Treat boundaries */ TreatBoundary(collide_field, flag_field, wall_velocity, xlength); mlups_time = clock()-mlups_time; /* Print out the MLUPS value */ mlups_sum += num_cells/(MLUPS_EXPONENT*(float)mlups_time/CLOCKS_PER_SEC); if(VERBOSE) printf("MLUPS: %f\n", num_cells/(MLUPS_EXPONENT*(float)mlups_time/CLOCKS_PER_SEC)); } /* Print out vtk output if needed */ if (!(t%timesteps_per_plotting)) WriteVtkOutput(collide_field, flag_field, "img/lbm-img", t, xlength); } printf("Average MLUPS: %f\n", mlups_sum/(t+1)); if (VERBOSE) { if(gpu_enabled) CopyFieldsFromDevice(collide_field, stream_field, xlength, &collide_field_d, &stream_field_d); WriteField(collide_field, "img/collide-field", 0, xlength, gpu_enabled); writeFlagField(flag_field, "img/flag-field", xlength, gpu_enabled); } /* Free memory */ free(collide_field); free(stream_field); free(flag_field); FreeDeviceFields(&collide_field_d, &stream_field_d, &flag_field_d); printf("Simulation complete.\n"); return 0; }
int Run() { if(!ValidateModel()) { return -1; } unsigned int spawnPoints = 0; std::vector<SCTransition*>::iterator it; for(it = g_allTrans.begin(); it < g_allTrans.end(); it++) { if((*it)->GetDirectedArcsFrom()->empty()) { g_eventCal.Insert(*it,(*it)->GetExactTime()); spawnPoints++; } } if(g_simLength == 0 && spawnPoints != 0) { cout<<ERR_COMP_LENGHT<<endl; return -1; } else if(g_simLength == 0) { g_simLength = numeric_limits<double>::max(); } if( g_print ) SCStat::PrintLegend(); int ret = 0; SCCalendarUnit *unit = NULL; while(g_time < g_simLength) { unit = g_eventCal.GetNextUnit(); if(unit == NULL) { break; } else if(unit->GetTime() > g_simLength) { g_time = g_simLength; delete unit; break; } g_time = unit->GetTime(); if((ret = unit->GetBase()->Run()) != BASE_OK) { if(SCBase::EvaluateErrorCode(ret,unit->GetBase()) == BASE_FATAL) { delete unit; break; } } delete unit; } if(g_printAll) // tiskne souhrnou statistiku SCStat::PrintStatAll(); cout << endl; return 0; }