Ignore:
Timestamp:
Jun 21, 2013, 10:16:56 AM (11 years ago)
Author:
lemeur
Message:

definition des compatibilites des elements dans les software

File:
1 edited

Legend:

Unmodified
Added
Removed
  • Interface_Web/trunk/pspaWT/sources/controler/src/softwareParmela.cc

    r417 r418  
    66#include "dataManager.h"
    77#include "mixedTools.h"
    8 //#include "nomDeLogiciel.h"
     8
    99softwareParmela::softwareParmela() : abstractSoftware()
    1010{
     
    1515{
    1616  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);
    1724}
    1825
     
    2330  abstractElement* elPtr = dataManager_->getElementPointerFromNumero(numeroDeb_);
    2431
    25   bool there_is_rfgun = ( elPtr->getNomdElement().getElementType() == RFgun );
     32  bool there_is_rfgun = ( elPtr->getNomdElement().getElementType() == nomdElements::RFgun );
    2633  unsigned offsetNumElem;
    2734  // les elements de parmela sont indexes de 1 à max, s'il n'y a pas de rfgun
     
    4047    abstractElement* elem = dataManager_->getElementPointerFromNumero(k);
    4148    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 ) {
    4351      relativeParmelaElementIndices_.at(curseur) = id;
    4452      cout << " mis a " << id << endl;
     
    6775  double initalKineticEnergy = 0.0;
    6876  elPtr = dataManager_->getElementPointerFromNumero(numeroDeb_);
    69   bool there_is_rfgun = ( elPtr->getNomdElement().getElementType() == RFgun );
     77  bool there_is_rfgun = ( elPtr->getNomdElement().getElementType() == nomdElements::RFgun );
    7078 
    7179  if ( !there_is_rfgun ) {
     
    8896  unsigned int premier = numeroDeb_ ;
    8997  if ( there_is_rfgun ) {
    90     outfile << dataManager_->getElementPointerFromNumero(numeroDeb_)->parmelaOutputFlow();
     98    //    outfile << dataManager_->getElementPointerFromNumero(numeroDeb_)->parmelaOutputFlow();
     99    outfile << elementsData(dataManager_->getElementPointerFromNumero(numeroDeb_)->parametersToSoftware());
    91100    premier++;
    92101  } else {
     
    98107      elPtr = dataManager_->getElementPointerFromNumero(k);
    99108      if (elPtr) {
    100         outfile << elPtr->parmelaOutputFlow();
     109        //      outfile << elPtr->parmelaOutputFlow();
     110        outfile << elementsData(elPtr->parametersToSoftware());
    101111      }
    102112    }
     
    185195          unsigned numeroParmel;
    186196          numeroParmel = (unsigned)relativeParmelaElementIndices_.at(curseur);
    187           cout << " lecture PARMELA el no absolu " << k << " numero relatif " << numeroParmel << " nom " << elem->getNomdElement().getElementName() << endl;
     197          cout << " lecture PARMELA el no absolu " << k << " numero relatif " << numeroParmel << " nom " << elem->getNomdElement().getExpandedName() << endl;
    188198        // lecture sortie parmela
    189199        if(!beamFromParmela(workingDir,numeroParmel,freq,centroid,refPart,particles))
     
    338348    return true;
    339349}
     350
     351
     352string 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
     368string 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
     408string 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
     452string 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
     470string 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
     492string 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.