Skip to content

Commit 2f35600

Browse files
committed
updated make derivative
1 parent bafc14f commit 2f35600

File tree

4 files changed

+97
-78
lines changed

4 files changed

+97
-78
lines changed

src/SplineBiCubic.cc

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -52,31 +52,10 @@ namespace Splines {
5252
m_DY = m_mem_bicubic( nn );
5353
m_DXY = m_mem_bicubic( nn );
5454

55-
// calcolo derivate
56-
PchipSpline sp;
57-
for ( integer j{0}; j < m_ny; ++j ) {
58-
sp.build( m_X, 1, &z_node_ref(0,j), m_ny, m_nx );
59-
for ( integer i{0}; i < m_nx; ++i ) Dx_node_ref(i,j) = sp.yp_node(i);
60-
}
61-
for ( integer i{0}; i < m_nx; ++i ) {
62-
sp.build( m_Y, 1, &z_node_ref(i,0), 1, m_ny );
63-
for ( integer j{0}; j < m_ny; ++j ) Dy_node_ref(i,j) = sp.yp_node(j);
64-
}
65-
for ( integer j{0}; j < m_ny; ++j ) {
66-
sp.build( m_X, 1, &Dx_node_ref(0,j), m_ny, m_nx );
67-
for ( integer i{0}; i < m_nx; ++i ) Dxy_node_ref(i,j) = sp.yp_node(i);
68-
}
55+
make_derivative_x( m_Z, m_DX );
56+
make_derivative_y( m_Z, m_DY );
57+
make_derivative_xy( m_DX, m_DY, m_DXY );
6958

70-
auto minmod = [] ( real_type a, real_type b ) -> real_type {
71-
if ( a*b <= 0 ) return 0;
72-
if ( a > 0 ) return std::min(a,b);
73-
return std::max(a,b);
74-
};
75-
76-
for ( integer i{0}; i < m_nx; ++i ) {
77-
sp.build( m_Y, 1, &Dy_node_ref(i,0), 1, m_ny );
78-
for ( integer j{0}; j < m_ny; ++j ) Dxy_node_ref(i,j) = minmod( Dxy_node_ref(i,j), sp.yp_node(j) );
79-
}
8059
}
8160

8261
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

src/SplineBiQuintic.cc

Lines changed: 9 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -49,61 +49,18 @@ namespace Splines {
4949
m_DXYY = m_mem_biquintic( dim );
5050
m_DXXY = m_mem_biquintic( dim );
5151
m_DXXYY = m_mem_biquintic( dim );
52+
53+
make_derivative_x( m_Z, m_DX );
54+
make_derivative_y( m_Z, m_DY );
55+
make_derivative_xy( m_DX, m_DY, m_DXY );
5256

53-
auto minmod = [] ( real_type a, real_type b ) -> real_type {
54-
if ( a*b <= 0 ) return 0;
55-
if ( a > 0 ) return std::min(a,b);
56-
return std::max(a,b);
57-
};
57+
make_derivative_x( m_DX, m_DXX );
58+
make_derivative_y( m_DY, m_DYY );
5859

59-
PchipSpline sp;
60+
make_derivative_y( m_DXX, m_DXXY );
61+
make_derivative_x( m_DYY, m_DXYY );
6062

61-
// calcolo derivate DX, DY, DXY
62-
for ( integer j{0}; j < m_ny; ++j ) {
63-
sp.build( m_X, 1, &z_node_ref(0,j), m_ny, m_nx );
64-
for ( integer i{0}; i < m_nx; ++i ) Dx_node_ref(i,j) = sp.yp_node(i);
65-
}
66-
for ( integer i{0}; i < m_nx; ++i ) {
67-
sp.build( m_Y, 1, &z_node_ref(i,0), 1, m_ny );
68-
for ( integer j{0}; j < m_ny; ++j ) Dy_node_ref(i,j) = sp.yp_node(j);
69-
}
70-
71-
// mixed
72-
for ( integer j{0}; j < m_ny; ++j ) {
73-
sp.build( m_X, 1, &Dx_node_ref(0,j), m_ny, m_nx );
74-
for ( integer i{0}; i < m_nx; ++i ) Dxy_node_ref(i,j) = sp.yp_node(i);
75-
}
76-
for ( integer i{0}; i < m_nx; ++i ) {
77-
sp.build( m_Y, 1, &Dy_node_ref(i,0), 1, m_ny );
78-
for ( integer j{0}; j < m_ny; ++j ) Dxy_node_ref(i,j) = minmod( Dxy_node_ref(i,j), sp.yp_node(j) );
79-
}
80-
81-
// calcolo derivate DXX, DYY, DXXY, DXYY, DXXYY
82-
for ( integer j{0}; j < m_ny; ++j ) {
83-
sp.build( m_X, 1, &Dx_node_ref(0,j), m_ny, m_nx );
84-
for ( integer i{0}; i < m_nx; ++i ) Dxx_node_ref(i,j) = sp.yp_node(i);
85-
}
86-
for ( integer i{0}; i < m_nx; ++i ) {
87-
sp.build( m_Y, 1, &Dy_node_ref(i,0), 1, m_ny );
88-
for ( integer j{0}; j < m_ny; ++j ) Dyy_node_ref(i,j) = sp.yp_node(j);
89-
}
90-
for ( integer j{0}; j < m_ny; ++j ) {
91-
sp.build( m_X, 1, &Dxy_node_ref(0,j), m_ny, m_nx );
92-
for ( integer i{0}; i < m_nx; ++i ) Dxxy_node_ref(i,j) = sp.yp_node(i);
93-
}
94-
for ( integer i{0}; i < m_nx; ++i ) {
95-
sp.build( m_Y, 1, &Dxy_node_ref(i,0), 1, m_ny );
96-
for ( integer j{0}; j < m_ny; ++j ) Dxyy_node_ref(i,j) = sp.yp_node(j);
97-
}
98-
// mixed
99-
for ( integer j{0}; j < m_ny; ++j ) {
100-
sp.build( m_X, 1, &Dxyy_node_ref(0,j), m_ny, m_nx );
101-
for ( integer i{0}; i < m_nx; ++i ) Dxxyy_node_ref(i,j) = sp.yp_node(i);
102-
}
103-
for ( integer i{0}; i < m_nx; ++i ) {
104-
sp.build( m_Y, 1, &Dxxy_node_ref(i,0), 1, m_ny );
105-
for ( integer j{0}; j < m_ny; ++j ) Dxxy_node_ref(i,j) = minmod( Dxxy_node_ref(i,j), sp.yp_node(j) );
106-
}
63+
make_derivative_xy( m_DXXY, m_DXYY, m_DXXYY );
10764

10865
}
10966

src/SplineSurf.cc

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
/*--------------------------------------------------------------------------*\
2+
| |
3+
| Copyright (C) 2016 |
4+
| |
5+
| , __ , __ |
6+
| /|/ \ /|/ \ |
7+
| | __/ _ ,_ | __/ _ ,_ |
8+
| | \|/ / | | | | \|/ / | | | |
9+
| |(__/|__/ |_/ \_/|/|(__/|__/ |_/ \_/|/ |
10+
| /| /| |
11+
| \| \| |
12+
| |
13+
| Enrico Bertolazzi |
14+
| Dipartimento di Ingegneria Industriale |
15+
| Università degli Studi di Trento |
16+
| email: enrico.bertolazzi@unitn.it |
17+
| |
18+
\*--------------------------------------------------------------------------*/
19+
#ifdef __clang__
20+
#pragma clang diagnostic ignored "-Wc++98-compat-pedantic"
21+
#pragma clang diagnostic ignored "-Wc++98-compat"
22+
#pragma clang diagnostic ignored "-Wdocumentation-unknown-command"
23+
#pragma clang diagnostic ignored "-Wglobal-constructors"
24+
#pragma clang diagnostic ignored "-Wpoison-system-directories"
25+
#pragma clang diagnostic ignored "-Wundefined-func-template"
26+
#endif
27+
28+
#include "Splines.hh"
29+
#include "Utils_fmt.hh"
30+
31+
#ifndef DOXYGEN_SHOULD_SKIP_THIS
32+
using namespace std; // load standard namspace
33+
#endif
34+
35+
namespace Splines {
36+
37+
void
38+
SplineSurf::make_derivative_x( real_type const z[], real_type dx[] ) {
39+
PchipSpline pchip_work;
40+
for ( integer j{0}; j < m_ny; ++j ) {
41+
pchip_work.build( m_X, 1, z + ipos_C(0,j), m_ny, m_nx );
42+
for ( integer i{0}; i < m_nx; ++i ) dx[ipos_C(i,j)] = pchip_work.yp_node(i);
43+
}
44+
}
45+
46+
void
47+
SplineSurf::make_derivative_y( real_type const z[], real_type dy[] ) {
48+
PchipSpline pchip_work;
49+
for ( integer i{0}; i < m_nx; ++i ) {
50+
pchip_work.build( m_Y, 1, z + ipos_C(i,0), 1, m_ny );
51+
for ( integer j{0}; j < m_ny; ++j ) dy[ipos_C(i,j)] = pchip_work.yp_node(j);
52+
}
53+
}
54+
55+
void
56+
SplineSurf::make_derivative_xy( real_type const dx[], real_type const dy[], real_type dxy[] ) {
57+
PchipSpline pchip_work;
58+
59+
auto minmod = [] ( real_type a, real_type b ) -> real_type {
60+
if ( a*b <= 0 ) return 0;
61+
if ( a > 0 ) return std::min(a,b);
62+
return std::max(a,b);
63+
};
64+
65+
for ( integer j{0}; j < m_ny; ++j ) {
66+
pchip_work.build( m_X, 1, dy + ipos_C(0,j), m_ny, m_nx );
67+
for ( integer i{0}; i < m_nx; ++i ) dxy[ipos_C(i,j)] = pchip_work.yp_node(i);
68+
}
69+
70+
for ( integer i{0}; i < m_nx; ++i ) {
71+
pchip_work.build( m_Y, 1, dx + ipos_C(i,0), 1, m_ny );
72+
for ( integer j{0}; j < m_ny; ++j ) {
73+
integer const ij{ipos_C(i,j)};
74+
dxy[ij] = minmod( dxy[ij], pchip_work.yp_node(j) );
75+
}
76+
}
77+
}
78+
79+
}

src/Splines.hh

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1244,8 +1244,6 @@ namespace Splines {
12441244

12451245
real_type & z_node_ref( integer i, integer j ) { return m_Z[this->ipos_C(i,j)]; }
12461246

1247-
virtual void make_spline() = 0;
1248-
12491247
void
12501248
load_Z(
12511249
real_type const z[],
@@ -1254,6 +1252,12 @@ namespace Splines {
12541252
bool transposed
12551253
);
12561254

1255+
virtual void make_spline() = 0;
1256+
1257+
void make_derivative_x ( real_type const z[], real_type dz[] );
1258+
void make_derivative_y ( real_type const z[], real_type dz[] );
1259+
void make_derivative_xy ( real_type const dx[], real_type const dy[], real_type dxy[] );
1260+
12571261
#endif
12581262

12591263
public:

0 commit comments

Comments
 (0)