more work on spherical projection. testlet for this code

This commit is contained in:
Guilhem Lavaux 2014-06-05 14:07:57 +02:00
parent 7b7d5b050e
commit b5319a0b1c
3 changed files with 69 additions and 25 deletions

View file

@ -12,7 +12,7 @@ static T project_tool(T *vertex_value, T *u, T *u0)
T ret = 0;
for (int q = 0; q < 3; q++)
epsilon[q] = 2*c[q] - 1;
epsilon[q] = -(2*c[q]-1);
for (int q = 0; q < ProdType::numProducts; q++)
ret += ProdType::product(u, u0, epsilon, q);
@ -24,6 +24,12 @@ static T project_tool(T *vertex_value, T *u, T *u0)
}
template<typename T>
static T get_u0(T u0, int epsilon)
{
return (epsilon < 0) ? u0 : (1-u0);
}
template<typename T>
struct ProductTerm0
{
@ -34,11 +40,12 @@ struct ProductTerm0
T a = 1;
for (int r = 0; r < 3; r++)
a *= (epsilon[r] < 0) ? u0[r] : (1-u0[r]);
a *= get_u0(u0[r], epsilon[r]);
return a;
}
};
template<typename T>
struct ProductTerm1
{
@ -51,12 +58,12 @@ struct ProductTerm1
for (int r = 0; r < 3; r++)
{
G[r] = (epsilon[r] < 0) ? u0[r] : (1-u0[r]);
G[r] = get_u0(u0[r], epsilon[r]);
}
double F[3] = { G[0]*u[1]*u[2], u[0]*G[1]*u[2], u[0]*u[1]*G[2] };
double F[3] = { G[1]*G[2], G[0]*G[2], G[0]*G[1] };
return F[q] * epsilon[q];
return F[q] * u[q] * epsilon[q];
}
};
@ -72,16 +79,17 @@ struct ProductTerm2
for (int r = 0; r < 3; r++)
{
G[r] = (epsilon[r] < 0) ? u0[r] : (1-u0[r]);
G[r] = get_u0(u0[r], epsilon[r]);
}
double F[3] = { u[0]*G[1]*G[2], G[0]*u[1]*G[2], G[0]*G[1]*u[2] };
double F[3] = { epsilon[1]*epsilon[2]*u[1]*u[2], epsilon[0]*epsilon[2]*u[0]*u[2], epsilon[0]*epsilon[1]*u[0]*u[1] };
return F[q] * epsilon[q];
return F[q] * G[q];
}
};
template<typename T>
struct ProductTerm3
{
@ -89,9 +97,7 @@ struct ProductTerm3
static T product(T *u, T *u0, int *epsilon, int q)
{
T a = 1;
return epsilon[0]*epsilon[1]*epsilon[2];
return epsilon[0]*epsilon[1]*epsilon[2]*u[0]*u[1]*u[2];
}
};
@ -103,8 +109,8 @@ T compute_projection(T *vertex_value, T *u, T *u0, T rho)
ret = project_tool<T, ProductTerm0<T> >(vertex_value, u, u0) * rho;
ret += project_tool<T, ProductTerm1<T> >(vertex_value, u, u0) * rho * rho / 2;
ret += project_tool<T, ProductTerm2<T> >(vertex_value, u, u0) * rho * rho * rho / 3;
ret += project_tool<T, ProductTerm3<T> >(vertex_value, u, u0) * rho * rho * rho * rho / 4;
// ret += project_tool<T, ProductTerm2<T> >(vertex_value, u, u0) * rho * rho * rho / 3;
// ret += project_tool<T, ProductTerm3<T> >(vertex_value, u, u0) * rho * rho * rho * rho / 4;
return ret;
}