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

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

suppression designation elements par index + fin generator

File size: 7.1 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  ;
11}
12
13softwareTransport::softwareTransport(globalParameters* globals, dataManager* dt) : abstractSoftware(globals, dt)
14{
15  ;
16}
17
18
19bool softwareTransport::createInputFile(string inputFileName, particleBeam* beamBefore, unsigned int numeroDeb, unsigned int numeroFin, string workingDir)
20{
21  unsigned int k;
22  if ( numeroDeb < 1 || numeroFin > dataManager_->getBeamLineSize() ) {
23    cerr << " numero of element out of limits " << endl;
24    return false;
25  }
26
27    // unsigned indexDeb = numeroDeb - 1;
28    // unsigned indexFin = numeroFin - 1;
29
30  abstractElement* premierEl = NULL;
31  premierEl = dataManager_->getElementPointerFromNumero(numeroDeb);
32
33  // ceinture et bretelles
34  if ( premierEl == NULL ) {
35    cerr << " premier element inexistant ?? " << endl;
36    return false;
37  }
38
39
40  ofstream outfile;
41  string name = workingDir + inputFileName;
42  outfile.open(name.c_str(), ios::out);
43  if (!outfile) 
44    {
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  // si le premier element a traiter est un 'beam', on ne fait rien pour l'instant
55  // il sera traite plus bas de maniere standard
56
57  // Dans le cas où le premier element n'est pas beam
58  if ( premierEl->getNomdElement().getElementType() != beam ) {
59    // s'il n'y a pas faisceau courant, erreur
60    if ( beamBefore == NULL ) {
61      cout << " pas de faisceau " << endl;
62      return false;
63    }
64    else {
65      // s'il y a un faisceau courant
66      if ( !beamBefore->momentRepresentationOk() ) {
67        // s'il n'est pas au format transport (issu de parmela ?)
68        // on le met au format transport, s'il est deja au format 'particules' (par ex/ parmela)
69        if ( !beamBefore->particleRepresentationOk() ) {
70          cout << " ca cafouille dans les representations de faisceau : ni particules, ni moments ? " << endl;
71          return false;
72        }
73        else {
74          beamBefore->buildMomentRepresentation();
75        }
76      }
77      // ici, en principe, on a un faisceau correct
78      // on ecrit sur le fichier input
79      const beam2Moments& moments = beamBefore->getTransportMoments();
80      double P0 = beamBefore->getP0Transport();
81      outfile << moments.writeToTransportInput(P0);
82    }
83  }
84
85
86
87  outfile << " PRINT, BEAM, ON; " << endl;
88
89
90  abstractElement* elPtr;
91  for ( k=numeroDeb; k <= numeroFin; k++)
92    {
93      elPtr = dataManager_->getElementPointerFromNumero(k);
94      outfile << elPtr->transportOutputFlow() << endl;
95    }
96
97  outfile << " SENTINEL " << endl;
98  outfile << " SENTINEL " << endl;
99
100  outfile.close();
101  return true;
102}
103
104
105
106bool softwareTransport::execute(string inputFileName, unsigned int numeroDeb, unsigned int numeroFin, string workingDir, string& resul)
107{
108  ostringstream sortie;
109  resul.clear();
110  sortie << " EXECUTION DE TRANSPORT DE " << numeroDeb << " a " << numeroFin << endl;
111  // if ( !createInputFile( &beamAfterElement.back(), numeroDeb, numeroFin, workingDir) )
112  //   {
113  //     sortie << " error creating transport input file "  << endl;
114  //     resul = sortie.str();
115  //     return false;
116  //   }
117
118  bool ExecuteStatus = true;
119  string bufString;
120  char buf[132];
121  string transportJob = workingDir + "transport";
122  transportJob += string(" <  ");
123  transportJob += workingDir + inputFileName;
124  cout << " job transport= " << transportJob << endl;
125
126  ofstream outfile;
127  string nameOut = workingDir + "transport.output";
128  string resultOfRun;
129  bool success = launchJob(transportJob, resultOfRun);
130  sortie << resultOfRun << endl;
131  if ( !success) {
132    sortie << " launching of transport failed " << endl;
133    ExecuteStatus = false;
134  }
135  else {
136    cout << " execution transport MARCHE " << endl;
137    outfile.open(nameOut.c_str(), ios::out);
138    if (!outfile) 
139      {
140        sortie << " error first opening transport output stream " << nameOut << endl;
141        ExecuteStatus = false;
142      }
143    else {
144      // on copie la sortie dans un fichier 'transport.out'
145      outfile << resultOfRun << endl;
146      outfile.close();
147      // ExecuteStatus = buildBeamAfterElements(numeroDeb,numeroFin, beamAfterElement, workingDir);
148      // if ( !ExecuteStatus ) {
149      //        sortie << " reading transport results  failed " << endl;
150      //      }
151    }
152  }
153  resul =  sortie.str();
154  return ExecuteStatus;
155}
156
157
158bool softwareTransport::buildBeamAfterElements(unsigned int numeroDeb,unsigned int numeroFin, vector<particleBeam>& beams, string workingDir) {
159
160  bool result = true;
161unsigned k;
162        for ( k= numeroDeb; k <= numeroFin; k++)
163          {
164            beams.push_back(particleBeam());
165            //      string elemLabel = getLabelFromElementNumero (k);
166
167            abstractElement* ptr = dataManager_->getElementPointerFromNumero(k);
168
169            if ( ptr == NULL ) {
170              cout << " softwareTransport::buildBeamAfterElements pointeur nul sur element " << endl;
171              result = false;
172              break;         
173            }
174
175            string elemLabel = ptr->getLabel();
176
177            beam2Moments transpMoments;
178
179            if (!moments2FromTransport(workingDir, elemLabel, ptr->getNomdElement(),transpMoments )  )
180              {
181              cout << " softwareTransport::buildBeamAfterElements plantage dans lecture moments " << endl;
182                result = false;
183                break;
184              }
185            beams.back().set2Moments(transpMoments);
186          }
187        return result;
188}
189
190
191bool  softwareTransport::moments2FromTransport(string workingDir, string elLab, const nomdElements elem, beam2Moments& moments) const {
192
193  string elementLabel = elLab;
194  // transformer le label en majuscules ; je ne suis pas sur que ca
195  // marchera a tous les coups (glm)
196  std::transform(elementLabel.begin(), elementLabel.end(), elementLabel.begin(), (int (*)(int))std::toupper);
197
198  cout << " dataManager::moments2FromTransport on cherche element " << elementLabel << endl;
199  ifstream infile;
200  string nameIn = workingDir + "transport.output";
201  infile.open(nameIn.c_str(), ios::in);
202  if (!infile) {
203    cerr << " dataManager::moments2FromTransport : error re-opening transport output stream " << nameIn << endl;
204    return false;
205  }
206  //  else cout << " particleBeam::setFromTransport() : ouverture du fichier " << nameIn << endl;
207
208  string::size_type nn = string::npos;
209  string  fichier;
210  string buf;
211  unsigned compteur = 0;
212  while ( getline(infile, buf) ) {
213      fichier += buf+"\n";
214    nn = buf.find(elementLabel);
215    if ( nn != string::npos ) {
216      compteur++;
217      //      break;
218    }
219  }
220  infile.close();
221  cout << " compteur= " << compteur << endl;
222  if ( compteur == 0 ) {
223    cerr << " dataManager::moments2FromTransport : element " << elementLabel << " non trouve dans le fichier  " << nameIn << endl;
224    return false;
225  }
226
227
228  stringstream fichierStream(fichier);
229  buf.clear();
230  unsigned relu = 0;
231  while ( std::getline(fichierStream, buf) ) {
232    //    cout << " relecture buffer : " << buf << endl;
233    nn = buf.find(elementLabel);
234    if ( nn != string::npos ) {
235      relu++;
236      if ( relu == compteur ) {
237        cout << " TROUVE !" << endl;
238        break;
239      }
240    }
241  }
242  moments.readFromTransportOutput(fichierStream);
243  //  impressionDesMoments();
244  return true;
245
246}
247
Note: See TracBrowser for help on using the repository browser.