251 {
252
253 std::ifstream gasfile;
254
255 gasfile.open(filename.c_str());
256
257 if (!gasfile.is_open()) {
259 << " Gas file could not be opened.\n";
260 return false;
261 }
262
263 char line[256];
264 char* token;
265
266
267 std::string gasBits = "";
268
269
270 const int nMagboltzGases = 60;
271 std::vector<double> mixture(nMagboltzGases, 0.);
272
273 int excCount = 0;
274 int ionCount = 0;
275
276 int eFieldRes = 1;
277 int bFieldRes = 1;
278 int angRes = 1;
279
280 int version = 12;
281
282
283 bool atTables = false;
284 while (!atTables) {
285 gasfile.getline(line, 256);
286 if (strncmp(line, " The gas tables follow:", 8) == 0 ||
287 strncmp(line, "The gas tables follow:", 7) == 0) {
288 atTables = true;
290 std::cout << " Entering tables.\n";
291 getchar();
292 }
293 }
295 std::cout << " Line: " << line << "\n";
296 getchar();
297 }
298 if (!atTables) {
299 token = strtok(line, " :,%");
300 while (token) {
301 if (
m_debug) std::cout <<
" Token: " << token <<
"\n";
302 if (strcmp(token, "Version") == 0) {
303 token = strtok(NULL, " :,%");
304 version = atoi(token);
305
306 if (version != 10 && version != 11 && version != 12) {
308 << " The file has version number " << version << ".\n"
309 << " Files written in this format cannot be read.\n";
310 gasfile.close();
311 return false;
312 } else {
314 << " Version: " << version << "\n";
315 }
316 } else if (strcmp(token, "GASOK") == 0) {
317
318
319 token = strtok(NULL, " :,%\t");
320 token = strtok(NULL, " :,%\t");
321 gasBits += token;
322 } else if (strcmp(token, "Identifier") == 0) {
323
324 std::string identifier = "";
325 token = strtok(NULL, "\n");
326 if (token != NULL) identifier += token;
329 << " Identifier: " << token << "\n";
330 }
331 } else if (strcmp(token, "Dimension") == 0) {
332 token = strtok(NULL, " :,%\t");
333 if (strcmp(token, "F") == 0) {
335 } else {
337 }
338 token = strtok(NULL, " :,%\t");
339 eFieldRes = atoi(token);
340
341 if (eFieldRes <= 0) {
343 << " Number of E fields out of range.\n";
344 gasfile.close();
345 return false;
346 }
347 token = strtok(NULL, " :,%\t");
348 angRes = atoi(token);
349
352 << " Number of E-B angles out of range.\n";
353 gasfile.close();
354 return false;
355 }
356
357 token = strtok(NULL, " :,%\t");
358 bFieldRes = atoi(token);
359
360 if (
m_map2d && bFieldRes <= 0) {
362 << " Number of B fields out of range.\n";
363 gasfile.close();
364 return false;
365 }
366
370
371
372
373 token = strtok(NULL, " :,%\t");
374 if (
m_debug) std::cout <<
" " << token <<
"\n";
376 const int nexc = atoi(token);
378
379 token = strtok(NULL, " :,%\t");
380 const int nion = atoi(token);
384 std::cout << " " << nexc << " excitations, "
385 << nion << " ionisations.\n";
386 }
387 } else if (strcmp(token, "E") == 0) {
388 token = strtok(NULL, " :,%");
389 if (strcmp(token, "fields") == 0) {
390 for (
int i = 0; i < eFieldRes; ++i) gasfile >>
m_eFields[i];
391 }
392 } else if (strcmp(token, "E-B") == 0) {
393 token = strtok(NULL, " :,%");
394 if (strcmp(token, "angles") == 0) {
395 for (
int i = 0; i < angRes; ++i) gasfile >>
m_bAngles[i];
396 }
397 } else if (strcmp(token, "B") == 0) {
398 token = strtok(NULL, " :,%");
399 if (strcmp(token, "fields") == 0) {
400 double bstore = 0.;
401 for (int i = 0; i < bFieldRes; i++) {
402
403 gasfile >> bstore;
405 }
406 }
407 } else if (strcmp(token, "Mixture") == 0) {
408 for (int i = 0; i < nMagboltzGases; ++i) {
409 gasfile >> mixture[i];
410 }
411 } else if (strcmp(token, "Excitation") == 0) {
412
413 token = strtok(NULL, " :,%");
414
415 token = strtok(NULL, " :,%");
417
418 token = strtok(NULL, " :,%");
420
421 token = strtok(NULL, " :,%");
425 if (version >= 11) {
426
427 token = strtok(NULL, " :,%");
428 if (token) {
430
431 token = strtok(NULL, " :,%");
433 }
434 }
435
436 ++excCount;
437 } else if (strcmp(token, "Ionisation") == 0) {
438
439 token = strtok(NULL, " :,%");
440
441 token = strtok(NULL, " :,%");
443
444 token = strtok(NULL, " :,%");
446
447 ++ionCount;
448 }
449 token = strtok(NULL, " :,%");
450 }
451 }
452 }
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
475 std::cout << " GASOK bits: " << gasBits << "\n";
476 }
477
478 if (gasBits[0] == 'T') {
481 } else {
484 }
485 if (gasBits[1] == 'T') {
488 } else {
491 }
492 if (gasBits[2] == 'T') {
495 } else {
498 }
499 if (gasBits[3] == 'T') {
502 } else {
505 }
506
507 if (gasBits[5] == 'T') {
510 } else {
513 }
514 if (gasBits[6] == 'T') {
517 } else {
520 }
521 if (gasBits[7] == 'T') {
524 } else {
527 }
528 if (gasBits[8] == 'T') {
531 } else {
534 }
535 if (gasBits[9] == 'T') {
538 } else {
541 }
542 if (gasBits[10] == 'T') {
545 } else {
548 }
549 if (gasBits[11] == 'T') {
552 } else {
555 }
556
557
558 if (gasBits[14] == 'T') {
562 0.);
563 } else {
566 }
567 if (gasBits[15] == 'T') {
571 0.);
572 } else {
575 }
576
577
578 std::vector<std::string> gasnames;
579 std::vector<double> percentages;
580 bool gasMixOk = true;
581 unsigned int gasCount = 0;
582 for (int i = 0; i < nMagboltzGases; ++i) {
583 if (mixture[i] > 0.) {
584 std::string gasname = "";
587 std::cerr << " Unknown gas (gas number ";
588 std::cerr << i + 1 << ")\n";
589 gasMixOk = false;
590 break;
591 }
592 gasnames.push_back(gasname);
593 percentages.push_back(mixture[i]);
594 ++gasCount;
595 }
596 }
599 std::cerr << " Gas mixture has " << gasCount << " components.\n";
600 std::cerr <<
" Number of gases is limited to " <<
m_nMaxGases <<
".\n";
601 gasMixOk = false;
602 } else if (gasCount == 0) {
604 std::cerr << " Gas mixture is not defined (zero components).\n";
605 gasMixOk = false;
606 }
607 double sum = 0.;
608 for (unsigned int i = 0; i < gasCount; ++i) sum += percentages[i];
609 if (gasMixOk && sum != 100.) {
611 std::cerr << " Percentages are not normalized to 100.\n";
612 for (unsigned int i = 0; i < gasCount; ++i) percentages[i] *= 100. / sum;
613 }
614
615
617
618 if (gasMixOk) {
624 m_gas[i] = gasnames[i];
627 }
629 std::cout <<
" Gas composition set to " <<
m_name;
634 }
635 std::cout << ")";
636 }
637 std::cout << "\n";
638 } else {
640 std::cerr << " Gas composition could not be established.\n";
641 }
642
645 std::cout << " Reading gas tables.\n";
646 }
647
648
649
650 double ve = 0., vb = 0., vexb = 0.;
651
652 double lor = 0.;
653
654 double dl = 0., dt = 0.;
655
656 double alpha = 0., alpha0 = 0., eta = 0.;
657
658 double mu = 0., diss = 0.;
659 double ionDiffLong = 0., ionDiffTrans = 0.;
660 double diff = 0.;
661 double rate = 0.;
662 double waste = 0.;
663
667 std::cout << " Gas table is 3D.\n";
668 }
669 for (int i = 0; i < eFieldRes; i++) {
670 for (int j = 0; j < angRes; j++) {
671 for (int k = 0; k < bFieldRes; k++) {
672
673 gasfile >> ve >> vb >> vexb;
674
675 ve *= 1.e-3;
676 vb *= 1.e-3;
677 vexb *= 1.e-3;
681
682 gasfile >> dl >> dt;
685
686 gasfile >>
alpha >> alpha0 >> eta;
690 }
693 }
694
695 gasfile >> mu;
696
697 mu *= 1.e-3;
699
700 gasfile >> lor;
702
703 gasfile >> diss;
705
706 for (int l = 0; l < 6; l++) {
707 gasfile >> diff;
709 }
710
712 for (unsigned int l = 0; l < nexc; ++l) {
713 gasfile >> rate;
715 }
716
718 for (unsigned int l = 0; l < nion; ++l) {
719 gasfile >> rate;
721 }
722 }
723 }
724 }
725 } else {
728 std::cout << " Gas table is 1D.\n";
729 }
730 for (int i = 0; i < eFieldRes; i++) {
731 if (
m_debug) std::cout <<
" Done table: " << i <<
"\n";
732
733 gasfile >> ve >> waste >> vb >> waste >> vexb >> waste;
734 ve *= 1.e-3;
735 vb *= 1.e-3;
736 vexb *= 1.e-3;
740
741 gasfile >> dl >> waste >> dt >> waste;
744
745 gasfile >>
alpha >> waste >> alpha0 >> eta >> waste;
749 }
752 }
753
754 gasfile >> mu >> waste;
755 mu *= 1.e-3;
757
758 gasfile >> lor >> waste;
760
761 gasfile >> diss >> waste;
763
764 for (int j = 0; j < 6; j++) {
765 gasfile >> diff >> waste;
767 }
768
770 for (unsigned int j = 0; j < nexc; ++j) {
771 gasfile >> rate >> waste;
773 }
774
776 for (unsigned int j = 0; j < nion; ++j) {
777 gasfile >> rate >> waste;
779 }
780 }
781 }
782 if (
m_debug) std::cout <<
" Done with gas tables.\n";
783
784
785 int hExtrap[13], lExtrap[13];
786
787 int interpMeth[13];
788
789
790 bool done = false;
791 while (!done) {
792 gasfile.getline(line, 256);
793 token = strtok(line, " :,%=\t");
794 while (token != NULL) {
795 if (strcmp(token, "H") == 0) {
796 token = strtok(NULL, " :,%=\t");
797 for (int i = 0; i < 13; i++) {
798 token = strtok(NULL, " :,%=\t");
799 if (token != NULL) hExtrap[i] = atoi(token);
800 }
801 } else if (strcmp(token, "L") == 0) {
802 token = strtok(NULL, " :,%=\t");
803 for (int i = 0; i < 13; i++) {
804 token = strtok(NULL, " :,%=\t");
805 if (token != NULL) lExtrap[i] = atoi(token);
806 }
807 } else if (strcmp(token, "Thresholds") == 0) {
808 token = strtok(NULL, " :,%=\t");
810 token = strtok(NULL, " :,%=\t");
812 token = strtok(NULL, " :,%=\t");
814 } else if (strcmp(token, "Interp") == 0) {
815 for (int i = 0; i < 13; i++) {
816 token = strtok(NULL, " :,%=\t");
817 if (token != NULL) interpMeth[i] = atoi(token);
818 }
819 } else if (strcmp(token, "A") == 0) {
820 token = strtok(NULL, " :,%=\t");
821
822
823
824 } else if (strcmp(token, "Z") == 0) {
825
826 token = strtok(NULL, " :,%=\t");
827
828
829 } else if (strcmp(token, "EMPROB") == 0) {
830
831 token = strtok(NULL, " :,%=\t");
832
833
834 } else if (strcmp(token, "EPAIR") == 0) {
835
836 token = strtok(NULL, " :,%=\t");
837
838
839 } else if (strcmp(token, "Ion") == 0) {
840
841 token = strtok(NULL, " :,%=\t");
842 token = strtok(NULL, " :,%=\t");
843 if (token != NULL) ionDiffLong = atof(token);
844 token = strtok(NULL, " :,%=\t");
845 if (token != NULL) ionDiffTrans = atof(token);
846 } else if (strcmp(token, "CMEAN") == 0) {
847
848 token = strtok(NULL, " :,%=\t");
849
850
851 } else if (strcmp(token, "RHO") == 0) {
852
853 token = strtok(NULL, " :,%=\t");
854
855
856 } else if (strcmp(token, "PGAS") == 0) {
857 token = strtok(NULL, " :,%=\t");
858 double pTorr = 760.;
859 if (token != NULL) pTorr = atof(token);
861 } else if (strcmp(token, "TGAS") == 0) {
862 token = strtok(NULL, " :,%=\t");
863 double tKelvin = 293.15;
864 if (token != NULL) tKelvin = atof(token);
866 done = true;
867 break;
868 } else {
869 done = true;
870 break;
871 }
872 token = strtok(NULL, " :,%=\t");
873 }
874 }
875
876 gasfile.close();
877
878
881
882
883 for (int i = eFieldRes; i--;) {
885 }
886
889 for (int i = eFieldRes; i--;) {
890 for (int j = angRes; j--;) {
891 for (int k = bFieldRes; k--;) {
894 }
897 }
899 for (int l = 6; l--;) {
901 }
902 }
905 }
908 }
911 }
912 }
913 }
914 }
915
916
920
936
940
947
948
949 if (ionDiffLong > 0.) {
952 for (int i = eFieldRes; i--;) {
953 for (int j = angRes; j--;) {
954 for (int k = bFieldRes; k--;) {
956 }
957 }
958 }
959 } else {
962 }
963 if (ionDiffTrans > 0.) {
966 for (int i = eFieldRes; i--;) {
967 for (int j = angRes; j--;) {
968 for (int k = bFieldRes; k--;) {
970 }
971 }
972 }
973 } else {
976 }
977
980 std::cout << " Gas file sucessfully read.\n";
981 }
982
983 return true;
984}
std::vector< excListElement > m_excitationList
bool GetGasName(const int gasnumber, const int version, std::string &gasname)
std::vector< std::vector< std::vector< double > > > m_tabTownsendNoPenning
std::vector< std::vector< std::vector< std::vector< double > > > > m_tabIonRates
std::vector< ionListElement > m_ionisationList
std::vector< std::vector< std::vector< std::vector< double > > > > m_tabExcRates
bool m_hasElectronDiffTens
unsigned int m_extrLowMobility
std::vector< double > m_bFields
unsigned int m_intpDiffusion
unsigned int m_extrLowDiffusion
bool m_hasElectronDiffTrans
unsigned int m_extrLowLorentzAngle
std::vector< std::vector< std::vector< double > > > tabElectronVelocityB
unsigned int m_extrHighAttachment
unsigned int m_intpMobility
unsigned int m_intpAttachment
bool m_hasElectronVelocityB
unsigned int m_extrHighDiffusion
std::vector< std::vector< std::vector< double > > > tabIonDissociation
unsigned int m_extrHighMobility
std::vector< std::vector< std::vector< double > > > tabElectronVelocityE
unsigned int m_intpTownsend
unsigned int m_extrLowAttachment
unsigned int m_extrHighDissociation
void InitParamArrays(const unsigned int eRes, const unsigned int bRes, const unsigned int aRes, std::vector< std::vector< std::vector< double > > > &tab, const double val)
unsigned int m_intpVelocity
std::vector< std::vector< std::vector< double > > > tabElectronDiffLong
std::vector< std::vector< std::vector< double > > > tabElectronLorentzAngle
unsigned int m_extrHighLorentzAngle
std::vector< std::vector< std::vector< double > > > tabElectronAttachment
unsigned int m_extrLowVelocity
unsigned int m_extrHighTownsend
unsigned int m_extrHighVelocity
unsigned int m_extrLowTownsend
std::vector< double > m_eFields
std::vector< std::vector< std::vector< double > > > tabIonDiffTrans
unsigned int m_extrLowDissociation
std::vector< std::vector< std::vector< std::vector< double > > > > tabElectronDiffTens
std::vector< double > m_bAngles
void InitParamTensor(const unsigned int eRes, const unsigned int bRes, const unsigned int aRes, const unsigned int tRes, std::vector< std::vector< std::vector< std::vector< double > > > > &tab, const double val)
bool m_hasElectronVelocityExB
std::vector< std::vector< std::vector< double > > > tabIonMobility
bool m_hasElectronLorentzAngle
int thrElectronAttachment
bool m_hasElectronDiffLong
unsigned int m_intpLorentzAngle
std::vector< std::vector< std::vector< double > > > tabIonDiffLong
bool m_hasIonDissociation
unsigned int m_intpDissociation
bool m_hasElectronVelocityE
std::vector< std::vector< std::vector< double > > > tabElectronTownsend
bool m_hasElectronAttachment
std::vector< std::vector< std::vector< double > > > tabElectronDiffTrans
std::vector< std::vector< std::vector< double > > > tabElectronVelocityExB
DoubleAc sqrt(const DoubleAc &f)