source: PSPA/Interface_Web/trunk/pspaWT/sources/controler/src/softwareTransport.cc @ 418

Last change on this file since 418 was 418, checked in by lemeur, 11 years ago

definition des compatibilites des elements dans les software

File size: 14.3 KB
RevLine 
[295]1#include "softwareTransport.h"
2#include "abstractElement.h"
3#include "beam2Moments.h"
[305]4#include "dataManager.h"
[295]5
[297]6#include <algorithm>
[295]7
8softwareTransport::softwareTransport() : abstractSoftware()
[386]9{
10  nameOfSoftware_ = nomDeLogiciel("transport");
11}
[295]12
[316]13softwareTransport::softwareTransport(string inputFileName,globalParameters* globals, dataManager* dt) : abstractSoftware(inputFileName, globals, dt)
[386]14{
15  nameOfSoftware_ = nomDeLogiciel("transport");
[418]16  registerElement(nomdElements::beam,TBoolOk);
17  registerElement(nomdElements::drift,TBoolOk);
18  registerElement(nomdElements::bend,TBoolOk);
19  registerElement(nomdElements::soleno,TBoolOk);
20  registerElement(nomdElements::fit,TBoolOk);
21  registerElement(nomdElements::snapshot,TBoolIgnore);
[386]22}
[295]23
[316]24bool softwareTransport::createInputFile(particleBeam* beamBefore, unsigned int numeroDeb, unsigned int numeroFin, string workingDir)
[353]25{ 
26
[413]27
28
[386]29  if ( !initComputationLimits(numeroDeb,numeroFin) ) return false;
30
[295]31  abstractElement* premierEl = NULL;
[386]32  premierEl = dataManager_->getElementPointerFromNumero(numeroDeb_);
[295]33
34  // ceinture et bretelles
35  if ( premierEl == NULL ) {
36    cerr << " premier element inexistant ?? " << endl;
37    return false;
38  }
39
[353]40  string name = workingDir + inputFileName_;
[295]41  ofstream outfile;
42  outfile.open(name.c_str(), ios::out);
[353]43  if (!outfile) {
[313]44    dataManager_->consoleMessage(" softwareTransport::createInputFile : error opening output stream " );
[353]45    cerr << " error opening output stream " << name << endl;
46    return false;
47  }
[295]48
49  outfile << string("'titre provisoire'") << endl;
50  outfile << " 0 " << endl;
51  outfile << " UTRANS " << endl;
52
53
[413]54  //  cout << "debug:: c'est quoi le premier element? " << premierEl->getNomdElement().getElementName() << endl;
[353]55
[295]56  // si le premier element a traiter est un 'beam', on ne fait rien pour l'instant
57  // il sera traite plus bas de maniere standard
58
59  // Dans le cas où le premier element n'est pas beam
[418]60  if ( premierEl->getNomdElement().getElementType() != nomdElements::beam ) {
[295]61    // s'il n'y a pas faisceau courant, erreur
62    if ( beamBefore == NULL ) {
[413]63      dataManager_->consoleMessage(" softwareTransport::createInputFile : no input beam, input file not created");
[295]64      cout << " pas de faisceau " << endl;
65      return false;
[353]66    } else {
[295]67      // s'il y a un faisceau courant
68      if ( !beamBefore->momentRepresentationOk() ) {
69        // s'il n'est pas au format transport (issu de parmela ?)
70        // on le met au format transport, s'il est deja au format 'particules' (par ex/ parmela)
71        if ( !beamBefore->particleRepresentationOk() ) {
[353]72          dataManager_->consoleMessage(" softwareParmela::createInputFile : ca cafouille dans les representations de faisceau : ni particules, ni moments ? " );
[295]73          cout << " ca cafouille dans les representations de faisceau : ni particules, ni moments ? " << endl;
74          return false;
[353]75        } else {
[295]76          beamBefore->buildMomentRepresentation();
77        }
78      }
79      // ici, en principe, on a un faisceau correct
80      // on ecrit sur le fichier input
81      const beam2Moments& moments = beamBefore->getTransportMoments();
82      double P0 = beamBefore->getP0Transport();
83      outfile << moments.writeToTransportInput(P0);
84    }
85  }
86
87  outfile << " PRINT, BEAM, ON; " << endl;
88
89  abstractElement* elPtr;
[386]90  for (unsigned k = numeroDeb_; k <= numeroFin_; k++)
[295]91    {
[312]92      elPtr = dataManager_->getElementPointerFromNumero(k);
[418]93      cout << "debug:: element [" << k << "] " << elPtr->getNomdElement().getExpandedName() << endl;
94      //      outfile << elPtr->transportOutputFlow();
95      outfile << elementsData(elPtr->parametersToSoftware());
[295]96    }
97
98  outfile << " SENTINEL " << endl;
99  outfile << " SENTINEL " << endl;
100
101  outfile.close();
[313]102  dataManager_->consoleMessage("fichier input termine pour TRANSPORT");
[295]103  return true;
104}
105
[386]106bool softwareTransport::execute(string workingDir)
[295]107{
[353]108  bool ExecuteStatus = true;
109
[295]110  ostringstream sortie;
[386]111  sortie << " EXECUTION DE TRANSPORT DE " << numeroDeb_ << " a " << numeroFin_ << endl;
[353]112 
[295]113  string transportJob = workingDir + "transport";
114  transportJob += string(" <  ");
[316]115  transportJob += workingDir + inputFileName_;
[295]116  cout << " job transport= " << transportJob << endl;
[353]117 
[295]118  string resultOfRun;
[353]119  bool success = launchJob(transportJob,resultOfRun);
[295]120  sortie << resultOfRun << endl;
[353]121  if ( !success ) {
[295]122    sortie << " launching of transport failed " << endl;
123    ExecuteStatus = false;
[353]124  } else {
[295]125    cout << " execution transport MARCHE " << endl;
[353]126    string nameOut = workingDir + "transport.output";
127    ofstream outfile;
[295]128    outfile.open(nameOut.c_str(), ios::out);
[353]129    if (!outfile) {
130      sortie << " error first opening transport output stream " << nameOut << endl;
131      ExecuteStatus = false;
132    } else {
[295]133      // on copie la sortie dans un fichier 'transport.out'
134      outfile << resultOfRun << endl;
135      outfile.close();
136    }
137  }
[353]138
139  dataManager_->consoleMessage(sortie.str());
[295]140  return ExecuteStatus;
141}
142
[386]143bool softwareTransport::buildBeamAfterElements(string workingDir) 
[353]144{
[295]145
146  bool result = true;
[386]147  if ( !ComputationLimitsOk() ) return false;
148
149  for (unsigned k = numeroDeb_; k <= numeroFin_; k++)
[353]150    {
151      abstractElement* ptr = dataManager_->getElementPointerFromNumero(k);
152      if ( ptr == NULL ) {
153        dataManager_->consoleMessage(" softwareTransport::buildBeamAfterElements : null pointer on element " );
154        cout << " softwareTransport::buildBeamAfterElements : null pointer on element " << endl;
[386]155        return false;         
[353]156      }
[295]157
[386]158
[418]159      // if ( ptr->is_accepted_by_software(nameOfSoftware_) != TBoolOk ) {
160      if ( doAcceptElement(ptr->getNomdElement().getElementType())  != TBoolOk ) {
161
[386]162        // si l'element doit etre ignore, on renvoie sur le diag precedent
163        dataManager_->updateCurrentDiagnostic(false);
[387]164      // // si l'element est un snapshot, recuperer la sortie precedente
165      //        if(ptr->getNomdElement().getElementType() == snapshot) {
166      //          string* param = ptr->getParametersString();
167      //          string cliche = workingDir + param[2].c_str();
168      //          cout<<"["<<k<<"] : ecrit sur fichier " << cliche << " le contenu de beam[ ]"<<endl;
169      //        }
[386]170      } else {
171        // si le numero est reconnu de transport
172
173
174
175        string elemLabel = ptr->getLabel();
176        beam2Moments transpMoments;
177        // lecture sortie transport
178        if (!moments2FromTransport(workingDir,elemLabel,ptr->getNomdElement(),transpMoments) )
179          {
180            // si echec, on renvoie sur le diag precedent
181            dataManager_->updateCurrentDiagnostic(false);
182
183            dataManager_->consoleMessage(" softwareTransport::buildBeamAfterElements : element skipped in reading moments from transport output :  " + elemLabel);
184            //   cout << " softwareTransport::buildBeamAfterElements plantage dans lecture moments " << endl;
185            return true;
186          } else {
187          // si succes,
188        // on initialise une nouvelle sortie diagnostic
189          particleBeam* newDiag = dataManager_->updateCurrentDiagnostic(true);
190        // et on la complete
191          newDiag->set2Moments(transpMoments);
192        }
[353]193      }
194    }
195  return result;
[295]196}
[353]197bool softwareTransport::moments2FromTransport(string workingDir,string elLab,const nomdElements elem,beam2Moments& moments) const 
198{
[295]199  string elementLabel = elLab;
200  // transformer le label en majuscules ; je ne suis pas sur que ca
201  // marchera a tous les coups (glm)
[353]202  std::transform(elementLabel.begin(),elementLabel.end(),elementLabel.begin(),(int (*)(int))std::toupper);
[295]203
[353]204  cout << "softwareTransport::moments2FromTransport on cherche element " << elementLabel << endl;
205 
206  string nameIn = workingDir + "transport.output";
[295]207  ifstream infile;
208  infile.open(nameIn.c_str(), ios::in);
209  if (!infile) {
[313]210    dataManager_->consoleMessage(" softwareTransport::moments2FromTransport : error re-opening transport output stream ");
[295]211    cerr << " dataManager::moments2FromTransport : error re-opening transport output stream " << nameIn << endl;
212    return false;
213  }
214
215  string::size_type nn = string::npos;
216  string  fichier;
217  string buf;
218  unsigned compteur = 0;
219  while ( getline(infile, buf) ) {
[353]220    fichier += buf+"\n";
[295]221    nn = buf.find(elementLabel);
222    if ( nn != string::npos ) {
223      compteur++;
224    }
225  }
226  infile.close();
[353]227
[295]228  cout << " compteur= " << compteur << endl;
229  if ( compteur == 0 ) {
[313]230    dataManager_->consoleMessage(" softwareTransport::moments2FromTransport : element"+elementLabel+"not found in the file "+nameIn);
[295]231    cerr << " dataManager::moments2FromTransport : element " << elementLabel << " non trouve dans le fichier  " << nameIn << endl;
232    return false;
233  }
234
235  stringstream fichierStream(fichier);
236  buf.clear();
237  unsigned relu = 0;
238  while ( std::getline(fichierStream, buf) ) {
239    //    cout << " relecture buffer : " << buf << endl;
240    nn = buf.find(elementLabel);
241    if ( nn != string::npos ) {
242      relu++;
243      if ( relu == compteur ) {
244        cout << " TROUVE !" << endl;
245        break;
246      }
247    }
248  }
[353]249
[386]250  return moments.readFromTransportOutput(fichierStream);
[295]251}
[418]252
253string softwareTransport::elementsData(const vector< pair<string, vector<string> > >& donnees) const {
254  unsigned k;
255  cout << " PASSAGE softwareTransport::elementsData " << endl;
256  if ( donnees.at(0).first != "labelsGenericSpecific" ) {
257    cout << " softwareTransport::elementsData ERROR : element badly defined " << endl;
258    return string();
259  }
260  string genericName = donnees.at(0).second.at(0);
261  if ( genericName == "beam" ) return beamData(donnees);
262  if ( genericName == "drift" ) return driftData(donnees);
263  if ( genericName == "solnd" ) return solenoData(donnees);
264  if ( genericName == "bend" ) return bendData(donnees);
265  if ( genericName == "fit" ) return fitData(donnees);
266  return string();
267}
268
269string softwareTransport::beamData(const vector< pair<string, vector<string> > >& donnees) const {
270
271  cout << " PASSAGE softwareTransport::beamData " << endl;
272  double x = 0.0;
273  double xp = 0.0;
274  double y = 0.0;
275  double yp = 0.0;
276  double dl = 0.0;
277  double del = 0.0;
278  double p0 = 0.0;
279  string specificName = "";
280
281  unsigned k;
282  for ( k=0; k < donnees.size(); k++) {
283    if ( donnees.at(k).first == "transverseCoordinates" ) { 
284      x = atof( donnees.at(k).second.at(0).c_str() );
285      xp = atof( donnees.at(k).second.at(1).c_str() );
286      y = atof( donnees.at(k).second.at(2).c_str() );
287      yp = atof( donnees.at(k).second.at(3).c_str() );
288    } else if ( donnees.at(k).first == "longitudinalCoordinates" ) {
289      dl = atof( donnees.at(k).second.at(0).c_str() );
290      del = atof( donnees.at(k).second.at(1).c_str() );
291    } else if ( donnees.at(k).first == "momentum" ) {
292      p0 = atof( donnees.at(k).second.at(0).c_str() );
293    } else if ( donnees.at(k).first == "labelsGenericSpecific" ) {
294      specificName = donnees.at(k).second.at(1);
295    }
296  }
297  ostringstream sortie;
298    beam2Moments moments(x, xp, y, yp, dl, del);
299    sortie << specificName << ":" << moments.writeToTransportInput(p0) << endl;
300    return sortie.str(); 
301  return sortie.str();
302}
303
304string softwareTransport::driftData(const vector< pair<string, vector<string> > >& donnees) const {
305  cout << " PASSAGE softwareTransport::driftData " << endl;
306
307  string lenght = "0.0";
308  string specificName = "";
309
310  unsigned k;
311  for ( k=0; k < donnees.size(); k++) {
312    if ( donnees.at(k).first == "lenghtAperture" ) { 
313      lenght = donnees.at(k).second.at(0);
314    } else if ( donnees.at(k).first == "labelsGenericSpecific" ) {
315      specificName = donnees.at(k).second.at(1);
316    }
317  }
318  ostringstream sortie;
319    // longueur en m
320  sortie << specificName << ":" << "  DRIFT, L=" << 0.01*atof(lenght.c_str()) << ";" << endl;
321  return sortie.str();
322}
323
324
325string softwareTransport::solenoData(const vector< pair<string, vector<string> > >& donnees) const {
326  cout << " softwareTransport::solenoData " << endl;
327  string lenght = "0.0";
328  string B0 = "0.0";
329  string varyB0 = "0";
330  string specificName = "";
331
332
333  unsigned k;
334  for ( k=0; k < donnees.size(); k++) {
335    if ( donnees.at(k).first == "lenghtAperture" ) { 
336      lenght = donnees.at(k).second.at(0);
337    } else if ( donnees.at(k).first == "field" ) {
338      B0 = donnees.at(k).second.at(0);
339    } else if ( donnees.at(k).first == "isBvariable" ) {
340      varyB0 = donnees.at(k).second.at(0);
341    } else if ( donnees.at(k).first == "labelsGenericSpecific" ) {
342      specificName = donnees.at(k).second.at(1);
343    }
344  }
345    ostringstream sortie;
346    // on passe la longueur en metres
347    sortie << specificName << ":" << "  SOLENOID, L=" << 0.01*atof (lenght.c_str()) << ", B=" << B0 << ";" << endl;
348    if ( atoi(varyB0.c_str()) ) {
349      sortie <<  "  VARY, " << specificName+"[B]"  << ";" << endl;
350    }
351    return sortie.str();
352
353}
354
355
356string softwareTransport::bendData(const vector< pair<string, vector<string> > >& donnees) const {
357
358  cout << " softwareTransport::bendData " << endl;
359
360  string lenght = "0.0";
361  string radius = "0.0";
362  string angleDeg = "0.0";
363  string beta1 = "0.0";
364  string beta2 = "0.0";
365
366
367
368  string specificName = "";
369
370  unsigned k;
371  for ( k=0; k < donnees.size(); k++) {
372    if ( donnees.at(k).first == "lenghtAperture" ) { 
373      lenght = donnees.at(k).second.at(0);
374    } else if ( donnees.at(k).first == "angleDegre" ) {
375      angleDeg = donnees.at(k).second.at(0);
376    } else if ( donnees.at(k).first == "radius" ) {
377      radius = donnees.at(k).second.at(0);
378     } else if ( donnees.at(k).first == "rotatedFaces" ) {
379      beta1 = donnees.at(k).second.at(0);
380      beta2 = donnees.at(k).second.at(1);
381    } else if ( donnees.at(k).first == "labelsGenericSpecific" ) {
382      specificName = donnees.at(k).second.at(1);
383    }   
384  }
385
386    ostringstream sortie;
387    sortie << specificName << ":" << "  SBEND, RADIUS=" << radius << ", ANGLE=" << angleDeg << ", E1=" << beta1 << ", E2=" << beta2 << ";" << endl;
388    return sortie.str();
389
390}
391
392
393string softwareTransport::fitData(const vector< pair<string, vector<string> > >& donnees) const {
394  cout << " softwareTransport::fitData " << endl;
395  string variableName = "";
396  string variableValue = "0.0";
397  string tolerance = "0.0";
398  string specificName = "";
399
400  unsigned k;
401  for ( k=0; k < donnees.size(); k++) {
402    if ( donnees.at(k).first == "variable") { 
403      variableName = donnees.at(k).second.at(0);
404      variableValue = donnees.at(k).second.at(1);
405      tolerance = donnees.at(k).second.at(2);
406    } else if ( donnees.at(k).first == "labelsGenericSpecific" ) {
407      specificName = donnees.at(k).second.at(1);
408    }   
409  }
410    ostringstream sortie;
411    sortie << specificName << ":" << "  FIT," << variableName << " = " << variableValue << ", TOLER = " << tolerance << " ;" << endl;
412    if ( variableName == "R11" || variableName == "R22" || variableName == "R12" || variableName == "R21" ) {
413        sortie << " PRINT, TRANS;" << endl;
414    }
415    return sortie.str();
416}
Note: See TracBrowser for help on using the repository browser.