Previous La fonction principale du programme |
Parent Le fichier main.cpp |
Outline | Next Le fichier CMakeLists.txt |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
/*************************************** Auteur : Pierre Aubert Mail : aubertp7@gmail.com Licence : CeCILL-C ****************************************/ #include "OptionParser.h" #include "temporary_alloc.h" #include "ProgressTime.h" #include "naive_propagation.h" #include "MatrixHdf5.h" ///Create the OptionParser of this program /** @return OptionParser of this program */ OptionParser createOptionParser(){ OptionParser parser(true, __PROGRAM_VERSION__); parser.setExampleLongOption("naive_gray_scott --killrate=0.062 --feedrate=0.03 --nbimage=100 --nbrow=1080 --nbcol=1920 --output=outputFile.hdf5"); parser.setExampleShortOption("naive_gray_scott -k 0.062 -f 0.03 -n 100 -r 1080 -c 1920 -o outputFile.hdf5"); float killRate(0.054f), feedRate(0.014f); size_t nbImage(100lu), nbRow(100lu), nbCol(200lu); parser.addOption("killrate", "k", killRate, "rate of the process which converts V into P"); parser.addOption("feedrate", "f", feedRate, "rate of the process which feeds U and drains U, V and P"); parser.addOption("nbimage", "n", nbImage, "number of images to be created"); size_t nbExtraStep(1lu); parser.addOption("nbextrastep", "e", nbExtraStep, "number of extra steps to be computed between images"); parser.addOption("nbrow", "r", nbRow, "number of rows of the images to be created"); parser.addOption("nbcol", "c", nbCol, "number of columns of the images to be created"); float dt(1.0f); parser.addOption("deltat", "t", dt, "time interval between two computation"); std::string defaultOutputFile("output.h5"); parser.addOption("output", "o", defaultOutputFile, "Output file to be created with results"); return parser; } ///Simulate the images /** @param nbRow : number of rows of the images to be created * @param nbCol : number of columns of the images to be created * @param nbImage : number of images to be created * @param nbExtraStep : number of extra steps to be computed between images * @param killRate : rate of the process which converts V into P * @param feedRate : rate of the process which feeds U and drains U, V and P * @param dt : time interval between two computation * @param outputFile : name of the file to be created * @return true on succsess, false otherwise */ bool simulateImage(size_t nbRow, size_t nbCol, size_t nbImage, size_t nbExtraStep, float killRate, float feedRate, float dt, const std::string & outputFile){ std::cout << "simulateImage : nbRow = " << nbRow << ", nbCol = " << nbCol << std::endl; MatrixHdf5 fullMat; fullMat.setAllDim(nbCol, nbRow); fullMat.resize(nbImage); PTensor<float> tmpInU, tmpInV, tmpOutU, tmpOutV; float *tmpU1 = NULL, *tmpU2 = NULL, *tmpV1 = NULL, *tmpV2 = NULL; allocate_temporary(tmpU1, tmpU2, tmpV1, tmpV2, tmpInU, tmpInV, tmpOutU, tmpOutV, nbRow, nbCol); long nbStencilRow(3l), nbStencilCol(3l); float diffudionRateU(0.1f), diffusionRateV(0.05f); //This matrix of neigbour exchange is quite accurate but gives not so fun results // float matDeltaSquare[] = {0.05f, 0.2f, 0.05f, // 0.2f, 0.0f, 0.2f, // 0.05f, 0.2f, 0.05f}; float matDeltaSquare[] = {1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f}; ProgressTime progress(nbImage); progress.start(); for(size_t i(0lu); i < nbImage; ++i){ progress.print(); for(size_t j(0lu); j < nbExtraStep; ++j){ grayscott_propagation(tmpU2, tmpV2, tmpU1, tmpV1, nbRow, nbCol, matDeltaSquare, nbStencilRow, nbStencilCol, diffudionRateU, diffusionRateV, feedRate, killRate, dt); ///Let's swap the pointer swapValue(tmpU1, tmpU2); swapValue(tmpV1, tmpV2); } if(tmpInV.getData() == tmpV2){ fullMat.setRow(i, tmpV2); }else{ fullMat.setRow(i, tmpV1); } } progress.finish(); std::cerr << "Done" << std::endl; //Let's save the output file fullMat.write(outputFile); return true; } int main(int argc, char** argv){ OptionParser parser = createOptionParser(); parser.parseArgument(argc, argv); const OptionMode & defaultMode = parser.getDefaultMode(); float killRate(0.062f), feedRate(0.03f), dt(1.0f); size_t nbImage(100lu), nbRow(1080lu), nbCol(1920lu), nbExtraStep(1lu); defaultMode.getValue(killRate, "killrate"); defaultMode.getValue(feedRate, "feedrate"); defaultMode.getValue(nbImage, "nbimage"); defaultMode.getValue(nbExtraStep, "nbextrastep"); defaultMode.getValue(nbRow, "nbrow"); defaultMode.getValue(nbCol, "nbcol"); defaultMode.getValue(dt, "deltat"); std::string outputFile(""); defaultMode.getValue(outputFile, "output"); bool b(simulateImage(nbRow, nbCol, nbImage, nbExtraStep, killRate, feedRate, dt, outputFile)); return b - 1; } |
Previous La fonction principale du programme |
Parent Le fichier main.cpp |
Outline | Next Le fichier CMakeLists.txt |