Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- type ksp::kadr_el_m1(type dt){
- T+=dt;
- type O=0;
- auto met=&telo::simp4;
- // yoshida6 yoshida4 simp4
- // if (oo) met=&telo::raw_rk4_38;
- // if (oo) met=&telo::raw_rk4;
- //#pragma omp parallel for
- //for (int ii=0;ii<part.size();ii++)
- for(auto&r:part)
- {
- // auto& r=part[ii];
- while (r.lT<T){
- constexpr type _ss=0.005;
- float3 aa,kk;
- forceange(r.rx,aa,kk);
- // kk=kk*1.2;
- type mt=dt;
- /**
- |F(S+V*t+g*t*t/2)/F(S)-1| <= _ss
- |F'(S)/F(S)*(V*t+g*t*t/2)| <= _ss
- Три уравнения по компонентам
- |dot(F'x(S),v*t+g*t*t/2)/| <= _ss*F(S)
- В окно, сделаю более грубо, оценю по максимальному модулу
- |F'(S)/F(S)*(|V*t|+|g*t*t/2|)| <= _ss
- //*/
- // mt=dt;
- constexpr int mno=1;
- type _ax=_ss*aa._rad();
- type b=fabs(dot(r.vx,kk))*mno,a=fabs(dot(aa,kk))*0.5*mno,c=-_ax*mno,d=b*b-4*a*c;
- if (d<0){
- log(1,L"d<0 %e",d);
- }else{
- if (a>0){
- mt=(-b+sqrt(d))*0.5/a;
- // tomin(mt,(-b+sqrt(d))/2.0/a);
- }
- else{
- //tomin(mt,(-b-sqrt(d))/2.0/a);
- log(3,L"a<0 %e",a);
- }
- }
- //if (mt>0)
- for (int i=0;i<mno;i++)
- (r.*met)(fabs(mt/mno));
- // (r.*met)(fabs(mt));
- // (r.*met)(mt/2.0);
- //#pragma omp atomic
- O+=mno;
- r.rx.t=r.lT+mt;
- r.stor(r.rx);
- /// V*t+g*t*t/2 <= _a
- //tomin(mt,fabs);
- }
- if (r.lT>T){
- if (r.story.size()>=2)
- {
- pos x1=r.story[r.story.size()-2];
- pos x2=r.rx;
- type t=(T-x1.t)/(x2.t-x1.t);
- if (t>=1)
- {
- r.dx=r.rx;
- }
- else if (t>=0)
- {
- r.dx=x1*(1-t)+x2*t;
- }else{
- log(2,L"err в линейном интерполировании %.4f",t);
- }
- }
- }
- }
- return O;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement