68 #include "Passport3D.h"
69 #include "Velocity3D.h"
80 MPI_Init(&argc, &argv);
81 MPI_Comm_size(MPI_COMM_WORLD, &
nProcAll);
82 MPI_Comm_rank(MPI_COMM_WORLD, &
myidAll);
83 MPI_Comm_group(MPI_COMM_WORLD, &
groupAll);
120 info(
'i') <<
"Goodbye!" << std::endl;
140 world.reset(
nullptr);
143 world.reset(
nullptr);
169 while ((taskFol <
task.size()) && (nfree >=
task[taskFol].nProc))
184 procState[j] =
static_cast<int>(taskFol);
187 task[taskFol].proc[p] = j;
195 }
while (p <
task[taskFol].nProc);
208 nfree -=
task[taskFol].nProc;
221 info(
'i') <<
"ProcStates: " << std::endl;
223 info(
'-') <<
"proc[" << i <<
"] <=> " << ((
procState[i] >= 0) ? std::string(
"problem[" + std::to_string(
procState[i]) +
"]") : std::string(
"free")) << std::endl;
236 MPI_Bcast(&
numberOfTask.solving, 1, MPI_INT, 0, MPI_COMM_WORLD);
237 MPI_Bcast(&
numberOfTask.prepared, 1, MPI_INT, 0, MPI_COMM_WORLD);
238 MPI_Bcast(&
numberOfTask.finished, 1, MPI_INT, 0, MPI_COMM_WORLD);
243 std::vector<int> prepList;
249 for (
size_t i = 0; i<
task.size(); ++i)
254 prepList.push_back(
task[i].proc[0]);
264 MPI_Bcast(&
numberOfTask.prepared, 1, MPI_INT, 0, MPI_COMM_WORLD);
276 MPI_Bcast(prepList.data(),
numberOfTask.prepared, MPI_INT, 0, MPI_COMM_WORLD);
335 std::vector<int> solvList;
348 solvList.push_back(0);
359 solvList.push_back(s);
382 MPI_Bcast(solvList.data(),
sizeCommSolving, MPI_INT, 0, MPI_COMM_WORLD);
451 if (
world ==
nullptr)
456 if (
world ==
nullptr)
466 for (
size_t q = 0; q < world2D.
getPassport().airfoilParams.size(); ++q)
473 VM3D::World3D& world3D =
dynamic_cast<VM3D::World3D&
>(*world);
487 info(
'i') <<
"------ Kvant finished ------" << std::endl;
549 std::vector<int> taskList;
576 for (
size_t i = 0; i <
task.size(); ++i)
592 for (
int p = 0; p <
task[i].nProc; ++p)
609 MPI_Bcast(&
nextKvant, 1, MPI_INT, 0, MPI_COMM_WORLD);
617 std::vector<bool> prFlag;
663 double kvantStartWallTime;
664 double deltaWallTime;
668 kvantStartWallTime = MPI_Wtime();
670 kvantStartWallTime = omp_get_wtime();
679 if (!
world->isFinished())
684 deltaWallTime = MPI_Wtime() - kvantStartWallTime;
686 deltaWallTime = omp_get_wtime() - kvantStartWallTime;
704 (
task.end() - 1)->nProc = _nProc;
705 (
task.end() - 1)->passport = std::move(_passport);
706 (
task.end() - 1)->proc.resize(_nProc);
712void Queue::LoadTasksList(
const std::string& _tasksFile,
const std::string& _mechanicsFile,
const std::string& _defaultsFile,
const std::string& _switchersFile)
714 std::string extTasksFile = _tasksFile;
715 std::string extMechanicsFile = _mechanicsFile;
716 std::string extDefaultsFile = _defaultsFile;
717 std::string extSwitchersFile = _switchersFile;
725 std::stringstream tasksFile(
Preprocessor(extTasksFile).resultString);
726 std::stringstream defaultsFile(
Preprocessor(extDefaultsFile).resultString);
727 std::stringstream switchersFile(
Preprocessor(extSwitchersFile).resultString);
728 std::vector<std::string> taskFolder;
730 std::unique_ptr<StreamParser> parserTaskList;
731 parserTaskList.reset(
new StreamParser(
info,
"parser", tasksFile,
'(',
')'));
733 std::vector<std::string> alltasks;
734 parserTaskList->get(
"problems", alltasks);
736 std::ptrdiff_t nTasks = std::count_if(alltasks.begin(), alltasks.end(), [](
const std::string& a) {return (a.length() > 0);});
738 info(
'i') <<
"Number of problems to be solved: " << nTasks << std::endl;
740 for (
size_t i = 0; i < alltasks.size(); ++i)
742 if (alltasks[i].length() > 0)
747 std::string dir = taskLine.first;
750 info(
'i') <<
"-------- Loading problem #" << i <<
" (" << dir <<
") --------" << std::endl;
757 std::unique_ptr<StreamParser> parserTask;
759 parserTask.reset(
new StreamParser(
info,
"problem parameters", tskStream, defaultsFile, {
"pspfile",
"np",
"copyPath"}));
771 info(
'e') <<
"Internal MPI-parallelization is not supported longer!" << std::endl;
775 std::string copyPath;
777 if (copyPath.length() > 0)
782 std::string initDir(copyPath.begin(), copyPath.end());
786 std::replace(dir.begin(), dir.end(),
'/',
'\\');
787 std::replace(initDir.begin(), initDir.end(),
'/',
'\\');
793 command =
"copy \"" + initDir +
"\\*.*\" "+ dir +
"\\";
795 command =
"cp ./" + initDir +
"/* " + dir +
"/";
798 std::cout <<
"Copying files from folder \"" << initDir <<
"\" to \"" << dir <<
"\"" << std::endl;
800 int systemRet = system(command.c_str());
804 info(
'e') <<
"problem #" << i <<
" (" << dir << \
805 ") copying passport system method failed" << std::endl;
808 std::cout <<
"Copying OK " << std::endl << std::endl;
815 MPI_Barrier(MPI_COMM_WORLD);
818 std::unique_ptr<PassportGen> ptrPsp;
821 ptrPsp.reset(
new VM2D::Passport(
info, dir, i, pspFile, extMechanicsFile, extDefaultsFile, extSwitchersFile, vecTaskLineSecond));
825 ptrPsp.reset(
new VM3D::Passport(
info, dir, i, pspFile, extMechanicsFile, extDefaultsFile, extSwitchersFile, vecTaskLineSecond));
828 AddTask(np, std::move(ptrPsp));
830 info(
'i') <<
"-------- Problem #" << i <<
" (" << dir <<
") is loaded --------" << std::endl << std::endl;
838 defaultsFile.clear();
841 switchersFile.clear();
Заголовочный файл с описанием класса Airfoil.
Заголовочный файл с описанием класса Boundary.
Заголовочный файл с описанием класса MeasureVP.
Заголовочный файл с описанием класса Mechanics.
Заголовочный файл с описанием класса Preprocessor.
Заголовочный файл с описанием класса Queue.
Заголовочный файл с описанием класса StreamParser.
Заголовочный файл с описанием класса Velocity.
Заголовочный файл с описанием класса Wake.
Заголовочный файл с описанием класса WakeDataBase.
Заголовочный файл с описанием класса World2D.
Заголовочный файл с описанием класса WorldGen.
Класс, опеделяющий текущую решаемую задачу
VMlib::TimersGen & getTimers() const
Возврат ссылки на временную статистику выполнения шага расчета по времени
const Passport & getPassport() const
Возврат константной ссылки на паспорт
void GenerateMechanicsHeader(size_t mechanicsNumber)
void endl()
Вывод в поток логов пустой строки
void assignStream(std::ostream *pStr_, const std::string &label_)
Связывание потока логов с потоком вывода
int nProcWork
Число процессоров, решающих конкретную задачу
int myidWork
Локальный номер процессора, решающего конкретную задачу
int commWork
Коммуникатор для решения конкретной задачи
Класс, позволяющий выполнять предварительную обработку файлов
void ConstructProcStateVar()
Процедура, нумерующая задачи в возрастающем порядке
const double kvantTime
Продолжительность кванта времени в секундах
Queue(int &argc, char **&argv)
Конструктор
int sizeCommSolving
Число процессоров в группе для головных процессоров в решаемых в данном кванте времени задачах
int myProcState
Состояние данного процессора
void LoadTasksList(const std::string &_tasksFile, const std::string &_mechanicsFile, const std::string &_defaultsFile, const std::string &_switchersFile)
Загрузка списка задач
int myProcStateVar
Состояние данного процессора
std::unique_ptr< WorldGen > world
Умный указатель на текущую решаемую задачу
int nProcAll
Общее число процессоров
std::vector< int > procStateVar
Модифицированный список состояний процессоров
struct VMlib::Queue::@0 numberOfTask
Структура, содержащая информацию о количестве задач в данный момент времени
std::vector< int > flagFinish
Список возвращаемых флагов останова задачи
std::vector< Task > task
Список описаний решаемых задач
void RunConveyer()
Запуск вычислительного конвейера (в рамках кванта времени)
Parallel parallel
Класс, опеделяющий параметры исполнения задачи в параллельном MPI-режиме
int currentKvant
Номер текущего кванта времени
void AddTask(int _nProc, std::unique_ptr< PassportGen > _passport)
Добавление задачи в список
void TaskUpdate()
Процедура обновления состояния задач и процессоров
int myidAll
Глобальный номер процессора
LogStream info
Поток для вывода логов и сообщений об ошибках
void TaskSplit()
Процедура постановка новых задач на отсчет и занятие процессоров
std::vector< int > procState
Список состояний процессоров
int nextKvant
Признак необходимости выполнения следующего кванта и продолжения расчета
Класс, позволяющий выполнять разбор файлов и строк с настройками и параметрами
static std::vector< std::string > StringToVector(std::string line, char openBracket='(', char closeBracket=')')
Pазбор строки, содержащей запятые, на отдельные строки
static std::pair< std::string, std::string > SplitString(LogStream &info, std::string line, bool upcase=true)
Разбор строки на пару ключ-значение
static std::string VectorStringToString(const std::vector< std::string > &_vecString)
Объединение вектора (списка) из строк в одну строку
void GenerateStatHeader()
Формирование заголовка файла временной статистики
void PrintUniversalLogoToStream(std::ostream &str)
Передача в поток вывода универсальной шапки программы VM2D/VM3D.
bool fileExistTest(std::string &fileName, LogStream &info, bool exitKey=false, const std::list< std::string > &extList={})
Проверка существования файла
void CreateDirectory(const std::string &dir, const std::string &name)
Создание каталога
@ finishing
задача финиширует
@ starting
задача стартует
@ waiting
задача ожидает запуска
static std::ostream * defaultQueueLogStream
Поток вывода логов и ошибок очереди
const int defaultNp
Необходимое число процессоров для решения задачи
const std::string defaultCopyPath
Путь к каталогу с задачей для копирования в новые каталоги
static std::ostream * defaultWorld2DLogStream
Поток вывода логов и ошибок задачи
const std::string defaultPspFile
Имя файла с паспортом задачи