Beispiel #1
0
void NR::simpr(Vec_I_DP &y, Vec_I_DP &dydx, Vec_I_DP &dfdx, Mat_I_DP &dfdy,
	const DP xs, const DP htot, const int nstep, Vec_O_DP &yout,
	void derivs(const DP, Vec_IO_DP &, Vec_O_DP &))
{
        const int NMAX=61000;
        Vec_INT ija(NMAX);
        Vec_DP sa(NMAX);
	double sa_a[NMAX];
	int ija_a[NMAX];
	int i,nn,RAZMER;
	DP d,h,x;
        const int ITOL=2,ITMAX=75;
        const DP TOL=1.0e-9;
        int ii,iter;
        DP err;

	int n=y.size();
	Vec_INT indx(n);
	Vec_DP del(n),ytemp(n),xinit(n);
	h=htot/nstep;
        NR::sprsin(dfdy,1.e-9,sa,ija);
		RAZMER = (ija[n]-1);
		for(i=0;i<RAZMER;i++) {ija_a[i]=ija[i]; sa_a[i] = -h*sa[i];}
		for (i=0;i<n;i++) ++sa_a[i];// a[i][j] = -h*dfdy[i][j];

//	ludcmp(a,indx,d);
	for (i=0;i<n;i++){ xinit[i] = 0.;
		yout[i]=h*(dydx[i]+h*dfdx[i]);}
	ija_p=new Vec_INT(ija_a,NMAX);
        sa_p=new Vec_DP(sa_a,NMAX);
	NR::linbcg(yout,xinit,ITOL,TOL,ITMAX,iter,err);
//	lubksb(a,indx,yout);
	for (i=0;i<n;i++)
		ytemp[i]=y[i]+(del[i]=yout[i]=xinit[i]);
	x=xs+h;
	derivs(x,ytemp,yout);
	for (nn=2;nn<=nstep;nn++) {
		for (i=0;i<n;i++)
			yout[i]=h*yout[i]-del[i];
	NR::linbcg(yout,xinit,ITOL,TOL,ITMAX,iter,err);
//		lubksb(a,indx,yout);
		for (i=0;i<n;i++) ytemp[i] += (del[i] += 2.0*(yout[i]=xinit[i]));
		x += h;
		derivs(x,ytemp,yout);
	}
	for (i=0;i<n;i++)
		yout[i]=h*yout[i]-del[i];
	NR::linbcg(yout,xinit,ITOL,TOL,ITMAX,iter,err);
//	lubksb(a,indx,yout);
	for (i=0;i<n;i++)
		yout[i] = xinit[i] + ytemp[i];
        delete sa_p;
        delete ija_p;
}
Beispiel #2
0
void StepperDopr853<D>::dy(const Doub h,D &derivs) {
  VecDoub ytemp(n);
  Int i;
  for (i=0;i<n;i++)
    ytemp[i]=y[i]+h*a21*dydx[i];
  derivs(x+c2*h,ytemp,k2);
  for (i=0;i<n;i++)
    ytemp[i]=y[i]+h*(a31*dydx[i]+a32*k2[i]);
  derivs(x+c3*h,ytemp,k3);
  for (i=0;i<n;i++)
    ytemp[i]=y[i]+h*(a41*dydx[i]+a43*k3[i]);
  derivs(x+c4*h,ytemp,k4);
  for (i=0;i<n;i++)
    ytemp[i]=y[i]+h*(a51*dydx[i]+a53*k3[i]+a54*k4[i]);
  derivs(x+c5*h,ytemp,k5);
  for (i=0;i<n;i++)
    ytemp[i]=y[i]+h*(a61*dydx[i]+a64*k4[i]+a65*k5[i]);
  derivs(x+c6*h,ytemp,k6);
  for (i=0;i<n;i++)
    ytemp[i]=y[i]+h*(a71*dydx[i]+a74*k4[i]+a75*k5[i]+a76*k6[i]);
  derivs(x+c7*h,ytemp,k7);
  for (i=0;i<n;i++)
    ytemp[i]=y[i]+h*(a81*dydx[i]+a84*k4[i]+a85*k5[i]+a86*k6[i]+a87*k7[i]);
  derivs(x+c8*h,ytemp,k8);
  for (i=0;i<n;i++)
    ytemp[i]=y[i]+h*(a91*dydx[i]+a94*k4[i]+a95*k5[i]+a96*k6[i]+a97*k7[i]+
                     a98*k8[i]);
  derivs(x+c9*h,ytemp,k9);
  for (i=0;i<n;i++)
    ytemp[i]=y[i]+h*(a101*dydx[i]+a104*k4[i]+a105*k5[i]+a106*k6[i]+
                     a107*k7[i]+a108*k8[i]+a109*k9[i]);
  derivs(x+c10*h,ytemp,k10);
  for (i=0;i<n;i++)
    ytemp[i]=y[i]+h*(a111*dydx[i]+a114*k4[i]+a115*k5[i]+a116*k6[i]+
                     a117*k7[i]+a118*k8[i]+a119*k9[i]+a1110*k10[i]);
  derivs(x+c11*h,ytemp,k2);
  Doub xph=x+h;
  for (i=0;i<n;i++)
    ytemp[i]=y[i]+h*(a121*dydx[i]+a124*k4[i]+a125*k5[i]+a126*k6[i]+
                     a127*k7[i]+a128*k8[i]+a129*k9[i]+a1210*k10[i]+a1211*k2[i]);
  derivs(xph,ytemp,k3);
  for (i=0;i<n;i++) {
    k4[i]=b1*dydx[i]+b6*k6[i]+b7*k7[i]+b8*k8[i]+b9*k9[i]+b10*k10[i]+
      b11*k2[i]+b12*k3[i];
    yout[i]=y[i]+h*k4[i];
  }
  for (i=0;i<n;i++) {
    yerr[i]=k4[i]-bhh1*dydx[i]-bhh2*k9[i]-bhh3*k3[i];
    yerr2[i]=er1*dydx[i]+er6*k6[i]+er7*k7[i]+er8*k8[i]+er9*k9[i]+
      er10*k10[i]+er11*k2[i]+er12*k3[i];
  }
}
Beispiel #3
0
void StepperDopr853<D>::prepare_dense(const Doub h,VecDoub_I &dydxnew,
                                      D &derivs) {
  Int i;
  Doub ydiff,bspl;
  VecDoub ytemp(n);
  for (i=0;i<n;i++) {
    rcont1[i]=y[i];
    ydiff=yout[i]-y[i];
    rcont2[i]=ydiff;
    bspl=h*dydx[i]-ydiff;
    rcont3[i]=bspl;
    rcont4[i]=ydiff-h*dydxnew[i]-bspl;
    rcont5[i]=d41*dydx[i]+d46*k6[i]+d47*k7[i]+d48*k8[i]+
      d49*k9[i]+d410*k10[i]+d411*k2[i]+d412*k3[i];
    rcont6[i]=d51*dydx[i]+d56*k6[i]+d57*k7[i]+d58*k8[i]+
      d59*k9[i]+d510*k10[i]+d511*k2[i]+d512*k3[i];
    rcont7[i]=d61*dydx[i]+d66*k6[i]+d67*k7[i]+d68*k8[i]+
      d69*k9[i]+d610*k10[i]+d611*k2[i]+d612*k3[i];
    rcont8[i]=d71*dydx[i]+d76*k6[i]+d77*k7[i]+d78*k8[i]+
      d79*k9[i]+d710*k10[i]+d711*k2[i]+d712*k3[i];
  }
  for (i=0;i<n;i++)
    ytemp[i]=y[i]+h*(a141*dydx[i]+a147*k7[i]+a148*k8[i]+a149*k9[i]+
                     a1410*k10[i]+a1411*k2[i]+a1412*k3[i]+a1413*dydxnew[i]);
  derivs(x+c14*h,ytemp,k10);
  for (i=0;i<n;i++)
    ytemp[i]=y[i]+h*(a151*dydx[i]+a156*k6[i]+a157*k7[i]+a158*k8[i]+
                     a1511*k2[i]+a1512*k3[i]+a1513*dydxnew[i]+a1514*k10[i]);
  derivs(x+c15*h,ytemp,k2);
  for (i=0;i<n;i++)
    ytemp[i]=y[i]+h*(a161*dydx[i]+a166*k6[i]+a167*k7[i]+a168*k8[i]+
                     a169*k9[i]+a1613*dydxnew[i]+a1614*k10[i]+a1615*k2[i]);
  derivs(x+c16*h,ytemp,k3);
  for (i=0;i<n;i++)
    {
      rcont5[i]=h*(rcont5[i]+d413*dydxnew[i]+d414*k10[i]+d415*k2[i]+d416*k3[i]);
      rcont6[i]=h*(rcont6[i]+d513*dydxnew[i]+d514*k10[i]+d515*k2[i]+d516*k3[i]);
      rcont7[i]=h*(rcont7[i]+d613*dydxnew[i]+d614*k10[i]+d615*k2[i]+d616*k3[i]);
      rcont8[i]=h*(rcont8[i]+d713*dydxnew[i]+d714*k10[i]+d715*k2[i]+d716*k3[i]);
    }
}
Beispiel #4
0
void NR::simpr(Vec_I_DP &y, Vec_I_DP &dydx, Vec_I_DP &dfdx, Mat_I_DP &dfdy,
	const DP xs, const DP htot, const int nstep, Vec_O_DP &yout,
	void derivs(const DP, Vec_I_DP &, Vec_O_DP &))
{
	int i,j,nn;
	DP d,h,x;

	int n=y.size();
	Mat_DP a(n,n);
	Vec_INT indx(n);
	Vec_DP del(n),ytemp(n);
	h=htot/nstep;
	for (i=0;i<n;i++) {
		for (j=0;j<n;j++) a[i][j] = -h*dfdy[i][j];
		++a[i][i];
	}
	ludcmp(a,indx,d);
	for (i=0;i<n;i++)
		yout[i]=h*(dydx[i]+h*dfdx[i]);
	lubksb(a,indx,yout);
	for (i=0;i<n;i++)
		ytemp[i]=y[i]+(del[i]=yout[i]);
	x=xs+h;
	derivs(x,ytemp,yout);
	for (nn=2;nn<=nstep;nn++) {
		for (i=0;i<n;i++)
			yout[i]=h*yout[i]-del[i];
		lubksb(a,indx,yout);
		for (i=0;i<n;i++) ytemp[i] += (del[i] += 2.0*yout[i]);
		x += h;
		derivs(x,ytemp,yout);
	}
	for (i=0;i<n;i++)
		yout[i]=h*yout[i]-del[i];
	lubksb(a,indx,yout);
	for (i=0;i<n;i++)
		yout[i] += ytemp[i];
}
Beispiel #5
0
void Foam::SIBS::SIMPR
(
    const ODE& ode,
    const scalar xStart,
    const scalarField& y,
    const scalarField& dydx,
    const scalarField& dfdx,
    const scalarSquareMatrix& dfdy,
    const scalar deltaX,
    const label nSteps,
    scalarField& yEnd
) const
{
    scalar h = deltaX/nSteps;

    scalarSquareMatrix a(n_);
    for (register label i=0; i<n_; i++)
    {
        for (register label j=0; j<n_; j++)
        {
            a[i][j] = -h*dfdy[i][j];
        }
        ++a[i][i];
    }

    labelList pivotIndices(n_);
    LUDecompose(a, pivotIndices);

    for (register label i=0; i<n_; i++)
    {
        yEnd[i] = h*(dydx[i] + h*dfdx[i]);
    }

    LUBacksubstitute(a, pivotIndices, yEnd);

    scalarField del(yEnd);
    scalarField ytemp(n_);

    for (register label i=0; i<n_; i++)
    {
        ytemp[i] = y[i] + del[i];
    }

    scalar x = xStart + h;

    ode.derivatives(x, ytemp, yEnd);

    for (register label nn=2; nn<=nSteps; nn++)
    {
        for (register label i=0; i<n_; i++)
        {
            yEnd[i] = h*yEnd[i] - del[i];
        }

        LUBacksubstitute(a, pivotIndices, yEnd);

        for (register label i=0; i<n_; i++)
        {
            ytemp[i] += (del[i] += 2.0*yEnd[i]);
        }

        x += h;

        ode.derivatives(x, ytemp, yEnd);
    }
    for (register label i=0; i<n_; i++)
    {
        yEnd[i] = h*yEnd[i] - del[i];
    }

    LUBacksubstitute(a, pivotIndices, yEnd);

    for (register label i=0; i<n_; i++)
    {
        yEnd[i] += ytemp[i];
    }
}