69 #include "Passport3D.h"
70 #include "Velocity3D.h"
81 MPI_Init(&argc, &argv);
82 MPI_Comm_size(MPI_COMM_WORLD, &
nProcAll);
83 MPI_Comm_rank(MPI_COMM_WORLD, &
myidAll);
84 MPI_Comm_group(MPI_COMM_WORLD, &
groupAll);
121 info(
'i') <<
"Goodbye!" << std::endl;
141 world.reset(
nullptr);
144 world.reset(
nullptr);
170 while ((taskFol <
task.size()) && (nfree >=
task[taskFol].nProc))
185 procState[j] =
static_cast<int>(taskFol);
188 task[taskFol].proc[p] = j;
196 }
while (p <
task[taskFol].nProc);
209 nfree -=
task[taskFol].nProc;
222 info(
'i') <<
"ProcStates: " << std::endl;
224 info(
'-') <<
"proc[" << i <<
"] <=> " << ((
procState[i] >= 0) ? std::string(
"problem[" + std::to_string(
procState[i]) +
"]") : std::string(
"free")) << std::endl;
237 MPI_Bcast(&
numberOfTask.solving, 1, MPI_INT, 0, MPI_COMM_WORLD);
238 MPI_Bcast(&
numberOfTask.prepared, 1, MPI_INT, 0, MPI_COMM_WORLD);
239 MPI_Bcast(&
numberOfTask.finished, 1, MPI_INT, 0, MPI_COMM_WORLD);
244 std::vector<int> prepList;
250 for (
size_t i = 0; i<
task.size(); ++i)
255 prepList.push_back(
task[i].proc[0]);
265 MPI_Bcast(&
numberOfTask.prepared, 1, MPI_INT, 0, MPI_COMM_WORLD);
277 MPI_Bcast(prepList.data(),
numberOfTask.prepared, MPI_INT, 0, MPI_COMM_WORLD);
336 std::vector<int> solvList;
349 solvList.push_back(0);
360 solvList.push_back(s);
383 MPI_Bcast(solvList.data(),
sizeCommSolving, MPI_INT, 0, MPI_COMM_WORLD);
452 if (
world ==
nullptr)
457 if (
world ==
nullptr)
467 for (
size_t q = 0; q < world2D.
getPassport().airfoilParams.size(); ++q)
474 VM3D::World3D& world3D =
dynamic_cast<VM3D::World3D&
>(*world);
488 info(
'i') <<
"------ Kvant finished ------" << std::endl;
550 std::vector<int> taskList;
577 for (
size_t i = 0; i <
task.size(); ++i)
593 for (
int p = 0; p <
task[i].nProc; ++p)
610 MPI_Bcast(&
nextKvant, 1, MPI_INT, 0, MPI_COMM_WORLD);
618 std::vector<bool> prFlag;
664 double kvantStartWallTime;
665 double deltaWallTime;
669 kvantStartWallTime = MPI_Wtime();
671 kvantStartWallTime = omp_get_wtime();
680 if (!
world->isFinished())
685 deltaWallTime = MPI_Wtime() - kvantStartWallTime;
687 deltaWallTime = omp_get_wtime() - kvantStartWallTime;
705 (
task.end() - 1)->nProc = _nProc;
706 (
task.end() - 1)->passport = std::move(_passport);
707 (
task.end() - 1)->proc.resize(_nProc);
713void Queue::LoadTasksList(
const std::string& _tasksFile,
const std::string& _mechanicsFile,
const std::string& _defaultsFile,
const std::string& _switchersFile)
715 std::string extTasksFile = _tasksFile;
716 std::string extMechanicsFile = _mechanicsFile;
717 std::string extDefaultsFile = _defaultsFile;
718 std::string extSwitchersFile = _switchersFile;
726 std::stringstream tasksFile(
Preprocessor(extTasksFile).resultString);
727 std::stringstream defaultsFile(
Preprocessor(extDefaultsFile).resultString);
728 std::stringstream switchersFile(
Preprocessor(extSwitchersFile).resultString);
729 std::vector<std::string> taskFolder;
731 std::unique_ptr<StreamParser> parserTaskList;
732 parserTaskList.reset(
new StreamParser(
info,
"parser", tasksFile,
'(',
')'));
734 std::vector<std::string> alltasks;
735 parserTaskList->get(
"problems", alltasks);
737 std::ptrdiff_t nTasks = std::count_if(alltasks.begin(), alltasks.end(), [](
const std::string& a) {return (a.length() > 0);});
739 info(
'i') <<
"Number of problems to be solved: " << nTasks << std::endl;
741 for (
size_t i = 0; i < alltasks.size(); ++i)
743 if (alltasks[i].length() > 0)
748 std::string dir = taskLine.first;
751 info(
'i') <<
"-------- Loading problem #" << i <<
" (" << dir <<
") --------" << std::endl;
758 std::unique_ptr<StreamParser> parserTask;
760 parserTask.reset(
new StreamParser(
info,
"problem parameters", tskStream, defaultsFile, {
"pspfile",
"np",
"copyPath"}));
772 info(
'e') <<
"Internal MPI-parallelization is not supported longer!" << std::endl;
776 std::string copyPath;
778 if (copyPath.length() > 0)
783 std::string initDir(copyPath.begin(), copyPath.end());
787 std::replace(dir.begin(), dir.end(),
'/',
'\\');
788 std::replace(initDir.begin(), initDir.end(),
'/',
'\\');
794 command =
"copy \"" + initDir +
"\\*.*\" "+ dir +
"\\";
796 command =
"cp ./" + initDir +
"/* " + dir +
"/";
799 std::cout <<
"Copying files from folder \"" << initDir <<
"\" to \"" << dir <<
"\"" << std::endl;
801 int systemRet = system(command.c_str());
805 info(
'e') <<
"problem #" << i <<
" (" << dir << \
806 ") copying passport system method failed" << std::endl;
809 std::cout <<
"Copying OK " << std::endl << std::endl;
816 MPI_Barrier(MPI_COMM_WORLD);
819 std::unique_ptr<PassportGen> ptrPsp;
822 ptrPsp.reset(
new VM2D::Passport(
info, dir, i,
"./" + dir +
"/" + pspFile, extMechanicsFile, extDefaultsFile, extSwitchersFile, vecTaskLineSecond, {
""}));
826 ptrPsp.reset(
new VM3D::Passport(
info, dir, i, pspFile, extMechanicsFile, extDefaultsFile, extSwitchersFile, vecTaskLineSecond));
829 AddTask(np, std::move(ptrPsp));
831 info(
'i') <<
"-------- Problem #" << i <<
" (" << dir <<
") is loaded --------" << std::endl << std::endl;
839 defaultsFile.clear();
842 switchersFile.clear();
Заголовочный файл с описанием класса Airfoil.
Заголовочный файл с описанием класса Boundary.
Заголовочный файл с функциями для метода GMRES.
Заголовочный файл с описанием класса 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 CreateUserDirectory(const std::string &dir, const std::string &name)
Создание каталога
void PrintUniversalLogoToStream(std::ostream &str)
Передача в поток вывода универсальной шапки программы VM2D/VM3D.
bool fileExistTest(std::string &fileName, LogStream &info, bool exitKey=false, const std::list< std::string > &extList={})
Проверка существования файла
@ finishing
задача финиширует
@ starting
задача стартует
@ waiting
задача ожидает запуска
static std::ostream * defaultQueueLogStream
Поток вывода логов и ошибок очереди
const int defaultNp
Необходимое число процессоров для решения задачи
const std::string defaultCopyPath
Путь к каталогу с задачей для копирования в новые каталоги
static std::ostream * defaultWorld2DLogStream
Поток вывода логов и ошибок задачи
const std::string defaultPspFile
Имя файла с паспортом задачи