diff --git a/docs/html/_formulas_dark 2.tex b/docs/html/_formulas_dark 2.tex new file mode 100644 index 0000000..2ae6bc1 --- /dev/null +++ b/docs/html/_formulas_dark 2.tex @@ -0,0 +1,53 @@ +\documentclass{article} +\usepackage{iftex} +\usepackage{ifthen} +\usepackage{epsfig} +\usepackage[utf8]{inputenc} +\usepackage{xcolor} +\color{white} +\pagecolor{black} +\ifPDFTeX +\usepackage{newunicodechar} + \makeatletter + \def\doxynewunicodechar#1#2{% + \@tempswafalse + \edef\nuc@tempa{\detokenize{#1}}% + \if\relax\nuc@tempa\relax + \nuc@emptyargerr + \else + \edef\@tempb{\expandafter\@car\nuc@tempa\@nil}% + \nuc@check + \if@tempswa + \@namedef{u8:\nuc@tempa}{#2}% + \fi + \fi + } + \makeatother + \doxynewunicodechar{⁻}{${}^{-}$}% Superscript minus + \doxynewunicodechar{²}{${}^{2}$}% Superscript two + \doxynewunicodechar{³}{${}^{3}$}% Superscript three + +\fi +\pagestyle{empty} +\begin{document} +\[ T_i^{n+1} = T_i^{n-1} + 2 r \left( T_{i+1}^n - 2 T_i^n + T_{i-1}^n \right), + \quad r = \frac{D \, \Delta t}{\Delta x^2} +\] +\pagebreak + +$T^{n-1}$ +\pagebreak + +$T^n$ +\pagebreak + +$T^{n+1}$ +\pagebreak + +$T^{n}$ +\pagebreak + +$i = 1, \dots, N-2$ +\pagebreak + +\end{document} diff --git a/docs/html/analytical_8cpp_source 2.html b/docs/html/analytical_8cpp_source 2.html new file mode 100644 index 0000000..be72c37 --- /dev/null +++ b/docs/html/analytical_8cpp_source 2.html @@ -0,0 +1,171 @@ + + + + + + + +1D Heat Equation Solver: src/methods/analytical.cpp Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
1D Heat Equation Solver 1.0 +
+
Computational Methods Assignment 2025
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
analytical.cpp
+
+
+Go to the documentation of this file.
+
2
+
3#include <cmath>
+
4#include <numbers> // C++20 for std::numbers::pi
+
5
+
+
6double Analytical::solve(double t, double x, const PhysParams& phys)
+
7{
+
8 // If t=0, return initial condition (handling discontinuity at boundaries if needed)
+
9 // But strictly speaking, at t=0, T=Tin everywhere inside.
+
10 if (t <= 0.0)
+
11 return phys.Tin;
+
12
+
13 // Constants
+
14 const double pi = std::numbers::pi;
+
15 const double L = phys.L_cm;
+
16 const double D = phys.D_cm2h;
+
17
+
18 double sum = 0.0;
+
19 const int max_k = 200; // Number of terms for convergence
+
20
+
21 for (int k = 0; k < max_k; ++k)
+
22 {
+
23 double term_k = 2.0 * k + 1.0;
+
24 double lambda = (term_k * pi) / L;
+
25
+
26 double sine_term = std::sin(lambda * x);
+
27 double exp_term = std::exp(-D * lambda * lambda * t);
+
28
+
29 sum += (1.0 / term_k) * sine_term * exp_term;
+
30 }
+
31
+
32 // T(x,t) = Tsur + (Tin - Tsur) * (4/pi) * sum
+
33 return phys.Tsur + (phys.Tin - phys.Tsur) * (4.0 / pi) * sum;
+
34}
+
+
35
+
36std::vector<double>
+
+
37Analytical::get_profile(double t, const std::vector<double>& x_grid, const PhysParams& phys)
+
38{
+
39 std::vector<double> T(x_grid.size());
+
40 for (size_t i = 0; i < x_grid.size(); ++i)
+
41 {
+
42 // Handle boundaries explicitly to avoid series artifacts (Gibbs phenomenon) at x=0, x=L
+
43 if (i == 0 || i == x_grid.size() - 1)
+
44 {
+
45 T[i] = phys.Tsur;
+
46 }
+
47 else
+
48 {
+
49 T[i] = solve(t, x_grid[i], phys);
+
50 }
+
51 }
+
52 return T;
+
53}
+
+ +
static std::vector< double > get_profile(double t, const std::vector< double > &x_grid, const PhysParams &phys)
Generate a full temperature profile for a set of grid points.
+
static double solve(double t, double x, const PhysParams &phys)
Compute the exact temperature at a given time and position.
Definition analytical.cpp:6
+
Physical parameters of the wall heat conduction problem.
Definition types.hpp:10
+
double Tin
Initial temperature [°C].
Definition types.hpp:13
+
double D_cm2h
Thermal diffusivity [cm^2/h].
Definition types.hpp:12
+
double L_cm
Wall thickness [cm].
Definition types.hpp:11
+
double Tsur
Surface (Dirichlet) temperature [°C].
Definition types.hpp:14
+
+
+
+ + + + diff --git a/docs/html/analytical_8hpp 2.html b/docs/html/analytical_8hpp 2.html new file mode 100644 index 0000000..29b71d5 --- /dev/null +++ b/docs/html/analytical_8hpp 2.html @@ -0,0 +1,123 @@ + + + + + + + +1D Heat Equation Solver: include/methods/analytical.hpp File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
1D Heat Equation Solver 1.0 +
+
Computational Methods Assignment 2025
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
analytical.hpp File Reference
+
+
+
#include "types.hpp"
+#include <vector>
+
+

Go to the source code of this file.

+ + + + +

+Classes

class  Analytical
 Analytical solution for the 1D heat equation. More...
+
+
+ +
+ + + + diff --git a/docs/html/analytical_8hpp 2.js b/docs/html/analytical_8hpp 2.js new file mode 100644 index 0000000..2f1ca4f --- /dev/null +++ b/docs/html/analytical_8hpp 2.js @@ -0,0 +1,4 @@ +var analytical_8hpp = +[ + [ "Analytical", "classAnalytical.html", "classAnalytical" ] +]; \ No newline at end of file diff --git a/docs/html/annotated 2.html b/docs/html/annotated 2.html new file mode 100644 index 0000000..8c5c0c6 --- /dev/null +++ b/docs/html/annotated 2.html @@ -0,0 +1,119 @@ + + + + + + + +1D Heat Equation Solver: Class List + + + + + + + + + + + + + + +
+
+ + + + + + +
+
1D Heat Equation Solver 1.0 +
+
Computational Methods Assignment 2025
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class List
+
+
+
Here are the classes, structs, unions and interfaces with brief descriptions:
+ + + + + + + + + + + +
 CAnalyticalAnalytical solution for the 1D heat equation
 CCrankNicolsonCrank-Nicolson scheme implementation
 CDuFortFrankel
 CGridUniform 1D grid on x ∈ [0, L], including both boundary nodes
 CHeatSolver
 CLaasonenLaasonen implicit method (Backward Euler in time + Central in space). Unconditionally stable for the 1D heat equation
 CMethodAbstract interface for time-integration schemes solving the 1D heat equation
 CNumParamsNumerical parameters controlling the discretization and output
 CPhysParamsPhysical parameters of the wall heat conduction problem
 CRichardsonImplementation of the explicit Richardson scheme (CTCS)
+
+
+
+
+ + + + diff --git a/docs/html/annotated_dup 2.js b/docs/html/annotated_dup 2.js new file mode 100644 index 0000000..85babca --- /dev/null +++ b/docs/html/annotated_dup 2.js @@ -0,0 +1,13 @@ +var annotated_dup = +[ + [ "Analytical", "classAnalytical.html", "classAnalytical" ], + [ "CrankNicolson", "classCrankNicolson.html", "classCrankNicolson" ], + [ "DuFortFrankel", "classDuFortFrankel.html", "classDuFortFrankel" ], + [ "Grid", "structGrid.html", "structGrid" ], + [ "HeatSolver", "classHeatSolver.html", "classHeatSolver" ], + [ "Laasonen", "classLaasonen.html", "classLaasonen" ], + [ "Method", "classMethod.html", "classMethod" ], + [ "NumParams", "structNumParams.html", "structNumParams" ], + [ "PhysParams", "structPhysParams.html", "structPhysParams" ], + [ "Richardson", "classRichardson.html", "classRichardson" ] +]; \ No newline at end of file diff --git a/docs/html/classAnalytical 2.js b/docs/html/classAnalytical 2.js new file mode 100644 index 0000000..067e78c --- /dev/null +++ b/docs/html/classAnalytical 2.js @@ -0,0 +1,5 @@ +var classAnalytical = +[ + [ "get_profile", "classAnalytical.html#a0b45d4039d8f5533f59b7434462b7b0e", null ], + [ "solve", "classAnalytical.html#a5ce9f4b799f214e427a60b785a199868", null ] +]; \ No newline at end of file diff --git a/docs/html/classCrankNicolson 2.js b/docs/html/classCrankNicolson 2.js new file mode 100644 index 0000000..a6b58f3 --- /dev/null +++ b/docs/html/classCrankNicolson 2.js @@ -0,0 +1,6 @@ +var classCrankNicolson = +[ + [ "name", "classCrankNicolson.html#aab05d34b2380c8417d9f52adcb3b0d0e", null ], + [ "step", "classCrankNicolson.html#a63260dd114f3acf97e3cbec307238c14", null ], + [ "uses_previous_step", "classCrankNicolson.html#ae9fa3d4dc823b767ebb656fa95ac101a", null ] +]; \ No newline at end of file diff --git a/docs/html/classDuFortFrankel 2.html b/docs/html/classDuFortFrankel 2.html new file mode 100644 index 0000000..6340bb1 --- /dev/null +++ b/docs/html/classDuFortFrankel 2.html @@ -0,0 +1,275 @@ + + + + + + + +1D Heat Equation Solver: DuFortFrankel Class Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
1D Heat Equation Solver 1.0 +
+
Computational Methods Assignment 2025
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
DuFortFrankel Class Referencefinal
+
+
+ +

#include <dufort_frankel.hpp>

+
+Inheritance diagram for DuFortFrankel:
+
+
+ + +Method + +
+ + + + + + + + + + +

+Public Member Functions

std::string name () const override
 Get human-readable name of the scheme.
void step (const Grid &g, double D, double dt, const std::vector< double > &Tprev, const std::vector< double > &Tcurr, std::vector< double > &Tnext) const override
 Computes the temperature field at the next time step (T^{n+1}).
bool uses_previous_step () const noexcept override
 Indicates if the scheme requires data from time step n-1.
Public Member Functions inherited from Method
virtual ~Method ()=default
+

Detailed Description

+
+

Definition at line 12 of file dufort_frankel.hpp.

+

Member Function Documentation

+ +

◆ name()

+ +
+
+ + + + + +
+ + + + + + + +
std::string DuFortFrankel::name () const
+
+inlineoverridevirtual
+
+ +

Get human-readable name of the scheme.

+ +

Implements Method.

+ +

Definition at line 15 of file dufort_frankel.hpp.

+ +
+
+ +

◆ step()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void DuFortFrankel::step (const Grid & g,
double D,
double dt,
const std::vector< double > & Tprev,
const std::vector< double > & Tcurr,
std::vector< double > & Tnext ) const
+
+overridevirtual
+
+ +

Computes the temperature field at the next time step (T^{n+1}).

+
Parameters
+ + + + + + + +
gGrid metadata (spacing dx and node count Nx).
DThermal diffusivity [cm^2/h].
dtTime step size [h].
TprevTemperature at time step n-1 (Read-only). Required only for 3-level schemes (Richardson, DuFort-Frankel). For 2-level schemes, this vector may be ignored.
TcurrTemperature at time step n (Read-only).
TnextOutput vector to be filled with temperature at time step n+1.
+
+
+ +

Implements Method.

+ +

Definition at line 6 of file dufort_frankel.cpp.

+ +
+
+ +

◆ uses_previous_step()

+ +
+
+ + + + + +
+ + + + + + + +
bool DuFortFrankel::uses_previous_step () const
+
+inlineoverridevirtualnoexcept
+
+ +

Indicates if the scheme requires data from time step n-1.

+
Returns
true For 3-level schemes (e.g., Richardson, DuFort-Frankel).
+
+false For 2-level schemes (e.g., Laasonen, Crank-Nicolson).
+ +

Implements Method.

+ +

Definition at line 25 of file dufort_frankel.hpp.

+ +
+
+
The documentation for this class was generated from the following files: +
+
+ +
+ + + + diff --git a/docs/html/classDuFortFrankel 2.js b/docs/html/classDuFortFrankel 2.js new file mode 100644 index 0000000..ba0502a --- /dev/null +++ b/docs/html/classDuFortFrankel 2.js @@ -0,0 +1,6 @@ +var classDuFortFrankel = +[ + [ "name", "classDuFortFrankel.html#a16150b7a7f50bf6c58b6757d51a58873", null ], + [ "step", "classDuFortFrankel.html#aca4de07b409d879f2c429833e2d9a8bd", null ], + [ "uses_previous_step", "classDuFortFrankel.html#a9aa2476053dcbe349c03e0bb0e2f88bc", null ] +]; \ No newline at end of file diff --git a/docs/html/classDuFortFrankel-members 2.html b/docs/html/classDuFortFrankel-members 2.html new file mode 100644 index 0000000..424755a --- /dev/null +++ b/docs/html/classDuFortFrankel-members 2.html @@ -0,0 +1,112 @@ + + + + + + + +1D Heat Equation Solver: Member List + + + + + + + + + + + + + + +
+
+ + + + + + +
+
1D Heat Equation Solver 1.0 +
+
Computational Methods Assignment 2025
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
DuFortFrankel Member List
+
+
+ +

This is the complete list of members for DuFortFrankel, including all inherited members.

+ + + + + +
name() const overrideDuFortFrankelinlinevirtual
step(const Grid &g, double D, double dt, const std::vector< double > &Tprev, const std::vector< double > &Tcurr, std::vector< double > &Tnext) const overrideDuFortFrankelvirtual
uses_previous_step() const noexcept overrideDuFortFrankelinlinevirtual
~Method()=defaultMethodvirtual
+
+
+ + + + diff --git a/docs/html/classHeatSolver 2.js b/docs/html/classHeatSolver 2.js new file mode 100644 index 0000000..ccca110 --- /dev/null +++ b/docs/html/classHeatSolver 2.js @@ -0,0 +1,16 @@ +var classHeatSolver = +[ + [ "HeatSolver", "classHeatSolver.html#a7c61e4ef0afe747973247e3d9c90363b", null ], + [ "apply_dirichlet", "classHeatSolver.html#a550a86196c5d94dc841106e5e2d0b7a1", null ], + [ "bootstrap_if_needed", "classHeatSolver.html#a73465e014e6cc2909b68ba0d0c91a2f8", null ], + [ "init_field", "classHeatSolver.html#abfd38936a78329e3f86b4a5c85cbc476", null ], + [ "run", "classHeatSolver.html#a74ee039aeca94d957300da416fcb5153", null ], + [ "grid_", "classHeatSolver.html#aad1dc28e3f6f1a1fa3bb21a2421982a7", null ], + [ "method_", "classHeatSolver.html#a72948e15ba9ef0d8c7d8a6ca543f474d", null ], + [ "next_", "classHeatSolver.html#a5a2464561d4f8abb1c6c526bbb63617b", null ], + [ "num_", "classHeatSolver.html#a605aa538646ac9d9a56c7a6288fc998a", null ], + [ "phys_", "classHeatSolver.html#a50debd3f914ac11b91a7fd400f897415", null ], + [ "T_", "classHeatSolver.html#aaf81dcc6059d59acc9849a3c2cbcf0a7", null ], + [ "Tprev_", "classHeatSolver.html#a440da39831bdc545416298a8241c6d18", null ], + [ "uses_prev_step_", "classHeatSolver.html#ae3a1a0275e2ef24f264a1bd085a2c209", null ] +]; \ No newline at end of file diff --git a/docs/html/classLaasonen 2.html b/docs/html/classLaasonen 2.html new file mode 100644 index 0000000..7743983 --- /dev/null +++ b/docs/html/classLaasonen 2.html @@ -0,0 +1,279 @@ + + + + + + + +1D Heat Equation Solver: Laasonen Class Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
1D Heat Equation Solver 1.0 +
+
Computational Methods Assignment 2025
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Laasonen Class Reference
+
+
+ +

Laasonen implicit method (Backward Euler in time + Central in space). Unconditionally stable for the 1D heat equation. + More...

+ +

#include <laasonen.hpp>

+
+Inheritance diagram for Laasonen:
+
+
+ + +Method + +
+ + + + + + + + + + +

+Public Member Functions

std::string name () const override
 Get human-readable name of the scheme.
void step (const Grid &g, double D, double dt, const std::vector< double > &Tprev, const std::vector< double > &Tcurr, std::vector< double > &Tnext) const override
 Computes the temperature field at the next time step (T^{n+1}).
bool uses_previous_step () const noexcept override
 Indicates if the scheme requires data from time step n-1.
Public Member Functions inherited from Method
virtual ~Method ()=default
+

Detailed Description

+

Laasonen implicit method (Backward Euler in time + Central in space). Unconditionally stable for the 1D heat equation.

+ +

Definition at line 11 of file laasonen.hpp.

+

Member Function Documentation

+ +

◆ name()

+ +
+
+ + + + + +
+ + + + + + + +
std::string Laasonen::name () const
+
+inlineoverridevirtual
+
+ +

Get human-readable name of the scheme.

+ +

Implements Method.

+ +

Definition at line 14 of file laasonen.hpp.

+ +
+
+ +

◆ step()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void Laasonen::step (const Grid & g,
double D,
double dt,
const std::vector< double > & Tprev,
const std::vector< double > & Tcurr,
std::vector< double > & Tnext ) const
+
+overridevirtual
+
+ +

Computes the temperature field at the next time step (T^{n+1}).

+
Parameters
+ + + + + + + +
gGrid metadata (spacing dx and node count Nx).
DThermal diffusivity [cm^2/h].
dtTime step size [h].
TprevTemperature at time step n-1 (Read-only). Required only for 3-level schemes (Richardson, DuFort-Frankel). For 2-level schemes, this vector may be ignored.
TcurrTemperature at time step n (Read-only).
TnextOutput vector to be filled with temperature at time step n+1.
+
+
+ +

Implements Method.

+ +

Definition at line 6 of file laasonen.cpp.

+ +
+
+ +

◆ uses_previous_step()

+ +
+
+ + + + + +
+ + + + + + + +
bool Laasonen::uses_previous_step () const
+
+inlineoverridevirtualnoexcept
+
+ +

Indicates if the scheme requires data from time step n-1.

+
Returns
true For 3-level schemes (e.g., Richardson, DuFort-Frankel).
+
+false For 2-level schemes (e.g., Laasonen, Crank-Nicolson).
+ +

Implements Method.

+ +

Definition at line 26 of file laasonen.hpp.

+ +
+
+
The documentation for this class was generated from the following files: +
+
+ +
+ + + + diff --git a/docs/html/classLaasonen 2.js b/docs/html/classLaasonen 2.js new file mode 100644 index 0000000..31e43e6 --- /dev/null +++ b/docs/html/classLaasonen 2.js @@ -0,0 +1,6 @@ +var classLaasonen = +[ + [ "name", "classLaasonen.html#acb5bdb1ecf0cda8c059dbb3836752029", null ], + [ "step", "classLaasonen.html#abfde5103e8f45882df696af7908ac0df", null ], + [ "uses_previous_step", "classLaasonen.html#ab7d78d0dca1dd6cec262af91569ed14a", null ] +]; \ No newline at end of file diff --git a/docs/html/classLaasonen 2.png b/docs/html/classLaasonen 2.png new file mode 100644 index 0000000..01cf7f8 Binary files /dev/null and b/docs/html/classLaasonen 2.png differ diff --git a/docs/html/classLaasonen-members 2.html b/docs/html/classLaasonen-members 2.html new file mode 100644 index 0000000..b41db64 --- /dev/null +++ b/docs/html/classLaasonen-members 2.html @@ -0,0 +1,112 @@ + + + + + + + +1D Heat Equation Solver: Member List + + + + + + + + + + + + + + +
+
+ + + + + + +
+
1D Heat Equation Solver 1.0 +
+
Computational Methods Assignment 2025
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Laasonen Member List
+
+
+ +

This is the complete list of members for Laasonen, including all inherited members.

+ + + + + +
name() const overrideLaasoneninlinevirtual
step(const Grid &g, double D, double dt, const std::vector< double > &Tprev, const std::vector< double > &Tcurr, std::vector< double > &Tnext) const overrideLaasonenvirtual
uses_previous_step() const noexcept overrideLaasoneninlinevirtual
~Method()=defaultMethodvirtual
+
+
+ + + + diff --git a/docs/html/classMethod 2.html b/docs/html/classMethod 2.html new file mode 100644 index 0000000..032a898 --- /dev/null +++ b/docs/html/classMethod 2.html @@ -0,0 +1,301 @@ + + + + + + + +1D Heat Equation Solver: Method Class Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
1D Heat Equation Solver 1.0 +
+
Computational Methods Assignment 2025
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Method Class Referenceabstract
+
+
+ +

Abstract interface for time-integration schemes solving the 1D heat equation. + More...

+ +

#include <method.hpp>

+
+Inheritance diagram for Method:
+
+
+ + +CrankNicolson +DuFortFrankel +Laasonen +Richardson + +
+ + + + + + + + + +

+Public Member Functions

virtual ~Method ()=default
virtual std::string name () const =0
 Get human-readable name of the scheme.
virtual void step (const Grid &g, double D, double dt, const std::vector< double > &Tprev, const std::vector< double > &Tcurr, std::vector< double > &Tnext) const =0
 Computes the temperature field at the next time step (T^{n+1}).
virtual bool uses_previous_step () const =0
 Indicates if the scheme requires data from time step n-1.
+

Detailed Description

+

Abstract interface for time-integration schemes solving the 1D heat equation.

+

This interface abstracts away the difference between explicit/implicit schemes and 2-level/3-level time stepping schemes.

+ +

Definition at line 27 of file method.hpp.

+

Constructor & Destructor Documentation

+ +

◆ ~Method()

+ +
+
+ + + + + +
+ + + + + + + +
virtual Method::~Method ()
+
+virtualdefault
+
+ +
+
+

Member Function Documentation

+ +

◆ name()

+ +
+
+ + + + + +
+ + + + + + + +
virtual std::string Method::name () const
+
+pure virtual
+
+ +

Get human-readable name of the scheme.

+ +

Implemented in CrankNicolson, DuFortFrankel, Laasonen, and Richardson.

+ +
+
+ +

◆ step()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
virtual void Method::step (const Grid & g,
double D,
double dt,
const std::vector< double > & Tprev,
const std::vector< double > & Tcurr,
std::vector< double > & Tnext ) const
+
+pure virtual
+
+ +

Computes the temperature field at the next time step (T^{n+1}).

+
Parameters
+ + + + + + + +
gGrid metadata (spacing dx and node count Nx).
DThermal diffusivity [cm^2/h].
dtTime step size [h].
TprevTemperature at time step n-1 (Read-only). Required only for 3-level schemes (Richardson, DuFort-Frankel). For 2-level schemes, this vector may be ignored.
TcurrTemperature at time step n (Read-only).
TnextOutput vector to be filled with temperature at time step n+1.
+
+
+ +

Implemented in CrankNicolson, DuFortFrankel, Laasonen, and Richardson.

+ +
+
+ +

◆ uses_previous_step()

+ +
+
+ + + + + +
+ + + + + + + +
virtual bool Method::uses_previous_step () const
+
+pure virtual
+
+ +

Indicates if the scheme requires data from time step n-1.

+
Returns
true For 3-level schemes (e.g., Richardson, DuFort-Frankel).
+
+false For 2-level schemes (e.g., Laasonen, Crank-Nicolson).
+ +

Implemented in CrankNicolson, DuFortFrankel, Laasonen, and Richardson.

+ +
+
+
The documentation for this class was generated from the following file: +
+
+ +
+ + + + diff --git a/docs/html/classMethod 2.js b/docs/html/classMethod 2.js new file mode 100644 index 0000000..d7e2cff --- /dev/null +++ b/docs/html/classMethod 2.js @@ -0,0 +1,7 @@ +var classMethod = +[ + [ "~Method", "classMethod.html#a3a5f090070458f73aa33d186e3b75ca1", null ], + [ "name", "classMethod.html#a2b5c1a7c8efca4066a9c52b621e49f38", null ], + [ "step", "classMethod.html#ae9330f2a512c0b304a1627d4d73b2de1", null ], + [ "uses_previous_step", "classMethod.html#a485550a576c926f544d9d873296fd44b", null ] +]; \ No newline at end of file diff --git a/docs/html/classMethod 2.png b/docs/html/classMethod 2.png new file mode 100644 index 0000000..cf33a22 Binary files /dev/null and b/docs/html/classMethod 2.png differ diff --git a/docs/html/classMethod-members 2.html b/docs/html/classMethod-members 2.html new file mode 100644 index 0000000..cab0fca --- /dev/null +++ b/docs/html/classMethod-members 2.html @@ -0,0 +1,112 @@ + + + + + + + +1D Heat Equation Solver: Member List + + + + + + + + + + + + + + +
+
+ + + + + + +
+
1D Heat Equation Solver 1.0 +
+
Computational Methods Assignment 2025
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Method Member List
+
+
+ +

This is the complete list of members for Method, including all inherited members.

+ + + + + +
name() const =0Methodpure virtual
step(const Grid &g, double D, double dt, const std::vector< double > &Tprev, const std::vector< double > &Tcurr, std::vector< double > &Tnext) const =0Methodpure virtual
uses_previous_step() const =0Methodpure virtual
~Method()=defaultMethodvirtual
+
+
+ + + + diff --git a/docs/html/classRichardson 2.html b/docs/html/classRichardson 2.html new file mode 100644 index 0000000..cc251ad --- /dev/null +++ b/docs/html/classRichardson 2.html @@ -0,0 +1,285 @@ + + + + + + + +1D Heat Equation Solver: Richardson Class Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
1D Heat Equation Solver 1.0 +
+
Computational Methods Assignment 2025
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Richardson Class Reference
+
+
+ +

Implementation of the explicit Richardson scheme (CTCS). + More...

+ +

#include <richardson.hpp>

+
+Inheritance diagram for Richardson:
+
+
+ + +Method + +
+ + + + + + + + + + +

+Public Member Functions

bool uses_previous_step () const noexcept override
 Indicate that this is a three-level scheme.
std::string name () const override
 Get human-readable name of the scheme.
void step (const Grid &g, double D, double dt, const std::vector< double > &Tprev, const std::vector< double > &Tcurr, std::vector< double > &Tnext) const override
 Advance one time step using the Richardson explicit scheme.
Public Member Functions inherited from Method
virtual ~Method ()=default
+

Detailed Description

+

Implementation of the explicit Richardson scheme (CTCS).

+

The scheme reads:

+\‍[  T_i^{n+1} = T_i^{n-1} + 2 r \left( T_{i+1}^n - 2 T_i^n + T_{i-1}^n \right),
+  \quad r = \frac{D \, \Delta t}{\Delta x^2}
+\‍] +

+

It is a three-level scheme, therefore it requires both $T^{n-1}$ and $T^n$ to produce $T^{n+1}$. Boundary conditions are not enforced here, but left to the solver.

+ +

Definition at line 26 of file richardson.hpp.

+

Member Function Documentation

+ +

◆ name()

+ +
+
+ + + + + +
+ + + + + + + +
std::string Richardson::name () const
+
+inlineoverridevirtual
+
+ +

Get human-readable name of the scheme.

+
Returns
"Richardson"
+ +

Implements Method.

+ +

Definition at line 42 of file richardson.hpp.

+ +
+
+ +

◆ step()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void Richardson::step (const Grid & g,
double D,
double dt,
const std::vector< double > & Tprev,
const std::vector< double > & Tcurr,
std::vector< double > & Tnext ) const
+
+overridevirtual
+
+ +

Advance one time step using the Richardson explicit scheme.

+

This computes $T^{n+1}$ from $T^{n}$ and $T^{n-1}$. Interior nodes $i = 1, \dots, N-2$ are updated, while boundary nodes are left untouched (the solver will impose Dirichlet BCs).

+
Parameters
+ + + + + + + +
gGrid metadata (spacing and number of nodes)
DDiffusivity [cm^2/h]
dtTime step [h]
TprevTemperature field at previous time layer $T^{n-1}$
TcurrTemperature field at current time layer $T^{n}$
TnextOutput temperature field to be filled with $T^{n+1}$
+
+
+ +

Implements Method.

+ +

Definition at line 10 of file richardson.cpp.

+ +
+
+ +

◆ uses_previous_step()

+ +
+
+ + + + + +
+ + + + + + + +
bool Richardson::uses_previous_step () const
+
+inlineoverridevirtualnoexcept
+
+ +

Indicate that this is a three-level scheme.

+
Returns
true always, since Richardson needs $T^{n-1}$.
+ +

Implements Method.

+ +

Definition at line 33 of file richardson.hpp.

+ +
+
+
The documentation for this class was generated from the following files: +
+
+ +
+ + + + diff --git a/docs/html/classRichardson 2.js b/docs/html/classRichardson 2.js new file mode 100644 index 0000000..e54eb2e --- /dev/null +++ b/docs/html/classRichardson 2.js @@ -0,0 +1,6 @@ +var classRichardson = +[ + [ "name", "classRichardson.html#aff816218ff8157fb54fc7b6609c68f6f", null ], + [ "step", "classRichardson.html#a6ffabd3be25083ccfece54d8c0328caa", null ], + [ "uses_previous_step", "classRichardson.html#ab0f5ede8e3509982336209ffc8ad8ae5", null ] +]; \ No newline at end of file diff --git a/docs/html/classRichardson 2.png b/docs/html/classRichardson 2.png new file mode 100644 index 0000000..5700780 Binary files /dev/null and b/docs/html/classRichardson 2.png differ diff --git a/docs/html/classRichardson-members 2.html b/docs/html/classRichardson-members 2.html new file mode 100644 index 0000000..cbf326d --- /dev/null +++ b/docs/html/classRichardson-members 2.html @@ -0,0 +1,112 @@ + + + + + + + +1D Heat Equation Solver: Member List + + + + + + + + + + + + + + +
+
+ + + + + + +
+
1D Heat Equation Solver 1.0 +
+
Computational Methods Assignment 2025
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Richardson Member List
+
+
+ +

This is the complete list of members for Richardson, including all inherited members.

+ + + + + +
name() const overrideRichardsoninlinevirtual
step(const Grid &g, double D, double dt, const std::vector< double > &Tprev, const std::vector< double > &Tcurr, std::vector< double > &Tnext) const overrideRichardsonvirtual
uses_previous_step() const noexcept overrideRichardsoninlinevirtual
~Method()=defaultMethodvirtual
+
+
+ + + + diff --git a/docs/html/classes 2.html b/docs/html/classes 2.html new file mode 100644 index 0000000..cc522b1 --- /dev/null +++ b/docs/html/classes 2.html @@ -0,0 +1,138 @@ + + + + + + + +1D Heat Equation Solver: Class Index + + + + + + + + + + + + + + +
+
+ + + + + + +
+
1D Heat Equation Solver 1.0 +
+
Computational Methods Assignment 2025
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class Index
+
+
+
A | C | D | G | H | L | M | N | P | R
+ +
+
+
+ + + + diff --git a/docs/html/clipboard 2.js b/docs/html/clipboard 2.js new file mode 100644 index 0000000..9da9f3c --- /dev/null +++ b/docs/html/clipboard 2.js @@ -0,0 +1,61 @@ +/** + +The code below is based on the Doxygen Awesome project, see +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2022 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +let clipboard_title = "Copy to clipboard" +let clipboard_icon = `` +let clipboard_successIcon = `` +let clipboard_successDuration = 1000 + +$(function() { + if(navigator.clipboard) { + const fragments = document.getElementsByClassName("fragment") + for(const fragment of fragments) { + const clipboard_div = document.createElement("div") + clipboard_div.classList.add("clipboard") + clipboard_div.innerHTML = clipboard_icon + clipboard_div.title = clipboard_title + $(clipboard_div).click(function() { + const content = this.parentNode.cloneNode(true) + // filter out line number and folded fragments from file listings + content.querySelectorAll(".lineno, .ttc, .foldclosed").forEach((node) => { node.remove() }) + let text = content.textContent + // remove trailing newlines and trailing spaces from empty lines + text = text.replace(/^\s*\n/gm,'\n').replace(/\n*$/,'') + navigator.clipboard.writeText(text); + this.classList.add("success") + this.innerHTML = clipboard_successIcon + window.setTimeout(() => { // switch back to normal icon after timeout + this.classList.remove("success") + this.innerHTML = clipboard_icon + }, clipboard_successDuration); + }) + fragment.insertBefore(clipboard_div, fragment.firstChild) + } + } +}) diff --git a/docs/html/crank__nicolson_8hpp 2.html b/docs/html/crank__nicolson_8hpp 2.html new file mode 100644 index 0000000..7f65825 --- /dev/null +++ b/docs/html/crank__nicolson_8hpp 2.html @@ -0,0 +1,123 @@ + + + + + + + +1D Heat Equation Solver: include/methods/crank_nicolson.hpp File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
1D Heat Equation Solver 1.0 +
+
Computational Methods Assignment 2025
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
crank_nicolson.hpp File Reference
+
+
+
#include "method.hpp"
+#include <string>
+
+

Go to the source code of this file.

+ + + + +

+Classes

class  CrankNicolson
 Crank-Nicolson scheme implementation. More...
+
+
+ +
+ + + + diff --git a/docs/html/crank__nicolson_8hpp 2.js b/docs/html/crank__nicolson_8hpp 2.js new file mode 100644 index 0000000..3b21fea --- /dev/null +++ b/docs/html/crank__nicolson_8hpp 2.js @@ -0,0 +1,4 @@ +var crank__nicolson_8hpp = +[ + [ "CrankNicolson", "classCrankNicolson.html", "classCrankNicolson" ] +]; \ No newline at end of file diff --git a/docs/html/crank__nicolson_8hpp_source 2.html b/docs/html/crank__nicolson_8hpp_source 2.html new file mode 100644 index 0000000..ae1e056 --- /dev/null +++ b/docs/html/crank__nicolson_8hpp_source 2.html @@ -0,0 +1,150 @@ + + + + + + + +1D Heat Equation Solver: include/methods/crank_nicolson.hpp Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
1D Heat Equation Solver 1.0 +
+
Computational Methods Assignment 2025
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
crank_nicolson.hpp
+
+
+Go to the documentation of this file.
1#pragma once
+
2
+
3#include "method.hpp"
+
4#include <string>
+
5
+
6/**
+
7 * @brief Crank-Nicolson scheme implementation.
+
8 */
+
+
9class CrankNicolson : public Method
+
10{
+
11 public:
+
+
12 std::string name() const override
+
13 {
+
14 return "Crank-Nicolson";
+
15 }
+
+
16
+
+
17 bool uses_previous_step() const noexcept override
+
18 {
+
19 return false;
+
20 }
+
+
21
+
22 /**
+
23 * @brief Advance one time step using Crank-Nicolson scheme.
+
24 */
+
25 void step(const Grid& g,
+
26 double D,
+
27 double dt,
+
28 const std::vector<double>& Tprev,
+
29 const std::vector<double>& Tcurr,
+
30 std::vector<double>& Tnext) const override;
+
31};
+
+
Crank-Nicolson scheme implementation.
+
void step(const Grid &g, double D, double dt, const std::vector< double > &Tprev, const std::vector< double > &Tcurr, std::vector< double > &Tnext) const override
Advance one time step using Crank-Nicolson scheme.
+
std::string name() const override
Get human-readable name of the scheme.
+
bool uses_previous_step() const noexcept override
Indicates if the scheme requires data from time step n-1.
+
Abstract interface for time-integration schemes solving the 1D heat equation.
Definition method.hpp:28
+ +
Uniform 1D grid on x ∈ [0, L], including both boundary nodes.
Definition grid.hpp:15
+
+
+
+ + + + diff --git a/docs/html/dir_0525f968218f30056a0344f59b10bbbb 2.html b/docs/html/dir_0525f968218f30056a0344f59b10bbbb 2.html new file mode 100644 index 0000000..8f01dec --- /dev/null +++ b/docs/html/dir_0525f968218f30056a0344f59b10bbbb 2.html @@ -0,0 +1,124 @@ + + + + + + + +1D Heat Equation Solver: src/methods Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
1D Heat Equation Solver 1.0 +
+
Computational Methods Assignment 2025
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
methods Directory Reference
+
+
+ + + + + + + + + +

+Files

 
analytical.cpp
 
crank_nicolson.cpp
 Implementation of the Crank-Nicolson scheme using the Thomas Algorithm.
 
dufort_frankel.cpp
 
laasonen.cpp
 
richardson.cpp
 Richardson explicit scheme implementation.
+
+
+ +
+ + + + diff --git a/docs/html/dir_0525f968218f30056a0344f59b10bbbb 2.js b/docs/html/dir_0525f968218f30056a0344f59b10bbbb 2.js new file mode 100644 index 0000000..28c8004 --- /dev/null +++ b/docs/html/dir_0525f968218f30056a0344f59b10bbbb 2.js @@ -0,0 +1,8 @@ +var dir_0525f968218f30056a0344f59b10bbbb = +[ + [ "analytical.cpp", "analytical_8cpp.html", null ], + [ "crank_nicolson.cpp", "crank__nicolson_8cpp.html", null ], + [ "dufort_frankel.cpp", "dufort__frankel_8cpp.html", null ], + [ "laasonen.cpp", "laasonen_8cpp.html", null ], + [ "richardson.cpp", "richardson_8cpp.html", null ] +]; \ No newline at end of file diff --git a/docs/html/dir_4a8b7a750d2ff6c3a99c71777be89ae7 2.html b/docs/html/dir_4a8b7a750d2ff6c3a99c71777be89ae7 2.html new file mode 100644 index 0000000..5777f76 --- /dev/null +++ b/docs/html/dir_4a8b7a750d2ff6c3a99c71777be89ae7 2.html @@ -0,0 +1,124 @@ + + + + + + + +1D Heat Equation Solver: include/methods Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
1D Heat Equation Solver 1.0 +
+
Computational Methods Assignment 2025
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
methods Directory Reference
+
+
+ + + + + + + + + +

+Files

 
analytical.hpp
 
crank_nicolson.hpp
 
dufort_frankel.hpp
 DuFort–Frankel explicit method (3-level scheme).
 
laasonen.hpp
 
richardson.hpp
 Richardson explicit (central time - central space) scheme for the 1D heat equation.
+
+
+ +
+ + + + diff --git a/docs/html/dir_4a8b7a750d2ff6c3a99c71777be89ae7 2.js b/docs/html/dir_4a8b7a750d2ff6c3a99c71777be89ae7 2.js new file mode 100644 index 0000000..30b373a --- /dev/null +++ b/docs/html/dir_4a8b7a750d2ff6c3a99c71777be89ae7 2.js @@ -0,0 +1,8 @@ +var dir_4a8b7a750d2ff6c3a99c71777be89ae7 = +[ + [ "analytical.hpp", "analytical_8hpp.html", "analytical_8hpp" ], + [ "crank_nicolson.hpp", "crank__nicolson_8hpp.html", "crank__nicolson_8hpp" ], + [ "dufort_frankel.hpp", "dufort__frankel_8hpp.html", "dufort__frankel_8hpp" ], + [ "laasonen.hpp", "laasonen_8hpp.html", "laasonen_8hpp" ], + [ "richardson.hpp", "richardson_8hpp.html", "richardson_8hpp" ] +]; \ No newline at end of file diff --git a/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba 2.html b/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba 2.html new file mode 100644 index 0000000..904d754 --- /dev/null +++ b/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba 2.html @@ -0,0 +1,131 @@ + + + + + + + +1D Heat Equation Solver: src Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
1D Heat Equation Solver 1.0 +
+
Computational Methods Assignment 2025
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
src Directory Reference
+
+
+ + + +

+Directories

 
methods
+ + + + + + + + + + + +

+Files

 
grid.cpp
 Implementation of the uniform 1D grid and its validator.
 
io.cpp
 
main.cpp
 Test driver for the 1D heat conduction solver. Supports DuFort-Frankel, Richardson, Laasonen, and Crank-Nicolson schemes.
 
method.cpp
 Factory implementation for numerical schemes.
 
solver.cpp
 Time-marching driver for the 1D heat equation.
 
user_input.cpp
+
+
+ +
+ + + + diff --git a/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba 2.js b/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba 2.js new file mode 100644 index 0000000..b5e2015 --- /dev/null +++ b/docs/html/dir_68267d1309a1af8e8297ef4c3efbcdba 2.js @@ -0,0 +1,10 @@ +var dir_68267d1309a1af8e8297ef4c3efbcdba = +[ + [ "methods", "dir_0525f968218f30056a0344f59b10bbbb.html", "dir_0525f968218f30056a0344f59b10bbbb" ], + [ "grid.cpp", "grid_8cpp.html", "grid_8cpp" ], + [ "io.cpp", "io_8cpp.html", "io_8cpp" ], + [ "main.cpp", "main_8cpp.html", "main_8cpp" ], + [ "method.cpp", "method_8cpp.html", "method_8cpp" ], + [ "solver.cpp", "solver_8cpp.html", null ], + [ "user_input.cpp", "user__input_8cpp.html", "user__input_8cpp" ] +]; \ No newline at end of file diff --git a/docs/html/dir_d44c64559bbebec7f509842c48db8b23 2.html b/docs/html/dir_d44c64559bbebec7f509842c48db8b23 2.html new file mode 100644 index 0000000..471f01a --- /dev/null +++ b/docs/html/dir_d44c64559bbebec7f509842c48db8b23 2.html @@ -0,0 +1,132 @@ + + + + + + + +1D Heat Equation Solver: include Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
1D Heat Equation Solver 1.0 +
+
Computational Methods Assignment 2025
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
include Directory Reference
+
+
+ + + +

+Directories

 
methods
+ + + + + + + + + + + + +

+Files

 
grid.hpp
 Uniform 1D spatial grid.
 
io.hpp
 CSV utilities.
 
method.hpp
 
solver.hpp
 High-level solver orchestrating BCs and time integration.
 
types.hpp
 Basic physical and numerical parameter types for the 1D heat problem.
 
user_input.h
 Utility functions for safe user input from the console.
+
+
+ +
+ + + + diff --git a/docs/html/dir_d44c64559bbebec7f509842c48db8b23 2.js b/docs/html/dir_d44c64559bbebec7f509842c48db8b23 2.js new file mode 100644 index 0000000..461f019 --- /dev/null +++ b/docs/html/dir_d44c64559bbebec7f509842c48db8b23 2.js @@ -0,0 +1,10 @@ +var dir_d44c64559bbebec7f509842c48db8b23 = +[ + [ "methods", "dir_4a8b7a750d2ff6c3a99c71777be89ae7.html", "dir_4a8b7a750d2ff6c3a99c71777be89ae7" ], + [ "grid.hpp", "grid_8hpp.html", "grid_8hpp" ], + [ "io.hpp", "io_8hpp.html", "io_8hpp" ], + [ "method.hpp", "method_8hpp.html", "method_8hpp" ], + [ "solver.hpp", "solver_8hpp.html", "solver_8hpp" ], + [ "types.hpp", "types_8hpp.html", "types_8hpp" ], + [ "user_input.h", "user__input_8h.html", "user__input_8h" ] +]; \ No newline at end of file diff --git a/docs/html/dufort__frankel_8hpp 2.js b/docs/html/dufort__frankel_8hpp 2.js new file mode 100644 index 0000000..d6d818b --- /dev/null +++ b/docs/html/dufort__frankel_8hpp 2.js @@ -0,0 +1,4 @@ +var dufort__frankel_8hpp = +[ + [ "DuFortFrankel", "classDuFortFrankel.html", "classDuFortFrankel" ] +]; \ No newline at end of file diff --git a/docs/html/files 2.html b/docs/html/files 2.html new file mode 100644 index 0000000..3cfa423 --- /dev/null +++ b/docs/html/files 2.html @@ -0,0 +1,135 @@ + + + + + + + +1D Heat Equation Solver: File List + + + + + + + + + + + + + + +
+
+ + + + + + +
+
1D Heat Equation Solver 1.0 +
+
Computational Methods Assignment 2025
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
File List
+
+
+
Here is a list of all files with brief descriptions:
+
[detail level 123]
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
 
include
 
methods
 
analytical.hpp
 
crank_nicolson.hpp
 
dufort_frankel.hpp
DuFort–Frankel explicit method (3-level scheme)
 
laasonen.hpp
 
richardson.hpp
Richardson explicit (central time - central space) scheme for the 1D heat equation
 
grid.hpp
Uniform 1D spatial grid
 
io.hpp
CSV utilities
 
method.hpp
 
solver.hpp
High-level solver orchestrating BCs and time integration
 
types.hpp
Basic physical and numerical parameter types for the 1D heat problem
 
user_input.h
Utility functions for safe user input from the console
 
src
 
methods
 
analytical.cpp
 
crank_nicolson.cpp
Implementation of the Crank-Nicolson scheme using the Thomas Algorithm
 
dufort_frankel.cpp
 
laasonen.cpp
 
richardson.cpp
Richardson explicit scheme implementation
 
grid.cpp
Implementation of the uniform 1D grid and its validator
 
io.cpp
 
main.cpp
Test driver for the 1D heat conduction solver. Supports DuFort-Frankel, Richardson, Laasonen, and Crank-Nicolson schemes
 
method.cpp
Factory implementation for numerical schemes
 
solver.cpp
Time-marching driver for the 1D heat equation
 
user_input.cpp
+
+
+
+
+ + + + diff --git a/docs/html/files_dup 2.js b/docs/html/files_dup 2.js new file mode 100644 index 0000000..89e9042 --- /dev/null +++ b/docs/html/files_dup 2.js @@ -0,0 +1,5 @@ +var files_dup = +[ + [ "include", "dir_d44c64559bbebec7f509842c48db8b23.html", "dir_d44c64559bbebec7f509842c48db8b23" ], + [ "src", "dir_68267d1309a1af8e8297ef4c3efbcdba.html", "dir_68267d1309a1af8e8297ef4c3efbcdba" ] +]; \ No newline at end of file diff --git a/docs/html/functions 2.html b/docs/html/functions 2.html new file mode 100644 index 0000000..475fd40 --- /dev/null +++ b/docs/html/functions 2.html @@ -0,0 +1,201 @@ + + + + + + + +1D Heat Equation Solver: Class Members + + + + + + + + + + + + + + +
+
+ + + + + + +
+
1D Heat Equation Solver 1.0 +
+
Computational Methods Assignment 2025
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all class members with links to the classes they belong to:
+ +

- a -

+ + +

- b -

+ + +

- d -

+ + +

- g -

+ + +

- h -

+ + +

- i -

+ + +

- l -

+ + +

- m -

+ + +

- n -

+ + +

- o -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- u -

+ + +

- x -

+ + +

- ~ -

+
+
+
+ + + + diff --git a/docs/html/functions_func 2.html b/docs/html/functions_func 2.html new file mode 100644 index 0000000..83d906c --- /dev/null +++ b/docs/html/functions_func 2.html @@ -0,0 +1,116 @@ + + + + + + + +1D Heat Equation Solver: Class Members - Functions + + + + + + + + + + + + + + +
+
+ + + + + + +
+
1D Heat Equation Solver 1.0 +
+
Computational Methods Assignment 2025
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all functions with links to the classes they belong to:
+
+
+
+ + + + diff --git a/docs/html/functions_vars 2.html b/docs/html/functions_vars 2.html new file mode 100644 index 0000000..fb8336c --- /dev/null +++ b/docs/html/functions_vars 2.html @@ -0,0 +1,123 @@ + + + + + + + +1D Heat Equation Solver: Class Members - Variables + + + + + + + + + + + + + + +
+
+ + + + + + +
+
1D Heat Equation Solver 1.0 +
+
Computational Methods Assignment 2025
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all variables with links to the classes they belong to:
+
+
+
+ + + + diff --git a/docs/html/globals 2.html b/docs/html/globals 2.html new file mode 100644 index 0000000..1059da3 --- /dev/null +++ b/docs/html/globals 2.html @@ -0,0 +1,113 @@ + + + + + + + +1D Heat Equation Solver: File Members + + + + + + + + + + + + + + +
+
+ + + + + + +
+
1D Heat Equation Solver 1.0 +
+
Computational Methods Assignment 2025
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all file members with links to the files they belong to:
+
+
+
+ + + + diff --git a/docs/html/globals_enum 2.html b/docs/html/globals_enum 2.html new file mode 100644 index 0000000..04540e1 --- /dev/null +++ b/docs/html/globals_enum 2.html @@ -0,0 +1,105 @@ + + + + + + + +1D Heat Equation Solver: File Members + + + + + + + + + + + + + + +
+
+ + + + + + +
+
1D Heat Equation Solver 1.0 +
+
Computational Methods Assignment 2025
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all enums with links to the files they belong to:
+
+
+
+ + + + diff --git a/docs/html/globals_func 2.html b/docs/html/globals_func 2.html new file mode 100644 index 0000000..2173562 --- /dev/null +++ b/docs/html/globals_func 2.html @@ -0,0 +1,112 @@ + + + + + + + +1D Heat Equation Solver: File Members + + + + + + + + + + + + + + +
+
+ + + + + + +
+
1D Heat Equation Solver 1.0 +
+
Computational Methods Assignment 2025
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all functions with links to the files they belong to:
+
+
+
+ + + + diff --git a/docs/html/grid_8cpp 2.js b/docs/html/grid_8cpp 2.js new file mode 100644 index 0000000..9da3ce6 --- /dev/null +++ b/docs/html/grid_8cpp 2.js @@ -0,0 +1,4 @@ +var grid_8cpp = +[ + [ "validate_grid", "grid_8cpp.html#af9a3f37e370003173c37abb937a88f8d", null ] +]; \ No newline at end of file diff --git a/docs/html/grid_8hpp 2.js b/docs/html/grid_8hpp 2.js new file mode 100644 index 0000000..7342a9d --- /dev/null +++ b/docs/html/grid_8hpp 2.js @@ -0,0 +1,5 @@ +var grid_8hpp = +[ + [ "Grid", "structGrid.html", "structGrid" ], + [ "validate_grid", "grid_8hpp.html#a230ec54dfec2cbe1d6896ab82ab76d98", null ] +]; \ No newline at end of file diff --git a/docs/html/grid_8hpp_source 2.html b/docs/html/grid_8hpp_source 2.html new file mode 100644 index 0000000..001cb30 --- /dev/null +++ b/docs/html/grid_8hpp_source 2.html @@ -0,0 +1,152 @@ + + + + + + + +1D Heat Equation Solver: include/grid.hpp Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
1D Heat Equation Solver 1.0 +
+
Computational Methods Assignment 2025
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
grid.hpp
+
+
+Go to the documentation of this file.
1#pragma once
+
2/**
+
3 * @file grid.hpp
+
4 * @brief Uniform 1D spatial grid.
+
5 */
+
6
+
7#include <vector>
+
8#include <cstddef>
+
9
+
10/**
+
11 * @brief Uniform 1D grid on x ∈ [0, L], including both boundary nodes.
+
12 *
+
13 * Builds Nx = round(L/dx) + 1 nodes with coordinates x[i] = i * dx.
+
14 */
+
+
15struct Grid {
+
16 double L; ///< Domain length [cm]
+
17 double dx; ///< Spatial step [cm]
+
18 std::size_t Nx; ///< Number of nodes (including boundaries)
+
19 std::vector<double> x; ///< Node coordinates [cm]
+
20
+
21 /**
+
22 * @brief Construct a grid with given length and spacing.
+
23 * @param L_cm Domain length [cm]
+
24 * @param dx_cm Spatial step [cm]
+
25 */
+
26 Grid(double L_cm, double dx_cm);
+
27};
+
+
28
+
29/**
+
30 * @brief Validate grid consistency (assertions in Debug mode).
+
31 *
+
32 * Checks endpoints, monotonicity, uniform spacing and Nx consistency.
+
33 * @param g Grid to validate
+
34 * @param tol Tolerance for floating-point comparisons (default 1e-12)
+
35 * @return true if all assertions pass
+
36 */
+
37bool validate_grid(const Grid& g, double tol = 1e-12);
+
bool validate_grid(const Grid &g, double tol=1e-12)
Validate grid consistency (assertions in Debug mode).
Definition grid.cpp:26
+
Uniform 1D grid on x ∈ [0, L], including both boundary nodes.
Definition grid.hpp:15
+
std::size_t Nx
Number of nodes (including boundaries).
Definition grid.hpp:18
+
double dx
Spatial step [cm].
Definition grid.hpp:17
+
std::vector< double > x
Node coordinates [cm].
Definition grid.hpp:19
+
double L
Domain length [cm].
Definition grid.hpp:16
+
Grid(double L_cm, double dx_cm)
Construct a grid with given length and spacing.
Definition grid.cpp:11
+
+
+
+ + + + diff --git a/docs/html/hierarchy 2.html b/docs/html/hierarchy 2.html new file mode 100644 index 0000000..2ec2d6a --- /dev/null +++ b/docs/html/hierarchy 2.html @@ -0,0 +1,119 @@ + + + + + + + +1D Heat Equation Solver: Class Hierarchy + + + + + + + + + + + + + + +
+
+ + + + + + +
+
1D Heat Equation Solver 1.0 +
+
Computational Methods Assignment 2025
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class Hierarchy
+
+
+
This inheritance list is sorted roughly, but not completely, alphabetically:
+
[detail level 12]
+ + + + + + + + + + +
 CAnalyticalAnalytical solution for the 1D heat equation
 CGridUniform 1D grid on x ∈ [0, L], including both boundary nodes
 CHeatSolver
 CMethodAbstract interface for time-integration schemes solving the 1D heat equation
 CCrankNicolsonCrank-Nicolson scheme implementation
 CDuFortFrankel
 CLaasonenLaasonen implicit method (Backward Euler in time + Central in space). Unconditionally stable for the 1D heat equation
 CRichardsonImplementation of the explicit Richardson scheme (CTCS)
 CNumParamsNumerical parameters controlling the discretization and output
 CPhysParamsPhysical parameters of the wall heat conduction problem
+
+
+
+
+ + + + diff --git a/docs/html/hierarchy 2.js b/docs/html/hierarchy 2.js new file mode 100644 index 0000000..f40dac8 --- /dev/null +++ b/docs/html/hierarchy 2.js @@ -0,0 +1,14 @@ +var hierarchy = +[ + [ "Analytical", "classAnalytical.html", null ], + [ "Grid", "structGrid.html", null ], + [ "HeatSolver", "classHeatSolver.html", null ], + [ "Method", "classMethod.html", [ + [ "CrankNicolson", "classCrankNicolson.html", null ], + [ "DuFortFrankel", "classDuFortFrankel.html", null ], + [ "Laasonen", "classLaasonen.html", null ], + [ "Richardson", "classRichardson.html", null ] + ] ], + [ "NumParams", "structNumParams.html", null ], + [ "PhysParams", "structPhysParams.html", null ] +]; \ No newline at end of file diff --git a/docs/html/index 2.html b/docs/html/index 2.html new file mode 100644 index 0000000..80e65b5 --- /dev/null +++ b/docs/html/index 2.html @@ -0,0 +1,106 @@ + + + + + + + +1D Heat Equation Solver: Main Page + + + + + + + + + + + + + + +
+
+ + + + + + +
+
1D Heat Equation Solver 1.0 +
+
Computational Methods Assignment 2025
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
1D Heat Equation Solver Documentation
+
+
+ +
+
+
+ + + + diff --git a/docs/html/io_8cpp 2.js b/docs/html/io_8cpp 2.js new file mode 100644 index 0000000..6222463 --- /dev/null +++ b/docs/html/io_8cpp 2.js @@ -0,0 +1,4 @@ +var io_8cpp = +[ + [ "save_profile_csv", "io_8cpp.html#aba1e91f1cd31028bb3b005204d491670", null ] +]; \ No newline at end of file diff --git a/docs/html/io_8hpp 2.html b/docs/html/io_8hpp 2.html new file mode 100644 index 0000000..4d2d308 --- /dev/null +++ b/docs/html/io_8hpp 2.html @@ -0,0 +1,170 @@ + + + + + + + +1D Heat Equation Solver: include/io.hpp File Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
1D Heat Equation Solver 1.0 +
+
Computational Methods Assignment 2025
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
io.hpp File Reference
+
+
+ +

CSV utilities. +More...

+
#include <string>
+#include <vector>
+
+

Go to the source code of this file.

+ + + + +

+Functions

void save_profile_csv (const std::string &path, const std::vector< double > &x, const std::vector< double > &T)
 Save a temperature profile (x, T) to a CSV file.
+

Detailed Description

+

CSV utilities.

+ +

Definition in file io.hpp.

+

Function Documentation

+ +

◆ save_profile_csv()

+ +
+
+ + + + + + + + + + + + + + + + +
void save_profile_csv (const std::string & path,
const std::vector< double > & x,
const std::vector< double > & T )
+
+ +

Save a temperature profile (x, T) to a CSV file.

+

This function automatically creates the directory structure if missing. Example output path: "result/dufort_frankel/t_0.10.csv"

+
Parameters
+ + + + +
pathRelative or absolute path to the file.
xSpatial coordinates [cm].
TTemperature values [°C].
+
+
+ +

Definition at line 20 of file io.cpp.

+ +
+
+
+
+ +
+ + + + diff --git a/docs/html/io_8hpp 2.js b/docs/html/io_8hpp 2.js new file mode 100644 index 0000000..72a94a0 --- /dev/null +++ b/docs/html/io_8hpp 2.js @@ -0,0 +1,4 @@ +var io_8hpp = +[ + [ "save_profile_csv", "io_8hpp.html#aba1e91f1cd31028bb3b005204d491670", null ] +]; \ No newline at end of file diff --git a/docs/html/io_8hpp_source 2.html b/docs/html/io_8hpp_source 2.html new file mode 100644 index 0000000..ea3e29f --- /dev/null +++ b/docs/html/io_8hpp_source 2.html @@ -0,0 +1,118 @@ + + + + + + + +1D Heat Equation Solver: include/io.hpp Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
1D Heat Equation Solver 1.0 +
+
Computational Methods Assignment 2025
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
io.hpp
+
+
+Go to the documentation of this file.
1#pragma once
+
2/**
+
3 * @file io.hpp
+
4 * @brief CSV utilities.
+
5 */
+
6#include <string>
+
7#include <vector>
+
8
+
9void save_profile_csv(const std::string& path,
+
10 const std::vector<double>& x,
+
11 const std::vector<double>& T);
+
void save_profile_csv(const std::string &path, const std::vector< double > &x, const std::vector< double > &T)
Save a temperature profile (x, T) to a CSV file.
Definition io.cpp:20
+
+
+
+ + + + diff --git a/docs/html/jquery 2.js b/docs/html/jquery 2.js new file mode 100644 index 0000000..875ada7 --- /dev/null +++ b/docs/html/jquery 2.js @@ -0,0 +1,204 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e} +var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp( +"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType +}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c +)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){ +return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll( +":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id") +)&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push( +"\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test( +a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null, +null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne +).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for( +var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n; +return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0, +r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r] +,C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each( +function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r, +"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})} +),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each( +"blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t +){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t +]=y.widget.extend({},this.options[t]),n=0;n
"),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i}, +getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within, +s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})), +this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t +).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split( +","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add( +this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{ +width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(), +!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){ +this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height +,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e, +i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left +)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e +){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0), +i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth( +)-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e, +function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0 +]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){ +targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se", +"n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if( +session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)} +closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if( +session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE, +function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset); +tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList, +finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight())); +return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")} +function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(), +elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight, +viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b, +"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery); +/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)), +mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend( +$.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy( +this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData( +"smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id" +).indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?( +this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for( +var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){ +return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if(( +!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&( +this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0 +]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass( +"highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){ +t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]" +)||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){ +t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"), +a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i, +downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2) +)&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t +)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0), +canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}}, +rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})} +return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1, +bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); diff --git a/docs/html/laasonen_8hpp 2.js b/docs/html/laasonen_8hpp 2.js new file mode 100644 index 0000000..3b7612d --- /dev/null +++ b/docs/html/laasonen_8hpp 2.js @@ -0,0 +1,4 @@ +var laasonen_8hpp = +[ + [ "Laasonen", "classLaasonen.html", "classLaasonen" ] +]; \ No newline at end of file diff --git a/docs/html/laasonen_8hpp_source 2.html b/docs/html/laasonen_8hpp_source 2.html new file mode 100644 index 0000000..507f38c --- /dev/null +++ b/docs/html/laasonen_8hpp_source 2.html @@ -0,0 +1,149 @@ + + + + + + + +1D Heat Equation Solver: include/methods/laasonen.hpp Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
1D Heat Equation Solver 1.0 +
+
Computational Methods Assignment 2025
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
laasonen.hpp
+
+
+Go to the documentation of this file.
1#pragma once
+
2
+
3#include "method.hpp"
+
4#include <string>
+
5#include <vector>
+
6
+
7/**
+
8 * @brief Laasonen implicit method (Backward Euler in time + Central in space).
+
9 * Unconditionally stable for the 1D heat equation.
+
10 */
+
+
11class Laasonen : public Method
+
12{
+
13 public:
+
+
14 std::string name() const override
+
15 {
+
16 return "Laasonen";
+
17 }
+
+
18
+
19 void step(const Grid& g,
+
20 double D,
+
21 double dt,
+
22 const std::vector<double>& Tprev,
+
23 const std::vector<double>& Tcurr,
+
24 std::vector<double>& Tnext) const override;
+
25
+
+
26 bool uses_previous_step() const noexcept override
+
27 {
+
28 return false;
+
29 }
+
+
30};
+
+
Laasonen implicit method (Backward Euler in time + Central in space). Unconditionally stable for the ...
Definition laasonen.hpp:12
+
bool uses_previous_step() const noexcept override
Indicates if the scheme requires data from time step n-1.
Definition laasonen.hpp:26
+
void step(const Grid &g, double D, double dt, const std::vector< double > &Tprev, const std::vector< double > &Tcurr, std::vector< double > &Tnext) const override
Computes the temperature field at the next time step (T^{n+1}).
Definition laasonen.cpp:6
+
std::string name() const override
Get human-readable name of the scheme.
Definition laasonen.hpp:14
+
Abstract interface for time-integration schemes solving the 1D heat equation.
Definition method.hpp:28
+ +
Uniform 1D grid on x ∈ [0, L], including both boundary nodes.
Definition grid.hpp:15
+
+
+
+ + + + diff --git a/docs/html/main_8cpp 2.js b/docs/html/main_8cpp 2.js new file mode 100644 index 0000000..70ea0b5 --- /dev/null +++ b/docs/html/main_8cpp 2.js @@ -0,0 +1,5 @@ +var main_8cpp = +[ + [ "main", "main_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4", null ], + [ "run_simulation", "main_8cpp.html#a5bef1d9f0998f469177ae64680139ae5", null ] +]; \ No newline at end of file diff --git a/docs/html/menudata 2.js b/docs/html/menudata 2.js new file mode 100644 index 0000000..ea531c0 --- /dev/null +++ b/docs/html/menudata 2.js @@ -0,0 +1,57 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Classes",url:"annotated.html",children:[ +{text:"Class List",url:"annotated.html"}, +{text:"Class Index",url:"classes.html"}, +{text:"Class Hierarchy",url:"hierarchy.html"}, +{text:"Class Members",url:"functions.html",children:[ +{text:"All",url:"functions.html",children:[ +{text:"a",url:"functions.html#index_a"}, +{text:"b",url:"functions.html#index_b"}, +{text:"d",url:"functions.html#index_d"}, +{text:"g",url:"functions.html#index_g"}, +{text:"h",url:"functions.html#index_h"}, +{text:"i",url:"functions.html#index_i"}, +{text:"l",url:"functions.html#index_l"}, +{text:"m",url:"functions.html#index_m"}, +{text:"n",url:"functions.html#index_n"}, +{text:"o",url:"functions.html#index_o"}, +{text:"p",url:"functions.html#index_p"}, +{text:"r",url:"functions.html#index_r"}, +{text:"s",url:"functions.html#index_s"}, +{text:"t",url:"functions.html#index_t"}, +{text:"u",url:"functions.html#index_u"}, +{text:"x",url:"functions.html#index_x"}, +{text:"~",url:"functions.html#index__7E"}]}, +{text:"Functions",url:"functions_func.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"File Members",url:"globals.html",children:[ +{text:"All",url:"globals.html"}, +{text:"Functions",url:"globals_func.html"}, +{text:"Enumerations",url:"globals_enum.html"}]}]}]} diff --git a/docs/html/method_8cpp 2.js b/docs/html/method_8cpp 2.js new file mode 100644 index 0000000..bc446de --- /dev/null +++ b/docs/html/method_8cpp 2.js @@ -0,0 +1,4 @@ +var method_8cpp = +[ + [ "make_method", "method_8cpp.html#aec1848a9c35d391e1547a7509dfa9cce", null ] +]; \ No newline at end of file diff --git a/docs/html/method_8cpp_source 2.html b/docs/html/method_8cpp_source 2.html new file mode 100644 index 0000000..8f9d60d --- /dev/null +++ b/docs/html/method_8cpp_source 2.html @@ -0,0 +1,165 @@ + + + + + + + +1D Heat Equation Solver: src/method.cpp Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
1D Heat Equation Solver 1.0 +
+
Computational Methods Assignment 2025
+
+
+ + + + + + + + +
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
method.cpp
+
+
+Go to the documentation of this file.
1/**
+
2 * @file method.cpp
+
3 * @brief Factory implementation for numerical schemes.
+
4 */
+
5
+
6#include "method.hpp"
+
7
+
8// Include headers for ALL specific schemes
+ + +
11#include "methods/laasonen.hpp"
+ +
13#include <memory>
+
14#include <stdexcept>
+
15
+
16// =============================================================================
+
17// FACTORY FUNCTION
+
18// =============================================================================
+
19
+
20/**
+
21 * @brief Build a concrete numerical method from the requested scheme kind.
+
22 *
+
23 * @param scheme Identifier of the requested scheme.
+
24 * @return std::unique_ptr<Method> Owning pointer to the created scheme.
+
25 * @throws std::invalid_argument if the scheme is not supported.
+
26 */
+
+
27std::unique_ptr<Method> make_method(SchemeKind scheme)
+
28{
+
29 switch (scheme)
+
30 {
+ +
32 return std::make_unique<Laasonen>();
+
33
+ +
35 return std::make_unique<DuFortFrankel>();
+
36
+ +
38 return std::make_unique<Richardson>();
+
39
+ +
41 return std::make_unique<CrankNicolson>();
+
42
+
43 default:
+
44 throw std::invalid_argument("make_method: unsupported or unknown scheme");
+
45 }
+
46}
+
+ +
DuFort–Frankel explicit method (3-level scheme).
+ +
std::unique_ptr< Method > make_method(SchemeKind scheme)
Build a concrete numerical method from the requested scheme kind.
Definition method.cpp:27
+ +
SchemeKind
Enumeration of the numerical schemes available in the solver.
Definition method.hpp:13
+
@ Laasonen
Simple Implicit (forward time, central space).
Definition method.hpp:16
+
@ DuFortFrankel
Modified Richardson (explicit, stable).
Definition method.hpp:15
+
@ CrankNicolson
Trapezoidal Implicit (second order accuracy).
Definition method.hpp:17
+
@ Richardson
Central time, central space (explicit, unstable).
Definition method.hpp:14
+
Richardson explicit (central time - central space) scheme for the 1D heat equation.
+
+
+
+ + + + diff --git a/docs/html/method_8hpp 2.js b/docs/html/method_8hpp 2.js new file mode 100644 index 0000000..d775aec --- /dev/null +++ b/docs/html/method_8hpp 2.js @@ -0,0 +1,11 @@ +var method_8hpp = +[ + [ "Method", "classMethod.html", "classMethod" ], + [ "SchemeKind", "method_8hpp.html#adc91163cc15ec14de034420346381e82", [ + [ "Richardson", "method_8hpp.html#adc91163cc15ec14de034420346381e82affc2986ffaf10d2bac103156a2a06989", null ], + [ "DuFortFrankel", "method_8hpp.html#adc91163cc15ec14de034420346381e82a4ae92f603580a5a68efe90636f0ce52a", null ], + [ "Laasonen", "method_8hpp.html#adc91163cc15ec14de034420346381e82a34d55c9f911b1a796590f717ad7357c0", null ], + [ "CrankNicolson", "method_8hpp.html#adc91163cc15ec14de034420346381e82a8c12763e7ca8639982cbb121e19a52a1", null ] + ] ], + [ "make_method", "method_8hpp.html#aec1848a9c35d391e1547a7509dfa9cce", null ] +]; \ No newline at end of file diff --git a/docs/html/navtree 2.css b/docs/html/navtree 2.css new file mode 100644 index 0000000..0ea3a07 --- /dev/null +++ b/docs/html/navtree 2.css @@ -0,0 +1,327 @@ +#nav-tree .children_ul { + margin:0; + padding:4px; +} + +#nav-tree ul { + list-style:none outside none; + margin:0px; + padding:0px; +} + +#nav-tree li { + white-space:nowrap; + margin:0; + padding:0; +} + +#nav-tree .plus { + margin:0px; +} + +#nav-tree .selected { + position: relative; + background-color: var(--nav-menu-active-bg); + border-radius: 0 6px 6px 0; + /*margin-right: 5px;*/ +} + +#nav-tree img { + margin:0px; + padding:0px; + border:0px; + vertical-align: middle; +} + +#nav-tree a { + text-decoration:none; + padding:0px; + margin:0px; +} + +#nav-tree .label { + margin:0px; + padding:0px; + font: 12px var(--font-family-nav); + line-height: 22px; +} + +#nav-tree .label a { + padding:2px; +} + +#nav-tree .selected a { + text-decoration:none; + color:var(--page-link-color); +} + +#nav-tree .children_ul { + margin:0px; + padding:0px; +} + +#nav-tree .item { + margin: 0 6px 0 -5px; + padding: 0 0 0 5px; + height: 22px; +} + +#nav-tree { + padding: 0px 0px; + font-size:14px; + overflow:auto; +} + +#doc-content { + overflow:auto; + display:block; + padding:0px; + margin:0px; + -webkit-overflow-scrolling : touch; /* iOS 5+ */ +} + +#side-nav { + padding:0 6px 0 0; + margin: 0px; + display:block; + position: absolute; + left: 0px; + overflow : hidden; +} + +.ui-resizable .ui-resizable-handle { + display:block; +} + +.ui-resizable-e { + transition: opacity 0.5s ease; + background-color: var(--nav-splitbar-bg-color); + opacity:0; + cursor:col-resize; + height:100%; + right:0; + top:0; + width:6px; + position: relative; +} + +.ui-resizable-e:after { + content: ''; + display: block; + top: 50%; + left: 1px; + width: 2px; + height: 15px; + border-left: 1px solid var(--nav-splitbar-handle-color); + border-right: 1px solid var(--nav-splitbar-handle-color); + position: absolute; +} + +.ui-resizable-e:hover { + opacity: 1; +} + +.ui-resizable-handle { + display:none; + font-size:0.1px; + position:absolute; + z-index:1; +} + +#nav-tree-contents { + margin: 6px 0px 0px 0px; +} + +#nav-tree { + background-color: var(--nav-background-color); + -webkit-overflow-scrolling : touch; /* iOS 5+ */ + scrollbar-width: thin; + border-right: 1px solid var(--nav-border-color); + padding-left: 5px; +} + +#nav-sync { + position:absolute; + top:0px; + right:0px; + z-index:1; +} + +#nav-sync img { + opacity:0.3; +} + +div.nav-sync-icon { + position: relative; + width: 24px; + height: 17px; + left: -6px; + top: -1px; + opacity: 0.7; + display: inline-block; + background-color: var(--sync-icon-background-color); + border: 1px solid var(--sync-icon-border-color); + box-sizing: content-box; +} + +div.nav-sync-icon:hover { + background-color: var(--sync-icon-selected-background-color); + opacity: 1.0; +} + +div.nav-sync-icon.active:after { + content: ''; + background-color: var(--sync-icon-background-color); + border-top: 2px solid var(--sync-icon-color); + position: absolute; + width: 16px; + height: 0px; + top: 7px; + left: 4px; +} + +div.nav-sync-icon.active:hover:after { + border-top: 2px solid var(--sync-icon-selected-color); +} + +span.sync-icon-left { + position: absolute; + padding: 0; + margin: 0; + top: 3px; + left: 4px; + display: inline-block; + width: 8px; + height: 8px; + border-left: 2px solid var(--sync-icon-color); + border-top: 2px solid var(--sync-icon-color); + transform: rotate(-45deg); +} + +span.sync-icon-right { + position: absolute; + padding: 0; + margin: 0; + top: 3px; + left: 10px; + display: inline-block; + width: 8px; + height: 8px; + border-right: 2px solid var(--sync-icon-color); + border-bottom: 2px solid var(--sync-icon-color); + transform: rotate(-45deg); +} + +div.nav-sync-icon:hover span.sync-icon-left { + border-left: 2px solid var(--sync-icon-selected-color); + border-top: 2px solid var(--sync-icon-selected-color); +} + +div.nav-sync-icon:hover span.sync-icon-right { + border-right: 2px solid var(--sync-icon-selected-color); + border-bottom: 2px solid var(--sync-icon-selected-color); +} + +#nav-path ul { + border-top: 1px solid var(--nav-breadcrumb-separator-color); +} + +@media print +{ + #nav-tree { display: none; } + div.ui-resizable-handle { display: none; position: relative; } +} + +/*---------------------------*/ +#container { + display: grid; + grid-template-columns: auto auto; + overflow: hidden; +} + +#page-nav { + background: var(--nav-background-color); + display: block; + width: 250px; + box-sizing: content-box; + position: relative; + border-left: 1px solid var(--nav-border-color); +} + +#page-nav-tree { + display: inline-block; +} + +#page-nav-resize-handle { + transition: opacity 0.5s ease; + background-color: var(--nav-splitbar-bg-color); + opacity:0; + cursor:col-resize; + height:100%; + right:0; + top:0; + width:6px; + position: relative; + z-index: 1; + user-select: none; +} + +#page-nav-resize-handle:after { + content: ''; + display: block; + top: 50%; + left: 1px; + width: 2px; + height: 15px; + border-left: 1px solid var(--nav-splitbar-handle-color); + border-right: 1px solid var(--nav-splitbar-handle-color); + position: absolute; +} + +#page-nav-resize-handle.dragging, +#page-nav-resize-handle:hover { + opacity: 1; +} + +#page-nav-contents { + padding: 0; + margin: 0; + display: block; + top: 0; + left: 0; + height: 100%; + width: 100%; + position: absolute; + overflow: auto; + scrollbar-width: thin; + -webkit-overflow-scrolling : touch; /* iOS 5+ */ +} + +ul.page-outline, +ul.page-outline ul { + text-indent: 0; + list-style: none outside none; + padding: 0 0 0 4px; +} + +ul.page-outline { + margin: 0 4px 4px 6px; +} + +ul.page-outline div.item { + font: 12px var(--font-family-nav); + line-height: 22px; +} + +ul.page-outline li { + white-space: nowrap; +} + +ul.page-outline li.vis { + background-color: var(--nav-breadcrumb-active-bg); +} + +#container.resizing { + cursor: col-resize; + user-select: none; +} diff --git a/docs/html/navtree 2.js b/docs/html/navtree 2.js new file mode 100644 index 0000000..fac8d01 --- /dev/null +++ b/docs/html/navtree 2.js @@ -0,0 +1,901 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ + +function initNavTree(toroot,relpath,allMembersFile) { + let navTreeSubIndices = []; + const ARROW_DOWN = ''; + const ARROW_RIGHT = ''; + const NAVPATH_COOKIE_NAME = ''+'navpath'; + const fullSidebar = typeof page_layout!=='undefined' && page_layout==1; + + function getScrollBarWidth () { + let outer = $('
').css({visibility: 'hidden', width: 100, overflow: 'scroll', scrollbarWidth: 'thin'}).appendTo('body'); + let widthWithScroll = $('
').css({width: '100%'}).appendTo(outer).outerWidth(); + outer.remove(); + return 100 - widthWithScroll; + } + const scrollbarWidth = getScrollBarWidth(); + + function adjustSyncIconPosition() { + if (!fullSidebar) { + const nt = document.getElementById("nav-tree"); + const hasVerticalScrollbar = nt.scrollHeight > nt.clientHeight; + $("#nav-sync").css({right:parseInt(hasVerticalScrollbar?scrollbarWidth:0)}); + } + } + + const getData = function(varName) { + const i = varName.lastIndexOf('/'); + const n = i>=0 ? varName.substring(i+1) : varName; + const e = n.replace(/-/g,'_'); + return window[e]; + } + + const stripPath = function(uri) { + return uri.substring(uri.lastIndexOf('/')+1); + } + + const stripPath2 = function(uri) { + const i = uri.lastIndexOf('/'); + const s = uri.substring(i+1); + const m = uri.substring(0,i+1).match(/\/d\w\/d\w\w\/$/); + return m ? uri.substring(i-6) : s; + } + + const hashValue = function() { + return $(location).attr('hash').substring(1).replace(/[^\w-]/g,''); + } + + const hashUrl = function() { + return '#'+hashValue(); + } + + const pathName = function() { + return $(location).attr('pathname').replace(/[^-A-Za-z0-9+&@#/%?=~_|!:,.;()]/g, ''); + } + + const storeLink = function(link) { + if (!$("#nav-sync").hasClass('sync')) { + Cookie.writeSetting(NAVPATH_COOKIE_NAME,link,0); + } + } + + const deleteLink = function() { + Cookie.eraseSetting(NAVPATH_COOKIE_NAME); + } + + const cachedLink = function() { + return Cookie.readSetting(NAVPATH_COOKIE_NAME,''); + } + + const getScript = function(scriptName,func) { + const head = document.getElementsByTagName("head")[0]; + const script = document.createElement('script'); + script.id = scriptName; + script.type = 'text/javascript'; + script.onload = function() { func(); adjustSyncIconPosition(); } + script.src = scriptName+'.js'; + head.appendChild(script); + } + + const createIndent = function(o,domNode,node) { + let level=-1; + let n = node; + while (n.parentNode) { level++; n=n.parentNode; } + if (node.childrenData) { + const imgNode = document.createElement("span"); + imgNode.className = 'arrow'; + imgNode.style.paddingLeft=(16*level).toString()+'px'; + imgNode.innerHTML=ARROW_RIGHT; + node.plus_img = imgNode; + node.expandToggle = document.createElement("a"); + node.expandToggle.href = "javascript:void(0)"; + node.expandToggle.onclick = function() { + if (node.expanded) { + $(node.getChildrenUL()).slideUp("fast",adjustSyncIconPosition); + $(node.plus_img.childNodes[0]).removeClass('opened').addClass('closed'); + node.expanded = false; + } else { + expandNode(o, node, false, true); + } + } + node.expandToggle.appendChild(imgNode); + domNode.appendChild(node.expandToggle); + } else { + let span = document.createElement("span"); + span.className = 'arrow'; + span.style.width = 16*(level+1)+'px'; + span.innerHTML = ' '; + domNode.appendChild(span); + } + } + + let animationInProgress = false; + + const gotoAnchor = function(anchor,aname) { + let pos, docContent = $('#doc-content'); + let ancParent = $(anchor.parent()); + if (ancParent.hasClass('memItemLeft') || ancParent.hasClass('memtitle') || + ancParent.hasClass('fieldname') || ancParent.hasClass('fieldtype') || + ancParent.is(':header')) { + pos = ancParent.offset().top; + } else if (anchor.position()) { + pos = anchor.offset().top; + } + if (pos) { + const dcOffset = docContent.offset().top; + const dcHeight = docContent.height(); + const dcScrHeight = docContent[0].scrollHeight + const dcScrTop = docContent.scrollTop(); + let dist = Math.abs(Math.min(pos-dcOffset,dcScrHeight-dcHeight-dcScrTop)); + animationInProgress = true; + docContent.animate({ + scrollTop: pos + dcScrTop - dcOffset + },Math.max(50,Math.min(500,dist)),function() { + animationInProgress=false; + if (anchor.parent().attr('class')=='memItemLeft') { + let rows = $('.memberdecls tr[class$="'+hashValue()+'"]'); + glowEffect(rows.children(),300); // member without details + } else if (anchor.parent().attr('class')=='fieldname') { + glowEffect(anchor.parent().parent(),1000); // enum value + } else if (anchor.parent().attr('class')=='fieldtype') { + glowEffect(anchor.parent().parent(),1000); // struct field + } else if (anchor.parent().is(":header")) { + glowEffect(anchor.parent(),1000); // section header + } else { + glowEffect(anchor.next(),1000); // normal member + } + }); + } + } + + function htmlToNode(html) { + const template = document.createElement('template'); + template.innerHTML = html; + const nNodes = template.content.childNodes.length; + if (nNodes !== 1) { + throw new Error(`html parameter must represent a single node; got ${nNodes}. `); + } + return template.content.firstChild; + } + + const newNode = function(o, po, text, link, childrenData, lastNode) { + const node = { + children : [], + childrenData : childrenData, + depth : po.depth + 1, + relpath : po.relpath, + isLast : lastNode, + li : document.createElement("li"), + parentNode : po, + itemDiv : document.createElement("div"), + labelSpan : document.createElement("span"), + expanded : false, + childrenUL : null, + getChildrenUL : function() { + if (!this.childrenUL) { + this.childrenUL = document.createElement("ul"); + this.childrenUL.className = "children_ul"; + this.childrenUL.style.display = "none"; + this.li.appendChild(node.childrenUL); + } + return node.childrenUL; + }, + }; + + node.itemDiv.className = "item"; + node.labelSpan.className = "label"; + createIndent(o,node.itemDiv,node); + node.itemDiv.appendChild(node.labelSpan); + node.li.appendChild(node.itemDiv); + + const a = document.createElement("a"); + node.labelSpan.appendChild(a); + po.getChildrenUL().appendChild(node.li); + a.appendChild(htmlToNode(''+text+'')); + if (link) { + let url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + link = url; + } else { + url = node.relpath+link; + } + a.className = stripPath(link.replace('#',':')); + if (link.indexOf('#')!=-1) { + const aname = '#'+link.split('#')[1]; + const srcPage = stripPath(pathName()); + const targetPage = stripPath(link.split('#')[0]); + a.href = srcPage!=targetPage ? url : aname; + a.onclick = function() { + storeLink(link); + aPPar = $(a).parent().parent(); + if (!aPPar.hasClass('selected')) { + $('.item').removeClass('selected'); + $('.item').removeAttr('id'); + aPPar.addClass('selected'); + aPPar.attr('id','selected'); + } + const anchor = $(aname); + gotoAnchor(anchor,aname); + }; + } else { + a.href = url; + a.onclick = () => storeLink(link); + } + } else if (childrenData != null) { + a.className = "nolink"; + a.href = "javascript:void(0)"; + a.onclick = node.expandToggle.onclick; + } + return node; + } + + const showRoot = function() { + const headerHeight = $("#top").height(); + const footerHeight = $("#nav-path").height(); + const windowHeight = $(window).height() - headerHeight - footerHeight; + (function() { // retry until we can scroll to the selected item + try { + const navtree=$('#nav-tree'); + navtree.scrollTo('#selected',100,{offset:-windowHeight/2}); + } catch (err) { + setTimeout(arguments.callee, 0); + } + })(); + } + + const expandNode = function(o, node, imm, setFocus) { + if (node.childrenData && !node.expanded) { + if (typeof(node.childrenData)==='string') { + const varName = node.childrenData; + getScript(node.relpath+varName,function() { + node.childrenData = getData(varName); + expandNode(o, node, imm, setFocus); + }); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).slideDown("fast",adjustSyncIconPosition); + $(node.plus_img.childNodes[0]).addClass('opened').removeClass('closed'); + node.expanded = true; + if (setFocus) { + $(node.expandToggle).focus(); + } + } + } + } + + const glowEffect = function(n,duration) { + n.addClass('glow').delay(duration).queue(function(next) { + $(this).removeClass('glow');next(); + }); + } + + const highlightAnchor = function() { + const aname = hashUrl(); + const anchor = $(aname); + gotoAnchor(anchor,aname); + } + + const selectAndHighlight = function(hash,n) { + let a; + if (hash) { + const link=stripPath(pathName())+':'+hash.substring(1); + a=$('.item a[class$="'+link+'"]'); + } + if (a && a.length) { + a.parent().parent().addClass('selected'); + a.parent().parent().attr('id','selected'); + highlightAnchor(); + } else if (n) { + $(n.itemDiv).addClass('selected'); + $(n.itemDiv).attr('id','selected'); + } + let topOffset=5; + if ($('#nav-tree-contents .item:first').hasClass('selected')) { + topOffset+=25; + } + showRoot(); + } + + const showNode = function(o, node, index, hash) { + if (node && node.childrenData) { + if (typeof(node.childrenData)==='string') { + const varName = node.childrenData; + getScript(node.relpath+varName,function() { + node.childrenData = getData(varName); + showNode(o,node,index,hash); + }); + } else { + if (!node.childrenVisited) { + getNode(o, node); + } + $(node.getChildrenUL()).css({'display':'block'}); + $(node.plus_img.childNodes[0]).removeClass('closed').addClass('opened'); + node.expanded = true; + const n = node.children[o.breadcrumbs[index]]; + if (index+10) { // try root page without hash as fallback + gotoUrl(o,root,'',relpath); + } else { + o.breadcrumbs = $.extend(true, [], nti); + if (!o.breadcrumbs && root!=NAVTREE[0][1]) { // fallback: show index + navTo(o,NAVTREE[0][1],"",relpath); + $('.item').removeClass('selected'); + $('.item').removeAttr('id'); + } + if (o.breadcrumbs) { + o.breadcrumbs.unshift(0); // add 0 for root node + showNode(o, o.node, 0, hash); + } + } + } + + const gotoUrl = function(o,root,hash,relpath) { + const url=root+hash; + let i=-1; + while (NAVTREEINDEX[i+1]<=url) i++; + if (i==-1) { i=0; root=NAVTREE[0][1]; } // fallback: show index + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath) + } else { + getScript(relpath+'navtreeindex'+i,function() { + navTreeSubIndices[i] = window['NAVTREEINDEX'+i]; + if (navTreeSubIndices[i]) { + gotoNode(o,i,root,hash,relpath); + } + }); + } + } + + const navTo = function(o,root,hash,relpath) { + const link = cachedLink(); + if (link) { + const parts = link.split('#'); + root = parts[0]; + hash = parts.length>1 ? '#'+parts[1].replace(/[^\w-]/g,'') : ''; + } + if (hash.match(/^#l\d+$/)) { + const anchor=$('a[name='+hash.substring(1)+']'); + glowEffect(anchor.parent(),1000); // line number + hash=''; // strip line number anchors + } + gotoUrl(o,root,hash,relpath); + } + + const showSyncOff = function(n,relpath) { + n.html(''); + } + + const showSyncOn = function(n,relpath) { + n.html(''); + } + + const o = { + toroot : toroot, + node : { + childrenData : NAVTREE, + children : [], + childrenUL : document.createElement("ul"), + getChildrenUL : function() { return this.childrenUL }, + li : document.getElementById("nav-tree-contents"), + depth : 0, + relpath : relpath, + expanded : false, + isLast : true, + plus_img : document.createElement("span"), + }, + }; + o.node.li.appendChild(o.node.childrenUL); + o.node.plus_img.className = 'arrow'; + o.node.plus_img.innerHTML = ARROW_RIGHT; + + const navSync = $('#nav-sync'); + if (cachedLink()) { + showSyncOff(navSync,relpath); + navSync.removeClass('sync'); + } else { + showSyncOn(navSync,relpath); + } + + navSync.click(() => { + const navSync = $('#nav-sync'); + if (navSync.hasClass('sync')) { + navSync.removeClass('sync'); + showSyncOff(navSync,relpath); + storeLink(stripPath2(pathName())+hashUrl()); + } else { + navSync.addClass('sync'); + showSyncOn(navSync,relpath); + deleteLink(); + } + }); + + navTo(o,toroot,hashUrl(),relpath); + showRoot(); + + $(window).bind('hashchange', () => { + if (!animationInProgress) { + if (window.location.hash && window.location.hash.length>1) { + let a; + if ($(location).attr('hash')) { + const clslink=stripPath(pathName())+':'+hashValue(); + a=$('.item a[class$="'+clslink.replace(/ try to keep right panel width + const shrinkLeft = Math.min(deficit, leftPanelWidth-minPanelWidth); + leftPanelWidth -= shrinkLeft; + const remainingDeficit = deficit - shrinkLeft; + const shrinkRight = Math.min(remainingDeficit, rightPanelWidth-minPanelWidth); + rightPanelWidth -= shrinkRight; + } else { // dragging right handle -> try to keep left panel width + const shrinkRight = Math.min(deficit, rightPanelWidth-minPanelWidth); + rightPanelWidth -= shrinkRight; + const remainingDeficit = deficit - shrinkRight; + const shrinkLeft = Math.min(remainingDeficit, leftPanelWidth-minPanelWidth); + leftPanelWidth -= shrinkLeft; + } + } else { + rightPanelWidth = pagenav.length ? Math.max(minPanelWidth,rightPanelWidth) : 0; + leftPanelWidth = Math.max(minPanelWidth,leftPanelWidth); + } + return { leftPanelWidth, rightPanelWidth } + } + + function updateWidths(sidenavWidth,pagenavWidth,dragLeft) + { + const widths = constrainPanelWidths(sidenavWidth,pagenavWidth,dragLeft); + const widthStr = parseFloat(widths.leftPanelWidth)+"px"; + content.css({marginLeft:widthStr}); + if (fullSidebar) { + footer.css({marginLeft:widthStr}); + if (mainnav) { + mainnav.css({marginLeft:widthStr}); + } + } + sidenav.css({width:widthStr}); + if (pagenav.length) { + container.css({gridTemplateColumns:'auto '+parseFloat(widths.rightPanelWidth)+'px'}); + if (!dragLeft) { + pagenav.css({width:parseFloat(widths.rightPanelWidth-1)+'px'}); + } + } + return widths; + } + + function resizeWidth(dragLeft) { + const sidenavWidth = $(sidenav).outerWidth()-barWidth; + let pagenavWidth = pagenav.length ? $(pagenav).outerWidth() : 0; + const widths = updateWidths(sidenavWidth,pagenavWidth,dragLeft); + Cookie.writeSetting(RESIZE_COOKIE_NAME,widths.leftPanelWidth-barWidth); + if (pagenav.length) { + Cookie.writeSetting(PAGENAV_COOKIE_NAME,widths.rightPanelWidth); + } + } + + function restoreWidth(sidenavWidth,pagenavWidth) { + updateWidths(sidenavWidth,pagenavWidth,false); + showHideNavBar(); + } + + function resizeHeight() { + const headerHeight = header.outerHeight(); + const windowHeight = $(window).height(); + let contentHeight; + const footerHeight = footer.outerHeight(); + let navtreeHeight,sideNavHeight; + if (!fullSidebar) { + contentHeight = windowHeight - headerHeight - footerHeight - 1; + navtreeHeight = contentHeight; + sideNavHeight = contentHeight; + } else if (fullSidebar) { + contentHeight = windowHeight - footerHeight - 1; + navtreeHeight = windowHeight - headerHeight - 1; + sideNavHeight = windowHeight - 1; + if (mainnav) { + contentHeight -= mainnav.outerHeight(); + } + } + navtree.css({height:navtreeHeight + "px"}); + sidenav.css({height:sideNavHeight + "px"}); + content.css({height:contentHeight + "px"}); + resizeWidth(false); + showHideNavBar(); + if (location.hash.slice(1)) { + (document.getElementById(location.hash.slice(1))||document.body).scrollIntoView(); + } + } + + header = $("#top"); + content = $("#doc-content"); + footer = $("#nav-path"); + sidenav = $("#side-nav"); + if (document.getElementById('main-nav')) { + mainnav = $("#main-nav"); + } + navtree = $("#nav-tree"); + pagenav = $("#page-nav"); + container = $("#container"); + $(".side-nav-resizable").resizable({resize: function(e, ui) { resizeWidth(true); } }); + $(sidenav).resizable({ minWidth: 0 }); + if (pagenav.length) { + pagehandle = $("#page-nav-resize-handle"); + pagehandle.on('mousedown touchstart',function(e) { + $('body').addClass('resizing'); + pagehandle.addClass('dragging'); + $(document).on('mousemove touchmove',function(e) { + const clientX = e.clientX || e.originalEvent.touches[0].clientX; + let pagenavWidth = container[0].offsetWidth-clientX+barWidth/2; + const sidenavWidth = sidenav.width(); + const widths = constrainPanelWidths(sidenavWidth,pagenavWidth,false); + container.css({gridTemplateColumns:'auto '+parseFloat(widths.rightPanelWidth)+'px'}); + pagenav.css({width:parseFloat(widths.rightPanelWidth-1)+'px'}); + content.css({marginLeft:parseFloat(widths.leftPanelWidth)+'px'}); + Cookie.writeSetting(PAGENAV_COOKIE_NAME,pagenavWidth); + }); + $(document).on('mouseup touchend', function(e) { + $('body').removeClass('resizing'); + pagehandle.removeClass('dragging'); + $(document).off('mousemove mouseup touchmove touchend'); + }); + }); + } else { + container.css({gridTemplateColumns:'auto'}); + } + const width = parseInt(Cookie.readSetting(RESIZE_COOKIE_NAME,250)); + const pagenavWidth = parseInt(Cookie.readSetting(PAGENAV_COOKIE_NAME,250)); + if (width) { restoreWidth(width+barWidth,pagenavWidth); } else { resizeWidth(); } + const url = location.href; + const i=url.indexOf("#"); + if (i>=0) window.location.hash=url.substr(i); + const _preventDefault = function(evt) { evt.preventDefault(); }; + $("#splitbar").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault); + $(window).ready(function() { + let lastWidth = -1; + let lastHeight = -1; + $(window).resize(function() { + const newWidth = $(this).width(), newHeight = $(this).height(); + if (newWidth!=lastWidth || newHeight!=lastHeight) { + resizeHeight(); + navtree_trampoline.updateContentTop(); + lastWidth = newWidth; + lastHeight = newHeight; + } + }); + resizeHeight(); + lastWidth = $(window).width(); + lastHeight = $(window).height(); + content.scroll(function() { + navtree_trampoline.updateContentTop(); + }); + }); + } + + + function initPageToc() { + const topMapping = []; + const toc_contents = $('#page-nav-contents'); + const content=$('