Changeset 342 in PSPA for Interface_Web/trunk/pspaWT/sources/controler/src/softwareParmela.cc
- Timestamp:
- Feb 26, 2013, 2:35:45 PM (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
Interface_Web/trunk/pspaWT/sources/controler/src/softwareParmela.cc
r333 r342 8 8 9 9 softwareParmela::softwareParmela() : abstractSoftware() 10 { 11 ; 12 } 10 {;} 13 11 14 12 softwareParmela::softwareParmela(string inputFileName, globalParameters* globals, dataManager* dt) : abstractSoftware(inputFileName, globals, dt) 15 { 16 ; 17 } 13 {;} 18 14 19 15 bool softwareParmela::createInputFile( particleBeam* beamBefore, unsigned int numeroDeb, unsigned int numeroFin, string workingDir) … … 26 22 return false; 27 23 } 28 29 24 30 25 ofstream outfile; … … 54 49 } 55 50 56 51 57 52 outfile << "TITLE" << endl; 58 53 outfile << " titre provisoire " << endl; … … 66 61 outfile << "INPUT 0 /NP=" << beamBefore->getNbParticles() << endl; 67 62 } 63 64 68 65 for ( k = premier; k <= numeroFin; k++) 69 66 { 70 67 elPtr = dataManager_->getElementPointerFromNumero(k); 68 if(elPtr->getNomdElement().getElementType() == snapshot) continue; 71 69 outfile << elPtr->parmelaOutputFlow() << endl; 72 70 } 73 71 74 72 outfile << "ZOUT" << endl; 75 73 outfile << "START /wt=0.0 /dwt=" << globParamPtr_->getIntegrationStep() << " /nsteps=" << globParamPtr_->getNbSteps() << " nsc=" << globParamPtr_->getScPeriod() << " /nout=10" << endl; … … 81 79 82 80 83 bool softwareParmela::execute(unsigned int numeroDeb,unsigned int numeroFin,string workingDir) 84 { 81 bool softwareParmela::execute(unsigned int numeroDeb,unsigned int numeroFin,string workingDir) 82 { 83 bool ExecuteStatus = true; 84 85 85 ostringstream sortie; 86 bool ExecuteStatus = true;87 // resul.clear();88 86 sortie << " EXECUTION DE PARMELA DE l'ELEMENT " << numeroDeb << " A L'ELEMENT " << numeroFin << endl; 89 87 90 char buf[132];91 88 string parmelaJob = workingDir + "parmela"; 92 89 parmelaJob += string(" "); 93 90 parmelaJob += workingDir; 94 // cout << " job parmela= " << parmelaJob << endl; 95 91 96 92 string resultOfRun; 97 bool success = launchJob(parmelaJob, 93 bool success = launchJob(parmelaJob,resultOfRun); 98 94 sortie << resultOfRun << endl; 99 if ( !success ) {95 if ( !success ) { 100 96 sortie << " launching of parmela failed " << endl; 101 97 ExecuteStatus = false; 102 } 103 else { 98 } else { 104 99 sortie << " successful launching of parmela " << endl; 105 100 cout << " execution parmela MARCHE " << endl; … … 112 107 } 113 108 114 // resul = sortie.str(); 115 dataManager_->consoleMessage(sortie.str()); 116 109 dataManager_->consoleMessage(sortie.str()); 117 110 return ExecuteStatus; 118 111 } 119 112 120 121 bool softwareParmela::buildBeamAfterElements(unsigned int numeroDeb,unsigned int numeroFin, vector<particleBeam>& beams, string workingDir){113 bool softwareParmela::buildBeamAfterElements(unsigned int numeroDeb,unsigned int numeroFin, vector<particleBeam>& beams, string workingDir) 114 { 122 115 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 127 133 beams.push_back(particleBeam()); 128 134 vector<double> centroid; 129 135 bareParticle refPart; 130 136 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)) 132 140 { 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) { 135 142 int avantDernier = beams.size() -2; 136 143 beams.back() = beams.at(avantDernier); 137 144 } else { 138 // sortie << " reading parmdesz failed " << endl; 139 dataManager_->consoleMessage(" softwareParmela::buildBeamAfterElements : reading parmdesz failed " ); 145 dataManager_->consoleMessage("softwareParmela::buildBeamAfterElements : reading parmdesz failed"); 140 146 result = false; 141 147 break; 142 148 } 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++; 147 155 } 156 148 157 return result; 149 158 } 150 159 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; 160 bool softwareParmela::beamFromParmela(string workingDir,unsigned numeroParmel, double referencefrequency, vector<double>& centroid, bareParticle& refPart,vector<bareParticle>& particles ) 161 { 157 162 string nomfilefais = workingDir + "parmdesz"; 158 163 cout << " nom fichier desz : " << nomfilefais << endl; 159 filefais = fopen(nomfilefais.c_str(), "r");164 FILE *filefais = fopen(nomfilefais.c_str(), "r"); 160 165 161 166 if ( filefais == (FILE*)0 ) { 162 167 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 elsecout << " 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 168 173 parmelaParticle partic; 169 174 std::vector<parmelaParticle> faisceau; 170 171 // unsigned indexElement = numeroElement-1;172 173 174 175 176 175 int testNombrePartRef =0; 177 176 double phaseRef = 0.0; 178 177 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 ) { 182 182 faisceau.push_back(partic); 183 184 183 if ( partic.np == 1 ) { 185 184 // en principe on est sur la particule de reference … … 200 199 } 201 200 } 202 }201 } //while 203 202 204 203 if ( faisceau.size() == 0) … … 213 212 // avec freq en Mhz et dphi en degres et résultat en cm: 214 213 double FACTEUR = 83.3333; // ameliorer la precision 215 216 217 214 218 215 // pour l'instant on choisit un centroid nul; … … 232 229 // contrairement a ce qu'indique la notice PARMELA, dans parmdesz, les xp et yp 233 230 // 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; 236 233 xp=faisceau.at(k).xxp; 237 y= faisceau.at(k).yy;234 y= faisceau.at(k).yy; 238 235 yp=faisceau.at(k).yyp; 239 240 236 // dephasage par rapport a la reference 241 237 dephas = faisceau.at(k).phi - phaseRef; // degrés … … 250 246 particles.at(k) = bareParticle(pos,betagamma); 251 247 } 248 252 249 return true; 253 250 }
Note: See TracChangeset
for help on using the changeset viewer.