void graphics::NgoiLang(QPainter& painter,int x,int y,int c,int r) { QPoint A(x-r/2,y+c); QPoint B(x+r/2,y+c); QPoint C(x+r/2,y+c/3); QPoint D(x,y); QPoint E(x-r/2,y+c/3); QPolygon poly1; poly1 << D << E << A << B << C; painter.drawPolygon(poly1); // ve cai cua QPoint A1(x,y+c); QPoint B1(x,y+2*c/3); QPoint C1(x-r/4,y+2*c/3); QPoint D1(x-r/4,y+c); QPolygon poly2; poly2 << A1 << B1 << C1 << D1; painter.drawPolyline(poly2); // ve cua so QPoint A11(x-r/4,y+c/6); QPoint B11(x-r/4,y); QPoint C11(x-r/8,y); QPoint D11(x-r/8,y+c/12); QPolygon poly21; poly21 << A11 << B11 << C11 << D11; painter.drawPolygon(poly21); painter.drawRect(x+r/4,y+c/2.5,c/10,r/10); }
int main() { const int sz=7; CArray A(sz); A(0) = complex<float>(1,2); A(1) = complex<float>(3,4); Array<float,1> Ar = real(A); BZTEST(int(Ar(0)) == 1 && int(Ar(1)) == 3); Array<float,1> Ai = imag(A); BZTEST(int(Ai(0)) == 2 && int(Ai(1)) == 4); CArray Ac(sz); Ac = conj(A); BZTEST(Ac(0) == complex<float>(1,-2)); BZTEST(Ac(1) == complex<float>(3,-4)); Array<float,1> Ab(sz); Ab = abs(A); BZTEST(fabs(Ab(0) - 2.236068) < eps); BZTEST(fabs(Ab(1) - 5.0) < eps); Ab = arg(A); BZTEST(fabs(Ab(0) - atan(2.0)) < eps); BZTEST(fabs(Ab(1) - atan(4.0/3.0)) < eps); Array<float,1> r(sz), theta(sz); r(0) = 4.0f; r(1) = 15.0f; theta(0) = float(3.141592/3.0); theta(1) = float(3.0*3.141592/2.0); Ac = blitz::polar(r,theta); BZTEST(fabs(real(Ac(0)) - 2) < eps); BZTEST(fabs(imag(Ac(0)) - 3.4641012) < eps); BZTEST(fabs(real(Ac(1)) - 0.0) < eps); BZTEST(fabs(imag(Ac(1)) + 15.0) < eps); Array<complex<long double>,1> A11(5),B11(5),C11(5); A11=1,2,3,4,5; B11=1,2,3,4,5; C11=A11+B11; BZTEST(fabs(real(C11(0)) - 2.) < eps); C11=A11/B11; BZTEST(fabs(real(C11(1)) - 1.) < eps); C11=1.0l/A11; BZTEST(fabs(real(C11(2)) - 1/3.) < eps); C11=A11/1.0l; BZTEST(fabs(real(C11(3)) - 4.) < eps); C11=complex<long double>(0,1)/A11; BZTEST(fabs(imag(C11(4)) - 1/5.) < eps); C11=A11/complex<long double>(0,1); BZTEST(fabs(imag(C11(0)) - -1.) < eps); return 0; }
inline void GemmNNDot ( T alpha, const DistMatrix<T>& A, const DistMatrix<T>& B, T beta, DistMatrix<T>& C ) { #ifndef RELEASE PushCallStack("internal::GemmNNDot"); if( A.Grid() != B.Grid() || B.Grid() != C.Grid() ) throw std::logic_error ("{A,B,C} must be distributed over the same grid"); if( A.Height() != C.Height() || B.Width() != C.Width() || A.Width() != B.Height() ) { std::ostringstream msg; msg << "Nonconformal GemmNNDot: \n" << " A ~ " << A.Height() << " x " << A.Width() << "\n" << " B ~ " << B.Height() << " x " << B.Width() << "\n" << " C ~ " << C.Height() << " x " << C.Width() << "\n"; throw std::logic_error( msg.str().c_str() ); } #endif const Grid& g = A.Grid(); if( A.Height() > B.Width() ) { // Matrix views DistMatrix<T> AT(g), AB(g), A0(g), A1(g), A2(g); DistMatrix<T> BL(g), B0(g), BR(g), B1(g), B2(g); DistMatrix<T> CT(g), C0(g), C1L(g), C1R(g), CB(g), C1(g), C10(g), C11(g), C12(g), C2(g); // Temporary distributions DistMatrix<T,STAR,VC> A1_STAR_VC(g); DistMatrix<T,VC,STAR> B1_VC_STAR(g); DistMatrix<T,STAR,STAR> C11_STAR_STAR(g); // Star the algorithm Scale( beta, C ); LockedPartitionDown ( A, AT, AB, 0 ); PartitionDown ( C, CT, CB, 0 ); while( AB.Height() > 0 ) { LockedRepartitionDown ( AT, A0, /**/ /**/ A1, AB, A2 ); RepartitionDown ( CT, C0, /**/ /**/ C1, CB, C2 ); A1_STAR_VC = A1; B1_VC_STAR.AlignWith( A1_STAR_VC ); LockedPartitionRight( B, BL, BR, 0 ); PartitionRight( C1, C1L, C1R, 0 ); while( BR.Width() > 0 ) { LockedRepartitionRight ( BL, /**/ BR, B0, /**/ B1, B2 ); RepartitionRight ( C1L, /**/ C1R, C10, /**/ C11, C12 ); Zeros( C11.Height(), C11.Width(), C11_STAR_STAR ); //------------------------------------------------------------// B1_VC_STAR = B1; LocalGemm ( NORMAL, NORMAL, alpha, A1_STAR_VC, B1_VC_STAR, T(0), C11_STAR_STAR ); C11.SumScatterUpdate( T(1), C11_STAR_STAR ); //------------------------------------------------------------// SlideLockedPartitionRight ( BL, /**/ BR, B0, B1, /**/ B2 ); SlidePartitionRight ( C1L, /**/ C1R, C10, C11, /**/ C12 ); } B1_VC_STAR.FreeAlignments(); SlideLockedPartitionDown ( AT, A0, A1, /**/ /**/ AB, A2 ); SlidePartitionDown ( CT, C0, C1, /**/ /**/ CB, C2 ); } } else { // Matrix views DistMatrix<T> AT(g), AB(g), A0(g), A1(g), A2(g); DistMatrix<T> BL(g), B0(g), BR(g), B1(g), B2(g); DistMatrix<T> CL(g), CR(g), C1T(g), C01(g), C0(g), C1(g), C2(g), C1B(g), C11(g), C21(g); // Temporary distributions DistMatrix<T,STAR,VR> A1_STAR_VR(g); DistMatrix<T,VR,STAR> B1_VR_STAR(g); DistMatrix<T,STAR,STAR> C11_STAR_STAR(g); // Star the algorithm Scale( beta, C ); LockedPartitionRight( B, BL, BR, 0 ); PartitionRight( C, CL, CR, 0 ); while( BR.Width() > 0 ) { LockedRepartitionRight ( BL, /**/ BR, B0, /**/ B1, B2 ); RepartitionRight ( CL, /**/ CR, C0, /**/ C1, C2 ); B1_VR_STAR = B1; A1_STAR_VR.AlignWith( B1_VR_STAR ); LockedPartitionDown ( A, AT, AB, 0 ); PartitionDown ( C1, C1T, C1B, 0 ); while( AB.Height() > 0 ) { LockedRepartitionDown ( AT, A0, /**/ /**/ A1, AB, A2 ); RepartitionDown ( C1T, C01, /***/ /***/ C11, C1B, C21 ); Zeros( C11.Height(), C11.Width(), C11_STAR_STAR ); //------------------------------------------------------------// A1_STAR_VR = A1; LocalGemm ( NORMAL, NORMAL, alpha, A1_STAR_VR, B1_VR_STAR, T(0), C11_STAR_STAR ); C11.SumScatterUpdate( T(1), C11_STAR_STAR ); //------------------------------------------------------------// SlideLockedPartitionDown ( AT, A0, A1, /**/ /**/ AB, A2 ); SlidePartitionDown ( C1T, C01, C11, /***/ /***/ C1B, C21 ); } A1_STAR_VR.FreeAlignments(); SlideLockedPartitionRight ( BL, /**/ BR, B0, B1, /**/ B2 ); SlidePartitionRight ( CL, /**/ CR, C0, C1, /**/ C2 ); } } #ifndef RELEASE PopCallStack(); #endif }
void sirius_v500(std::vector<Element>& the_ring) { int harmonic_number = 864; //double energy = 3e9; // AC10_5 double qaf_strength = 2.536876; double qad_strength = -2.730416; double qbd2_strength = -3.961194; double qbf_strength = 3.902838; double qbd1_strength = -2.966239; double qf1_strength = 2.367821; double qf2_strength = 3.354286; double qf3_strength = 3.080632; double qf4_strength = 2.707639; double sa1_strength = -115.7829759411277/2; double sa2_strength = 49.50386128829739/2; double sb1_strength = -214.5386552515188/2; double sb2_strength = 133.1252391065637/2; double sd1_strength = -302.6188062085843/2; double sf1_strength = 369.5045185071228/2; double sd2_strength = -164.3042864671946/2; double sd3_strength = -289.9270429064217/2; double sf2_strength = 333.7039740852999/2; //""" --- drift spaces --- """ double id_length = 2.0; // [m] Element dia1 = Element::drift("dia", id_length/2); Element dia2 = Element::drift("dia", 3.26920 + 3.65e-3 - id_length/2); Element dib1 = Element::drift("dib", id_length/2); Element dib2 = Element::drift("dib", 2.909200 + 3.65e-3 - id_length/2); Element d10 = Element::drift("d10", 0.100000); Element d11 = Element::drift("d11", 0.110000); Element d12 = Element::drift("d12", 0.120000); Element d13 = Element::drift("d13", 0.130000); Element d15 = Element::drift("d15", 0.150000); Element d17 = Element::drift("d17", 0.170000); Element d18 = Element::drift("d18", 0.180000); Element d20 = Element::drift("d20", 0.200000); Element d22 = Element::drift("d22", 0.220000); Element d23 = Element::drift("d23", 0.230000); Element d26 = Element::drift("d26", 0.260000); Element d32 = Element::drift("d32", 0.320000); Element d44 = Element::drift("d44", 0.440000); //""" --- markers --- """ Element mc = Element::marker("mc"); Element mia = Element::marker("mia"); Element mib = Element::marker("mib"); Element mb1 = Element::marker("mb1"); Element mb2 = Element::marker("mb2"); Element mb3 = Element::marker("mb3"); Element inicio = Element::marker("inicio"); Element fim = Element::marker("fim"); Element mida = Element::marker("id_enda"); Element midb = Element::marker("id_endb"); //""" --- beam position monitors --- """ Element mon = Element::marker("BPM"); //""" --- quadrupoles --- """ Element qaf = Element::quadrupole("qaf", 0.340000, qaf_strength); Element qad = Element::quadrupole("qad", 0.140000, qad_strength); Element qbd2 = Element::quadrupole("qbd2", 0.140000, qbd2_strength); Element qbf = Element::quadrupole("qbf", 0.340000, qbf_strength); Element qbd1 = Element::quadrupole("qbd1", 0.140000, qbd1_strength); Element qf1 = Element::quadrupole("qf1", 0.250000, qf1_strength); Element qf2 = Element::quadrupole("qf2", 0.250000, qf2_strength); Element qf3 = Element::quadrupole("qf3", 0.250000, qf3_strength); Element qf4 = Element::quadrupole("qf4", 0.250000, qf4_strength); //""" --- bending magnets --- """ double deg_2_rad = (M_PI/180.0); std::string dip_nam; double dip_len, dip_ang, dip_K, dip_S; Element h1, h2; //""" -- b1 -- """ dip_nam = "b1"; dip_len = 0.828080; dip_ang = 2.766540 * deg_2_rad; dip_K = -0.78; dip_S = 0; h1 = Element::rbend(dip_nam, dip_len/2, dip_ang/2, 1*dip_ang/2, 0*dip_ang/2, dip_K, dip_S); h2 = Element::rbend(dip_nam, dip_len/2, dip_ang/2, 0*dip_ang/2, 1*dip_ang/2, dip_K, dip_S); std::vector<Element> B1 = {h1, mb1, h2}; //""" -- b2 -- """ dip_nam = "b2"; dip_len = 1.228262; dip_ang = 4.103510 * deg_2_rad; dip_K = -0.78; dip_S = 0.00; h1 = Element::rbend(dip_nam, dip_len/2, dip_ang/2, 1*dip_ang/2, 0*dip_ang/2, dip_K, dip_S); h2 = Element::rbend(dip_nam, dip_len/2, dip_ang/2, 0*dip_ang/2, 1*dip_ang/2, dip_K, dip_S); std::vector<Element> B2 = {h1, mb2, h2}; //""" -- b3 -- """ dip_nam = "b3"; dip_len = 0.428011; dip_ang = 1.429950 * deg_2_rad; dip_K = -0.78; dip_S = 0.00; h1 = Element::rbend(dip_nam, dip_len/2, dip_ang/2, 1*dip_ang/2, 0*dip_ang/2, dip_K, dip_S); h2 = Element::rbend(dip_nam, dip_len/2, dip_ang/2, 0*dip_ang/2, 1*dip_ang/2, dip_K, dip_S); std::vector<Element> B3 = {h1, mb3, h2}; //""" -- bc -- """ dip_nam = "bc"; dip_len = 0.125394; dip_ang = 1.4 * deg_2_rad; dip_K = 0.00; dip_S = -18.93; Element bce = Element::rbend(dip_nam, dip_len/2, dip_ang/2, 1*dip_ang/2, 0*dip_ang/2, dip_K, dip_S); Element bcs = Element::rbend(dip_nam, dip_len/2, dip_ang/2, 0*dip_ang/2, 1*dip_ang/2, dip_K, dip_S); std::vector<Element> BC = {bce, mc, bcs}; //""" --- correctors --- """ Element ch = Element::hcorrector("hcm", 0, 0); Element cv = Element::vcorrector("vcm", 0, 0); Element crhv = Element::corrector ("crhv", 0, 0, 0); //""" --- sextupoles --- """ Element sa1 = Element::sextupole("sa1", 0.150000, sa1_strength); Element sa2 = Element::sextupole("sa2", 0.150000, sa2_strength); Element sb1 = Element::sextupole("sb1", 0.150000, sb1_strength); Element sb2 = Element::sextupole("sb2", 0.150000, sb2_strength); Element sd1 = Element::sextupole("sd1", 0.150000, sd1_strength); Element sf1 = Element::sextupole("sf1", 0.150000, sf1_strength); Element sd2 = Element::sextupole("sd2", 0.150000, sd2_strength); Element sd3 = Element::sextupole("sd3", 0.150000, sd3_strength); Element sf2 = Element::sextupole("sf2", 0.150000, sf2_strength); //""" --- rf cavity --- """ Element cav = Element::rfcavity("cav", 0, 500e6, 2.5e6); //""" lines """ std::vector<Element> insa = { dia1, mida, dia2, crhv, cv, d12, ch, d12, sa2, d12, mon, d12, qaf, d23, qad, d17, sa1, d17}; std::vector<Element> insb = { dib1, midb, dib2, d10, crhv, qbd2, d12, cv, d12, ch, d12, sb2, d12, mon, d12, qbf, d23, qbd1, d17, sb1, d17}; std::vector<Element> cline1 = { d32, cv, d12, ch, d15, sd1, d17, qf1, d12, mon, d11, sf1, d20, qf2, d17, sd2, d12, ch, d10, mon, d10}; std::vector<Element> cline2 = { d18, cv, d26, sd3, d17, qf3, d12, mon, d11, sf2, d20, qf4, d15, ch, crhv, d12, mon, d44}; std::vector<Element> cline3 = { d44, mon, d12, ch, d15, qf4, d20, sf2, d11, mon, d12, qf3, d17, sd3, d26, cv, crhv, d18}; std::vector<Element> cline4 = { d20, ch, d12, sd2, d17, qf2, d20, sf1, d11, mon, d12, qf1, d17, sd1, d15, ch, d12, cv, d22, mon, d10}; //""" Injection Section """ Element dmiainj = Element::drift("dmiainj", 0.3); Element dinjk3 = Element::drift("dinjk3" , 0.3); Element dk3k4 = Element::drift("dk3k4" , 0.6); Element dk4pmm = Element::drift("dk4pmm" , 0.2); Element dpmmcv = Element::drift("dpmmcv" , (3.2692 + 3.65e-3 - 0.3 - 0.3 - 0.6 - 0.2 - 3*0.6)); Element dcvk1 = Element::drift("dcvk1" , (3.2692 + 3.65e-3 - 0.6 - 1.4 - 2*0.6)); Element dk1k2 = Element::drift("dk1k2" , 0.6); Element sef = Element::sextupole("sef", 0.6, 0.0, 5); Element dk2sef = Element::drift("dk2mia" , 0.8); Element kick = Element::corrector("kick", 0.6, 0, 0); Element pmm = Element::sextupole("pmm", 0.6, 0.0, 5); Element inj = Element::marker("inj"); std::vector<Element> insaend = {cv, d12, ch, d12, sa2, d12, mon, d12, qaf, d23, qad, d17, sa1, d17}; std::vector<Element> insainj = latt_join({{dmiainj, inj, dinjk3, kick, dk3k4, kick, dk4pmm, pmm, dpmmcv}, insaend}); std::vector<Element> injinsa = latt_join({latt_reverse(insaend), {dcvk1, kick, dk1k2, kick, dk2sef, sef}}); std::vector<Element> B3BCB3 = latt_join({B3,{d13},BC,{d13},B3}); std::vector<Element> R01 = latt_join({injinsa, {fim, inicio, mia}, insainj}); //#% injection sector, marker of the lattice model starting element std::vector<Element> R03 = latt_join({latt_reverse(insa), {mia, cav}, insa}); //#% sector with cavities std::vector<Element> R05 = latt_join({latt_reverse(insa), {mia}, insa}); std::vector<Element> R07(R05); std::vector<Element> R09(R05); std::vector<Element> R11(R05); std::vector<Element> R13(R05); std::vector<Element> R15(R05); std::vector<Element> R17(R05); std::vector<Element> R19(R05); std::vector<Element> R02 = latt_join({latt_reverse(insb), {mib}, insb}); std::vector<Element> R04(R02); std::vector<Element> R06(R02); std::vector<Element> R08(R02); std::vector<Element> R10(R02); std::vector<Element> R12(R02); std::vector<Element> R14(R02); std::vector<Element> R16(R02); std::vector<Element> R18(R02); std::vector<Element> R20(R02); std::vector<Element> C01 = latt_join({B1, cline1, B2, cline2, B3BCB3, cline3, B2, cline4, B1}); std::vector<Element> C02(C01); std::vector<Element> C03(C01); std::vector<Element> C04(C01); std::vector<Element> C05(C01); std::vector<Element> C06(C01); std::vector<Element> C07(C01); std::vector<Element> C08(C01); std::vector<Element> C09(C01); std::vector<Element> C10(C01); std::vector<Element> C11(C01); std::vector<Element> C12(C01); std::vector<Element> C13(C01); std::vector<Element> C14(C01); std::vector<Element> C15(C01); std::vector<Element> C16(C01); std::vector<Element> C17(C01); std::vector<Element> C18(C01); std::vector<Element> C19(C01); std::vector<Element> C20(C01); the_ring = latt_join({ R01, C01, R02, C02, R03, C03, R04, C04, R05, C05, R06, C06, R07, C07, R08, C08, R09, C09, R10, C10, R11, C11, R12, C12, R13, C13, R14, C14, R15, C15, R16, C16, R17, C17, R18, C18, R19, C19, R20, C20, }); //""" shift lattice to start at the marker "inicio" """ std::vector<int> idx = latt_findcells_fam_name(the_ring, "inicio"); if (idx.size() > 0) { std::vector<Element>::iterator it = the_ring.begin() + idx[0]; std::rotate(the_ring.begin(), it, the_ring.end()); }; //""" check if there are elements with negative lengths """ std::vector<double> lens = latt_getcellstruct<double>(the_ring, "length", latt_range(the_ring)); for(unsigned int i=0; i<lens.size(); ++i) { if (lens[i] < 0) { std::cerr << "negative drift in lattice!" << std::endl; } } //""" sets cavity frequency according to lattice length """ double C = latt_findspos(the_ring, 1+the_ring.size()); double rev_freq = light_speed / C; std::vector<int> rf_idx = latt_findcells_fam_name(the_ring, "cav"); for(unsigned int idx = 0; idx<rf_idx.size(); ++idx) { the_ring[rf_idx[idx]].frequency = rev_freq * harmonic_number; } latt_setcavity(the_ring, "on"); //latt_setradiation(the_ring, "on", 3e9); //""" adjusts number of integraton steps for each element family """ the_ring = latt_set_num_integ_steps(the_ring); }