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]; } }
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; }