108 void huntm(
const Tbl& xx,
double& x,
int& i_low) {
110 assert (xx.get_etat() == ETATQCQ) ;
111 int nx = xx.get_taille() ;
112 bool ascend = ( xx(nx-1) > xx(0) ) ;
114 if ( (i_low < 0)||(i_low>=nx) ) {
120 if ( (x >= xx(i_low)) == ascend ) {
121 if (i_low == nx -1) return ;
123 while ( (x >= xx(i_hi)) == ascend ) {
138 while ( (x < xx(i_low)) == ascend ) {
145 else i_low = i_hi - inc ;
149 while ( (i_hi - i_low) > 1) {
150 int i_med = (i_hi + i_low) / 2 ;
151 if ( (x>=xx(i_med)) == ascend ) i_low = i_med ;
154 if (x == xx(nx-1)) i_low = nx-2 ;
155 if (x == xx(0)) i_low = 0 ;
162 void interpol_linear(
const Tbl& xtab,
const Tbl& ytab,
163 double x,
int& i,
double& y) {
165 assert(ytab.dim == xtab.dim) ;
173 double y1 = ytab(i) ;
174 double y2 = ytab(i1) ;
176 double x1 = xtab(i) ;
177 double x2 = xtab(i1) ;
180 double a = (y1-y2)/x12 ;
181 double b = (x1*y2-y1*x2)/x12 ;
190 void interpol_linear_2d(
const Tbl& x1tab,
const Tbl& x2tab,
const Tbl& ytab,
191 double x1,
double x2,
int& i,
int& j,
double& y) {
193 assert(ytab.dim.ndim == 2) ;
194 assert(x1tab.dim.ndim == 1) ;
195 assert(x2tab.dim.ndim == 1) ;
196 assert(ytab.dim.dim[1] == x2tab.dim.dim[0]) ;
197 assert(ytab.dim.dim[0] == x1tab.dim.dim[0]) ;
199 huntm(x1tab, x1, i) ;
200 huntm(x2tab, x2, j) ;
206 double y11 = ytab(j,i) ;
207 double y21 = ytab(j1,i) ;
208 double y12 = ytab(j,i1) ;
210 double x11 = x1tab(i) ;
211 double x12 = x1tab(i1) ;
212 double x21 = x2tab(j) ;
213 double x22 = x2tab(j1) ;
214 double x1diff = x12-x11 ;
215 double x2diff = x22-x21 ;
217 double a = (y21-y11)/x2diff ;
218 double b = (y12-y11)/x1diff ;
220 y = y11 + (x1-x11)*b + (x2-x21)*a ;
227 void interpol_quad(
const Tbl& xtab,
const Tbl& ytab,
228 double x,
int& i,
double& y) {
230 assert(ytab.dim == xtab.dim) ;
249 y = y0*(x-x1)*(x-x2)/(x01*x02) - y1*(x-x0)*(x-x2)/(x01*x12) + y2*(x-x0)*(x-x1)/(x02*x12) ;
256 void interpol_herm(
const Tbl& xtab,
const Tbl& ytab,
const Tbl& dytab,
257 double x,
int& i,
double& y,
double& dy) {
259 assert(ytab.dim == xtab.dim) ;
260 assert(dytab.dim == xtab.dim) ;
266 double dx = xtab(i1) - xtab(i) ;
268 double u = (x - xtab(i)) / dx ;
272 y = ytab(i) * ( 2.*u3 - 3.*u2 + 1.)
273 + ytab(i1) * ( 3.*u2 - 2.*u3)
274 + dytab(i) * dx * ( u3 - 2.*u2 + u )
275 - dytab(i1) * dx * ( u2 - u3 ) ;
277 dy = 6. * ( ytab(i) / dx * ( u2 - u )
278 - ytab(i1) / dx * ( u2 - u ) )
279 + dytab(i) * ( 3.*u2 - 4.*u + 1. )
280 + dytab(i1) * ( 3.*u2 - 2.*u ) ;
287 void interpol_herm_der(
const Tbl& xtab,
const Tbl& ytab,
const Tbl& dytab,
288 double x,
int& i,
double& y,
double& dy,
double& ddy) {
290 assert(ytab.dim == xtab.dim) ;
291 assert(dytab.dim == xtab.dim) ;
299 double dx = xtab(i1) - xtab(i) ;
301 double u = (x - xtab(i)) / dx ;
305 y = ytab(i) * ( 2.*u3 - 3.*u2 + 1.)
306 + ytab(i1) * ( 3.*u2 - 2.*u3)
307 + dytab(i) * dx * ( u3 - 2.*u2 + u )
308 - dytab(i1) * dx * ( u2 - u3 ) ;
310 dy = 6. * ( ytab(i) - ytab(i1) ) * ( u2 - u ) / dx
311 + dytab(i) * ( 3.*u2 - 4.*u + 1. )
312 + dytab(i1) * ( 3.*u2 - 2.*u ) ;
314 ddy = 6 * ( ( ytab(i) - ytab(i1) ) * ( 2.*u - 1. ) / dx
315 + dytab(i) * (6.*u - 4.)
316 + dytab(i1) * (6.*u - 2.) ) / dx ;
323 void interpol_herm_2d(
const Tbl& xtab,
const Tbl& ytab,
const Tbl& ftab,
324 const Tbl& dfdxtab,
const Tbl& dfdytab,
const Tbl&
325 d2fdxdytab,
double x,
double y,
double& f,
double&
326 dfdx,
double& dfdy) {
328 assert(ytab.dim == xtab.dim) ;
329 assert(ftab.dim == xtab.dim) ;
330 assert(dfdxtab.dim == xtab.dim) ;
331 assert(dfdytab.dim == xtab.dim) ;
332 assert(d2fdxdytab.dim == xtab.dim) ;
335 nbp1 = xtab.get_dim(0);
336 nbp2 = xtab.get_dim(1);
341 while ((xtab(i_near,0) <= x) && (nbp2 > i_near)) {
348 while ((ytab(i_near,j_near) < y) && (nbp1 > j_near)) {
355 int i1 = i_near+1 ;
int j1 = j_near+1 ;
357 double dx = xtab(i1, j_near) - xtab(i_near, j_near) ;
358 double dy = ytab(i_near, j1) - ytab(i_near, j_near) ;
360 double u = (x - xtab(i_near, j_near)) / dx ;
361 double v = (y - ytab(i_near, j_near)) / dy ;
363 double u2 = u*u ;
double v2 = v*v ;
364 double u3 = u2*u ;
double v3 = v2*v ;
366 double psi0_u = 2.*u3 - 3.*u2 + 1. ;
367 double psi0_1mu = -2.*u3 + 3.*u2 ;
368 double psi1_u = u3 - 2.*u2 + u ;
369 double psi1_1mu = -u3 + u2 ;
371 double psi0_v = 2.*v3 - 3.*v2 + 1. ;
372 double psi0_1mv = -2.*v3 + 3.*v2 ;
373 double psi1_v = v3 - 2.*v2 + v ;
374 double psi1_1mv = -v3 + v2 ;
376 f = ftab(i_near, j_near) * psi0_u * psi0_v
377 + ftab(i1, j_near) * psi0_1mu * psi0_v
378 + ftab(i_near, j1) * psi0_u * psi0_1mv
379 + ftab(i1, j1) * psi0_1mu * psi0_1mv ;
381 f += (dfdxtab(i_near, j_near) * psi1_u * psi0_v
382 - dfdxtab(i1, j_near) * psi1_1mu * psi0_v
383 + dfdxtab(i_near, j1) * psi1_u * psi0_1mv
384 - dfdxtab(i1, j1) * psi1_1mu * psi0_1mv) * dx ;
386 f += (dfdytab(i_near, j_near) * psi0_u * psi1_v
387 + dfdytab(i1, j_near) * psi0_1mu * psi1_v
388 - dfdytab(i_near, j1) * psi0_u * psi1_1mv
389 - dfdytab(i1, j1) * psi0_1mu * psi1_1mv) * dy ;
391 f += (d2fdxdytab(i_near, j_near) * psi1_u * psi1_v
392 - d2fdxdytab(i1, j_near) * psi1_1mu * psi1_v
393 - d2fdxdytab(i_near, j1) * psi1_u * psi1_1mv
394 + d2fdxdytab(i1, j1) * psi1_1mu * psi1_1mv) * dx * dy ;
396 double dpsi0_u = 6.*(u2 - u) ;
397 double dpsi0_1mu = 6.*(u2 - u) ;
398 double dpsi1_u = 3.*u2 - 4.*u + 1. ;
399 double dpsi1_1mu = 3.*u2 - 2.*u ;
401 dfdx = (ftab(i_near, j_near) * dpsi0_u * psi0_v
402 - ftab(i1, j_near) * dpsi0_1mu * psi0_v
403 + ftab(i_near, j1) * dpsi0_u * psi0_1mv
404 - ftab(i1, j1) * dpsi0_1mu * psi0_1mv ) / dx;
406 dfdx += (dfdxtab(i_near, j_near) * dpsi1_u * psi0_v
407 + dfdxtab(i1, j_near) * dpsi1_1mu * psi0_v
408 + dfdxtab(i_near, j1) * dpsi1_u * psi0_1mv
409 + dfdxtab(i1, j1) * dpsi1_1mu * psi0_1mv) ;
411 dfdx += (dfdytab(i_near, j_near) * dpsi0_u * psi1_v
412 - dfdytab(i1, j_near) * dpsi0_1mu * psi1_v
413 - dfdytab(i_near, j1) * dpsi0_u * psi1_1mv
414 + dfdytab(i1, j1) * dpsi0_1mu * psi1_1mv) * dy /dx ;
416 dfdx += (d2fdxdytab(i_near, j_near) * dpsi1_u * psi1_v
417 + d2fdxdytab(i1, j_near) * dpsi1_1mu * psi1_v
418 - d2fdxdytab(i_near, j1) * dpsi1_u * psi1_1mv
419 - d2fdxdytab(i1, j1) * dpsi1_1mu * psi1_1mv) * dy ;
421 double dpsi0_v = 6.*(v2 - v) ;
422 double dpsi0_1mv = 6.*(v2 - v) ;
423 double dpsi1_v = 3.*v2 - 4.*v + 1. ;
424 double dpsi1_1mv = 3.*v2 - 2.*v ;
426 dfdy = (ftab(i_near, j_near) * psi0_u * dpsi0_v
427 + ftab(i1, j_near) * psi0_1mu * dpsi0_v
428 - ftab(i_near, j1) * psi0_u * dpsi0_1mv
429 - ftab(i1, j1) * psi0_1mu * dpsi0_1mv) / dy ;
431 dfdy += (dfdxtab(i_near, j_near) * psi1_u * dpsi0_v
432 - dfdxtab(i1, j_near) * psi1_1mu * dpsi0_v
433 - dfdxtab(i_near, j1) * psi1_u * dpsi0_1mv
434 + dfdxtab(i1, j1) * psi1_1mu * dpsi0_1mv) * dx / dy ;
436 dfdy += (dfdytab(i_near, j_near) * psi0_u * dpsi1_v
437 + dfdytab(i1, j_near) * psi0_1mu * dpsi1_v
438 + dfdytab(i_near, j1) * psi0_u * dpsi1_1mv
439 + dfdytab(i1, j1) * psi0_1mu * dpsi1_1mv) ;
441 dfdy += (d2fdxdytab(i_near, j_near) * psi1_u * dpsi1_v
442 - d2fdxdytab(i1, j_near) * psi1_1mu * dpsi1_v
443 + d2fdxdytab(i_near, j1) * psi1_u * dpsi1_1mv
444 - d2fdxdytab(i1, j1) * psi1_1mu * dpsi1_1mv) * dx ;
451 void interpol_herm_2d_sans(
const Tbl& xtab,
const Tbl& ytab,
const Tbl& ftab,
452 const Tbl& dfdxtab,
const Tbl& dfdytab,
double x,
453 double y,
double& f,
double& dfdx,
double& dfdy) {
455 assert(ytab.dim == xtab.dim) ;
456 assert(ftab.dim == xtab.dim) ;
457 assert(dfdxtab.dim == xtab.dim) ;
458 assert(dfdytab.dim == xtab.dim) ;
461 nbp1 = xtab.get_dim(0);
462 nbp2 = xtab.get_dim(1);
467 while ((xtab(i_near,0) <= x) && (nbp2 > i_near)) {
474 while ((ytab(i_near,j_near) < y) && (nbp1 > j_near)) {
481 int i1 = i_near+1 ;
int j1 = j_near+1 ;
483 double dx = xtab(i1, j_near) - xtab(i_near, j_near) ;
484 double dy = ytab(i_near, j1) - ytab(i_near, j_near) ;
486 double u = (x - xtab(i_near, j_near)) / dx ;
487 double v = (y - ytab(i_near, j_near)) / dy ;
489 double u2 = u*u ;
double v2 = v*v ;
490 double u3 = u2*u ;
double v3 = v2*v ;
492 double psi0_u = 2.*u3 - 3.*u2 + 1. ;
493 double psi0_1mu = -2.*u3 + 3.*u2 ;
494 double psi1_u = u3 - 2.*u2 + u ;
495 double psi1_1mu = -u3 + u2 ;
497 double psi0_v = 2.*v3 - 3.*v2 + 1. ;
498 double psi0_1mv = -2.*v3 + 3.*v2 ;
499 double psi1_v = v3 - 2.*v2 + v ;
500 double psi1_1mv = -v3 + v2 ;
502 f = ftab(i_near, j_near) * psi0_u * psi0_v
503 + ftab(i1, j_near) * psi0_1mu * psi0_v
504 + ftab(i_near, j1) * psi0_u * psi0_1mv
505 + ftab(i1, j1) * psi0_1mu * psi0_1mv ;
507 f += (dfdxtab(i_near, j_near) * psi1_u * psi0_v
508 - dfdxtab(i1, j_near) * psi1_1mu * psi0_v
509 + dfdxtab(i_near, j1) * psi1_u * psi0_1mv
510 - dfdxtab(i1, j1) * psi1_1mu * psi0_1mv) * dx ;
512 f += (dfdytab(i_near, j_near) * psi0_u * psi1_v
513 + dfdytab(i1, j_near) * psi0_1mu * psi1_v
514 - dfdytab(i_near, j1) * psi0_u * psi1_1mv
515 - dfdytab(i1, j1) * psi0_1mu * psi1_1mv) * dy ;
517 double dpsi0_u = 6.*(u2 - u) ;
518 double dpsi0_1mu = 6.*(u2 - u) ;
519 double dpsi1_u = 3.*u2 - 4.*u + 1. ;
520 double dpsi1_1mu = 3.*u2 - 2.*u ;
522 dfdx = (ftab(i_near, j_near) * dpsi0_u * psi0_v
523 - ftab(i1, j_near) * dpsi0_1mu * psi0_v
524 + ftab(i_near, j1) * dpsi0_u * psi0_1mv
525 - ftab(i1, j1) * dpsi0_1mu * psi0_1mv ) / dx;
527 dfdx += (dfdxtab(i_near, j_near) * dpsi1_u * psi0_v
528 + dfdxtab(i1, j_near) * dpsi1_1mu * psi0_v
529 + dfdxtab(i_near, j1) * dpsi1_u * psi0_1mv
530 + dfdxtab(i1, j1) * dpsi1_1mu * psi0_1mv) ;
532 dfdx += (dfdytab(i_near, j_near) * dpsi0_u * psi1_v
533 - dfdytab(i1, j_near) * dpsi0_1mu * psi1_v
534 - dfdytab(i_near, j1) * dpsi0_u * psi1_1mv
535 + dfdytab(i1, j1) * dpsi0_1mu * psi1_1mv) * dy /dx ;
537 double dpsi0_v = 6.*(v2 - v) ;
538 double dpsi0_1mv = 6.*(v2 - v) ;
539 double dpsi1_v = 3.*v2 - 4.*v + 1. ;
540 double dpsi1_1mv = 3.*v2 - 2.*v ;
542 dfdy = (ftab(i_near, j_near) * psi0_u * dpsi0_v
543 + ftab(i1, j_near) * psi0_1mu * dpsi0_v
544 - ftab(i_near, j1) * psi0_u * dpsi0_1mv
545 - ftab(i1, j1) * psi0_1mu * dpsi0_1mv) / dy ;
547 dfdy += (dfdxtab(i_near, j_near) * psi1_u * dpsi0_v
548 - dfdxtab(i1, j_near) * psi1_1mu * dpsi0_v
549 - dfdxtab(i_near, j1) * psi1_u * dpsi0_1mv
550 + dfdxtab(i1, j1) * psi1_1mu * dpsi0_1mv) * dx / dy ;
552 dfdy += (dfdytab(i_near, j_near) * psi0_u * dpsi1_v
553 + dfdytab(i1, j_near) * psi0_1mu * dpsi1_v
554 + dfdytab(i_near, j1) * psi0_u * dpsi1_1mv
555 + dfdytab(i1, j1) * psi0_1mu * dpsi1_1mv) ;
563 void interpol_herm_2nd_der(
const Tbl& xtab,
const Tbl& ytab,
const Tbl& dytab,
564 const Tbl& d2ytab,
double x,
int& i,
double& y,
565 double& dy,
double& d2y) {
567 assert(ytab.dim == xtab.dim) ;
568 assert(dytab.dim == xtab.dim) ;
569 assert(d2ytab.dim == xtab.dim) ;
575 double dx = xtab(i1) - xtab(i) ;
577 double u = (x - xtab(i)) / dx ;
589 y = ytab(i) * ( -6.*u5 + 15.*u4 - 10.*u3 + 1. )
590 + ytab(i1) * ( -6.*v5 + 15.*v4 - 10.*v3 + 1. )
591 + dytab(i) * dx * ( -3.*u5 + 8.*u4 -6.*u3 + u )
592 - dytab(i1) * dx * ( -3.*v5 + 8.*v4 -6.*v3 + v )
593 + d2ytab(i) * dx*dx * ( -0.5*u5 + 1.5*u4 - 1.5*u3 + 0.5*u2 )
594 + d2ytab(i1) * dx*dx * ( -0.5*v5 + 1.5*v4 - 1.5*v3 + 0.5*v2 ) ;
596 dy = 30.*( ytab(i) / dx * ( -u4 + 2.*u3 - u2 )
597 - ytab(i1) / dx * ( -v4 + 2.*v3 - v2 ) )
598 + dytab(i) * ( -15.*u4 + 32.*u3 - 18.*u2 + 1. )
599 + dytab(i1) * ( -15.*v4 + 32.*v3 - 18.*v2 + 1. )
600 + d2ytab(i) * dx * ( -2.5*u4 + 6.*u3 -4.5*u2 + u )
601 - d2ytab(i1) * dx * ( -2.5*v4 + 6.*v3 -4.5*v2 + v ) ;
603 d2y = 60.*(ytab(i)/(dx*dx) * (-2.*u3 + 3*u2 - u)
604 +ytab(i1)/(dx*dx) *(-2.*v3 + 3*v2 - v))
605 + 12.*dytab(i)/dx *(-5.*u3 + 8.*u2 - 3.*u)
606 - 12.*dytab(i1)/dx *(-5.*v3 + 8.*v2 - 3.*v)
607 + d2ytab(i) *(-10.*u3 + 18.*u2 - 9.*u + 1.)
608 + d2ytab(i1) *(-10.*v3 + 18.*v2 - 9.*v + 1.) ;
619 huntm(ytab,yy,i_low) ;
622 for (
int i=0 ; i<n_h ; i++){
623 resu.
set(i) = xytab(i_low,i) ;
635 huntm(xtab,xx,i_low) ;
638 for (
int i=0 ; i<n_h ; i++){
639 resu.
set(i) = xytab(i,i_low) ;
double & set(int i)
Read/write of a particular element (index i) (1D case)
Tbl extract_row(const Tbl &xytab, const Tbl &xtab, double xx)
Extraction of a row of a 2D Tbl
void set_etat_qcq()
Sets the logical state to ETATQCQ (ordinary state).
int get_ndim() const
Gives the number of dimensions (ie dim.ndim)
int get_dim(int i) const
Gives the i-th dimension (ie dim.dim[i])
Tbl extract_column(const Tbl &, const Tbl &, double)
Extraction of a column of a 2D Tbl
int get_taille() const
Gives the total size (ie dim.taille)