68const double struktura::c = 300 * sqrtl(9.10956 / 1.60219);
80warstwa::warstwa(
double m_p,
double m_r,
double x_p,
double y_p,
double x_k,
double y_k,
double niepar,
double niepar2)
81 : x_pocz(x_p /
struktura::przelm), x_kon(x_k /
struktura::przelm), y_pocz(y_p), y_kon(y_k), nieparab(niepar),
82 nieparab_2(niepar2), m_p(m_p), nast(
NULL), masa_r(m_r)
88 Error err(
"Zle dane!\n");
89 err <<
"pocz = " << x_p <<
"\tkoniec = " << x_k <<
"\tmasa_p = " << m_p <<
"\n";
93 pole = (y_kon - y_pocz) / (x_kon - x_pocz);
97 :
warstwa(m_p, m_r, (lczyp == lewa) ? x0 - 1 : x0, y0, (lczyp == lewa) ? x0 : x0 + 1, y0), lp(lczyp), masa_p(m_p),
98 masa_r(m_r), iks(x0 /
struktura::przelm), y(y0)
105 :
warstwa(war.masa_p, war.masa_r, (war.lp == lewa) ? war.iks - 1 : war.iks, war.y,
106 (war.lp == lewa) ? war.iks : war.iks + 1, war.y),
107 lp(war.lp), iks(war.iks), y(war.y)
113inline double warstwa::masa_p(
double E)
const
116 double Ek = E - (y_pocz + y_kon) / 2;
117 if((nieparab == 0 && nieparab_2 == 0) || Ek < 0)
123 if((nieparab_2 < 0) && (Ek > -nieparab / (2 * nieparab_2)))
124 wynik = m_p * (1. - nieparab * nieparab / (4 * nieparab_2));
126 wynik = (1. + nieparab * Ek + nieparab_2 * Ek * Ek) * m_p;
152 wartosc =
tryga(x, E);
157 wartosc =
expa(x, E);
197 wartosc =
trygb(x, E);
201 wartosc =
expb(x, E);
231 if((y_kon != y_pocz) || (E < y_pocz))
234 err <<
"Zla funkcja (tryga)!\n";
237 double k =
sqrt(2 * masa_p(E) * (E - y_pocz));
243 if((y_kon != y_pocz) || (E < y_pocz))
246 err <<
"Zla funkcja (tryga_prim)!\n";
249 double k =
sqrt(2 * masa_p(E) * (E - y_pocz));
250 return k * cos(k * x);
255 if((y_kon != y_pocz) || (E < y_pocz))
258 err <<
"Zla funkcja (trygb)!\n";
261 double k =
sqrt(2 * masa_p(E) * (E - y_pocz));
267 if((y_kon != y_pocz) || (E < y_pocz))
270 err <<
"Zla funkcja (trygb_prim)!\n";
273 double k =
sqrt(2 * masa_p(E) * (E - y_pocz));
274 return -k * sin(k * x);
277double warstwa::tryg_kwadr_pierwotna(
double x,
double E,
double A,
double B)
const
279 if((y_kon != y_pocz) || (E <= y_pocz))
282 err <<
"Zla funkcja (tryg_kwadr_pierwotna)!\n";
285 double k =
sqrt(2 * masa_p(E) * (E - y_pocz));
286 double si2 = sin(2 * k * x);
287 double co = cos(k * x);
288 return (A * A + B * B) * x / 2 + (si2 * (B * B - A * A) / 4 - A * B * co * co) / k;
293 if((y_kon != y_pocz) || (E > y_pocz))
296 err <<
"Zla funkcja (expa)!\n";
299 double kp =
sqrt(2 * masa_p(E) * (y_pocz - E));
300 return exp(-kp * (x - x_pocz));
305 if((y_kon != y_pocz) || (E > y_pocz))
308 err <<
"Zla funkcja (expa_prim)!\n";
311 double kp =
sqrt(2 * masa_p(E) * (y_pocz - E));
312 return -kp * exp(-kp * (x - x_pocz));
317 if((y_kon != y_pocz) || (E > y_pocz))
320 err <<
"Zla funkcja (expb)!\n"
321 <<
"y_pocz = " << y_pocz <<
"\ty_kon = " << y_kon <<
"\n";
324 double kp =
sqrt(2 * masa_p(E) * (y_pocz - E));
325 return exp(kp * (x - x_kon));
330 if((y_kon != y_pocz) || (E > y_pocz))
333 err <<
"Zla funkcja (expb_prim)!\n";
336 double kp =
sqrt(2 * masa_p(E) * (y_pocz - E));
337 return kp * exp(kp * (x - x_kon));
340double warstwa::exp_kwadr_pierwotna(
double x,
double E,
double A,
double B)
const
342 if((y_kon != y_pocz) || (E > y_pocz))
345 err <<
"Zla funkcja (expa)!\n";
348 double kp =
sqrt(2 * masa_p(E) * (y_pocz - E));
349 double b =
expb(x, E);
350 double a =
expa(x, E);
351 return (B * B *
b *
b - A * A * a * a) / (2 * kp) + 2 * A * B * x * exp(kp * (x_pocz - x_kon));
359 err <<
"Zla funkcja!\n";
366 double U = y_pocz - pole * x_pocz;
367 double a13 = (pole > 0) ?
pow(2 * masa_p(E) * pole, 1. / 3) : -
pow(-2 * masa_p(E) * pole, 1. / 3);
368 double b_a23 = (U - E) / pole;
369 double arg = a13 * (x + b_a23);
371 return gsl_sf_airy_Ai(arg, GSL_PREC_DOUBLE);
379 err <<
"Zla funkcja!\n";
386 double U = y_pocz - pole * x_pocz;
387 double a13 = (pole > 0) ?
pow(2 * masa_p(E) * pole, 1. / 3) : -
pow(-2 * masa_p(E) * pole, 1. / 3);
388 double b_a23 = (U - E) / pole;
389 double arg = a13 * (x + b_a23);
390 double arg_pocz = a13 * (x_pocz + b_a23);
391 double przeskal = 1.0;
392 if(arg > 0 && arg_pocz > 0)
394 przeskal = exp(-2 * (
pow(arg, 3. / 2) -
pow(arg_pocz, 3. / 2)) / 3);
400 przeskal = exp(-2 *
pow(arg, 3. / 2) / 3);
404 przeskal = exp(2 *
pow(arg_pocz, 3. / 2) / 3);
408 return gsl_sf_airy_Ai_scaled(arg, GSL_PREC_DOUBLE) * przeskal;
416 err <<
"Zla funkcja!\n";
419 double U = y_pocz - pole * x_pocz;
420 double a13 = (pole > 0) ?
pow(2 * masa_p(E) * pole, 1. / 3) : -
pow(-2 * masa_p(E) * pole, 1. / 3);
421 double b_a23 = (U - E) / pole;
422 double arg = a13 * (x + b_a23);
426 return a13 * gsl_sf_airy_Ai_deriv(arg, GSL_PREC_DOUBLE);
434 err <<
"Zla funkcja!\n";
437 double U = y_pocz - pole * x_pocz;
438 double a13 = (pole > 0) ?
pow(2 * masa_p(E) * pole, 1. / 3) : -
pow(-2 * masa_p(E) * pole, 1. / 3);
439 double b_a23 = (U - E) / pole;
440 double arg = a13 * (x + b_a23);
444 double arg_pocz = a13 * (x_pocz + b_a23);
445 double przeskal = 1.0;
446 if(arg > 0 && arg_pocz > 0)
448 przeskal = exp(-2 * (
pow(arg, 3. / 2) -
pow(arg_pocz, 3. / 2)) / 3);
454 przeskal = exp(-2 *
pow(arg, 3. / 2) / 3);
458 przeskal = exp(2 *
pow(arg_pocz, 3. / 2) / 3);
461 return a13 * gsl_sf_airy_Ai_deriv_scaled(arg, GSL_PREC_DOUBLE) * przeskal;
469 err <<
"Zla funkcja!\n";
476 double U = y_pocz - pole * x_pocz;
477 double a13 = (pole > 0) ?
pow(2 * masa_p(E) * pole, 1. / 3) : -
pow(-2 * masa_p(E) * pole, 1. / 3);
478 double b_a23 = (U - E) / pole;
479 double arg = a13 * (x + b_a23);
481 return gsl_sf_airy_Bi(arg, GSL_PREC_DOUBLE);
489 err <<
"Zla funkcja!\n";
496 double U = y_pocz - pole * x_pocz;
497 double a13 = (pole > 0) ?
pow(2 * masa_p(E) * pole, 1. / 3) : -
pow(-2 * masa_p(E) * pole, 1. / 3);
498 double b_a23 = (U - E) / pole;
499 double arg = a13 * (x + b_a23);
501 double arg_pocz = a13 * (x_pocz + b_a23);
502 double przeskal = 1.0;
503 if(arg > 0 && arg_pocz > 0)
505 przeskal = exp(-2 * (
pow(arg, 3. / 2) -
pow(arg_pocz, 3. / 2)) / 3);
511 przeskal = exp(-2 *
pow(arg, 3. / 2) / 3);
515 przeskal = exp(2 *
pow(arg_pocz, 3. / 2) / 3);
518 return gsl_sf_airy_Bi_scaled(arg, GSL_PREC_DOUBLE) / przeskal;
526 err <<
"Zla funkcja!\n";
529 double U = y_pocz - pole * x_pocz;
530 double a13 = (pole > 0) ?
pow(2 * masa_p(E) * pole, 1. / 3) : -
pow(-2 * masa_p(E) * pole, 1. / 3);
531 double b_a23 = (U - E) / pole;
532 double arg = a13 * (x + b_a23);
534 return a13 * gsl_sf_airy_Bi_deriv(arg, GSL_PREC_DOUBLE);
542 err <<
"Zla funkcja!\n";
545 double U = y_pocz - pole * x_pocz;
546 double a13 = (pole > 0) ?
pow(2 * masa_p(E) * pole, 1. / 3) : -
pow(-2 * masa_p(E) * pole, 1. / 3);
547 double b_a23 = (U - E) / pole;
548 double arg = a13 * (x + b_a23);
550 double arg_pocz = a13 * (x_pocz + b_a23);
551 double przeskal = 1.0;
552 if(arg > 0 && arg_pocz > 0)
554 przeskal = exp(-2 * (
pow(arg, 3. / 2) -
pow(arg_pocz, 3. / 2)) / 3);
560 przeskal = exp(-2 *
pow(arg, 3. / 2) / 3);
564 przeskal = exp(2 *
pow(arg_pocz, 3. / 2) / 3);
567 return a13 * gsl_sf_airy_Bi_deriv_scaled(arg, GSL_PREC_DOUBLE) / przeskal;
570double warstwa::airy_kwadr_pierwotna(
double x,
double E,
double A,
double B)
const
575 err <<
"Zla funkcja!\n";
578 double U = y_pocz - pole * x_pocz;
579 double b_a23 = (U - E) / pole;
580 double a = 2 * masa_p(E) * pole;
583 return (x + b_a23) * f * f - fp * fp / a;
592 err <<
"Jesze nie ma airych!\n";
597 wartosc = 2 * masa_p(E) * (E - y_pocz);
602int warstwa::zera_ffal(
double E,
double A,
double B,
double sasiad_z_lewej,
double sasiad_z_prawej)
607 (funkcjafal(x_kon, E, A, B) + sasiad_z_prawej) / 2;
609 double wart_pocz = (funkcjafal(x_pocz, E, A, B) + sasiad_z_lewej) / 2;
610 double iloczyn = wart_pocz * wart_kon;
615 double a13 = (pole > 0) ?
pow(2 * masa_p(E) * pole, 1. / 3) : -
pow(-2 * masa_p(E) * pole, 1. / 3);
616 double U = y_pocz - pole * x_pocz;
617 double b_a23 = (U - E) / pole;
618 double arg1, arg2, argl, argp, x1, x2, xlew, xpra;
620 arg1 = a13 * (x_pocz + b_a23);
621 arg2 = a13 * (x_kon + b_a23);
624 argl =
min(arg1, arg2);
625 argp =
max(arg1, arg2);
631 nrprzed = floor((argp - z1) / dz + 1);
632 nrprzed = (nrprzed >= 1) ? nrprzed : 1;
634 double ntezero = gsl_sf_airy_zero_Bi(nrprzed);
640 while(ntezero >= argp)
644 dz = ntezero - gsl_sf_airy_zero_Bi(nrprzed - 1);
645 brak = (argp - ntezero) / dz;
648 nrprzed = nrprzed + floor(brak);
655 ntezero = gsl_sf_airy_zero_Bi(nrprzed);
663 while(gsl_sf_airy_zero_Bi(nrza) >= argl)
678 if(nrza - nrprzed >= 2)
680 tymcz = nrza - nrprzed - 2;
681 x1 = -b_a23 + gsl_sf_airy_zero_Bi(nrprzed + 1) / a13;
682 x2 = -b_a23 + gsl_sf_airy_zero_Bi(nrza - 1) / a13;
690 if(wart_pocz * funkcjafal(xlew, E, A, B) < 0)
693 if(wart_kon * funkcjafal(xpra, E, A, B) < 0)
712 double k =
sqrt(2 * masa_p(E) * (E - y_pocz));
713 tylezer = int(k * (x_kon - x_pocz) /
M_PI);
742int warstwa::zera_ffal(
double E,
double A,
double B)
const
746 double iloczyn =
funkcjafal(x_pocz, E, A, B) * wart_kon;
750 double a13 = (pole > 0) ?
pow(2 * masa_p(E) * pole, 1. / 3) : -
pow(-2 * masa_p(
E) * pole, 1. / 3);
751 double U = y_pocz - pole * x_pocz;
752 double b_a23 = (
U -
E) / pole;
753 double arg1, arg2, argl, argp, x1, x2, xlew, xpra;
755 arg1 = a13 * (x_pocz + b_a23);
756 arg2 = a13 * (x_kon + b_a23);
759 argl =
min(arg1, arg2);
760 argp =
max(arg1, arg2);
766 nrprzed = floor((argp - z1) / dz + 1);
767 nrprzed = (nrprzed >= 1) ? nrprzed : 1;
769 double ntezero = gsl_sf_airy_zero_Bi(nrprzed);
775 while(ntezero >= argp)
779 dz = ntezero - gsl_sf_airy_zero_Bi(nrprzed - 1);
780 brak = (argp - ntezero) / dz;
783 nrprzed = nrprzed + floor(brak);
790 ntezero = gsl_sf_airy_zero_Bi(nrprzed);
798 while(gsl_sf_airy_zero_Bi(nrza) >= argl)
813 if(nrza - nrprzed >= 2)
815 tymcz = nrza - nrprzed - 2;
816 x1 = -b_a23 + gsl_sf_airy_zero_Bi(nrprzed + 1) / a13;
817 x2 = -b_a23 + gsl_sf_airy_zero_Bi(nrza - 1) / a13;
837 if(
funkcjafal(x_pocz, E, A, B) * wart_kon < 0)
849 double k =
sqrt(2 * masa_p(E) * (E - y_pocz));
850 tylezer = int(k * (x_kon - x_pocz) /
M_PI);
875 std::cerr <<
"\nE = " <<
E <<
"\tiloczyn = " << iloczyn <<
"\t zer jest " << tylezer;
889stan::stan(
double E, std::vector<parad> & W,
int lz)
893 wspolczynniki.resize(2*(M-2) + 2);
894 wspolczynniki[0] = W[0].second;
895 for(
int i = 1; i <= M-2; i++)
897 wspolczynniki[2*i-1] = W[i].first;
898 wspolczynniki[2*i] = W[i].second;
900 wspolczynniki[2*M-3] = W[M-1].first;
908 double masa = masa_p(E);
909 double mian = (ffala_prim(x_pocz, E)*ffalb(x_pocz, E) - ffalb_prim(x_pocz, E)*ffala(x_pocz, E));
910 double A = (-w*ffalb_prim(x_pocz, E) + masa*wp*ffalb(x_pocz, E)) / mian;
911 double B = - (-w*ffala_prim(x_pocz, E) + masa*wp*ffala(x_pocz, E)) / mian;
918 double masa = masa_p;
919 double mian = (expa_prim(iks, E)*expb(iks, E) - expb_prim(iks, E)*expa(iks, E));
920 double A = (-w*expb_prim(iks, E) + masa*wp*expb(iks, E)) / mian;
921 double B = - (-w*expa_prim(iks, E) + masa*wp*expa(iks, E)) / mian;
937 for(
int i = 0; i <= (int)kawalki.size() - 1; i++)
962 std::vector<parad> wspolczynniki;
967 wspolczynniki.push_back(
parad(0.0, 1.0));
968 for(
int i = 0; i <= (int)kawalki.size() - 1; i++)
972 wspolczynniki.push_back(AB);
979 wspolczynniki.push_back(AB);
980 return wspolczynniki;
985 int N = kawalki.size() + 2;
992 }
while(pierwsza <=
N-3 && (kawalki[pierwsza].y_pocz > E && kawalki[pierwsza].y_kon > E) );
997 }
while(ostatnia >= 0 && (kawalki[ostatnia].y_pocz > E && kawalki[ostatnia].y_kon > E) );
999 if(ostatnia == pierwsza)
1001 A = W[pierwsza+1].first;
1002 B = W[pierwsza+1].second;
1003 sumazer += kawalki[pierwsza].zera_ffal(E, A, B);
1020 sumazer += kawalki[j].zera_ffal(E, A, B);
1022 for(
int j = pierwsza + 1; j <= ostatnia; j++)
1026 sumazer += kawalki[j].zera_ffal(E, A, B);
1065 if(B0*
B1 > 0 && abs(B0) < abs(
B1))
1073 while(B0*
B1 > 0 && abs(B0) > abs(
B1))
1081 double wyn = bisekcja(
fun, (std::min)(E, E1), (std::max)(E, E1), 1
e-15);
1087 std::list<stan> listast;
1088 std::list<stan>::iterator itostd, itnastd;
1089 std::list<stan>::iterator iter;
1093 std::cerr<<
"ZÅ‚y zakres energii!\n";
1096 int M = 2*(kawalki.size() + 2) - 2;
1099 std::vector<double> trojka;
1100 std::clog<<
"W szukaniu, E_pocz = "<<Ek<<
"\n";
1102 std::clog<<
"Pierwsza wartosc = "<<wartpop<<
"\n";
1105 std::vector<parad> wspolcz;
1111 double mnozdorozdz = 1e3;
1118 E = Ek - rozdz*mnozdorozdz;
1120 while( (E > E0) && (wartpop*wartakt > 0) )
1124 E -= rozdz*mnozdorozdz;
1129 std::cerr<<
"Nie znalazł nawet jednego poziomu!\n";
1132 std::clog<<
"Bisekcja z krancami "<<E<<
" i "<<Epop<<
"\n";
1133 double Eost = bisekcja(
fun, E, Epop);
1141 ilepoziomow = liczbazer + 1;
1142 stan nowy =
stan(Eost, wspolcz, ilepoziomow - 1);
1144 listast.push_back(nowy);
1145 itostd = listast.end();
1148 std::clog<<
" Eost = "<<Eost<<
" ilepoziomow = "<<ilepoziomow<<
"\n";
1149 punkt ost, ostdob, pierw;
1150 itnastd = listast.begin();
1153 while((
int)listast.size() < ilepoziomow)
1157 E = ostdob.
en - rozdz;
1160 E = (itnastd != itostd)?(itnastd->poziom + rozdz):(E0 + rozdz);
1165 std::clog<<
"Zagęszczanie z pierw = "<<pierw.
en<<
" i ost = "<<ost.
en<<
"\n";
1170 for(
int i = 1; i >= 0; i--)
1172 E = bisekcja(
fun, trojka[i], trojka[i+1]);
1177 nowy =
stan(E, wspolcz, liczbazer);
1178 std::clog<<
"E = "<<E<<
" zer jest "<<liczbazer<<
"\n";
1179 listast.insert(iter, nowy);
1186 std::clog<<
"Nie znalazł a powinien\n";
1192 E = bisekcja(
fun, pierw.
en, ost.
en);
1197 nowy =
stan(E, wspolcz, liczbazer);
1198 listast.insert(itostd, nowy);
1200 while((itostd != listast.begin()) && (itostd->liczba_zer <= std::prev(itostd)->liczba_zer + 1))
1202 if(itostd->liczba_zer < std::prev(itostd)->liczba_zer + 1)
1204 std::clog<<
"\nKÅ‚opot z miejscami zerowymi: E1 = "<<(itostd->poziom)<<
" zer "<<(itostd->liczba_zer)<<
"\nE2 = "<<(std::prev(itostd)->poziom)<<
" zer "<<(std::prev(itostd)->liczba_zer)<<
"\n";
1209 itnastd = (itostd == listast.begin())?listast.begin():std::prev(itostd);
1210 std::clog<<
"ostatnie_dobre = "<<(itostd->liczba_zer)<<
" nastepne_dobre = "<<(itnastd->liczba_zer)<<
"\n";
1215 iter = listast.begin();
1216 while(iter != listast.end())
1219 std::clog<<
"zera = "<<(iter->liczba_zer)<<
"\tE = "<<(iter->poziom)<<
"\n";
1226 std::list<stan> listast;
1227 std::list<stan>::iterator itostd, itnastd;
1228 std::list<stan>::iterator iter;
1232 std::cerr<<
"ZÅ‚y zakres energii!\n";
1235 int M = 2*(kawalki.size() + 2) - 2;
1238 std::vector<double> trojka;
1239 std::clog<<
"W szukaniu, E_pocz = "<<Ek<<
"\n";
1241 std::clog<<
"Pierwsza wartosc = "<<wartpop<<
"\n";
1244 std::vector<parad> wspolcz;
1250 double mnozdorozdz = 1e3;
1257 E = Ek - rozdz*mnozdorozdz;
1259 while( (E > E0) && (wartpop*wartakt > 0) )
1263 E -= rozdz*mnozdorozdz;
1268 std::cerr<<
"Nie znalazł nawet jednego poziomu!\n";
1271 std::clog<<
"Bisekcja z krancami "<<E<<
" i "<<Epop<<
"\n";
1272 double Eost = bisekcja(
fun, E, Epop);
1279 ilepoziomow = liczbazer + 1;
1280 stan nowy =
stan(Eost,
V, ilepoziomow - 1);
1282 std::cerr<<
" Eost = "<<Eost<<
" ilepoziomow = "<<ilepoziomow<<
"\n";
1284 listast.push_back(nowy);
1285 itostd = listast.end();
1288 std::clog<<
" Eost = "<<Eost<<
" ilepoziomow = "<<ilepoziomow<<
"\n";
1289 punkt ost, ostdob, pierw;
1290 itnastd = listast.begin();
1293 while((
int)listast.size() < ilepoziomow)
1297 E = ostdob.
en - rozdz;
1300 E = (itnastd != itostd)?(itnastd->poziom + rozdz):(E0 + rozdz);
1305 std::clog<<
"Zagęszczanie z pierw = "<<pierw.
en<<
" i ost = "<<ost.
en<<
"\n";
1310 for(
int i = 1; i >= 0; i--)
1312 E = bisekcja(
fun, trojka[i], trojka[i+1]);
1318 nowy =
stan(E,
V, liczbazer);
1319 std::clog<<
"E = "<<E<<
" zer jest "<<liczbazer<<
"\n";
1320 listast.insert(iter, nowy);
1327 std::clog<<
"Nie znalazł a powinien\n";
1333 E = bisekcja(
fun, pierw.
en, ost.
en);
1339 nowy =
stan(E,
V, liczbazer);
1340 listast.insert(itostd, nowy);
1342 while((itostd != listast.begin()) && (itostd->liczba_zer <= std::prev(itostd)->liczba_zer + 1))
1344 if(itostd->liczba_zer < std::prev(itostd)->liczba_zer + 1)
1346 std::clog<<
"\nKÅ‚opot z miejscami zerowymi: E1 = "<<(itostd->poziom)<<
" zer "<<(itostd->liczba_zer)<<
"\nE2 = "<<(std::prev(itostd)->poziom)<<
" zer "<<(std::prev(itostd)->liczba_zer)<<
"\n";
1351 itnastd = (itostd == listast.begin())?listast.begin():std::prev(itostd);
1352 std::clog<<
"ostatnie_dobre = "<<(itostd->liczba_zer)<<
" nastepne_dobre = "<<(itnastd->liczba_zer)<<
"\n";
1357 iter = listast.begin();
1358 while(iter != listast.end())
1361 std::clog<<
"zera = "<<(iter->liczba_zer)<<
"\tE = "<<(iter->poziom)<<
"\n";
1374 std::clog<<
"E = "<<E<<
"\n";
1375 for(
int nrpoz_el = 0; nrpoz_el <= int(el->
rozwiazania.size()) - 1; nrpoz_el++)
1376 for(
int nrpoz_dziu = 0; nrpoz_dziu <= int(dziu->
rozwiazania.size()) - 1; nrpoz_dziu++)
1383 std::clog<<
"E0 = "<<E0<<
" dodajÄ™ "<<nrpoz_el<<
", "<<nrpoz_dziu<<
": "<<((*m_prz)[nrpoz_el][nrpoz_dziu])<<
"\n";
1384 wynik += ((*m_prz)[nrpoz_el][nrpoz_dziu]);
1389 std::clog<<
"wynik = "<<wynik<<
"\n";
1397 std::vector<parad> Esum;
1401 for(
int nrpoz_el = 0; nrpoz_el <= int(el->
rozwiazania.size()) - 1; nrpoz_el++)
1402 for(
int nrpoz_dziu = 0; nrpoz_dziu <= int(dziu->
rozwiazania.size()) - 1; nrpoz_dziu++)
1408 Esum.push_back({E0, wart});
1414 for(
int i = 0; i <= (int)Esum.size() - 1; i++)
1416 plik<<Esum[i].first<<
" "<<wartpop<<
"\n";
1417 plik<<Esum[i].first<<
" "<<Esum[i].second<<
"\n";
1418 wartpop = Esum[i].second;
1425 if(a.first <
b.first)
1427 if(a.first ==
b.first && a.second <
b.second)
1437double warstwa::norma_kwadr(
double E,
double A,
double B)
const
1446 wartosc = airy_kwadr_pierwotna(x_kon, E, A, B) - airy_kwadr_pierwotna(x_pocz, E, A, B);
1452 wartosc = tryg_kwadr_pierwotna(x_kon, E, A, B) - tryg_kwadr_pierwotna(x_pocz, E, A, B);
1456 wartosc = exp_kwadr_pierwotna(x_kon, E, A, B) - exp_kwadr_pierwotna(x_pocz, E, A, B);
1464void warstwa_skraj::przesun_igreki(
double dE)
1482 err <<
"Energia nad skrajna bariera!\nE = " << E <<
" y = " << y <<
"\n";
1488 wartosc =
expa(x, E);
1506 err <<
"Energia nad skrajna bariera!\nE = " << E <<
" y = " << y <<
"\n";
1511 wartosc =
expb(x, E);
1529 err <<
"Energia nad skrajna bariera!\nE = " << E <<
" y = " << y <<
"\n";
1552 err <<
"Energia nad skrajna bariera!\n";
1563int warstwa_skraj::zera_ffal(
double,
double,
double)
const {
return 0; }
1565double warstwa_skraj::norma_kwadr(
double E,
double C)
const
1570 err <<
"Zla energia!\n";
1573 double kp =
sqrt(2 * masa_p * (y - E));
1574 return C *
C / (2 * kp);
1582 wynik = C *
ffalb(x, E);
1586 wynik = C *
ffala(x, E);
1629 wspolczynniki.resize(M);
1630 for(
int i = 0; i <= M - 1; i++)
1632 wspolczynniki[i] =
V[i][M - 1];
1638void stan::przesun_poziom(
double dE) {
poziom += dE; }
1693 err <<
"Pierwsza warstwa nie jest lewa!\n";
1702 err <<
"Ostatnia warstwa nie jest prawa!\n";
1707 if(lewa.y != prawa.y)
1710 err <<
"Zle energie skajnych warstw!\n";
1714 for(i = 1; i <= (int)tablica.size() - 2; i++)
1716 if(tablica[i - 1]->x_kon != tablica[i]->x_pocz)
1719 err <<
"Rozne krance warstw " << (i - 1) <<
" i " << i <<
" w " << co <<
": " << (tablica[i - 1]->x_kon)
1720 <<
" =/= " << (tablica[i]->x_pocz) <<
"\n";
1723 kawalki.push_back(*tablica[i]);
1724 tablica[i - 1]->nast = tablica[i];
1725 czydol = (tablica[i]->y_pocz > tablica[i]->y_kon) ? tablica[i]->y_kon : tablica[i]->y_pocz;
1730 if(tablica[i]->pole == 0)
1732 progi.push_back(tablica[i]->y_pocz);
1736 if(tablica[i - 1]->x_kon != tablica[i]->x_pocz)
1739 err <<
"Rozne krance warstw " << (i - 1) <<
" i " << i <<
"\n";
1745 err <<
"Brak jakiejkolwiek studni!\n";
1748 double gornyprog = dol;
1749 std::vector<double>::iterator it = progi.begin();
1750 while(it != progi.end())
1753 if(*it > gornyprog && *it < 0.)
1759 it = progi.erase(it);
1778 std::string wiersz, bezkoment;
1779 boost::regex wykoment(
"#.*");
1780 std::string nic(
"");
1781 boost::regex pust(
"\\s+");
1782 boost::regex pole(
"pole");
1783 std::vector<double> parametry;
1785 double x_pocz = 0, x_kon, y_pocz, y_kon, npar1, npar2, masa_p, masa_r;
1786 bool bylalewa =
false, bylawew =
false, bylaprawa =
false;
1787 std::vector<warstwa *> tablica;
1789 std::getline(plik, wiersz);
1790 bool jestpole = regex_search(wiersz, pole);
1791 bool gwiazdka =
false;
1792 std::clog <<
"\njestpole = " << jestpole <<
"\n";
1793 int max_par = (jestpole) ? 7 : 6;
1794 int min_par = (jestpole) ? 5 : 4;
1797 bezkoment = regex_replace(wiersz, wykoment, nic);
1798 boost::sregex_token_iterator it(bezkoment.begin(), bezkoment.end(), pust, -1);
1799 boost::sregex_token_iterator kon;
1805 std::clog << *it <<
" * ";
1806 if(it->str() ==
"*")
1814 liczba = boost::lexical_cast<double>(*it);
1817 catch(boost::bad_lexical_cast &)
1820 err <<
"\n napis " << *it <<
" nie jest liczba\n";
1823 parametry.push_back(liczba);
1827 (((
int)parametry.size() < min_par && parametry.size() != 1) || (
int)parametry.size() > max_par))
1831 err <<
"\nwarstwa wymaga 1 lub od 5 do 7 parametrow, a sa " << parametry.size() <<
"\n";
1833 err <<
"\nwarstwa wymaga 1 lub od 4 do 6 parametrow, a sa " << parametry.size() <<
"\n";
1838 if(parametry.size() == 1)
1842 std::clog <<
"\nrobi sie prawa: masa = " << parametry[0] <<
" x_pocz = " << x_pocz <<
"\n";
1843 tablica.push_back(wskazwar);
1848 x_kon = x_pocz + parametry[0];
1849 y_pocz = -parametry[1];
1852 y_kon = -parametry[2];
1854 masa_p = parametry[3];
1855 masa_r = parametry[4];
1860 masa_p = parametry[2];
1861 masa_r = parametry[3];
1865 if((parametry[0] <= 0.) || (masa_p <= 0.) || (masa_r <= 0.))
1868 err <<
"\nAaaaaa! x_kon = " << parametry[0] <<
"masa_p = " << masa_p <<
"masa_r = " << masa_r
1873 if((
int)parametry.size() == min_par + 1)
1875 npar1 = parametry[min_par];
1877 if((
int)parametry.size() == min_par + 2)
1879 npar1 = parametry[min_par];
1880 npar2 = parametry[min_par + 1];
1882 wskazwar =
new warstwa(masa_p, masa_r, x_pocz, y_pocz, x_kon, y_kon, npar1, npar2);
1883 std::clog <<
"masa_p = " << masa_p <<
", masa_r = " << masa_r <<
", x_pocz = " << x_pocz
1884 <<
", y_pocz = " << y_pocz <<
", x_kon = " << x_kon <<
", y_kon = " << y_kon
1885 <<
", npar1 = " << npar1 <<
", npar2 = " << npar2 <<
"\n";
1887 tablica.push_back(wskazwar);
1890 gwiazdki.push_back(tablica.size() - 2);
1900 tablica.push_back(wskazwar);
1901 std::clog <<
"\nrobi sie lewa: masa = " << parametry[0] <<
" x_pocz = " << x_pocz <<
"\n";
1904 if(bylalewa && bylawew && bylaprawa)
1906 std::clog <<
"\nWsystko bylo\n";
1908 std::getline(plik, wiersz);
1917 err <<
"Pierwsza warstwa nie jest lewa!\n";
1926 err <<
"Ostatnia warstwa nie jest prawa!\n";
1931 if(lewa.y != prawa.y)
1934 err <<
"Zle energie skajnych warstw!\n";
1938 for(i = 1; i <= (int)tablica.size() - 2; i++)
1940 if(tablica[i - 1]->x_kon != tablica[i]->x_pocz)
1943 err <<
"Rozne krance warstw " << (i - 1) <<
" i " << i <<
" w " << co <<
": " << (tablica[i - 1]->x_kon)
1944 <<
" =/= " << (tablica[i]->x_pocz) <<
"\n";
1947 kawalki.push_back(*tablica[i]);
1948 tablica[i - 1]->nast = tablica[i];
1949 czydol = (tablica[i]->y_pocz > tablica[i]->y_kon) ? tablica[i]->y_kon : tablica[i]->y_pocz;
1954 if(tablica[i]->pole == 0)
1956 progi.push_back(tablica[i]->y_pocz);
1960 if(tablica[i - 1]->x_kon != tablica[i]->x_pocz)
1963 err <<
"Rozne krance warstw " << (i - 1) <<
" i " << i <<
"\n";
1969 err <<
"Brak jakiejkolwiek studni!\n";
1972 double gornyprog = dol;
1974 std::vector<double>::iterator it = progi.begin();
1975 while(it != progi.end())
1978 if(*it > gornyprog && *it < 0.)
1984 it = progi.erase(it);
2017 std::string wiersz, bezkoment;
2018 boost::regex wykoment(
"#.*");
2019 std::string nic(
"");
2020 boost::regex pust(
"\\s+");
2021 boost::regex pole(
"pole");
2022 std::vector<double> parametry;
2024 double x_pocz = 0, x_kon, y_pocz, y_kon, npar1, npar2, masa_p, masa_r;
2025 bool bylalewa =
false, bylawew =
false, bylaprawa =
false;
2026 std::vector<warstwa *> tablica;
2028 std::getline(plik, wiersz);
2029 bool jestpole = regex_search(wiersz, pole);
2030 bool gwiazdka =
false;
2031 std::clog <<
"\njestpole = " << jestpole <<
"\n";
2032 int max_par = (jestpole) ? 7 : 6;
2033 int min_par = (jestpole) ? 5 : 4;
2036 bezkoment = regex_replace(wiersz, wykoment, nic);
2037 boost::sregex_token_iterator it(bezkoment.begin(), bezkoment.end(), pust, -1);
2038 boost::sregex_token_iterator kon;
2044 std::clog << *it <<
" * ";
2045 if(it->str() ==
"*")
2053 liczba = boost::lexical_cast<double>(*it);
2056 catch(boost::bad_lexical_cast &)
2059 err <<
"\n napis " << *it <<
" nie jest liczba\n";
2062 parametry.push_back(liczba);
2066 (((
int)parametry.size() < min_par && parametry.size() != 1) || (
int)parametry.size() > max_par))
2070 std::cerr <<
"\nwarstwa wymaga 1 lub od 5 do 7 parametrow, a sa " << parametry.size() <<
"\n";
2072 std::cerr <<
"\nwarstwa wymaga 1 lub od 4 do 6 parametrow, a sa " << parametry.size() <<
"\n";
2077 if(parametry.size() == 1)
2081 std::clog <<
"\nrobi sie prawa: masa = " << parametry[0] <<
" x_pocz = " << x_pocz <<
"\n";
2082 tablica.push_back(wskazwar);
2087 x_kon = x_pocz + parametry[0];
2088 y_pocz = -parametry[1];
2091 y_kon = -parametry[2];
2093 masa_p = parametry[3];
2094 masa_r = parametry[4];
2099 masa_p = parametry[2];
2100 masa_r = parametry[3];
2104 if((parametry[0] <= 0.) || (masa_p <= 0.) || (masa_r <= 0.))
2107 err <<
"\nAaaaaa! x_kon = " << parametry[0] <<
"masa_p = " << masa_p <<
"masa_r = " << masa_r
2112 if((
int)parametry.size() == min_par + 1)
2114 npar1 = parametry[min_par];
2116 if((
int)parametry.size() == min_par + 2)
2118 npar1 = parametry[min_par];
2119 npar2 = parametry[min_par + 1];
2121 wskazwar =
new warstwa(masa_p, masa_r, x_pocz, y_pocz, x_kon, y_kon, npar1, npar2);
2122 std::clog <<
"masa_p = " << masa_p <<
", masa_r = " << masa_r <<
", x_pocz = " << x_pocz
2123 <<
", y_pocz = " << y_pocz <<
", x_kon = " << x_kon <<
", y_kon = " << y_kon
2124 <<
", npar1 = " << npar1 <<
", npar2 = " << npar2 <<
"\n";
2126 tablica.push_back(wskazwar);
2129 gwiazdki.push_back(tablica.size() - 2);
2139 tablica.push_back(wskazwar);
2140 std::clog <<
"\nrobi sie lewa: masa = " << parametry[0] <<
" x_pocz = " << x_pocz <<
"\n";
2143 if(bylalewa && bylawew && bylaprawa)
2145 std::clog <<
"\nWsystko bylo\n";
2147 std::getline(plik, wiersz);
2156 err <<
"Pierwsza warstwa nie jest lewa!\n";
2165 err <<
"Ostatnia warstwa nie jest prawa!\n";
2170 if(lewa.y != prawa.y)
2173 err <<
"Zle energie skajnych warstw!\n";
2177 for(i = 1; i <= (int)tablica.size() - 2; i++)
2179 if(tablica[i - 1]->x_kon != tablica[i]->x_pocz)
2182 err <<
"Rozne krance warstw " << (i - 1) <<
" i " << i <<
" w " << co <<
": " << (tablica[i - 1]->x_kon)
2183 <<
" =/= " << (tablica[i]->x_pocz) <<
"\n";
2186 kawalki.push_back(*tablica[i]);
2187 tablica[i - 1]->nast = tablica[i];
2188 czydol = (tablica[i]->y_pocz > tablica[i]->y_kon) ? tablica[i]->y_kon : tablica[i]->y_pocz;
2193 if(tablica[i]->pole == 0)
2195 progi.push_back(tablica[i]->y_pocz);
2199 if(tablica[i - 1]->x_kon != tablica[i]->x_pocz)
2202 err <<
"Rozne krance warstw " << (i - 1) <<
" i " << i <<
"\n";
2208 err <<
"Brak jakiejkolwiek studni!\n";
2211 double gornyprog = dol;
2213 std::vector<double>::iterator it = progi.begin();
2214 while(it != progi.end())
2217 if(*it > gornyprog && *it < 0.)
2223 it = progi.erase(it);
2247 lewa.przesun_igreki(dE);
2248 prawa.przesun_igreki(dE);
2250 for( i = 0; i <= (int)kawalki.size() - 1; i++)
2252 kawalki[i].przesun_igreki(dE);
2254 for( i = 0; i <= (int)progi.size() - 1; i++)
2258 for( i = 0; i <= (int)
rozwiazania.size() - 1; i++)
2272 int N = kawalki.size() + 2;
2277 err <<
"Za malo warstw, bo " <<
N <<
"\n";
2281 A2D macierz(M, M, 0.0);
2282 zrobmacierz(E, macierz);
2295 double detUV = rozkladUV.
det();
2299 double dzielnik = 1;
2300 for(
int i = 0; i <= (int)progi.size() - 1; i++)
2305 err <<
"Energia " << E <<
" rowna progowi nr " << i <<
"\n";
2308 dzielnik *= (E - progi[i]);
2310 return (detUV * S[S.
dim() - 1]) / dzielnik;
2349void struktura::zrobmacierz(
double E,
A2D & macierz)
2351 int N = kawalki.size() + 2;
2352 double x = lewa.iks;
2353 macierz[0][0] = lewa.
ffalb(x, E);
2354 macierz[0][1] = -kawalki[0].ffala(x, E);
2355 macierz[0][2] = -kawalki[0].ffalb(x, E);
2356 macierz[1][0] = lewa.
ffalb_prim(x, E) / lewa.masa_p;
2357 macierz[1][1] = -kawalki[0].ffala_prim(x, E) / kawalki[0].masa_p(E);
2358 macierz[1][2] = -kawalki[0].ffalb_prim(x, E) / kawalki[0].masa_p(E);
2360 for(
n = 1;
n <=
N - 3;
n++)
2362 x = kawalki[
n].x_pocz;
2363 macierz[2 *
n][2 *
n - 1] = kawalki[
n - 1].ffala(x, E);
2364 macierz[2 *
n][2 *
n] = kawalki[
n - 1].ffalb(x, E);
2365 macierz[2 *
n][2 *
n + 1] = -kawalki[
n].ffala(x, E);
2366 macierz[2 *
n][2 *
n + 2] = -kawalki[
n].ffalb(x, E);
2368 macierz[2 *
n + 1][2 *
n - 1] = kawalki[
n - 1].ffala_prim(x, E) / kawalki[
n - 1].masa_p(E);
2369 macierz[2 *
n + 1][2 *
n] = kawalki[
n - 1].ffalb_prim(x, E) / kawalki[
n - 1].masa_p(E);
2370 macierz[2 *
n + 1][2 *
n + 1] = -kawalki[
n].ffala_prim(x, E) / kawalki[
n].masa_p(E);
2371 macierz[2 *
n + 1][2 *
n + 2] = -kawalki[
n].ffalb_prim(x, E) / kawalki[
n].masa_p(E);
2375 macierz[2 *
n][2 *
n - 1] = kawalki[
n - 1].ffala(x, E);
2376 macierz[2 *
n][2 *
n] = kawalki[
n - 1].ffalb(x, E);
2377 macierz[2 *
n][2 *
n + 1] = -prawa.
ffala(x, E);
2379 macierz[2 *
n + 1][2 *
n - 1] = kawalki[
n - 1].ffala_prim(x, E) / kawalki[
n - 1].masa_p(E);
2380 macierz[2 *
n + 1][2 *
n] = kawalki[
n - 1].ffalb_prim(x, E) / kawalki[
n - 1].masa_p(E);
2381 macierz[2 *
n + 1][2 *
n + 1] = -prawa.
ffala_prim(x, E) / prawa.masa_p;
2387 int N = kawalki.size() + 2;
2389 A2D macierz(M, M, 0.0);
2390 zrobmacierz(E, macierz);
2393 double Al, Bl, A, B;
2394 double lewawart, prawawart;
2397 Al =
V[0][
V.dim2() - 1];
2398 A =
V[1][
V.dim2() - 1];
2399 B =
V[2][
V.dim2() - 1];
2401 prawawart = kawalki[0].funkcjafal(kawalki[0].x_pocz, E, A, B);
2402 if(lewawart * prawawart < 0)
2406 std::clog <<
"\nE = " << E <<
" zmiana znaku! " << lewawart <<
" " << prawawart <<
"\n";
2409 sumaroz += abs(lewawart - prawawart);
2411 for( j = 1; j <=
N - 3; j++)
2414 Al =
V[2 * (j - 1) + 1][
V.dim2() - 1];
2415 Bl =
V[2 * (j - 1) + 2][
V.dim2() - 1];
2416 A =
V[2 * j + 1][
V.dim2() - 1];
2417 B =
V[2 * j + 2][
V.dim2() - 1];
2418 lewawart = kawalki[j - 1].funkcjafal(kawalki[j - 1].x_kon, E, Al, Bl);
2419 prawawart = kawalki[j].funkcjafal(kawalki[j].x_pocz, E, A, B);
2420 if(lewawart * prawawart < 0)
2424 std::clog <<
"\nE = " << E <<
" zmiana znaku! " << lewawart <<
" " << prawawart <<
"\n";
2427 sumaroz += abs(lewawart - prawawart);
2430 Al =
V[2 * (j - 1) + 1][
V.dim2() - 1];
2431 Bl =
V[2 * (j - 1) + 2][
V.dim2() - 1];
2432 A =
V[2 * j + 1][
V.dim2() - 1];
2433 lewawart = kawalki[j - 1].funkcjafal(kawalki[j - 1].x_kon, E, Al, Bl);
2434 prawawart = prawa.
funkcjafal(prawa.iks, E, A);
2435 if(lewawart * prawawart < 0)
2439 std::clog <<
"\nE = " << E <<
" zmiana znaku! " << lewawart <<
" " << prawawart <<
"\n";
2443 sumaroz += abs(lewawart - prawawart);
2444 return znak * sumaroz;
2449 double x0 = x0A /
przelm;
2450 double xk = xkA /
przelm;
2451 const double krok = krokA /
przelm;
2452 int N = kawalki.size() + 2;
2454 A2D macierz(M, M, 0.0);
2455 zrobmacierz(E, macierz);
2462 std::vector<std::vector<double> > funkcja;
2464 funkcja[0].reserve(
int((xk - x0) / krok));
2465 funkcja[1].reserve(
int((xk - x0) / krok));
2473 while((wsk <= (
int)kawalki.size() - 1) && (x > kawalki[wsk].x_kon))
2480 funkcja[0].push_back(x);
2483 B =
V[0][
V.dim2() - 1];
2484 funkcja[1].push_back(lewa.
funkcjafal(x, E, B));
2490 else if(wsk <= (
int)kawalki.size() - 1)
2492 A =
V[2 * wsk + 1][
V.dim2() - 1];
2493 B =
V[2 * wsk + 2][
V.dim2() - 1];
2494 funkcja[1].push_back(kawalki[wsk].funkcjafal(x, E, A, B));
2498 A =
V[2 * wsk + 1][
V.dim2() - 1];
2499 funkcja[1].push_back(prawa.
funkcjafal(x, E, A));
2502 if((wsk >= 0) && (wsk <= (
int)kawalki.size() - 1) && (x > kawalki[wsk].x_kon))
2552 int N = kawalki.size() + 2;
2555 A2D macierz(M, M, 0.0);
2556 zrobmacierz(E, macierz);
2560 double A, B, Al, Bl, Ap, Bp;
2574 while(pierwsza <=
N - 3 && (kawalki[pierwsza].y_pocz > E && kawalki[pierwsza].y_kon > E));
2575 int ostatnia =
N - 2;
2580 while(ostatnia >= 0 && (kawalki[ostatnia].y_pocz > E && kawalki[ostatnia].y_kon > E));
2582 double sasiadl, sasiadp;
2583 if(ostatnia == pierwsza)
2585 A =
V[2 * pierwsza + 1][
V.dim2() - 1];
2586 B =
V[2 * pierwsza + 2][
V.dim2() - 1];
2587 sumazer += kawalki[pierwsza].zera_ffal(E, A, B);
2592 A =
V[2 * j + 1][
V.dim2() - 1];
2593 B =
V[2 * j + 2][
V.dim2() - 1];
2594 Ap =
V[2 * (j + 1) + 1][
V.dim2() - 1];
2595 Bp =
V[2 * (j + 1) + 2][
V.dim2() - 1];
2596 sasiadp = kawalki[j + 1].funkcjafal(kawalki[j + 1].x_pocz, E, Ap, Bp);
2597 sasiadl = kawalki[j].funkcjafal(kawalki[j].x_pocz, E, A,
2599 sumazer += kawalki[j].zera_ffal(E, A, B, sasiadl, sasiadp);
2600 for( j = pierwsza + 1; j <= ostatnia - 1; j++)
2602 Al =
V[2 * (j - 1) + 1][
V.dim2() - 1];
2603 Bl =
V[2 * (j - 1) + 2][
V.dim2() - 1];
2604 A =
V[2 * j + 1][
V.dim2() - 1];
2605 B =
V[2 * j + 2][
V.dim2() - 1];
2606 Ap =
V[2 * (j + 1) + 1][
V.dim2() - 1];
2607 Bp =
V[2 * (j + 1) + 2][
V.dim2() - 1];
2608 sasiadl = kawalki[j - 1].funkcjafal(kawalki[j - 1].x_kon, E, Al, Bl);
2609 sasiadp = kawalki[j + 1].funkcjafal(kawalki[j + 1].x_pocz, E, Ap, Bp);
2610 sumazer += kawalki[j].zera_ffal(E, A, B, sasiadl, sasiadp);
2613 A =
V[2 * j + 1][
V.dim2() - 1];
2614 B =
V[2 * j + 2][
V.dim2() - 1];
2615 Al =
V[2 * (j - 1) + 1][
V.dim2() - 1];
2616 Bl =
V[2 * (j - 1) + 2][
V.dim2() - 1];
2617 sasiadp = kawalki[j].funkcjafal(kawalki[j].x_kon, E, A,
2619 sasiadl = kawalki[j - 1].funkcjafal(kawalki[j - 1].x_kon, E, Al, Bl);
2620 sumazer += kawalki[j].zera_ffal(
2621 E, A, B, sasiadl, sasiadp);
2631 std::list<punkt> lista;
2632 std::vector<double> wynik;
2633 lista.push_front(p0);
2634 lista.push_back(pk);
2636 double znak = (p0.
wart > 0) ? 1. : -1.;
2637 if(znak * pk.
wart <= 0)
2640 err <<
"W zageszczaniu znaki sie roznia!\n";
2643 std::list<punkt>::iterator iter, iterl, iterp;
2644 iter = lista.begin();
2656 double szer = dokl + 1;
2657 while(wynik.empty() && szer >= dokl)
2659 iterp = lista.end();
2661 while(iterp != lista.begin())
2665 E = (iterp->en + iterl->en) / 2;
2666 szer = iterp->en - iterl->en;
2669 if(znak * iter->wart < 0)
2671 wynik.push_back(iterl->en);
2672 wynik.push_back(iter->en);
2673 wynik.push_back(iterp->en);
2688 err <<
"Zly zakres energii!\n";
2691 for(
double E = E0; E <= Ek; E += rozdz)
2695 std::cout << std::flush;
2701 ofstream plikdebug, debugfun;
2704 plikdebug.open(
"debug");
2705 debugfun.open(
"debugfun");
2706 plikdebug <<
"E\tzera\n";
2707 plikdebug.precision(12);
2713 err <<
"Zly zakres energii!\n";
2716 int M = 2 * (kawalki.size() + 2) - 2;
2720 std::vector<double> trojka;
2722 std::clog <<
"W szukaniu, E_pocz = " << Ek <<
"\n";
2726 std::clog <<
"Pierwsza wartosc = " << wartpop <<
"\n";
2731 int ostatnie_dobre, nast_dobre;
2733 double ciagl, Eb0, Eb1;
2742 while((E > E0) && (wartpop * wartakt > 0))
2752 std::clog <<
"Bisekcja z krancami " << E <<
" i " << (E + rozdz) <<
"\n";
2754 double Eost = bisekcja(
fun, E, E + rozdz);
2757 plikdebug << Eost <<
"\t" << std::flush;
2763 plikdebug << (ilepoziomow - 1) <<
"\t" << (
sprawdz_ciaglosc(Eost,
V)) << std::endl;
2765 ostatnie_dobre = ilepoziomow - 1;
2767 stan nowy(Eost,
V, ostatnie_dobre);
2771 std::clog <<
" Eost = " << Eost <<
" ilepoziomow = " << ilepoziomow <<
"\n";
2773 punkt ost, ostdob, pierw;
2775 while(ostatnie_dobre >= 1)
2779 E = ostdob.
en - rozdz;
2781 E = (nast_dobre >= 0) ? (
rozwiazania[nast_dobre].poziom + rozdz) : (E0 + rozdz);
2784 std::clog <<
"Eost = " << ost.
en <<
" wartost = " << ost.
wart <<
"\n";
2785 std::clog <<
"Epierw = " << pierw.
en <<
" wartpierw = " << pierw.
wart <<
"\n";
2790 std::clog <<
"Zageszczanie z pierw = " << pierw.
en <<
" i ost = " << ost.
en <<
"\n";
2793 for(
int i = 1; i >= 0; i--)
2796 E = bisekcja(
fun, trojka[i], trojka[i + 1]);
2800 plikdebug << E <<
"\t" << ciagl << std::flush;
2803 Eb1 = trojka[i + 1];
2804 while(ciagl < 0 || ciagl > 1
e-7)
2809 stymcz =
stan(E,
V, liczbazer);
2816 err <<
"Dla E = " << E <<
" wychodzi niedobra funkcja, ciagl = " << ciagl <<
"\n";
2819 if((this->*
fun)(E) * (this->*
fun)(Eb0) < 0)
2827 E = bisekcja(
fun, Eb0, Eb1);
2831 plikdebug <<
"poprawione E = " << E <<
" ciagl = " << ciagl <<
"\t" << std::flush;
2837 plikdebug <<
"\t" << liczbazer << std::endl;
2840 std::clog <<
"E = " << E <<
"\tzer " << liczbazer <<
"\n";
2842 nowy =
stan(E,
V, liczbazer);
2843 if(liczbazer > ostatnie_dobre)
2846 err <<
"Za duzo zer!\n";
2857 E = bisekcja(
fun, pierw.
en, ost.
en);
2861 plikdebug << E <<
"\t" << ciagl << std::flush;
2865 while(ciagl < 0 || ciagl > 1
e-7)
2870 stymcz =
stan(E,
V, liczbazer);
2877 err <<
"Dla E = " << E <<
" wychodzi niedobra funkcja, ciagl = " << ciagl <<
"\n";
2880 if((this->*
fun)(E) * (this->*
fun)(Eb0) < 0)
2888 E = bisekcja(
fun, Eb0, Eb1);
2892 plikdebug <<
"poprawione E = " << E <<
" ciagl = " << ciagl <<
"\t" << std::flush;
2898 plikdebug <<
"\t" << liczbazer << std::endl;
2901 std::clog <<
"W else E = " << E <<
"\tzer " << liczbazer <<
"\n";
2903 nowy =
stan(E,
V, liczbazer);
2904 if(liczbazer > ostatnie_dobre)
2907 err <<
"Za duzo zer!\n";
2913 err <<
"Bez sensu z zerami!\n";
2947 if(debug && licz > 0)
2951 std::clog <<
"ostatnie_dobre = " << ostatnie_dobre <<
"\n";
2953 while(ostatnie_dobre >= 1 &&
rozwiazania[ostatnie_dobre - 1].liczba_zer >= 0)
2957 nast_dobre = ostatnie_dobre - 1;
2958 while(nast_dobre >= 0 &&
rozwiazania[nast_dobre].liczba_zer < 0)
2963 std::clog <<
"ostatnie_dobre = " << ostatnie_dobre <<
" nastepne_dobre = " << nast_dobre <<
"\n";
2969 std::clog <<
"Liczba rozwiazan = " <<
rozwiazania.size() <<
"\n";
2975 ofstream plikdebug, debugfun;
2978 plikdebug.open(
"debug");
2979 debugfun.open(
"debugfun");
2980 plikdebug <<
"E\tzera\n";
2981 plikdebug.precision(12);
2983 std::list<stan> listast;
2984 std::list<stan>::iterator itostd,
2986 std::list<stan>::iterator iter;
2991 err <<
"Zly zakres energii!\n";
2994 int M = 2 * (kawalki.size() + 2) - 2;
2998 std::vector<double> trojka;
3000 std::clog <<
"W szukaniu, E_pocz = " << Ek <<
"\n";
3004 std::clog <<
"Pierwsza wartosc = " << wartpop <<
"\n";
3008 std::vector<parad> wspolcz;
3009 std::ofstream pliktestowy;
3025 while((E > E0) && (wartpop * wartakt > 0))
3038 std::clog<<
"Bisekcja z krancami "<<E<<
" i "<<(E + rozdz*1e3)<<
"\n";
3039 double Eost = bisekcja(
fun, E, E + rozdz*1e3);
3044 std::clog<<
"STARE: A, B = "<<ABkon.first<<
" "<<ABkon.second<<
"\tE = "<<Eost<<std::endl;
3049 std::clog<<
"NOWSZE: A, B = "<<ABkon.first<<
" "<<ABkon.second<<
"\tE = "<<nowaE<<std::endl;
3050 if(abs(
B1) > abs(B0))
3052 std::clog<<
"B sie pogorszyło(0)! B0, B1 "<<B0<<
", "<<
B1<<std::endl;
3054 std::clog<<
"zmiana E = "<<(Eost-nowaE)<<std::endl;
3060 plikdebug << Eost <<
"\t" << std::flush;
3066 std::clog<<
"stara i nowa liczba zer "<<ilepoziomow-1<<
", "<<nowezera<<std::endl;
3069 plikdebug << (ilepoziomow - 1) <<
"\t" << (
sprawdz_ciaglosc(Eost,
V)) << std::endl;
3072 stan nowy(Eost,
V, ilepoziomow - 1);
3074 stan nowszy =
stan(Eost, wspolcz, ilepoziomow - 1);
3075 std::string temat =
"funkcjafalowa_E";
3076 std::string nazwapliku = temat + std::to_string(ilepoziomow-1);
3077 pliktestowy.open(nazwapliku);
3079 pliktestowy.close();
3080 pliktestowy.open(nazwapliku +
"prim");
3082 pliktestowy.close();
3083 pliktestowy.open(
"studnie");
3085 pliktestowy.close();
3087 listast.push_back(nowy);
3088 itostd = listast.end();
3092 std::clog <<
" Eost = " << Eost <<
" ilepoziomow = " << ilepoziomow <<
"\n";
3094 punkt ost, ostdob, pierw;
3095 itnastd = listast.begin();
3098 while((
int)listast.size() < ilepoziomow)
3102 E = ostdob.
en - rozdz;
3105 E = (itnastd != itostd) ? (itnastd->poziom + rozdz) : (E0 + rozdz);
3109 std::clog <<
"Eost = " << ost.
en <<
" wartost = " << ost.
wart <<
"\n";
3110 std::clog <<
"Epierw = " << pierw.
en <<
" wartpierw = " << pierw.
wart <<
"\n";
3116 std::clog <<
"Zageszczanie z pierw = " << pierw.
en <<
" i ost = " << ost.
en <<
"\n";
3122 for(
int i = 1; i >= 0; i--)
3125 E = bisekcja(
fun, trojka[i], trojka[i + 1]);
3147 std::clog <<
"E = " << E <<
" zer jest " << liczbazer <<
"\n";
3149 nowy =
stan(E,
V, liczbazer);
3154 std::clog<<
"\nstara i nowa liczba zer "<<liczbazer<<
", "<<nowezera<<std::endl;
3156 nazwapliku = temat + std::to_string(liczbazer);
3157 pliktestowy.open(nazwapliku);
3159 pliktestowy.close();
3160 nowszy =
stan(E, wspolcz, nowezera);
3161 pliktestowy.open(nazwapliku +
"prim");
3163 pliktestowy.close();
3174 listast.insert(iter, nowy);
3185 std::clog <<
"Nie znalazl a powinien\n";
3192 E = bisekcja(
fun, pierw.
en, ost.
en);
3198 std::clog<<
"STARE: A, B = "<<ABkon.first<<
" "<<ABkon.second<<
"\tE = "<<E<<std::endl;
3202 std::clog<<
"NOWSZE: A, B = "<<ABkon.first<<
" "<<ABkon.second<<
"\tE = "<<nowaE<<std::endl;
3204 if(abs(
B1) > abs(B0))
3206 std::clog<<
"B sie pogorszyło(2)! B0, B1 "<<B0<<
", "<<
B1<<std::endl;
3210 std::clog<<
"zmiana E = "<<(E-nowaE)<<std::endl;
3216 std::clog <<
"E = " << E <<
" zer jest " << liczbazer <<
"\n";
3218 nowy =
stan(E,
V, liczbazer);
3220 if(liczbazer >= itostd->liczba_zer)
3223 err <<
"Za duzo zer!\n";
3226 listast.insert(itostd, nowy);
3231 while((itostd != listast.begin()) &&
3232 (itostd->liczba_zer <= std::prev(itostd)->liczba_zer + 1))
3235 if(itostd->liczba_zer < std::prev(itostd)->liczba_zer + 1)
3237 std::clog <<
"\nKlopot z miejscami zerowymi: E1 = " << (itostd->poziom) <<
" zer " << (itostd->liczba_zer)
3238 <<
"\nE2 = " << (std::prev(itostd)->poziom) <<
" zer " << (std::prev(itostd)->liczba_zer)
3253 itnastd = (itostd == listast.begin()) ? listast.begin() : std::prev(itostd);
3255 std::clog <<
"ostatnie_dobre = " << (itostd->poziom) <<
" nastepne_dobre = " << (itnastd->poziom) <<
"\n";
3264 std::clog <<
"Liczba rozwiazan = " <<
rozwiazania.size() <<
"\n";
3267 iter = listast.begin();
3268 while(iter != listast.end())
3278 int M = 2 * (kawalki.size() + 2) - 2;
3284 for(
int i = 0; i <= (int)energie.size() - 1; ++i)
3291 std::cerr <<
"E = " << E <<
" zer jest " << liczbazer <<
" a powinno byc " << i <<
"\n";
3295 nowy =
stan(E,
V, liczbazer);
3300double struktura::sieczne(
double (
struktura::*f)(double), double pocz, double kon)
3303 std::clog.precision(12);
3306 double dokl = 1
e-10;
3310 std::clog <<
"Sieczne. Wartosci na koncach: " << ((this->*f)(pocz)) <<
", " << ((this->*f)(kon)) <<
"\n";
3312 if((this->*f)(pocz) * (this->*f)(kon) > 0)
3315 err <<
"Zle krance przedzialu!\n";
3319 double x, fc, fp, fl, xlp, xpp;
3321 fl = (this->*f)(xl);
3322 fp = (this->*f)(xp);
3325 xlp = (xl + xp) / 2;
3329 x = xp - fpw * (xp - xl) / (fpw - flw);
3343 std::clog <<
"Lewy Illinois\n";
3358 std::clog <<
"Prawy Illinois\n";
3369 std::clog <<
"x = " <<
x <<
"\tf(x) = " << fc <<
"\txl = " << xl <<
" xp = " << xp <<
" f(xl) = " << fl
3370 <<
" f(xp) = " << fp <<
"\n";
3373 while(xp - xl >= dokl);
3376 std::cerr <<
"\nfc = " << fc <<
" zamiast 0!\n";
3383double struktura::bisekcja(
double (
struktura::*f)(double), double pocz, double kon, double dokl)
3387 std::clog.precision(12);
3397 if((this->*f)(pocz) * (this->*f)(kon) > 0)
3400 err <<
"Zle krance przedzialu!\n";
3406 std::cerr<<
"Zła kolejność krańców!\n";
3415 fl = (this->*f)(xl);
3418 fp = (this->*f)(xp);
3451 while(xp - xl >= dokl);
3469 double wsp = (fp -fl)/(xp - xl);
3470 double xsiecz = xl - fl/wsp;
3472 double fsiecz = (this->*f)(xsiecz);
3473 if(abs(fsiecz) < abs(fp) && abs(fsiecz) < abs(fl))
3477 if(abs(fp) > abs(fl))
3486double struktura::norma_stanu(
stan & st)
3488 double porcja = lewa.norma_kwadr(st.
poziom, st.wspolczynniki.front());
3490 double norma2 = porcja;
3492 for( i = 0;
i <= (int)kawalki.size() - 1;
i++)
3494 porcja = kawalki[
i].norma_kwadr(st.
poziom, st.wspolczynniki[2 * i + 1], st.wspolczynniki[2 * i + 2]);
3498 porcja = prawa.norma_kwadr(st.
poziom, st.wspolczynniki.back());
3505 return sqrt(norma2);
3510 std::vector<stan>::iterator it =
rozwiazania.begin();
3515 norma = norma_stanu(*it);
3517 for(
int i = 0; i <= (int)it->wspolczynniki.size() - 1; i++)
3519 it->wspolczynniki[i] /= norma;
3528 double tylenosnikow = 0.0;
3529 double niepomnozone = 0.0;
3532 double gam32 =
sqrt(
pi) / 2;
3541 calkazFD = kT * log(1 + exp((qFl - it->poziom) / kT));
3542 niepomnozone = lewa.norma_kwadr(it->poziom, it->wspolczynniki.front()) * lewa.masa_r;
3543 niepomnozone += prawa.norma_kwadr(it->poziom, it->wspolczynniki.back()) * prawa.masa_r;
3544 for(
int i = 0; i <= (int)kawalki.size() - 1; i++)
3548 kawalki[i].norma_kwadr(it->poziom, it->wspolczynniki[2 * i + 1], it->wspolczynniki[2 * i + 2]) *
3551 tylenosnikow += niepomnozone * calkazFD /
pi;
3554 double Egorna = lewa.y;
3555 for(
int i = 0; i <= (int)kawalki.size() - 1; i++)
3557 szer = kawalki[i].x_kon - kawalki[i].x_pocz;
3558 niepomnozone += szer *
sqrt(2 * kawalki[i].masa_p(Egorna)) * kawalki[i].masa_r;
3560 tylenosnikow += niepomnozone * kT * gam32 *
sqrt(kT) * 2 * gsl_sf_fermi_dirac_half((qFl - Egorna) / (
kB * T)) /
3563 return tylenosnikow;
3569 double tylenosnikow = 0.0;
3570 double niepomnozone = 0.0;
3573 double gam32 =
sqrt(
pi) / 2;
3577 std::set<int>::iterator setit;
3581 calkazFD = kT * log(1 + exp((qFl - it->poziom) / kT));
3586 for(setit = ktore_warstwy.begin(); setit != ktore_warstwy.end(); ++setit)
3596 niepomnozone += kawalki[*setit].norma_kwadr(it->poziom, it->wspolczynniki[2 * (*setit) + 1],
3597 it->wspolczynniki[2 * (*setit) + 2]) *
3598 kawalki[*setit].masa_r;
3601 tylenosnikow += niepomnozone * calkazFD /
pi;
3604 double Egorna = lewa.y;
3605 for(setit = ktore_warstwy.begin(); setit != ktore_warstwy.end(); ++setit)
3607 szer = kawalki[*setit].x_kon - kawalki[*setit].x_pocz;
3608 niepomnozone += szer *
sqrt(2 * kawalki[*setit].masa_p(Egorna)) * kawalki[*setit].masa_r;
3610 tylenosnikow += niepomnozone * kT * gam32 *
sqrt(kT) * 2 * gsl_sf_fermi_dirac_half((qFl - Egorna) / kT) /
3613 return tylenosnikow;
3618 double tylenosnikow = 0;
3619 double niepomnozone;
3620 double calkazFD, calkaFD12;
3622 double gam32 =
sqrt(
pi) / 2;
3624 double Egorna = lewa.y;
3625 calkaFD12 = gsl_sf_fermi_dirac_half((qFl - Egorna) / (
kB * T));
3626 std::vector<double> koncentr(kawalki.size() + 2);
3627 std::vector<stan>::iterator it;
3629 koncentr[0] =
sqrt(2 * lewa.masa_p) * lewa.masa_r * kT * gam32 *
sqrt(kT) * 2 * calkaFD12 / (2 *
pi *
pi);
3630 for(
int i = 0; i <= (int)kawalki.size() - 1; i++)
3643 calkazFD = kT * log(1 + exp((qFl - it->poziom) / kT));
3645 kawalki[i].norma_kwadr(it->poziom, it->wspolczynniki[2 * i + 1], it->wspolczynniki[2 * i + 2]) *
3647 tylenosnikow += niepomnozone * calkazFD /
pi;
3649 szer = kawalki[i].x_kon - kawalki[i].x_pocz;
3650 koncentr[i + 1] = tylenosnikow / szer +
3651 sqrt(2 * kawalki[i].masa_p(Egorna)) * kawalki[i].masa_r * kT * gam32 *
sqrt(kT) * 2 * calkaFD12 / (2 *
pi *
pi);
3653 koncentr.back() = koncentr.front();
3660 std::vector<warstwa>::iterator it_war = kawalki.begin();
3661 plik <<
dlugosc_na_A(lewa.iks) <<
" " << (lewa.y) <<
"\n";
3662 while(it_war != kawalki.end())
3664 plik <<
dlugosc_na_A(it_war->x_pocz) <<
" " << (it_war->y_pocz) <<
"\n";
3665 plik <<
dlugosc_na_A(it_war->x_kon) <<
" " << (it_war->y_kon) <<
"\n";
3674 std::vector<stan>::iterator it_stan =
rozwiazania.begin();
3679 plik <<
'\t' << iRefBand + (it_stan->poziom);
3681 plik <<
'\t' << iRefBand - (it_stan->poziom);
3693 plik <<
'\t' << iRefBand + (it_stan->poziom);
3695 plik <<
'\t' << iRefBand - (it_stan->poziom);
3705 double szer = prawa.iks - lewa.iks;
3706 double bok = szer / 4;
3707 double x = lewa.iks - bok;
3708 while(x <= lewa.iks)
3711 std::vector<stan>::iterator it_stan =
rozwiazania.begin();
3715 plik << (iRefBand + (it_stan->poziom)) +
3716 skala * lewa.
funkcjafal(x, it_stan->poziom, it_stan->wspolczynniki[0]);
3718 plik << (iRefBand - (it_stan->poziom)) +
3719 skala * lewa.
funkcjafal(x, it_stan->poziom, it_stan->wspolczynniki[0]);
3727 for(
int i = 0; i <= (int)kawalki.size() - 1; i++)
3729 x = kawalki[i].x_pocz;
3730 while(x <= kawalki[i].x_kon)
3733 std::vector<stan>::iterator it_stan =
rozwiazania.begin();
3737 plik << (iRefBand + (it_stan->poziom)) +
3739 kawalki[i].funkcjafal(x, it_stan->poziom, it_stan->wspolczynniki[2 * i + 1],
3740 it_stan->wspolczynniki[2 * i + 2]);
3742 plik << (iRefBand - (it_stan->poziom)) +
3744 kawalki[i].funkcjafal(x, it_stan->poziom, it_stan->wspolczynniki[2 * i + 1],
3745 it_stan->wspolczynniki[2 * i + 2]);
3755 while(x <= prawa.iks + bok)
3758 std::vector<stan>::iterator it_stan =
rozwiazania.begin();
3762 plik << (iRefBand + (it_stan->poziom)) +
3763 skala * prawa.
funkcjafal(x, it_stan->poziom, it_stan->wspolczynniki.back());
3765 plik << (iRefBand - (it_stan->poziom)) +
3766 skala * prawa.
funkcjafal(x, it_stan->poziom, it_stan->wspolczynniki.back());
3856 std::clog<<
"W f_do_p"<<std::endl;
3858 plik << setw(setw_1) <<
"#";
3859 std::vector<stan>::iterator it_stan =
rozwiazania.begin();
3862 plik << std::fixed << std::scientific;
3864 plik << setw(ee) <<
"E=";
3865 plik << std::fixed << std::scientific;
3866 plik << setw(setw_2-ee) << std::setprecision(prec_2) << (it_stan->poziom);
3870 double szer = prawa.iks - lewa.iks;
3873 double x = lewa.iks - bok;
3874 while(x <= lewa.iks)
3876 plik << std::fixed << std::scientific;
3877 plik << setw(setw_1) << std::setprecision(prec_1) <<
dlugosc_na_A(x)*X;
3882 plik << std::fixed << std::scientific;
3883 plik << setw(setw_2) << std::setprecision(prec_2) << lewa.
funkcjafal(x, it_stan->poziom, it_stan->wspolczynniki[0]);
3889 for(
int i = 0; i <= (int) kawalki.size() - 1; i++)
3891 x = kawalki[i].x_pocz;
3892 while(x <= kawalki[i].x_kon)
3894 plik << setw(setw_1) << std::setprecision(prec_1) <<
dlugosc_na_A(x)*X;
3899 plik << std::fixed << std::scientific;
3900 plik << setw(setw_2) << std::setprecision(prec_2) << kawalki[i].funkcjafal(x, it_stan->poziom, it_stan->wspolczynniki[2*i + 1], it_stan->wspolczynniki[2*i + 2]);
3908 while(x <= prawa.iks + bok)
3910 plik << setw(setw_1) << std::setprecision(prec_1) <<
dlugosc_na_A(x)*X;
3915 plik << std::fixed << std::scientific;
3916 plik << setw(setw_2) << std::setprecision(prec_2) << prawa.
funkcjafal(x, it_stan->poziom, it_stan->wspolczynniki.back());
3927 std::clog <<
"W f_do_p" << std::endl;
3930 plik <<
" E=" << (st.
poziom);
3932 double szer = prawa.iks - lewa.iks;
3933 double bok = szer / 4;
3934 double x = lewa.iks - bok;
3935 while(x <= lewa.iks)
3946 for(
int i = 0; i <= (int)kawalki.size() - 1; i++)
3948 x = kawalki[i].x_pocz;
3949 while(x <= kawalki[i].x_kon)
3956 plik << kawalki[i].funkcjafal(x, st.
poziom, st.wspolczynniki[2 * i + 1], st.wspolczynniki[2 * i + 2]) <<
" ";
3962 while(x <= prawa.iks + bok)
3975double struktura::energia_od_k_na_ntym(
double k,
int nr_war,
int n)
3984 if(nr_war == (
int)kawalki.size() + 1)
3986 war = &kawalki[nr_war - 1];
4003void obszar_aktywny::_obszar_aktywny(
struktura * elektron,
const std::vector<struktura *> & dziury,
double Eg,
4004 const std::vector<double> * DSO,
double chropo,
double matelem,
double Temp)
4027 Egcv = std::vector<double>(dziury.size(), Eg);
4028 int liczba_war = dziury[0]->kawalki.size() + 2;
4032 if(
DeltaSO.size() != liczba_war)
4034 Error err(
"Niepoprawny rozmiar DeltaSO");
4035 err <<
": jest " <<
DeltaSO.size() <<
", powinno byc" << liczba_war;
4039 el_mac.reserve(liczba_war);
4040 for(i = 0;
i < liczba_war;
i++)
4045 el_mac.push_back(matelem);
4047 std::cerr <<
"Elem. mac. dla warstwy " <<
i <<
": " <<
el_mac.back() <<
"\n";
4053void obszar_aktywny::_obszar_aktywny(
struktura * elektron,
const std::vector<struktura *> & dziury,
4054 struktura * elektron_m,
const std::vector<struktura *> & dziury_m,
double Eg,
4055 const std::vector<double> * DSO,
double br,
double matelem,
double Temp)
4061 err <<
"Za mala Liczba rozwian dla struktury elektronowej w strukturze zmodyfikowanej:\n"
4062 <<
"zwykle maja " << (elektron->
rozwiazania.size()) <<
" zmodyfikowane maja "
4068 std::cerr <<
"Liczba rozwian dla struktur elektronowych jest rozna!\n"
4069 <<
"zwykle maja " << (elektron->
rozwiazania.size()) <<
" zmodyfikowane maja "
4072 for( i = 0;
i < (int)dziury.size(); ++
i)
4074 if(dziury[i]->rozwiazania.size() > dziury_m[
i]->rozwiazania.size())
4077 err <<
"Za mala liczba rozwian dla dziur " <<
i <<
" w strukturze zmodyfikowanej:\n"
4078 <<
"zwykle maja " << (dziury[
i]->rozwiazania.size()) <<
" zmodyfikowane maja "
4079 << (dziury_m[i]->rozwiazania.size());
4083 if(dziury[i]->rozwiazania.size() != dziury_m[
i]->rozwiazania.size())
4084 std::cerr <<
"Liczba rozwian dla dziur " << i <<
" jest rozna:\n"
4085 <<
"zwykle maja " << (dziury[i]->rozwiazania.size()) <<
" zmodyfikowane maja "
4086 << (dziury_m[i]->rozwiazania.size());
4089 _obszar_aktywny(elektron, dziury, Eg, DSO, 0., matelem, Temp);
4097 const std::vector<double> & DSO,
double chropo,
double matelem,
double Temp)
4099 _obszar_aktywny(elektron, dziury, Eg, &DSO, chropo, matelem, Temp);
4104 const std::vector<struktura *> dziury_m,
double Eg,
const std::vector<double> & DSO,
4105 double br,
double matelem,
double Temp)
4107 _obszar_aktywny(elektron, dziury, elektron_m, dziury_m, Eg, &DSO, br, matelem, Temp);
4111 double chropo,
double matelem,
double Temp)
4113 DeltaSO.assign(dziury[0]->kawalki.size() + 2, DSO);
4114 _obszar_aktywny(elektron, dziury, Eg,
NULL, chropo, matelem, Temp);
4119 const std::vector<struktura *> dziury_m,
double Eg,
double DSO,
double br,
double Temp,
4123 const std::vector<struktura *> dziury_m,
double Eg,
double DSO,
double br,
4124 double matelem,
double Temp)
4127 DeltaSO.assign(dziury[0]->kawalki.size() + 2, DSO);
4128 _obszar_aktywny(elektron, dziury, elektron_m, dziury_m, Eg,
NULL, br, matelem, Temp);
4136 for(
int ic = 0; ic <= (int)
pasmo_przew.size() - 1; ++ic)
4138 nazwa_konk = nazwa +
"_" +
pasmo_przew[ic]->nazwa;
4139 plik.open(nazwa_konk.c_str());
4140 plik << std::scientific;
4141 for(
int j = 0; j <= (int)
pasmo_przew[ic]->rozwiazania.size() - 1; ++j)
4143 plik <<
pasmo_przew[ic]->rozwiazania[j].poziom <<
" ";
4149 nazwa_konk = nazwa +
"_" +
pasmo_przew[ic]->nazwa +
"_mod";
4150 plik.open(nazwa_konk.c_str());
4151 plik << std::scientific;
4152 for(
int j = 0; j <= (int)
pasmo_przew_mod[ic]->rozwiazania.size() - 1; ++j)
4161 for(
int iv = 0; iv <= (int)
pasmo_wal.size() - 1; ++iv)
4163 nazwa_konk = nazwa +
"_" +
pasmo_wal[iv]->nazwa;
4164 plik.open(nazwa_konk.c_str());
4165 plik << std::scientific;
4166 for(
int j = 0; j <= (int)
pasmo_wal[iv]->rozwiazania.size() - 1; ++j)
4168 plik <<
pasmo_wal[iv]->rozwiazania[j].poziom <<
" ";
4174 nazwa_konk = nazwa +
"_" +
pasmo_wal[iv]->nazwa +
"_mod";
4175 plik.open(nazwa_konk.c_str());
4176 plik << std::scientific;
4177 for(
int j = 0; j <= (int)
pasmo_wal_mod[iv]->rozwiazania.size() - 1; ++j)
4193 for(
int nrpoz_el = 0; nrpoz_el <= int(el->
rozwiazania.size()) - 1; nrpoz_el++)
4194 for(
int nrpoz_dziu = 0; nrpoz_dziu <= int(dziu->
rozwiazania.size()) - 1; nrpoz_dziu++)
4197 plik << E0 <<
" " << ((*m_prz)[nrpoz_el][nrpoz_dziu]) <<
"\n";
4204 for(
int i = 0; i <= (int)
pasmo_przew.size() - 1; i++)
4205 for(
int j = 0; j <= (int)
pasmo_wal.size() - 1; j++)
4219 std::cerr <<
"W funkcji policz_calki. " << elektron->
rozwiazania.size() <<
"x" << dziura->
rozwiazania.size() <<
"\n";
4221 for(
int i = 0; i <= (int)elektron->
rozwiazania.size() - 1; i++)
4222 for(
int j = 0; j <= (int)dziura->
rozwiazania.size() - 1; j++)
4224 tymcz =
calka_ij(elektron, dziura, i, j, wekt_calk_kaw[i][j]);
4225 macierz[i][j] = tymcz * tymcz;
4255 double Ac, Bc, Av, Bv;
4266 if(nr_war == (
int)struk1->kawalki.size() + 1)
4276 Ac = struk1->
rozwiazania[i].wspolczynniki[2 * nr_war + 1];
4277 Av = struk2->
rozwiazania[j].wspolczynniki[2 * nr_war + 1];
4278 Bc = struk1->
rozwiazania[i].wspolczynniki[2 * nr_war + 2];
4279 Bv = struk2->
rozwiazania[j].wspolczynniki[2 * nr_war + 2];
4281 wynik = (struk1->kawalki[nr_war].funkcjafal(x, Ec, Ac, Bc) * struk2->kawalki[nr_war].funkcjafal_prim(x, Ev, Av, Bv) -
4282 struk1->kawalki[nr_war].funkcjafal_prim(x, Ec, Ac, Bc) * struk2->kawalki[nr_war].funkcjafal(x, Ev, Av, Bv)) /
4283 (struk1->kawalki[nr_war].k_kwadr(Ec) - struk2->kawalki[nr_war].k_kwadr(Ev));
4291 std::clog <<
"\nW calk numer. Warstwa " << nr_war <<
" poziom el " << i <<
" poziom j " << j <<
"\n";
4296 double Ac, Bc, Av, Bv;
4298 double x_pocz = struk1->kawalki[nr_war].x_pocz;
4299 double x_kon = struk1->kawalki[nr_war].x_kon;
4300 double szer = x_kon - x_pocz;
4301 int podzial = ceill(szer / krok);
4302 krok = szer / podzial;
4303 Ac = struk1->
rozwiazania[i].wspolczynniki[2 * nr_war + 1];
4304 Av = struk2->
rozwiazania[j].wspolczynniki[2 * nr_war + 1];
4305 Bc = struk1->
rozwiazania[i].wspolczynniki[2 * nr_war + 2];
4306 Bv = struk2->
rozwiazania[j].wspolczynniki[2 * nr_war + 2];
4307 double x = x_pocz + krok / 2;
4310 for(ii = 0; ii <= podzial - 1; ii++)
4313 std::clog <<
"\nwynik = " << wynik <<
" ";
4315 wynik += struk1->kawalki[nr_war].funkcjafal(x, Ec, Ac, Bc) * struk2->kawalki[nr_war].funkcjafal(x, Ev, Av, Bv);
4323 vector<double> & wektor_calk_kaw)
4327 double xk = elektron->lewa.iks;
4328 double Ac, Bc, Av, Bv;
4329 double calk_kaw = 0;
4334 calka = calka / (elektron->lewa.
k_kwadr(Ec) - dziura->lewa.
k_kwadr(Ev));
4335 wektor_calk_kaw.push_back(calka);
4337 double pierwk, pierwp, xp;
4338 for(
int war = 0; war <= (int)elektron->kawalki.size() - 1; war++)
4340 if((elektron->kawalki[war].pole == 0) &&
4341 (dziura->kawalki[war].pole == 0))
4343 xp = elektron->kawalki[war].x_pocz;
4344 xk = elektron->kawalki[war].x_kon;
4346 Ac = elektron->
rozwiazania[i].wspolczynniki[2 * war + 1];
4347 Av = dziura->
rozwiazania[j].wspolczynniki[2 * war + 1];
4348 Bc = elektron->
rozwiazania[i].wspolczynniki[2 * war + 2];
4349 Bv = dziura->
rozwiazania[j].wspolczynniki[2 * war + 2];
4352 elektron->kawalki[war].funkcjafal(xk, Ec, Ac, Bc) * dziura->kawalki[war].funkcjafal_prim(xk, Ev, Av, Bv) -
4353 elektron->kawalki[war].funkcjafal_prim(xk, Ec, Ac, Bc) * dziura->kawalki[war].funkcjafal(xk, Ev, Av, Bv);
4355 elektron->kawalki[war].funkcjafal(xp, Ec, Ac, Bc) * dziura->kawalki[war].funkcjafal_prim(xp, Ev, Av, Bv) -
4356 elektron->kawalki[war].funkcjafal_prim(xp, Ec, Ac, Bc) * dziura->kawalki[war].funkcjafal(xp, Ev, Av, Bv);
4357 calk_kaw = (pierwk - pierwp) / (elektron->kawalki[war].k_kwadr(Ec) - dziura->kawalki[war].k_kwadr(Ev));
4358 wektor_calk_kaw.push_back(calk_kaw);
4364 wektor_calk_kaw.push_back(calk_kaw);
4369 xp = elektron->prawa.iks;
4371 Ac = elektron->
rozwiazania[i].wspolczynniki.back();
4376 wektor_calk_kaw.push_back(calk_kaw);
4384 std::cerr <<
"W funkcji zrob_macierze_przejsc\n";
4386 A2D * macierz_calek;
4395 for(
int c = 0; c <= (int)
pasmo_przew.size() - 1; c++)
4397 for(
int v = 0; v <= (int)
pasmo_wal.size() - 1; v++)
4440 if(nr_war < (
int)
pasmo_przew[0]->kawalki.size() + 1)
4443 warv = &
pasmo_wal[0]->kawalki[nr_war - 1];
4451 double Eg =
Egcv[0] + warc->y_pocz + warv->y_pocz;
4453 std::cerr <<
"\nW elemencie: Eg = " << Eg <<
"\n";
4455 return (1 / warc->masa_p(0.) - 1) * (Eg +
DeltaSO[nr_war]) * Eg / (Eg + 2 *
DeltaSO[nr_war] / 3) / 2;
4460 for(
int i = 0; i < (int)
el_mac.size(); i++)
4463 std::cout <<
el_mac[i] <<
"\n";
4469 double m = (1 / mc + 1 / mv);
4470 return sqrt(2 * E / m);
4475 double m = (1 / mc + 1 / mv);
4484 err <<
"\nsigma = " << sigma <<
"!\n";
4487 return 0.5 * (1 + erf((E - E0) / (
sqrt(2) * sigma)));
4497 err <<
"\nsigma = " << sigma <<
"!\n";
4500 double m = (1 / mc + 1 / mv);
4519 double szdowzm,
Wersja wersja)
4530 double szergwiazd = 0.0;
4541 for(j = 0; j <= (int)
pasma->
pasmo_wal[i]->gwiazdki.size() - 1; ++j)
4567 std::cerr<<
"\nW ifie szer_do_wzmoc = "<<
szer_do_wzmoc<<
"\n";
4575 std::cerr <<
"\nszer_do_wzmoc = " << szdowzm <<
" A\n szergwiad = " << (szergwiazd *
struktura::przelm)
4592 for(
size_t i = 0; i <=
pasma->
Egcv.size() - 1; i++)
4601 double Fp, Fk, krok;
4616 err <<
"Za malo nosnikow!\n";
4633 double Fp, Fk, krok;
4643 err <<
"Za malo nosnikow!\n";
4723 std::vector<double> konce, koncetym;
4724 std::vector<struktura *>::const_iterator piter =
pasma->
pasmo_przew.begin();
4725 konce = (*piter)->koncentracje_w_warstwach(
qFlc,
T);
4729 koncetym = (*piter)->koncentracje_w_warstwach(
qFlc,
T);
4731 for(
int i = 0; i <= (int)konce.size() - 1; ++i)
4733 konce[i] += koncetym[i];
4736 for(
int i = 0; i <= (int)konce.size() - 1; ++i)
4745 std::vector<double> konce, koncetym;
4746 std::vector<struktura *>::const_iterator piter =
pasma->
pasmo_wal.begin();
4748 (*piter)->koncentracje_w_warstwach(-
qFlv,
T);
4752 koncetym = (*piter)->koncentracje_w_warstwach(-
qFlv,
T);
4754 for(
int i = 0; i <= (int)konce.size() - 1; ++i)
4756 konce[i] += koncetym[i];
4759 for(
int i = 0; i <= (int)konce.size() - 1; ++i)
4812 std::clog.precision(12);
4826 double x,
fc, fp, fl, xlp, xpp;
4827 fl = (this->*f)(xl);
4828 fp = (this->*f)(xp);
4829 xlp = (xl + xp) / 2;
4833 x = xp - fp * (xp - xl) / (fp - fl);
4869 while(xp - xl >= dokl);
4884 double E0min = E0pop;
4889 for(
int nr_v = 0; nr_v <= (int)
pasma->
pasmo_wal.size() - 1; nr_v++)
4894 E0min = (E0pop >= E0min) ? E0min : E0pop;
4900 double epm = 1.13 / a;
4901 double eppm = 1. / (a * a);
4902 double epppm = 2.5 / (a * a * a);
4903 double eppppm = 5 / (a * a * a * a);
4905 double lm = 1 /
M_PI;
4906 double lpm = 0.2 /
b;
4907 double lppm = 0.7 / (
b *
b);
4908 double lpppm = 1.5 / (
b *
b *
b);
4909 double lppppm = 24 /
M_PI / (
b *
b *
b *
b);
4910 double czwpoch0b = (em * lppppm + 4 * epm * lpppm + 6 * eppm * lppm + 4 * epppm * lpm +
4913 double jedenplusR2 = 1 + R * R;
4915 1 / (
M_PI * jedenplusR2);
4916 double lpmR = 2 * R / (
M_PI * jedenplusR2 * jedenplusR2) /
b;
4917 double lppmR = (6 * R * R - 2) / (
M_PI * jedenplusR2 * jedenplusR2 * jedenplusR2) / (
b *
b);
4918 double lpppmR = 24 * R * (R * R - 1) / (
M_PI * jedenplusR2 * jedenplusR2 * jedenplusR2 * jedenplusR2) / (
b *
b *
b);
4919 double lppppmR = (120 * R * R * R * R - 240 * R * R + 24) /
4920 (
M_PI * jedenplusR2 * jedenplusR2 * jedenplusR2 * jedenplusR2 * jedenplusR2) / (
b *
b *
b *
b);
4921 double czwpochRb = (em * lppppmR + 4 * epm * lpppmR + 6 * eppm * lppmR + 4 * epppm * lpmR + eppppm * lmR);
4923 int n0 =
pow(2 * R, 5. / 4) *
b *
pow(czwpoch0b / (180 * blad), 0.25);
4924 int nR =
pow((32 - R), 5. / 4) *
b *
pow(czwpochRb / (180 * blad), 0.25);
4942 double szer = 2 * R *
b;
4943 double h = szer / n0;
4944 double x2j, x2jm1, x2jm2;
4947 for(j = 1; j <= n0 / 2; j++)
4949 x2j = -R *
b + 2 * j * h;
4957 szer = (32 - R) *
b;
4960 for(j = 1; j <= nR / 2; j++)
4962 x2j = -32 *
b + 2 * j * h;
4968 for(j = 1; j <= nR / 2; j++)
4970 x2j = R *
b + 2 * j * h;
4977 double calka = calka1 + calka2;
4979 std::clog <<
"\na = " << a <<
"\t4poch = " << czwpoch0b <<
"\tn0 = " << n0 <<
"\tnR = " << nR <<
"\tcalka = " << calka
4997 for(
int nrpoz_el = 0; nrpoz_el <= int(el->
rozwiazania.size()) - 1; nrpoz_el++)
4998 for(
int nrpoz_dziu = 0; nrpoz_dziu <= int(dziu->
rozwiazania.size()) - 1; nrpoz_dziu++)
5009 posz_en =
posz_z_chrop(nr_c, nrpoz_el, nr_v, nrpoz_dziu);
5012 posz_en =
posz_z_br(nr_c, nrpoz_el, nr_v, nrpoz_dziu);
5018 if(((*m_prz)[nrpoz_el][nrpoz_dziu] > 0.005) && (E - E0 > -8 * posz_en))
5040 for(
int nrpoz_el = 0; nrpoz_el <= int(el->
rozwiazania.size()) - 1; nrpoz_el++)
5041 for(
int nrpoz_dziu = 0; nrpoz_dziu <= int(dziu->
rozwiazania.size()) - 1; nrpoz_dziu++)
5050 posz_en =
posz_z_chrop(nr_c, nrpoz_el, nr_v, nrpoz_dziu);
5053 posz_en =
posz_z_br(nr_c, nrpoz_el, nr_v, nrpoz_dziu);
5060 if(((*m_prz)[nrpoz_el][nrpoz_dziu] > 0.005) && (E - E0 > -8 * posz_en))
5083 double przekr_w_war;
5085 std::vector<double> calki_kawalki;
5089 double srednia_masa_el = el->
rozwiazania[poz_c].prawdopodobienstwa[0] * el->lewa.masa_r;
5090 double srednia_masa_dziu = dziu->
rozwiazania[poz_v].prawdopodobienstwa[0] * dziu->lewa.masa_r;
5092 for(i = 0; i <= (int)el->kawalki.size() - 1; i++)
5095 srednia_masa_el += el->
rozwiazania[poz_c].prawdopodobienstwa[i + 1] * el->kawalki[i].masa_r;
5096 srednia_masa_dziu += dziu->
rozwiazania[poz_v].prawdopodobienstwa[i + 1] * dziu->kawalki[i].masa_r;
5098 int ost_ind = el->kawalki.size() + 1;
5100 srednia_masa_el += el->
rozwiazania[poz_c].prawdopodobienstwa[ost_ind] * el->prawa.masa_r;
5101 srednia_masa_dziu += dziu->
rozwiazania[poz_v].prawdopodobienstwa[ost_ind] * dziu->prawa.masa_r;
5107 double srednie_k_zeznakiem =
5108 (E - E0 > 0) ?
kodE(E - E0, srednia_masa_el, srednia_masa_dziu) : -
kodE(E0 - E, srednia_masa_el, srednia_masa_dziu);
5122 posz_en =
posz_z_br(nr_c, poz_c, nr_v, poz_v);
5126 double sr_E_E0_dod = posz_en / (
sqrt(2 *
struktura::pi)) * exp(-(E - E0) * (E - E0) / (2 * posz_en * posz_en)) +
5131 cos2tet = (E0 > Eg) ? (E0 - Eg) / (sr_E_E0_dod + E0 - Eg) : 1.;
5135 przekr_w_war = calki_kawalki[0];
5137 mnoznik_pol = (dziu->
typ ==
struktura::hh) ? (1 + cos2tet + polar * (1 - 3 * cos2tet)) / 2
5138 : (5 - 3 * cos2tet + 3 * polar * (3 - cos2tet)) / 6;
5143 for(i = 0; i <= (int)el->kawalki.size() - 1; i++)
5146 dziu->kawalki[i].y_pocz;
5148 cos2tet = (E0 > Eg) ? (E0 - Eg) / (sr_E_E0_dod + E0 - Eg) : 1.;
5149 mnoznik_pol = (dziu->
typ ==
struktura::hh) ? (1 + cos2tet + polar * (1 - 3 * cos2tet)) / 2
5150 : (5 - 3 * cos2tet + 3 * polar * (3 - cos2tet)) / 6;
5156 przekr_w_war = calki_kawalki[i + 1];
5161 przekr_w_war = calki_kawalki.back();
5162 double energia_elektronu =
5163 el->
rozwiazania[poz_c].poziom + srednie_k_zeznakiem * abs(srednie_k_zeznakiem) / (2 * srednia_masa_el);
5164 double energia_dziury =
5165 dziu->
rozwiazania[poz_v].poziom + srednie_k_zeznakiem * abs(srednie_k_zeznakiem) / (2 * srednia_masa_dziu);
5171 cos2tet = (E0 > Eg) ? (E0 - Eg) / (sr_E_E0_dod + E0 - Eg) : 1.;
5172 mnoznik_pol = (dziu->
typ ==
struktura::hh) ? (1 + cos2tet + polar * (1 - 3 * cos2tet)) / 2
5173 : (5 - 3 * cos2tet + 3 * polar * (3 - cos2tet)) / 6;
5182 wynik *=
rored_posz(E, E0, srednia_masa_el, srednia_masa_dziu, posz_en) * rozn_obsadzen;
5202 double przekr_w_war;
5203 std::vector<double> calki_kawalki;
5204 double srednia_masa_el = el->
rozwiazania[poz_c].prawdopodobienstwa[0] * el->lewa.masa_r;
5205 double srednia_masa_dziu = dziu->
rozwiazania[poz_v].prawdopodobienstwa[0] * dziu->lewa.masa_r;
5207 for(i = 0; i <= (int)el->kawalki.size() - 1; i++)
5209 srednia_masa_el += el->
rozwiazania[poz_c].prawdopodobienstwa[i + 1] * el->kawalki[i].masa_r;
5210 srednia_masa_dziu += dziu->
rozwiazania[poz_v].prawdopodobienstwa[i + 1] * dziu->kawalki[i].masa_r;
5212 int ost_ind = el->kawalki.size() + 1;
5213 srednia_masa_el += el->
rozwiazania[poz_c].prawdopodobienstwa[ost_ind] * el->prawa.masa_r;
5214 srednia_masa_dziu += dziu->
rozwiazania[poz_v].prawdopodobienstwa[ost_ind] * dziu->prawa.masa_r;
5227 posz_en =
posz_z_br(nr_c, poz_c, nr_v, poz_v);
5232 double srednie_k_zeznakiem =
5233 (E - E0 > 0) ?
kodE(E - E0, srednia_masa_el, srednia_masa_dziu) : -
kodE(E0 - E, srednia_masa_el, srednia_masa_dziu);
5235 double sr_E_E0_dod = posz_en / (
sqrt(2 *
struktura::pi)) * exp(-(E - E0) * (E - E0) / (2 * posz_en * posz_en)) +
5240 cos2tet = (E0 > Eg) ? (E0 - Eg) / (sr_E_E0_dod + E0 - Eg) : 1.;
5243 przekr_w_war = calki_kawalki[0];
5244 mnoznik_pol = (dziu->
typ ==
struktura::hh) ? (1 + cos2tet + polar * (1 - 3 * cos2tet)) / 2
5245 : (5 - 3 * cos2tet + 3 * polar * (3 - cos2tet)) / 6;
5249 for(i = 0; i <= (int)el->kawalki.size() - 1; i++)
5253 dziu->kawalki[i].y_pocz;
5257 cos2tet = (E0 > Eg) ? (E0 - Eg) / (sr_E_E0_dod + E0 - Eg) : 1.;
5259 mnoznik_pol = (dziu->
typ ==
struktura::hh) ? (1 + cos2tet + polar * (1 - 3 * cos2tet)) / 2
5260 : (5 - 3 * cos2tet + 3 * polar * (3 - cos2tet)) / 6;
5264 przekr_w_war = calki_kawalki[i + 1];
5268 przekr_w_war = calki_kawalki.back();
5269 double energia_elektronu = el->
rozwiazania[poz_c].poziom +
5270 srednie_k_zeznakiem * abs(srednie_k_zeznakiem) / (2 * srednia_masa_el);
5271 double energia_dziury =
5272 dziu->
rozwiazania[poz_v].poziom + srednie_k_zeznakiem * abs(srednie_k_zeznakiem) / (2 * srednia_masa_dziu);
5282 cos2tet = (E0 > Eg) ? (E0 - Eg) / (sr_E_E0_dod + E0 - Eg) : 1.;
5283 mnoznik_pol = (dziu->
typ ==
struktura::hh) ? (1 + cos2tet + polar * (1 - 3 * cos2tet)) / 2
5284 : (5 - 3 * cos2tet + 3 * polar * (3 - cos2tet)) / 6;
5290 wynik *=
rored_posz(E, E0, srednia_masa_el, srednia_masa_dziu, posz_en) * obsadzenia;
5302 for(
int nr_v = 0; nr_v <= (int)
pasma->
pasmo_wal.size() - 1; nr_v++)
5311 for(
int nr_v = 0; nr_v <= (int)
pasma->
pasmo_wal.size() - 1; nr_v++)
5318 double wynikTE, wynikTM;
5319 for(
double E = pocz; E <= kon; E += krok)
5321 wynikTE = 0; wynikTM = 0;
5323 for(
int nr_v = 0; nr_v <= (int)
pasma->
pasmo_wal.size() - 1; nr_v++)
5327 std::cerr<<E<<
" "<<wynikTE<<
" "<<wynikTM<<
"\n";
5330 plik << E <<
" " << wynikTE <<
" " << wynikTM <<
"\n";
5337 for(
double E = pocz; E <= kon; E += krok)
5345 double wynikTE = 0., wynikTM = 0.;
5347 for (
int nr_v = 0; nr_v <= (int)
pasma->
pasmo_wal.size() - 1; nr_v++)
5354 else if (polar == 1.)
5357 return (wynikTE + wynikTM);
5367 double wynikTE, wynikTM;
5368 for(
double E = pocz; E <= kon; E += krok)
5374 for(
int nr_v = 0; nr_v <= (int)
pasma->
pasmo_wal.size() - 1; nr_v++)
5379 plik <<
"\t" << wynikTE <<
" " << wynikTM;
5387 double wynikTE, wynikTM;
5388 for(
double L = pocz;
L <= kon;
L += krok)
5393 for(
int nr_v = 0; nr_v <= (int)
pasma->
pasmo_wal.size() - 1; nr_v++)
5398 plik<<
L<<
" "<<wynikTE<<
" "<<wynikTM<<
"\n";
5409 for(
int nr_v = 0; nr_v <= (int)
pasma->
pasmo_wal.size() - 1; nr_v++)
5412 min_E0 = (min_E0 < lok_min_E0) ? min_E0 : lok_min_E0;
5415 double posz_en = 2 * (min_E0 - minimalna_przerwa) *
pasma->
chrop;
5416 double pocz = min_E0 - 2 * posz_en;
5420 std::clog <<
"\nW mocy. pocz = " << pocz <<
" kon = " << kon <<
"\n";
5424 for(
double E = pocz; E <= kon; E += krok)
5427 for(
int nr_v = 0; nr_v <= (int)
pasma->
pasmo_wal.size() - 1; nr_v++)
5432 return wynik * krok;
5438 return 1 / (1 + exp(arg));
5444 return 1 / (1 + exp(arg));
5462 double srednia_ekz_el = 0;
5463 double srednia_ekz_dziu = 0;
5468 for(
int i = 0; i <= (int)el->kawalki.size() - 1; i++)
5471 srdno = (el->kawalki[i].y_pocz + el->kawalki[i].y_kon) / 2;
5472 grub = (el->kawalki[i].x_kon - el->kawalki[i].x_pocz);
5476 (Eklok > 0) ? el->
rozwiazania[poz_c].prawdopodobienstwa[i + 1] * Eklok : 0;
5477 srdno = (dziu->kawalki[i].y_pocz + dziu->kawalki[i].y_kon) / 2;
5480 srednia_ekz_dziu = (Eklok > 0) ? dziu->
rozwiazania[poz_v].prawdopodobienstwa[i + 1] * Eklok : 0;
5481 posz_en += 2 * (srednia_ekz_el + srednia_ekz_dziu) *
pasma->
chrop / grub;
5499 err <<
"\nNie ma drugiej struktury!\n";
5506 if(poz_c > rozmmodel - 1)
5512 if(poz_v > rozmmoddziu - 1)
5519 double dE = dEe + dEd;
5520 dE = (dE >= 0) ? dE : -dE;