#include "elementBend.h" #include "mixedTools.h" #include "mathematicalConstants.h" #include "PhysicalConstants.h" elementBend::elementBend() : abstractElement() { setDefaultValues(); setDefaults(); elementName_ = nomdElements("bend"); nbParam_ = elementName_.getElementNbParameters(); parametersString_ = new string[nbParam_+1]; // registerAcceptableSoftware(nomDeLogiciel::transport, TBoolOk); // registerAcceptableSoftware(nomDeLogiciel::parmela, TBoolOk); } void elementBend::setDefaultValues() { defaultSpecificName_ = "bend"; angleDegDef_ = 0.0; radiusDef_ = 1.0; beta1Def_ = 0.0; beta2Def_ = 0.0; momentumDef_ = 0.0; } void elementBend::setDefaults() { specificName_ = defaultSpecificName_; angleDeg_ = angleDegDef_; radius_ = radiusDef_; beta1_ = beta1Def_; beta2_ = beta2Def_; momentum_ = momentumDef_; } string* elementBend::getParametersString() const { int compteur = -1; parametersString_[++compteur] = mixedTools::intToString(nbParam_); parametersString_[++compteur] = specificName_; parametersString_[++compteur] = mixedTools::doubleToString( angleDeg_); parametersString_[++compteur] = mixedTools::doubleToString(radius_); parametersString_[++compteur] = mixedTools::doubleToString(momentum_); parametersString_[++compteur] = mixedTools::doubleToString(aperture_); parametersString_[++compteur] = mixedTools::doubleToString(beta1_); parametersString_[++compteur] = mixedTools::doubleToString(beta2_); if ( compteur != nbParam_ ) { cerr << " elementBend::getParametersString() : ERROR nr pf parameters dosnt match " << endl; return NULL; } return parametersString_; } double elementBend::getLenghtOfElement() const { return 1.0e2 * radius_ * angleDeg_ * DEG_TO_RADIANS; } void elementBend::setParametersString(string* param) { if ( param == NULL ) { cerr << " elementBend::setParametersString parameters empty parameter set"; return; } int compteur = -1; int nbparam = atoi(param[++compteur].c_str()); if ( nbparam != nbParam_ ) { cerr << " elementBend::setParametersString parameters do not match for a BEND" << endl; return; } specificName_ = param[++compteur]; angleDeg_ = atof(param[++compteur].c_str()); radius_ = atof(param[++compteur].c_str()); momentum_ = atof(param[++compteur].c_str()); aperture_ = atof(param[++compteur].c_str()); beta1_ = atof(param[++compteur].c_str()); beta2_ = atof(param[++compteur].c_str()); // calcul de la longueur : rayon en m ; longueur en cm lenghtElem_ = getLenghtOfElement(); cout << " elementBend::setParametersString calcule longueur = " << lenghtElem_ << endl; } // string elementBend::parmelaOutputFlow() const // { // ostringstream sortie; // // il faut entrer l'energie cinetique // double ecin = momentum_/EREST_MeV; // ecin = ecin*ecin + 1.; // ecin = EREST_MeV*(sqrt(ecin) - 1.0); // sortie << "BEND /l=" << lenghtElem_ << " / aper=" << aperture_ << " / iout=1 / wr=" << ecin << " /alpha=" << angleDeg_ << " / beta1=" << beta1_; // sortie << " / beta2=" << beta2_ << endl; // return sortie.str(); // } // string elementBend::transportOutputFlow() const // { // ostringstream sortie; // sortie << specificName_ << ":" << " SBEND, RADIUS=" << radius_ << ", ANGLE=" << angleDeg_ << ", E1=" << beta1_ << ", E2=" << beta2_ << ";" << endl; // return sortie.str(); // } // string elementBend::FileOutputFlow() const // { // ostringstream sortie; // // sortie << elementName_.getElementType() << endl; // sortie << elementName_.getGenericLabel() << endl; // sortie << specificName_ << endl; // sortie << angleDeg_ << " " << radius_ << " " << aperture_ << endl; // sortie << beta1_ << " " << beta2_ << " " << momentum_ << endl; // return sortie.str(); // } vector< pair > > elementBend::parametersToSoftware () const { vector< pair > > sortie; sortie.push_back( pair >("labelsGenericSpecific", vector() ) ); sortie.back().second.push_back(elementName_.getGenericLabel()); sortie.back().second.push_back(specificName_); sortie.push_back( pair >("lenghtAperture", vector() ) ); sortie.back().second.push_back(mixedTools::doubleToString( lenghtElem_)); sortie.back().second.push_back(mixedTools::doubleToString( aperture_)); sortie.push_back( pair >("angleDegre", vector() ) ); sortie.back().second.push_back(mixedTools::doubleToString( angleDeg_)); sortie.push_back( pair >("radius", vector() ) ); sortie.back().second.push_back(mixedTools::doubleToString( radius_)); sortie.push_back( pair >("rotatedFaces", vector() ) ); sortie.back().second.push_back(mixedTools::doubleToString( beta1_)); sortie.back().second.push_back(mixedTools::doubleToString( beta2_)); sortie.push_back( pair >("momentum", vector() ) ); sortie.back().second.push_back(mixedTools::doubleToString( momentum_)); return sortie; } // void elementBend::FileInput(ifstream& ifs) // { // ifs >> specificName_; // ifs >> angleDeg_ >> radius_ >> aperture_; // ifs >> beta1_ >> beta2_ >> momentum_; // lenghtElem_ = getLenghtOfElement(); // cout << " elementBend::FileInput calcule longueur = " << lenghtElem_ << endl; // } string elementBend::print() { string txt = ""; txt += specificName_; txt += "\nangle (deg.) : "; txt += mixedTools::doubleToString(angleDeg_); txt += "\nradius (m) : "; txt += mixedTools::doubleToString(radius_); txt += "\nmomentum (MeV/c) : "; txt += mixedTools::doubleToString(momentum_); txt += "\nlength (cm) : "; txt += mixedTools::doubleToString(lenghtElem_); txt += "\naperture (cm) : "; txt += mixedTools::doubleToString(aperture_); txt += "\npole face rotations (deg.) entrance : "; txt += mixedTools::doubleToString(beta1_); txt += "\nexit : "; txt += mixedTools::doubleToString(beta2_); return txt; } void elementBend::FileAMLInput(UAPNode* entree) { if ( !checkAMLelementGenericName(entree) ) return; AMLtools::readAMLParameterAttribut(entree, "length", "design", lenghtElem_); AMLtools::readAMLParameterAttribut(entree, "momentum", "design", momentum_); UAPNode* bend = entree->getChildByName("bend"); if ( !bend ) { cout << " elementBend::FileAMLInput ERREUR pas de noeud AML " << endl; return; } AMLtools::readAMLParameterAttribut(bend, "g", "design", radius_); // g = 1/r if ( radius_ != 0.0 ) { radius_ = 1./radius_; // angle en degres, la longeur est en cm, le rayon en metres : angleDeg_ = 0.01*lenghtElem_/(radius_*DEG_TO_RADIANS); } AMLtools::readAMLParameterAttribut(bend, "e1", "design", beta1_); AMLtools::readAMLParameterAttribut(bend, "e2", "design", beta2_); UAPNode* ouverture = entree->getChildByName("aperture"); if ( !ouverture ) { cout << " elementBend::FileAMLInput ERREUR pas de noeud AML " << endl; return; } AMLtools::readAMLParameterAttribut(ouverture, "xy_limit", "design", aperture_); } void elementBend::InputRep(UAPNode* root) { // UAPNode* ele = root->addChild("element"); // ele->addAttribute("name",specificName_); UAPNode* ele = setAMLelementHeader(root); string txt = ""; txt = mixedTools::doubleToString(lenghtElem_); ele->addChild("length")->addAttribute("design",txt); // pour Parmela /aper : radius of aperture at exit (gap) UAPNode* node = ele->addChild("aperture"); node->addAttribute("at","EXIT"); node->addAttribute("shape","CIRCLE"); txt = mixedTools::doubleToString(aperture_); node->addChild("xy_limit")->addAttribute("design",txt); // ??? encore pour Parmela /wt : ref energy txt = mixedTools::doubleToString(momentum_); ele->addChild("momentum")->addAttribute("design",txt); node = ele->addChild("bend"); // bending field g= 1/r = angle/length : on en déduit angle= g*length double g = 1.0/radius_; txt = mixedTools::doubleToString(g); node->addChild("g")->addAttribute("design",txt); txt = mixedTools::doubleToString(beta1_); node->addChild("e1")->addAttribute("design",txt); txt = mixedTools::doubleToString(beta2_); node->addChild("e2")->addAttribute("design",txt); }