source: PSPA/Interface_Web/trunk/pspaWT/sources/controler/src/elementBend.cc @ 488

Last change on this file since 488 was 488, checked in by lemeur, 10 years ago

lecture fichier sauvegarde AML

File size: 8.2 KB
Line 
1#include "elementBend.h"
2#include "mixedTools.h"
3#include "mathematicalConstants.h"
4#include "PhysicalConstants.h"
5
6elementBend::elementBend() :  abstractElement()
7{
8  setDefaultValues();
9  setDefaults();
10  elementName_ = nomdElements("bend");
11  nbParam_ = elementName_.getElementNbParameters();
12  parametersString_ = new string[nbParam_+1];
13  // registerAcceptableSoftware(nomDeLogiciel::transport, TBoolOk);
14  // registerAcceptableSoftware(nomDeLogiciel::parmela, TBoolOk);
15}
16
17void elementBend::setDefaultValues()
18{
19  defaultSpecificName_ = "bend";
20  angleDegDef_ = 0.0;
21  radiusDef_ = 1.0;
22  beta1Def_ = 0.0;
23  beta2Def_ = 0.0;
24  momentumDef_ = 0.0;
25}
26
27void elementBend::setDefaults()
28{
29  specificName_ = defaultSpecificName_;
30  angleDeg_ = angleDegDef_;
31  radius_ = radiusDef_;
32  beta1_ = beta1Def_;
33  beta2_ = beta2Def_;
34  momentum_ = momentumDef_;
35}
36
37string* elementBend::getParametersString() const 
38{
39  int compteur = -1;
40  parametersString_[++compteur] = mixedTools::intToString(nbParam_);
41  parametersString_[++compteur] = specificName_;
42  parametersString_[++compteur] = mixedTools::doubleToString( angleDeg_);
43  parametersString_[++compteur] = mixedTools::doubleToString(radius_);
44  parametersString_[++compteur] = mixedTools::doubleToString(momentum_);
45  parametersString_[++compteur] = mixedTools::doubleToString(aperture_);
46  parametersString_[++compteur] = mixedTools::doubleToString(beta1_);
47  parametersString_[++compteur] = mixedTools::doubleToString(beta2_);
48  if ( compteur != nbParam_ ) {
49    cerr << " elementBend::getParametersString() : ERROR nr pf parameters dosnt match " << endl;
50    return NULL;
51  }
52  return parametersString_;
53}
54
55double elementBend::getLenghtOfElement() const 
56{
57  return 1.0e2 * radius_ * angleDeg_ * DEG_TO_RADIANS; 
58}
59
60
61void  elementBend::setParametersString(string* param)
62{
63  if ( param == NULL ) {
64    cerr << "  elementBend::setParametersString parameters empty parameter set";
65    return;
66  }
67 
68  int compteur = -1;
69  int nbparam = atoi(param[++compteur].c_str());
70  if ( nbparam != nbParam_ ) {
71    cerr << "  elementBend::setParametersString parameters do not match for a BEND" << endl;
72    return;
73  }
74  specificName_ = param[++compteur];
75  angleDeg_ =  atof(param[++compteur].c_str());
76  radius_ = atof(param[++compteur].c_str());
77  momentum_ = atof(param[++compteur].c_str());
78  aperture_  = atof(param[++compteur].c_str());
79  beta1_ = atof(param[++compteur].c_str());
80  beta2_ = atof(param[++compteur].c_str());
81  // calcul de la longueur : rayon en m ; longueur en cm
82  lenghtElem_ = getLenghtOfElement();
83  cout << " elementBend::setParametersString calcule longueur = " << lenghtElem_ << endl;
84}
85
86// string elementBend::parmelaOutputFlow() const
87//   {
88//     ostringstream sortie;
89//     // il faut entrer l'energie cinetique
90//     double ecin = momentum_/EREST_MeV;
91//     ecin = ecin*ecin + 1.;
92//     ecin = EREST_MeV*(sqrt(ecin) - 1.0);
93//     sortie << "BEND /l=" << lenghtElem_ << "  / aper=" << aperture_ << "  / iout=1 / wr=" << ecin << " /alpha=" << angleDeg_ << " / beta1=" << beta1_;
94//     sortie << " / beta2=" << beta2_  << endl;
95
96//     return sortie.str();
97//   }
98
99
100// string elementBend::transportOutputFlow() const
101//   {
102//     ostringstream sortie;
103//     sortie << specificName_ << ":" << "  SBEND, RADIUS=" << radius_ << ", ANGLE=" << angleDeg_ << ", E1=" << beta1_ << ", E2=" << beta2_ << ";" << endl;
104//     return sortie.str();
105//   }
106
107
108// string elementBend::FileOutputFlow() const
109// {
110//   ostringstream sortie;
111//   //    sortie << elementName_.getElementType() << endl;
112//   sortie << elementName_.getGenericLabel() << endl;
113//   sortie  << specificName_ << endl;
114//   sortie << angleDeg_ << "  " << radius_ << " " <<  aperture_  << endl;
115//   sortie << beta1_ << "  " << beta2_ << " " << momentum_ << endl;
116//   return sortie.str();
117// }
118
119vector< pair<string, vector<string> > > elementBend::parametersToSoftware () const
120{
121  vector< pair<string, vector<string> > >  sortie;
122  sortie.push_back( pair<string, vector<string> >("labelsGenericSpecific",  vector<string>() ) );
123  sortie.back().second.push_back(elementName_.getGenericLabel());
124  sortie.back().second.push_back(specificName_);
125  sortie.push_back( pair<string, vector<string> >("lenghtAperture",  vector<string>() ) );
126  sortie.back().second.push_back(mixedTools::doubleToString( lenghtElem_));
127  sortie.back().second.push_back(mixedTools::doubleToString( aperture_));
128  sortie.push_back( pair<string, vector<string> >("angleDegre",  vector<string>() ) );
129  sortie.back().second.push_back(mixedTools::doubleToString( angleDeg_));
130  sortie.push_back( pair<string, vector<string> >("radius",  vector<string>() ) );
131  sortie.back().second.push_back(mixedTools::doubleToString( radius_));
132  sortie.push_back( pair<string, vector<string> >("rotatedFaces",  vector<string>() ) );
133  sortie.back().second.push_back(mixedTools::doubleToString( beta1_));
134  sortie.back().second.push_back(mixedTools::doubleToString( beta2_));
135  sortie.push_back( pair<string, vector<string> >("momentum",  vector<string>() ) );
136  sortie.back().second.push_back(mixedTools::doubleToString( momentum_));
137  return sortie;
138}
139
140// void elementBend::FileInput(ifstream& ifs)
141// {
142//   ifs >> specificName_;
143//   ifs >> angleDeg_ >> radius_ >>  aperture_;
144//   ifs >> beta1_ >> beta2_ >> momentum_;
145//     lenghtElem_ = getLenghtOfElement();
146//     cout << " elementBend::FileInput calcule longueur = " << lenghtElem_ << endl;
147// }
148
149string elementBend::print() 
150{
151  string txt = "";
152  txt += specificName_;
153  txt += "\nangle (deg.) : ";
154  txt += mixedTools::doubleToString(angleDeg_);
155  txt += "\nradius (m) : ";
156  txt += mixedTools::doubleToString(radius_);
157  txt += "\nmomentum (MeV/c) : ";
158  txt += mixedTools::doubleToString(momentum_);
159  txt += "\nlength (cm) : ";
160  txt += mixedTools::doubleToString(lenghtElem_);
161  txt += "\naperture (cm) : ";
162  txt += mixedTools::doubleToString(aperture_);
163  txt += "\npole face rotations (deg.) entrance : ";
164  txt += mixedTools::doubleToString(beta1_);
165  txt += "\nexit : ";
166  txt += mixedTools::doubleToString(beta2_);
167  return txt;
168}
169void elementBend::FileAMLInput(UAPNode* entree) 
170{
171  if ( !checkAMLelementGenericName(entree) ) return;
172
173  AMLtools::readAMLParameterAttribut(entree, "length", "design", lenghtElem_);
174  AMLtools::readAMLParameterAttribut(entree, "momentum", "design", momentum_);
175
176  UAPNode* bend = entree->getChildByName("bend");
177  if ( !bend ) {
178    cout << " elementBend::FileAMLInput ERREUR pas de noeud AML <bend>  " << endl;
179    return;
180  }
181  AMLtools::readAMLParameterAttribut(bend, "g", "design", radius_);
182  // g = 1/r
183
184  if ( radius_ != 0.0 ) {
185    radius_ = 1./radius_;
186  // angle en degres, la longeur est en cm, le rayon en metres :
187    angleDeg_ = 0.01*lenghtElem_/(radius_*DEG_TO_RADIANS);
188  }
189  AMLtools::readAMLParameterAttribut(bend, "e1", "design", beta1_);
190  AMLtools::readAMLParameterAttribut(bend, "e2", "design", beta2_);
191
192
193  UAPNode* ouverture = entree->getChildByName("aperture");
194  if ( !ouverture ) {
195    cout << " elementBend::FileAMLInput ERREUR pas de noeud AML <aperture>  " << endl;
196    return;
197  }
198  AMLtools::readAMLParameterAttribut(ouverture, "xy_limit", "design", aperture_);
199
200
201
202
203}
204
205
206void elementBend::InputRep(UAPNode* root)
207{
208  // UAPNode* ele = root->addChild("element");
209  // ele->addAttribute("name",specificName_);
210  UAPNode* ele = setAMLelementHeader(root);
211
212  string txt = "";
213  txt = mixedTools::doubleToString(lenghtElem_);
214  ele->addChild("length")->addAttribute("design",txt);
215
216  // pour Parmela /aper : radius of aperture at exit (gap)
217  UAPNode* node = ele->addChild("aperture");
218  node->addAttribute("at","EXIT");
219  node->addAttribute("shape","CIRCLE");
220  txt = mixedTools::doubleToString(aperture_);
221  node->addChild("xy_limit")->addAttribute("design",txt);
222
223  // ??? encore pour Parmela /wt : ref energy
224  txt = mixedTools::doubleToString(momentum_);
225  ele->addChild("momentum")->addAttribute("design",txt);
226
227  node = ele->addChild("bend");
228
229  // bending field g= 1/r = angle/length : on en déduit angle= g*length
230  double g = 1.0/radius_;
231  txt = mixedTools::doubleToString(g);
232  node->addChild("g")->addAttribute("design",txt);
233
234  txt = mixedTools::doubleToString(beta1_);
235  node->addChild("e1")->addAttribute("design",txt);
236  txt = mixedTools::doubleToString(beta2_);
237  node->addChild("e2")->addAttribute("design",txt); 
238}
Note: See TracBrowser for help on using the repository browser.