#include "softwareTransport.h" #include "abstractElement.h" #include "beam2Moments.h" #include "dataManager.h" #include softwareTransport::softwareTransport() : abstractSoftware() {;} softwareTransport::softwareTransport(string inputFileName,globalParameters* globals, dataManager* dt) : abstractSoftware(inputFileName, globals, dt) {;} bool softwareTransport::createInputFile(particleBeam* beamBefore, unsigned int numeroDeb, unsigned int numeroFin, string workingDir) { if ( numeroDeb < 1 || numeroFin > dataManager_->getBeamLineSize() ) { dataManager_->consoleMessage(" softwareTransport::createInputFile : numero of element out of limits " ); cerr << " numero of element out of limits " << endl; return false; } abstractElement* premierEl = NULL; premierEl = dataManager_->getElementPointerFromNumero(numeroDeb); // ceinture et bretelles if ( premierEl == NULL ) { cerr << " premier element inexistant ?? " << endl; return false; } string name = workingDir + inputFileName_; ofstream outfile; outfile.open(name.c_str(), ios::out); if (!outfile) { dataManager_->consoleMessage(" softwareTransport::createInputFile : error opening output stream " ); cerr << " error opening output stream " << name << endl; return false; } outfile << string("'titre provisoire'") << endl; outfile << " 0 " << endl; outfile << " UTRANS " << endl; cout << "debug:: c'est quoi le premier element? " << premierEl->getNomdElement().getElementName() << endl; // si le premier element a traiter est un 'beam', on ne fait rien pour l'instant // il sera traite plus bas de maniere standard // Dans le cas où le premier element n'est pas beam if ( premierEl->getNomdElement().getElementType() != beam ) { // s'il n'y a pas faisceau courant, erreur if ( beamBefore == NULL ) { dataManager_->consoleMessage(" softwareTransport::createInputFile : no input beam"); cout << " pas de faisceau " << endl; return false; } else { // s'il y a un faisceau courant if ( !beamBefore->momentRepresentationOk() ) { // s'il n'est pas au format transport (issu de parmela ?) // on le met au format transport, s'il est deja au format 'particules' (par ex/ parmela) if ( !beamBefore->particleRepresentationOk() ) { dataManager_->consoleMessage(" softwareParmela::createInputFile : ca cafouille dans les representations de faisceau : ni particules, ni moments ? " ); cout << " ca cafouille dans les representations de faisceau : ni particules, ni moments ? " << endl; return false; } else { beamBefore->buildMomentRepresentation(); } } // ici, en principe, on a un faisceau correct // on ecrit sur le fichier input const beam2Moments& moments = beamBefore->getTransportMoments(); double P0 = beamBefore->getP0Transport(); outfile << moments.writeToTransportInput(P0); } } outfile << " PRINT, BEAM, ON; " << endl; abstractElement* elPtr; for (unsigned k = numeroDeb; k <= numeroFin; k++) { elPtr = dataManager_->getElementPointerFromNumero(k); cout << "debug:: element [" << k << "] " << elPtr->getNomdElement().getElementName() << endl; if(elPtr->getNomdElement().getElementType() == snapshot) continue; outfile << elPtr->transportOutputFlow() << endl; } outfile << " SENTINEL " << endl; outfile << " SENTINEL " << endl; outfile.close(); dataManager_->consoleMessage("fichier input termine pour TRANSPORT"); return true; } bool softwareTransport::execute( unsigned int numeroDeb, unsigned int numeroFin, string workingDir) { bool ExecuteStatus = true; ostringstream sortie; sortie << " EXECUTION DE TRANSPORT DE " << numeroDeb << " a " << numeroFin << endl; string transportJob = workingDir + "transport"; transportJob += string(" < "); transportJob += workingDir + inputFileName_; cout << " job transport= " << transportJob << endl; string resultOfRun; bool success = launchJob(transportJob,resultOfRun); sortie << resultOfRun << endl; if ( !success ) { sortie << " launching of transport failed " << endl; ExecuteStatus = false; } else { cout << " execution transport MARCHE " << endl; string nameOut = workingDir + "transport.output"; ofstream outfile; outfile.open(nameOut.c_str(), ios::out); if (!outfile) { sortie << " error first opening transport output stream " << nameOut << endl; ExecuteStatus = false; } else { // on copie la sortie dans un fichier 'transport.out' outfile << resultOfRun << endl; outfile.close(); } } dataManager_->consoleMessage(sortie.str()); return ExecuteStatus; } bool softwareTransport::buildBeamAfterElements(unsigned int numeroDeb,unsigned int numeroFin, vector& beams,string workingDir) { bool result = true; for (unsigned k = numeroDeb; k <= numeroFin; k++) { abstractElement* ptr = dataManager_->getElementPointerFromNumero(k); if ( ptr == NULL ) { dataManager_->consoleMessage(" softwareTransport::buildBeamAfterElements : null pointer on element " ); cout << " softwareTransport::buildBeamAfterElements : null pointer on element " << endl; result = false; break; } // si l'element est un snapshot, recuperer la sortie precedente if(ptr->getNomdElement().getElementType() == snapshot) { int avantDernier = beams.size() - 1; string* param = ptr->getParametersString(); string cliche = workingDir + param[2].c_str(); cout<<"["<getLabel(); beam2Moments transpMoments; if (!moments2FromTransport(workingDir,elemLabel,ptr->getNomdElement(),transpMoments) ) { dataManager_->consoleMessage(" softwareTransport::buildBeamAfterElements : failure in reading moments " ); cout << " softwareTransport::buildBeamAfterElements plantage dans lecture moments " << endl; result = false; break; } beams.back().set2Moments(transpMoments); } return result; } bool softwareTransport::moments2FromTransport(string workingDir,string elLab,const nomdElements elem,beam2Moments& moments) const { string elementLabel = elLab; // transformer le label en majuscules ; je ne suis pas sur que ca // marchera a tous les coups (glm) std::transform(elementLabel.begin(),elementLabel.end(),elementLabel.begin(),(int (*)(int))std::toupper); cout << "softwareTransport::moments2FromTransport on cherche element " << elementLabel << endl; string nameIn = workingDir + "transport.output"; ifstream infile; infile.open(nameIn.c_str(), ios::in); if (!infile) { dataManager_->consoleMessage(" softwareTransport::moments2FromTransport : error re-opening transport output stream "); cerr << " dataManager::moments2FromTransport : error re-opening transport output stream " << nameIn << endl; return false; } string::size_type nn = string::npos; string fichier; string buf; unsigned compteur = 0; while ( getline(infile, buf) ) { fichier += buf+"\n"; nn = buf.find(elementLabel); if ( nn != string::npos ) { compteur++; } } infile.close(); cout << " compteur= " << compteur << endl; if ( compteur == 0 ) { dataManager_->consoleMessage(" softwareTransport::moments2FromTransport : element"+elementLabel+"not found in the file "+nameIn); cerr << " dataManager::moments2FromTransport : element " << elementLabel << " non trouve dans le fichier " << nameIn << endl; return false; } stringstream fichierStream(fichier); buf.clear(); unsigned relu = 0; while ( std::getline(fichierStream, buf) ) { // cout << " relecture buffer : " << buf << endl; nn = buf.find(elementLabel); if ( nn != string::npos ) { relu++; if ( relu == compteur ) { cout << " TROUVE !" << endl; break; } } } moments.readFromTransportOutput(fichierStream); return true; }