diff --git a/src/level_set/particle_cp/particle_cp.hpp b/src/level_set/particle_cp/particle_cp.hpp index 792c34585585cf24da72a7b9a16c21a7120f90fb..d66c4be2d0ab60a5a344f3c8f202cb37d6864975 100644 --- a/src/level_set/particle_cp/particle_cp.hpp +++ b/src/level_set/particle_cp/particle_cp.hpp @@ -51,6 +51,8 @@ struct Redist_options double support_prevent = 0.0; // prevention parameter if support may be left int fail_projection = 0; // prevention projection if support may be left int init_project = 0; + int compute_normals = 0; + int compute_curvatures = 0; }; // Add new polynomial degrees here in case new interpolation schemes are implemented. @@ -78,26 +80,34 @@ public: void run_redistancing() { - std::cout<<"detecting..."<<std::endl; std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now(); detect_surface_particles(); std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now(); std::cout << "Time difference for detection = " << std::chrono::duration_cast<std::chrono::microseconds>(end - begin).count() << "[µs]" << std::endl; - std::cout<<"interpolating with "<<polynomialDegree<<"..."<<std::endl; begin = std::chrono::steady_clock::now(); interpolate_sdf_field(); end = std::chrono::steady_clock::now(); - std::cout << "Time difference for interpolation = " << std::chrono::duration_cast<std::chrono::microseconds>(end - begin).count() << "[µs]" << std::endl; + std::cout << "Time difference for "<<polynomialDegree<<" interpolation = " << std::chrono::duration_cast<std::chrono::microseconds>(end - begin).count() << "[µs]" << std::endl; - std::cout<<"optimizing..."<<std::endl; begin = std::chrono::steady_clock::now(); - find_closest_point(); + find_closest_point(vd_in, vd_s); end = std::chrono::steady_clock::now(); std::cout << "Time difference for optimization = " << std::chrono::duration_cast<std::chrono::microseconds>(end - begin).count() << "[µs]" << std::endl; - std::cout<<"finishing..."<<std::endl; } + void run_optimization() + { + find_closest_point(vd_in, vd_s); + } + +// particles_surface<dim, n_c> return_surface_particles() +// { +// return(vd_s); +// } + + int run_redistancing_with_remeshing_check(){} + private: static constexpr size_t num_neibs = 0; static constexpr size_t vd_s_close_part = 1; @@ -107,6 +117,8 @@ private: static constexpr size_t vd_in_sdf = 0; // this is really required in the vd_in vector, so users need to know about it. static constexpr size_t vd_in_close_part = 3; // this is not needed by the method, but more for debugging purposes, as it shows all particles for which // interpolation and sampling is performed. + static constexpr size_t vd_in_normal = 1; + static constexpr size_t vd_in_curvature = 2; Redist_options redistOptions; particles_in_type &vd_in; @@ -384,7 +396,7 @@ private: // The polynomial that is used for checking if the constraint is fulfilled is the interpolation polynomial // carried by the sample point. - void find_closest_point() + void find_closest_point(particles_in_type& vd_in, particles_surface<dim, n_c> & vd_s) { // iterate over all particles, i.e. do closest point optimisation for all particles, and initialize // all relevant variables. @@ -709,7 +721,7 @@ private: { auto & v_cl = create_vcluster(); - std::cout<<"invoked " << a.getKey() << " " << v_cl.rank() << " " <<std::endl; + std::cout<<"Step size limitation invoked for particle " << a.getKey() << " on processor " << v_cl.rank() << " " <<std::endl; dx = 0.1*dx; @@ -775,6 +787,58 @@ private: std::cout<<"analytical value: "<<vd_in.template getProp<8>(a)<<", diff: "<<abs(vd_in.template getProp<vd_in_sdf>(a) - vd_in.template getProp<8>(a))<<std::endl; } + if (redistOptions.compute_normals) for(int k = 0; k<dim; k++) vd_in.template getProp<vd_in_normal>(a)[k] = grad_p(k); + if (redistOptions.compute_curvatures) + { + H_p = get_H_p(x, c, polynomialDegree); + vd_in.template getProp<vd_in_curvature>(a) = 0.0; + + //std::cout<<"^^^^^^^^^^^^^^^^^x\n"<<x<<"\n&&&&&&&&&&&&&nabla_p\n"<<grad_p<<"\n*****************Hessian_p:\n"<<H_p<<std::endl; + //std::cout<<"analytical hessian:"<<std::endl; + //std::cout<<1-x(0)*x(0)<<", "<<x(0)*x(1)<<", "<<x(0)*x(2)<<std::endl; + //std::cout<<x(0)*x(1)<<", "<<1-x(1)*x(1)<<", "<<x(1)*x(2)<<std::endl; + //std::cout<<x(0)*x(2)<<", "<<x(1)*x(2)<<", "<<1-x(2)*x(2)<<std::endl; + + std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now(); + // divergence of normalized gradient field: + if (dim == 2) + { + vd_in.template getProp<vd_in_curvature>(a) = (H_p(0,0)*grad_p(1)*grad_p(1) - 2*grad_p(1)*grad_p(0)*H_p(0,1) + H_p(1,1)*grad_p(0)*grad_p(0))/std::pow(sqrt(grad_p(0)*grad_p(0) + grad_p(1)*grad_p(1)),3); + } + else if (dim == 3) + { + vd_in.template getProp<vd_in_curvature>(a) = \ + ((H_p(1,1) + H_p(2,2))*std::pow(grad_p(0), 2) + (H_p(0,0) + H_p(2,2))*std::pow(grad_p(1), 2) + (H_p(0,0) + H_p(1,1))*std::pow(grad_p(2), 2) \ + - 2*grad_p(0)*grad_p(1)*H_p(0,1) - 2*grad_p(0)*grad_p(2)*H_p(0,2) - 2*grad_p(1)*grad_p(2)*H_p(1,2))*std::pow(std::pow(grad_p(0), 2) + std::pow(grad_p(1), 2) + std::pow(grad_p(2), 2), -1.5); + //std::cout<<"&&&&&curvature:\n"<<vd_in.template getProp<vd_in_curvature>(a)<<std::endl; + } + std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now(); + std::cout << "Time difference for divergence = " << std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin).count() << "[ms]" << std::endl; + begin = std::chrono::steady_clock::now(); + // trace of projection of Hessian into tangential plane + if (dim == 2) std::cout<<"Not implemented so far"<<std::endl; + else if ((dim == 3) && (true)) + { + const double grad_p_norm = grad_p.norm(); + EMatrixXd proj_matrix = grad_p_norm*grad_p_norm*EMatrixXd::Identity(dim, dim) - grad_p*grad_p.transpose(); + EMatrixXd proj_Hessian(dim, dim); + + proj_Hessian = proj_matrix*H_p*proj_matrix*1/pow(grad_p_norm, 5); + vd_in.template getProp<vd_in_curvature>(a) = proj_Hessian.trace(); + vd_in.template getProp<vd_in_curvature>(a) = 0.5*vd_in.template getProp<vd_in_curvature>(a); + //std::cout<<proj_Hessian.trace()<<std::endl; + //vd_in.template getProp<vd_in_curvature>(a) = proj_Hessian(0,0)*(grad_p_norm*grad_p_norm - grad_p(0)*grad_p(0)) - proj_Hessian(0,1)*grad_p(0)*grad_p(1) - proj_Hessian(0,2)*grad_p(0)*grad_p(2) + // - proj_Hessian(1,0)*grad_p(0)*grad_p(1) + proj_Hessian(1,1)*(grad_p_norm*grad_p_norm - grad_p(1)*grad_p(1)) - proj_Hessian(1,2)*grad_p(1)*grad_p(2) + // - proj_Hessian(2,0)*grad_p(0)*grad_p(2) - proj_Hessian(2,1)*grad_p(1)*grad_p(2) + proj_Hessian(2,2)*(grad_p_norm*grad_p_norm - grad_p(2)*grad_p(2)); + //vd_in.template getProp<vd_in_curvature>(a) = 0.5*((grad_p.transpose()*H_p)*grad_p - grad_p_norm*grad_p_norm*H_p.trace())/(grad_p_norm*grad_p_norm*grad_p_norm); + //vd_in.template getProp<vd_in_curvature>(a) = grad_p*H_p*grad_p.transpose(); + //std::cout<<vd_in.template getProp<vd_in_curvature>(a)<<std::endl; + + } + end = std::chrono::steady_clock::now(); + std::cout << "Time difference for projection = " << std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin).count() << "[ms]" << std::endl; + + } ++part; } @@ -904,12 +968,12 @@ private: H_p(2, 2) = 2*c[25] + 2*c[26]*x + 2*c[27]*x*x + 2*c[28]*y + 2*c[29]*x*y + 2*c[30]*y*y + 6*c[31]*z + 6*c[32]*x*z + 6*c[33]*y*z + 12*c[34]*z*z; - H_p(0, 1) = c[6] + 2*c[7]*x + 3*c[8]*x*x + 2*c[10]*y +4*c[11]*x*y + 3*c[13]*y*y - + c[20]*z + 2*c[21]*x*z + 2*c[23]*y*z + c[29]*z*z; - H_p(0, 2) = c[16] + 2*c[17]*x + 3*c[18]*x*x + c[20]*y + 2*c[21]*x*y + c[23]*y*y - + 2*c[26]*z + 4*c[27]*x*z + 2*c[29]*y*z + 3*c[32]*z*z; - H_p(1, 2) = c[19] + c[20]*x + c[21]*x*x + c[22]*y + 2*c[23]*x*y + 3*c[24]*y*y - + 2*c[28]*z + 2*c[29]*x*z + 4*c[30]*y*z + 3*c[33]*z*z; + H_p(0, 1) = (c[6] + 2*c[7]*x + 3*c[8]*x*x + 2*c[10]*y +4*c[11]*x*y + 3*c[13]*y*y + + c[20]*z + 2*c[21]*x*z + 2*c[23]*y*z + c[29]*z*z); + H_p(0, 2) = (c[16] + 2*c[17]*x + 3*c[18]*x*x + c[20]*y + 2*c[21]*x*y + c[23]*y*y + + 2*c[26]*z + 4*c[27]*x*z + 2*c[29]*y*z + 3*c[32]*z*z); + H_p(1, 2) = (c[19] + c[20]*x + c[21]*x*x + 2*c[22]*y + 2*c[23]*x*y + 3*c[24]*y*y + + 2*c[28]*z + 2*c[29]*x*z + 4*c[30]*y*z + 3*c[33]*z*z); H_p(1, 0) = H_p(0, 1); H_p(2, 0) = H_p(0, 2); H_p(2, 1) = H_p(1, 2); @@ -1018,3 +1082,4 @@ private: } }; +