Пример #1
0
void master(int n, double *v, int i , int k, double *A, double *E){
	double x,y;
	x = smult(n,i,k,A,E);
	y = smult2(n,v,k,A);
	double a = -x/y;
	for (int j = 0; j < n+1; j++){
		E[j*(n+1)+i] = E[j*(n+1)+i] + a*v[j];
	}
}
Пример #2
0
double CalcIntegralOfFullTrg(SurfacePoints p, PointsXYZ &m, double time, SourceOfNoise &source_of_noise, CoordXYZ &control_point, int &err)
{
    int i,j,n=4;
    double rho=0;
    CoordXYZ strg[3],h1,h2;
    CoordXYZ xtrg[3];

    if(p.size()!=3) { cout << " ERROR 8_1 " << p.size() << "!=3\n"; exit(0);}

    for (int i = 0; i < 3; i++)
        xtrg[i] = GetCoordSurf(p[i],m);

//    cout << " CalcIntegralOfFullTrg started " << endl;

    CoordXYZ pyr_points[4];
    for (int i = 0; i < kbase; i++)
        pyr_points[i].resize(3);

    // сформируем пирамиду
    int k=0;

    for (int i = 0; i < 3; i++)
    {
        add_to_ip(ip,k,p[i].a_index);
        add_to_ip(ip,k,p[i].b_index);
    }

    if(k!=4)
    {
        cout << "ERROR 6 : In base tetrahtdron only " << k << " nodes <4.";
        err=2;
        return 0;
    }

    //   cout << ip[0] << " " << ip[1] << " " << ip[2] << " " << ip[3] << " " << endl;
    for (int i = 0; i < 4; i++)
       pyr_points[i]=m[ip[i]];

    BasePoints bp(pyr_points,ip,err);

    if(err)
        return err;

    for (int i = 0; i < 3; i++)
        strg[i].resize(3);

/*
 к этому моменту есть :
    - координаты вершин базовой пирамиды
    - номера вершин базовой пирамиды
    - функция вычисления значения поля в точке r
      при заданных значениях f в узлах пирамиды
*/

    for(i=0;i<n;i++)
    for(j=0;j<n-i;j++)
    {
        strg[0]=
        plus2(
            plus2(xtrg[0],
                    smult2((double)i/(double)n,minus2(xtrg[1],xtrg[0]))),
                        smult2((double)j/(double)n,minus2(xtrg[2],xtrg[0])));
        strg[1]=
        plus2(
            plus2(xtrg[0],
                    smult2((double)(i+1)/(double)n,minus2(xtrg[1],xtrg[0]))),
                        smult2((double)j/(double)n,minus2(xtrg[2],xtrg[0])));
        strg[2]=
        plus2(
            plus2(xtrg[0],
                    smult2((double)i/(double)n,minus2(xtrg[1],xtrg[0]))),
                        smult2((double)(j+1)/(double)n,minus2(xtrg[2],xtrg[0])));

        if(!isbp) rho+=CalcIntegralOfSmallTrg(strg, time, source_of_noise, control_point);
        else      rho+=CalcIntegralOfSmallTrgBp(strg, time, bp, control_point);

        if(j<n-i-1)
        {
            strg[0]=
            plus2(
                plus2(xtrg[0],
                        smult2((double)(i+1)/(double)n,minus2(xtrg[1],xtrg[0]))),
                            smult2((double)(j+1)/(double)n,minus2(xtrg[2],xtrg[0])));
            strg[2]=
            plus2(
                plus2(xtrg[0],
                        smult2((double)(i+1)/(double)n,minus2(xtrg[1],xtrg[0]))),
                            smult2((double)j/(double)n,minus2(xtrg[2],xtrg[0])));
            strg[1]=
            plus2(
                plus2(xtrg[0],
                        smult2((double)i/(double)n,minus2(xtrg[1],xtrg[0]))),
                            smult2((double)(j+1)/(double)n,minus2(xtrg[2],xtrg[0])));

        if(!isbp) rho+=CalcIntegralOfSmallTrg(strg, time, source_of_noise, control_point);
        else      rho+=CalcIntegralOfSmallTrgBp(strg, time, bp, control_point);
        }
    }


    return rho;
}