8#ifndef INTERATORPOISSONCURVED_H
9#define INTERATORPOISSONCURVED_H
11#include "../math_lib.h"
12#include "../abbrevi_common.h"
26 IntegratorPoissonCurved(D3vector (*transformEdge_[12])(
double), D3vector (*transDerivs_[12])(
double),D3vector corner_[8]){
28 for(
int i=0;i<12;++i){
29 transformEdge[i] = transformEdge_[i];
30 transDerivs[i] = transDerivs_[i];
35 corner[i] = corner_[i];
40 D3vector Map1(
double eta,
double xi,
double phi)
const;
43 D3vector Map2(
double s,
double t,
double u)
const;
46 double bitInterp(
int bit,
double x)
const;
49 int edIndex(
int dim_ind,
int b1,
int b2)
const;
52 int coIndex(
int b1,
int b2,
int b3)
const;
55 double interpOrSign(
int b,
int dim,
int dim_ref,D3vector& x);
58 double bitSign(
int b);
61 int edIndexDeriv(
int edge_ref,
int b1,
int b2,
int dim_ref);
64 double A(D3vector& x_,
int i,
int j);
66 double b(D3vector& x_,
int i);
68 double c(D3vector& x_);
71 double f1(D3vector& x_);
74 void evalA(Matrix& mat, D3vector& x);
77 void evalJ(Matrix& J, D3vector& x);
80 double evalU(D3vector& x, BasisFunctionType *state);
83 void evaldel(Matrix& delu, D3vector& x, BasisFunctionType *state);
86 D3vector MapDeriv(
int dim, D3vector& x);
89 double stencil_integration(
double p_left[3],
double p_right[3], BasisFunctionType u[3], BasisFunctionType v[3]);
92 double uAv(D3vector& x);
94 double ubv(D3vector& x_);
96 double cuv(D3vector& x_);
98 double fv(D3vector& x_);
101 void setState(BasisFunctionType *state,
bool U);
104 void setLimits(D3vector &lim1_, D3vector& lim2_){
110 D3vector (*transformEdge[12])(double);
111 D3vector (*transDerivs[12])(double);
117 BasisFunctionType state_u[3];
118 BasisFunctionType state_v[3];
123double IntegratorPoissonCurved::A(D3vector& x_,
int i,
int j){
132double IntegratorPoissonCurved::b(D3vector& x_,
int i){
136double IntegratorPoissonCurved::c(D3vector& x_){
141double IntegratorPoissonCurved::f1(D3vector& x_){
142 double x = x_[0], y = x_[1], z = x_[2];
146 double sin_b = sin(0.5*pi*(x*x+y*y));
147 double cos_b = cos(0.5*pi*(x*x+y*y));
148 double z_b = (z-0.5);
152 result += 6.0*pi*x*y*z*z_b*sin_b*sin_b - \
153 6.0*pi*x*y*z*z_b*cos_b*cos_b - \
154 2.0*x*y*sin_b*cos_b + \
155 4.0*pi*pi*x*y*y*y*z*z_b*sin_b*cos_b +\
156 4.0*pi*pi*x*x*x*y*z*z_b*sin_b*cos_b;
162double IntegratorPoissonCurved::uAv(D3vector& x){
163 D3vector x_new = Map2(x[0],x[1],x[2]);
165 Matrix AoPhi(3,3),A_star(3,3),Jt(3,3),J_in(3,3),Jt_in(3,3),delU(1,3),delV(1,3),delVt(3,1);
174 std::cerr<<
"Non invertible Jacobian encountered"<<std::endl;
179 J_in = Jt_in.transpose();
181 A_star = J_in*AoPhi*Jt_in;
184 evaldel(delU,x,state_u);
185 evaldel(delV,x,state_v);
186 delVt = delV.transpose();
188 double result = (delU*A_star*delVt).value(0,0);
193double IntegratorPoissonCurved::ubv(D3vector& x_){
197double IntegratorPoissonCurved::cuv(D3vector& x_){
201double IntegratorPoissonCurved::fv(D3vector& x_){
202 D3vector x_new = Map2(x_[0],x_[1],x_[2]);
208 double result = f1(x_new)*Jt.det()*evalU(x_,state_v);
213double IntegratorPoissonCurved::bitInterp(
int bit,
double x)
const{
221 std::cerr<<
"Incorrect bit value. Can be either 0 or 1"<<std::endl;
226int IntegratorPoissonCurved::edIndex(
int dim_ind,
int b1,
int b2)
const{
227 int offset = b2*2+b1;
229 return (dim_ind*4+offset);
233int IntegratorPoissonCurved::coIndex(
int b1,
int b2,
int b3)
const{
234 return (4*b3+2*b2+b1);
238double IntegratorPoissonCurved::interpOrSign(
int b,
int dim,
int dim_ref,D3vector& x){
243 return bitInterp(b,x[dim]);
247double IntegratorPoissonCurved::bitSign(
int b){
248 double ret = (b == 0)?-1.0:1.0;
253int IntegratorPoissonCurved::edIndexDeriv(
int edge_ref,
int b1,
int b2,
int dim_ref){
255 return edIndex(edge_ref/4,b1,b2);
257 else if(dim_ref == 1 && edge_ref == 0){
258 return edIndex(edge_ref/4,b1,b2);
260 else if(dim_ref == 2 && edge_ref == 8){
261 return edIndex(edge_ref/4,b1,b2);
264 return edIndex(edge_ref/4,b2,b1);
269D3vector IntegratorPoissonCurved::Map2(
double s,
double t,
double u)
const{
270 D3vector ret(0.0,0.0,0.0);
273 for(
int b1 = 0; b1 <=1; b1 ++){
274 for(
int b2 = 0; b2 <= 1; b2 ++){
275 ret = ret + bitInterp(b1,t)*bitInterp(b2,u)*transformEdge[edIndex(0,b1,b2)](s);
276 ret = ret + bitInterp(b1,s)*bitInterp(b2,u)*transformEdge[edIndex(1,b1,b2)](t);
277 ret = ret + bitInterp(b1,s)*bitInterp(b2,t)*transformEdge[edIndex(2,b1,b2)](u);
282 for(
int b1 = 0; b1 <=1; b1 ++){
283 for(
int b2 = 0; b2 <= 1; b2 ++){
284 for(
int b3 = 0; b3 <= 1; b3 ++){
285 ret = ret - 2*bitInterp(b1,s)*bitInterp(b2,t)*bitInterp(b3,u)*corner[coIndex(b1,b2,b3)];
293void IntegratorPoissonCurved::evalA(Matrix& mat, D3vector& x){
294 for(
int i = 0; i<3; i++){
295 for(
int j = 0; j<3; j++){
296 mat.value(i,j) = A(x,i,j);
301D3vector IntegratorPoissonCurved::MapDeriv(
int dim,D3vector& x){
303 D3vector ret(0.0,0.0,0.0);
305 double s1 = x[dim], s2 = x[(dim+1)%3], s3 = x[(dim+2)%3];
306 int ed1 = dim*4, ed2 = ((dim+1)%3)*4, ed3 = ((dim+2)%3)*4;
309 for(
int b1=0; b1<=1; b1++){
310 for(
int b2=0; b2<=1; b2++){
311 ret = ret + bitInterp(b1,s2)*bitInterp(b2,s3)*transDerivs[edIndexDeriv(ed1,b1,b2,dim)](s1);
313 ret = ret + bitSign(b1)*bitInterp(b2,s3)*transformEdge[edIndexDeriv(ed2,b1,b2,dim)](s2);
315 ret = ret + bitSign(b1)*bitInterp(b2,s2)*transformEdge[edIndexDeriv(ed3,b1,b2,dim)](s3);
320 for(
int b1 = 0; b1 <=1; b1 ++){
321 for(
int b2 = 0; b2 <= 1; b2 ++){
322 for(
int b3 = 0; b3 <= 1; b3 ++){
323 ret = ret - 2*interpOrSign(b1,0,dim,x)*interpOrSign(b2,1,dim,x)*interpOrSign(b3,2,dim,x)*corner[coIndex(b1,b2,b3)];
331void IntegratorPoissonCurved::evalJ(Matrix& J, D3vector& x){
333 cols[0] = MapDeriv(0,x);
334 cols[1] = MapDeriv(1,x);
335 cols[2] = MapDeriv(2,x);
337 for(
int i=0;i<3;i++){
338 for(
int j=0;j<3;j++){
339 J.value(i,j) = (cols[i])[j];
344double IntegratorPoissonCurved::evalU(D3vector& x, BasisFunctionType *state){
346 for(
int i=0;i<3;i++){
347 if(state[i] == leftBasis){
348 result *= (lim2[i]-x[i])/(lim2[i]-lim1[i]);
351 result *= (x[i]-lim1[i])/(lim2[i]-lim1[i]);
359void IntegratorPoissonCurved::evaldel(Matrix& delu, D3vector& x, BasisFunctionType *state){
363 for(
int i=0;i<3;i++){
364 if(state[i] == leftBasis){
365 delu.value(0,i) = -1.0/(lim2[i]-lim1[i]);
366 prod[i] = (lim2[i]-x[i])/(lim2[i]-lim1[i]);
369 delu.value(0,i) = 1.0/(lim2[i]-lim1[i]);
370 prod[i] = (x[i]-lim1[i])/(lim2[i]-lim1[i]);
374 for(
int i=0;i<3;i++){
377 delu.value(0,i) *= prod[ind1]*prod[ind2];
381double IntegratorPoissonCurved::stencil_integration(
double p_left[3],
double p_right[3],
382 BasisFunctionType u[3], BasisFunctionType v[3]) {
384 lim1 = D3vector(p_left[0],p_left[1],p_left[2]);
385 lim2 = D3vector(p_right[0],p_right[1],p_right[2]);
388 for(
int i=0;i<3;i++){
401void IntegratorPoissonCurved::setState(BasisFunctionType *state,
bool U){
403 for(
int i=0;i<3;i++){
404 state_u[i] = state[i];
408 for(
int i=0;i<3;i++){
409 state_v[i] = state[i];
414D3vector IntegratorPoissonCurved::Map1(
double eta,
double xi,
double phi)
const {
417 D3vector PSW, PSE, PNW, PNE;
418 D3vector Pres, PT, PD;
422 for (
int ed = 0; ed < 12; ++ed ) {
423 p = find_p ( ( Edges_cell ) ed,eta,xi,phi );
424 Psi[ed] = transformEdge[ed]( p );
425 PL = corner[ Transform ( ( Edges_cell ) ed,Ldir1D ) ];
426 PR = corner[ Transform ( ( Edges_cell ) ed,Rdir1D ) ];
427 Psi[ed] = Psi[ed] + PL + ( PR-PL ) * p;
430 Pres = D3vector ( 0.0,0.0,0.0 );
431 for (
int md = 0; md < 3; ++md )
464 ( PSE - PSW ) * p_EW +
465 ( PNW - PSW ) * p_NS +
466 ( PNE - PSE - PNW + PSW ) * p_EW * p_NS;
469 PD = corner[WSDdir3D] +
470 ( corner[ESDdir3D] - corner[WSDdir3D] ) * eta +
471 ( corner[WNDdir3D] - corner[WSDdir3D]) * xi +
472 ( corner[ENDdir3D] - corner[ESDdir3D] - corner[WNDdir3D] + corner[WSDdir3D]) * eta * xi;
474 PT = corner[WSTdir3D] +
475 ( corner[ESTdir3D] - corner[WSTdir3D] ) * eta +
476 ( corner[WNTdir3D] - corner[WSTdir3D] ) * xi +
477 ( corner[ENTdir3D] - corner[ESTdir3D] - corner[WNTdir3D] + corner[WSTdir3D] ) * eta * xi;
480 2.0 * ( PD + ( PT-PD ) * phi );
Definition curvedPoissonIntegrator.h:19
IntegratorPoissonCurved(D3vector(*transformEdge_[12])(double), D3vector(*transDerivs_[12])(double), D3vector corner_[8])
Definition curvedPoissonIntegrator.h:26
Definition interfaceMatrices.h:21