void TestSolver::circle2() { const ExprSymbol& x=ExprSymbol::new_("x"); const ExprSymbol& y=ExprSymbol::new_("y"); SystemFactory f; f.add_var(x); f.add_var(y); f.add_ctr(sqr(x)+sqr(y)=1); f.add_ctr(sqr(x-2)+sqr(y)=1); double _sol1[]={1,0}; Vector sol1(2,_sol1); System sys(f); RoundRobin rr(1e-3); CellStack stack; CtcHC4 hc4(sys); Vector prec(2,1e-3); Solver solver(sys,hc4,rr,stack,prec,prec); solver.start(IntervalVector(2,Interval(-10,10))); CovSolverData::BoxStatus status; bool res=solver.next(status); CPPUNIT_ASSERT(res); CPPUNIT_ASSERT(status==CovSolverData::UNKNOWN); CPPUNIT_ASSERT(solver.get_data().nb_unknown()==1); CPPUNIT_ASSERT(solver.get_data().unknown(0).is_superset(sol1)); res=solver.next(status); CPPUNIT_ASSERT(!res); }
static base::Vector<1>::Type sol( const VecDim& x, const double radius, const double alpha1, const double alpha2 ) { VecDim dummy; return (interface( x, radius, dummy ) ? sol1( x, radius, alpha1, alpha2 ) : sol2( x, radius, alpha1, alpha2 ) ); }
int main() { init(); initgraph(640, 480); sol1(); sol4(); getch(); closegraph(); return 0; }
void TestSolver::circle4() { const ExprSymbol& x=ExprSymbol::new_("x"); const ExprSymbol& y=ExprSymbol::new_("y"); const ExprSymbol& r2=ExprSymbol::new_("r2"); SystemFactory f; f.add_var(x); f.add_var(y); f.add_var(r2); f.add_ctr(sqr(x)+sqr(y)=r2); f.add_ctr(sqr(x-1)+sqr(y)=r2); double cospi6=0.5; double sinpi6=::sqrt(3)/2; double _sol1[]={cospi6,sinpi6,1}; double _sol2[]={cospi6,-sinpi6,1}; Vector sol1(3,_sol1); Vector sol2(3,_sol2); System sys(f); RoundRobin rr(1e-3); CellStack stack; CtcHC4 hc4(sys); VarSet params(sys.f_ctrs,sys.args[2],false); Vector prec(3,1e-3); Solver solver(sys,hc4,rr,stack,prec,prec); solver.set_params(params); IntervalVector box(3); box[0]=Interval(-10,10); box[1]=Interval(-10,10); box[2]=Interval(1,1); solver.start(box); CovSolverData::BoxStatus status; bool res=solver.next(status); CPPUNIT_ASSERT(res); CPPUNIT_ASSERT(status==CovSolverData::SOLUTION); CPPUNIT_ASSERT(solver.get_data().nb_solution()==1); CPPUNIT_ASSERT(solver.get_data().solution(0).is_superset(sol1)); res=solver.next(status); CPPUNIT_ASSERT(status==CovSolverData::SOLUTION); CPPUNIT_ASSERT(solver.get_data().nb_solution()==2); CPPUNIT_ASSERT(solver.get_data().solution(1).is_superset(sol2)); res=solver.next(status); CPPUNIT_ASSERT(!res); }
void TestSolver::circle3() { const ExprSymbol& x=ExprSymbol::new_("x"); const ExprSymbol& y=ExprSymbol::new_("y"); SystemFactory f; f.add_var(x); f.add_var(y); f.add_ctr(sqr(x)+sqr(y)=1); f.add_ctr(sqr(x-1)+sqr(y)=1); double cospi6=0.5; double sinpi6=(sqrt(Interval(3))/2).lb(); f.add_ctr(4*y*abs(y)<=3); // a rigorous way to impose y<=sin(pi/6). double _sol1[]={cospi6,sinpi6}; double _sol2[]={cospi6,-sinpi6}; Vector sol1(2,_sol1); Vector sol2(2,_sol2); System sys(f); RoundRobin rr(1e-3); CellStack stack; CtcHC4 hc4(sys); Vector prec(2,1e-3); Solver solver(sys,hc4,rr,stack,prec,prec); solver.start(IntervalVector(2,Interval(-10,10))); CovSolverData::BoxStatus status; bool res=solver.next(status); CPPUNIT_ASSERT(res); CPPUNIT_ASSERT(status==CovSolverData::UNKNOWN); CPPUNIT_ASSERT(solver.get_data().nb_unknown()==1); CPPUNIT_ASSERT(solver.get_data().unknown(0).is_superset(sol1)); res=solver.next(status); CPPUNIT_ASSERT(res); CPPUNIT_ASSERT(status==CovSolverData::SOLUTION); CPPUNIT_ASSERT(solver.get_data().nb_solution()==1); CPPUNIT_ASSERT(solver.get_data().solution(0).is_superset(sol2)); res=solver.next(status); CPPUNIT_ASSERT(!res); }
int sol(pair_t *r, double c, double d, double a[2], pair_t p[2]) { double t; t = pi / 2. - c; a[0] += t; a[1] += t; p[0] = rot(p[0], t); p[1] = rot(p[1], t); if (sol1(r, d, a, p) == 0) return 0; *r = rot(*r, -t); return 1; }
int main() { eoPop<DualVector> pop; // fixed test DualVector sol1(2,-1); DualVector sol2(2,-1); DualVector sol3(2,1); DualVector sol4(2,1); pop.push_back( sol1 ); pop.push_back( sol2 ); pop.push_back( sol3 ); pop.push_back( sol4 ); // on the sphere function everyone has the same fitness of 1 if( test(pop, 0) != 0 ) { exit(1); } pop.erase(pop.begin(),pop.end()); // fixed test sol1 = DualVector(2,0); sol2 = DualVector(2,0); sol3 = DualVector(2,1); sol4 = DualVector(2,1); pop.push_back( sol1 ); pop.push_back( sol2 ); pop.push_back( sol3 ); pop.push_back( sol4 ); if( test(pop, 1) != 1 ) { exit(1); } // test on a random normal distribution eoNormalGenerator<double> normal(1,rng); eoInitFixedLength<DualVector> init_N(2, normal); pop = eoPop<DualVector>( 1000000, init_N ); double iqr = test(pop, 1.09); if( iqr < 1.08 || iqr > 1.11 ) { exit(1); } }
int sol(pair_t *r, double c, double d, double a[2], pair_t p[2]) { double t = -c; pair_t q[2], z; a[0] += t; a[1] += t; q[0] = rot(p[0], t); q[1] = rot(p[1], t); if (sol1(&z, d, a, q) == 0) return 0; *r = rot(z, -t); { pair_t p = { 6, 5 }; p = rot(p, t); printf("need: (%.5f, %.5f)\n", p.x, p.y); } return 1; }
bool SIMoutput::dumpVector (const Vector& vsol, const char* fname, utl::LogStream& os, std::streamsize precision) const { if (vsol.empty() || myPoints.empty()) return true; size_t i, j, k; Matrix sol1; Vector lsol; for (i = 0; i < myModel.size(); i++) { if (myModel[i]->empty()) continue; // skip empty patches std::vector<ResPtPair>::const_iterator pit; ResPointVec::const_iterator p; std::array<RealArray,3> params; IntVec points; // Find all evaluation points within this patch, if any for (j = 0, pit = myPoints.begin(); pit != myPoints.end(); ++pit) for (p = pit->second.begin(); p != pit->second.end(); j++, ++p) if (this->getLocalPatchIndex(p->patch) == (int)(i+1)) if (opt.discretization >= ASM::Spline) { points.push_back(p->inod > 0 ? p->inod : -(j+1)); for (k = 0; k < myModel[i]->getNoParamDim(); k++) params[k].push_back(p->u[k]); } else if (p->inod > 0) points.push_back(p->inod); if (points.empty()) continue; // no points in this patch // Evaluate/extracto nodal solution variables myModel[i]->extractNodeVec(vsol,lsol); if (opt.discretization >= ASM::Spline) { if (!myModel[i]->evalSolution(sol1,lsol,params.data(),false)) return false; } else { if (!myModel[i]->getSolution(sol1,lsol,points)) return false; } // Formatted output, use scientific notation with fixed field width std::streamsize flWidth = 8 + precision; std::streamsize oldPrec = os.precision(precision); std::ios::fmtflags oldF = os.flags(std::ios::scientific | std::ios::right); for (j = 0; j < points.size(); j++) { if (points[j] < 0) os <<" Point #"<< -points[j]; else { points[j] = myModel[i]->getNodeID(points[j]); os <<" Node #"<< points[j]; } os <<":\t"<< fname <<" ="; for (k = 1; k <= sol1.rows(); k++) os << std::setw(flWidth) << utl::trunc(sol1(k,j+1)); os << std::endl; } os.precision(oldPrec); os.flags(oldF); } return true; }
bool SIMoutput::dumpResults (const Vector& psol, double time, utl::LogStream& os, const ResPointVec& gPoints, bool formatted, std::streamsize precision) const { if (gPoints.empty()) return true; size_t i, j, k; Matrix sol1, sol2; Vector reactionFS; const Vector* reactionForces = myEqSys->getReactions(); for (i = 0; i < myModel.size(); i++) { if (myModel[i]->empty()) continue; // skip empty patches ResPointVec::const_iterator p; std::array<RealArray,3> params; IntVec points; // Find all evaluation points within this patch, if any for (j = 0, p = gPoints.begin(); p != gPoints.end(); j++, p++) if (this->getLocalPatchIndex(p->patch) == (int)(i+1)) if (opt.discretization >= ASM::Spline) { points.push_back(p->inod > 0 ? p->inod : -(j+1)); for (k = 0; k < myModel[i]->getNoParamDim(); k++) params[k].push_back(p->u[k]); } else if (p->inod > 0) points.push_back(p->inod); if (points.empty()) continue; // no points in this patch myModel[i]->extractNodeVec(psol,myProblem->getSolution()); if (opt.discretization >= ASM::Spline) { // Evaluate the primary solution variables if (!myModel[i]->evalSolution(sol1,myProblem->getSolution(), params.data(),false)) return false; // Evaluate the secondary solution variables LocalSystem::patch = i; if (myProblem->getNoFields(2) > 0) { const_cast<SIMoutput*>(this)->setPatchMaterial(i+1); if (!myModel[i]->evalSolution(sol2,*myProblem,params.data(),false)) return false; } } else // Extract nodal primary solution variables if (!myModel[i]->getSolution(sol1,myProblem->getSolution(),points)) return false; // Formatted output, use scientific notation with fixed field width std::streamsize flWidth = 8 + precision; std::streamsize oldPrec = os.precision(precision); std::ios::fmtflags oldF = os.flags(std::ios::scientific | std::ios::right); for (j = 0; j < points.size(); j++) { if (!formatted) os << time <<" "; else if (points[j] < 0) os <<" Point #"<< -points[j] <<":\tsol1 ="; else { points[j] = myModel[i]->getNodeID(points[j]); os <<" Node #"<< points[j] <<":\tsol1 ="; } for (k = 1; k <= sol1.rows(); k++) os << std::setw(flWidth) << utl::trunc(sol1(k,j+1)); if (opt.discretization >= ASM::Spline) { if (formatted && sol2.rows() > 0) os <<"\n\t\tsol2 ="; for (k = 1; k <= sol2.rows(); k++) os << std::setw(flWidth) << utl::trunc(sol2(k,j+1)); } if (reactionForces && points[j] > 0) // Print nodal reaction forces for nodes with prescribed DOFs if (mySam->getNodalReactions(points[j],*reactionForces,reactionFS)) { if (formatted) os <<"\n\t\treac ="; for (k = 0; k < reactionFS.size(); k++) os << std::setw(flWidth) << utl::trunc(reactionFS[k]); } os << std::endl; } os.precision(oldPrec); os.flags(oldF); } return true; }