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

Last change on this file since 455 was 455, checked in by garnier, 11 years ago

grosse modification pour intégrer les sections

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