44 #include <sys/types.h> 66 #include "Passport3D.h" 67 #include "Velocity3D.h" 72 using namespace VMlib;
78 MPI_Init(&argc, &argv);
79 MPI_Comm_size(MPI_COMM_WORLD, &
nProcAll);
80 MPI_Comm_rank(MPI_COMM_WORLD, &
myidAll);
81 MPI_Comm_group(MPI_COMM_WORLD, &
groupAll);
119 info(
'i') <<
"Goodbye!" << std::endl;
138 if (myProcState == MPI_UNDEFINED)
139 world.reset(
nullptr);
141 if (myProcState == -32766)
142 world.reset(
nullptr);
168 while ((taskFol <
task.size()) && (nfree >=
task[taskFol].nProc))
183 procState[j] =
static_cast<int>(taskFol);
186 task[taskFol].proc[p] = j;
194 }
while (p <
task[taskFol].nProc);
207 nfree -=
task[taskFol].nProc;
220 info(
'i') <<
"ProcStates: " << std::endl;
222 info(
'-') <<
"proc[" << i <<
"] <=> problem[" <<
procState[i] <<
"]" << std::endl;
235 MPI_Bcast(&
numberOfTask.solving, 1, MPI_INT, 0, MPI_COMM_WORLD);
236 MPI_Bcast(&
numberOfTask.prepared, 1, MPI_INT, 0, MPI_COMM_WORLD);
237 MPI_Bcast(&
numberOfTask.finished, 1, MPI_INT, 0, MPI_COMM_WORLD);
242 std::vector<int> prepList;
248 for (
size_t i = 0; i<
task.size(); ++i)
253 prepList.push_back(
task[i].proc[0]);
263 MPI_Bcast(&
numberOfTask.prepared, 1, MPI_INT, 0, MPI_COMM_WORLD);
275 MPI_Bcast(prepList.data(),
numberOfTask.prepared, MPI_INT, 0, MPI_COMM_WORLD);
282 MPI_Comm_create(MPI_COMM_WORLD,
groupStarting, &commStarting);
284 commStarting = 0x04000000;
292 if (commStarting != MPI_COMM_NULL)
294 if (commStarting != 0x04000000)
301 MPI_Comm_rank(commStarting, &myidStarting);
314 world.reset(
new VM3D::World3D(
task[myProcState].getPassport()));
320 MPI_Comm_free(&commStarting);
322 commStarting = 0x04000000;
334 std::vector<int> solvList;
347 solvList.push_back(0);
358 solvList.push_back(s);
381 MPI_Bcast(solvList.data(),
sizeCommSolving, MPI_INT, 0, MPI_COMM_WORLD);
390 MPI_Comm_create(MPI_COMM_WORLD,
groupSolving, &commSolving);
392 commSolving = 0x04000000;
424 if (myProcStateVar != -32766)
450 if (
world ==
nullptr)
455 if (
world ==
nullptr)
456 world.reset(
new VM3D::World3D(
task[myProcState].getPassport()));
462 MPI_Bcast(&(
world->getPassportGen().timeDiscretizationProperties.currTime), 1, MPI_DOUBLE, 0,
parallel.
commWork);
477 VM3D::World3D& world3D =
dynamic_cast<VM3D::World3D&
>(*world);
483 world3D.getTimestat().GenerateStatHeader();
494 info(
'i') <<
"------ Kvant finished ------" << std::endl;
556 std::vector<int> taskList;
583 for (
size_t i = 0; i <
task.size(); ++i)
599 for (
int p = 0; p <
task[i].nProc; ++p)
616 MPI_Bcast(&
nextKvant, 1, MPI_INT, 0, MPI_COMM_WORLD);
624 std::vector<bool> prFlag;
670 double kvantStartWallTime;
671 double deltaWallTime;
675 kvantStartWallTime = MPI_Wtime();
677 kvantStartWallTime = omp_get_wtime();
686 if (!
world->isFinished())
691 deltaWallTime = MPI_Wtime() - kvantStartWallTime;
693 deltaWallTime = omp_get_wtime() - kvantStartWallTime;
711 (
task.end() - 1)->nProc = _nProc;
712 (
task.end() - 1)->passport = std::move(_passport);
713 (
task.end() - 1)->proc.resize(_nProc);
719 void Queue::LoadTasksList(
const std::string& _tasksFile,
const std::string& _mechanicsFile,
const std::string& _defaultsFile,
const std::string& _switchersFile)
721 std::string extTasksFile = _tasksFile;
722 std::string extMechanicsFile = _mechanicsFile;
723 std::string extDefaultsFile = _defaultsFile;
724 std::string extSwitchersFile = _switchersFile;
732 std::stringstream tasksFile(
Preprocessor(extTasksFile).resultString);
733 std::stringstream defaultsFile(
Preprocessor(extDefaultsFile).resultString);
734 std::stringstream switchersFile(
Preprocessor(extSwitchersFile).resultString);
735 std::vector<std::string> taskFolder;
737 std::unique_ptr<StreamParser> parserTaskList;
738 parserTaskList.reset(
new StreamParser(
info,
"parser", tasksFile,
'(',
')'));
740 std::vector<std::string> alltasks;
741 parserTaskList->
get(
"problems", alltasks);
743 std::ptrdiff_t nTasks = std::count_if(alltasks.begin(), alltasks.end(), [](
const std::string& a) {
return (a.length() > 0);});
745 info(
'i') <<
"Number of problems to be solved: " << nTasks << std::endl;
747 for (
size_t i = 0; i < alltasks.size(); ++i)
749 if (alltasks[i].length() > 0)
754 std::string dir = taskLine.first;
757 info(
'i') <<
"-------- Loading problem #" << i <<
" (" << dir <<
") --------" << std::endl;
764 std::unique_ptr<StreamParser> parserTask;
766 parserTask.reset(
new StreamParser(
info,
"problem parameters", tskStream, defaultsFile, {
"pspfile",
"np",
"copyPath"}));
778 info(
'e') <<
"Internal MPI-parallelization is not supported longer!" << std::endl;
781 std::string copyPath;
783 if (copyPath.length() > 0)
788 std::string initDir(copyPath.begin(), copyPath.end());
792 std::replace(dir.begin(), dir.end(),
'/',
'\\');
793 std::replace(initDir.begin(), initDir.end(),
'/',
'\\');
799 command =
"copy \"" + initDir +
"\\*.*\" "+ dir +
"\\";
801 command =
"cp ./" + initDir +
"/* " + dir +
"/";
804 std::cout <<
"Copying files from folder \"" << initDir <<
"\" to \"" << dir <<
"\"" << std::endl;
806 int systemRet = system(command.c_str());
810 info(
'e') <<
"problem #" << i <<
" (" << dir << \
811 ") copying passport system method failed" << std::endl;
814 std::cout <<
"Copying OK " << std::endl << std::endl;
821 MPI_Barrier(MPI_COMM_WORLD);
824 std::unique_ptr<PassportGen> ptrPsp;
827 ptrPsp.reset(
new VM2D::Passport(
info, dir, i, pspFile, extMechanicsFile, extDefaultsFile, extSwitchersFile, vecTaskLineSecond));
831 ptrPsp.reset(
new VM3D::Passport(
info, dir, i, pspFile, extMechanicsFile, extDefaultsFile, extSwitchersFile, vecTaskLineSecond));
834 AddTask(np, std::move(ptrPsp));
836 info(
'i') <<
"-------- Problem #" << i <<
" (" << dir <<
") is loaded --------" << std::endl << std::endl;
844 defaultsFile.clear();
847 switchersFile.clear();
const std::string defaultPspFile
Имя файла с паспортом задачи
Заголовочный файл с описанием класса Passport (двумерный) и cоответствующими структурами ...
LogStream info
Поток для вывода логов и сообщений об ошибках
Times & getTimestat() const
Возврат ссылки на временную статистику выполнения шага расчета по времени
static std::ostream * defaultWorld2DLogStream
Поток вывода логов и ошибок задачи
int myProcState
Состояние данного процессора
const double kvantTime
Продолжительность кванта времени в секундах
const std::string defaultCopyPath
Путь к каталогу с задачей для копирования в новые каталоги
int myidWork
Локальный номер процессора, решающего конкретную задачу
void TaskSplit()
Процедура постановка новых задач на отсчет и занятие процессоров
Заголовочный файл с описанием класса Wake.
Заголовочный файл с описанием класса World2D.
Заголовочный файл с описанием класса Airfoil.
void assignStream(std::ostream *pStr_, const std::string &label_)
Связывание потока логов с потоком вывода
Заголовочный файл с описанием класса WorldGen.
std::vector< int > procStateVar
Модифицированный список состояний процессоров
Заголовочный файл с описанием класса WakeDataBase.
void AddTask(int _nProc, std::unique_ptr< PassportGen > _passport)
Добавление задачи в список
Заголовочный файл с описанием класса Preprocessor.
Класс, позволяющий выполнять предварительную обработку файлов
Заголовочный файл с описанием класса Mechanics.
int myidAll
Глобальный номер процессора
int commWork
Коммуникатор для решения конкретной задачи
void RunConveyer()
Запуск вычислительного конвейера (в рамках кванта времени)
void LoadTasksList(const std::string &_tasksFile, const std::string &_mechanicsFile, const std::string &_defaultsFile, const std::string &_switchersFile)
Загрузка списка задач
Класс, опеделяющий паспорт двумерной задачи
int myProcStateVar
Состояние данного процессора
void GenerateMechanicsHeader(size_t mechanicsNumber)
std::vector< int > procState
Список состояний процессоров
Queue(int &argc, char **&argv, void(*_CreateMpiTypes)())
Конструктор
static std::vector< std::string > StringToVector(std::string line, char openBracket= '(', char closeBracket= ')')
Pазбор строки, содержащей запятые, на отдельные строки
void ConstructProcStateVar()
Процедура, нумерующая задачи в возрастающем порядке
std::vector< int > flagFinish
Список возвращаемых флагов останова задачи
int nProcAll
Общее число процессоров
Заголовочный файл с описанием класса StreamParser.
Заголовочный файл с описанием класса Queue.
std::vector< Task > task
Список описаний решаемых задач
int currentKvant
Номер текущего кванта времени
static std::ostream * defaultQueueLogStream
Поток вывода логов и ошибок очереди
bool fileExistTest(std::string &fileName, LogStream &info, const std::list< std::string > &extList={})
Проверка существования файла
static std::pair< std::string, std::string > SplitString(LogStream &info, std::string line, bool upcase=true)
Разбор строки на пару ключ-значение
Заголовочный файл с описанием класса MeasureVP.
const Passport & getPassport() const
Возврат константной ссылки на паспорт
static std::string VectorStringToString(const std::vector< std::string > &_vecString)
Объединение вектора (списка) из строк в одну строку
void TaskUpdate()
Процедура обновления состояния задач и процессоров
virtual void GenerateStatHeader() const override
Генерация заголовка файла временной статистики
std::unique_ptr< WorldGen > world
Умный указатель на текущую решаемую задачу
Класс, опеделяющий текущую решаемую задачу
std::vector< AirfoilParams > airfoilParams
Список структур с параметрами профилей
Заголовочный файл с описанием класса Velocity.
void endl()
Вывод в поток логов пустой строки
void PrintUniversalLogoToStream(std::ostream &str)
Передача в поток вывода универсальной шапки программы VM2D/VM3D.
void CreateDirectory(const std::string &dir, const std::string &name)
Создание каталога
Класс, позволяющий выполнять разбор файлов и строк с настройками и параметрами
Parallel parallel
Класс, опеделяющий параметры исполнения задачи в параллельном MPI-режиме
bool get(const std::string &name, std::vector< Point2D > &res, const std::vector< Point2D > *defValue=nullptr, bool echoDefault=true) const
Считывание вектора из двумерных точек из базы данных
const int defaultNp
Необходимое число процессоров для решения задачи
struct VMlib::Queue::@0 numberOfTask
Структура, содержащая информацию о количестве задач в данный момент времени
Заголовочный файл с описанием класса Boundary.
int nProcWork
Число процессоров, решающих конкретную задачу
int sizeCommSolving
Число процессоров в группе для головных процессоров в решаемых в данном кванте времени задачах ...
int nextKvant
Признак необходимости выполнения следующего кванта и продолжения расчета