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
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,globalParameters* globals, dataManager* dt) : abstractSoftware(inputFileName, globals, dt)
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, unsigned int numeroDeb, unsigned int numeroFin, string workingDir)
25{ 
26
27
28
29  if ( !initComputationLimits(numeroDeb,numeroFin) ) return false;
30
31  abstractElement* premierEl = NULL;
32  premierEl = dataManager_->getElementPointerFromNumero(numeroDeb_);
33
34  // ceinture et bretelles
35  if ( premierEl == NULL ) {
36    cerr << " premier element inexistant ?? " << endl;
37    return false;
38  }
39
40  string name = workingDir + inputFileName_;
41  ofstream outfile;
42  outfile.open(name.c_str(), ios::out);
43  if (!outfile) {
44    dataManager_->consoleMessage(" softwareTransport::createInputFile : error opening output stream " );
45    cerr << " error opening output stream " << name << endl;
46    return false;
47  }
48
49  outfile << string("'titre provisoire'") << endl;
50  outfile << " 0 " << endl;
51  outfile << " UTRANS " << endl;
52
53
54  //  cout << "debug:: c'est quoi le premier element? " << premierEl->getNomdElement().getElementName() << endl;
55
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
60  if ( premierEl->getNomdElement().getElementType() != nomdElements::beam ) {
61    // s'il n'y a pas faisceau courant, erreur
62    if ( beamBefore == NULL ) {
63      dataManager_->consoleMessage(" softwareTransport::createInputFile : no input beam, input file not created");
64      cout << " pas de faisceau " << endl;
65      return false;
66    } else {
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() ) {
72          dataManager_->consoleMessage(" softwareParmela::createInputFile : ca cafouille dans les representations de faisceau : ni particules, ni moments ? " );
73          cout << " ca cafouille dans les representations de faisceau : ni particules, ni moments ? " << endl;
74          return false;
75        } else {
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;
90  for (unsigned k = numeroDeb_; k <= numeroFin_; k++)
91    {
92      elPtr = dataManager_->getElementPointerFromNumero(k);
93      cout << "debug:: element [" << k << "] " << elPtr->getNomdElement().getExpandedName() << endl;
94      //      outfile << elPtr->transportOutputFlow();
95      outfile << elementsData(elPtr->parametersToSoftware());
96    }
97
98  outfile << " SENTINEL " << endl;
99  outfile << " SENTINEL " << endl;
100
101  outfile.close();
102  dataManager_->consoleMessage("fichier input termine pour TRANSPORT");
103  return true;
104}
105
106bool softwareTransport::execute(string workingDir)
107{
108  bool ExecuteStatus = true;
109
110  ostringstream sortie;
111  sortie << " EXECUTION DE TRANSPORT DE " << numeroDeb_ << " a " << numeroFin_ << endl;
112 
113  string transportJob = workingDir + "transport";
114  transportJob += string(" <  ");
115  transportJob += workingDir + inputFileName_;
116  cout << " job transport= " << transportJob << endl;
117 
118  string resultOfRun;
119  bool success = launchJob(transportJob,resultOfRun);
120  sortie << resultOfRun << endl;
121  if ( !success ) {
122    sortie << " launching of transport failed " << endl;
123    ExecuteStatus = false;
124  } else {
125    cout << " execution transport MARCHE " << endl;
126    string nameOut = workingDir + "transport.output";
127    ofstream outfile;
128    outfile.open(nameOut.c_str(), ios::out);
129    if (!outfile) {
130      sortie << " error first opening transport output stream " << nameOut << endl;
131      ExecuteStatus = false;
132    } else {
133      // on copie la sortie dans un fichier 'transport.out'
134      outfile << resultOfRun << endl;
135      outfile.close();
136    }
137  }
138
139  dataManager_->consoleMessage(sortie.str());
140  return ExecuteStatus;
141}
142
143bool softwareTransport::buildBeamAfterElements(string workingDir) 
144{
145
146  bool result = true;
147  if ( !ComputationLimitsOk() ) return false;
148
149  for (unsigned k = numeroDeb_; k <= numeroFin_; k++)
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;
155        return false;         
156      }
157
158
159      // if ( ptr->is_accepted_by_software(nameOfSoftware_) != TBoolOk ) {
160      if ( doAcceptElement(ptr->getNomdElement().getElementType())  != TBoolOk ) {
161
162        // si l'element doit etre ignore, on renvoie sur le diag precedent
163        dataManager_->updateCurrentDiagnostic(false);
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      //        }
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        }
193      }
194    }
195  return result;
196}
197bool softwareTransport::moments2FromTransport(string workingDir,string elLab,const nomdElements elem,beam2Moments& moments) const 
198{
199  string elementLabel = elLab;
200  // transformer le label en majuscules ; je ne suis pas sur que ca
201  // marchera a tous les coups (glm)
202  std::transform(elementLabel.begin(),elementLabel.end(),elementLabel.begin(),(int (*)(int))std::toupper);
203
204  cout << "softwareTransport::moments2FromTransport on cherche element " << elementLabel << endl;
205 
206  string nameIn = workingDir + "transport.output";
207  ifstream infile;
208  infile.open(nameIn.c_str(), ios::in);
209  if (!infile) {
210    dataManager_->consoleMessage(" softwareTransport::moments2FromTransport : error re-opening transport output stream ");
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) ) {
220    fichier += buf+"\n";
221    nn = buf.find(elementLabel);
222    if ( nn != string::npos ) {
223      compteur++;
224    }
225  }
226  infile.close();
227
228  cout << " compteur= " << compteur << endl;
229  if ( compteur == 0 ) {
230    dataManager_->consoleMessage(" softwareTransport::moments2FromTransport : element"+elementLabel+"not found in the file "+nameIn);
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  }
249
250  return moments.readFromTransportOutput(fichierStream);
251}
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.