double CalcIntegralOfSmallTrgBp(CoordXYZ xtrg[3], double time, BasePoints &bp, CoordXYZ &control_point) { double cell_square; CoordXYZ cell_normal(3), cell_mass_centre(3); if (GetCellParams(xtrg, cell_square, cell_normal,cell_mass_centre)){ return 0; } CoordXYZ R(3); for (int i = 0; i < 3; ++i) R[i] = control_point[i] - cell_mass_centre[i]; double norma_R = GetVectorNorma1(R); if (!norma_R){ cout << " Error 1 : norma_r=0" << endl; exit(1); } double SUM = 0; double t = ModifyTimeByPosition(R, time); CoordXYZ f(kbase); for(int i=0;i<kbase;i++) f[i]=0; // double rez[kbase]; // найдём отклик от каждой вершины // этот фрагмент следует вычислять для каждого узла пирамиды // и для каждой функции отдельно double rho=0, rho_der=0, u_der[3]; for(int nonZeroNode=0; nonZeroNode<4; nonZeroNode++) // по каждой вершине { f[nonZeroNode]=1; double rez=bp.GetVal(cell_mass_centre,ip,f); // величина отклика от вершины, без учета функциональной зависимости f[nonZeroNode]=0; for(int nonZeroFunc=0; nonZeroFunc<5; nonZeroFunc++) { /* Эти функции равны 0 или 1 в зависимости от nonZeroFunc CoordXYZ u_der = bp.GetUDerivative(cell_mass_centre, t); double rho_der = bp.GetRhoDerivative(cell_mass_centre, t); double rho = bp.GetRho(cell_mass_centre, t); */ switch(nonZeroFunc) { case 0: rho=1; rho_der=0; u_der[0]=0; u_der[1]=0; u_der[2]=0; break; case 1: rho=0; rho_der=1; u_der[0]=0; u_der[1]=0; u_der[2]=0; break; case 2: rho=0; rho_der=0; u_der[0]=1; u_der[1]=0; u_der[2]=0; break; case 3: rho=0; rho_der=0; u_der[0]=0; u_der[1]=1; u_der[2]=0; break; case 4: rho=0; rho_der=0; u_der[0]=0; u_der[1]=0; u_der[2]=1; break; } SUM=0.; for (int i = 0; i < 3; ++i) { SUM += 1./(4*PI)* ( u_der[i]/norma_R + R[i]/kva(norma_R)*(rho_der + rho/norma_R) ) *cell_normal[i] *cell_square; } int err=vrt.AddData(ip[nonZeroNode],nonZeroFunc,SUM*rez,t); if(err) exit(0); } } // Расчет инвариантов S_Surf+=cell_square; for (int i = 0; i < 3; ++i) IntN[i]+=(cell_square*cell_normal[i]); return SUM; }