From 6e83171848fd5dbc1d0ad0fafce430da00766814 Mon Sep 17 00:00:00 2001
From: lschulze <lschulze@mpi-cbg.de>
Date: Fri, 25 Feb 2022 16:52:07 +0100
Subject: [PATCH] Fix bug in 3D Taylor4 interpol (last commit) and choose
 curvature computation as divergence

---
 src/level_set/particle_cp/particle_cp.hpp | 35 +++--------------------
 1 file changed, 4 insertions(+), 31 deletions(-)

diff --git a/src/level_set/particle_cp/particle_cp.hpp b/src/level_set/particle_cp/particle_cp.hpp
index d66c4be2..5b174331 100644
--- a/src/level_set/particle_cp/particle_cp.hpp
+++ b/src/level_set/particle_cp/particle_cp.hpp
@@ -791,52 +791,25 @@ private:
 			if (redistOptions.compute_curvatures)
 			{
 				H_p = get_H_p(x, c, polynomialDegree);
-				vd_in.template getProp<vd_in_curvature>(a) = 0.0;
-
+				// debug:
 				//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) \
+				{	// Mean curvature is 0.5*fluid mechanical curvature (see https://link.springer.com/article/10.1007/s00466-021-02128-9)
+					vd_in.template getProp<vd_in_curvature>(a) = 0.5*
+					((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;
-- 
GitLab