Changeset 418 in PSPA for Interface_Web/trunk/pspaWT/sources/controler/src/softwareParmela.cc
- Timestamp:
- Jun 21, 2013, 10:16:56 AM (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
Interface_Web/trunk/pspaWT/sources/controler/src/softwareParmela.cc
r417 r418 6 6 #include "dataManager.h" 7 7 #include "mixedTools.h" 8 //#include "nomDeLogiciel.h" 8 9 9 softwareParmela::softwareParmela() : abstractSoftware() 10 10 { … … 15 15 { 16 16 nameOfSoftware_ = nomDeLogiciel("parmela"); 17 registerElement(nomdElements::RFgun,TBoolOk); 18 registerElement(nomdElements::drift,TBoolOk); 19 registerElement(nomdElements::cell,TBoolOk); 20 registerElement(nomdElements::bend,TBoolOk); 21 registerElement(nomdElements::soleno,TBoolOk); 22 registerElement(nomdElements::fit,TBoolIgnore); 23 registerElement(nomdElements::snapshot,TBoolIgnore); 17 24 } 18 25 … … 23 30 abstractElement* elPtr = dataManager_->getElementPointerFromNumero(numeroDeb_); 24 31 25 bool there_is_rfgun = ( elPtr->getNomdElement().getElementType() == RFgun );32 bool there_is_rfgun = ( elPtr->getNomdElement().getElementType() == nomdElements::RFgun ); 26 33 unsigned offsetNumElem; 27 34 // les elements de parmela sont indexes de 1 à max, s'il n'y a pas de rfgun … … 40 47 abstractElement* elem = dataManager_->getElementPointerFromNumero(k); 41 48 cout << " liste PARMELA no absolu " << k << " relatif provisoire " << relativeParmelaElementIndices_.at(curseur) << endl; 42 if ( elem->is_accepted_by_software(nameOfSoftware_) == TBoolOk ) { 49 // if ( elem->is_accepted_by_software(nameOfSoftware_) == TBoolOk ) { 50 if ( doAcceptElement(elem->getNomdElement().getElementType() ) == TBoolOk ) { 43 51 relativeParmelaElementIndices_.at(curseur) = id; 44 52 cout << " mis a " << id << endl; … … 67 75 double initalKineticEnergy = 0.0; 68 76 elPtr = dataManager_->getElementPointerFromNumero(numeroDeb_); 69 bool there_is_rfgun = ( elPtr->getNomdElement().getElementType() == RFgun );77 bool there_is_rfgun = ( elPtr->getNomdElement().getElementType() == nomdElements::RFgun ); 70 78 71 79 if ( !there_is_rfgun ) { … … 88 96 unsigned int premier = numeroDeb_ ; 89 97 if ( there_is_rfgun ) { 90 outfile << dataManager_->getElementPointerFromNumero(numeroDeb_)->parmelaOutputFlow(); 98 // outfile << dataManager_->getElementPointerFromNumero(numeroDeb_)->parmelaOutputFlow(); 99 outfile << elementsData(dataManager_->getElementPointerFromNumero(numeroDeb_)->parametersToSoftware()); 91 100 premier++; 92 101 } else { … … 98 107 elPtr = dataManager_->getElementPointerFromNumero(k); 99 108 if (elPtr) { 100 outfile << elPtr->parmelaOutputFlow(); 109 // outfile << elPtr->parmelaOutputFlow(); 110 outfile << elementsData(elPtr->parametersToSoftware()); 101 111 } 102 112 } … … 185 195 unsigned numeroParmel; 186 196 numeroParmel = (unsigned)relativeParmelaElementIndices_.at(curseur); 187 cout << " lecture PARMELA el no absolu " << k << " numero relatif " << numeroParmel << " nom " << elem->getNomdElement().getE lementName() << endl;197 cout << " lecture PARMELA el no absolu " << k << " numero relatif " << numeroParmel << " nom " << elem->getNomdElement().getExpandedName() << endl; 188 198 // lecture sortie parmela 189 199 if(!beamFromParmela(workingDir,numeroParmel,freq,centroid,refPart,particles)) … … 338 348 return true; 339 349 } 350 351 352 string softwareParmela::elementsData(const vector< pair<string, vector<string> > >& donnees) const { 353 unsigned k; 354 cout << " PASSAGE softwareParmela::elementsData " << endl; 355 if ( donnees.at(0).first != "labelsGenericSpecific" ) { 356 cout << " softwareParmela::elementsData ERROR : element badly defined " << endl; 357 return string(); 358 } 359 string genericName = donnees.at(0).second.at(0); 360 if ( genericName == "rfgun" ) return rfgunData(donnees); 361 if ( genericName == "cell" ) return cellData(donnees); 362 if ( genericName == "drift" ) return driftData(donnees); 363 if ( genericName == "solnd" ) return solenoData(donnees); 364 if ( genericName == "bend" ) return bendData(donnees); 365 return string(); 366 } 367 368 string softwareParmela::rfgunData(const vector< pair<string, vector<string> > >& donnees) const { 369 370 cout << " PASSAGE softwareParmela::rfgunData " << endl; 371 string nmacrop = "0"; 372 string sigma_t = "0.0"; 373 string sigma_r = "0.0"; 374 string E_cin = "0.0"; 375 string sigma_E = "0.0"; 376 string phaseStep = "0.0"; 377 string totalCharge = "0.0"; 378 379 unsigned k; 380 for ( k=1; k < donnees.size(); k++) { 381 if ( donnees.at(k).first == "nbMacroparticles" ) { 382 nmacrop = donnees.at(k).second.at(0); 383 } else if ( donnees.at(k).first == "sigmasTR" ) { 384 sigma_t = donnees.at(k).second.at(0); 385 sigma_r = donnees.at(k).second.at(1); 386 } else if ( donnees.at(k).first == "kineticE" ) { 387 E_cin = donnees.at(k).second.at(0); 388 sigma_E = donnees.at(k).second.at(1); 389 } else if ( donnees.at(k).first == "phaseStep" ) { 390 phaseStep = donnees.at(k).second.at(0); 391 } else if ( donnees.at(k).first == "totalCharge" ) { 392 totalCharge = donnees.at(k).second.at(0); 393 } 394 } 395 ostringstream sortie; 396 // on prend les troncatures tmax et rmax à 3 sigmas 397 sortie << "INPUT 10 /np=" << nmacrop << " /sigt=" << sigma_t << endl; 398 sortie << " /tmax=" << 3.3*atof(sigma_t.c_str()) << " /sigr=" << sigma_r << endl; 399 sortie << " /rmax=" << 3.0*atof(sigma_r.c_str()) << " /W0=" << E_cin << " /dw0=" << sigma_E << endl; 400 sortie << " /dwt=" << phaseStep << " /ran=2" << endl; 401 402 // on doit entrer le nb vrai de part. (avec signe moins) 403 sortie << "SCHEFF /beami=" << -fabs( atof(totalCharge.c_str()) )/ELECTRONANOCOULOMB << " /nprog=2 /point=-1.7" << endl; 404 405 return sortie.str(); 406 } 407 408 string softwareParmela::cellData(const vector< pair<string, vector<string> > >& donnees) const { 409 cout << " PASSAGE softwareParmela::cellData " << endl; 410 411 string lenght = "0.0"; 412 string aperture = "0.0"; 413 string initialPhase = "0.0"; 414 string acceleratingField = "0.0"; 415 string phaseStepMax = "0.0"; 416 string acceleratingShapeFile = ""; 417 string focusingMagFile = ""; 418 string offsetMag = "0.0"; 419 string scaleFactor = "0.0"; 420 421 unsigned k; 422 for ( k=1; k < donnees.size(); k++) { 423 if ( donnees.at(k).first == "lenghtAperture" ) { 424 lenght = donnees.at(k).second.at(0); 425 aperture = donnees.at(k).second.at(1); 426 } else if ( donnees.at(k).first == "phaseInitialStepmax" ) { 427 initialPhase = donnees.at(k).second.at(0); 428 phaseStepMax = donnees.at(k).second.at(1); 429 } else if ( donnees.at(k).first == "fieldValueFile" ) { 430 acceleratingField = donnees.at(k).second.at(0); 431 acceleratingShapeFile = donnees.at(k).second.at(1); 432 } else if ( donnees.at(k).first == "MagFocusingFileOffsetScale") { 433 focusingMagFile = donnees.at(k).second.at(0); 434 offsetMag = donnees.at(k).second.at(1); 435 scaleFactor = donnees.at(k).second.at(2); 436 } 437 } 438 ostringstream sortie; 439 sortie << "CELL /l=" << lenght << " /aper=" << aperture << endl; 440 sortie << " /iout=1 /phi0=" << initialPhase << " /E0=" << acceleratingField << endl; 441 sortie << " /nc=1 /dwtmax=" << phaseStepMax << " /sym=-1" << endl; 442 sortie << "CFIELD 1" << endl; 443 sortie << acceleratingShapeFile << endl; 444 if ( focusingMagFile != "") { 445 sortie << "POISSON /zoff=" << offsetMag << " /rmult=" << scaleFactor << endl; 446 sortie << focusingMagFile << endl; 447 } 448 return sortie.str(); 449 450 } 451 452 string softwareParmela::driftData(const vector< pair<string, vector<string> > >& donnees) const { 453 cout << " PASSAGE softwareParmela::driftData " << endl; 454 455 string lenght = "0.0"; 456 string aperture = "0.0"; 457 458 unsigned k; 459 for ( k=1; k < donnees.size(); k++) { 460 if ( donnees.at(k).first == "lenghtAperture" ) { 461 lenght = donnees.at(k).second.at(0); 462 aperture = donnees.at(k).second.at(1); 463 } 464 } 465 ostringstream sortie; 466 sortie << "DRIFT /l=" << lenght << " /aper=" << aperture << " /iout=1" << endl; 467 return sortie.str(); 468 } 469 470 string softwareParmela::solenoData(const vector< pair<string, vector<string> > >& donnees) const { 471 cout << " PASSAGE softwareParmela::solenoData " << endl; 472 string lenght = "0.0"; 473 string aperture = "0.0"; 474 string B0 = "0.0"; 475 476 unsigned k; 477 for ( k=1; k < donnees.size(); k++) { 478 if ( donnees.at(k).first == "lenghtAperture" ) { 479 lenght = donnees.at(k).second.at(0); 480 aperture = donnees.at(k).second.at(1); 481 } else if ( donnees.at(k).first == "field" ) { 482 B0 = donnees.at(k).second.at(0); 483 } 484 } 485 ostringstream sortie; 486 // on passe l'induction magnetique en Gauss 487 sortie << "SOLENOID /l=" << lenght << " /aper=" << aperture << " /iout=1 /h=" << 1000.*atof(B0.c_str()) << endl; 488 return sortie.str(); 489 490 } 491 492 string softwareParmela::bendData(const vector< pair<string, vector<string> > >& donnees) const { 493 cout << " PASSAGE softwareParmela::bendData " << endl; 494 495 string lenght = "0.0"; 496 string aperture = "0.0"; 497 string angleDeg = "0.0"; 498 string momentum = "0.0"; 499 string beta1 = "0.0"; 500 string beta2 = "0.0"; 501 unsigned k; 502 for ( k=1; k < donnees.size(); k++) { 503 if ( donnees.at(k).first == "lenghtAperture" ) { 504 lenght = donnees.at(k).second.at(0); 505 aperture = donnees.at(k).second.at(1); 506 } else if ( donnees.at(k).first == "angleDegre" ) { 507 angleDeg = donnees.at(k).second.at(0); 508 } else if ( donnees.at(k).first == "momentum" ) { 509 momentum = donnees.at(k).second.at(0); 510 } else if ( donnees.at(k).first == "rotatedFaces" ) { 511 beta1 = donnees.at(k).second.at(0); 512 beta2 = donnees.at(k).second.at(1); 513 } 514 } 515 516 double ecin = atof(momentum.c_str())/EREST_MeV; 517 ecin = ecin*ecin + 1.; 518 ecin = EREST_MeV*(sqrt(ecin) - 1.0); 519 520 ostringstream sortie; 521 // il faut entrer l'energie cinetique 522 sortie << "BEND /l=" << lenght << " / aper=" << aperture << " / iout=1 / wr=" << ecin << " /alpha=" << angleDeg << " / beta1=" << beta1; 523 sortie << " / beta2=" << beta2 << endl; 524 525 return sortie.str(); 526 527 }
Note: See TracChangeset
for help on using the changeset viewer.