00001
00002
00003
00004
00005
00006
00007 #include "BDSGlobalConstants.hh"
00008 #include "BDSElement.hh"
00009 #include "G4Box.hh"
00010 #include "G4Tubs.hh"
00011 #include "G4Torus.hh"
00012 #include "G4Trd.hh"
00013 #include "G4VisAttributes.hh"
00014 #include "G4LogicalVolume.hh"
00015 #include "G4VPhysicalVolume.hh"
00016 #include "G4PVPlacement.hh"
00017 #include "G4UserLimits.hh"
00018 #include "G4Mag_UsualEqRhs.hh"
00019 #include "BDSHelixStepper.hh"
00020 #include "BDSQuadStepper.hh"
00021 #include "BDSOctStepper.hh"
00022 #include "BDSSextStepper.hh"
00023 #include "G4HelixImplicitEuler.hh"
00024 #include "G4HelixExplicitEuler.hh"
00025 #include "G4HelixMixedStepper.hh"
00026 #include "G4HelixSimpleRunge.hh"
00027 #include "G4HelixHeum.hh"
00028 #include "G4SimpleRunge.hh"
00029 #include "G4ExactHelixStepper.hh"
00030 #include "BDSAcceleratorComponent.hh"
00031 #include "BDS3DMagField.hh"
00032 #include "BDSXYMagField2.hh"
00033 #include "G4CashKarpRKF45.hh"
00034
00035
00036 #include "parser/gmad.h"
00037 #include "ggmad.hh"
00038 #include "BDSGeometrySQL.hh"
00039
00040 #ifdef USE_LCDD
00041 #include "BDSGeometryLCDD.hh"
00042 #endif
00043
00044 #ifdef USE_GDML
00045 #include "BDSGeometryGDML.hh"
00046 #endif
00047
00048 #include <map>
00049
00050 using namespace std;
00051
00052
00053
00054 typedef std::map<G4String,int> LogVolCountMap;
00055 extern LogVolCountMap* LogVolCount;
00056
00057 typedef std::map<G4String,G4LogicalVolume*> LogVolMap;
00058 extern LogVolMap* LogVol;
00059
00060 extern G4RotationMatrix* RotY90;
00061
00062
00063
00064 BDSElement::BDSElement(G4String aName, G4String geometry, G4String bmap,
00065 G4double aLength, G4double bpRad, G4double outR, G4String aTunnelMaterial, G4double aTunnelRadius, G4double aTunnelOffsetX, G4String aTunnelCavityMaterial, G4int aPrecisionRegion):
00066 BDSAcceleratorComponent(
00067 aName,
00068 aLength,bpRad,0,0,
00069 SetVisAttributes(), aTunnelMaterial, "", 0., 0., 0., 0., aTunnelRadius*m, aTunnelOffsetX*m, aTunnelCavityMaterial, aPrecisionRegion),
00070 fChordFinder(NULL), itsFStepper(NULL), itsFEquation(NULL), itsEqRhs(NULL),
00071 itsField(NULL), itsMagField(NULL), itsUniformMagField(NULL)
00072 {
00073 itsFieldVolName="";
00074 itsFieldIsUniform=false;
00075 itsOuterR = outR;
00076 SetType(_ELEMENT);
00077
00078
00079 CalculateLengths();
00080
00081
00082
00083 align_in_volume = NULL;
00084 align_out_volume = NULL;
00085
00086 if(!(*LogVolCount)[itsName])
00087 {
00088 #ifdef DEBUG
00089 G4cout<<"BDSElement : starting build logical volume "<<
00090 itsName<<G4endl;
00091 #endif
00092 BuildGeometry();
00093
00094 #ifdef DEBUG
00095 G4cout<<"BDSElement : end build logical volume "<<
00096 itsName<<G4endl;
00097 #endif
00098
00099 PlaceComponents(geometry,bmap);
00100 }
00101 else
00102 {
00103 (*LogVolCount)[itsName]++;
00104
00105 itsMarkerLogicalVolume=(*LogVol)[itsName];
00106 }
00107 }
00108
00109
00110 void BDSElement::BuildElementMarkerLogicalVolume(){
00111
00112 #ifdef DEBUG
00113 G4cout<<"BDSElement : creating logical volume"<<G4endl;
00114 #endif
00115 G4double elementSizeX=itsOuterR+BDSGlobalConstants::Instance()->GetLengthSafety()/2, elementSizeY = itsOuterR+BDSGlobalConstants::Instance()->GetLengthSafety()/2;
00116
00117
00118 elementSizeX = std::max(elementSizeX, this->GetTunnelRadius()+2*std::abs(this->GetTunnelOffsetX()) + BDSGlobalConstants::Instance()->GetTunnelThickness()+BDSGlobalConstants::Instance()->GetTunnelSoilThickness() + 4*BDSGlobalConstants::Instance()->GetLengthSafety() );
00119 elementSizeY = std::max(elementSizeY, this->GetTunnelRadius()+2*std::abs(BDSGlobalConstants::Instance()->GetTunnelOffsetY()) + BDSGlobalConstants::Instance()->GetTunnelThickness()+BDSGlobalConstants::Instance()->GetTunnelSoilThickness()+4*BDSGlobalConstants::Instance()->GetLengthSafety() );
00120
00121 G4double elementSize=std::max(elementSizeX, elementSizeY);
00122
00123
00124 itsMarkerLogicalVolume =
00125 new G4LogicalVolume(new G4Box(itsName+"generic_element",
00126 elementSize,
00127 elementSize,
00128 itsLength/2.0),
00129 BDSMaterials::Instance()->GetMaterial(BDSGlobalConstants::Instance()->GetVacuumMaterial()),
00130 itsName);
00131
00132
00133
00134
00135
00136 #ifdef DEBUG
00137 G4cout<<"marker volume : x/y="<<elementSize/m<<
00138 " m, l= "<< (itsLength)/2/m <<" m"<<G4endl;
00139 #endif
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208 itsMarkerUserLimits = new G4UserLimits(DBL_MAX,DBL_MAX,DBL_MAX, BDSGlobalConstants::Instance()->GetThresholdCutCharged());
00209 G4double maxStepFactor=5;
00210 itsMarkerUserLimits->SetMaxAllowedStep(itsLength*maxStepFactor);
00211 itsMarkerLogicalVolume->SetUserLimits(itsMarkerUserLimits);
00212
00213
00214
00215
00216
00217 itsMarkerLogicalVolume->
00218 SetFieldManager(BDSGlobalConstants::Instance()->GetZeroFieldManager(),false);
00219 }
00220
00221 void BDSElement::BuildGeometry()
00222 {
00223
00224
00225
00226 BuildElementMarkerLogicalVolume();
00227
00228
00229 (*LogVolCount)[itsName] = 1;
00230 (*LogVol)[itsName] = itsMarkerLogicalVolume;
00231 #ifndef NOUSERLIMITS
00232 itsOuterUserLimits = new G4UserLimits();
00233 G4double stepfactor=5;
00234 itsOuterUserLimits->SetMaxAllowedStep(itsLength*stepfactor);
00235 itsOuterUserLimits->SetUserMaxTime(BDSGlobalConstants::Instance()->GetMaxTime());
00236 if(BDSGlobalConstants::Instance()->GetThresholdCutCharged()>0){
00237 itsOuterUserLimits->SetUserMinEkine(BDSGlobalConstants::Instance()->GetThresholdCutCharged());
00238 }
00239 itsMarkerLogicalVolume->SetUserLimits(itsOuterUserLimits);
00240 #endif
00241
00242
00243 if(BDSGlobalConstants::Instance()->GetBuildTunnel()){
00244 BuildTunnel();
00245 }
00246 }
00247
00248
00249 void BDSElement::PlaceComponents(G4String geometry, G4String bmap)
00250 {
00251
00252 G4String gFormat="", bFormat="";
00253 G4String gFile="", bFile="";
00254
00255
00256 if(geometry != ""){
00257 G4int pos = geometry.find(":");
00258 gFormat="none";
00259 if(pos<0) {
00260 G4cerr<<"WARNING: invalid geometry reference format : "<<geometry<<endl;
00261 }
00262 else {
00263 gFormat = geometry.substr(0,pos);
00264 gFile = BDSGlobalConstants::Instance()->GetBDSIMHOME();
00265 G4String temp = geometry.substr(pos+1,geometry.length() - pos);
00266 G4cout << "BDSElement::PlaceComponents SQL file is " << temp << G4endl;
00267 G4cout << "BDSElement::PlaceComponents Full path is " << gFile << G4endl;
00268 gFile+=temp;
00269 G4cout << "BDSElement::PlaceComponents Full path is " << gFile << G4endl;
00270 }
00271 }
00272
00273
00274 bFormat="none";
00275 if(bmap != ""){
00276 G4int pos = bmap.find(":");
00277 if(pos<0) {
00278 G4cerr<<"WARNING: invalid B map reference format : "<<bmap<<endl;
00279 }
00280 else {
00281 bFormat = bmap.substr(0,pos);
00282 bFile = BDSGlobalConstants::Instance()->GetBDSIMHOME();
00283 bFile += bmap.substr(pos+1,bmap.length() - pos);
00284 G4cout << "BDSElement::PlaceComponents bmap file is " << bFile << G4endl;
00285 }
00286 }
00287
00288 G4cout<<"placing components:\n geometry format - "<<gFormat<<G4endl<<
00289 "file - "<<gFile<<G4endl;
00290
00291 G4cout<<"bmap format - "<<bFormat<<G4endl<<
00292 "file - "<<bFile<<G4endl;
00293
00294
00295
00296
00297
00298
00299 GGmadDriver *ggmad;
00300 BDSGeometrySQL *Mokka;
00301
00302 #ifdef USE_LCDD
00303 BDSGeometryLCDD *LCDD;
00304 #endif
00305 #ifdef USE_GDML
00306 BDSGeometryGDML *GDML;
00307 #endif
00308
00309 if(gFormat=="gmad") {
00310
00311 ggmad = new GGmadDriver(gFile);
00312 ggmad->Construct(itsMarkerLogicalVolume);
00313
00314
00315
00316
00317
00318
00319
00320 SetMultipleSensitiveVolumes(itsMarkerLogicalVolume);
00321
00322
00323 if(bFormat=="3D"){
00324 G4cout << "BDSElement.cc> Making BDS3DMagField..." << G4endl;
00325 itsMagField = new BDS3DMagField(bFile, 0);
00326 BuildMagField(true);
00327 }else if(bFormat=="XY"){
00328 G4cout << "BDSElement.cc> Making BDSXYMagField2..." << G4endl;
00329 itsMagField = new BDSXYMagField2(bFile);
00330
00331 BuildMagField(true);
00332 }
00333 delete ggmad;
00334 ggmad = 0;
00335 }
00336 else if(gFormat=="lcdd") {
00337 #ifdef USE_LCDD
00338 LCDD = new BDSGeometryLCDD(gFile);
00339
00340 G4VisAttributes* VisAttLCDD = new G4VisAttributes(G4Colour(0.0, 1.0, 0.0));
00341 VisAttLCDD->SetForceSolid(true);
00342 VisAttLCDD->SetVisibility(false);
00343 itsMarkerLogicalVolume->SetVisAttributes(VisAttLCDD);
00344
00345 LCDD->Construct(itsMarkerLogicalVolume);
00346 SetMultipleSensitiveVolumes(itsMarkerLogicalVolume);
00347 if(bFormat=="XY"){
00348 itsMagField = new BDSXYMagField(bFile);
00349
00350 BuildMagField(true);
00351 } else if ( bFormat == "mokka" ){
00352 G4ThreeVector uniField = G4ThreeVector(0,3.5*tesla,0);
00353 std::vector<G4ThreeVector> uniFieldVect;
00354 uniFieldVect.push_back(uniField);
00355 std::vector<G4double> nulld;
00356 std::vector<G4String> nulls;
00357
00358 } else if ( bFormat == "test" ){
00359 }
00360 else if ( bFormat == "none" ){
00361 itsFieldIsUniform=LCDD->GetFieldIsUniform();
00362 if(itsFieldIsUniform){
00363 G4cout << "BDSElement> using LCDD format uniform field..." << G4endl;
00364 itsUniformMagField=LCDD->GetUniformField();
00365 }else{
00366 itsMagField=LCDD->GetField();
00367 }
00368 itsFieldVolName=LCDD->GetFieldVolName();
00369 BuildMagField(true);
00370 }
00371
00372 vector<G4LogicalVolume*> SensComps = LCDD->SensitiveComponents;
00373 for(G4int id=0; id<(G4int)SensComps.size(); id++)
00374 SetMultipleSensitiveVolumes(SensComps[id]);
00375
00376
00377 #else
00378 G4cout << "LCDD support not selected during BDSIM configuration" << G4endl;
00379 G4Exception("Please re-compile BDSIM with USE_LCDD flag in Makefile", "-1", FatalException, "");
00380 #endif
00381 }
00382 else if(gFormat=="mokka") {
00383 G4cout << "BDSElement.cc: loading geometry sql file: BDSGeometrySQL(" << gFile << "," << itsLength << ")" << G4endl,
00384 Mokka = new BDSGeometrySQL(gFile,itsLength);
00385 Mokka->Construct(itsMarkerLogicalVolume);
00386 for(unsigned int i=0; i<Mokka->GetMultiplePhysicalVolumes().size(); i++){
00387 SetMultiplePhysicalVolumes(Mokka->GetMultiplePhysicalVolumes().at(i));
00388 }
00389
00390 vector<G4LogicalVolume*> SensComps = Mokka->SensitiveComponents;
00391 for(G4int id=0; id<(G4int)SensComps.size(); id++)
00392 SetMultipleSensitiveVolumes(SensComps[id]);
00393
00394 vector<G4LogicalVolume*> GFlashComps =Mokka->itsGFlashComponents;
00395 for(G4int id=0; id<(G4int)GFlashComps.size(); id++)
00396 SetGFlashVolumes(GFlashComps[id]);
00397
00398 align_in_volume = Mokka->align_in_volume;
00399 align_out_volume = Mokka->align_out_volume;
00400
00401
00402 if(bFormat=="3D"){
00403 G4cout << "BDSElement.cc> Making BDS3DMagField..." << G4endl;
00404 itsMagField = new BDS3DMagField(bFile, 0);
00405 BuildMagField(true);
00406 } else if(bFormat=="XY"){
00407 G4cout << "BDSElement.cc> Making BDSXYMagField2..." << G4endl;
00408 itsMagField = new BDSXYMagField2(bFile);
00409
00410 BuildMagField(true);
00411 } else if(bFormat=="mokka" || bFormat=="none")
00412 {
00413 if(Mokka->HasFields || bFile!="")
00414
00415
00416
00417 {
00418 itsMagField = new BDSMagFieldSQL(bFile,itsLength,
00419 Mokka->QuadVolBgrad,
00420 Mokka->SextVolBgrad,
00421 Mokka->OctVolBgrad,
00422 Mokka->UniformFieldVolField,
00423 Mokka->nPoleField,
00424 Mokka->HasUniformField);
00425
00426
00427
00428 BuildMagField(true);
00429 }
00430 }
00431
00432
00433 }
00434 else if(gFormat=="gdml") {
00435 #ifdef USE_GDML
00436 GDML = new BDSGeometryGDML(gFile);
00437 GDML->Construct(itsMarkerLogicalVolume);
00438 delete GDML;
00439 GDML = 0;
00440 #else
00441 G4cout << "GDML support not selected during BDSIM configuration" << G4endl;
00442 G4Exception("Please re-compile BDSIM with USE_GDML flag in Makefile", "-1", FatalException, "");
00443 #endif
00444 }
00445 else {
00446 G4cerr<<"geometry format "<<gFormat<<" not supported"<<G4endl;
00447 }
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475 }
00476
00477
00478
00479 G4VisAttributes* BDSElement::SetVisAttributes()
00480 {
00481 itsVisAttributes=new G4VisAttributes(G4Colour(0.5,0.5,1));
00482 return itsVisAttributes;
00483 }
00484
00485
00486 void BDSElement::BuildMagField(G4bool forceToAllDaughters)
00487 {
00488 #ifdef DEBUG
00489 G4cout << "BDSElement.cc::BuildMagField Building magnetic field...." << G4endl;
00490 #endif
00491
00492 G4FieldManager* fieldManager = new G4FieldManager();
00493
00494
00495 if(!itsFieldIsUniform){
00496 #ifdef DEBUG
00497 G4cout << "BDSElement.cc> Building non-uniform magnetic field..." << endl;
00498 #endif
00499 itsEqRhs = new G4Mag_UsualEqRhs(itsMagField);
00500 if( (itsMagField->GetHasUniformField())&!(itsMagField->GetHasNPoleFields() || itsMagField->GetHasFieldMap())){
00501
00502 itsFStepper = new G4HelixMixedStepper(itsEqRhs,6);
00503 } else {
00504
00505 itsFStepper = new G4HelixImplicitEuler(itsEqRhs);
00506
00507
00508
00509 }
00510
00511
00512 fieldManager->SetDetectorField(itsMagField );
00513 } else {
00514 #ifdef DEBUG
00515 G4cout << "BDSElement.cc> Building uniform magnetic field..." << endl;
00516 #endif
00517 itsEqRhs = new G4Mag_UsualEqRhs(itsUniformMagField);
00518
00519
00520 itsFStepper = new G4HelixMixedStepper(itsEqRhs, 6);
00521 fieldManager->SetDetectorField(itsUniformMagField );
00522 }
00523
00524 #ifdef DEBUG
00525 G4cout << "BDSElement.cc> Setting stepping accuracy parameters..." << endl;
00526 #endif
00527
00528 if(BDSGlobalConstants::Instance()->GetDeltaOneStep()>0){
00529 fieldManager->SetDeltaOneStep(BDSGlobalConstants::Instance()->GetDeltaOneStep());
00530 }
00531 if(BDSGlobalConstants::Instance()->GetMaximumEpsilonStep()>0){
00532 fieldManager->SetMaximumEpsilonStep(BDSGlobalConstants::Instance()->GetMaximumEpsilonStep());
00533 }
00534 if(BDSGlobalConstants::Instance()->GetMinimumEpsilonStep()>=0){
00535 fieldManager->SetMinimumEpsilonStep(BDSGlobalConstants::Instance()->GetMinimumEpsilonStep());
00536 }
00537 if(BDSGlobalConstants::Instance()->GetDeltaIntersection()>0){
00538 fieldManager->SetDeltaIntersection(BDSGlobalConstants::Instance()->GetDeltaIntersection());
00539 }
00540
00541 G4MagInt_Driver* fIntgrDriver = new G4MagInt_Driver(BDSGlobalConstants::Instance()->GetChordStepMinimum(),
00542 itsFStepper,
00543 itsFStepper->GetNumberOfVariables() );
00544 fChordFinder = new G4ChordFinder(fIntgrDriver);
00545
00546 fChordFinder->SetDeltaChord(BDSGlobalConstants::Instance()->GetDeltaChord());
00547
00548 fieldManager->SetChordFinder( fChordFinder );
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561
00562
00563
00564
00565 #ifdef DEBUG
00566 G4cout << "BDSElement.cc> Setting the logical volume " << itsMarkerLogicalVolume->GetName() << " field manager... force to all daughters = " << forceToAllDaughters << endl;
00567 #endif
00568 itsMarkerLogicalVolume->SetFieldManager(fieldManager,forceToAllDaughters);
00569 }
00570
00571
00572
00573
00574 void BDSElement::PrepareField(G4VPhysicalVolume *referenceVolume)
00575 {
00576 if(!itsMagField) return;
00577 itsMagField->Prepare(referenceVolume);
00578 }
00579
00580
00581
00582
00583 void BDSElement::AlignComponent(G4ThreeVector& TargetPos,
00584 G4RotationMatrix *TargetRot,
00585 G4RotationMatrix& globalRotation,
00586 G4ThreeVector& rtot,
00587 G4ThreeVector& rlast,
00588 G4ThreeVector& localX,
00589 G4ThreeVector& localY,
00590 G4ThreeVector& localZ)
00591 {
00592
00593
00594 if(align_in_volume == NULL)
00595 {
00596 if(align_out_volume == NULL)
00597 {
00598
00599
00600 rtot = rlast + localZ*(itsLength/2);
00601 rlast = rtot + localZ*(itsLength/2);
00602 return;
00603 }
00604 else
00605 {
00606 G4cout << "BDSElement : Aligning outgoing to SQL element "
00607 << align_out_volume->GetName() << G4endl;
00608 G4RotationMatrix Trot = *TargetRot;
00609 G4RotationMatrix trackedRot;
00610 G4RotationMatrix outRot = *(align_out_volume->GetFrameRotation());
00611 trackedRot.transform(outRot.inverse());
00612 trackedRot.transform(Trot.inverse());
00613 globalRotation = trackedRot;
00614
00615 G4ThreeVector outPos = align_out_volume->GetFrameTranslation();
00616 G4ThreeVector diff = outPos;
00617
00618 G4ThreeVector zHalfAngle = G4ThreeVector(0.,0.,1.);
00619
00620 zHalfAngle.transform(globalRotation);
00621
00622
00623 rlast = TargetPos - ((outPos.unit()).transform(Trot.inverse()) )*diff.mag();
00624 localX.transform(outRot.inverse());
00625 localY.transform(outRot.inverse());
00626 localZ.transform(outRot.inverse());
00627
00628 localX.transform(Trot.inverse());
00629 localY.transform(Trot.inverse());
00630 localZ.transform(Trot.inverse());
00631
00632
00633 rlast +=zHalfAngle*(itsLength/2 + diff.z());
00634 return;
00635 }
00636 }
00637
00638 if(align_in_volume != NULL)
00639 {
00640 G4cout << "BDSElement : Aligning incoming to SQL element "
00641 << align_in_volume->GetName() << G4endl;
00642
00643 const G4RotationMatrix* inRot = align_in_volume->GetFrameRotation();
00644 TargetRot->transform((*inRot).inverse());
00645
00646 G4ThreeVector inPos = align_in_volume->GetFrameTranslation();
00647 inPos.transform((*TargetRot).inverse());
00648 TargetPos+=G4ThreeVector(inPos.x(), inPos.y(), 0.0);
00649
00650 if(align_out_volume == NULL)
00651 {
00652
00653
00654 G4RotationMatrix Trot = *TargetRot;
00655 globalRotation.transform(Trot.inverse());
00656
00657 G4ThreeVector zHalfAngle = G4ThreeVector(0.,0.,1.);
00658 zHalfAngle.transform(Trot.inverse());
00659
00660 rlast = TargetPos + zHalfAngle*(itsLength/2);
00661 localX.transform(Trot.inverse());
00662 localY.transform(Trot.inverse());
00663 localZ.transform(Trot.inverse());
00664 return;
00665 }
00666
00667 else
00668 {
00669 G4cout << "BDSElement : Aligning outgoing to SQL element "
00670 << align_out_volume->GetName() << G4endl;
00671 G4RotationMatrix Trot = *TargetRot;
00672 G4RotationMatrix trackedRot;
00673 G4RotationMatrix outRot = *(align_out_volume->GetFrameRotation());
00674 trackedRot.transform(outRot.inverse());
00675 trackedRot.transform(Trot.inverse());
00676 globalRotation = trackedRot;
00677
00678 G4ThreeVector outPos = align_out_volume->GetFrameTranslation();
00679 G4ThreeVector diff = outPos;
00680
00681 G4ThreeVector zHalfAngle = G4ThreeVector(0.,0.,1.);
00682
00683 zHalfAngle.transform(globalRotation);
00684
00685
00686 rlast = TargetPos - ((outPos.unit()).transform(Trot.inverse()) )*diff.mag();
00687 localX.transform(outRot.inverse());
00688 localY.transform(outRot.inverse());
00689 localZ.transform(outRot.inverse());
00690
00691 localX.transform(Trot.inverse());
00692 localY.transform(Trot.inverse());
00693 localZ.transform(Trot.inverse());
00694
00695
00696 rlast +=zHalfAngle*(itsLength/2 + diff.z());
00697 return;
00698 }
00699 }
00700
00701 }
00702
00703 BDSElement::~BDSElement()
00704 {
00705 delete itsVisAttributes;
00706 delete fChordFinder;
00707 delete itsFStepper;
00708 delete itsFEquation;
00709 }