Changeset 2423 in Sophya for trunk/SophyaLib/NTools/integ.cc
- Timestamp:
- Aug 28, 2003, 3:29:03 PM (22 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaLib/NTools/integ.cc
r2283 r2423 117 117 118 118 Integrator::~Integrator() 119 { delete mFunc;}119 {if(mFunc) delete mFunc;} 120 120 121 121 //++ … … 222 222 Limits(xmin,xmax); 223 223 return Value(); 224 } 225 226 void 227 Integrator::Print(int lp) 228 { 229 cout<<"Integrator between "<<mXMin<<" and "<<mXMax 230 <<" in "<<mNStep<<" steps"<<endl; 231 if(lp>1) cout<<"mFunc="<<mFunc<<"mGFF="<<mGFF 232 <<"mReqPrec="<<mReqPrec<<"mDX="<<mDX<<endl; 224 233 } 225 234 … … 332 341 // fonction aux zéros des polynomes de Legendre. Avec les poids 333 342 // qui vont bien, GL d'ordre n est exacte pour des polynomes de 334 // degré <= 2n+1 .343 // degré <= 2n+1 (monome le + haut x^(2*n-1). 335 344 // Impossible de demander une précision donnée. 336 345 // … … 408 417 GLInteg::~GLInteg() 409 418 { 410 delete[] mXPos; 411 delete[] mWeights; 412 mXPos = mWeights = NULL; 419 if(mXPos) delete[] mXPos; mXPos = NULL; 420 if(mWeights) delete[] mWeights; mWeights = NULL; 413 421 } 414 422 … … 416 424 GLInteg::InvalWeights() 417 425 { 418 delete[] mXPos; 419 delete[] mWeights; 420 mXPos = mWeights = NULL; 426 if(mXPos) delete[] mXPos; mXPos = NULL; 427 if(mWeights) delete[] mWeights; mWeights = NULL; 421 428 } 422 429 … … 425 432 GLInteg::LimitsChanged() 426 433 { 427 434 ComputeBounds(); 428 435 } 429 436 … … 431 438 GLInteg::StepsChanged() 432 439 { 433 440 ComputeBounds(); 434 441 } 435 442 … … 437 444 GLInteg::AddBound(double x) 438 445 { 439 440 441 442 443 446 if (x<=mXMin || x>=mXMax) THROW(rangeCheckErr); 447 // On introduira les classes d'exections apres reflexion et de maniere systematique (Rz+cmv) 448 // if (x<=mXMin || x>=mXMax) throw range_error("GLInteg::AddBound bound outside interval"); 449 mBounds.insert(x); 450 return *this; 444 451 } 445 452 … … 448 455 GLInteg::SetOrder(int order) 449 456 { 450 451 452 457 mOrder = order; 458 InvalWeights(); 459 return *this; 453 460 } 454 461 … … 458 465 GLInteg::Value() 459 466 { 460 461 462 463 464 465 466 467 468 for(int k=0; k<mOrder; k++)469 470 471 472 473 467 if (!mXPos) ComputeWeights(); 468 double s = 0; 469 set<double>::iterator i=mBounds.begin(); 470 set<double>::iterator j=i; j++; 471 while (j != mBounds.end()) { 472 double s1 = 0; 473 double x1 = *i; 474 double x2 = *j; 475 for(int k=0; k<mOrder; k++) 476 s1 += mWeights[k] * FVal(x1 + (x2-x1)*mXPos[k]); 477 s += s1*(x2-x1); 478 i++; j++; 479 } 480 return s; 474 481 } 475 482 … … 485 492 GLInteg::ComputeWeights() 486 493 { 487 const double EPS_gauleg = 3.0e-11;494 const double EPS_gauleg = 5.0e-12; 488 495 489 496 int m=(mOrder+1)/2; … … 519 526 } 520 527 528 void 529 GLInteg::Print(int lp) 530 { 531 Integrator::Print(lp); 532 cout<<"GLInteg order="<<mOrder<<endl; 533 if(lp>0 && mOrder>0) { 534 for(int i=0;i<mOrder;i++) 535 cout<<" ("<<mXPos[i]<<","<<mWeights[i]<<")"; 536 cout<<endl; 537 } 538 }
Note:
See TracChangeset
for help on using the changeset viewer.