void work() { PiezoTensor pt = makePiezoTensor(3.655, 2.407, 0.328, 1.894); MaterialTensor mt = makeMaterialTensor(19.886e10, 5.467e10, 6.799e10, 0.783e10, 23.418e10, 5.985e10, 7.209e10); double rho = 4642.8; double eps0 = 8.8542e-12; double exx = eps0 * 44.9; double ezz = eps0 * 26.7; Vec3 n(0, 0, 1); Mat3 christ = makePiezoChristoffel(pt, mt, n, exx, ezz); Poly3 christPoly = christ.getPoly(); double g1, g2, g3; christPoly.solve(&g1, &g2, &g3); double v1 = sqrt(g1 / rho); double v2 = sqrt(g2 / rho); double v3 = sqrt(g3 / rho); cout << "piezo tensor: " << endl << pt << endl; cout << "material tensor: " << endl << mt << endl; cout << "christoffel matrix: " << endl << christ << endl; cout << "polynome " << christPoly << endl; cout << "velocities = " << v1 << " " << v2 << " " << v3 << endl; }
double residual(const VNVels& vnv) { PiezoTensor pt = makePiezoTensor(3.655, 2.407, 0.328, 1.894); MaterialTensor mt = makeMaterialTensor(19.886e10, 5.467e10, 6.799e10, 0.783e10, 23.418e10, 5.985e10, 7.209e10); double rho = 4642.8; double eps0 = 8.8542e-12; double exx = eps0 * 44.9; double ezz = eps0 * 26.7; double ret = 0; for(VNVels::const_iterator it = vnv.begin(); it != vnv.end(); ++it) { Vec3 n(it -> first); Mat3 christ = makePiezoChristoffel(pt, mt, n, exx, ezz); Poly3 christPoly = christ.getPoly(); double g1, g2, g3; christPoly.solve(&g1, &g2, &g3); double v1 = sqrt(g1 / rho); double v2 = sqrt(g2 / rho); double v3 = sqrt(g3 / rho); double maxv = max(max(v1, v2), v3); double minv = min(min(v1, v2), v3); double medv = v1 + v2 + v3 - maxv - minv; Vec3 tv(minv, medv, maxv); Vec3 ex = it -> second; double curResidual = (ex - tv).norm(); ret += curResidual; if (curResidual > 30000) { cout << "curResidual = " << curResidual << " n = " << it -> first << " experimental = " << it -> second << " theory = " << tv << endl; } } return ret; }