#include "softwareTransport.h" #include "abstractElement.h" #include "beam2Moments.h" #include "dataManager.h" #include softwareTransport::softwareTransport() : abstractSoftware() { nameOfSoftware_ = nomDeLogiciel("transport"); } softwareTransport::softwareTransport(string inputFileName,sectionToExecute* sect, dataManager* data) : abstractSoftware(inputFileName, sect,data) { nameOfSoftware_ = nomDeLogiciel("transport"); registerElement(nomdElements::beam,TBoolOk); registerElement(nomdElements::drift,TBoolOk); registerElement(nomdElements::bend,TBoolOk); registerElement(nomdElements::soleno,TBoolOk); registerElement(nomdElements::fit,TBoolOk); registerElement(nomdElements::snapshot,TBoolIgnore); } bool softwareTransport::createInputFile(particleBeam* beamBefore, string workingDir) { abstractElement* premierEl = getSectionToExecute()->getElements().front(); // 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() != nomdElements::beam ) { // s'il n'y a pas faisceau courant, erreur if ( beamBefore == NULL ) { dataManager_->consoleMessage(" softwareTransport::createInputFile : no input beam, input file not created"); 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 = 0; k < getSectionToExecute()->getElements().size(); k++) { elPtr = getSectionToExecute()->getElements()[k]; cout << "debug:: element [" << k << "] " << elPtr->getNomdElement().getExpandedName() << endl; // outfile << elPtr->transportOutputFlow(); outfile << elementsData(elPtr->parametersToSoftware()); } outfile << " SENTINEL " << endl; outfile << " SENTINEL " << endl; outfile.close(); dataManager_->consoleMessage("fichier input termine pour TRANSPORT"); return true; } bool softwareTransport::execute(string workingDir) { bool ExecuteStatus = true; ostringstream sortie; sortie << " EXECUTION DE TRANSPORT " << 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(string workingDir) { bool result = true; if ( !ComputationLimitsOk_deprecated() ) return false; for (unsigned k = 0; k < getSectionToExecute()->getElements().size(); k++) { abstractElement* ptr = getSectionToExecute()->getElements()[k]; if ( ptr == NULL ) { dataManager_->consoleMessage(" softwareTransport::buildBeamAfterElements : null pointer on element " ); cout << " softwareTransport::buildBeamAfterElements : null pointer on element " << endl; return false; } // if ( ptr->is_accepted_by_software(nameOfSoftware_) != TBoolOk ) { if ( doAcceptElement(ptr->getNomdElement().getElementType()) != TBoolOk ) { // si l'element doit etre ignore, on renvoie sur le diag precedent dataManager_->updateCurrentDiagnostic(false); // // si l'element est un snapshot, recuperer la sortie precedente // if(ptr->getNomdElement().getElementType() == snapshot) { // string* param = ptr->getParametersString(); // string cliche = workingDir + param[2].c_str(); // cout<<"["<getLabel(); beam2Moments transpMoments; // lecture sortie transport if (!moments2FromTransport(workingDir,elemLabel,ptr->getNomdElement(),transpMoments) ) { // si echec, on renvoie sur le diag precedent dataManager_->updateCurrentDiagnostic(false); dataManager_->consoleMessage(" softwareTransport::buildBeamAfterElements : element skipped in reading moments from transport output : " + elemLabel); // cout << " softwareTransport::buildBeamAfterElements plantage dans lecture moments " << endl; return true; } else { // si succes, // on initialise une nouvelle sortie diagnostic particleBeam* newDiag = dataManager_->updateCurrentDiagnostic(true); // et on la complete newDiag->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; } } } return moments.readFromTransportOutput(fichierStream); } string softwareTransport::elementsData(const vector< pair > >& donnees) const { unsigned k; cout << " PASSAGE softwareTransport::elementsData " << endl; if ( donnees.at(0).first != "labelsGenericSpecific" ) { cout << " softwareTransport::elementsData ERROR : element badly defined " << endl; return string(); } string genericName = donnees.at(0).second.at(0); if ( genericName == "beam" ) return beamData(donnees); if ( genericName == "drift" ) return driftData(donnees); if ( genericName == "solnd" ) return solenoData(donnees); if ( genericName == "bend" ) return bendData(donnees); if ( genericName == "fit" ) return fitData(donnees); return string(); } string softwareTransport::beamData(const vector< pair > >& donnees) const { cout << " PASSAGE softwareTransport::beamData " << endl; double x = 0.0; double xp = 0.0; double y = 0.0; double yp = 0.0; double dl = 0.0; double del = 0.0; double p0 = 0.0; string specificName = ""; unsigned k; for ( k=0; k < donnees.size(); k++) { if ( donnees.at(k).first == "transverseCoordinates" ) { x = atof( donnees.at(k).second.at(0).c_str() ); xp = atof( donnees.at(k).second.at(1).c_str() ); y = atof( donnees.at(k).second.at(2).c_str() ); yp = atof( donnees.at(k).second.at(3).c_str() ); } else if ( donnees.at(k).first == "longitudinalCoordinates" ) { dl = atof( donnees.at(k).second.at(0).c_str() ); del = atof( donnees.at(k).second.at(1).c_str() ); } else if ( donnees.at(k).first == "momentum" ) { p0 = atof( donnees.at(k).second.at(0).c_str() ); } else if ( donnees.at(k).first == "labelsGenericSpecific" ) { specificName = donnees.at(k).second.at(1); } } ostringstream sortie; beam2Moments moments(x, xp, y, yp, dl, del); sortie << specificName << ":" << moments.writeToTransportInput(p0) << endl; return sortie.str(); return sortie.str(); } string softwareTransport::driftData(const vector< pair > >& donnees) const { cout << " PASSAGE softwareTransport::driftData " << endl; string lenght = "0.0"; string specificName = ""; unsigned k; for ( k=0; k < donnees.size(); k++) { if ( donnees.at(k).first == "lenghtAperture" ) { lenght = donnees.at(k).second.at(0); } else if ( donnees.at(k).first == "labelsGenericSpecific" ) { specificName = donnees.at(k).second.at(1); } } ostringstream sortie; // longueur en m sortie << specificName << ":" << " DRIFT, L=" << 0.01*atof(lenght.c_str()) << ";" << endl; return sortie.str(); } string softwareTransport::solenoData(const vector< pair > >& donnees) const { cout << " softwareTransport::solenoData " << endl; string lenght = "0.0"; string B0 = "0.0"; string varyB0 = "0"; string specificName = ""; unsigned k; for ( k=0; k < donnees.size(); k++) { if ( donnees.at(k).first == "lenghtAperture" ) { lenght = donnees.at(k).second.at(0); } else if ( donnees.at(k).first == "field" ) { B0 = donnees.at(k).second.at(0); } else if ( donnees.at(k).first == "isBvariable" ) { varyB0 = donnees.at(k).second.at(0); } else if ( donnees.at(k).first == "labelsGenericSpecific" ) { specificName = donnees.at(k).second.at(1); } } ostringstream sortie; // on passe la longueur en metres sortie << specificName << ":" << " SOLENOID, L=" << 0.01*atof (lenght.c_str()) << ", B=" << B0 << ";" << endl; if ( atoi(varyB0.c_str()) ) { sortie << " VARY, " << specificName+"[B]" << ";" << endl; } return sortie.str(); } string softwareTransport::bendData(const vector< pair > >& donnees) const { cout << " softwareTransport::bendData " << endl; string lenght = "0.0"; string radius = "0.0"; string angleDeg = "0.0"; string beta1 = "0.0"; string beta2 = "0.0"; string specificName = ""; unsigned k; for ( k=0; k < donnees.size(); k++) { if ( donnees.at(k).first == "lenghtAperture" ) { lenght = donnees.at(k).second.at(0); } else if ( donnees.at(k).first == "angleDegre" ) { angleDeg = donnees.at(k).second.at(0); } else if ( donnees.at(k).first == "radius" ) { radius = donnees.at(k).second.at(0); } else if ( donnees.at(k).first == "rotatedFaces" ) { beta1 = donnees.at(k).second.at(0); beta2 = donnees.at(k).second.at(1); } else if ( donnees.at(k).first == "labelsGenericSpecific" ) { specificName = donnees.at(k).second.at(1); } } ostringstream sortie; sortie << specificName << ":" << " SBEND, RADIUS=" << radius << ", ANGLE=" << angleDeg << ", E1=" << beta1 << ", E2=" << beta2 << ";" << endl; return sortie.str(); } string softwareTransport::fitData(const vector< pair > >& donnees) const { cout << " softwareTransport::fitData " << endl; string variableName = ""; string variableValue = "0.0"; string tolerance = "0.0"; string specificName = ""; unsigned k; for ( k=0; k < donnees.size(); k++) { if ( donnees.at(k).first == "variable") { variableName = donnees.at(k).second.at(0); variableValue = donnees.at(k).second.at(1); tolerance = donnees.at(k).second.at(2); } else if ( donnees.at(k).first == "labelsGenericSpecific" ) { specificName = donnees.at(k).second.at(1); } } ostringstream sortie; sortie << specificName << ":" << " FIT," << variableName << " = " << variableValue << ", TOLER = " << tolerance << " ;" << endl; if ( variableName == "R11" || variableName == "R22" || variableName == "R12" || variableName == "R21" ) { sortie << " PRINT, TRANS;" << endl; } return sortie.str(); }