Ignore:
Timestamp:
Feb 26, 2013, 2:35:45 PM (11 years ago)
Author:
touze
Message:

nvx element snapshot

File:
1 edited

Legend:

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

    r333 r342  
    88
    99softwareParmela::softwareParmela() : abstractSoftware()
    10 {
    11   ;
    12 }
     10{;}
    1311
    1412softwareParmela::softwareParmela(string inputFileName, globalParameters* globals, dataManager* dt) : abstractSoftware(inputFileName, globals, dt)
    15 {
    16   ;
    17 }
     13{;}
    1814
    1915bool softwareParmela::createInputFile( particleBeam* beamBefore, unsigned int numeroDeb, unsigned int numeroFin, string workingDir)
     
    2622    return false;
    2723  }
    28 
    2924
    3025  ofstream outfile;
     
    5449  }
    5550
    56 
     51 
    5752  outfile << "TITLE" << endl;
    5853  outfile << " titre provisoire " << endl;
     
    6661    outfile << "INPUT 0 /NP=" << beamBefore->getNbParticles() << endl;
    6762  }
     63
     64 
    6865  for ( k = premier; k <= numeroFin; k++)
    6966    {
    7067      elPtr = dataManager_->getElementPointerFromNumero(k);
     68      if(elPtr->getNomdElement().getElementType() == snapshot) continue;
    7169      outfile << elPtr->parmelaOutputFlow() << endl;
    7270    }
    73 
     71 
    7472  outfile << "ZOUT" << endl;
    7573  outfile << "START /wt=0.0 /dwt=" << globParamPtr_->getIntegrationStep() << "  /nsteps=" << globParamPtr_->getNbSteps() << "  nsc=" << globParamPtr_->getScPeriod() << "  /nout=10" << endl;
     
    8179
    8280
    83 bool  softwareParmela::execute(unsigned int numeroDeb,unsigned int numeroFin,string workingDir)
    84 {
     81bool softwareParmela::execute(unsigned int numeroDeb,unsigned int numeroFin,string workingDir)
     82{
     83  bool ExecuteStatus = true;
     84 
    8585  ostringstream sortie;
    86   bool ExecuteStatus = true;
    87   //  resul.clear();
    8886  sortie << " EXECUTION DE PARMELA DE l'ELEMENT " << numeroDeb << " A L'ELEMENT " << numeroFin << endl;
    8987
    90   char buf[132];
    9188  string parmelaJob = workingDir + "parmela";
    9289  parmelaJob += string("   ");
    9390  parmelaJob += workingDir;
    94   //  cout << " job parmela= " << parmelaJob << endl;
    95 
     91 
    9692  string resultOfRun;
    97   bool success = launchJob(parmelaJob, resultOfRun);
     93  bool success = launchJob(parmelaJob,resultOfRun);
    9894  sortie << resultOfRun << endl;
    99   if ( !success) {
     95  if ( !success ) {
    10096    sortie << " launching of parmela failed " << endl;
    10197    ExecuteStatus = false;
    102   }
    103   else {
     98  } else {
    10499    sortie << " successful launching of parmela " << endl;
    105100    cout << " execution parmela MARCHE " << endl;
     
    112107  }
    113108
    114   //  resul =  sortie.str();
    115     dataManager_->consoleMessage(sortie.str());
    116  
     109  dataManager_->consoleMessage(sortie.str());
    117110  return ExecuteStatus;
    118111}
    119112
    120 
    121 bool  softwareParmela::buildBeamAfterElements(unsigned int numeroDeb,unsigned int numeroFin, vector<particleBeam>& beams, string workingDir) {
     113bool softwareParmela::buildBeamAfterElements(unsigned int numeroDeb,unsigned int numeroFin, vector<particleBeam>& beams, string workingDir)
     114{
    122115  bool result = true;
    123   unsigned k;
    124 
    125   for ( k= numeroDeb; k <= numeroFin; k++)
    126     {
     116  cout << "debug:: debut " << numeroDeb << ", fin " << numeroFin << endl;
     117
     118  // index du premier element de parmela
     119  int id= numeroDeb-offsetNumElem_;
     120
     121  for(unsigned k = numeroDeb; k <= numeroFin; k++)
     122    {
     123      abstractElement* elem = dataManager_->getElementPointerFromNumero(k);
     124
     125      // si l'element est un snapshot, recuperer la sortie precedente
     126      if(elem->getNomdElement().getElementType() == snapshot) {
     127        int avantDernier = beams.size() - 1;
     128        cout<<"["<<k<<"] : ecrit sur fichier le contenu de beam["<<avantDernier<<"]"<<endl;
     129        continue;
     130      }
     131
     132      // sinon c'est un element de parmela d'index id
    127133      beams.push_back(particleBeam());
    128134      vector<double> centroid;
    129135      bareParticle refPart;
    130136      vector<bareParticle> particles;
    131       if (!beamFromParmela(workingDir,k - offsetNumElem_ , globParamPtr_->getFrequency(), centroid, refPart,particles ))
     137      double freq= globParamPtr_->getFrequency();
     138
     139      if(!beamFromParmela(workingDir,id,freq,centroid,refPart,particles))
    132140        {
    133           abstractElement* elem = dataManager_->getElementPointerFromNumero(k);
    134           if ( elem->is_accepted_by_software(nomDeLogiciel::parmela) == warning) {
     141          if(elem->is_accepted_by_software(nomDeLogiciel::parmela) == warning) {
    135142            int avantDernier = beams.size() -2;
    136143            beams.back() = beams.at(avantDernier);
    137144          } else {
    138             // sortie << " reading parmdesz  failed " << endl;
    139             dataManager_->consoleMessage(" softwareParmela::buildBeamAfterElements : reading parmdesz  failed " );
     145            dataManager_->consoleMessage("softwareParmela::buildBeamAfterElements : reading parmdesz failed");
    140146            result = false;
    141147            break;
    142148          }
    143         }
    144       else {
    145         beams.back().setWithParticles(centroid, refPart,particles);
    146       }
     149        } else {
     150        beams.back().setWithParticles(centroid,refPart,particles);
     151      }
     152
     153      // l'element de parmela suivant
     154      id++;
    147155    }
     156
    148157  return result;
    149158}
    150159
    151 
    152 
    153 
    154 bool softwareParmela::beamFromParmela(string workingDir,unsigned numeroParmel, double referencefrequency, vector<double>& centroid, bareParticle& refPart,vector<bareParticle>& particles ) {
    155   unsigned  k;
    156   FILE* filefais;
     160bool softwareParmela::beamFromParmela(string workingDir,unsigned numeroParmel, double referencefrequency, vector<double>& centroid, bareParticle& refPart,vector<bareParticle>& particles )
     161{
    157162  string nomfilefais = workingDir + "parmdesz";
    158163  cout << " nom fichier desz : " << nomfilefais << endl;
    159   filefais = fopen(nomfilefais.c_str(), "r");
     164  FILE *filefais = fopen(nomfilefais.c_str(), "r");
    160165
    161166  if ( filefais == (FILE*)0 ) {
    162167    dataManager_->consoleMessage(" beamFromParmela() erreur a l'ouverture du fichier 'parmdesz'");
    163     cerr << " beamFromParmela() erreur a l'ouverture du fichier" << nomfilefais  << endl;;
    164     return false;
    165   }
    166   else cout << " beamFromParmela() : ouverture du fichier " << nomfilefais << endl;
    167 
     168    cerr << " beamFromParmela() erreur a l'ouverture du fichier" << nomfilefais  << endl;
     169    return false;
     170  } else
     171    cout << " beamFromParmela() : ouverture du fichier " << nomfilefais << endl;
     172 
    168173  parmelaParticle partic;
    169174  std::vector<parmelaParticle> faisceau;
    170 
    171   //  unsigned indexElement = numeroElement-1;
    172  
    173 
    174 
    175 
    176175  int testNombrePartRef =0;
    177176  double phaseRef = 0.0;
    178177
    179   while( partic.readFromParmelaFile(filefais) > 0 ) {
    180     if ( partic.ne == (int)numeroParmel )
    181       {
     178  while( partic.readFromParmelaFile(filefais) > 0 )
     179    {
     180
     181      if ( partic.ne == (int)numeroParmel ) {
    182182        faisceau.push_back(partic);
    183 
    184183        if ( partic.np == 1 ) {
    185184          // en principe on est sur la particule de reference
     
    200199        }
    201200      }
    202   }
     201    } //while
    203202
    204203  if ( faisceau.size() == 0)
     
    213212  // avec freq en Mhz et dphi en degres et résultat en cm:
    214213  double FACTEUR =  83.3333;  // ameliorer la precision
    215 
    216 
    217214
    218215  // pour l'instant on choisit un centroid nul;
     
    232229  // contrairement a ce qu'indique la notice PARMELA, dans parmdesz, les xp et yp
    233230  // sont donnes en radians
    234   for ( k=0; k < faisceau.size(); k++) {
    235     x=faisceau.at(k).xx;
     231  for (unsigned k = 0; k < faisceau.size(); k++) {
     232    x= faisceau.at(k).xx;
    236233    xp=faisceau.at(k).xxp;
    237     y=faisceau.at(k).yy;
     234    y= faisceau.at(k).yy;
    238235    yp=faisceau.at(k).yyp;
    239 
    240236    // dephasage par rapport a la reference 
    241237    dephas = faisceau.at(k).phi - phaseRef; // degrés
     
    250246    particles.at(k) = bareParticle(pos,betagamma);
    251247  }
     248 
    252249  return true;
    253250}
Note: See TracChangeset for help on using the changeset viewer.