void compare(char* input, char* inoutput, int* length, MPI_Datatype* type) { vector<Move> solution1; int position1 = 0; deserializeSolution(input, position1, solution1); vector<Move> solution2; int position2 = 0; deserializeSolution(inoutput, position2, solution2); int position3 = 0; if (solution1.size() ==0) { serializeSolution(inoutput, position3, solution2); return; } if(solution2.size()==0){ serializeSolution(inoutput, position3, solution1); return; } if(solution2.size()>solution1.size()){ serializeSolution(inoutput, position3, solution1); } else{ serializeSolution(inoutput, position3, solution2); } }
void AuxiliarySystem::compute(ExecFlagType type) { // avoid division by dt which might be zero. if (_fe_problem.dt() > 0. && _time_integrator) _time_integrator->preStep(); // We need to compute time derivatives every time each kind of the variables is finished, because: // // a) the user might want to use the aux variable value somewhere, thus we need to provide the // up-to-date value // b) time integration system works with the whole vectors of solutions, thus we cannot update // only a part of the vector // if (_vars[0].scalars().size() > 0) { computeScalarVars(type); // compute time derivatives of scalar aux variables _after_ the values were updated if (_fe_problem.dt() > 0. && _time_integrator) _time_integrator->computeTimeDerivatives(); } if (_vars[0].fieldVariables().size() > 0) { computeNodalVars(type); // compute time derivatives of nodal aux variables _after_ the values were updated if (_fe_problem.dt() > 0. && _time_integrator) _time_integrator->computeTimeDerivatives(); } if (_vars[0].fieldVariables().size() > 0) { computeElementalVars(type); // compute time derivatives of elemental aux variables _after_ the values were updated if (_fe_problem.dt() > 0. && _time_integrator) _time_integrator->computeTimeDerivatives(); } if (_need_serialized_solution) serializeSolution(); }
void AuxiliarySystem::compute(ExecFlagType type/* = EXEC_RESIDUAL*/) { if (_vars[0].scalars().size() > 0) computeScalarVars(type); if (_vars[0].variables().size() > 0) { computeNodalVars(type); computeElementalVars(type); } if (_need_serialized_solution) serializeSolution(); // can compute time derivatives _after_ the current values were updated // also, at the very beginning, avoid division by dt which might be zero. if (_mproblem.dt() > 0.) _time_integrator->computeTimeDerivatives(); }
void Solver::solve(vector<Move>& _solution) { lowerBound = initBoard->getLowerBound(targetTower); bestSolutionDepth = maxDepth; if (myRank != MASTER_RANK) { //cekam az mi prijde prace //prvni rozdeleni se udela automaticky bez zadani //cekam dokud message neprijde melo by prijit prvni deleni prace //momentalne to prvni spocte takzee prijde pesek MPI_Status s; MPI_Probe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &s); processMessages(); } else { // Hotovo, koncim. if (initBoard->isTowerComplete(targetTower)) { broadcast(MESSAGE_FINISHED); return; } Move firstMove(0, 0, 0); SpaceItem* firstSpaceItem = new SpaceItem(*initBoard, firstMove); space.push_back(firstSpaceItem); expandTop(); actualDepth = 1; firstWorkDistribution = true; space.erase(space.begin()); } int counter = 0; while (!finished) { if (!space.empty()) { proccessTop(_solution, actualDepth); } else { requestData(); sendToken(); } if (counter == 150) {//natipovat idealni honotu if ((myRank == MASTER_RANK) && firstWorkDistribution) { firstDistribution(); counter = 0; } else { counter = 0; processMessages(); if (finished) { char buffer[BUFFER_SIZE]; int position = 0; serializeSolution(buffer, position, _solution); char result[BUFFER_SIZE]; MPI_Op op; MPI_Op_create((MPI_User_function*) compare, 0, &op); // cout<<_solution.size()<<endl; MPI_Reduce(&buffer, &result, BUFFER_SIZE, MPI_PACKED, op, 0, MPI_COMM_WORLD); int workRequestsRes; MPI_Reduce (&workRequestsInt, &workRequestsRes, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); int failedWorkRequestsRes; MPI_Reduce (&failedWorkRequests, &failedWorkRequestsRes, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD); if (myRank == MASTER_RANK) { vector<Move> solution; int position = 0; deserializeSolution(result, position, solution); cout << "MASTER - ZACATEK RESENI" << endl; for (vector<Move>::const_iterator it = solution.begin(); it < solution.end(); ++it) { cout << *it << endl; } cout << "Solution depth: " << solution.size() << endl; cout<< "Work Requests: "<<workRequestsRes<<endl; cout<<"Denied Work Requests: "<<failedWorkRequestsRes<<endl; cout << "MASTER - KONEC RESENI" << endl; } } } } counter++; } // cout << "PushCount process " << myRank << ": " << pushCount << endl; // cout << "Solution: " << _solution.size() << " - process " << myRank << endl; // cout << "mam jeste: " << space.size() << " stavu" << endl; }