diff --git a/api/flowunsteady-maneuver/index.html b/api/flowunsteady-maneuver/index.html index 621f8c84..a6795a27 100644 --- a/api/flowunsteady-maneuver/index.html +++ b/api/flowunsteady-maneuver/index.html @@ -3,5 +3,5 @@ function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-B7CBF7WC7L', {'page_path': location.pathname + location.search + location.hash}); -

(2) Maneuver Definition

FLOWUnsteady.KinematicManeuverType
KinematicManeuver{N, M}(angle, RPM, Vvehicle, anglevehicle)

A vehicle maneuver that prescribes the kinematics of the vehicle through the functions Vvehicle and anglevehicle. Control inputs to each tilting and rotor systems are given by the collection of functions angle and RPM, respectively.

ARGUMENTS

  • angle::NTuple{N, Function} where angle[i](t) returns the angles [Ax, Ay, Az] (in degrees) of the i-th tilting system at time t (t is nondimensionalized by the total time of the maneuver, from 0 to 1, beginning to end).
  • RPM::NTuple{M, Function} where RPM[i](t) returns the normalized RPM of the i-th rotor system at time t. These RPM values are normalized by an arbitrary RPM value (usually RPM in hover or cruise).
  • Vvehicle::Function where Vvehicle(t) returns the normalized vehicle velocity [Vx, Vy, Vz] at the normalized time t. The velocity is normalized by a reference velocity (typically, cruise velocity).
  • anglevehicle::Function where anglevehicle(t) returns the angles [Ax, Ay, Az] (in degrees) of the vehicle relative to the global coordinate system at the normalized time t.
source
FLOWUnsteady.DynamicManeuverType
DynamicManeuver{N, M}(angle, RPM)

A vehicle maneuver that automatically couples the kinematics of the vehicle with the forces and moments, resulting in a fully dynamic simulation. Control inputs to each tilting and rotor systems are given by the collection of functions angle and RPM, respectively.

NOTE: This methods has not been implemented yet, but it may be developed in future versions of FLOWunsteady.

source
FLOWUnsteady.plot_maneuverFunction
plot_maneuver(maneuver::KinematicManeuver; ti::Real=0, tf::Real=1,
-                            vis_nsteps=300, figname="maneuver", tstages=[])

Plots the kinematics and controls of a KinematicManeuver.

image image

source
FLOWUnsteady.visualize_kinematicsFunction
visualize_kinematics(sim::Simulation, nsteps::Int, save_path::String)

Steps the vehicle through the prescribed kinematics, outputting VTK files of the vehicle at every time step. Use this to visualize and debug a maneuver.

nsteps is the number of time steps in which to perform the maneuver. save_path is the path where to save the VTK files.

source
+

(2) Maneuver Definition

FLOWUnsteady.KinematicManeuverType
KinematicManeuver{N, M}(angle, RPM, Vvehicle, anglevehicle)

A vehicle maneuver that prescribes the kinematics of the vehicle through the functions Vvehicle and anglevehicle. Control inputs to each tilting and rotor systems are given by the collection of functions angle and RPM, respectively.

ARGUMENTS

  • angle::NTuple{N, Function} where angle[i](t) returns the angles [Ax, Ay, Az] (in degrees) of the i-th tilting system at time t (t is nondimensionalized by the total time of the maneuver, from 0 to 1, beginning to end).
  • RPM::NTuple{M, Function} where RPM[i](t) returns the normalized RPM of the i-th rotor system at time t. These RPM values are normalized by an arbitrary RPM value (usually RPM in hover or cruise).
  • Vvehicle::Function where Vvehicle(t) returns the normalized vehicle velocity [Vx, Vy, Vz] at the normalized time t. The velocity is normalized by a reference velocity (typically, cruise velocity).
  • anglevehicle::Function where anglevehicle(t) returns the angles [Ax, Ay, Az] (in degrees) of the vehicle relative to the global coordinate system at the normalized time t.
source
FLOWUnsteady.DynamicManeuverType
DynamicManeuver{N, M}(angle, RPM)

A vehicle maneuver that automatically couples the kinematics of the vehicle with the forces and moments, resulting in a fully dynamic simulation. Control inputs to each tilting and rotor systems are given by the collection of functions angle and RPM, respectively.

NOTE: This methods has not been implemented yet, but it may be developed in future versions of FLOWunsteady.

source
FLOWUnsteady.plot_maneuverFunction
plot_maneuver(maneuver::KinematicManeuver; ti::Real=0, tf::Real=1,
+                            vis_nsteps=300, figname="maneuver", tstages=[])

Plots the kinematics and controls of a KinematicManeuver.

image image

source
FLOWUnsteady.visualize_kinematicsFunction
visualize_kinematics(sim::Simulation, nsteps::Int, save_path::String)

Steps the vehicle through the prescribed kinematics, outputting VTK files of the vehicle at every time step. Use this to visualize and debug a maneuver.

nsteps is the number of time steps in which to perform the maneuver. save_path is the path where to save the VTK files.

source
diff --git a/api/flowunsteady-monitor/index.html b/api/flowunsteady-monitor/index.html index 8345cdbe..b6c7a7d1 100644 --- a/api/flowunsteady-monitor/index.html +++ b/api/flowunsteady-monitor/index.html @@ -3,7 +3,7 @@ function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-B7CBF7WC7L', {'page_path': location.pathname + location.search + location.hash}); -

(4) Monitors Definitions

A monitor is a function that is passed to FLOWUnsteady.run_simulation as an extra runtime function that is called at every time step. Runtime functions are expected to return a Boolean that indicates the need of stopping the simulation, such that if extra_runtime_function ever returns true, the simulation will immediately be ended.

Multiple monitors can be concatenated with boolean logic as follows

import FLOWUnsteady as uns
+

(4) Monitors Definitions

A monitor is a function that is passed to FLOWUnsteady.run_simulation as an extra runtime function that is called at every time step. Runtime functions are expected to return a Boolean that indicates the need of stopping the simulation, such that if extra_runtime_function ever returns true, the simulation will immediately be ended.

Multiple monitors can be concatenated with boolean logic as follows

import FLOWUnsteady as uns
 
 monitor_states = uns.generate_monitor_statevariables()
 monitor_enstrophy = uns.generate_monitor_enstrophy()
@@ -15,37 +15,37 @@
 
 monitors = uns.concatenate(monitors)
 
-uns.run_simulation(sim, nsteps; extra_runtime_function=monitors, ...)

Monitor Generators

The following are functions for generating the monitors that serve most use cases. See the source code of these monitors to get an idea of how to write your own user-defined monitors.

FLOWUnsteady.generate_monitor_statevariablesFunction
generate_monitor_statevariables(; save_path=nothing)

Generate a monitor plotting the state variables of the vehicle at every time step. The state variables are vehicle velocity, vehicle angular velocity, and vehicle position.

Use save_path to indicate a directory where to save the plots.

Here is an example of this monitor on a vehicle flying a circular path: image

source
FLOWUnsteady.generate_monitor_wingFunction
generate_monitor_wing(wing::Union{vlm.Wing, vlm.WingSystem},
+uns.run_simulation(sim, nsteps; extra_runtime_function=monitors, ...)

Monitor Generators

The following are functions for generating the monitors that serve most use cases. See the source code of these monitors to get an idea of how to write your own user-defined monitors.

FLOWUnsteady.generate_monitor_statevariablesFunction
generate_monitor_statevariables(; save_path=nothing)

Generate a monitor plotting the state variables of the vehicle at every time step. The state variables are vehicle velocity, vehicle angular velocity, and vehicle position.

Use save_path to indicate a directory where to save the plots.

Here is an example of this monitor on a vehicle flying a circular path: image

source
FLOWUnsteady.generate_monitor_wingFunction
generate_monitor_wing(wing::Union{vlm.Wing, vlm.WingSystem},
                         Vinf::Function, b_ref::Real, ar_ref::Real,
                         rho_ref::Real, qinf_ref::Real, nsteps_sim::Int;
                         L_dir=[0,0,1],      # Direction of lift component
                         D_dir=[1,0,0],      # Direction of drag component
-                        calc_aerodynamicforce_fun=FLOWUnsteady.generate_calc_aerodynamicforce())

Generate a wing monitor computing and plotting the aerodynamic force and wing loading at every time step.

The aerodynamic force is integrated, decomposed, and reported as overall lift coefficient $C_L = \frac{L}{\frac{1}{2}\rho u_\infty^2 b c}$ and drag coefficient ${C_D = \frac{D}{\frac{1}{2}\rho u_\infty^2 b c}}$. The wing loading is reported as the sectional lift and drag coefficients defined as $c_\ell = \frac{\ell}{\frac{1}{2}\rho u_\infty^2 c}$ and $c_d = \frac{d}{\frac{1}{2}\rho u_\infty^2 c}$, respectively.

The aerodynamic force is calculated through the function calc_aerodynamicforce_fun, which is a user-defined function. The function can also be automatically generated through, generate_calc_aerodynamicforce which defaults to incluiding the Kutta-Joukowski force, parasitic drag (calculated from a NACA 0012 airfoil polar), and unsteady-circulation force.

  • b_ref : Reference span length.
  • ar_ref : Reference aspect ratio, used to calculate the equivalent chord $c = \frac{b}{\mathrm{ar}}$.
  • rho_ref : Reference density.
  • qinf_ref : Reference dynamic pressure $q_\infty = \frac{1}{2}\rho u_\infty^2$.
  • nsteps_sim : the number of time steps by the end of the simulation (used for generating the color gradient).
  • Use save_path to indicate a directory where to save the plots. If so, it will also generate a CSV file with $C_L$ and $C_D$.

Here is an example of this monitor: image

source
FLOWUnsteady.generate_monitor_rotorsFunction
generate_monitor_rotors(rotors::Array{vlm.Rotor}, J_ref::Real,
+                        calc_aerodynamicforce_fun=FLOWUnsteady.generate_calc_aerodynamicforce())

Generate a wing monitor computing and plotting the aerodynamic force and wing loading at every time step.

The aerodynamic force is integrated, decomposed, and reported as overall lift coefficient $C_L = \frac{L}{\frac{1}{2}\rho u_\infty^2 b c}$ and drag coefficient ${C_D = \frac{D}{\frac{1}{2}\rho u_\infty^2 b c}}$. The wing loading is reported as the sectional lift and drag coefficients defined as $c_\ell = \frac{\ell}{\frac{1}{2}\rho u_\infty^2 c}$ and $c_d = \frac{d}{\frac{1}{2}\rho u_\infty^2 c}$, respectively.

The aerodynamic force is calculated through the function calc_aerodynamicforce_fun, which is a user-defined function. The function can also be automatically generated through, generate_calc_aerodynamicforce which defaults to incluiding the Kutta-Joukowski force, parasitic drag (calculated from a NACA 0012 airfoil polar), and unsteady-circulation force.

  • b_ref : Reference span length.
  • ar_ref : Reference aspect ratio, used to calculate the equivalent chord $c = \frac{b}{\mathrm{ar}}$.
  • rho_ref : Reference density.
  • qinf_ref : Reference dynamic pressure $q_\infty = \frac{1}{2}\rho u_\infty^2$.
  • nsteps_sim : the number of time steps by the end of the simulation (used for generating the color gradient).
  • Use save_path to indicate a directory where to save the plots. If so, it will also generate a CSV file with $C_L$ and $C_D$.

Here is an example of this monitor: image

source
FLOWUnsteady.generate_monitor_rotorsFunction
generate_monitor_rotors(rotors::Array{vlm.Rotor}, J_ref::Real,
                             rho_ref::Real, RPM_ref::Real, nsteps_sim::Int;
-                            save_path=nothing)

Generate a rotor monitor plotting the aerodynamic performance and blade loading at every time step.

The aerodynamic performance consists of thrust coefficient $C_T=\frac{T}{\rho n^2 d^4}$, torque coefficient $C_Q = \frac{Q}{\rho n^2 d^5}$, and propulsive efficiency $\eta = \frac{T u_\infty}{2\pi n Q}$.

  • J_ref and rho_ref are the reference advance ratio and air density used for calculating propulsive efficiency and coefficients. The advance ratio used here is defined as $J=\frac{u_\infty}{n d}$ with $n = \frac{\mathrm{RPM}}{60}$.
  • RPM_ref is the reference RPM used to estimate the age of the wake.
  • nsteps_sim is the number of time steps by the end of the simulation (used for generating the color gradient).
  • Use save_path to indicate a directory where to save the plots. If so, it will also generate a CSV file with $C_T$, $C_Q$, and $\eta$.

image

source
FLOWUnsteady.generate_monitor_enstrophyFunction
generate_monitor_enstrophy(; save_path=nothing)

Generate a monitor plotting the global enstrophy of the flow at every time step (computed through the particle field). This is calculated by integrating the local enstrophy defined as ξ = ω⋅ω / 2.

Enstrophy is approximated as 0.5*Σ( Γ𝑝⋅ω(x𝑝) ). This is consistent with Winckelamns' 1995 CTR report, "Some Progress in LES using the 3-D VPM".

Use save_path to indicate a directory where to save the plots. If so, it will also generate a CSV file with ξ.

Here is an example of this monitor: image

source
FLOWUnsteady.generate_monitor_CdFunction
generate_monitor_Cd(; save_path=nothing)

Generate a monitor plotting the mean value of the SFS model coefficient $C_d$ across the particle field at every time step. It also plots the ratio of $C_d$ values that were clipped to zero (not included in the mean).

Use save_path to indicate a directory where to save the plots. If so, it will also generate a CSV file with the statistics of $C_d$ (particles whose coefficients have been clipped are ignored).

Here is an example of this monitor: image

source
FLOWUnsteady.concatenateFunction
concatenate(monitors::Array{Function})
+                            save_path=nothing)

Generate a rotor monitor plotting the aerodynamic performance and blade loading at every time step.

The aerodynamic performance consists of thrust coefficient $C_T=\frac{T}{\rho n^2 d^4}$, torque coefficient $C_Q = \frac{Q}{\rho n^2 d^5}$, and propulsive efficiency $\eta = \frac{T u_\infty}{2\pi n Q}$.

  • J_ref and rho_ref are the reference advance ratio and air density used for calculating propulsive efficiency and coefficients. The advance ratio used here is defined as $J=\frac{u_\infty}{n d}$ with $n = \frac{\mathrm{RPM}}{60}$.
  • RPM_ref is the reference RPM used to estimate the age of the wake.
  • nsteps_sim is the number of time steps by the end of the simulation (used for generating the color gradient).
  • Use save_path to indicate a directory where to save the plots. If so, it will also generate a CSV file with $C_T$, $C_Q$, and $\eta$.

image

source
FLOWUnsteady.generate_monitor_enstrophyFunction
generate_monitor_enstrophy(; save_path=nothing)

Generate a monitor plotting the global enstrophy of the flow at every time step (computed through the particle field). This is calculated by integrating the local enstrophy defined as ξ = ω⋅ω / 2.

Enstrophy is approximated as 0.5*Σ( Γ𝑝⋅ω(x𝑝) ). This is consistent with Winckelamns' 1995 CTR report, "Some Progress in LES using the 3-D VPM".

Use save_path to indicate a directory where to save the plots. If so, it will also generate a CSV file with ξ.

Here is an example of this monitor: image

source
FLOWUnsteady.generate_monitor_CdFunction
generate_monitor_Cd(; save_path=nothing)

Generate a monitor plotting the mean value of the SFS model coefficient $C_d$ across the particle field at every time step. It also plots the ratio of $C_d$ values that were clipped to zero (not included in the mean).

Use save_path to indicate a directory where to save the plots. If so, it will also generate a CSV file with the statistics of $C_d$ (particles whose coefficients have been clipped are ignored).

Here is an example of this monitor: image

source
FLOWUnsteady.concatenateFunction
concatenate(monitors::Array{Function})
 concatenate(monitors::NTuple{N, Function})
 concatenate(monitor1, monitor2, ...)

Concatenates a collection of monitors into a pipeline, returning one monitor of the form

monitor(args...; optargs...) =
-    monitors[1](args...; optargs...) || monitors[2](args...; optargs...) || ...
source

Force Calculators

The following are some possible methods for calculating aerodynamic forces. Generator functions return a function that can be directly passed to FLOWUnsteady.generate_monitor_wing through the keyword argument calc_aerodynamicforce_fun.

FLOWUnsteady.generate_calc_aerodynamicforceFunction
generate_calc_aerodynamicforce(; add_parasiticdrag=false,
+    monitors[1](args...; optargs...) || monitors[2](args...; optargs...) || ...
source

Force Calculators

The following are some possible methods for calculating aerodynamic forces. Generator functions return a function that can be directly passed to FLOWUnsteady.generate_monitor_wing through the keyword argument calc_aerodynamicforce_fun.

FLOWUnsteady.generate_calc_aerodynamicforceFunction
generate_calc_aerodynamicforce(; add_parasiticdrag=false,
                                       add_skinfriction=true,
                                       airfoilpolar="xf-n0012-il-500000-n5.csv",
                                       parasiticdrag_args=(),
-                                      )

Default method for calculating aerodynamic forces.

Pass the output of this function to generate_monitor_wing, or use this as an example on how to define your own costumized force calculations.

This function stitches together the outputs of generate_aerodynamicforce_kuttajoukowski and generate_aerodynamicforce_parasiticdrag, and calc_aerodynamicforce_unsteady. See Alvarez' dissertation, Sec. 6.3.3.

source
FLOWUnsteady.generate_aerodynamicforce_kuttajoukowskiFunction
generate_aerodynamicforce_kuttajoukowski(KJforce_type::String,
+                                      )

Default method for calculating aerodynamic forces.

Pass the output of this function to generate_monitor_wing, or use this as an example on how to define your own costumized force calculations.

This function stitches together the outputs of generate_aerodynamicforce_kuttajoukowski and generate_aerodynamicforce_parasiticdrag, and calc_aerodynamicforce_unsteady. See Alvarez' dissertation, Sec. 6.3.3.

source
FLOWUnsteady.generate_aerodynamicforce_kuttajoukowskiFunction
generate_aerodynamicforce_kuttajoukowski(KJforce_type::String,
                             sigma_vlm_surf, sigma_rotor_surf,
                             vlm_vortexsheet,
                             vlm_vortexsheet_overlap,
                             vlm_vortexsheet_distribution,
                             vlm_vortexsheet_sigma_tbv;
                             vehicle=nothing
-                            )

Calculates the aerodynamic force at each element of a VLM system using its current Gamma solution and the Kutta-Joukowski theorem. It saves the force as the field vlm_system.sol["Ftot"]

This force calculated through the Kutta-Joukowski theorem uses the freestream velocity, kinematic velocity, and wake-induced velocity on each bound vortex. See Alvarez' dissertation, Sec. 6.3.3.

ARGUMENTS

  • vlm_vortexsheet::Bool : If true, the bound vorticity is approximated with and actuator surface model through a vortex sheet. If false, it is approximated with an actuator line model with horseshoe vortex filaments.
  • vlm_vortexsheet_overlap::Bool : Target core overlap between particles representing the vortex sheet (if vlm_vortexsheet=true).
  • vlm_vortexsheet_distribution::Function : Vorticity distribution in vortex sheet (see g_uniform, g_linear, and g_pressure).
  • KJforce_type::String : If vlm_vortexsheet=true, it specifies how to weight the force of each particle in the vortex sheet. If KJforce_type=="averaged", the KJ force is a chordwise average of the force experienced by the particles. If KJforce_type=="weighted", the KJ force is chordwise weighted by the strength of each particle. If KJforce_type=="regular", the vortex sheet is ignored, and the KJ force is calculated from the velocity induced at midpoint between the horseshoe filaments.
  • vehicle::VLMVehicle : If vlm_vortexsheet=true, it is expected that the vehicle object is passed through this argument.
source
FLOWUnsteady.generate_aerodynamicforce_parasiticdragFunction
generate_aerodynamicforce_parasiticdrag(polar_file::String;
+                            )

Calculates the aerodynamic force at each element of a VLM system using its current Gamma solution and the Kutta-Joukowski theorem. It saves the force as the field vlm_system.sol["Ftot"]

This force calculated through the Kutta-Joukowski theorem uses the freestream velocity, kinematic velocity, and wake-induced velocity on each bound vortex. See Alvarez' dissertation, Sec. 6.3.3.

ARGUMENTS

  • vlm_vortexsheet::Bool : If true, the bound vorticity is approximated with and actuator surface model through a vortex sheet. If false, it is approximated with an actuator line model with horseshoe vortex filaments.
  • vlm_vortexsheet_overlap::Bool : Target core overlap between particles representing the vortex sheet (if vlm_vortexsheet=true).
  • vlm_vortexsheet_distribution::Function : Vorticity distribution in vortex sheet (see g_uniform, g_linear, and g_pressure).
  • KJforce_type::String : If vlm_vortexsheet=true, it specifies how to weight the force of each particle in the vortex sheet. If KJforce_type=="averaged", the KJ force is a chordwise average of the force experienced by the particles. If KJforce_type=="weighted", the KJ force is chordwise weighted by the strength of each particle. If KJforce_type=="regular", the vortex sheet is ignored, and the KJ force is calculated from the velocity induced at midpoint between the horseshoe filaments.
  • vehicle::VLMVehicle : If vlm_vortexsheet=true, it is expected that the vehicle object is passed through this argument.
source
FLOWUnsteady.generate_aerodynamicforce_parasiticdragFunction
generate_aerodynamicforce_parasiticdrag(polar_file::String;
                                                 read_path=FLOWUnsteady.default_database*"/airfoils",
                                                 calc_cd_from_cl=false,
                                                 add_skinfriction=true,
-                                                Mach=nothing)

Calculates the parasitic drag along the wing using a lookup airfoil table. It adds this force to the field vlm_system.sol["Ftot"].

The lookup table is read from the file polar_file under the directory read_path. The parasitic drag includes form drag, skin friction, and wave drag, assuming that each of these components are included in the lookup polar. polar_file can be any polar file downloaded from airfoiltools.com.

To ignore skin friction drag, use add_skinfriction=false.

The drag will be calculated from the local effective angle of attack, unless calc_cd_from_cl=true is used, which then will be calculated from the local lift coefficient given by the circulation distribution. cd from cl tends to be more accurate than from AOA, but the method might fail to correlate cd and cl depending on how noise the polar data is.

If Mach != nothing, it will use a Prandtl-Glauert correction to pre-correct the lookup cl. This will have no effects if calc_cd_from_cl=false.

source
FLOWUnsteady.calc_aerodynamicforce_unsteadyFunction
calc_aerodynamicforce_unsteady(vlm_system::Union{vlm.Wing, vlm.WingSystem},
+                                                Mach=nothing)

Calculates the parasitic drag along the wing using a lookup airfoil table. It adds this force to the field vlm_system.sol["Ftot"].

The lookup table is read from the file polar_file under the directory read_path. The parasitic drag includes form drag, skin friction, and wave drag, assuming that each of these components are included in the lookup polar. polar_file can be any polar file downloaded from airfoiltools.com.

To ignore skin friction drag, use add_skinfriction=false.

The drag will be calculated from the local effective angle of attack, unless calc_cd_from_cl=true is used, which then will be calculated from the local lift coefficient given by the circulation distribution. cd from cl tends to be more accurate than from AOA, but the method might fail to correlate cd and cl depending on how noise the polar data is.

If Mach != nothing, it will use a Prandtl-Glauert correction to pre-correct the lookup cl. This will have no effects if calc_cd_from_cl=false.

source
FLOWUnsteady.calc_aerodynamicforce_unsteadyFunction
calc_aerodynamicforce_unsteady(vlm_system::Union{vlm.Wing, vlm.WingSystem},
                             prev_vlm_system, pfield, Vinf, dt, rho; t=0.0,
                             per_unit_span=false, spandir=[0, 1, 0],
                             include_trailingboundvortex=false,
                             add_to_Ftot=false
-                            )

Force from unsteady circulation.

This force tends to add a lot of numerical noise, which in most cases ends up cancelling out when the loading is time-averaged. Hence, add_to_Ftot=false will calculate the unsteady loading and save it under the field Funs-vector, but it will not be added to the Ftot vector that is used to calculate the wing's overall aerodynamic force.

source

Wake Treatment

Since the full set of state variables is passed to extra_runtime_function, this function can also be used to alter the simulation on the fly. In some circumstances it is desirable to be able to remove or modify particles, which process we call "wake treatment." Wake treatment is often used to reduce computational cost (for instance, by removing particle in regions of the flow that are not of interest), and it can also be used to force numerical stability (for instance, by removing or clipping particles with vortex strengths that grow beyond certain threshold).

These wake treatment methods can be added into the pipeline of extra_runtime_function as follows:

import FLOWUnsteady as uns
+                            )

Force from unsteady circulation.

This force tends to add a lot of numerical noise, which in most cases ends up cancelling out when the loading is time-averaged. Hence, add_to_Ftot=false will calculate the unsteady loading and save it under the field Funs-vector, but it will not be added to the Ftot vector that is used to calculate the wing's overall aerodynamic force.

source

Wake Treatment

Since the full set of state variables is passed to extra_runtime_function, this function can also be used to alter the simulation on the fly. In some circumstances it is desirable to be able to remove or modify particles, which process we call "wake treatment." Wake treatment is often used to reduce computational cost (for instance, by removing particle in regions of the flow that are not of interest), and it can also be used to force numerical stability (for instance, by removing or clipping particles with vortex strengths that grow beyond certain threshold).

These wake treatment methods can be added into the pipeline of extra_runtime_function as follows:

import FLOWUnsteady as uns
 
 # Define monitors
 monitor_states = uns.generate_monitor_statevariables()
@@ -59,4 +59,4 @@
 
 # Extra runtime function pipeline
 extra_runtime_function = uns.concatenate(monitors, wake_treatment)
-

Then pass this pipeline to the simulation as

uns.run_simulation(sim, nsteps; extra_runtime_function=extra_runtime_function, ...)

Below we list a few generator functions that return common wake treatment methods.

FLOWUnsteady.remove_particles_sphereFunction
remove_particles_sphere(Rsphere2, step::Int; Xoff::Vector=zeros(3))

Returns an extra_runtime_function that every step steps removes all particles that are outside of a sphere of radius sqrt(Rsphere2) centered around the vehicle or with an offset Xoff from the center of the vehicle.

Use this wake treatment to avoid unnecesary computation by removing particles that have gone beyond the region of interest.

source
FLOWUnsteady.remove_particles_boxFunction
remove_particles_box(Pmin::Vector, Pmax::Vector, step::Int)

Returns an extra_runtime_function that every step steps removes all particles that are outside of a box of minimum and maximum vertices Pmin and Pmax.

Use this wake treatment to avoid unnecesary computation by removing particles that have gone beyond the region of interest.

source
FLOWUnsteady.remove_particles_lowstrengthFunction
remove_particles_lowstrength(critGamma2, step)

Returns an extra_runtime_function that removes all particles with a vortex strength magnitude that is smaller than sqrt(critGamma2). Use this wake treatment to avoid unnecesary computation by removing particles that have negligibly-low strength.

step indicates every how many steps to remove particles.

source
FLOWUnsteady.remove_particles_strengthFunction
remove_particles_strength(minGamma2, maxGamma2; every_nsteps=1)

Returns an extra_runtime_function that removes all particles with a vortex strength magnitude that is larger than sqrt(maxGamma2) or smaller than sqrt(minGamma2). Use every_nsteps to indicate every how many steps to remove particles.

source
FLOWUnsteady.remove_particles_sigmaFunction
remove_particles_sigma(minsigma, maxsigma; every_nsteps=1)

Returns an extra_runtime_function that removes all particles with a smoothing radius that is larger than maxsigma or smaller than minsigma. Use every_nsteps to indicate every how many steps to remove particles.

source
+

Then pass this pipeline to the simulation as

uns.run_simulation(sim, nsteps; extra_runtime_function=extra_runtime_function, ...)

Below we list a few generator functions that return common wake treatment methods.

FLOWUnsteady.remove_particles_sphereFunction
remove_particles_sphere(Rsphere2, step::Int; Xoff::Vector=zeros(3))

Returns an extra_runtime_function that every step steps removes all particles that are outside of a sphere of radius sqrt(Rsphere2) centered around the vehicle or with an offset Xoff from the center of the vehicle.

Use this wake treatment to avoid unnecesary computation by removing particles that have gone beyond the region of interest.

source
FLOWUnsteady.remove_particles_boxFunction
remove_particles_box(Pmin::Vector, Pmax::Vector, step::Int)

Returns an extra_runtime_function that every step steps removes all particles that are outside of a box of minimum and maximum vertices Pmin and Pmax.

Use this wake treatment to avoid unnecesary computation by removing particles that have gone beyond the region of interest.

source
FLOWUnsteady.remove_particles_lowstrengthFunction
remove_particles_lowstrength(critGamma2, step)

Returns an extra_runtime_function that removes all particles with a vortex strength magnitude that is smaller than sqrt(critGamma2). Use this wake treatment to avoid unnecesary computation by removing particles that have negligibly-low strength.

step indicates every how many steps to remove particles.

source
FLOWUnsteady.remove_particles_strengthFunction
remove_particles_strength(minGamma2, maxGamma2; every_nsteps=1)

Returns an extra_runtime_function that removes all particles with a vortex strength magnitude that is larger than sqrt(maxGamma2) or smaller than sqrt(minGamma2). Use every_nsteps to indicate every how many steps to remove particles.

source
FLOWUnsteady.remove_particles_sigmaFunction
remove_particles_sigma(minsigma, maxsigma; every_nsteps=1)

Returns an extra_runtime_function that removes all particles with a smoothing radius that is larger than maxsigma or smaller than minsigma. Use every_nsteps to indicate every how many steps to remove particles.

source
diff --git a/api/flowunsteady-openvsp/index.html b/api/flowunsteady-openvsp/index.html index 4b2ebdbd..f081468d 100644 --- a/api/flowunsteady-openvsp/index.html +++ b/api/flowunsteady-openvsp/index.html @@ -1,7 +1,7 @@ -OpenVSP geometry · FLOWUnsteady

OpenVSP geometry

FLOWUnsteady.read_degengeomFunction
`read_degengeom(filename::String)`

Read all geometry components from a DegenGeom file written out by OpenVSP

Arguments

  • filename::String: DegenGeom filename

Returns

  • comp: Vector of vsp.VSPComponent objects
source
FLOWUnsteady.import_vspFunction
`import_vsp(comp::vsp.VSPComponent; geomType::String="",
-            flip_y::Bool=false, transpose_grid::Bool=false)`

Imports properties from OpenVSP component to FLOWUnsteady objects. Importing prop and duct geometries are under development.

Arguments

  • comp::vsp.VSPComponent: Single vsp.VSPComponent object
  • geomType::String : Geometry type may be one of - wing, fuselage, prop, duct
  • symmetric::Bool : Creates a symmetric wing using the semi-span coordinates
  • flip_y::Bool : Flip y-coordinates about longitudinal plane. Useful for symmetric geometry
  • transpose_grid::Bool : Swap ordering of grid points

Returns

  • geom: FLOWUnsteady geometry
source
+

Importing OpenVSP geometry

FLOWUnsteady.read_degengeomFunction
`read_degengeom(filename::String)`

Read all geometry components from a DegenGeom file written out by OpenVSP

Arguments

  • filename::String: DegenGeom filename

Returns

  • comp: Vector of vsp.VSPComponent objects
source
FLOWUnsteady.import_vspFunction
`import_vsp(comp::vsp.VSPComponent; geomType::String="",
+            flip_y::Bool=false, transpose_grid::Bool=false)`

Imports properties from OpenVSP component to FLOWUnsteady objects. Importing prop and duct geometries are under development.

Arguments

  • comp::vsp.VSPComponent: Single vsp.VSPComponent object
  • geomType::String : Geometry type may be one of - wing, fuselage, prop, duct
  • symmetric::Bool : Creates a symmetric wing using the semi-span coordinates
  • flip_y::Bool : Flip y-coordinates about longitudinal plane. Useful for symmetric geometry
  • transpose_grid::Bool : Swap ordering of grid points

Returns

  • geom: FLOWUnsteady geometry
source
diff --git a/api/flowunsteady-postprocessing-fdom/index.html b/api/flowunsteady-postprocessing-fdom/index.html index 49977c13..6cb02915 100644 --- a/api/flowunsteady-postprocessing-fdom/index.html +++ b/api/flowunsteady-postprocessing-fdom/index.html @@ -3,10 +3,10 @@ function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-B7CBF7WC7L', {'page_path': location.pathname + location.search + location.hash}); -

Fluid Domain

FLOWUnsteady.computefluiddomainFunction
computefluiddomain( pfield::FLOWVPM.ParticleField,
+

Fluid Domain

FLOWUnsteady.computefluiddomainFunction
computefluiddomain( pfield::FLOWVPM.ParticleField,
                     grids::Array{<:GeometricTools.AbstractGrid};
                     optargs...
-                    )

Evaluate the velocity and vorticity field induced by the particle field pfield at all nodes in a set of grids grids. The fields are added as solution fields U and W in each grid. The analytic Jacobian of the velocity field can also be saved using the optional argument add_J=true.

OPTIONAL ARGUMENTS

Processing options

  • add_J::Bool=false : Add the solution fields J1, J2, and J3 to each grid, where Ji[j]=dUi/dxj.
  • add_Uinf::Bool=false : It evaluates and adds the uniform freestream to the U field.
  • add_Wapprox::Bool=false : It evaluates and saves the RBF-approximated vorticity field under the field Wapprox.
  • zeta::Function=FLOWVPM.zeta_fmm : Method for evaluating RBF-approximated vorticity (used only if add_Wapprox==true).
  • scale_sigma::Real=1.0 : It rescales the smoothing radius of each particle by this factor before evaluating the particle field.

Output options

  • save_path::String : If used, it will save the grids as XDMF files under this path.
  • file_pref::String : Prefix for XDMF files.
  • grid_names::String : Name of each grid for XDMF files. If not given, it will generate their names automatically.
  • num::Int : If given, the name of the XDMF files will be "$(file_pref)$(grid_names[i]).$(num).vtk"
  • verbose::Bool=true : Activate/deactivate verbose.
  • v_lvl::Int=0 : Indentation level for printing verbose.

NOTE: The solution fields U, W, and Jacobian do not include the freestream field, but rather they only include the fields induced by the particles. To add the freestream to U, use the optional argument add_Uinf=true.

source
computefluiddomain(pfield::vpm.ParticleField,
+                    )

Evaluate the velocity and vorticity field induced by the particle field pfield at all nodes in a set of grids grids. The fields are added as solution fields U and W in each grid. The analytic Jacobian of the velocity field can also be saved using the optional argument add_J=true.

OPTIONAL ARGUMENTS

Processing options

  • add_J::Bool=false : Add the solution fields J1, J2, and J3 to each grid, where Ji[j]=dUi/dxj.
  • add_Uinf::Bool=false : It evaluates and adds the uniform freestream to the U field.
  • add_Wapprox::Bool=false : It evaluates and saves the RBF-approximated vorticity field under the field Wapprox.
  • zeta::Function=FLOWVPM.zeta_fmm : Method for evaluating RBF-approximated vorticity (used only if add_Wapprox==true).
  • scale_sigma::Real=1.0 : It rescales the smoothing radius of each particle by this factor before evaluating the particle field.

Output options

  • save_path::String : If used, it will save the grids as XDMF files under this path.
  • file_pref::String : Prefix for XDMF files.
  • grid_names::String : Name of each grid for XDMF files. If not given, it will generate their names automatically.
  • num::Int : If given, the name of the XDMF files will be "$(file_pref)$(grid_names[i]).$(num).vtk"
  • verbose::Bool=true : Activate/deactivate verbose.
  • v_lvl::Int=0 : Indentation level for printing verbose.

NOTE: The solution fields U, W, and Jacobian do not include the freestream field, but rather they only include the fields induced by the particles. To add the freestream to U, use the optional argument add_Uinf=true.

source
computefluiddomain(pfield::vpm.ParticleField,
                     nums::Vector{Int}, read_path::String, file_pref::String,
                     grids;
                     origin=nothing,
@@ -15,15 +15,15 @@
                     other_file_prefs=[],
                     userfunction_pfield=(pfield, num, grids)->nothing,
                     optargs...
-                    )

Evaluate the fluid domain at each time step in nums that is induced by a particle field saved under read_path. file_pref indicates the prefix of the .h5 files to read.

To translate and re-orient the grids at each time step, the user can pass the new origin vector and orientation matrix through the functions origin and orientation, which will be called as origin(pfield, num) and orientation(pfield, num) at each time step.

pfield is a place holder for loading the particles that are read, so the user must make sure that sufficient memory has been preallocated to hold the number of particles of each time step that will be read, plus the number of nodes in the grids. The fluid domain will be evaluated using the UJ and FMM configuration of the given pfield particle field.

To read and add more than one particle field at each time step, pass a list of paths and prefixes through other_read_paths and other_file_prefs. This is useful for reading and incluiding a set of static particles, for example.

Give it a function userfunction_pfield to pre-process the resulting particle field before evaluating the fluid domain (e.g., remove particles, resize core sizes, etc).

source
computefluiddomain(maxparticles::Int, args...;
+                    )

Evaluate the fluid domain at each time step in nums that is induced by a particle field saved under read_path. file_pref indicates the prefix of the .h5 files to read.

To translate and re-orient the grids at each time step, the user can pass the new origin vector and orientation matrix through the functions origin and orientation, which will be called as origin(pfield, num) and orientation(pfield, num) at each time step.

pfield is a place holder for loading the particles that are read, so the user must make sure that sufficient memory has been preallocated to hold the number of particles of each time step that will be read, plus the number of nodes in the grids. The fluid domain will be evaluated using the UJ and FMM configuration of the given pfield particle field.

To read and add more than one particle field at each time step, pass a list of paths and prefixes through other_read_paths and other_file_prefs. This is useful for reading and incluiding a set of static particles, for example.

Give it a function userfunction_pfield to pre-process the resulting particle field before evaluating the fluid domain (e.g., remove particles, resize core sizes, etc).

source
computefluiddomain(maxparticles::Int, args...;
                     UJ::Function=vpm.UJ_fmm,
                     fmm::FLOWVPM.FMM=vpm.FMM(; p=4, ncrit=50, theta=0.4, phi=0.5),
                     pfield_optargs=[]
-                    optargs...)

Like the other computefluiddomain(args...; optargs...) methods, but automatically pre-allocating and initializing the particle field with the given maximum number of particles, UJ evaluation method, and FMM configuration (if FMM is used by UJ).

Use pfield_optargs to pass any additional optional arguments to the particle field constructor.

source
computefluiddomain(P_min, P_max, NDIVS, args...;
+                    optargs...)

Like the other computefluiddomain(args...; optargs...) methods, but automatically pre-allocating and initializing the particle field with the given maximum number of particles, UJ evaluation method, and FMM configuration (if FMM is used by UJ).

Use pfield_optargs to pass any additional optional arguments to the particle field constructor.

source
computefluiddomain(P_min, P_max, NDIVS, args...;
                     spacetransform=nothing,
                     O=zeros(3), Oaxis=Float64[i==j for i in 1:3, j in 1:3],
-                    optargs...)`

Like the other computefluiddomain(args...; optargs...) methods, but automatically generating a fluid domain grid. The grid is generated as a Cartesian box with minimum and maximum corners P_min and P_max and NDIVS cells.

For instance, P_min=[-1, -1, -1], P_max=[-1, -1, -1], and NDIVS=[10, 10, 50] will grid the volumetric space between -1 and 1 in all directions, with 10 cells in both the x and y-direction, and 50 cells in the z-direction.

Even though the grid is first generated as a Cartesian grid, this can be transformed into any other structured space through the argument spacetransform, which is a function that takes any vector and returns another vector of the same dimensions. For instance, P_min=[0.5, 0, 0], P_max=[1, 2*pi, 5], NDIVS=[10, 20, 30], spacetransform=GeometricTools.cylindrical3D will generate a cylindrical grid discretizing the radial annulus from 0.5 to 1 with 10 cells, the polar angle from 0 to 360deg with 20 cells, and the axial z-distance from 0 through 5 with 30 cells.

Any number of dimensions can be used, but make sure that P_min, P_max, and NDIVS always have three dimensions and indicate the dimensions that are "collapsed" with a 0 in NDIVS. Even though the grid is defined in the Cartesian axes, the origin and orientation of the grid can be specified with the O and Oaxis optional arguments. For instance, P_min=[0, 0, 1], P_max=[2, 3.5, 1], NDIVS=[10, 10, 0] will generate a 2D surface laying in the xy-plane at z=1.0, spanning from (x,y)=(0,0) to (x,y)=(2,3.5). Use O=[0, 0, -1] to move the surface back to the xy-plane at z=0. Use Oaxis=[1 0 0; 0 0 -1; 0 1 0] to re-orient the surface to lay in the zx-plane. The same thing can be achieved with Oaxis=GeometricTools.rotation_matrix2(-90, 0, 0) which generates the rotation matrix corresponding to a -90deg rotation about the x-axis.

NOTE: The order of operation is (1) Cartesian grid generation, (2) space transformation if any, and (3) translation and re-orientation to the given origin and orientation.

source
FLOWUnsteady.generate_preprocessing_fluiddomain_pfieldFunction
generate_preprocessing_fluiddomain_pfield(maxsigma, maxmagGamma;
+                    optargs...)`

Like the other computefluiddomain(args...; optargs...) methods, but automatically generating a fluid domain grid. The grid is generated as a Cartesian box with minimum and maximum corners P_min and P_max and NDIVS cells.

For instance, P_min=[-1, -1, -1], P_max=[-1, -1, -1], and NDIVS=[10, 10, 50] will grid the volumetric space between -1 and 1 in all directions, with 10 cells in both the x and y-direction, and 50 cells in the z-direction.

Even though the grid is first generated as a Cartesian grid, this can be transformed into any other structured space through the argument spacetransform, which is a function that takes any vector and returns another vector of the same dimensions. For instance, P_min=[0.5, 0, 0], P_max=[1, 2*pi, 5], NDIVS=[10, 20, 30], spacetransform=GeometricTools.cylindrical3D will generate a cylindrical grid discretizing the radial annulus from 0.5 to 1 with 10 cells, the polar angle from 0 to 360deg with 20 cells, and the axial z-distance from 0 through 5 with 30 cells.

Any number of dimensions can be used, but make sure that P_min, P_max, and NDIVS always have three dimensions and indicate the dimensions that are "collapsed" with a 0 in NDIVS. Even though the grid is defined in the Cartesian axes, the origin and orientation of the grid can be specified with the O and Oaxis optional arguments. For instance, P_min=[0, 0, 1], P_max=[2, 3.5, 1], NDIVS=[10, 10, 0] will generate a 2D surface laying in the xy-plane at z=1.0, spanning from (x,y)=(0,0) to (x,y)=(2,3.5). Use O=[0, 0, -1] to move the surface back to the xy-plane at z=0. Use Oaxis=[1 0 0; 0 0 -1; 0 1 0] to re-orient the surface to lay in the zx-plane. The same thing can be achieved with Oaxis=GeometricTools.rotation_matrix2(-90, 0, 0) which generates the rotation matrix corresponding to a -90deg rotation about the x-axis.

NOTE: The order of operation is (1) Cartesian grid generation, (2) space transformation if any, and (3) translation and re-orientation to the given origin and orientation.

source
FLOWUnsteady.generate_preprocessing_fluiddomain_pfieldFunction
generate_preprocessing_fluiddomain_pfield(maxsigma, maxmagGamma;
                                                 verbose=true, v_lvl=1)

Generate function for pre-processing particle fields before generating fluid domain: shrink oversized particles and correct blown-up particles.

Pass the output function to FLOWUnsteady.computefluiddomain through the keyword argument userfunction_pfield. For example:

preprocess_pfield = generate_preprocessing_fluiddomain_pfield(maxsigma, maxmagGamma;
                                                                 verbose=true, v_lvl=1)
 
-computefluiddomain( ... ; userfunction_pfield=preprocess_pfield, ...)
source
+computefluiddomain( ... ; userfunction_pfield=preprocess_pfield, ...)
source
diff --git a/api/flowunsteady-postprocessing-misc/index.html b/api/flowunsteady-postprocessing-misc/index.html index 3bf1895e..31199059 100644 --- a/api/flowunsteady-postprocessing-misc/index.html +++ b/api/flowunsteady-postprocessing-misc/index.html @@ -3,17 +3,17 @@ function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-B7CBF7WC7L', {'page_path': location.pathname + location.search + location.hash}); -

Miscellaneous

FLOWUnsteady.postprocess_statisticsFunction
postprocess_statistics(read_path, save_path, nums;
+

Miscellaneous

FLOWUnsteady.postprocess_statisticsFunction
postprocess_statistics(read_path, save_path, nums;
                         # PROCESSING OPTIONS
                         idens           = [""],     # Use this to agglomerate multiple simulations
                         to_exclude      = [],       # Exclude file names containing these words
                         cyl_axial_dir   = nothing,  # Calculate cylindrical statistics if given an axial axis (vector)
                         # OUTPUT OPTIONS
                         prompt=true, debug=false,
-                        verbose=true, v_lvl=0)

Calculate statistics of the simulation VTK outputs over a given range of time steps given by nums. Use this to calculate, for instance, the mean load distribution and fluctuations on wings and rotors.

source
FLOWUnsteady.postprocess_bladeloadingFunction
postprocess_bladeloading(read_path;
+                        verbose=true, v_lvl=0)

Calculate statistics of the simulation VTK outputs over a given range of time steps given by nums. Use this to calculate, for instance, the mean load distribution and fluctuations on wings and rotors.

source
FLOWUnsteady.postprocess_bladeloadingFunction
postprocess_bladeloading(read_path;
                             O           = zeros(3),     # Rotor center
                             rotor_axis  = [-1, 0, 0],   # Rotor centerline axis
                             Ftot_axis   = nothing,      # Use a different centerline axis for forces if given
                             filename    = "singlerotor_Rotor_Blade1_vlm-statistics.vtk", # File name
                             fieldsuff   = "-mean"       # Suffix of fields "Gamma" and "Ftot", if any
-                            )

Read a blade VTK file filename under directory read_path and returns the circulation and force components of the load distribution along the blade.

Return: rs, Gamma, Np, Tp, Rp, Zhat, Rhat, That, Ftot

source
+ )

Read a blade VTK file filename under directory read_path and returns the circulation and force components of the load distribution along the blade.

Return: rs, Gamma, Np, Tp, Rp, Zhat, Rhat, That, Ftot

source
diff --git a/api/flowunsteady-postprocessing-noise/index.html b/api/flowunsteady-postprocessing-noise/index.html index 3a4cc6e0..2777bd75 100644 --- a/api/flowunsteady-postprocessing-noise/index.html +++ b/api/flowunsteady-postprocessing-noise/index.html @@ -3,7 +3,7 @@ function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-B7CBF7WC7L', {'page_path': location.pathname + location.search + location.hash}); -

Aeroacoustic Noise

FLOWUnsteady.run_noise_wopwopFunction

Given the path of a FLOWUnsteady simulation read_path, it runs the noise analysis on the rotors of the simulation. It uses PSU-WOPWOP to calculate the tonal noise from thickness and loading sources on the geometry and aerodynamic loading.

run_noise_wopwop(
+

Aeroacoustic Noise

FLOWUnsteady.run_noise_wopwopFunction

Given the path of a FLOWUnsteady simulation read_path, it runs the noise analysis on the rotors of the simulation. It uses PSU-WOPWOP to calculate the tonal noise from thickness and loading sources on the geometry and aerodynamic loading.

run_noise_wopwop(
     read_path::String,              # Path from where to read aerodynamic solution (FLOWUnsteady simulation)
     run_name,                       # Run name (prefix of rotor files to read)
     RPM::Real,                      # Reference RPM to convert `nrevs` to simulation time
@@ -48,7 +48,7 @@
     debuglvl    = 1,                # PSU-WOPWOP debug level
     observerf_name = "observergrid",# .xyz file with observer grid
     case_name   = "runcase",        # Name of case to create and run
-)

NOTE: This function will call the PSU-WOPWOP binary indicated through wopwopbin. This binary is not included with FLOWUnsteady and must be provided by the user. This method has been tested on PSU-WOPWOP v3.4.2.

NOTE 2: Make sure that the simulation was run with nsteps_save=1, otherwise the time in PSU-WOPWOP will get messed up.

source
FLOWUnsteady.run_noise_bpmFunction

Calculates broadband rotor noise through the Brooks, Pope, and Marcolini method using the BPM.jl package.

This writes the results to a file in the same format than PSU-WOPWOP, which can be read afterwards with FLOWNoise.readwopwopoutput(). It writes three files: SPL (non-weighted), A-weighted SPL, and OASPL.

This method assumes steady conditions and that all rotors have the same RPM.

function run_noise_bpm(
+)

NOTE: This function will call the PSU-WOPWOP binary indicated through wopwopbin. This binary is not included with FLOWUnsteady and must be provided by the user. This method has been tested on PSU-WOPWOP v3.4.2.

NOTE 2: Make sure that the simulation was run with nsteps_save=1, otherwise the time in PSU-WOPWOP will get messed up.

source
FLOWUnsteady.run_noise_bpmFunction

Calculates broadband rotor noise through the Brooks, Pope, and Marcolini method using the BPM.jl package.

This writes the results to a file in the same format than PSU-WOPWOP, which can be read afterwards with FLOWNoise.readwopwopoutput(). It writes three files: SPL (non-weighted), A-weighted SPL, and OASPL.

This method assumes steady conditions and that all rotors have the same RPM.

function run_noise_bpm(
     rotors::Array{vlm.Rotor, 1},    # Rotors
     RPM::Real,                      # RPM of rotors
     Vinf::Function,                 # Freestream
@@ -75,4 +75,4 @@
     prompt      = true,             # Whether to prompt the user
     verbose     = true,             # Whether to verbose
     v_lvl       = 0,                # Indentation level when printing verbose
-)
source
+)
source
diff --git a/api/flowunsteady-run/index.html b/api/flowunsteady-run/index.html index d6572bac..f8703baf 100644 --- a/api/flowunsteady-run/index.html +++ b/api/flowunsteady-run/index.html @@ -3,7 +3,7 @@ function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-B7CBF7WC7L', {'page_path': location.pathname + location.search + location.hash}); -

(5) Run Simulation

FLOWUnsteady.run_simulationFunction

Run the FLOWUnsteady simulation sim in nsteps number of time steps.

run_simulation(
+

(5) Run Simulation

FLOWUnsteady.run_simulationFunction

Run the FLOWUnsteady simulation sim in nsteps number of time steps.

run_simulation(
 
     sim::Simulation,                    # Simulation object
     nsteps::Int;                        # Total time steps in simulation
@@ -82,6 +82,6 @@
     save_wopwopin   = false,            # Generate input files for PSU-WOPWOP
 
 )

Even though a bast number of settings are exposed to the user, the only required keyword arguments are sigma_vlm_surf and sigma_rotor_surf. Thus, running the simulation can be as simple as

run_simulation(sim::Simulation, nsteps::Int;
-                    sigma_vlm_surf = ..., sigma_rotor_surf = ...)
source
Extra Runtime Function

extra_runtime_function is a function that is called at every time step after the state variables are updated and before outputting VTK files. The state variables of the simulation are passed to this function, giving the user complete freedom to modify the states of the simulation (e.g., add/remove particles, clip vortex strengths, re-orient the vehicle) or to do some extra computation (e.g., compute aerodynamic forces, create plots, write to files, etc).

This function is expected be of the form

extra_runtime_function(sim, pfield, t, dt; vprintln) -> Bool

where sim is the FLOWUnsteady.Simulation object, pfield is the FLOWVPM.ParticleField, t is the current simulation time, dt is the length of the current time step, and vprintln(str, v_lvl) is a function for printing the verbose of the simulation (default to vprintln = (args...)->nothing if there is nothing to add to the verbose).

The output of extra_runtime_function is a flag for breaking the simulation at the current time step, such that if it ever returns true, the simulation will immediately quit.

So, what is going on under the hood?

FLOWUnsteady is simply a runtime function that is provided to FLOWVPM, as shown below. Hence, FLOWVPM (green block) is the solver that is actually driving the simulation. FLOWUnsteady (blue block) acts as a runtime function inside a VPM simulation that at each time step uses the solvers in the gray block to compute surface vorticities and adds particles to embed such vorticity in the flow field (thus implementing the actuator surface/line models developed in Alvarez' dissertation, Chapter 6).

This workflow makes it very easy to couple more solvers in the simulation. For instance, a structural solver can be inserted as a runtime function (step 6 of the blue block) that deflects the geometry according to the aerodynamic loads, obtaining a full aeroelastic simulation.

+ sigma_vlm_surf = ..., sigma_rotor_surf = ...)
source
Extra Runtime Function

extra_runtime_function is a function that is called at every time step after the state variables are updated and before outputting VTK files. The state variables of the simulation are passed to this function, giving the user complete freedom to modify the states of the simulation (e.g., add/remove particles, clip vortex strengths, re-orient the vehicle) or to do some extra computation (e.g., compute aerodynamic forces, create plots, write to files, etc).

This function is expected be of the form

extra_runtime_function(sim, pfield, t, dt; vprintln) -> Bool

where sim is the FLOWUnsteady.Simulation object, pfield is the FLOWVPM.ParticleField, t is the current simulation time, dt is the length of the current time step, and vprintln(str, v_lvl) is a function for printing the verbose of the simulation (default to vprintln = (args...)->nothing if there is nothing to add to the verbose).

The output of extra_runtime_function is a flag for breaking the simulation at the current time step, such that if it ever returns true, the simulation will immediately quit.

So, what is going on under the hood?

FLOWUnsteady is simply a runtime function that is provided to FLOWVPM, as shown below. Hence, FLOWVPM (green block) is the solver that is actually driving the simulation. FLOWUnsteady (blue block) acts as a runtime function inside a VPM simulation that at each time step uses the solvers in the gray block to compute surface vorticities and adds particles to embed such vorticity in the flow field (thus implementing the actuator surface/line models developed in Alvarez' dissertation, Chapter 6).

This workflow makes it very easy to couple more solvers in the simulation. For instance, a structural solver can be inserted as a runtime function (step 6 of the blue block) that deflects the geometry according to the aerodynamic loads, obtaining a full aeroelastic simulation.

Pic here -
+ diff --git a/api/flowunsteady-simulation/index.html b/api/flowunsteady-simulation/index.html index 9013b742..6a329c65 100644 --- a/api/flowunsteady-simulation/index.html +++ b/api/flowunsteady-simulation/index.html @@ -3,5 +3,5 @@ function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-B7CBF7WC7L', {'page_path': location.pathname + location.search + location.hash}); -

(3) Simulation Definition

FLOWUnsteady.SimulationType
Simulation{V<:AbstractVehicle, M<:AbstractManeuver, R<:Real}(vehicle::V,
-                        maneuver::M, Vref::R, RPMref::R, ttot::R, optargs...)

Simulation interface. This type carries the simulation's options and connects vehicle and maneuver together.

ARGUMENTS

  • vehicle : Vehicle
  • maneuver : Maneuver
  • Vref : Reference velocity for the maneuver
  • RPMref : Reference RPM for the maneuver
  • ttot : Total time in which to perform the maneuver

OPTIONAL ARGUMENTS

  • Vinit = zeros(3) : Initial vehicle velocity
  • Winit = zeros(3) : Initial vehicle angular velocity

State variables

  • t::Real : Time of current step
  • nt::Int : Current time step number
source
FLOWUnsteady.save_vtkFunction
save_vtk(self::AbstractVehicle, prefix; path="", optargs...)

Output VTK files with vehicle geometry and solution fields.

source
save_vtk(sim::Simulation, prefix; path="", save_wopwopin=false, optargs...)

Output VTK files with vehicle geometry and solution fields. The file names will have the prefix prefix, and will be saved in the directory path. If save_wopwopin=true, it will also generate PSU-WOPWOP input files that can be used to run the acoustic analysis (see run_noise_wopwop).

source
+

(3) Simulation Definition

FLOWUnsteady.SimulationType
Simulation{V<:AbstractVehicle, M<:AbstractManeuver, R<:Real}(vehicle::V,
+                        maneuver::M, Vref::R, RPMref::R, ttot::R, optargs...)

Simulation interface. This type carries the simulation's options and connects vehicle and maneuver together.

ARGUMENTS

  • vehicle : Vehicle
  • maneuver : Maneuver
  • Vref : Reference velocity for the maneuver
  • RPMref : Reference RPM for the maneuver
  • ttot : Total time in which to perform the maneuver

OPTIONAL ARGUMENTS

  • Vinit = zeros(3) : Initial vehicle velocity
  • Winit = zeros(3) : Initial vehicle angular velocity

State variables

  • t::Real : Time of current step
  • nt::Int : Current time step number
source
FLOWUnsteady.save_vtkFunction
save_vtk(self::AbstractVehicle, prefix; path="", optargs...)

Output VTK files with vehicle geometry and solution fields.

source
save_vtk(sim::Simulation, prefix; path="", save_wopwopin=false, optargs...)

Output VTK files with vehicle geometry and solution fields. The file names will have the prefix prefix, and will be saved in the directory path. If save_wopwopin=true, it will also generate PSU-WOPWOP input files that can be used to run the acoustic analysis (see run_noise_wopwop).

source
diff --git a/api/flowunsteady-vehicle-asm/index.html b/api/flowunsteady-vehicle-asm/index.html index 0767c0ce..ad2cd56c 100644 --- a/api/flowunsteady-vehicle-asm/index.html +++ b/api/flowunsteady-vehicle-asm/index.html @@ -3,4 +3,4 @@ function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-B7CBF7WC7L', {'page_path': location.pathname + location.search + location.hash}); -

Actuator surface model

+

Actuator surface model

diff --git a/api/flowunsteady-vehicle-components/index.html b/api/flowunsteady-vehicle-components/index.html index 6422b1fe..d3e54597 100644 --- a/api/flowunsteady-vehicle-components/index.html +++ b/api/flowunsteady-vehicle-components/index.html @@ -3,11 +3,11 @@ function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-B7CBF7WC7L', {'page_path': location.pathname + location.search + location.hash}); -

Generating components

Rotor

FLOWunsteady uses a database of airfoil and rotor geometries to automate the generation of rotors. A prepopulated database is found in the directory under FLOWUnsteady.default_database. Alternatively, users can define their own database with custom rotors and airfoils.

The following slides describe the structure of the database, using the DJI 9443 rotor as an example:

+

Generating components

Rotor

FLOWunsteady uses a database of airfoil and rotor geometries to automate the generation of rotors. A prepopulated database is found in the directory under FLOWUnsteady.default_database. Alternatively, users can define their own database with custom rotors and airfoils.

The following slides describe the structure of the database, using the DJI 9443 rotor as an example:

Rotors can then be generated calling any of following functions:

FLOWUnsteady.generate_rotorMethod
generate_rotor(rotor_file::String;
-                    data_path=FLOWUnsteady.default_database, optargs...)

Generates a FLOWVLM.Rotor reading the full rotor geometry from the rotor file rotor_file found in the database data_path.

source
FLOWUnsteady.generate_rotorMethod
generate_rotor(Rtip, Rhub, B, blade_file::String;
-                    data_path=FLOWUnsteady.default_database, optargs...)

Generates a FLOWVLM.Rotor reading the blade geometry from the blade file blade_file found in the database data_path.

source
FLOWUnsteady.generate_rotorMethod
generate_rotor(Rtip, Rhub, B,
+                    data_path=FLOWUnsteady.default_database, optargs...)

Generates a FLOWVLM.Rotor reading the full rotor geometry from the rotor file rotor_file found in the database data_path.

source
FLOWUnsteady.generate_rotorMethod
generate_rotor(Rtip, Rhub, B, blade_file::String;
+                    data_path=FLOWUnsteady.default_database, optargs...)

Generates a FLOWVLM.Rotor reading the blade geometry from the blade file blade_file found in the database data_path.

source
FLOWUnsteady.generate_rotorMethod
generate_rotor(Rtip, Rhub, B,
                     chorddist, twistdist, sweepdist, heightdist,
                     airfoil_contours;
 
@@ -30,7 +30,7 @@
 
                     # OUTPUT OPTIONS
                     verbose=false, verbose_xfoil=false, v_lvl=1,
-                    plot_disc=true, save_polars=nothing)

Generates a FLOWVLM.Rotor from direct inputs.

ARGUMENTS

  • Rtip::Real : (m) rotor radius (from centerline to blade tip)
  • Rhub::Real : (m) hub radius (from centerline to blade root)
  • B::Int : Number of blades
  • chorddist::Matrix : Chord distribution (chorddist[:, 1] = r/R, chorddist[:, 2] = c/R
  • twistdist::Matrix : Twist distribution (twistdist[:, 1] = r/R, twistdist[:, 2] = degs
  • sweepdist::Matrix : LE sweep distribution (sweepdist[:, 1] = r/R, sweepdist[:, 2] = x/R
  • heightdist::Matrix : LE height distribution (heightdist[:, 1] = r/R, heightdist[:, 2] = z/R
  • airfoil_contours::Array{ Tuple{Float64, Array{Float64, 2}, String} } : Airfoil contours along the span. It must follow the pattern (pos, contour, polarfile) = airfoil_contours[i], where pos = (r-Rhub)/(Rtip-Rhub) is the spanwise position (with root=0, tip=1), contour is the airfoil profile (contour[:, 1] = x/c, contour[:, 2] = y/c), and polarfile is any file from airfoiltools.com with the airfoil lookup table (airfoil polar).

The function allows airfoil_contours::Array{ Tuple{Float64, String, String} }, following the pattern (pos, contourfile, polarfile) = airfoil_contours[i] where contourfile is a CSV file with columns x/c and y/c.

KEYWORD ARGUMENTS

Extra rotor parameters

  • pitch::Real : (deg) rotor collective pitch
  • CW::Bool : Whether the rotor rotates in the clockwise (true) or counter-clockwise (false)

Discretization

  • n::Int : Number of blade elements per blade.
  • r::Real : Spacing between elements at the tip, divided by the spacing between elements at the root.
  • spline_k::Int, spline_s::Real, spline_bc::String : To discretize the blade, the blade distributions are splined and re-discretize into n elements. These splines are done through the Dierckx package, with spline_k the order of the spline, spline_s the smoothing parameter, and spline_bc the boundary condition.
  • rediscretize_airfoils : If true, it will spline the airfoil contours and re-discretize them. It will discretize the lower side of the contour into rfl_n_lower panels, and the upper side into rfl_n_upper panels. This is necessary unless all the airfoil contours already have the same number of points.

Airfoil processing

  • data_path::String : Path to database where to read the airfoil polars from.
  • read_polar::Function : Function used for parsing the airfoil files. Use vlm.ap.read_polar for files that are direct outputs from XFOIL. Use vlm.ap.read_polar2 for CSV files.
  • xfoil::Bool : If true, the polar files will be ignored and XFOIL will be used to generate the polars instead. This will be done sweeping AOA as in alphas (in degrees) and ncrit for inflow turbulence parameter.
  • ReD::Real, Matip::Real, altReD::Tuple{Real, Real, Real}

ReD is the diameter Reynolds number based on rotational speed calculated as ReD = (omega*R)*(2*R)/nu, and Matip is the rotational+freestream Mach number at the tip. These number will be used for running XFOIL to compute airfoil polars, and will be ignored if airfoil polars are prescribed.

Give it altReD = (RPM, J, nu), and it will calculate the chord-based Reynolds accounting for the effective velocity at every station, ignoring ReD (this is more accurate, but not needed).

NOTE: If Matip is different than zero while running XFOIL, you must deactive compressibility corrections in run_simulation by using sound_spd=nothing. Otherwise, compressibility effects will be double accounted for.

Outputs

  • verbose::Bool : Whether to verbose while generating the rotor
  • verbose_xfoil::Bool : Whether to verbose while running XFOIL
  • v_lvl::Int : Indentation level for printing the verbose
  • plot_disc : If true, it will plot the discretization process of the blade, which is useful for verification and debugging. It will also plot the airfoil polars.
  • save_polars::String : Give it a path to a directory and it will save the polars plot in that directory
source
FLOWVLM.rotateFunction
rotate(rotor::Rotor, degs::Real)

Rotates the rotor by degs degrees in the direction of rotation (rotor.CW).

source

VLM Wing

FLOWVLM.simpleWingFunction
simpleWing(b, ar, tr, twist, lambda, gamma; twist_tip=twist, n=20, r=2.0)

Generates a simple wing with constant twist, sweep, dihedral, and taper ratio.

Arguments

  • b : (float) span
  • ar : (float) aspect ratio (span / tip chord)
  • tr : (float) taper ratio (tip chord / root chord)
  • twist : (float) twist of the root in degrees
  • lambda : (float) sweep in degrees
  • gamma : (float) dihedral in degrees
  • twist_tip : (float) twist of the tip (if different than root)
  • n : (int) number of horseshoes per semi-span
  • r : (float) horseshoes' expansion ratio
source
FLOWVLM.complexWingFunction
complexWing(b, AR, tr, n, pos, twist, sweep, dihed; symmetric=true)

Generates a wing with an abritrary distribution of twist, sweep, dihedral, and chord length.

Arguments

  • b::Float64 : Span
  • AR::Float64 : Reference aspect ratio (span / tip chord)
  • n::Int64 : Number of horseshoes per semi-span
  • pos::Array{Float64,1} : Position of stations along the semi-span
  • clen::Array{Float64,1} : Chord length at each station (normalized by tip chord)
  • twist::Array{Float64,1} : (deg) twist at each station
  • sweep::Array{Float64,1} : (deg) sweep between each station
  • dihed::Array{Float64,1} : (deg) dihedral between each station

Optional Arguments

  • symmetric::Bool=true : If false, generates only a half-span
  • chordalign::Float64=0.0 : Indicate position along chord length to align chords. Give it 0 for alignment about leading edge, 0.25 for alignment about quarter chord, and 1.0 for alignment about trailing edge.

Example

# Wing dimensions
+                    plot_disc=true, save_polars=nothing)

Generates a FLOWVLM.Rotor from direct inputs.

ARGUMENTS

  • Rtip::Real : (m) rotor radius (from centerline to blade tip)
  • Rhub::Real : (m) hub radius (from centerline to blade root)
  • B::Int : Number of blades
  • chorddist::Matrix : Chord distribution (chorddist[:, 1] = r/R, chorddist[:, 2] = c/R
  • twistdist::Matrix : Twist distribution (twistdist[:, 1] = r/R, twistdist[:, 2] = degs
  • sweepdist::Matrix : LE sweep distribution (sweepdist[:, 1] = r/R, sweepdist[:, 2] = x/R
  • heightdist::Matrix : LE height distribution (heightdist[:, 1] = r/R, heightdist[:, 2] = z/R
  • airfoil_contours::Array{ Tuple{Float64, Array{Float64, 2}, String} } : Airfoil contours along the span. It must follow the pattern (pos, contour, polarfile) = airfoil_contours[i], where pos = (r-Rhub)/(Rtip-Rhub) is the spanwise position (with root=0, tip=1), contour is the airfoil profile (contour[:, 1] = x/c, contour[:, 2] = y/c), and polarfile is any file from airfoiltools.com with the airfoil lookup table (airfoil polar).

The function allows airfoil_contours::Array{ Tuple{Float64, String, String} }, following the pattern (pos, contourfile, polarfile) = airfoil_contours[i] where contourfile is a CSV file with columns x/c and y/c.

KEYWORD ARGUMENTS

Extra rotor parameters

  • pitch::Real : (deg) rotor collective pitch
  • CW::Bool : Whether the rotor rotates in the clockwise (true) or counter-clockwise (false)

Discretization

  • n::Int : Number of blade elements per blade.
  • r::Real : Spacing between elements at the tip, divided by the spacing between elements at the root.
  • spline_k::Int, spline_s::Real, spline_bc::String : To discretize the blade, the blade distributions are splined and re-discretize into n elements. These splines are done through the Dierckx package, with spline_k the order of the spline, spline_s the smoothing parameter, and spline_bc the boundary condition.
  • rediscretize_airfoils : If true, it will spline the airfoil contours and re-discretize them. It will discretize the lower side of the contour into rfl_n_lower panels, and the upper side into rfl_n_upper panels. This is necessary unless all the airfoil contours already have the same number of points.

Airfoil processing

  • data_path::String : Path to database where to read the airfoil polars from.
  • read_polar::Function : Function used for parsing the airfoil files. Use vlm.ap.read_polar for files that are direct outputs from XFOIL. Use vlm.ap.read_polar2 for CSV files.
  • xfoil::Bool : If true, the polar files will be ignored and XFOIL will be used to generate the polars instead. This will be done sweeping AOA as in alphas (in degrees) and ncrit for inflow turbulence parameter.
  • ReD::Real, Matip::Real, altReD::Tuple{Real, Real, Real}

ReD is the diameter Reynolds number based on rotational speed calculated as ReD = (omega*R)*(2*R)/nu, and Matip is the rotational+freestream Mach number at the tip. These number will be used for running XFOIL to compute airfoil polars, and will be ignored if airfoil polars are prescribed.

Give it altReD = (RPM, J, nu), and it will calculate the chord-based Reynolds accounting for the effective velocity at every station, ignoring ReD (this is more accurate, but not needed).

NOTE: If Matip is different than zero while running XFOIL, you must deactive compressibility corrections in run_simulation by using sound_spd=nothing. Otherwise, compressibility effects will be double accounted for.

Outputs

  • verbose::Bool : Whether to verbose while generating the rotor
  • verbose_xfoil::Bool : Whether to verbose while running XFOIL
  • v_lvl::Int : Indentation level for printing the verbose
  • plot_disc : If true, it will plot the discretization process of the blade, which is useful for verification and debugging. It will also plot the airfoil polars.
  • save_polars::String : Give it a path to a directory and it will save the polars plot in that directory
source
FLOWVLM.rotateFunction
rotate(rotor::Rotor, degs::Real)

Rotates the rotor by degs degrees in the direction of rotation (rotor.CW).

VLM Wing

FLOWVLM.simpleWingFunction
simpleWing(b, ar, tr, twist, lambda, gamma; twist_tip=twist, n=20, r=2.0)

Generates a simple wing with constant twist, sweep, dihedral, and taper ratio.

Arguments

  • b : (float) span
  • ar : (float) aspect ratio (span / tip chord)
  • tr : (float) taper ratio (tip chord / root chord)
  • twist : (float) twist of the root in degrees
  • lambda : (float) sweep in degrees
  • gamma : (float) dihedral in degrees
  • twist_tip : (float) twist of the tip (if different than root)
  • n : (int) number of horseshoes per semi-span
  • r : (float) horseshoes' expansion ratio
FLOWVLM.complexWingFunction
complexWing(b, AR, tr, n, pos, twist, sweep, dihed; symmetric=true)

Generates a wing with an abritrary distribution of twist, sweep, dihedral, and chord length.

Arguments

  • b::Float64 : Span
  • AR::Float64 : Reference aspect ratio (span / tip chord)
  • n::Int64 : Number of horseshoes per semi-span
  • pos::Array{Float64,1} : Position of stations along the semi-span
  • clen::Array{Float64,1} : Chord length at each station (normalized by tip chord)
  • twist::Array{Float64,1} : (deg) twist at each station
  • sweep::Array{Float64,1} : (deg) sweep between each station
  • dihed::Array{Float64,1} : (deg) dihedral between each station

Optional Arguments

  • symmetric::Bool=true : If false, generates only a half-span
  • chordalign::Float64=0.0 : Indicate position along chord length to align chords. Give it 0 for alignment about leading edge, 0.25 for alignment about quarter chord, and 1.0 for alignment about trailing edge.

Example

# Wing dimensions
 b = 1.0                     # (m) span
 AR = 12.0                   # Span over tip chord
 n = 50                      # Horseshoes per semi-span
@@ -43,4 +43,4 @@
 dihed = [2.0, 5.0, 7.5]     # (deg) dihedral between stations
 
 # Generate the wing
-wing = vlm.complexWing(b, AR, n, pos, clen, twist, sweep, dihed)
source

FLOWVLM Systems

FLOWVLM.WingSystemType
WingSystem(wings::Array{Union{Wing, WingSystem}}, wing_names::Array{String})

Initiates a system of wings. All methods applicable to a Wing object are applicable to a WingSystem. When solved, it will calculate the interaction between wings.

source
FLOWVLM.addwingFunction
addwing(self::WingSystem, wing_name::String, wing::Union{Wing, Rotor})

Adds a wing (or rotor) to the system. The local reference frame of the wing then is then in relation to the local reference frame of the System.

source
FLOWVLM.get_wingFunction
get_wing(self::WingSystem, wing_name::String)

Returns the wing of name wing_name.

source
get_wing(self::WingSystem, wing_i::Int)

Returns the i-th wing.

source
FLOWVLM.setcoordsystemFunction
setcoordsystem(wing::Wing, O::Vector, Oaxis::Matrix)

Redefines the local coordinate system of the wing, where O is the new origin and Oaxis is the matrix of unit vectors

source
setcoordsystem(system::WingSystem, O::Vector, Oaxis::Matrix; wings=String[])

Redefines the local coordinate system of the system, where O is the new origin and Oaxis is the matrix of unit vectors. It transforms the coordinates of all wings in the system accordingly.

To change the local coordinate system of a specific wing relative to the system's coordinate system, give the name of the wing in an array under argument wings.

source
setcoordsystem(rotor::Rotor, O::Vector, Oaxis::Matrix; user=false)

Redefines the local coordinate system of the rotor, where O is the new origin and Oaxis is the matrix of unit vectors. If the user is calling this function, give user=true, otherwise it will not do the automatic translation to blade coordinate system.

source
FLOWVLM.get_mFunction
get_m(wing::Wing)

Returns the number of horseshoes in the wing

source
get_m(system::WingSystem)

Returns the total number of horseshoes in the system

source
get_m(rotor::Rotor)

Returns the total number of horseshoes in the rotor

source
+wing = vlm.complexWing(b, AR, n, pos, clen, twist, sweep, dihed)

FLOWVLM Systems

FLOWVLM.WingSystemType
WingSystem(wings::Array{Union{Wing, WingSystem}}, wing_names::Array{String})

Initiates a system of wings. All methods applicable to a Wing object are applicable to a WingSystem. When solved, it will calculate the interaction between wings.

FLOWVLM.addwingFunction
addwing(self::WingSystem, wing_name::String, wing::Union{Wing, Rotor})

Adds a wing (or rotor) to the system. The local reference frame of the wing then is then in relation to the local reference frame of the System.

FLOWVLM.get_wingFunction
get_wing(self::WingSystem, wing_name::String)

Returns the wing of name wing_name.

get_wing(self::WingSystem, wing_i::Int)

Returns the i-th wing.

FLOWVLM.setcoordsystemFunction
setcoordsystem(wing::Wing, O::Vector, Oaxis::Matrix)

Redefines the local coordinate system of the wing, where O is the new origin and Oaxis is the matrix of unit vectors

setcoordsystem(system::WingSystem, O::Vector, Oaxis::Matrix; wings=String[])

Redefines the local coordinate system of the system, where O is the new origin and Oaxis is the matrix of unit vectors. It transforms the coordinates of all wings in the system accordingly.

To change the local coordinate system of a specific wing relative to the system's coordinate system, give the name of the wing in an array under argument wings.

setcoordsystem(rotor::Rotor, O::Vector, Oaxis::Matrix; user=false)

Redefines the local coordinate system of the rotor, where O is the new origin and Oaxis is the matrix of unit vectors. If the user is calling this function, give user=true, otherwise it will not do the automatic translation to blade coordinate system.

FLOWVLM.get_mFunction
get_m(wing::Wing)

Returns the number of horseshoes in the wing

get_m(system::WingSystem)

Returns the total number of horseshoes in the system

get_m(rotor::Rotor)

Returns the total number of horseshoes in the rotor

FLOWVLM.get_mBladeFunction
get_mBlade(rotor::Rotor)

Returns the number of horseshoes per blade

diff --git a/api/flowunsteady-vehicle-types/index.html b/api/flowunsteady-vehicle-types/index.html index 80112801..3fc2ae4e 100644 --- a/api/flowunsteady-vehicle-types/index.html +++ b/api/flowunsteady-vehicle-types/index.html @@ -3,5 +3,5 @@ function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-B7CBF7WC7L', {'page_path': location.pathname + location.search + location.hash}); -

Vehicle types

FLOWUnsteady.UVLMVehicleType
UVLMVehicle{N, M, R}(system; tilting_systems, rotors_systems,
-                                        vlm_system, wake_system, grids)

Type handling all geometries and subsystems that define a vehicle made out of FLOWVLM components (Wing, WingSystem, Rotor).

ARGUMENTS

  • system::FLOWVLM.WingSystem: System of all FLOWVLM objects. This system is considered as the entire vehicle. Not all components in this system will be solved, but they will all be rotated and translated according to the maneuver.

OPTIONAL ARGUMENTS

  • tilting_systems::NTuple{N, FLOWVLM.WingSystem}: Tuple of all FLOWVLM tilting objects, where tilting_systems[i] contains the i-th FLOWVLM system of lifting surfaces and rotors that tilt together.
  • rotors_systems::NTuple{M, Array{vlm.Rotor}}: Tuple of groups of Rotors that share a common RPM.
  • vlm_system::FLOWVLM.WingSystem: System of all FLOWVLM objects to be solved through the VLM solver.
  • wake_system::FLOWVLM.WingSystem: System of all FLOWVLM objects that will shed a VPM wake.
  • grids::Array{gt.GridTypes}: Array of grids that will be translated and rotated along with system.

State variables

  • V::Vector : Current vehicle velocity
  • W::Vector : Current vehicle angular velocity
  • prev_data::Array{Any} : Information about previous step
  • grid_O::Vector{Vector} : Origin of every grid
source
FLOWUnsteady.QVLMVehicleType
QVLMVehicle{N, M, R}(system; optargs...)

Same than FLOWUnsteady.UVLMVehicle but replacing the VPM wake with a semi-infinite rigid VLM wake, making the simulation quasi-ssteady.

NOTE: For the solver to work correctly, all components in wake_system (if any) need to be also components of vlm_system.

NOTE 2: It is recommended that wake_system doesn't include any Rotor object. Otherwise, blades will generate a wake going straight out of every blade trailing edge pointing oposite to the direction of rotation instead of generating a streamtube.

source
+

Vehicle types

FLOWUnsteady.UVLMVehicleType
UVLMVehicle{N, M, R}(system; tilting_systems, rotors_systems,
+                                        vlm_system, wake_system, grids)

Type handling all geometries and subsystems that define a vehicle made out of FLOWVLM components (Wing, WingSystem, Rotor).

ARGUMENTS

  • system::FLOWVLM.WingSystem: System of all FLOWVLM objects. This system is considered as the entire vehicle. Not all components in this system will be solved, but they will all be rotated and translated according to the maneuver.

OPTIONAL ARGUMENTS

  • tilting_systems::NTuple{N, FLOWVLM.WingSystem}: Tuple of all FLOWVLM tilting objects, where tilting_systems[i] contains the i-th FLOWVLM system of lifting surfaces and rotors that tilt together.
  • rotors_systems::NTuple{M, Array{vlm.Rotor}}: Tuple of groups of Rotors that share a common RPM.
  • vlm_system::FLOWVLM.WingSystem: System of all FLOWVLM objects to be solved through the VLM solver.
  • wake_system::FLOWVLM.WingSystem: System of all FLOWVLM objects that will shed a VPM wake.
  • grids::Array{gt.GridTypes}: Array of grids that will be translated and rotated along with system.

State variables

  • V::Vector : Current vehicle velocity
  • W::Vector : Current vehicle angular velocity
  • prev_data::Array{Any} : Information about previous step
  • grid_O::Vector{Vector} : Origin of every grid
source
FLOWUnsteady.QVLMVehicleType
QVLMVehicle{N, M, R}(system; optargs...)

Same than FLOWUnsteady.UVLMVehicle but replacing the VPM wake with a semi-infinite rigid VLM wake, making the simulation quasi-ssteady.

NOTE: For the solver to work correctly, all components in wake_system (if any) need to be also components of vlm_system.

NOTE 2: It is recommended that wake_system doesn't include any Rotor object. Otherwise, blades will generate a wake going straight out of every blade trailing edge pointing oposite to the direction of rotation instead of generating a streamtube.

source
diff --git a/api/flowvpm-particle/index.html b/api/flowvpm-particle/index.html index d925b966..43f24a56 100644 --- a/api/flowvpm-particle/index.html +++ b/api/flowvpm-particle/index.html @@ -3,11 +3,11 @@ function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-B7CBF7WC7L', {'page_path': location.pathname + location.search + location.hash}); -

Particle Field

FLOWVPM.ParticleType
`Particle{T}`

Vortex particle data structure

State variables

  • X::Array{T, 1} : Position (3-elem array)
  • Gamma::Array{T, 1} : Vectorial circulation (3-elem array)
  • sigma::Array{T, 1} : Smoothing radius (1-elem array)
  • vol::Array{T, 1} : Volume (1-elem array)
  • circulation::Array{T, 1} : Scalar circulation (1-elem array)

Public calculations

  • U::Array{T, 1} : Velocity at particle (3-elem array)
  • J::Array{T, 2} : Jacobian at particle J[i,j]=dUi/dxj (9-elem array)
source
Missing docstring.

Missing docstring for FLOWUnsteady.vpm.ParticleField. Check Documenter's build log for details.

Missing docstring.

Missing docstring for FLOWUnsteady.vpm.ClassicVPM. Check Documenter's build log for details.

Missing docstring.

Missing docstring for FLOWUnsteady.vpm.ReformulatedVPM. Check Documenter's build log for details.

FLOWVPM.add_particleFunction

add_particle(self::ParticleField, X, Gamma, sigma; vol=0, index=np)

Add a particle to the field.

source

add_particle(self::ParticleField, P::Particle)

Add a copy of Particle P to the field.

source
FLOWVPM.get_particleFunction
`get_particle(pfield::ParticleField, i)`
+

Particle Field

FLOWVPM.ParticleType
`Particle{T}`

Vortex particle data structure

State variables

  • X::Array{T, 1} : Position (3-elem array)
  • Gamma::Array{T, 1} : Vectorial circulation (3-elem array)
  • sigma::Array{T, 1} : Smoothing radius (1-elem array)
  • vol::Array{T, 1} : Volume (1-elem array)
  • circulation::Array{T, 1} : Scalar circulation (1-elem array)

Public calculations

  • U::Array{T, 1} : Velocity at particle (3-elem array)
  • J::Array{T, 2} : Jacobian at particle J[i,j]=dUi/dxj (9-elem array)
source
Missing docstring.

Missing docstring for FLOWUnsteady.vpm.ParticleField. Check Documenter's build log for details.

Missing docstring.

Missing docstring for FLOWUnsteady.vpm.ClassicVPM. Check Documenter's build log for details.

Missing docstring.

Missing docstring for FLOWUnsteady.vpm.ReformulatedVPM. Check Documenter's build log for details.

FLOWVPM.add_particleFunction

add_particle(self::ParticleField, X, Gamma, sigma; vol=0, index=np)

Add a particle to the field.

source

add_particle(self::ParticleField, P::Particle)

Add a copy of Particle P to the field.

source
FLOWVPM.remove_particleFunction

remove_particle(pfield::ParticleField, i)

Remove the i-th particle in the field. This is done by moving the last particle that entered the field into the memory slot of the target particle. To remove particles sequentally, you will need to go from the last particle back to the first one (see documentation of get_particleiterator for an example).

source
FLOWVPM.get_npFunction
`get_np(pfield::ParticleField)`
+Returns the i-th particle in the field.
source
FLOWVPM.remove_particleFunction

remove_particle(pfield::ParticleField, i)

Remove the i-th particle in the field. This is done by moving the last particle that entered the field into the memory slot of the target particle. To remove particles sequentally, you will need to go from the last particle back to the first one (see documentation of get_particleiterator for an example).

source
FLOWVPM.get_npFunction
`get_np(pfield::ParticleField)`
 
-Returns current number of particles in the field.
source
FLOWVPM.get_particleiteratorFunction
`get_particleiterator(pfield::ParticleField; start_i=1, end_i=np)`

Return an iterator over particles that can be used as follows

julia> # Initiate particle field
+Returns current number of particles in the field.
source
FLOWVPM.get_particleiteratorFunction
`get_particleiterator(pfield::ParticleField; start_i=1, end_i=np)`

Return an iterator over particles that can be used as follows

julia> # Initiate particle field
        pfield = FLOWVPM.ParticleField(10);
 
 julia> # Add particles
@@ -22,4 +22,4 @@
 [1.0, 10.0, 100.0]
 [2.0, 20.0, 200.0]
 [3.0, 30.0, 300.0]
-[4.0, 40.0, 400.0]
source
+[4.0, 40.0, 400.0]
source
diff --git a/api/flowvpm-relaxation/index.html b/api/flowvpm-relaxation/index.html index b13aeeca..c9b6cd55 100644 --- a/api/flowvpm-relaxation/index.html +++ b/api/flowvpm-relaxation/index.html @@ -3,4 +3,4 @@ function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-B7CBF7WC7L', {'page_path': location.pathname + location.search + location.hash}); -

Relaxation Scheme

FLOWVPM.FMMType
`FMM(; p::Int=4, ncrit::Int=50, theta::Real=0.4, phi::Real=0.3)`

Parameters for FMM solver.

Arguments

  • p : Order of multipole expansion (number of terms).
  • ncrit : Maximum number of particles per leaf.
  • theta : Neighborhood criterion. This criterion defines the distance where the far field starts. The criterion is that if θ*r < R1+R2 the interaction between two cells is resolved through P2P, where r is the distance between cell centers, and R1 and R2 are each cell radius. This means that at θ=1, P2P is done only on cells that have overlap; at θ=0.5, P2P is done on cells that their distance is less than double R1+R2; at θ=0.25, P2P is done on cells that their distance is less than four times R1+R2; at θ=0, P2P is done on cells all cells.
  • phi : Regularizing neighborhood criterion. This criterion avoid approximating interactions with the singular-FMM between regularized particles that are sufficiently close to each other across cell boundaries. Used together with the θ-criterion, P2P is performed between two cells if φ < σ/dx, where σ is the average smoothing radius in between all particles in both cells, and dx is the distance between cell boundaries ( dx = r-(R1+R2) ). This means that at φ = 1, P2P is done on cells with boundaries closer than the average smoothing radius; at φ = 0.5, P2P is done on cells closer than two times the smoothing radius; at φ = 0.25, P2P is done on cells closer than four times the smoothing radius.
source
FLOWVPM.RelaxationType
`Relaxation(relax, nsteps_relax, rlxf)`

Defines a relaxation method implemented in the function relax(rlxf::Real, p::Particle) where rlxf is the relaxation factor between 0 and 1, with 0 == no relaxation, and 1 == full relaxation. The simulation is relaxed every nsteps_relax steps.

source
FLOWVPM.relax_pedrizzettiFunction
`relax_Pedrizzetti(rlxf::Real, p::Particle)`

Relaxation scheme where the vortex strength is aligned with the local vorticity.

source
FLOWVPM.relax_correctedpedrizzettiFunction
`relax_correctedPedrizzetti(rlxf::Real, p::Particle)`

Relaxation scheme where the vortex strength is aligned with the local vorticity. This version fixes the error in Pedrizzetti's relaxation that made the strength to continually decrease over time. See notebook 20200921 for derivation.

source
+

Relaxation Scheme

FLOWVPM.FMMType
`FMM(; p::Int=4, ncrit::Int=50, theta::Real=0.4, phi::Real=0.3)`

Parameters for FMM solver.

Arguments

  • p : Order of multipole expansion (number of terms).
  • ncrit : Maximum number of particles per leaf.
  • theta : Neighborhood criterion. This criterion defines the distance where the far field starts. The criterion is that if θ*r < R1+R2 the interaction between two cells is resolved through P2P, where r is the distance between cell centers, and R1 and R2 are each cell radius. This means that at θ=1, P2P is done only on cells that have overlap; at θ=0.5, P2P is done on cells that their distance is less than double R1+R2; at θ=0.25, P2P is done on cells that their distance is less than four times R1+R2; at θ=0, P2P is done on cells all cells.
  • phi : Regularizing neighborhood criterion. This criterion avoid approximating interactions with the singular-FMM between regularized particles that are sufficiently close to each other across cell boundaries. Used together with the θ-criterion, P2P is performed between two cells if φ < σ/dx, where σ is the average smoothing radius in between all particles in both cells, and dx is the distance between cell boundaries ( dx = r-(R1+R2) ). This means that at φ = 1, P2P is done on cells with boundaries closer than the average smoothing radius; at φ = 0.5, P2P is done on cells closer than two times the smoothing radius; at φ = 0.25, P2P is done on cells closer than four times the smoothing radius.
source
FLOWVPM.RelaxationType
`Relaxation(relax, nsteps_relax, rlxf)`

Defines a relaxation method implemented in the function relax(rlxf::Real, p::Particle) where rlxf is the relaxation factor between 0 and 1, with 0 == no relaxation, and 1 == full relaxation. The simulation is relaxed every nsteps_relax steps.

source
FLOWVPM.relax_pedrizzettiFunction
`relax_Pedrizzetti(rlxf::Real, p::Particle)`

Relaxation scheme where the vortex strength is aligned with the local vorticity.

source
FLOWVPM.relax_correctedpedrizzettiFunction
`relax_correctedPedrizzetti(rlxf::Real, p::Particle)`

Relaxation scheme where the vortex strength is aligned with the local vorticity. This version fixes the error in Pedrizzetti's relaxation that made the strength to continually decrease over time. See notebook 20200921 for derivation.

source
diff --git a/api/flowvpm-sfs/index.html b/api/flowvpm-sfs/index.html index 941c9d83..30ea7238 100644 --- a/api/flowvpm-sfs/index.html +++ b/api/flowvpm-sfs/index.html @@ -3,4 +3,4 @@ function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-B7CBF7WC7L', {'page_path': location.pathname + location.search + location.hash}); -

SFS Scheme

FLOWVPM.SubFilterScaleType
Implementation of calculations associated with subfilter-scale turbulence

model.

NOTE: Any implementation is expected to evaluate UJ and SFS terms of the particles which will be used by the time integration routine so make sure they are stored in the memory (see implementation of ConstantSFS as an example).

NOTE2: Any control strategy is implemented as a function that returns true whenever the SFS model needs to be clipped. Subsequently, the model coefficient of the targeted particle will be turned to zero.

source
Missing docstring.

Missing docstring for FLOWUnsteady.vpm.NoSFS. Check Documenter's build log for details.

Missing docstring.

Missing docstring for FLOWUnsteady.vpm.ConstantSFS. Check Documenter's build log for details.

FLOWVPM.DynamicSFSType
Subfilter-scale scheme with an associated dynamic procedure for calculating

the model coefficient.

source
FLOWVPM.clipping_backscatterFunction
Backscatter control strategy of SFS enstrophy production by clipping of the

SFS model. See 20210901 notebook for derivation.

source
FLOWVPM.control_directionalFunction
Directional control strategy of SFS enstrophy production forcing the model

to affect only the vortex strength magnitude and not the vortex orientation. See 20210901 notebook for derivation.

source
FLOWVPM.control_magnitudeFunction
Magnitude control strategy of SFS enstrophy production limiting the

magnitude of the forward scattering (diffussion) of the model. See 20210901 notebook for derivation.

source
FLOWVPM.dynamicprocedure_pseudo3levelFunction
Dynamic procedure for SFS model coefficient based on enstrophy and

derivative balance between resolved and unresolved domain, numerically implemented through pseudo-three filtering levels. See 20210901 notebook for derivation.

NOTES

  • rlxf = Δ𝑡/𝑇 ≤ 1 is the relaxation factor of the Lagrangian average, where Δ𝑡

is the time step of the simulation, and 𝑇 is the time length of the ensemble average.

  • The scaling constant becomes 1 for $\alpha_\tau = 1$ (but notice that the

derivative approximation becomes zero at that point). Hence, the pseudo-three-level procedure converges to the two-level procedure for $\alpha_\tau \rightarrow 1$**.

  • The scaling constant tends to zero when $\alpha_\tau \rightarrow 2/3$. Hence,

it can be used to arbitrarely attenuate the SFS contributions with $\alpha_\tau \rightarrow 2/3$, or let it trully be a self-regulated dynamic procedure with $\alpha_\tau \rightarrow 1$.

  • \[\alpha_\tau\]

    should not be made smaller than $2/3$ as the constant becomes

negative beyond that point. This strains the assumption that $\sigma_\tau$ is small enough to approximate the singular velocity field as $\mathbf{u} \approx \mathbf{\tilde{u}}$, which now is only true if $\sigma$ is small enough.

𝛼𝜏=0.999 ⇒ 3𝛼𝜏−2=0.997 𝛼𝜏=0.990 ⇒ 3𝛼𝜏−2=0.970 𝛼𝜏=0.900 ⇒ 3𝛼𝜏−2=0.700 𝛼𝜏=0.833 ⇒ 3𝛼𝜏−2=0.499 𝛼𝜏=0.750 ⇒ 3𝛼𝜏−2=0.250 𝛼𝜏=0.700 ⇒ 3𝛼𝜏−2=0.100 𝛼𝜏=0.675 ⇒ 3𝛼𝜏−2=0.025 𝛼𝜏=0.670 ⇒ 3𝛼𝜏−2=0.010 𝛼𝜏=0.667 ⇒ 3𝛼𝜏−2=0.001 𝛼𝜏=0.6667⇒ 3𝛼𝜏−2=0.0001

source
FLOWVPM.dynamicprocedure_sensorfunctionFunction
Dynamic procedure for SFS model coefficient based on sensor function of

enstrophy between resolved and unresolved domain, numerically implemented through a test filter. See 20210901 notebook for derivation.

source
FLOWVPM.Estr_directFunction
Model of vortex-stretching SFS contributions evaluated with direct

particle-to-particle interactions. See 20210901 notebook for derivation.

source
FLOWVPM.Estr_fmmFunction
Model of vortex-stretching SFS contributions evaluated with fast multipole

method. See 20210901 notebook for derivation.

source
Missing docstring.

Missing docstring for FLOWUnsteady.vpm.Estr_direct. Check Documenter's build log for details.

Missing docstring.

Missing docstring for FLOWUnsteady.vpm.Estr_direct. Check Documenter's build log for details.

+

SFS Scheme

FLOWVPM.SubFilterScaleType
Implementation of calculations associated with subfilter-scale turbulence

model.

NOTE: Any implementation is expected to evaluate UJ and SFS terms of the particles which will be used by the time integration routine so make sure they are stored in the memory (see implementation of ConstantSFS as an example).

NOTE2: Any control strategy is implemented as a function that returns true whenever the SFS model needs to be clipped. Subsequently, the model coefficient of the targeted particle will be turned to zero.

source
Missing docstring.

Missing docstring for FLOWUnsteady.vpm.NoSFS. Check Documenter's build log for details.

Missing docstring.

Missing docstring for FLOWUnsteady.vpm.ConstantSFS. Check Documenter's build log for details.

FLOWVPM.DynamicSFSType
Subfilter-scale scheme with an associated dynamic procedure for calculating

the model coefficient.

source
FLOWVPM.clipping_backscatterFunction
Backscatter control strategy of SFS enstrophy production by clipping of the

SFS model. See 20210901 notebook for derivation.

source
FLOWVPM.control_directionalFunction
Directional control strategy of SFS enstrophy production forcing the model

to affect only the vortex strength magnitude and not the vortex orientation. See 20210901 notebook for derivation.

source
FLOWVPM.control_magnitudeFunction
Magnitude control strategy of SFS enstrophy production limiting the

magnitude of the forward scattering (diffussion) of the model. See 20210901 notebook for derivation.

source
FLOWVPM.dynamicprocedure_pseudo3levelFunction
Dynamic procedure for SFS model coefficient based on enstrophy and

derivative balance between resolved and unresolved domain, numerically implemented through pseudo-three filtering levels. See 20210901 notebook for derivation.

NOTES

  • rlxf = Δ𝑡/𝑇 ≤ 1 is the relaxation factor of the Lagrangian average, where Δ𝑡

is the time step of the simulation, and 𝑇 is the time length of the ensemble average.

  • The scaling constant becomes 1 for $\alpha_\tau = 1$ (but notice that the

derivative approximation becomes zero at that point). Hence, the pseudo-three-level procedure converges to the two-level procedure for $\alpha_\tau \rightarrow 1$**.

  • The scaling constant tends to zero when $\alpha_\tau \rightarrow 2/3$. Hence,

it can be used to arbitrarely attenuate the SFS contributions with $\alpha_\tau \rightarrow 2/3$, or let it trully be a self-regulated dynamic procedure with $\alpha_\tau \rightarrow 1$.

  • \[\alpha_\tau\]

    should not be made smaller than $2/3$ as the constant becomes

negative beyond that point. This strains the assumption that $\sigma_\tau$ is small enough to approximate the singular velocity field as $\mathbf{u} \approx \mathbf{\tilde{u}}$, which now is only true if $\sigma$ is small enough.

𝛼𝜏=0.999 ⇒ 3𝛼𝜏−2=0.997 𝛼𝜏=0.990 ⇒ 3𝛼𝜏−2=0.970 𝛼𝜏=0.900 ⇒ 3𝛼𝜏−2=0.700 𝛼𝜏=0.833 ⇒ 3𝛼𝜏−2=0.499 𝛼𝜏=0.750 ⇒ 3𝛼𝜏−2=0.250 𝛼𝜏=0.700 ⇒ 3𝛼𝜏−2=0.100 𝛼𝜏=0.675 ⇒ 3𝛼𝜏−2=0.025 𝛼𝜏=0.670 ⇒ 3𝛼𝜏−2=0.010 𝛼𝜏=0.667 ⇒ 3𝛼𝜏−2=0.001 𝛼𝜏=0.6667⇒ 3𝛼𝜏−2=0.0001

source
FLOWVPM.dynamicprocedure_sensorfunctionFunction
Dynamic procedure for SFS model coefficient based on sensor function of

enstrophy between resolved and unresolved domain, numerically implemented through a test filter. See 20210901 notebook for derivation.

source
FLOWVPM.Estr_directFunction
Model of vortex-stretching SFS contributions evaluated with direct

particle-to-particle interactions. See 20210901 notebook for derivation.

source
FLOWVPM.Estr_fmmFunction
Model of vortex-stretching SFS contributions evaluated with fast multipole

method. See 20210901 notebook for derivation.

source
Missing docstring.

Missing docstring for FLOWUnsteady.vpm.Estr_direct. Check Documenter's build log for details.

Missing docstring.

Missing docstring for FLOWUnsteady.vpm.Estr_direct. Check Documenter's build log for details.

diff --git a/api/flowvpm-time/index.html b/api/flowvpm-time/index.html index 7be1c7c6..153cba39 100644 --- a/api/flowvpm-time/index.html +++ b/api/flowvpm-time/index.html @@ -3,4 +3,4 @@ function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-B7CBF7WC7L', {'page_path': location.pathname + location.search + location.hash}); -

Time Integration

FLOWVPM.eulerFunction

Steps the field forward in time by dt in a first-order Euler integration scheme.

source

Steps the field forward in time by dt in a first-order Euler integration scheme using the VPM reformulation. See notebook 20210104.

source
FLOWVPM.rungekutta3Function

Steps the field forward in time by dt in a third-order low-storage Runge-Kutta integration scheme. See Notebook entry 20180105.

source

Steps the field forward in time by dt in a third-order low-storage Runge-Kutta integration scheme using the VPM reformulation. See Notebook entry 20180105 (RK integration) and notebook 20210104 (reformulation).

source
Missing docstring.

Missing docstring for FLOWUnsteady.vpm.euler. Check Documenter's build log for details.

Missing docstring.

Missing docstring for FLOWUnsteady.vpm.euler. Check Documenter's build log for details.

Missing docstring.

Missing docstring for FLOWUnsteady.vpm.euler. Check Documenter's build log for details.

Missing docstring.

Missing docstring for FLOWUnsteady.vpm.euler. Check Documenter's build log for details.

+

Time Integration

FLOWVPM.eulerFunction

Steps the field forward in time by dt in a first-order Euler integration scheme.

source

Steps the field forward in time by dt in a first-order Euler integration scheme using the VPM reformulation. See notebook 20210104.

source
FLOWVPM.rungekutta3Function

Steps the field forward in time by dt in a third-order low-storage Runge-Kutta integration scheme. See Notebook entry 20180105.

source

Steps the field forward in time by dt in a third-order low-storage Runge-Kutta integration scheme using the VPM reformulation. See Notebook entry 20180105 (RK integration) and notebook 20210104 (reformulation).

source
Missing docstring.

Missing docstring for FLOWUnsteady.vpm.euler. Check Documenter's build log for details.

Missing docstring.

Missing docstring for FLOWUnsteady.vpm.euler. Check Documenter's build log for details.

Missing docstring.

Missing docstring for FLOWUnsteady.vpm.euler. Check Documenter's build log for details.

Missing docstring.

Missing docstring for FLOWUnsteady.vpm.euler. Check Documenter's build log for details.

diff --git a/api/flowvpm-uj/index.html b/api/flowvpm-uj/index.html index 04b89fdb..d11f23c2 100644 --- a/api/flowvpm-uj/index.html +++ b/api/flowvpm-uj/index.html @@ -3,4 +3,4 @@ function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-B7CBF7WC7L', {'page_path': location.pathname + location.search + location.hash}); -

UJ Scheme

FLOWVPM.KernelType

Kernel(zeta, g, dgdr, g_dgdr, EXAFMM_P2P, EXAFMM_L2P)

Arguments

  • zeta::Function : Basis function zeta(r).
  • g::Function : Regularizing function g(r).
  • dgdr::Function : Derivative of g(r).
  • g_dgdr::Function : Efficient evaluation of g and dgdr.
  • EXAFMM_P2P::Int : Flag for the ExaFMM P2P function to call.
  • EXAFMM_L2P::Int : Flag for the ExaFMM L2P function to call.
source
FLOWVPM.UJ_directFunction

UJ_direct(pfield)

Calculates the velocity and Jacobian that the field exerts on itself by direct particle-to-particle interaction, saving U and J on the particles.

NOTE: This method accumulates the calculation on the properties U and J of every particle without previously emptying those properties.

source

UJ_direct(source, target)

Calculates the velocity and Jacobian that the field source exerts on every particle of field target, saving U and J on the particles.

NOTE: This method accumulates the calculation on the properties U and J of every particle without previously emptying those properties.

source
FLOWVPM.UJ_fmmFunction

UJ_fmm(pfield)

Calculates the velocity and Jacobian that the field exerts on itself through a fast-multipole approximation, saving U and J on the particles.

NOTE: This method accumulates the calculation on the properties U and J of every particle without previously emptying those properties.

source
Missing docstring.

Missing docstring for FLOWUnsteady.vpm.FMM. Check Documenter's build log for details.

+

UJ Scheme

FLOWVPM.KernelType

Kernel(zeta, g, dgdr, g_dgdr, EXAFMM_P2P, EXAFMM_L2P)

Arguments

  • zeta::Function : Basis function zeta(r).
  • g::Function : Regularizing function g(r).
  • dgdr::Function : Derivative of g(r).
  • g_dgdr::Function : Efficient evaluation of g and dgdr.
  • EXAFMM_P2P::Int : Flag for the ExaFMM P2P function to call.
  • EXAFMM_L2P::Int : Flag for the ExaFMM L2P function to call.
source
FLOWVPM.UJ_directFunction

UJ_direct(pfield)

Calculates the velocity and Jacobian that the field exerts on itself by direct particle-to-particle interaction, saving U and J on the particles.

NOTE: This method accumulates the calculation on the properties U and J of every particle without previously emptying those properties.

source

UJ_direct(source, target)

Calculates the velocity and Jacobian that the field source exerts on every particle of field target, saving U and J on the particles.

NOTE: This method accumulates the calculation on the properties U and J of every particle without previously emptying those properties.

source
FLOWVPM.UJ_fmmFunction

UJ_fmm(pfield)

Calculates the velocity and Jacobian that the field exerts on itself through a fast-multipole approximation, saving U and J on the particles.

NOTE: This method accumulates the calculation on the properties U and J of every particle without previously emptying those properties.

source
Missing docstring.

Missing docstring for FLOWUnsteady.vpm.FMM. Check Documenter's build log for details.

diff --git a/api/flowvpm-utils/index.html b/api/flowvpm-utils/index.html index 1504c1f8..0da903d8 100644 --- a/api/flowvpm-utils/index.html +++ b/api/flowvpm-utils/index.html @@ -3,4 +3,4 @@ function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-B7CBF7WC7L', {'page_path': location.pathname + location.search + location.hash}); -

Utilities

FLOWVPM.run_vpm!Function

run_vpm!(pfield, dt, nsteps; runtime_function=nothing, save_path=nothing, run_name="pfield", nsteps_save=1, verbose=true, prompt=true)

Solves nsteps of the particle field with a time step of dt.

Optional Arguments

  • runtime_function::Function : Give it a function of the form myfun(pfield, t, dt). On each time step it will call this function. Use this for adding particles, deleting particles, etc.
  • static_particles_function::Function : Give it a function of the form myfun(pfield, t, dt) to add static particles representing solid boundaries to the solver. This function is called at every time step right before solving the governing equations, and any new particles added by this function are immediately removed.
  • save_path::String : Give it a string for saving VTKs of the particle field. Creates the given path.
  • run_name::String : Name of output files.
  • nsteps_save::Int64 : Saves vtks every this many time steps.
  • prompt::Bool : If save_path already exist, it will prompt the user before overwritting the folder if true; it will directly overwrite it if false.
  • verbose::Bool : Prints progress of the run to the terminal.
  • verbose_nsteps::Bool: Number of time steps between verbose.
source
FLOWVPM.saveFunction

save(pfield, file_name; path="")

Saves the particle field in HDF5 format and a XDMF file especifying its the attributes. This format can be opened in Paraview for post-processing and visualization.

source
Missing docstring.

Missing docstring for FLOWUnsteady.vpm.read. Check Documenter's build log for details.

Missing docstring.

Missing docstring for FLOWUnsteady.vpm.save_settings. Check Documenter's build log for details.

Missing docstring.

Missing docstring for FLOWUnsteady.vpm.read_settings. Check Documenter's build log for details.

+

Utilities

FLOWVPM.run_vpm!Function

run_vpm!(pfield, dt, nsteps; runtime_function=nothing, save_path=nothing, run_name="pfield", nsteps_save=1, verbose=true, prompt=true)

Solves nsteps of the particle field with a time step of dt.

Optional Arguments

  • runtime_function::Function : Give it a function of the form myfun(pfield, t, dt). On each time step it will call this function. Use this for adding particles, deleting particles, etc.
  • static_particles_function::Function : Give it a function of the form myfun(pfield, t, dt) to add static particles representing solid boundaries to the solver. This function is called at every time step right before solving the governing equations, and any new particles added by this function are immediately removed.
  • save_path::String : Give it a string for saving VTKs of the particle field. Creates the given path.
  • run_name::String : Name of output files.
  • nsteps_save::Int64 : Saves vtks every this many time steps.
  • prompt::Bool : If save_path already exist, it will prompt the user before overwritting the folder if true; it will directly overwrite it if false.
  • verbose::Bool : Prints progress of the run to the terminal.
  • verbose_nsteps::Bool: Number of time steps between verbose.
source
FLOWVPM.saveFunction

save(pfield, file_name; path="")

Saves the particle field in HDF5 format and a XDMF file especifying its the attributes. This format can be opened in Paraview for post-processing and visualization.

source
Missing docstring.

Missing docstring for FLOWUnsteady.vpm.read. Check Documenter's build log for details.

Missing docstring.

Missing docstring for FLOWUnsteady.vpm.save_settings. Check Documenter's build log for details.

Missing docstring.

Missing docstring for FLOWUnsteady.vpm.read_settings. Check Documenter's build log for details.

diff --git a/api/flowvpm-viscous/index.html b/api/flowvpm-viscous/index.html index 091a0b8a..e6b88a08 100644 --- a/api/flowvpm-viscous/index.html +++ b/api/flowvpm-viscous/index.html @@ -3,4 +3,4 @@ function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-B7CBF7WC7L', {'page_path': location.pathname + location.search + location.hash}); -

Viscous Scheme

FLOWVPM.ViscousSchemeType
`ViscousScheme{R}`

Type declaring viscous scheme.

Implementations must have the following properties: * nu::R : Kinematic viscosity.

source
Missing docstring.

Missing docstring for FLOWUnsteady.vpm.Inviscid. Check Documenter's build log for details.

Missing docstring.

Missing docstring for FLOWUnsteady.vpm.CoreSpreading. Check Documenter's build log for details.

Missing docstring.

Missing docstring for FLOWUnsteady.vpm.ParticleStrengthExchange. Check Documenter's build log for details.

FLOWVPM.rbf_conjugategradientFunction

Radial basis function interpolation of Gamma using the conjugate gradient method. This method only works on a particle field with uniform smoothing radius sigma.

See 20180818 notebook and https://en.wikipedia.org/wiki/Conjugategradientmethod#Theresultingalgorithm

source
+

Viscous Scheme

FLOWVPM.ViscousSchemeType
`ViscousScheme{R}`

Type declaring viscous scheme.

Implementations must have the following properties: * nu::R : Kinematic viscosity.

source
Missing docstring.

Missing docstring for FLOWUnsteady.vpm.Inviscid. Check Documenter's build log for details.

Missing docstring.

Missing docstring for FLOWUnsteady.vpm.CoreSpreading. Check Documenter's build log for details.

Missing docstring.

Missing docstring for FLOWUnsteady.vpm.ParticleStrengthExchange. Check Documenter's build log for details.

FLOWVPM.rbf_conjugategradientFunction

Radial basis function interpolation of Gamma using the conjugate gradient method. This method only works on a particle field with uniform smoothing radius sigma.

See 20180818 notebook and https://en.wikipedia.org/wiki/Conjugategradientmethod#Theresultingalgorithm

source
diff --git a/assets/themes/documenter-dark.css b/assets/themes/documenter-dark.css index 0bf1af7d..c94a294d 100644 --- a/assets/themes/documenter-dark.css +++ b/assets/themes/documenter-dark.css @@ -1,7702 +1,7 @@ -@charset "UTF-8"; -/* Font Awesome 5 mixin. Can be included in any rule that should render Font Awesome icons. */ -@keyframes spinAround { - from { - transform: rotate(0deg); } - to { - transform: rotate(359deg); } } - -html.theme--documenter-dark .tabs, html.theme--documenter-dark .pagination-previous, -html.theme--documenter-dark .pagination-next, -html.theme--documenter-dark .pagination-link, -html.theme--documenter-dark .pagination-ellipsis, html.theme--documenter-dark .breadcrumb, html.theme--documenter-dark .file, html.theme--documenter-dark .button, .is-unselectable, html.theme--documenter-dark .modal-close, html.theme--documenter-dark .delete { - -webkit-touch-callout: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; } - -html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after, html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after { - border: 3px solid transparent; - border-radius: 2px; - border-right: 0; - border-top: 0; - content: " "; - display: block; - height: 0.625em; - margin-top: -0.4375em; - pointer-events: none; - position: absolute; - top: 50%; - transform: rotate(-45deg); - transform-origin: center; - width: 0.625em; } - -html.theme--documenter-dark .admonition:not(:last-child), html.theme--documenter-dark .tabs:not(:last-child), html.theme--documenter-dark .message:not(:last-child), html.theme--documenter-dark .list:not(:last-child), html.theme--documenter-dark .level:not(:last-child), html.theme--documenter-dark .breadcrumb:not(:last-child), html.theme--documenter-dark .highlight:not(:last-child), html.theme--documenter-dark .block:not(:last-child), html.theme--documenter-dark .title:not(:last-child), -html.theme--documenter-dark .subtitle:not(:last-child), html.theme--documenter-dark .table-container:not(:last-child), html.theme--documenter-dark .table:not(:last-child), html.theme--documenter-dark .progress:not(:last-child), html.theme--documenter-dark .notification:not(:last-child), html.theme--documenter-dark .content:not(:last-child), html.theme--documenter-dark .box:not(:last-child) { - margin-bottom: 1.5rem; } - -html.theme--documenter-dark .modal-close, html.theme--documenter-dark .delete { - -moz-appearance: none; - -webkit-appearance: none; - background-color: rgba(10, 10, 10, 0.2); - border: none; - border-radius: 290486px; - cursor: pointer; - pointer-events: auto; - display: inline-block; - flex-grow: 0; - flex-shrink: 0; - font-size: 0; - height: 20px; - max-height: 20px; - max-width: 20px; - min-height: 20px; - min-width: 20px; - outline: none; - position: relative; - vertical-align: top; - width: 20px; } - html.theme--documenter-dark .modal-close::before, html.theme--documenter-dark .delete::before, html.theme--documenter-dark .modal-close::after, html.theme--documenter-dark .delete::after { - background-color: white; - content: ""; - display: block; - left: 50%; - position: absolute; - top: 50%; - transform: translateX(-50%) translateY(-50%) rotate(45deg); - transform-origin: center center; } - html.theme--documenter-dark .modal-close::before, html.theme--documenter-dark .delete::before { - height: 2px; - width: 50%; } - html.theme--documenter-dark .modal-close::after, html.theme--documenter-dark .delete::after { - height: 50%; - width: 2px; } - html.theme--documenter-dark .modal-close:hover, html.theme--documenter-dark .delete:hover, html.theme--documenter-dark .modal-close:focus, html.theme--documenter-dark .delete:focus { - background-color: rgba(10, 10, 10, 0.3); } - html.theme--documenter-dark .modal-close:active, html.theme--documenter-dark .delete:active { - background-color: rgba(10, 10, 10, 0.4); } - html.theme--documenter-dark .is-small.modal-close, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.modal-close, html.theme--documenter-dark .is-small.delete, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.delete { - height: 16px; - max-height: 16px; - max-width: 16px; - min-height: 16px; - min-width: 16px; - width: 16px; } - html.theme--documenter-dark .is-medium.modal-close, html.theme--documenter-dark .is-medium.delete { - height: 24px; - max-height: 24px; - max-width: 24px; - min-height: 24px; - min-width: 24px; - width: 24px; } - html.theme--documenter-dark .is-large.modal-close, html.theme--documenter-dark .is-large.delete { - height: 32px; - max-height: 32px; - max-width: 32px; - min-height: 32px; - min-width: 32px; - width: 32px; } - -html.theme--documenter-dark .control.is-loading::after, html.theme--documenter-dark .select.is-loading::after, html.theme--documenter-dark .loader, html.theme--documenter-dark .button.is-loading::after { - animation: spinAround 500ms infinite linear; - border: 2px solid #dbdee0; - border-radius: 290486px; - border-right-color: transparent; - border-top-color: transparent; - content: ""; - display: block; - height: 1em; - position: relative; - width: 1em; } - -html.theme--documenter-dark .hero-video, html.theme--documenter-dark .modal-background, html.theme--documenter-dark .modal, html.theme--documenter-dark .image.is-square img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-square img, -html.theme--documenter-dark .image.is-square .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-square .has-ratio, html.theme--documenter-dark .image.is-1by1 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by1 img, -html.theme--documenter-dark .image.is-1by1 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by1 .has-ratio, html.theme--documenter-dark .image.is-5by4 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by4 img, -html.theme--documenter-dark .image.is-5by4 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by4 .has-ratio, html.theme--documenter-dark .image.is-4by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by3 img, -html.theme--documenter-dark .image.is-4by3 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by3 .has-ratio, html.theme--documenter-dark .image.is-3by2 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by2 img, -html.theme--documenter-dark .image.is-3by2 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by2 .has-ratio, html.theme--documenter-dark .image.is-5by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by3 img, -html.theme--documenter-dark .image.is-5by3 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by3 .has-ratio, html.theme--documenter-dark .image.is-16by9 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-16by9 img, -html.theme--documenter-dark .image.is-16by9 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-16by9 .has-ratio, html.theme--documenter-dark .image.is-2by1 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by1 img, -html.theme--documenter-dark .image.is-2by1 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by1 .has-ratio, html.theme--documenter-dark .image.is-3by1 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by1 img, -html.theme--documenter-dark .image.is-3by1 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by1 .has-ratio, html.theme--documenter-dark .image.is-4by5 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by5 img, -html.theme--documenter-dark .image.is-4by5 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by5 .has-ratio, html.theme--documenter-dark .image.is-3by4 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by4 img, -html.theme--documenter-dark .image.is-3by4 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by4 .has-ratio, html.theme--documenter-dark .image.is-2by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by3 img, -html.theme--documenter-dark .image.is-2by3 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by3 .has-ratio, html.theme--documenter-dark .image.is-3by5 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by5 img, -html.theme--documenter-dark .image.is-3by5 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by5 .has-ratio, html.theme--documenter-dark .image.is-9by16 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-9by16 img, -html.theme--documenter-dark .image.is-9by16 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-9by16 .has-ratio, html.theme--documenter-dark .image.is-1by2 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by2 img, -html.theme--documenter-dark .image.is-1by2 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by2 .has-ratio, html.theme--documenter-dark .image.is-1by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by3 img, -html.theme--documenter-dark .image.is-1by3 .has-ratio, -html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by3 .has-ratio, .is-overlay { - bottom: 0; - left: 0; - position: absolute; - right: 0; - top: 0; } - -html.theme--documenter-dark .pagination-previous, -html.theme--documenter-dark .pagination-next, -html.theme--documenter-dark .pagination-link, -html.theme--documenter-dark .pagination-ellipsis, html.theme--documenter-dark .file-cta, -html.theme--documenter-dark .file-name, html.theme--documenter-dark .select select, html.theme--documenter-dark .textarea, html.theme--documenter-dark .input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input, html.theme--documenter-dark .button { - -moz-appearance: none; - -webkit-appearance: none; - align-items: center; - border: 1px solid transparent; - border-radius: 0.4em; - box-shadow: none; - display: inline-flex; - font-size: 15px; - height: 2.25em; - justify-content: flex-start; - line-height: 1.5; - padding-bottom: calc(0.375em - 1px); - padding-left: calc(0.625em - 1px); - padding-right: calc(0.625em - 1px); - padding-top: calc(0.375em - 1px); - position: relative; - vertical-align: top; } - html.theme--documenter-dark .pagination-previous:focus, - html.theme--documenter-dark .pagination-next:focus, - html.theme--documenter-dark .pagination-link:focus, - html.theme--documenter-dark .pagination-ellipsis:focus, html.theme--documenter-dark .file-cta:focus, - html.theme--documenter-dark .file-name:focus, html.theme--documenter-dark .select select:focus, html.theme--documenter-dark .textarea:focus, html.theme--documenter-dark .input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:focus, html.theme--documenter-dark .button:focus, html.theme--documenter-dark .is-focused.pagination-previous, - html.theme--documenter-dark .is-focused.pagination-next, - html.theme--documenter-dark .is-focused.pagination-link, - html.theme--documenter-dark .is-focused.pagination-ellipsis, html.theme--documenter-dark .is-focused.file-cta, - html.theme--documenter-dark .is-focused.file-name, html.theme--documenter-dark .select select.is-focused, html.theme--documenter-dark .is-focused.textarea, html.theme--documenter-dark .is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-focused.button, html.theme--documenter-dark .pagination-previous:active, - html.theme--documenter-dark .pagination-next:active, - html.theme--documenter-dark .pagination-link:active, - html.theme--documenter-dark .pagination-ellipsis:active, html.theme--documenter-dark .file-cta:active, - html.theme--documenter-dark .file-name:active, html.theme--documenter-dark .select select:active, html.theme--documenter-dark .textarea:active, html.theme--documenter-dark .input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:active, html.theme--documenter-dark .button:active, html.theme--documenter-dark .is-active.pagination-previous, - html.theme--documenter-dark .is-active.pagination-next, - html.theme--documenter-dark .is-active.pagination-link, - html.theme--documenter-dark .is-active.pagination-ellipsis, html.theme--documenter-dark .is-active.file-cta, - html.theme--documenter-dark .is-active.file-name, html.theme--documenter-dark .select select.is-active, html.theme--documenter-dark .is-active.textarea, html.theme--documenter-dark .is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active, html.theme--documenter-dark .is-active.button { - outline: none; } - html.theme--documenter-dark .pagination-previous[disabled], - html.theme--documenter-dark .pagination-next[disabled], - html.theme--documenter-dark .pagination-link[disabled], - html.theme--documenter-dark .pagination-ellipsis[disabled], html.theme--documenter-dark .file-cta[disabled], - html.theme--documenter-dark .file-name[disabled], html.theme--documenter-dark .select select[disabled], html.theme--documenter-dark .textarea[disabled], html.theme--documenter-dark .input[disabled], html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[disabled], html.theme--documenter-dark .button[disabled], fieldset[disabled] html.theme--documenter-dark .pagination-previous, html.theme--documenter-dark fieldset[disabled] .pagination-previous, - fieldset[disabled] html.theme--documenter-dark .pagination-next, - html.theme--documenter-dark fieldset[disabled] .pagination-next, - fieldset[disabled] html.theme--documenter-dark .pagination-link, - html.theme--documenter-dark fieldset[disabled] .pagination-link, - fieldset[disabled] html.theme--documenter-dark .pagination-ellipsis, - html.theme--documenter-dark fieldset[disabled] .pagination-ellipsis, fieldset[disabled] html.theme--documenter-dark .file-cta, html.theme--documenter-dark fieldset[disabled] .file-cta, - fieldset[disabled] html.theme--documenter-dark .file-name, - html.theme--documenter-dark fieldset[disabled] .file-name, fieldset[disabled] html.theme--documenter-dark .select select, fieldset[disabled] html.theme--documenter-dark .textarea, fieldset[disabled] html.theme--documenter-dark .input, fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input, html.theme--documenter-dark fieldset[disabled] .select select, html.theme--documenter-dark .select fieldset[disabled] select, html.theme--documenter-dark fieldset[disabled] .textarea, html.theme--documenter-dark fieldset[disabled] .input, html.theme--documenter-dark fieldset[disabled] #documenter .docs-sidebar form.docs-search > input, html.theme--documenter-dark #documenter .docs-sidebar fieldset[disabled] form.docs-search > input, fieldset[disabled] html.theme--documenter-dark .button, html.theme--documenter-dark fieldset[disabled] .button { - cursor: not-allowed; } - -/*! minireset.css v0.0.4 | MIT License | github.com/jgthms/minireset.css */ -html, -body, -p, -ol, -ul, -li, -dl, -dt, -dd, -blockquote, -figure, -fieldset, -legend, -textarea, -pre, -iframe, -hr, -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 0; - padding: 0; } - -h1, -h2, -h3, -h4, -h5, -h6 { - font-size: 100%; - font-weight: normal; } - -ul { - list-style: none; } - -button, -input, -select, -textarea { - margin: 0; } - -html { - box-sizing: border-box; } - -*, *::before, *::after { - box-sizing: inherit; } - -img, -embed, -iframe, -object, -video { - height: auto; - max-width: 100%; } - -audio { - max-width: 100%; } - -iframe { - border: 0; } - -table { - border-collapse: collapse; - border-spacing: 0; } - -td, -th { - padding: 0; } - td:not([align]), - th:not([align]) { - text-align: left; } - -.is-clearfix::after { - clear: both; - content: " "; - display: table; } - -.is-pulled-left { - float: left !important; } - -.is-pulled-right { - float: right !important; } - -.is-clipped { - overflow: hidden !important; } - -.is-size-1 { - font-size: 3rem !important; } - -.is-size-2 { - font-size: 2.5rem !important; } - -.is-size-3 { - font-size: 2rem !important; } - -.is-size-4 { - font-size: 1.5rem !important; } - -.is-size-5 { - font-size: 1.25rem !important; } - -.is-size-6 { - font-size: 15px !important; } - -.is-size-7, html.theme--documenter-dark .docstring > section > a.docs-sourcelink { - font-size: 0.85em !important; } - -@media screen and (max-width: 768px) { - .is-size-1-mobile { - font-size: 3rem !important; } - .is-size-2-mobile { - font-size: 2.5rem !important; } - .is-size-3-mobile { - font-size: 2rem !important; } - .is-size-4-mobile { - font-size: 1.5rem !important; } - .is-size-5-mobile { - font-size: 1.25rem !important; } - .is-size-6-mobile { - font-size: 15px !important; } - .is-size-7-mobile { - font-size: 0.85em !important; } } - -@media screen and (min-width: 769px), print { - .is-size-1-tablet { - font-size: 3rem !important; } - .is-size-2-tablet { - font-size: 2.5rem !important; } - .is-size-3-tablet { - font-size: 2rem !important; } - .is-size-4-tablet { - font-size: 1.5rem !important; } - .is-size-5-tablet { - font-size: 1.25rem !important; } - .is-size-6-tablet { - font-size: 15px !important; } - .is-size-7-tablet { - font-size: 0.85em !important; } } - -@media screen and (max-width: 1055px) { - .is-size-1-touch { - font-size: 3rem !important; } - .is-size-2-touch { - font-size: 2.5rem !important; } - .is-size-3-touch { - font-size: 2rem !important; } - .is-size-4-touch { - font-size: 1.5rem !important; } - .is-size-5-touch { - font-size: 1.25rem !important; } - .is-size-6-touch { - font-size: 15px !important; } - .is-size-7-touch { - font-size: 0.85em !important; } } - -@media screen and (min-width: 1056px) { - .is-size-1-desktop { - font-size: 3rem !important; } - .is-size-2-desktop { - font-size: 2.5rem !important; } - .is-size-3-desktop { - font-size: 2rem !important; } - .is-size-4-desktop { - font-size: 1.5rem !important; } - .is-size-5-desktop { - font-size: 1.25rem !important; } - .is-size-6-desktop { - font-size: 15px !important; } - .is-size-7-desktop { - font-size: 0.85em !important; } } - -@media screen and (min-width: 1216px) { - .is-size-1-widescreen { - font-size: 3rem !important; } - .is-size-2-widescreen { - font-size: 2.5rem !important; } - .is-size-3-widescreen { - font-size: 2rem !important; } - .is-size-4-widescreen { - font-size: 1.5rem !important; } - .is-size-5-widescreen { - font-size: 1.25rem !important; } - .is-size-6-widescreen { - font-size: 15px !important; } - .is-size-7-widescreen { - font-size: 0.85em !important; } } - -@media screen and (min-width: 1408px) { - .is-size-1-fullhd { - font-size: 3rem !important; } - .is-size-2-fullhd { - font-size: 2.5rem !important; } - .is-size-3-fullhd { - font-size: 2rem !important; } - .is-size-4-fullhd { - font-size: 1.5rem !important; } - .is-size-5-fullhd { - font-size: 1.25rem !important; } - .is-size-6-fullhd { - font-size: 15px !important; } - .is-size-7-fullhd { - font-size: 0.85em !important; } } - -.has-text-centered { - text-align: center !important; } - -.has-text-justified { - text-align: justify !important; } - -.has-text-left { - text-align: left !important; } - -.has-text-right { - text-align: right !important; } - -@media screen and (max-width: 768px) { - .has-text-centered-mobile { - text-align: center !important; } } - -@media screen and (min-width: 769px), print { - .has-text-centered-tablet { - text-align: center !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .has-text-centered-tablet-only { - text-align: center !important; } } - -@media screen and (max-width: 1055px) { - .has-text-centered-touch { - text-align: center !important; } } - -@media screen and (min-width: 1056px) { - .has-text-centered-desktop { - text-align: center !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .has-text-centered-desktop-only { - text-align: center !important; } } - -@media screen and (min-width: 1216px) { - .has-text-centered-widescreen { - text-align: center !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .has-text-centered-widescreen-only { - text-align: center !important; } } - -@media screen and (min-width: 1408px) { - .has-text-centered-fullhd { - text-align: center !important; } } - -@media screen and (max-width: 768px) { - .has-text-justified-mobile { - text-align: justify !important; } } - -@media screen and (min-width: 769px), print { - .has-text-justified-tablet { - text-align: justify !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .has-text-justified-tablet-only { - text-align: justify !important; } } - -@media screen and (max-width: 1055px) { - .has-text-justified-touch { - text-align: justify !important; } } - -@media screen and (min-width: 1056px) { - .has-text-justified-desktop { - text-align: justify !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .has-text-justified-desktop-only { - text-align: justify !important; } } - -@media screen and (min-width: 1216px) { - .has-text-justified-widescreen { - text-align: justify !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .has-text-justified-widescreen-only { - text-align: justify !important; } } - -@media screen and (min-width: 1408px) { - .has-text-justified-fullhd { - text-align: justify !important; } } - -@media screen and (max-width: 768px) { - .has-text-left-mobile { - text-align: left !important; } } - -@media screen and (min-width: 769px), print { - .has-text-left-tablet { - text-align: left !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .has-text-left-tablet-only { - text-align: left !important; } } - -@media screen and (max-width: 1055px) { - .has-text-left-touch { - text-align: left !important; } } - -@media screen and (min-width: 1056px) { - .has-text-left-desktop { - text-align: left !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .has-text-left-desktop-only { - text-align: left !important; } } - -@media screen and (min-width: 1216px) { - .has-text-left-widescreen { - text-align: left !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .has-text-left-widescreen-only { - text-align: left !important; } } - -@media screen and (min-width: 1408px) { - .has-text-left-fullhd { - text-align: left !important; } } - -@media screen and (max-width: 768px) { - .has-text-right-mobile { - text-align: right !important; } } - -@media screen and (min-width: 769px), print { - .has-text-right-tablet { - text-align: right !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .has-text-right-tablet-only { - text-align: right !important; } } - -@media screen and (max-width: 1055px) { - .has-text-right-touch { - text-align: right !important; } } - -@media screen and (min-width: 1056px) { - .has-text-right-desktop { - text-align: right !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .has-text-right-desktop-only { - text-align: right !important; } } - -@media screen and (min-width: 1216px) { - .has-text-right-widescreen { - text-align: right !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .has-text-right-widescreen-only { - text-align: right !important; } } - -@media screen and (min-width: 1408px) { - .has-text-right-fullhd { - text-align: right !important; } } - -.is-capitalized { - text-transform: capitalize !important; } - -.is-lowercase { - text-transform: lowercase !important; } - -.is-uppercase { - text-transform: uppercase !important; } - -.is-italic { - font-style: italic !important; } - -.has-text-white { - color: white !important; } - -a.has-text-white:hover, a.has-text-white:focus { - color: #e6e6e6 !important; } - -.has-background-white { - background-color: white !important; } - -.has-text-black { - color: #0a0a0a !important; } - -a.has-text-black:hover, a.has-text-black:focus { - color: black !important; } - -.has-background-black { - background-color: #0a0a0a !important; } - -.has-text-light { - color: #ecf0f1 !important; } - -a.has-text-light:hover, a.has-text-light:focus { - color: #cfd9db !important; } - -.has-background-light { - background-color: #ecf0f1 !important; } - -.has-text-dark { - color: #282f2f !important; } - -a.has-text-dark:hover, a.has-text-dark:focus { - color: #111414 !important; } - -.has-background-dark { - background-color: #282f2f !important; } - -.has-text-primary { - color: #375a7f !important; } - -a.has-text-primary:hover, a.has-text-primary:focus { - color: #28415b !important; } - -.has-background-primary { - background-color: #375a7f !important; } - -.has-text-link { - color: #1abc9c !important; } - -a.has-text-link:hover, a.has-text-link:focus { - color: #148f77 !important; } - -.has-background-link { - background-color: #1abc9c !important; } - -.has-text-info { - color: #024c7d !important; } - -a.has-text-info:hover, a.has-text-info:focus { - color: #012d4b !important; } - -.has-background-info { - background-color: #024c7d !important; } - -.has-text-success { - color: #008438 !important; } - -a.has-text-success:hover, a.has-text-success:focus { - color: #005122 !important; } - -.has-background-success { - background-color: #008438 !important; } - -.has-text-warning { - color: #ad8100 !important; } - -a.has-text-warning:hover, a.has-text-warning:focus { - color: #7a5b00 !important; } - -.has-background-warning { - background-color: #ad8100 !important; } - -.has-text-danger { - color: #9e1b0d !important; } - -a.has-text-danger:hover, a.has-text-danger:focus { - color: #6f1309 !important; } - -.has-background-danger { - background-color: #9e1b0d !important; } - -.has-text-black-bis { - color: #121212 !important; } - -.has-background-black-bis { - background-color: #121212 !important; } - -.has-text-black-ter { - color: #242424 !important; } - -.has-background-black-ter { - background-color: #242424 !important; } - -.has-text-grey-darker { - color: #282f2f !important; } - -.has-background-grey-darker { - background-color: #282f2f !important; } - -.has-text-grey-dark { - color: #343c3d !important; } - -.has-background-grey-dark { - background-color: #343c3d !important; } - -.has-text-grey { - color: #5e6d6f !important; } - -.has-background-grey { - background-color: #5e6d6f !important; } - -.has-text-grey-light { - color: #8c9b9d !important; } - -.has-background-grey-light { - background-color: #8c9b9d !important; } - -.has-text-grey-lighter { - color: #dbdee0 !important; } - -.has-background-grey-lighter { - background-color: #dbdee0 !important; } - -.has-text-white-ter { - color: #ecf0f1 !important; } - -.has-background-white-ter { - background-color: #ecf0f1 !important; } - -.has-text-white-bis { - color: #fafafa !important; } - -.has-background-white-bis { - background-color: #fafafa !important; } - -.has-text-weight-light { - font-weight: 300 !important; } - -.has-text-weight-normal { - font-weight: 400 !important; } - -.has-text-weight-medium { - font-weight: 500 !important; } - -.has-text-weight-semibold { - font-weight: 600 !important; } - -.has-text-weight-bold { - font-weight: 700 !important; } - -.is-family-primary { - font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; } - -.is-family-secondary { - font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; } - -.is-family-sans-serif { - font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; } - -.is-family-monospace { - font-family: "JuliaMono", "SFMono-Regular", "Menlo", "Consolas", "Liberation Mono", "DejaVu Sans Mono", monospace !important; } - -.is-family-code { - font-family: "JuliaMono", "SFMono-Regular", "Menlo", "Consolas", "Liberation Mono", "DejaVu Sans Mono", monospace !important; } - -.is-block { - display: block !important; } - -@media screen and (max-width: 768px) { - .is-block-mobile { - display: block !important; } } - -@media screen and (min-width: 769px), print { - .is-block-tablet { - display: block !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-block-tablet-only { - display: block !important; } } - -@media screen and (max-width: 1055px) { - .is-block-touch { - display: block !important; } } - -@media screen and (min-width: 1056px) { - .is-block-desktop { - display: block !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-block-desktop-only { - display: block !important; } } - -@media screen and (min-width: 1216px) { - .is-block-widescreen { - display: block !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-block-widescreen-only { - display: block !important; } } - -@media screen and (min-width: 1408px) { - .is-block-fullhd { - display: block !important; } } - -.is-flex { - display: flex !important; } - -@media screen and (max-width: 768px) { - .is-flex-mobile { - display: flex !important; } } - -@media screen and (min-width: 769px), print { - .is-flex-tablet { - display: flex !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-flex-tablet-only { - display: flex !important; } } - -@media screen and (max-width: 1055px) { - .is-flex-touch { - display: flex !important; } } - -@media screen and (min-width: 1056px) { - .is-flex-desktop { - display: flex !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-flex-desktop-only { - display: flex !important; } } - -@media screen and (min-width: 1216px) { - .is-flex-widescreen { - display: flex !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-flex-widescreen-only { - display: flex !important; } } - -@media screen and (min-width: 1408px) { - .is-flex-fullhd { - display: flex !important; } } - -.is-inline { - display: inline !important; } - -@media screen and (max-width: 768px) { - .is-inline-mobile { - display: inline !important; } } - -@media screen and (min-width: 769px), print { - .is-inline-tablet { - display: inline !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-inline-tablet-only { - display: inline !important; } } - -@media screen and (max-width: 1055px) { - .is-inline-touch { - display: inline !important; } } - -@media screen and (min-width: 1056px) { - .is-inline-desktop { - display: inline !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-inline-desktop-only { - display: inline !important; } } - -@media screen and (min-width: 1216px) { - .is-inline-widescreen { - display: inline !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-inline-widescreen-only { - display: inline !important; } } - -@media screen and (min-width: 1408px) { - .is-inline-fullhd { - display: inline !important; } } - -.is-inline-block { - display: inline-block !important; } - -@media screen and (max-width: 768px) { - .is-inline-block-mobile { - display: inline-block !important; } } - -@media screen and (min-width: 769px), print { - .is-inline-block-tablet { - display: inline-block !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-inline-block-tablet-only { - display: inline-block !important; } } - -@media screen and (max-width: 1055px) { - .is-inline-block-touch { - display: inline-block !important; } } - -@media screen and (min-width: 1056px) { - .is-inline-block-desktop { - display: inline-block !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-inline-block-desktop-only { - display: inline-block !important; } } - -@media screen and (min-width: 1216px) { - .is-inline-block-widescreen { - display: inline-block !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-inline-block-widescreen-only { - display: inline-block !important; } } - -@media screen and (min-width: 1408px) { - .is-inline-block-fullhd { - display: inline-block !important; } } - -.is-inline-flex { - display: inline-flex !important; } - -@media screen and (max-width: 768px) { - .is-inline-flex-mobile { - display: inline-flex !important; } } - -@media screen and (min-width: 769px), print { - .is-inline-flex-tablet { - display: inline-flex !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-inline-flex-tablet-only { - display: inline-flex !important; } } - -@media screen and (max-width: 1055px) { - .is-inline-flex-touch { - display: inline-flex !important; } } - -@media screen and (min-width: 1056px) { - .is-inline-flex-desktop { - display: inline-flex !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-inline-flex-desktop-only { - display: inline-flex !important; } } - -@media screen and (min-width: 1216px) { - .is-inline-flex-widescreen { - display: inline-flex !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-inline-flex-widescreen-only { - display: inline-flex !important; } } - -@media screen and (min-width: 1408px) { - .is-inline-flex-fullhd { - display: inline-flex !important; } } - -.is-hidden { - display: none !important; } - -.is-sr-only { - border: none !important; - clip: rect(0, 0, 0, 0) !important; - height: 0.01em !important; - overflow: hidden !important; - padding: 0 !important; - position: absolute !important; - white-space: nowrap !important; - width: 0.01em !important; } - -@media screen and (max-width: 768px) { - .is-hidden-mobile { - display: none !important; } } - -@media screen and (min-width: 769px), print { - .is-hidden-tablet { - display: none !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-hidden-tablet-only { - display: none !important; } } - -@media screen and (max-width: 1055px) { - .is-hidden-touch { - display: none !important; } } - -@media screen and (min-width: 1056px) { - .is-hidden-desktop { - display: none !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-hidden-desktop-only { - display: none !important; } } - -@media screen and (min-width: 1216px) { - .is-hidden-widescreen { - display: none !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-hidden-widescreen-only { - display: none !important; } } - -@media screen and (min-width: 1408px) { - .is-hidden-fullhd { - display: none !important; } } - -.is-invisible { - visibility: hidden !important; } - -@media screen and (max-width: 768px) { - .is-invisible-mobile { - visibility: hidden !important; } } - -@media screen and (min-width: 769px), print { - .is-invisible-tablet { - visibility: hidden !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-invisible-tablet-only { - visibility: hidden !important; } } - -@media screen and (max-width: 1055px) { - .is-invisible-touch { - visibility: hidden !important; } } - -@media screen and (min-width: 1056px) { - .is-invisible-desktop { - visibility: hidden !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-invisible-desktop-only { - visibility: hidden !important; } } - -@media screen and (min-width: 1216px) { - .is-invisible-widescreen { - visibility: hidden !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-invisible-widescreen-only { - visibility: hidden !important; } } - -@media screen and (min-width: 1408px) { - .is-invisible-fullhd { - visibility: hidden !important; } } - -.is-marginless { - margin: 0 !important; } - -.is-paddingless { - padding: 0 !important; } - -.is-radiusless { - border-radius: 0 !important; } - -.is-shadowless { - box-shadow: none !important; } - -.is-relative { - position: relative !important; } - -html.theme--documenter-dark { - /* This file contain the overall layout. - * - * The main container is
that is identified by id #documenter. - */ - /*! +@keyframes spinAround{from{transform:rotate(0deg)}to{transform:rotate(359deg)}}html.theme--documenter-dark .tabs,html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .breadcrumb,html.theme--documenter-dark .file,html.theme--documenter-dark .button,.is-unselectable,html.theme--documenter-dark .modal-close,html.theme--documenter-dark .delete{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after,html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after{border:3px solid rgba(0,0,0,0);border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:0.625em;margin-top:-0.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:0.625em}html.theme--documenter-dark .admonition:not(:last-child),html.theme--documenter-dark .tabs:not(:last-child),html.theme--documenter-dark .message:not(:last-child),html.theme--documenter-dark .list:not(:last-child),html.theme--documenter-dark .level:not(:last-child),html.theme--documenter-dark .breadcrumb:not(:last-child),html.theme--documenter-dark .highlight:not(:last-child),html.theme--documenter-dark .block:not(:last-child),html.theme--documenter-dark .title:not(:last-child),html.theme--documenter-dark .subtitle:not(:last-child),html.theme--documenter-dark .table-container:not(:last-child),html.theme--documenter-dark .table:not(:last-child),html.theme--documenter-dark .progress:not(:last-child),html.theme--documenter-dark .notification:not(:last-child),html.theme--documenter-dark .content:not(:last-child),html.theme--documenter-dark .box:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .modal-close,html.theme--documenter-dark .delete{-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,0.2);border:none;border-radius:290486px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:none;position:relative;vertical-align:top;width:20px}html.theme--documenter-dark .modal-close::before,html.theme--documenter-dark .delete::before,html.theme--documenter-dark .modal-close::after,html.theme--documenter-dark .delete::after{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}html.theme--documenter-dark .modal-close::before,html.theme--documenter-dark .delete::before{height:2px;width:50%}html.theme--documenter-dark .modal-close::after,html.theme--documenter-dark .delete::after{height:50%;width:2px}html.theme--documenter-dark .modal-close:hover,html.theme--documenter-dark .delete:hover,html.theme--documenter-dark .modal-close:focus,html.theme--documenter-dark .delete:focus{background-color:rgba(10,10,10,0.3)}html.theme--documenter-dark .modal-close:active,html.theme--documenter-dark .delete:active{background-color:rgba(10,10,10,0.4)}html.theme--documenter-dark .is-small.modal-close,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.modal-close,html.theme--documenter-dark .is-small.delete,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.delete{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}html.theme--documenter-dark .is-medium.modal-close,html.theme--documenter-dark .is-medium.delete{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}html.theme--documenter-dark .is-large.modal-close,html.theme--documenter-dark .is-large.delete{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}html.theme--documenter-dark .control.is-loading::after,html.theme--documenter-dark .select.is-loading::after,html.theme--documenter-dark .loader,html.theme--documenter-dark .button.is-loading::after{animation:spinAround 500ms infinite linear;border:2px solid #dbdee0;border-radius:290486px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}html.theme--documenter-dark .hero-video,html.theme--documenter-dark .modal-background,html.theme--documenter-dark .modal,html.theme--documenter-dark .image.is-square img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square img,html.theme--documenter-dark .image.is-square .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,html.theme--documenter-dark .image.is-1by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 img,html.theme--documenter-dark .image.is-1by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,html.theme--documenter-dark .image.is-5by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 img,html.theme--documenter-dark .image.is-5by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,html.theme--documenter-dark .image.is-4by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 img,html.theme--documenter-dark .image.is-4by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,html.theme--documenter-dark .image.is-3by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 img,html.theme--documenter-dark .image.is-3by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,html.theme--documenter-dark .image.is-5by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 img,html.theme--documenter-dark .image.is-5by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,html.theme--documenter-dark .image.is-16by9 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 img,html.theme--documenter-dark .image.is-16by9 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,html.theme--documenter-dark .image.is-2by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 img,html.theme--documenter-dark .image.is-2by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,html.theme--documenter-dark .image.is-3by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 img,html.theme--documenter-dark .image.is-3by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,html.theme--documenter-dark .image.is-4by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 img,html.theme--documenter-dark .image.is-4by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,html.theme--documenter-dark .image.is-3by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 img,html.theme--documenter-dark .image.is-3by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,html.theme--documenter-dark .image.is-2by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 img,html.theme--documenter-dark .image.is-2by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,html.theme--documenter-dark .image.is-3by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 img,html.theme--documenter-dark .image.is-3by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,html.theme--documenter-dark .image.is-9by16 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 img,html.theme--documenter-dark .image.is-9by16 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,html.theme--documenter-dark .image.is-1by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 img,html.theme--documenter-dark .image.is-1by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,html.theme--documenter-dark .image.is-1by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 img,html.theme--documenter-dark .image.is-1by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio,.is-overlay{bottom:0;left:0;position:absolute;right:0;top:0}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .file-cta,html.theme--documenter-dark .file-name,html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .button{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:.4em;box-shadow:none;display:inline-flex;font-size:15px;height:2.25em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(0.375em - 1px);padding-left:calc(0.625em - 1px);padding-right:calc(0.625em - 1px);padding-top:calc(0.375em - 1px);position:relative;vertical-align:top}html.theme--documenter-dark .pagination-previous:focus,html.theme--documenter-dark .pagination-next:focus,html.theme--documenter-dark .pagination-link:focus,html.theme--documenter-dark .pagination-ellipsis:focus,html.theme--documenter-dark .file-cta:focus,html.theme--documenter-dark .file-name:focus,html.theme--documenter-dark .select select:focus,html.theme--documenter-dark .textarea:focus,html.theme--documenter-dark .input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:focus,html.theme--documenter-dark .button:focus,html.theme--documenter-dark .is-focused.pagination-previous,html.theme--documenter-dark .is-focused.pagination-next,html.theme--documenter-dark .is-focused.pagination-link,html.theme--documenter-dark .is-focused.pagination-ellipsis,html.theme--documenter-dark .is-focused.file-cta,html.theme--documenter-dark .is-focused.file-name,html.theme--documenter-dark .select select.is-focused,html.theme--documenter-dark .is-focused.textarea,html.theme--documenter-dark .is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-focused.button,html.theme--documenter-dark .pagination-previous:active,html.theme--documenter-dark .pagination-next:active,html.theme--documenter-dark .pagination-link:active,html.theme--documenter-dark .pagination-ellipsis:active,html.theme--documenter-dark .file-cta:active,html.theme--documenter-dark .file-name:active,html.theme--documenter-dark .select select:active,html.theme--documenter-dark .textarea:active,html.theme--documenter-dark .input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:active,html.theme--documenter-dark .button:active,html.theme--documenter-dark .is-active.pagination-previous,html.theme--documenter-dark .is-active.pagination-next,html.theme--documenter-dark .is-active.pagination-link,html.theme--documenter-dark .is-active.pagination-ellipsis,html.theme--documenter-dark .is-active.file-cta,html.theme--documenter-dark .is-active.file-name,html.theme--documenter-dark .select select.is-active,html.theme--documenter-dark .is-active.textarea,html.theme--documenter-dark .is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .is-active.button{outline:none}html.theme--documenter-dark .pagination-previous[disabled],html.theme--documenter-dark .pagination-next[disabled],html.theme--documenter-dark .pagination-link[disabled],html.theme--documenter-dark .pagination-ellipsis[disabled],html.theme--documenter-dark .file-cta[disabled],html.theme--documenter-dark .file-name[disabled],html.theme--documenter-dark .select select[disabled],html.theme--documenter-dark .textarea[disabled],html.theme--documenter-dark .input[disabled],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled],html.theme--documenter-dark .button[disabled],fieldset[disabled] html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark fieldset[disabled] .pagination-previous,fieldset[disabled] html.theme--documenter-dark .pagination-next,html.theme--documenter-dark fieldset[disabled] .pagination-next,fieldset[disabled] html.theme--documenter-dark .pagination-link,html.theme--documenter-dark fieldset[disabled] .pagination-link,fieldset[disabled] html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark fieldset[disabled] .pagination-ellipsis,fieldset[disabled] html.theme--documenter-dark .file-cta,html.theme--documenter-dark fieldset[disabled] .file-cta,fieldset[disabled] html.theme--documenter-dark .file-name,html.theme--documenter-dark fieldset[disabled] .file-name,fieldset[disabled] html.theme--documenter-dark .select select,fieldset[disabled] html.theme--documenter-dark .textarea,fieldset[disabled] html.theme--documenter-dark .input,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark fieldset[disabled] .select select,html.theme--documenter-dark .select fieldset[disabled] select,html.theme--documenter-dark fieldset[disabled] .textarea,html.theme--documenter-dark fieldset[disabled] .input,html.theme--documenter-dark fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar fieldset[disabled] form.docs-search>input,fieldset[disabled] html.theme--documenter-dark .button,html.theme--documenter-dark fieldset[disabled] .button{cursor:not-allowed}/*! minireset.css v0.0.4 | MIT License | github.com/jgthms/minireset.css */html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,embed,iframe,object,video{height:auto;max-width:100%}audio{max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:left}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left !important}.is-pulled-right{float:right !important}.is-clipped{overflow:hidden !important}.is-size-1{font-size:3rem !important}.is-size-2{font-size:2.5rem !important}.is-size-3{font-size:2rem !important}.is-size-4{font-size:1.5rem !important}.is-size-5{font-size:1.25rem !important}.is-size-6{font-size:15px !important}.is-size-7,html.theme--documenter-dark .docstring>section>a.docs-sourcelink{font-size:.85em !important}@media screen and (max-width: 768px){.is-size-1-mobile{font-size:3rem !important}.is-size-2-mobile{font-size:2.5rem !important}.is-size-3-mobile{font-size:2rem !important}.is-size-4-mobile{font-size:1.5rem !important}.is-size-5-mobile{font-size:1.25rem !important}.is-size-6-mobile{font-size:15px !important}.is-size-7-mobile{font-size:.85em !important}}@media screen and (min-width: 769px),print{.is-size-1-tablet{font-size:3rem !important}.is-size-2-tablet{font-size:2.5rem !important}.is-size-3-tablet{font-size:2rem !important}.is-size-4-tablet{font-size:1.5rem !important}.is-size-5-tablet{font-size:1.25rem !important}.is-size-6-tablet{font-size:15px !important}.is-size-7-tablet{font-size:.85em !important}}@media screen and (max-width: 1055px){.is-size-1-touch{font-size:3rem !important}.is-size-2-touch{font-size:2.5rem !important}.is-size-3-touch{font-size:2rem !important}.is-size-4-touch{font-size:1.5rem !important}.is-size-5-touch{font-size:1.25rem !important}.is-size-6-touch{font-size:15px !important}.is-size-7-touch{font-size:.85em !important}}@media screen and (min-width: 1056px){.is-size-1-desktop{font-size:3rem !important}.is-size-2-desktop{font-size:2.5rem !important}.is-size-3-desktop{font-size:2rem !important}.is-size-4-desktop{font-size:1.5rem !important}.is-size-5-desktop{font-size:1.25rem !important}.is-size-6-desktop{font-size:15px !important}.is-size-7-desktop{font-size:.85em !important}}@media screen and (min-width: 1216px){.is-size-1-widescreen{font-size:3rem !important}.is-size-2-widescreen{font-size:2.5rem !important}.is-size-3-widescreen{font-size:2rem !important}.is-size-4-widescreen{font-size:1.5rem !important}.is-size-5-widescreen{font-size:1.25rem !important}.is-size-6-widescreen{font-size:15px !important}.is-size-7-widescreen{font-size:.85em !important}}@media screen and (min-width: 1408px){.is-size-1-fullhd{font-size:3rem !important}.is-size-2-fullhd{font-size:2.5rem !important}.is-size-3-fullhd{font-size:2rem !important}.is-size-4-fullhd{font-size:1.5rem !important}.is-size-5-fullhd{font-size:1.25rem !important}.is-size-6-fullhd{font-size:15px !important}.is-size-7-fullhd{font-size:.85em !important}}.has-text-centered{text-align:center !important}.has-text-justified{text-align:justify !important}.has-text-left{text-align:left !important}.has-text-right{text-align:right !important}@media screen and (max-width: 768px){.has-text-centered-mobile{text-align:center !important}}@media screen and (min-width: 769px),print{.has-text-centered-tablet{text-align:center !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-centered-tablet-only{text-align:center !important}}@media screen and (max-width: 1055px){.has-text-centered-touch{text-align:center !important}}@media screen and (min-width: 1056px){.has-text-centered-desktop{text-align:center !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-centered-desktop-only{text-align:center !important}}@media screen and (min-width: 1216px){.has-text-centered-widescreen{text-align:center !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-centered-widescreen-only{text-align:center !important}}@media screen and (min-width: 1408px){.has-text-centered-fullhd{text-align:center !important}}@media screen and (max-width: 768px){.has-text-justified-mobile{text-align:justify !important}}@media screen and (min-width: 769px),print{.has-text-justified-tablet{text-align:justify !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-justified-tablet-only{text-align:justify !important}}@media screen and (max-width: 1055px){.has-text-justified-touch{text-align:justify !important}}@media screen and (min-width: 1056px){.has-text-justified-desktop{text-align:justify !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-justified-desktop-only{text-align:justify !important}}@media screen and (min-width: 1216px){.has-text-justified-widescreen{text-align:justify !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-justified-widescreen-only{text-align:justify !important}}@media screen and (min-width: 1408px){.has-text-justified-fullhd{text-align:justify !important}}@media screen and (max-width: 768px){.has-text-left-mobile{text-align:left !important}}@media screen and (min-width: 769px),print{.has-text-left-tablet{text-align:left !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-left-tablet-only{text-align:left !important}}@media screen and (max-width: 1055px){.has-text-left-touch{text-align:left !important}}@media screen and (min-width: 1056px){.has-text-left-desktop{text-align:left !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-left-desktop-only{text-align:left !important}}@media screen and (min-width: 1216px){.has-text-left-widescreen{text-align:left !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-left-widescreen-only{text-align:left !important}}@media screen and (min-width: 1408px){.has-text-left-fullhd{text-align:left !important}}@media screen and (max-width: 768px){.has-text-right-mobile{text-align:right !important}}@media screen and (min-width: 769px),print{.has-text-right-tablet{text-align:right !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-right-tablet-only{text-align:right !important}}@media screen and (max-width: 1055px){.has-text-right-touch{text-align:right !important}}@media screen and (min-width: 1056px){.has-text-right-desktop{text-align:right !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-right-desktop-only{text-align:right !important}}@media screen and (min-width: 1216px){.has-text-right-widescreen{text-align:right !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-right-widescreen-only{text-align:right !important}}@media screen and (min-width: 1408px){.has-text-right-fullhd{text-align:right !important}}.is-capitalized{text-transform:capitalize !important}.is-lowercase{text-transform:lowercase !important}.is-uppercase{text-transform:uppercase !important}.is-italic{font-style:italic !important}.has-text-white{color:#fff !important}a.has-text-white:hover,a.has-text-white:focus{color:#e6e6e6 !important}.has-background-white{background-color:#fff !important}.has-text-black{color:#0a0a0a !important}a.has-text-black:hover,a.has-text-black:focus{color:#000 !important}.has-background-black{background-color:#0a0a0a !important}.has-text-light{color:#ecf0f1 !important}a.has-text-light:hover,a.has-text-light:focus{color:#cfd9db !important}.has-background-light{background-color:#ecf0f1 !important}.has-text-dark{color:#282f2f !important}a.has-text-dark:hover,a.has-text-dark:focus{color:#111414 !important}.has-background-dark{background-color:#282f2f !important}.has-text-primary{color:#375a7f !important}a.has-text-primary:hover,a.has-text-primary:focus{color:#28415b !important}.has-background-primary{background-color:#375a7f !important}.has-text-link{color:#1abc9c !important}a.has-text-link:hover,a.has-text-link:focus{color:#148f77 !important}.has-background-link{background-color:#1abc9c !important}.has-text-info{color:#024c7d !important}a.has-text-info:hover,a.has-text-info:focus{color:#012d4b !important}.has-background-info{background-color:#024c7d !important}.has-text-success{color:#008438 !important}a.has-text-success:hover,a.has-text-success:focus{color:#005122 !important}.has-background-success{background-color:#008438 !important}.has-text-warning{color:#ad8100 !important}a.has-text-warning:hover,a.has-text-warning:focus{color:#7a5b00 !important}.has-background-warning{background-color:#ad8100 !important}.has-text-danger{color:#9e1b0d !important}a.has-text-danger:hover,a.has-text-danger:focus{color:#6f1309 !important}.has-background-danger{background-color:#9e1b0d !important}.has-text-black-bis{color:#121212 !important}.has-background-black-bis{background-color:#121212 !important}.has-text-black-ter{color:#242424 !important}.has-background-black-ter{background-color:#242424 !important}.has-text-grey-darker{color:#282f2f !important}.has-background-grey-darker{background-color:#282f2f !important}.has-text-grey-dark{color:#343c3d !important}.has-background-grey-dark{background-color:#343c3d !important}.has-text-grey{color:#5e6d6f !important}.has-background-grey{background-color:#5e6d6f !important}.has-text-grey-light{color:#8c9b9d !important}.has-background-grey-light{background-color:#8c9b9d !important}.has-text-grey-lighter{color:#dbdee0 !important}.has-background-grey-lighter{background-color:#dbdee0 !important}.has-text-white-ter{color:#ecf0f1 !important}.has-background-white-ter{background-color:#ecf0f1 !important}.has-text-white-bis{color:#fafafa !important}.has-background-white-bis{background-color:#fafafa !important}.has-text-weight-light{font-weight:300 !important}.has-text-weight-normal{font-weight:400 !important}.has-text-weight-medium{font-weight:500 !important}.has-text-weight-semibold{font-weight:600 !important}.has-text-weight-bold{font-weight:700 !important}.is-family-primary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-secondary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-sans-serif{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-monospace{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-family-code{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-block{display:block !important}@media screen and (max-width: 768px){.is-block-mobile{display:block !important}}@media screen and (min-width: 769px),print{.is-block-tablet{display:block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-block-tablet-only{display:block !important}}@media screen and (max-width: 1055px){.is-block-touch{display:block !important}}@media screen and (min-width: 1056px){.is-block-desktop{display:block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-block-desktop-only{display:block !important}}@media screen and (min-width: 1216px){.is-block-widescreen{display:block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-block-widescreen-only{display:block !important}}@media screen and (min-width: 1408px){.is-block-fullhd{display:block !important}}.is-flex{display:flex !important}@media screen and (max-width: 768px){.is-flex-mobile{display:flex !important}}@media screen and (min-width: 769px),print{.is-flex-tablet{display:flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-flex-tablet-only{display:flex !important}}@media screen and (max-width: 1055px){.is-flex-touch{display:flex !important}}@media screen and (min-width: 1056px){.is-flex-desktop{display:flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-flex-desktop-only{display:flex !important}}@media screen and (min-width: 1216px){.is-flex-widescreen{display:flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-flex-widescreen-only{display:flex !important}}@media screen and (min-width: 1408px){.is-flex-fullhd{display:flex !important}}.is-inline{display:inline !important}@media screen and (max-width: 768px){.is-inline-mobile{display:inline !important}}@media screen and (min-width: 769px),print{.is-inline-tablet{display:inline !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-tablet-only{display:inline !important}}@media screen and (max-width: 1055px){.is-inline-touch{display:inline !important}}@media screen and (min-width: 1056px){.is-inline-desktop{display:inline !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-desktop-only{display:inline !important}}@media screen and (min-width: 1216px){.is-inline-widescreen{display:inline !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-widescreen-only{display:inline !important}}@media screen and (min-width: 1408px){.is-inline-fullhd{display:inline !important}}.is-inline-block{display:inline-block !important}@media screen and (max-width: 768px){.is-inline-block-mobile{display:inline-block !important}}@media screen and (min-width: 769px),print{.is-inline-block-tablet{display:inline-block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-block-tablet-only{display:inline-block !important}}@media screen and (max-width: 1055px){.is-inline-block-touch{display:inline-block !important}}@media screen and (min-width: 1056px){.is-inline-block-desktop{display:inline-block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-block-desktop-only{display:inline-block !important}}@media screen and (min-width: 1216px){.is-inline-block-widescreen{display:inline-block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-block-widescreen-only{display:inline-block !important}}@media screen and (min-width: 1408px){.is-inline-block-fullhd{display:inline-block !important}}.is-inline-flex{display:inline-flex !important}@media screen and (max-width: 768px){.is-inline-flex-mobile{display:inline-flex !important}}@media screen and (min-width: 769px),print{.is-inline-flex-tablet{display:inline-flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-flex-tablet-only{display:inline-flex !important}}@media screen and (max-width: 1055px){.is-inline-flex-touch{display:inline-flex !important}}@media screen and (min-width: 1056px){.is-inline-flex-desktop{display:inline-flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-flex-desktop-only{display:inline-flex !important}}@media screen and (min-width: 1216px){.is-inline-flex-widescreen{display:inline-flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-flex-widescreen-only{display:inline-flex !important}}@media screen and (min-width: 1408px){.is-inline-flex-fullhd{display:inline-flex !important}}.is-hidden{display:none !important}.is-sr-only{border:none !important;clip:rect(0, 0, 0, 0) !important;height:0.01em !important;overflow:hidden !important;padding:0 !important;position:absolute !important;white-space:nowrap !important;width:0.01em !important}@media screen and (max-width: 768px){.is-hidden-mobile{display:none !important}}@media screen and (min-width: 769px),print{.is-hidden-tablet{display:none !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-hidden-tablet-only{display:none !important}}@media screen and (max-width: 1055px){.is-hidden-touch{display:none !important}}@media screen and (min-width: 1056px){.is-hidden-desktop{display:none !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-hidden-desktop-only{display:none !important}}@media screen and (min-width: 1216px){.is-hidden-widescreen{display:none !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-hidden-widescreen-only{display:none !important}}@media screen and (min-width: 1408px){.is-hidden-fullhd{display:none !important}}.is-invisible{visibility:hidden !important}@media screen and (max-width: 768px){.is-invisible-mobile{visibility:hidden !important}}@media screen and (min-width: 769px),print{.is-invisible-tablet{visibility:hidden !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-invisible-tablet-only{visibility:hidden !important}}@media screen and (max-width: 1055px){.is-invisible-touch{visibility:hidden !important}}@media screen and (min-width: 1056px){.is-invisible-desktop{visibility:hidden !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-invisible-desktop-only{visibility:hidden !important}}@media screen and (min-width: 1216px){.is-invisible-widescreen{visibility:hidden !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-invisible-widescreen-only{visibility:hidden !important}}@media screen and (min-width: 1408px){.is-invisible-fullhd{visibility:hidden !important}}.is-marginless{margin:0 !important}.is-paddingless{padding:0 !important}.is-radiusless{border-radius:0 !important}.is-shadowless{box-shadow:none !important}.is-relative{position:relative !important}html.theme--documenter-dark{/*! Theme: a11y-dark Author: @ericwbailey Maintainer: @ericwbailey Based on the Tomorrow Night Eighties theme: https://github.com/isagalaev/highlight.js/blob/master/src/styles/tomorrow-night-eighties.css -*/ - /* Comment */ - /* Red */ - /* Orange */ - /* Yellow */ - /* Green */ - /* Blue */ - /* Purple */ } - html.theme--documenter-dark html { - background-color: #1f2424; - font-size: 16px; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - min-width: 300px; - overflow-x: auto; - overflow-y: scroll; - text-rendering: optimizeLegibility; - text-size-adjust: 100%; } - html.theme--documenter-dark article, - html.theme--documenter-dark aside, - html.theme--documenter-dark figure, - html.theme--documenter-dark footer, - html.theme--documenter-dark header, - html.theme--documenter-dark hgroup, - html.theme--documenter-dark section { - display: block; } - html.theme--documenter-dark body, - html.theme--documenter-dark button, - html.theme--documenter-dark input, - html.theme--documenter-dark select, - html.theme--documenter-dark textarea { - font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif; } - html.theme--documenter-dark code, - html.theme--documenter-dark pre { - -moz-osx-font-smoothing: auto; - -webkit-font-smoothing: auto; - font-family: "JuliaMono", "SFMono-Regular", "Menlo", "Consolas", "Liberation Mono", "DejaVu Sans Mono", monospace; } - html.theme--documenter-dark body { - color: #fff; - font-size: 1em; - font-weight: 400; - line-height: 1.5; } - html.theme--documenter-dark a { - color: #1abc9c; - cursor: pointer; - text-decoration: none; } - html.theme--documenter-dark a strong { - color: currentColor; } - html.theme--documenter-dark a:hover { - color: #1dd2af; } - html.theme--documenter-dark code { - background-color: rgba(255, 255, 255, 0.05); - color: #ececec; - font-size: 0.875em; - font-weight: normal; - padding: 0.1em; } - html.theme--documenter-dark hr { - background-color: #282f2f; - border: none; - display: block; - height: 2px; - margin: 1.5rem 0; } - html.theme--documenter-dark img { - height: auto; - max-width: 100%; } - html.theme--documenter-dark input[type="checkbox"], - html.theme--documenter-dark input[type="radio"] { - vertical-align: baseline; } - html.theme--documenter-dark small { - font-size: 0.875em; } - html.theme--documenter-dark span { - font-style: inherit; - font-weight: inherit; } - html.theme--documenter-dark strong { - color: #f2f2f2; - font-weight: 700; } - html.theme--documenter-dark fieldset { - border: none; } - html.theme--documenter-dark pre { - -webkit-overflow-scrolling: touch; - background-color: #282f2f; - color: #fff; - font-size: 0.875em; - overflow-x: auto; - padding: 1.25rem 1.5rem; - white-space: pre; - word-wrap: normal; } - html.theme--documenter-dark pre code { - background-color: transparent; - color: currentColor; - font-size: 1em; - padding: 0; } - html.theme--documenter-dark table td, - html.theme--documenter-dark table th { - vertical-align: top; } - html.theme--documenter-dark table td:not([align]), - html.theme--documenter-dark table th:not([align]) { - text-align: left; } - html.theme--documenter-dark table th { - color: #f2f2f2; } - html.theme--documenter-dark .box { - background-color: #343c3d; - border-radius: 8px; - box-shadow: none; - color: #fff; - display: block; - padding: 1.25rem; } - html.theme--documenter-dark a.box:hover, html.theme--documenter-dark a.box:focus { - box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px #1abc9c; } - html.theme--documenter-dark a.box:active { - box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2), 0 0 0 1px #1abc9c; } - html.theme--documenter-dark .button { - background-color: #282f2f; - border-color: #4c5759; - border-width: 1px; - color: #375a7f; - cursor: pointer; - justify-content: center; - padding-bottom: calc(0.375em - 1px); - padding-left: 0.75em; - padding-right: 0.75em; - padding-top: calc(0.375em - 1px); - text-align: center; - white-space: nowrap; } - html.theme--documenter-dark .button strong { - color: inherit; } - html.theme--documenter-dark .button .icon, html.theme--documenter-dark .button .icon.is-small, html.theme--documenter-dark .button #documenter .docs-sidebar form.docs-search > input.icon, html.theme--documenter-dark #documenter .docs-sidebar .button form.docs-search > input.icon, html.theme--documenter-dark .button .icon.is-medium, html.theme--documenter-dark .button .icon.is-large { - height: 1.5em; - width: 1.5em; } - html.theme--documenter-dark .button .icon:first-child:not(:last-child) { - margin-left: calc(-0.375em - 1px); - margin-right: 0.1875em; } - html.theme--documenter-dark .button .icon:last-child:not(:first-child) { - margin-left: 0.1875em; - margin-right: calc(-0.375em - 1px); } - html.theme--documenter-dark .button .icon:first-child:last-child { - margin-left: calc(-0.375em - 1px); - margin-right: calc(-0.375em - 1px); } - html.theme--documenter-dark .button:hover, html.theme--documenter-dark .button.is-hovered { - border-color: #8c9b9d; - color: #f2f2f2; } - html.theme--documenter-dark .button:focus, html.theme--documenter-dark .button.is-focused { - border-color: #8c9b9d; - color: #17a689; } - html.theme--documenter-dark .button:focus:not(:active), html.theme--documenter-dark .button.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(26, 188, 156, 0.25); } - html.theme--documenter-dark .button:active, html.theme--documenter-dark .button.is-active { - border-color: #343c3d; - color: #f2f2f2; } - html.theme--documenter-dark .button.is-text { - background-color: transparent; - border-color: transparent; - color: #fff; - text-decoration: underline; } - html.theme--documenter-dark .button.is-text:hover, html.theme--documenter-dark .button.is-text.is-hovered, html.theme--documenter-dark .button.is-text:focus, html.theme--documenter-dark .button.is-text.is-focused { - background-color: #282f2f; - color: #f2f2f2; } - html.theme--documenter-dark .button.is-text:active, html.theme--documenter-dark .button.is-text.is-active { - background-color: #1d2122; - color: #f2f2f2; } - html.theme--documenter-dark .button.is-text[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-text { - background-color: transparent; - border-color: transparent; - box-shadow: none; } - html.theme--documenter-dark .button.is-white { - background-color: white; - border-color: transparent; - color: #0a0a0a; } - html.theme--documenter-dark .button.is-white:hover, html.theme--documenter-dark .button.is-white.is-hovered { - background-color: #f9f9f9; - border-color: transparent; - color: #0a0a0a; } - html.theme--documenter-dark .button.is-white:focus, html.theme--documenter-dark .button.is-white.is-focused { - border-color: transparent; - color: #0a0a0a; } - html.theme--documenter-dark .button.is-white:focus:not(:active), html.theme--documenter-dark .button.is-white.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } - html.theme--documenter-dark .button.is-white:active, html.theme--documenter-dark .button.is-white.is-active { - background-color: #f2f2f2; - border-color: transparent; - color: #0a0a0a; } - html.theme--documenter-dark .button.is-white[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-white { - background-color: white; - border-color: transparent; - box-shadow: none; } - html.theme--documenter-dark .button.is-white.is-inverted { - background-color: #0a0a0a; - color: white; } - html.theme--documenter-dark .button.is-white.is-inverted:hover, html.theme--documenter-dark .button.is-white.is-inverted.is-hovered { - background-color: black; } - html.theme--documenter-dark .button.is-white.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted { - background-color: #0a0a0a; - border-color: transparent; - box-shadow: none; - color: white; } - html.theme--documenter-dark .button.is-white.is-loading::after { - border-color: transparent transparent #0a0a0a #0a0a0a !important; } - html.theme--documenter-dark .button.is-white.is-outlined { - background-color: transparent; - border-color: white; - color: white; } - html.theme--documenter-dark .button.is-white.is-outlined:hover, html.theme--documenter-dark .button.is-white.is-outlined.is-hovered, html.theme--documenter-dark .button.is-white.is-outlined:focus, html.theme--documenter-dark .button.is-white.is-outlined.is-focused { - background-color: white; - border-color: white; - color: #0a0a0a; } - html.theme--documenter-dark .button.is-white.is-outlined.is-loading::after { - border-color: transparent transparent white white !important; } - html.theme--documenter-dark .button.is-white.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-white.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #0a0a0a #0a0a0a !important; } - html.theme--documenter-dark .button.is-white.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-white.is-outlined { - background-color: transparent; - border-color: white; - box-shadow: none; - color: white; } - html.theme--documenter-dark .button.is-white.is-inverted.is-outlined { - background-color: transparent; - border-color: #0a0a0a; - color: #0a0a0a; } - html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-focused { - background-color: #0a0a0a; - color: white; } - html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent white white !important; } - html.theme--documenter-dark .button.is-white.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted.is-outlined { - background-color: transparent; - border-color: #0a0a0a; - box-shadow: none; - color: #0a0a0a; } - html.theme--documenter-dark .button.is-black { - background-color: #0a0a0a; - border-color: transparent; - color: white; } - html.theme--documenter-dark .button.is-black:hover, html.theme--documenter-dark .button.is-black.is-hovered { - background-color: #040404; - border-color: transparent; - color: white; } - html.theme--documenter-dark .button.is-black:focus, html.theme--documenter-dark .button.is-black.is-focused { - border-color: transparent; - color: white; } - html.theme--documenter-dark .button.is-black:focus:not(:active), html.theme--documenter-dark .button.is-black.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } - html.theme--documenter-dark .button.is-black:active, html.theme--documenter-dark .button.is-black.is-active { - background-color: black; - border-color: transparent; - color: white; } - html.theme--documenter-dark .button.is-black[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-black { - background-color: #0a0a0a; - border-color: transparent; - box-shadow: none; } - html.theme--documenter-dark .button.is-black.is-inverted { - background-color: white; - color: #0a0a0a; } - html.theme--documenter-dark .button.is-black.is-inverted:hover, html.theme--documenter-dark .button.is-black.is-inverted.is-hovered { - background-color: #f2f2f2; } - html.theme--documenter-dark .button.is-black.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted { - background-color: white; - border-color: transparent; - box-shadow: none; - color: #0a0a0a; } - html.theme--documenter-dark .button.is-black.is-loading::after { - border-color: transparent transparent white white !important; } - html.theme--documenter-dark .button.is-black.is-outlined { - background-color: transparent; - border-color: #0a0a0a; - color: #0a0a0a; } - html.theme--documenter-dark .button.is-black.is-outlined:hover, html.theme--documenter-dark .button.is-black.is-outlined.is-hovered, html.theme--documenter-dark .button.is-black.is-outlined:focus, html.theme--documenter-dark .button.is-black.is-outlined.is-focused { - background-color: #0a0a0a; - border-color: #0a0a0a; - color: white; } - html.theme--documenter-dark .button.is-black.is-outlined.is-loading::after { - border-color: transparent transparent #0a0a0a #0a0a0a !important; } - html.theme--documenter-dark .button.is-black.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-black.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent white white !important; } - html.theme--documenter-dark .button.is-black.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-black.is-outlined { - background-color: transparent; - border-color: #0a0a0a; - box-shadow: none; - color: #0a0a0a; } - html.theme--documenter-dark .button.is-black.is-inverted.is-outlined { - background-color: transparent; - border-color: white; - color: white; } - html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-focused { - background-color: white; - color: #0a0a0a; } - html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #0a0a0a #0a0a0a !important; } - html.theme--documenter-dark .button.is-black.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted.is-outlined { - background-color: transparent; - border-color: white; - box-shadow: none; - color: white; } - html.theme--documenter-dark .button.is-light { - background-color: #ecf0f1; - border-color: transparent; - color: #282f2f; } - html.theme--documenter-dark .button.is-light:hover, html.theme--documenter-dark .button.is-light.is-hovered { - background-color: #e5eaec; - border-color: transparent; - color: #282f2f; } - html.theme--documenter-dark .button.is-light:focus, html.theme--documenter-dark .button.is-light.is-focused { - border-color: transparent; - color: #282f2f; } - html.theme--documenter-dark .button.is-light:focus:not(:active), html.theme--documenter-dark .button.is-light.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(236, 240, 241, 0.25); } - html.theme--documenter-dark .button.is-light:active, html.theme--documenter-dark .button.is-light.is-active { - background-color: #dde4e6; - border-color: transparent; - color: #282f2f; } - html.theme--documenter-dark .button.is-light[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-light { - background-color: #ecf0f1; - border-color: transparent; - box-shadow: none; } - html.theme--documenter-dark .button.is-light.is-inverted { - background-color: #282f2f; - color: #ecf0f1; } - html.theme--documenter-dark .button.is-light.is-inverted:hover, html.theme--documenter-dark .button.is-light.is-inverted.is-hovered { - background-color: #1d2122; } - html.theme--documenter-dark .button.is-light.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted { - background-color: #282f2f; - border-color: transparent; - box-shadow: none; - color: #ecf0f1; } - html.theme--documenter-dark .button.is-light.is-loading::after { - border-color: transparent transparent #282f2f #282f2f !important; } - html.theme--documenter-dark .button.is-light.is-outlined { - background-color: transparent; - border-color: #ecf0f1; - color: #ecf0f1; } - html.theme--documenter-dark .button.is-light.is-outlined:hover, html.theme--documenter-dark .button.is-light.is-outlined.is-hovered, html.theme--documenter-dark .button.is-light.is-outlined:focus, html.theme--documenter-dark .button.is-light.is-outlined.is-focused { - background-color: #ecf0f1; - border-color: #ecf0f1; - color: #282f2f; } - html.theme--documenter-dark .button.is-light.is-outlined.is-loading::after { - border-color: transparent transparent #ecf0f1 #ecf0f1 !important; } - html.theme--documenter-dark .button.is-light.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-light.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #282f2f #282f2f !important; } - html.theme--documenter-dark .button.is-light.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-light.is-outlined { - background-color: transparent; - border-color: #ecf0f1; - box-shadow: none; - color: #ecf0f1; } - html.theme--documenter-dark .button.is-light.is-inverted.is-outlined { - background-color: transparent; - border-color: #282f2f; - color: #282f2f; } - html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-focused { - background-color: #282f2f; - color: #ecf0f1; } - html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #ecf0f1 #ecf0f1 !important; } - html.theme--documenter-dark .button.is-light.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted.is-outlined { - background-color: transparent; - border-color: #282f2f; - box-shadow: none; - color: #282f2f; } - html.theme--documenter-dark .button.is-dark, html.theme--documenter-dark .content kbd.button { - background-color: #282f2f; - border-color: transparent; - color: #ecf0f1; } - html.theme--documenter-dark .button.is-dark:hover, html.theme--documenter-dark .content kbd.button:hover, html.theme--documenter-dark .button.is-dark.is-hovered, html.theme--documenter-dark .content kbd.button.is-hovered { - background-color: #232829; - border-color: transparent; - color: #ecf0f1; } - html.theme--documenter-dark .button.is-dark:focus, html.theme--documenter-dark .content kbd.button:focus, html.theme--documenter-dark .button.is-dark.is-focused, html.theme--documenter-dark .content kbd.button.is-focused { - border-color: transparent; - color: #ecf0f1; } - html.theme--documenter-dark .button.is-dark:focus:not(:active), html.theme--documenter-dark .content kbd.button:focus:not(:active), html.theme--documenter-dark .button.is-dark.is-focused:not(:active), html.theme--documenter-dark .content kbd.button.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(40, 47, 47, 0.25); } - html.theme--documenter-dark .button.is-dark:active, html.theme--documenter-dark .content kbd.button:active, html.theme--documenter-dark .button.is-dark.is-active, html.theme--documenter-dark .content kbd.button.is-active { - background-color: #1d2122; - border-color: transparent; - color: #ecf0f1; } - html.theme--documenter-dark .button.is-dark[disabled], html.theme--documenter-dark .content kbd.button[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-dark, fieldset[disabled] html.theme--documenter-dark .content kbd.button { - background-color: #282f2f; - border-color: transparent; - box-shadow: none; } - html.theme--documenter-dark .button.is-dark.is-inverted, html.theme--documenter-dark .content kbd.button.is-inverted { - background-color: #ecf0f1; - color: #282f2f; } - html.theme--documenter-dark .button.is-dark.is-inverted:hover, html.theme--documenter-dark .content kbd.button.is-inverted:hover, html.theme--documenter-dark .button.is-dark.is-inverted.is-hovered, html.theme--documenter-dark .content kbd.button.is-inverted.is-hovered { - background-color: #dde4e6; } - html.theme--documenter-dark .button.is-dark.is-inverted[disabled], html.theme--documenter-dark .content kbd.button.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted, fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted { - background-color: #ecf0f1; - border-color: transparent; - box-shadow: none; - color: #282f2f; } - html.theme--documenter-dark .button.is-dark.is-loading::after, html.theme--documenter-dark .content kbd.button.is-loading::after { - border-color: transparent transparent #ecf0f1 #ecf0f1 !important; } - html.theme--documenter-dark .button.is-dark.is-outlined, html.theme--documenter-dark .content kbd.button.is-outlined { - background-color: transparent; - border-color: #282f2f; - color: #282f2f; } - html.theme--documenter-dark .button.is-dark.is-outlined:hover, html.theme--documenter-dark .content kbd.button.is-outlined:hover, html.theme--documenter-dark .button.is-dark.is-outlined.is-hovered, html.theme--documenter-dark .content kbd.button.is-outlined.is-hovered, html.theme--documenter-dark .button.is-dark.is-outlined:focus, html.theme--documenter-dark .content kbd.button.is-outlined:focus, html.theme--documenter-dark .button.is-dark.is-outlined.is-focused, html.theme--documenter-dark .content kbd.button.is-outlined.is-focused { - background-color: #282f2f; - border-color: #282f2f; - color: #ecf0f1; } - html.theme--documenter-dark .button.is-dark.is-outlined.is-loading::after, html.theme--documenter-dark .content kbd.button.is-outlined.is-loading::after { - border-color: transparent transparent #282f2f #282f2f !important; } - html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:hover::after, html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:focus::after, html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-focused::after, html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #ecf0f1 #ecf0f1 !important; } - html.theme--documenter-dark .button.is-dark.is-outlined[disabled], html.theme--documenter-dark .content kbd.button.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-outlined, fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-outlined { - background-color: transparent; - border-color: #282f2f; - box-shadow: none; - color: #282f2f; } - html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined { - background-color: transparent; - border-color: #ecf0f1; - color: #ecf0f1; } - html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:hover, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:focus, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-focused, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-focused { - background-color: #ecf0f1; - color: #282f2f; } - html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after, html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #282f2f #282f2f !important; } - html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined[disabled], html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined, fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined { - background-color: transparent; - border-color: #ecf0f1; - box-shadow: none; - color: #ecf0f1; } - html.theme--documenter-dark .button.is-primary, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink { - background-color: #375a7f; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-primary:hover, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:hover, html.theme--documenter-dark .button.is-primary.is-hovered, html.theme--documenter-dark .docstring > section > a.button.is-hovered.docs-sourcelink { - background-color: #335476; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-primary:focus, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:focus, html.theme--documenter-dark .button.is-primary.is-focused, html.theme--documenter-dark .docstring > section > a.button.is-focused.docs-sourcelink { - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-primary:focus:not(:active), html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:focus:not(:active), html.theme--documenter-dark .button.is-primary.is-focused:not(:active), html.theme--documenter-dark .docstring > section > a.button.is-focused.docs-sourcelink:not(:active) { - box-shadow: 0 0 0 0.125em rgba(55, 90, 127, 0.25); } - html.theme--documenter-dark .button.is-primary:active, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:active, html.theme--documenter-dark .button.is-primary.is-active, html.theme--documenter-dark .docstring > section > a.button.is-active.docs-sourcelink { - background-color: #2f4d6d; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-primary[disabled], html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-primary, fieldset[disabled] html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink { - background-color: #375a7f; - border-color: transparent; - box-shadow: none; } - html.theme--documenter-dark .button.is-primary.is-inverted, html.theme--documenter-dark .docstring > section > a.button.is-inverted.docs-sourcelink { - background-color: #fff; - color: #375a7f; } - html.theme--documenter-dark .button.is-primary.is-inverted:hover, html.theme--documenter-dark .docstring > section > a.button.is-inverted.docs-sourcelink:hover, html.theme--documenter-dark .button.is-primary.is-inverted.is-hovered, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-hovered.docs-sourcelink { - background-color: #f2f2f2; } - html.theme--documenter-dark .button.is-primary.is-inverted[disabled], html.theme--documenter-dark .docstring > section > a.button.is-inverted.docs-sourcelink[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted, fieldset[disabled] html.theme--documenter-dark .docstring > section > a.button.is-inverted.docs-sourcelink { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #375a7f; } - html.theme--documenter-dark .button.is-primary.is-loading::after, html.theme--documenter-dark .docstring > section > a.button.is-loading.docs-sourcelink::after { - border-color: transparent transparent #fff #fff !important; } - html.theme--documenter-dark .button.is-primary.is-outlined, html.theme--documenter-dark .docstring > section > a.button.is-outlined.docs-sourcelink { - background-color: transparent; - border-color: #375a7f; - color: #375a7f; } - html.theme--documenter-dark .button.is-primary.is-outlined:hover, html.theme--documenter-dark .docstring > section > a.button.is-outlined.docs-sourcelink:hover, html.theme--documenter-dark .button.is-primary.is-outlined.is-hovered, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-hovered.docs-sourcelink, html.theme--documenter-dark .button.is-primary.is-outlined:focus, html.theme--documenter-dark .docstring > section > a.button.is-outlined.docs-sourcelink:focus, html.theme--documenter-dark .button.is-primary.is-outlined.is-focused, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-focused.docs-sourcelink { - background-color: #375a7f; - border-color: #375a7f; - color: #fff; } - html.theme--documenter-dark .button.is-primary.is-outlined.is-loading::after, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-loading.docs-sourcelink::after { - border-color: transparent transparent #375a7f #375a7f !important; } - html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:hover::after, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-loading.docs-sourcelink:hover::after, html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after, html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:focus::after, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-loading.docs-sourcelink:focus::after, html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-focused::after, html.theme--documenter-dark .docstring > section > a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after { - border-color: transparent transparent #fff #fff !important; } - html.theme--documenter-dark .button.is-primary.is-outlined[disabled], html.theme--documenter-dark .docstring > section > a.button.is-outlined.docs-sourcelink[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-outlined, fieldset[disabled] html.theme--documenter-dark .docstring > section > a.button.is-outlined.docs-sourcelink { - background-color: transparent; - border-color: #375a7f; - box-shadow: none; - color: #375a7f; } - html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink { - background-color: transparent; - border-color: #fff; - color: #fff; } - html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:hover, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink:hover, html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink, html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:focus, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink:focus, html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-focused, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.is-focused.docs-sourcelink { - background-color: #fff; - color: #375a7f; } - html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after, html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after, html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after, html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after, html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after { - border-color: transparent transparent #375a7f #375a7f !important; } - html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined[disabled], html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined, fieldset[disabled] html.theme--documenter-dark .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; } - html.theme--documenter-dark .button.is-link { - background-color: #1abc9c; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-link:hover, html.theme--documenter-dark .button.is-link.is-hovered { - background-color: #18b193; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-link:focus, html.theme--documenter-dark .button.is-link.is-focused { - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-link:focus:not(:active), html.theme--documenter-dark .button.is-link.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(26, 188, 156, 0.25); } - html.theme--documenter-dark .button.is-link:active, html.theme--documenter-dark .button.is-link.is-active { - background-color: #17a689; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-link[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-link { - background-color: #1abc9c; - border-color: transparent; - box-shadow: none; } - html.theme--documenter-dark .button.is-link.is-inverted { - background-color: #fff; - color: #1abc9c; } - html.theme--documenter-dark .button.is-link.is-inverted:hover, html.theme--documenter-dark .button.is-link.is-inverted.is-hovered { - background-color: #f2f2f2; } - html.theme--documenter-dark .button.is-link.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #1abc9c; } - html.theme--documenter-dark .button.is-link.is-loading::after { - border-color: transparent transparent #fff #fff !important; } - html.theme--documenter-dark .button.is-link.is-outlined { - background-color: transparent; - border-color: #1abc9c; - color: #1abc9c; } - html.theme--documenter-dark .button.is-link.is-outlined:hover, html.theme--documenter-dark .button.is-link.is-outlined.is-hovered, html.theme--documenter-dark .button.is-link.is-outlined:focus, html.theme--documenter-dark .button.is-link.is-outlined.is-focused { - background-color: #1abc9c; - border-color: #1abc9c; - color: #fff; } - html.theme--documenter-dark .button.is-link.is-outlined.is-loading::after { - border-color: transparent transparent #1abc9c #1abc9c !important; } - html.theme--documenter-dark .button.is-link.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-link.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #fff #fff !important; } - html.theme--documenter-dark .button.is-link.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-link.is-outlined { - background-color: transparent; - border-color: #1abc9c; - box-shadow: none; - color: #1abc9c; } - html.theme--documenter-dark .button.is-link.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff; } - html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-focused { - background-color: #fff; - color: #1abc9c; } - html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #1abc9c #1abc9c !important; } - html.theme--documenter-dark .button.is-link.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; } - html.theme--documenter-dark .button.is-info { - background-color: #024c7d; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-info:hover, html.theme--documenter-dark .button.is-info.is-hovered { - background-color: #024470; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-info:focus, html.theme--documenter-dark .button.is-info.is-focused { - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-info:focus:not(:active), html.theme--documenter-dark .button.is-info.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(2, 76, 125, 0.25); } - html.theme--documenter-dark .button.is-info:active, html.theme--documenter-dark .button.is-info.is-active { - background-color: #023d64; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-info[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-info { - background-color: #024c7d; - border-color: transparent; - box-shadow: none; } - html.theme--documenter-dark .button.is-info.is-inverted { - background-color: #fff; - color: #024c7d; } - html.theme--documenter-dark .button.is-info.is-inverted:hover, html.theme--documenter-dark .button.is-info.is-inverted.is-hovered { - background-color: #f2f2f2; } - html.theme--documenter-dark .button.is-info.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #024c7d; } - html.theme--documenter-dark .button.is-info.is-loading::after { - border-color: transparent transparent #fff #fff !important; } - html.theme--documenter-dark .button.is-info.is-outlined { - background-color: transparent; - border-color: #024c7d; - color: #024c7d; } - html.theme--documenter-dark .button.is-info.is-outlined:hover, html.theme--documenter-dark .button.is-info.is-outlined.is-hovered, html.theme--documenter-dark .button.is-info.is-outlined:focus, html.theme--documenter-dark .button.is-info.is-outlined.is-focused { - background-color: #024c7d; - border-color: #024c7d; - color: #fff; } - html.theme--documenter-dark .button.is-info.is-outlined.is-loading::after { - border-color: transparent transparent #024c7d #024c7d !important; } - html.theme--documenter-dark .button.is-info.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-info.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #fff #fff !important; } - html.theme--documenter-dark .button.is-info.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-info.is-outlined { - background-color: transparent; - border-color: #024c7d; - box-shadow: none; - color: #024c7d; } - html.theme--documenter-dark .button.is-info.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff; } - html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-focused { - background-color: #fff; - color: #024c7d; } - html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #024c7d #024c7d !important; } - html.theme--documenter-dark .button.is-info.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; } - html.theme--documenter-dark .button.is-success { - background-color: #008438; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-success:hover, html.theme--documenter-dark .button.is-success.is-hovered { - background-color: #007733; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-success:focus, html.theme--documenter-dark .button.is-success.is-focused { - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-success:focus:not(:active), html.theme--documenter-dark .button.is-success.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(0, 132, 56, 0.25); } - html.theme--documenter-dark .button.is-success:active, html.theme--documenter-dark .button.is-success.is-active { - background-color: #006b2d; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-success[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-success { - background-color: #008438; - border-color: transparent; - box-shadow: none; } - html.theme--documenter-dark .button.is-success.is-inverted { - background-color: #fff; - color: #008438; } - html.theme--documenter-dark .button.is-success.is-inverted:hover, html.theme--documenter-dark .button.is-success.is-inverted.is-hovered { - background-color: #f2f2f2; } - html.theme--documenter-dark .button.is-success.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #008438; } - html.theme--documenter-dark .button.is-success.is-loading::after { - border-color: transparent transparent #fff #fff !important; } - html.theme--documenter-dark .button.is-success.is-outlined { - background-color: transparent; - border-color: #008438; - color: #008438; } - html.theme--documenter-dark .button.is-success.is-outlined:hover, html.theme--documenter-dark .button.is-success.is-outlined.is-hovered, html.theme--documenter-dark .button.is-success.is-outlined:focus, html.theme--documenter-dark .button.is-success.is-outlined.is-focused { - background-color: #008438; - border-color: #008438; - color: #fff; } - html.theme--documenter-dark .button.is-success.is-outlined.is-loading::after { - border-color: transparent transparent #008438 #008438 !important; } - html.theme--documenter-dark .button.is-success.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-success.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #fff #fff !important; } - html.theme--documenter-dark .button.is-success.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-success.is-outlined { - background-color: transparent; - border-color: #008438; - box-shadow: none; - color: #008438; } - html.theme--documenter-dark .button.is-success.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff; } - html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-focused { - background-color: #fff; - color: #008438; } - html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #008438 #008438 !important; } - html.theme--documenter-dark .button.is-success.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; } - html.theme--documenter-dark .button.is-warning { - background-color: #ad8100; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-warning:hover, html.theme--documenter-dark .button.is-warning.is-hovered { - background-color: #a07700; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-warning:focus, html.theme--documenter-dark .button.is-warning.is-focused { - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-warning:focus:not(:active), html.theme--documenter-dark .button.is-warning.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(173, 129, 0, 0.25); } - html.theme--documenter-dark .button.is-warning:active, html.theme--documenter-dark .button.is-warning.is-active { - background-color: #946e00; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-warning[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-warning { - background-color: #ad8100; - border-color: transparent; - box-shadow: none; } - html.theme--documenter-dark .button.is-warning.is-inverted { - background-color: #fff; - color: #ad8100; } - html.theme--documenter-dark .button.is-warning.is-inverted:hover, html.theme--documenter-dark .button.is-warning.is-inverted.is-hovered { - background-color: #f2f2f2; } - html.theme--documenter-dark .button.is-warning.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #ad8100; } - html.theme--documenter-dark .button.is-warning.is-loading::after { - border-color: transparent transparent #fff #fff !important; } - html.theme--documenter-dark .button.is-warning.is-outlined { - background-color: transparent; - border-color: #ad8100; - color: #ad8100; } - html.theme--documenter-dark .button.is-warning.is-outlined:hover, html.theme--documenter-dark .button.is-warning.is-outlined.is-hovered, html.theme--documenter-dark .button.is-warning.is-outlined:focus, html.theme--documenter-dark .button.is-warning.is-outlined.is-focused { - background-color: #ad8100; - border-color: #ad8100; - color: #fff; } - html.theme--documenter-dark .button.is-warning.is-outlined.is-loading::after { - border-color: transparent transparent #ad8100 #ad8100 !important; } - html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #fff #fff !important; } - html.theme--documenter-dark .button.is-warning.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-outlined { - background-color: transparent; - border-color: #ad8100; - box-shadow: none; - color: #ad8100; } - html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff; } - html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-focused { - background-color: #fff; - color: #ad8100; } - html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #ad8100 #ad8100 !important; } - html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; } - html.theme--documenter-dark .button.is-danger { - background-color: #9e1b0d; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-danger:hover, html.theme--documenter-dark .button.is-danger.is-hovered { - background-color: #92190c; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-danger:focus, html.theme--documenter-dark .button.is-danger.is-focused { - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-danger:focus:not(:active), html.theme--documenter-dark .button.is-danger.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(158, 27, 13, 0.25); } - html.theme--documenter-dark .button.is-danger:active, html.theme--documenter-dark .button.is-danger.is-active { - background-color: #86170b; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .button.is-danger[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-danger { - background-color: #9e1b0d; - border-color: transparent; - box-shadow: none; } - html.theme--documenter-dark .button.is-danger.is-inverted { - background-color: #fff; - color: #9e1b0d; } - html.theme--documenter-dark .button.is-danger.is-inverted:hover, html.theme--documenter-dark .button.is-danger.is-inverted.is-hovered { - background-color: #f2f2f2; } - html.theme--documenter-dark .button.is-danger.is-inverted[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #9e1b0d; } - html.theme--documenter-dark .button.is-danger.is-loading::after { - border-color: transparent transparent #fff #fff !important; } - html.theme--documenter-dark .button.is-danger.is-outlined { - background-color: transparent; - border-color: #9e1b0d; - color: #9e1b0d; } - html.theme--documenter-dark .button.is-danger.is-outlined:hover, html.theme--documenter-dark .button.is-danger.is-outlined.is-hovered, html.theme--documenter-dark .button.is-danger.is-outlined:focus, html.theme--documenter-dark .button.is-danger.is-outlined.is-focused { - background-color: #9e1b0d; - border-color: #9e1b0d; - color: #fff; } - html.theme--documenter-dark .button.is-danger.is-outlined.is-loading::after { - border-color: transparent transparent #9e1b0d #9e1b0d !important; } - html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #fff #fff !important; } - html.theme--documenter-dark .button.is-danger.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-outlined { - background-color: transparent; - border-color: #9e1b0d; - box-shadow: none; - color: #9e1b0d; } - html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff; } - html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:hover, html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-hovered, html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:focus, html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-focused { - background-color: #fff; - color: #9e1b0d; } - html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:hover::after, html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after, html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:focus::after, html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #9e1b0d #9e1b0d !important; } - html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined[disabled], fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; } - html.theme--documenter-dark .button.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.button { - border-radius: 3px; - font-size: 0.85em; } - html.theme--documenter-dark .button.is-normal { - font-size: 15px; } - html.theme--documenter-dark .button.is-medium { - font-size: 1.25rem; } - html.theme--documenter-dark .button.is-large { - font-size: 1.5rem; } - html.theme--documenter-dark .button[disabled], fieldset[disabled] html.theme--documenter-dark .button { - background-color: #8c9b9d; - border-color: #dbdee0; - box-shadow: none; - opacity: 0.5; } - html.theme--documenter-dark .button.is-fullwidth { - display: flex; - width: 100%; } - html.theme--documenter-dark .button.is-loading { - color: transparent !important; - pointer-events: none; } - html.theme--documenter-dark .button.is-loading::after { - position: absolute; - left: calc(50% - (1em / 2)); - top: calc(50% - (1em / 2)); - position: absolute !important; } - html.theme--documenter-dark .button.is-static { - background-color: #282f2f; - border-color: #5e6d6f; - color: #dbdee0; - box-shadow: none; - pointer-events: none; } - html.theme--documenter-dark .button.is-rounded, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.button { - border-radius: 290486px; - padding-left: 1em; - padding-right: 1em; } - html.theme--documenter-dark .buttons { - align-items: center; - display: flex; - flex-wrap: wrap; - justify-content: flex-start; } - html.theme--documenter-dark .buttons .button { - margin-bottom: 0.5rem; } - html.theme--documenter-dark .buttons .button:not(:last-child):not(.is-fullwidth) { - margin-right: 0.5rem; } - html.theme--documenter-dark .buttons:last-child { - margin-bottom: -0.5rem; } - html.theme--documenter-dark .buttons:not(:last-child) { - margin-bottom: 1rem; } - html.theme--documenter-dark .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large) { - border-radius: 3px; - font-size: 0.85em; } - html.theme--documenter-dark .buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large) { - font-size: 1.25rem; } - html.theme--documenter-dark .buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium) { - font-size: 1.5rem; } - html.theme--documenter-dark .buttons.has-addons .button:not(:first-child) { - border-bottom-left-radius: 0; - border-top-left-radius: 0; } - html.theme--documenter-dark .buttons.has-addons .button:not(:last-child) { - border-bottom-right-radius: 0; - border-top-right-radius: 0; - margin-right: -1px; } - html.theme--documenter-dark .buttons.has-addons .button:last-child { - margin-right: 0; } - html.theme--documenter-dark .buttons.has-addons .button:hover, html.theme--documenter-dark .buttons.has-addons .button.is-hovered { - z-index: 2; } - html.theme--documenter-dark .buttons.has-addons .button:focus, html.theme--documenter-dark .buttons.has-addons .button.is-focused, html.theme--documenter-dark .buttons.has-addons .button:active, html.theme--documenter-dark .buttons.has-addons .button.is-active, html.theme--documenter-dark .buttons.has-addons .button.is-selected { - z-index: 3; } - html.theme--documenter-dark .buttons.has-addons .button:focus:hover, html.theme--documenter-dark .buttons.has-addons .button.is-focused:hover, html.theme--documenter-dark .buttons.has-addons .button:active:hover, html.theme--documenter-dark .buttons.has-addons .button.is-active:hover, html.theme--documenter-dark .buttons.has-addons .button.is-selected:hover { - z-index: 4; } - html.theme--documenter-dark .buttons.has-addons .button.is-expanded { - flex-grow: 1; - flex-shrink: 1; } - html.theme--documenter-dark .buttons.is-centered { - justify-content: center; } - html.theme--documenter-dark .buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth) { - margin-left: 0.25rem; - margin-right: 0.25rem; } - html.theme--documenter-dark .buttons.is-right { - justify-content: flex-end; } - html.theme--documenter-dark .buttons.is-right:not(.has-addons) .button:not(.is-fullwidth) { - margin-left: 0.25rem; - margin-right: 0.25rem; } - html.theme--documenter-dark .container { - flex-grow: 1; - margin: 0 auto; - position: relative; - width: auto; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .container { - max-width: 992px; } - html.theme--documenter-dark .container.is-fluid { - margin-left: 32px; - margin-right: 32px; - max-width: none; } } - @media screen and (max-width: 1215px) { - html.theme--documenter-dark .container.is-widescreen { - max-width: 1152px; } } - @media screen and (max-width: 1407px) { - html.theme--documenter-dark .container.is-fullhd { - max-width: 1344px; } } - @media screen and (min-width: 1216px) { - html.theme--documenter-dark .container { - max-width: 1152px; } } - @media screen and (min-width: 1408px) { - html.theme--documenter-dark .container { - max-width: 1344px; } } - html.theme--documenter-dark .content li + li { - margin-top: 0.25em; } - html.theme--documenter-dark .content p:not(:last-child), - html.theme--documenter-dark .content dl:not(:last-child), - html.theme--documenter-dark .content ol:not(:last-child), - html.theme--documenter-dark .content ul:not(:last-child), - html.theme--documenter-dark .content blockquote:not(:last-child), - html.theme--documenter-dark .content pre:not(:last-child), - html.theme--documenter-dark .content table:not(:last-child) { - margin-bottom: 1em; } - html.theme--documenter-dark .content h1, - html.theme--documenter-dark .content h2, - html.theme--documenter-dark .content h3, - html.theme--documenter-dark .content h4, - html.theme--documenter-dark .content h5, - html.theme--documenter-dark .content h6 { - color: #f2f2f2; - font-weight: 600; - line-height: 1.125; } - html.theme--documenter-dark .content h1 { - font-size: 2em; - margin-bottom: 0.5em; } - html.theme--documenter-dark .content h1:not(:first-child) { - margin-top: 1em; } - html.theme--documenter-dark .content h2 { - font-size: 1.75em; - margin-bottom: 0.5714em; } - html.theme--documenter-dark .content h2:not(:first-child) { - margin-top: 1.1428em; } - html.theme--documenter-dark .content h3 { - font-size: 1.5em; - margin-bottom: 0.6666em; } - html.theme--documenter-dark .content h3:not(:first-child) { - margin-top: 1.3333em; } - html.theme--documenter-dark .content h4 { - font-size: 1.25em; - margin-bottom: 0.8em; } - html.theme--documenter-dark .content h5 { - font-size: 1.125em; - margin-bottom: 0.8888em; } - html.theme--documenter-dark .content h6 { - font-size: 1em; - margin-bottom: 1em; } - html.theme--documenter-dark .content blockquote { - background-color: #282f2f; - border-left: 5px solid #5e6d6f; - padding: 1.25em 1.5em; } - html.theme--documenter-dark .content ol { - list-style-position: outside; - margin-left: 2em; - margin-top: 1em; } - html.theme--documenter-dark .content ol:not([type]) { - list-style-type: decimal; } - html.theme--documenter-dark .content ol.is-lower-alpha:not([type]) { - list-style-type: lower-alpha; } - html.theme--documenter-dark .content ol.is-lower-roman:not([type]) { - list-style-type: lower-roman; } - html.theme--documenter-dark .content ol.is-upper-alpha:not([type]) { - list-style-type: upper-alpha; } - html.theme--documenter-dark .content ol.is-upper-roman:not([type]) { - list-style-type: upper-roman; } - html.theme--documenter-dark .content ul { - list-style: disc outside; - margin-left: 2em; - margin-top: 1em; } - html.theme--documenter-dark .content ul ul { - list-style-type: circle; - margin-top: 0.5em; } - html.theme--documenter-dark .content ul ul ul { - list-style-type: square; } - html.theme--documenter-dark .content dd { - margin-left: 2em; } - html.theme--documenter-dark .content figure { - margin-left: 2em; - margin-right: 2em; - text-align: center; } - html.theme--documenter-dark .content figure:not(:first-child) { - margin-top: 2em; } - html.theme--documenter-dark .content figure:not(:last-child) { - margin-bottom: 2em; } - html.theme--documenter-dark .content figure img { - display: inline-block; } - html.theme--documenter-dark .content figure figcaption { - font-style: italic; } - html.theme--documenter-dark .content pre { - -webkit-overflow-scrolling: touch; - overflow-x: auto; - padding: 0; - white-space: pre; - word-wrap: normal; } - html.theme--documenter-dark .content sup, - html.theme--documenter-dark .content sub { - font-size: 75%; } - html.theme--documenter-dark .content table { - width: 100%; } - html.theme--documenter-dark .content table td, - html.theme--documenter-dark .content table th { - border: 1px solid #5e6d6f; - border-width: 0 0 1px; - padding: 0.5em 0.75em; - vertical-align: top; } - html.theme--documenter-dark .content table th { - color: #f2f2f2; } - html.theme--documenter-dark .content table th:not([align]) { - text-align: left; } - html.theme--documenter-dark .content table thead td, - html.theme--documenter-dark .content table thead th { - border-width: 0 0 2px; - color: #f2f2f2; } - html.theme--documenter-dark .content table tfoot td, - html.theme--documenter-dark .content table tfoot th { - border-width: 2px 0 0; - color: #f2f2f2; } - html.theme--documenter-dark .content table tbody tr:last-child td, - html.theme--documenter-dark .content table tbody tr:last-child th { - border-bottom-width: 0; } - html.theme--documenter-dark .content .tabs li + li { - margin-top: 0; } - html.theme--documenter-dark .content.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.content { - font-size: 0.85em; } - html.theme--documenter-dark .content.is-medium { - font-size: 1.25rem; } - html.theme--documenter-dark .content.is-large { - font-size: 1.5rem; } - html.theme--documenter-dark .icon { - align-items: center; - display: inline-flex; - justify-content: center; - height: 1.5rem; - width: 1.5rem; } - html.theme--documenter-dark .icon.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.icon { - height: 1rem; - width: 1rem; } - html.theme--documenter-dark .icon.is-medium { - height: 2rem; - width: 2rem; } - html.theme--documenter-dark .icon.is-large { - height: 3rem; - width: 3rem; } - html.theme--documenter-dark .image, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img { - display: block; - position: relative; } - html.theme--documenter-dark .image img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img img { - display: block; - height: auto; - width: 100%; } - html.theme--documenter-dark .image img.is-rounded, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img img.is-rounded { - border-radius: 290486px; } - html.theme--documenter-dark .image.is-square img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-square img, - html.theme--documenter-dark .image.is-square .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-square .has-ratio, html.theme--documenter-dark .image.is-1by1 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by1 img, - html.theme--documenter-dark .image.is-1by1 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by1 .has-ratio, html.theme--documenter-dark .image.is-5by4 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by4 img, - html.theme--documenter-dark .image.is-5by4 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by4 .has-ratio, html.theme--documenter-dark .image.is-4by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by3 img, - html.theme--documenter-dark .image.is-4by3 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by3 .has-ratio, html.theme--documenter-dark .image.is-3by2 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by2 img, - html.theme--documenter-dark .image.is-3by2 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by2 .has-ratio, html.theme--documenter-dark .image.is-5by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by3 img, - html.theme--documenter-dark .image.is-5by3 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by3 .has-ratio, html.theme--documenter-dark .image.is-16by9 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-16by9 img, - html.theme--documenter-dark .image.is-16by9 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-16by9 .has-ratio, html.theme--documenter-dark .image.is-2by1 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by1 img, - html.theme--documenter-dark .image.is-2by1 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by1 .has-ratio, html.theme--documenter-dark .image.is-3by1 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by1 img, - html.theme--documenter-dark .image.is-3by1 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by1 .has-ratio, html.theme--documenter-dark .image.is-4by5 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by5 img, - html.theme--documenter-dark .image.is-4by5 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by5 .has-ratio, html.theme--documenter-dark .image.is-3by4 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by4 img, - html.theme--documenter-dark .image.is-3by4 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by4 .has-ratio, html.theme--documenter-dark .image.is-2by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by3 img, - html.theme--documenter-dark .image.is-2by3 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by3 .has-ratio, html.theme--documenter-dark .image.is-3by5 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by5 img, - html.theme--documenter-dark .image.is-3by5 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by5 .has-ratio, html.theme--documenter-dark .image.is-9by16 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-9by16 img, - html.theme--documenter-dark .image.is-9by16 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-9by16 .has-ratio, html.theme--documenter-dark .image.is-1by2 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by2 img, - html.theme--documenter-dark .image.is-1by2 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by2 .has-ratio, html.theme--documenter-dark .image.is-1by3 img, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by3 img, - html.theme--documenter-dark .image.is-1by3 .has-ratio, - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by3 .has-ratio { - height: 100%; - width: 100%; } - html.theme--documenter-dark .image.is-square, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-square, html.theme--documenter-dark .image.is-1by1, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by1 { - padding-top: 100%; } - html.theme--documenter-dark .image.is-5by4, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by4 { - padding-top: 80%; } - html.theme--documenter-dark .image.is-4by3, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by3 { - padding-top: 75%; } - html.theme--documenter-dark .image.is-3by2, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by2 { - padding-top: 66.6666%; } - html.theme--documenter-dark .image.is-5by3, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-5by3 { - padding-top: 60%; } - html.theme--documenter-dark .image.is-16by9, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-16by9 { - padding-top: 56.25%; } - html.theme--documenter-dark .image.is-2by1, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by1 { - padding-top: 50%; } - html.theme--documenter-dark .image.is-3by1, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by1 { - padding-top: 33.3333%; } - html.theme--documenter-dark .image.is-4by5, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-4by5 { - padding-top: 125%; } - html.theme--documenter-dark .image.is-3by4, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by4 { - padding-top: 133.3333%; } - html.theme--documenter-dark .image.is-2by3, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-2by3 { - padding-top: 150%; } - html.theme--documenter-dark .image.is-3by5, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-3by5 { - padding-top: 166.6666%; } - html.theme--documenter-dark .image.is-9by16, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-9by16 { - padding-top: 177.7777%; } - html.theme--documenter-dark .image.is-1by2, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by2 { - padding-top: 200%; } - html.theme--documenter-dark .image.is-1by3, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-1by3 { - padding-top: 300%; } - html.theme--documenter-dark .image.is-16x16, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-16x16 { - height: 16px; - width: 16px; } - html.theme--documenter-dark .image.is-24x24, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-24x24 { - height: 24px; - width: 24px; } - html.theme--documenter-dark .image.is-32x32, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-32x32 { - height: 32px; - width: 32px; } - html.theme--documenter-dark .image.is-48x48, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-48x48 { - height: 48px; - width: 48px; } - html.theme--documenter-dark .image.is-64x64, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-64x64 { - height: 64px; - width: 64px; } - html.theme--documenter-dark .image.is-96x96, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-96x96 { - height: 96px; - width: 96px; } - html.theme--documenter-dark .image.is-128x128, html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img.is-128x128 { - height: 128px; - width: 128px; } - html.theme--documenter-dark .notification { - background-color: #282f2f; - border-radius: 0.4em; - padding: 1.25rem 2.5rem 1.25rem 1.5rem; - position: relative; } - html.theme--documenter-dark .notification a:not(.button):not(.dropdown-item) { - color: currentColor; - text-decoration: underline; } - html.theme--documenter-dark .notification strong { - color: currentColor; } - html.theme--documenter-dark .notification code, - html.theme--documenter-dark .notification pre { - background: white; } - html.theme--documenter-dark .notification pre code { - background: transparent; } - html.theme--documenter-dark .notification > .delete { - position: absolute; - right: 0.5rem; - top: 0.5rem; } - html.theme--documenter-dark .notification .title, - html.theme--documenter-dark .notification .subtitle, - html.theme--documenter-dark .notification .content { - color: currentColor; } - html.theme--documenter-dark .notification.is-white { - background-color: white; - color: #0a0a0a; } - html.theme--documenter-dark .notification.is-black { - background-color: #0a0a0a; - color: white; } - html.theme--documenter-dark .notification.is-light { - background-color: #ecf0f1; - color: #282f2f; } - html.theme--documenter-dark .notification.is-dark, html.theme--documenter-dark .content kbd.notification { - background-color: #282f2f; - color: #ecf0f1; } - html.theme--documenter-dark .notification.is-primary, html.theme--documenter-dark .docstring > section > a.notification.docs-sourcelink { - background-color: #375a7f; - color: #fff; } - html.theme--documenter-dark .notification.is-link { - background-color: #1abc9c; - color: #fff; } - html.theme--documenter-dark .notification.is-info { - background-color: #024c7d; - color: #fff; } - html.theme--documenter-dark .notification.is-success { - background-color: #008438; - color: #fff; } - html.theme--documenter-dark .notification.is-warning { - background-color: #ad8100; - color: #fff; } - html.theme--documenter-dark .notification.is-danger { - background-color: #9e1b0d; - color: #fff; } - html.theme--documenter-dark .progress { - -moz-appearance: none; - -webkit-appearance: none; - border: none; - border-radius: 290486px; - display: block; - height: 15px; - overflow: hidden; - padding: 0; - width: 100%; } - html.theme--documenter-dark .progress::-webkit-progress-bar { - background-color: #5e6d6f; } - html.theme--documenter-dark .progress::-webkit-progress-value { - background-color: #dbdee0; } - html.theme--documenter-dark .progress::-moz-progress-bar { - background-color: #dbdee0; } - html.theme--documenter-dark .progress::-ms-fill { - background-color: #dbdee0; - border: none; } - html.theme--documenter-dark .progress.is-white::-webkit-progress-value { - background-color: white; } - html.theme--documenter-dark .progress.is-white::-moz-progress-bar { - background-color: white; } - html.theme--documenter-dark .progress.is-white::-ms-fill { - background-color: white; } - html.theme--documenter-dark .progress.is-white:indeterminate { - background-image: linear-gradient(to right, white 30%, #5e6d6f 30%); } - html.theme--documenter-dark .progress.is-black::-webkit-progress-value { - background-color: #0a0a0a; } - html.theme--documenter-dark .progress.is-black::-moz-progress-bar { - background-color: #0a0a0a; } - html.theme--documenter-dark .progress.is-black::-ms-fill { - background-color: #0a0a0a; } - html.theme--documenter-dark .progress.is-black:indeterminate { - background-image: linear-gradient(to right, #0a0a0a 30%, #5e6d6f 30%); } - html.theme--documenter-dark .progress.is-light::-webkit-progress-value { - background-color: #ecf0f1; } - html.theme--documenter-dark .progress.is-light::-moz-progress-bar { - background-color: #ecf0f1; } - html.theme--documenter-dark .progress.is-light::-ms-fill { - background-color: #ecf0f1; } - html.theme--documenter-dark .progress.is-light:indeterminate { - background-image: linear-gradient(to right, #ecf0f1 30%, #5e6d6f 30%); } - html.theme--documenter-dark .progress.is-dark::-webkit-progress-value, html.theme--documenter-dark .content kbd.progress::-webkit-progress-value { - background-color: #282f2f; } - html.theme--documenter-dark .progress.is-dark::-moz-progress-bar, html.theme--documenter-dark .content kbd.progress::-moz-progress-bar { - background-color: #282f2f; } - html.theme--documenter-dark .progress.is-dark::-ms-fill, html.theme--documenter-dark .content kbd.progress::-ms-fill { - background-color: #282f2f; } - html.theme--documenter-dark .progress.is-dark:indeterminate, html.theme--documenter-dark .content kbd.progress:indeterminate { - background-image: linear-gradient(to right, #282f2f 30%, #5e6d6f 30%); } - html.theme--documenter-dark .progress.is-primary::-webkit-progress-value, html.theme--documenter-dark .docstring > section > a.progress.docs-sourcelink::-webkit-progress-value { - background-color: #375a7f; } - html.theme--documenter-dark .progress.is-primary::-moz-progress-bar, html.theme--documenter-dark .docstring > section > a.progress.docs-sourcelink::-moz-progress-bar { - background-color: #375a7f; } - html.theme--documenter-dark .progress.is-primary::-ms-fill, html.theme--documenter-dark .docstring > section > a.progress.docs-sourcelink::-ms-fill { - background-color: #375a7f; } - html.theme--documenter-dark .progress.is-primary:indeterminate, html.theme--documenter-dark .docstring > section > a.progress.docs-sourcelink:indeterminate { - background-image: linear-gradient(to right, #375a7f 30%, #5e6d6f 30%); } - html.theme--documenter-dark .progress.is-link::-webkit-progress-value { - background-color: #1abc9c; } - html.theme--documenter-dark .progress.is-link::-moz-progress-bar { - background-color: #1abc9c; } - html.theme--documenter-dark .progress.is-link::-ms-fill { - background-color: #1abc9c; } - html.theme--documenter-dark .progress.is-link:indeterminate { - background-image: linear-gradient(to right, #1abc9c 30%, #5e6d6f 30%); } - html.theme--documenter-dark .progress.is-info::-webkit-progress-value { - background-color: #024c7d; } - html.theme--documenter-dark .progress.is-info::-moz-progress-bar { - background-color: #024c7d; } - html.theme--documenter-dark .progress.is-info::-ms-fill { - background-color: #024c7d; } - html.theme--documenter-dark .progress.is-info:indeterminate { - background-image: linear-gradient(to right, #024c7d 30%, #5e6d6f 30%); } - html.theme--documenter-dark .progress.is-success::-webkit-progress-value { - background-color: #008438; } - html.theme--documenter-dark .progress.is-success::-moz-progress-bar { - background-color: #008438; } - html.theme--documenter-dark .progress.is-success::-ms-fill { - background-color: #008438; } - html.theme--documenter-dark .progress.is-success:indeterminate { - background-image: linear-gradient(to right, #008438 30%, #5e6d6f 30%); } - html.theme--documenter-dark .progress.is-warning::-webkit-progress-value { - background-color: #ad8100; } - html.theme--documenter-dark .progress.is-warning::-moz-progress-bar { - background-color: #ad8100; } - html.theme--documenter-dark .progress.is-warning::-ms-fill { - background-color: #ad8100; } - html.theme--documenter-dark .progress.is-warning:indeterminate { - background-image: linear-gradient(to right, #ad8100 30%, #5e6d6f 30%); } - html.theme--documenter-dark .progress.is-danger::-webkit-progress-value { - background-color: #9e1b0d; } - html.theme--documenter-dark .progress.is-danger::-moz-progress-bar { - background-color: #9e1b0d; } - html.theme--documenter-dark .progress.is-danger::-ms-fill { - background-color: #9e1b0d; } - html.theme--documenter-dark .progress.is-danger:indeterminate { - background-image: linear-gradient(to right, #9e1b0d 30%, #5e6d6f 30%); } - html.theme--documenter-dark .progress:indeterminate { - animation-duration: 1.5s; - animation-iteration-count: infinite; - animation-name: moveIndeterminate; - animation-timing-function: linear; - background-color: #5e6d6f; - background-image: linear-gradient(to right, #fff 30%, #5e6d6f 30%); - background-position: top left; - background-repeat: no-repeat; - background-size: 150% 150%; } - html.theme--documenter-dark .progress:indeterminate::-webkit-progress-bar { - background-color: transparent; } - html.theme--documenter-dark .progress:indeterminate::-moz-progress-bar { - background-color: transparent; } - html.theme--documenter-dark .progress.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.progress { - height: 0.85em; } - html.theme--documenter-dark .progress.is-medium { - height: 1.25rem; } - html.theme--documenter-dark .progress.is-large { - height: 1.5rem; } - -@keyframes moveIndeterminate { - from { - background-position: 200% 0; } - to { - background-position: -200% 0; } } - html.theme--documenter-dark .table { - background-color: #343c3d; - color: #fff; } - html.theme--documenter-dark .table td, - html.theme--documenter-dark .table th { - border: 1px solid #5e6d6f; - border-width: 0 0 1px; - padding: 0.5em 0.75em; - vertical-align: top; } - html.theme--documenter-dark .table td.is-white, - html.theme--documenter-dark .table th.is-white { - background-color: white; - border-color: white; - color: #0a0a0a; } - html.theme--documenter-dark .table td.is-black, - html.theme--documenter-dark .table th.is-black { - background-color: #0a0a0a; - border-color: #0a0a0a; - color: white; } - html.theme--documenter-dark .table td.is-light, - html.theme--documenter-dark .table th.is-light { - background-color: #ecf0f1; - border-color: #ecf0f1; - color: #282f2f; } - html.theme--documenter-dark .table td.is-dark, - html.theme--documenter-dark .table th.is-dark { - background-color: #282f2f; - border-color: #282f2f; - color: #ecf0f1; } - html.theme--documenter-dark .table td.is-primary, - html.theme--documenter-dark .table th.is-primary { - background-color: #375a7f; - border-color: #375a7f; - color: #fff; } - html.theme--documenter-dark .table td.is-link, - html.theme--documenter-dark .table th.is-link { - background-color: #1abc9c; - border-color: #1abc9c; - color: #fff; } - html.theme--documenter-dark .table td.is-info, - html.theme--documenter-dark .table th.is-info { - background-color: #024c7d; - border-color: #024c7d; - color: #fff; } - html.theme--documenter-dark .table td.is-success, - html.theme--documenter-dark .table th.is-success { - background-color: #008438; - border-color: #008438; - color: #fff; } - html.theme--documenter-dark .table td.is-warning, - html.theme--documenter-dark .table th.is-warning { - background-color: #ad8100; - border-color: #ad8100; - color: #fff; } - html.theme--documenter-dark .table td.is-danger, - html.theme--documenter-dark .table th.is-danger { - background-color: #9e1b0d; - border-color: #9e1b0d; - color: #fff; } - html.theme--documenter-dark .table td.is-narrow, - html.theme--documenter-dark .table th.is-narrow { - white-space: nowrap; - width: 1%; } - html.theme--documenter-dark .table td.is-selected, - html.theme--documenter-dark .table th.is-selected { - background-color: #375a7f; - color: #fff; } - html.theme--documenter-dark .table td.is-selected a, - html.theme--documenter-dark .table td.is-selected strong, - html.theme--documenter-dark .table th.is-selected a, - html.theme--documenter-dark .table th.is-selected strong { - color: currentColor; } - html.theme--documenter-dark .table th { - color: #f2f2f2; } - html.theme--documenter-dark .table th:not([align]) { - text-align: left; } - html.theme--documenter-dark .table tr.is-selected { - background-color: #375a7f; - color: #fff; } - html.theme--documenter-dark .table tr.is-selected a, - html.theme--documenter-dark .table tr.is-selected strong { - color: currentColor; } - html.theme--documenter-dark .table tr.is-selected td, - html.theme--documenter-dark .table tr.is-selected th { - border-color: #fff; - color: currentColor; } - html.theme--documenter-dark .table thead { - background-color: transparent; } - html.theme--documenter-dark .table thead td, - html.theme--documenter-dark .table thead th { - border-width: 0 0 2px; - color: #f2f2f2; } - html.theme--documenter-dark .table tfoot { - background-color: transparent; } - html.theme--documenter-dark .table tfoot td, - html.theme--documenter-dark .table tfoot th { - border-width: 2px 0 0; - color: #f2f2f2; } - html.theme--documenter-dark .table tbody { - background-color: transparent; } - html.theme--documenter-dark .table tbody tr:last-child td, - html.theme--documenter-dark .table tbody tr:last-child th { - border-bottom-width: 0; } - html.theme--documenter-dark .table.is-bordered td, - html.theme--documenter-dark .table.is-bordered th { - border-width: 1px; } - html.theme--documenter-dark .table.is-bordered tr:last-child td, - html.theme--documenter-dark .table.is-bordered tr:last-child th { - border-bottom-width: 1px; } - html.theme--documenter-dark .table.is-fullwidth { - width: 100%; } - html.theme--documenter-dark .table.is-hoverable tbody tr:not(.is-selected):hover { - background-color: #282f2f; } - html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover { - background-color: #282f2f; } - html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even) { - background-color: #2d3435; } - html.theme--documenter-dark .table.is-narrow td, - html.theme--documenter-dark .table.is-narrow th { - padding: 0.25em 0.5em; } - html.theme--documenter-dark .table.is-striped tbody tr:not(.is-selected):nth-child(even) { - background-color: #282f2f; } - html.theme--documenter-dark .table-container { - -webkit-overflow-scrolling: touch; - overflow: auto; - overflow-y: hidden; - max-width: 100%; } - html.theme--documenter-dark .tags { - align-items: center; - display: flex; - flex-wrap: wrap; - justify-content: flex-start; } - html.theme--documenter-dark .tags .tag, html.theme--documenter-dark .tags .content kbd, html.theme--documenter-dark .content .tags kbd, html.theme--documenter-dark .tags .docstring > section > a.docs-sourcelink { - margin-bottom: 0.5rem; } - html.theme--documenter-dark .tags .tag:not(:last-child), html.theme--documenter-dark .tags .content kbd:not(:last-child), html.theme--documenter-dark .content .tags kbd:not(:last-child), html.theme--documenter-dark .tags .docstring > section > a.docs-sourcelink:not(:last-child) { - margin-right: 0.5rem; } - html.theme--documenter-dark .tags:last-child { - margin-bottom: -0.5rem; } - html.theme--documenter-dark .tags:not(:last-child) { - margin-bottom: 1rem; } - html.theme--documenter-dark .tags.are-medium .tag:not(.is-normal):not(.is-large), html.theme--documenter-dark .tags.are-medium .content kbd:not(.is-normal):not(.is-large), html.theme--documenter-dark .content .tags.are-medium kbd:not(.is-normal):not(.is-large), html.theme--documenter-dark .tags.are-medium .docstring > section > a.docs-sourcelink:not(.is-normal):not(.is-large) { - font-size: 15px; } - html.theme--documenter-dark .tags.are-large .tag:not(.is-normal):not(.is-medium), html.theme--documenter-dark .tags.are-large .content kbd:not(.is-normal):not(.is-medium), html.theme--documenter-dark .content .tags.are-large kbd:not(.is-normal):not(.is-medium), html.theme--documenter-dark .tags.are-large .docstring > section > a.docs-sourcelink:not(.is-normal):not(.is-medium) { - font-size: 1.25rem; } - html.theme--documenter-dark .tags.is-centered { - justify-content: center; } - html.theme--documenter-dark .tags.is-centered .tag, html.theme--documenter-dark .tags.is-centered .content kbd, html.theme--documenter-dark .content .tags.is-centered kbd, html.theme--documenter-dark .tags.is-centered .docstring > section > a.docs-sourcelink { - margin-right: 0.25rem; - margin-left: 0.25rem; } - html.theme--documenter-dark .tags.is-right { - justify-content: flex-end; } - html.theme--documenter-dark .tags.is-right .tag:not(:first-child), html.theme--documenter-dark .tags.is-right .content kbd:not(:first-child), html.theme--documenter-dark .content .tags.is-right kbd:not(:first-child), html.theme--documenter-dark .tags.is-right .docstring > section > a.docs-sourcelink:not(:first-child) { - margin-left: 0.5rem; } - html.theme--documenter-dark .tags.is-right .tag:not(:last-child), html.theme--documenter-dark .tags.is-right .content kbd:not(:last-child), html.theme--documenter-dark .content .tags.is-right kbd:not(:last-child), html.theme--documenter-dark .tags.is-right .docstring > section > a.docs-sourcelink:not(:last-child) { - margin-right: 0; } - html.theme--documenter-dark .tags.has-addons .tag, html.theme--documenter-dark .tags.has-addons .content kbd, html.theme--documenter-dark .content .tags.has-addons kbd, html.theme--documenter-dark .tags.has-addons .docstring > section > a.docs-sourcelink { - margin-right: 0; } - html.theme--documenter-dark .tags.has-addons .tag:not(:first-child), html.theme--documenter-dark .tags.has-addons .content kbd:not(:first-child), html.theme--documenter-dark .content .tags.has-addons kbd:not(:first-child), html.theme--documenter-dark .tags.has-addons .docstring > section > a.docs-sourcelink:not(:first-child) { - margin-left: 0; - border-bottom-left-radius: 0; - border-top-left-radius: 0; } - html.theme--documenter-dark .tags.has-addons .tag:not(:last-child), html.theme--documenter-dark .tags.has-addons .content kbd:not(:last-child), html.theme--documenter-dark .content .tags.has-addons kbd:not(:last-child), html.theme--documenter-dark .tags.has-addons .docstring > section > a.docs-sourcelink:not(:last-child) { - border-bottom-right-radius: 0; - border-top-right-radius: 0; } - html.theme--documenter-dark .tag:not(body), html.theme--documenter-dark .content kbd:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink:not(body) { - align-items: center; - background-color: #282f2f; - border-radius: 0.4em; - color: #fff; - display: inline-flex; - font-size: 0.85em; - height: 2em; - justify-content: center; - line-height: 1.5; - padding-left: 0.75em; - padding-right: 0.75em; - white-space: nowrap; } - html.theme--documenter-dark .tag:not(body) .delete, html.theme--documenter-dark .content kbd:not(body) .delete, html.theme--documenter-dark .docstring > section > a.docs-sourcelink:not(body) .delete { - margin-left: 0.25rem; - margin-right: -0.375rem; } - html.theme--documenter-dark .tag.is-white:not(body), html.theme--documenter-dark .content kbd.is-white:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-white:not(body) { - background-color: white; - color: #0a0a0a; } - html.theme--documenter-dark .tag.is-black:not(body), html.theme--documenter-dark .content kbd.is-black:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-black:not(body) { - background-color: #0a0a0a; - color: white; } - html.theme--documenter-dark .tag.is-light:not(body), html.theme--documenter-dark .content kbd.is-light:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-light:not(body) { - background-color: #ecf0f1; - color: #282f2f; } - html.theme--documenter-dark .tag.is-dark:not(body), html.theme--documenter-dark .content kbd:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-dark:not(body), html.theme--documenter-dark .content .docstring > section > kbd:not(body) { - background-color: #282f2f; - color: #ecf0f1; } - html.theme--documenter-dark .tag.is-primary:not(body), html.theme--documenter-dark .content kbd.is-primary:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink:not(body) { - background-color: #375a7f; - color: #fff; } - html.theme--documenter-dark .tag.is-link:not(body), html.theme--documenter-dark .content kbd.is-link:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-link:not(body) { - background-color: #1abc9c; - color: #fff; } - html.theme--documenter-dark .tag.is-info:not(body), html.theme--documenter-dark .content kbd.is-info:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-info:not(body) { - background-color: #024c7d; - color: #fff; } - html.theme--documenter-dark .tag.is-success:not(body), html.theme--documenter-dark .content kbd.is-success:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-success:not(body) { - background-color: #008438; - color: #fff; } - html.theme--documenter-dark .tag.is-warning:not(body), html.theme--documenter-dark .content kbd.is-warning:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-warning:not(body) { - background-color: #ad8100; - color: #fff; } - html.theme--documenter-dark .tag.is-danger:not(body), html.theme--documenter-dark .content kbd.is-danger:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-danger:not(body) { - background-color: #9e1b0d; - color: #fff; } - html.theme--documenter-dark .tag.is-normal:not(body), html.theme--documenter-dark .content kbd.is-normal:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-normal:not(body) { - font-size: 0.85em; } - html.theme--documenter-dark .tag.is-medium:not(body), html.theme--documenter-dark .content kbd.is-medium:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-medium:not(body) { - font-size: 15px; } - html.theme--documenter-dark .tag.is-large:not(body), html.theme--documenter-dark .content kbd.is-large:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-large:not(body) { - font-size: 1.25rem; } - html.theme--documenter-dark .tag:not(body) .icon:first-child:not(:last-child), html.theme--documenter-dark .content kbd:not(body) .icon:first-child:not(:last-child), html.theme--documenter-dark .docstring > section > a.docs-sourcelink:not(body) .icon:first-child:not(:last-child) { - margin-left: -0.375em; - margin-right: 0.1875em; } - html.theme--documenter-dark .tag:not(body) .icon:last-child:not(:first-child), html.theme--documenter-dark .content kbd:not(body) .icon:last-child:not(:first-child), html.theme--documenter-dark .docstring > section > a.docs-sourcelink:not(body) .icon:last-child:not(:first-child) { - margin-left: 0.1875em; - margin-right: -0.375em; } - html.theme--documenter-dark .tag:not(body) .icon:first-child:last-child, html.theme--documenter-dark .content kbd:not(body) .icon:first-child:last-child, html.theme--documenter-dark .docstring > section > a.docs-sourcelink:not(body) .icon:first-child:last-child { - margin-left: -0.375em; - margin-right: -0.375em; } - html.theme--documenter-dark .tag.is-delete:not(body), html.theme--documenter-dark .content kbd.is-delete:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body) { - margin-left: 1px; - padding: 0; - position: relative; - width: 2em; } - html.theme--documenter-dark .tag.is-delete:not(body)::before, html.theme--documenter-dark .content kbd.is-delete:not(body)::before, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body)::before, html.theme--documenter-dark .tag.is-delete:not(body)::after, html.theme--documenter-dark .content kbd.is-delete:not(body)::after, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body)::after { - background-color: currentColor; - content: ""; - display: block; - left: 50%; - position: absolute; - top: 50%; - transform: translateX(-50%) translateY(-50%) rotate(45deg); - transform-origin: center center; } - html.theme--documenter-dark .tag.is-delete:not(body)::before, html.theme--documenter-dark .content kbd.is-delete:not(body)::before, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body)::before { - height: 1px; - width: 50%; } - html.theme--documenter-dark .tag.is-delete:not(body)::after, html.theme--documenter-dark .content kbd.is-delete:not(body)::after, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body)::after { - height: 50%; - width: 1px; } - html.theme--documenter-dark .tag.is-delete:not(body):hover, html.theme--documenter-dark .content kbd.is-delete:not(body):hover, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body):hover, html.theme--documenter-dark .tag.is-delete:not(body):focus, html.theme--documenter-dark .content kbd.is-delete:not(body):focus, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body):focus { - background-color: #1d2122; } - html.theme--documenter-dark .tag.is-delete:not(body):active, html.theme--documenter-dark .content kbd.is-delete:not(body):active, html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-delete:not(body):active { - background-color: #111414; } - html.theme--documenter-dark .tag.is-rounded:not(body), html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:not(body), html.theme--documenter-dark .content kbd.is-rounded:not(body), html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search > input:not(body), html.theme--documenter-dark .docstring > section > a.docs-sourcelink.is-rounded:not(body) { - border-radius: 290486px; } - html.theme--documenter-dark a.tag:hover, html.theme--documenter-dark .docstring > section > a.docs-sourcelink:hover { - text-decoration: underline; } - html.theme--documenter-dark .title, - html.theme--documenter-dark .subtitle { - word-break: break-word; } - html.theme--documenter-dark .title em, - html.theme--documenter-dark .title span, - html.theme--documenter-dark .subtitle em, - html.theme--documenter-dark .subtitle span { - font-weight: inherit; } - html.theme--documenter-dark .title sub, - html.theme--documenter-dark .subtitle sub { - font-size: 0.75em; } - html.theme--documenter-dark .title sup, - html.theme--documenter-dark .subtitle sup { - font-size: 0.75em; } - html.theme--documenter-dark .title .tag, html.theme--documenter-dark .title .content kbd, html.theme--documenter-dark .content .title kbd, html.theme--documenter-dark .title .docstring > section > a.docs-sourcelink, - html.theme--documenter-dark .subtitle .tag, - html.theme--documenter-dark .subtitle .content kbd, - html.theme--documenter-dark .content .subtitle kbd, - html.theme--documenter-dark .subtitle .docstring > section > a.docs-sourcelink { - vertical-align: middle; } - html.theme--documenter-dark .title { - color: #fff; - font-size: 2rem; - font-weight: 500; - line-height: 1.125; } - html.theme--documenter-dark .title strong { - color: inherit; - font-weight: inherit; } - html.theme--documenter-dark .title + .highlight { - margin-top: -0.75rem; } - html.theme--documenter-dark .title:not(.is-spaced) + .subtitle { - margin-top: -1.25rem; } - html.theme--documenter-dark .title.is-1 { - font-size: 3rem; } - html.theme--documenter-dark .title.is-2 { - font-size: 2.5rem; } - html.theme--documenter-dark .title.is-3 { - font-size: 2rem; } - html.theme--documenter-dark .title.is-4 { - font-size: 1.5rem; } - html.theme--documenter-dark .title.is-5 { - font-size: 1.25rem; } - html.theme--documenter-dark .title.is-6 { - font-size: 15px; } - html.theme--documenter-dark .title.is-7 { - font-size: 0.85em; } - html.theme--documenter-dark .subtitle { - color: #8c9b9d; - font-size: 1.25rem; - font-weight: 400; - line-height: 1.25; } - html.theme--documenter-dark .subtitle strong { - color: #8c9b9d; - font-weight: 600; } - html.theme--documenter-dark .subtitle:not(.is-spaced) + .title { - margin-top: -1.25rem; } - html.theme--documenter-dark .subtitle.is-1 { - font-size: 3rem; } - html.theme--documenter-dark .subtitle.is-2 { - font-size: 2.5rem; } - html.theme--documenter-dark .subtitle.is-3 { - font-size: 2rem; } - html.theme--documenter-dark .subtitle.is-4 { - font-size: 1.5rem; } - html.theme--documenter-dark .subtitle.is-5 { - font-size: 1.25rem; } - html.theme--documenter-dark .subtitle.is-6 { - font-size: 15px; } - html.theme--documenter-dark .subtitle.is-7 { - font-size: 0.85em; } - html.theme--documenter-dark .heading { - display: block; - font-size: 11px; - letter-spacing: 1px; - margin-bottom: 5px; - text-transform: uppercase; } - html.theme--documenter-dark .highlight { - font-weight: 400; - max-width: 100%; - overflow: hidden; - padding: 0; } - html.theme--documenter-dark .highlight pre { - overflow: auto; - max-width: 100%; } - html.theme--documenter-dark .number { - align-items: center; - background-color: #282f2f; - border-radius: 290486px; - display: inline-flex; - font-size: 1.25rem; - height: 2em; - justify-content: center; - margin-right: 1.5rem; - min-width: 2.5em; - padding: 0.25rem 0.5rem; - text-align: center; - vertical-align: top; } - html.theme--documenter-dark .select select, html.theme--documenter-dark .textarea, html.theme--documenter-dark .input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input { - background-color: #1f2424; - border-color: #5e6d6f; - border-radius: 0.4em; - color: #dbdee0; } - html.theme--documenter-dark .select select::-moz-placeholder, html.theme--documenter-dark .textarea::-moz-placeholder, html.theme--documenter-dark .input::-moz-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input::-moz-placeholder { - color: rgba(219, 222, 224, 0.3); } - html.theme--documenter-dark .select select::-webkit-input-placeholder, html.theme--documenter-dark .textarea::-webkit-input-placeholder, html.theme--documenter-dark .input::-webkit-input-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input::-webkit-input-placeholder { - color: rgba(219, 222, 224, 0.3); } - html.theme--documenter-dark .select select:-moz-placeholder, html.theme--documenter-dark .textarea:-moz-placeholder, html.theme--documenter-dark .input:-moz-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:-moz-placeholder { - color: rgba(219, 222, 224, 0.3); } - html.theme--documenter-dark .select select:-ms-input-placeholder, html.theme--documenter-dark .textarea:-ms-input-placeholder, html.theme--documenter-dark .input:-ms-input-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:-ms-input-placeholder { - color: rgba(219, 222, 224, 0.3); } - html.theme--documenter-dark .select select:hover, html.theme--documenter-dark .textarea:hover, html.theme--documenter-dark .input:hover, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:hover, html.theme--documenter-dark .select select.is-hovered, html.theme--documenter-dark .is-hovered.textarea, html.theme--documenter-dark .is-hovered.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-hovered { - border-color: #8c9b9d; } - html.theme--documenter-dark .select select:focus, html.theme--documenter-dark .textarea:focus, html.theme--documenter-dark .input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:focus, html.theme--documenter-dark .select select.is-focused, html.theme--documenter-dark .is-focused.textarea, html.theme--documenter-dark .is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .select select:active, html.theme--documenter-dark .textarea:active, html.theme--documenter-dark .input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:active, html.theme--documenter-dark .select select.is-active, html.theme--documenter-dark .is-active.textarea, html.theme--documenter-dark .is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { - border-color: #1abc9c; - box-shadow: 0 0 0 0.125em rgba(26, 188, 156, 0.25); } - html.theme--documenter-dark .select select[disabled], html.theme--documenter-dark .textarea[disabled], html.theme--documenter-dark .input[disabled], html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[disabled], fieldset[disabled] html.theme--documenter-dark .select select, fieldset[disabled] html.theme--documenter-dark .textarea, fieldset[disabled] html.theme--documenter-dark .input, fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input { - background-color: #8c9b9d; - border-color: #282f2f; - box-shadow: none; - color: white; } - html.theme--documenter-dark .select select[disabled]::-moz-placeholder, html.theme--documenter-dark .textarea[disabled]::-moz-placeholder, html.theme--documenter-dark .input[disabled]::-moz-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[disabled]::-moz-placeholder, fieldset[disabled] html.theme--documenter-dark .select select::-moz-placeholder, fieldset[disabled] html.theme--documenter-dark .textarea::-moz-placeholder, fieldset[disabled] html.theme--documenter-dark .input::-moz-placeholder, fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input::-moz-placeholder { - color: rgba(255, 255, 255, 0.3); } - html.theme--documenter-dark .select select[disabled]::-webkit-input-placeholder, html.theme--documenter-dark .textarea[disabled]::-webkit-input-placeholder, html.theme--documenter-dark .input[disabled]::-webkit-input-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[disabled]::-webkit-input-placeholder, fieldset[disabled] html.theme--documenter-dark .select select::-webkit-input-placeholder, fieldset[disabled] html.theme--documenter-dark .textarea::-webkit-input-placeholder, fieldset[disabled] html.theme--documenter-dark .input::-webkit-input-placeholder, fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input::-webkit-input-placeholder { - color: rgba(255, 255, 255, 0.3); } - html.theme--documenter-dark .select select[disabled]:-moz-placeholder, html.theme--documenter-dark .textarea[disabled]:-moz-placeholder, html.theme--documenter-dark .input[disabled]:-moz-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[disabled]:-moz-placeholder, fieldset[disabled] html.theme--documenter-dark .select select:-moz-placeholder, fieldset[disabled] html.theme--documenter-dark .textarea:-moz-placeholder, fieldset[disabled] html.theme--documenter-dark .input:-moz-placeholder, fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:-moz-placeholder { - color: rgba(255, 255, 255, 0.3); } - html.theme--documenter-dark .select select[disabled]:-ms-input-placeholder, html.theme--documenter-dark .textarea[disabled]:-ms-input-placeholder, html.theme--documenter-dark .input[disabled]:-ms-input-placeholder, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[disabled]:-ms-input-placeholder, fieldset[disabled] html.theme--documenter-dark .select select:-ms-input-placeholder, fieldset[disabled] html.theme--documenter-dark .textarea:-ms-input-placeholder, fieldset[disabled] html.theme--documenter-dark .input:-ms-input-placeholder, fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input:-ms-input-placeholder { - color: rgba(255, 255, 255, 0.3); } - html.theme--documenter-dark .textarea, html.theme--documenter-dark .input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input { - box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.1); - max-width: 100%; - width: 100%; } - html.theme--documenter-dark .textarea[readonly], html.theme--documenter-dark .input[readonly], html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input[readonly] { - box-shadow: none; } - html.theme--documenter-dark .is-white.textarea, html.theme--documenter-dark .is-white.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-white { - border-color: white; } - html.theme--documenter-dark .is-white.textarea:focus, html.theme--documenter-dark .is-white.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-white:focus, html.theme--documenter-dark .is-white.is-focused.textarea, html.theme--documenter-dark .is-white.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-white.textarea:active, html.theme--documenter-dark .is-white.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-white:active, html.theme--documenter-dark .is-white.is-active.textarea, html.theme--documenter-dark .is-white.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } - html.theme--documenter-dark .is-black.textarea, html.theme--documenter-dark .is-black.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-black { - border-color: #0a0a0a; } - html.theme--documenter-dark .is-black.textarea:focus, html.theme--documenter-dark .is-black.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-black:focus, html.theme--documenter-dark .is-black.is-focused.textarea, html.theme--documenter-dark .is-black.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-black.textarea:active, html.theme--documenter-dark .is-black.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-black:active, html.theme--documenter-dark .is-black.is-active.textarea, html.theme--documenter-dark .is-black.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } - html.theme--documenter-dark .is-light.textarea, html.theme--documenter-dark .is-light.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-light { - border-color: #ecf0f1; } - html.theme--documenter-dark .is-light.textarea:focus, html.theme--documenter-dark .is-light.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-light:focus, html.theme--documenter-dark .is-light.is-focused.textarea, html.theme--documenter-dark .is-light.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-light.textarea:active, html.theme--documenter-dark .is-light.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-light:active, html.theme--documenter-dark .is-light.is-active.textarea, html.theme--documenter-dark .is-light.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(236, 240, 241, 0.25); } - html.theme--documenter-dark .is-dark.textarea, html.theme--documenter-dark .content kbd.textarea, html.theme--documenter-dark .is-dark.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-dark, html.theme--documenter-dark .content kbd.input { - border-color: #282f2f; } - html.theme--documenter-dark .is-dark.textarea:focus, html.theme--documenter-dark .content kbd.textarea:focus, html.theme--documenter-dark .is-dark.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-dark:focus, html.theme--documenter-dark .content kbd.input:focus, html.theme--documenter-dark .is-dark.is-focused.textarea, html.theme--documenter-dark .content kbd.is-focused.textarea, html.theme--documenter-dark .is-dark.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .content kbd.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search > input.is-focused, html.theme--documenter-dark .is-dark.textarea:active, html.theme--documenter-dark .content kbd.textarea:active, html.theme--documenter-dark .is-dark.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-dark:active, html.theme--documenter-dark .content kbd.input:active, html.theme--documenter-dark .is-dark.is-active.textarea, html.theme--documenter-dark .content kbd.is-active.textarea, html.theme--documenter-dark .is-dark.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active, html.theme--documenter-dark .content kbd.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(40, 47, 47, 0.25); } - html.theme--documenter-dark .is-primary.textarea, html.theme--documenter-dark .docstring > section > a.textarea.docs-sourcelink, html.theme--documenter-dark .is-primary.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-primary, html.theme--documenter-dark .docstring > section > a.input.docs-sourcelink { - border-color: #375a7f; } - html.theme--documenter-dark .is-primary.textarea:focus, html.theme--documenter-dark .docstring > section > a.textarea.docs-sourcelink:focus, html.theme--documenter-dark .is-primary.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-primary:focus, html.theme--documenter-dark .docstring > section > a.input.docs-sourcelink:focus, html.theme--documenter-dark .is-primary.is-focused.textarea, html.theme--documenter-dark .docstring > section > a.is-focused.textarea.docs-sourcelink, html.theme--documenter-dark .is-primary.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .docstring > section > a.is-focused.input.docs-sourcelink, html.theme--documenter-dark .is-primary.textarea:active, html.theme--documenter-dark .docstring > section > a.textarea.docs-sourcelink:active, html.theme--documenter-dark .is-primary.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-primary:active, html.theme--documenter-dark .docstring > section > a.input.docs-sourcelink:active, html.theme--documenter-dark .is-primary.is-active.textarea, html.theme--documenter-dark .docstring > section > a.is-active.textarea.docs-sourcelink, html.theme--documenter-dark .is-primary.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active, html.theme--documenter-dark .docstring > section > a.is-active.input.docs-sourcelink { - box-shadow: 0 0 0 0.125em rgba(55, 90, 127, 0.25); } - html.theme--documenter-dark .is-link.textarea, html.theme--documenter-dark .is-link.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-link { - border-color: #1abc9c; } - html.theme--documenter-dark .is-link.textarea:focus, html.theme--documenter-dark .is-link.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-link:focus, html.theme--documenter-dark .is-link.is-focused.textarea, html.theme--documenter-dark .is-link.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-link.textarea:active, html.theme--documenter-dark .is-link.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-link:active, html.theme--documenter-dark .is-link.is-active.textarea, html.theme--documenter-dark .is-link.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(26, 188, 156, 0.25); } - html.theme--documenter-dark .is-info.textarea, html.theme--documenter-dark .is-info.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-info { - border-color: #024c7d; } - html.theme--documenter-dark .is-info.textarea:focus, html.theme--documenter-dark .is-info.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-info:focus, html.theme--documenter-dark .is-info.is-focused.textarea, html.theme--documenter-dark .is-info.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-info.textarea:active, html.theme--documenter-dark .is-info.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-info:active, html.theme--documenter-dark .is-info.is-active.textarea, html.theme--documenter-dark .is-info.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(2, 76, 125, 0.25); } - html.theme--documenter-dark .is-success.textarea, html.theme--documenter-dark .is-success.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-success { - border-color: #008438; } - html.theme--documenter-dark .is-success.textarea:focus, html.theme--documenter-dark .is-success.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-success:focus, html.theme--documenter-dark .is-success.is-focused.textarea, html.theme--documenter-dark .is-success.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-success.textarea:active, html.theme--documenter-dark .is-success.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-success:active, html.theme--documenter-dark .is-success.is-active.textarea, html.theme--documenter-dark .is-success.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(0, 132, 56, 0.25); } - html.theme--documenter-dark .is-warning.textarea, html.theme--documenter-dark .is-warning.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-warning { - border-color: #ad8100; } - html.theme--documenter-dark .is-warning.textarea:focus, html.theme--documenter-dark .is-warning.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-warning:focus, html.theme--documenter-dark .is-warning.is-focused.textarea, html.theme--documenter-dark .is-warning.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-warning.textarea:active, html.theme--documenter-dark .is-warning.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-warning:active, html.theme--documenter-dark .is-warning.is-active.textarea, html.theme--documenter-dark .is-warning.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(173, 129, 0, 0.25); } - html.theme--documenter-dark .is-danger.textarea, html.theme--documenter-dark .is-danger.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-danger { - border-color: #9e1b0d; } - html.theme--documenter-dark .is-danger.textarea:focus, html.theme--documenter-dark .is-danger.input:focus, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-danger:focus, html.theme--documenter-dark .is-danger.is-focused.textarea, html.theme--documenter-dark .is-danger.is-focused.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-focused, html.theme--documenter-dark .is-danger.textarea:active, html.theme--documenter-dark .is-danger.input:active, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-danger:active, html.theme--documenter-dark .is-danger.is-active.textarea, html.theme--documenter-dark .is-danger.is-active.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(158, 27, 13, 0.25); } - html.theme--documenter-dark .is-small.textarea, html.theme--documenter-dark .is-small.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input { - border-radius: 3px; - font-size: 0.85em; } - html.theme--documenter-dark .is-medium.textarea, html.theme--documenter-dark .is-medium.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-medium { - font-size: 1.25rem; } - html.theme--documenter-dark .is-large.textarea, html.theme--documenter-dark .is-large.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-large { - font-size: 1.5rem; } - html.theme--documenter-dark .is-fullwidth.textarea, html.theme--documenter-dark .is-fullwidth.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-fullwidth { - display: block; - width: 100%; } - html.theme--documenter-dark .is-inline.textarea, html.theme--documenter-dark .is-inline.input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-inline { - display: inline; - width: auto; } - html.theme--documenter-dark .input.is-rounded, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input { - border-radius: 290486px; - padding-left: 1em; - padding-right: 1em; } - html.theme--documenter-dark .input.is-static, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-static { - background-color: transparent; - border-color: transparent; - box-shadow: none; - padding-left: 0; - padding-right: 0; } - html.theme--documenter-dark .textarea { - display: block; - max-width: 100%; - min-width: 100%; - padding: 0.625em; - resize: vertical; } - html.theme--documenter-dark .textarea:not([rows]) { - max-height: 600px; - min-height: 120px; } - html.theme--documenter-dark .textarea[rows] { - height: initial; } - html.theme--documenter-dark .textarea.has-fixed-size { - resize: none; } - html.theme--documenter-dark .radio, html.theme--documenter-dark .checkbox { - cursor: pointer; - display: inline-block; - line-height: 1.25; - position: relative; } - html.theme--documenter-dark .radio input, html.theme--documenter-dark .checkbox input { - cursor: pointer; } - html.theme--documenter-dark .radio:hover, html.theme--documenter-dark .checkbox:hover { - color: #8c9b9d; } - html.theme--documenter-dark .radio[disabled], html.theme--documenter-dark .checkbox[disabled], fieldset[disabled] html.theme--documenter-dark .radio, fieldset[disabled] html.theme--documenter-dark .checkbox { - color: white; - cursor: not-allowed; } - html.theme--documenter-dark .radio + .radio { - margin-left: 0.5em; } - html.theme--documenter-dark .select { - display: inline-block; - max-width: 100%; - position: relative; - vertical-align: top; } - html.theme--documenter-dark .select:not(.is-multiple) { - height: 2.25em; } - html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after { - border-color: #1abc9c; - right: 1.125em; - z-index: 4; } - html.theme--documenter-dark .select.is-rounded select, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.select select { - border-radius: 290486px; - padding-left: 1em; } - html.theme--documenter-dark .select select { - cursor: pointer; - display: block; - font-size: 1em; - max-width: 100%; - outline: none; } - html.theme--documenter-dark .select select::-ms-expand { - display: none; } - html.theme--documenter-dark .select select[disabled]:hover, fieldset[disabled] html.theme--documenter-dark .select select:hover { - border-color: #282f2f; } - html.theme--documenter-dark .select select:not([multiple]) { - padding-right: 2.5em; } - html.theme--documenter-dark .select select[multiple] { - height: auto; - padding: 0; } - html.theme--documenter-dark .select select[multiple] option { - padding: 0.5em 1em; } - html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading):hover::after { - border-color: #8c9b9d; } - html.theme--documenter-dark .select.is-white:not(:hover)::after { - border-color: white; } - html.theme--documenter-dark .select.is-white select { - border-color: white; } - html.theme--documenter-dark .select.is-white select:hover, html.theme--documenter-dark .select.is-white select.is-hovered { - border-color: #f2f2f2; } - html.theme--documenter-dark .select.is-white select:focus, html.theme--documenter-dark .select.is-white select.is-focused, html.theme--documenter-dark .select.is-white select:active, html.theme--documenter-dark .select.is-white select.is-active { - box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } - html.theme--documenter-dark .select.is-black:not(:hover)::after { - border-color: #0a0a0a; } - html.theme--documenter-dark .select.is-black select { - border-color: #0a0a0a; } - html.theme--documenter-dark .select.is-black select:hover, html.theme--documenter-dark .select.is-black select.is-hovered { - border-color: black; } - html.theme--documenter-dark .select.is-black select:focus, html.theme--documenter-dark .select.is-black select.is-focused, html.theme--documenter-dark .select.is-black select:active, html.theme--documenter-dark .select.is-black select.is-active { - box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } - html.theme--documenter-dark .select.is-light:not(:hover)::after { - border-color: #ecf0f1; } - html.theme--documenter-dark .select.is-light select { - border-color: #ecf0f1; } - html.theme--documenter-dark .select.is-light select:hover, html.theme--documenter-dark .select.is-light select.is-hovered { - border-color: #dde4e6; } - html.theme--documenter-dark .select.is-light select:focus, html.theme--documenter-dark .select.is-light select.is-focused, html.theme--documenter-dark .select.is-light select:active, html.theme--documenter-dark .select.is-light select.is-active { - box-shadow: 0 0 0 0.125em rgba(236, 240, 241, 0.25); } - html.theme--documenter-dark .select.is-dark:not(:hover)::after, html.theme--documenter-dark .content kbd.select:not(:hover)::after { - border-color: #282f2f; } - html.theme--documenter-dark .select.is-dark select, html.theme--documenter-dark .content kbd.select select { - border-color: #282f2f; } - html.theme--documenter-dark .select.is-dark select:hover, html.theme--documenter-dark .content kbd.select select:hover, html.theme--documenter-dark .select.is-dark select.is-hovered, html.theme--documenter-dark .content kbd.select select.is-hovered { - border-color: #1d2122; } - html.theme--documenter-dark .select.is-dark select:focus, html.theme--documenter-dark .content kbd.select select:focus, html.theme--documenter-dark .select.is-dark select.is-focused, html.theme--documenter-dark .content kbd.select select.is-focused, html.theme--documenter-dark .select.is-dark select:active, html.theme--documenter-dark .content kbd.select select:active, html.theme--documenter-dark .select.is-dark select.is-active, html.theme--documenter-dark .content kbd.select select.is-active { - box-shadow: 0 0 0 0.125em rgba(40, 47, 47, 0.25); } - html.theme--documenter-dark .select.is-primary:not(:hover)::after, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink:not(:hover)::after { - border-color: #375a7f; } - html.theme--documenter-dark .select.is-primary select, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select { - border-color: #375a7f; } - html.theme--documenter-dark .select.is-primary select:hover, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select:hover, html.theme--documenter-dark .select.is-primary select.is-hovered, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select.is-hovered { - border-color: #2f4d6d; } - html.theme--documenter-dark .select.is-primary select:focus, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select:focus, html.theme--documenter-dark .select.is-primary select.is-focused, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select.is-focused, html.theme--documenter-dark .select.is-primary select:active, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select:active, html.theme--documenter-dark .select.is-primary select.is-active, html.theme--documenter-dark .docstring > section > a.select.docs-sourcelink select.is-active { - box-shadow: 0 0 0 0.125em rgba(55, 90, 127, 0.25); } - html.theme--documenter-dark .select.is-link:not(:hover)::after { - border-color: #1abc9c; } - html.theme--documenter-dark .select.is-link select { - border-color: #1abc9c; } - html.theme--documenter-dark .select.is-link select:hover, html.theme--documenter-dark .select.is-link select.is-hovered { - border-color: #17a689; } - html.theme--documenter-dark .select.is-link select:focus, html.theme--documenter-dark .select.is-link select.is-focused, html.theme--documenter-dark .select.is-link select:active, html.theme--documenter-dark .select.is-link select.is-active { - box-shadow: 0 0 0 0.125em rgba(26, 188, 156, 0.25); } - html.theme--documenter-dark .select.is-info:not(:hover)::after { - border-color: #024c7d; } - html.theme--documenter-dark .select.is-info select { - border-color: #024c7d; } - html.theme--documenter-dark .select.is-info select:hover, html.theme--documenter-dark .select.is-info select.is-hovered { - border-color: #023d64; } - html.theme--documenter-dark .select.is-info select:focus, html.theme--documenter-dark .select.is-info select.is-focused, html.theme--documenter-dark .select.is-info select:active, html.theme--documenter-dark .select.is-info select.is-active { - box-shadow: 0 0 0 0.125em rgba(2, 76, 125, 0.25); } - html.theme--documenter-dark .select.is-success:not(:hover)::after { - border-color: #008438; } - html.theme--documenter-dark .select.is-success select { - border-color: #008438; } - html.theme--documenter-dark .select.is-success select:hover, html.theme--documenter-dark .select.is-success select.is-hovered { - border-color: #006b2d; } - html.theme--documenter-dark .select.is-success select:focus, html.theme--documenter-dark .select.is-success select.is-focused, html.theme--documenter-dark .select.is-success select:active, html.theme--documenter-dark .select.is-success select.is-active { - box-shadow: 0 0 0 0.125em rgba(0, 132, 56, 0.25); } - html.theme--documenter-dark .select.is-warning:not(:hover)::after { - border-color: #ad8100; } - html.theme--documenter-dark .select.is-warning select { - border-color: #ad8100; } - html.theme--documenter-dark .select.is-warning select:hover, html.theme--documenter-dark .select.is-warning select.is-hovered { - border-color: #946e00; } - html.theme--documenter-dark .select.is-warning select:focus, html.theme--documenter-dark .select.is-warning select.is-focused, html.theme--documenter-dark .select.is-warning select:active, html.theme--documenter-dark .select.is-warning select.is-active { - box-shadow: 0 0 0 0.125em rgba(173, 129, 0, 0.25); } - html.theme--documenter-dark .select.is-danger:not(:hover)::after { - border-color: #9e1b0d; } - html.theme--documenter-dark .select.is-danger select { - border-color: #9e1b0d; } - html.theme--documenter-dark .select.is-danger select:hover, html.theme--documenter-dark .select.is-danger select.is-hovered { - border-color: #86170b; } - html.theme--documenter-dark .select.is-danger select:focus, html.theme--documenter-dark .select.is-danger select.is-focused, html.theme--documenter-dark .select.is-danger select:active, html.theme--documenter-dark .select.is-danger select.is-active { - box-shadow: 0 0 0 0.125em rgba(158, 27, 13, 0.25); } - html.theme--documenter-dark .select.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.select { - border-radius: 3px; - font-size: 0.85em; } - html.theme--documenter-dark .select.is-medium { - font-size: 1.25rem; } - html.theme--documenter-dark .select.is-large { - font-size: 1.5rem; } - html.theme--documenter-dark .select.is-disabled::after { - border-color: white; } - html.theme--documenter-dark .select.is-fullwidth { - width: 100%; } - html.theme--documenter-dark .select.is-fullwidth select { - width: 100%; } - html.theme--documenter-dark .select.is-loading::after { - margin-top: 0; - position: absolute; - right: 0.625em; - top: 0.625em; - transform: none; } - html.theme--documenter-dark .select.is-loading.is-small:after, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-loading:after { - font-size: 0.85em; } - html.theme--documenter-dark .select.is-loading.is-medium:after { - font-size: 1.25rem; } - html.theme--documenter-dark .select.is-loading.is-large:after { - font-size: 1.5rem; } - html.theme--documenter-dark .file { - align-items: stretch; - display: flex; - justify-content: flex-start; - position: relative; } - html.theme--documenter-dark .file.is-white .file-cta { - background-color: white; - border-color: transparent; - color: #0a0a0a; } - html.theme--documenter-dark .file.is-white:hover .file-cta, html.theme--documenter-dark .file.is-white.is-hovered .file-cta { - background-color: #f9f9f9; - border-color: transparent; - color: #0a0a0a; } - html.theme--documenter-dark .file.is-white:focus .file-cta, html.theme--documenter-dark .file.is-white.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(255, 255, 255, 0.25); - color: #0a0a0a; } - html.theme--documenter-dark .file.is-white:active .file-cta, html.theme--documenter-dark .file.is-white.is-active .file-cta { - background-color: #f2f2f2; - border-color: transparent; - color: #0a0a0a; } - html.theme--documenter-dark .file.is-black .file-cta { - background-color: #0a0a0a; - border-color: transparent; - color: white; } - html.theme--documenter-dark .file.is-black:hover .file-cta, html.theme--documenter-dark .file.is-black.is-hovered .file-cta { - background-color: #040404; - border-color: transparent; - color: white; } - html.theme--documenter-dark .file.is-black:focus .file-cta, html.theme--documenter-dark .file.is-black.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(10, 10, 10, 0.25); - color: white; } - html.theme--documenter-dark .file.is-black:active .file-cta, html.theme--documenter-dark .file.is-black.is-active .file-cta { - background-color: black; - border-color: transparent; - color: white; } - html.theme--documenter-dark .file.is-light .file-cta { - background-color: #ecf0f1; - border-color: transparent; - color: #282f2f; } - html.theme--documenter-dark .file.is-light:hover .file-cta, html.theme--documenter-dark .file.is-light.is-hovered .file-cta { - background-color: #e5eaec; - border-color: transparent; - color: #282f2f; } - html.theme--documenter-dark .file.is-light:focus .file-cta, html.theme--documenter-dark .file.is-light.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(236, 240, 241, 0.25); - color: #282f2f; } - html.theme--documenter-dark .file.is-light:active .file-cta, html.theme--documenter-dark .file.is-light.is-active .file-cta { - background-color: #dde4e6; - border-color: transparent; - color: #282f2f; } - html.theme--documenter-dark .file.is-dark .file-cta, html.theme--documenter-dark .content kbd.file .file-cta { - background-color: #282f2f; - border-color: transparent; - color: #ecf0f1; } - html.theme--documenter-dark .file.is-dark:hover .file-cta, html.theme--documenter-dark .content kbd.file:hover .file-cta, html.theme--documenter-dark .file.is-dark.is-hovered .file-cta, html.theme--documenter-dark .content kbd.file.is-hovered .file-cta { - background-color: #232829; - border-color: transparent; - color: #ecf0f1; } - html.theme--documenter-dark .file.is-dark:focus .file-cta, html.theme--documenter-dark .content kbd.file:focus .file-cta, html.theme--documenter-dark .file.is-dark.is-focused .file-cta, html.theme--documenter-dark .content kbd.file.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(40, 47, 47, 0.25); - color: #ecf0f1; } - html.theme--documenter-dark .file.is-dark:active .file-cta, html.theme--documenter-dark .content kbd.file:active .file-cta, html.theme--documenter-dark .file.is-dark.is-active .file-cta, html.theme--documenter-dark .content kbd.file.is-active .file-cta { - background-color: #1d2122; - border-color: transparent; - color: #ecf0f1; } - html.theme--documenter-dark .file.is-primary .file-cta, html.theme--documenter-dark .docstring > section > a.file.docs-sourcelink .file-cta { - background-color: #375a7f; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-primary:hover .file-cta, html.theme--documenter-dark .docstring > section > a.file.docs-sourcelink:hover .file-cta, html.theme--documenter-dark .file.is-primary.is-hovered .file-cta, html.theme--documenter-dark .docstring > section > a.file.is-hovered.docs-sourcelink .file-cta { - background-color: #335476; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-primary:focus .file-cta, html.theme--documenter-dark .docstring > section > a.file.docs-sourcelink:focus .file-cta, html.theme--documenter-dark .file.is-primary.is-focused .file-cta, html.theme--documenter-dark .docstring > section > a.file.is-focused.docs-sourcelink .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(55, 90, 127, 0.25); - color: #fff; } - html.theme--documenter-dark .file.is-primary:active .file-cta, html.theme--documenter-dark .docstring > section > a.file.docs-sourcelink:active .file-cta, html.theme--documenter-dark .file.is-primary.is-active .file-cta, html.theme--documenter-dark .docstring > section > a.file.is-active.docs-sourcelink .file-cta { - background-color: #2f4d6d; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-link .file-cta { - background-color: #1abc9c; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-link:hover .file-cta, html.theme--documenter-dark .file.is-link.is-hovered .file-cta { - background-color: #18b193; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-link:focus .file-cta, html.theme--documenter-dark .file.is-link.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(26, 188, 156, 0.25); - color: #fff; } - html.theme--documenter-dark .file.is-link:active .file-cta, html.theme--documenter-dark .file.is-link.is-active .file-cta { - background-color: #17a689; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-info .file-cta { - background-color: #024c7d; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-info:hover .file-cta, html.theme--documenter-dark .file.is-info.is-hovered .file-cta { - background-color: #024470; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-info:focus .file-cta, html.theme--documenter-dark .file.is-info.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(2, 76, 125, 0.25); - color: #fff; } - html.theme--documenter-dark .file.is-info:active .file-cta, html.theme--documenter-dark .file.is-info.is-active .file-cta { - background-color: #023d64; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-success .file-cta { - background-color: #008438; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-success:hover .file-cta, html.theme--documenter-dark .file.is-success.is-hovered .file-cta { - background-color: #007733; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-success:focus .file-cta, html.theme--documenter-dark .file.is-success.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(0, 132, 56, 0.25); - color: #fff; } - html.theme--documenter-dark .file.is-success:active .file-cta, html.theme--documenter-dark .file.is-success.is-active .file-cta { - background-color: #006b2d; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-warning .file-cta { - background-color: #ad8100; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-warning:hover .file-cta, html.theme--documenter-dark .file.is-warning.is-hovered .file-cta { - background-color: #a07700; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-warning:focus .file-cta, html.theme--documenter-dark .file.is-warning.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(173, 129, 0, 0.25); - color: #fff; } - html.theme--documenter-dark .file.is-warning:active .file-cta, html.theme--documenter-dark .file.is-warning.is-active .file-cta { - background-color: #946e00; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-danger .file-cta { - background-color: #9e1b0d; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-danger:hover .file-cta, html.theme--documenter-dark .file.is-danger.is-hovered .file-cta { - background-color: #92190c; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-danger:focus .file-cta, html.theme--documenter-dark .file.is-danger.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(158, 27, 13, 0.25); - color: #fff; } - html.theme--documenter-dark .file.is-danger:active .file-cta, html.theme--documenter-dark .file.is-danger.is-active .file-cta { - background-color: #86170b; - border-color: transparent; - color: #fff; } - html.theme--documenter-dark .file.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.file { - font-size: 0.85em; } - html.theme--documenter-dark .file.is-medium { - font-size: 1.25rem; } - html.theme--documenter-dark .file.is-medium .file-icon .fa { - font-size: 21px; } - html.theme--documenter-dark .file.is-large { - font-size: 1.5rem; } - html.theme--documenter-dark .file.is-large .file-icon .fa { - font-size: 28px; } - html.theme--documenter-dark .file.has-name .file-cta { - border-bottom-right-radius: 0; - border-top-right-radius: 0; } - html.theme--documenter-dark .file.has-name .file-name { - border-bottom-left-radius: 0; - border-top-left-radius: 0; } - html.theme--documenter-dark .file.has-name.is-empty .file-cta { - border-radius: 0.4em; } - html.theme--documenter-dark .file.has-name.is-empty .file-name { - display: none; } - html.theme--documenter-dark .file.is-boxed .file-label { - flex-direction: column; } - html.theme--documenter-dark .file.is-boxed .file-cta { - flex-direction: column; - height: auto; - padding: 1em 3em; } - html.theme--documenter-dark .file.is-boxed .file-name { - border-width: 0 1px 1px; } - html.theme--documenter-dark .file.is-boxed .file-icon { - height: 1.5em; - width: 1.5em; } - html.theme--documenter-dark .file.is-boxed .file-icon .fa { - font-size: 21px; } - html.theme--documenter-dark .file.is-boxed.is-small .file-icon .fa, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-boxed .file-icon .fa { - font-size: 14px; } - html.theme--documenter-dark .file.is-boxed.is-medium .file-icon .fa { - font-size: 28px; } - html.theme--documenter-dark .file.is-boxed.is-large .file-icon .fa { - font-size: 35px; } - html.theme--documenter-dark .file.is-boxed.has-name .file-cta { - border-radius: 0.4em 0.4em 0 0; } - html.theme--documenter-dark .file.is-boxed.has-name .file-name { - border-radius: 0 0 0.4em 0.4em; - border-width: 0 1px 1px; } - html.theme--documenter-dark .file.is-centered { - justify-content: center; } - html.theme--documenter-dark .file.is-fullwidth .file-label { - width: 100%; } - html.theme--documenter-dark .file.is-fullwidth .file-name { - flex-grow: 1; - max-width: none; } - html.theme--documenter-dark .file.is-right { - justify-content: flex-end; } - html.theme--documenter-dark .file.is-right .file-cta { - border-radius: 0 0.4em 0.4em 0; } - html.theme--documenter-dark .file.is-right .file-name { - border-radius: 0.4em 0 0 0.4em; - border-width: 1px 0 1px 1px; - order: -1; } - html.theme--documenter-dark .file-label { - align-items: stretch; - display: flex; - cursor: pointer; - justify-content: flex-start; - overflow: hidden; - position: relative; } - html.theme--documenter-dark .file-label:hover .file-cta { - background-color: #e5eaec; - color: #282f2f; } - html.theme--documenter-dark .file-label:hover .file-name { - border-color: #596668; } - html.theme--documenter-dark .file-label:active .file-cta { - background-color: #dde4e6; - color: #282f2f; } - html.theme--documenter-dark .file-label:active .file-name { - border-color: #535f61; } - html.theme--documenter-dark .file-input { - height: 100%; - left: 0; - opacity: 0; - outline: none; - position: absolute; - top: 0; - width: 100%; } - html.theme--documenter-dark .file-cta, - html.theme--documenter-dark .file-name { - border-color: #5e6d6f; - border-radius: 0.4em; - font-size: 1em; - padding-left: 1em; - padding-right: 1em; - white-space: nowrap; } - html.theme--documenter-dark .file-cta { - background-color: #ecf0f1; - color: #343c3d; } - html.theme--documenter-dark .file-name { - border-color: #5e6d6f; - border-style: solid; - border-width: 1px 1px 1px 0; - display: block; - max-width: 16em; - overflow: hidden; - text-align: left; - text-overflow: ellipsis; } - html.theme--documenter-dark .file-icon { - align-items: center; - display: flex; - height: 1em; - justify-content: center; - margin-right: 0.5em; - width: 1em; } - html.theme--documenter-dark .file-icon .fa { - font-size: 14px; } - html.theme--documenter-dark .label { - color: #282f2f; - display: block; - font-size: 15px; - font-weight: 700; } - html.theme--documenter-dark .label:not(:last-child) { - margin-bottom: 0.5em; } - html.theme--documenter-dark .label.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.label { - font-size: 0.85em; } - html.theme--documenter-dark .label.is-medium { - font-size: 1.25rem; } - html.theme--documenter-dark .label.is-large { - font-size: 1.5rem; } - html.theme--documenter-dark .help { - display: block; - font-size: 0.85em; - margin-top: 0.25rem; } - html.theme--documenter-dark .help.is-white { - color: white; } - html.theme--documenter-dark .help.is-black { - color: #0a0a0a; } - html.theme--documenter-dark .help.is-light { - color: #ecf0f1; } - html.theme--documenter-dark .help.is-dark, html.theme--documenter-dark .content kbd.help { - color: #282f2f; } - html.theme--documenter-dark .help.is-primary, html.theme--documenter-dark .docstring > section > a.help.docs-sourcelink { - color: #375a7f; } - html.theme--documenter-dark .help.is-link { - color: #1abc9c; } - html.theme--documenter-dark .help.is-info { - color: #024c7d; } - html.theme--documenter-dark .help.is-success { - color: #008438; } - html.theme--documenter-dark .help.is-warning { - color: #ad8100; } - html.theme--documenter-dark .help.is-danger { - color: #9e1b0d; } - html.theme--documenter-dark .field:not(:last-child) { - margin-bottom: 0.75rem; } - html.theme--documenter-dark .field.has-addons { - display: flex; - justify-content: flex-start; } - html.theme--documenter-dark .field.has-addons .control:not(:last-child) { - margin-right: -1px; } - html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .button, - html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .input, - html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search > input, - html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search > input, - html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .select select { - border-radius: 0; } - html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .button, - html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .input, - html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search > input, - html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search > input, - html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .select select { - border-bottom-right-radius: 0; - border-top-right-radius: 0; } - html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .button, - html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .input, - html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search > input, - html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search > input, - html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .select select { - border-bottom-left-radius: 0; - border-top-left-radius: 0; } - html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):hover, html.theme--documenter-dark .field.has-addons .control .button.is-hovered:not([disabled]), - html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):hover, - html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):hover, - html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):hover, - html.theme--documenter-dark .field.has-addons .control .input.is-hovered:not([disabled]), - html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-hovered:not([disabled]), - html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-hovered:not([disabled]), - html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):hover, - html.theme--documenter-dark .field.has-addons .control .select select.is-hovered:not([disabled]) { - z-index: 2; } - html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus, html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]), html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active, html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]), - html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus, - html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):focus, - html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):focus, - html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]), - html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-focused:not([disabled]), - html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-focused:not([disabled]), - html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active, - html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):active, - html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):active, - html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]), - html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-active:not([disabled]), - html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-active:not([disabled]), - html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus, - html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]), - html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active, - html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]) { - z-index: 3; } - html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus:hover, html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]):hover, html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active:hover, html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]):hover, - html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus:hover, - html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):focus:hover, - html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):focus:hover, - html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]):hover, - html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-focused:not([disabled]):hover, - html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-focused:not([disabled]):hover, - html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active:hover, - html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):active:hover, - html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):active:hover, - html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]):hover, - html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-active:not([disabled]):hover, - html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-active:not([disabled]):hover, - html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus:hover, - html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]):hover, - html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active:hover, - html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]):hover { - z-index: 4; } - html.theme--documenter-dark .field.has-addons .control.is-expanded { - flex-grow: 1; - flex-shrink: 1; } - html.theme--documenter-dark .field.has-addons.has-addons-centered { - justify-content: center; } - html.theme--documenter-dark .field.has-addons.has-addons-right { - justify-content: flex-end; } - html.theme--documenter-dark .field.has-addons.has-addons-fullwidth .control { - flex-grow: 1; - flex-shrink: 0; } - html.theme--documenter-dark .field.is-grouped { - display: flex; - justify-content: flex-start; } - html.theme--documenter-dark .field.is-grouped > .control { - flex-shrink: 0; } - html.theme--documenter-dark .field.is-grouped > .control:not(:last-child) { - margin-bottom: 0; - margin-right: 0.75rem; } - html.theme--documenter-dark .field.is-grouped > .control.is-expanded { - flex-grow: 1; - flex-shrink: 1; } - html.theme--documenter-dark .field.is-grouped.is-grouped-centered { - justify-content: center; } - html.theme--documenter-dark .field.is-grouped.is-grouped-right { - justify-content: flex-end; } - html.theme--documenter-dark .field.is-grouped.is-grouped-multiline { - flex-wrap: wrap; } - html.theme--documenter-dark .field.is-grouped.is-grouped-multiline > .control:last-child, html.theme--documenter-dark .field.is-grouped.is-grouped-multiline > .control:not(:last-child) { - margin-bottom: 0.75rem; } - html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:last-child { - margin-bottom: -0.75rem; } - html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:not(:last-child) { - margin-bottom: 0; } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .field.is-horizontal { - display: flex; } } - html.theme--documenter-dark .field-label .label { - font-size: inherit; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .field-label { - margin-bottom: 0.5rem; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .field-label { - flex-basis: 0; - flex-grow: 1; - flex-shrink: 0; - margin-right: 1.5rem; - text-align: right; } - html.theme--documenter-dark .field-label.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.field-label { - font-size: 0.85em; - padding-top: 0.375em; } - html.theme--documenter-dark .field-label.is-normal { - padding-top: 0.375em; } - html.theme--documenter-dark .field-label.is-medium { - font-size: 1.25rem; - padding-top: 0.375em; } - html.theme--documenter-dark .field-label.is-large { - font-size: 1.5rem; - padding-top: 0.375em; } } - html.theme--documenter-dark .field-body .field .field { - margin-bottom: 0; } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .field-body { - display: flex; - flex-basis: 0; - flex-grow: 5; - flex-shrink: 1; } - html.theme--documenter-dark .field-body .field { - margin-bottom: 0; } - html.theme--documenter-dark .field-body > .field { - flex-shrink: 1; } - html.theme--documenter-dark .field-body > .field:not(.is-narrow) { - flex-grow: 1; } - html.theme--documenter-dark .field-body > .field:not(:last-child) { - margin-right: 0.75rem; } } - html.theme--documenter-dark .control { - box-sizing: border-box; - clear: both; - font-size: 15px; - position: relative; - text-align: left; } - html.theme--documenter-dark .control.has-icons-left .input:focus ~ .icon, html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search > input:focus ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search > input:focus ~ .icon, - html.theme--documenter-dark .control.has-icons-left .select:focus ~ .icon, html.theme--documenter-dark .control.has-icons-right .input:focus ~ .icon, html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search > input:focus ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search > input:focus ~ .icon, - html.theme--documenter-dark .control.has-icons-right .select:focus ~ .icon { - color: #5e6d6f; } - html.theme--documenter-dark .control.has-icons-left .input.is-small ~ .icon, html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search > input ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search > input ~ .icon, - html.theme--documenter-dark .control.has-icons-left .select.is-small ~ .icon, html.theme--documenter-dark .control.has-icons-right .input.is-small ~ .icon, html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search > input ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search > input ~ .icon, - html.theme--documenter-dark .control.has-icons-right .select.is-small ~ .icon { - font-size: 0.85em; } - html.theme--documenter-dark .control.has-icons-left .input.is-medium ~ .icon, html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search > input.is-medium ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search > input.is-medium ~ .icon, - html.theme--documenter-dark .control.has-icons-left .select.is-medium ~ .icon, html.theme--documenter-dark .control.has-icons-right .input.is-medium ~ .icon, html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search > input.is-medium ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search > input.is-medium ~ .icon, - html.theme--documenter-dark .control.has-icons-right .select.is-medium ~ .icon { - font-size: 1.25rem; } - html.theme--documenter-dark .control.has-icons-left .input.is-large ~ .icon, html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search > input.is-large ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search > input.is-large ~ .icon, - html.theme--documenter-dark .control.has-icons-left .select.is-large ~ .icon, html.theme--documenter-dark .control.has-icons-right .input.is-large ~ .icon, html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search > input.is-large ~ .icon, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search > input.is-large ~ .icon, - html.theme--documenter-dark .control.has-icons-right .select.is-large ~ .icon { - font-size: 1.5rem; } - html.theme--documenter-dark .control.has-icons-left .icon, html.theme--documenter-dark .control.has-icons-right .icon { - color: #dbdee0; - height: 2.25em; - pointer-events: none; - position: absolute; - top: 0; - width: 2.25em; - z-index: 4; } - html.theme--documenter-dark .control.has-icons-left .input, html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search > input, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search > input, - html.theme--documenter-dark .control.has-icons-left .select select { - padding-left: 2.25em; } - html.theme--documenter-dark .control.has-icons-left .icon.is-left { - left: 0; } - html.theme--documenter-dark .control.has-icons-right .input, html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search > input, html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search > input, - html.theme--documenter-dark .control.has-icons-right .select select { - padding-right: 2.25em; } - html.theme--documenter-dark .control.has-icons-right .icon.is-right { - right: 0; } - html.theme--documenter-dark .control.is-loading::after { - position: absolute !important; - right: 0.625em; - top: 0.625em; - z-index: 4; } - html.theme--documenter-dark .control.is-loading.is-small:after, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.is-loading:after { - font-size: 0.85em; } - html.theme--documenter-dark .control.is-loading.is-medium:after { - font-size: 1.25rem; } - html.theme--documenter-dark .control.is-loading.is-large:after { - font-size: 1.5rem; } - html.theme--documenter-dark .breadcrumb { - font-size: 15px; - white-space: nowrap; } - html.theme--documenter-dark .breadcrumb a { - align-items: center; - color: #1abc9c; - display: flex; - justify-content: center; - padding: 0 0.75em; } - html.theme--documenter-dark .breadcrumb a:hover { - color: #1dd2af; } - html.theme--documenter-dark .breadcrumb li { - align-items: center; - display: flex; } - html.theme--documenter-dark .breadcrumb li:first-child a { - padding-left: 0; } - html.theme--documenter-dark .breadcrumb li.is-active a { - color: #f2f2f2; - cursor: default; - pointer-events: none; } - html.theme--documenter-dark .breadcrumb li + li::before { - color: #8c9b9d; - content: "\0002f"; } - html.theme--documenter-dark .breadcrumb ul, - html.theme--documenter-dark .breadcrumb ol { - align-items: flex-start; - display: flex; - flex-wrap: wrap; - justify-content: flex-start; } - html.theme--documenter-dark .breadcrumb .icon:first-child { - margin-right: 0.5em; } - html.theme--documenter-dark .breadcrumb .icon:last-child { - margin-left: 0.5em; } - html.theme--documenter-dark .breadcrumb.is-centered ol, - html.theme--documenter-dark .breadcrumb.is-centered ul { - justify-content: center; } - html.theme--documenter-dark .breadcrumb.is-right ol, - html.theme--documenter-dark .breadcrumb.is-right ul { - justify-content: flex-end; } - html.theme--documenter-dark .breadcrumb.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.breadcrumb { - font-size: 0.85em; } - html.theme--documenter-dark .breadcrumb.is-medium { - font-size: 1.25rem; } - html.theme--documenter-dark .breadcrumb.is-large { - font-size: 1.5rem; } - html.theme--documenter-dark .breadcrumb.has-arrow-separator li + li::before { - content: "\02192"; } - html.theme--documenter-dark .breadcrumb.has-bullet-separator li + li::before { - content: "\02022"; } - html.theme--documenter-dark .breadcrumb.has-dot-separator li + li::before { - content: "\000b7"; } - html.theme--documenter-dark .breadcrumb.has-succeeds-separator li + li::before { - content: "\0227B"; } - html.theme--documenter-dark .card { - background-color: white; - box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); - color: #fff; - max-width: 100%; - position: relative; } - html.theme--documenter-dark .card-header { - background-color: transparent; - align-items: stretch; - box-shadow: 0 1px 2px rgba(10, 10, 10, 0.1); - display: flex; } - html.theme--documenter-dark .card-header-title { - align-items: center; - color: #f2f2f2; - display: flex; - flex-grow: 1; - font-weight: 700; - padding: 0.75rem; } - html.theme--documenter-dark .card-header-title.is-centered { - justify-content: center; } - html.theme--documenter-dark .card-header-icon { - align-items: center; - cursor: pointer; - display: flex; - justify-content: center; - padding: 0.75rem; } - html.theme--documenter-dark .card-image { - display: block; - position: relative; } - html.theme--documenter-dark .card-content { - background-color: transparent; - padding: 1.5rem; } - html.theme--documenter-dark .card-footer { - background-color: transparent; - border-top: 1px solid #5e6d6f; - align-items: stretch; - display: flex; } - html.theme--documenter-dark .card-footer-item { - align-items: center; - display: flex; - flex-basis: 0; - flex-grow: 1; - flex-shrink: 0; - justify-content: center; - padding: 0.75rem; } - html.theme--documenter-dark .card-footer-item:not(:last-child) { - border-right: 1px solid #5e6d6f; } - html.theme--documenter-dark .card .media:not(:last-child) { - margin-bottom: 1.5rem; } - html.theme--documenter-dark .dropdown { - display: inline-flex; - position: relative; - vertical-align: top; } - html.theme--documenter-dark .dropdown.is-active .dropdown-menu, html.theme--documenter-dark .dropdown.is-hoverable:hover .dropdown-menu { - display: block; } - html.theme--documenter-dark .dropdown.is-right .dropdown-menu { - left: auto; - right: 0; } - html.theme--documenter-dark .dropdown.is-up .dropdown-menu { - bottom: 100%; - padding-bottom: 4px; - padding-top: initial; - top: auto; } - html.theme--documenter-dark .dropdown-menu { - display: none; - left: 0; - min-width: 12rem; - padding-top: 4px; - position: absolute; - top: 100%; - z-index: 20; } - html.theme--documenter-dark .dropdown-content { - background-color: #282f2f; - border-radius: 0.4em; - box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); - padding-bottom: 0.5rem; - padding-top: 0.5rem; } - html.theme--documenter-dark .dropdown-item { - color: #fff; - display: block; - font-size: 0.875rem; - line-height: 1.5; - padding: 0.375rem 1rem; - position: relative; } - html.theme--documenter-dark a.dropdown-item, - html.theme--documenter-dark button.dropdown-item { - padding-right: 3rem; - text-align: left; - white-space: nowrap; - width: 100%; } - html.theme--documenter-dark a.dropdown-item:hover, - html.theme--documenter-dark button.dropdown-item:hover { - background-color: #282f2f; - color: #0a0a0a; } - html.theme--documenter-dark a.dropdown-item.is-active, - html.theme--documenter-dark button.dropdown-item.is-active { - background-color: #1abc9c; - color: #fff; } - html.theme--documenter-dark .dropdown-divider { - background-color: #5e6d6f; - border: none; - display: block; - height: 1px; - margin: 0.5rem 0; } - html.theme--documenter-dark .level { - align-items: center; - justify-content: space-between; } - html.theme--documenter-dark .level code { - border-radius: 0.4em; } - html.theme--documenter-dark .level img { - display: inline-block; - vertical-align: top; } - html.theme--documenter-dark .level.is-mobile { - display: flex; } - html.theme--documenter-dark .level.is-mobile .level-left, - html.theme--documenter-dark .level.is-mobile .level-right { - display: flex; } - html.theme--documenter-dark .level.is-mobile .level-left + .level-right { - margin-top: 0; } - html.theme--documenter-dark .level.is-mobile .level-item:not(:last-child) { - margin-bottom: 0; - margin-right: 0.75rem; } - html.theme--documenter-dark .level.is-mobile .level-item:not(.is-narrow) { - flex-grow: 1; } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .level { - display: flex; } - html.theme--documenter-dark .level > .level-item:not(.is-narrow) { - flex-grow: 1; } } - html.theme--documenter-dark .level-item { - align-items: center; - display: flex; - flex-basis: auto; - flex-grow: 0; - flex-shrink: 0; - justify-content: center; } - html.theme--documenter-dark .level-item .title, - html.theme--documenter-dark .level-item .subtitle { - margin-bottom: 0; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .level-item:not(:last-child) { - margin-bottom: 0.75rem; } } - html.theme--documenter-dark .level-left, - html.theme--documenter-dark .level-right { - flex-basis: auto; - flex-grow: 0; - flex-shrink: 0; } - html.theme--documenter-dark .level-left .level-item.is-flexible, - html.theme--documenter-dark .level-right .level-item.is-flexible { - flex-grow: 1; } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .level-left .level-item:not(:last-child), - html.theme--documenter-dark .level-right .level-item:not(:last-child) { - margin-right: 0.75rem; } } - html.theme--documenter-dark .level-left { - align-items: center; - justify-content: flex-start; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .level-left + .level-right { - margin-top: 1.5rem; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .level-left { - display: flex; } } - html.theme--documenter-dark .level-right { - align-items: center; - justify-content: flex-end; } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .level-right { - display: flex; } } - html.theme--documenter-dark .list { - background-color: white; - border-radius: 0.4em; - box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); } - html.theme--documenter-dark .list-item { - display: block; - padding: 0.5em 1em; } - html.theme--documenter-dark .list-item:not(a) { - color: #fff; } - html.theme--documenter-dark .list-item:first-child { - border-top-left-radius: 0.4em; - border-top-right-radius: 0.4em; } - html.theme--documenter-dark .list-item:last-child { - border-bottom-left-radius: 0.4em; - border-bottom-right-radius: 0.4em; } - html.theme--documenter-dark .list-item:not(:last-child) { - border-bottom: 1px solid #5e6d6f; } - html.theme--documenter-dark .list-item.is-active { - background-color: #1abc9c; - color: #fff; } - html.theme--documenter-dark a.list-item { - background-color: #282f2f; - cursor: pointer; } - html.theme--documenter-dark .media { - align-items: flex-start; - display: flex; - text-align: left; } - html.theme--documenter-dark .media .content:not(:last-child) { - margin-bottom: 0.75rem; } - html.theme--documenter-dark .media .media { - border-top: 1px solid rgba(94, 109, 111, 0.5); - display: flex; - padding-top: 0.75rem; } - html.theme--documenter-dark .media .media .content:not(:last-child), - html.theme--documenter-dark .media .media .control:not(:last-child) { - margin-bottom: 0.5rem; } - html.theme--documenter-dark .media .media .media { - padding-top: 0.5rem; } - html.theme--documenter-dark .media .media .media + .media { - margin-top: 0.5rem; } - html.theme--documenter-dark .media + .media { - border-top: 1px solid rgba(94, 109, 111, 0.5); - margin-top: 1rem; - padding-top: 1rem; } - html.theme--documenter-dark .media.is-large + .media { - margin-top: 1.5rem; - padding-top: 1.5rem; } - html.theme--documenter-dark .media-left, - html.theme--documenter-dark .media-right { - flex-basis: auto; - flex-grow: 0; - flex-shrink: 0; } - html.theme--documenter-dark .media-left { - margin-right: 1rem; } - html.theme--documenter-dark .media-right { - margin-left: 1rem; } - html.theme--documenter-dark .media-content { - flex-basis: auto; - flex-grow: 1; - flex-shrink: 1; - text-align: left; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .media-content { - overflow-x: auto; } } - html.theme--documenter-dark .menu { - font-size: 15px; } - html.theme--documenter-dark .menu.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.menu { - font-size: 0.85em; } - html.theme--documenter-dark .menu.is-medium { - font-size: 1.25rem; } - html.theme--documenter-dark .menu.is-large { - font-size: 1.5rem; } - html.theme--documenter-dark .menu-list { - line-height: 1.25; } - html.theme--documenter-dark .menu-list a { - border-radius: 3px; - color: #fff; - display: block; - padding: 0.5em 0.75em; } - html.theme--documenter-dark .menu-list a:hover { - background-color: #282f2f; - color: #f2f2f2; } - html.theme--documenter-dark .menu-list a.is-active { - background-color: #1abc9c; - color: #fff; } - html.theme--documenter-dark .menu-list li ul { - border-left: 1px solid #5e6d6f; - margin: 0.75em; - padding-left: 0.75em; } - html.theme--documenter-dark .menu-label { - color: white; - font-size: 0.75em; - letter-spacing: 0.1em; - text-transform: uppercase; } - html.theme--documenter-dark .menu-label:not(:first-child) { - margin-top: 1em; } - html.theme--documenter-dark .menu-label:not(:last-child) { - margin-bottom: 1em; } - html.theme--documenter-dark .message { - background-color: #282f2f; - border-radius: 0.4em; - font-size: 15px; } - html.theme--documenter-dark .message strong { - color: currentColor; } - html.theme--documenter-dark .message a:not(.button):not(.tag):not(.dropdown-item) { - color: currentColor; - text-decoration: underline; } - html.theme--documenter-dark .message.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.message { - font-size: 0.85em; } - html.theme--documenter-dark .message.is-medium { - font-size: 1.25rem; } - html.theme--documenter-dark .message.is-large { - font-size: 1.5rem; } - html.theme--documenter-dark .message.is-white { - background-color: white; } - html.theme--documenter-dark .message.is-white .message-header { - background-color: white; - color: #0a0a0a; } - html.theme--documenter-dark .message.is-white .message-body { - border-color: white; - color: #4d4d4d; } - html.theme--documenter-dark .message.is-black { - background-color: #fafafa; } - html.theme--documenter-dark .message.is-black .message-header { - background-color: #0a0a0a; - color: white; } - html.theme--documenter-dark .message.is-black .message-body { - border-color: #0a0a0a; - color: #090909; } - html.theme--documenter-dark .message.is-light { - background-color: #f9fafb; } - html.theme--documenter-dark .message.is-light .message-header { - background-color: #ecf0f1; - color: #282f2f; } - html.theme--documenter-dark .message.is-light .message-body { - border-color: #ecf0f1; - color: #505050; } - html.theme--documenter-dark .message.is-dark, html.theme--documenter-dark .content kbd.message { - background-color: #f9fafa; } - html.theme--documenter-dark .message.is-dark .message-header, html.theme--documenter-dark .content kbd.message .message-header { - background-color: #282f2f; - color: #ecf0f1; } - html.theme--documenter-dark .message.is-dark .message-body, html.theme--documenter-dark .content kbd.message .message-body { - border-color: #282f2f; - color: #212526; } - html.theme--documenter-dark .message.is-primary, html.theme--documenter-dark .docstring > section > a.message.docs-sourcelink { - background-color: #f8fafc; } - html.theme--documenter-dark .message.is-primary .message-header, html.theme--documenter-dark .docstring > section > a.message.docs-sourcelink .message-header { - background-color: #375a7f; - color: #fff; } - html.theme--documenter-dark .message.is-primary .message-body, html.theme--documenter-dark .docstring > section > a.message.docs-sourcelink .message-body { - border-color: #375a7f; - color: #2b4159; } - html.theme--documenter-dark .message.is-link { - background-color: #f6fefc; } - html.theme--documenter-dark .message.is-link .message-header { - background-color: #1abc9c; - color: #fff; } - html.theme--documenter-dark .message.is-link .message-body { - border-color: #1abc9c; - color: #0b2f28; } - html.theme--documenter-dark .message.is-info { - background-color: #f5fbff; } - html.theme--documenter-dark .message.is-info .message-header { - background-color: #024c7d; - color: #fff; } - html.theme--documenter-dark .message.is-info .message-body { - border-color: #024c7d; - color: #033659; } - html.theme--documenter-dark .message.is-success { - background-color: #f5fff9; } - html.theme--documenter-dark .message.is-success .message-header { - background-color: #008438; - color: #fff; } - html.theme--documenter-dark .message.is-success .message-body { - border-color: #008438; - color: #023518; } - html.theme--documenter-dark .message.is-warning { - background-color: #fffcf5; } - html.theme--documenter-dark .message.is-warning .message-header { - background-color: #ad8100; - color: #fff; } - html.theme--documenter-dark .message.is-warning .message-body { - border-color: #ad8100; - color: #3d2e03; } - html.theme--documenter-dark .message.is-danger { - background-color: #fef6f6; } - html.theme--documenter-dark .message.is-danger .message-header { - background-color: #9e1b0d; - color: #fff; } - html.theme--documenter-dark .message.is-danger .message-body { - border-color: #9e1b0d; - color: #7a170c; } - html.theme--documenter-dark .message-header { - align-items: center; - background-color: #fff; - border-radius: 0.4em 0.4em 0 0; - color: rgba(0, 0, 0, 0.7); - display: flex; - font-weight: 700; - justify-content: space-between; - line-height: 1.25; - padding: 0.75em 1em; - position: relative; } - html.theme--documenter-dark .message-header .delete { - flex-grow: 0; - flex-shrink: 0; - margin-left: 0.75em; } - html.theme--documenter-dark .message-header + .message-body { - border-width: 0; - border-top-left-radius: 0; - border-top-right-radius: 0; } - html.theme--documenter-dark .message-body { - border-color: #5e6d6f; - border-radius: 0.4em; - border-style: solid; - border-width: 0 0 0 4px; - color: #fff; - padding: 1.25em 1.5em; } - html.theme--documenter-dark .message-body code, - html.theme--documenter-dark .message-body pre { - background-color: white; } - html.theme--documenter-dark .message-body pre code { - background-color: transparent; } - html.theme--documenter-dark .modal { - align-items: center; - display: none; - flex-direction: column; - justify-content: center; - overflow: hidden; - position: fixed; - z-index: 40; } - html.theme--documenter-dark .modal.is-active { - display: flex; } - html.theme--documenter-dark .modal-background { - background-color: rgba(10, 10, 10, 0.86); } - html.theme--documenter-dark .modal-content, - html.theme--documenter-dark .modal-card { - margin: 0 20px; - max-height: calc(100vh - 160px); - overflow: auto; - position: relative; - width: 100%; } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .modal-content, - html.theme--documenter-dark .modal-card { - margin: 0 auto; - max-height: calc(100vh - 40px); - width: 640px; } } - html.theme--documenter-dark .modal-close { - background: none; - height: 40px; - position: fixed; - right: 20px; - top: 20px; - width: 40px; } - html.theme--documenter-dark .modal-card { - display: flex; - flex-direction: column; - max-height: calc(100vh - 40px); - overflow: hidden; - -ms-overflow-y: visible; } - html.theme--documenter-dark .modal-card-head, - html.theme--documenter-dark .modal-card-foot { - align-items: center; - background-color: #282f2f; - display: flex; - flex-shrink: 0; - justify-content: flex-start; - padding: 20px; - position: relative; } - html.theme--documenter-dark .modal-card-head { - border-bottom: 1px solid #5e6d6f; - border-top-left-radius: 8px; - border-top-right-radius: 8px; } - html.theme--documenter-dark .modal-card-title { - color: #f2f2f2; - flex-grow: 1; - flex-shrink: 0; - font-size: 1.5rem; - line-height: 1; } - html.theme--documenter-dark .modal-card-foot { - border-bottom-left-radius: 8px; - border-bottom-right-radius: 8px; - border-top: 1px solid #5e6d6f; } - html.theme--documenter-dark .modal-card-foot .button:not(:last-child) { - margin-right: 0.5em; } - html.theme--documenter-dark .modal-card-body { - -webkit-overflow-scrolling: touch; - background-color: white; - flex-grow: 1; - flex-shrink: 1; - overflow: auto; - padding: 20px; } - html.theme--documenter-dark .navbar { - background-color: #375a7f; - min-height: 4rem; - position: relative; - z-index: 30; } - html.theme--documenter-dark .navbar.is-white { - background-color: white; - color: #0a0a0a; } - html.theme--documenter-dark .navbar.is-white .navbar-brand > .navbar-item, - html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link { - color: #0a0a0a; } - html.theme--documenter-dark .navbar.is-white .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-white .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-white .navbar-brand > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:focus, - html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:hover, - html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link.is-active { - background-color: #f2f2f2; - color: #0a0a0a; } - html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link::after { - border-color: #0a0a0a; } - html.theme--documenter-dark .navbar.is-white .navbar-burger { - color: #0a0a0a; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .navbar.is-white .navbar-start > .navbar-item, - html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link, - html.theme--documenter-dark .navbar.is-white .navbar-end > .navbar-item, - html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link { - color: #0a0a0a; } - html.theme--documenter-dark .navbar.is-white .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-white .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-white .navbar-start > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:focus, - html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:hover, - html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link.is-active, - html.theme--documenter-dark .navbar.is-white .navbar-end > a.navbar-item:focus, - html.theme--documenter-dark .navbar.is-white .navbar-end > a.navbar-item:hover, - html.theme--documenter-dark .navbar.is-white .navbar-end > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:focus, - html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:hover, - html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link.is-active { - background-color: #f2f2f2; - color: #0a0a0a; } - html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link::after, - html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link::after { - border-color: #0a0a0a; } - html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:focus .navbar-link, - html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:hover .navbar-link, - html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #f2f2f2; - color: #0a0a0a; } - html.theme--documenter-dark .navbar.is-white .navbar-dropdown a.navbar-item.is-active { - background-color: white; - color: #0a0a0a; } } - html.theme--documenter-dark .navbar.is-black { - background-color: #0a0a0a; - color: white; } - html.theme--documenter-dark .navbar.is-black .navbar-brand > .navbar-item, - html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link { - color: white; } - html.theme--documenter-dark .navbar.is-black .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-black .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-black .navbar-brand > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:focus, - html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:hover, - html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link.is-active { - background-color: black; - color: white; } - html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link::after { - border-color: white; } - html.theme--documenter-dark .navbar.is-black .navbar-burger { - color: white; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .navbar.is-black .navbar-start > .navbar-item, - html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link, - html.theme--documenter-dark .navbar.is-black .navbar-end > .navbar-item, - html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link { - color: white; } - html.theme--documenter-dark .navbar.is-black .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-black .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-black .navbar-start > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:focus, - html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:hover, - html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link.is-active, - html.theme--documenter-dark .navbar.is-black .navbar-end > a.navbar-item:focus, - html.theme--documenter-dark .navbar.is-black .navbar-end > a.navbar-item:hover, - html.theme--documenter-dark .navbar.is-black .navbar-end > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:focus, - html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:hover, - html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link.is-active { - background-color: black; - color: white; } - html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link::after, - html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link::after { - border-color: white; } - html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:focus .navbar-link, - html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:hover .navbar-link, - html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link { - background-color: black; - color: white; } - html.theme--documenter-dark .navbar.is-black .navbar-dropdown a.navbar-item.is-active { - background-color: #0a0a0a; - color: white; } } - html.theme--documenter-dark .navbar.is-light { - background-color: #ecf0f1; - color: #282f2f; } - html.theme--documenter-dark .navbar.is-light .navbar-brand > .navbar-item, - html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link { - color: #282f2f; } - html.theme--documenter-dark .navbar.is-light .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-light .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-light .navbar-brand > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:focus, - html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:hover, - html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link.is-active { - background-color: #dde4e6; - color: #282f2f; } - html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link::after { - border-color: #282f2f; } - html.theme--documenter-dark .navbar.is-light .navbar-burger { - color: #282f2f; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .navbar.is-light .navbar-start > .navbar-item, - html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link, - html.theme--documenter-dark .navbar.is-light .navbar-end > .navbar-item, - html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link { - color: #282f2f; } - html.theme--documenter-dark .navbar.is-light .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-light .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-light .navbar-start > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:focus, - html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:hover, - html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link.is-active, - html.theme--documenter-dark .navbar.is-light .navbar-end > a.navbar-item:focus, - html.theme--documenter-dark .navbar.is-light .navbar-end > a.navbar-item:hover, - html.theme--documenter-dark .navbar.is-light .navbar-end > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:focus, - html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:hover, - html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link.is-active { - background-color: #dde4e6; - color: #282f2f; } - html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link::after, - html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link::after { - border-color: #282f2f; } - html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:focus .navbar-link, - html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:hover .navbar-link, - html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #dde4e6; - color: #282f2f; } - html.theme--documenter-dark .navbar.is-light .navbar-dropdown a.navbar-item.is-active { - background-color: #ecf0f1; - color: #282f2f; } } - html.theme--documenter-dark .navbar.is-dark, html.theme--documenter-dark .content kbd.navbar { - background-color: #282f2f; - color: #ecf0f1; } - html.theme--documenter-dark .navbar.is-dark .navbar-brand > .navbar-item, html.theme--documenter-dark .content kbd.navbar .navbar-brand > .navbar-item, - html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link, - html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link { - color: #ecf0f1; } - html.theme--documenter-dark .navbar.is-dark .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .content kbd.navbar .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-dark .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .content kbd.navbar .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-dark .navbar-brand > a.navbar-item.is-active, html.theme--documenter-dark .content kbd.navbar .navbar-brand > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:focus, - html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:focus, - html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:hover, - html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:hover, - html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link.is-active, - html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link.is-active { - background-color: #1d2122; - color: #ecf0f1; } - html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link::after, html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link::after { - border-color: #ecf0f1; } - html.theme--documenter-dark .navbar.is-dark .navbar-burger, html.theme--documenter-dark .content kbd.navbar .navbar-burger { - color: #ecf0f1; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .navbar.is-dark .navbar-start > .navbar-item, html.theme--documenter-dark .content kbd.navbar .navbar-start > .navbar-item, - html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link, - html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link, - html.theme--documenter-dark .navbar.is-dark .navbar-end > .navbar-item, - html.theme--documenter-dark .content kbd.navbar .navbar-end > .navbar-item, - html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link, - html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link { - color: #ecf0f1; } - html.theme--documenter-dark .navbar.is-dark .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .content kbd.navbar .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-dark .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .content kbd.navbar .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-dark .navbar-start > a.navbar-item.is-active, html.theme--documenter-dark .content kbd.navbar .navbar-start > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:focus, - html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:focus, - html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:hover, - html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:hover, - html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link.is-active, - html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link.is-active, - html.theme--documenter-dark .navbar.is-dark .navbar-end > a.navbar-item:focus, - html.theme--documenter-dark .content kbd.navbar .navbar-end > a.navbar-item:focus, - html.theme--documenter-dark .navbar.is-dark .navbar-end > a.navbar-item:hover, - html.theme--documenter-dark .content kbd.navbar .navbar-end > a.navbar-item:hover, - html.theme--documenter-dark .navbar.is-dark .navbar-end > a.navbar-item.is-active, - html.theme--documenter-dark .content kbd.navbar .navbar-end > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:focus, - html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:focus, - html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:hover, - html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:hover, - html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link.is-active, - html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link.is-active { - background-color: #1d2122; - color: #ecf0f1; } - html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link::after, html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link::after, - html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link::after, - html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link::after { - border-color: #ecf0f1; } - html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link, html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link, - html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link, - html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link, - html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link, - html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #1d2122; - color: #ecf0f1; } - html.theme--documenter-dark .navbar.is-dark .navbar-dropdown a.navbar-item.is-active, html.theme--documenter-dark .content kbd.navbar .navbar-dropdown a.navbar-item.is-active { - background-color: #282f2f; - color: #ecf0f1; } } - html.theme--documenter-dark .navbar.is-primary, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink { - background-color: #375a7f; - color: #fff; } - html.theme--documenter-dark .navbar.is-primary .navbar-brand > .navbar-item, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand > .navbar-item, - html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link { - color: #fff; } - html.theme--documenter-dark .navbar.is-primary .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-primary .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-primary .navbar-brand > a.navbar-item.is-active, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:focus, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus, - html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:hover, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover, - html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link.is-active, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active { - background-color: #2f4d6d; - color: #fff; } - html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link::after, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link::after { - border-color: #fff; } - html.theme--documenter-dark .navbar.is-primary .navbar-burger, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-burger { - color: #fff; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .navbar.is-primary .navbar-start > .navbar-item, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start > .navbar-item, - html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link, - html.theme--documenter-dark .navbar.is-primary .navbar-end > .navbar-item, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end > .navbar-item, - html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link { - color: #fff; } - html.theme--documenter-dark .navbar.is-primary .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-primary .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-primary .navbar-start > a.navbar-item.is-active, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:focus, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link:focus, - html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:hover, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link:hover, - html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link.is-active, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active, - html.theme--documenter-dark .navbar.is-primary .navbar-end > a.navbar-item:focus, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end > a.navbar-item:focus, - html.theme--documenter-dark .navbar.is-primary .navbar-end > a.navbar-item:hover, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end > a.navbar-item:hover, - html.theme--documenter-dark .navbar.is-primary .navbar-end > a.navbar-item.is-active, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:focus, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link:focus, - html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:hover, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link:hover, - html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link.is-active, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active { - background-color: #2f4d6d; - color: #fff; } - html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link::after, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link::after, - html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link::after, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link::after { - border-color: #fff; } - html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link, - html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link, - html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link, - html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #2f4d6d; - color: #fff; } - html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active { - background-color: #375a7f; - color: #fff; } } - html.theme--documenter-dark .navbar.is-link { - background-color: #1abc9c; - color: #fff; } - html.theme--documenter-dark .navbar.is-link .navbar-brand > .navbar-item, - html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link { - color: #fff; } - html.theme--documenter-dark .navbar.is-link .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-link .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-link .navbar-brand > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:focus, - html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:hover, - html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link.is-active { - background-color: #17a689; - color: #fff; } - html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link::after { - border-color: #fff; } - html.theme--documenter-dark .navbar.is-link .navbar-burger { - color: #fff; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .navbar.is-link .navbar-start > .navbar-item, - html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link, - html.theme--documenter-dark .navbar.is-link .navbar-end > .navbar-item, - html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link { - color: #fff; } - html.theme--documenter-dark .navbar.is-link .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-link .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-link .navbar-start > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:focus, - html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:hover, - html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link.is-active, - html.theme--documenter-dark .navbar.is-link .navbar-end > a.navbar-item:focus, - html.theme--documenter-dark .navbar.is-link .navbar-end > a.navbar-item:hover, - html.theme--documenter-dark .navbar.is-link .navbar-end > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:focus, - html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:hover, - html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link.is-active { - background-color: #17a689; - color: #fff; } - html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link::after, - html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link::after { - border-color: #fff; } - html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:focus .navbar-link, - html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:hover .navbar-link, - html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #17a689; - color: #fff; } - html.theme--documenter-dark .navbar.is-link .navbar-dropdown a.navbar-item.is-active { - background-color: #1abc9c; - color: #fff; } } - html.theme--documenter-dark .navbar.is-info { - background-color: #024c7d; - color: #fff; } - html.theme--documenter-dark .navbar.is-info .navbar-brand > .navbar-item, - html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link { - color: #fff; } - html.theme--documenter-dark .navbar.is-info .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-info .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-info .navbar-brand > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:focus, - html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:hover, - html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link.is-active { - background-color: #023d64; - color: #fff; } - html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link::after { - border-color: #fff; } - html.theme--documenter-dark .navbar.is-info .navbar-burger { - color: #fff; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .navbar.is-info .navbar-start > .navbar-item, - html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link, - html.theme--documenter-dark .navbar.is-info .navbar-end > .navbar-item, - html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link { - color: #fff; } - html.theme--documenter-dark .navbar.is-info .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-info .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-info .navbar-start > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:focus, - html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:hover, - html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link.is-active, - html.theme--documenter-dark .navbar.is-info .navbar-end > a.navbar-item:focus, - html.theme--documenter-dark .navbar.is-info .navbar-end > a.navbar-item:hover, - html.theme--documenter-dark .navbar.is-info .navbar-end > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:focus, - html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:hover, - html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link.is-active { - background-color: #023d64; - color: #fff; } - html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link::after, - html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link::after { - border-color: #fff; } - html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:focus .navbar-link, - html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:hover .navbar-link, - html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #023d64; - color: #fff; } - html.theme--documenter-dark .navbar.is-info .navbar-dropdown a.navbar-item.is-active { - background-color: #024c7d; - color: #fff; } } - html.theme--documenter-dark .navbar.is-success { - background-color: #008438; - color: #fff; } - html.theme--documenter-dark .navbar.is-success .navbar-brand > .navbar-item, - html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link { - color: #fff; } - html.theme--documenter-dark .navbar.is-success .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-success .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-success .navbar-brand > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:focus, - html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:hover, - html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link.is-active { - background-color: #006b2d; - color: #fff; } - html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link::after { - border-color: #fff; } - html.theme--documenter-dark .navbar.is-success .navbar-burger { - color: #fff; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .navbar.is-success .navbar-start > .navbar-item, - html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link, - html.theme--documenter-dark .navbar.is-success .navbar-end > .navbar-item, - html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link { - color: #fff; } - html.theme--documenter-dark .navbar.is-success .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-success .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-success .navbar-start > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:focus, - html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:hover, - html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link.is-active, - html.theme--documenter-dark .navbar.is-success .navbar-end > a.navbar-item:focus, - html.theme--documenter-dark .navbar.is-success .navbar-end > a.navbar-item:hover, - html.theme--documenter-dark .navbar.is-success .navbar-end > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:focus, - html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:hover, - html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link.is-active { - background-color: #006b2d; - color: #fff; } - html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link::after, - html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link::after { - border-color: #fff; } - html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:focus .navbar-link, - html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:hover .navbar-link, - html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #006b2d; - color: #fff; } - html.theme--documenter-dark .navbar.is-success .navbar-dropdown a.navbar-item.is-active { - background-color: #008438; - color: #fff; } } - html.theme--documenter-dark .navbar.is-warning { - background-color: #ad8100; - color: #fff; } - html.theme--documenter-dark .navbar.is-warning .navbar-brand > .navbar-item, - html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link { - color: #fff; } - html.theme--documenter-dark .navbar.is-warning .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-warning .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-warning .navbar-brand > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:focus, - html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:hover, - html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link.is-active { - background-color: #946e00; - color: #fff; } - html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link::after { - border-color: #fff; } - html.theme--documenter-dark .navbar.is-warning .navbar-burger { - color: #fff; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .navbar.is-warning .navbar-start > .navbar-item, - html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link, - html.theme--documenter-dark .navbar.is-warning .navbar-end > .navbar-item, - html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link { - color: #fff; } - html.theme--documenter-dark .navbar.is-warning .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-warning .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-warning .navbar-start > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:focus, - html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:hover, - html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link.is-active, - html.theme--documenter-dark .navbar.is-warning .navbar-end > a.navbar-item:focus, - html.theme--documenter-dark .navbar.is-warning .navbar-end > a.navbar-item:hover, - html.theme--documenter-dark .navbar.is-warning .navbar-end > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:focus, - html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:hover, - html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link.is-active { - background-color: #946e00; - color: #fff; } - html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link::after, - html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link::after { - border-color: #fff; } - html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link, - html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link, - html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #946e00; - color: #fff; } - html.theme--documenter-dark .navbar.is-warning .navbar-dropdown a.navbar-item.is-active { - background-color: #ad8100; - color: #fff; } } - html.theme--documenter-dark .navbar.is-danger { - background-color: #9e1b0d; - color: #fff; } - html.theme--documenter-dark .navbar.is-danger .navbar-brand > .navbar-item, - html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link { - color: #fff; } - html.theme--documenter-dark .navbar.is-danger .navbar-brand > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-danger .navbar-brand > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-danger .navbar-brand > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:focus, - html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:hover, - html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link.is-active { - background-color: #86170b; - color: #fff; } - html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link::after { - border-color: #fff; } - html.theme--documenter-dark .navbar.is-danger .navbar-burger { - color: #fff; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .navbar.is-danger .navbar-start > .navbar-item, - html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link, - html.theme--documenter-dark .navbar.is-danger .navbar-end > .navbar-item, - html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link { - color: #fff; } - html.theme--documenter-dark .navbar.is-danger .navbar-start > a.navbar-item:focus, html.theme--documenter-dark .navbar.is-danger .navbar-start > a.navbar-item:hover, html.theme--documenter-dark .navbar.is-danger .navbar-start > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:focus, - html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:hover, - html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link.is-active, - html.theme--documenter-dark .navbar.is-danger .navbar-end > a.navbar-item:focus, - html.theme--documenter-dark .navbar.is-danger .navbar-end > a.navbar-item:hover, - html.theme--documenter-dark .navbar.is-danger .navbar-end > a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:focus, - html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:hover, - html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link.is-active { - background-color: #86170b; - color: #fff; } - html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link::after, - html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link::after { - border-color: #fff; } - html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link, - html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link, - html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #86170b; - color: #fff; } - html.theme--documenter-dark .navbar.is-danger .navbar-dropdown a.navbar-item.is-active { - background-color: #9e1b0d; - color: #fff; } } - html.theme--documenter-dark .navbar > .container { - align-items: stretch; - display: flex; - min-height: 4rem; - width: 100%; } - html.theme--documenter-dark .navbar.has-shadow { - box-shadow: 0 2px 0 0 #282f2f; } - html.theme--documenter-dark .navbar.is-fixed-bottom, html.theme--documenter-dark .navbar.is-fixed-top { - left: 0; - position: fixed; - right: 0; - z-index: 30; } - html.theme--documenter-dark .navbar.is-fixed-bottom { - bottom: 0; } - html.theme--documenter-dark .navbar.is-fixed-bottom.has-shadow { - box-shadow: 0 -2px 0 0 #282f2f; } - html.theme--documenter-dark .navbar.is-fixed-top { - top: 0; } - html.theme--documenter-dark html.has-navbar-fixed-top, - html.theme--documenter-dark body.has-navbar-fixed-top { - padding-top: 4rem; } - html.theme--documenter-dark html.has-navbar-fixed-bottom, - html.theme--documenter-dark body.has-navbar-fixed-bottom { - padding-bottom: 4rem; } - html.theme--documenter-dark .navbar-brand, - html.theme--documenter-dark .navbar-tabs { - align-items: stretch; - display: flex; - flex-shrink: 0; - min-height: 4rem; } - html.theme--documenter-dark .navbar-brand a.navbar-item:focus, html.theme--documenter-dark .navbar-brand a.navbar-item:hover { - background-color: transparent; } - html.theme--documenter-dark .navbar-tabs { - -webkit-overflow-scrolling: touch; - max-width: 100vw; - overflow-x: auto; - overflow-y: hidden; } - html.theme--documenter-dark .navbar-burger { - color: #fff; - cursor: pointer; - display: block; - height: 4rem; - position: relative; - width: 4rem; - margin-left: auto; } - html.theme--documenter-dark .navbar-burger span { - background-color: currentColor; - display: block; - height: 1px; - left: calc(50% - 8px); - position: absolute; - transform-origin: center; - transition-duration: 86ms; - transition-property: background-color, opacity, transform; - transition-timing-function: ease-out; - width: 16px; } - html.theme--documenter-dark .navbar-burger span:nth-child(1) { - top: calc(50% - 6px); } - html.theme--documenter-dark .navbar-burger span:nth-child(2) { - top: calc(50% - 1px); } - html.theme--documenter-dark .navbar-burger span:nth-child(3) { - top: calc(50% + 4px); } - html.theme--documenter-dark .navbar-burger:hover { - background-color: rgba(0, 0, 0, 0.05); } - html.theme--documenter-dark .navbar-burger.is-active span:nth-child(1) { - transform: translateY(5px) rotate(45deg); } - html.theme--documenter-dark .navbar-burger.is-active span:nth-child(2) { - opacity: 0; } - html.theme--documenter-dark .navbar-burger.is-active span:nth-child(3) { - transform: translateY(-5px) rotate(-45deg); } - html.theme--documenter-dark .navbar-menu { - display: none; } - html.theme--documenter-dark .navbar-item, - html.theme--documenter-dark .navbar-link { - color: #fff; - display: block; - line-height: 1.5; - padding: 0.5rem 0.75rem; - position: relative; } - html.theme--documenter-dark .navbar-item .icon:only-child, - html.theme--documenter-dark .navbar-link .icon:only-child { - margin-left: -0.25rem; - margin-right: -0.25rem; } - html.theme--documenter-dark a.navbar-item, - html.theme--documenter-dark .navbar-link { - cursor: pointer; } - html.theme--documenter-dark a.navbar-item:focus, html.theme--documenter-dark a.navbar-item:focus-within, html.theme--documenter-dark a.navbar-item:hover, html.theme--documenter-dark a.navbar-item.is-active, - html.theme--documenter-dark .navbar-link:focus, - html.theme--documenter-dark .navbar-link:focus-within, - html.theme--documenter-dark .navbar-link:hover, - html.theme--documenter-dark .navbar-link.is-active { - background-color: transparent; - color: #1abc9c; } - html.theme--documenter-dark .navbar-item { - display: block; - flex-grow: 0; - flex-shrink: 0; } - html.theme--documenter-dark .navbar-item img { - max-height: 1.75rem; } - html.theme--documenter-dark .navbar-item.has-dropdown { - padding: 0; } - html.theme--documenter-dark .navbar-item.is-expanded { - flex-grow: 1; - flex-shrink: 1; } - html.theme--documenter-dark .navbar-item.is-tab { - border-bottom: 1px solid transparent; - min-height: 4rem; - padding-bottom: calc(0.5rem - 1px); } - html.theme--documenter-dark .navbar-item.is-tab:focus, html.theme--documenter-dark .navbar-item.is-tab:hover { - background-color: transparent; - border-bottom-color: #1abc9c; } - html.theme--documenter-dark .navbar-item.is-tab.is-active { - background-color: transparent; - border-bottom-color: #1abc9c; - border-bottom-style: solid; - border-bottom-width: 3px; - color: #1abc9c; - padding-bottom: calc(0.5rem - 3px); } - html.theme--documenter-dark .navbar-content { - flex-grow: 1; - flex-shrink: 1; } - html.theme--documenter-dark .navbar-link:not(.is-arrowless) { - padding-right: 2.5em; } - html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after { - border-color: #fff; - margin-top: -0.375em; - right: 1.125em; } - html.theme--documenter-dark .navbar-dropdown { - font-size: 0.875rem; - padding-bottom: 0.5rem; - padding-top: 0.5rem; } - html.theme--documenter-dark .navbar-dropdown .navbar-item { - padding-left: 1.5rem; - padding-right: 1.5rem; } - html.theme--documenter-dark .navbar-divider { - background-color: rgba(0, 0, 0, 0.2); - border: none; - display: none; - height: 2px; - margin: 0.5rem 0; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .navbar > .container { - display: block; } - html.theme--documenter-dark .navbar-brand .navbar-item, - html.theme--documenter-dark .navbar-tabs .navbar-item { - align-items: center; - display: flex; } - html.theme--documenter-dark .navbar-link::after { - display: none; } - html.theme--documenter-dark .navbar-menu { - background-color: #375a7f; - box-shadow: 0 8px 16px rgba(10, 10, 10, 0.1); - padding: 0.5rem 0; } - html.theme--documenter-dark .navbar-menu.is-active { - display: block; } - html.theme--documenter-dark .navbar.is-fixed-bottom-touch, html.theme--documenter-dark .navbar.is-fixed-top-touch { - left: 0; - position: fixed; - right: 0; - z-index: 30; } - html.theme--documenter-dark .navbar.is-fixed-bottom-touch { - bottom: 0; } - html.theme--documenter-dark .navbar.is-fixed-bottom-touch.has-shadow { - box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); } - html.theme--documenter-dark .navbar.is-fixed-top-touch { - top: 0; } - html.theme--documenter-dark .navbar.is-fixed-top .navbar-menu, html.theme--documenter-dark .navbar.is-fixed-top-touch .navbar-menu { - -webkit-overflow-scrolling: touch; - max-height: calc(100vh - 4rem); - overflow: auto; } - html.theme--documenter-dark html.has-navbar-fixed-top-touch, - html.theme--documenter-dark body.has-navbar-fixed-top-touch { - padding-top: 4rem; } - html.theme--documenter-dark html.has-navbar-fixed-bottom-touch, - html.theme--documenter-dark body.has-navbar-fixed-bottom-touch { - padding-bottom: 4rem; } } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .navbar, - html.theme--documenter-dark .navbar-menu, - html.theme--documenter-dark .navbar-start, - html.theme--documenter-dark .navbar-end { - align-items: stretch; - display: flex; } - html.theme--documenter-dark .navbar { - min-height: 4rem; } - html.theme--documenter-dark .navbar.is-spaced { - padding: 1rem 2rem; } - html.theme--documenter-dark .navbar.is-spaced .navbar-start, - html.theme--documenter-dark .navbar.is-spaced .navbar-end { - align-items: center; } - html.theme--documenter-dark .navbar.is-spaced a.navbar-item, - html.theme--documenter-dark .navbar.is-spaced .navbar-link { - border-radius: 0.4em; } - html.theme--documenter-dark .navbar.is-transparent a.navbar-item:focus, html.theme--documenter-dark .navbar.is-transparent a.navbar-item:hover, html.theme--documenter-dark .navbar.is-transparent a.navbar-item.is-active, - html.theme--documenter-dark .navbar.is-transparent .navbar-link:focus, - html.theme--documenter-dark .navbar.is-transparent .navbar-link:hover, - html.theme--documenter-dark .navbar.is-transparent .navbar-link.is-active { - background-color: transparent !important; } - html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link, html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link, html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link, html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link { - background-color: transparent !important; } - html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:focus, html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:hover { - background-color: transparent; - color: #dbdee0; } - html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item.is-active { - background-color: transparent; - color: #1abc9c; } - html.theme--documenter-dark .navbar-burger { - display: none; } - html.theme--documenter-dark .navbar-item, - html.theme--documenter-dark .navbar-link { - align-items: center; - display: flex; } - html.theme--documenter-dark .navbar-item { - display: flex; } - html.theme--documenter-dark .navbar-item.has-dropdown { - align-items: stretch; } - html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-link::after { - transform: rotate(135deg) translate(0.25em, -0.25em); } - html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-dropdown { - border-bottom: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 8px 8px 0 0; - border-top: none; - bottom: 100%; - box-shadow: 0 -8px 8px rgba(10, 10, 10, 0.1); - top: auto; } - html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown { - display: block; } - .navbar.is-spaced html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown.is-boxed, .navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed, .navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed, .navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown, html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed { - opacity: 1; - pointer-events: auto; - transform: translateY(0); } - html.theme--documenter-dark .navbar-menu { - flex-grow: 1; - flex-shrink: 0; } - html.theme--documenter-dark .navbar-start { - justify-content: flex-start; - margin-right: auto; } - html.theme--documenter-dark .navbar-end { - justify-content: flex-end; - margin-left: auto; } - html.theme--documenter-dark .navbar-dropdown { - background-color: #375a7f; - border-bottom-left-radius: 8px; - border-bottom-right-radius: 8px; - border-top: 1px solid rgba(0, 0, 0, 0.2); - box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1); - display: none; - font-size: 0.875rem; - left: 0; - min-width: 100%; - position: absolute; - top: 100%; - z-index: 20; } - html.theme--documenter-dark .navbar-dropdown .navbar-item { - padding: 0.375rem 1rem; - white-space: nowrap; } - html.theme--documenter-dark .navbar-dropdown a.navbar-item { - padding-right: 3rem; } - html.theme--documenter-dark .navbar-dropdown a.navbar-item:focus, html.theme--documenter-dark .navbar-dropdown a.navbar-item:hover { - background-color: transparent; - color: #dbdee0; } - html.theme--documenter-dark .navbar-dropdown a.navbar-item.is-active { - background-color: transparent; - color: #1abc9c; } - .navbar.is-spaced html.theme--documenter-dark .navbar-dropdown, html.theme--documenter-dark .navbar-dropdown.is-boxed { - border-radius: 8px; - border-top: none; - box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); - display: block; - opacity: 0; - pointer-events: none; - top: calc(100% + (-4px)); - transform: translateY(-5px); - transition-duration: 86ms; - transition-property: opacity, transform; } - html.theme--documenter-dark .navbar-dropdown.is-right { - left: auto; - right: 0; } - html.theme--documenter-dark .navbar-divider { - display: block; } - html.theme--documenter-dark .navbar > .container .navbar-brand, - html.theme--documenter-dark .container > .navbar .navbar-brand { - margin-left: -.75rem; } - html.theme--documenter-dark .navbar > .container .navbar-menu, - html.theme--documenter-dark .container > .navbar .navbar-menu { - margin-right: -.75rem; } - html.theme--documenter-dark .navbar.is-fixed-bottom-desktop, html.theme--documenter-dark .navbar.is-fixed-top-desktop { - left: 0; - position: fixed; - right: 0; - z-index: 30; } - html.theme--documenter-dark .navbar.is-fixed-bottom-desktop { - bottom: 0; } - html.theme--documenter-dark .navbar.is-fixed-bottom-desktop.has-shadow { - box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); } - html.theme--documenter-dark .navbar.is-fixed-top-desktop { - top: 0; } - html.theme--documenter-dark html.has-navbar-fixed-top-desktop, - html.theme--documenter-dark body.has-navbar-fixed-top-desktop { - padding-top: 4rem; } - html.theme--documenter-dark html.has-navbar-fixed-bottom-desktop, - html.theme--documenter-dark body.has-navbar-fixed-bottom-desktop { - padding-bottom: 4rem; } - html.theme--documenter-dark html.has-spaced-navbar-fixed-top, - html.theme--documenter-dark body.has-spaced-navbar-fixed-top { - padding-top: 6rem; } - html.theme--documenter-dark html.has-spaced-navbar-fixed-bottom, - html.theme--documenter-dark body.has-spaced-navbar-fixed-bottom { - padding-bottom: 6rem; } - html.theme--documenter-dark a.navbar-item.is-active, - html.theme--documenter-dark .navbar-link.is-active { - color: #1abc9c; } - html.theme--documenter-dark a.navbar-item.is-active:not(:focus):not(:hover), - html.theme--documenter-dark .navbar-link.is-active:not(:focus):not(:hover) { - background-color: transparent; } - html.theme--documenter-dark .navbar-item.has-dropdown:focus .navbar-link, html.theme--documenter-dark .navbar-item.has-dropdown:hover .navbar-link, html.theme--documenter-dark .navbar-item.has-dropdown.is-active .navbar-link { - background-color: transparent; } } - html.theme--documenter-dark .hero.is-fullheight-with-navbar { - min-height: calc(100vh - 4rem); } - html.theme--documenter-dark .pagination { - font-size: 15px; - margin: -0.25rem; } - html.theme--documenter-dark .pagination.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.pagination { - font-size: 0.85em; } - html.theme--documenter-dark .pagination.is-medium { - font-size: 1.25rem; } - html.theme--documenter-dark .pagination.is-large { - font-size: 1.5rem; } - html.theme--documenter-dark .pagination.is-rounded .pagination-previous, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.pagination .pagination-previous, - html.theme--documenter-dark .pagination.is-rounded .pagination-next, - html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.pagination .pagination-next { - padding-left: 1em; - padding-right: 1em; - border-radius: 290486px; } - html.theme--documenter-dark .pagination.is-rounded .pagination-link, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.pagination .pagination-link { - border-radius: 290486px; } - html.theme--documenter-dark .pagination, - html.theme--documenter-dark .pagination-list { - align-items: center; - display: flex; - justify-content: center; - text-align: center; } - html.theme--documenter-dark .pagination-previous, - html.theme--documenter-dark .pagination-next, - html.theme--documenter-dark .pagination-link, - html.theme--documenter-dark .pagination-ellipsis { - font-size: 1em; - justify-content: center; - margin: 0.25rem; - padding-left: 0.5em; - padding-right: 0.5em; - text-align: center; } - html.theme--documenter-dark .pagination-previous, - html.theme--documenter-dark .pagination-next, - html.theme--documenter-dark .pagination-link { - border-color: #5e6d6f; - color: #1abc9c; - min-width: 2.25em; } - html.theme--documenter-dark .pagination-previous:hover, - html.theme--documenter-dark .pagination-next:hover, - html.theme--documenter-dark .pagination-link:hover { - border-color: #8c9b9d; - color: #1dd2af; } - html.theme--documenter-dark .pagination-previous:focus, - html.theme--documenter-dark .pagination-next:focus, - html.theme--documenter-dark .pagination-link:focus { - border-color: #8c9b9d; } - html.theme--documenter-dark .pagination-previous:active, - html.theme--documenter-dark .pagination-next:active, - html.theme--documenter-dark .pagination-link:active { - box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); } - html.theme--documenter-dark .pagination-previous[disabled], - html.theme--documenter-dark .pagination-next[disabled], - html.theme--documenter-dark .pagination-link[disabled] { - background-color: #dbdee0; - border-color: #dbdee0; - box-shadow: none; - color: #5e6d6f; - opacity: 0.5; } - html.theme--documenter-dark .pagination-previous, - html.theme--documenter-dark .pagination-next { - padding-left: 0.75em; - padding-right: 0.75em; - white-space: nowrap; } - html.theme--documenter-dark .pagination-link.is-current { - background-color: #1abc9c; - border-color: #1abc9c; - color: #fff; } - html.theme--documenter-dark .pagination-ellipsis { - color: #8c9b9d; - pointer-events: none; } - html.theme--documenter-dark .pagination-list { - flex-wrap: wrap; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .pagination { - flex-wrap: wrap; } - html.theme--documenter-dark .pagination-previous, - html.theme--documenter-dark .pagination-next { - flex-grow: 1; - flex-shrink: 1; } - html.theme--documenter-dark .pagination-list li { - flex-grow: 1; - flex-shrink: 1; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .pagination-list { - flex-grow: 1; - flex-shrink: 1; - justify-content: flex-start; - order: 1; } - html.theme--documenter-dark .pagination-previous { - order: 2; } - html.theme--documenter-dark .pagination-next { - order: 3; } - html.theme--documenter-dark .pagination { - justify-content: space-between; } - html.theme--documenter-dark .pagination.is-centered .pagination-previous { - order: 1; } - html.theme--documenter-dark .pagination.is-centered .pagination-list { - justify-content: center; - order: 2; } - html.theme--documenter-dark .pagination.is-centered .pagination-next { - order: 3; } - html.theme--documenter-dark .pagination.is-right .pagination-previous { - order: 1; } - html.theme--documenter-dark .pagination.is-right .pagination-next { - order: 2; } - html.theme--documenter-dark .pagination.is-right .pagination-list { - justify-content: flex-end; - order: 3; } } - html.theme--documenter-dark .panel { - font-size: 15px; } - html.theme--documenter-dark .panel:not(:last-child) { - margin-bottom: 1.5rem; } - html.theme--documenter-dark .panel-heading, - html.theme--documenter-dark .panel-tabs, - html.theme--documenter-dark .panel-block { - border-bottom: 1px solid #5e6d6f; - border-left: 1px solid #5e6d6f; - border-right: 1px solid #5e6d6f; } - html.theme--documenter-dark .panel-heading:first-child, - html.theme--documenter-dark .panel-tabs:first-child, - html.theme--documenter-dark .panel-block:first-child { - border-top: 1px solid #5e6d6f; } - html.theme--documenter-dark .panel-heading { - background-color: #282f2f; - border-radius: 0.4em 0.4em 0 0; - color: #f2f2f2; - font-size: 1.25em; - font-weight: 300; - line-height: 1.25; - padding: 0.5em 0.75em; } - html.theme--documenter-dark .panel-tabs { - align-items: flex-end; - display: flex; - font-size: 0.875em; - justify-content: center; } - html.theme--documenter-dark .panel-tabs a { - border-bottom: 1px solid #5e6d6f; - margin-bottom: -1px; - padding: 0.5em; } - html.theme--documenter-dark .panel-tabs a.is-active { - border-bottom-color: #343c3d; - color: #17a689; } - html.theme--documenter-dark .panel-list a { - color: #fff; } - html.theme--documenter-dark .panel-list a:hover { - color: #1abc9c; } - html.theme--documenter-dark .panel-block { - align-items: center; - color: #f2f2f2; - display: flex; - justify-content: flex-start; - padding: 0.5em 0.75em; } - html.theme--documenter-dark .panel-block input[type="checkbox"] { - margin-right: 0.75em; } - html.theme--documenter-dark .panel-block > .control { - flex-grow: 1; - flex-shrink: 1; - width: 100%; } - html.theme--documenter-dark .panel-block.is-wrapped { - flex-wrap: wrap; } - html.theme--documenter-dark .panel-block.is-active { - border-left-color: #1abc9c; - color: #17a689; } - html.theme--documenter-dark .panel-block.is-active .panel-icon { - color: #1abc9c; } - html.theme--documenter-dark a.panel-block, - html.theme--documenter-dark label.panel-block { - cursor: pointer; } - html.theme--documenter-dark a.panel-block:hover, - html.theme--documenter-dark label.panel-block:hover { - background-color: #282f2f; } - html.theme--documenter-dark .panel-icon { - display: inline-block; - font-size: 14px; - height: 1em; - line-height: 1em; - text-align: center; - vertical-align: top; - width: 1em; - color: white; - margin-right: 0.75em; } - html.theme--documenter-dark .panel-icon .fa { - font-size: inherit; - line-height: inherit; } - html.theme--documenter-dark .tabs { - -webkit-overflow-scrolling: touch; - align-items: stretch; - display: flex; - font-size: 15px; - justify-content: space-between; - overflow: hidden; - overflow-x: auto; - white-space: nowrap; } - html.theme--documenter-dark .tabs a { - align-items: center; - border-bottom-color: #5e6d6f; - border-bottom-style: solid; - border-bottom-width: 1px; - color: #fff; - display: flex; - justify-content: center; - margin-bottom: -1px; - padding: 0.5em 1em; - vertical-align: top; } - html.theme--documenter-dark .tabs a:hover { - border-bottom-color: #f2f2f2; - color: #f2f2f2; } - html.theme--documenter-dark .tabs li { - display: block; } - html.theme--documenter-dark .tabs li.is-active a { - border-bottom-color: #1abc9c; - color: #1abc9c; } - html.theme--documenter-dark .tabs ul { - align-items: center; - border-bottom-color: #5e6d6f; - border-bottom-style: solid; - border-bottom-width: 1px; - display: flex; - flex-grow: 1; - flex-shrink: 0; - justify-content: flex-start; } - html.theme--documenter-dark .tabs ul.is-left { - padding-right: 0.75em; } - html.theme--documenter-dark .tabs ul.is-center { - flex: none; - justify-content: center; - padding-left: 0.75em; - padding-right: 0.75em; } - html.theme--documenter-dark .tabs ul.is-right { - justify-content: flex-end; - padding-left: 0.75em; } - html.theme--documenter-dark .tabs .icon:first-child { - margin-right: 0.5em; } - html.theme--documenter-dark .tabs .icon:last-child { - margin-left: 0.5em; } - html.theme--documenter-dark .tabs.is-centered ul { - justify-content: center; } - html.theme--documenter-dark .tabs.is-right ul { - justify-content: flex-end; } - html.theme--documenter-dark .tabs.is-boxed a { - border: 1px solid transparent; - border-radius: 0.4em 0.4em 0 0; } - html.theme--documenter-dark .tabs.is-boxed a:hover { - background-color: #282f2f; - border-bottom-color: #5e6d6f; } - html.theme--documenter-dark .tabs.is-boxed li.is-active a { - background-color: white; - border-color: #5e6d6f; - border-bottom-color: transparent !important; } - html.theme--documenter-dark .tabs.is-fullwidth li { - flex-grow: 1; - flex-shrink: 0; } - html.theme--documenter-dark .tabs.is-toggle a { - border-color: #5e6d6f; - border-style: solid; - border-width: 1px; - margin-bottom: 0; - position: relative; } - html.theme--documenter-dark .tabs.is-toggle a:hover { - background-color: #282f2f; - border-color: #8c9b9d; - z-index: 2; } - html.theme--documenter-dark .tabs.is-toggle li + li { - margin-left: -1px; } - html.theme--documenter-dark .tabs.is-toggle li:first-child a { - border-radius: 0.4em 0 0 0.4em; } - html.theme--documenter-dark .tabs.is-toggle li:last-child a { - border-radius: 0 0.4em 0.4em 0; } - html.theme--documenter-dark .tabs.is-toggle li.is-active a { - background-color: #1abc9c; - border-color: #1abc9c; - color: #fff; - z-index: 1; } - html.theme--documenter-dark .tabs.is-toggle ul { - border-bottom: none; } - html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:first-child a { - border-bottom-left-radius: 290486px; - border-top-left-radius: 290486px; - padding-left: 1.25em; } - html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:last-child a { - border-bottom-right-radius: 290486px; - border-top-right-radius: 290486px; - padding-right: 1.25em; } - html.theme--documenter-dark .tabs.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.tabs { - font-size: 0.85em; } - html.theme--documenter-dark .tabs.is-medium { - font-size: 1.25rem; } - html.theme--documenter-dark .tabs.is-large { - font-size: 1.5rem; } - html.theme--documenter-dark .column { - display: block; - flex-basis: 0; - flex-grow: 1; - flex-shrink: 1; - padding: 0.75rem; } - .columns.is-mobile > html.theme--documenter-dark .column.is-narrow { - flex: none; } - .columns.is-mobile > html.theme--documenter-dark .column.is-full { - flex: none; - width: 100%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-three-quarters { - flex: none; - width: 75%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-two-thirds { - flex: none; - width: 66.6666%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-half { - flex: none; - width: 50%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-one-third { - flex: none; - width: 33.3333%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-one-quarter { - flex: none; - width: 25%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-one-fifth { - flex: none; - width: 20%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-two-fifths { - flex: none; - width: 40%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-three-fifths { - flex: none; - width: 60%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-four-fifths { - flex: none; - width: 80%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-three-quarters { - margin-left: 75%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-two-thirds { - margin-left: 66.6666%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-half { - margin-left: 50%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-one-third { - margin-left: 33.3333%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-one-quarter { - margin-left: 25%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-one-fifth { - margin-left: 20%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-two-fifths { - margin-left: 40%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-three-fifths { - margin-left: 60%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-four-fifths { - margin-left: 80%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-0 { - flex: none; - width: 0%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-0 { - margin-left: 0%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-1 { - flex: none; - width: 8.3333333333%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-1 { - margin-left: 8.3333333333%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-2 { - flex: none; - width: 16.6666666667%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-2 { - margin-left: 16.6666666667%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-3 { - flex: none; - width: 25%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-3 { - margin-left: 25%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-4 { - flex: none; - width: 33.3333333333%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-4 { - margin-left: 33.3333333333%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-5 { - flex: none; - width: 41.6666666667%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-5 { - margin-left: 41.6666666667%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-6 { - flex: none; - width: 50%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-6 { - margin-left: 50%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-7 { - flex: none; - width: 58.3333333333%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-7 { - margin-left: 58.3333333333%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-8 { - flex: none; - width: 66.6666666667%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-8 { - margin-left: 66.6666666667%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-9 { - flex: none; - width: 75%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-9 { - margin-left: 75%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-10 { - flex: none; - width: 83.3333333333%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-10 { - margin-left: 83.3333333333%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-11 { - flex: none; - width: 91.6666666667%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-11 { - margin-left: 91.6666666667%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-12 { - flex: none; - width: 100%; } - .columns.is-mobile > html.theme--documenter-dark .column.is-offset-12 { - margin-left: 100%; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .column.is-narrow-mobile { - flex: none; } - html.theme--documenter-dark .column.is-full-mobile { - flex: none; - width: 100%; } - html.theme--documenter-dark .column.is-three-quarters-mobile { - flex: none; - width: 75%; } - html.theme--documenter-dark .column.is-two-thirds-mobile { - flex: none; - width: 66.6666%; } - html.theme--documenter-dark .column.is-half-mobile { - flex: none; - width: 50%; } - html.theme--documenter-dark .column.is-one-third-mobile { - flex: none; - width: 33.3333%; } - html.theme--documenter-dark .column.is-one-quarter-mobile { - flex: none; - width: 25%; } - html.theme--documenter-dark .column.is-one-fifth-mobile { - flex: none; - width: 20%; } - html.theme--documenter-dark .column.is-two-fifths-mobile { - flex: none; - width: 40%; } - html.theme--documenter-dark .column.is-three-fifths-mobile { - flex: none; - width: 60%; } - html.theme--documenter-dark .column.is-four-fifths-mobile { - flex: none; - width: 80%; } - html.theme--documenter-dark .column.is-offset-three-quarters-mobile { - margin-left: 75%; } - html.theme--documenter-dark .column.is-offset-two-thirds-mobile { - margin-left: 66.6666%; } - html.theme--documenter-dark .column.is-offset-half-mobile { - margin-left: 50%; } - html.theme--documenter-dark .column.is-offset-one-third-mobile { - margin-left: 33.3333%; } - html.theme--documenter-dark .column.is-offset-one-quarter-mobile { - margin-left: 25%; } - html.theme--documenter-dark .column.is-offset-one-fifth-mobile { - margin-left: 20%; } - html.theme--documenter-dark .column.is-offset-two-fifths-mobile { - margin-left: 40%; } - html.theme--documenter-dark .column.is-offset-three-fifths-mobile { - margin-left: 60%; } - html.theme--documenter-dark .column.is-offset-four-fifths-mobile { - margin-left: 80%; } - html.theme--documenter-dark .column.is-0-mobile { - flex: none; - width: 0%; } - html.theme--documenter-dark .column.is-offset-0-mobile { - margin-left: 0%; } - html.theme--documenter-dark .column.is-1-mobile { - flex: none; - width: 8.3333333333%; } - html.theme--documenter-dark .column.is-offset-1-mobile { - margin-left: 8.3333333333%; } - html.theme--documenter-dark .column.is-2-mobile { - flex: none; - width: 16.6666666667%; } - html.theme--documenter-dark .column.is-offset-2-mobile { - margin-left: 16.6666666667%; } - html.theme--documenter-dark .column.is-3-mobile { - flex: none; - width: 25%; } - html.theme--documenter-dark .column.is-offset-3-mobile { - margin-left: 25%; } - html.theme--documenter-dark .column.is-4-mobile { - flex: none; - width: 33.3333333333%; } - html.theme--documenter-dark .column.is-offset-4-mobile { - margin-left: 33.3333333333%; } - html.theme--documenter-dark .column.is-5-mobile { - flex: none; - width: 41.6666666667%; } - html.theme--documenter-dark .column.is-offset-5-mobile { - margin-left: 41.6666666667%; } - html.theme--documenter-dark .column.is-6-mobile { - flex: none; - width: 50%; } - html.theme--documenter-dark .column.is-offset-6-mobile { - margin-left: 50%; } - html.theme--documenter-dark .column.is-7-mobile { - flex: none; - width: 58.3333333333%; } - html.theme--documenter-dark .column.is-offset-7-mobile { - margin-left: 58.3333333333%; } - html.theme--documenter-dark .column.is-8-mobile { - flex: none; - width: 66.6666666667%; } - html.theme--documenter-dark .column.is-offset-8-mobile { - margin-left: 66.6666666667%; } - html.theme--documenter-dark .column.is-9-mobile { - flex: none; - width: 75%; } - html.theme--documenter-dark .column.is-offset-9-mobile { - margin-left: 75%; } - html.theme--documenter-dark .column.is-10-mobile { - flex: none; - width: 83.3333333333%; } - html.theme--documenter-dark .column.is-offset-10-mobile { - margin-left: 83.3333333333%; } - html.theme--documenter-dark .column.is-11-mobile { - flex: none; - width: 91.6666666667%; } - html.theme--documenter-dark .column.is-offset-11-mobile { - margin-left: 91.6666666667%; } - html.theme--documenter-dark .column.is-12-mobile { - flex: none; - width: 100%; } - html.theme--documenter-dark .column.is-offset-12-mobile { - margin-left: 100%; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .column.is-narrow, html.theme--documenter-dark .column.is-narrow-tablet { - flex: none; } - html.theme--documenter-dark .column.is-full, html.theme--documenter-dark .column.is-full-tablet { - flex: none; - width: 100%; } - html.theme--documenter-dark .column.is-three-quarters, html.theme--documenter-dark .column.is-three-quarters-tablet { - flex: none; - width: 75%; } - html.theme--documenter-dark .column.is-two-thirds, html.theme--documenter-dark .column.is-two-thirds-tablet { - flex: none; - width: 66.6666%; } - html.theme--documenter-dark .column.is-half, html.theme--documenter-dark .column.is-half-tablet { - flex: none; - width: 50%; } - html.theme--documenter-dark .column.is-one-third, html.theme--documenter-dark .column.is-one-third-tablet { - flex: none; - width: 33.3333%; } - html.theme--documenter-dark .column.is-one-quarter, html.theme--documenter-dark .column.is-one-quarter-tablet { - flex: none; - width: 25%; } - html.theme--documenter-dark .column.is-one-fifth, html.theme--documenter-dark .column.is-one-fifth-tablet { - flex: none; - width: 20%; } - html.theme--documenter-dark .column.is-two-fifths, html.theme--documenter-dark .column.is-two-fifths-tablet { - flex: none; - width: 40%; } - html.theme--documenter-dark .column.is-three-fifths, html.theme--documenter-dark .column.is-three-fifths-tablet { - flex: none; - width: 60%; } - html.theme--documenter-dark .column.is-four-fifths, html.theme--documenter-dark .column.is-four-fifths-tablet { - flex: none; - width: 80%; } - html.theme--documenter-dark .column.is-offset-three-quarters, html.theme--documenter-dark .column.is-offset-three-quarters-tablet { - margin-left: 75%; } - html.theme--documenter-dark .column.is-offset-two-thirds, html.theme--documenter-dark .column.is-offset-two-thirds-tablet { - margin-left: 66.6666%; } - html.theme--documenter-dark .column.is-offset-half, html.theme--documenter-dark .column.is-offset-half-tablet { - margin-left: 50%; } - html.theme--documenter-dark .column.is-offset-one-third, html.theme--documenter-dark .column.is-offset-one-third-tablet { - margin-left: 33.3333%; } - html.theme--documenter-dark .column.is-offset-one-quarter, html.theme--documenter-dark .column.is-offset-one-quarter-tablet { - margin-left: 25%; } - html.theme--documenter-dark .column.is-offset-one-fifth, html.theme--documenter-dark .column.is-offset-one-fifth-tablet { - margin-left: 20%; } - html.theme--documenter-dark .column.is-offset-two-fifths, html.theme--documenter-dark .column.is-offset-two-fifths-tablet { - margin-left: 40%; } - html.theme--documenter-dark .column.is-offset-three-fifths, html.theme--documenter-dark .column.is-offset-three-fifths-tablet { - margin-left: 60%; } - html.theme--documenter-dark .column.is-offset-four-fifths, html.theme--documenter-dark .column.is-offset-four-fifths-tablet { - margin-left: 80%; } - html.theme--documenter-dark .column.is-0, html.theme--documenter-dark .column.is-0-tablet { - flex: none; - width: 0%; } - html.theme--documenter-dark .column.is-offset-0, html.theme--documenter-dark .column.is-offset-0-tablet { - margin-left: 0%; } - html.theme--documenter-dark .column.is-1, html.theme--documenter-dark .column.is-1-tablet { - flex: none; - width: 8.3333333333%; } - html.theme--documenter-dark .column.is-offset-1, html.theme--documenter-dark .column.is-offset-1-tablet { - margin-left: 8.3333333333%; } - html.theme--documenter-dark .column.is-2, html.theme--documenter-dark .column.is-2-tablet { - flex: none; - width: 16.6666666667%; } - html.theme--documenter-dark .column.is-offset-2, html.theme--documenter-dark .column.is-offset-2-tablet { - margin-left: 16.6666666667%; } - html.theme--documenter-dark .column.is-3, html.theme--documenter-dark .column.is-3-tablet { - flex: none; - width: 25%; } - html.theme--documenter-dark .column.is-offset-3, html.theme--documenter-dark .column.is-offset-3-tablet { - margin-left: 25%; } - html.theme--documenter-dark .column.is-4, html.theme--documenter-dark .column.is-4-tablet { - flex: none; - width: 33.3333333333%; } - html.theme--documenter-dark .column.is-offset-4, html.theme--documenter-dark .column.is-offset-4-tablet { - margin-left: 33.3333333333%; } - html.theme--documenter-dark .column.is-5, html.theme--documenter-dark .column.is-5-tablet { - flex: none; - width: 41.6666666667%; } - html.theme--documenter-dark .column.is-offset-5, html.theme--documenter-dark .column.is-offset-5-tablet { - margin-left: 41.6666666667%; } - html.theme--documenter-dark .column.is-6, html.theme--documenter-dark .column.is-6-tablet { - flex: none; - width: 50%; } - html.theme--documenter-dark .column.is-offset-6, html.theme--documenter-dark .column.is-offset-6-tablet { - margin-left: 50%; } - html.theme--documenter-dark .column.is-7, html.theme--documenter-dark .column.is-7-tablet { - flex: none; - width: 58.3333333333%; } - html.theme--documenter-dark .column.is-offset-7, html.theme--documenter-dark .column.is-offset-7-tablet { - margin-left: 58.3333333333%; } - html.theme--documenter-dark .column.is-8, html.theme--documenter-dark .column.is-8-tablet { - flex: none; - width: 66.6666666667%; } - html.theme--documenter-dark .column.is-offset-8, html.theme--documenter-dark .column.is-offset-8-tablet { - margin-left: 66.6666666667%; } - html.theme--documenter-dark .column.is-9, html.theme--documenter-dark .column.is-9-tablet { - flex: none; - width: 75%; } - html.theme--documenter-dark .column.is-offset-9, html.theme--documenter-dark .column.is-offset-9-tablet { - margin-left: 75%; } - html.theme--documenter-dark .column.is-10, html.theme--documenter-dark .column.is-10-tablet { - flex: none; - width: 83.3333333333%; } - html.theme--documenter-dark .column.is-offset-10, html.theme--documenter-dark .column.is-offset-10-tablet { - margin-left: 83.3333333333%; } - html.theme--documenter-dark .column.is-11, html.theme--documenter-dark .column.is-11-tablet { - flex: none; - width: 91.6666666667%; } - html.theme--documenter-dark .column.is-offset-11, html.theme--documenter-dark .column.is-offset-11-tablet { - margin-left: 91.6666666667%; } - html.theme--documenter-dark .column.is-12, html.theme--documenter-dark .column.is-12-tablet { - flex: none; - width: 100%; } - html.theme--documenter-dark .column.is-offset-12, html.theme--documenter-dark .column.is-offset-12-tablet { - margin-left: 100%; } } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .column.is-narrow-touch { - flex: none; } - html.theme--documenter-dark .column.is-full-touch { - flex: none; - width: 100%; } - html.theme--documenter-dark .column.is-three-quarters-touch { - flex: none; - width: 75%; } - html.theme--documenter-dark .column.is-two-thirds-touch { - flex: none; - width: 66.6666%; } - html.theme--documenter-dark .column.is-half-touch { - flex: none; - width: 50%; } - html.theme--documenter-dark .column.is-one-third-touch { - flex: none; - width: 33.3333%; } - html.theme--documenter-dark .column.is-one-quarter-touch { - flex: none; - width: 25%; } - html.theme--documenter-dark .column.is-one-fifth-touch { - flex: none; - width: 20%; } - html.theme--documenter-dark .column.is-two-fifths-touch { - flex: none; - width: 40%; } - html.theme--documenter-dark .column.is-three-fifths-touch { - flex: none; - width: 60%; } - html.theme--documenter-dark .column.is-four-fifths-touch { - flex: none; - width: 80%; } - html.theme--documenter-dark .column.is-offset-three-quarters-touch { - margin-left: 75%; } - html.theme--documenter-dark .column.is-offset-two-thirds-touch { - margin-left: 66.6666%; } - html.theme--documenter-dark .column.is-offset-half-touch { - margin-left: 50%; } - html.theme--documenter-dark .column.is-offset-one-third-touch { - margin-left: 33.3333%; } - html.theme--documenter-dark .column.is-offset-one-quarter-touch { - margin-left: 25%; } - html.theme--documenter-dark .column.is-offset-one-fifth-touch { - margin-left: 20%; } - html.theme--documenter-dark .column.is-offset-two-fifths-touch { - margin-left: 40%; } - html.theme--documenter-dark .column.is-offset-three-fifths-touch { - margin-left: 60%; } - html.theme--documenter-dark .column.is-offset-four-fifths-touch { - margin-left: 80%; } - html.theme--documenter-dark .column.is-0-touch { - flex: none; - width: 0%; } - html.theme--documenter-dark .column.is-offset-0-touch { - margin-left: 0%; } - html.theme--documenter-dark .column.is-1-touch { - flex: none; - width: 8.3333333333%; } - html.theme--documenter-dark .column.is-offset-1-touch { - margin-left: 8.3333333333%; } - html.theme--documenter-dark .column.is-2-touch { - flex: none; - width: 16.6666666667%; } - html.theme--documenter-dark .column.is-offset-2-touch { - margin-left: 16.6666666667%; } - html.theme--documenter-dark .column.is-3-touch { - flex: none; - width: 25%; } - html.theme--documenter-dark .column.is-offset-3-touch { - margin-left: 25%; } - html.theme--documenter-dark .column.is-4-touch { - flex: none; - width: 33.3333333333%; } - html.theme--documenter-dark .column.is-offset-4-touch { - margin-left: 33.3333333333%; } - html.theme--documenter-dark .column.is-5-touch { - flex: none; - width: 41.6666666667%; } - html.theme--documenter-dark .column.is-offset-5-touch { - margin-left: 41.6666666667%; } - html.theme--documenter-dark .column.is-6-touch { - flex: none; - width: 50%; } - html.theme--documenter-dark .column.is-offset-6-touch { - margin-left: 50%; } - html.theme--documenter-dark .column.is-7-touch { - flex: none; - width: 58.3333333333%; } - html.theme--documenter-dark .column.is-offset-7-touch { - margin-left: 58.3333333333%; } - html.theme--documenter-dark .column.is-8-touch { - flex: none; - width: 66.6666666667%; } - html.theme--documenter-dark .column.is-offset-8-touch { - margin-left: 66.6666666667%; } - html.theme--documenter-dark .column.is-9-touch { - flex: none; - width: 75%; } - html.theme--documenter-dark .column.is-offset-9-touch { - margin-left: 75%; } - html.theme--documenter-dark .column.is-10-touch { - flex: none; - width: 83.3333333333%; } - html.theme--documenter-dark .column.is-offset-10-touch { - margin-left: 83.3333333333%; } - html.theme--documenter-dark .column.is-11-touch { - flex: none; - width: 91.6666666667%; } - html.theme--documenter-dark .column.is-offset-11-touch { - margin-left: 91.6666666667%; } - html.theme--documenter-dark .column.is-12-touch { - flex: none; - width: 100%; } - html.theme--documenter-dark .column.is-offset-12-touch { - margin-left: 100%; } } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .column.is-narrow-desktop { - flex: none; } - html.theme--documenter-dark .column.is-full-desktop { - flex: none; - width: 100%; } - html.theme--documenter-dark .column.is-three-quarters-desktop { - flex: none; - width: 75%; } - html.theme--documenter-dark .column.is-two-thirds-desktop { - flex: none; - width: 66.6666%; } - html.theme--documenter-dark .column.is-half-desktop { - flex: none; - width: 50%; } - html.theme--documenter-dark .column.is-one-third-desktop { - flex: none; - width: 33.3333%; } - html.theme--documenter-dark .column.is-one-quarter-desktop { - flex: none; - width: 25%; } - html.theme--documenter-dark .column.is-one-fifth-desktop { - flex: none; - width: 20%; } - html.theme--documenter-dark .column.is-two-fifths-desktop { - flex: none; - width: 40%; } - html.theme--documenter-dark .column.is-three-fifths-desktop { - flex: none; - width: 60%; } - html.theme--documenter-dark .column.is-four-fifths-desktop { - flex: none; - width: 80%; } - html.theme--documenter-dark .column.is-offset-three-quarters-desktop { - margin-left: 75%; } - html.theme--documenter-dark .column.is-offset-two-thirds-desktop { - margin-left: 66.6666%; } - html.theme--documenter-dark .column.is-offset-half-desktop { - margin-left: 50%; } - html.theme--documenter-dark .column.is-offset-one-third-desktop { - margin-left: 33.3333%; } - html.theme--documenter-dark .column.is-offset-one-quarter-desktop { - margin-left: 25%; } - html.theme--documenter-dark .column.is-offset-one-fifth-desktop { - margin-left: 20%; } - html.theme--documenter-dark .column.is-offset-two-fifths-desktop { - margin-left: 40%; } - html.theme--documenter-dark .column.is-offset-three-fifths-desktop { - margin-left: 60%; } - html.theme--documenter-dark .column.is-offset-four-fifths-desktop { - margin-left: 80%; } - html.theme--documenter-dark .column.is-0-desktop { - flex: none; - width: 0%; } - html.theme--documenter-dark .column.is-offset-0-desktop { - margin-left: 0%; } - html.theme--documenter-dark .column.is-1-desktop { - flex: none; - width: 8.3333333333%; } - html.theme--documenter-dark .column.is-offset-1-desktop { - margin-left: 8.3333333333%; } - html.theme--documenter-dark .column.is-2-desktop { - flex: none; - width: 16.6666666667%; } - html.theme--documenter-dark .column.is-offset-2-desktop { - margin-left: 16.6666666667%; } - html.theme--documenter-dark .column.is-3-desktop { - flex: none; - width: 25%; } - html.theme--documenter-dark .column.is-offset-3-desktop { - margin-left: 25%; } - html.theme--documenter-dark .column.is-4-desktop { - flex: none; - width: 33.3333333333%; } - html.theme--documenter-dark .column.is-offset-4-desktop { - margin-left: 33.3333333333%; } - html.theme--documenter-dark .column.is-5-desktop { - flex: none; - width: 41.6666666667%; } - html.theme--documenter-dark .column.is-offset-5-desktop { - margin-left: 41.6666666667%; } - html.theme--documenter-dark .column.is-6-desktop { - flex: none; - width: 50%; } - html.theme--documenter-dark .column.is-offset-6-desktop { - margin-left: 50%; } - html.theme--documenter-dark .column.is-7-desktop { - flex: none; - width: 58.3333333333%; } - html.theme--documenter-dark .column.is-offset-7-desktop { - margin-left: 58.3333333333%; } - html.theme--documenter-dark .column.is-8-desktop { - flex: none; - width: 66.6666666667%; } - html.theme--documenter-dark .column.is-offset-8-desktop { - margin-left: 66.6666666667%; } - html.theme--documenter-dark .column.is-9-desktop { - flex: none; - width: 75%; } - html.theme--documenter-dark .column.is-offset-9-desktop { - margin-left: 75%; } - html.theme--documenter-dark .column.is-10-desktop { - flex: none; - width: 83.3333333333%; } - html.theme--documenter-dark .column.is-offset-10-desktop { - margin-left: 83.3333333333%; } - html.theme--documenter-dark .column.is-11-desktop { - flex: none; - width: 91.6666666667%; } - html.theme--documenter-dark .column.is-offset-11-desktop { - margin-left: 91.6666666667%; } - html.theme--documenter-dark .column.is-12-desktop { - flex: none; - width: 100%; } - html.theme--documenter-dark .column.is-offset-12-desktop { - margin-left: 100%; } } - @media screen and (min-width: 1216px) { - html.theme--documenter-dark .column.is-narrow-widescreen { - flex: none; } - html.theme--documenter-dark .column.is-full-widescreen { - flex: none; - width: 100%; } - html.theme--documenter-dark .column.is-three-quarters-widescreen { - flex: none; - width: 75%; } - html.theme--documenter-dark .column.is-two-thirds-widescreen { - flex: none; - width: 66.6666%; } - html.theme--documenter-dark .column.is-half-widescreen { - flex: none; - width: 50%; } - html.theme--documenter-dark .column.is-one-third-widescreen { - flex: none; - width: 33.3333%; } - html.theme--documenter-dark .column.is-one-quarter-widescreen { - flex: none; - width: 25%; } - html.theme--documenter-dark .column.is-one-fifth-widescreen { - flex: none; - width: 20%; } - html.theme--documenter-dark .column.is-two-fifths-widescreen { - flex: none; - width: 40%; } - html.theme--documenter-dark .column.is-three-fifths-widescreen { - flex: none; - width: 60%; } - html.theme--documenter-dark .column.is-four-fifths-widescreen { - flex: none; - width: 80%; } - html.theme--documenter-dark .column.is-offset-three-quarters-widescreen { - margin-left: 75%; } - html.theme--documenter-dark .column.is-offset-two-thirds-widescreen { - margin-left: 66.6666%; } - html.theme--documenter-dark .column.is-offset-half-widescreen { - margin-left: 50%; } - html.theme--documenter-dark .column.is-offset-one-third-widescreen { - margin-left: 33.3333%; } - html.theme--documenter-dark .column.is-offset-one-quarter-widescreen { - margin-left: 25%; } - html.theme--documenter-dark .column.is-offset-one-fifth-widescreen { - margin-left: 20%; } - html.theme--documenter-dark .column.is-offset-two-fifths-widescreen { - margin-left: 40%; } - html.theme--documenter-dark .column.is-offset-three-fifths-widescreen { - margin-left: 60%; } - html.theme--documenter-dark .column.is-offset-four-fifths-widescreen { - margin-left: 80%; } - html.theme--documenter-dark .column.is-0-widescreen { - flex: none; - width: 0%; } - html.theme--documenter-dark .column.is-offset-0-widescreen { - margin-left: 0%; } - html.theme--documenter-dark .column.is-1-widescreen { - flex: none; - width: 8.3333333333%; } - html.theme--documenter-dark .column.is-offset-1-widescreen { - margin-left: 8.3333333333%; } - html.theme--documenter-dark .column.is-2-widescreen { - flex: none; - width: 16.6666666667%; } - html.theme--documenter-dark .column.is-offset-2-widescreen { - margin-left: 16.6666666667%; } - html.theme--documenter-dark .column.is-3-widescreen { - flex: none; - width: 25%; } - html.theme--documenter-dark .column.is-offset-3-widescreen { - margin-left: 25%; } - html.theme--documenter-dark .column.is-4-widescreen { - flex: none; - width: 33.3333333333%; } - html.theme--documenter-dark .column.is-offset-4-widescreen { - margin-left: 33.3333333333%; } - html.theme--documenter-dark .column.is-5-widescreen { - flex: none; - width: 41.6666666667%; } - html.theme--documenter-dark .column.is-offset-5-widescreen { - margin-left: 41.6666666667%; } - html.theme--documenter-dark .column.is-6-widescreen { - flex: none; - width: 50%; } - html.theme--documenter-dark .column.is-offset-6-widescreen { - margin-left: 50%; } - html.theme--documenter-dark .column.is-7-widescreen { - flex: none; - width: 58.3333333333%; } - html.theme--documenter-dark .column.is-offset-7-widescreen { - margin-left: 58.3333333333%; } - html.theme--documenter-dark .column.is-8-widescreen { - flex: none; - width: 66.6666666667%; } - html.theme--documenter-dark .column.is-offset-8-widescreen { - margin-left: 66.6666666667%; } - html.theme--documenter-dark .column.is-9-widescreen { - flex: none; - width: 75%; } - html.theme--documenter-dark .column.is-offset-9-widescreen { - margin-left: 75%; } - html.theme--documenter-dark .column.is-10-widescreen { - flex: none; - width: 83.3333333333%; } - html.theme--documenter-dark .column.is-offset-10-widescreen { - margin-left: 83.3333333333%; } - html.theme--documenter-dark .column.is-11-widescreen { - flex: none; - width: 91.6666666667%; } - html.theme--documenter-dark .column.is-offset-11-widescreen { - margin-left: 91.6666666667%; } - html.theme--documenter-dark .column.is-12-widescreen { - flex: none; - width: 100%; } - html.theme--documenter-dark .column.is-offset-12-widescreen { - margin-left: 100%; } } - @media screen and (min-width: 1408px) { - html.theme--documenter-dark .column.is-narrow-fullhd { - flex: none; } - html.theme--documenter-dark .column.is-full-fullhd { - flex: none; - width: 100%; } - html.theme--documenter-dark .column.is-three-quarters-fullhd { - flex: none; - width: 75%; } - html.theme--documenter-dark .column.is-two-thirds-fullhd { - flex: none; - width: 66.6666%; } - html.theme--documenter-dark .column.is-half-fullhd { - flex: none; - width: 50%; } - html.theme--documenter-dark .column.is-one-third-fullhd { - flex: none; - width: 33.3333%; } - html.theme--documenter-dark .column.is-one-quarter-fullhd { - flex: none; - width: 25%; } - html.theme--documenter-dark .column.is-one-fifth-fullhd { - flex: none; - width: 20%; } - html.theme--documenter-dark .column.is-two-fifths-fullhd { - flex: none; - width: 40%; } - html.theme--documenter-dark .column.is-three-fifths-fullhd { - flex: none; - width: 60%; } - html.theme--documenter-dark .column.is-four-fifths-fullhd { - flex: none; - width: 80%; } - html.theme--documenter-dark .column.is-offset-three-quarters-fullhd { - margin-left: 75%; } - html.theme--documenter-dark .column.is-offset-two-thirds-fullhd { - margin-left: 66.6666%; } - html.theme--documenter-dark .column.is-offset-half-fullhd { - margin-left: 50%; } - html.theme--documenter-dark .column.is-offset-one-third-fullhd { - margin-left: 33.3333%; } - html.theme--documenter-dark .column.is-offset-one-quarter-fullhd { - margin-left: 25%; } - html.theme--documenter-dark .column.is-offset-one-fifth-fullhd { - margin-left: 20%; } - html.theme--documenter-dark .column.is-offset-two-fifths-fullhd { - margin-left: 40%; } - html.theme--documenter-dark .column.is-offset-three-fifths-fullhd { - margin-left: 60%; } - html.theme--documenter-dark .column.is-offset-four-fifths-fullhd { - margin-left: 80%; } - html.theme--documenter-dark .column.is-0-fullhd { - flex: none; - width: 0%; } - html.theme--documenter-dark .column.is-offset-0-fullhd { - margin-left: 0%; } - html.theme--documenter-dark .column.is-1-fullhd { - flex: none; - width: 8.3333333333%; } - html.theme--documenter-dark .column.is-offset-1-fullhd { - margin-left: 8.3333333333%; } - html.theme--documenter-dark .column.is-2-fullhd { - flex: none; - width: 16.6666666667%; } - html.theme--documenter-dark .column.is-offset-2-fullhd { - margin-left: 16.6666666667%; } - html.theme--documenter-dark .column.is-3-fullhd { - flex: none; - width: 25%; } - html.theme--documenter-dark .column.is-offset-3-fullhd { - margin-left: 25%; } - html.theme--documenter-dark .column.is-4-fullhd { - flex: none; - width: 33.3333333333%; } - html.theme--documenter-dark .column.is-offset-4-fullhd { - margin-left: 33.3333333333%; } - html.theme--documenter-dark .column.is-5-fullhd { - flex: none; - width: 41.6666666667%; } - html.theme--documenter-dark .column.is-offset-5-fullhd { - margin-left: 41.6666666667%; } - html.theme--documenter-dark .column.is-6-fullhd { - flex: none; - width: 50%; } - html.theme--documenter-dark .column.is-offset-6-fullhd { - margin-left: 50%; } - html.theme--documenter-dark .column.is-7-fullhd { - flex: none; - width: 58.3333333333%; } - html.theme--documenter-dark .column.is-offset-7-fullhd { - margin-left: 58.3333333333%; } - html.theme--documenter-dark .column.is-8-fullhd { - flex: none; - width: 66.6666666667%; } - html.theme--documenter-dark .column.is-offset-8-fullhd { - margin-left: 66.6666666667%; } - html.theme--documenter-dark .column.is-9-fullhd { - flex: none; - width: 75%; } - html.theme--documenter-dark .column.is-offset-9-fullhd { - margin-left: 75%; } - html.theme--documenter-dark .column.is-10-fullhd { - flex: none; - width: 83.3333333333%; } - html.theme--documenter-dark .column.is-offset-10-fullhd { - margin-left: 83.3333333333%; } - html.theme--documenter-dark .column.is-11-fullhd { - flex: none; - width: 91.6666666667%; } - html.theme--documenter-dark .column.is-offset-11-fullhd { - margin-left: 91.6666666667%; } - html.theme--documenter-dark .column.is-12-fullhd { - flex: none; - width: 100%; } - html.theme--documenter-dark .column.is-offset-12-fullhd { - margin-left: 100%; } } - html.theme--documenter-dark .columns { - margin-left: -0.75rem; - margin-right: -0.75rem; - margin-top: -0.75rem; } - html.theme--documenter-dark .columns:last-child { - margin-bottom: -0.75rem; } - html.theme--documenter-dark .columns:not(:last-child) { - margin-bottom: calc(1.5rem - 0.75rem); } - html.theme--documenter-dark .columns.is-centered { - justify-content: center; } - html.theme--documenter-dark .columns.is-gapless { - margin-left: 0; - margin-right: 0; - margin-top: 0; } - html.theme--documenter-dark .columns.is-gapless > .column { - margin: 0; - padding: 0 !important; } - html.theme--documenter-dark .columns.is-gapless:not(:last-child) { - margin-bottom: 1.5rem; } - html.theme--documenter-dark .columns.is-gapless:last-child { - margin-bottom: 0; } - html.theme--documenter-dark .columns.is-mobile { - display: flex; } - html.theme--documenter-dark .columns.is-multiline { - flex-wrap: wrap; } - html.theme--documenter-dark .columns.is-vcentered { - align-items: center; } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .columns:not(.is-desktop) { - display: flex; } } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .columns.is-desktop { - display: flex; } } - html.theme--documenter-dark .columns.is-variable { - --columnGap: 0.75rem; - margin-left: calc(-1 * var(--columnGap)); - margin-right: calc(-1 * var(--columnGap)); } - html.theme--documenter-dark .columns.is-variable .column { - padding-left: var(--columnGap); - padding-right: var(--columnGap); } - html.theme--documenter-dark .columns.is-variable.is-0 { - --columnGap: 0rem; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .columns.is-variable.is-0-mobile { - --columnGap: 0rem; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .columns.is-variable.is-0-tablet { - --columnGap: 0rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-0-tablet-only { - --columnGap: 0rem; } } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-0-touch { - --columnGap: 0rem; } } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .columns.is-variable.is-0-desktop { - --columnGap: 0rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - html.theme--documenter-dark .columns.is-variable.is-0-desktop-only { - --columnGap: 0rem; } } - @media screen and (min-width: 1216px) { - html.theme--documenter-dark .columns.is-variable.is-0-widescreen { - --columnGap: 0rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - html.theme--documenter-dark .columns.is-variable.is-0-widescreen-only { - --columnGap: 0rem; } } - @media screen and (min-width: 1408px) { - html.theme--documenter-dark .columns.is-variable.is-0-fullhd { - --columnGap: 0rem; } } - html.theme--documenter-dark .columns.is-variable.is-1 { - --columnGap: 0.25rem; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .columns.is-variable.is-1-mobile { - --columnGap: 0.25rem; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .columns.is-variable.is-1-tablet { - --columnGap: 0.25rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-1-tablet-only { - --columnGap: 0.25rem; } } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-1-touch { - --columnGap: 0.25rem; } } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .columns.is-variable.is-1-desktop { - --columnGap: 0.25rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - html.theme--documenter-dark .columns.is-variable.is-1-desktop-only { - --columnGap: 0.25rem; } } - @media screen and (min-width: 1216px) { - html.theme--documenter-dark .columns.is-variable.is-1-widescreen { - --columnGap: 0.25rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - html.theme--documenter-dark .columns.is-variable.is-1-widescreen-only { - --columnGap: 0.25rem; } } - @media screen and (min-width: 1408px) { - html.theme--documenter-dark .columns.is-variable.is-1-fullhd { - --columnGap: 0.25rem; } } - html.theme--documenter-dark .columns.is-variable.is-2 { - --columnGap: 0.5rem; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .columns.is-variable.is-2-mobile { - --columnGap: 0.5rem; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .columns.is-variable.is-2-tablet { - --columnGap: 0.5rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-2-tablet-only { - --columnGap: 0.5rem; } } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-2-touch { - --columnGap: 0.5rem; } } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .columns.is-variable.is-2-desktop { - --columnGap: 0.5rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - html.theme--documenter-dark .columns.is-variable.is-2-desktop-only { - --columnGap: 0.5rem; } } - @media screen and (min-width: 1216px) { - html.theme--documenter-dark .columns.is-variable.is-2-widescreen { - --columnGap: 0.5rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - html.theme--documenter-dark .columns.is-variable.is-2-widescreen-only { - --columnGap: 0.5rem; } } - @media screen and (min-width: 1408px) { - html.theme--documenter-dark .columns.is-variable.is-2-fullhd { - --columnGap: 0.5rem; } } - html.theme--documenter-dark .columns.is-variable.is-3 { - --columnGap: 0.75rem; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .columns.is-variable.is-3-mobile { - --columnGap: 0.75rem; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .columns.is-variable.is-3-tablet { - --columnGap: 0.75rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-3-tablet-only { - --columnGap: 0.75rem; } } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-3-touch { - --columnGap: 0.75rem; } } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .columns.is-variable.is-3-desktop { - --columnGap: 0.75rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - html.theme--documenter-dark .columns.is-variable.is-3-desktop-only { - --columnGap: 0.75rem; } } - @media screen and (min-width: 1216px) { - html.theme--documenter-dark .columns.is-variable.is-3-widescreen { - --columnGap: 0.75rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - html.theme--documenter-dark .columns.is-variable.is-3-widescreen-only { - --columnGap: 0.75rem; } } - @media screen and (min-width: 1408px) { - html.theme--documenter-dark .columns.is-variable.is-3-fullhd { - --columnGap: 0.75rem; } } - html.theme--documenter-dark .columns.is-variable.is-4 { - --columnGap: 1rem; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .columns.is-variable.is-4-mobile { - --columnGap: 1rem; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .columns.is-variable.is-4-tablet { - --columnGap: 1rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-4-tablet-only { - --columnGap: 1rem; } } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-4-touch { - --columnGap: 1rem; } } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .columns.is-variable.is-4-desktop { - --columnGap: 1rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - html.theme--documenter-dark .columns.is-variable.is-4-desktop-only { - --columnGap: 1rem; } } - @media screen and (min-width: 1216px) { - html.theme--documenter-dark .columns.is-variable.is-4-widescreen { - --columnGap: 1rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - html.theme--documenter-dark .columns.is-variable.is-4-widescreen-only { - --columnGap: 1rem; } } - @media screen and (min-width: 1408px) { - html.theme--documenter-dark .columns.is-variable.is-4-fullhd { - --columnGap: 1rem; } } - html.theme--documenter-dark .columns.is-variable.is-5 { - --columnGap: 1.25rem; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .columns.is-variable.is-5-mobile { - --columnGap: 1.25rem; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .columns.is-variable.is-5-tablet { - --columnGap: 1.25rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-5-tablet-only { - --columnGap: 1.25rem; } } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-5-touch { - --columnGap: 1.25rem; } } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .columns.is-variable.is-5-desktop { - --columnGap: 1.25rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - html.theme--documenter-dark .columns.is-variable.is-5-desktop-only { - --columnGap: 1.25rem; } } - @media screen and (min-width: 1216px) { - html.theme--documenter-dark .columns.is-variable.is-5-widescreen { - --columnGap: 1.25rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - html.theme--documenter-dark .columns.is-variable.is-5-widescreen-only { - --columnGap: 1.25rem; } } - @media screen and (min-width: 1408px) { - html.theme--documenter-dark .columns.is-variable.is-5-fullhd { - --columnGap: 1.25rem; } } - html.theme--documenter-dark .columns.is-variable.is-6 { - --columnGap: 1.5rem; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .columns.is-variable.is-6-mobile { - --columnGap: 1.5rem; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .columns.is-variable.is-6-tablet { - --columnGap: 1.5rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-6-tablet-only { - --columnGap: 1.5rem; } } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-6-touch { - --columnGap: 1.5rem; } } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .columns.is-variable.is-6-desktop { - --columnGap: 1.5rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - html.theme--documenter-dark .columns.is-variable.is-6-desktop-only { - --columnGap: 1.5rem; } } - @media screen and (min-width: 1216px) { - html.theme--documenter-dark .columns.is-variable.is-6-widescreen { - --columnGap: 1.5rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - html.theme--documenter-dark .columns.is-variable.is-6-widescreen-only { - --columnGap: 1.5rem; } } - @media screen and (min-width: 1408px) { - html.theme--documenter-dark .columns.is-variable.is-6-fullhd { - --columnGap: 1.5rem; } } - html.theme--documenter-dark .columns.is-variable.is-7 { - --columnGap: 1.75rem; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .columns.is-variable.is-7-mobile { - --columnGap: 1.75rem; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .columns.is-variable.is-7-tablet { - --columnGap: 1.75rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-7-tablet-only { - --columnGap: 1.75rem; } } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-7-touch { - --columnGap: 1.75rem; } } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .columns.is-variable.is-7-desktop { - --columnGap: 1.75rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - html.theme--documenter-dark .columns.is-variable.is-7-desktop-only { - --columnGap: 1.75rem; } } - @media screen and (min-width: 1216px) { - html.theme--documenter-dark .columns.is-variable.is-7-widescreen { - --columnGap: 1.75rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - html.theme--documenter-dark .columns.is-variable.is-7-widescreen-only { - --columnGap: 1.75rem; } } - @media screen and (min-width: 1408px) { - html.theme--documenter-dark .columns.is-variable.is-7-fullhd { - --columnGap: 1.75rem; } } - html.theme--documenter-dark .columns.is-variable.is-8 { - --columnGap: 2rem; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .columns.is-variable.is-8-mobile { - --columnGap: 2rem; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .columns.is-variable.is-8-tablet { - --columnGap: 2rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-8-tablet-only { - --columnGap: 2rem; } } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .columns.is-variable.is-8-touch { - --columnGap: 2rem; } } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .columns.is-variable.is-8-desktop { - --columnGap: 2rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - html.theme--documenter-dark .columns.is-variable.is-8-desktop-only { - --columnGap: 2rem; } } - @media screen and (min-width: 1216px) { - html.theme--documenter-dark .columns.is-variable.is-8-widescreen { - --columnGap: 2rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - html.theme--documenter-dark .columns.is-variable.is-8-widescreen-only { - --columnGap: 2rem; } } - @media screen and (min-width: 1408px) { - html.theme--documenter-dark .columns.is-variable.is-8-fullhd { - --columnGap: 2rem; } } - html.theme--documenter-dark .tile { - align-items: stretch; - display: block; - flex-basis: 0; - flex-grow: 1; - flex-shrink: 1; - min-height: min-content; } - html.theme--documenter-dark .tile.is-ancestor { - margin-left: -0.75rem; - margin-right: -0.75rem; - margin-top: -0.75rem; } - html.theme--documenter-dark .tile.is-ancestor:last-child { - margin-bottom: -0.75rem; } - html.theme--documenter-dark .tile.is-ancestor:not(:last-child) { - margin-bottom: 0.75rem; } - html.theme--documenter-dark .tile.is-child { - margin: 0 !important; } - html.theme--documenter-dark .tile.is-parent { - padding: 0.75rem; } - html.theme--documenter-dark .tile.is-vertical { - flex-direction: column; } - html.theme--documenter-dark .tile.is-vertical > .tile.is-child:not(:last-child) { - margin-bottom: 1.5rem !important; } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .tile:not(.is-child) { - display: flex; } - html.theme--documenter-dark .tile.is-1 { - flex: none; - width: 8.3333333333%; } - html.theme--documenter-dark .tile.is-2 { - flex: none; - width: 16.6666666667%; } - html.theme--documenter-dark .tile.is-3 { - flex: none; - width: 25%; } - html.theme--documenter-dark .tile.is-4 { - flex: none; - width: 33.3333333333%; } - html.theme--documenter-dark .tile.is-5 { - flex: none; - width: 41.6666666667%; } - html.theme--documenter-dark .tile.is-6 { - flex: none; - width: 50%; } - html.theme--documenter-dark .tile.is-7 { - flex: none; - width: 58.3333333333%; } - html.theme--documenter-dark .tile.is-8 { - flex: none; - width: 66.6666666667%; } - html.theme--documenter-dark .tile.is-9 { - flex: none; - width: 75%; } - html.theme--documenter-dark .tile.is-10 { - flex: none; - width: 83.3333333333%; } - html.theme--documenter-dark .tile.is-11 { - flex: none; - width: 91.6666666667%; } - html.theme--documenter-dark .tile.is-12 { - flex: none; - width: 100%; } } - html.theme--documenter-dark .hero { - align-items: stretch; - display: flex; - flex-direction: column; - justify-content: space-between; } - html.theme--documenter-dark .hero .navbar { - background: none; } - html.theme--documenter-dark .hero .tabs ul { - border-bottom: none; } - html.theme--documenter-dark .hero.is-white { - background-color: white; - color: #0a0a0a; } - html.theme--documenter-dark .hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - html.theme--documenter-dark .hero.is-white strong { - color: inherit; } - html.theme--documenter-dark .hero.is-white .title { - color: #0a0a0a; } - html.theme--documenter-dark .hero.is-white .subtitle { - color: rgba(10, 10, 10, 0.9); } - html.theme--documenter-dark .hero.is-white .subtitle a:not(.button), - html.theme--documenter-dark .hero.is-white .subtitle strong { - color: #0a0a0a; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .hero.is-white .navbar-menu { - background-color: white; } } - html.theme--documenter-dark .hero.is-white .navbar-item, - html.theme--documenter-dark .hero.is-white .navbar-link { - color: rgba(10, 10, 10, 0.7); } - html.theme--documenter-dark .hero.is-white a.navbar-item:hover, html.theme--documenter-dark .hero.is-white a.navbar-item.is-active, - html.theme--documenter-dark .hero.is-white .navbar-link:hover, - html.theme--documenter-dark .hero.is-white .navbar-link.is-active { - background-color: #f2f2f2; - color: #0a0a0a; } - html.theme--documenter-dark .hero.is-white .tabs a { - color: #0a0a0a; - opacity: 0.9; } - html.theme--documenter-dark .hero.is-white .tabs a:hover { - opacity: 1; } - html.theme--documenter-dark .hero.is-white .tabs li.is-active a { - opacity: 1; } - html.theme--documenter-dark .hero.is-white .tabs.is-boxed a, html.theme--documenter-dark .hero.is-white .tabs.is-toggle a { - color: #0a0a0a; } - html.theme--documenter-dark .hero.is-white .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-white .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a:hover { - background-color: #0a0a0a; - border-color: #0a0a0a; - color: white; } - html.theme--documenter-dark .hero.is-white.is-bold { - background-image: linear-gradient(141deg, #e8e3e4 0%, white 71%, white 100%); } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .hero.is-white.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #e8e3e4 0%, white 71%, white 100%); } } - html.theme--documenter-dark .hero.is-black { - background-color: #0a0a0a; - color: white; } - html.theme--documenter-dark .hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - html.theme--documenter-dark .hero.is-black strong { - color: inherit; } - html.theme--documenter-dark .hero.is-black .title { - color: white; } - html.theme--documenter-dark .hero.is-black .subtitle { - color: rgba(255, 255, 255, 0.9); } - html.theme--documenter-dark .hero.is-black .subtitle a:not(.button), - html.theme--documenter-dark .hero.is-black .subtitle strong { - color: white; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .hero.is-black .navbar-menu { - background-color: #0a0a0a; } } - html.theme--documenter-dark .hero.is-black .navbar-item, - html.theme--documenter-dark .hero.is-black .navbar-link { - color: rgba(255, 255, 255, 0.7); } - html.theme--documenter-dark .hero.is-black a.navbar-item:hover, html.theme--documenter-dark .hero.is-black a.navbar-item.is-active, - html.theme--documenter-dark .hero.is-black .navbar-link:hover, - html.theme--documenter-dark .hero.is-black .navbar-link.is-active { - background-color: black; - color: white; } - html.theme--documenter-dark .hero.is-black .tabs a { - color: white; - opacity: 0.9; } - html.theme--documenter-dark .hero.is-black .tabs a:hover { - opacity: 1; } - html.theme--documenter-dark .hero.is-black .tabs li.is-active a { - opacity: 1; } - html.theme--documenter-dark .hero.is-black .tabs.is-boxed a, html.theme--documenter-dark .hero.is-black .tabs.is-toggle a { - color: white; } - html.theme--documenter-dark .hero.is-black .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-black .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a:hover { - background-color: white; - border-color: white; - color: #0a0a0a; } - html.theme--documenter-dark .hero.is-black.is-bold { - background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .hero.is-black.is-bold .navbar-menu { - background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); } } - html.theme--documenter-dark .hero.is-light { - background-color: #ecf0f1; - color: #282f2f; } - html.theme--documenter-dark .hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - html.theme--documenter-dark .hero.is-light strong { - color: inherit; } - html.theme--documenter-dark .hero.is-light .title { - color: #282f2f; } - html.theme--documenter-dark .hero.is-light .subtitle { - color: rgba(40, 47, 47, 0.9); } - html.theme--documenter-dark .hero.is-light .subtitle a:not(.button), - html.theme--documenter-dark .hero.is-light .subtitle strong { - color: #282f2f; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .hero.is-light .navbar-menu { - background-color: #ecf0f1; } } - html.theme--documenter-dark .hero.is-light .navbar-item, - html.theme--documenter-dark .hero.is-light .navbar-link { - color: rgba(40, 47, 47, 0.7); } - html.theme--documenter-dark .hero.is-light a.navbar-item:hover, html.theme--documenter-dark .hero.is-light a.navbar-item.is-active, - html.theme--documenter-dark .hero.is-light .navbar-link:hover, - html.theme--documenter-dark .hero.is-light .navbar-link.is-active { - background-color: #dde4e6; - color: #282f2f; } - html.theme--documenter-dark .hero.is-light .tabs a { - color: #282f2f; - opacity: 0.9; } - html.theme--documenter-dark .hero.is-light .tabs a:hover { - opacity: 1; } - html.theme--documenter-dark .hero.is-light .tabs li.is-active a { - opacity: 1; } - html.theme--documenter-dark .hero.is-light .tabs.is-boxed a, html.theme--documenter-dark .hero.is-light .tabs.is-toggle a { - color: #282f2f; } - html.theme--documenter-dark .hero.is-light .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-light .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a:hover { - background-color: #282f2f; - border-color: #282f2f; - color: #ecf0f1; } - html.theme--documenter-dark .hero.is-light.is-bold { - background-image: linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%); } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .hero.is-light.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%); } } - html.theme--documenter-dark .hero.is-dark, html.theme--documenter-dark .content kbd.hero { - background-color: #282f2f; - color: #ecf0f1; } - html.theme--documenter-dark .hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), html.theme--documenter-dark .content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - html.theme--documenter-dark .hero.is-dark strong, - html.theme--documenter-dark .content kbd.hero strong { - color: inherit; } - html.theme--documenter-dark .hero.is-dark .title, html.theme--documenter-dark .content kbd.hero .title { - color: #ecf0f1; } - html.theme--documenter-dark .hero.is-dark .subtitle, html.theme--documenter-dark .content kbd.hero .subtitle { - color: rgba(236, 240, 241, 0.9); } - html.theme--documenter-dark .hero.is-dark .subtitle a:not(.button), html.theme--documenter-dark .content kbd.hero .subtitle a:not(.button), - html.theme--documenter-dark .hero.is-dark .subtitle strong, - html.theme--documenter-dark .content kbd.hero .subtitle strong { - color: #ecf0f1; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .hero.is-dark .navbar-menu, html.theme--documenter-dark .content kbd.hero .navbar-menu { - background-color: #282f2f; } } - html.theme--documenter-dark .hero.is-dark .navbar-item, html.theme--documenter-dark .content kbd.hero .navbar-item, - html.theme--documenter-dark .hero.is-dark .navbar-link, - html.theme--documenter-dark .content kbd.hero .navbar-link { - color: rgba(236, 240, 241, 0.7); } - html.theme--documenter-dark .hero.is-dark a.navbar-item:hover, html.theme--documenter-dark .content kbd.hero a.navbar-item:hover, html.theme--documenter-dark .hero.is-dark a.navbar-item.is-active, html.theme--documenter-dark .content kbd.hero a.navbar-item.is-active, - html.theme--documenter-dark .hero.is-dark .navbar-link:hover, - html.theme--documenter-dark .content kbd.hero .navbar-link:hover, - html.theme--documenter-dark .hero.is-dark .navbar-link.is-active, - html.theme--documenter-dark .content kbd.hero .navbar-link.is-active { - background-color: #1d2122; - color: #ecf0f1; } - html.theme--documenter-dark .hero.is-dark .tabs a, html.theme--documenter-dark .content kbd.hero .tabs a { - color: #ecf0f1; - opacity: 0.9; } - html.theme--documenter-dark .hero.is-dark .tabs a:hover, html.theme--documenter-dark .content kbd.hero .tabs a:hover { - opacity: 1; } - html.theme--documenter-dark .hero.is-dark .tabs li.is-active a, html.theme--documenter-dark .content kbd.hero .tabs li.is-active a { - opacity: 1; } - html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a, html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a, html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a, html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a { - color: #ecf0f1; } - html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a:hover, html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a:hover, html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a, html.theme--documenter-dark .content kbd.hero .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a, html.theme--documenter-dark .content kbd.hero .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a:hover { - background-color: #ecf0f1; - border-color: #ecf0f1; - color: #282f2f; } - html.theme--documenter-dark .hero.is-dark.is-bold, html.theme--documenter-dark .content kbd.hero.is-bold { - background-image: linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%); } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .hero.is-dark.is-bold .navbar-menu, html.theme--documenter-dark .content kbd.hero.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%); } } - html.theme--documenter-dark .hero.is-primary, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink { - background-color: #375a7f; - color: #fff; } - html.theme--documenter-dark .hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - html.theme--documenter-dark .hero.is-primary strong, - html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink strong { - color: inherit; } - html.theme--documenter-dark .hero.is-primary .title, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .title { - color: #fff; } - html.theme--documenter-dark .hero.is-primary .subtitle, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .subtitle { - color: rgba(255, 255, 255, 0.9); } - html.theme--documenter-dark .hero.is-primary .subtitle a:not(.button), html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .subtitle a:not(.button), - html.theme--documenter-dark .hero.is-primary .subtitle strong, - html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .subtitle strong { - color: #fff; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .hero.is-primary .navbar-menu, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .navbar-menu { - background-color: #375a7f; } } - html.theme--documenter-dark .hero.is-primary .navbar-item, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .navbar-item, - html.theme--documenter-dark .hero.is-primary .navbar-link, - html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .navbar-link { - color: rgba(255, 255, 255, 0.7); } - html.theme--documenter-dark .hero.is-primary a.navbar-item:hover, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink a.navbar-item:hover, html.theme--documenter-dark .hero.is-primary a.navbar-item.is-active, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink a.navbar-item.is-active, - html.theme--documenter-dark .hero.is-primary .navbar-link:hover, - html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .navbar-link:hover, - html.theme--documenter-dark .hero.is-primary .navbar-link.is-active, - html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .navbar-link.is-active { - background-color: #2f4d6d; - color: #fff; } - html.theme--documenter-dark .hero.is-primary .tabs a, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs a { - color: #fff; - opacity: 0.9; } - html.theme--documenter-dark .hero.is-primary .tabs a:hover, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs a:hover { - opacity: 1; } - html.theme--documenter-dark .hero.is-primary .tabs li.is-active a, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs li.is-active a { - opacity: 1; } - html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs.is-boxed a, html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs.is-toggle a { - color: #fff; } - html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a:hover, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a:hover, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #375a7f; } - html.theme--documenter-dark .hero.is-primary.is-bold, html.theme--documenter-dark .docstring > section > a.hero.is-bold.docs-sourcelink { - background-image: linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%); } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .hero.is-primary.is-bold .navbar-menu, html.theme--documenter-dark .docstring > section > a.hero.is-bold.docs-sourcelink .navbar-menu { - background-image: linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%); } } - html.theme--documenter-dark .hero.is-link { - background-color: #1abc9c; - color: #fff; } - html.theme--documenter-dark .hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - html.theme--documenter-dark .hero.is-link strong { - color: inherit; } - html.theme--documenter-dark .hero.is-link .title { - color: #fff; } - html.theme--documenter-dark .hero.is-link .subtitle { - color: rgba(255, 255, 255, 0.9); } - html.theme--documenter-dark .hero.is-link .subtitle a:not(.button), - html.theme--documenter-dark .hero.is-link .subtitle strong { - color: #fff; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .hero.is-link .navbar-menu { - background-color: #1abc9c; } } - html.theme--documenter-dark .hero.is-link .navbar-item, - html.theme--documenter-dark .hero.is-link .navbar-link { - color: rgba(255, 255, 255, 0.7); } - html.theme--documenter-dark .hero.is-link a.navbar-item:hover, html.theme--documenter-dark .hero.is-link a.navbar-item.is-active, - html.theme--documenter-dark .hero.is-link .navbar-link:hover, - html.theme--documenter-dark .hero.is-link .navbar-link.is-active { - background-color: #17a689; - color: #fff; } - html.theme--documenter-dark .hero.is-link .tabs a { - color: #fff; - opacity: 0.9; } - html.theme--documenter-dark .hero.is-link .tabs a:hover { - opacity: 1; } - html.theme--documenter-dark .hero.is-link .tabs li.is-active a { - opacity: 1; } - html.theme--documenter-dark .hero.is-link .tabs.is-boxed a, html.theme--documenter-dark .hero.is-link .tabs.is-toggle a { - color: #fff; } - html.theme--documenter-dark .hero.is-link .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-link .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #1abc9c; } - html.theme--documenter-dark .hero.is-link.is-bold { - background-image: linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%); } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .hero.is-link.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%); } } - html.theme--documenter-dark .hero.is-info { - background-color: #024c7d; - color: #fff; } - html.theme--documenter-dark .hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - html.theme--documenter-dark .hero.is-info strong { - color: inherit; } - html.theme--documenter-dark .hero.is-info .title { - color: #fff; } - html.theme--documenter-dark .hero.is-info .subtitle { - color: rgba(255, 255, 255, 0.9); } - html.theme--documenter-dark .hero.is-info .subtitle a:not(.button), - html.theme--documenter-dark .hero.is-info .subtitle strong { - color: #fff; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .hero.is-info .navbar-menu { - background-color: #024c7d; } } - html.theme--documenter-dark .hero.is-info .navbar-item, - html.theme--documenter-dark .hero.is-info .navbar-link { - color: rgba(255, 255, 255, 0.7); } - html.theme--documenter-dark .hero.is-info a.navbar-item:hover, html.theme--documenter-dark .hero.is-info a.navbar-item.is-active, - html.theme--documenter-dark .hero.is-info .navbar-link:hover, - html.theme--documenter-dark .hero.is-info .navbar-link.is-active { - background-color: #023d64; - color: #fff; } - html.theme--documenter-dark .hero.is-info .tabs a { - color: #fff; - opacity: 0.9; } - html.theme--documenter-dark .hero.is-info .tabs a:hover { - opacity: 1; } - html.theme--documenter-dark .hero.is-info .tabs li.is-active a { - opacity: 1; } - html.theme--documenter-dark .hero.is-info .tabs.is-boxed a, html.theme--documenter-dark .hero.is-info .tabs.is-toggle a { - color: #fff; } - html.theme--documenter-dark .hero.is-info .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-info .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #024c7d; } - html.theme--documenter-dark .hero.is-info.is-bold { - background-image: linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%); } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .hero.is-info.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%); } } - html.theme--documenter-dark .hero.is-success { - background-color: #008438; - color: #fff; } - html.theme--documenter-dark .hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - html.theme--documenter-dark .hero.is-success strong { - color: inherit; } - html.theme--documenter-dark .hero.is-success .title { - color: #fff; } - html.theme--documenter-dark .hero.is-success .subtitle { - color: rgba(255, 255, 255, 0.9); } - html.theme--documenter-dark .hero.is-success .subtitle a:not(.button), - html.theme--documenter-dark .hero.is-success .subtitle strong { - color: #fff; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .hero.is-success .navbar-menu { - background-color: #008438; } } - html.theme--documenter-dark .hero.is-success .navbar-item, - html.theme--documenter-dark .hero.is-success .navbar-link { - color: rgba(255, 255, 255, 0.7); } - html.theme--documenter-dark .hero.is-success a.navbar-item:hover, html.theme--documenter-dark .hero.is-success a.navbar-item.is-active, - html.theme--documenter-dark .hero.is-success .navbar-link:hover, - html.theme--documenter-dark .hero.is-success .navbar-link.is-active { - background-color: #006b2d; - color: #fff; } - html.theme--documenter-dark .hero.is-success .tabs a { - color: #fff; - opacity: 0.9; } - html.theme--documenter-dark .hero.is-success .tabs a:hover { - opacity: 1; } - html.theme--documenter-dark .hero.is-success .tabs li.is-active a { - opacity: 1; } - html.theme--documenter-dark .hero.is-success .tabs.is-boxed a, html.theme--documenter-dark .hero.is-success .tabs.is-toggle a { - color: #fff; } - html.theme--documenter-dark .hero.is-success .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-success .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #008438; } - html.theme--documenter-dark .hero.is-success.is-bold { - background-image: linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%); } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .hero.is-success.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%); } } - html.theme--documenter-dark .hero.is-warning { - background-color: #ad8100; - color: #fff; } - html.theme--documenter-dark .hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - html.theme--documenter-dark .hero.is-warning strong { - color: inherit; } - html.theme--documenter-dark .hero.is-warning .title { - color: #fff; } - html.theme--documenter-dark .hero.is-warning .subtitle { - color: rgba(255, 255, 255, 0.9); } - html.theme--documenter-dark .hero.is-warning .subtitle a:not(.button), - html.theme--documenter-dark .hero.is-warning .subtitle strong { - color: #fff; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .hero.is-warning .navbar-menu { - background-color: #ad8100; } } - html.theme--documenter-dark .hero.is-warning .navbar-item, - html.theme--documenter-dark .hero.is-warning .navbar-link { - color: rgba(255, 255, 255, 0.7); } - html.theme--documenter-dark .hero.is-warning a.navbar-item:hover, html.theme--documenter-dark .hero.is-warning a.navbar-item.is-active, - html.theme--documenter-dark .hero.is-warning .navbar-link:hover, - html.theme--documenter-dark .hero.is-warning .navbar-link.is-active { - background-color: #946e00; - color: #fff; } - html.theme--documenter-dark .hero.is-warning .tabs a { - color: #fff; - opacity: 0.9; } - html.theme--documenter-dark .hero.is-warning .tabs a:hover { - opacity: 1; } - html.theme--documenter-dark .hero.is-warning .tabs li.is-active a { - opacity: 1; } - html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a, html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a { - color: #fff; } - html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #ad8100; } - html.theme--documenter-dark .hero.is-warning.is-bold { - background-image: linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%); } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .hero.is-warning.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%); } } - html.theme--documenter-dark .hero.is-danger { - background-color: #9e1b0d; - color: #fff; } - html.theme--documenter-dark .hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - html.theme--documenter-dark .hero.is-danger strong { - color: inherit; } - html.theme--documenter-dark .hero.is-danger .title { - color: #fff; } - html.theme--documenter-dark .hero.is-danger .subtitle { - color: rgba(255, 255, 255, 0.9); } - html.theme--documenter-dark .hero.is-danger .subtitle a:not(.button), - html.theme--documenter-dark .hero.is-danger .subtitle strong { - color: #fff; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .hero.is-danger .navbar-menu { - background-color: #9e1b0d; } } - html.theme--documenter-dark .hero.is-danger .navbar-item, - html.theme--documenter-dark .hero.is-danger .navbar-link { - color: rgba(255, 255, 255, 0.7); } - html.theme--documenter-dark .hero.is-danger a.navbar-item:hover, html.theme--documenter-dark .hero.is-danger a.navbar-item.is-active, - html.theme--documenter-dark .hero.is-danger .navbar-link:hover, - html.theme--documenter-dark .hero.is-danger .navbar-link.is-active { - background-color: #86170b; - color: #fff; } - html.theme--documenter-dark .hero.is-danger .tabs a { - color: #fff; - opacity: 0.9; } - html.theme--documenter-dark .hero.is-danger .tabs a:hover { - opacity: 1; } - html.theme--documenter-dark .hero.is-danger .tabs li.is-active a { - opacity: 1; } - html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a, html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a { - color: #fff; } - html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a:hover, html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a, html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a:hover, html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a, html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #9e1b0d; } - html.theme--documenter-dark .hero.is-danger.is-bold { - background-image: linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%); } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .hero.is-danger.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%); } } - html.theme--documenter-dark .hero.is-small .hero-body, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.hero .hero-body { - padding-bottom: 1.5rem; - padding-top: 1.5rem; } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .hero.is-medium .hero-body { - padding-bottom: 9rem; - padding-top: 9rem; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .hero.is-large .hero-body { - padding-bottom: 18rem; - padding-top: 18rem; } } - html.theme--documenter-dark .hero.is-halfheight .hero-body, html.theme--documenter-dark .hero.is-fullheight .hero-body, html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body { - align-items: center; - display: flex; } - html.theme--documenter-dark .hero.is-halfheight .hero-body > .container, html.theme--documenter-dark .hero.is-fullheight .hero-body > .container, html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body > .container { - flex-grow: 1; - flex-shrink: 1; } - html.theme--documenter-dark .hero.is-halfheight { - min-height: 50vh; } - html.theme--documenter-dark .hero.is-fullheight { - min-height: 100vh; } - html.theme--documenter-dark .hero-video { - overflow: hidden; } - html.theme--documenter-dark .hero-video video { - left: 50%; - min-height: 100%; - min-width: 100%; - position: absolute; - top: 50%; - transform: translate3d(-50%, -50%, 0); } - html.theme--documenter-dark .hero-video.is-transparent { - opacity: 0.3; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .hero-video { - display: none; } } - html.theme--documenter-dark .hero-buttons { - margin-top: 1.5rem; } - @media screen and (max-width: 768px) { - html.theme--documenter-dark .hero-buttons .button { - display: flex; } - html.theme--documenter-dark .hero-buttons .button:not(:last-child) { - margin-bottom: 0.75rem; } } - @media screen and (min-width: 769px), print { - html.theme--documenter-dark .hero-buttons { - display: flex; - justify-content: center; } - html.theme--documenter-dark .hero-buttons .button:not(:last-child) { - margin-right: 1.5rem; } } - html.theme--documenter-dark .hero-head, - html.theme--documenter-dark .hero-foot { - flex-grow: 0; - flex-shrink: 0; } - html.theme--documenter-dark .hero-body { - flex-grow: 1; - flex-shrink: 0; - padding: 3rem 1.5rem; } - html.theme--documenter-dark .section { - padding: 3rem 1.5rem; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark .section.is-medium { - padding: 9rem 1.5rem; } - html.theme--documenter-dark .section.is-large { - padding: 18rem 1.5rem; } } - html.theme--documenter-dark .footer { - background-color: #282f2f; - padding: 3rem 1.5rem 6rem; } - html.theme--documenter-dark hr { - height: 1px; } - html.theme--documenter-dark h6 { - text-transform: uppercase; - letter-spacing: 0.5px; } - html.theme--documenter-dark .hero { - background-color: #343c3d; } - html.theme--documenter-dark a { - transition: all 200ms ease; } - html.theme--documenter-dark .button { - transition: all 200ms ease; - border-width: 1px; - color: white; } - html.theme--documenter-dark .button.is-active, html.theme--documenter-dark .button.is-focused, html.theme--documenter-dark .button:active, html.theme--documenter-dark .button:focus { - box-shadow: 0 0 0 2px rgba(140, 155, 157, 0.5); } - html.theme--documenter-dark .button.is-white.is-hovered, html.theme--documenter-dark .button.is-white:hover { - background-color: white; } - html.theme--documenter-dark .button.is-white.is-active, html.theme--documenter-dark .button.is-white.is-focused, html.theme--documenter-dark .button.is-white:active, html.theme--documenter-dark .button.is-white:focus { - border-color: white; - box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5); } - html.theme--documenter-dark .button.is-black.is-hovered, html.theme--documenter-dark .button.is-black:hover { - background-color: #1d1d1d; } - html.theme--documenter-dark .button.is-black.is-active, html.theme--documenter-dark .button.is-black.is-focused, html.theme--documenter-dark .button.is-black:active, html.theme--documenter-dark .button.is-black:focus { - border-color: #0a0a0a; - box-shadow: 0 0 0 2px rgba(10, 10, 10, 0.5); } - html.theme--documenter-dark .button.is-light.is-hovered, html.theme--documenter-dark .button.is-light:hover { - background-color: white; } - html.theme--documenter-dark .button.is-light.is-active, html.theme--documenter-dark .button.is-light.is-focused, html.theme--documenter-dark .button.is-light:active, html.theme--documenter-dark .button.is-light:focus { - border-color: #ecf0f1; - box-shadow: 0 0 0 2px rgba(236, 240, 241, 0.5); } - html.theme--documenter-dark .button.is-dark.is-hovered, html.theme--documenter-dark .content kbd.button.is-hovered, html.theme--documenter-dark .button.is-dark:hover, html.theme--documenter-dark .content kbd.button:hover { - background-color: #3a4344; } - html.theme--documenter-dark .button.is-dark.is-active, html.theme--documenter-dark .content kbd.button.is-active, html.theme--documenter-dark .button.is-dark.is-focused, html.theme--documenter-dark .content kbd.button.is-focused, html.theme--documenter-dark .button.is-dark:active, html.theme--documenter-dark .content kbd.button:active, html.theme--documenter-dark .button.is-dark:focus, html.theme--documenter-dark .content kbd.button:focus { - border-color: #282f2f; - box-shadow: 0 0 0 2px rgba(40, 47, 47, 0.5); } - html.theme--documenter-dark .button.is-primary.is-hovered, html.theme--documenter-dark .docstring > section > a.button.is-hovered.docs-sourcelink, html.theme--documenter-dark .button.is-primary:hover, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:hover { - background-color: #436d9a; } - html.theme--documenter-dark .button.is-primary.is-active, html.theme--documenter-dark .docstring > section > a.button.is-active.docs-sourcelink, html.theme--documenter-dark .button.is-primary.is-focused, html.theme--documenter-dark .docstring > section > a.button.is-focused.docs-sourcelink, html.theme--documenter-dark .button.is-primary:active, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:active, html.theme--documenter-dark .button.is-primary:focus, html.theme--documenter-dark .docstring > section > a.button.docs-sourcelink:focus { - border-color: #375a7f; - box-shadow: 0 0 0 2px rgba(55, 90, 127, 0.5); } - html.theme--documenter-dark .button.is-link.is-hovered, html.theme--documenter-dark .button.is-link:hover { - background-color: #1fdeb8; } - html.theme--documenter-dark .button.is-link.is-active, html.theme--documenter-dark .button.is-link.is-focused, html.theme--documenter-dark .button.is-link:active, html.theme--documenter-dark .button.is-link:focus { - border-color: #1abc9c; - box-shadow: 0 0 0 2px rgba(26, 188, 156, 0.5); } - html.theme--documenter-dark .button.is-info.is-hovered, html.theme--documenter-dark .button.is-info:hover { - background-color: #0363a3; } - html.theme--documenter-dark .button.is-info.is-active, html.theme--documenter-dark .button.is-info.is-focused, html.theme--documenter-dark .button.is-info:active, html.theme--documenter-dark .button.is-info:focus { - border-color: #024c7d; - box-shadow: 0 0 0 2px rgba(2, 76, 125, 0.5); } - html.theme--documenter-dark .button.is-success.is-hovered, html.theme--documenter-dark .button.is-success:hover { - background-color: #00aa48; } - html.theme--documenter-dark .button.is-success.is-active, html.theme--documenter-dark .button.is-success.is-focused, html.theme--documenter-dark .button.is-success:active, html.theme--documenter-dark .button.is-success:focus { - border-color: #008438; - box-shadow: 0 0 0 2px rgba(0, 132, 56, 0.5); } - html.theme--documenter-dark .button.is-warning.is-hovered, html.theme--documenter-dark .button.is-warning:hover { - background-color: #d39e00; } - html.theme--documenter-dark .button.is-warning.is-active, html.theme--documenter-dark .button.is-warning.is-focused, html.theme--documenter-dark .button.is-warning:active, html.theme--documenter-dark .button.is-warning:focus { - border-color: #ad8100; - box-shadow: 0 0 0 2px rgba(173, 129, 0, 0.5); } - html.theme--documenter-dark .button.is-danger.is-hovered, html.theme--documenter-dark .button.is-danger:hover { - background-color: #c12110; } - html.theme--documenter-dark .button.is-danger.is-active, html.theme--documenter-dark .button.is-danger.is-focused, html.theme--documenter-dark .button.is-danger:active, html.theme--documenter-dark .button.is-danger:focus { - border-color: #9e1b0d; - box-shadow: 0 0 0 2px rgba(158, 27, 13, 0.5); } - html.theme--documenter-dark .label { - color: #dbdee0; } - html.theme--documenter-dark .button, - html.theme--documenter-dark .control.has-icons-left .icon, - html.theme--documenter-dark .control.has-icons-right .icon, - html.theme--documenter-dark .input, - html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input, - html.theme--documenter-dark .pagination-ellipsis, - html.theme--documenter-dark .pagination-link, - html.theme--documenter-dark .pagination-next, - html.theme--documenter-dark .pagination-previous, - html.theme--documenter-dark .select, - html.theme--documenter-dark .select select, - html.theme--documenter-dark .textarea { - height: 2.5em; } - html.theme--documenter-dark .input, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input, - html.theme--documenter-dark .textarea { - transition: all 200ms ease; - box-shadow: none; - border-width: 1px; - padding-left: 1em; - padding-right: 1em; } - html.theme--documenter-dark .select:after, - html.theme--documenter-dark .select select { - border-width: 1px; } - html.theme--documenter-dark .control.has-addons .button, - html.theme--documenter-dark .control.has-addons .input, - html.theme--documenter-dark .control.has-addons #documenter .docs-sidebar form.docs-search > input, - html.theme--documenter-dark #documenter .docs-sidebar .control.has-addons form.docs-search > input, - html.theme--documenter-dark .control.has-addons .select { - margin-right: -1px; } - html.theme--documenter-dark .notification { - background-color: #343c3d; } - html.theme--documenter-dark .card { - box-shadow: none; - border: 1px solid #343c3d; - background-color: #282f2f; - border-radius: 0.4em; } - html.theme--documenter-dark .card .card-image img { - border-radius: 0.4em 0.4em 0 0; } - html.theme--documenter-dark .card .card-header { - box-shadow: none; - background-color: rgba(18, 18, 18, 0.2); - border-radius: 0.4em 0.4em 0 0; } - html.theme--documenter-dark .card .card-footer { - background-color: rgba(18, 18, 18, 0.2); } - html.theme--documenter-dark .card .card-footer, - html.theme--documenter-dark .card .card-footer-item { - border-width: 1px; - border-color: #343c3d; } - html.theme--documenter-dark .notification.is-white a:not(.button) { - color: #0a0a0a; - text-decoration: underline; } - html.theme--documenter-dark .notification.is-black a:not(.button) { - color: white; - text-decoration: underline; } - html.theme--documenter-dark .notification.is-light a:not(.button) { - color: #282f2f; - text-decoration: underline; } - html.theme--documenter-dark .notification.is-dark a:not(.button), html.theme--documenter-dark .content kbd.notification a:not(.button) { - color: #ecf0f1; - text-decoration: underline; } - html.theme--documenter-dark .notification.is-primary a:not(.button), html.theme--documenter-dark .docstring > section > a.notification.docs-sourcelink a:not(.button) { - color: #fff; - text-decoration: underline; } - html.theme--documenter-dark .notification.is-link a:not(.button) { - color: #fff; - text-decoration: underline; } - html.theme--documenter-dark .notification.is-info a:not(.button) { - color: #fff; - text-decoration: underline; } - html.theme--documenter-dark .notification.is-success a:not(.button) { - color: #fff; - text-decoration: underline; } - html.theme--documenter-dark .notification.is-warning a:not(.button) { - color: #fff; - text-decoration: underline; } - html.theme--documenter-dark .notification.is-danger a:not(.button) { - color: #fff; - text-decoration: underline; } - html.theme--documenter-dark .tag, html.theme--documenter-dark .content kbd, html.theme--documenter-dark .docstring > section > a.docs-sourcelink { - border-radius: 0.4em; } - html.theme--documenter-dark .menu-list a { - transition: all 300ms ease; } - html.theme--documenter-dark .modal-card-body { - background-color: #282f2f; } - html.theme--documenter-dark .modal-card-foot, - html.theme--documenter-dark .modal-card-head { - border-color: #343c3d; } - html.theme--documenter-dark .message-header { - font-weight: 700; - background-color: #343c3d; - color: white; } - html.theme--documenter-dark .message-body { - border-width: 1px; - border-color: #343c3d; } - html.theme--documenter-dark .navbar { - border-radius: 0.4em; } - html.theme--documenter-dark .navbar.is-transparent { - background: none; } - html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active, html.theme--documenter-dark .docstring > section > a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active { - background-color: #1abc9c; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark .navbar .navbar-menu { - background-color: #375a7f; - border-radius: 0 0 0.4em 0.4em; } } - html.theme--documenter-dark .hero .navbar, - html.theme--documenter-dark body > .navbar { - border-radius: 0; } - html.theme--documenter-dark .pagination-link, - html.theme--documenter-dark .pagination-next, - html.theme--documenter-dark .pagination-previous { - border-width: 1px; } - html.theme--documenter-dark .panel-block, - html.theme--documenter-dark .panel-heading, - html.theme--documenter-dark .panel-tabs { - border-width: 1px; } - html.theme--documenter-dark .panel-block:first-child, - html.theme--documenter-dark .panel-heading:first-child, - html.theme--documenter-dark .panel-tabs:first-child { - border-top-width: 1px; } - html.theme--documenter-dark .panel-heading { - font-weight: 700; } - html.theme--documenter-dark .panel-tabs a { - border-width: 1px; - margin-bottom: -1px; } - html.theme--documenter-dark .panel-tabs a.is-active { - border-bottom-color: #17a689; } - html.theme--documenter-dark .panel-block:hover { - color: #1dd2af; } - html.theme--documenter-dark .panel-block:hover .panel-icon { - color: #1dd2af; } - html.theme--documenter-dark .panel-block.is-active .panel-icon { - color: #17a689; } - html.theme--documenter-dark .tabs a { - border-bottom-width: 1px; - margin-bottom: -1px; } - html.theme--documenter-dark .tabs ul { - border-bottom-width: 1px; } - html.theme--documenter-dark .tabs.is-boxed a { - border-width: 1px; } - html.theme--documenter-dark .tabs.is-boxed li.is-active a { - background-color: #1f2424; } - html.theme--documenter-dark .tabs.is-toggle li a { - border-width: 1px; - margin-bottom: 0; } - html.theme--documenter-dark .tabs.is-toggle li + li { - margin-left: -1px; } - html.theme--documenter-dark .hero.is-white .navbar .navbar-dropdown .navbar-item:hover { - background-color: transparent; } - html.theme--documenter-dark .hero.is-black .navbar .navbar-dropdown .navbar-item:hover { - background-color: transparent; } - html.theme--documenter-dark .hero.is-light .navbar .navbar-dropdown .navbar-item:hover { - background-color: transparent; } - html.theme--documenter-dark .hero.is-dark .navbar .navbar-dropdown .navbar-item:hover, html.theme--documenter-dark .content kbd.hero .navbar .navbar-dropdown .navbar-item:hover { - background-color: transparent; } - html.theme--documenter-dark .hero.is-primary .navbar .navbar-dropdown .navbar-item:hover, html.theme--documenter-dark .docstring > section > a.hero.docs-sourcelink .navbar .navbar-dropdown .navbar-item:hover { - background-color: transparent; } - html.theme--documenter-dark .hero.is-link .navbar .navbar-dropdown .navbar-item:hover { - background-color: transparent; } - html.theme--documenter-dark .hero.is-info .navbar .navbar-dropdown .navbar-item:hover { - background-color: transparent; } - html.theme--documenter-dark .hero.is-success .navbar .navbar-dropdown .navbar-item:hover { - background-color: transparent; } - html.theme--documenter-dark .hero.is-warning .navbar .navbar-dropdown .navbar-item:hover { - background-color: transparent; } - html.theme--documenter-dark .hero.is-danger .navbar .navbar-dropdown .navbar-item:hover { - background-color: transparent; } - html.theme--documenter-dark h1 .docs-heading-anchor, html.theme--documenter-dark h1 .docs-heading-anchor:hover, html.theme--documenter-dark h1 .docs-heading-anchor:visited, html.theme--documenter-dark h2 .docs-heading-anchor, html.theme--documenter-dark h2 .docs-heading-anchor:hover, html.theme--documenter-dark h2 .docs-heading-anchor:visited, html.theme--documenter-dark h3 .docs-heading-anchor, html.theme--documenter-dark h3 .docs-heading-anchor:hover, html.theme--documenter-dark h3 .docs-heading-anchor:visited, html.theme--documenter-dark h4 .docs-heading-anchor, html.theme--documenter-dark h4 .docs-heading-anchor:hover, html.theme--documenter-dark h4 .docs-heading-anchor:visited, html.theme--documenter-dark h5 .docs-heading-anchor, html.theme--documenter-dark h5 .docs-heading-anchor:hover, html.theme--documenter-dark h5 .docs-heading-anchor:visited, html.theme--documenter-dark h6 .docs-heading-anchor, html.theme--documenter-dark h6 .docs-heading-anchor:hover, html.theme--documenter-dark h6 .docs-heading-anchor:visited { - color: #f2f2f2; } - html.theme--documenter-dark h1 .docs-heading-anchor-permalink, html.theme--documenter-dark h2 .docs-heading-anchor-permalink, html.theme--documenter-dark h3 .docs-heading-anchor-permalink, html.theme--documenter-dark h4 .docs-heading-anchor-permalink, html.theme--documenter-dark h5 .docs-heading-anchor-permalink, html.theme--documenter-dark h6 .docs-heading-anchor-permalink { - visibility: hidden; - vertical-align: middle; - margin-left: 0.5em; - font-size: 0.7rem; } - html.theme--documenter-dark h1 .docs-heading-anchor-permalink::before, html.theme--documenter-dark h2 .docs-heading-anchor-permalink::before, html.theme--documenter-dark h3 .docs-heading-anchor-permalink::before, html.theme--documenter-dark h4 .docs-heading-anchor-permalink::before, html.theme--documenter-dark h5 .docs-heading-anchor-permalink::before, html.theme--documenter-dark h6 .docs-heading-anchor-permalink::before { - font-family: "Font Awesome 5 Free"; - font-weight: 900; - content: "\f0c1"; } - html.theme--documenter-dark h1:hover .docs-heading-anchor-permalink, html.theme--documenter-dark h2:hover .docs-heading-anchor-permalink, html.theme--documenter-dark h3:hover .docs-heading-anchor-permalink, html.theme--documenter-dark h4:hover .docs-heading-anchor-permalink, html.theme--documenter-dark h5:hover .docs-heading-anchor-permalink, html.theme--documenter-dark h6:hover .docs-heading-anchor-permalink { - visibility: visible; } - html.theme--documenter-dark .docs-light-only { - display: none !important; } - html.theme--documenter-dark pre { - position: relative; - overflow: hidden; } - html.theme--documenter-dark pre code, html.theme--documenter-dark pre code.hljs { - padding: 0 0.75rem !important; - overflow: auto; - display: block; } - html.theme--documenter-dark pre code:first-of-type, html.theme--documenter-dark pre code.hljs:first-of-type { - padding-top: 0.5rem !important; } - html.theme--documenter-dark pre code:last-of-type, html.theme--documenter-dark pre code.hljs:last-of-type { - padding-bottom: 0.5rem !important; } - html.theme--documenter-dark pre .copy-button { - opacity: 0.2; - transition: opacity 0.2s; - position: absolute; - right: 0em; - top: 0em; - padding: 0.5em; - width: 2.5em; - height: 2.5em; - background: transparent; - border: none; - font-family: "Font Awesome 5 Free"; - color: #fff; - cursor: pointer; - text-align: center; } - html.theme--documenter-dark pre .copy-button:focus, html.theme--documenter-dark pre .copy-button:hover { - opacity: 1; - background: rgba(255, 255, 255, 0.1); - color: #1abc9c; } - html.theme--documenter-dark pre .copy-button.success { - color: #259a12; - opacity: 1; } - html.theme--documenter-dark pre .copy-button.error { - color: #cb3c33; - opacity: 1; } - html.theme--documenter-dark pre:hover .copy-button { - opacity: 1; } - html.theme--documenter-dark .admonition { - background-color: #282f2f; - border-style: solid; - border-width: 1px; - border-color: #5e6d6f; - border-radius: 0.4em; - font-size: 15px; } - html.theme--documenter-dark .admonition strong { - color: currentColor; } - html.theme--documenter-dark .admonition.is-small, html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input.admonition { - font-size: 0.85em; } - html.theme--documenter-dark .admonition.is-medium { - font-size: 1.25rem; } - html.theme--documenter-dark .admonition.is-large { - font-size: 1.5rem; } - html.theme--documenter-dark .admonition.is-default { - background-color: #282f2f; - border-color: #5e6d6f; } - html.theme--documenter-dark .admonition.is-default > .admonition-header { - background-color: #5e6d6f; } - html.theme--documenter-dark .admonition.is-info { - background-color: #282f2f; - border-color: #024c7d; } - html.theme--documenter-dark .admonition.is-info > .admonition-header { - background-color: #024c7d; } - html.theme--documenter-dark .admonition.is-success { - background-color: #282f2f; - border-color: #008438; } - html.theme--documenter-dark .admonition.is-success > .admonition-header { - background-color: #008438; } - html.theme--documenter-dark .admonition.is-warning { - background-color: #282f2f; - border-color: #ad8100; } - html.theme--documenter-dark .admonition.is-warning > .admonition-header { - background-color: #ad8100; } - html.theme--documenter-dark .admonition.is-danger { - background-color: #282f2f; - border-color: #9e1b0d; } - html.theme--documenter-dark .admonition.is-danger > .admonition-header { - background-color: #9e1b0d; } - html.theme--documenter-dark .admonition.is-compat { - background-color: #282f2f; - border-color: #137886; } - html.theme--documenter-dark .admonition.is-compat > .admonition-header { - background-color: #137886; } - html.theme--documenter-dark .admonition-header { - background-color: #5e6d6f; - align-items: center; - font-weight: 700; - justify-content: space-between; - line-height: 1.25; - padding: 0.5rem 0.75rem; - position: relative; } - html.theme--documenter-dark .admonition-header:before { - font-family: "Font Awesome 5 Free"; - font-weight: 900; - margin-right: 0.75rem; - content: "\f06a"; } - html.theme--documenter-dark .admonition-body { - color: #fff; - padding: 0.5rem 0.75rem; } - html.theme--documenter-dark .admonition-body pre { - background-color: #282f2f; } - html.theme--documenter-dark .admonition-body code { - background-color: rgba(255, 255, 255, 0.05); } - html.theme--documenter-dark .docstring { - margin-bottom: 1em; - background-color: transparent; - border: 1px solid #5e6d6f; - box-shadow: none; - max-width: 100%; } - html.theme--documenter-dark .docstring > header { - display: flex; - flex-grow: 1; - align-items: stretch; - padding: 0.5rem 0.75rem; - background-color: #282f2f; - box-shadow: 0 1px 2px rgba(10, 10, 10, 0.1); - box-shadow: none; - border-bottom: 1px solid #5e6d6f; } - html.theme--documenter-dark .docstring > header code { - background-color: transparent; } - html.theme--documenter-dark .docstring > header .docstring-binding { - margin-right: 0.3em; } - html.theme--documenter-dark .docstring > header .docstring-category { - margin-left: 0.3em; } - html.theme--documenter-dark .docstring > section { - position: relative; - padding: 0.75rem 0.75rem; - border-bottom: 1px solid #5e6d6f; } - html.theme--documenter-dark .docstring > section:last-child { - border-bottom: none; } - html.theme--documenter-dark .docstring > section > a.docs-sourcelink { - transition: opacity 0.3s; - opacity: 0; - position: absolute; - right: 0.375rem; - bottom: 0.375rem; } - html.theme--documenter-dark .docstring > section > a.docs-sourcelink:focus { - opacity: 1 !important; } - html.theme--documenter-dark .docstring:hover > section > a.docs-sourcelink { - opacity: 0.2; } - html.theme--documenter-dark .docstring:focus-within > section > a.docs-sourcelink { - opacity: 0.2; } - html.theme--documenter-dark .docstring > section:hover a.docs-sourcelink { - opacity: 1; } - html.theme--documenter-dark .documenter-example-output { - background-color: #1f2424; } - html.theme--documenter-dark .outdated-warning-overlay { - position: fixed; - top: 0; - left: 0; - right: 0; - box-shadow: 0 0 10px rgba(0, 0, 0, 0.3); - z-index: 999; - background-color: #282f2f; - border-bottom: 3px solid #9e1b0d; - padding: 10px 35px; - text-align: center; - font-size: 15px; } - html.theme--documenter-dark .outdated-warning-overlay .outdated-warning-closer { - position: absolute; - top: calc(50% - 10px); - right: 18px; - cursor: pointer; - width: 12px; } - html.theme--documenter-dark .outdated-warning-overlay a { - color: #1abc9c; } - html.theme--documenter-dark .outdated-warning-overlay a:hover { - color: #1dd2af; } - html.theme--documenter-dark .content pre { - border: 1px solid #5e6d6f; } - html.theme--documenter-dark .content code { - font-weight: inherit; } - html.theme--documenter-dark .content a code { - color: #1abc9c; } - html.theme--documenter-dark .content h1 code, html.theme--documenter-dark .content h2 code, html.theme--documenter-dark .content h3 code, html.theme--documenter-dark .content h4 code, html.theme--documenter-dark .content h5 code, html.theme--documenter-dark .content h6 code { - color: #f2f2f2; } - html.theme--documenter-dark .content table { - display: block; - width: initial; - max-width: 100%; - overflow-x: auto; } - html.theme--documenter-dark .content blockquote > ul:first-child, html.theme--documenter-dark .content blockquote > ol:first-child, html.theme--documenter-dark .content .admonition-body > ul:first-child, html.theme--documenter-dark .content .admonition-body > ol:first-child { - margin-top: 0; } - html.theme--documenter-dark pre, html.theme--documenter-dark code { - font-variant-ligatures: no-contextual; } - html.theme--documenter-dark .breadcrumb a.is-disabled { - cursor: default; - pointer-events: none; } - html.theme--documenter-dark .breadcrumb a.is-disabled, html.theme--documenter-dark .breadcrumb a.is-disabled:hover { - color: #f2f2f2; } - html.theme--documenter-dark .hljs { - background: initial !important; } - html.theme--documenter-dark .katex .katex-mathml { - top: 0; - right: 0; } - html.theme--documenter-dark .katex-display, html.theme--documenter-dark mjx-container, html.theme--documenter-dark .MathJax_Display { - margin: 0.5em 0 !important; } - html.theme--documenter-dark html { - -moz-osx-font-smoothing: auto; - -webkit-font-smoothing: auto; } - html.theme--documenter-dark li.no-marker { - list-style: none; } - html.theme--documenter-dark #documenter .docs-main > article { - overflow-wrap: break-word; } - html.theme--documenter-dark #documenter .docs-main > article .math-container { - overflow-x: auto; - overflow-y: hidden; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark #documenter .docs-main { - max-width: 52rem; - margin-left: 20rem; - padding-right: 1rem; } } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark #documenter .docs-main { - width: 100%; } - html.theme--documenter-dark #documenter .docs-main > article { - max-width: 52rem; - margin-left: auto; - margin-right: auto; - margin-bottom: 1rem; - padding: 0 1rem; } - html.theme--documenter-dark #documenter .docs-main > header, html.theme--documenter-dark #documenter .docs-main > nav { - max-width: 100%; - width: 100%; - margin: 0; } } - html.theme--documenter-dark #documenter .docs-main header.docs-navbar { - background-color: #1f2424; - border-bottom: 1px solid #5e6d6f; - z-index: 2; - min-height: 4rem; - margin-bottom: 1rem; - display: flex; } - html.theme--documenter-dark #documenter .docs-main header.docs-navbar .breadcrumb { - flex-grow: 1; } - html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right { - display: flex; - white-space: nowrap; } - html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-icon, html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label, html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button { - display: inline-block; } - html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label { - padding: 0; - margin-left: 0.3em; } - html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-settings-button { - margin: auto 0 auto 1rem; } - html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button { - font-size: 1.5rem; - margin: auto 0 auto 1rem; } - html.theme--documenter-dark #documenter .docs-main header.docs-navbar > * { - margin: auto 0; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark #documenter .docs-main header.docs-navbar { - position: sticky; - top: 0; - padding: 0 1rem; - /* For Headroom.js */ - transition-property: top, box-shadow; - -webkit-transition-property: top, box-shadow; - /* Safari */ - transition-duration: 0.3s; - -webkit-transition-duration: 0.3s; - /* Safari */ } - html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--not-top { - box-shadow: 0.2rem 0rem 0.4rem #171717; - transition-duration: 0.7s; - -webkit-transition-duration: 0.7s; - /* Safari */ } - html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom { - top: -4.5rem; - transition-duration: 0.7s; - -webkit-transition-duration: 0.7s; - /* Safari */ } } - html.theme--documenter-dark #documenter .docs-main section.footnotes { - border-top: 1px solid #5e6d6f; } - html.theme--documenter-dark #documenter .docs-main section.footnotes li .tag:first-child, html.theme--documenter-dark #documenter .docs-main section.footnotes li .docstring > section > a.docs-sourcelink:first-child, html.theme--documenter-dark #documenter .docs-main section.footnotes li .content kbd:first-child, html.theme--documenter-dark .content #documenter .docs-main section.footnotes li kbd:first-child { - margin-right: 1em; - margin-bottom: 0.4em; } - html.theme--documenter-dark #documenter .docs-main .docs-footer { - display: flex; - flex-wrap: wrap; - margin-left: 0; - margin-right: 0; - border-top: 1px solid #5e6d6f; - padding-top: 1rem; - padding-bottom: 1rem; } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark #documenter .docs-main .docs-footer { - padding-left: 1rem; - padding-right: 1rem; } } - html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage, html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-prevpage { - flex-grow: 1; } - html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage { - text-align: right; } - html.theme--documenter-dark #documenter .docs-main .docs-footer .flexbox-break { - flex-basis: 100%; - height: 0; } - html.theme--documenter-dark #documenter .docs-main .docs-footer .footer-message { - font-size: 0.8em; - margin: 0.5em auto 0 auto; - text-align: center; } - html.theme--documenter-dark #documenter .docs-sidebar { - display: flex; - flex-direction: column; - color: #fff; - background-color: #282f2f; - border-right: 1px solid #5e6d6f; - padding: 0; - flex: 0 0 18rem; - z-index: 5; - font-size: 15px; - position: fixed; - left: -18rem; - width: 18rem; - height: 100%; - transition: left 0.3s; - /* Setting up a nicer theme style for the scrollbar */ } - html.theme--documenter-dark #documenter .docs-sidebar.visible { - left: 0; - box-shadow: 0.4rem 0rem 0.8rem #171717; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark #documenter .docs-sidebar.visible { - box-shadow: none; } } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark #documenter .docs-sidebar { - left: 0; - top: 0; } } - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo { - margin-top: 1rem; - padding: 0 1rem; } - html.theme--documenter-dark #documenter .docs-sidebar .docs-logo > img { - max-height: 6rem; - margin: auto; } - html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name { - flex-shrink: 0; - font-size: 1.5rem; - font-weight: 700; - text-align: center; - white-space: nowrap; - overflow: hidden; - padding: 0.5rem 0; } - html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name .docs-autofit { - max-width: 16.2rem; } - html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a, html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a:hover { - color: #fff; } - html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector { - border-top: 1px solid #5e6d6f; - display: none; - padding: 0.5rem; } - html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector.visible { - display: flex; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu { - flex-grow: 1; - user-select: none; - border-top: 1px solid #5e6d6f; - padding-bottom: 1.5rem; - /* Managing collapsible submenus */ } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu > li > .tocitem { - font-weight: bold; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu > li li { - font-size: 14.25px; - margin-left: 1em; - border-left: 1px solid #5e6d6f; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input.collapse-toggle { - display: none; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.collapsed { - display: none; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked ~ ul.collapsed { - display: block; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem { - display: flex; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label { - flex-grow: 2; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron { - display: inline-block; - font-style: normal; - font-variant: normal; - text-rendering: auto; - line-height: 1; - font-size: 11.25px; - margin-left: 1rem; - margin-top: auto; - margin-bottom: auto; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before { - font-family: "Font Awesome 5 Free"; - font-weight: 900; - content: "\f054"; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked ~ label.tocitem .docs-chevron::before { - content: "\f078"; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem { - display: block; - padding: 0.5rem 0.5rem; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem, html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem:hover { - color: #fff; - background: #282f2f; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu a.tocitem:hover, html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem:hover { - color: #fff; - background-color: #32393a; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active { - border-top: 1px solid #5e6d6f; - border-bottom: 1px solid #5e6d6f; - background-color: #1f2424; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem, html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover { - background-color: #1f2424; - color: #fff; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover { - background-color: #32393a; - color: #fff; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu > li.is-active:first-child { - border-top: none; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal { - margin: 0 0.5rem 0.5rem; - border-top: 1px solid #5e6d6f; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal li { - font-size: 12.75px; - border-left: none; - margin-left: 0; - margin-top: 0.5rem; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem { - width: 100%; - padding: 0; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before { - content: "⚬"; - margin-right: 0.4em; } - html.theme--documenter-dark #documenter .docs-sidebar form.docs-search { - margin: auto; - margin-top: 0.5rem; - margin-bottom: 0.5rem; } - html.theme--documenter-dark #documenter .docs-sidebar form.docs-search > input { - width: 14.4rem; } - @media screen and (min-width: 1056px) { - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu { - overflow-y: auto; - -webkit-overflow-scroll: touch; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar { - width: .3rem; - background: none; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb { - border-radius: 5px 0px 0px 5px; - background: #3b4445; } - html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover { - background: #4e5a5c; } } - @media screen and (max-width: 1055px) { - html.theme--documenter-dark #documenter .docs-sidebar { - overflow-y: auto; - -webkit-overflow-scroll: touch; } - html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar { - width: .3rem; - background: none; } - html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb { - border-radius: 5px 0px 0px 5px; - background: #3b4445; } - html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb:hover { - background: #4e5a5c; } } - html.theme--documenter-dark #documenter .docs-main #documenter-search-info { - margin-bottom: 1rem; } - html.theme--documenter-dark #documenter .docs-main #documenter-search-results { - list-style-type: circle; - list-style-position: outside; } - html.theme--documenter-dark #documenter .docs-main #documenter-search-results li { - margin-left: 2rem; } - html.theme--documenter-dark #documenter .docs-main #documenter-search-results .docs-highlight { - background-color: yellow; } - html.theme--documenter-dark { - background-color: #1f2424; - font-size: 16px; - min-width: 300px; - overflow-x: auto; - overflow-y: scroll; - text-rendering: optimizeLegibility; - text-size-adjust: 100%; } - html.theme--documenter-dark .ansi span.sgr1 { - font-weight: bolder; } - html.theme--documenter-dark .ansi span.sgr2 { - font-weight: lighter; } - html.theme--documenter-dark .ansi span.sgr3 { - font-style: italic; } - html.theme--documenter-dark .ansi span.sgr4 { - text-decoration: underline; } - html.theme--documenter-dark .ansi span.sgr7 { - color: #1f2424; - background-color: #fff; } - html.theme--documenter-dark .ansi span.sgr8 { - color: transparent; } - html.theme--documenter-dark .ansi span.sgr8 span { - color: transparent; } - html.theme--documenter-dark .ansi span.sgr9 { - text-decoration: line-through; } - html.theme--documenter-dark .ansi span.sgr30 { - color: #242424; } - html.theme--documenter-dark .ansi span.sgr31 { - color: #f6705f; } - html.theme--documenter-dark .ansi span.sgr32 { - color: #4fb43a; } - html.theme--documenter-dark .ansi span.sgr33 { - color: #f4c72f; } - html.theme--documenter-dark .ansi span.sgr34 { - color: #7587f0; } - html.theme--documenter-dark .ansi span.sgr35 { - color: #bc89d3; } - html.theme--documenter-dark .ansi span.sgr36 { - color: #49b6ca; } - html.theme--documenter-dark .ansi span.sgr37 { - color: #b3bdbe; } - html.theme--documenter-dark .ansi span.sgr40 { - background-color: #242424; } - html.theme--documenter-dark .ansi span.sgr41 { - background-color: #f6705f; } - html.theme--documenter-dark .ansi span.sgr42 { - background-color: #4fb43a; } - html.theme--documenter-dark .ansi span.sgr43 { - background-color: #f4c72f; } - html.theme--documenter-dark .ansi span.sgr44 { - background-color: #7587f0; } - html.theme--documenter-dark .ansi span.sgr45 { - background-color: #bc89d3; } - html.theme--documenter-dark .ansi span.sgr46 { - background-color: #49b6ca; } - html.theme--documenter-dark .ansi span.sgr47 { - background-color: #b3bdbe; } - html.theme--documenter-dark .ansi span.sgr90 { - color: #92a0a2; } - html.theme--documenter-dark .ansi span.sgr91 { - color: #ff8674; } - html.theme--documenter-dark .ansi span.sgr92 { - color: #79d462; } - html.theme--documenter-dark .ansi span.sgr93 { - color: #ffe76b; } - html.theme--documenter-dark .ansi span.sgr94 { - color: #8a98ff; } - html.theme--documenter-dark .ansi span.sgr95 { - color: #d2a4e6; } - html.theme--documenter-dark .ansi span.sgr96 { - color: #6bc8db; } - html.theme--documenter-dark .ansi span.sgr97 { - color: #ecf0f1; } - html.theme--documenter-dark .ansi span.sgr100 { - background-color: #92a0a2; } - html.theme--documenter-dark .ansi span.sgr101 { - background-color: #ff8674; } - html.theme--documenter-dark .ansi span.sgr102 { - background-color: #79d462; } - html.theme--documenter-dark .ansi span.sgr103 { - background-color: #ffe76b; } - html.theme--documenter-dark .ansi span.sgr104 { - background-color: #8a98ff; } - html.theme--documenter-dark .ansi span.sgr105 { - background-color: #d2a4e6; } - html.theme--documenter-dark .ansi span.sgr106 { - background-color: #6bc8db; } - html.theme--documenter-dark .ansi span.sgr107 { - background-color: #ecf0f1; } - html.theme--documenter-dark code.language-julia-repl > span.hljs-meta { - color: #4fb43a; - font-weight: bolder; } - html.theme--documenter-dark .hljs { - background: #2b2b2b; - color: #f8f8f2; } - html.theme--documenter-dark .hljs-comment, - html.theme--documenter-dark .hljs-quote { - color: #d4d0ab; } - html.theme--documenter-dark .hljs-variable, - html.theme--documenter-dark .hljs-template-variable, - html.theme--documenter-dark .hljs-tag, - html.theme--documenter-dark .hljs-name, - html.theme--documenter-dark .hljs-selector-id, - html.theme--documenter-dark .hljs-selector-class, - html.theme--documenter-dark .hljs-regexp, - html.theme--documenter-dark .hljs-deletion { - color: #ffa07a; } - html.theme--documenter-dark .hljs-number, - html.theme--documenter-dark .hljs-built_in, - html.theme--documenter-dark .hljs-literal, - html.theme--documenter-dark .hljs-type, - html.theme--documenter-dark .hljs-params, - html.theme--documenter-dark .hljs-meta, - html.theme--documenter-dark .hljs-link { - color: #f5ab35; } - html.theme--documenter-dark .hljs-attribute { - color: #ffd700; } - html.theme--documenter-dark .hljs-string, - html.theme--documenter-dark .hljs-symbol, - html.theme--documenter-dark .hljs-bullet, - html.theme--documenter-dark .hljs-addition { - color: #abe338; } - html.theme--documenter-dark .hljs-title, - html.theme--documenter-dark .hljs-section { - color: #00e0e0; } - html.theme--documenter-dark .hljs-keyword, - html.theme--documenter-dark .hljs-selector-tag { - color: #dcc6e0; } - html.theme--documenter-dark .hljs-emphasis { - font-style: italic; } - html.theme--documenter-dark .hljs-strong { - font-weight: bold; } - @media screen and (-ms-high-contrast: active) { - html.theme--documenter-dark .hljs-addition, - html.theme--documenter-dark .hljs-attribute, - html.theme--documenter-dark .hljs-built_in, - html.theme--documenter-dark .hljs-bullet, - html.theme--documenter-dark .hljs-comment, - html.theme--documenter-dark .hljs-link, - html.theme--documenter-dark .hljs-literal, - html.theme--documenter-dark .hljs-meta, - html.theme--documenter-dark .hljs-number, - html.theme--documenter-dark .hljs-params, - html.theme--documenter-dark .hljs-string, - html.theme--documenter-dark .hljs-symbol, - html.theme--documenter-dark .hljs-type, - html.theme--documenter-dark .hljs-quote { - color: highlight; } - html.theme--documenter-dark .hljs-keyword, - html.theme--documenter-dark .hljs-selector-tag { - font-weight: bold; } } - html.theme--documenter-dark .hljs-subst { - color: #f8f8f2; } +*/}html.theme--documenter-dark html{background-color:#1f2424;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}html.theme--documenter-dark article,html.theme--documenter-dark aside,html.theme--documenter-dark figure,html.theme--documenter-dark footer,html.theme--documenter-dark header,html.theme--documenter-dark hgroup,html.theme--documenter-dark section{display:block}html.theme--documenter-dark body,html.theme--documenter-dark button,html.theme--documenter-dark input,html.theme--documenter-dark select,html.theme--documenter-dark textarea{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif}html.theme--documenter-dark code,html.theme--documenter-dark pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}html.theme--documenter-dark body{color:#fff;font-size:1em;font-weight:400;line-height:1.5}html.theme--documenter-dark a{color:#1abc9c;cursor:pointer;text-decoration:none}html.theme--documenter-dark a strong{color:currentColor}html.theme--documenter-dark a:hover{color:#1dd2af}html.theme--documenter-dark code{background-color:rgba(255,255,255,0.05);color:#ececec;font-size:.875em;font-weight:normal;padding:.1em}html.theme--documenter-dark hr{background-color:#282f2f;border:none;display:block;height:2px;margin:1.5rem 0}html.theme--documenter-dark img{height:auto;max-width:100%}html.theme--documenter-dark input[type="checkbox"],html.theme--documenter-dark input[type="radio"]{vertical-align:baseline}html.theme--documenter-dark small{font-size:.875em}html.theme--documenter-dark span{font-style:inherit;font-weight:inherit}html.theme--documenter-dark strong{color:#f2f2f2;font-weight:700}html.theme--documenter-dark fieldset{border:none}html.theme--documenter-dark pre{-webkit-overflow-scrolling:touch;background-color:#282f2f;color:#fff;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}html.theme--documenter-dark pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}html.theme--documenter-dark table td,html.theme--documenter-dark table th{vertical-align:top}html.theme--documenter-dark table td:not([align]),html.theme--documenter-dark table th:not([align]){text-align:left}html.theme--documenter-dark table th{color:#f2f2f2}html.theme--documenter-dark .box{background-color:#343c3d;border-radius:8px;box-shadow:none;color:#fff;display:block;padding:1.25rem}html.theme--documenter-dark a.box:hover,html.theme--documenter-dark a.box:focus{box-shadow:0 2px 3px rgba(10,10,10,0.1),0 0 0 1px #1abc9c}html.theme--documenter-dark a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2),0 0 0 1px #1abc9c}html.theme--documenter-dark .button{background-color:#282f2f;border-color:#4c5759;border-width:1px;color:#375a7f;cursor:pointer;justify-content:center;padding-bottom:calc(0.375em - 1px);padding-left:.75em;padding-right:.75em;padding-top:calc(0.375em - 1px);text-align:center;white-space:nowrap}html.theme--documenter-dark .button strong{color:inherit}html.theme--documenter-dark .button .icon,html.theme--documenter-dark .button .icon.is-small,html.theme--documenter-dark .button #documenter .docs-sidebar form.docs-search>input.icon,html.theme--documenter-dark #documenter .docs-sidebar .button form.docs-search>input.icon,html.theme--documenter-dark .button .icon.is-medium,html.theme--documenter-dark .button .icon.is-large{height:1.5em;width:1.5em}html.theme--documenter-dark .button .icon:first-child:not(:last-child){margin-left:calc(-0.375em - 1px);margin-right:0.1875em}html.theme--documenter-dark .button .icon:last-child:not(:first-child){margin-left:0.1875em;margin-right:calc(-0.375em - 1px)}html.theme--documenter-dark .button .icon:first-child:last-child{margin-left:calc(-0.375em - 1px);margin-right:calc(-0.375em - 1px)}html.theme--documenter-dark .button:hover,html.theme--documenter-dark .button.is-hovered{border-color:#8c9b9d;color:#f2f2f2}html.theme--documenter-dark .button:focus,html.theme--documenter-dark .button.is-focused{border-color:#8c9b9d;color:#17a689}html.theme--documenter-dark .button:focus:not(:active),html.theme--documenter-dark .button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .button:active,html.theme--documenter-dark .button.is-active{border-color:#343c3d;color:#f2f2f2}html.theme--documenter-dark .button.is-text{background-color:transparent;border-color:transparent;color:#fff;text-decoration:underline}html.theme--documenter-dark .button.is-text:hover,html.theme--documenter-dark .button.is-text.is-hovered,html.theme--documenter-dark .button.is-text:focus,html.theme--documenter-dark .button.is-text.is-focused{background-color:#282f2f;color:#f2f2f2}html.theme--documenter-dark .button.is-text:active,html.theme--documenter-dark .button.is-text.is-active{background-color:#1d2122;color:#f2f2f2}html.theme--documenter-dark .button.is-text[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:hover,html.theme--documenter-dark .button.is-white.is-hovered{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:focus,html.theme--documenter-dark .button.is-white.is-focused{border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white:focus:not(:active),html.theme--documenter-dark .button.is-white.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .button.is-white:active,html.theme--documenter-dark .button.is-white.is-active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .button.is-white[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white{background-color:#fff;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted:hover,html.theme--documenter-dark .button.is-white.is-inverted.is-hovered{background-color:#000}html.theme--documenter-dark .button.is-white.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-white.is-outlined:hover,html.theme--documenter-dark .button.is-white.is-outlined.is-hovered,html.theme--documenter-dark .button.is-white.is-outlined:focus,html.theme--documenter-dark .button.is-white.is-outlined.is-focused{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-white.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-white.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-white.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-focused{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-white.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:hover,html.theme--documenter-dark .button.is-black.is-hovered{background-color:#040404;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:focus,html.theme--documenter-dark .button.is-black.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black:focus:not(:active),html.theme--documenter-dark .button.is-black.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .button.is-black:active,html.theme--documenter-dark .button.is-black.is-active{background-color:#000;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-black[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black{background-color:#0a0a0a;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted:hover,html.theme--documenter-dark .button.is-black.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-black.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-outlined:hover,html.theme--documenter-dark .button.is-black.is-outlined.is-hovered,html.theme--documenter-dark .button.is-black.is-outlined:focus,html.theme--documenter-dark .button.is-black.is-outlined.is-focused{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-black.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-black.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-black.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-focused{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-black.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}html.theme--documenter-dark .button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-light{background-color:#ecf0f1;border-color:transparent;color:#282f2f}html.theme--documenter-dark .button.is-light:hover,html.theme--documenter-dark .button.is-light.is-hovered{background-color:#e5eaec;border-color:transparent;color:#282f2f}html.theme--documenter-dark .button.is-light:focus,html.theme--documenter-dark .button.is-light.is-focused{border-color:transparent;color:#282f2f}html.theme--documenter-dark .button.is-light:focus:not(:active),html.theme--documenter-dark .button.is-light.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .button.is-light:active,html.theme--documenter-dark .button.is-light.is-active{background-color:#dde4e6;border-color:transparent;color:#282f2f}html.theme--documenter-dark .button.is-light[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light{background-color:#ecf0f1;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-light.is-inverted{background-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted:hover,html.theme--documenter-dark .button.is-light.is-inverted.is-hovered{background-color:#1d2122}html.theme--documenter-dark .button.is-light.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted{background-color:#282f2f;border-color:transparent;box-shadow:none;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-loading::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-light.is-outlined{background-color:transparent;border-color:#ecf0f1;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-outlined:hover,html.theme--documenter-dark .button.is-light.is-outlined.is-hovered,html.theme--documenter-dark .button.is-light.is-outlined:focus,html.theme--documenter-dark .button.is-light.is-outlined.is-focused{background-color:#ecf0f1;border-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-light.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-light.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-light.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-outlined{background-color:transparent;border-color:#ecf0f1;box-shadow:none;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:#282f2f;color:#282f2f}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-focused{background-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-light.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:#282f2f;box-shadow:none;color:#282f2f}html.theme--documenter-dark .button.is-dark,html.theme--documenter-dark .content kbd.button{background-color:#282f2f;border-color:transparent;color:#ecf0f1}html.theme--documenter-dark .button.is-dark:hover,html.theme--documenter-dark .content kbd.button:hover,html.theme--documenter-dark .button.is-dark.is-hovered,html.theme--documenter-dark .content kbd.button.is-hovered{background-color:#232829;border-color:transparent;color:#ecf0f1}html.theme--documenter-dark .button.is-dark:focus,html.theme--documenter-dark .content kbd.button:focus,html.theme--documenter-dark .button.is-dark.is-focused,html.theme--documenter-dark .content kbd.button.is-focused{border-color:transparent;color:#ecf0f1}html.theme--documenter-dark .button.is-dark:focus:not(:active),html.theme--documenter-dark .content kbd.button:focus:not(:active),html.theme--documenter-dark .button.is-dark.is-focused:not(:active),html.theme--documenter-dark .content kbd.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .button.is-dark:active,html.theme--documenter-dark .content kbd.button:active,html.theme--documenter-dark .button.is-dark.is-active,html.theme--documenter-dark .content kbd.button.is-active{background-color:#1d2122;border-color:transparent;color:#ecf0f1}html.theme--documenter-dark .button.is-dark[disabled],html.theme--documenter-dark .content kbd.button[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark,fieldset[disabled] html.theme--documenter-dark .content kbd.button{background-color:#282f2f;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-dark.is-inverted,html.theme--documenter-dark .content kbd.button.is-inverted{background-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted:hover,html.theme--documenter-dark .content kbd.button.is-inverted:hover,html.theme--documenter-dark .button.is-dark.is-inverted.is-hovered,html.theme--documenter-dark .content kbd.button.is-inverted.is-hovered{background-color:#dde4e6}html.theme--documenter-dark .button.is-dark.is-inverted[disabled],html.theme--documenter-dark .content kbd.button.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted{background-color:#ecf0f1;border-color:transparent;box-shadow:none;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-loading::after,html.theme--documenter-dark .content kbd.button.is-loading::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-dark.is-outlined,html.theme--documenter-dark .content kbd.button.is-outlined{background-color:transparent;border-color:#282f2f;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-outlined:hover,html.theme--documenter-dark .content kbd.button.is-outlined:hover,html.theme--documenter-dark .button.is-dark.is-outlined.is-hovered,html.theme--documenter-dark .content kbd.button.is-outlined.is-hovered,html.theme--documenter-dark .button.is-dark.is-outlined:focus,html.theme--documenter-dark .content kbd.button.is-outlined:focus,html.theme--documenter-dark .button.is-dark.is-outlined.is-focused,html.theme--documenter-dark .content kbd.button.is-outlined.is-focused{background-color:#282f2f;border-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .button.is-dark.is-outlined.is-loading::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:hover::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading:focus::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-dark.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .content kbd.button.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ecf0f1 #ecf0f1 !important}html.theme--documenter-dark .button.is-dark.is-outlined[disabled],html.theme--documenter-dark .content kbd.button.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-outlined,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-outlined{background-color:transparent;border-color:#282f2f;box-shadow:none;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#ecf0f1;color:#ecf0f1}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:hover,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined:focus,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-focused,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-focused{background-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #282f2f #282f2f !important}html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined[disabled],html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-dark.is-inverted.is-outlined,fieldset[disabled] html.theme--documenter-dark .content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#ecf0f1;box-shadow:none;color:#ecf0f1}html.theme--documenter-dark .button.is-primary,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink{background-color:#375a7f;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:hover,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-hovered.docs-sourcelink{background-color:#335476;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:focus,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary:focus:not(:active),html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus:not(:active),html.theme--documenter-dark .button.is-primary.is-focused:not(:active),html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink:not(:active){box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .button.is-primary:active,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary.is-active,html.theme--documenter-dark .docstring>section>a.button.is-active.docs-sourcelink{background-color:#2f4d6d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-primary[disabled],html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink{background-color:#375a7f;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-primary.is-inverted,html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted:hover,html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-inverted.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-hovered.docs-sourcelink{background-color:#f2f2f2}html.theme--documenter-dark .button.is-primary.is-inverted[disabled],html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;border-color:transparent;box-shadow:none;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-loading::after,html.theme--documenter-dark .docstring>section>a.button.is-loading.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-primary.is-outlined,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#375a7f;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-outlined:hover,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-outlined.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-outlined:focus,html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-outlined.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-focused.docs-sourcelink{background-color:#375a7f;border-color:#375a7f;color:#fff}html.theme--documenter-dark .button.is-primary.is-outlined.is-loading::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink::after{border-color:transparent transparent #375a7f #375a7f !important}html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:hover::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:hover::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading:focus::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:focus::after,html.theme--documenter-dark .button.is-primary.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .docstring>section>a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-primary.is-outlined[disabled],html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-outlined,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#375a7f;box-shadow:none;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:hover,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:hover,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined:focus,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:focus,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-focused.docs-sourcelink{background-color:#fff;color:#375a7f}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after,html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #375a7f #375a7f !important}html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined[disabled],html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-primary.is-inverted.is-outlined,fieldset[disabled] html.theme--documenter-dark .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-link{background-color:#1abc9c;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:hover,html.theme--documenter-dark .button.is-link.is-hovered{background-color:#18b193;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:focus,html.theme--documenter-dark .button.is-link.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link:focus:not(:active),html.theme--documenter-dark .button.is-link.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .button.is-link:active,html.theme--documenter-dark .button.is-link.is-active{background-color:#17a689;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-link[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link{background-color:#1abc9c;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-link.is-inverted{background-color:#fff;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted:hover,html.theme--documenter-dark .button.is-link.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-link.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-link.is-outlined{background-color:transparent;border-color:#1abc9c;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-outlined:hover,html.theme--documenter-dark .button.is-link.is-outlined.is-hovered,html.theme--documenter-dark .button.is-link.is-outlined:focus,html.theme--documenter-dark .button.is-link.is-outlined.is-focused{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #1abc9c #1abc9c !important}html.theme--documenter-dark .button.is-link.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-link.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-link.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-outlined{background-color:transparent;border-color:#1abc9c;box-shadow:none;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-focused{background-color:#fff;color:#1abc9c}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-link.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #1abc9c #1abc9c !important}html.theme--documenter-dark .button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-info{background-color:#024c7d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:hover,html.theme--documenter-dark .button.is-info.is-hovered{background-color:#024470;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:focus,html.theme--documenter-dark .button.is-info.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info:focus:not(:active),html.theme--documenter-dark .button.is-info.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .button.is-info:active,html.theme--documenter-dark .button.is-info.is-active{background-color:#023d64;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-info[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info{background-color:#024c7d;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-info.is-inverted{background-color:#fff;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted:hover,html.theme--documenter-dark .button.is-info.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-info.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#024c7d}html.theme--documenter-dark .button.is-info.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-info.is-outlined{background-color:transparent;border-color:#024c7d;color:#024c7d}html.theme--documenter-dark .button.is-info.is-outlined:hover,html.theme--documenter-dark .button.is-info.is-outlined.is-hovered,html.theme--documenter-dark .button.is-info.is-outlined:focus,html.theme--documenter-dark .button.is-info.is-outlined.is-focused{background-color:#024c7d;border-color:#024c7d;color:#fff}html.theme--documenter-dark .button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #024c7d #024c7d !important}html.theme--documenter-dark .button.is-info.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-info.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-info.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-outlined{background-color:transparent;border-color:#024c7d;box-shadow:none;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-focused{background-color:#fff;color:#024c7d}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-info.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #024c7d #024c7d !important}html.theme--documenter-dark .button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-success{background-color:#008438;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:hover,html.theme--documenter-dark .button.is-success.is-hovered{background-color:#073;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:focus,html.theme--documenter-dark .button.is-success.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success:focus:not(:active),html.theme--documenter-dark .button.is-success.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .button.is-success:active,html.theme--documenter-dark .button.is-success.is-active{background-color:#006b2d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-success[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success{background-color:#008438;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-success.is-inverted{background-color:#fff;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted:hover,html.theme--documenter-dark .button.is-success.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-success.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#008438}html.theme--documenter-dark .button.is-success.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-success.is-outlined{background-color:transparent;border-color:#008438;color:#008438}html.theme--documenter-dark .button.is-success.is-outlined:hover,html.theme--documenter-dark .button.is-success.is-outlined.is-hovered,html.theme--documenter-dark .button.is-success.is-outlined:focus,html.theme--documenter-dark .button.is-success.is-outlined.is-focused{background-color:#008438;border-color:#008438;color:#fff}html.theme--documenter-dark .button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #008438 #008438 !important}html.theme--documenter-dark .button.is-success.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-success.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-success.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-outlined{background-color:transparent;border-color:#008438;box-shadow:none;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-focused{background-color:#fff;color:#008438}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-success.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #008438 #008438 !important}html.theme--documenter-dark .button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-warning{background-color:#ad8100;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:hover,html.theme--documenter-dark .button.is-warning.is-hovered{background-color:#a07700;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:focus,html.theme--documenter-dark .button.is-warning.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning:focus:not(:active),html.theme--documenter-dark .button.is-warning.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .button.is-warning:active,html.theme--documenter-dark .button.is-warning.is-active{background-color:#946e00;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-warning[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning{background-color:#ad8100;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-warning.is-inverted{background-color:#fff;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted:hover,html.theme--documenter-dark .button.is-warning.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-warning.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-warning.is-outlined{background-color:transparent;border-color:#ad8100;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-outlined:hover,html.theme--documenter-dark .button.is-warning.is-outlined.is-hovered,html.theme--documenter-dark .button.is-warning.is-outlined:focus,html.theme--documenter-dark .button.is-warning.is-outlined.is-focused{background-color:#ad8100;border-color:#ad8100;color:#fff}html.theme--documenter-dark .button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ad8100 #ad8100 !important}html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-warning.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-warning.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-outlined{background-color:transparent;border-color:#ad8100;box-shadow:none;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-focused{background-color:#fff;color:#ad8100}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ad8100 #ad8100 !important}html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-danger{background-color:#9e1b0d;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:hover,html.theme--documenter-dark .button.is-danger.is-hovered{background-color:#92190c;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:focus,html.theme--documenter-dark .button.is-danger.is-focused{border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger:focus:not(:active),html.theme--documenter-dark .button.is-danger.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .button.is-danger:active,html.theme--documenter-dark .button.is-danger.is-active{background-color:#86170b;border-color:transparent;color:#fff}html.theme--documenter-dark .button.is-danger[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger{background-color:#9e1b0d;border-color:transparent;box-shadow:none}html.theme--documenter-dark .button.is-danger.is-inverted{background-color:#fff;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted:hover,html.theme--documenter-dark .button.is-danger.is-inverted.is-hovered{background-color:#f2f2f2}html.theme--documenter-dark .button.is-danger.is-inverted[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-danger.is-outlined{background-color:transparent;border-color:#9e1b0d;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-outlined:hover,html.theme--documenter-dark .button.is-danger.is-outlined.is-hovered,html.theme--documenter-dark .button.is-danger.is-outlined:focus,html.theme--documenter-dark .button.is-danger.is-outlined.is-focused{background-color:#9e1b0d;border-color:#9e1b0d;color:#fff}html.theme--documenter-dark .button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #9e1b0d #9e1b0d !important}html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-danger.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}html.theme--documenter-dark .button.is-danger.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-outlined{background-color:transparent;border-color:#9e1b0d;box-shadow:none;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:hover,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-hovered,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined:focus,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-focused{background-color:#fff;color:#9e1b0d}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:hover::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading:focus::after,html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #9e1b0d #9e1b0d !important}html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] html.theme--documenter-dark .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}html.theme--documenter-dark .button.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button{border-radius:3px;font-size:.85em}html.theme--documenter-dark .button.is-normal{font-size:15px}html.theme--documenter-dark .button.is-medium{font-size:1.25rem}html.theme--documenter-dark .button.is-large{font-size:1.5rem}html.theme--documenter-dark .button[disabled],fieldset[disabled] html.theme--documenter-dark .button{background-color:#8c9b9d;border-color:#dbdee0;box-shadow:none;opacity:.5}html.theme--documenter-dark .button.is-fullwidth{display:flex;width:100%}html.theme--documenter-dark .button.is-loading{color:transparent !important;pointer-events:none}html.theme--documenter-dark .button.is-loading::after{position:absolute;left:calc(50% - (1em / 2));top:calc(50% - (1em / 2));position:absolute !important}html.theme--documenter-dark .button.is-static{background-color:#282f2f;border-color:#5e6d6f;color:#dbdee0;box-shadow:none;pointer-events:none}html.theme--documenter-dark .button.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.button{border-radius:290486px;padding-left:1em;padding-right:1em}html.theme--documenter-dark .buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .buttons .button{margin-bottom:0.5rem}html.theme--documenter-dark .buttons .button:not(:last-child):not(.is-fullwidth){margin-right:0.5rem}html.theme--documenter-dark .buttons:last-child{margin-bottom:-0.5rem}html.theme--documenter-dark .buttons:not(:last-child){margin-bottom:1rem}html.theme--documenter-dark .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){border-radius:3px;font-size:.85em}html.theme--documenter-dark .buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}html.theme--documenter-dark .buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}html.theme--documenter-dark .buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}html.theme--documenter-dark .buttons.has-addons .button:last-child{margin-right:0}html.theme--documenter-dark .buttons.has-addons .button:hover,html.theme--documenter-dark .buttons.has-addons .button.is-hovered{z-index:2}html.theme--documenter-dark .buttons.has-addons .button:focus,html.theme--documenter-dark .buttons.has-addons .button.is-focused,html.theme--documenter-dark .buttons.has-addons .button:active,html.theme--documenter-dark .buttons.has-addons .button.is-active,html.theme--documenter-dark .buttons.has-addons .button.is-selected{z-index:3}html.theme--documenter-dark .buttons.has-addons .button:focus:hover,html.theme--documenter-dark .buttons.has-addons .button.is-focused:hover,html.theme--documenter-dark .buttons.has-addons .button:active:hover,html.theme--documenter-dark .buttons.has-addons .button.is-active:hover,html.theme--documenter-dark .buttons.has-addons .button.is-selected:hover{z-index:4}html.theme--documenter-dark .buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .buttons.is-centered{justify-content:center}html.theme--documenter-dark .buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}html.theme--documenter-dark .buttons.is-right{justify-content:flex-end}html.theme--documenter-dark .buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}html.theme--documenter-dark .container{flex-grow:1;margin:0 auto;position:relative;width:auto}@media screen and (min-width: 1056px){html.theme--documenter-dark .container{max-width:992px}html.theme--documenter-dark .container.is-fluid{margin-left:32px;margin-right:32px;max-width:none}}@media screen and (max-width: 1215px){html.theme--documenter-dark .container.is-widescreen{max-width:1152px}}@media screen and (max-width: 1407px){html.theme--documenter-dark .container.is-fullhd{max-width:1344px}}@media screen and (min-width: 1216px){html.theme--documenter-dark .container{max-width:1152px}}@media screen and (min-width: 1408px){html.theme--documenter-dark .container{max-width:1344px}}html.theme--documenter-dark .content li+li{margin-top:0.25em}html.theme--documenter-dark .content p:not(:last-child),html.theme--documenter-dark .content dl:not(:last-child),html.theme--documenter-dark .content ol:not(:last-child),html.theme--documenter-dark .content ul:not(:last-child),html.theme--documenter-dark .content blockquote:not(:last-child),html.theme--documenter-dark .content pre:not(:last-child),html.theme--documenter-dark .content table:not(:last-child){margin-bottom:1em}html.theme--documenter-dark .content h1,html.theme--documenter-dark .content h2,html.theme--documenter-dark .content h3,html.theme--documenter-dark .content h4,html.theme--documenter-dark .content h5,html.theme--documenter-dark .content h6{color:#f2f2f2;font-weight:600;line-height:1.125}html.theme--documenter-dark .content h1{font-size:2em;margin-bottom:0.5em}html.theme--documenter-dark .content h1:not(:first-child){margin-top:1em}html.theme--documenter-dark .content h2{font-size:1.75em;margin-bottom:0.5714em}html.theme--documenter-dark .content h2:not(:first-child){margin-top:1.1428em}html.theme--documenter-dark .content h3{font-size:1.5em;margin-bottom:0.6666em}html.theme--documenter-dark .content h3:not(:first-child){margin-top:1.3333em}html.theme--documenter-dark .content h4{font-size:1.25em;margin-bottom:0.8em}html.theme--documenter-dark .content h5{font-size:1.125em;margin-bottom:0.8888em}html.theme--documenter-dark .content h6{font-size:1em;margin-bottom:1em}html.theme--documenter-dark .content blockquote{background-color:#282f2f;border-left:5px solid #5e6d6f;padding:1.25em 1.5em}html.theme--documenter-dark .content ol{list-style-position:outside;margin-left:2em;margin-top:1em}html.theme--documenter-dark .content ol:not([type]){list-style-type:decimal}html.theme--documenter-dark .content ol.is-lower-alpha:not([type]){list-style-type:lower-alpha}html.theme--documenter-dark .content ol.is-lower-roman:not([type]){list-style-type:lower-roman}html.theme--documenter-dark .content ol.is-upper-alpha:not([type]){list-style-type:upper-alpha}html.theme--documenter-dark .content ol.is-upper-roman:not([type]){list-style-type:upper-roman}html.theme--documenter-dark .content ul{list-style:disc outside;margin-left:2em;margin-top:1em}html.theme--documenter-dark .content ul ul{list-style-type:circle;margin-top:0.5em}html.theme--documenter-dark .content ul ul ul{list-style-type:square}html.theme--documenter-dark .content dd{margin-left:2em}html.theme--documenter-dark .content figure{margin-left:2em;margin-right:2em;text-align:center}html.theme--documenter-dark .content figure:not(:first-child){margin-top:2em}html.theme--documenter-dark .content figure:not(:last-child){margin-bottom:2em}html.theme--documenter-dark .content figure img{display:inline-block}html.theme--documenter-dark .content figure figcaption{font-style:italic}html.theme--documenter-dark .content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:0;white-space:pre;word-wrap:normal}html.theme--documenter-dark .content sup,html.theme--documenter-dark .content sub{font-size:75%}html.theme--documenter-dark .content table{width:100%}html.theme--documenter-dark .content table td,html.theme--documenter-dark .content table th{border:1px solid #5e6d6f;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}html.theme--documenter-dark .content table th{color:#f2f2f2}html.theme--documenter-dark .content table th:not([align]){text-align:left}html.theme--documenter-dark .content table thead td,html.theme--documenter-dark .content table thead th{border-width:0 0 2px;color:#f2f2f2}html.theme--documenter-dark .content table tfoot td,html.theme--documenter-dark .content table tfoot th{border-width:2px 0 0;color:#f2f2f2}html.theme--documenter-dark .content table tbody tr:last-child td,html.theme--documenter-dark .content table tbody tr:last-child th{border-bottom-width:0}html.theme--documenter-dark .content .tabs li+li{margin-top:0}html.theme--documenter-dark .content.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.content{font-size:.85em}html.theme--documenter-dark .content.is-medium{font-size:1.25rem}html.theme--documenter-dark .content.is-large{font-size:1.5rem}html.theme--documenter-dark .icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}html.theme--documenter-dark .icon.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.icon{height:1rem;width:1rem}html.theme--documenter-dark .icon.is-medium{height:2rem;width:2rem}html.theme--documenter-dark .icon.is-large{height:3rem;width:3rem}html.theme--documenter-dark .image,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img{display:block;position:relative}html.theme--documenter-dark .image img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img img{display:block;height:auto;width:100%}html.theme--documenter-dark .image img.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img img.is-rounded{border-radius:290486px}html.theme--documenter-dark .image.is-square img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square img,html.theme--documenter-dark .image.is-square .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,html.theme--documenter-dark .image.is-1by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 img,html.theme--documenter-dark .image.is-1by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,html.theme--documenter-dark .image.is-5by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 img,html.theme--documenter-dark .image.is-5by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,html.theme--documenter-dark .image.is-4by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 img,html.theme--documenter-dark .image.is-4by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,html.theme--documenter-dark .image.is-3by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 img,html.theme--documenter-dark .image.is-3by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,html.theme--documenter-dark .image.is-5by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 img,html.theme--documenter-dark .image.is-5by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,html.theme--documenter-dark .image.is-16by9 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 img,html.theme--documenter-dark .image.is-16by9 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,html.theme--documenter-dark .image.is-2by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 img,html.theme--documenter-dark .image.is-2by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,html.theme--documenter-dark .image.is-3by1 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 img,html.theme--documenter-dark .image.is-3by1 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,html.theme--documenter-dark .image.is-4by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 img,html.theme--documenter-dark .image.is-4by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,html.theme--documenter-dark .image.is-3by4 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 img,html.theme--documenter-dark .image.is-3by4 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,html.theme--documenter-dark .image.is-2by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 img,html.theme--documenter-dark .image.is-2by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,html.theme--documenter-dark .image.is-3by5 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 img,html.theme--documenter-dark .image.is-3by5 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,html.theme--documenter-dark .image.is-9by16 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 img,html.theme--documenter-dark .image.is-9by16 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,html.theme--documenter-dark .image.is-1by2 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 img,html.theme--documenter-dark .image.is-1by2 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,html.theme--documenter-dark .image.is-1by3 img,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 img,html.theme--documenter-dark .image.is-1by3 .has-ratio,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio{height:100%;width:100%}html.theme--documenter-dark .image.is-square,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-square,html.theme--documenter-dark .image.is-1by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by1{padding-top:100%}html.theme--documenter-dark .image.is-5by4,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by4{padding-top:80%}html.theme--documenter-dark .image.is-4by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by3{padding-top:75%}html.theme--documenter-dark .image.is-3by2,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by2{padding-top:66.6666%}html.theme--documenter-dark .image.is-5by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-5by3{padding-top:60%}html.theme--documenter-dark .image.is-16by9,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16by9{padding-top:56.25%}html.theme--documenter-dark .image.is-2by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by1{padding-top:50%}html.theme--documenter-dark .image.is-3by1,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by1{padding-top:33.3333%}html.theme--documenter-dark .image.is-4by5,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-4by5{padding-top:125%}html.theme--documenter-dark .image.is-3by4,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by4{padding-top:133.3333%}html.theme--documenter-dark .image.is-2by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-2by3{padding-top:150%}html.theme--documenter-dark .image.is-3by5,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-3by5{padding-top:166.6666%}html.theme--documenter-dark .image.is-9by16,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-9by16{padding-top:177.7777%}html.theme--documenter-dark .image.is-1by2,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by2{padding-top:200%}html.theme--documenter-dark .image.is-1by3,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-1by3{padding-top:300%}html.theme--documenter-dark .image.is-16x16,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-16x16{height:16px;width:16px}html.theme--documenter-dark .image.is-24x24,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-24x24{height:24px;width:24px}html.theme--documenter-dark .image.is-32x32,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-32x32{height:32px;width:32px}html.theme--documenter-dark .image.is-48x48,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-48x48{height:48px;width:48px}html.theme--documenter-dark .image.is-64x64,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-64x64{height:64px;width:64px}html.theme--documenter-dark .image.is-96x96,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-96x96{height:96px;width:96px}html.theme--documenter-dark .image.is-128x128,html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img.is-128x128{height:128px;width:128px}html.theme--documenter-dark .notification{background-color:#282f2f;border-radius:.4em;padding:1.25rem 2.5rem 1.25rem 1.5rem;position:relative}html.theme--documenter-dark .notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}html.theme--documenter-dark .notification strong{color:currentColor}html.theme--documenter-dark .notification code,html.theme--documenter-dark .notification pre{background:#fff}html.theme--documenter-dark .notification pre code{background:transparent}html.theme--documenter-dark .notification>.delete{position:absolute;right:0.5rem;top:0.5rem}html.theme--documenter-dark .notification .title,html.theme--documenter-dark .notification .subtitle,html.theme--documenter-dark .notification .content{color:currentColor}html.theme--documenter-dark .notification.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .notification.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .notification.is-light{background-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .notification.is-dark,html.theme--documenter-dark .content kbd.notification{background-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .notification.is-primary,html.theme--documenter-dark .docstring>section>a.notification.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .notification.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .notification.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .notification.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .notification.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .notification.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:290486px;display:block;height:15px;overflow:hidden;padding:0;width:100%}html.theme--documenter-dark .progress::-webkit-progress-bar{background-color:#5e6d6f}html.theme--documenter-dark .progress::-webkit-progress-value{background-color:#dbdee0}html.theme--documenter-dark .progress::-moz-progress-bar{background-color:#dbdee0}html.theme--documenter-dark .progress::-ms-fill{background-color:#dbdee0;border:none}html.theme--documenter-dark .progress.is-white::-webkit-progress-value{background-color:#fff}html.theme--documenter-dark .progress.is-white::-moz-progress-bar{background-color:#fff}html.theme--documenter-dark .progress.is-white::-ms-fill{background-color:#fff}html.theme--documenter-dark .progress.is-white:indeterminate{background-image:linear-gradient(to right, #fff 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress.is-black::-webkit-progress-value{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black::-moz-progress-bar{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black::-ms-fill{background-color:#0a0a0a}html.theme--documenter-dark .progress.is-black:indeterminate{background-image:linear-gradient(to right, #0a0a0a 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress.is-light::-webkit-progress-value{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light::-moz-progress-bar{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light::-ms-fill{background-color:#ecf0f1}html.theme--documenter-dark .progress.is-light:indeterminate{background-image:linear-gradient(to right, #ecf0f1 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress.is-dark::-webkit-progress-value,html.theme--documenter-dark .content kbd.progress::-webkit-progress-value{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark::-moz-progress-bar,html.theme--documenter-dark .content kbd.progress::-moz-progress-bar{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark::-ms-fill,html.theme--documenter-dark .content kbd.progress::-ms-fill{background-color:#282f2f}html.theme--documenter-dark .progress.is-dark:indeterminate,html.theme--documenter-dark .content kbd.progress:indeterminate{background-image:linear-gradient(to right, #282f2f 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress.is-primary::-webkit-progress-value,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-webkit-progress-value{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary::-moz-progress-bar,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-moz-progress-bar{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary::-ms-fill,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink::-ms-fill{background-color:#375a7f}html.theme--documenter-dark .progress.is-primary:indeterminate,html.theme--documenter-dark .docstring>section>a.progress.docs-sourcelink:indeterminate{background-image:linear-gradient(to right, #375a7f 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress.is-link::-webkit-progress-value{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link::-moz-progress-bar{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link::-ms-fill{background-color:#1abc9c}html.theme--documenter-dark .progress.is-link:indeterminate{background-image:linear-gradient(to right, #1abc9c 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress.is-info::-webkit-progress-value{background-color:#024c7d}html.theme--documenter-dark .progress.is-info::-moz-progress-bar{background-color:#024c7d}html.theme--documenter-dark .progress.is-info::-ms-fill{background-color:#024c7d}html.theme--documenter-dark .progress.is-info:indeterminate{background-image:linear-gradient(to right, #024c7d 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress.is-success::-webkit-progress-value{background-color:#008438}html.theme--documenter-dark .progress.is-success::-moz-progress-bar{background-color:#008438}html.theme--documenter-dark .progress.is-success::-ms-fill{background-color:#008438}html.theme--documenter-dark .progress.is-success:indeterminate{background-image:linear-gradient(to right, #008438 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress.is-warning::-webkit-progress-value{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning::-moz-progress-bar{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning::-ms-fill{background-color:#ad8100}html.theme--documenter-dark .progress.is-warning:indeterminate{background-image:linear-gradient(to right, #ad8100 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress.is-danger::-webkit-progress-value{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger::-moz-progress-bar{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger::-ms-fill{background-color:#9e1b0d}html.theme--documenter-dark .progress.is-danger:indeterminate{background-image:linear-gradient(to right, #9e1b0d 30%, #5e6d6f 30%)}html.theme--documenter-dark .progress:indeterminate{animation-duration:1.5s;animation-iteration-count:infinite;animation-name:moveIndeterminate;animation-timing-function:linear;background-color:#5e6d6f;background-image:linear-gradient(to right, #fff 30%, #5e6d6f 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}html.theme--documenter-dark .progress:indeterminate::-webkit-progress-bar{background-color:transparent}html.theme--documenter-dark .progress:indeterminate::-moz-progress-bar{background-color:transparent}html.theme--documenter-dark .progress.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.progress{height:.85em}html.theme--documenter-dark .progress.is-medium{height:1.25rem}html.theme--documenter-dark .progress.is-large{height:1.5rem}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}html.theme--documenter-dark .table{background-color:#343c3d;color:#fff}html.theme--documenter-dark .table td,html.theme--documenter-dark .table th{border:1px solid #5e6d6f;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}html.theme--documenter-dark .table td.is-white,html.theme--documenter-dark .table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .table td.is-black,html.theme--documenter-dark .table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .table td.is-light,html.theme--documenter-dark .table th.is-light{background-color:#ecf0f1;border-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .table td.is-dark,html.theme--documenter-dark .table th.is-dark{background-color:#282f2f;border-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .table td.is-primary,html.theme--documenter-dark .table th.is-primary{background-color:#375a7f;border-color:#375a7f;color:#fff}html.theme--documenter-dark .table td.is-link,html.theme--documenter-dark .table th.is-link{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .table td.is-info,html.theme--documenter-dark .table th.is-info{background-color:#024c7d;border-color:#024c7d;color:#fff}html.theme--documenter-dark .table td.is-success,html.theme--documenter-dark .table th.is-success{background-color:#008438;border-color:#008438;color:#fff}html.theme--documenter-dark .table td.is-warning,html.theme--documenter-dark .table th.is-warning{background-color:#ad8100;border-color:#ad8100;color:#fff}html.theme--documenter-dark .table td.is-danger,html.theme--documenter-dark .table th.is-danger{background-color:#9e1b0d;border-color:#9e1b0d;color:#fff}html.theme--documenter-dark .table td.is-narrow,html.theme--documenter-dark .table th.is-narrow{white-space:nowrap;width:1%}html.theme--documenter-dark .table td.is-selected,html.theme--documenter-dark .table th.is-selected{background-color:#375a7f;color:#fff}html.theme--documenter-dark .table td.is-selected a,html.theme--documenter-dark .table td.is-selected strong,html.theme--documenter-dark .table th.is-selected a,html.theme--documenter-dark .table th.is-selected strong{color:currentColor}html.theme--documenter-dark .table th{color:#f2f2f2}html.theme--documenter-dark .table th:not([align]){text-align:left}html.theme--documenter-dark .table tr.is-selected{background-color:#375a7f;color:#fff}html.theme--documenter-dark .table tr.is-selected a,html.theme--documenter-dark .table tr.is-selected strong{color:currentColor}html.theme--documenter-dark .table tr.is-selected td,html.theme--documenter-dark .table tr.is-selected th{border-color:#fff;color:currentColor}html.theme--documenter-dark .table thead{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table thead td,html.theme--documenter-dark .table thead th{border-width:0 0 2px;color:#f2f2f2}html.theme--documenter-dark .table tfoot{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table tfoot td,html.theme--documenter-dark .table tfoot th{border-width:2px 0 0;color:#f2f2f2}html.theme--documenter-dark .table tbody{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .table tbody tr:last-child td,html.theme--documenter-dark .table tbody tr:last-child th{border-bottom-width:0}html.theme--documenter-dark .table.is-bordered td,html.theme--documenter-dark .table.is-bordered th{border-width:1px}html.theme--documenter-dark .table.is-bordered tr:last-child td,html.theme--documenter-dark .table.is-bordered tr:last-child th{border-bottom-width:1px}html.theme--documenter-dark .table.is-fullwidth{width:100%}html.theme--documenter-dark .table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#282f2f}html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#282f2f}html.theme--documenter-dark .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even){background-color:#2d3435}html.theme--documenter-dark .table.is-narrow td,html.theme--documenter-dark .table.is-narrow th{padding:0.25em 0.5em}html.theme--documenter-dark .table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#282f2f}html.theme--documenter-dark .table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}html.theme--documenter-dark .tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .tags .tag,html.theme--documenter-dark .tags .content kbd,html.theme--documenter-dark .content .tags kbd,html.theme--documenter-dark .tags .docstring>section>a.docs-sourcelink{margin-bottom:0.5rem}html.theme--documenter-dark .tags .tag:not(:last-child),html.theme--documenter-dark .tags .content kbd:not(:last-child),html.theme--documenter-dark .content .tags kbd:not(:last-child),html.theme--documenter-dark .tags .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0.5rem}html.theme--documenter-dark .tags:last-child{margin-bottom:-0.5rem}html.theme--documenter-dark .tags:not(:last-child){margin-bottom:1rem}html.theme--documenter-dark .tags.are-medium .tag:not(.is-normal):not(.is-large),html.theme--documenter-dark .tags.are-medium .content kbd:not(.is-normal):not(.is-large),html.theme--documenter-dark .content .tags.are-medium kbd:not(.is-normal):not(.is-large),html.theme--documenter-dark .tags.are-medium .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-large){font-size:15px}html.theme--documenter-dark .tags.are-large .tag:not(.is-normal):not(.is-medium),html.theme--documenter-dark .tags.are-large .content kbd:not(.is-normal):not(.is-medium),html.theme--documenter-dark .content .tags.are-large kbd:not(.is-normal):not(.is-medium),html.theme--documenter-dark .tags.are-large .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-medium){font-size:1.25rem}html.theme--documenter-dark .tags.is-centered{justify-content:center}html.theme--documenter-dark .tags.is-centered .tag,html.theme--documenter-dark .tags.is-centered .content kbd,html.theme--documenter-dark .content .tags.is-centered kbd,html.theme--documenter-dark .tags.is-centered .docstring>section>a.docs-sourcelink{margin-right:0.25rem;margin-left:0.25rem}html.theme--documenter-dark .tags.is-right{justify-content:flex-end}html.theme--documenter-dark .tags.is-right .tag:not(:first-child),html.theme--documenter-dark .tags.is-right .content kbd:not(:first-child),html.theme--documenter-dark .content .tags.is-right kbd:not(:first-child),html.theme--documenter-dark .tags.is-right .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0.5rem}html.theme--documenter-dark .tags.is-right .tag:not(:last-child),html.theme--documenter-dark .tags.is-right .content kbd:not(:last-child),html.theme--documenter-dark .content .tags.is-right kbd:not(:last-child),html.theme--documenter-dark .tags.is-right .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0}html.theme--documenter-dark .tags.has-addons .tag,html.theme--documenter-dark .tags.has-addons .content kbd,html.theme--documenter-dark .content .tags.has-addons kbd,html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink{margin-right:0}html.theme--documenter-dark .tags.has-addons .tag:not(:first-child),html.theme--documenter-dark .tags.has-addons .content kbd:not(:first-child),html.theme--documenter-dark .content .tags.has-addons kbd:not(:first-child),html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0;border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .tags.has-addons .tag:not(:last-child),html.theme--documenter-dark .tags.has-addons .content kbd:not(:last-child),html.theme--documenter-dark .content .tags.has-addons kbd:not(:last-child),html.theme--documenter-dark .tags.has-addons .docstring>section>a.docs-sourcelink:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}html.theme--documenter-dark .tag:not(body),html.theme--documenter-dark .content kbd:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body){align-items:center;background-color:#282f2f;border-radius:.4em;color:#fff;display:inline-flex;font-size:.85em;height:2em;justify-content:center;line-height:1.5;padding-left:0.75em;padding-right:0.75em;white-space:nowrap}html.theme--documenter-dark .tag:not(body) .delete,html.theme--documenter-dark .content kbd:not(body) .delete,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .delete{margin-left:0.25rem;margin-right:-0.375rem}html.theme--documenter-dark .tag.is-white:not(body),html.theme--documenter-dark .content kbd.is-white:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-white:not(body){background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .tag.is-black:not(body),html.theme--documenter-dark .content kbd.is-black:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-black:not(body){background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .tag.is-light:not(body),html.theme--documenter-dark .content kbd.is-light:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .tag.is-dark:not(body),html.theme--documenter-dark .content kbd:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-dark:not(body),html.theme--documenter-dark .content .docstring>section>kbd:not(body){background-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .tag.is-primary:not(body),html.theme--documenter-dark .content kbd.is-primary:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body){background-color:#375a7f;color:#fff}html.theme--documenter-dark .tag.is-link:not(body),html.theme--documenter-dark .content kbd.is-link:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-link:not(body){background-color:#1abc9c;color:#fff}html.theme--documenter-dark .tag.is-info:not(body),html.theme--documenter-dark .content kbd.is-info:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-info:not(body){background-color:#024c7d;color:#fff}html.theme--documenter-dark .tag.is-success:not(body),html.theme--documenter-dark .content kbd.is-success:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-success:not(body){background-color:#008438;color:#fff}html.theme--documenter-dark .tag.is-warning:not(body),html.theme--documenter-dark .content kbd.is-warning:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-warning:not(body){background-color:#ad8100;color:#fff}html.theme--documenter-dark .tag.is-danger:not(body),html.theme--documenter-dark .content kbd.is-danger:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-danger:not(body){background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .tag.is-normal:not(body),html.theme--documenter-dark .content kbd.is-normal:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-normal:not(body){font-size:.85em}html.theme--documenter-dark .tag.is-medium:not(body),html.theme--documenter-dark .content kbd.is-medium:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-medium:not(body){font-size:15px}html.theme--documenter-dark .tag.is-large:not(body),html.theme--documenter-dark .content kbd.is-large:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-large:not(body){font-size:1.25rem}html.theme--documenter-dark .tag:not(body) .icon:first-child:not(:last-child),html.theme--documenter-dark .content kbd:not(body) .icon:first-child:not(:last-child),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:first-child:not(:last-child){margin-left:-0.375em;margin-right:0.1875em}html.theme--documenter-dark .tag:not(body) .icon:last-child:not(:first-child),html.theme--documenter-dark .content kbd:not(body) .icon:last-child:not(:first-child),html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:last-child:not(:first-child){margin-left:0.1875em;margin-right:-0.375em}html.theme--documenter-dark .tag:not(body) .icon:first-child:last-child,html.theme--documenter-dark .content kbd:not(body) .icon:first-child:last-child,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:not(body) .icon:first-child:last-child{margin-left:-0.375em;margin-right:-0.375em}html.theme--documenter-dark .tag.is-delete:not(body),html.theme--documenter-dark .content kbd.is-delete:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body){margin-left:1px;padding:0;position:relative;width:2em}html.theme--documenter-dark .tag.is-delete:not(body)::before,html.theme--documenter-dark .content kbd.is-delete:not(body)::before,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::before,html.theme--documenter-dark .tag.is-delete:not(body)::after,html.theme--documenter-dark .content kbd.is-delete:not(body)::after,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::after{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}html.theme--documenter-dark .tag.is-delete:not(body)::before,html.theme--documenter-dark .content kbd.is-delete:not(body)::before,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::before{height:1px;width:50%}html.theme--documenter-dark .tag.is-delete:not(body)::after,html.theme--documenter-dark .content kbd.is-delete:not(body)::after,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body)::after{height:50%;width:1px}html.theme--documenter-dark .tag.is-delete:not(body):hover,html.theme--documenter-dark .content kbd.is-delete:not(body):hover,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):hover,html.theme--documenter-dark .tag.is-delete:not(body):focus,html.theme--documenter-dark .content kbd.is-delete:not(body):focus,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):focus{background-color:#1d2122}html.theme--documenter-dark .tag.is-delete:not(body):active,html.theme--documenter-dark .content kbd.is-delete:not(body):active,html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-delete:not(body):active{background-color:#111414}html.theme--documenter-dark .tag.is-rounded:not(body),html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:not(body),html.theme--documenter-dark .content kbd.is-rounded:not(body),html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input:not(body),html.theme--documenter-dark .docstring>section>a.docs-sourcelink.is-rounded:not(body){border-radius:290486px}html.theme--documenter-dark a.tag:hover,html.theme--documenter-dark .docstring>section>a.docs-sourcelink:hover{text-decoration:underline}html.theme--documenter-dark .title,html.theme--documenter-dark .subtitle{word-break:break-word}html.theme--documenter-dark .title em,html.theme--documenter-dark .title span,html.theme--documenter-dark .subtitle em,html.theme--documenter-dark .subtitle span{font-weight:inherit}html.theme--documenter-dark .title sub,html.theme--documenter-dark .subtitle sub{font-size:.75em}html.theme--documenter-dark .title sup,html.theme--documenter-dark .subtitle sup{font-size:.75em}html.theme--documenter-dark .title .tag,html.theme--documenter-dark .title .content kbd,html.theme--documenter-dark .content .title kbd,html.theme--documenter-dark .title .docstring>section>a.docs-sourcelink,html.theme--documenter-dark .subtitle .tag,html.theme--documenter-dark .subtitle .content kbd,html.theme--documenter-dark .content .subtitle kbd,html.theme--documenter-dark .subtitle .docstring>section>a.docs-sourcelink{vertical-align:middle}html.theme--documenter-dark .title{color:#fff;font-size:2rem;font-weight:500;line-height:1.125}html.theme--documenter-dark .title strong{color:inherit;font-weight:inherit}html.theme--documenter-dark .title+.highlight{margin-top:-0.75rem}html.theme--documenter-dark .title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}html.theme--documenter-dark .title.is-1{font-size:3rem}html.theme--documenter-dark .title.is-2{font-size:2.5rem}html.theme--documenter-dark .title.is-3{font-size:2rem}html.theme--documenter-dark .title.is-4{font-size:1.5rem}html.theme--documenter-dark .title.is-5{font-size:1.25rem}html.theme--documenter-dark .title.is-6{font-size:15px}html.theme--documenter-dark .title.is-7{font-size:.85em}html.theme--documenter-dark .subtitle{color:#8c9b9d;font-size:1.25rem;font-weight:400;line-height:1.25}html.theme--documenter-dark .subtitle strong{color:#8c9b9d;font-weight:600}html.theme--documenter-dark .subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}html.theme--documenter-dark .subtitle.is-1{font-size:3rem}html.theme--documenter-dark .subtitle.is-2{font-size:2.5rem}html.theme--documenter-dark .subtitle.is-3{font-size:2rem}html.theme--documenter-dark .subtitle.is-4{font-size:1.5rem}html.theme--documenter-dark .subtitle.is-5{font-size:1.25rem}html.theme--documenter-dark .subtitle.is-6{font-size:15px}html.theme--documenter-dark .subtitle.is-7{font-size:.85em}html.theme--documenter-dark .heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}html.theme--documenter-dark .highlight{font-weight:400;max-width:100%;overflow:hidden;padding:0}html.theme--documenter-dark .highlight pre{overflow:auto;max-width:100%}html.theme--documenter-dark .number{align-items:center;background-color:#282f2f;border-radius:290486px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:0.25rem 0.5rem;text-align:center;vertical-align:top}html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{background-color:#1f2424;border-color:#5e6d6f;border-radius:.4em;color:#dbdee0}html.theme--documenter-dark .select select::-moz-placeholder,html.theme--documenter-dark .textarea::-moz-placeholder,html.theme--documenter-dark .input::-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:rgba(219,222,224,0.3)}html.theme--documenter-dark .select select::-webkit-input-placeholder,html.theme--documenter-dark .textarea::-webkit-input-placeholder,html.theme--documenter-dark .input::-webkit-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:rgba(219,222,224,0.3)}html.theme--documenter-dark .select select:-moz-placeholder,html.theme--documenter-dark .textarea:-moz-placeholder,html.theme--documenter-dark .input:-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:rgba(219,222,224,0.3)}html.theme--documenter-dark .select select:-ms-input-placeholder,html.theme--documenter-dark .textarea:-ms-input-placeholder,html.theme--documenter-dark .input:-ms-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:rgba(219,222,224,0.3)}html.theme--documenter-dark .select select:hover,html.theme--documenter-dark .textarea:hover,html.theme--documenter-dark .input:hover,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:hover,html.theme--documenter-dark .select select.is-hovered,html.theme--documenter-dark .is-hovered.textarea,html.theme--documenter-dark .is-hovered.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-hovered{border-color:#8c9b9d}html.theme--documenter-dark .select select:focus,html.theme--documenter-dark .textarea:focus,html.theme--documenter-dark .input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:focus,html.theme--documenter-dark .select select.is-focused,html.theme--documenter-dark .is-focused.textarea,html.theme--documenter-dark .is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .select select:active,html.theme--documenter-dark .textarea:active,html.theme--documenter-dark .input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:active,html.theme--documenter-dark .select select.is-active,html.theme--documenter-dark .is-active.textarea,html.theme--documenter-dark .is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{border-color:#1abc9c;box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .select select[disabled],html.theme--documenter-dark .textarea[disabled],html.theme--documenter-dark .input[disabled],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled],fieldset[disabled] html.theme--documenter-dark .select select,fieldset[disabled] html.theme--documenter-dark .textarea,fieldset[disabled] html.theme--documenter-dark .input,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{background-color:#8c9b9d;border-color:#282f2f;box-shadow:none;color:#fff}html.theme--documenter-dark .select select[disabled]::-moz-placeholder,html.theme--documenter-dark .textarea[disabled]::-moz-placeholder,html.theme--documenter-dark .input[disabled]::-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .select select::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .input::-moz-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]::-webkit-input-placeholder,html.theme--documenter-dark .textarea[disabled]::-webkit-input-placeholder,html.theme--documenter-dark .input[disabled]::-webkit-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .select select::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark .input::-webkit-input-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]:-moz-placeholder,html.theme--documenter-dark .textarea[disabled]:-moz-placeholder,html.theme--documenter-dark .input[disabled]:-moz-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .select select:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark .input:-moz-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .select select[disabled]:-ms-input-placeholder,html.theme--documenter-dark .textarea[disabled]:-ms-input-placeholder,html.theme--documenter-dark .input[disabled]:-ms-input-placeholder,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[disabled]:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .select select:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .textarea:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark .input:-ms-input-placeholder,fieldset[disabled] html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:rgba(255,255,255,0.3)}html.theme--documenter-dark .textarea,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{box-shadow:inset 0 1px 2px rgba(10,10,10,0.1);max-width:100%;width:100%}html.theme--documenter-dark .textarea[readonly],html.theme--documenter-dark .input[readonly],html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input[readonly]{box-shadow:none}html.theme--documenter-dark .is-white.textarea,html.theme--documenter-dark .is-white.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white{border-color:#fff}html.theme--documenter-dark .is-white.textarea:focus,html.theme--documenter-dark .is-white.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white:focus,html.theme--documenter-dark .is-white.is-focused.textarea,html.theme--documenter-dark .is-white.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-white.textarea:active,html.theme--documenter-dark .is-white.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-white:active,html.theme--documenter-dark .is-white.is-active.textarea,html.theme--documenter-dark .is-white.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .is-black.textarea,html.theme--documenter-dark .is-black.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black{border-color:#0a0a0a}html.theme--documenter-dark .is-black.textarea:focus,html.theme--documenter-dark .is-black.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black:focus,html.theme--documenter-dark .is-black.is-focused.textarea,html.theme--documenter-dark .is-black.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-black.textarea:active,html.theme--documenter-dark .is-black.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-black:active,html.theme--documenter-dark .is-black.is-active.textarea,html.theme--documenter-dark .is-black.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .is-light.textarea,html.theme--documenter-dark .is-light.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light{border-color:#ecf0f1}html.theme--documenter-dark .is-light.textarea:focus,html.theme--documenter-dark .is-light.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light:focus,html.theme--documenter-dark .is-light.is-focused.textarea,html.theme--documenter-dark .is-light.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-light.textarea:active,html.theme--documenter-dark .is-light.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-light:active,html.theme--documenter-dark .is-light.is-active.textarea,html.theme--documenter-dark .is-light.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .is-dark.textarea,html.theme--documenter-dark .content kbd.textarea,html.theme--documenter-dark .is-dark.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark,html.theme--documenter-dark .content kbd.input{border-color:#282f2f}html.theme--documenter-dark .is-dark.textarea:focus,html.theme--documenter-dark .content kbd.textarea:focus,html.theme--documenter-dark .is-dark.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark:focus,html.theme--documenter-dark .content kbd.input:focus,html.theme--documenter-dark .is-dark.is-focused.textarea,html.theme--documenter-dark .content kbd.is-focused.textarea,html.theme--documenter-dark .is-dark.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .content kbd.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input.is-focused,html.theme--documenter-dark .is-dark.textarea:active,html.theme--documenter-dark .content kbd.textarea:active,html.theme--documenter-dark .is-dark.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-dark:active,html.theme--documenter-dark .content kbd.input:active,html.theme--documenter-dark .is-dark.is-active.textarea,html.theme--documenter-dark .content kbd.is-active.textarea,html.theme--documenter-dark .is-dark.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .content kbd.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar .content form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .is-primary.textarea,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink{border-color:#375a7f}html.theme--documenter-dark .is-primary.textarea:focus,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink:focus,html.theme--documenter-dark .is-primary.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary:focus,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink:focus,html.theme--documenter-dark .is-primary.is-focused.textarea,html.theme--documenter-dark .docstring>section>a.is-focused.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .docstring>section>a.is-focused.input.docs-sourcelink,html.theme--documenter-dark .is-primary.textarea:active,html.theme--documenter-dark .docstring>section>a.textarea.docs-sourcelink:active,html.theme--documenter-dark .is-primary.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-primary:active,html.theme--documenter-dark .docstring>section>a.input.docs-sourcelink:active,html.theme--documenter-dark .is-primary.is-active.textarea,html.theme--documenter-dark .docstring>section>a.is-active.textarea.docs-sourcelink,html.theme--documenter-dark .is-primary.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active,html.theme--documenter-dark .docstring>section>a.is-active.input.docs-sourcelink{box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .is-link.textarea,html.theme--documenter-dark .is-link.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link{border-color:#1abc9c}html.theme--documenter-dark .is-link.textarea:focus,html.theme--documenter-dark .is-link.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link:focus,html.theme--documenter-dark .is-link.is-focused.textarea,html.theme--documenter-dark .is-link.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-link.textarea:active,html.theme--documenter-dark .is-link.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-link:active,html.theme--documenter-dark .is-link.is-active.textarea,html.theme--documenter-dark .is-link.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .is-info.textarea,html.theme--documenter-dark .is-info.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info{border-color:#024c7d}html.theme--documenter-dark .is-info.textarea:focus,html.theme--documenter-dark .is-info.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info:focus,html.theme--documenter-dark .is-info.is-focused.textarea,html.theme--documenter-dark .is-info.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-info.textarea:active,html.theme--documenter-dark .is-info.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-info:active,html.theme--documenter-dark .is-info.is-active.textarea,html.theme--documenter-dark .is-info.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .is-success.textarea,html.theme--documenter-dark .is-success.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success{border-color:#008438}html.theme--documenter-dark .is-success.textarea:focus,html.theme--documenter-dark .is-success.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success:focus,html.theme--documenter-dark .is-success.is-focused.textarea,html.theme--documenter-dark .is-success.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-success.textarea:active,html.theme--documenter-dark .is-success.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-success:active,html.theme--documenter-dark .is-success.is-active.textarea,html.theme--documenter-dark .is-success.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .is-warning.textarea,html.theme--documenter-dark .is-warning.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning{border-color:#ad8100}html.theme--documenter-dark .is-warning.textarea:focus,html.theme--documenter-dark .is-warning.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning:focus,html.theme--documenter-dark .is-warning.is-focused.textarea,html.theme--documenter-dark .is-warning.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-warning.textarea:active,html.theme--documenter-dark .is-warning.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-warning:active,html.theme--documenter-dark .is-warning.is-active.textarea,html.theme--documenter-dark .is-warning.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .is-danger.textarea,html.theme--documenter-dark .is-danger.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger{border-color:#9e1b0d}html.theme--documenter-dark .is-danger.textarea:focus,html.theme--documenter-dark .is-danger.input:focus,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger:focus,html.theme--documenter-dark .is-danger.is-focused.textarea,html.theme--documenter-dark .is-danger.is-focused.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-focused,html.theme--documenter-dark .is-danger.textarea:active,html.theme--documenter-dark .is-danger.input:active,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-danger:active,html.theme--documenter-dark .is-danger.is-active.textarea,html.theme--documenter-dark .is-danger.is-active.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .is-small.textarea,html.theme--documenter-dark .is-small.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{border-radius:3px;font-size:.85em}html.theme--documenter-dark .is-medium.textarea,html.theme--documenter-dark .is-medium.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-medium{font-size:1.25rem}html.theme--documenter-dark .is-large.textarea,html.theme--documenter-dark .is-large.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-large{font-size:1.5rem}html.theme--documenter-dark .is-fullwidth.textarea,html.theme--documenter-dark .is-fullwidth.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-fullwidth{display:block;width:100%}html.theme--documenter-dark .is-inline.textarea,html.theme--documenter-dark .is-inline.input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-inline{display:inline;width:auto}html.theme--documenter-dark .input.is-rounded,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{border-radius:290486px;padding-left:1em;padding-right:1em}html.theme--documenter-dark .input.is-static,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}html.theme--documenter-dark .textarea{display:block;max-width:100%;min-width:100%;padding:0.625em;resize:vertical}html.theme--documenter-dark .textarea:not([rows]){max-height:600px;min-height:120px}html.theme--documenter-dark .textarea[rows]{height:initial}html.theme--documenter-dark .textarea.has-fixed-size{resize:none}html.theme--documenter-dark .radio,html.theme--documenter-dark .checkbox{cursor:pointer;display:inline-block;line-height:1.25;position:relative}html.theme--documenter-dark .radio input,html.theme--documenter-dark .checkbox input{cursor:pointer}html.theme--documenter-dark .radio:hover,html.theme--documenter-dark .checkbox:hover{color:#8c9b9d}html.theme--documenter-dark .radio[disabled],html.theme--documenter-dark .checkbox[disabled],fieldset[disabled] html.theme--documenter-dark .radio,fieldset[disabled] html.theme--documenter-dark .checkbox{color:#fff;cursor:not-allowed}html.theme--documenter-dark .radio+.radio{margin-left:0.5em}html.theme--documenter-dark .select{display:inline-block;max-width:100%;position:relative;vertical-align:top}html.theme--documenter-dark .select:not(.is-multiple){height:2.25em}html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading)::after{border-color:#1abc9c;right:1.125em;z-index:4}html.theme--documenter-dark .select.is-rounded select,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.select select{border-radius:290486px;padding-left:1em}html.theme--documenter-dark .select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:none}html.theme--documenter-dark .select select::-ms-expand{display:none}html.theme--documenter-dark .select select[disabled]:hover,fieldset[disabled] html.theme--documenter-dark .select select:hover{border-color:#282f2f}html.theme--documenter-dark .select select:not([multiple]){padding-right:2.5em}html.theme--documenter-dark .select select[multiple]{height:auto;padding:0}html.theme--documenter-dark .select select[multiple] option{padding:0.5em 1em}html.theme--documenter-dark .select:not(.is-multiple):not(.is-loading):hover::after{border-color:#8c9b9d}html.theme--documenter-dark .select.is-white:not(:hover)::after{border-color:#fff}html.theme--documenter-dark .select.is-white select{border-color:#fff}html.theme--documenter-dark .select.is-white select:hover,html.theme--documenter-dark .select.is-white select.is-hovered{border-color:#f2f2f2}html.theme--documenter-dark .select.is-white select:focus,html.theme--documenter-dark .select.is-white select.is-focused,html.theme--documenter-dark .select.is-white select:active,html.theme--documenter-dark .select.is-white select.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}html.theme--documenter-dark .select.is-black:not(:hover)::after{border-color:#0a0a0a}html.theme--documenter-dark .select.is-black select{border-color:#0a0a0a}html.theme--documenter-dark .select.is-black select:hover,html.theme--documenter-dark .select.is-black select.is-hovered{border-color:#000}html.theme--documenter-dark .select.is-black select:focus,html.theme--documenter-dark .select.is-black select.is-focused,html.theme--documenter-dark .select.is-black select:active,html.theme--documenter-dark .select.is-black select.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}html.theme--documenter-dark .select.is-light:not(:hover)::after{border-color:#ecf0f1}html.theme--documenter-dark .select.is-light select{border-color:#ecf0f1}html.theme--documenter-dark .select.is-light select:hover,html.theme--documenter-dark .select.is-light select.is-hovered{border-color:#dde4e6}html.theme--documenter-dark .select.is-light select:focus,html.theme--documenter-dark .select.is-light select.is-focused,html.theme--documenter-dark .select.is-light select:active,html.theme--documenter-dark .select.is-light select.is-active{box-shadow:0 0 0 0.125em rgba(236,240,241,0.25)}html.theme--documenter-dark .select.is-dark:not(:hover)::after,html.theme--documenter-dark .content kbd.select:not(:hover)::after{border-color:#282f2f}html.theme--documenter-dark .select.is-dark select,html.theme--documenter-dark .content kbd.select select{border-color:#282f2f}html.theme--documenter-dark .select.is-dark select:hover,html.theme--documenter-dark .content kbd.select select:hover,html.theme--documenter-dark .select.is-dark select.is-hovered,html.theme--documenter-dark .content kbd.select select.is-hovered{border-color:#1d2122}html.theme--documenter-dark .select.is-dark select:focus,html.theme--documenter-dark .content kbd.select select:focus,html.theme--documenter-dark .select.is-dark select.is-focused,html.theme--documenter-dark .content kbd.select select.is-focused,html.theme--documenter-dark .select.is-dark select:active,html.theme--documenter-dark .content kbd.select select:active,html.theme--documenter-dark .select.is-dark select.is-active,html.theme--documenter-dark .content kbd.select select.is-active{box-shadow:0 0 0 0.125em rgba(40,47,47,0.25)}html.theme--documenter-dark .select.is-primary:not(:hover)::after,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink:not(:hover)::after{border-color:#375a7f}html.theme--documenter-dark .select.is-primary select,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select{border-color:#375a7f}html.theme--documenter-dark .select.is-primary select:hover,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:hover,html.theme--documenter-dark .select.is-primary select.is-hovered,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-hovered{border-color:#2f4d6d}html.theme--documenter-dark .select.is-primary select:focus,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:focus,html.theme--documenter-dark .select.is-primary select.is-focused,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-focused,html.theme--documenter-dark .select.is-primary select:active,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select:active,html.theme--documenter-dark .select.is-primary select.is-active,html.theme--documenter-dark .docstring>section>a.select.docs-sourcelink select.is-active{box-shadow:0 0 0 0.125em rgba(55,90,127,0.25)}html.theme--documenter-dark .select.is-link:not(:hover)::after{border-color:#1abc9c}html.theme--documenter-dark .select.is-link select{border-color:#1abc9c}html.theme--documenter-dark .select.is-link select:hover,html.theme--documenter-dark .select.is-link select.is-hovered{border-color:#17a689}html.theme--documenter-dark .select.is-link select:focus,html.theme--documenter-dark .select.is-link select.is-focused,html.theme--documenter-dark .select.is-link select:active,html.theme--documenter-dark .select.is-link select.is-active{box-shadow:0 0 0 0.125em rgba(26,188,156,0.25)}html.theme--documenter-dark .select.is-info:not(:hover)::after{border-color:#024c7d}html.theme--documenter-dark .select.is-info select{border-color:#024c7d}html.theme--documenter-dark .select.is-info select:hover,html.theme--documenter-dark .select.is-info select.is-hovered{border-color:#023d64}html.theme--documenter-dark .select.is-info select:focus,html.theme--documenter-dark .select.is-info select.is-focused,html.theme--documenter-dark .select.is-info select:active,html.theme--documenter-dark .select.is-info select.is-active{box-shadow:0 0 0 0.125em rgba(2,76,125,0.25)}html.theme--documenter-dark .select.is-success:not(:hover)::after{border-color:#008438}html.theme--documenter-dark .select.is-success select{border-color:#008438}html.theme--documenter-dark .select.is-success select:hover,html.theme--documenter-dark .select.is-success select.is-hovered{border-color:#006b2d}html.theme--documenter-dark .select.is-success select:focus,html.theme--documenter-dark .select.is-success select.is-focused,html.theme--documenter-dark .select.is-success select:active,html.theme--documenter-dark .select.is-success select.is-active{box-shadow:0 0 0 0.125em rgba(0,132,56,0.25)}html.theme--documenter-dark .select.is-warning:not(:hover)::after{border-color:#ad8100}html.theme--documenter-dark .select.is-warning select{border-color:#ad8100}html.theme--documenter-dark .select.is-warning select:hover,html.theme--documenter-dark .select.is-warning select.is-hovered{border-color:#946e00}html.theme--documenter-dark .select.is-warning select:focus,html.theme--documenter-dark .select.is-warning select.is-focused,html.theme--documenter-dark .select.is-warning select:active,html.theme--documenter-dark .select.is-warning select.is-active{box-shadow:0 0 0 0.125em rgba(173,129,0,0.25)}html.theme--documenter-dark .select.is-danger:not(:hover)::after{border-color:#9e1b0d}html.theme--documenter-dark .select.is-danger select{border-color:#9e1b0d}html.theme--documenter-dark .select.is-danger select:hover,html.theme--documenter-dark .select.is-danger select.is-hovered{border-color:#86170b}html.theme--documenter-dark .select.is-danger select:focus,html.theme--documenter-dark .select.is-danger select.is-focused,html.theme--documenter-dark .select.is-danger select:active,html.theme--documenter-dark .select.is-danger select.is-active{box-shadow:0 0 0 0.125em rgba(158,27,13,0.25)}html.theme--documenter-dark .select.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.select{border-radius:3px;font-size:.85em}html.theme--documenter-dark .select.is-medium{font-size:1.25rem}html.theme--documenter-dark .select.is-large{font-size:1.5rem}html.theme--documenter-dark .select.is-disabled::after{border-color:#fff}html.theme--documenter-dark .select.is-fullwidth{width:100%}html.theme--documenter-dark .select.is-fullwidth select{width:100%}html.theme--documenter-dark .select.is-loading::after{margin-top:0;position:absolute;right:0.625em;top:0.625em;transform:none}html.theme--documenter-dark .select.is-loading.is-small:after,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.85em}html.theme--documenter-dark .select.is-loading.is-medium:after{font-size:1.25rem}html.theme--documenter-dark .select.is-loading.is-large:after{font-size:1.5rem}html.theme--documenter-dark .file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}html.theme--documenter-dark .file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-white:hover .file-cta,html.theme--documenter-dark .file.is-white.is-hovered .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-white:focus .file-cta,html.theme--documenter-dark .file.is-white.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,255,255,0.25);color:#0a0a0a}html.theme--documenter-dark .file.is-white:active .file-cta,html.theme--documenter-dark .file.is-white.is-active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}html.theme--documenter-dark .file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-black:hover .file-cta,html.theme--documenter-dark .file.is-black.is-hovered .file-cta{background-color:#040404;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-black:focus .file-cta,html.theme--documenter-dark .file.is-black.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(10,10,10,0.25);color:#fff}html.theme--documenter-dark .file.is-black:active .file-cta,html.theme--documenter-dark .file.is-black.is-active .file-cta{background-color:#000;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-light .file-cta{background-color:#ecf0f1;border-color:transparent;color:#282f2f}html.theme--documenter-dark .file.is-light:hover .file-cta,html.theme--documenter-dark .file.is-light.is-hovered .file-cta{background-color:#e5eaec;border-color:transparent;color:#282f2f}html.theme--documenter-dark .file.is-light:focus .file-cta,html.theme--documenter-dark .file.is-light.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(236,240,241,0.25);color:#282f2f}html.theme--documenter-dark .file.is-light:active .file-cta,html.theme--documenter-dark .file.is-light.is-active .file-cta{background-color:#dde4e6;border-color:transparent;color:#282f2f}html.theme--documenter-dark .file.is-dark .file-cta,html.theme--documenter-dark .content kbd.file .file-cta{background-color:#282f2f;border-color:transparent;color:#ecf0f1}html.theme--documenter-dark .file.is-dark:hover .file-cta,html.theme--documenter-dark .content kbd.file:hover .file-cta,html.theme--documenter-dark .file.is-dark.is-hovered .file-cta,html.theme--documenter-dark .content kbd.file.is-hovered .file-cta{background-color:#232829;border-color:transparent;color:#ecf0f1}html.theme--documenter-dark .file.is-dark:focus .file-cta,html.theme--documenter-dark .content kbd.file:focus .file-cta,html.theme--documenter-dark .file.is-dark.is-focused .file-cta,html.theme--documenter-dark .content kbd.file.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(40,47,47,0.25);color:#ecf0f1}html.theme--documenter-dark .file.is-dark:active .file-cta,html.theme--documenter-dark .content kbd.file:active .file-cta,html.theme--documenter-dark .file.is-dark.is-active .file-cta,html.theme--documenter-dark .content kbd.file.is-active .file-cta{background-color:#1d2122;border-color:transparent;color:#ecf0f1}html.theme--documenter-dark .file.is-primary .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink .file-cta{background-color:#375a7f;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary:hover .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:hover .file-cta,html.theme--documenter-dark .file.is-primary.is-hovered .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-hovered.docs-sourcelink .file-cta{background-color:#335476;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-primary:focus .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:focus .file-cta,html.theme--documenter-dark .file.is-primary.is-focused .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-focused.docs-sourcelink .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(55,90,127,0.25);color:#fff}html.theme--documenter-dark .file.is-primary:active .file-cta,html.theme--documenter-dark .docstring>section>a.file.docs-sourcelink:active .file-cta,html.theme--documenter-dark .file.is-primary.is-active .file-cta,html.theme--documenter-dark .docstring>section>a.file.is-active.docs-sourcelink .file-cta{background-color:#2f4d6d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link .file-cta{background-color:#1abc9c;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link:hover .file-cta,html.theme--documenter-dark .file.is-link.is-hovered .file-cta{background-color:#18b193;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-link:focus .file-cta,html.theme--documenter-dark .file.is-link.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(26,188,156,0.25);color:#fff}html.theme--documenter-dark .file.is-link:active .file-cta,html.theme--documenter-dark .file.is-link.is-active .file-cta{background-color:#17a689;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info .file-cta{background-color:#024c7d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info:hover .file-cta,html.theme--documenter-dark .file.is-info.is-hovered .file-cta{background-color:#024470;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-info:focus .file-cta,html.theme--documenter-dark .file.is-info.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(2,76,125,0.25);color:#fff}html.theme--documenter-dark .file.is-info:active .file-cta,html.theme--documenter-dark .file.is-info.is-active .file-cta{background-color:#023d64;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success .file-cta{background-color:#008438;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success:hover .file-cta,html.theme--documenter-dark .file.is-success.is-hovered .file-cta{background-color:#073;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-success:focus .file-cta,html.theme--documenter-dark .file.is-success.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(0,132,56,0.25);color:#fff}html.theme--documenter-dark .file.is-success:active .file-cta,html.theme--documenter-dark .file.is-success.is-active .file-cta{background-color:#006b2d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning .file-cta{background-color:#ad8100;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning:hover .file-cta,html.theme--documenter-dark .file.is-warning.is-hovered .file-cta{background-color:#a07700;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-warning:focus .file-cta,html.theme--documenter-dark .file.is-warning.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(173,129,0,0.25);color:#fff}html.theme--documenter-dark .file.is-warning:active .file-cta,html.theme--documenter-dark .file.is-warning.is-active .file-cta{background-color:#946e00;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger .file-cta{background-color:#9e1b0d;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger:hover .file-cta,html.theme--documenter-dark .file.is-danger.is-hovered .file-cta{background-color:#92190c;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-danger:focus .file-cta,html.theme--documenter-dark .file.is-danger.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(158,27,13,0.25);color:#fff}html.theme--documenter-dark .file.is-danger:active .file-cta,html.theme--documenter-dark .file.is-danger.is-active .file-cta{background-color:#86170b;border-color:transparent;color:#fff}html.theme--documenter-dark .file.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.file{font-size:.85em}html.theme--documenter-dark .file.is-medium{font-size:1.25rem}html.theme--documenter-dark .file.is-medium .file-icon .fa{font-size:21px}html.theme--documenter-dark .file.is-large{font-size:1.5rem}html.theme--documenter-dark .file.is-large .file-icon .fa{font-size:28px}html.theme--documenter-dark .file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}html.theme--documenter-dark .file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .file.has-name.is-empty .file-cta{border-radius:.4em}html.theme--documenter-dark .file.has-name.is-empty .file-name{display:none}html.theme--documenter-dark .file.is-boxed .file-label{flex-direction:column}html.theme--documenter-dark .file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}html.theme--documenter-dark .file.is-boxed .file-name{border-width:0 1px 1px}html.theme--documenter-dark .file.is-boxed .file-icon{height:1.5em;width:1.5em}html.theme--documenter-dark .file.is-boxed .file-icon .fa{font-size:21px}html.theme--documenter-dark .file.is-boxed.is-small .file-icon .fa,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-boxed .file-icon .fa{font-size:14px}html.theme--documenter-dark .file.is-boxed.is-medium .file-icon .fa{font-size:28px}html.theme--documenter-dark .file.is-boxed.is-large .file-icon .fa{font-size:35px}html.theme--documenter-dark .file.is-boxed.has-name .file-cta{border-radius:.4em .4em 0 0}html.theme--documenter-dark .file.is-boxed.has-name .file-name{border-radius:0 0 .4em .4em;border-width:0 1px 1px}html.theme--documenter-dark .file.is-centered{justify-content:center}html.theme--documenter-dark .file.is-fullwidth .file-label{width:100%}html.theme--documenter-dark .file.is-fullwidth .file-name{flex-grow:1;max-width:none}html.theme--documenter-dark .file.is-right{justify-content:flex-end}html.theme--documenter-dark .file.is-right .file-cta{border-radius:0 .4em .4em 0}html.theme--documenter-dark .file.is-right .file-name{border-radius:.4em 0 0 .4em;border-width:1px 0 1px 1px;order:-1}html.theme--documenter-dark .file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}html.theme--documenter-dark .file-label:hover .file-cta{background-color:#e5eaec;color:#282f2f}html.theme--documenter-dark .file-label:hover .file-name{border-color:#596668}html.theme--documenter-dark .file-label:active .file-cta{background-color:#dde4e6;color:#282f2f}html.theme--documenter-dark .file-label:active .file-name{border-color:#535f61}html.theme--documenter-dark .file-input{height:100%;left:0;opacity:0;outline:none;position:absolute;top:0;width:100%}html.theme--documenter-dark .file-cta,html.theme--documenter-dark .file-name{border-color:#5e6d6f;border-radius:.4em;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}html.theme--documenter-dark .file-cta{background-color:#ecf0f1;color:#343c3d}html.theme--documenter-dark .file-name{border-color:#5e6d6f;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:left;text-overflow:ellipsis}html.theme--documenter-dark .file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:0.5em;width:1em}html.theme--documenter-dark .file-icon .fa{font-size:14px}html.theme--documenter-dark .label{color:#282f2f;display:block;font-size:15px;font-weight:700}html.theme--documenter-dark .label:not(:last-child){margin-bottom:0.5em}html.theme--documenter-dark .label.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.label{font-size:.85em}html.theme--documenter-dark .label.is-medium{font-size:1.25rem}html.theme--documenter-dark .label.is-large{font-size:1.5rem}html.theme--documenter-dark .help{display:block;font-size:.85em;margin-top:0.25rem}html.theme--documenter-dark .help.is-white{color:#fff}html.theme--documenter-dark .help.is-black{color:#0a0a0a}html.theme--documenter-dark .help.is-light{color:#ecf0f1}html.theme--documenter-dark .help.is-dark,html.theme--documenter-dark .content kbd.help{color:#282f2f}html.theme--documenter-dark .help.is-primary,html.theme--documenter-dark .docstring>section>a.help.docs-sourcelink{color:#375a7f}html.theme--documenter-dark .help.is-link{color:#1abc9c}html.theme--documenter-dark .help.is-info{color:#024c7d}html.theme--documenter-dark .help.is-success{color:#008438}html.theme--documenter-dark .help.is-warning{color:#ad8100}html.theme--documenter-dark .help.is-danger{color:#9e1b0d}html.theme--documenter-dark .field:not(:last-child){margin-bottom:0.75rem}html.theme--documenter-dark .field.has-addons{display:flex;justify-content:flex-start}html.theme--documenter-dark .field.has-addons .control:not(:last-child){margin-right:-1px}html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .button,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .input,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .button,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .input,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .button,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .input,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search>input,html.theme--documenter-dark .field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .button.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-hovered:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-hovered:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select.is-hovered:not([disabled]){z-index:2}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]),html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus,html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]),html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active,html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]){z-index:3}html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .button.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .button:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .button.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus:hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .input.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .input:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active:hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .input.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]):hover,html.theme--documenter-dark #documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):focus:hover,html.theme--documenter-dark .field.has-addons .control .select select.is-focused:not([disabled]):hover,html.theme--documenter-dark .field.has-addons .control .select select:not([disabled]):active:hover,html.theme--documenter-dark .field.has-addons .control .select select.is-active:not([disabled]):hover{z-index:4}html.theme--documenter-dark .field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .field.has-addons.has-addons-centered{justify-content:center}html.theme--documenter-dark .field.has-addons.has-addons-right{justify-content:flex-end}html.theme--documenter-dark .field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .field.is-grouped{display:flex;justify-content:flex-start}html.theme--documenter-dark .field.is-grouped>.control{flex-shrink:0}html.theme--documenter-dark .field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:0.75rem}html.theme--documenter-dark .field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .field.is-grouped.is-grouped-centered{justify-content:center}html.theme--documenter-dark .field.is-grouped.is-grouped-right{justify-content:flex-end}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline{flex-wrap:wrap}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline>.control:last-child,html.theme--documenter-dark .field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:0.75rem}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-0.75rem}html.theme--documenter-dark .field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field.is-horizontal{display:flex}}html.theme--documenter-dark .field-label .label{font-size:inherit}@media screen and (max-width: 768px){html.theme--documenter-dark .field-label{margin-bottom:0.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}html.theme--documenter-dark .field-label.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.field-label{font-size:.85em;padding-top:0.375em}html.theme--documenter-dark .field-label.is-normal{padding-top:0.375em}html.theme--documenter-dark .field-label.is-medium{font-size:1.25rem;padding-top:0.375em}html.theme--documenter-dark .field-label.is-large{font-size:1.5rem;padding-top:0.375em}}html.theme--documenter-dark .field-body .field .field{margin-bottom:0}@media screen and (min-width: 769px),print{html.theme--documenter-dark .field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}html.theme--documenter-dark .field-body .field{margin-bottom:0}html.theme--documenter-dark .field-body>.field{flex-shrink:1}html.theme--documenter-dark .field-body>.field:not(.is-narrow){flex-grow:1}html.theme--documenter-dark .field-body>.field:not(:last-child){margin-right:0.75rem}}html.theme--documenter-dark .control{box-sizing:border-box;clear:both;font-size:15px;position:relative;text-align:left}html.theme--documenter-dark .control.has-icons-left .input:focus~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input:focus~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input:focus~.icon,html.theme--documenter-dark .control.has-icons-left .select:focus~.icon,html.theme--documenter-dark .control.has-icons-right .input:focus~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input:focus~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input:focus~.icon,html.theme--documenter-dark .control.has-icons-right .select:focus~.icon{color:#5e6d6f}html.theme--documenter-dark .control.has-icons-left .input.is-small~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-small~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-small~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-small~.icon{font-size:.85em}html.theme--documenter-dark .control.has-icons-left .input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-medium~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}html.theme--documenter-dark .control.has-icons-left .input.is-large~.icon,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-large~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-large~.icon,html.theme--documenter-dark .control.has-icons-left .select.is-large~.icon,html.theme--documenter-dark .control.has-icons-right .input.is-large~.icon,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-large~.icon,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-large~.icon,html.theme--documenter-dark .control.has-icons-right .select.is-large~.icon{font-size:1.5rem}html.theme--documenter-dark .control.has-icons-left .icon,html.theme--documenter-dark .control.has-icons-right .icon{color:#dbdee0;height:2.25em;pointer-events:none;position:absolute;top:0;width:2.25em;z-index:4}html.theme--documenter-dark .control.has-icons-left .input,html.theme--documenter-dark .control.has-icons-left #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-left form.docs-search>input,html.theme--documenter-dark .control.has-icons-left .select select{padding-left:2.25em}html.theme--documenter-dark .control.has-icons-left .icon.is-left{left:0}html.theme--documenter-dark .control.has-icons-right .input,html.theme--documenter-dark .control.has-icons-right #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-icons-right form.docs-search>input,html.theme--documenter-dark .control.has-icons-right .select select{padding-right:2.25em}html.theme--documenter-dark .control.has-icons-right .icon.is-right{right:0}html.theme--documenter-dark .control.is-loading::after{position:absolute !important;right:0.625em;top:0.625em;z-index:4}html.theme--documenter-dark .control.is-loading.is-small:after,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.85em}html.theme--documenter-dark .control.is-loading.is-medium:after{font-size:1.25rem}html.theme--documenter-dark .control.is-loading.is-large:after{font-size:1.5rem}html.theme--documenter-dark .breadcrumb{font-size:15px;white-space:nowrap}html.theme--documenter-dark .breadcrumb a{align-items:center;color:#1abc9c;display:flex;justify-content:center;padding:0 .75em}html.theme--documenter-dark .breadcrumb a:hover{color:#1dd2af}html.theme--documenter-dark .breadcrumb li{align-items:center;display:flex}html.theme--documenter-dark .breadcrumb li:first-child a{padding-left:0}html.theme--documenter-dark .breadcrumb li.is-active a{color:#f2f2f2;cursor:default;pointer-events:none}html.theme--documenter-dark .breadcrumb li+li::before{color:#8c9b9d;content:"\0002f"}html.theme--documenter-dark .breadcrumb ul,html.theme--documenter-dark .breadcrumb ol{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}html.theme--documenter-dark .breadcrumb .icon:first-child{margin-right:0.5em}html.theme--documenter-dark .breadcrumb .icon:last-child{margin-left:0.5em}html.theme--documenter-dark .breadcrumb.is-centered ol,html.theme--documenter-dark .breadcrumb.is-centered ul{justify-content:center}html.theme--documenter-dark .breadcrumb.is-right ol,html.theme--documenter-dark .breadcrumb.is-right ul{justify-content:flex-end}html.theme--documenter-dark .breadcrumb.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.breadcrumb{font-size:.85em}html.theme--documenter-dark .breadcrumb.is-medium{font-size:1.25rem}html.theme--documenter-dark .breadcrumb.is-large{font-size:1.5rem}html.theme--documenter-dark .breadcrumb.has-arrow-separator li+li::before{content:"\02192"}html.theme--documenter-dark .breadcrumb.has-bullet-separator li+li::before{content:"\02022"}html.theme--documenter-dark .breadcrumb.has-dot-separator li+li::before{content:"\000b7"}html.theme--documenter-dark .breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}html.theme--documenter-dark .card{background-color:#fff;box-shadow:0 2px 3px rgba(10,10,10,0.1),0 0 0 1px rgba(10,10,10,0.1);color:#fff;max-width:100%;position:relative}html.theme--documenter-dark .card-header{background-color:rgba(0,0,0,0);align-items:stretch;box-shadow:0 1px 2px rgba(10,10,10,0.1);display:flex}html.theme--documenter-dark .card-header-title{align-items:center;color:#f2f2f2;display:flex;flex-grow:1;font-weight:700;padding:.75rem}html.theme--documenter-dark .card-header-title.is-centered{justify-content:center}html.theme--documenter-dark .card-header-icon{align-items:center;cursor:pointer;display:flex;justify-content:center;padding:.75rem}html.theme--documenter-dark .card-image{display:block;position:relative}html.theme--documenter-dark .card-content{background-color:rgba(0,0,0,0);padding:1.5rem}html.theme--documenter-dark .card-footer{background-color:rgba(0,0,0,0);border-top:1px solid #5e6d6f;align-items:stretch;display:flex}html.theme--documenter-dark .card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}html.theme--documenter-dark .card-footer-item:not(:last-child){border-right:1px solid #5e6d6f}html.theme--documenter-dark .card .media:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .dropdown{display:inline-flex;position:relative;vertical-align:top}html.theme--documenter-dark .dropdown.is-active .dropdown-menu,html.theme--documenter-dark .dropdown.is-hoverable:hover .dropdown-menu{display:block}html.theme--documenter-dark .dropdown.is-right .dropdown-menu{left:auto;right:0}html.theme--documenter-dark .dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}html.theme--documenter-dark .dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}html.theme--documenter-dark .dropdown-content{background-color:#282f2f;border-radius:.4em;box-shadow:0 2px 3px rgba(10,10,10,0.1),0 0 0 1px rgba(10,10,10,0.1);padding-bottom:.5rem;padding-top:.5rem}html.theme--documenter-dark .dropdown-item{color:#fff;display:block;font-size:0.875rem;line-height:1.5;padding:0.375rem 1rem;position:relative}html.theme--documenter-dark a.dropdown-item,html.theme--documenter-dark button.dropdown-item{padding-right:3rem;text-align:left;white-space:nowrap;width:100%}html.theme--documenter-dark a.dropdown-item:hover,html.theme--documenter-dark button.dropdown-item:hover{background-color:#282f2f;color:#0a0a0a}html.theme--documenter-dark a.dropdown-item.is-active,html.theme--documenter-dark button.dropdown-item.is-active{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .dropdown-divider{background-color:#5e6d6f;border:none;display:block;height:1px;margin:0.5rem 0}html.theme--documenter-dark .level{align-items:center;justify-content:space-between}html.theme--documenter-dark .level code{border-radius:.4em}html.theme--documenter-dark .level img{display:inline-block;vertical-align:top}html.theme--documenter-dark .level.is-mobile{display:flex}html.theme--documenter-dark .level.is-mobile .level-left,html.theme--documenter-dark .level.is-mobile .level-right{display:flex}html.theme--documenter-dark .level.is-mobile .level-left+.level-right{margin-top:0}html.theme--documenter-dark .level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}html.theme--documenter-dark .level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level{display:flex}html.theme--documenter-dark .level>.level-item:not(.is-narrow){flex-grow:1}}html.theme--documenter-dark .level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}html.theme--documenter-dark .level-item .title,html.theme--documenter-dark .level-item .subtitle{margin-bottom:0}@media screen and (max-width: 768px){html.theme--documenter-dark .level-item:not(:last-child){margin-bottom:.75rem}}html.theme--documenter-dark .level-left,html.theme--documenter-dark .level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}html.theme--documenter-dark .level-left .level-item.is-flexible,html.theme--documenter-dark .level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-left .level-item:not(:last-child),html.theme--documenter-dark .level-right .level-item:not(:last-child){margin-right:.75rem}}html.theme--documenter-dark .level-left{align-items:center;justify-content:flex-start}@media screen and (max-width: 768px){html.theme--documenter-dark .level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-left{display:flex}}html.theme--documenter-dark .level-right{align-items:center;justify-content:flex-end}@media screen and (min-width: 769px),print{html.theme--documenter-dark .level-right{display:flex}}html.theme--documenter-dark .list{background-color:#fff;border-radius:.4em;box-shadow:0 2px 3px rgba(10,10,10,0.1),0 0 0 1px rgba(10,10,10,0.1)}html.theme--documenter-dark .list-item{display:block;padding:0.5em 1em}html.theme--documenter-dark .list-item:not(a){color:#fff}html.theme--documenter-dark .list-item:first-child{border-top-left-radius:.4em;border-top-right-radius:.4em}html.theme--documenter-dark .list-item:last-child{border-bottom-left-radius:.4em;border-bottom-right-radius:.4em}html.theme--documenter-dark .list-item:not(:last-child){border-bottom:1px solid #5e6d6f}html.theme--documenter-dark .list-item.is-active{background-color:#1abc9c;color:#fff}html.theme--documenter-dark a.list-item{background-color:#282f2f;cursor:pointer}html.theme--documenter-dark .media{align-items:flex-start;display:flex;text-align:left}html.theme--documenter-dark .media .content:not(:last-child){margin-bottom:0.75rem}html.theme--documenter-dark .media .media{border-top:1px solid rgba(94,109,111,0.5);display:flex;padding-top:0.75rem}html.theme--documenter-dark .media .media .content:not(:last-child),html.theme--documenter-dark .media .media .control:not(:last-child){margin-bottom:0.5rem}html.theme--documenter-dark .media .media .media{padding-top:0.5rem}html.theme--documenter-dark .media .media .media+.media{margin-top:0.5rem}html.theme--documenter-dark .media+.media{border-top:1px solid rgba(94,109,111,0.5);margin-top:1rem;padding-top:1rem}html.theme--documenter-dark .media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}html.theme--documenter-dark .media-left,html.theme--documenter-dark .media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}html.theme--documenter-dark .media-left{margin-right:1rem}html.theme--documenter-dark .media-right{margin-left:1rem}html.theme--documenter-dark .media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:left}@media screen and (max-width: 768px){html.theme--documenter-dark .media-content{overflow-x:auto}}html.theme--documenter-dark .menu{font-size:15px}html.theme--documenter-dark .menu.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.menu{font-size:.85em}html.theme--documenter-dark .menu.is-medium{font-size:1.25rem}html.theme--documenter-dark .menu.is-large{font-size:1.5rem}html.theme--documenter-dark .menu-list{line-height:1.25}html.theme--documenter-dark .menu-list a{border-radius:3px;color:#fff;display:block;padding:0.5em 0.75em}html.theme--documenter-dark .menu-list a:hover{background-color:#282f2f;color:#f2f2f2}html.theme--documenter-dark .menu-list a.is-active{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .menu-list li ul{border-left:1px solid #5e6d6f;margin:.75em;padding-left:.75em}html.theme--documenter-dark .menu-label{color:#fff;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}html.theme--documenter-dark .menu-label:not(:first-child){margin-top:1em}html.theme--documenter-dark .menu-label:not(:last-child){margin-bottom:1em}html.theme--documenter-dark .message{background-color:#282f2f;border-radius:.4em;font-size:15px}html.theme--documenter-dark .message strong{color:currentColor}html.theme--documenter-dark .message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}html.theme--documenter-dark .message.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.message{font-size:.85em}html.theme--documenter-dark .message.is-medium{font-size:1.25rem}html.theme--documenter-dark .message.is-large{font-size:1.5rem}html.theme--documenter-dark .message.is-white{background-color:#fff}html.theme--documenter-dark .message.is-white .message-header{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .message.is-white .message-body{border-color:#fff;color:#4d4d4d}html.theme--documenter-dark .message.is-black{background-color:#fafafa}html.theme--documenter-dark .message.is-black .message-header{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .message.is-black .message-body{border-color:#0a0a0a;color:#090909}html.theme--documenter-dark .message.is-light{background-color:#f9fafb}html.theme--documenter-dark .message.is-light .message-header{background-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .message.is-light .message-body{border-color:#ecf0f1;color:#505050}html.theme--documenter-dark .message.is-dark,html.theme--documenter-dark .content kbd.message{background-color:#f9fafa}html.theme--documenter-dark .message.is-dark .message-header,html.theme--documenter-dark .content kbd.message .message-header{background-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .message.is-dark .message-body,html.theme--documenter-dark .content kbd.message .message-body{border-color:#282f2f;color:#212526}html.theme--documenter-dark .message.is-primary,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink{background-color:#f8fafc}html.theme--documenter-dark .message.is-primary .message-header,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink .message-header{background-color:#375a7f;color:#fff}html.theme--documenter-dark .message.is-primary .message-body,html.theme--documenter-dark .docstring>section>a.message.docs-sourcelink .message-body{border-color:#375a7f;color:#2b4159}html.theme--documenter-dark .message.is-link{background-color:#f6fefc}html.theme--documenter-dark .message.is-link .message-header{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .message.is-link .message-body{border-color:#1abc9c;color:#0b2f28}html.theme--documenter-dark .message.is-info{background-color:#f5fbff}html.theme--documenter-dark .message.is-info .message-header{background-color:#024c7d;color:#fff}html.theme--documenter-dark .message.is-info .message-body{border-color:#024c7d;color:#033659}html.theme--documenter-dark .message.is-success{background-color:#f5fff9}html.theme--documenter-dark .message.is-success .message-header{background-color:#008438;color:#fff}html.theme--documenter-dark .message.is-success .message-body{border-color:#008438;color:#023518}html.theme--documenter-dark .message.is-warning{background-color:#fffcf5}html.theme--documenter-dark .message.is-warning .message-header{background-color:#ad8100;color:#fff}html.theme--documenter-dark .message.is-warning .message-body{border-color:#ad8100;color:#3d2e03}html.theme--documenter-dark .message.is-danger{background-color:#fef6f6}html.theme--documenter-dark .message.is-danger .message-header{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .message.is-danger .message-body{border-color:#9e1b0d;color:#7a170c}html.theme--documenter-dark .message-header{align-items:center;background-color:#fff;border-radius:.4em .4em 0 0;color:rgba(0,0,0,0.7);display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.75em 1em;position:relative}html.theme--documenter-dark .message-header .delete{flex-grow:0;flex-shrink:0;margin-left:0.75em}html.theme--documenter-dark .message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}html.theme--documenter-dark .message-body{border-color:#5e6d6f;border-radius:.4em;border-style:solid;border-width:0 0 0 4px;color:#fff;padding:1.25em 1.5em}html.theme--documenter-dark .message-body code,html.theme--documenter-dark .message-body pre{background-color:#fff}html.theme--documenter-dark .message-body pre code{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}html.theme--documenter-dark .modal.is-active{display:flex}html.theme--documenter-dark .modal-background{background-color:rgba(10,10,10,0.86)}html.theme--documenter-dark .modal-content,html.theme--documenter-dark .modal-card{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width: 769px),print{html.theme--documenter-dark .modal-content,html.theme--documenter-dark .modal-card{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}html.theme--documenter-dark .modal-close{background:none;height:40px;position:fixed;right:20px;top:20px;width:40px}html.theme--documenter-dark .modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}html.theme--documenter-dark .modal-card-head,html.theme--documenter-dark .modal-card-foot{align-items:center;background-color:#282f2f;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}html.theme--documenter-dark .modal-card-head{border-bottom:1px solid #5e6d6f;border-top-left-radius:8px;border-top-right-radius:8px}html.theme--documenter-dark .modal-card-title{color:#f2f2f2;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}html.theme--documenter-dark .modal-card-foot{border-bottom-left-radius:8px;border-bottom-right-radius:8px;border-top:1px solid #5e6d6f}html.theme--documenter-dark .modal-card-foot .button:not(:last-child){margin-right:0.5em}html.theme--documenter-dark .modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}html.theme--documenter-dark .navbar{background-color:#375a7f;min-height:4rem;position:relative;z-index:30}html.theme--documenter-dark .navbar.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link{color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-white .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link{color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-white .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-white .navbar-end .navbar-link::after{border-color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}html.theme--documenter-dark .navbar.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-black .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-black .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-black .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link{background-color:#000;color:#fff}html.theme--documenter-dark .navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}html.theme--documenter-dark .navbar.is-light{background-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .navbar.is-light .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link{color:#282f2f}html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link.is-active{background-color:#dde4e6;color:#282f2f}html.theme--documenter-dark .navbar.is-light .navbar-brand .navbar-link::after{border-color:#282f2f}html.theme--documenter-dark .navbar.is-light .navbar-burger{color:#282f2f}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-light .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link{color:#282f2f}html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-light .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link.is-active{background-color:#dde4e6;color:#282f2f}html.theme--documenter-dark .navbar.is-light .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-light .navbar-end .navbar-link::after{border-color:#282f2f}html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link{background-color:#dde4e6;color:#282f2f}html.theme--documenter-dark .navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#ecf0f1;color:#282f2f}}html.theme--documenter-dark .navbar.is-dark,html.theme--documenter-dark .content kbd.navbar{background-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .navbar.is-dark .navbar-brand>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link{color:#ecf0f1}html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link.is-active{background-color:#1d2122;color:#ecf0f1}html.theme--documenter-dark .navbar.is-dark .navbar-brand .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-brand .navbar-link::after{border-color:#ecf0f1}html.theme--documenter-dark .navbar.is-dark .navbar-burger,html.theme--documenter-dark .content kbd.navbar .navbar-burger{color:#ecf0f1}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-dark .navbar-start>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-end>.navbar-item,html.theme--documenter-dark .content kbd.navbar .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link{color:#ecf0f1}html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-dark .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:focus,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link:hover,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link.is-active{background-color:#1d2122;color:#ecf0f1}html.theme--documenter-dark .navbar.is-dark .navbar-start .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-dark .navbar-end .navbar-link::after,html.theme--documenter-dark .content kbd.navbar .navbar-end .navbar-link::after{border-color:#ecf0f1}html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1d2122;color:#ecf0f1}html.theme--documenter-dark .navbar.is-dark .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .content kbd.navbar .navbar-dropdown a.navbar-item.is-active{background-color:#282f2f;color:#ecf0f1}}html.theme--documenter-dark .navbar.is-primary,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-brand .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-burger,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-primary .navbar-start>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-end>.navbar-item,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-primary .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:focus,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-start .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-primary .navbar-end .navbar-link::after,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#375a7f;color:#fff}}html.theme--documenter-dark .navbar.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-link .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-link .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-link .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link{background-color:#17a689;color:#fff}html.theme--documenter-dark .navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#1abc9c;color:#fff}}html.theme--documenter-dark .navbar.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-info .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-info .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-info .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link{background-color:#023d64;color:#fff}html.theme--documenter-dark .navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#024c7d;color:#fff}}html.theme--documenter-dark .navbar.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-success .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-success .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-success .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link{background-color:#006b2d;color:#fff}html.theme--documenter-dark .navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#008438;color:#fff}}html.theme--documenter-dark .navbar.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-warning .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-warning .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-warning .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link{background-color:#946e00;color:#fff}html.theme--documenter-dark .navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ad8100;color:#fff}}html.theme--documenter-dark .navbar.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-brand>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar.is-danger .navbar-start>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-end>.navbar-item,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link{color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-start>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item:focus,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item:hover,html.theme--documenter-dark .navbar.is-danger .navbar-end>a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:focus,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link:hover,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-start .navbar-link::after,html.theme--documenter-dark .navbar.is-danger .navbar-end .navbar-link::after{border-color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link{background-color:#86170b;color:#fff}html.theme--documenter-dark .navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#9e1b0d;color:#fff}}html.theme--documenter-dark .navbar>.container{align-items:stretch;display:flex;min-height:4rem;width:100%}html.theme--documenter-dark .navbar.has-shadow{box-shadow:0 2px 0 0 #282f2f}html.theme--documenter-dark .navbar.is-fixed-bottom,html.theme--documenter-dark .navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #282f2f}html.theme--documenter-dark .navbar.is-fixed-top{top:0}html.theme--documenter-dark html.has-navbar-fixed-top,html.theme--documenter-dark body.has-navbar-fixed-top{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom,html.theme--documenter-dark body.has-navbar-fixed-bottom{padding-bottom:4rem}html.theme--documenter-dark .navbar-brand,html.theme--documenter-dark .navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:4rem}html.theme--documenter-dark .navbar-brand a.navbar-item:focus,html.theme--documenter-dark .navbar-brand a.navbar-item:hover{background-color:transparent}html.theme--documenter-dark .navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}html.theme--documenter-dark .navbar-burger{color:#fff;cursor:pointer;display:block;height:4rem;position:relative;width:4rem;margin-left:auto}html.theme--documenter-dark .navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color, opacity, transform;transition-timing-function:ease-out;width:16px}html.theme--documenter-dark .navbar-burger span:nth-child(1){top:calc(50% - 6px)}html.theme--documenter-dark .navbar-burger span:nth-child(2){top:calc(50% - 1px)}html.theme--documenter-dark .navbar-burger span:nth-child(3){top:calc(50% + 4px)}html.theme--documenter-dark .navbar-burger:hover{background-color:rgba(0,0,0,0.05)}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(1){transform:translateY(5px) rotate(45deg)}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(2){opacity:0}html.theme--documenter-dark .navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}html.theme--documenter-dark .navbar-menu{display:none}html.theme--documenter-dark .navbar-item,html.theme--documenter-dark .navbar-link{color:#fff;display:block;line-height:1.5;padding:0.5rem 0.75rem;position:relative}html.theme--documenter-dark .navbar-item .icon:only-child,html.theme--documenter-dark .navbar-link .icon:only-child{margin-left:-0.25rem;margin-right:-0.25rem}html.theme--documenter-dark a.navbar-item,html.theme--documenter-dark .navbar-link{cursor:pointer}html.theme--documenter-dark a.navbar-item:focus,html.theme--documenter-dark a.navbar-item:focus-within,html.theme--documenter-dark a.navbar-item:hover,html.theme--documenter-dark a.navbar-item.is-active,html.theme--documenter-dark .navbar-link:focus,html.theme--documenter-dark .navbar-link:focus-within,html.theme--documenter-dark .navbar-link:hover,html.theme--documenter-dark .navbar-link.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}html.theme--documenter-dark .navbar-item{display:block;flex-grow:0;flex-shrink:0}html.theme--documenter-dark .navbar-item img{max-height:1.75rem}html.theme--documenter-dark .navbar-item.has-dropdown{padding:0}html.theme--documenter-dark .navbar-item.is-expanded{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .navbar-item.is-tab{border-bottom:1px solid transparent;min-height:4rem;padding-bottom:calc(0.5rem - 1px)}html.theme--documenter-dark .navbar-item.is-tab:focus,html.theme--documenter-dark .navbar-item.is-tab:hover{background-color:rgba(0,0,0,0);border-bottom-color:#1abc9c}html.theme--documenter-dark .navbar-item.is-tab.is-active{background-color:rgba(0,0,0,0);border-bottom-color:#1abc9c;border-bottom-style:solid;border-bottom-width:3px;color:#1abc9c;padding-bottom:calc(0.5rem - 3px)}html.theme--documenter-dark .navbar-content{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .navbar-link:not(.is-arrowless){padding-right:2.5em}html.theme--documenter-dark .navbar-link:not(.is-arrowless)::after{border-color:#fff;margin-top:-0.375em;right:1.125em}html.theme--documenter-dark .navbar-dropdown{font-size:0.875rem;padding-bottom:0.5rem;padding-top:0.5rem}html.theme--documenter-dark .navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}html.theme--documenter-dark .navbar-divider{background-color:rgba(0,0,0,0.2);border:none;display:none;height:2px;margin:0.5rem 0}@media screen and (max-width: 1055px){html.theme--documenter-dark .navbar>.container{display:block}html.theme--documenter-dark .navbar-brand .navbar-item,html.theme--documenter-dark .navbar-tabs .navbar-item{align-items:center;display:flex}html.theme--documenter-dark .navbar-link::after{display:none}html.theme--documenter-dark .navbar-menu{background-color:#375a7f;box-shadow:0 8px 16px rgba(10,10,10,0.1);padding:0.5rem 0}html.theme--documenter-dark .navbar-menu.is-active{display:block}html.theme--documenter-dark .navbar.is-fixed-bottom-touch,html.theme--documenter-dark .navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom-touch{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}html.theme--documenter-dark .navbar.is-fixed-top-touch{top:0}html.theme--documenter-dark .navbar.is-fixed-top .navbar-menu,html.theme--documenter-dark .navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 4rem);overflow:auto}html.theme--documenter-dark html.has-navbar-fixed-top-touch,html.theme--documenter-dark body.has-navbar-fixed-top-touch{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom-touch,html.theme--documenter-dark body.has-navbar-fixed-bottom-touch{padding-bottom:4rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .navbar,html.theme--documenter-dark .navbar-menu,html.theme--documenter-dark .navbar-start,html.theme--documenter-dark .navbar-end{align-items:stretch;display:flex}html.theme--documenter-dark .navbar{min-height:4rem}html.theme--documenter-dark .navbar.is-spaced{padding:1rem 2rem}html.theme--documenter-dark .navbar.is-spaced .navbar-start,html.theme--documenter-dark .navbar.is-spaced .navbar-end{align-items:center}html.theme--documenter-dark .navbar.is-spaced a.navbar-item,html.theme--documenter-dark .navbar.is-spaced .navbar-link{border-radius:.4em}html.theme--documenter-dark .navbar.is-transparent a.navbar-item:focus,html.theme--documenter-dark .navbar.is-transparent a.navbar-item:hover,html.theme--documenter-dark .navbar.is-transparent a.navbar-item.is-active,html.theme--documenter-dark .navbar.is-transparent .navbar-link:focus,html.theme--documenter-dark .navbar.is-transparent .navbar-link:hover,html.theme--documenter-dark .navbar.is-transparent .navbar-link.is-active{background-color:transparent !important}html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,html.theme--documenter-dark .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent !important}html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:focus,html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:rgba(0,0,0,0);color:#dbdee0}html.theme--documenter-dark .navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}html.theme--documenter-dark .navbar-burger{display:none}html.theme--documenter-dark .navbar-item,html.theme--documenter-dark .navbar-link{align-items:center;display:flex}html.theme--documenter-dark .navbar-item{display:flex}html.theme--documenter-dark .navbar-item.has-dropdown{align-items:stretch}html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(0.25em, -0.25em)}html.theme--documenter-dark .navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:1px solid rgba(0,0,0,0.2);border-radius:8px 8px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,0.1);top:auto}html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-active .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar.is-spaced html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown,html.theme--documenter-dark .navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed{opacity:1;pointer-events:auto;transform:translateY(0)}html.theme--documenter-dark .navbar-menu{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .navbar-start{justify-content:flex-start;margin-right:auto}html.theme--documenter-dark .navbar-end{justify-content:flex-end;margin-left:auto}html.theme--documenter-dark .navbar-dropdown{background-color:#375a7f;border-bottom-left-radius:8px;border-bottom-right-radius:8px;border-top:1px solid rgba(0,0,0,0.2);box-shadow:0 8px 8px rgba(10,10,10,0.1);display:none;font-size:0.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}html.theme--documenter-dark .navbar-dropdown .navbar-item{padding:0.375rem 1rem;white-space:nowrap}html.theme--documenter-dark .navbar-dropdown a.navbar-item{padding-right:3rem}html.theme--documenter-dark .navbar-dropdown a.navbar-item:focus,html.theme--documenter-dark .navbar-dropdown a.navbar-item:hover{background-color:rgba(0,0,0,0);color:#dbdee0}html.theme--documenter-dark .navbar-dropdown a.navbar-item.is-active{background-color:rgba(0,0,0,0);color:#1abc9c}.navbar.is-spaced html.theme--documenter-dark .navbar-dropdown,html.theme--documenter-dark .navbar-dropdown.is-boxed{border-radius:8px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,0.1), 0 0 0 1px rgba(10,10,10,0.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity, transform}html.theme--documenter-dark .navbar-dropdown.is-right{left:auto;right:0}html.theme--documenter-dark .navbar-divider{display:block}html.theme--documenter-dark .navbar>.container .navbar-brand,html.theme--documenter-dark .container>.navbar .navbar-brand{margin-left:-.75rem}html.theme--documenter-dark .navbar>.container .navbar-menu,html.theme--documenter-dark .container>.navbar .navbar-menu{margin-right:-.75rem}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop,html.theme--documenter-dark .navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop{bottom:0}html.theme--documenter-dark .navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}html.theme--documenter-dark .navbar.is-fixed-top-desktop{top:0}html.theme--documenter-dark html.has-navbar-fixed-top-desktop,html.theme--documenter-dark body.has-navbar-fixed-top-desktop{padding-top:4rem}html.theme--documenter-dark html.has-navbar-fixed-bottom-desktop,html.theme--documenter-dark body.has-navbar-fixed-bottom-desktop{padding-bottom:4rem}html.theme--documenter-dark html.has-spaced-navbar-fixed-top,html.theme--documenter-dark body.has-spaced-navbar-fixed-top{padding-top:6rem}html.theme--documenter-dark html.has-spaced-navbar-fixed-bottom,html.theme--documenter-dark body.has-spaced-navbar-fixed-bottom{padding-bottom:6rem}html.theme--documenter-dark a.navbar-item.is-active,html.theme--documenter-dark .navbar-link.is-active{color:#1abc9c}html.theme--documenter-dark a.navbar-item.is-active:not(:focus):not(:hover),html.theme--documenter-dark .navbar-link.is-active:not(:focus):not(:hover){background-color:rgba(0,0,0,0)}html.theme--documenter-dark .navbar-item.has-dropdown:focus .navbar-link,html.theme--documenter-dark .navbar-item.has-dropdown:hover .navbar-link,html.theme--documenter-dark .navbar-item.has-dropdown.is-active .navbar-link{background-color:rgba(0,0,0,0)}}html.theme--documenter-dark .hero.is-fullheight-with-navbar{min-height:calc(100vh - 4rem)}html.theme--documenter-dark .pagination{font-size:15px;margin:-.25rem}html.theme--documenter-dark .pagination.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination{font-size:.85em}html.theme--documenter-dark .pagination.is-medium{font-size:1.25rem}html.theme--documenter-dark .pagination.is-large{font-size:1.5rem}html.theme--documenter-dark .pagination.is-rounded .pagination-previous,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-previous,html.theme--documenter-dark .pagination.is-rounded .pagination-next,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-next{padding-left:1em;padding-right:1em;border-radius:290486px}html.theme--documenter-dark .pagination.is-rounded .pagination-link,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.pagination .pagination-link{border-radius:290486px}html.theme--documenter-dark .pagination,html.theme--documenter-dark .pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-ellipsis{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-link{border-color:#5e6d6f;color:#1abc9c;min-width:2.25em}html.theme--documenter-dark .pagination-previous:hover,html.theme--documenter-dark .pagination-next:hover,html.theme--documenter-dark .pagination-link:hover{border-color:#8c9b9d;color:#1dd2af}html.theme--documenter-dark .pagination-previous:focus,html.theme--documenter-dark .pagination-next:focus,html.theme--documenter-dark .pagination-link:focus{border-color:#8c9b9d}html.theme--documenter-dark .pagination-previous:active,html.theme--documenter-dark .pagination-next:active,html.theme--documenter-dark .pagination-link:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2)}html.theme--documenter-dark .pagination-previous[disabled],html.theme--documenter-dark .pagination-next[disabled],html.theme--documenter-dark .pagination-link[disabled]{background-color:#dbdee0;border-color:#dbdee0;box-shadow:none;color:#5e6d6f;opacity:0.5}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next{padding-left:0.75em;padding-right:0.75em;white-space:nowrap}html.theme--documenter-dark .pagination-link.is-current{background-color:#1abc9c;border-color:#1abc9c;color:#fff}html.theme--documenter-dark .pagination-ellipsis{color:#8c9b9d;pointer-events:none}html.theme--documenter-dark .pagination-list{flex-wrap:wrap}@media screen and (max-width: 768px){html.theme--documenter-dark .pagination{flex-wrap:wrap}html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .pagination-next{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}html.theme--documenter-dark .pagination-previous{order:2}html.theme--documenter-dark .pagination-next{order:3}html.theme--documenter-dark .pagination{justify-content:space-between}html.theme--documenter-dark .pagination.is-centered .pagination-previous{order:1}html.theme--documenter-dark .pagination.is-centered .pagination-list{justify-content:center;order:2}html.theme--documenter-dark .pagination.is-centered .pagination-next{order:3}html.theme--documenter-dark .pagination.is-right .pagination-previous{order:1}html.theme--documenter-dark .pagination.is-right .pagination-next{order:2}html.theme--documenter-dark .pagination.is-right .pagination-list{justify-content:flex-end;order:3}}html.theme--documenter-dark .panel{font-size:15px}html.theme--documenter-dark .panel:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .panel-heading,html.theme--documenter-dark .panel-tabs,html.theme--documenter-dark .panel-block{border-bottom:1px solid #5e6d6f;border-left:1px solid #5e6d6f;border-right:1px solid #5e6d6f}html.theme--documenter-dark .panel-heading:first-child,html.theme--documenter-dark .panel-tabs:first-child,html.theme--documenter-dark .panel-block:first-child{border-top:1px solid #5e6d6f}html.theme--documenter-dark .panel-heading{background-color:#282f2f;border-radius:.4em .4em 0 0;color:#f2f2f2;font-size:1.25em;font-weight:300;line-height:1.25;padding:0.5em 0.75em}html.theme--documenter-dark .panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}html.theme--documenter-dark .panel-tabs a{border-bottom:1px solid #5e6d6f;margin-bottom:-1px;padding:0.5em}html.theme--documenter-dark .panel-tabs a.is-active{border-bottom-color:#343c3d;color:#17a689}html.theme--documenter-dark .panel-list a{color:#fff}html.theme--documenter-dark .panel-list a:hover{color:#1abc9c}html.theme--documenter-dark .panel-block{align-items:center;color:#f2f2f2;display:flex;justify-content:flex-start;padding:0.5em 0.75em}html.theme--documenter-dark .panel-block input[type="checkbox"]{margin-right:0.75em}html.theme--documenter-dark .panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}html.theme--documenter-dark .panel-block.is-wrapped{flex-wrap:wrap}html.theme--documenter-dark .panel-block.is-active{border-left-color:#1abc9c;color:#17a689}html.theme--documenter-dark .panel-block.is-active .panel-icon{color:#1abc9c}html.theme--documenter-dark a.panel-block,html.theme--documenter-dark label.panel-block{cursor:pointer}html.theme--documenter-dark a.panel-block:hover,html.theme--documenter-dark label.panel-block:hover{background-color:#282f2f}html.theme--documenter-dark .panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#fff;margin-right:0.75em}html.theme--documenter-dark .panel-icon .fa{font-size:inherit;line-height:inherit}html.theme--documenter-dark .tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:15px;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}html.theme--documenter-dark .tabs a{align-items:center;border-bottom-color:#5e6d6f;border-bottom-style:solid;border-bottom-width:1px;color:#fff;display:flex;justify-content:center;margin-bottom:-1px;padding:0.5em 1em;vertical-align:top}html.theme--documenter-dark .tabs a:hover{border-bottom-color:#f2f2f2;color:#f2f2f2}html.theme--documenter-dark .tabs li{display:block}html.theme--documenter-dark .tabs li.is-active a{border-bottom-color:#1abc9c;color:#1abc9c}html.theme--documenter-dark .tabs ul{align-items:center;border-bottom-color:#5e6d6f;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}html.theme--documenter-dark .tabs ul.is-left{padding-right:0.75em}html.theme--documenter-dark .tabs ul.is-center{flex:none;justify-content:center;padding-left:0.75em;padding-right:0.75em}html.theme--documenter-dark .tabs ul.is-right{justify-content:flex-end;padding-left:0.75em}html.theme--documenter-dark .tabs .icon:first-child{margin-right:0.5em}html.theme--documenter-dark .tabs .icon:last-child{margin-left:0.5em}html.theme--documenter-dark .tabs.is-centered ul{justify-content:center}html.theme--documenter-dark .tabs.is-right ul{justify-content:flex-end}html.theme--documenter-dark .tabs.is-boxed a{border:1px solid transparent;border-radius:.4em .4em 0 0}html.theme--documenter-dark .tabs.is-boxed a:hover{background-color:#282f2f;border-bottom-color:#5e6d6f}html.theme--documenter-dark .tabs.is-boxed li.is-active a{background-color:#fff;border-color:#5e6d6f;border-bottom-color:rgba(0,0,0,0) !important}html.theme--documenter-dark .tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}html.theme--documenter-dark .tabs.is-toggle a{border-color:#5e6d6f;border-style:solid;border-width:1px;margin-bottom:0;position:relative}html.theme--documenter-dark .tabs.is-toggle a:hover{background-color:#282f2f;border-color:#8c9b9d;z-index:2}html.theme--documenter-dark .tabs.is-toggle li+li{margin-left:-1px}html.theme--documenter-dark .tabs.is-toggle li:first-child a{border-radius:.4em 0 0 .4em}html.theme--documenter-dark .tabs.is-toggle li:last-child a{border-radius:0 .4em .4em 0}html.theme--documenter-dark .tabs.is-toggle li.is-active a{background-color:#1abc9c;border-color:#1abc9c;color:#fff;z-index:1}html.theme--documenter-dark .tabs.is-toggle ul{border-bottom:none}html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:290486px;border-top-left-radius:290486px;padding-left:1.25em}html.theme--documenter-dark .tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:290486px;border-top-right-radius:290486px;padding-right:1.25em}html.theme--documenter-dark .tabs.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.tabs{font-size:.85em}html.theme--documenter-dark .tabs.is-medium{font-size:1.25rem}html.theme--documenter-dark .tabs.is-large{font-size:1.5rem}html.theme--documenter-dark .column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>html.theme--documenter-dark .column.is-narrow{flex:none}.columns.is-mobile>html.theme--documenter-dark .column.is-full{flex:none;width:100%}.columns.is-mobile>html.theme--documenter-dark .column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>html.theme--documenter-dark .column.is-half{flex:none;width:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>html.theme--documenter-dark .column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>html.theme--documenter-dark .column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>html.theme--documenter-dark .column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-half{margin-left:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>html.theme--documenter-dark .column.is-0{flex:none;width:0%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-0{margin-left:0%}.columns.is-mobile>html.theme--documenter-dark .column.is-1{flex:none;width:8.3333333333%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-1{margin-left:8.3333333333%}.columns.is-mobile>html.theme--documenter-dark .column.is-2{flex:none;width:16.6666666667%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-2{margin-left:16.6666666667%}.columns.is-mobile>html.theme--documenter-dark .column.is-3{flex:none;width:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-3{margin-left:25%}.columns.is-mobile>html.theme--documenter-dark .column.is-4{flex:none;width:33.3333333333%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-4{margin-left:33.3333333333%}.columns.is-mobile>html.theme--documenter-dark .column.is-5{flex:none;width:41.6666666667%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-5{margin-left:41.6666666667%}.columns.is-mobile>html.theme--documenter-dark .column.is-6{flex:none;width:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-6{margin-left:50%}.columns.is-mobile>html.theme--documenter-dark .column.is-7{flex:none;width:58.3333333333%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-7{margin-left:58.3333333333%}.columns.is-mobile>html.theme--documenter-dark .column.is-8{flex:none;width:66.6666666667%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-8{margin-left:66.6666666667%}.columns.is-mobile>html.theme--documenter-dark .column.is-9{flex:none;width:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-9{margin-left:75%}.columns.is-mobile>html.theme--documenter-dark .column.is-10{flex:none;width:83.3333333333%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-10{margin-left:83.3333333333%}.columns.is-mobile>html.theme--documenter-dark .column.is-11{flex:none;width:91.6666666667%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-11{margin-left:91.6666666667%}.columns.is-mobile>html.theme--documenter-dark .column.is-12{flex:none;width:100%}.columns.is-mobile>html.theme--documenter-dark .column.is-offset-12{margin-left:100%}@media screen and (max-width: 768px){html.theme--documenter-dark .column.is-narrow-mobile{flex:none}html.theme--documenter-dark .column.is-full-mobile{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-mobile{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-mobile{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-mobile{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-mobile{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-mobile{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-mobile{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-mobile{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-mobile{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-mobile{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-mobile{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-mobile{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-mobile{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-mobile{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-mobile{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-mobile{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-mobile{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-mobile{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-mobile{margin-left:80%}html.theme--documenter-dark .column.is-0-mobile{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-mobile{margin-left:0%}html.theme--documenter-dark .column.is-1-mobile{flex:none;width:8.3333333333%}html.theme--documenter-dark .column.is-offset-1-mobile{margin-left:8.3333333333%}html.theme--documenter-dark .column.is-2-mobile{flex:none;width:16.6666666667%}html.theme--documenter-dark .column.is-offset-2-mobile{margin-left:16.6666666667%}html.theme--documenter-dark .column.is-3-mobile{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-mobile{margin-left:25%}html.theme--documenter-dark .column.is-4-mobile{flex:none;width:33.3333333333%}html.theme--documenter-dark .column.is-offset-4-mobile{margin-left:33.3333333333%}html.theme--documenter-dark .column.is-5-mobile{flex:none;width:41.6666666667%}html.theme--documenter-dark .column.is-offset-5-mobile{margin-left:41.6666666667%}html.theme--documenter-dark .column.is-6-mobile{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-mobile{margin-left:50%}html.theme--documenter-dark .column.is-7-mobile{flex:none;width:58.3333333333%}html.theme--documenter-dark .column.is-offset-7-mobile{margin-left:58.3333333333%}html.theme--documenter-dark .column.is-8-mobile{flex:none;width:66.6666666667%}html.theme--documenter-dark .column.is-offset-8-mobile{margin-left:66.6666666667%}html.theme--documenter-dark .column.is-9-mobile{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-mobile{margin-left:75%}html.theme--documenter-dark .column.is-10-mobile{flex:none;width:83.3333333333%}html.theme--documenter-dark .column.is-offset-10-mobile{margin-left:83.3333333333%}html.theme--documenter-dark .column.is-11-mobile{flex:none;width:91.6666666667%}html.theme--documenter-dark .column.is-offset-11-mobile{margin-left:91.6666666667%}html.theme--documenter-dark .column.is-12-mobile{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .column.is-narrow,html.theme--documenter-dark .column.is-narrow-tablet{flex:none}html.theme--documenter-dark .column.is-full,html.theme--documenter-dark .column.is-full-tablet{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters,html.theme--documenter-dark .column.is-three-quarters-tablet{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds,html.theme--documenter-dark .column.is-two-thirds-tablet{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half,html.theme--documenter-dark .column.is-half-tablet{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third,html.theme--documenter-dark .column.is-one-third-tablet{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter,html.theme--documenter-dark .column.is-one-quarter-tablet{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth,html.theme--documenter-dark .column.is-one-fifth-tablet{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths,html.theme--documenter-dark .column.is-two-fifths-tablet{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths,html.theme--documenter-dark .column.is-three-fifths-tablet{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths,html.theme--documenter-dark .column.is-four-fifths-tablet{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters,html.theme--documenter-dark .column.is-offset-three-quarters-tablet{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds,html.theme--documenter-dark .column.is-offset-two-thirds-tablet{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half,html.theme--documenter-dark .column.is-offset-half-tablet{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third,html.theme--documenter-dark .column.is-offset-one-third-tablet{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter,html.theme--documenter-dark .column.is-offset-one-quarter-tablet{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth,html.theme--documenter-dark .column.is-offset-one-fifth-tablet{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths,html.theme--documenter-dark .column.is-offset-two-fifths-tablet{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths,html.theme--documenter-dark .column.is-offset-three-fifths-tablet{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths,html.theme--documenter-dark .column.is-offset-four-fifths-tablet{margin-left:80%}html.theme--documenter-dark .column.is-0,html.theme--documenter-dark .column.is-0-tablet{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0,html.theme--documenter-dark .column.is-offset-0-tablet{margin-left:0%}html.theme--documenter-dark .column.is-1,html.theme--documenter-dark .column.is-1-tablet{flex:none;width:8.3333333333%}html.theme--documenter-dark .column.is-offset-1,html.theme--documenter-dark .column.is-offset-1-tablet{margin-left:8.3333333333%}html.theme--documenter-dark .column.is-2,html.theme--documenter-dark .column.is-2-tablet{flex:none;width:16.6666666667%}html.theme--documenter-dark .column.is-offset-2,html.theme--documenter-dark .column.is-offset-2-tablet{margin-left:16.6666666667%}html.theme--documenter-dark .column.is-3,html.theme--documenter-dark .column.is-3-tablet{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3,html.theme--documenter-dark .column.is-offset-3-tablet{margin-left:25%}html.theme--documenter-dark .column.is-4,html.theme--documenter-dark .column.is-4-tablet{flex:none;width:33.3333333333%}html.theme--documenter-dark .column.is-offset-4,html.theme--documenter-dark .column.is-offset-4-tablet{margin-left:33.3333333333%}html.theme--documenter-dark .column.is-5,html.theme--documenter-dark .column.is-5-tablet{flex:none;width:41.6666666667%}html.theme--documenter-dark .column.is-offset-5,html.theme--documenter-dark .column.is-offset-5-tablet{margin-left:41.6666666667%}html.theme--documenter-dark .column.is-6,html.theme--documenter-dark .column.is-6-tablet{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6,html.theme--documenter-dark .column.is-offset-6-tablet{margin-left:50%}html.theme--documenter-dark .column.is-7,html.theme--documenter-dark .column.is-7-tablet{flex:none;width:58.3333333333%}html.theme--documenter-dark .column.is-offset-7,html.theme--documenter-dark .column.is-offset-7-tablet{margin-left:58.3333333333%}html.theme--documenter-dark .column.is-8,html.theme--documenter-dark .column.is-8-tablet{flex:none;width:66.6666666667%}html.theme--documenter-dark .column.is-offset-8,html.theme--documenter-dark .column.is-offset-8-tablet{margin-left:66.6666666667%}html.theme--documenter-dark .column.is-9,html.theme--documenter-dark .column.is-9-tablet{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9,html.theme--documenter-dark .column.is-offset-9-tablet{margin-left:75%}html.theme--documenter-dark .column.is-10,html.theme--documenter-dark .column.is-10-tablet{flex:none;width:83.3333333333%}html.theme--documenter-dark .column.is-offset-10,html.theme--documenter-dark .column.is-offset-10-tablet{margin-left:83.3333333333%}html.theme--documenter-dark .column.is-11,html.theme--documenter-dark .column.is-11-tablet{flex:none;width:91.6666666667%}html.theme--documenter-dark .column.is-offset-11,html.theme--documenter-dark .column.is-offset-11-tablet{margin-left:91.6666666667%}html.theme--documenter-dark .column.is-12,html.theme--documenter-dark .column.is-12-tablet{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12,html.theme--documenter-dark .column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width: 1055px){html.theme--documenter-dark .column.is-narrow-touch{flex:none}html.theme--documenter-dark .column.is-full-touch{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-touch{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-touch{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-touch{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-touch{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-touch{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-touch{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-touch{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-touch{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-touch{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-touch{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-touch{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-touch{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-touch{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-touch{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-touch{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-touch{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-touch{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-touch{margin-left:80%}html.theme--documenter-dark .column.is-0-touch{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-touch{margin-left:0%}html.theme--documenter-dark .column.is-1-touch{flex:none;width:8.3333333333%}html.theme--documenter-dark .column.is-offset-1-touch{margin-left:8.3333333333%}html.theme--documenter-dark .column.is-2-touch{flex:none;width:16.6666666667%}html.theme--documenter-dark .column.is-offset-2-touch{margin-left:16.6666666667%}html.theme--documenter-dark .column.is-3-touch{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-touch{margin-left:25%}html.theme--documenter-dark .column.is-4-touch{flex:none;width:33.3333333333%}html.theme--documenter-dark .column.is-offset-4-touch{margin-left:33.3333333333%}html.theme--documenter-dark .column.is-5-touch{flex:none;width:41.6666666667%}html.theme--documenter-dark .column.is-offset-5-touch{margin-left:41.6666666667%}html.theme--documenter-dark .column.is-6-touch{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-touch{margin-left:50%}html.theme--documenter-dark .column.is-7-touch{flex:none;width:58.3333333333%}html.theme--documenter-dark .column.is-offset-7-touch{margin-left:58.3333333333%}html.theme--documenter-dark .column.is-8-touch{flex:none;width:66.6666666667%}html.theme--documenter-dark .column.is-offset-8-touch{margin-left:66.6666666667%}html.theme--documenter-dark .column.is-9-touch{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-touch{margin-left:75%}html.theme--documenter-dark .column.is-10-touch{flex:none;width:83.3333333333%}html.theme--documenter-dark .column.is-offset-10-touch{margin-left:83.3333333333%}html.theme--documenter-dark .column.is-11-touch{flex:none;width:91.6666666667%}html.theme--documenter-dark .column.is-offset-11-touch{margin-left:91.6666666667%}html.theme--documenter-dark .column.is-12-touch{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width: 1056px){html.theme--documenter-dark .column.is-narrow-desktop{flex:none}html.theme--documenter-dark .column.is-full-desktop{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-desktop{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-desktop{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-desktop{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-desktop{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-desktop{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-desktop{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-desktop{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-desktop{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-desktop{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-desktop{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-desktop{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-desktop{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-desktop{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-desktop{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-desktop{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-desktop{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-desktop{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-desktop{margin-left:80%}html.theme--documenter-dark .column.is-0-desktop{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-desktop{margin-left:0%}html.theme--documenter-dark .column.is-1-desktop{flex:none;width:8.3333333333%}html.theme--documenter-dark .column.is-offset-1-desktop{margin-left:8.3333333333%}html.theme--documenter-dark .column.is-2-desktop{flex:none;width:16.6666666667%}html.theme--documenter-dark .column.is-offset-2-desktop{margin-left:16.6666666667%}html.theme--documenter-dark .column.is-3-desktop{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-desktop{margin-left:25%}html.theme--documenter-dark .column.is-4-desktop{flex:none;width:33.3333333333%}html.theme--documenter-dark .column.is-offset-4-desktop{margin-left:33.3333333333%}html.theme--documenter-dark .column.is-5-desktop{flex:none;width:41.6666666667%}html.theme--documenter-dark .column.is-offset-5-desktop{margin-left:41.6666666667%}html.theme--documenter-dark .column.is-6-desktop{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-desktop{margin-left:50%}html.theme--documenter-dark .column.is-7-desktop{flex:none;width:58.3333333333%}html.theme--documenter-dark .column.is-offset-7-desktop{margin-left:58.3333333333%}html.theme--documenter-dark .column.is-8-desktop{flex:none;width:66.6666666667%}html.theme--documenter-dark .column.is-offset-8-desktop{margin-left:66.6666666667%}html.theme--documenter-dark .column.is-9-desktop{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-desktop{margin-left:75%}html.theme--documenter-dark .column.is-10-desktop{flex:none;width:83.3333333333%}html.theme--documenter-dark .column.is-offset-10-desktop{margin-left:83.3333333333%}html.theme--documenter-dark .column.is-11-desktop{flex:none;width:91.6666666667%}html.theme--documenter-dark .column.is-offset-11-desktop{margin-left:91.6666666667%}html.theme--documenter-dark .column.is-12-desktop{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width: 1216px){html.theme--documenter-dark .column.is-narrow-widescreen{flex:none}html.theme--documenter-dark .column.is-full-widescreen{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-widescreen{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-widescreen{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-widescreen{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-widescreen{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-widescreen{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-widescreen{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-widescreen{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-widescreen{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-widescreen{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-widescreen{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-widescreen{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-widescreen{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-widescreen{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-widescreen{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-widescreen{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-widescreen{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-widescreen{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-widescreen{margin-left:80%}html.theme--documenter-dark .column.is-0-widescreen{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-widescreen{margin-left:0%}html.theme--documenter-dark .column.is-1-widescreen{flex:none;width:8.3333333333%}html.theme--documenter-dark .column.is-offset-1-widescreen{margin-left:8.3333333333%}html.theme--documenter-dark .column.is-2-widescreen{flex:none;width:16.6666666667%}html.theme--documenter-dark .column.is-offset-2-widescreen{margin-left:16.6666666667%}html.theme--documenter-dark .column.is-3-widescreen{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-widescreen{margin-left:25%}html.theme--documenter-dark .column.is-4-widescreen{flex:none;width:33.3333333333%}html.theme--documenter-dark .column.is-offset-4-widescreen{margin-left:33.3333333333%}html.theme--documenter-dark .column.is-5-widescreen{flex:none;width:41.6666666667%}html.theme--documenter-dark .column.is-offset-5-widescreen{margin-left:41.6666666667%}html.theme--documenter-dark .column.is-6-widescreen{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-widescreen{margin-left:50%}html.theme--documenter-dark .column.is-7-widescreen{flex:none;width:58.3333333333%}html.theme--documenter-dark .column.is-offset-7-widescreen{margin-left:58.3333333333%}html.theme--documenter-dark .column.is-8-widescreen{flex:none;width:66.6666666667%}html.theme--documenter-dark .column.is-offset-8-widescreen{margin-left:66.6666666667%}html.theme--documenter-dark .column.is-9-widescreen{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-widescreen{margin-left:75%}html.theme--documenter-dark .column.is-10-widescreen{flex:none;width:83.3333333333%}html.theme--documenter-dark .column.is-offset-10-widescreen{margin-left:83.3333333333%}html.theme--documenter-dark .column.is-11-widescreen{flex:none;width:91.6666666667%}html.theme--documenter-dark .column.is-offset-11-widescreen{margin-left:91.6666666667%}html.theme--documenter-dark .column.is-12-widescreen{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width: 1408px){html.theme--documenter-dark .column.is-narrow-fullhd{flex:none}html.theme--documenter-dark .column.is-full-fullhd{flex:none;width:100%}html.theme--documenter-dark .column.is-three-quarters-fullhd{flex:none;width:75%}html.theme--documenter-dark .column.is-two-thirds-fullhd{flex:none;width:66.6666%}html.theme--documenter-dark .column.is-half-fullhd{flex:none;width:50%}html.theme--documenter-dark .column.is-one-third-fullhd{flex:none;width:33.3333%}html.theme--documenter-dark .column.is-one-quarter-fullhd{flex:none;width:25%}html.theme--documenter-dark .column.is-one-fifth-fullhd{flex:none;width:20%}html.theme--documenter-dark .column.is-two-fifths-fullhd{flex:none;width:40%}html.theme--documenter-dark .column.is-three-fifths-fullhd{flex:none;width:60%}html.theme--documenter-dark .column.is-four-fifths-fullhd{flex:none;width:80%}html.theme--documenter-dark .column.is-offset-three-quarters-fullhd{margin-left:75%}html.theme--documenter-dark .column.is-offset-two-thirds-fullhd{margin-left:66.6666%}html.theme--documenter-dark .column.is-offset-half-fullhd{margin-left:50%}html.theme--documenter-dark .column.is-offset-one-third-fullhd{margin-left:33.3333%}html.theme--documenter-dark .column.is-offset-one-quarter-fullhd{margin-left:25%}html.theme--documenter-dark .column.is-offset-one-fifth-fullhd{margin-left:20%}html.theme--documenter-dark .column.is-offset-two-fifths-fullhd{margin-left:40%}html.theme--documenter-dark .column.is-offset-three-fifths-fullhd{margin-left:60%}html.theme--documenter-dark .column.is-offset-four-fifths-fullhd{margin-left:80%}html.theme--documenter-dark .column.is-0-fullhd{flex:none;width:0%}html.theme--documenter-dark .column.is-offset-0-fullhd{margin-left:0%}html.theme--documenter-dark .column.is-1-fullhd{flex:none;width:8.3333333333%}html.theme--documenter-dark .column.is-offset-1-fullhd{margin-left:8.3333333333%}html.theme--documenter-dark .column.is-2-fullhd{flex:none;width:16.6666666667%}html.theme--documenter-dark .column.is-offset-2-fullhd{margin-left:16.6666666667%}html.theme--documenter-dark .column.is-3-fullhd{flex:none;width:25%}html.theme--documenter-dark .column.is-offset-3-fullhd{margin-left:25%}html.theme--documenter-dark .column.is-4-fullhd{flex:none;width:33.3333333333%}html.theme--documenter-dark .column.is-offset-4-fullhd{margin-left:33.3333333333%}html.theme--documenter-dark .column.is-5-fullhd{flex:none;width:41.6666666667%}html.theme--documenter-dark .column.is-offset-5-fullhd{margin-left:41.6666666667%}html.theme--documenter-dark .column.is-6-fullhd{flex:none;width:50%}html.theme--documenter-dark .column.is-offset-6-fullhd{margin-left:50%}html.theme--documenter-dark .column.is-7-fullhd{flex:none;width:58.3333333333%}html.theme--documenter-dark .column.is-offset-7-fullhd{margin-left:58.3333333333%}html.theme--documenter-dark .column.is-8-fullhd{flex:none;width:66.6666666667%}html.theme--documenter-dark .column.is-offset-8-fullhd{margin-left:66.6666666667%}html.theme--documenter-dark .column.is-9-fullhd{flex:none;width:75%}html.theme--documenter-dark .column.is-offset-9-fullhd{margin-left:75%}html.theme--documenter-dark .column.is-10-fullhd{flex:none;width:83.3333333333%}html.theme--documenter-dark .column.is-offset-10-fullhd{margin-left:83.3333333333%}html.theme--documenter-dark .column.is-11-fullhd{flex:none;width:91.6666666667%}html.theme--documenter-dark .column.is-offset-11-fullhd{margin-left:91.6666666667%}html.theme--documenter-dark .column.is-12-fullhd{flex:none;width:100%}html.theme--documenter-dark .column.is-offset-12-fullhd{margin-left:100%}}html.theme--documenter-dark .columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}html.theme--documenter-dark .columns:last-child{margin-bottom:-.75rem}html.theme--documenter-dark .columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}html.theme--documenter-dark .columns.is-centered{justify-content:center}html.theme--documenter-dark .columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}html.theme--documenter-dark .columns.is-gapless>.column{margin:0;padding:0 !important}html.theme--documenter-dark .columns.is-gapless:not(:last-child){margin-bottom:1.5rem}html.theme--documenter-dark .columns.is-gapless:last-child{margin-bottom:0}html.theme--documenter-dark .columns.is-mobile{display:flex}html.theme--documenter-dark .columns.is-multiline{flex-wrap:wrap}html.theme--documenter-dark .columns.is-vcentered{align-items:center}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns:not(.is-desktop){display:flex}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-desktop{display:flex}}html.theme--documenter-dark .columns.is-variable{--columnGap: 0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}html.theme--documenter-dark .columns.is-variable .column{padding-left:var(--columnGap);padding-right:var(--columnGap)}html.theme--documenter-dark .columns.is-variable.is-0{--columnGap: 0rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-0-mobile{--columnGap: 0rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-0-tablet{--columnGap: 0rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-0-tablet-only{--columnGap: 0rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-0-touch{--columnGap: 0rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-0-desktop{--columnGap: 0rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-0-desktop-only{--columnGap: 0rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-0-widescreen{--columnGap: 0rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-0-widescreen-only{--columnGap: 0rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-0-fullhd{--columnGap: 0rem}}html.theme--documenter-dark .columns.is-variable.is-1{--columnGap: .25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-1-mobile{--columnGap: .25rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-1-tablet{--columnGap: .25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-1-tablet-only{--columnGap: .25rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-1-touch{--columnGap: .25rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-1-desktop{--columnGap: .25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-1-desktop-only{--columnGap: .25rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-1-widescreen{--columnGap: .25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-1-widescreen-only{--columnGap: .25rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-1-fullhd{--columnGap: .25rem}}html.theme--documenter-dark .columns.is-variable.is-2{--columnGap: .5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-2-mobile{--columnGap: .5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-2-tablet{--columnGap: .5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-2-tablet-only{--columnGap: .5rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-2-touch{--columnGap: .5rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-2-desktop{--columnGap: .5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-2-desktop-only{--columnGap: .5rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-2-widescreen{--columnGap: .5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-2-widescreen-only{--columnGap: .5rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-2-fullhd{--columnGap: .5rem}}html.theme--documenter-dark .columns.is-variable.is-3{--columnGap: .75rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-3-mobile{--columnGap: .75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-3-tablet{--columnGap: .75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-3-tablet-only{--columnGap: .75rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-3-touch{--columnGap: .75rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-3-desktop{--columnGap: .75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-3-desktop-only{--columnGap: .75rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-3-widescreen{--columnGap: .75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-3-widescreen-only{--columnGap: .75rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-3-fullhd{--columnGap: .75rem}}html.theme--documenter-dark .columns.is-variable.is-4{--columnGap: 1rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-4-mobile{--columnGap: 1rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-4-tablet{--columnGap: 1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-4-tablet-only{--columnGap: 1rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-4-touch{--columnGap: 1rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-4-desktop{--columnGap: 1rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-4-desktop-only{--columnGap: 1rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-4-widescreen{--columnGap: 1rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-4-widescreen-only{--columnGap: 1rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-4-fullhd{--columnGap: 1rem}}html.theme--documenter-dark .columns.is-variable.is-5{--columnGap: 1.25rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-5-mobile{--columnGap: 1.25rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-5-tablet{--columnGap: 1.25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-5-tablet-only{--columnGap: 1.25rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-5-touch{--columnGap: 1.25rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-5-desktop{--columnGap: 1.25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-5-desktop-only{--columnGap: 1.25rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-5-widescreen{--columnGap: 1.25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-5-widescreen-only{--columnGap: 1.25rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-5-fullhd{--columnGap: 1.25rem}}html.theme--documenter-dark .columns.is-variable.is-6{--columnGap: 1.5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-6-mobile{--columnGap: 1.5rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-6-tablet{--columnGap: 1.5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-6-tablet-only{--columnGap: 1.5rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-6-touch{--columnGap: 1.5rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-6-desktop{--columnGap: 1.5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-6-desktop-only{--columnGap: 1.5rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-6-widescreen{--columnGap: 1.5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-6-widescreen-only{--columnGap: 1.5rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-6-fullhd{--columnGap: 1.5rem}}html.theme--documenter-dark .columns.is-variable.is-7{--columnGap: 1.75rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-7-mobile{--columnGap: 1.75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-7-tablet{--columnGap: 1.75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-7-tablet-only{--columnGap: 1.75rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-7-touch{--columnGap: 1.75rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-7-desktop{--columnGap: 1.75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-7-desktop-only{--columnGap: 1.75rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-7-widescreen{--columnGap: 1.75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-7-widescreen-only{--columnGap: 1.75rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-7-fullhd{--columnGap: 1.75rem}}html.theme--documenter-dark .columns.is-variable.is-8{--columnGap: 2rem}@media screen and (max-width: 768px){html.theme--documenter-dark .columns.is-variable.is-8-mobile{--columnGap: 2rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .columns.is-variable.is-8-tablet{--columnGap: 2rem}}@media screen and (min-width: 769px) and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-8-tablet-only{--columnGap: 2rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark .columns.is-variable.is-8-touch{--columnGap: 2rem}}@media screen and (min-width: 1056px){html.theme--documenter-dark .columns.is-variable.is-8-desktop{--columnGap: 2rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){html.theme--documenter-dark .columns.is-variable.is-8-desktop-only{--columnGap: 2rem}}@media screen and (min-width: 1216px){html.theme--documenter-dark .columns.is-variable.is-8-widescreen{--columnGap: 2rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){html.theme--documenter-dark .columns.is-variable.is-8-widescreen-only{--columnGap: 2rem}}@media screen and (min-width: 1408px){html.theme--documenter-dark .columns.is-variable.is-8-fullhd{--columnGap: 2rem}}html.theme--documenter-dark .tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:min-content}html.theme--documenter-dark .tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}html.theme--documenter-dark .tile.is-ancestor:last-child{margin-bottom:-.75rem}html.theme--documenter-dark .tile.is-ancestor:not(:last-child){margin-bottom:.75rem}html.theme--documenter-dark .tile.is-child{margin:0 !important}html.theme--documenter-dark .tile.is-parent{padding:.75rem}html.theme--documenter-dark .tile.is-vertical{flex-direction:column}html.theme--documenter-dark .tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem !important}@media screen and (min-width: 769px),print{html.theme--documenter-dark .tile:not(.is-child){display:flex}html.theme--documenter-dark .tile.is-1{flex:none;width:8.3333333333%}html.theme--documenter-dark .tile.is-2{flex:none;width:16.6666666667%}html.theme--documenter-dark .tile.is-3{flex:none;width:25%}html.theme--documenter-dark .tile.is-4{flex:none;width:33.3333333333%}html.theme--documenter-dark .tile.is-5{flex:none;width:41.6666666667%}html.theme--documenter-dark .tile.is-6{flex:none;width:50%}html.theme--documenter-dark .tile.is-7{flex:none;width:58.3333333333%}html.theme--documenter-dark .tile.is-8{flex:none;width:66.6666666667%}html.theme--documenter-dark .tile.is-9{flex:none;width:75%}html.theme--documenter-dark .tile.is-10{flex:none;width:83.3333333333%}html.theme--documenter-dark .tile.is-11{flex:none;width:91.6666666667%}html.theme--documenter-dark .tile.is-12{flex:none;width:100%}}html.theme--documenter-dark .hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}html.theme--documenter-dark .hero .navbar{background:none}html.theme--documenter-dark .hero .tabs ul{border-bottom:none}html.theme--documenter-dark .hero.is-white{background-color:#fff;color:#0a0a0a}html.theme--documenter-dark .hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-white strong{color:inherit}html.theme--documenter-dark .hero.is-white .title{color:#0a0a0a}html.theme--documenter-dark .hero.is-white .subtitle{color:rgba(10,10,10,0.9)}html.theme--documenter-dark .hero.is-white .subtitle a:not(.button),html.theme--documenter-dark .hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-white .navbar-menu{background-color:#fff}}html.theme--documenter-dark .hero.is-white .navbar-item,html.theme--documenter-dark .hero.is-white .navbar-link{color:rgba(10,10,10,0.7)}html.theme--documenter-dark .hero.is-white a.navbar-item:hover,html.theme--documenter-dark .hero.is-white a.navbar-item.is-active,html.theme--documenter-dark .hero.is-white .navbar-link:hover,html.theme--documenter-dark .hero.is-white .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}html.theme--documenter-dark .hero.is-white .tabs a{color:#0a0a0a;opacity:0.9}html.theme--documenter-dark .hero.is-white .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-white .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-white .tabs.is-boxed a,html.theme--documenter-dark .hero.is-white .tabs.is-toggle a{color:#0a0a0a}html.theme--documenter-dark .hero.is-white .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-white .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}html.theme--documenter-dark .hero.is-white.is-bold{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}}html.theme--documenter-dark .hero.is-black{background-color:#0a0a0a;color:#fff}html.theme--documenter-dark .hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-black strong{color:inherit}html.theme--documenter-dark .hero.is-black .title{color:#fff}html.theme--documenter-dark .hero.is-black .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-black .subtitle a:not(.button),html.theme--documenter-dark .hero.is-black .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-black .navbar-menu{background-color:#0a0a0a}}html.theme--documenter-dark .hero.is-black .navbar-item,html.theme--documenter-dark .hero.is-black .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-black a.navbar-item:hover,html.theme--documenter-dark .hero.is-black a.navbar-item.is-active,html.theme--documenter-dark .hero.is-black .navbar-link:hover,html.theme--documenter-dark .hero.is-black .navbar-link.is-active{background-color:#000;color:#fff}html.theme--documenter-dark .hero.is-black .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-black .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-black .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-black .tabs.is-boxed a,html.theme--documenter-dark .hero.is-black .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-black .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-black .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}html.theme--documenter-dark .hero.is-black.is-bold{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}}html.theme--documenter-dark .hero.is-light{background-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-light strong{color:inherit}html.theme--documenter-dark .hero.is-light .title{color:#282f2f}html.theme--documenter-dark .hero.is-light .subtitle{color:rgba(40,47,47,0.9)}html.theme--documenter-dark .hero.is-light .subtitle a:not(.button),html.theme--documenter-dark .hero.is-light .subtitle strong{color:#282f2f}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-light .navbar-menu{background-color:#ecf0f1}}html.theme--documenter-dark .hero.is-light .navbar-item,html.theme--documenter-dark .hero.is-light .navbar-link{color:rgba(40,47,47,0.7)}html.theme--documenter-dark .hero.is-light a.navbar-item:hover,html.theme--documenter-dark .hero.is-light a.navbar-item.is-active,html.theme--documenter-dark .hero.is-light .navbar-link:hover,html.theme--documenter-dark .hero.is-light .navbar-link.is-active{background-color:#dde4e6;color:#282f2f}html.theme--documenter-dark .hero.is-light .tabs a{color:#282f2f;opacity:0.9}html.theme--documenter-dark .hero.is-light .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-light .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-light .tabs.is-boxed a,html.theme--documenter-dark .hero.is-light .tabs.is-toggle a{color:#282f2f}html.theme--documenter-dark .hero.is-light .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-light .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:#282f2f;border-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .hero.is-light.is-bold{background-image:linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg, #cadfe0 0%, #ecf0f1 71%, #fafbfc 100%)}}html.theme--documenter-dark .hero.is-dark,html.theme--documenter-dark .content kbd.hero{background-color:#282f2f;color:#ecf0f1}html.theme--documenter-dark .hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-dark strong,html.theme--documenter-dark .content kbd.hero strong{color:inherit}html.theme--documenter-dark .hero.is-dark .title,html.theme--documenter-dark .content kbd.hero .title{color:#ecf0f1}html.theme--documenter-dark .hero.is-dark .subtitle,html.theme--documenter-dark .content kbd.hero .subtitle{color:rgba(236,240,241,0.9)}html.theme--documenter-dark .hero.is-dark .subtitle a:not(.button),html.theme--documenter-dark .content kbd.hero .subtitle a:not(.button),html.theme--documenter-dark .hero.is-dark .subtitle strong,html.theme--documenter-dark .content kbd.hero .subtitle strong{color:#ecf0f1}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-dark .navbar-menu,html.theme--documenter-dark .content kbd.hero .navbar-menu{background-color:#282f2f}}html.theme--documenter-dark .hero.is-dark .navbar-item,html.theme--documenter-dark .content kbd.hero .navbar-item,html.theme--documenter-dark .hero.is-dark .navbar-link,html.theme--documenter-dark .content kbd.hero .navbar-link{color:rgba(236,240,241,0.7)}html.theme--documenter-dark .hero.is-dark a.navbar-item:hover,html.theme--documenter-dark .content kbd.hero a.navbar-item:hover,html.theme--documenter-dark .hero.is-dark a.navbar-item.is-active,html.theme--documenter-dark .content kbd.hero a.navbar-item.is-active,html.theme--documenter-dark .hero.is-dark .navbar-link:hover,html.theme--documenter-dark .content kbd.hero .navbar-link:hover,html.theme--documenter-dark .hero.is-dark .navbar-link.is-active,html.theme--documenter-dark .content kbd.hero .navbar-link.is-active{background-color:#1d2122;color:#ecf0f1}html.theme--documenter-dark .hero.is-dark .tabs a,html.theme--documenter-dark .content kbd.hero .tabs a{color:#ecf0f1;opacity:0.9}html.theme--documenter-dark .hero.is-dark .tabs a:hover,html.theme--documenter-dark .content kbd.hero .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-dark .tabs li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a{color:#ecf0f1}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed a:hover,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle a:hover,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-dark .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a,html.theme--documenter-dark .content kbd.hero .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#ecf0f1;border-color:#ecf0f1;color:#282f2f}html.theme--documenter-dark .hero.is-dark.is-bold,html.theme--documenter-dark .content kbd.hero.is-bold{background-image:linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-dark.is-bold .navbar-menu,html.theme--documenter-dark .content kbd.hero.is-bold .navbar-menu{background-image:linear-gradient(141deg, #0f1615 0%, #282f2f 71%, #313c40 100%)}}html.theme--documenter-dark .hero.is-primary,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink{background-color:#375a7f;color:#fff}html.theme--documenter-dark .hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-primary strong,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink strong{color:inherit}html.theme--documenter-dark .hero.is-primary .title,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .title{color:#fff}html.theme--documenter-dark .hero.is-primary .subtitle,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-primary .subtitle a:not(.button),html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle a:not(.button),html.theme--documenter-dark .hero.is-primary .subtitle strong,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-primary .navbar-menu,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-menu{background-color:#375a7f}}html.theme--documenter-dark .hero.is-primary .navbar-item,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-item,html.theme--documenter-dark .hero.is-primary .navbar-link,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-primary a.navbar-item:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a.navbar-item:hover,html.theme--documenter-dark .hero.is-primary a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink a.navbar-item.is-active,html.theme--documenter-dark .hero.is-primary .navbar-link:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link:hover,html.theme--documenter-dark .hero.is-primary .navbar-link.is-active,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar-link.is-active{background-color:#2f4d6d;color:#fff}html.theme--documenter-dark .hero.is-primary .tabs a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-primary .tabs a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-primary .tabs li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle a:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-primary .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#375a7f}html.theme--documenter-dark .hero.is-primary.is-bold,html.theme--documenter-dark .docstring>section>a.hero.is-bold.docs-sourcelink{background-image:linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-primary.is-bold .navbar-menu,html.theme--documenter-dark .docstring>section>a.hero.is-bold.docs-sourcelink .navbar-menu{background-image:linear-gradient(141deg, #214b62 0%, #375a7f 71%, #3a5796 100%)}}html.theme--documenter-dark .hero.is-link{background-color:#1abc9c;color:#fff}html.theme--documenter-dark .hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-link strong{color:inherit}html.theme--documenter-dark .hero.is-link .title{color:#fff}html.theme--documenter-dark .hero.is-link .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-link .subtitle a:not(.button),html.theme--documenter-dark .hero.is-link .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-link .navbar-menu{background-color:#1abc9c}}html.theme--documenter-dark .hero.is-link .navbar-item,html.theme--documenter-dark .hero.is-link .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-link a.navbar-item:hover,html.theme--documenter-dark .hero.is-link a.navbar-item.is-active,html.theme--documenter-dark .hero.is-link .navbar-link:hover,html.theme--documenter-dark .hero.is-link .navbar-link.is-active{background-color:#17a689;color:#fff}html.theme--documenter-dark .hero.is-link .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-link .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-link .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-link .tabs.is-boxed a,html.theme--documenter-dark .hero.is-link .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-link .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-link .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#1abc9c}html.theme--documenter-dark .hero.is-link.is-bold{background-image:linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg, #0c9764 0%, #1abc9c 71%, #17d8d2 100%)}}html.theme--documenter-dark .hero.is-info{background-color:#024c7d;color:#fff}html.theme--documenter-dark .hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-info strong{color:inherit}html.theme--documenter-dark .hero.is-info .title{color:#fff}html.theme--documenter-dark .hero.is-info .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-info .subtitle a:not(.button),html.theme--documenter-dark .hero.is-info .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-info .navbar-menu{background-color:#024c7d}}html.theme--documenter-dark .hero.is-info .navbar-item,html.theme--documenter-dark .hero.is-info .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-info a.navbar-item:hover,html.theme--documenter-dark .hero.is-info a.navbar-item.is-active,html.theme--documenter-dark .hero.is-info .navbar-link:hover,html.theme--documenter-dark .hero.is-info .navbar-link.is-active{background-color:#023d64;color:#fff}html.theme--documenter-dark .hero.is-info .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-info .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-info .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-info .tabs.is-boxed a,html.theme--documenter-dark .hero.is-info .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-info .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-info .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#024c7d}html.theme--documenter-dark .hero.is-info.is-bold{background-image:linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg, #003a4c 0%, #024c7d 71%, #004299 100%)}}html.theme--documenter-dark .hero.is-success{background-color:#008438;color:#fff}html.theme--documenter-dark .hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-success strong{color:inherit}html.theme--documenter-dark .hero.is-success .title{color:#fff}html.theme--documenter-dark .hero.is-success .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-success .subtitle a:not(.button),html.theme--documenter-dark .hero.is-success .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-success .navbar-menu{background-color:#008438}}html.theme--documenter-dark .hero.is-success .navbar-item,html.theme--documenter-dark .hero.is-success .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-success a.navbar-item:hover,html.theme--documenter-dark .hero.is-success a.navbar-item.is-active,html.theme--documenter-dark .hero.is-success .navbar-link:hover,html.theme--documenter-dark .hero.is-success .navbar-link.is-active{background-color:#006b2d;color:#fff}html.theme--documenter-dark .hero.is-success .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-success .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-success .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-success .tabs.is-boxed a,html.theme--documenter-dark .hero.is-success .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-success .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-success .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#008438}html.theme--documenter-dark .hero.is-success.is-bold{background-image:linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg, #005115 0%, #008438 71%, #009e5d 100%)}}html.theme--documenter-dark .hero.is-warning{background-color:#ad8100;color:#fff}html.theme--documenter-dark .hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-warning strong{color:inherit}html.theme--documenter-dark .hero.is-warning .title{color:#fff}html.theme--documenter-dark .hero.is-warning .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-warning .subtitle a:not(.button),html.theme--documenter-dark .hero.is-warning .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-warning .navbar-menu{background-color:#ad8100}}html.theme--documenter-dark .hero.is-warning .navbar-item,html.theme--documenter-dark .hero.is-warning .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-warning a.navbar-item:hover,html.theme--documenter-dark .hero.is-warning a.navbar-item.is-active,html.theme--documenter-dark .hero.is-warning .navbar-link:hover,html.theme--documenter-dark .hero.is-warning .navbar-link.is-active{background-color:#946e00;color:#fff}html.theme--documenter-dark .hero.is-warning .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-warning .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-warning .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-warning .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#ad8100}html.theme--documenter-dark .hero.is-warning.is-bold{background-image:linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg, #7a4700 0%, #ad8100 71%, #c7b500 100%)}}html.theme--documenter-dark .hero.is-danger{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),html.theme--documenter-dark .hero.is-danger strong{color:inherit}html.theme--documenter-dark .hero.is-danger .title{color:#fff}html.theme--documenter-dark .hero.is-danger .subtitle{color:rgba(255,255,255,0.9)}html.theme--documenter-dark .hero.is-danger .subtitle a:not(.button),html.theme--documenter-dark .hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width: 1055px){html.theme--documenter-dark .hero.is-danger .navbar-menu{background-color:#9e1b0d}}html.theme--documenter-dark .hero.is-danger .navbar-item,html.theme--documenter-dark .hero.is-danger .navbar-link{color:rgba(255,255,255,0.7)}html.theme--documenter-dark .hero.is-danger a.navbar-item:hover,html.theme--documenter-dark .hero.is-danger a.navbar-item.is-active,html.theme--documenter-dark .hero.is-danger .navbar-link:hover,html.theme--documenter-dark .hero.is-danger .navbar-link.is-active{background-color:#86170b;color:#fff}html.theme--documenter-dark .hero.is-danger .tabs a{color:#fff;opacity:0.9}html.theme--documenter-dark .hero.is-danger .tabs a:hover{opacity:1}html.theme--documenter-dark .hero.is-danger .tabs li.is-active a{opacity:1}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a{color:#fff}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed a:hover,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a,html.theme--documenter-dark .hero.is-danger .tabs.is-boxed li.is-active a:hover,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a,html.theme--documenter-dark .hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#9e1b0d}html.theme--documenter-dark .hero.is-danger.is-bold{background-image:linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%)}@media screen and (max-width: 768px){html.theme--documenter-dark .hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg, #75030b 0%, #9e1b0d 71%, #ba380a 100%)}}html.theme--documenter-dark .hero.is-small .hero-body,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.hero .hero-body{padding-bottom:1.5rem;padding-top:1.5rem}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero.is-medium .hero-body{padding-bottom:9rem;padding-top:9rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero.is-large .hero-body{padding-bottom:18rem;padding-top:18rem}}html.theme--documenter-dark .hero.is-halfheight .hero-body,html.theme--documenter-dark .hero.is-fullheight .hero-body,html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body{align-items:center;display:flex}html.theme--documenter-dark .hero.is-halfheight .hero-body>.container,html.theme--documenter-dark .hero.is-fullheight .hero-body>.container,html.theme--documenter-dark .hero.is-fullheight-with-navbar .hero-body>.container{flex-grow:1;flex-shrink:1}html.theme--documenter-dark .hero.is-halfheight{min-height:50vh}html.theme--documenter-dark .hero.is-fullheight{min-height:100vh}html.theme--documenter-dark .hero-video{overflow:hidden}html.theme--documenter-dark .hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%, -50%, 0)}html.theme--documenter-dark .hero-video.is-transparent{opacity:0.3}@media screen and (max-width: 768px){html.theme--documenter-dark .hero-video{display:none}}html.theme--documenter-dark .hero-buttons{margin-top:1.5rem}@media screen and (max-width: 768px){html.theme--documenter-dark .hero-buttons .button{display:flex}html.theme--documenter-dark .hero-buttons .button:not(:last-child){margin-bottom:0.75rem}}@media screen and (min-width: 769px),print{html.theme--documenter-dark .hero-buttons{display:flex;justify-content:center}html.theme--documenter-dark .hero-buttons .button:not(:last-child){margin-right:1.5rem}}html.theme--documenter-dark .hero-head,html.theme--documenter-dark .hero-foot{flex-grow:0;flex-shrink:0}html.theme--documenter-dark .hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}html.theme--documenter-dark .section{padding:3rem 1.5rem}@media screen and (min-width: 1056px){html.theme--documenter-dark .section.is-medium{padding:9rem 1.5rem}html.theme--documenter-dark .section.is-large{padding:18rem 1.5rem}}html.theme--documenter-dark .footer{background-color:#282f2f;padding:3rem 1.5rem 6rem}html.theme--documenter-dark hr{height:1px}html.theme--documenter-dark h6{text-transform:uppercase;letter-spacing:0.5px}html.theme--documenter-dark .hero{background-color:#343c3d}html.theme--documenter-dark a{transition:all 200ms ease}html.theme--documenter-dark .button{transition:all 200ms ease;border-width:1px;color:#fff}html.theme--documenter-dark .button.is-active,html.theme--documenter-dark .button.is-focused,html.theme--documenter-dark .button:active,html.theme--documenter-dark .button:focus{box-shadow:0 0 0 2px rgba(140,155,157,0.5)}html.theme--documenter-dark .button.is-white.is-hovered,html.theme--documenter-dark .button.is-white:hover{background-color:#fff}html.theme--documenter-dark .button.is-white.is-active,html.theme--documenter-dark .button.is-white.is-focused,html.theme--documenter-dark .button.is-white:active,html.theme--documenter-dark .button.is-white:focus{border-color:#fff;box-shadow:0 0 0 2px rgba(255,255,255,0.5)}html.theme--documenter-dark .button.is-black.is-hovered,html.theme--documenter-dark .button.is-black:hover{background-color:#1d1d1d}html.theme--documenter-dark .button.is-black.is-active,html.theme--documenter-dark .button.is-black.is-focused,html.theme--documenter-dark .button.is-black:active,html.theme--documenter-dark .button.is-black:focus{border-color:#0a0a0a;box-shadow:0 0 0 2px rgba(10,10,10,0.5)}html.theme--documenter-dark .button.is-light.is-hovered,html.theme--documenter-dark .button.is-light:hover{background-color:#fff}html.theme--documenter-dark .button.is-light.is-active,html.theme--documenter-dark .button.is-light.is-focused,html.theme--documenter-dark .button.is-light:active,html.theme--documenter-dark .button.is-light:focus{border-color:#ecf0f1;box-shadow:0 0 0 2px rgba(236,240,241,0.5)}html.theme--documenter-dark .button.is-dark.is-hovered,html.theme--documenter-dark .content kbd.button.is-hovered,html.theme--documenter-dark .button.is-dark:hover,html.theme--documenter-dark .content kbd.button:hover{background-color:#3a4344}html.theme--documenter-dark .button.is-dark.is-active,html.theme--documenter-dark .content kbd.button.is-active,html.theme--documenter-dark .button.is-dark.is-focused,html.theme--documenter-dark .content kbd.button.is-focused,html.theme--documenter-dark .button.is-dark:active,html.theme--documenter-dark .content kbd.button:active,html.theme--documenter-dark .button.is-dark:focus,html.theme--documenter-dark .content kbd.button:focus{border-color:#282f2f;box-shadow:0 0 0 2px rgba(40,47,47,0.5)}html.theme--documenter-dark .button.is-primary.is-hovered,html.theme--documenter-dark .docstring>section>a.button.is-hovered.docs-sourcelink,html.theme--documenter-dark .button.is-primary:hover,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:hover{background-color:#436d9a}html.theme--documenter-dark .button.is-primary.is-active,html.theme--documenter-dark .docstring>section>a.button.is-active.docs-sourcelink,html.theme--documenter-dark .button.is-primary.is-focused,html.theme--documenter-dark .docstring>section>a.button.is-focused.docs-sourcelink,html.theme--documenter-dark .button.is-primary:active,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:active,html.theme--documenter-dark .button.is-primary:focus,html.theme--documenter-dark .docstring>section>a.button.docs-sourcelink:focus{border-color:#375a7f;box-shadow:0 0 0 2px rgba(55,90,127,0.5)}html.theme--documenter-dark .button.is-link.is-hovered,html.theme--documenter-dark .button.is-link:hover{background-color:#1fdeb8}html.theme--documenter-dark .button.is-link.is-active,html.theme--documenter-dark .button.is-link.is-focused,html.theme--documenter-dark .button.is-link:active,html.theme--documenter-dark .button.is-link:focus{border-color:#1abc9c;box-shadow:0 0 0 2px rgba(26,188,156,0.5)}html.theme--documenter-dark .button.is-info.is-hovered,html.theme--documenter-dark .button.is-info:hover{background-color:#0363a3}html.theme--documenter-dark .button.is-info.is-active,html.theme--documenter-dark .button.is-info.is-focused,html.theme--documenter-dark .button.is-info:active,html.theme--documenter-dark .button.is-info:focus{border-color:#024c7d;box-shadow:0 0 0 2px rgba(2,76,125,0.5)}html.theme--documenter-dark .button.is-success.is-hovered,html.theme--documenter-dark .button.is-success:hover{background-color:#00aa48}html.theme--documenter-dark .button.is-success.is-active,html.theme--documenter-dark .button.is-success.is-focused,html.theme--documenter-dark .button.is-success:active,html.theme--documenter-dark .button.is-success:focus{border-color:#008438;box-shadow:0 0 0 2px rgba(0,132,56,0.5)}html.theme--documenter-dark .button.is-warning.is-hovered,html.theme--documenter-dark .button.is-warning:hover{background-color:#d39e00}html.theme--documenter-dark .button.is-warning.is-active,html.theme--documenter-dark .button.is-warning.is-focused,html.theme--documenter-dark .button.is-warning:active,html.theme--documenter-dark .button.is-warning:focus{border-color:#ad8100;box-shadow:0 0 0 2px rgba(173,129,0,0.5)}html.theme--documenter-dark .button.is-danger.is-hovered,html.theme--documenter-dark .button.is-danger:hover{background-color:#c12110}html.theme--documenter-dark .button.is-danger.is-active,html.theme--documenter-dark .button.is-danger.is-focused,html.theme--documenter-dark .button.is-danger:active,html.theme--documenter-dark .button.is-danger:focus{border-color:#9e1b0d;box-shadow:0 0 0 2px rgba(158,27,13,0.5)}html.theme--documenter-dark .label{color:#dbdee0}html.theme--documenter-dark .button,html.theme--documenter-dark .control.has-icons-left .icon,html.theme--documenter-dark .control.has-icons-right .icon,html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .pagination-ellipsis,html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-previous,html.theme--documenter-dark .select,html.theme--documenter-dark .select select,html.theme--documenter-dark .textarea{height:2.5em}html.theme--documenter-dark .input,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark .textarea{transition:all 200ms ease;box-shadow:none;border-width:1px;padding-left:1em;padding-right:1em}html.theme--documenter-dark .select:after,html.theme--documenter-dark .select select{border-width:1px}html.theme--documenter-dark .control.has-addons .button,html.theme--documenter-dark .control.has-addons .input,html.theme--documenter-dark .control.has-addons #documenter .docs-sidebar form.docs-search>input,html.theme--documenter-dark #documenter .docs-sidebar .control.has-addons form.docs-search>input,html.theme--documenter-dark .control.has-addons .select{margin-right:-1px}html.theme--documenter-dark .notification{background-color:#343c3d}html.theme--documenter-dark .card{box-shadow:none;border:1px solid #343c3d;background-color:#282f2f;border-radius:.4em}html.theme--documenter-dark .card .card-image img{border-radius:.4em .4em 0 0}html.theme--documenter-dark .card .card-header{box-shadow:none;background-color:rgba(18,18,18,0.2);border-radius:.4em .4em 0 0}html.theme--documenter-dark .card .card-footer{background-color:rgba(18,18,18,0.2)}html.theme--documenter-dark .card .card-footer,html.theme--documenter-dark .card .card-footer-item{border-width:1px;border-color:#343c3d}html.theme--documenter-dark .notification.is-white a:not(.button){color:#0a0a0a;text-decoration:underline}html.theme--documenter-dark .notification.is-black a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-light a:not(.button){color:#282f2f;text-decoration:underline}html.theme--documenter-dark .notification.is-dark a:not(.button),html.theme--documenter-dark .content kbd.notification a:not(.button){color:#ecf0f1;text-decoration:underline}html.theme--documenter-dark .notification.is-primary a:not(.button),html.theme--documenter-dark .docstring>section>a.notification.docs-sourcelink a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-link a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-info a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-success a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-warning a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .notification.is-danger a:not(.button){color:#fff;text-decoration:underline}html.theme--documenter-dark .tag,html.theme--documenter-dark .content kbd,html.theme--documenter-dark .docstring>section>a.docs-sourcelink{border-radius:.4em}html.theme--documenter-dark .menu-list a{transition:all 300ms ease}html.theme--documenter-dark .modal-card-body{background-color:#282f2f}html.theme--documenter-dark .modal-card-foot,html.theme--documenter-dark .modal-card-head{border-color:#343c3d}html.theme--documenter-dark .message-header{font-weight:700;background-color:#343c3d;color:#fff}html.theme--documenter-dark .message-body{border-width:1px;border-color:#343c3d}html.theme--documenter-dark .navbar{border-radius:.4em}html.theme--documenter-dark .navbar.is-transparent{background:none}html.theme--documenter-dark .navbar.is-primary .navbar-dropdown a.navbar-item.is-active,html.theme--documenter-dark .docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#1abc9c}@media screen and (max-width: 1055px){html.theme--documenter-dark .navbar .navbar-menu{background-color:#375a7f;border-radius:0 0 .4em .4em}}html.theme--documenter-dark .hero .navbar,html.theme--documenter-dark body>.navbar{border-radius:0}html.theme--documenter-dark .pagination-link,html.theme--documenter-dark .pagination-next,html.theme--documenter-dark .pagination-previous{border-width:1px}html.theme--documenter-dark .panel-block,html.theme--documenter-dark .panel-heading,html.theme--documenter-dark .panel-tabs{border-width:1px}html.theme--documenter-dark .panel-block:first-child,html.theme--documenter-dark .panel-heading:first-child,html.theme--documenter-dark .panel-tabs:first-child{border-top-width:1px}html.theme--documenter-dark .panel-heading{font-weight:700}html.theme--documenter-dark .panel-tabs a{border-width:1px;margin-bottom:-1px}html.theme--documenter-dark .panel-tabs a.is-active{border-bottom-color:#17a689}html.theme--documenter-dark .panel-block:hover{color:#1dd2af}html.theme--documenter-dark .panel-block:hover .panel-icon{color:#1dd2af}html.theme--documenter-dark .panel-block.is-active .panel-icon{color:#17a689}html.theme--documenter-dark .tabs a{border-bottom-width:1px;margin-bottom:-1px}html.theme--documenter-dark .tabs ul{border-bottom-width:1px}html.theme--documenter-dark .tabs.is-boxed a{border-width:1px}html.theme--documenter-dark .tabs.is-boxed li.is-active a{background-color:#1f2424}html.theme--documenter-dark .tabs.is-toggle li a{border-width:1px;margin-bottom:0}html.theme--documenter-dark .tabs.is-toggle li+li{margin-left:-1px}html.theme--documenter-dark .hero.is-white .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-black .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-light .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-dark .navbar .navbar-dropdown .navbar-item:hover,html.theme--documenter-dark .content kbd.hero .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-primary .navbar .navbar-dropdown .navbar-item:hover,html.theme--documenter-dark .docstring>section>a.hero.docs-sourcelink .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-link .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-info .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-success .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-warning .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark .hero.is-danger .navbar .navbar-dropdown .navbar-item:hover{background-color:rgba(0,0,0,0)}html.theme--documenter-dark h1 .docs-heading-anchor,html.theme--documenter-dark h1 .docs-heading-anchor:hover,html.theme--documenter-dark h1 .docs-heading-anchor:visited,html.theme--documenter-dark h2 .docs-heading-anchor,html.theme--documenter-dark h2 .docs-heading-anchor:hover,html.theme--documenter-dark h2 .docs-heading-anchor:visited,html.theme--documenter-dark h3 .docs-heading-anchor,html.theme--documenter-dark h3 .docs-heading-anchor:hover,html.theme--documenter-dark h3 .docs-heading-anchor:visited,html.theme--documenter-dark h4 .docs-heading-anchor,html.theme--documenter-dark h4 .docs-heading-anchor:hover,html.theme--documenter-dark h4 .docs-heading-anchor:visited,html.theme--documenter-dark h5 .docs-heading-anchor,html.theme--documenter-dark h5 .docs-heading-anchor:hover,html.theme--documenter-dark h5 .docs-heading-anchor:visited,html.theme--documenter-dark h6 .docs-heading-anchor,html.theme--documenter-dark h6 .docs-heading-anchor:hover,html.theme--documenter-dark h6 .docs-heading-anchor:visited{color:#f2f2f2}html.theme--documenter-dark h1 .docs-heading-anchor-permalink,html.theme--documenter-dark h2 .docs-heading-anchor-permalink,html.theme--documenter-dark h3 .docs-heading-anchor-permalink,html.theme--documenter-dark h4 .docs-heading-anchor-permalink,html.theme--documenter-dark h5 .docs-heading-anchor-permalink,html.theme--documenter-dark h6 .docs-heading-anchor-permalink{visibility:hidden;vertical-align:middle;margin-left:0.5em;font-size:0.7rem}html.theme--documenter-dark h1 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h2 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h3 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h4 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h5 .docs-heading-anchor-permalink::before,html.theme--documenter-dark h6 .docs-heading-anchor-permalink::before{font-family:"Font Awesome 5 Free";font-weight:900;content:"\f0c1"}html.theme--documenter-dark h1:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h2:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h3:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h4:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h5:hover .docs-heading-anchor-permalink,html.theme--documenter-dark h6:hover .docs-heading-anchor-permalink{visibility:visible}html.theme--documenter-dark .docs-light-only{display:none !important}html.theme--documenter-dark pre{position:relative;overflow:hidden}html.theme--documenter-dark pre code,html.theme--documenter-dark pre code.hljs{padding:0 .75rem !important;overflow:auto;display:block}html.theme--documenter-dark pre code:first-of-type,html.theme--documenter-dark pre code.hljs:first-of-type{padding-top:0.5rem !important}html.theme--documenter-dark pre code:last-of-type,html.theme--documenter-dark pre code.hljs:last-of-type{padding-bottom:0.5rem !important}html.theme--documenter-dark pre .copy-button{opacity:0.2;transition:opacity 0.2s;position:absolute;right:0em;top:0em;padding:0.5em;width:2.5em;height:2.5em;background:transparent;border:none;font-family:"Font Awesome 5 Free";color:#fff;cursor:pointer;text-align:center}html.theme--documenter-dark pre .copy-button:focus,html.theme--documenter-dark pre .copy-button:hover{opacity:1;background:rgba(255,255,255,0.1);color:#1abc9c}html.theme--documenter-dark pre .copy-button.success{color:#259a12;opacity:1}html.theme--documenter-dark pre .copy-button.error{color:#cb3c33;opacity:1}html.theme--documenter-dark pre:hover .copy-button{opacity:1}html.theme--documenter-dark .admonition{background-color:#282f2f;border-style:solid;border-width:1px;border-color:#5e6d6f;border-radius:.4em;font-size:15px}html.theme--documenter-dark .admonition strong{color:currentColor}html.theme--documenter-dark .admonition.is-small,html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input.admonition{font-size:.85em}html.theme--documenter-dark .admonition.is-medium{font-size:1.25rem}html.theme--documenter-dark .admonition.is-large{font-size:1.5rem}html.theme--documenter-dark .admonition.is-default{background-color:#282f2f;border-color:#5e6d6f}html.theme--documenter-dark .admonition.is-default>.admonition-header{background-color:#5e6d6f;color:#fff}html.theme--documenter-dark .admonition.is-default>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-info{background-color:#282f2f;border-color:#024c7d}html.theme--documenter-dark .admonition.is-info>.admonition-header{background-color:#024c7d;color:#fff}html.theme--documenter-dark .admonition.is-info>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-success{background-color:#282f2f;border-color:#008438}html.theme--documenter-dark .admonition.is-success>.admonition-header{background-color:#008438;color:#fff}html.theme--documenter-dark .admonition.is-success>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-warning{background-color:#282f2f;border-color:#ad8100}html.theme--documenter-dark .admonition.is-warning>.admonition-header{background-color:#ad8100;color:#fff}html.theme--documenter-dark .admonition.is-warning>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-danger{background-color:#282f2f;border-color:#9e1b0d}html.theme--documenter-dark .admonition.is-danger>.admonition-header{background-color:#9e1b0d;color:#fff}html.theme--documenter-dark .admonition.is-danger>.admonition-body{color:#fff}html.theme--documenter-dark .admonition.is-compat{background-color:#282f2f;border-color:#137886}html.theme--documenter-dark .admonition.is-compat>.admonition-header{background-color:#137886;color:#fff}html.theme--documenter-dark .admonition.is-compat>.admonition-body{color:#fff}html.theme--documenter-dark .admonition-header{color:#fff;background-color:#5e6d6f;align-items:center;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.5rem .75rem;position:relative}html.theme--documenter-dark .admonition-header:before{font-family:"Font Awesome 5 Free";font-weight:900;margin-right:.75rem;content:"\f06a"}html.theme--documenter-dark .admonition-body{color:#fff;padding:0.5rem .75rem}html.theme--documenter-dark .admonition-body pre{background-color:#282f2f}html.theme--documenter-dark .admonition-body code{background-color:rgba(255,255,255,0.05)}html.theme--documenter-dark .docstring{margin-bottom:1em;background-color:rgba(0,0,0,0);border:1px solid #5e6d6f;box-shadow:none;max-width:100%}html.theme--documenter-dark .docstring>header{display:flex;flex-grow:1;align-items:stretch;padding:0.5rem .75rem;background-color:#282f2f;box-shadow:0 1px 2px rgba(10,10,10,0.1);box-shadow:none;border-bottom:1px solid #5e6d6f}html.theme--documenter-dark .docstring>header code{background-color:transparent}html.theme--documenter-dark .docstring>header .docstring-binding{margin-right:0.3em}html.theme--documenter-dark .docstring>header .docstring-category{margin-left:0.3em}html.theme--documenter-dark .docstring>section{position:relative;padding:.75rem .75rem;border-bottom:1px solid #5e6d6f}html.theme--documenter-dark .docstring>section:last-child{border-bottom:none}html.theme--documenter-dark .docstring>section>a.docs-sourcelink{transition:opacity 0.3s;opacity:0;position:absolute;right:.375rem;bottom:.375rem}html.theme--documenter-dark .docstring>section>a.docs-sourcelink:focus{opacity:1 !important}html.theme--documenter-dark .docstring:hover>section>a.docs-sourcelink{opacity:0.2}html.theme--documenter-dark .docstring:focus-within>section>a.docs-sourcelink{opacity:0.2}html.theme--documenter-dark .docstring>section:hover a.docs-sourcelink{opacity:1}html.theme--documenter-dark .documenter-example-output{background-color:#1f2424}html.theme--documenter-dark .outdated-warning-overlay{position:fixed;top:0;left:0;right:0;box-shadow:0 0 10px rgba(0,0,0,0.3);z-index:999;background-color:#282f2f;color:#fff;border-bottom:3px solid #9e1b0d;padding:10px 35px;text-align:center;font-size:15px}html.theme--documenter-dark .outdated-warning-overlay .outdated-warning-closer{position:absolute;top:calc(50% - 10px);right:18px;cursor:pointer;width:12px}html.theme--documenter-dark .outdated-warning-overlay a{color:#1abc9c}html.theme--documenter-dark .outdated-warning-overlay a:hover{color:#1dd2af}html.theme--documenter-dark .content pre{border:1px solid #5e6d6f}html.theme--documenter-dark .content code{font-weight:inherit}html.theme--documenter-dark .content a code{color:#1abc9c}html.theme--documenter-dark .content h1 code,html.theme--documenter-dark .content h2 code,html.theme--documenter-dark .content h3 code,html.theme--documenter-dark .content h4 code,html.theme--documenter-dark .content h5 code,html.theme--documenter-dark .content h6 code{color:#f2f2f2}html.theme--documenter-dark .content table{display:block;width:initial;max-width:100%;overflow-x:auto}html.theme--documenter-dark .content blockquote>ul:first-child,html.theme--documenter-dark .content blockquote>ol:first-child,html.theme--documenter-dark .content .admonition-body>ul:first-child,html.theme--documenter-dark .content .admonition-body>ol:first-child{margin-top:0}html.theme--documenter-dark pre,html.theme--documenter-dark code{font-variant-ligatures:no-contextual}html.theme--documenter-dark .breadcrumb a.is-disabled{cursor:default;pointer-events:none}html.theme--documenter-dark .breadcrumb a.is-disabled,html.theme--documenter-dark .breadcrumb a.is-disabled:hover{color:#f2f2f2}html.theme--documenter-dark .hljs{background:initial !important}html.theme--documenter-dark .katex .katex-mathml{top:0;right:0}html.theme--documenter-dark .katex-display,html.theme--documenter-dark mjx-container,html.theme--documenter-dark .MathJax_Display{margin:0.5em 0 !important}html.theme--documenter-dark html{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto}html.theme--documenter-dark li.no-marker{list-style:none}html.theme--documenter-dark #documenter .docs-main>article{overflow-wrap:break-word}html.theme--documenter-dark #documenter .docs-main>article .math-container{overflow-x:auto;overflow-y:hidden}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-main{max-width:52rem;margin-left:20rem;padding-right:1rem}}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main{width:100%}html.theme--documenter-dark #documenter .docs-main>article{max-width:52rem;margin-left:auto;margin-right:auto;margin-bottom:1rem;padding:0 1rem}html.theme--documenter-dark #documenter .docs-main>header,html.theme--documenter-dark #documenter .docs-main>nav{max-width:100%;width:100%;margin:0}}html.theme--documenter-dark #documenter .docs-main header.docs-navbar{background-color:#1f2424;border-bottom:1px solid #5e6d6f;z-index:2;min-height:4rem;margin-bottom:1rem;display:flex}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .breadcrumb{flex-grow:1}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right{display:flex;white-space:nowrap}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-icon,html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label,html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button{display:inline-block}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-label{padding:0;margin-left:0.3em}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-settings-button{margin:auto 0 auto 1rem}html.theme--documenter-dark #documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button{font-size:1.5rem;margin:auto 0 auto 1rem}html.theme--documenter-dark #documenter .docs-main header.docs-navbar>*{margin:auto 0}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main header.docs-navbar{position:sticky;top:0;padding:0 1rem;transition-property:top, box-shadow;-webkit-transition-property:top, box-shadow;transition-duration:0.3s;-webkit-transition-duration:0.3s}html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--not-top{box-shadow:.2rem 0rem .4rem #171717;transition-duration:0.7s;-webkit-transition-duration:0.7s}html.theme--documenter-dark #documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom{top:-4.5rem;transition-duration:0.7s;-webkit-transition-duration:0.7s}}html.theme--documenter-dark #documenter .docs-main section.footnotes{border-top:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-main section.footnotes li .tag:first-child,html.theme--documenter-dark #documenter .docs-main section.footnotes li .docstring>section>a.docs-sourcelink:first-child,html.theme--documenter-dark #documenter .docs-main section.footnotes li .content kbd:first-child,html.theme--documenter-dark .content #documenter .docs-main section.footnotes li kbd:first-child{margin-right:1em;margin-bottom:0.4em}html.theme--documenter-dark #documenter .docs-main .docs-footer{display:flex;flex-wrap:wrap;margin-left:0;margin-right:0;border-top:1px solid #5e6d6f;padding-top:1rem;padding-bottom:1rem}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-main .docs-footer{padding-left:1rem;padding-right:1rem}}html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage,html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-prevpage{flex-grow:1}html.theme--documenter-dark #documenter .docs-main .docs-footer .docs-footer-nextpage{text-align:right}html.theme--documenter-dark #documenter .docs-main .docs-footer .flexbox-break{flex-basis:100%;height:0}html.theme--documenter-dark #documenter .docs-main .docs-footer .footer-message{font-size:0.8em;margin:0.5em auto 0 auto;text-align:center}html.theme--documenter-dark #documenter .docs-sidebar{display:flex;flex-direction:column;color:#fff;background-color:#282f2f;border-right:1px solid #5e6d6f;padding:0;flex:0 0 18rem;z-index:5;font-size:15px;position:fixed;left:-18rem;width:18rem;height:100%;transition:left 0.3s}html.theme--documenter-dark #documenter .docs-sidebar.visible{left:0;box-shadow:.4rem 0rem .8rem #171717}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar.visible{box-shadow:none}}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar{left:0;top:0}}html.theme--documenter-dark #documenter .docs-sidebar .docs-logo{margin-top:1rem;padding:0 1rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-logo>img{max-height:6rem;margin:auto}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name{flex-shrink:0;font-size:1.5rem;font-weight:700;text-align:center;white-space:nowrap;overflow:hidden;padding:0.5rem 0}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name .docs-autofit{max-width:16.2rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a,html.theme--documenter-dark #documenter .docs-sidebar .docs-package-name a:hover{color:#fff}html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector{border-top:1px solid #5e6d6f;display:none;padding:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar .docs-version-selector.visible{display:flex}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu{flex-grow:1;user-select:none;border-top:1px solid #5e6d6f;padding-bottom:1.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li>.tocitem{font-weight:bold}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li li{font-size:14.25px;margin-left:1em;border-left:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input.collapse-toggle{display:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.collapsed{display:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked~ul.collapsed{display:block}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem{display:flex}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label{flex-grow:2}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;font-size:11.25px;margin-left:1rem;margin-top:auto;margin-bottom:auto}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before{font-family:"Font Awesome 5 Free";font-weight:900;content:"\f054"}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu input:checked~label.tocitem .docs-chevron::before{content:"\f078"}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem{display:block;padding:0.5rem 0.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu .tocitem:hover{color:#fff;background:#282f2f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu a.tocitem:hover,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu label.tocitem:hover{color:#fff;background-color:#32393a}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active{border-top:1px solid #5e6d6f;border-bottom:1px solid #5e6d6f;background-color:#1f2424}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem,html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover{background-color:#1f2424;color:#fff}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover{background-color:#32393a;color:#fff}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu>li.is-active:first-child{border-top:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal{margin:0 0.5rem 0.5rem;border-top:1px solid #5e6d6f}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal li{font-size:12.75px;border-left:none;margin-left:0;margin-top:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem{width:100%;padding:0}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before{content:"⚬";margin-right:0.4em}html.theme--documenter-dark #documenter .docs-sidebar form.docs-search{margin:auto;margin-top:0.5rem;margin-bottom:0.5rem}html.theme--documenter-dark #documenter .docs-sidebar form.docs-search>input{width:14.4rem}@media screen and (min-width: 1056px){html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu{overflow-y:auto;-webkit-overflow-scroll:touch}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar{width:.3rem;background:none}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#3b4445}html.theme--documenter-dark #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover{background:#4e5a5c}}@media screen and (max-width: 1055px){html.theme--documenter-dark #documenter .docs-sidebar{overflow-y:auto;-webkit-overflow-scroll:touch}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar{width:.3rem;background:none}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#3b4445}html.theme--documenter-dark #documenter .docs-sidebar::-webkit-scrollbar-thumb:hover{background:#4e5a5c}}html.theme--documenter-dark #documenter .docs-main #documenter-search-info{margin-bottom:1rem}html.theme--documenter-dark #documenter .docs-main #documenter-search-results{list-style-type:circle;list-style-position:outside}html.theme--documenter-dark #documenter .docs-main #documenter-search-results li{margin-left:2rem}html.theme--documenter-dark #documenter .docs-main #documenter-search-results .docs-highlight{background-color:yellow}html.theme--documenter-dark{background-color:#1f2424;font-size:16px;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}html.theme--documenter-dark .ansi span.sgr1{font-weight:bolder}html.theme--documenter-dark .ansi span.sgr2{font-weight:lighter}html.theme--documenter-dark .ansi span.sgr3{font-style:italic}html.theme--documenter-dark .ansi span.sgr4{text-decoration:underline}html.theme--documenter-dark .ansi span.sgr7{color:#1f2424;background-color:#fff}html.theme--documenter-dark .ansi span.sgr8{color:transparent}html.theme--documenter-dark .ansi span.sgr8 span{color:transparent}html.theme--documenter-dark .ansi span.sgr9{text-decoration:line-through}html.theme--documenter-dark .ansi span.sgr30{color:#242424}html.theme--documenter-dark .ansi span.sgr31{color:#f6705f}html.theme--documenter-dark .ansi span.sgr32{color:#4fb43a}html.theme--documenter-dark .ansi span.sgr33{color:#f4c72f}html.theme--documenter-dark .ansi span.sgr34{color:#7587f0}html.theme--documenter-dark .ansi span.sgr35{color:#bc89d3}html.theme--documenter-dark .ansi span.sgr36{color:#49b6ca}html.theme--documenter-dark .ansi span.sgr37{color:#b3bdbe}html.theme--documenter-dark .ansi span.sgr40{background-color:#242424}html.theme--documenter-dark .ansi span.sgr41{background-color:#f6705f}html.theme--documenter-dark .ansi span.sgr42{background-color:#4fb43a}html.theme--documenter-dark .ansi span.sgr43{background-color:#f4c72f}html.theme--documenter-dark .ansi span.sgr44{background-color:#7587f0}html.theme--documenter-dark .ansi span.sgr45{background-color:#bc89d3}html.theme--documenter-dark .ansi span.sgr46{background-color:#49b6ca}html.theme--documenter-dark .ansi span.sgr47{background-color:#b3bdbe}html.theme--documenter-dark .ansi span.sgr90{color:#92a0a2}html.theme--documenter-dark .ansi span.sgr91{color:#ff8674}html.theme--documenter-dark .ansi span.sgr92{color:#79d462}html.theme--documenter-dark .ansi span.sgr93{color:#ffe76b}html.theme--documenter-dark .ansi span.sgr94{color:#8a98ff}html.theme--documenter-dark .ansi span.sgr95{color:#d2a4e6}html.theme--documenter-dark .ansi span.sgr96{color:#6bc8db}html.theme--documenter-dark .ansi span.sgr97{color:#ecf0f1}html.theme--documenter-dark .ansi span.sgr100{background-color:#92a0a2}html.theme--documenter-dark .ansi span.sgr101{background-color:#ff8674}html.theme--documenter-dark .ansi span.sgr102{background-color:#79d462}html.theme--documenter-dark .ansi span.sgr103{background-color:#ffe76b}html.theme--documenter-dark .ansi span.sgr104{background-color:#8a98ff}html.theme--documenter-dark .ansi span.sgr105{background-color:#d2a4e6}html.theme--documenter-dark .ansi span.sgr106{background-color:#6bc8db}html.theme--documenter-dark .ansi span.sgr107{background-color:#ecf0f1}html.theme--documenter-dark code.language-julia-repl>span.hljs-meta{color:#4fb43a;font-weight:bolder}html.theme--documenter-dark .hljs{background:#2b2b2b;color:#f8f8f2}html.theme--documenter-dark .hljs-comment,html.theme--documenter-dark .hljs-quote{color:#d4d0ab}html.theme--documenter-dark .hljs-variable,html.theme--documenter-dark .hljs-template-variable,html.theme--documenter-dark .hljs-tag,html.theme--documenter-dark .hljs-name,html.theme--documenter-dark .hljs-selector-id,html.theme--documenter-dark .hljs-selector-class,html.theme--documenter-dark .hljs-regexp,html.theme--documenter-dark .hljs-deletion{color:#ffa07a}html.theme--documenter-dark .hljs-number,html.theme--documenter-dark .hljs-built_in,html.theme--documenter-dark .hljs-literal,html.theme--documenter-dark .hljs-type,html.theme--documenter-dark .hljs-params,html.theme--documenter-dark .hljs-meta,html.theme--documenter-dark .hljs-link{color:#f5ab35}html.theme--documenter-dark .hljs-attribute{color:#ffd700}html.theme--documenter-dark .hljs-string,html.theme--documenter-dark .hljs-symbol,html.theme--documenter-dark .hljs-bullet,html.theme--documenter-dark .hljs-addition{color:#abe338}html.theme--documenter-dark .hljs-title,html.theme--documenter-dark .hljs-section{color:#00e0e0}html.theme--documenter-dark .hljs-keyword,html.theme--documenter-dark .hljs-selector-tag{color:#dcc6e0}html.theme--documenter-dark .hljs-emphasis{font-style:italic}html.theme--documenter-dark .hljs-strong{font-weight:bold}@media screen and (-ms-high-contrast: active){html.theme--documenter-dark .hljs-addition,html.theme--documenter-dark .hljs-attribute,html.theme--documenter-dark .hljs-built_in,html.theme--documenter-dark .hljs-bullet,html.theme--documenter-dark .hljs-comment,html.theme--documenter-dark .hljs-link,html.theme--documenter-dark .hljs-literal,html.theme--documenter-dark .hljs-meta,html.theme--documenter-dark .hljs-number,html.theme--documenter-dark .hljs-params,html.theme--documenter-dark .hljs-string,html.theme--documenter-dark .hljs-symbol,html.theme--documenter-dark .hljs-type,html.theme--documenter-dark .hljs-quote{color:highlight}html.theme--documenter-dark .hljs-keyword,html.theme--documenter-dark .hljs-selector-tag{font-weight:bold}}html.theme--documenter-dark .hljs-subst{color:#f8f8f2} diff --git a/assets/themes/documenter-light.css b/assets/themes/documenter-light.css index 9595d5b8..9b9a14b0 100644 --- a/assets/themes/documenter-light.css +++ b/assets/themes/documenter-light.css @@ -1,7642 +1,4 @@ -@charset "UTF-8"; -/* Font Awesome 5 mixin. Can be included in any rule that should render Font Awesome icons. */ -@keyframes spinAround { - from { - transform: rotate(0deg); } - to { - transform: rotate(359deg); } } - -.tabs, .pagination-previous, -.pagination-next, -.pagination-link, -.pagination-ellipsis, .breadcrumb, .file, .button, .is-unselectable, .modal-close, .delete { - -webkit-touch-callout: none; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; } - -.navbar-link:not(.is-arrowless)::after, .select:not(.is-multiple):not(.is-loading)::after { - border: 3px solid transparent; - border-radius: 2px; - border-right: 0; - border-top: 0; - content: " "; - display: block; - height: 0.625em; - margin-top: -0.4375em; - pointer-events: none; - position: absolute; - top: 50%; - transform: rotate(-45deg); - transform-origin: center; - width: 0.625em; } - -.admonition:not(:last-child), .tabs:not(:last-child), .message:not(:last-child), .list:not(:last-child), .level:not(:last-child), .breadcrumb:not(:last-child), .highlight:not(:last-child), .block:not(:last-child), .title:not(:last-child), -.subtitle:not(:last-child), .table-container:not(:last-child), .table:not(:last-child), .progress:not(:last-child), .notification:not(:last-child), .content:not(:last-child), .box:not(:last-child) { - margin-bottom: 1.5rem; } - -.modal-close, .delete { - -moz-appearance: none; - -webkit-appearance: none; - background-color: rgba(10, 10, 10, 0.2); - border: none; - border-radius: 290486px; - cursor: pointer; - pointer-events: auto; - display: inline-block; - flex-grow: 0; - flex-shrink: 0; - font-size: 0; - height: 20px; - max-height: 20px; - max-width: 20px; - min-height: 20px; - min-width: 20px; - outline: none; - position: relative; - vertical-align: top; - width: 20px; } - .modal-close::before, .delete::before, .modal-close::after, .delete::after { - background-color: white; - content: ""; - display: block; - left: 50%; - position: absolute; - top: 50%; - transform: translateX(-50%) translateY(-50%) rotate(45deg); - transform-origin: center center; } - .modal-close::before, .delete::before { - height: 2px; - width: 50%; } - .modal-close::after, .delete::after { - height: 50%; - width: 2px; } - .modal-close:hover, .delete:hover, .modal-close:focus, .delete:focus { - background-color: rgba(10, 10, 10, 0.3); } - .modal-close:active, .delete:active { - background-color: rgba(10, 10, 10, 0.4); } - .is-small.modal-close, #documenter .docs-sidebar form.docs-search > input.modal-close, .is-small.delete, #documenter .docs-sidebar form.docs-search > input.delete { - height: 16px; - max-height: 16px; - max-width: 16px; - min-height: 16px; - min-width: 16px; - width: 16px; } - .is-medium.modal-close, .is-medium.delete { - height: 24px; - max-height: 24px; - max-width: 24px; - min-height: 24px; - min-width: 24px; - width: 24px; } - .is-large.modal-close, .is-large.delete { - height: 32px; - max-height: 32px; - max-width: 32px; - min-height: 32px; - min-width: 32px; - width: 32px; } - -.control.is-loading::after, .select.is-loading::after, .loader, .button.is-loading::after { - animation: spinAround 500ms infinite linear; - border: 2px solid #dbdbdb; - border-radius: 290486px; - border-right-color: transparent; - border-top-color: transparent; - content: ""; - display: block; - height: 1em; - position: relative; - width: 1em; } - -.hero-video, .modal-background, .modal, .image.is-square img, #documenter .docs-sidebar .docs-logo > img.is-square img, -.image.is-square .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-square .has-ratio, .image.is-1by1 img, #documenter .docs-sidebar .docs-logo > img.is-1by1 img, -.image.is-1by1 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-1by1 .has-ratio, .image.is-5by4 img, #documenter .docs-sidebar .docs-logo > img.is-5by4 img, -.image.is-5by4 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-5by4 .has-ratio, .image.is-4by3 img, #documenter .docs-sidebar .docs-logo > img.is-4by3 img, -.image.is-4by3 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-4by3 .has-ratio, .image.is-3by2 img, #documenter .docs-sidebar .docs-logo > img.is-3by2 img, -.image.is-3by2 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-3by2 .has-ratio, .image.is-5by3 img, #documenter .docs-sidebar .docs-logo > img.is-5by3 img, -.image.is-5by3 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-5by3 .has-ratio, .image.is-16by9 img, #documenter .docs-sidebar .docs-logo > img.is-16by9 img, -.image.is-16by9 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-16by9 .has-ratio, .image.is-2by1 img, #documenter .docs-sidebar .docs-logo > img.is-2by1 img, -.image.is-2by1 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-2by1 .has-ratio, .image.is-3by1 img, #documenter .docs-sidebar .docs-logo > img.is-3by1 img, -.image.is-3by1 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-3by1 .has-ratio, .image.is-4by5 img, #documenter .docs-sidebar .docs-logo > img.is-4by5 img, -.image.is-4by5 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-4by5 .has-ratio, .image.is-3by4 img, #documenter .docs-sidebar .docs-logo > img.is-3by4 img, -.image.is-3by4 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-3by4 .has-ratio, .image.is-2by3 img, #documenter .docs-sidebar .docs-logo > img.is-2by3 img, -.image.is-2by3 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-2by3 .has-ratio, .image.is-3by5 img, #documenter .docs-sidebar .docs-logo > img.is-3by5 img, -.image.is-3by5 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-3by5 .has-ratio, .image.is-9by16 img, #documenter .docs-sidebar .docs-logo > img.is-9by16 img, -.image.is-9by16 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-9by16 .has-ratio, .image.is-1by2 img, #documenter .docs-sidebar .docs-logo > img.is-1by2 img, -.image.is-1by2 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-1by2 .has-ratio, .image.is-1by3 img, #documenter .docs-sidebar .docs-logo > img.is-1by3 img, -.image.is-1by3 .has-ratio, -#documenter .docs-sidebar .docs-logo > img.is-1by3 .has-ratio, .is-overlay { - bottom: 0; - left: 0; - position: absolute; - right: 0; - top: 0; } - -.pagination-previous, -.pagination-next, -.pagination-link, -.pagination-ellipsis, .file-cta, -.file-name, .select select, .textarea, .input, #documenter .docs-sidebar form.docs-search > input, .button { - -moz-appearance: none; - -webkit-appearance: none; - align-items: center; - border: 1px solid transparent; - border-radius: 4px; - box-shadow: none; - display: inline-flex; - font-size: 1rem; - height: 2.25em; - justify-content: flex-start; - line-height: 1.5; - padding-bottom: calc(0.375em - 1px); - padding-left: calc(0.625em - 1px); - padding-right: calc(0.625em - 1px); - padding-top: calc(0.375em - 1px); - position: relative; - vertical-align: top; } - .pagination-previous:focus, - .pagination-next:focus, - .pagination-link:focus, - .pagination-ellipsis:focus, .file-cta:focus, - .file-name:focus, .select select:focus, .textarea:focus, .input:focus, #documenter .docs-sidebar form.docs-search > input:focus, .button:focus, .is-focused.pagination-previous, - .is-focused.pagination-next, - .is-focused.pagination-link, - .is-focused.pagination-ellipsis, .is-focused.file-cta, - .is-focused.file-name, .select select.is-focused, .is-focused.textarea, .is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-focused.button, .pagination-previous:active, - .pagination-next:active, - .pagination-link:active, - .pagination-ellipsis:active, .file-cta:active, - .file-name:active, .select select:active, .textarea:active, .input:active, #documenter .docs-sidebar form.docs-search > input:active, .button:active, .is-active.pagination-previous, - .is-active.pagination-next, - .is-active.pagination-link, - .is-active.pagination-ellipsis, .is-active.file-cta, - .is-active.file-name, .select select.is-active, .is-active.textarea, .is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active, .is-active.button { - outline: none; } - .pagination-previous[disabled], - .pagination-next[disabled], - .pagination-link[disabled], - .pagination-ellipsis[disabled], .file-cta[disabled], - .file-name[disabled], .select select[disabled], .textarea[disabled], .input[disabled], #documenter .docs-sidebar form.docs-search > input[disabled], .button[disabled], fieldset[disabled] .pagination-previous, - fieldset[disabled] .pagination-next, - fieldset[disabled] .pagination-link, - fieldset[disabled] .pagination-ellipsis, fieldset[disabled] .file-cta, - fieldset[disabled] .file-name, fieldset[disabled] .select select, .select fieldset[disabled] select, fieldset[disabled] .textarea, fieldset[disabled] .input, fieldset[disabled] #documenter .docs-sidebar form.docs-search > input, #documenter .docs-sidebar fieldset[disabled] form.docs-search > input, fieldset[disabled] .button { - cursor: not-allowed; } - -/*! minireset.css v0.0.4 | MIT License | github.com/jgthms/minireset.css */ -html, -body, -p, -ol, -ul, -li, -dl, -dt, -dd, -blockquote, -figure, -fieldset, -legend, -textarea, -pre, -iframe, -hr, -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 0; - padding: 0; } - -h1, -h2, -h3, -h4, -h5, -h6 { - font-size: 100%; - font-weight: normal; } - -ul { - list-style: none; } - -button, -input, -select, -textarea { - margin: 0; } - -html { - box-sizing: border-box; } - -*, *::before, *::after { - box-sizing: inherit; } - -img, -embed, -iframe, -object, -video { - height: auto; - max-width: 100%; } - -audio { - max-width: 100%; } - -iframe { - border: 0; } - -table { - border-collapse: collapse; - border-spacing: 0; } - -td, -th { - padding: 0; } - td:not([align]), - th:not([align]) { - text-align: left; } - -html { - background-color: white; - font-size: 16px; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - min-width: 300px; - overflow-x: auto; - overflow-y: scroll; - text-rendering: optimizeLegibility; - text-size-adjust: 100%; } - -article, -aside, -figure, -footer, -header, -hgroup, -section { - display: block; } - -body, -button, -input, -select, -textarea { - font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif; } - -code, -pre { - -moz-osx-font-smoothing: auto; - -webkit-font-smoothing: auto; - font-family: "JuliaMono", "SFMono-Regular", "Menlo", "Consolas", "Liberation Mono", "DejaVu Sans Mono", monospace; } - -body { - color: #222222; - font-size: 1em; - font-weight: 400; - line-height: 1.5; } - -a { - color: #2e63b8; - cursor: pointer; - text-decoration: none; } - a strong { - color: currentColor; } - a:hover { - color: #363636; } - -code { - background-color: rgba(0, 0, 0, 0.05); - color: #000000; - font-size: 0.875em; - font-weight: normal; - padding: 0.1em; } - -hr { - background-color: whitesmoke; - border: none; - display: block; - height: 2px; - margin: 1.5rem 0; } - -img { - height: auto; - max-width: 100%; } - -input[type="checkbox"], -input[type="radio"] { - vertical-align: baseline; } - -small { - font-size: 0.875em; } - -span { - font-style: inherit; - font-weight: inherit; } - -strong { - color: #222222; - font-weight: 700; } - -fieldset { - border: none; } - -pre { - -webkit-overflow-scrolling: touch; - background-color: whitesmoke; - color: #222222; - font-size: 0.875em; - overflow-x: auto; - padding: 1.25rem 1.5rem; - white-space: pre; - word-wrap: normal; } - pre code { - background-color: transparent; - color: currentColor; - font-size: 1em; - padding: 0; } - -table td, -table th { - vertical-align: top; } - table td:not([align]), - table th:not([align]) { - text-align: left; } - -table th { - color: #222222; } - -.is-clearfix::after { - clear: both; - content: " "; - display: table; } - -.is-pulled-left { - float: left !important; } - -.is-pulled-right { - float: right !important; } - -.is-clipped { - overflow: hidden !important; } - -.is-size-1 { - font-size: 3rem !important; } - -.is-size-2 { - font-size: 2.5rem !important; } - -.is-size-3 { - font-size: 2rem !important; } - -.is-size-4 { - font-size: 1.5rem !important; } - -.is-size-5 { - font-size: 1.25rem !important; } - -.is-size-6 { - font-size: 1rem !important; } - -.is-size-7, .docstring > section > a.docs-sourcelink { - font-size: 0.75rem !important; } - -@media screen and (max-width: 768px) { - .is-size-1-mobile { - font-size: 3rem !important; } - .is-size-2-mobile { - font-size: 2.5rem !important; } - .is-size-3-mobile { - font-size: 2rem !important; } - .is-size-4-mobile { - font-size: 1.5rem !important; } - .is-size-5-mobile { - font-size: 1.25rem !important; } - .is-size-6-mobile { - font-size: 1rem !important; } - .is-size-7-mobile { - font-size: 0.75rem !important; } } - -@media screen and (min-width: 769px), print { - .is-size-1-tablet { - font-size: 3rem !important; } - .is-size-2-tablet { - font-size: 2.5rem !important; } - .is-size-3-tablet { - font-size: 2rem !important; } - .is-size-4-tablet { - font-size: 1.5rem !important; } - .is-size-5-tablet { - font-size: 1.25rem !important; } - .is-size-6-tablet { - font-size: 1rem !important; } - .is-size-7-tablet { - font-size: 0.75rem !important; } } - -@media screen and (max-width: 1055px) { - .is-size-1-touch { - font-size: 3rem !important; } - .is-size-2-touch { - font-size: 2.5rem !important; } - .is-size-3-touch { - font-size: 2rem !important; } - .is-size-4-touch { - font-size: 1.5rem !important; } - .is-size-5-touch { - font-size: 1.25rem !important; } - .is-size-6-touch { - font-size: 1rem !important; } - .is-size-7-touch { - font-size: 0.75rem !important; } } - -@media screen and (min-width: 1056px) { - .is-size-1-desktop { - font-size: 3rem !important; } - .is-size-2-desktop { - font-size: 2.5rem !important; } - .is-size-3-desktop { - font-size: 2rem !important; } - .is-size-4-desktop { - font-size: 1.5rem !important; } - .is-size-5-desktop { - font-size: 1.25rem !important; } - .is-size-6-desktop { - font-size: 1rem !important; } - .is-size-7-desktop { - font-size: 0.75rem !important; } } - -@media screen and (min-width: 1216px) { - .is-size-1-widescreen { - font-size: 3rem !important; } - .is-size-2-widescreen { - font-size: 2.5rem !important; } - .is-size-3-widescreen { - font-size: 2rem !important; } - .is-size-4-widescreen { - font-size: 1.5rem !important; } - .is-size-5-widescreen { - font-size: 1.25rem !important; } - .is-size-6-widescreen { - font-size: 1rem !important; } - .is-size-7-widescreen { - font-size: 0.75rem !important; } } - -@media screen and (min-width: 1408px) { - .is-size-1-fullhd { - font-size: 3rem !important; } - .is-size-2-fullhd { - font-size: 2.5rem !important; } - .is-size-3-fullhd { - font-size: 2rem !important; } - .is-size-4-fullhd { - font-size: 1.5rem !important; } - .is-size-5-fullhd { - font-size: 1.25rem !important; } - .is-size-6-fullhd { - font-size: 1rem !important; } - .is-size-7-fullhd { - font-size: 0.75rem !important; } } - -.has-text-centered { - text-align: center !important; } - -.has-text-justified { - text-align: justify !important; } - -.has-text-left { - text-align: left !important; } - -.has-text-right { - text-align: right !important; } - -@media screen and (max-width: 768px) { - .has-text-centered-mobile { - text-align: center !important; } } - -@media screen and (min-width: 769px), print { - .has-text-centered-tablet { - text-align: center !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .has-text-centered-tablet-only { - text-align: center !important; } } - -@media screen and (max-width: 1055px) { - .has-text-centered-touch { - text-align: center !important; } } - -@media screen and (min-width: 1056px) { - .has-text-centered-desktop { - text-align: center !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .has-text-centered-desktop-only { - text-align: center !important; } } - -@media screen and (min-width: 1216px) { - .has-text-centered-widescreen { - text-align: center !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .has-text-centered-widescreen-only { - text-align: center !important; } } - -@media screen and (min-width: 1408px) { - .has-text-centered-fullhd { - text-align: center !important; } } - -@media screen and (max-width: 768px) { - .has-text-justified-mobile { - text-align: justify !important; } } - -@media screen and (min-width: 769px), print { - .has-text-justified-tablet { - text-align: justify !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .has-text-justified-tablet-only { - text-align: justify !important; } } - -@media screen and (max-width: 1055px) { - .has-text-justified-touch { - text-align: justify !important; } } - -@media screen and (min-width: 1056px) { - .has-text-justified-desktop { - text-align: justify !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .has-text-justified-desktop-only { - text-align: justify !important; } } - -@media screen and (min-width: 1216px) { - .has-text-justified-widescreen { - text-align: justify !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .has-text-justified-widescreen-only { - text-align: justify !important; } } - -@media screen and (min-width: 1408px) { - .has-text-justified-fullhd { - text-align: justify !important; } } - -@media screen and (max-width: 768px) { - .has-text-left-mobile { - text-align: left !important; } } - -@media screen and (min-width: 769px), print { - .has-text-left-tablet { - text-align: left !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .has-text-left-tablet-only { - text-align: left !important; } } - -@media screen and (max-width: 1055px) { - .has-text-left-touch { - text-align: left !important; } } - -@media screen and (min-width: 1056px) { - .has-text-left-desktop { - text-align: left !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .has-text-left-desktop-only { - text-align: left !important; } } - -@media screen and (min-width: 1216px) { - .has-text-left-widescreen { - text-align: left !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .has-text-left-widescreen-only { - text-align: left !important; } } - -@media screen and (min-width: 1408px) { - .has-text-left-fullhd { - text-align: left !important; } } - -@media screen and (max-width: 768px) { - .has-text-right-mobile { - text-align: right !important; } } - -@media screen and (min-width: 769px), print { - .has-text-right-tablet { - text-align: right !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .has-text-right-tablet-only { - text-align: right !important; } } - -@media screen and (max-width: 1055px) { - .has-text-right-touch { - text-align: right !important; } } - -@media screen and (min-width: 1056px) { - .has-text-right-desktop { - text-align: right !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .has-text-right-desktop-only { - text-align: right !important; } } - -@media screen and (min-width: 1216px) { - .has-text-right-widescreen { - text-align: right !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .has-text-right-widescreen-only { - text-align: right !important; } } - -@media screen and (min-width: 1408px) { - .has-text-right-fullhd { - text-align: right !important; } } - -.is-capitalized { - text-transform: capitalize !important; } - -.is-lowercase { - text-transform: lowercase !important; } - -.is-uppercase { - text-transform: uppercase !important; } - -.is-italic { - font-style: italic !important; } - -.has-text-white { - color: white !important; } - -a.has-text-white:hover, a.has-text-white:focus { - color: #e6e6e6 !important; } - -.has-background-white { - background-color: white !important; } - -.has-text-black { - color: #0a0a0a !important; } - -a.has-text-black:hover, a.has-text-black:focus { - color: black !important; } - -.has-background-black { - background-color: #0a0a0a !important; } - -.has-text-light { - color: whitesmoke !important; } - -a.has-text-light:hover, a.has-text-light:focus { - color: #dbdbdb !important; } - -.has-background-light { - background-color: whitesmoke !important; } - -.has-text-dark { - color: #363636 !important; } - -a.has-text-dark:hover, a.has-text-dark:focus { - color: #1c1c1c !important; } - -.has-background-dark { - background-color: #363636 !important; } - -.has-text-primary { - color: #4eb5de !important; } - -a.has-text-primary:hover, a.has-text-primary:focus { - color: #27a1d2 !important; } - -.has-background-primary { - background-color: #4eb5de !important; } - -.has-text-link { - color: #2e63b8 !important; } - -a.has-text-link:hover, a.has-text-link:focus { - color: #244d8f !important; } - -.has-background-link { - background-color: #2e63b8 !important; } - -.has-text-info { - color: #209cee !important; } - -a.has-text-info:hover, a.has-text-info:focus { - color: #1081cb !important; } - -.has-background-info { - background-color: #209cee !important; } - -.has-text-success { - color: #22c35b !important; } - -a.has-text-success:hover, a.has-text-success:focus { - color: #1a9847 !important; } - -.has-background-success { - background-color: #22c35b !important; } - -.has-text-warning { - color: #ffdd57 !important; } - -a.has-text-warning:hover, a.has-text-warning:focus { - color: #ffd324 !important; } - -.has-background-warning { - background-color: #ffdd57 !important; } - -.has-text-danger { - color: #da0b00 !important; } - -a.has-text-danger:hover, a.has-text-danger:focus { - color: #a70800 !important; } - -.has-background-danger { - background-color: #da0b00 !important; } - -.has-text-black-bis { - color: #121212 !important; } - -.has-background-black-bis { - background-color: #121212 !important; } - -.has-text-black-ter { - color: #242424 !important; } - -.has-background-black-ter { - background-color: #242424 !important; } - -.has-text-grey-darker { - color: #363636 !important; } - -.has-background-grey-darker { - background-color: #363636 !important; } - -.has-text-grey-dark { - color: #4a4a4a !important; } - -.has-background-grey-dark { - background-color: #4a4a4a !important; } - -.has-text-grey { - color: #6b6b6b !important; } - -.has-background-grey { - background-color: #6b6b6b !important; } - -.has-text-grey-light { - color: #b5b5b5 !important; } - -.has-background-grey-light { - background-color: #b5b5b5 !important; } - -.has-text-grey-lighter { - color: #dbdbdb !important; } - -.has-background-grey-lighter { - background-color: #dbdbdb !important; } - -.has-text-white-ter { - color: whitesmoke !important; } - -.has-background-white-ter { - background-color: whitesmoke !important; } - -.has-text-white-bis { - color: #fafafa !important; } - -.has-background-white-bis { - background-color: #fafafa !important; } - -.has-text-weight-light { - font-weight: 300 !important; } - -.has-text-weight-normal { - font-weight: 400 !important; } - -.has-text-weight-medium { - font-weight: 500 !important; } - -.has-text-weight-semibold { - font-weight: 600 !important; } - -.has-text-weight-bold { - font-weight: 700 !important; } - -.is-family-primary { - font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; } - -.is-family-secondary { - font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; } - -.is-family-sans-serif { - font-family: "Lato Medium", -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; } - -.is-family-monospace { - font-family: "JuliaMono", "SFMono-Regular", "Menlo", "Consolas", "Liberation Mono", "DejaVu Sans Mono", monospace !important; } - -.is-family-code { - font-family: "JuliaMono", "SFMono-Regular", "Menlo", "Consolas", "Liberation Mono", "DejaVu Sans Mono", monospace !important; } - -.is-block { - display: block !important; } - -@media screen and (max-width: 768px) { - .is-block-mobile { - display: block !important; } } - -@media screen and (min-width: 769px), print { - .is-block-tablet { - display: block !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-block-tablet-only { - display: block !important; } } - -@media screen and (max-width: 1055px) { - .is-block-touch { - display: block !important; } } - -@media screen and (min-width: 1056px) { - .is-block-desktop { - display: block !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-block-desktop-only { - display: block !important; } } - -@media screen and (min-width: 1216px) { - .is-block-widescreen { - display: block !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-block-widescreen-only { - display: block !important; } } - -@media screen and (min-width: 1408px) { - .is-block-fullhd { - display: block !important; } } - -.is-flex { - display: flex !important; } - -@media screen and (max-width: 768px) { - .is-flex-mobile { - display: flex !important; } } - -@media screen and (min-width: 769px), print { - .is-flex-tablet { - display: flex !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-flex-tablet-only { - display: flex !important; } } - -@media screen and (max-width: 1055px) { - .is-flex-touch { - display: flex !important; } } - -@media screen and (min-width: 1056px) { - .is-flex-desktop { - display: flex !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-flex-desktop-only { - display: flex !important; } } - -@media screen and (min-width: 1216px) { - .is-flex-widescreen { - display: flex !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-flex-widescreen-only { - display: flex !important; } } - -@media screen and (min-width: 1408px) { - .is-flex-fullhd { - display: flex !important; } } - -.is-inline { - display: inline !important; } - -@media screen and (max-width: 768px) { - .is-inline-mobile { - display: inline !important; } } - -@media screen and (min-width: 769px), print { - .is-inline-tablet { - display: inline !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-inline-tablet-only { - display: inline !important; } } - -@media screen and (max-width: 1055px) { - .is-inline-touch { - display: inline !important; } } - -@media screen and (min-width: 1056px) { - .is-inline-desktop { - display: inline !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-inline-desktop-only { - display: inline !important; } } - -@media screen and (min-width: 1216px) { - .is-inline-widescreen { - display: inline !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-inline-widescreen-only { - display: inline !important; } } - -@media screen and (min-width: 1408px) { - .is-inline-fullhd { - display: inline !important; } } - -.is-inline-block { - display: inline-block !important; } - -@media screen and (max-width: 768px) { - .is-inline-block-mobile { - display: inline-block !important; } } - -@media screen and (min-width: 769px), print { - .is-inline-block-tablet { - display: inline-block !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-inline-block-tablet-only { - display: inline-block !important; } } - -@media screen and (max-width: 1055px) { - .is-inline-block-touch { - display: inline-block !important; } } - -@media screen and (min-width: 1056px) { - .is-inline-block-desktop { - display: inline-block !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-inline-block-desktop-only { - display: inline-block !important; } } - -@media screen and (min-width: 1216px) { - .is-inline-block-widescreen { - display: inline-block !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-inline-block-widescreen-only { - display: inline-block !important; } } - -@media screen and (min-width: 1408px) { - .is-inline-block-fullhd { - display: inline-block !important; } } - -.is-inline-flex { - display: inline-flex !important; } - -@media screen and (max-width: 768px) { - .is-inline-flex-mobile { - display: inline-flex !important; } } - -@media screen and (min-width: 769px), print { - .is-inline-flex-tablet { - display: inline-flex !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-inline-flex-tablet-only { - display: inline-flex !important; } } - -@media screen and (max-width: 1055px) { - .is-inline-flex-touch { - display: inline-flex !important; } } - -@media screen and (min-width: 1056px) { - .is-inline-flex-desktop { - display: inline-flex !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-inline-flex-desktop-only { - display: inline-flex !important; } } - -@media screen and (min-width: 1216px) { - .is-inline-flex-widescreen { - display: inline-flex !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-inline-flex-widescreen-only { - display: inline-flex !important; } } - -@media screen and (min-width: 1408px) { - .is-inline-flex-fullhd { - display: inline-flex !important; } } - -.is-hidden { - display: none !important; } - -.is-sr-only { - border: none !important; - clip: rect(0, 0, 0, 0) !important; - height: 0.01em !important; - overflow: hidden !important; - padding: 0 !important; - position: absolute !important; - white-space: nowrap !important; - width: 0.01em !important; } - -@media screen and (max-width: 768px) { - .is-hidden-mobile { - display: none !important; } } - -@media screen and (min-width: 769px), print { - .is-hidden-tablet { - display: none !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-hidden-tablet-only { - display: none !important; } } - -@media screen and (max-width: 1055px) { - .is-hidden-touch { - display: none !important; } } - -@media screen and (min-width: 1056px) { - .is-hidden-desktop { - display: none !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-hidden-desktop-only { - display: none !important; } } - -@media screen and (min-width: 1216px) { - .is-hidden-widescreen { - display: none !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-hidden-widescreen-only { - display: none !important; } } - -@media screen and (min-width: 1408px) { - .is-hidden-fullhd { - display: none !important; } } - -.is-invisible { - visibility: hidden !important; } - -@media screen and (max-width: 768px) { - .is-invisible-mobile { - visibility: hidden !important; } } - -@media screen and (min-width: 769px), print { - .is-invisible-tablet { - visibility: hidden !important; } } - -@media screen and (min-width: 769px) and (max-width: 1055px) { - .is-invisible-tablet-only { - visibility: hidden !important; } } - -@media screen and (max-width: 1055px) { - .is-invisible-touch { - visibility: hidden !important; } } - -@media screen and (min-width: 1056px) { - .is-invisible-desktop { - visibility: hidden !important; } } - -@media screen and (min-width: 1056px) and (max-width: 1215px) { - .is-invisible-desktop-only { - visibility: hidden !important; } } - -@media screen and (min-width: 1216px) { - .is-invisible-widescreen { - visibility: hidden !important; } } - -@media screen and (min-width: 1216px) and (max-width: 1407px) { - .is-invisible-widescreen-only { - visibility: hidden !important; } } - -@media screen and (min-width: 1408px) { - .is-invisible-fullhd { - visibility: hidden !important; } } - -.is-marginless { - margin: 0 !important; } - -.is-paddingless { - padding: 0 !important; } - -.is-radiusless { - border-radius: 0 !important; } - -.is-shadowless { - box-shadow: none !important; } - -.is-relative { - position: relative !important; } - -.box { - background-color: white; - border-radius: 6px; - box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); - color: #222222; - display: block; - padding: 1.25rem; } - -a.box:hover, a.box:focus { - box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px #2e63b8; } - -a.box:active { - box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2), 0 0 0 1px #2e63b8; } - -.button { - background-color: white; - border-color: #dbdbdb; - border-width: 1px; - color: #363636; - cursor: pointer; - justify-content: center; - padding-bottom: calc(0.375em - 1px); - padding-left: 0.75em; - padding-right: 0.75em; - padding-top: calc(0.375em - 1px); - text-align: center; - white-space: nowrap; } - .button strong { - color: inherit; } - .button .icon, .button .icon.is-small, .button #documenter .docs-sidebar form.docs-search > input.icon, #documenter .docs-sidebar .button form.docs-search > input.icon, .button .icon.is-medium, .button .icon.is-large { - height: 1.5em; - width: 1.5em; } - .button .icon:first-child:not(:last-child) { - margin-left: calc(-0.375em - 1px); - margin-right: 0.1875em; } - .button .icon:last-child:not(:first-child) { - margin-left: 0.1875em; - margin-right: calc(-0.375em - 1px); } - .button .icon:first-child:last-child { - margin-left: calc(-0.375em - 1px); - margin-right: calc(-0.375em - 1px); } - .button:hover, .button.is-hovered { - border-color: #b5b5b5; - color: #363636; } - .button:focus, .button.is-focused { - border-color: #3c5dcd; - color: #363636; } - .button:focus:not(:active), .button.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(46, 99, 184, 0.25); } - .button:active, .button.is-active { - border-color: #4a4a4a; - color: #363636; } - .button.is-text { - background-color: transparent; - border-color: transparent; - color: #222222; - text-decoration: underline; } - .button.is-text:hover, .button.is-text.is-hovered, .button.is-text:focus, .button.is-text.is-focused { - background-color: whitesmoke; - color: #222222; } - .button.is-text:active, .button.is-text.is-active { - background-color: #e8e8e8; - color: #222222; } - .button.is-text[disabled], fieldset[disabled] .button.is-text { - background-color: transparent; - border-color: transparent; - box-shadow: none; } - .button.is-white { - background-color: white; - border-color: transparent; - color: #0a0a0a; } - .button.is-white:hover, .button.is-white.is-hovered { - background-color: #f9f9f9; - border-color: transparent; - color: #0a0a0a; } - .button.is-white:focus, .button.is-white.is-focused { - border-color: transparent; - color: #0a0a0a; } - .button.is-white:focus:not(:active), .button.is-white.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } - .button.is-white:active, .button.is-white.is-active { - background-color: #f2f2f2; - border-color: transparent; - color: #0a0a0a; } - .button.is-white[disabled], fieldset[disabled] .button.is-white { - background-color: white; - border-color: transparent; - box-shadow: none; } - .button.is-white.is-inverted { - background-color: #0a0a0a; - color: white; } - .button.is-white.is-inverted:hover, .button.is-white.is-inverted.is-hovered { - background-color: black; } - .button.is-white.is-inverted[disabled], fieldset[disabled] .button.is-white.is-inverted { - background-color: #0a0a0a; - border-color: transparent; - box-shadow: none; - color: white; } - .button.is-white.is-loading::after { - border-color: transparent transparent #0a0a0a #0a0a0a !important; } - .button.is-white.is-outlined { - background-color: transparent; - border-color: white; - color: white; } - .button.is-white.is-outlined:hover, .button.is-white.is-outlined.is-hovered, .button.is-white.is-outlined:focus, .button.is-white.is-outlined.is-focused { - background-color: white; - border-color: white; - color: #0a0a0a; } - .button.is-white.is-outlined.is-loading::after { - border-color: transparent transparent white white !important; } - .button.is-white.is-outlined.is-loading:hover::after, .button.is-white.is-outlined.is-loading.is-hovered::after, .button.is-white.is-outlined.is-loading:focus::after, .button.is-white.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #0a0a0a #0a0a0a !important; } - .button.is-white.is-outlined[disabled], fieldset[disabled] .button.is-white.is-outlined { - background-color: transparent; - border-color: white; - box-shadow: none; - color: white; } - .button.is-white.is-inverted.is-outlined { - background-color: transparent; - border-color: #0a0a0a; - color: #0a0a0a; } - .button.is-white.is-inverted.is-outlined:hover, .button.is-white.is-inverted.is-outlined.is-hovered, .button.is-white.is-inverted.is-outlined:focus, .button.is-white.is-inverted.is-outlined.is-focused { - background-color: #0a0a0a; - color: white; } - .button.is-white.is-inverted.is-outlined.is-loading:hover::after, .button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-white.is-inverted.is-outlined.is-loading:focus::after, .button.is-white.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent white white !important; } - .button.is-white.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-white.is-inverted.is-outlined { - background-color: transparent; - border-color: #0a0a0a; - box-shadow: none; - color: #0a0a0a; } - .button.is-black { - background-color: #0a0a0a; - border-color: transparent; - color: white; } - .button.is-black:hover, .button.is-black.is-hovered { - background-color: #040404; - border-color: transparent; - color: white; } - .button.is-black:focus, .button.is-black.is-focused { - border-color: transparent; - color: white; } - .button.is-black:focus:not(:active), .button.is-black.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } - .button.is-black:active, .button.is-black.is-active { - background-color: black; - border-color: transparent; - color: white; } - .button.is-black[disabled], fieldset[disabled] .button.is-black { - background-color: #0a0a0a; - border-color: transparent; - box-shadow: none; } - .button.is-black.is-inverted { - background-color: white; - color: #0a0a0a; } - .button.is-black.is-inverted:hover, .button.is-black.is-inverted.is-hovered { - background-color: #f2f2f2; } - .button.is-black.is-inverted[disabled], fieldset[disabled] .button.is-black.is-inverted { - background-color: white; - border-color: transparent; - box-shadow: none; - color: #0a0a0a; } - .button.is-black.is-loading::after { - border-color: transparent transparent white white !important; } - .button.is-black.is-outlined { - background-color: transparent; - border-color: #0a0a0a; - color: #0a0a0a; } - .button.is-black.is-outlined:hover, .button.is-black.is-outlined.is-hovered, .button.is-black.is-outlined:focus, .button.is-black.is-outlined.is-focused { - background-color: #0a0a0a; - border-color: #0a0a0a; - color: white; } - .button.is-black.is-outlined.is-loading::after { - border-color: transparent transparent #0a0a0a #0a0a0a !important; } - .button.is-black.is-outlined.is-loading:hover::after, .button.is-black.is-outlined.is-loading.is-hovered::after, .button.is-black.is-outlined.is-loading:focus::after, .button.is-black.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent white white !important; } - .button.is-black.is-outlined[disabled], fieldset[disabled] .button.is-black.is-outlined { - background-color: transparent; - border-color: #0a0a0a; - box-shadow: none; - color: #0a0a0a; } - .button.is-black.is-inverted.is-outlined { - background-color: transparent; - border-color: white; - color: white; } - .button.is-black.is-inverted.is-outlined:hover, .button.is-black.is-inverted.is-outlined.is-hovered, .button.is-black.is-inverted.is-outlined:focus, .button.is-black.is-inverted.is-outlined.is-focused { - background-color: white; - color: #0a0a0a; } - .button.is-black.is-inverted.is-outlined.is-loading:hover::after, .button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-black.is-inverted.is-outlined.is-loading:focus::after, .button.is-black.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #0a0a0a #0a0a0a !important; } - .button.is-black.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-black.is-inverted.is-outlined { - background-color: transparent; - border-color: white; - box-shadow: none; - color: white; } - .button.is-light { - background-color: whitesmoke; - border-color: transparent; - color: #363636; } - .button.is-light:hover, .button.is-light.is-hovered { - background-color: #eeeeee; - border-color: transparent; - color: #363636; } - .button.is-light:focus, .button.is-light.is-focused { - border-color: transparent; - color: #363636; } - .button.is-light:focus:not(:active), .button.is-light.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); } - .button.is-light:active, .button.is-light.is-active { - background-color: #e8e8e8; - border-color: transparent; - color: #363636; } - .button.is-light[disabled], fieldset[disabled] .button.is-light { - background-color: whitesmoke; - border-color: transparent; - box-shadow: none; } - .button.is-light.is-inverted { - background-color: #363636; - color: whitesmoke; } - .button.is-light.is-inverted:hover, .button.is-light.is-inverted.is-hovered { - background-color: #292929; } - .button.is-light.is-inverted[disabled], fieldset[disabled] .button.is-light.is-inverted { - background-color: #363636; - border-color: transparent; - box-shadow: none; - color: whitesmoke; } - .button.is-light.is-loading::after { - border-color: transparent transparent #363636 #363636 !important; } - .button.is-light.is-outlined { - background-color: transparent; - border-color: whitesmoke; - color: whitesmoke; } - .button.is-light.is-outlined:hover, .button.is-light.is-outlined.is-hovered, .button.is-light.is-outlined:focus, .button.is-light.is-outlined.is-focused { - background-color: whitesmoke; - border-color: whitesmoke; - color: #363636; } - .button.is-light.is-outlined.is-loading::after { - border-color: transparent transparent whitesmoke whitesmoke !important; } - .button.is-light.is-outlined.is-loading:hover::after, .button.is-light.is-outlined.is-loading.is-hovered::after, .button.is-light.is-outlined.is-loading:focus::after, .button.is-light.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #363636 #363636 !important; } - .button.is-light.is-outlined[disabled], fieldset[disabled] .button.is-light.is-outlined { - background-color: transparent; - border-color: whitesmoke; - box-shadow: none; - color: whitesmoke; } - .button.is-light.is-inverted.is-outlined { - background-color: transparent; - border-color: #363636; - color: #363636; } - .button.is-light.is-inverted.is-outlined:hover, .button.is-light.is-inverted.is-outlined.is-hovered, .button.is-light.is-inverted.is-outlined:focus, .button.is-light.is-inverted.is-outlined.is-focused { - background-color: #363636; - color: whitesmoke; } - .button.is-light.is-inverted.is-outlined.is-loading:hover::after, .button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-light.is-inverted.is-outlined.is-loading:focus::after, .button.is-light.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent whitesmoke whitesmoke !important; } - .button.is-light.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-light.is-inverted.is-outlined { - background-color: transparent; - border-color: #363636; - box-shadow: none; - color: #363636; } - .button.is-dark, .content kbd.button { - background-color: #363636; - border-color: transparent; - color: whitesmoke; } - .button.is-dark:hover, .content kbd.button:hover, .button.is-dark.is-hovered, .content kbd.button.is-hovered { - background-color: #2f2f2f; - border-color: transparent; - color: whitesmoke; } - .button.is-dark:focus, .content kbd.button:focus, .button.is-dark.is-focused, .content kbd.button.is-focused { - border-color: transparent; - color: whitesmoke; } - .button.is-dark:focus:not(:active), .content kbd.button:focus:not(:active), .button.is-dark.is-focused:not(:active), .content kbd.button.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); } - .button.is-dark:active, .content kbd.button:active, .button.is-dark.is-active, .content kbd.button.is-active { - background-color: #292929; - border-color: transparent; - color: whitesmoke; } - .button.is-dark[disabled], .content kbd.button[disabled], fieldset[disabled] .button.is-dark, fieldset[disabled] .content kbd.button, .content fieldset[disabled] kbd.button { - background-color: #363636; - border-color: transparent; - box-shadow: none; } - .button.is-dark.is-inverted, .content kbd.button.is-inverted { - background-color: whitesmoke; - color: #363636; } - .button.is-dark.is-inverted:hover, .content kbd.button.is-inverted:hover, .button.is-dark.is-inverted.is-hovered, .content kbd.button.is-inverted.is-hovered { - background-color: #e8e8e8; } - .button.is-dark.is-inverted[disabled], .content kbd.button.is-inverted[disabled], fieldset[disabled] .button.is-dark.is-inverted, fieldset[disabled] .content kbd.button.is-inverted, .content fieldset[disabled] kbd.button.is-inverted { - background-color: whitesmoke; - border-color: transparent; - box-shadow: none; - color: #363636; } - .button.is-dark.is-loading::after, .content kbd.button.is-loading::after { - border-color: transparent transparent whitesmoke whitesmoke !important; } - .button.is-dark.is-outlined, .content kbd.button.is-outlined { - background-color: transparent; - border-color: #363636; - color: #363636; } - .button.is-dark.is-outlined:hover, .content kbd.button.is-outlined:hover, .button.is-dark.is-outlined.is-hovered, .content kbd.button.is-outlined.is-hovered, .button.is-dark.is-outlined:focus, .content kbd.button.is-outlined:focus, .button.is-dark.is-outlined.is-focused, .content kbd.button.is-outlined.is-focused { - background-color: #363636; - border-color: #363636; - color: whitesmoke; } - .button.is-dark.is-outlined.is-loading::after, .content kbd.button.is-outlined.is-loading::after { - border-color: transparent transparent #363636 #363636 !important; } - .button.is-dark.is-outlined.is-loading:hover::after, .content kbd.button.is-outlined.is-loading:hover::after, .button.is-dark.is-outlined.is-loading.is-hovered::after, .content kbd.button.is-outlined.is-loading.is-hovered::after, .button.is-dark.is-outlined.is-loading:focus::after, .content kbd.button.is-outlined.is-loading:focus::after, .button.is-dark.is-outlined.is-loading.is-focused::after, .content kbd.button.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent whitesmoke whitesmoke !important; } - .button.is-dark.is-outlined[disabled], .content kbd.button.is-outlined[disabled], fieldset[disabled] .button.is-dark.is-outlined, fieldset[disabled] .content kbd.button.is-outlined, .content fieldset[disabled] kbd.button.is-outlined { - background-color: transparent; - border-color: #363636; - box-shadow: none; - color: #363636; } - .button.is-dark.is-inverted.is-outlined, .content kbd.button.is-inverted.is-outlined { - background-color: transparent; - border-color: whitesmoke; - color: whitesmoke; } - .button.is-dark.is-inverted.is-outlined:hover, .content kbd.button.is-inverted.is-outlined:hover, .button.is-dark.is-inverted.is-outlined.is-hovered, .content kbd.button.is-inverted.is-outlined.is-hovered, .button.is-dark.is-inverted.is-outlined:focus, .content kbd.button.is-inverted.is-outlined:focus, .button.is-dark.is-inverted.is-outlined.is-focused, .content kbd.button.is-inverted.is-outlined.is-focused { - background-color: whitesmoke; - color: #363636; } - .button.is-dark.is-inverted.is-outlined.is-loading:hover::after, .content kbd.button.is-inverted.is-outlined.is-loading:hover::after, .button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after, .content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-dark.is-inverted.is-outlined.is-loading:focus::after, .content kbd.button.is-inverted.is-outlined.is-loading:focus::after, .button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after, .content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #363636 #363636 !important; } - .button.is-dark.is-inverted.is-outlined[disabled], .content kbd.button.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-dark.is-inverted.is-outlined, fieldset[disabled] .content kbd.button.is-inverted.is-outlined, .content fieldset[disabled] kbd.button.is-inverted.is-outlined { - background-color: transparent; - border-color: whitesmoke; - box-shadow: none; - color: whitesmoke; } - .button.is-primary, .docstring > section > a.button.docs-sourcelink { - background-color: #4eb5de; - border-color: transparent; - color: #fff; } - .button.is-primary:hover, .docstring > section > a.button.docs-sourcelink:hover, .button.is-primary.is-hovered, .docstring > section > a.button.is-hovered.docs-sourcelink { - background-color: #43b1dc; - border-color: transparent; - color: #fff; } - .button.is-primary:focus, .docstring > section > a.button.docs-sourcelink:focus, .button.is-primary.is-focused, .docstring > section > a.button.is-focused.docs-sourcelink { - border-color: transparent; - color: #fff; } - .button.is-primary:focus:not(:active), .docstring > section > a.button.docs-sourcelink:focus:not(:active), .button.is-primary.is-focused:not(:active), .docstring > section > a.button.is-focused.docs-sourcelink:not(:active) { - box-shadow: 0 0 0 0.125em rgba(78, 181, 222, 0.25); } - .button.is-primary:active, .docstring > section > a.button.docs-sourcelink:active, .button.is-primary.is-active, .docstring > section > a.button.is-active.docs-sourcelink { - background-color: #39acda; - border-color: transparent; - color: #fff; } - .button.is-primary[disabled], .docstring > section > a.button.docs-sourcelink[disabled], fieldset[disabled] .button.is-primary, fieldset[disabled] .docstring > section > a.button.docs-sourcelink { - background-color: #4eb5de; - border-color: transparent; - box-shadow: none; } - .button.is-primary.is-inverted, .docstring > section > a.button.is-inverted.docs-sourcelink { - background-color: #fff; - color: #4eb5de; } - .button.is-primary.is-inverted:hover, .docstring > section > a.button.is-inverted.docs-sourcelink:hover, .button.is-primary.is-inverted.is-hovered, .docstring > section > a.button.is-inverted.is-hovered.docs-sourcelink { - background-color: #f2f2f2; } - .button.is-primary.is-inverted[disabled], .docstring > section > a.button.is-inverted.docs-sourcelink[disabled], fieldset[disabled] .button.is-primary.is-inverted, fieldset[disabled] .docstring > section > a.button.is-inverted.docs-sourcelink { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #4eb5de; } - .button.is-primary.is-loading::after, .docstring > section > a.button.is-loading.docs-sourcelink::after { - border-color: transparent transparent #fff #fff !important; } - .button.is-primary.is-outlined, .docstring > section > a.button.is-outlined.docs-sourcelink { - background-color: transparent; - border-color: #4eb5de; - color: #4eb5de; } - .button.is-primary.is-outlined:hover, .docstring > section > a.button.is-outlined.docs-sourcelink:hover, .button.is-primary.is-outlined.is-hovered, .docstring > section > a.button.is-outlined.is-hovered.docs-sourcelink, .button.is-primary.is-outlined:focus, .docstring > section > a.button.is-outlined.docs-sourcelink:focus, .button.is-primary.is-outlined.is-focused, .docstring > section > a.button.is-outlined.is-focused.docs-sourcelink { - background-color: #4eb5de; - border-color: #4eb5de; - color: #fff; } - .button.is-primary.is-outlined.is-loading::after, .docstring > section > a.button.is-outlined.is-loading.docs-sourcelink::after { - border-color: transparent transparent #4eb5de #4eb5de !important; } - .button.is-primary.is-outlined.is-loading:hover::after, .docstring > section > a.button.is-outlined.is-loading.docs-sourcelink:hover::after, .button.is-primary.is-outlined.is-loading.is-hovered::after, .docstring > section > a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after, .button.is-primary.is-outlined.is-loading:focus::after, .docstring > section > a.button.is-outlined.is-loading.docs-sourcelink:focus::after, .button.is-primary.is-outlined.is-loading.is-focused::after, .docstring > section > a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after { - border-color: transparent transparent #fff #fff !important; } - .button.is-primary.is-outlined[disabled], .docstring > section > a.button.is-outlined.docs-sourcelink[disabled], fieldset[disabled] .button.is-primary.is-outlined, fieldset[disabled] .docstring > section > a.button.is-outlined.docs-sourcelink { - background-color: transparent; - border-color: #4eb5de; - box-shadow: none; - color: #4eb5de; } - .button.is-primary.is-inverted.is-outlined, .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink { - background-color: transparent; - border-color: #fff; - color: #fff; } - .button.is-primary.is-inverted.is-outlined:hover, .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink:hover, .button.is-primary.is-inverted.is-outlined.is-hovered, .docstring > section > a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink, .button.is-primary.is-inverted.is-outlined:focus, .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink:focus, .button.is-primary.is-inverted.is-outlined.is-focused, .docstring > section > a.button.is-inverted.is-outlined.is-focused.docs-sourcelink { - background-color: #fff; - color: #4eb5de; } - .button.is-primary.is-inverted.is-outlined.is-loading:hover::after, .docstring > section > a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after, .button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after, .docstring > section > a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after, .button.is-primary.is-inverted.is-outlined.is-loading:focus::after, .docstring > section > a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after, .button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after, .docstring > section > a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after { - border-color: transparent transparent #4eb5de #4eb5de !important; } - .button.is-primary.is-inverted.is-outlined[disabled], .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink[disabled], fieldset[disabled] .button.is-primary.is-inverted.is-outlined, fieldset[disabled] .docstring > section > a.button.is-inverted.is-outlined.docs-sourcelink { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; } - .button.is-link { - background-color: #2e63b8; - border-color: transparent; - color: #fff; } - .button.is-link:hover, .button.is-link.is-hovered { - background-color: #2b5eae; - border-color: transparent; - color: #fff; } - .button.is-link:focus, .button.is-link.is-focused { - border-color: transparent; - color: #fff; } - .button.is-link:focus:not(:active), .button.is-link.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(46, 99, 184, 0.25); } - .button.is-link:active, .button.is-link.is-active { - background-color: #2958a4; - border-color: transparent; - color: #fff; } - .button.is-link[disabled], fieldset[disabled] .button.is-link { - background-color: #2e63b8; - border-color: transparent; - box-shadow: none; } - .button.is-link.is-inverted { - background-color: #fff; - color: #2e63b8; } - .button.is-link.is-inverted:hover, .button.is-link.is-inverted.is-hovered { - background-color: #f2f2f2; } - .button.is-link.is-inverted[disabled], fieldset[disabled] .button.is-link.is-inverted { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #2e63b8; } - .button.is-link.is-loading::after { - border-color: transparent transparent #fff #fff !important; } - .button.is-link.is-outlined { - background-color: transparent; - border-color: #2e63b8; - color: #2e63b8; } - .button.is-link.is-outlined:hover, .button.is-link.is-outlined.is-hovered, .button.is-link.is-outlined:focus, .button.is-link.is-outlined.is-focused { - background-color: #2e63b8; - border-color: #2e63b8; - color: #fff; } - .button.is-link.is-outlined.is-loading::after { - border-color: transparent transparent #2e63b8 #2e63b8 !important; } - .button.is-link.is-outlined.is-loading:hover::after, .button.is-link.is-outlined.is-loading.is-hovered::after, .button.is-link.is-outlined.is-loading:focus::after, .button.is-link.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #fff #fff !important; } - .button.is-link.is-outlined[disabled], fieldset[disabled] .button.is-link.is-outlined { - background-color: transparent; - border-color: #2e63b8; - box-shadow: none; - color: #2e63b8; } - .button.is-link.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff; } - .button.is-link.is-inverted.is-outlined:hover, .button.is-link.is-inverted.is-outlined.is-hovered, .button.is-link.is-inverted.is-outlined:focus, .button.is-link.is-inverted.is-outlined.is-focused { - background-color: #fff; - color: #2e63b8; } - .button.is-link.is-inverted.is-outlined.is-loading:hover::after, .button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-link.is-inverted.is-outlined.is-loading:focus::after, .button.is-link.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #2e63b8 #2e63b8 !important; } - .button.is-link.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-link.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; } - .button.is-info { - background-color: #209cee; - border-color: transparent; - color: #fff; } - .button.is-info:hover, .button.is-info.is-hovered { - background-color: #1497ed; - border-color: transparent; - color: #fff; } - .button.is-info:focus, .button.is-info.is-focused { - border-color: transparent; - color: #fff; } - .button.is-info:focus:not(:active), .button.is-info.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(32, 156, 238, 0.25); } - .button.is-info:active, .button.is-info.is-active { - background-color: #1190e3; - border-color: transparent; - color: #fff; } - .button.is-info[disabled], fieldset[disabled] .button.is-info { - background-color: #209cee; - border-color: transparent; - box-shadow: none; } - .button.is-info.is-inverted { - background-color: #fff; - color: #209cee; } - .button.is-info.is-inverted:hover, .button.is-info.is-inverted.is-hovered { - background-color: #f2f2f2; } - .button.is-info.is-inverted[disabled], fieldset[disabled] .button.is-info.is-inverted { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #209cee; } - .button.is-info.is-loading::after { - border-color: transparent transparent #fff #fff !important; } - .button.is-info.is-outlined { - background-color: transparent; - border-color: #209cee; - color: #209cee; } - .button.is-info.is-outlined:hover, .button.is-info.is-outlined.is-hovered, .button.is-info.is-outlined:focus, .button.is-info.is-outlined.is-focused { - background-color: #209cee; - border-color: #209cee; - color: #fff; } - .button.is-info.is-outlined.is-loading::after { - border-color: transparent transparent #209cee #209cee !important; } - .button.is-info.is-outlined.is-loading:hover::after, .button.is-info.is-outlined.is-loading.is-hovered::after, .button.is-info.is-outlined.is-loading:focus::after, .button.is-info.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #fff #fff !important; } - .button.is-info.is-outlined[disabled], fieldset[disabled] .button.is-info.is-outlined { - background-color: transparent; - border-color: #209cee; - box-shadow: none; - color: #209cee; } - .button.is-info.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff; } - .button.is-info.is-inverted.is-outlined:hover, .button.is-info.is-inverted.is-outlined.is-hovered, .button.is-info.is-inverted.is-outlined:focus, .button.is-info.is-inverted.is-outlined.is-focused { - background-color: #fff; - color: #209cee; } - .button.is-info.is-inverted.is-outlined.is-loading:hover::after, .button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-info.is-inverted.is-outlined.is-loading:focus::after, .button.is-info.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #209cee #209cee !important; } - .button.is-info.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-info.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; } - .button.is-success { - background-color: #22c35b; - border-color: transparent; - color: #fff; } - .button.is-success:hover, .button.is-success.is-hovered { - background-color: #20b856; - border-color: transparent; - color: #fff; } - .button.is-success:focus, .button.is-success.is-focused { - border-color: transparent; - color: #fff; } - .button.is-success:focus:not(:active), .button.is-success.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(34, 195, 91, 0.25); } - .button.is-success:active, .button.is-success.is-active { - background-color: #1ead51; - border-color: transparent; - color: #fff; } - .button.is-success[disabled], fieldset[disabled] .button.is-success { - background-color: #22c35b; - border-color: transparent; - box-shadow: none; } - .button.is-success.is-inverted { - background-color: #fff; - color: #22c35b; } - .button.is-success.is-inverted:hover, .button.is-success.is-inverted.is-hovered { - background-color: #f2f2f2; } - .button.is-success.is-inverted[disabled], fieldset[disabled] .button.is-success.is-inverted { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #22c35b; } - .button.is-success.is-loading::after { - border-color: transparent transparent #fff #fff !important; } - .button.is-success.is-outlined { - background-color: transparent; - border-color: #22c35b; - color: #22c35b; } - .button.is-success.is-outlined:hover, .button.is-success.is-outlined.is-hovered, .button.is-success.is-outlined:focus, .button.is-success.is-outlined.is-focused { - background-color: #22c35b; - border-color: #22c35b; - color: #fff; } - .button.is-success.is-outlined.is-loading::after { - border-color: transparent transparent #22c35b #22c35b !important; } - .button.is-success.is-outlined.is-loading:hover::after, .button.is-success.is-outlined.is-loading.is-hovered::after, .button.is-success.is-outlined.is-loading:focus::after, .button.is-success.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #fff #fff !important; } - .button.is-success.is-outlined[disabled], fieldset[disabled] .button.is-success.is-outlined { - background-color: transparent; - border-color: #22c35b; - box-shadow: none; - color: #22c35b; } - .button.is-success.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff; } - .button.is-success.is-inverted.is-outlined:hover, .button.is-success.is-inverted.is-outlined.is-hovered, .button.is-success.is-inverted.is-outlined:focus, .button.is-success.is-inverted.is-outlined.is-focused { - background-color: #fff; - color: #22c35b; } - .button.is-success.is-inverted.is-outlined.is-loading:hover::after, .button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-success.is-inverted.is-outlined.is-loading:focus::after, .button.is-success.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #22c35b #22c35b !important; } - .button.is-success.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-success.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; } - .button.is-warning { - background-color: #ffdd57; - border-color: transparent; - color: rgba(0, 0, 0, 0.7); } - .button.is-warning:hover, .button.is-warning.is-hovered { - background-color: #ffda4a; - border-color: transparent; - color: rgba(0, 0, 0, 0.7); } - .button.is-warning:focus, .button.is-warning.is-focused { - border-color: transparent; - color: rgba(0, 0, 0, 0.7); } - .button.is-warning:focus:not(:active), .button.is-warning.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(255, 221, 87, 0.25); } - .button.is-warning:active, .button.is-warning.is-active { - background-color: #ffd83e; - border-color: transparent; - color: rgba(0, 0, 0, 0.7); } - .button.is-warning[disabled], fieldset[disabled] .button.is-warning { - background-color: #ffdd57; - border-color: transparent; - box-shadow: none; } - .button.is-warning.is-inverted { - background-color: rgba(0, 0, 0, 0.7); - color: #ffdd57; } - .button.is-warning.is-inverted:hover, .button.is-warning.is-inverted.is-hovered { - background-color: rgba(0, 0, 0, 0.7); } - .button.is-warning.is-inverted[disabled], fieldset[disabled] .button.is-warning.is-inverted { - background-color: rgba(0, 0, 0, 0.7); - border-color: transparent; - box-shadow: none; - color: #ffdd57; } - .button.is-warning.is-loading::after { - border-color: transparent transparent rgba(0, 0, 0, 0.7) rgba(0, 0, 0, 0.7) !important; } - .button.is-warning.is-outlined { - background-color: transparent; - border-color: #ffdd57; - color: #ffdd57; } - .button.is-warning.is-outlined:hover, .button.is-warning.is-outlined.is-hovered, .button.is-warning.is-outlined:focus, .button.is-warning.is-outlined.is-focused { - background-color: #ffdd57; - border-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); } - .button.is-warning.is-outlined.is-loading::after { - border-color: transparent transparent #ffdd57 #ffdd57 !important; } - .button.is-warning.is-outlined.is-loading:hover::after, .button.is-warning.is-outlined.is-loading.is-hovered::after, .button.is-warning.is-outlined.is-loading:focus::after, .button.is-warning.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent rgba(0, 0, 0, 0.7) rgba(0, 0, 0, 0.7) !important; } - .button.is-warning.is-outlined[disabled], fieldset[disabled] .button.is-warning.is-outlined { - background-color: transparent; - border-color: #ffdd57; - box-shadow: none; - color: #ffdd57; } - .button.is-warning.is-inverted.is-outlined { - background-color: transparent; - border-color: rgba(0, 0, 0, 0.7); - color: rgba(0, 0, 0, 0.7); } - .button.is-warning.is-inverted.is-outlined:hover, .button.is-warning.is-inverted.is-outlined.is-hovered, .button.is-warning.is-inverted.is-outlined:focus, .button.is-warning.is-inverted.is-outlined.is-focused { - background-color: rgba(0, 0, 0, 0.7); - color: #ffdd57; } - .button.is-warning.is-inverted.is-outlined.is-loading:hover::after, .button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-warning.is-inverted.is-outlined.is-loading:focus::after, .button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #ffdd57 #ffdd57 !important; } - .button.is-warning.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-warning.is-inverted.is-outlined { - background-color: transparent; - border-color: rgba(0, 0, 0, 0.7); - box-shadow: none; - color: rgba(0, 0, 0, 0.7); } - .button.is-danger { - background-color: #da0b00; - border-color: transparent; - color: #fff; } - .button.is-danger:hover, .button.is-danger.is-hovered { - background-color: #cd0a00; - border-color: transparent; - color: #fff; } - .button.is-danger:focus, .button.is-danger.is-focused { - border-color: transparent; - color: #fff; } - .button.is-danger:focus:not(:active), .button.is-danger.is-focused:not(:active) { - box-shadow: 0 0 0 0.125em rgba(218, 11, 0, 0.25); } - .button.is-danger:active, .button.is-danger.is-active { - background-color: #c10a00; - border-color: transparent; - color: #fff; } - .button.is-danger[disabled], fieldset[disabled] .button.is-danger { - background-color: #da0b00; - border-color: transparent; - box-shadow: none; } - .button.is-danger.is-inverted { - background-color: #fff; - color: #da0b00; } - .button.is-danger.is-inverted:hover, .button.is-danger.is-inverted.is-hovered { - background-color: #f2f2f2; } - .button.is-danger.is-inverted[disabled], fieldset[disabled] .button.is-danger.is-inverted { - background-color: #fff; - border-color: transparent; - box-shadow: none; - color: #da0b00; } - .button.is-danger.is-loading::after { - border-color: transparent transparent #fff #fff !important; } - .button.is-danger.is-outlined { - background-color: transparent; - border-color: #da0b00; - color: #da0b00; } - .button.is-danger.is-outlined:hover, .button.is-danger.is-outlined.is-hovered, .button.is-danger.is-outlined:focus, .button.is-danger.is-outlined.is-focused { - background-color: #da0b00; - border-color: #da0b00; - color: #fff; } - .button.is-danger.is-outlined.is-loading::after { - border-color: transparent transparent #da0b00 #da0b00 !important; } - .button.is-danger.is-outlined.is-loading:hover::after, .button.is-danger.is-outlined.is-loading.is-hovered::after, .button.is-danger.is-outlined.is-loading:focus::after, .button.is-danger.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #fff #fff !important; } - .button.is-danger.is-outlined[disabled], fieldset[disabled] .button.is-danger.is-outlined { - background-color: transparent; - border-color: #da0b00; - box-shadow: none; - color: #da0b00; } - .button.is-danger.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - color: #fff; } - .button.is-danger.is-inverted.is-outlined:hover, .button.is-danger.is-inverted.is-outlined.is-hovered, .button.is-danger.is-inverted.is-outlined:focus, .button.is-danger.is-inverted.is-outlined.is-focused { - background-color: #fff; - color: #da0b00; } - .button.is-danger.is-inverted.is-outlined.is-loading:hover::after, .button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-danger.is-inverted.is-outlined.is-loading:focus::after, .button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after { - border-color: transparent transparent #da0b00 #da0b00 !important; } - .button.is-danger.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-danger.is-inverted.is-outlined { - background-color: transparent; - border-color: #fff; - box-shadow: none; - color: #fff; } - .button.is-small, #documenter .docs-sidebar form.docs-search > input.button { - border-radius: 2px; - font-size: 0.75rem; } - .button.is-normal { - font-size: 1rem; } - .button.is-medium { - font-size: 1.25rem; } - .button.is-large { - font-size: 1.5rem; } - .button[disabled], fieldset[disabled] .button { - background-color: white; - border-color: #dbdbdb; - box-shadow: none; - opacity: 0.5; } - .button.is-fullwidth { - display: flex; - width: 100%; } - .button.is-loading { - color: transparent !important; - pointer-events: none; } - .button.is-loading::after { - position: absolute; - left: calc(50% - (1em / 2)); - top: calc(50% - (1em / 2)); - position: absolute !important; } - .button.is-static { - background-color: whitesmoke; - border-color: #dbdbdb; - color: #6b6b6b; - box-shadow: none; - pointer-events: none; } - .button.is-rounded, #documenter .docs-sidebar form.docs-search > input.button { - border-radius: 290486px; - padding-left: 1em; - padding-right: 1em; } - -.buttons { - align-items: center; - display: flex; - flex-wrap: wrap; - justify-content: flex-start; } - .buttons .button { - margin-bottom: 0.5rem; } - .buttons .button:not(:last-child):not(.is-fullwidth) { - margin-right: 0.5rem; } - .buttons:last-child { - margin-bottom: -0.5rem; } - .buttons:not(:last-child) { - margin-bottom: 1rem; } - .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large) { - border-radius: 2px; - font-size: 0.75rem; } - .buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large) { - font-size: 1.25rem; } - .buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium) { - font-size: 1.5rem; } - .buttons.has-addons .button:not(:first-child) { - border-bottom-left-radius: 0; - border-top-left-radius: 0; } - .buttons.has-addons .button:not(:last-child) { - border-bottom-right-radius: 0; - border-top-right-radius: 0; - margin-right: -1px; } - .buttons.has-addons .button:last-child { - margin-right: 0; } - .buttons.has-addons .button:hover, .buttons.has-addons .button.is-hovered { - z-index: 2; } - .buttons.has-addons .button:focus, .buttons.has-addons .button.is-focused, .buttons.has-addons .button:active, .buttons.has-addons .button.is-active, .buttons.has-addons .button.is-selected { - z-index: 3; } - .buttons.has-addons .button:focus:hover, .buttons.has-addons .button.is-focused:hover, .buttons.has-addons .button:active:hover, .buttons.has-addons .button.is-active:hover, .buttons.has-addons .button.is-selected:hover { - z-index: 4; } - .buttons.has-addons .button.is-expanded { - flex-grow: 1; - flex-shrink: 1; } - .buttons.is-centered { - justify-content: center; } - .buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth) { - margin-left: 0.25rem; - margin-right: 0.25rem; } - .buttons.is-right { - justify-content: flex-end; } - .buttons.is-right:not(.has-addons) .button:not(.is-fullwidth) { - margin-left: 0.25rem; - margin-right: 0.25rem; } - -.container { - flex-grow: 1; - margin: 0 auto; - position: relative; - width: auto; } - @media screen and (min-width: 1056px) { - .container { - max-width: 992px; } - .container.is-fluid { - margin-left: 32px; - margin-right: 32px; - max-width: none; } } - @media screen and (max-width: 1215px) { - .container.is-widescreen { - max-width: 1152px; } } - @media screen and (max-width: 1407px) { - .container.is-fullhd { - max-width: 1344px; } } - @media screen and (min-width: 1216px) { - .container { - max-width: 1152px; } } - @media screen and (min-width: 1408px) { - .container { - max-width: 1344px; } } -.content li + li { - margin-top: 0.25em; } - -.content p:not(:last-child), -.content dl:not(:last-child), -.content ol:not(:last-child), -.content ul:not(:last-child), -.content blockquote:not(:last-child), -.content pre:not(:last-child), -.content table:not(:last-child) { - margin-bottom: 1em; } - -.content h1, -.content h2, -.content h3, -.content h4, -.content h5, -.content h6 { - color: #222222; - font-weight: 600; - line-height: 1.125; } - -.content h1 { - font-size: 2em; - margin-bottom: 0.5em; } - .content h1:not(:first-child) { - margin-top: 1em; } - -.content h2 { - font-size: 1.75em; - margin-bottom: 0.5714em; } - .content h2:not(:first-child) { - margin-top: 1.1428em; } - -.content h3 { - font-size: 1.5em; - margin-bottom: 0.6666em; } - .content h3:not(:first-child) { - margin-top: 1.3333em; } - -.content h4 { - font-size: 1.25em; - margin-bottom: 0.8em; } - -.content h5 { - font-size: 1.125em; - margin-bottom: 0.8888em; } - -.content h6 { - font-size: 1em; - margin-bottom: 1em; } - -.content blockquote { - background-color: whitesmoke; - border-left: 5px solid #dbdbdb; - padding: 1.25em 1.5em; } - -.content ol { - list-style-position: outside; - margin-left: 2em; - margin-top: 1em; } - .content ol:not([type]) { - list-style-type: decimal; } - .content ol.is-lower-alpha:not([type]) { - list-style-type: lower-alpha; } - .content ol.is-lower-roman:not([type]) { - list-style-type: lower-roman; } - .content ol.is-upper-alpha:not([type]) { - list-style-type: upper-alpha; } - .content ol.is-upper-roman:not([type]) { - list-style-type: upper-roman; } - -.content ul { - list-style: disc outside; - margin-left: 2em; - margin-top: 1em; } - .content ul ul { - list-style-type: circle; - margin-top: 0.5em; } - .content ul ul ul { - list-style-type: square; } - -.content dd { - margin-left: 2em; } - -.content figure { - margin-left: 2em; - margin-right: 2em; - text-align: center; } - .content figure:not(:first-child) { - margin-top: 2em; } - .content figure:not(:last-child) { - margin-bottom: 2em; } - .content figure img { - display: inline-block; } - .content figure figcaption { - font-style: italic; } - -.content pre { - -webkit-overflow-scrolling: touch; - overflow-x: auto; - padding: 0; - white-space: pre; - word-wrap: normal; } - -.content sup, -.content sub { - font-size: 75%; } - -.content table { - width: 100%; } - .content table td, - .content table th { - border: 1px solid #dbdbdb; - border-width: 0 0 1px; - padding: 0.5em 0.75em; - vertical-align: top; } - .content table th { - color: #222222; } - .content table th:not([align]) { - text-align: left; } - .content table thead td, - .content table thead th { - border-width: 0 0 2px; - color: #222222; } - .content table tfoot td, - .content table tfoot th { - border-width: 2px 0 0; - color: #222222; } - .content table tbody tr:last-child td, - .content table tbody tr:last-child th { - border-bottom-width: 0; } - -.content .tabs li + li { - margin-top: 0; } - -.content.is-small, #documenter .docs-sidebar form.docs-search > input.content { - font-size: 0.75rem; } - -.content.is-medium { - font-size: 1.25rem; } - -.content.is-large { - font-size: 1.5rem; } - -.icon { - align-items: center; - display: inline-flex; - justify-content: center; - height: 1.5rem; - width: 1.5rem; } - .icon.is-small, #documenter .docs-sidebar form.docs-search > input.icon { - height: 1rem; - width: 1rem; } - .icon.is-medium { - height: 2rem; - width: 2rem; } - .icon.is-large { - height: 3rem; - width: 3rem; } - -.image, #documenter .docs-sidebar .docs-logo > img { - display: block; - position: relative; } - .image img, #documenter .docs-sidebar .docs-logo > img img { - display: block; - height: auto; - width: 100%; } - .image img.is-rounded, #documenter .docs-sidebar .docs-logo > img img.is-rounded { - border-radius: 290486px; } - .image.is-square img, #documenter .docs-sidebar .docs-logo > img.is-square img, - .image.is-square .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-square .has-ratio, .image.is-1by1 img, #documenter .docs-sidebar .docs-logo > img.is-1by1 img, - .image.is-1by1 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-1by1 .has-ratio, .image.is-5by4 img, #documenter .docs-sidebar .docs-logo > img.is-5by4 img, - .image.is-5by4 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-5by4 .has-ratio, .image.is-4by3 img, #documenter .docs-sidebar .docs-logo > img.is-4by3 img, - .image.is-4by3 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-4by3 .has-ratio, .image.is-3by2 img, #documenter .docs-sidebar .docs-logo > img.is-3by2 img, - .image.is-3by2 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-3by2 .has-ratio, .image.is-5by3 img, #documenter .docs-sidebar .docs-logo > img.is-5by3 img, - .image.is-5by3 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-5by3 .has-ratio, .image.is-16by9 img, #documenter .docs-sidebar .docs-logo > img.is-16by9 img, - .image.is-16by9 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-16by9 .has-ratio, .image.is-2by1 img, #documenter .docs-sidebar .docs-logo > img.is-2by1 img, - .image.is-2by1 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-2by1 .has-ratio, .image.is-3by1 img, #documenter .docs-sidebar .docs-logo > img.is-3by1 img, - .image.is-3by1 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-3by1 .has-ratio, .image.is-4by5 img, #documenter .docs-sidebar .docs-logo > img.is-4by5 img, - .image.is-4by5 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-4by5 .has-ratio, .image.is-3by4 img, #documenter .docs-sidebar .docs-logo > img.is-3by4 img, - .image.is-3by4 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-3by4 .has-ratio, .image.is-2by3 img, #documenter .docs-sidebar .docs-logo > img.is-2by3 img, - .image.is-2by3 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-2by3 .has-ratio, .image.is-3by5 img, #documenter .docs-sidebar .docs-logo > img.is-3by5 img, - .image.is-3by5 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-3by5 .has-ratio, .image.is-9by16 img, #documenter .docs-sidebar .docs-logo > img.is-9by16 img, - .image.is-9by16 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-9by16 .has-ratio, .image.is-1by2 img, #documenter .docs-sidebar .docs-logo > img.is-1by2 img, - .image.is-1by2 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-1by2 .has-ratio, .image.is-1by3 img, #documenter .docs-sidebar .docs-logo > img.is-1by3 img, - .image.is-1by3 .has-ratio, - #documenter .docs-sidebar .docs-logo > img.is-1by3 .has-ratio { - height: 100%; - width: 100%; } - .image.is-square, #documenter .docs-sidebar .docs-logo > img.is-square, .image.is-1by1, #documenter .docs-sidebar .docs-logo > img.is-1by1 { - padding-top: 100%; } - .image.is-5by4, #documenter .docs-sidebar .docs-logo > img.is-5by4 { - padding-top: 80%; } - .image.is-4by3, #documenter .docs-sidebar .docs-logo > img.is-4by3 { - padding-top: 75%; } - .image.is-3by2, #documenter .docs-sidebar .docs-logo > img.is-3by2 { - padding-top: 66.6666%; } - .image.is-5by3, #documenter .docs-sidebar .docs-logo > img.is-5by3 { - padding-top: 60%; } - .image.is-16by9, #documenter .docs-sidebar .docs-logo > img.is-16by9 { - padding-top: 56.25%; } - .image.is-2by1, #documenter .docs-sidebar .docs-logo > img.is-2by1 { - padding-top: 50%; } - .image.is-3by1, #documenter .docs-sidebar .docs-logo > img.is-3by1 { - padding-top: 33.3333%; } - .image.is-4by5, #documenter .docs-sidebar .docs-logo > img.is-4by5 { - padding-top: 125%; } - .image.is-3by4, #documenter .docs-sidebar .docs-logo > img.is-3by4 { - padding-top: 133.3333%; } - .image.is-2by3, #documenter .docs-sidebar .docs-logo > img.is-2by3 { - padding-top: 150%; } - .image.is-3by5, #documenter .docs-sidebar .docs-logo > img.is-3by5 { - padding-top: 166.6666%; } - .image.is-9by16, #documenter .docs-sidebar .docs-logo > img.is-9by16 { - padding-top: 177.7777%; } - .image.is-1by2, #documenter .docs-sidebar .docs-logo > img.is-1by2 { - padding-top: 200%; } - .image.is-1by3, #documenter .docs-sidebar .docs-logo > img.is-1by3 { - padding-top: 300%; } - .image.is-16x16, #documenter .docs-sidebar .docs-logo > img.is-16x16 { - height: 16px; - width: 16px; } - .image.is-24x24, #documenter .docs-sidebar .docs-logo > img.is-24x24 { - height: 24px; - width: 24px; } - .image.is-32x32, #documenter .docs-sidebar .docs-logo > img.is-32x32 { - height: 32px; - width: 32px; } - .image.is-48x48, #documenter .docs-sidebar .docs-logo > img.is-48x48 { - height: 48px; - width: 48px; } - .image.is-64x64, #documenter .docs-sidebar .docs-logo > img.is-64x64 { - height: 64px; - width: 64px; } - .image.is-96x96, #documenter .docs-sidebar .docs-logo > img.is-96x96 { - height: 96px; - width: 96px; } - .image.is-128x128, #documenter .docs-sidebar .docs-logo > img.is-128x128 { - height: 128px; - width: 128px; } - -.notification { - background-color: whitesmoke; - border-radius: 4px; - padding: 1.25rem 2.5rem 1.25rem 1.5rem; - position: relative; } - .notification a:not(.button):not(.dropdown-item) { - color: currentColor; - text-decoration: underline; } - .notification strong { - color: currentColor; } - .notification code, - .notification pre { - background: white; } - .notification pre code { - background: transparent; } - .notification > .delete { - position: absolute; - right: 0.5rem; - top: 0.5rem; } - .notification .title, - .notification .subtitle, - .notification .content { - color: currentColor; } - .notification.is-white { - background-color: white; - color: #0a0a0a; } - .notification.is-black { - background-color: #0a0a0a; - color: white; } - .notification.is-light { - background-color: whitesmoke; - color: #363636; } - .notification.is-dark, .content kbd.notification { - background-color: #363636; - color: whitesmoke; } - .notification.is-primary, .docstring > section > a.notification.docs-sourcelink { - background-color: #4eb5de; - color: #fff; } - .notification.is-link { - background-color: #2e63b8; - color: #fff; } - .notification.is-info { - background-color: #209cee; - color: #fff; } - .notification.is-success { - background-color: #22c35b; - color: #fff; } - .notification.is-warning { - background-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); } - .notification.is-danger { - background-color: #da0b00; - color: #fff; } - -.progress { - -moz-appearance: none; - -webkit-appearance: none; - border: none; - border-radius: 290486px; - display: block; - height: 1rem; - overflow: hidden; - padding: 0; - width: 100%; } - .progress::-webkit-progress-bar { - background-color: #dbdbdb; } - .progress::-webkit-progress-value { - background-color: #222222; } - .progress::-moz-progress-bar { - background-color: #222222; } - .progress::-ms-fill { - background-color: #222222; - border: none; } - .progress.is-white::-webkit-progress-value { - background-color: white; } - .progress.is-white::-moz-progress-bar { - background-color: white; } - .progress.is-white::-ms-fill { - background-color: white; } - .progress.is-white:indeterminate { - background-image: linear-gradient(to right, white 30%, #dbdbdb 30%); } - .progress.is-black::-webkit-progress-value { - background-color: #0a0a0a; } - .progress.is-black::-moz-progress-bar { - background-color: #0a0a0a; } - .progress.is-black::-ms-fill { - background-color: #0a0a0a; } - .progress.is-black:indeterminate { - background-image: linear-gradient(to right, #0a0a0a 30%, #dbdbdb 30%); } - .progress.is-light::-webkit-progress-value { - background-color: whitesmoke; } - .progress.is-light::-moz-progress-bar { - background-color: whitesmoke; } - .progress.is-light::-ms-fill { - background-color: whitesmoke; } - .progress.is-light:indeterminate { - background-image: linear-gradient(to right, whitesmoke 30%, #dbdbdb 30%); } - .progress.is-dark::-webkit-progress-value, .content kbd.progress::-webkit-progress-value { - background-color: #363636; } - .progress.is-dark::-moz-progress-bar, .content kbd.progress::-moz-progress-bar { - background-color: #363636; } - .progress.is-dark::-ms-fill, .content kbd.progress::-ms-fill { - background-color: #363636; } - .progress.is-dark:indeterminate, .content kbd.progress:indeterminate { - background-image: linear-gradient(to right, #363636 30%, #dbdbdb 30%); } - .progress.is-primary::-webkit-progress-value, .docstring > section > a.progress.docs-sourcelink::-webkit-progress-value { - background-color: #4eb5de; } - .progress.is-primary::-moz-progress-bar, .docstring > section > a.progress.docs-sourcelink::-moz-progress-bar { - background-color: #4eb5de; } - .progress.is-primary::-ms-fill, .docstring > section > a.progress.docs-sourcelink::-ms-fill { - background-color: #4eb5de; } - .progress.is-primary:indeterminate, .docstring > section > a.progress.docs-sourcelink:indeterminate { - background-image: linear-gradient(to right, #4eb5de 30%, #dbdbdb 30%); } - .progress.is-link::-webkit-progress-value { - background-color: #2e63b8; } - .progress.is-link::-moz-progress-bar { - background-color: #2e63b8; } - .progress.is-link::-ms-fill { - background-color: #2e63b8; } - .progress.is-link:indeterminate { - background-image: linear-gradient(to right, #2e63b8 30%, #dbdbdb 30%); } - .progress.is-info::-webkit-progress-value { - background-color: #209cee; } - .progress.is-info::-moz-progress-bar { - background-color: #209cee; } - .progress.is-info::-ms-fill { - background-color: #209cee; } - .progress.is-info:indeterminate { - background-image: linear-gradient(to right, #209cee 30%, #dbdbdb 30%); } - .progress.is-success::-webkit-progress-value { - background-color: #22c35b; } - .progress.is-success::-moz-progress-bar { - background-color: #22c35b; } - .progress.is-success::-ms-fill { - background-color: #22c35b; } - .progress.is-success:indeterminate { - background-image: linear-gradient(to right, #22c35b 30%, #dbdbdb 30%); } - .progress.is-warning::-webkit-progress-value { - background-color: #ffdd57; } - .progress.is-warning::-moz-progress-bar { - background-color: #ffdd57; } - .progress.is-warning::-ms-fill { - background-color: #ffdd57; } - .progress.is-warning:indeterminate { - background-image: linear-gradient(to right, #ffdd57 30%, #dbdbdb 30%); } - .progress.is-danger::-webkit-progress-value { - background-color: #da0b00; } - .progress.is-danger::-moz-progress-bar { - background-color: #da0b00; } - .progress.is-danger::-ms-fill { - background-color: #da0b00; } - .progress.is-danger:indeterminate { - background-image: linear-gradient(to right, #da0b00 30%, #dbdbdb 30%); } - .progress:indeterminate { - animation-duration: 1.5s; - animation-iteration-count: infinite; - animation-name: moveIndeterminate; - animation-timing-function: linear; - background-color: #dbdbdb; - background-image: linear-gradient(to right, #222222 30%, #dbdbdb 30%); - background-position: top left; - background-repeat: no-repeat; - background-size: 150% 150%; } - .progress:indeterminate::-webkit-progress-bar { - background-color: transparent; } - .progress:indeterminate::-moz-progress-bar { - background-color: transparent; } - .progress.is-small, #documenter .docs-sidebar form.docs-search > input.progress { - height: 0.75rem; } - .progress.is-medium { - height: 1.25rem; } - .progress.is-large { - height: 1.5rem; } - -@keyframes moveIndeterminate { - from { - background-position: 200% 0; } - to { - background-position: -200% 0; } } - -.table { - background-color: white; - color: #363636; } - .table td, - .table th { - border: 1px solid #dbdbdb; - border-width: 0 0 1px; - padding: 0.5em 0.75em; - vertical-align: top; } - .table td.is-white, - .table th.is-white { - background-color: white; - border-color: white; - color: #0a0a0a; } - .table td.is-black, - .table th.is-black { - background-color: #0a0a0a; - border-color: #0a0a0a; - color: white; } - .table td.is-light, - .table th.is-light { - background-color: whitesmoke; - border-color: whitesmoke; - color: #363636; } - .table td.is-dark, - .table th.is-dark { - background-color: #363636; - border-color: #363636; - color: whitesmoke; } - .table td.is-primary, - .table th.is-primary { - background-color: #4eb5de; - border-color: #4eb5de; - color: #fff; } - .table td.is-link, - .table th.is-link { - background-color: #2e63b8; - border-color: #2e63b8; - color: #fff; } - .table td.is-info, - .table th.is-info { - background-color: #209cee; - border-color: #209cee; - color: #fff; } - .table td.is-success, - .table th.is-success { - background-color: #22c35b; - border-color: #22c35b; - color: #fff; } - .table td.is-warning, - .table th.is-warning { - background-color: #ffdd57; - border-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); } - .table td.is-danger, - .table th.is-danger { - background-color: #da0b00; - border-color: #da0b00; - color: #fff; } - .table td.is-narrow, - .table th.is-narrow { - white-space: nowrap; - width: 1%; } - .table td.is-selected, - .table th.is-selected { - background-color: #4eb5de; - color: #fff; } - .table td.is-selected a, - .table td.is-selected strong, - .table th.is-selected a, - .table th.is-selected strong { - color: currentColor; } - .table th { - color: #222222; } - .table th:not([align]) { - text-align: left; } - .table tr.is-selected { - background-color: #4eb5de; - color: #fff; } - .table tr.is-selected a, - .table tr.is-selected strong { - color: currentColor; } - .table tr.is-selected td, - .table tr.is-selected th { - border-color: #fff; - color: currentColor; } - .table thead { - background-color: transparent; } - .table thead td, - .table thead th { - border-width: 0 0 2px; - color: #222222; } - .table tfoot { - background-color: transparent; } - .table tfoot td, - .table tfoot th { - border-width: 2px 0 0; - color: #222222; } - .table tbody { - background-color: transparent; } - .table tbody tr:last-child td, - .table tbody tr:last-child th { - border-bottom-width: 0; } - .table.is-bordered td, - .table.is-bordered th { - border-width: 1px; } - .table.is-bordered tr:last-child td, - .table.is-bordered tr:last-child th { - border-bottom-width: 1px; } - .table.is-fullwidth { - width: 100%; } - .table.is-hoverable tbody tr:not(.is-selected):hover { - background-color: #fafafa; } - .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover { - background-color: #fafafa; } - .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even) { - background-color: whitesmoke; } - .table.is-narrow td, - .table.is-narrow th { - padding: 0.25em 0.5em; } - .table.is-striped tbody tr:not(.is-selected):nth-child(even) { - background-color: #fafafa; } - -.table-container { - -webkit-overflow-scrolling: touch; - overflow: auto; - overflow-y: hidden; - max-width: 100%; } - -.tags { - align-items: center; - display: flex; - flex-wrap: wrap; - justify-content: flex-start; } - .tags .tag, .tags .content kbd, .content .tags kbd, .tags .docstring > section > a.docs-sourcelink { - margin-bottom: 0.5rem; } - .tags .tag:not(:last-child), .tags .content kbd:not(:last-child), .content .tags kbd:not(:last-child), .tags .docstring > section > a.docs-sourcelink:not(:last-child) { - margin-right: 0.5rem; } - .tags:last-child { - margin-bottom: -0.5rem; } - .tags:not(:last-child) { - margin-bottom: 1rem; } - .tags.are-medium .tag:not(.is-normal):not(.is-large), .tags.are-medium .content kbd:not(.is-normal):not(.is-large), .content .tags.are-medium kbd:not(.is-normal):not(.is-large), .tags.are-medium .docstring > section > a.docs-sourcelink:not(.is-normal):not(.is-large) { - font-size: 1rem; } - .tags.are-large .tag:not(.is-normal):not(.is-medium), .tags.are-large .content kbd:not(.is-normal):not(.is-medium), .content .tags.are-large kbd:not(.is-normal):not(.is-medium), .tags.are-large .docstring > section > a.docs-sourcelink:not(.is-normal):not(.is-medium) { - font-size: 1.25rem; } - .tags.is-centered { - justify-content: center; } - .tags.is-centered .tag, .tags.is-centered .content kbd, .content .tags.is-centered kbd, .tags.is-centered .docstring > section > a.docs-sourcelink { - margin-right: 0.25rem; - margin-left: 0.25rem; } - .tags.is-right { - justify-content: flex-end; } - .tags.is-right .tag:not(:first-child), .tags.is-right .content kbd:not(:first-child), .content .tags.is-right kbd:not(:first-child), .tags.is-right .docstring > section > a.docs-sourcelink:not(:first-child) { - margin-left: 0.5rem; } - .tags.is-right .tag:not(:last-child), .tags.is-right .content kbd:not(:last-child), .content .tags.is-right kbd:not(:last-child), .tags.is-right .docstring > section > a.docs-sourcelink:not(:last-child) { - margin-right: 0; } - .tags.has-addons .tag, .tags.has-addons .content kbd, .content .tags.has-addons kbd, .tags.has-addons .docstring > section > a.docs-sourcelink { - margin-right: 0; } - .tags.has-addons .tag:not(:first-child), .tags.has-addons .content kbd:not(:first-child), .content .tags.has-addons kbd:not(:first-child), .tags.has-addons .docstring > section > a.docs-sourcelink:not(:first-child) { - margin-left: 0; - border-bottom-left-radius: 0; - border-top-left-radius: 0; } - .tags.has-addons .tag:not(:last-child), .tags.has-addons .content kbd:not(:last-child), .content .tags.has-addons kbd:not(:last-child), .tags.has-addons .docstring > section > a.docs-sourcelink:not(:last-child) { - border-bottom-right-radius: 0; - border-top-right-radius: 0; } - -.tag:not(body), .content kbd:not(body), .docstring > section > a.docs-sourcelink:not(body) { - align-items: center; - background-color: whitesmoke; - border-radius: 4px; - color: #222222; - display: inline-flex; - font-size: 0.75rem; - height: 2em; - justify-content: center; - line-height: 1.5; - padding-left: 0.75em; - padding-right: 0.75em; - white-space: nowrap; } - .tag:not(body) .delete, .content kbd:not(body) .delete, .docstring > section > a.docs-sourcelink:not(body) .delete { - margin-left: 0.25rem; - margin-right: -0.375rem; } - .tag.is-white:not(body), .content kbd.is-white:not(body), .docstring > section > a.docs-sourcelink.is-white:not(body) { - background-color: white; - color: #0a0a0a; } - .tag.is-black:not(body), .content kbd.is-black:not(body), .docstring > section > a.docs-sourcelink.is-black:not(body) { - background-color: #0a0a0a; - color: white; } - .tag.is-light:not(body), .content kbd.is-light:not(body), .docstring > section > a.docs-sourcelink.is-light:not(body) { - background-color: whitesmoke; - color: #363636; } - .tag.is-dark:not(body), .content kbd:not(body), .docstring > section > a.docs-sourcelink.is-dark:not(body), .content .docstring > section > kbd:not(body) { - background-color: #363636; - color: whitesmoke; } - .tag.is-primary:not(body), .content kbd.is-primary:not(body), .docstring > section > a.docs-sourcelink:not(body) { - background-color: #4eb5de; - color: #fff; } - .tag.is-link:not(body), .content kbd.is-link:not(body), .docstring > section > a.docs-sourcelink.is-link:not(body) { - background-color: #2e63b8; - color: #fff; } - .tag.is-info:not(body), .content kbd.is-info:not(body), .docstring > section > a.docs-sourcelink.is-info:not(body) { - background-color: #209cee; - color: #fff; } - .tag.is-success:not(body), .content kbd.is-success:not(body), .docstring > section > a.docs-sourcelink.is-success:not(body) { - background-color: #22c35b; - color: #fff; } - .tag.is-warning:not(body), .content kbd.is-warning:not(body), .docstring > section > a.docs-sourcelink.is-warning:not(body) { - background-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); } - .tag.is-danger:not(body), .content kbd.is-danger:not(body), .docstring > section > a.docs-sourcelink.is-danger:not(body) { - background-color: #da0b00; - color: #fff; } - .tag.is-normal:not(body), .content kbd.is-normal:not(body), .docstring > section > a.docs-sourcelink.is-normal:not(body) { - font-size: 0.75rem; } - .tag.is-medium:not(body), .content kbd.is-medium:not(body), .docstring > section > a.docs-sourcelink.is-medium:not(body) { - font-size: 1rem; } - .tag.is-large:not(body), .content kbd.is-large:not(body), .docstring > section > a.docs-sourcelink.is-large:not(body) { - font-size: 1.25rem; } - .tag:not(body) .icon:first-child:not(:last-child), .content kbd:not(body) .icon:first-child:not(:last-child), .docstring > section > a.docs-sourcelink:not(body) .icon:first-child:not(:last-child) { - margin-left: -0.375em; - margin-right: 0.1875em; } - .tag:not(body) .icon:last-child:not(:first-child), .content kbd:not(body) .icon:last-child:not(:first-child), .docstring > section > a.docs-sourcelink:not(body) .icon:last-child:not(:first-child) { - margin-left: 0.1875em; - margin-right: -0.375em; } - .tag:not(body) .icon:first-child:last-child, .content kbd:not(body) .icon:first-child:last-child, .docstring > section > a.docs-sourcelink:not(body) .icon:first-child:last-child { - margin-left: -0.375em; - margin-right: -0.375em; } - .tag.is-delete:not(body), .content kbd.is-delete:not(body), .docstring > section > a.docs-sourcelink.is-delete:not(body) { - margin-left: 1px; - padding: 0; - position: relative; - width: 2em; } - .tag.is-delete:not(body)::before, .content kbd.is-delete:not(body)::before, .docstring > section > a.docs-sourcelink.is-delete:not(body)::before, .tag.is-delete:not(body)::after, .content kbd.is-delete:not(body)::after, .docstring > section > a.docs-sourcelink.is-delete:not(body)::after { - background-color: currentColor; - content: ""; - display: block; - left: 50%; - position: absolute; - top: 50%; - transform: translateX(-50%) translateY(-50%) rotate(45deg); - transform-origin: center center; } - .tag.is-delete:not(body)::before, .content kbd.is-delete:not(body)::before, .docstring > section > a.docs-sourcelink.is-delete:not(body)::before { - height: 1px; - width: 50%; } - .tag.is-delete:not(body)::after, .content kbd.is-delete:not(body)::after, .docstring > section > a.docs-sourcelink.is-delete:not(body)::after { - height: 50%; - width: 1px; } - .tag.is-delete:not(body):hover, .content kbd.is-delete:not(body):hover, .docstring > section > a.docs-sourcelink.is-delete:not(body):hover, .tag.is-delete:not(body):focus, .content kbd.is-delete:not(body):focus, .docstring > section > a.docs-sourcelink.is-delete:not(body):focus { - background-color: #e8e8e8; } - .tag.is-delete:not(body):active, .content kbd.is-delete:not(body):active, .docstring > section > a.docs-sourcelink.is-delete:not(body):active { - background-color: #dbdbdb; } - .tag.is-rounded:not(body), #documenter .docs-sidebar form.docs-search > input:not(body), .content kbd.is-rounded:not(body), #documenter .docs-sidebar .content form.docs-search > input:not(body), .docstring > section > a.docs-sourcelink.is-rounded:not(body) { - border-radius: 290486px; } - -a.tag:hover, .docstring > section > a.docs-sourcelink:hover { - text-decoration: underline; } - -.title, -.subtitle { - word-break: break-word; } - .title em, - .title span, - .subtitle em, - .subtitle span { - font-weight: inherit; } - .title sub, - .subtitle sub { - font-size: 0.75em; } - .title sup, - .subtitle sup { - font-size: 0.75em; } - .title .tag, .title .content kbd, .content .title kbd, .title .docstring > section > a.docs-sourcelink, - .subtitle .tag, - .subtitle .content kbd, - .content .subtitle kbd, - .subtitle .docstring > section > a.docs-sourcelink { - vertical-align: middle; } - -.title { - color: #363636; - font-size: 2rem; - font-weight: 600; - line-height: 1.125; } - .title strong { - color: inherit; - font-weight: inherit; } - .title + .highlight { - margin-top: -0.75rem; } - .title:not(.is-spaced) + .subtitle { - margin-top: -1.25rem; } - .title.is-1 { - font-size: 3rem; } - .title.is-2 { - font-size: 2.5rem; } - .title.is-3 { - font-size: 2rem; } - .title.is-4 { - font-size: 1.5rem; } - .title.is-5 { - font-size: 1.25rem; } - .title.is-6 { - font-size: 1rem; } - .title.is-7 { - font-size: 0.75rem; } - -.subtitle { - color: #4a4a4a; - font-size: 1.25rem; - font-weight: 400; - line-height: 1.25; } - .subtitle strong { - color: #363636; - font-weight: 600; } - .subtitle:not(.is-spaced) + .title { - margin-top: -1.25rem; } - .subtitle.is-1 { - font-size: 3rem; } - .subtitle.is-2 { - font-size: 2.5rem; } - .subtitle.is-3 { - font-size: 2rem; } - .subtitle.is-4 { - font-size: 1.5rem; } - .subtitle.is-5 { - font-size: 1.25rem; } - .subtitle.is-6 { - font-size: 1rem; } - .subtitle.is-7 { - font-size: 0.75rem; } - -.heading { - display: block; - font-size: 11px; - letter-spacing: 1px; - margin-bottom: 5px; - text-transform: uppercase; } - -.highlight { - font-weight: 400; - max-width: 100%; - overflow: hidden; - padding: 0; } - .highlight pre { - overflow: auto; - max-width: 100%; } - -.number { - align-items: center; - background-color: whitesmoke; - border-radius: 290486px; - display: inline-flex; - font-size: 1.25rem; - height: 2em; - justify-content: center; - margin-right: 1.5rem; - min-width: 2.5em; - padding: 0.25rem 0.5rem; - text-align: center; - vertical-align: top; } - -.select select, .textarea, .input, #documenter .docs-sidebar form.docs-search > input { - background-color: white; - border-color: #dbdbdb; - border-radius: 4px; - color: #363636; } - .select select::-moz-placeholder, .textarea::-moz-placeholder, .input::-moz-placeholder, #documenter .docs-sidebar form.docs-search > input::-moz-placeholder { - color: rgba(54, 54, 54, 0.3); } - .select select::-webkit-input-placeholder, .textarea::-webkit-input-placeholder, .input::-webkit-input-placeholder, #documenter .docs-sidebar form.docs-search > input::-webkit-input-placeholder { - color: rgba(54, 54, 54, 0.3); } - .select select:-moz-placeholder, .textarea:-moz-placeholder, .input:-moz-placeholder, #documenter .docs-sidebar form.docs-search > input:-moz-placeholder { - color: rgba(54, 54, 54, 0.3); } - .select select:-ms-input-placeholder, .textarea:-ms-input-placeholder, .input:-ms-input-placeholder, #documenter .docs-sidebar form.docs-search > input:-ms-input-placeholder { - color: rgba(54, 54, 54, 0.3); } - .select select:hover, .textarea:hover, .input:hover, #documenter .docs-sidebar form.docs-search > input:hover, .select select.is-hovered, .is-hovered.textarea, .is-hovered.input, #documenter .docs-sidebar form.docs-search > input.is-hovered { - border-color: #b5b5b5; } - .select select:focus, .textarea:focus, .input:focus, #documenter .docs-sidebar form.docs-search > input:focus, .select select.is-focused, .is-focused.textarea, .is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .select select:active, .textarea:active, .input:active, #documenter .docs-sidebar form.docs-search > input:active, .select select.is-active, .is-active.textarea, .is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { - border-color: #2e63b8; - box-shadow: 0 0 0 0.125em rgba(46, 99, 184, 0.25); } - .select select[disabled], .textarea[disabled], .input[disabled], #documenter .docs-sidebar form.docs-search > input[disabled], fieldset[disabled] .select select, .select fieldset[disabled] select, fieldset[disabled] .textarea, fieldset[disabled] .input, fieldset[disabled] #documenter .docs-sidebar form.docs-search > input, #documenter .docs-sidebar fieldset[disabled] form.docs-search > input { - background-color: whitesmoke; - border-color: whitesmoke; - box-shadow: none; - color: #6b6b6b; } - .select select[disabled]::-moz-placeholder, .textarea[disabled]::-moz-placeholder, .input[disabled]::-moz-placeholder, #documenter .docs-sidebar form.docs-search > input[disabled]::-moz-placeholder, fieldset[disabled] .select select::-moz-placeholder, .select fieldset[disabled] select::-moz-placeholder, fieldset[disabled] .textarea::-moz-placeholder, fieldset[disabled] .input::-moz-placeholder, fieldset[disabled] #documenter .docs-sidebar form.docs-search > input::-moz-placeholder, #documenter .docs-sidebar fieldset[disabled] form.docs-search > input::-moz-placeholder { - color: rgba(107, 107, 107, 0.3); } - .select select[disabled]::-webkit-input-placeholder, .textarea[disabled]::-webkit-input-placeholder, .input[disabled]::-webkit-input-placeholder, #documenter .docs-sidebar form.docs-search > input[disabled]::-webkit-input-placeholder, fieldset[disabled] .select select::-webkit-input-placeholder, .select fieldset[disabled] select::-webkit-input-placeholder, fieldset[disabled] .textarea::-webkit-input-placeholder, fieldset[disabled] .input::-webkit-input-placeholder, fieldset[disabled] #documenter .docs-sidebar form.docs-search > input::-webkit-input-placeholder, #documenter .docs-sidebar fieldset[disabled] form.docs-search > input::-webkit-input-placeholder { - color: rgba(107, 107, 107, 0.3); } - .select select[disabled]:-moz-placeholder, .textarea[disabled]:-moz-placeholder, .input[disabled]:-moz-placeholder, #documenter .docs-sidebar form.docs-search > input[disabled]:-moz-placeholder, fieldset[disabled] .select select:-moz-placeholder, .select fieldset[disabled] select:-moz-placeholder, fieldset[disabled] .textarea:-moz-placeholder, fieldset[disabled] .input:-moz-placeholder, fieldset[disabled] #documenter .docs-sidebar form.docs-search > input:-moz-placeholder, #documenter .docs-sidebar fieldset[disabled] form.docs-search > input:-moz-placeholder { - color: rgba(107, 107, 107, 0.3); } - .select select[disabled]:-ms-input-placeholder, .textarea[disabled]:-ms-input-placeholder, .input[disabled]:-ms-input-placeholder, #documenter .docs-sidebar form.docs-search > input[disabled]:-ms-input-placeholder, fieldset[disabled] .select select:-ms-input-placeholder, .select fieldset[disabled] select:-ms-input-placeholder, fieldset[disabled] .textarea:-ms-input-placeholder, fieldset[disabled] .input:-ms-input-placeholder, fieldset[disabled] #documenter .docs-sidebar form.docs-search > input:-ms-input-placeholder, #documenter .docs-sidebar fieldset[disabled] form.docs-search > input:-ms-input-placeholder { - color: rgba(107, 107, 107, 0.3); } - -.textarea, .input, #documenter .docs-sidebar form.docs-search > input { - box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.1); - max-width: 100%; - width: 100%; } - .textarea[readonly], .input[readonly], #documenter .docs-sidebar form.docs-search > input[readonly] { - box-shadow: none; } - .is-white.textarea, .is-white.input, #documenter .docs-sidebar form.docs-search > input.is-white { - border-color: white; } - .is-white.textarea:focus, .is-white.input:focus, #documenter .docs-sidebar form.docs-search > input.is-white:focus, .is-white.is-focused.textarea, .is-white.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-white.textarea:active, .is-white.input:active, #documenter .docs-sidebar form.docs-search > input.is-white:active, .is-white.is-active.textarea, .is-white.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } - .is-black.textarea, .is-black.input, #documenter .docs-sidebar form.docs-search > input.is-black { - border-color: #0a0a0a; } - .is-black.textarea:focus, .is-black.input:focus, #documenter .docs-sidebar form.docs-search > input.is-black:focus, .is-black.is-focused.textarea, .is-black.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-black.textarea:active, .is-black.input:active, #documenter .docs-sidebar form.docs-search > input.is-black:active, .is-black.is-active.textarea, .is-black.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } - .is-light.textarea, .is-light.input, #documenter .docs-sidebar form.docs-search > input.is-light { - border-color: whitesmoke; } - .is-light.textarea:focus, .is-light.input:focus, #documenter .docs-sidebar form.docs-search > input.is-light:focus, .is-light.is-focused.textarea, .is-light.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-light.textarea:active, .is-light.input:active, #documenter .docs-sidebar form.docs-search > input.is-light:active, .is-light.is-active.textarea, .is-light.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); } - .is-dark.textarea, .content kbd.textarea, .is-dark.input, #documenter .docs-sidebar form.docs-search > input.is-dark, .content kbd.input { - border-color: #363636; } - .is-dark.textarea:focus, .content kbd.textarea:focus, .is-dark.input:focus, #documenter .docs-sidebar form.docs-search > input.is-dark:focus, .content kbd.input:focus, .is-dark.is-focused.textarea, .content kbd.is-focused.textarea, .is-dark.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .content kbd.is-focused.input, #documenter .docs-sidebar .content form.docs-search > input.is-focused, .is-dark.textarea:active, .content kbd.textarea:active, .is-dark.input:active, #documenter .docs-sidebar form.docs-search > input.is-dark:active, .content kbd.input:active, .is-dark.is-active.textarea, .content kbd.is-active.textarea, .is-dark.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active, .content kbd.is-active.input, #documenter .docs-sidebar .content form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); } - .is-primary.textarea, .docstring > section > a.textarea.docs-sourcelink, .is-primary.input, #documenter .docs-sidebar form.docs-search > input.is-primary, .docstring > section > a.input.docs-sourcelink { - border-color: #4eb5de; } - .is-primary.textarea:focus, .docstring > section > a.textarea.docs-sourcelink:focus, .is-primary.input:focus, #documenter .docs-sidebar form.docs-search > input.is-primary:focus, .docstring > section > a.input.docs-sourcelink:focus, .is-primary.is-focused.textarea, .docstring > section > a.is-focused.textarea.docs-sourcelink, .is-primary.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .docstring > section > a.is-focused.input.docs-sourcelink, .is-primary.textarea:active, .docstring > section > a.textarea.docs-sourcelink:active, .is-primary.input:active, #documenter .docs-sidebar form.docs-search > input.is-primary:active, .docstring > section > a.input.docs-sourcelink:active, .is-primary.is-active.textarea, .docstring > section > a.is-active.textarea.docs-sourcelink, .is-primary.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active, .docstring > section > a.is-active.input.docs-sourcelink { - box-shadow: 0 0 0 0.125em rgba(78, 181, 222, 0.25); } - .is-link.textarea, .is-link.input, #documenter .docs-sidebar form.docs-search > input.is-link { - border-color: #2e63b8; } - .is-link.textarea:focus, .is-link.input:focus, #documenter .docs-sidebar form.docs-search > input.is-link:focus, .is-link.is-focused.textarea, .is-link.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-link.textarea:active, .is-link.input:active, #documenter .docs-sidebar form.docs-search > input.is-link:active, .is-link.is-active.textarea, .is-link.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(46, 99, 184, 0.25); } - .is-info.textarea, .is-info.input, #documenter .docs-sidebar form.docs-search > input.is-info { - border-color: #209cee; } - .is-info.textarea:focus, .is-info.input:focus, #documenter .docs-sidebar form.docs-search > input.is-info:focus, .is-info.is-focused.textarea, .is-info.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-info.textarea:active, .is-info.input:active, #documenter .docs-sidebar form.docs-search > input.is-info:active, .is-info.is-active.textarea, .is-info.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(32, 156, 238, 0.25); } - .is-success.textarea, .is-success.input, #documenter .docs-sidebar form.docs-search > input.is-success { - border-color: #22c35b; } - .is-success.textarea:focus, .is-success.input:focus, #documenter .docs-sidebar form.docs-search > input.is-success:focus, .is-success.is-focused.textarea, .is-success.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-success.textarea:active, .is-success.input:active, #documenter .docs-sidebar form.docs-search > input.is-success:active, .is-success.is-active.textarea, .is-success.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(34, 195, 91, 0.25); } - .is-warning.textarea, .is-warning.input, #documenter .docs-sidebar form.docs-search > input.is-warning { - border-color: #ffdd57; } - .is-warning.textarea:focus, .is-warning.input:focus, #documenter .docs-sidebar form.docs-search > input.is-warning:focus, .is-warning.is-focused.textarea, .is-warning.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-warning.textarea:active, .is-warning.input:active, #documenter .docs-sidebar form.docs-search > input.is-warning:active, .is-warning.is-active.textarea, .is-warning.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(255, 221, 87, 0.25); } - .is-danger.textarea, .is-danger.input, #documenter .docs-sidebar form.docs-search > input.is-danger { - border-color: #da0b00; } - .is-danger.textarea:focus, .is-danger.input:focus, #documenter .docs-sidebar form.docs-search > input.is-danger:focus, .is-danger.is-focused.textarea, .is-danger.is-focused.input, #documenter .docs-sidebar form.docs-search > input.is-focused, .is-danger.textarea:active, .is-danger.input:active, #documenter .docs-sidebar form.docs-search > input.is-danger:active, .is-danger.is-active.textarea, .is-danger.is-active.input, #documenter .docs-sidebar form.docs-search > input.is-active { - box-shadow: 0 0 0 0.125em rgba(218, 11, 0, 0.25); } - .is-small.textarea, .is-small.input, #documenter .docs-sidebar form.docs-search > input { - border-radius: 2px; - font-size: 0.75rem; } - .is-medium.textarea, .is-medium.input, #documenter .docs-sidebar form.docs-search > input.is-medium { - font-size: 1.25rem; } - .is-large.textarea, .is-large.input, #documenter .docs-sidebar form.docs-search > input.is-large { - font-size: 1.5rem; } - .is-fullwidth.textarea, .is-fullwidth.input, #documenter .docs-sidebar form.docs-search > input.is-fullwidth { - display: block; - width: 100%; } - .is-inline.textarea, .is-inline.input, #documenter .docs-sidebar form.docs-search > input.is-inline { - display: inline; - width: auto; } - -.input.is-rounded, #documenter .docs-sidebar form.docs-search > input { - border-radius: 290486px; - padding-left: 1em; - padding-right: 1em; } - -.input.is-static, #documenter .docs-sidebar form.docs-search > input.is-static { - background-color: transparent; - border-color: transparent; - box-shadow: none; - padding-left: 0; - padding-right: 0; } - -.textarea { - display: block; - max-width: 100%; - min-width: 100%; - padding: 0.625em; - resize: vertical; } - .textarea:not([rows]) { - max-height: 600px; - min-height: 120px; } - .textarea[rows] { - height: initial; } - .textarea.has-fixed-size { - resize: none; } - -.radio, .checkbox { - cursor: pointer; - display: inline-block; - line-height: 1.25; - position: relative; } - .radio input, .checkbox input { - cursor: pointer; } - .radio:hover, .checkbox:hover { - color: #363636; } - .radio[disabled], .checkbox[disabled], fieldset[disabled] .radio, fieldset[disabled] .checkbox { - color: #6b6b6b; - cursor: not-allowed; } - -.radio + .radio { - margin-left: 0.5em; } - -.select { - display: inline-block; - max-width: 100%; - position: relative; - vertical-align: top; } - .select:not(.is-multiple) { - height: 2.25em; } - .select:not(.is-multiple):not(.is-loading)::after { - border-color: #2e63b8; - right: 1.125em; - z-index: 4; } - .select.is-rounded select, #documenter .docs-sidebar form.docs-search > input.select select { - border-radius: 290486px; - padding-left: 1em; } - .select select { - cursor: pointer; - display: block; - font-size: 1em; - max-width: 100%; - outline: none; } - .select select::-ms-expand { - display: none; } - .select select[disabled]:hover, fieldset[disabled] .select select:hover { - border-color: whitesmoke; } - .select select:not([multiple]) { - padding-right: 2.5em; } - .select select[multiple] { - height: auto; - padding: 0; } - .select select[multiple] option { - padding: 0.5em 1em; } - .select:not(.is-multiple):not(.is-loading):hover::after { - border-color: #363636; } - .select.is-white:not(:hover)::after { - border-color: white; } - .select.is-white select { - border-color: white; } - .select.is-white select:hover, .select.is-white select.is-hovered { - border-color: #f2f2f2; } - .select.is-white select:focus, .select.is-white select.is-focused, .select.is-white select:active, .select.is-white select.is-active { - box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } - .select.is-black:not(:hover)::after { - border-color: #0a0a0a; } - .select.is-black select { - border-color: #0a0a0a; } - .select.is-black select:hover, .select.is-black select.is-hovered { - border-color: black; } - .select.is-black select:focus, .select.is-black select.is-focused, .select.is-black select:active, .select.is-black select.is-active { - box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } - .select.is-light:not(:hover)::after { - border-color: whitesmoke; } - .select.is-light select { - border-color: whitesmoke; } - .select.is-light select:hover, .select.is-light select.is-hovered { - border-color: #e8e8e8; } - .select.is-light select:focus, .select.is-light select.is-focused, .select.is-light select:active, .select.is-light select.is-active { - box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); } - .select.is-dark:not(:hover)::after, .content kbd.select:not(:hover)::after { - border-color: #363636; } - .select.is-dark select, .content kbd.select select { - border-color: #363636; } - .select.is-dark select:hover, .content kbd.select select:hover, .select.is-dark select.is-hovered, .content kbd.select select.is-hovered { - border-color: #292929; } - .select.is-dark select:focus, .content kbd.select select:focus, .select.is-dark select.is-focused, .content kbd.select select.is-focused, .select.is-dark select:active, .content kbd.select select:active, .select.is-dark select.is-active, .content kbd.select select.is-active { - box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); } - .select.is-primary:not(:hover)::after, .docstring > section > a.select.docs-sourcelink:not(:hover)::after { - border-color: #4eb5de; } - .select.is-primary select, .docstring > section > a.select.docs-sourcelink select { - border-color: #4eb5de; } - .select.is-primary select:hover, .docstring > section > a.select.docs-sourcelink select:hover, .select.is-primary select.is-hovered, .docstring > section > a.select.docs-sourcelink select.is-hovered { - border-color: #39acda; } - .select.is-primary select:focus, .docstring > section > a.select.docs-sourcelink select:focus, .select.is-primary select.is-focused, .docstring > section > a.select.docs-sourcelink select.is-focused, .select.is-primary select:active, .docstring > section > a.select.docs-sourcelink select:active, .select.is-primary select.is-active, .docstring > section > a.select.docs-sourcelink select.is-active { - box-shadow: 0 0 0 0.125em rgba(78, 181, 222, 0.25); } - .select.is-link:not(:hover)::after { - border-color: #2e63b8; } - .select.is-link select { - border-color: #2e63b8; } - .select.is-link select:hover, .select.is-link select.is-hovered { - border-color: #2958a4; } - .select.is-link select:focus, .select.is-link select.is-focused, .select.is-link select:active, .select.is-link select.is-active { - box-shadow: 0 0 0 0.125em rgba(46, 99, 184, 0.25); } - .select.is-info:not(:hover)::after { - border-color: #209cee; } - .select.is-info select { - border-color: #209cee; } - .select.is-info select:hover, .select.is-info select.is-hovered { - border-color: #1190e3; } - .select.is-info select:focus, .select.is-info select.is-focused, .select.is-info select:active, .select.is-info select.is-active { - box-shadow: 0 0 0 0.125em rgba(32, 156, 238, 0.25); } - .select.is-success:not(:hover)::after { - border-color: #22c35b; } - .select.is-success select { - border-color: #22c35b; } - .select.is-success select:hover, .select.is-success select.is-hovered { - border-color: #1ead51; } - .select.is-success select:focus, .select.is-success select.is-focused, .select.is-success select:active, .select.is-success select.is-active { - box-shadow: 0 0 0 0.125em rgba(34, 195, 91, 0.25); } - .select.is-warning:not(:hover)::after { - border-color: #ffdd57; } - .select.is-warning select { - border-color: #ffdd57; } - .select.is-warning select:hover, .select.is-warning select.is-hovered { - border-color: #ffd83e; } - .select.is-warning select:focus, .select.is-warning select.is-focused, .select.is-warning select:active, .select.is-warning select.is-active { - box-shadow: 0 0 0 0.125em rgba(255, 221, 87, 0.25); } - .select.is-danger:not(:hover)::after { - border-color: #da0b00; } - .select.is-danger select { - border-color: #da0b00; } - .select.is-danger select:hover, .select.is-danger select.is-hovered { - border-color: #c10a00; } - .select.is-danger select:focus, .select.is-danger select.is-focused, .select.is-danger select:active, .select.is-danger select.is-active { - box-shadow: 0 0 0 0.125em rgba(218, 11, 0, 0.25); } - .select.is-small, #documenter .docs-sidebar form.docs-search > input.select { - border-radius: 2px; - font-size: 0.75rem; } - .select.is-medium { - font-size: 1.25rem; } - .select.is-large { - font-size: 1.5rem; } - .select.is-disabled::after { - border-color: #6b6b6b; } - .select.is-fullwidth { - width: 100%; } - .select.is-fullwidth select { - width: 100%; } - .select.is-loading::after { - margin-top: 0; - position: absolute; - right: 0.625em; - top: 0.625em; - transform: none; } - .select.is-loading.is-small:after, #documenter .docs-sidebar form.docs-search > input.is-loading:after { - font-size: 0.75rem; } - .select.is-loading.is-medium:after { - font-size: 1.25rem; } - .select.is-loading.is-large:after { - font-size: 1.5rem; } - -.file { - align-items: stretch; - display: flex; - justify-content: flex-start; - position: relative; } - .file.is-white .file-cta { - background-color: white; - border-color: transparent; - color: #0a0a0a; } - .file.is-white:hover .file-cta, .file.is-white.is-hovered .file-cta { - background-color: #f9f9f9; - border-color: transparent; - color: #0a0a0a; } - .file.is-white:focus .file-cta, .file.is-white.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(255, 255, 255, 0.25); - color: #0a0a0a; } - .file.is-white:active .file-cta, .file.is-white.is-active .file-cta { - background-color: #f2f2f2; - border-color: transparent; - color: #0a0a0a; } - .file.is-black .file-cta { - background-color: #0a0a0a; - border-color: transparent; - color: white; } - .file.is-black:hover .file-cta, .file.is-black.is-hovered .file-cta { - background-color: #040404; - border-color: transparent; - color: white; } - .file.is-black:focus .file-cta, .file.is-black.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(10, 10, 10, 0.25); - color: white; } - .file.is-black:active .file-cta, .file.is-black.is-active .file-cta { - background-color: black; - border-color: transparent; - color: white; } - .file.is-light .file-cta { - background-color: whitesmoke; - border-color: transparent; - color: #363636; } - .file.is-light:hover .file-cta, .file.is-light.is-hovered .file-cta { - background-color: #eeeeee; - border-color: transparent; - color: #363636; } - .file.is-light:focus .file-cta, .file.is-light.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(245, 245, 245, 0.25); - color: #363636; } - .file.is-light:active .file-cta, .file.is-light.is-active .file-cta { - background-color: #e8e8e8; - border-color: transparent; - color: #363636; } - .file.is-dark .file-cta, .content kbd.file .file-cta { - background-color: #363636; - border-color: transparent; - color: whitesmoke; } - .file.is-dark:hover .file-cta, .content kbd.file:hover .file-cta, .file.is-dark.is-hovered .file-cta, .content kbd.file.is-hovered .file-cta { - background-color: #2f2f2f; - border-color: transparent; - color: whitesmoke; } - .file.is-dark:focus .file-cta, .content kbd.file:focus .file-cta, .file.is-dark.is-focused .file-cta, .content kbd.file.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(54, 54, 54, 0.25); - color: whitesmoke; } - .file.is-dark:active .file-cta, .content kbd.file:active .file-cta, .file.is-dark.is-active .file-cta, .content kbd.file.is-active .file-cta { - background-color: #292929; - border-color: transparent; - color: whitesmoke; } - .file.is-primary .file-cta, .docstring > section > a.file.docs-sourcelink .file-cta { - background-color: #4eb5de; - border-color: transparent; - color: #fff; } - .file.is-primary:hover .file-cta, .docstring > section > a.file.docs-sourcelink:hover .file-cta, .file.is-primary.is-hovered .file-cta, .docstring > section > a.file.is-hovered.docs-sourcelink .file-cta { - background-color: #43b1dc; - border-color: transparent; - color: #fff; } - .file.is-primary:focus .file-cta, .docstring > section > a.file.docs-sourcelink:focus .file-cta, .file.is-primary.is-focused .file-cta, .docstring > section > a.file.is-focused.docs-sourcelink .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(78, 181, 222, 0.25); - color: #fff; } - .file.is-primary:active .file-cta, .docstring > section > a.file.docs-sourcelink:active .file-cta, .file.is-primary.is-active .file-cta, .docstring > section > a.file.is-active.docs-sourcelink .file-cta { - background-color: #39acda; - border-color: transparent; - color: #fff; } - .file.is-link .file-cta { - background-color: #2e63b8; - border-color: transparent; - color: #fff; } - .file.is-link:hover .file-cta, .file.is-link.is-hovered .file-cta { - background-color: #2b5eae; - border-color: transparent; - color: #fff; } - .file.is-link:focus .file-cta, .file.is-link.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(46, 99, 184, 0.25); - color: #fff; } - .file.is-link:active .file-cta, .file.is-link.is-active .file-cta { - background-color: #2958a4; - border-color: transparent; - color: #fff; } - .file.is-info .file-cta { - background-color: #209cee; - border-color: transparent; - color: #fff; } - .file.is-info:hover .file-cta, .file.is-info.is-hovered .file-cta { - background-color: #1497ed; - border-color: transparent; - color: #fff; } - .file.is-info:focus .file-cta, .file.is-info.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(32, 156, 238, 0.25); - color: #fff; } - .file.is-info:active .file-cta, .file.is-info.is-active .file-cta { - background-color: #1190e3; - border-color: transparent; - color: #fff; } - .file.is-success .file-cta { - background-color: #22c35b; - border-color: transparent; - color: #fff; } - .file.is-success:hover .file-cta, .file.is-success.is-hovered .file-cta { - background-color: #20b856; - border-color: transparent; - color: #fff; } - .file.is-success:focus .file-cta, .file.is-success.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(34, 195, 91, 0.25); - color: #fff; } - .file.is-success:active .file-cta, .file.is-success.is-active .file-cta { - background-color: #1ead51; - border-color: transparent; - color: #fff; } - .file.is-warning .file-cta { - background-color: #ffdd57; - border-color: transparent; - color: rgba(0, 0, 0, 0.7); } - .file.is-warning:hover .file-cta, .file.is-warning.is-hovered .file-cta { - background-color: #ffda4a; - border-color: transparent; - color: rgba(0, 0, 0, 0.7); } - .file.is-warning:focus .file-cta, .file.is-warning.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(255, 221, 87, 0.25); - color: rgba(0, 0, 0, 0.7); } - .file.is-warning:active .file-cta, .file.is-warning.is-active .file-cta { - background-color: #ffd83e; - border-color: transparent; - color: rgba(0, 0, 0, 0.7); } - .file.is-danger .file-cta { - background-color: #da0b00; - border-color: transparent; - color: #fff; } - .file.is-danger:hover .file-cta, .file.is-danger.is-hovered .file-cta { - background-color: #cd0a00; - border-color: transparent; - color: #fff; } - .file.is-danger:focus .file-cta, .file.is-danger.is-focused .file-cta { - border-color: transparent; - box-shadow: 0 0 0.5em rgba(218, 11, 0, 0.25); - color: #fff; } - .file.is-danger:active .file-cta, .file.is-danger.is-active .file-cta { - background-color: #c10a00; - border-color: transparent; - color: #fff; } - .file.is-small, #documenter .docs-sidebar form.docs-search > input.file { - font-size: 0.75rem; } - .file.is-medium { - font-size: 1.25rem; } - .file.is-medium .file-icon .fa { - font-size: 21px; } - .file.is-large { - font-size: 1.5rem; } - .file.is-large .file-icon .fa { - font-size: 28px; } - .file.has-name .file-cta { - border-bottom-right-radius: 0; - border-top-right-radius: 0; } - .file.has-name .file-name { - border-bottom-left-radius: 0; - border-top-left-radius: 0; } - .file.has-name.is-empty .file-cta { - border-radius: 4px; } - .file.has-name.is-empty .file-name { - display: none; } - .file.is-boxed .file-label { - flex-direction: column; } - .file.is-boxed .file-cta { - flex-direction: column; - height: auto; - padding: 1em 3em; } - .file.is-boxed .file-name { - border-width: 0 1px 1px; } - .file.is-boxed .file-icon { - height: 1.5em; - width: 1.5em; } - .file.is-boxed .file-icon .fa { - font-size: 21px; } - .file.is-boxed.is-small .file-icon .fa, #documenter .docs-sidebar form.docs-search > input.is-boxed .file-icon .fa { - font-size: 14px; } - .file.is-boxed.is-medium .file-icon .fa { - font-size: 28px; } - .file.is-boxed.is-large .file-icon .fa { - font-size: 35px; } - .file.is-boxed.has-name .file-cta { - border-radius: 4px 4px 0 0; } - .file.is-boxed.has-name .file-name { - border-radius: 0 0 4px 4px; - border-width: 0 1px 1px; } - .file.is-centered { - justify-content: center; } - .file.is-fullwidth .file-label { - width: 100%; } - .file.is-fullwidth .file-name { - flex-grow: 1; - max-width: none; } - .file.is-right { - justify-content: flex-end; } - .file.is-right .file-cta { - border-radius: 0 4px 4px 0; } - .file.is-right .file-name { - border-radius: 4px 0 0 4px; - border-width: 1px 0 1px 1px; - order: -1; } - -.file-label { - align-items: stretch; - display: flex; - cursor: pointer; - justify-content: flex-start; - overflow: hidden; - position: relative; } - .file-label:hover .file-cta { - background-color: #eeeeee; - color: #363636; } - .file-label:hover .file-name { - border-color: #d5d5d5; } - .file-label:active .file-cta { - background-color: #e8e8e8; - color: #363636; } - .file-label:active .file-name { - border-color: #cfcfcf; } - -.file-input { - height: 100%; - left: 0; - opacity: 0; - outline: none; - position: absolute; - top: 0; - width: 100%; } - -.file-cta, -.file-name { - border-color: #dbdbdb; - border-radius: 4px; - font-size: 1em; - padding-left: 1em; - padding-right: 1em; - white-space: nowrap; } - -.file-cta { - background-color: whitesmoke; - color: #4a4a4a; } - -.file-name { - border-color: #dbdbdb; - border-style: solid; - border-width: 1px 1px 1px 0; - display: block; - max-width: 16em; - overflow: hidden; - text-align: left; - text-overflow: ellipsis; } - -.file-icon { - align-items: center; - display: flex; - height: 1em; - justify-content: center; - margin-right: 0.5em; - width: 1em; } - .file-icon .fa { - font-size: 14px; } - -.label { - color: #363636; - display: block; - font-size: 1rem; - font-weight: 700; } - .label:not(:last-child) { - margin-bottom: 0.5em; } - .label.is-small, #documenter .docs-sidebar form.docs-search > input.label { - font-size: 0.75rem; } - .label.is-medium { - font-size: 1.25rem; } - .label.is-large { - font-size: 1.5rem; } - -.help { - display: block; - font-size: 0.75rem; - margin-top: 0.25rem; } - .help.is-white { - color: white; } - .help.is-black { - color: #0a0a0a; } - .help.is-light { - color: whitesmoke; } - .help.is-dark, .content kbd.help { - color: #363636; } - .help.is-primary, .docstring > section > a.help.docs-sourcelink { - color: #4eb5de; } - .help.is-link { - color: #2e63b8; } - .help.is-info { - color: #209cee; } - .help.is-success { - color: #22c35b; } - .help.is-warning { - color: #ffdd57; } - .help.is-danger { - color: #da0b00; } - -.field:not(:last-child) { - margin-bottom: 0.75rem; } - -.field.has-addons { - display: flex; - justify-content: flex-start; } - .field.has-addons .control:not(:last-child) { - margin-right: -1px; } - .field.has-addons .control:not(:first-child):not(:last-child) .button, - .field.has-addons .control:not(:first-child):not(:last-child) .input, - .field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search > input, - #documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search > input, - .field.has-addons .control:not(:first-child):not(:last-child) .select select { - border-radius: 0; } - .field.has-addons .control:first-child:not(:only-child) .button, - .field.has-addons .control:first-child:not(:only-child) .input, - .field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search > input, - #documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search > input, - .field.has-addons .control:first-child:not(:only-child) .select select { - border-bottom-right-radius: 0; - border-top-right-radius: 0; } - .field.has-addons .control:last-child:not(:only-child) .button, - .field.has-addons .control:last-child:not(:only-child) .input, - .field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search > input, - #documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search > input, - .field.has-addons .control:last-child:not(:only-child) .select select { - border-bottom-left-radius: 0; - border-top-left-radius: 0; } - .field.has-addons .control .button:not([disabled]):hover, .field.has-addons .control .button.is-hovered:not([disabled]), - .field.has-addons .control .input:not([disabled]):hover, - .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):hover, - #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):hover, - .field.has-addons .control .input.is-hovered:not([disabled]), - .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-hovered:not([disabled]), - #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-hovered:not([disabled]), - .field.has-addons .control .select select:not([disabled]):hover, - .field.has-addons .control .select select.is-hovered:not([disabled]) { - z-index: 2; } - .field.has-addons .control .button:not([disabled]):focus, .field.has-addons .control .button.is-focused:not([disabled]), .field.has-addons .control .button:not([disabled]):active, .field.has-addons .control .button.is-active:not([disabled]), - .field.has-addons .control .input:not([disabled]):focus, - .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):focus, - #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):focus, - .field.has-addons .control .input.is-focused:not([disabled]), - .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-focused:not([disabled]), - #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-focused:not([disabled]), - .field.has-addons .control .input:not([disabled]):active, - .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):active, - #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):active, - .field.has-addons .control .input.is-active:not([disabled]), - .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-active:not([disabled]), - #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-active:not([disabled]), - .field.has-addons .control .select select:not([disabled]):focus, - .field.has-addons .control .select select.is-focused:not([disabled]), - .field.has-addons .control .select select:not([disabled]):active, - .field.has-addons .control .select select.is-active:not([disabled]) { - z-index: 3; } - .field.has-addons .control .button:not([disabled]):focus:hover, .field.has-addons .control .button.is-focused:not([disabled]):hover, .field.has-addons .control .button:not([disabled]):active:hover, .field.has-addons .control .button.is-active:not([disabled]):hover, - .field.has-addons .control .input:not([disabled]):focus:hover, - .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):focus:hover, - #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):focus:hover, - .field.has-addons .control .input.is-focused:not([disabled]):hover, - .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-focused:not([disabled]):hover, - #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-focused:not([disabled]):hover, - .field.has-addons .control .input:not([disabled]):active:hover, - .field.has-addons .control #documenter .docs-sidebar form.docs-search > input:not([disabled]):active:hover, - #documenter .docs-sidebar .field.has-addons .control form.docs-search > input:not([disabled]):active:hover, - .field.has-addons .control .input.is-active:not([disabled]):hover, - .field.has-addons .control #documenter .docs-sidebar form.docs-search > input.is-active:not([disabled]):hover, - #documenter .docs-sidebar .field.has-addons .control form.docs-search > input.is-active:not([disabled]):hover, - .field.has-addons .control .select select:not([disabled]):focus:hover, - .field.has-addons .control .select select.is-focused:not([disabled]):hover, - .field.has-addons .control .select select:not([disabled]):active:hover, - .field.has-addons .control .select select.is-active:not([disabled]):hover { - z-index: 4; } - .field.has-addons .control.is-expanded { - flex-grow: 1; - flex-shrink: 1; } - .field.has-addons.has-addons-centered { - justify-content: center; } - .field.has-addons.has-addons-right { - justify-content: flex-end; } - .field.has-addons.has-addons-fullwidth .control { - flex-grow: 1; - flex-shrink: 0; } - -.field.is-grouped { - display: flex; - justify-content: flex-start; } - .field.is-grouped > .control { - flex-shrink: 0; } - .field.is-grouped > .control:not(:last-child) { - margin-bottom: 0; - margin-right: 0.75rem; } - .field.is-grouped > .control.is-expanded { - flex-grow: 1; - flex-shrink: 1; } - .field.is-grouped.is-grouped-centered { - justify-content: center; } - .field.is-grouped.is-grouped-right { - justify-content: flex-end; } - .field.is-grouped.is-grouped-multiline { - flex-wrap: wrap; } - .field.is-grouped.is-grouped-multiline > .control:last-child, .field.is-grouped.is-grouped-multiline > .control:not(:last-child) { - margin-bottom: 0.75rem; } - .field.is-grouped.is-grouped-multiline:last-child { - margin-bottom: -0.75rem; } - .field.is-grouped.is-grouped-multiline:not(:last-child) { - margin-bottom: 0; } - -@media screen and (min-width: 769px), print { - .field.is-horizontal { - display: flex; } } - -.field-label .label { - font-size: inherit; } - -@media screen and (max-width: 768px) { - .field-label { - margin-bottom: 0.5rem; } } - -@media screen and (min-width: 769px), print { - .field-label { - flex-basis: 0; - flex-grow: 1; - flex-shrink: 0; - margin-right: 1.5rem; - text-align: right; } - .field-label.is-small, #documenter .docs-sidebar form.docs-search > input.field-label { - font-size: 0.75rem; - padding-top: 0.375em; } - .field-label.is-normal { - padding-top: 0.375em; } - .field-label.is-medium { - font-size: 1.25rem; - padding-top: 0.375em; } - .field-label.is-large { - font-size: 1.5rem; - padding-top: 0.375em; } } - -.field-body .field .field { - margin-bottom: 0; } - -@media screen and (min-width: 769px), print { - .field-body { - display: flex; - flex-basis: 0; - flex-grow: 5; - flex-shrink: 1; } - .field-body .field { - margin-bottom: 0; } - .field-body > .field { - flex-shrink: 1; } - .field-body > .field:not(.is-narrow) { - flex-grow: 1; } - .field-body > .field:not(:last-child) { - margin-right: 0.75rem; } } - -.control { - box-sizing: border-box; - clear: both; - font-size: 1rem; - position: relative; - text-align: left; } - .control.has-icons-left .input:focus ~ .icon, .control.has-icons-left #documenter .docs-sidebar form.docs-search > input:focus ~ .icon, #documenter .docs-sidebar .control.has-icons-left form.docs-search > input:focus ~ .icon, - .control.has-icons-left .select:focus ~ .icon, .control.has-icons-right .input:focus ~ .icon, .control.has-icons-right #documenter .docs-sidebar form.docs-search > input:focus ~ .icon, #documenter .docs-sidebar .control.has-icons-right form.docs-search > input:focus ~ .icon, - .control.has-icons-right .select:focus ~ .icon { - color: #6b6b6b; } - .control.has-icons-left .input.is-small ~ .icon, .control.has-icons-left #documenter .docs-sidebar form.docs-search > input ~ .icon, #documenter .docs-sidebar .control.has-icons-left form.docs-search > input ~ .icon, - .control.has-icons-left .select.is-small ~ .icon, .control.has-icons-right .input.is-small ~ .icon, .control.has-icons-right #documenter .docs-sidebar form.docs-search > input ~ .icon, #documenter .docs-sidebar .control.has-icons-right form.docs-search > input ~ .icon, - .control.has-icons-right .select.is-small ~ .icon { - font-size: 0.75rem; } - .control.has-icons-left .input.is-medium ~ .icon, .control.has-icons-left #documenter .docs-sidebar form.docs-search > input.is-medium ~ .icon, #documenter .docs-sidebar .control.has-icons-left form.docs-search > input.is-medium ~ .icon, - .control.has-icons-left .select.is-medium ~ .icon, .control.has-icons-right .input.is-medium ~ .icon, .control.has-icons-right #documenter .docs-sidebar form.docs-search > input.is-medium ~ .icon, #documenter .docs-sidebar .control.has-icons-right form.docs-search > input.is-medium ~ .icon, - .control.has-icons-right .select.is-medium ~ .icon { - font-size: 1.25rem; } - .control.has-icons-left .input.is-large ~ .icon, .control.has-icons-left #documenter .docs-sidebar form.docs-search > input.is-large ~ .icon, #documenter .docs-sidebar .control.has-icons-left form.docs-search > input.is-large ~ .icon, - .control.has-icons-left .select.is-large ~ .icon, .control.has-icons-right .input.is-large ~ .icon, .control.has-icons-right #documenter .docs-sidebar form.docs-search > input.is-large ~ .icon, #documenter .docs-sidebar .control.has-icons-right form.docs-search > input.is-large ~ .icon, - .control.has-icons-right .select.is-large ~ .icon { - font-size: 1.5rem; } - .control.has-icons-left .icon, .control.has-icons-right .icon { - color: #dbdbdb; - height: 2.25em; - pointer-events: none; - position: absolute; - top: 0; - width: 2.25em; - z-index: 4; } - .control.has-icons-left .input, .control.has-icons-left #documenter .docs-sidebar form.docs-search > input, #documenter .docs-sidebar .control.has-icons-left form.docs-search > input, - .control.has-icons-left .select select { - padding-left: 2.25em; } - .control.has-icons-left .icon.is-left { - left: 0; } - .control.has-icons-right .input, .control.has-icons-right #documenter .docs-sidebar form.docs-search > input, #documenter .docs-sidebar .control.has-icons-right form.docs-search > input, - .control.has-icons-right .select select { - padding-right: 2.25em; } - .control.has-icons-right .icon.is-right { - right: 0; } - .control.is-loading::after { - position: absolute !important; - right: 0.625em; - top: 0.625em; - z-index: 4; } - .control.is-loading.is-small:after, #documenter .docs-sidebar form.docs-search > input.is-loading:after { - font-size: 0.75rem; } - .control.is-loading.is-medium:after { - font-size: 1.25rem; } - .control.is-loading.is-large:after { - font-size: 1.5rem; } - -.breadcrumb { - font-size: 1rem; - white-space: nowrap; } - .breadcrumb a { - align-items: center; - color: #2e63b8; - display: flex; - justify-content: center; - padding: 0 0.75em; } - .breadcrumb a:hover { - color: #363636; } - .breadcrumb li { - align-items: center; - display: flex; } - .breadcrumb li:first-child a { - padding-left: 0; } - .breadcrumb li.is-active a { - color: #222222; - cursor: default; - pointer-events: none; } - .breadcrumb li + li::before { - color: #b5b5b5; - content: "\0002f"; } - .breadcrumb ul, - .breadcrumb ol { - align-items: flex-start; - display: flex; - flex-wrap: wrap; - justify-content: flex-start; } - .breadcrumb .icon:first-child { - margin-right: 0.5em; } - .breadcrumb .icon:last-child { - margin-left: 0.5em; } - .breadcrumb.is-centered ol, - .breadcrumb.is-centered ul { - justify-content: center; } - .breadcrumb.is-right ol, - .breadcrumb.is-right ul { - justify-content: flex-end; } - .breadcrumb.is-small, #documenter .docs-sidebar form.docs-search > input.breadcrumb { - font-size: 0.75rem; } - .breadcrumb.is-medium { - font-size: 1.25rem; } - .breadcrumb.is-large { - font-size: 1.5rem; } - .breadcrumb.has-arrow-separator li + li::before { - content: "\02192"; } - .breadcrumb.has-bullet-separator li + li::before { - content: "\02022"; } - .breadcrumb.has-dot-separator li + li::before { - content: "\000b7"; } - .breadcrumb.has-succeeds-separator li + li::before { - content: "\0227B"; } - -.card { - background-color: white; - box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); - color: #222222; - max-width: 100%; - position: relative; } - -.card-header { - background-color: transparent; - align-items: stretch; - box-shadow: 0 1px 2px rgba(10, 10, 10, 0.1); - display: flex; } - -.card-header-title { - align-items: center; - color: #222222; - display: flex; - flex-grow: 1; - font-weight: 700; - padding: 0.75rem; } - .card-header-title.is-centered { - justify-content: center; } - -.card-header-icon { - align-items: center; - cursor: pointer; - display: flex; - justify-content: center; - padding: 0.75rem; } - -.card-image { - display: block; - position: relative; } - -.card-content { - background-color: transparent; - padding: 1.5rem; } - -.card-footer { - background-color: transparent; - border-top: 1px solid #dbdbdb; - align-items: stretch; - display: flex; } - -.card-footer-item { - align-items: center; - display: flex; - flex-basis: 0; - flex-grow: 1; - flex-shrink: 0; - justify-content: center; - padding: 0.75rem; } - .card-footer-item:not(:last-child) { - border-right: 1px solid #dbdbdb; } - -.card .media:not(:last-child) { - margin-bottom: 1.5rem; } - -.dropdown { - display: inline-flex; - position: relative; - vertical-align: top; } - .dropdown.is-active .dropdown-menu, .dropdown.is-hoverable:hover .dropdown-menu { - display: block; } - .dropdown.is-right .dropdown-menu { - left: auto; - right: 0; } - .dropdown.is-up .dropdown-menu { - bottom: 100%; - padding-bottom: 4px; - padding-top: initial; - top: auto; } - -.dropdown-menu { - display: none; - left: 0; - min-width: 12rem; - padding-top: 4px; - position: absolute; - top: 100%; - z-index: 20; } - -.dropdown-content { - background-color: white; - border-radius: 4px; - box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); - padding-bottom: 0.5rem; - padding-top: 0.5rem; } - -.dropdown-item { - color: #4a4a4a; - display: block; - font-size: 0.875rem; - line-height: 1.5; - padding: 0.375rem 1rem; - position: relative; } - -a.dropdown-item, -button.dropdown-item { - padding-right: 3rem; - text-align: left; - white-space: nowrap; - width: 100%; } - a.dropdown-item:hover, - button.dropdown-item:hover { - background-color: whitesmoke; - color: #0a0a0a; } - a.dropdown-item.is-active, - button.dropdown-item.is-active { - background-color: #2e63b8; - color: #fff; } - -.dropdown-divider { - background-color: #dbdbdb; - border: none; - display: block; - height: 1px; - margin: 0.5rem 0; } - -.level { - align-items: center; - justify-content: space-between; } - .level code { - border-radius: 4px; } - .level img { - display: inline-block; - vertical-align: top; } - .level.is-mobile { - display: flex; } - .level.is-mobile .level-left, - .level.is-mobile .level-right { - display: flex; } - .level.is-mobile .level-left + .level-right { - margin-top: 0; } - .level.is-mobile .level-item:not(:last-child) { - margin-bottom: 0; - margin-right: 0.75rem; } - .level.is-mobile .level-item:not(.is-narrow) { - flex-grow: 1; } - @media screen and (min-width: 769px), print { - .level { - display: flex; } - .level > .level-item:not(.is-narrow) { - flex-grow: 1; } } -.level-item { - align-items: center; - display: flex; - flex-basis: auto; - flex-grow: 0; - flex-shrink: 0; - justify-content: center; } - .level-item .title, - .level-item .subtitle { - margin-bottom: 0; } - @media screen and (max-width: 768px) { - .level-item:not(:last-child) { - margin-bottom: 0.75rem; } } -.level-left, -.level-right { - flex-basis: auto; - flex-grow: 0; - flex-shrink: 0; } - .level-left .level-item.is-flexible, - .level-right .level-item.is-flexible { - flex-grow: 1; } - @media screen and (min-width: 769px), print { - .level-left .level-item:not(:last-child), - .level-right .level-item:not(:last-child) { - margin-right: 0.75rem; } } -.level-left { - align-items: center; - justify-content: flex-start; } - @media screen and (max-width: 768px) { - .level-left + .level-right { - margin-top: 1.5rem; } } - @media screen and (min-width: 769px), print { - .level-left { - display: flex; } } -.level-right { - align-items: center; - justify-content: flex-end; } - @media screen and (min-width: 769px), print { - .level-right { - display: flex; } } -.list { - background-color: white; - border-radius: 4px; - box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); } - -.list-item { - display: block; - padding: 0.5em 1em; } - .list-item:not(a) { - color: #222222; } - .list-item:first-child { - border-top-left-radius: 4px; - border-top-right-radius: 4px; } - .list-item:last-child { - border-bottom-left-radius: 4px; - border-bottom-right-radius: 4px; } - .list-item:not(:last-child) { - border-bottom: 1px solid #dbdbdb; } - .list-item.is-active { - background-color: #2e63b8; - color: #fff; } - -a.list-item { - background-color: whitesmoke; - cursor: pointer; } - -.media { - align-items: flex-start; - display: flex; - text-align: left; } - .media .content:not(:last-child) { - margin-bottom: 0.75rem; } - .media .media { - border-top: 1px solid rgba(219, 219, 219, 0.5); - display: flex; - padding-top: 0.75rem; } - .media .media .content:not(:last-child), - .media .media .control:not(:last-child) { - margin-bottom: 0.5rem; } - .media .media .media { - padding-top: 0.5rem; } - .media .media .media + .media { - margin-top: 0.5rem; } - .media + .media { - border-top: 1px solid rgba(219, 219, 219, 0.5); - margin-top: 1rem; - padding-top: 1rem; } - .media.is-large + .media { - margin-top: 1.5rem; - padding-top: 1.5rem; } - -.media-left, -.media-right { - flex-basis: auto; - flex-grow: 0; - flex-shrink: 0; } - -.media-left { - margin-right: 1rem; } - -.media-right { - margin-left: 1rem; } - -.media-content { - flex-basis: auto; - flex-grow: 1; - flex-shrink: 1; - text-align: left; } - -@media screen and (max-width: 768px) { - .media-content { - overflow-x: auto; } } - -.menu { - font-size: 1rem; } - .menu.is-small, #documenter .docs-sidebar form.docs-search > input.menu { - font-size: 0.75rem; } - .menu.is-medium { - font-size: 1.25rem; } - .menu.is-large { - font-size: 1.5rem; } - -.menu-list { - line-height: 1.25; } - .menu-list a { - border-radius: 2px; - color: #222222; - display: block; - padding: 0.5em 0.75em; } - .menu-list a:hover { - background-color: whitesmoke; - color: #222222; } - .menu-list a.is-active { - background-color: #2e63b8; - color: #fff; } - .menu-list li ul { - border-left: 1px solid #dbdbdb; - margin: 0.75em; - padding-left: 0.75em; } - -.menu-label { - color: #6b6b6b; - font-size: 0.75em; - letter-spacing: 0.1em; - text-transform: uppercase; } - .menu-label:not(:first-child) { - margin-top: 1em; } - .menu-label:not(:last-child) { - margin-bottom: 1em; } - -.message { - background-color: whitesmoke; - border-radius: 4px; - font-size: 1rem; } - .message strong { - color: currentColor; } - .message a:not(.button):not(.tag):not(.dropdown-item) { - color: currentColor; - text-decoration: underline; } - .message.is-small, #documenter .docs-sidebar form.docs-search > input.message { - font-size: 0.75rem; } - .message.is-medium { - font-size: 1.25rem; } - .message.is-large { - font-size: 1.5rem; } - .message.is-white { - background-color: white; } - .message.is-white .message-header { - background-color: white; - color: #0a0a0a; } - .message.is-white .message-body { - border-color: white; - color: #4d4d4d; } - .message.is-black { - background-color: #fafafa; } - .message.is-black .message-header { - background-color: #0a0a0a; - color: white; } - .message.is-black .message-body { - border-color: #0a0a0a; - color: #090909; } - .message.is-light { - background-color: #fafafa; } - .message.is-light .message-header { - background-color: whitesmoke; - color: #363636; } - .message.is-light .message-body { - border-color: whitesmoke; - color: #505050; } - .message.is-dark, .content kbd.message { - background-color: #fafafa; } - .message.is-dark .message-header, .content kbd.message .message-header { - background-color: #363636; - color: whitesmoke; } - .message.is-dark .message-body, .content kbd.message .message-body { - border-color: #363636; - color: #2a2a2a; } - .message.is-primary, .docstring > section > a.message.docs-sourcelink { - background-color: #f6fbfd; } - .message.is-primary .message-header, .docstring > section > a.message.docs-sourcelink .message-header { - background-color: #4eb5de; - color: #fff; } - .message.is-primary .message-body, .docstring > section > a.message.docs-sourcelink .message-body { - border-color: #4eb5de; - color: #1f556a; } - .message.is-link { - background-color: #f7f9fd; } - .message.is-link .message-header { - background-color: #2e63b8; - color: #fff; } - .message.is-link .message-body { - border-color: #2e63b8; - color: #264981; } - .message.is-info { - background-color: #f6fbfe; } - .message.is-info .message-header { - background-color: #209cee; - color: #fff; } - .message.is-info .message-body { - border-color: #209cee; - color: #12537d; } - .message.is-success { - background-color: #f6fdf9; } - .message.is-success .message-header { - background-color: #22c35b; - color: #fff; } - .message.is-success .message-body { - border-color: #22c35b; - color: #0f361d; } - .message.is-warning { - background-color: #fffdf5; } - .message.is-warning .message-header { - background-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); } - .message.is-warning .message-body { - border-color: #ffdd57; - color: #3c3108; } - .message.is-danger { - background-color: #fff5f5; } - .message.is-danger .message-header { - background-color: #da0b00; - color: #fff; } - .message.is-danger .message-body { - border-color: #da0b00; - color: #9b0c04; } - -.message-header { - align-items: center; - background-color: #222222; - border-radius: 4px 4px 0 0; - color: #fff; - display: flex; - font-weight: 700; - justify-content: space-between; - line-height: 1.25; - padding: 0.75em 1em; - position: relative; } - .message-header .delete { - flex-grow: 0; - flex-shrink: 0; - margin-left: 0.75em; } - .message-header + .message-body { - border-width: 0; - border-top-left-radius: 0; - border-top-right-radius: 0; } - -.message-body { - border-color: #dbdbdb; - border-radius: 4px; - border-style: solid; - border-width: 0 0 0 4px; - color: #222222; - padding: 1.25em 1.5em; } - .message-body code, - .message-body pre { - background-color: white; } - .message-body pre code { - background-color: transparent; } - -.modal { - align-items: center; - display: none; - flex-direction: column; - justify-content: center; - overflow: hidden; - position: fixed; - z-index: 40; } - .modal.is-active { - display: flex; } - -.modal-background { - background-color: rgba(10, 10, 10, 0.86); } - -.modal-content, -.modal-card { - margin: 0 20px; - max-height: calc(100vh - 160px); - overflow: auto; - position: relative; - width: 100%; } - @media screen and (min-width: 769px), print { - .modal-content, - .modal-card { - margin: 0 auto; - max-height: calc(100vh - 40px); - width: 640px; } } -.modal-close { - background: none; - height: 40px; - position: fixed; - right: 20px; - top: 20px; - width: 40px; } - -.modal-card { - display: flex; - flex-direction: column; - max-height: calc(100vh - 40px); - overflow: hidden; - -ms-overflow-y: visible; } - -.modal-card-head, -.modal-card-foot { - align-items: center; - background-color: whitesmoke; - display: flex; - flex-shrink: 0; - justify-content: flex-start; - padding: 20px; - position: relative; } - -.modal-card-head { - border-bottom: 1px solid #dbdbdb; - border-top-left-radius: 6px; - border-top-right-radius: 6px; } - -.modal-card-title { - color: #222222; - flex-grow: 1; - flex-shrink: 0; - font-size: 1.5rem; - line-height: 1; } - -.modal-card-foot { - border-bottom-left-radius: 6px; - border-bottom-right-radius: 6px; - border-top: 1px solid #dbdbdb; } - .modal-card-foot .button:not(:last-child) { - margin-right: 0.5em; } - -.modal-card-body { - -webkit-overflow-scrolling: touch; - background-color: white; - flex-grow: 1; - flex-shrink: 1; - overflow: auto; - padding: 20px; } - -.navbar { - background-color: white; - min-height: 3.25rem; - position: relative; - z-index: 30; } - .navbar.is-white { - background-color: white; - color: #0a0a0a; } - .navbar.is-white .navbar-brand > .navbar-item, - .navbar.is-white .navbar-brand .navbar-link { - color: #0a0a0a; } - .navbar.is-white .navbar-brand > a.navbar-item:focus, .navbar.is-white .navbar-brand > a.navbar-item:hover, .navbar.is-white .navbar-brand > a.navbar-item.is-active, - .navbar.is-white .navbar-brand .navbar-link:focus, - .navbar.is-white .navbar-brand .navbar-link:hover, - .navbar.is-white .navbar-brand .navbar-link.is-active { - background-color: #f2f2f2; - color: #0a0a0a; } - .navbar.is-white .navbar-brand .navbar-link::after { - border-color: #0a0a0a; } - .navbar.is-white .navbar-burger { - color: #0a0a0a; } - @media screen and (min-width: 1056px) { - .navbar.is-white .navbar-start > .navbar-item, - .navbar.is-white .navbar-start .navbar-link, - .navbar.is-white .navbar-end > .navbar-item, - .navbar.is-white .navbar-end .navbar-link { - color: #0a0a0a; } - .navbar.is-white .navbar-start > a.navbar-item:focus, .navbar.is-white .navbar-start > a.navbar-item:hover, .navbar.is-white .navbar-start > a.navbar-item.is-active, - .navbar.is-white .navbar-start .navbar-link:focus, - .navbar.is-white .navbar-start .navbar-link:hover, - .navbar.is-white .navbar-start .navbar-link.is-active, - .navbar.is-white .navbar-end > a.navbar-item:focus, - .navbar.is-white .navbar-end > a.navbar-item:hover, - .navbar.is-white .navbar-end > a.navbar-item.is-active, - .navbar.is-white .navbar-end .navbar-link:focus, - .navbar.is-white .navbar-end .navbar-link:hover, - .navbar.is-white .navbar-end .navbar-link.is-active { - background-color: #f2f2f2; - color: #0a0a0a; } - .navbar.is-white .navbar-start .navbar-link::after, - .navbar.is-white .navbar-end .navbar-link::after { - border-color: #0a0a0a; } - .navbar.is-white .navbar-item.has-dropdown:focus .navbar-link, - .navbar.is-white .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #f2f2f2; - color: #0a0a0a; } - .navbar.is-white .navbar-dropdown a.navbar-item.is-active { - background-color: white; - color: #0a0a0a; } } - .navbar.is-black { - background-color: #0a0a0a; - color: white; } - .navbar.is-black .navbar-brand > .navbar-item, - .navbar.is-black .navbar-brand .navbar-link { - color: white; } - .navbar.is-black .navbar-brand > a.navbar-item:focus, .navbar.is-black .navbar-brand > a.navbar-item:hover, .navbar.is-black .navbar-brand > a.navbar-item.is-active, - .navbar.is-black .navbar-brand .navbar-link:focus, - .navbar.is-black .navbar-brand .navbar-link:hover, - .navbar.is-black .navbar-brand .navbar-link.is-active { - background-color: black; - color: white; } - .navbar.is-black .navbar-brand .navbar-link::after { - border-color: white; } - .navbar.is-black .navbar-burger { - color: white; } - @media screen and (min-width: 1056px) { - .navbar.is-black .navbar-start > .navbar-item, - .navbar.is-black .navbar-start .navbar-link, - .navbar.is-black .navbar-end > .navbar-item, - .navbar.is-black .navbar-end .navbar-link { - color: white; } - .navbar.is-black .navbar-start > a.navbar-item:focus, .navbar.is-black .navbar-start > a.navbar-item:hover, .navbar.is-black .navbar-start > a.navbar-item.is-active, - .navbar.is-black .navbar-start .navbar-link:focus, - .navbar.is-black .navbar-start .navbar-link:hover, - .navbar.is-black .navbar-start .navbar-link.is-active, - .navbar.is-black .navbar-end > a.navbar-item:focus, - .navbar.is-black .navbar-end > a.navbar-item:hover, - .navbar.is-black .navbar-end > a.navbar-item.is-active, - .navbar.is-black .navbar-end .navbar-link:focus, - .navbar.is-black .navbar-end .navbar-link:hover, - .navbar.is-black .navbar-end .navbar-link.is-active { - background-color: black; - color: white; } - .navbar.is-black .navbar-start .navbar-link::after, - .navbar.is-black .navbar-end .navbar-link::after { - border-color: white; } - .navbar.is-black .navbar-item.has-dropdown:focus .navbar-link, - .navbar.is-black .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link { - background-color: black; - color: white; } - .navbar.is-black .navbar-dropdown a.navbar-item.is-active { - background-color: #0a0a0a; - color: white; } } - .navbar.is-light { - background-color: whitesmoke; - color: #363636; } - .navbar.is-light .navbar-brand > .navbar-item, - .navbar.is-light .navbar-brand .navbar-link { - color: #363636; } - .navbar.is-light .navbar-brand > a.navbar-item:focus, .navbar.is-light .navbar-brand > a.navbar-item:hover, .navbar.is-light .navbar-brand > a.navbar-item.is-active, - .navbar.is-light .navbar-brand .navbar-link:focus, - .navbar.is-light .navbar-brand .navbar-link:hover, - .navbar.is-light .navbar-brand .navbar-link.is-active { - background-color: #e8e8e8; - color: #363636; } - .navbar.is-light .navbar-brand .navbar-link::after { - border-color: #363636; } - .navbar.is-light .navbar-burger { - color: #363636; } - @media screen and (min-width: 1056px) { - .navbar.is-light .navbar-start > .navbar-item, - .navbar.is-light .navbar-start .navbar-link, - .navbar.is-light .navbar-end > .navbar-item, - .navbar.is-light .navbar-end .navbar-link { - color: #363636; } - .navbar.is-light .navbar-start > a.navbar-item:focus, .navbar.is-light .navbar-start > a.navbar-item:hover, .navbar.is-light .navbar-start > a.navbar-item.is-active, - .navbar.is-light .navbar-start .navbar-link:focus, - .navbar.is-light .navbar-start .navbar-link:hover, - .navbar.is-light .navbar-start .navbar-link.is-active, - .navbar.is-light .navbar-end > a.navbar-item:focus, - .navbar.is-light .navbar-end > a.navbar-item:hover, - .navbar.is-light .navbar-end > a.navbar-item.is-active, - .navbar.is-light .navbar-end .navbar-link:focus, - .navbar.is-light .navbar-end .navbar-link:hover, - .navbar.is-light .navbar-end .navbar-link.is-active { - background-color: #e8e8e8; - color: #363636; } - .navbar.is-light .navbar-start .navbar-link::after, - .navbar.is-light .navbar-end .navbar-link::after { - border-color: #363636; } - .navbar.is-light .navbar-item.has-dropdown:focus .navbar-link, - .navbar.is-light .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #e8e8e8; - color: #363636; } - .navbar.is-light .navbar-dropdown a.navbar-item.is-active { - background-color: whitesmoke; - color: #363636; } } - .navbar.is-dark, .content kbd.navbar { - background-color: #363636; - color: whitesmoke; } - .navbar.is-dark .navbar-brand > .navbar-item, .content kbd.navbar .navbar-brand > .navbar-item, - .navbar.is-dark .navbar-brand .navbar-link, - .content kbd.navbar .navbar-brand .navbar-link { - color: whitesmoke; } - .navbar.is-dark .navbar-brand > a.navbar-item:focus, .content kbd.navbar .navbar-brand > a.navbar-item:focus, .navbar.is-dark .navbar-brand > a.navbar-item:hover, .content kbd.navbar .navbar-brand > a.navbar-item:hover, .navbar.is-dark .navbar-brand > a.navbar-item.is-active, .content kbd.navbar .navbar-brand > a.navbar-item.is-active, - .navbar.is-dark .navbar-brand .navbar-link:focus, - .content kbd.navbar .navbar-brand .navbar-link:focus, - .navbar.is-dark .navbar-brand .navbar-link:hover, - .content kbd.navbar .navbar-brand .navbar-link:hover, - .navbar.is-dark .navbar-brand .navbar-link.is-active, - .content kbd.navbar .navbar-brand .navbar-link.is-active { - background-color: #292929; - color: whitesmoke; } - .navbar.is-dark .navbar-brand .navbar-link::after, .content kbd.navbar .navbar-brand .navbar-link::after { - border-color: whitesmoke; } - .navbar.is-dark .navbar-burger, .content kbd.navbar .navbar-burger { - color: whitesmoke; } - @media screen and (min-width: 1056px) { - .navbar.is-dark .navbar-start > .navbar-item, .content kbd.navbar .navbar-start > .navbar-item, - .navbar.is-dark .navbar-start .navbar-link, - .content kbd.navbar .navbar-start .navbar-link, - .navbar.is-dark .navbar-end > .navbar-item, - .content kbd.navbar .navbar-end > .navbar-item, - .navbar.is-dark .navbar-end .navbar-link, - .content kbd.navbar .navbar-end .navbar-link { - color: whitesmoke; } - .navbar.is-dark .navbar-start > a.navbar-item:focus, .content kbd.navbar .navbar-start > a.navbar-item:focus, .navbar.is-dark .navbar-start > a.navbar-item:hover, .content kbd.navbar .navbar-start > a.navbar-item:hover, .navbar.is-dark .navbar-start > a.navbar-item.is-active, .content kbd.navbar .navbar-start > a.navbar-item.is-active, - .navbar.is-dark .navbar-start .navbar-link:focus, - .content kbd.navbar .navbar-start .navbar-link:focus, - .navbar.is-dark .navbar-start .navbar-link:hover, - .content kbd.navbar .navbar-start .navbar-link:hover, - .navbar.is-dark .navbar-start .navbar-link.is-active, - .content kbd.navbar .navbar-start .navbar-link.is-active, - .navbar.is-dark .navbar-end > a.navbar-item:focus, - .content kbd.navbar .navbar-end > a.navbar-item:focus, - .navbar.is-dark .navbar-end > a.navbar-item:hover, - .content kbd.navbar .navbar-end > a.navbar-item:hover, - .navbar.is-dark .navbar-end > a.navbar-item.is-active, - .content kbd.navbar .navbar-end > a.navbar-item.is-active, - .navbar.is-dark .navbar-end .navbar-link:focus, - .content kbd.navbar .navbar-end .navbar-link:focus, - .navbar.is-dark .navbar-end .navbar-link:hover, - .content kbd.navbar .navbar-end .navbar-link:hover, - .navbar.is-dark .navbar-end .navbar-link.is-active, - .content kbd.navbar .navbar-end .navbar-link.is-active { - background-color: #292929; - color: whitesmoke; } - .navbar.is-dark .navbar-start .navbar-link::after, .content kbd.navbar .navbar-start .navbar-link::after, - .navbar.is-dark .navbar-end .navbar-link::after, - .content kbd.navbar .navbar-end .navbar-link::after { - border-color: whitesmoke; } - .navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link, .content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link, - .navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link, - .content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link, - .content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #292929; - color: whitesmoke; } - .navbar.is-dark .navbar-dropdown a.navbar-item.is-active, .content kbd.navbar .navbar-dropdown a.navbar-item.is-active { - background-color: #363636; - color: whitesmoke; } } - .navbar.is-primary, .docstring > section > a.navbar.docs-sourcelink { - background-color: #4eb5de; - color: #fff; } - .navbar.is-primary .navbar-brand > .navbar-item, .docstring > section > a.navbar.docs-sourcelink .navbar-brand > .navbar-item, - .navbar.is-primary .navbar-brand .navbar-link, - .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link { - color: #fff; } - .navbar.is-primary .navbar-brand > a.navbar-item:focus, .docstring > section > a.navbar.docs-sourcelink .navbar-brand > a.navbar-item:focus, .navbar.is-primary .navbar-brand > a.navbar-item:hover, .docstring > section > a.navbar.docs-sourcelink .navbar-brand > a.navbar-item:hover, .navbar.is-primary .navbar-brand > a.navbar-item.is-active, .docstring > section > a.navbar.docs-sourcelink .navbar-brand > a.navbar-item.is-active, - .navbar.is-primary .navbar-brand .navbar-link:focus, - .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus, - .navbar.is-primary .navbar-brand .navbar-link:hover, - .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover, - .navbar.is-primary .navbar-brand .navbar-link.is-active, - .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active { - background-color: #39acda; - color: #fff; } - .navbar.is-primary .navbar-brand .navbar-link::after, .docstring > section > a.navbar.docs-sourcelink .navbar-brand .navbar-link::after { - border-color: #fff; } - .navbar.is-primary .navbar-burger, .docstring > section > a.navbar.docs-sourcelink .navbar-burger { - color: #fff; } - @media screen and (min-width: 1056px) { - .navbar.is-primary .navbar-start > .navbar-item, .docstring > section > a.navbar.docs-sourcelink .navbar-start > .navbar-item, - .navbar.is-primary .navbar-start .navbar-link, - .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link, - .navbar.is-primary .navbar-end > .navbar-item, - .docstring > section > a.navbar.docs-sourcelink .navbar-end > .navbar-item, - .navbar.is-primary .navbar-end .navbar-link, - .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link { - color: #fff; } - .navbar.is-primary .navbar-start > a.navbar-item:focus, .docstring > section > a.navbar.docs-sourcelink .navbar-start > a.navbar-item:focus, .navbar.is-primary .navbar-start > a.navbar-item:hover, .docstring > section > a.navbar.docs-sourcelink .navbar-start > a.navbar-item:hover, .navbar.is-primary .navbar-start > a.navbar-item.is-active, .docstring > section > a.navbar.docs-sourcelink .navbar-start > a.navbar-item.is-active, - .navbar.is-primary .navbar-start .navbar-link:focus, - .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link:focus, - .navbar.is-primary .navbar-start .navbar-link:hover, - .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link:hover, - .navbar.is-primary .navbar-start .navbar-link.is-active, - .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active, - .navbar.is-primary .navbar-end > a.navbar-item:focus, - .docstring > section > a.navbar.docs-sourcelink .navbar-end > a.navbar-item:focus, - .navbar.is-primary .navbar-end > a.navbar-item:hover, - .docstring > section > a.navbar.docs-sourcelink .navbar-end > a.navbar-item:hover, - .navbar.is-primary .navbar-end > a.navbar-item.is-active, - .docstring > section > a.navbar.docs-sourcelink .navbar-end > a.navbar-item.is-active, - .navbar.is-primary .navbar-end .navbar-link:focus, - .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link:focus, - .navbar.is-primary .navbar-end .navbar-link:hover, - .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link:hover, - .navbar.is-primary .navbar-end .navbar-link.is-active, - .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active { - background-color: #39acda; - color: #fff; } - .navbar.is-primary .navbar-start .navbar-link::after, .docstring > section > a.navbar.docs-sourcelink .navbar-start .navbar-link::after, - .navbar.is-primary .navbar-end .navbar-link::after, - .docstring > section > a.navbar.docs-sourcelink .navbar-end .navbar-link::after { - border-color: #fff; } - .navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link, .docstring > section > a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link, - .navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link, - .docstring > section > a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link, - .docstring > section > a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #39acda; - color: #fff; } - .navbar.is-primary .navbar-dropdown a.navbar-item.is-active, .docstring > section > a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active { - background-color: #4eb5de; - color: #fff; } } - .navbar.is-link { - background-color: #2e63b8; - color: #fff; } - .navbar.is-link .navbar-brand > .navbar-item, - .navbar.is-link .navbar-brand .navbar-link { - color: #fff; } - .navbar.is-link .navbar-brand > a.navbar-item:focus, .navbar.is-link .navbar-brand > a.navbar-item:hover, .navbar.is-link .navbar-brand > a.navbar-item.is-active, - .navbar.is-link .navbar-brand .navbar-link:focus, - .navbar.is-link .navbar-brand .navbar-link:hover, - .navbar.is-link .navbar-brand .navbar-link.is-active { - background-color: #2958a4; - color: #fff; } - .navbar.is-link .navbar-brand .navbar-link::after { - border-color: #fff; } - .navbar.is-link .navbar-burger { - color: #fff; } - @media screen and (min-width: 1056px) { - .navbar.is-link .navbar-start > .navbar-item, - .navbar.is-link .navbar-start .navbar-link, - .navbar.is-link .navbar-end > .navbar-item, - .navbar.is-link .navbar-end .navbar-link { - color: #fff; } - .navbar.is-link .navbar-start > a.navbar-item:focus, .navbar.is-link .navbar-start > a.navbar-item:hover, .navbar.is-link .navbar-start > a.navbar-item.is-active, - .navbar.is-link .navbar-start .navbar-link:focus, - .navbar.is-link .navbar-start .navbar-link:hover, - .navbar.is-link .navbar-start .navbar-link.is-active, - .navbar.is-link .navbar-end > a.navbar-item:focus, - .navbar.is-link .navbar-end > a.navbar-item:hover, - .navbar.is-link .navbar-end > a.navbar-item.is-active, - .navbar.is-link .navbar-end .navbar-link:focus, - .navbar.is-link .navbar-end .navbar-link:hover, - .navbar.is-link .navbar-end .navbar-link.is-active { - background-color: #2958a4; - color: #fff; } - .navbar.is-link .navbar-start .navbar-link::after, - .navbar.is-link .navbar-end .navbar-link::after { - border-color: #fff; } - .navbar.is-link .navbar-item.has-dropdown:focus .navbar-link, - .navbar.is-link .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #2958a4; - color: #fff; } - .navbar.is-link .navbar-dropdown a.navbar-item.is-active { - background-color: #2e63b8; - color: #fff; } } - .navbar.is-info { - background-color: #209cee; - color: #fff; } - .navbar.is-info .navbar-brand > .navbar-item, - .navbar.is-info .navbar-brand .navbar-link { - color: #fff; } - .navbar.is-info .navbar-brand > a.navbar-item:focus, .navbar.is-info .navbar-brand > a.navbar-item:hover, .navbar.is-info .navbar-brand > a.navbar-item.is-active, - .navbar.is-info .navbar-brand .navbar-link:focus, - .navbar.is-info .navbar-brand .navbar-link:hover, - .navbar.is-info .navbar-brand .navbar-link.is-active { - background-color: #1190e3; - color: #fff; } - .navbar.is-info .navbar-brand .navbar-link::after { - border-color: #fff; } - .navbar.is-info .navbar-burger { - color: #fff; } - @media screen and (min-width: 1056px) { - .navbar.is-info .navbar-start > .navbar-item, - .navbar.is-info .navbar-start .navbar-link, - .navbar.is-info .navbar-end > .navbar-item, - .navbar.is-info .navbar-end .navbar-link { - color: #fff; } - .navbar.is-info .navbar-start > a.navbar-item:focus, .navbar.is-info .navbar-start > a.navbar-item:hover, .navbar.is-info .navbar-start > a.navbar-item.is-active, - .navbar.is-info .navbar-start .navbar-link:focus, - .navbar.is-info .navbar-start .navbar-link:hover, - .navbar.is-info .navbar-start .navbar-link.is-active, - .navbar.is-info .navbar-end > a.navbar-item:focus, - .navbar.is-info .navbar-end > a.navbar-item:hover, - .navbar.is-info .navbar-end > a.navbar-item.is-active, - .navbar.is-info .navbar-end .navbar-link:focus, - .navbar.is-info .navbar-end .navbar-link:hover, - .navbar.is-info .navbar-end .navbar-link.is-active { - background-color: #1190e3; - color: #fff; } - .navbar.is-info .navbar-start .navbar-link::after, - .navbar.is-info .navbar-end .navbar-link::after { - border-color: #fff; } - .navbar.is-info .navbar-item.has-dropdown:focus .navbar-link, - .navbar.is-info .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #1190e3; - color: #fff; } - .navbar.is-info .navbar-dropdown a.navbar-item.is-active { - background-color: #209cee; - color: #fff; } } - .navbar.is-success { - background-color: #22c35b; - color: #fff; } - .navbar.is-success .navbar-brand > .navbar-item, - .navbar.is-success .navbar-brand .navbar-link { - color: #fff; } - .navbar.is-success .navbar-brand > a.navbar-item:focus, .navbar.is-success .navbar-brand > a.navbar-item:hover, .navbar.is-success .navbar-brand > a.navbar-item.is-active, - .navbar.is-success .navbar-brand .navbar-link:focus, - .navbar.is-success .navbar-brand .navbar-link:hover, - .navbar.is-success .navbar-brand .navbar-link.is-active { - background-color: #1ead51; - color: #fff; } - .navbar.is-success .navbar-brand .navbar-link::after { - border-color: #fff; } - .navbar.is-success .navbar-burger { - color: #fff; } - @media screen and (min-width: 1056px) { - .navbar.is-success .navbar-start > .navbar-item, - .navbar.is-success .navbar-start .navbar-link, - .navbar.is-success .navbar-end > .navbar-item, - .navbar.is-success .navbar-end .navbar-link { - color: #fff; } - .navbar.is-success .navbar-start > a.navbar-item:focus, .navbar.is-success .navbar-start > a.navbar-item:hover, .navbar.is-success .navbar-start > a.navbar-item.is-active, - .navbar.is-success .navbar-start .navbar-link:focus, - .navbar.is-success .navbar-start .navbar-link:hover, - .navbar.is-success .navbar-start .navbar-link.is-active, - .navbar.is-success .navbar-end > a.navbar-item:focus, - .navbar.is-success .navbar-end > a.navbar-item:hover, - .navbar.is-success .navbar-end > a.navbar-item.is-active, - .navbar.is-success .navbar-end .navbar-link:focus, - .navbar.is-success .navbar-end .navbar-link:hover, - .navbar.is-success .navbar-end .navbar-link.is-active { - background-color: #1ead51; - color: #fff; } - .navbar.is-success .navbar-start .navbar-link::after, - .navbar.is-success .navbar-end .navbar-link::after { - border-color: #fff; } - .navbar.is-success .navbar-item.has-dropdown:focus .navbar-link, - .navbar.is-success .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #1ead51; - color: #fff; } - .navbar.is-success .navbar-dropdown a.navbar-item.is-active { - background-color: #22c35b; - color: #fff; } } - .navbar.is-warning { - background-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); } - .navbar.is-warning .navbar-brand > .navbar-item, - .navbar.is-warning .navbar-brand .navbar-link { - color: rgba(0, 0, 0, 0.7); } - .navbar.is-warning .navbar-brand > a.navbar-item:focus, .navbar.is-warning .navbar-brand > a.navbar-item:hover, .navbar.is-warning .navbar-brand > a.navbar-item.is-active, - .navbar.is-warning .navbar-brand .navbar-link:focus, - .navbar.is-warning .navbar-brand .navbar-link:hover, - .navbar.is-warning .navbar-brand .navbar-link.is-active { - background-color: #ffd83e; - color: rgba(0, 0, 0, 0.7); } - .navbar.is-warning .navbar-brand .navbar-link::after { - border-color: rgba(0, 0, 0, 0.7); } - .navbar.is-warning .navbar-burger { - color: rgba(0, 0, 0, 0.7); } - @media screen and (min-width: 1056px) { - .navbar.is-warning .navbar-start > .navbar-item, - .navbar.is-warning .navbar-start .navbar-link, - .navbar.is-warning .navbar-end > .navbar-item, - .navbar.is-warning .navbar-end .navbar-link { - color: rgba(0, 0, 0, 0.7); } - .navbar.is-warning .navbar-start > a.navbar-item:focus, .navbar.is-warning .navbar-start > a.navbar-item:hover, .navbar.is-warning .navbar-start > a.navbar-item.is-active, - .navbar.is-warning .navbar-start .navbar-link:focus, - .navbar.is-warning .navbar-start .navbar-link:hover, - .navbar.is-warning .navbar-start .navbar-link.is-active, - .navbar.is-warning .navbar-end > a.navbar-item:focus, - .navbar.is-warning .navbar-end > a.navbar-item:hover, - .navbar.is-warning .navbar-end > a.navbar-item.is-active, - .navbar.is-warning .navbar-end .navbar-link:focus, - .navbar.is-warning .navbar-end .navbar-link:hover, - .navbar.is-warning .navbar-end .navbar-link.is-active { - background-color: #ffd83e; - color: rgba(0, 0, 0, 0.7); } - .navbar.is-warning .navbar-start .navbar-link::after, - .navbar.is-warning .navbar-end .navbar-link::after { - border-color: rgba(0, 0, 0, 0.7); } - .navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link, - .navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #ffd83e; - color: rgba(0, 0, 0, 0.7); } - .navbar.is-warning .navbar-dropdown a.navbar-item.is-active { - background-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); } } - .navbar.is-danger { - background-color: #da0b00; - color: #fff; } - .navbar.is-danger .navbar-brand > .navbar-item, - .navbar.is-danger .navbar-brand .navbar-link { - color: #fff; } - .navbar.is-danger .navbar-brand > a.navbar-item:focus, .navbar.is-danger .navbar-brand > a.navbar-item:hover, .navbar.is-danger .navbar-brand > a.navbar-item.is-active, - .navbar.is-danger .navbar-brand .navbar-link:focus, - .navbar.is-danger .navbar-brand .navbar-link:hover, - .navbar.is-danger .navbar-brand .navbar-link.is-active { - background-color: #c10a00; - color: #fff; } - .navbar.is-danger .navbar-brand .navbar-link::after { - border-color: #fff; } - .navbar.is-danger .navbar-burger { - color: #fff; } - @media screen and (min-width: 1056px) { - .navbar.is-danger .navbar-start > .navbar-item, - .navbar.is-danger .navbar-start .navbar-link, - .navbar.is-danger .navbar-end > .navbar-item, - .navbar.is-danger .navbar-end .navbar-link { - color: #fff; } - .navbar.is-danger .navbar-start > a.navbar-item:focus, .navbar.is-danger .navbar-start > a.navbar-item:hover, .navbar.is-danger .navbar-start > a.navbar-item.is-active, - .navbar.is-danger .navbar-start .navbar-link:focus, - .navbar.is-danger .navbar-start .navbar-link:hover, - .navbar.is-danger .navbar-start .navbar-link.is-active, - .navbar.is-danger .navbar-end > a.navbar-item:focus, - .navbar.is-danger .navbar-end > a.navbar-item:hover, - .navbar.is-danger .navbar-end > a.navbar-item.is-active, - .navbar.is-danger .navbar-end .navbar-link:focus, - .navbar.is-danger .navbar-end .navbar-link:hover, - .navbar.is-danger .navbar-end .navbar-link.is-active { - background-color: #c10a00; - color: #fff; } - .navbar.is-danger .navbar-start .navbar-link::after, - .navbar.is-danger .navbar-end .navbar-link::after { - border-color: #fff; } - .navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link, - .navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link, - .navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #c10a00; - color: #fff; } - .navbar.is-danger .navbar-dropdown a.navbar-item.is-active { - background-color: #da0b00; - color: #fff; } } - .navbar > .container { - align-items: stretch; - display: flex; - min-height: 3.25rem; - width: 100%; } - .navbar.has-shadow { - box-shadow: 0 2px 0 0 whitesmoke; } - .navbar.is-fixed-bottom, .navbar.is-fixed-top { - left: 0; - position: fixed; - right: 0; - z-index: 30; } - .navbar.is-fixed-bottom { - bottom: 0; } - .navbar.is-fixed-bottom.has-shadow { - box-shadow: 0 -2px 0 0 whitesmoke; } - .navbar.is-fixed-top { - top: 0; } - -html.has-navbar-fixed-top, -body.has-navbar-fixed-top { - padding-top: 3.25rem; } - -html.has-navbar-fixed-bottom, -body.has-navbar-fixed-bottom { - padding-bottom: 3.25rem; } - -.navbar-brand, -.navbar-tabs { - align-items: stretch; - display: flex; - flex-shrink: 0; - min-height: 3.25rem; } - -.navbar-brand a.navbar-item:focus, .navbar-brand a.navbar-item:hover { - background-color: transparent; } - -.navbar-tabs { - -webkit-overflow-scrolling: touch; - max-width: 100vw; - overflow-x: auto; - overflow-y: hidden; } - -.navbar-burger { - color: #4a4a4a; - cursor: pointer; - display: block; - height: 3.25rem; - position: relative; - width: 3.25rem; - margin-left: auto; } - .navbar-burger span { - background-color: currentColor; - display: block; - height: 1px; - left: calc(50% - 8px); - position: absolute; - transform-origin: center; - transition-duration: 86ms; - transition-property: background-color, opacity, transform; - transition-timing-function: ease-out; - width: 16px; } - .navbar-burger span:nth-child(1) { - top: calc(50% - 6px); } - .navbar-burger span:nth-child(2) { - top: calc(50% - 1px); } - .navbar-burger span:nth-child(3) { - top: calc(50% + 4px); } - .navbar-burger:hover { - background-color: rgba(0, 0, 0, 0.05); } - .navbar-burger.is-active span:nth-child(1) { - transform: translateY(5px) rotate(45deg); } - .navbar-burger.is-active span:nth-child(2) { - opacity: 0; } - .navbar-burger.is-active span:nth-child(3) { - transform: translateY(-5px) rotate(-45deg); } - -.navbar-menu { - display: none; } - -.navbar-item, -.navbar-link { - color: #4a4a4a; - display: block; - line-height: 1.5; - padding: 0.5rem 0.75rem; - position: relative; } - .navbar-item .icon:only-child, - .navbar-link .icon:only-child { - margin-left: -0.25rem; - margin-right: -0.25rem; } - -a.navbar-item, -.navbar-link { - cursor: pointer; } - a.navbar-item:focus, a.navbar-item:focus-within, a.navbar-item:hover, a.navbar-item.is-active, - .navbar-link:focus, - .navbar-link:focus-within, - .navbar-link:hover, - .navbar-link.is-active { - background-color: #fafafa; - color: #2e63b8; } - -.navbar-item { - display: block; - flex-grow: 0; - flex-shrink: 0; } - .navbar-item img { - max-height: 1.75rem; } - .navbar-item.has-dropdown { - padding: 0; } - .navbar-item.is-expanded { - flex-grow: 1; - flex-shrink: 1; } - .navbar-item.is-tab { - border-bottom: 1px solid transparent; - min-height: 3.25rem; - padding-bottom: calc(0.5rem - 1px); } - .navbar-item.is-tab:focus, .navbar-item.is-tab:hover { - background-color: transparent; - border-bottom-color: #2e63b8; } - .navbar-item.is-tab.is-active { - background-color: transparent; - border-bottom-color: #2e63b8; - border-bottom-style: solid; - border-bottom-width: 3px; - color: #2e63b8; - padding-bottom: calc(0.5rem - 3px); } - -.navbar-content { - flex-grow: 1; - flex-shrink: 1; } - -.navbar-link:not(.is-arrowless) { - padding-right: 2.5em; } - .navbar-link:not(.is-arrowless)::after { - border-color: #2e63b8; - margin-top: -0.375em; - right: 1.125em; } - -.navbar-dropdown { - font-size: 0.875rem; - padding-bottom: 0.5rem; - padding-top: 0.5rem; } - .navbar-dropdown .navbar-item { - padding-left: 1.5rem; - padding-right: 1.5rem; } - -.navbar-divider { - background-color: whitesmoke; - border: none; - display: none; - height: 2px; - margin: 0.5rem 0; } - -@media screen and (max-width: 1055px) { - .navbar > .container { - display: block; } - .navbar-brand .navbar-item, - .navbar-tabs .navbar-item { - align-items: center; - display: flex; } - .navbar-link::after { - display: none; } - .navbar-menu { - background-color: white; - box-shadow: 0 8px 16px rgba(10, 10, 10, 0.1); - padding: 0.5rem 0; } - .navbar-menu.is-active { - display: block; } - .navbar.is-fixed-bottom-touch, .navbar.is-fixed-top-touch { - left: 0; - position: fixed; - right: 0; - z-index: 30; } - .navbar.is-fixed-bottom-touch { - bottom: 0; } - .navbar.is-fixed-bottom-touch.has-shadow { - box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); } - .navbar.is-fixed-top-touch { - top: 0; } - .navbar.is-fixed-top .navbar-menu, .navbar.is-fixed-top-touch .navbar-menu { - -webkit-overflow-scrolling: touch; - max-height: calc(100vh - 3.25rem); - overflow: auto; } - html.has-navbar-fixed-top-touch, - body.has-navbar-fixed-top-touch { - padding-top: 3.25rem; } - html.has-navbar-fixed-bottom-touch, - body.has-navbar-fixed-bottom-touch { - padding-bottom: 3.25rem; } } - -@media screen and (min-width: 1056px) { - .navbar, - .navbar-menu, - .navbar-start, - .navbar-end { - align-items: stretch; - display: flex; } - .navbar { - min-height: 3.25rem; } - .navbar.is-spaced { - padding: 1rem 2rem; } - .navbar.is-spaced .navbar-start, - .navbar.is-spaced .navbar-end { - align-items: center; } - .navbar.is-spaced a.navbar-item, - .navbar.is-spaced .navbar-link { - border-radius: 4px; } - .navbar.is-transparent a.navbar-item:focus, .navbar.is-transparent a.navbar-item:hover, .navbar.is-transparent a.navbar-item.is-active, - .navbar.is-transparent .navbar-link:focus, - .navbar.is-transparent .navbar-link:hover, - .navbar.is-transparent .navbar-link.is-active { - background-color: transparent !important; } - .navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link, .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link, .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link, .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link { - background-color: transparent !important; } - .navbar.is-transparent .navbar-dropdown a.navbar-item:focus, .navbar.is-transparent .navbar-dropdown a.navbar-item:hover { - background-color: whitesmoke; - color: #0a0a0a; } - .navbar.is-transparent .navbar-dropdown a.navbar-item.is-active { - background-color: whitesmoke; - color: #2e63b8; } - .navbar-burger { - display: none; } - .navbar-item, - .navbar-link { - align-items: center; - display: flex; } - .navbar-item { - display: flex; } - .navbar-item.has-dropdown { - align-items: stretch; } - .navbar-item.has-dropdown-up .navbar-link::after { - transform: rotate(135deg) translate(0.25em, -0.25em); } - .navbar-item.has-dropdown-up .navbar-dropdown { - border-bottom: 2px solid #dbdbdb; - border-radius: 6px 6px 0 0; - border-top: none; - bottom: 100%; - box-shadow: 0 -8px 8px rgba(10, 10, 10, 0.1); - top: auto; } - .navbar-item.is-active .navbar-dropdown, .navbar-item.is-hoverable:focus .navbar-dropdown, .navbar-item.is-hoverable:focus-within .navbar-dropdown, .navbar-item.is-hoverable:hover .navbar-dropdown { - display: block; } - .navbar.is-spaced .navbar-item.is-active .navbar-dropdown, .navbar-item.is-active .navbar-dropdown.is-boxed, .navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown, .navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed, .navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown, .navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed, .navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown, .navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed { - opacity: 1; - pointer-events: auto; - transform: translateY(0); } - .navbar-menu { - flex-grow: 1; - flex-shrink: 0; } - .navbar-start { - justify-content: flex-start; - margin-right: auto; } - .navbar-end { - justify-content: flex-end; - margin-left: auto; } - .navbar-dropdown { - background-color: white; - border-bottom-left-radius: 6px; - border-bottom-right-radius: 6px; - border-top: 2px solid #dbdbdb; - box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1); - display: none; - font-size: 0.875rem; - left: 0; - min-width: 100%; - position: absolute; - top: 100%; - z-index: 20; } - .navbar-dropdown .navbar-item { - padding: 0.375rem 1rem; - white-space: nowrap; } - .navbar-dropdown a.navbar-item { - padding-right: 3rem; } - .navbar-dropdown a.navbar-item:focus, .navbar-dropdown a.navbar-item:hover { - background-color: whitesmoke; - color: #0a0a0a; } - .navbar-dropdown a.navbar-item.is-active { - background-color: whitesmoke; - color: #2e63b8; } - .navbar.is-spaced .navbar-dropdown, .navbar-dropdown.is-boxed { - border-radius: 6px; - border-top: none; - box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); - display: block; - opacity: 0; - pointer-events: none; - top: calc(100% + (-4px)); - transform: translateY(-5px); - transition-duration: 86ms; - transition-property: opacity, transform; } - .navbar-dropdown.is-right { - left: auto; - right: 0; } - .navbar-divider { - display: block; } - .navbar > .container .navbar-brand, - .container > .navbar .navbar-brand { - margin-left: -.75rem; } - .navbar > .container .navbar-menu, - .container > .navbar .navbar-menu { - margin-right: -.75rem; } - .navbar.is-fixed-bottom-desktop, .navbar.is-fixed-top-desktop { - left: 0; - position: fixed; - right: 0; - z-index: 30; } - .navbar.is-fixed-bottom-desktop { - bottom: 0; } - .navbar.is-fixed-bottom-desktop.has-shadow { - box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); } - .navbar.is-fixed-top-desktop { - top: 0; } - html.has-navbar-fixed-top-desktop, - body.has-navbar-fixed-top-desktop { - padding-top: 3.25rem; } - html.has-navbar-fixed-bottom-desktop, - body.has-navbar-fixed-bottom-desktop { - padding-bottom: 3.25rem; } - html.has-spaced-navbar-fixed-top, - body.has-spaced-navbar-fixed-top { - padding-top: 5.25rem; } - html.has-spaced-navbar-fixed-bottom, - body.has-spaced-navbar-fixed-bottom { - padding-bottom: 5.25rem; } - a.navbar-item.is-active, - .navbar-link.is-active { - color: #0a0a0a; } - a.navbar-item.is-active:not(:focus):not(:hover), - .navbar-link.is-active:not(:focus):not(:hover) { - background-color: transparent; } - .navbar-item.has-dropdown:focus .navbar-link, .navbar-item.has-dropdown:hover .navbar-link, .navbar-item.has-dropdown.is-active .navbar-link { - background-color: #fafafa; } } - -.hero.is-fullheight-with-navbar { - min-height: calc(100vh - 3.25rem); } - -.pagination { - font-size: 1rem; - margin: -0.25rem; } - .pagination.is-small, #documenter .docs-sidebar form.docs-search > input.pagination { - font-size: 0.75rem; } - .pagination.is-medium { - font-size: 1.25rem; } - .pagination.is-large { - font-size: 1.5rem; } - .pagination.is-rounded .pagination-previous, #documenter .docs-sidebar form.docs-search > input.pagination .pagination-previous, - .pagination.is-rounded .pagination-next, - #documenter .docs-sidebar form.docs-search > input.pagination .pagination-next { - padding-left: 1em; - padding-right: 1em; - border-radius: 290486px; } - .pagination.is-rounded .pagination-link, #documenter .docs-sidebar form.docs-search > input.pagination .pagination-link { - border-radius: 290486px; } - -.pagination, -.pagination-list { - align-items: center; - display: flex; - justify-content: center; - text-align: center; } - -.pagination-previous, -.pagination-next, -.pagination-link, -.pagination-ellipsis { - font-size: 1em; - justify-content: center; - margin: 0.25rem; - padding-left: 0.5em; - padding-right: 0.5em; - text-align: center; } - -.pagination-previous, -.pagination-next, -.pagination-link { - border-color: #dbdbdb; - color: #363636; - min-width: 2.25em; } - .pagination-previous:hover, - .pagination-next:hover, - .pagination-link:hover { - border-color: #b5b5b5; - color: #363636; } - .pagination-previous:focus, - .pagination-next:focus, - .pagination-link:focus { - border-color: #3c5dcd; } - .pagination-previous:active, - .pagination-next:active, - .pagination-link:active { - box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); } - .pagination-previous[disabled], - .pagination-next[disabled], - .pagination-link[disabled] { - background-color: #dbdbdb; - border-color: #dbdbdb; - box-shadow: none; - color: #6b6b6b; - opacity: 0.5; } - -.pagination-previous, -.pagination-next { - padding-left: 0.75em; - padding-right: 0.75em; - white-space: nowrap; } - -.pagination-link.is-current { - background-color: #2e63b8; - border-color: #2e63b8; - color: #fff; } - -.pagination-ellipsis { - color: #b5b5b5; - pointer-events: none; } - -.pagination-list { - flex-wrap: wrap; } - -@media screen and (max-width: 768px) { - .pagination { - flex-wrap: wrap; } - .pagination-previous, - .pagination-next { - flex-grow: 1; - flex-shrink: 1; } - .pagination-list li { - flex-grow: 1; - flex-shrink: 1; } } - -@media screen and (min-width: 769px), print { - .pagination-list { - flex-grow: 1; - flex-shrink: 1; - justify-content: flex-start; - order: 1; } - .pagination-previous { - order: 2; } - .pagination-next { - order: 3; } - .pagination { - justify-content: space-between; } - .pagination.is-centered .pagination-previous { - order: 1; } - .pagination.is-centered .pagination-list { - justify-content: center; - order: 2; } - .pagination.is-centered .pagination-next { - order: 3; } - .pagination.is-right .pagination-previous { - order: 1; } - .pagination.is-right .pagination-next { - order: 2; } - .pagination.is-right .pagination-list { - justify-content: flex-end; - order: 3; } } - -.panel { - font-size: 1rem; } - .panel:not(:last-child) { - margin-bottom: 1.5rem; } - -.panel-heading, -.panel-tabs, -.panel-block { - border-bottom: 1px solid #dbdbdb; - border-left: 1px solid #dbdbdb; - border-right: 1px solid #dbdbdb; } - .panel-heading:first-child, - .panel-tabs:first-child, - .panel-block:first-child { - border-top: 1px solid #dbdbdb; } - -.panel-heading { - background-color: whitesmoke; - border-radius: 4px 4px 0 0; - color: #222222; - font-size: 1.25em; - font-weight: 300; - line-height: 1.25; - padding: 0.5em 0.75em; } - -.panel-tabs { - align-items: flex-end; - display: flex; - font-size: 0.875em; - justify-content: center; } - .panel-tabs a { - border-bottom: 1px solid #dbdbdb; - margin-bottom: -1px; - padding: 0.5em; } - .panel-tabs a.is-active { - border-bottom-color: #4a4a4a; - color: #363636; } - -.panel-list a { - color: #222222; } - .panel-list a:hover { - color: #2e63b8; } - -.panel-block { - align-items: center; - color: #222222; - display: flex; - justify-content: flex-start; - padding: 0.5em 0.75em; } - .panel-block input[type="checkbox"] { - margin-right: 0.75em; } - .panel-block > .control { - flex-grow: 1; - flex-shrink: 1; - width: 100%; } - .panel-block.is-wrapped { - flex-wrap: wrap; } - .panel-block.is-active { - border-left-color: #2e63b8; - color: #363636; } - .panel-block.is-active .panel-icon { - color: #2e63b8; } - -a.panel-block, -label.panel-block { - cursor: pointer; } - a.panel-block:hover, - label.panel-block:hover { - background-color: whitesmoke; } - -.panel-icon { - display: inline-block; - font-size: 14px; - height: 1em; - line-height: 1em; - text-align: center; - vertical-align: top; - width: 1em; - color: #6b6b6b; - margin-right: 0.75em; } - .panel-icon .fa { - font-size: inherit; - line-height: inherit; } - -.tabs { - -webkit-overflow-scrolling: touch; - align-items: stretch; - display: flex; - font-size: 1rem; - justify-content: space-between; - overflow: hidden; - overflow-x: auto; - white-space: nowrap; } - .tabs a { - align-items: center; - border-bottom-color: #dbdbdb; - border-bottom-style: solid; - border-bottom-width: 1px; - color: #222222; - display: flex; - justify-content: center; - margin-bottom: -1px; - padding: 0.5em 1em; - vertical-align: top; } - .tabs a:hover { - border-bottom-color: #222222; - color: #222222; } - .tabs li { - display: block; } - .tabs li.is-active a { - border-bottom-color: #2e63b8; - color: #2e63b8; } - .tabs ul { - align-items: center; - border-bottom-color: #dbdbdb; - border-bottom-style: solid; - border-bottom-width: 1px; - display: flex; - flex-grow: 1; - flex-shrink: 0; - justify-content: flex-start; } - .tabs ul.is-left { - padding-right: 0.75em; } - .tabs ul.is-center { - flex: none; - justify-content: center; - padding-left: 0.75em; - padding-right: 0.75em; } - .tabs ul.is-right { - justify-content: flex-end; - padding-left: 0.75em; } - .tabs .icon:first-child { - margin-right: 0.5em; } - .tabs .icon:last-child { - margin-left: 0.5em; } - .tabs.is-centered ul { - justify-content: center; } - .tabs.is-right ul { - justify-content: flex-end; } - .tabs.is-boxed a { - border: 1px solid transparent; - border-radius: 4px 4px 0 0; } - .tabs.is-boxed a:hover { - background-color: whitesmoke; - border-bottom-color: #dbdbdb; } - .tabs.is-boxed li.is-active a { - background-color: white; - border-color: #dbdbdb; - border-bottom-color: transparent !important; } - .tabs.is-fullwidth li { - flex-grow: 1; - flex-shrink: 0; } - .tabs.is-toggle a { - border-color: #dbdbdb; - border-style: solid; - border-width: 1px; - margin-bottom: 0; - position: relative; } - .tabs.is-toggle a:hover { - background-color: whitesmoke; - border-color: #b5b5b5; - z-index: 2; } - .tabs.is-toggle li + li { - margin-left: -1px; } - .tabs.is-toggle li:first-child a { - border-radius: 4px 0 0 4px; } - .tabs.is-toggle li:last-child a { - border-radius: 0 4px 4px 0; } - .tabs.is-toggle li.is-active a { - background-color: #2e63b8; - border-color: #2e63b8; - color: #fff; - z-index: 1; } - .tabs.is-toggle ul { - border-bottom: none; } - .tabs.is-toggle.is-toggle-rounded li:first-child a { - border-bottom-left-radius: 290486px; - border-top-left-radius: 290486px; - padding-left: 1.25em; } - .tabs.is-toggle.is-toggle-rounded li:last-child a { - border-bottom-right-radius: 290486px; - border-top-right-radius: 290486px; - padding-right: 1.25em; } - .tabs.is-small, #documenter .docs-sidebar form.docs-search > input.tabs { - font-size: 0.75rem; } - .tabs.is-medium { - font-size: 1.25rem; } - .tabs.is-large { - font-size: 1.5rem; } - -.column { - display: block; - flex-basis: 0; - flex-grow: 1; - flex-shrink: 1; - padding: 0.75rem; } - .columns.is-mobile > .column.is-narrow { - flex: none; } - .columns.is-mobile > .column.is-full { - flex: none; - width: 100%; } - .columns.is-mobile > .column.is-three-quarters { - flex: none; - width: 75%; } - .columns.is-mobile > .column.is-two-thirds { - flex: none; - width: 66.6666%; } - .columns.is-mobile > .column.is-half { - flex: none; - width: 50%; } - .columns.is-mobile > .column.is-one-third { - flex: none; - width: 33.3333%; } - .columns.is-mobile > .column.is-one-quarter { - flex: none; - width: 25%; } - .columns.is-mobile > .column.is-one-fifth { - flex: none; - width: 20%; } - .columns.is-mobile > .column.is-two-fifths { - flex: none; - width: 40%; } - .columns.is-mobile > .column.is-three-fifths { - flex: none; - width: 60%; } - .columns.is-mobile > .column.is-four-fifths { - flex: none; - width: 80%; } - .columns.is-mobile > .column.is-offset-three-quarters { - margin-left: 75%; } - .columns.is-mobile > .column.is-offset-two-thirds { - margin-left: 66.6666%; } - .columns.is-mobile > .column.is-offset-half { - margin-left: 50%; } - .columns.is-mobile > .column.is-offset-one-third { - margin-left: 33.3333%; } - .columns.is-mobile > .column.is-offset-one-quarter { - margin-left: 25%; } - .columns.is-mobile > .column.is-offset-one-fifth { - margin-left: 20%; } - .columns.is-mobile > .column.is-offset-two-fifths { - margin-left: 40%; } - .columns.is-mobile > .column.is-offset-three-fifths { - margin-left: 60%; } - .columns.is-mobile > .column.is-offset-four-fifths { - margin-left: 80%; } - .columns.is-mobile > .column.is-0 { - flex: none; - width: 0%; } - .columns.is-mobile > .column.is-offset-0 { - margin-left: 0%; } - .columns.is-mobile > .column.is-1 { - flex: none; - width: 8.3333333333%; } - .columns.is-mobile > .column.is-offset-1 { - margin-left: 8.3333333333%; } - .columns.is-mobile > .column.is-2 { - flex: none; - width: 16.6666666667%; } - .columns.is-mobile > .column.is-offset-2 { - margin-left: 16.6666666667%; } - .columns.is-mobile > .column.is-3 { - flex: none; - width: 25%; } - .columns.is-mobile > .column.is-offset-3 { - margin-left: 25%; } - .columns.is-mobile > .column.is-4 { - flex: none; - width: 33.3333333333%; } - .columns.is-mobile > .column.is-offset-4 { - margin-left: 33.3333333333%; } - .columns.is-mobile > .column.is-5 { - flex: none; - width: 41.6666666667%; } - .columns.is-mobile > .column.is-offset-5 { - margin-left: 41.6666666667%; } - .columns.is-mobile > .column.is-6 { - flex: none; - width: 50%; } - .columns.is-mobile > .column.is-offset-6 { - margin-left: 50%; } - .columns.is-mobile > .column.is-7 { - flex: none; - width: 58.3333333333%; } - .columns.is-mobile > .column.is-offset-7 { - margin-left: 58.3333333333%; } - .columns.is-mobile > .column.is-8 { - flex: none; - width: 66.6666666667%; } - .columns.is-mobile > .column.is-offset-8 { - margin-left: 66.6666666667%; } - .columns.is-mobile > .column.is-9 { - flex: none; - width: 75%; } - .columns.is-mobile > .column.is-offset-9 { - margin-left: 75%; } - .columns.is-mobile > .column.is-10 { - flex: none; - width: 83.3333333333%; } - .columns.is-mobile > .column.is-offset-10 { - margin-left: 83.3333333333%; } - .columns.is-mobile > .column.is-11 { - flex: none; - width: 91.6666666667%; } - .columns.is-mobile > .column.is-offset-11 { - margin-left: 91.6666666667%; } - .columns.is-mobile > .column.is-12 { - flex: none; - width: 100%; } - .columns.is-mobile > .column.is-offset-12 { - margin-left: 100%; } - @media screen and (max-width: 768px) { - .column.is-narrow-mobile { - flex: none; } - .column.is-full-mobile { - flex: none; - width: 100%; } - .column.is-three-quarters-mobile { - flex: none; - width: 75%; } - .column.is-two-thirds-mobile { - flex: none; - width: 66.6666%; } - .column.is-half-mobile { - flex: none; - width: 50%; } - .column.is-one-third-mobile { - flex: none; - width: 33.3333%; } - .column.is-one-quarter-mobile { - flex: none; - width: 25%; } - .column.is-one-fifth-mobile { - flex: none; - width: 20%; } - .column.is-two-fifths-mobile { - flex: none; - width: 40%; } - .column.is-three-fifths-mobile { - flex: none; - width: 60%; } - .column.is-four-fifths-mobile { - flex: none; - width: 80%; } - .column.is-offset-three-quarters-mobile { - margin-left: 75%; } - .column.is-offset-two-thirds-mobile { - margin-left: 66.6666%; } - .column.is-offset-half-mobile { - margin-left: 50%; } - .column.is-offset-one-third-mobile { - margin-left: 33.3333%; } - .column.is-offset-one-quarter-mobile { - margin-left: 25%; } - .column.is-offset-one-fifth-mobile { - margin-left: 20%; } - .column.is-offset-two-fifths-mobile { - margin-left: 40%; } - .column.is-offset-three-fifths-mobile { - margin-left: 60%; } - .column.is-offset-four-fifths-mobile { - margin-left: 80%; } - .column.is-0-mobile { - flex: none; - width: 0%; } - .column.is-offset-0-mobile { - margin-left: 0%; } - .column.is-1-mobile { - flex: none; - width: 8.3333333333%; } - .column.is-offset-1-mobile { - margin-left: 8.3333333333%; } - .column.is-2-mobile { - flex: none; - width: 16.6666666667%; } - .column.is-offset-2-mobile { - margin-left: 16.6666666667%; } - .column.is-3-mobile { - flex: none; - width: 25%; } - .column.is-offset-3-mobile { - margin-left: 25%; } - .column.is-4-mobile { - flex: none; - width: 33.3333333333%; } - .column.is-offset-4-mobile { - margin-left: 33.3333333333%; } - .column.is-5-mobile { - flex: none; - width: 41.6666666667%; } - .column.is-offset-5-mobile { - margin-left: 41.6666666667%; } - .column.is-6-mobile { - flex: none; - width: 50%; } - .column.is-offset-6-mobile { - margin-left: 50%; } - .column.is-7-mobile { - flex: none; - width: 58.3333333333%; } - .column.is-offset-7-mobile { - margin-left: 58.3333333333%; } - .column.is-8-mobile { - flex: none; - width: 66.6666666667%; } - .column.is-offset-8-mobile { - margin-left: 66.6666666667%; } - .column.is-9-mobile { - flex: none; - width: 75%; } - .column.is-offset-9-mobile { - margin-left: 75%; } - .column.is-10-mobile { - flex: none; - width: 83.3333333333%; } - .column.is-offset-10-mobile { - margin-left: 83.3333333333%; } - .column.is-11-mobile { - flex: none; - width: 91.6666666667%; } - .column.is-offset-11-mobile { - margin-left: 91.6666666667%; } - .column.is-12-mobile { - flex: none; - width: 100%; } - .column.is-offset-12-mobile { - margin-left: 100%; } } - @media screen and (min-width: 769px), print { - .column.is-narrow, .column.is-narrow-tablet { - flex: none; } - .column.is-full, .column.is-full-tablet { - flex: none; - width: 100%; } - .column.is-three-quarters, .column.is-three-quarters-tablet { - flex: none; - width: 75%; } - .column.is-two-thirds, .column.is-two-thirds-tablet { - flex: none; - width: 66.6666%; } - .column.is-half, .column.is-half-tablet { - flex: none; - width: 50%; } - .column.is-one-third, .column.is-one-third-tablet { - flex: none; - width: 33.3333%; } - .column.is-one-quarter, .column.is-one-quarter-tablet { - flex: none; - width: 25%; } - .column.is-one-fifth, .column.is-one-fifth-tablet { - flex: none; - width: 20%; } - .column.is-two-fifths, .column.is-two-fifths-tablet { - flex: none; - width: 40%; } - .column.is-three-fifths, .column.is-three-fifths-tablet { - flex: none; - width: 60%; } - .column.is-four-fifths, .column.is-four-fifths-tablet { - flex: none; - width: 80%; } - .column.is-offset-three-quarters, .column.is-offset-three-quarters-tablet { - margin-left: 75%; } - .column.is-offset-two-thirds, .column.is-offset-two-thirds-tablet { - margin-left: 66.6666%; } - .column.is-offset-half, .column.is-offset-half-tablet { - margin-left: 50%; } - .column.is-offset-one-third, .column.is-offset-one-third-tablet { - margin-left: 33.3333%; } - .column.is-offset-one-quarter, .column.is-offset-one-quarter-tablet { - margin-left: 25%; } - .column.is-offset-one-fifth, .column.is-offset-one-fifth-tablet { - margin-left: 20%; } - .column.is-offset-two-fifths, .column.is-offset-two-fifths-tablet { - margin-left: 40%; } - .column.is-offset-three-fifths, .column.is-offset-three-fifths-tablet { - margin-left: 60%; } - .column.is-offset-four-fifths, .column.is-offset-four-fifths-tablet { - margin-left: 80%; } - .column.is-0, .column.is-0-tablet { - flex: none; - width: 0%; } - .column.is-offset-0, .column.is-offset-0-tablet { - margin-left: 0%; } - .column.is-1, .column.is-1-tablet { - flex: none; - width: 8.3333333333%; } - .column.is-offset-1, .column.is-offset-1-tablet { - margin-left: 8.3333333333%; } - .column.is-2, .column.is-2-tablet { - flex: none; - width: 16.6666666667%; } - .column.is-offset-2, .column.is-offset-2-tablet { - margin-left: 16.6666666667%; } - .column.is-3, .column.is-3-tablet { - flex: none; - width: 25%; } - .column.is-offset-3, .column.is-offset-3-tablet { - margin-left: 25%; } - .column.is-4, .column.is-4-tablet { - flex: none; - width: 33.3333333333%; } - .column.is-offset-4, .column.is-offset-4-tablet { - margin-left: 33.3333333333%; } - .column.is-5, .column.is-5-tablet { - flex: none; - width: 41.6666666667%; } - .column.is-offset-5, .column.is-offset-5-tablet { - margin-left: 41.6666666667%; } - .column.is-6, .column.is-6-tablet { - flex: none; - width: 50%; } - .column.is-offset-6, .column.is-offset-6-tablet { - margin-left: 50%; } - .column.is-7, .column.is-7-tablet { - flex: none; - width: 58.3333333333%; } - .column.is-offset-7, .column.is-offset-7-tablet { - margin-left: 58.3333333333%; } - .column.is-8, .column.is-8-tablet { - flex: none; - width: 66.6666666667%; } - .column.is-offset-8, .column.is-offset-8-tablet { - margin-left: 66.6666666667%; } - .column.is-9, .column.is-9-tablet { - flex: none; - width: 75%; } - .column.is-offset-9, .column.is-offset-9-tablet { - margin-left: 75%; } - .column.is-10, .column.is-10-tablet { - flex: none; - width: 83.3333333333%; } - .column.is-offset-10, .column.is-offset-10-tablet { - margin-left: 83.3333333333%; } - .column.is-11, .column.is-11-tablet { - flex: none; - width: 91.6666666667%; } - .column.is-offset-11, .column.is-offset-11-tablet { - margin-left: 91.6666666667%; } - .column.is-12, .column.is-12-tablet { - flex: none; - width: 100%; } - .column.is-offset-12, .column.is-offset-12-tablet { - margin-left: 100%; } } - @media screen and (max-width: 1055px) { - .column.is-narrow-touch { - flex: none; } - .column.is-full-touch { - flex: none; - width: 100%; } - .column.is-three-quarters-touch { - flex: none; - width: 75%; } - .column.is-two-thirds-touch { - flex: none; - width: 66.6666%; } - .column.is-half-touch { - flex: none; - width: 50%; } - .column.is-one-third-touch { - flex: none; - width: 33.3333%; } - .column.is-one-quarter-touch { - flex: none; - width: 25%; } - .column.is-one-fifth-touch { - flex: none; - width: 20%; } - .column.is-two-fifths-touch { - flex: none; - width: 40%; } - .column.is-three-fifths-touch { - flex: none; - width: 60%; } - .column.is-four-fifths-touch { - flex: none; - width: 80%; } - .column.is-offset-three-quarters-touch { - margin-left: 75%; } - .column.is-offset-two-thirds-touch { - margin-left: 66.6666%; } - .column.is-offset-half-touch { - margin-left: 50%; } - .column.is-offset-one-third-touch { - margin-left: 33.3333%; } - .column.is-offset-one-quarter-touch { - margin-left: 25%; } - .column.is-offset-one-fifth-touch { - margin-left: 20%; } - .column.is-offset-two-fifths-touch { - margin-left: 40%; } - .column.is-offset-three-fifths-touch { - margin-left: 60%; } - .column.is-offset-four-fifths-touch { - margin-left: 80%; } - .column.is-0-touch { - flex: none; - width: 0%; } - .column.is-offset-0-touch { - margin-left: 0%; } - .column.is-1-touch { - flex: none; - width: 8.3333333333%; } - .column.is-offset-1-touch { - margin-left: 8.3333333333%; } - .column.is-2-touch { - flex: none; - width: 16.6666666667%; } - .column.is-offset-2-touch { - margin-left: 16.6666666667%; } - .column.is-3-touch { - flex: none; - width: 25%; } - .column.is-offset-3-touch { - margin-left: 25%; } - .column.is-4-touch { - flex: none; - width: 33.3333333333%; } - .column.is-offset-4-touch { - margin-left: 33.3333333333%; } - .column.is-5-touch { - flex: none; - width: 41.6666666667%; } - .column.is-offset-5-touch { - margin-left: 41.6666666667%; } - .column.is-6-touch { - flex: none; - width: 50%; } - .column.is-offset-6-touch { - margin-left: 50%; } - .column.is-7-touch { - flex: none; - width: 58.3333333333%; } - .column.is-offset-7-touch { - margin-left: 58.3333333333%; } - .column.is-8-touch { - flex: none; - width: 66.6666666667%; } - .column.is-offset-8-touch { - margin-left: 66.6666666667%; } - .column.is-9-touch { - flex: none; - width: 75%; } - .column.is-offset-9-touch { - margin-left: 75%; } - .column.is-10-touch { - flex: none; - width: 83.3333333333%; } - .column.is-offset-10-touch { - margin-left: 83.3333333333%; } - .column.is-11-touch { - flex: none; - width: 91.6666666667%; } - .column.is-offset-11-touch { - margin-left: 91.6666666667%; } - .column.is-12-touch { - flex: none; - width: 100%; } - .column.is-offset-12-touch { - margin-left: 100%; } } - @media screen and (min-width: 1056px) { - .column.is-narrow-desktop { - flex: none; } - .column.is-full-desktop { - flex: none; - width: 100%; } - .column.is-three-quarters-desktop { - flex: none; - width: 75%; } - .column.is-two-thirds-desktop { - flex: none; - width: 66.6666%; } - .column.is-half-desktop { - flex: none; - width: 50%; } - .column.is-one-third-desktop { - flex: none; - width: 33.3333%; } - .column.is-one-quarter-desktop { - flex: none; - width: 25%; } - .column.is-one-fifth-desktop { - flex: none; - width: 20%; } - .column.is-two-fifths-desktop { - flex: none; - width: 40%; } - .column.is-three-fifths-desktop { - flex: none; - width: 60%; } - .column.is-four-fifths-desktop { - flex: none; - width: 80%; } - .column.is-offset-three-quarters-desktop { - margin-left: 75%; } - .column.is-offset-two-thirds-desktop { - margin-left: 66.6666%; } - .column.is-offset-half-desktop { - margin-left: 50%; } - .column.is-offset-one-third-desktop { - margin-left: 33.3333%; } - .column.is-offset-one-quarter-desktop { - margin-left: 25%; } - .column.is-offset-one-fifth-desktop { - margin-left: 20%; } - .column.is-offset-two-fifths-desktop { - margin-left: 40%; } - .column.is-offset-three-fifths-desktop { - margin-left: 60%; } - .column.is-offset-four-fifths-desktop { - margin-left: 80%; } - .column.is-0-desktop { - flex: none; - width: 0%; } - .column.is-offset-0-desktop { - margin-left: 0%; } - .column.is-1-desktop { - flex: none; - width: 8.3333333333%; } - .column.is-offset-1-desktop { - margin-left: 8.3333333333%; } - .column.is-2-desktop { - flex: none; - width: 16.6666666667%; } - .column.is-offset-2-desktop { - margin-left: 16.6666666667%; } - .column.is-3-desktop { - flex: none; - width: 25%; } - .column.is-offset-3-desktop { - margin-left: 25%; } - .column.is-4-desktop { - flex: none; - width: 33.3333333333%; } - .column.is-offset-4-desktop { - margin-left: 33.3333333333%; } - .column.is-5-desktop { - flex: none; - width: 41.6666666667%; } - .column.is-offset-5-desktop { - margin-left: 41.6666666667%; } - .column.is-6-desktop { - flex: none; - width: 50%; } - .column.is-offset-6-desktop { - margin-left: 50%; } - .column.is-7-desktop { - flex: none; - width: 58.3333333333%; } - .column.is-offset-7-desktop { - margin-left: 58.3333333333%; } - .column.is-8-desktop { - flex: none; - width: 66.6666666667%; } - .column.is-offset-8-desktop { - margin-left: 66.6666666667%; } - .column.is-9-desktop { - flex: none; - width: 75%; } - .column.is-offset-9-desktop { - margin-left: 75%; } - .column.is-10-desktop { - flex: none; - width: 83.3333333333%; } - .column.is-offset-10-desktop { - margin-left: 83.3333333333%; } - .column.is-11-desktop { - flex: none; - width: 91.6666666667%; } - .column.is-offset-11-desktop { - margin-left: 91.6666666667%; } - .column.is-12-desktop { - flex: none; - width: 100%; } - .column.is-offset-12-desktop { - margin-left: 100%; } } - @media screen and (min-width: 1216px) { - .column.is-narrow-widescreen { - flex: none; } - .column.is-full-widescreen { - flex: none; - width: 100%; } - .column.is-three-quarters-widescreen { - flex: none; - width: 75%; } - .column.is-two-thirds-widescreen { - flex: none; - width: 66.6666%; } - .column.is-half-widescreen { - flex: none; - width: 50%; } - .column.is-one-third-widescreen { - flex: none; - width: 33.3333%; } - .column.is-one-quarter-widescreen { - flex: none; - width: 25%; } - .column.is-one-fifth-widescreen { - flex: none; - width: 20%; } - .column.is-two-fifths-widescreen { - flex: none; - width: 40%; } - .column.is-three-fifths-widescreen { - flex: none; - width: 60%; } - .column.is-four-fifths-widescreen { - flex: none; - width: 80%; } - .column.is-offset-three-quarters-widescreen { - margin-left: 75%; } - .column.is-offset-two-thirds-widescreen { - margin-left: 66.6666%; } - .column.is-offset-half-widescreen { - margin-left: 50%; } - .column.is-offset-one-third-widescreen { - margin-left: 33.3333%; } - .column.is-offset-one-quarter-widescreen { - margin-left: 25%; } - .column.is-offset-one-fifth-widescreen { - margin-left: 20%; } - .column.is-offset-two-fifths-widescreen { - margin-left: 40%; } - .column.is-offset-three-fifths-widescreen { - margin-left: 60%; } - .column.is-offset-four-fifths-widescreen { - margin-left: 80%; } - .column.is-0-widescreen { - flex: none; - width: 0%; } - .column.is-offset-0-widescreen { - margin-left: 0%; } - .column.is-1-widescreen { - flex: none; - width: 8.3333333333%; } - .column.is-offset-1-widescreen { - margin-left: 8.3333333333%; } - .column.is-2-widescreen { - flex: none; - width: 16.6666666667%; } - .column.is-offset-2-widescreen { - margin-left: 16.6666666667%; } - .column.is-3-widescreen { - flex: none; - width: 25%; } - .column.is-offset-3-widescreen { - margin-left: 25%; } - .column.is-4-widescreen { - flex: none; - width: 33.3333333333%; } - .column.is-offset-4-widescreen { - margin-left: 33.3333333333%; } - .column.is-5-widescreen { - flex: none; - width: 41.6666666667%; } - .column.is-offset-5-widescreen { - margin-left: 41.6666666667%; } - .column.is-6-widescreen { - flex: none; - width: 50%; } - .column.is-offset-6-widescreen { - margin-left: 50%; } - .column.is-7-widescreen { - flex: none; - width: 58.3333333333%; } - .column.is-offset-7-widescreen { - margin-left: 58.3333333333%; } - .column.is-8-widescreen { - flex: none; - width: 66.6666666667%; } - .column.is-offset-8-widescreen { - margin-left: 66.6666666667%; } - .column.is-9-widescreen { - flex: none; - width: 75%; } - .column.is-offset-9-widescreen { - margin-left: 75%; } - .column.is-10-widescreen { - flex: none; - width: 83.3333333333%; } - .column.is-offset-10-widescreen { - margin-left: 83.3333333333%; } - .column.is-11-widescreen { - flex: none; - width: 91.6666666667%; } - .column.is-offset-11-widescreen { - margin-left: 91.6666666667%; } - .column.is-12-widescreen { - flex: none; - width: 100%; } - .column.is-offset-12-widescreen { - margin-left: 100%; } } - @media screen and (min-width: 1408px) { - .column.is-narrow-fullhd { - flex: none; } - .column.is-full-fullhd { - flex: none; - width: 100%; } - .column.is-three-quarters-fullhd { - flex: none; - width: 75%; } - .column.is-two-thirds-fullhd { - flex: none; - width: 66.6666%; } - .column.is-half-fullhd { - flex: none; - width: 50%; } - .column.is-one-third-fullhd { - flex: none; - width: 33.3333%; } - .column.is-one-quarter-fullhd { - flex: none; - width: 25%; } - .column.is-one-fifth-fullhd { - flex: none; - width: 20%; } - .column.is-two-fifths-fullhd { - flex: none; - width: 40%; } - .column.is-three-fifths-fullhd { - flex: none; - width: 60%; } - .column.is-four-fifths-fullhd { - flex: none; - width: 80%; } - .column.is-offset-three-quarters-fullhd { - margin-left: 75%; } - .column.is-offset-two-thirds-fullhd { - margin-left: 66.6666%; } - .column.is-offset-half-fullhd { - margin-left: 50%; } - .column.is-offset-one-third-fullhd { - margin-left: 33.3333%; } - .column.is-offset-one-quarter-fullhd { - margin-left: 25%; } - .column.is-offset-one-fifth-fullhd { - margin-left: 20%; } - .column.is-offset-two-fifths-fullhd { - margin-left: 40%; } - .column.is-offset-three-fifths-fullhd { - margin-left: 60%; } - .column.is-offset-four-fifths-fullhd { - margin-left: 80%; } - .column.is-0-fullhd { - flex: none; - width: 0%; } - .column.is-offset-0-fullhd { - margin-left: 0%; } - .column.is-1-fullhd { - flex: none; - width: 8.3333333333%; } - .column.is-offset-1-fullhd { - margin-left: 8.3333333333%; } - .column.is-2-fullhd { - flex: none; - width: 16.6666666667%; } - .column.is-offset-2-fullhd { - margin-left: 16.6666666667%; } - .column.is-3-fullhd { - flex: none; - width: 25%; } - .column.is-offset-3-fullhd { - margin-left: 25%; } - .column.is-4-fullhd { - flex: none; - width: 33.3333333333%; } - .column.is-offset-4-fullhd { - margin-left: 33.3333333333%; } - .column.is-5-fullhd { - flex: none; - width: 41.6666666667%; } - .column.is-offset-5-fullhd { - margin-left: 41.6666666667%; } - .column.is-6-fullhd { - flex: none; - width: 50%; } - .column.is-offset-6-fullhd { - margin-left: 50%; } - .column.is-7-fullhd { - flex: none; - width: 58.3333333333%; } - .column.is-offset-7-fullhd { - margin-left: 58.3333333333%; } - .column.is-8-fullhd { - flex: none; - width: 66.6666666667%; } - .column.is-offset-8-fullhd { - margin-left: 66.6666666667%; } - .column.is-9-fullhd { - flex: none; - width: 75%; } - .column.is-offset-9-fullhd { - margin-left: 75%; } - .column.is-10-fullhd { - flex: none; - width: 83.3333333333%; } - .column.is-offset-10-fullhd { - margin-left: 83.3333333333%; } - .column.is-11-fullhd { - flex: none; - width: 91.6666666667%; } - .column.is-offset-11-fullhd { - margin-left: 91.6666666667%; } - .column.is-12-fullhd { - flex: none; - width: 100%; } - .column.is-offset-12-fullhd { - margin-left: 100%; } } -.columns { - margin-left: -0.75rem; - margin-right: -0.75rem; - margin-top: -0.75rem; } - .columns:last-child { - margin-bottom: -0.75rem; } - .columns:not(:last-child) { - margin-bottom: calc(1.5rem - 0.75rem); } - .columns.is-centered { - justify-content: center; } - .columns.is-gapless { - margin-left: 0; - margin-right: 0; - margin-top: 0; } - .columns.is-gapless > .column { - margin: 0; - padding: 0 !important; } - .columns.is-gapless:not(:last-child) { - margin-bottom: 1.5rem; } - .columns.is-gapless:last-child { - margin-bottom: 0; } - .columns.is-mobile { - display: flex; } - .columns.is-multiline { - flex-wrap: wrap; } - .columns.is-vcentered { - align-items: center; } - @media screen and (min-width: 769px), print { - .columns:not(.is-desktop) { - display: flex; } } - @media screen and (min-width: 1056px) { - .columns.is-desktop { - display: flex; } } -.columns.is-variable { - --columnGap: 0.75rem; - margin-left: calc(-1 * var(--columnGap)); - margin-right: calc(-1 * var(--columnGap)); } - .columns.is-variable .column { - padding-left: var(--columnGap); - padding-right: var(--columnGap); } - .columns.is-variable.is-0 { - --columnGap: 0rem; } - @media screen and (max-width: 768px) { - .columns.is-variable.is-0-mobile { - --columnGap: 0rem; } } - @media screen and (min-width: 769px), print { - .columns.is-variable.is-0-tablet { - --columnGap: 0rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - .columns.is-variable.is-0-tablet-only { - --columnGap: 0rem; } } - @media screen and (max-width: 1055px) { - .columns.is-variable.is-0-touch { - --columnGap: 0rem; } } - @media screen and (min-width: 1056px) { - .columns.is-variable.is-0-desktop { - --columnGap: 0rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - .columns.is-variable.is-0-desktop-only { - --columnGap: 0rem; } } - @media screen and (min-width: 1216px) { - .columns.is-variable.is-0-widescreen { - --columnGap: 0rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - .columns.is-variable.is-0-widescreen-only { - --columnGap: 0rem; } } - @media screen and (min-width: 1408px) { - .columns.is-variable.is-0-fullhd { - --columnGap: 0rem; } } - .columns.is-variable.is-1 { - --columnGap: 0.25rem; } - @media screen and (max-width: 768px) { - .columns.is-variable.is-1-mobile { - --columnGap: 0.25rem; } } - @media screen and (min-width: 769px), print { - .columns.is-variable.is-1-tablet { - --columnGap: 0.25rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - .columns.is-variable.is-1-tablet-only { - --columnGap: 0.25rem; } } - @media screen and (max-width: 1055px) { - .columns.is-variable.is-1-touch { - --columnGap: 0.25rem; } } - @media screen and (min-width: 1056px) { - .columns.is-variable.is-1-desktop { - --columnGap: 0.25rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - .columns.is-variable.is-1-desktop-only { - --columnGap: 0.25rem; } } - @media screen and (min-width: 1216px) { - .columns.is-variable.is-1-widescreen { - --columnGap: 0.25rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - .columns.is-variable.is-1-widescreen-only { - --columnGap: 0.25rem; } } - @media screen and (min-width: 1408px) { - .columns.is-variable.is-1-fullhd { - --columnGap: 0.25rem; } } - .columns.is-variable.is-2 { - --columnGap: 0.5rem; } - @media screen and (max-width: 768px) { - .columns.is-variable.is-2-mobile { - --columnGap: 0.5rem; } } - @media screen and (min-width: 769px), print { - .columns.is-variable.is-2-tablet { - --columnGap: 0.5rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - .columns.is-variable.is-2-tablet-only { - --columnGap: 0.5rem; } } - @media screen and (max-width: 1055px) { - .columns.is-variable.is-2-touch { - --columnGap: 0.5rem; } } - @media screen and (min-width: 1056px) { - .columns.is-variable.is-2-desktop { - --columnGap: 0.5rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - .columns.is-variable.is-2-desktop-only { - --columnGap: 0.5rem; } } - @media screen and (min-width: 1216px) { - .columns.is-variable.is-2-widescreen { - --columnGap: 0.5rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - .columns.is-variable.is-2-widescreen-only { - --columnGap: 0.5rem; } } - @media screen and (min-width: 1408px) { - .columns.is-variable.is-2-fullhd { - --columnGap: 0.5rem; } } - .columns.is-variable.is-3 { - --columnGap: 0.75rem; } - @media screen and (max-width: 768px) { - .columns.is-variable.is-3-mobile { - --columnGap: 0.75rem; } } - @media screen and (min-width: 769px), print { - .columns.is-variable.is-3-tablet { - --columnGap: 0.75rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - .columns.is-variable.is-3-tablet-only { - --columnGap: 0.75rem; } } - @media screen and (max-width: 1055px) { - .columns.is-variable.is-3-touch { - --columnGap: 0.75rem; } } - @media screen and (min-width: 1056px) { - .columns.is-variable.is-3-desktop { - --columnGap: 0.75rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - .columns.is-variable.is-3-desktop-only { - --columnGap: 0.75rem; } } - @media screen and (min-width: 1216px) { - .columns.is-variable.is-3-widescreen { - --columnGap: 0.75rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - .columns.is-variable.is-3-widescreen-only { - --columnGap: 0.75rem; } } - @media screen and (min-width: 1408px) { - .columns.is-variable.is-3-fullhd { - --columnGap: 0.75rem; } } - .columns.is-variable.is-4 { - --columnGap: 1rem; } - @media screen and (max-width: 768px) { - .columns.is-variable.is-4-mobile { - --columnGap: 1rem; } } - @media screen and (min-width: 769px), print { - .columns.is-variable.is-4-tablet { - --columnGap: 1rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - .columns.is-variable.is-4-tablet-only { - --columnGap: 1rem; } } - @media screen and (max-width: 1055px) { - .columns.is-variable.is-4-touch { - --columnGap: 1rem; } } - @media screen and (min-width: 1056px) { - .columns.is-variable.is-4-desktop { - --columnGap: 1rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - .columns.is-variable.is-4-desktop-only { - --columnGap: 1rem; } } - @media screen and (min-width: 1216px) { - .columns.is-variable.is-4-widescreen { - --columnGap: 1rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - .columns.is-variable.is-4-widescreen-only { - --columnGap: 1rem; } } - @media screen and (min-width: 1408px) { - .columns.is-variable.is-4-fullhd { - --columnGap: 1rem; } } - .columns.is-variable.is-5 { - --columnGap: 1.25rem; } - @media screen and (max-width: 768px) { - .columns.is-variable.is-5-mobile { - --columnGap: 1.25rem; } } - @media screen and (min-width: 769px), print { - .columns.is-variable.is-5-tablet { - --columnGap: 1.25rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - .columns.is-variable.is-5-tablet-only { - --columnGap: 1.25rem; } } - @media screen and (max-width: 1055px) { - .columns.is-variable.is-5-touch { - --columnGap: 1.25rem; } } - @media screen and (min-width: 1056px) { - .columns.is-variable.is-5-desktop { - --columnGap: 1.25rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - .columns.is-variable.is-5-desktop-only { - --columnGap: 1.25rem; } } - @media screen and (min-width: 1216px) { - .columns.is-variable.is-5-widescreen { - --columnGap: 1.25rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - .columns.is-variable.is-5-widescreen-only { - --columnGap: 1.25rem; } } - @media screen and (min-width: 1408px) { - .columns.is-variable.is-5-fullhd { - --columnGap: 1.25rem; } } - .columns.is-variable.is-6 { - --columnGap: 1.5rem; } - @media screen and (max-width: 768px) { - .columns.is-variable.is-6-mobile { - --columnGap: 1.5rem; } } - @media screen and (min-width: 769px), print { - .columns.is-variable.is-6-tablet { - --columnGap: 1.5rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - .columns.is-variable.is-6-tablet-only { - --columnGap: 1.5rem; } } - @media screen and (max-width: 1055px) { - .columns.is-variable.is-6-touch { - --columnGap: 1.5rem; } } - @media screen and (min-width: 1056px) { - .columns.is-variable.is-6-desktop { - --columnGap: 1.5rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - .columns.is-variable.is-6-desktop-only { - --columnGap: 1.5rem; } } - @media screen and (min-width: 1216px) { - .columns.is-variable.is-6-widescreen { - --columnGap: 1.5rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - .columns.is-variable.is-6-widescreen-only { - --columnGap: 1.5rem; } } - @media screen and (min-width: 1408px) { - .columns.is-variable.is-6-fullhd { - --columnGap: 1.5rem; } } - .columns.is-variable.is-7 { - --columnGap: 1.75rem; } - @media screen and (max-width: 768px) { - .columns.is-variable.is-7-mobile { - --columnGap: 1.75rem; } } - @media screen and (min-width: 769px), print { - .columns.is-variable.is-7-tablet { - --columnGap: 1.75rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - .columns.is-variable.is-7-tablet-only { - --columnGap: 1.75rem; } } - @media screen and (max-width: 1055px) { - .columns.is-variable.is-7-touch { - --columnGap: 1.75rem; } } - @media screen and (min-width: 1056px) { - .columns.is-variable.is-7-desktop { - --columnGap: 1.75rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - .columns.is-variable.is-7-desktop-only { - --columnGap: 1.75rem; } } - @media screen and (min-width: 1216px) { - .columns.is-variable.is-7-widescreen { - --columnGap: 1.75rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - .columns.is-variable.is-7-widescreen-only { - --columnGap: 1.75rem; } } - @media screen and (min-width: 1408px) { - .columns.is-variable.is-7-fullhd { - --columnGap: 1.75rem; } } - .columns.is-variable.is-8 { - --columnGap: 2rem; } - @media screen and (max-width: 768px) { - .columns.is-variable.is-8-mobile { - --columnGap: 2rem; } } - @media screen and (min-width: 769px), print { - .columns.is-variable.is-8-tablet { - --columnGap: 2rem; } } - @media screen and (min-width: 769px) and (max-width: 1055px) { - .columns.is-variable.is-8-tablet-only { - --columnGap: 2rem; } } - @media screen and (max-width: 1055px) { - .columns.is-variable.is-8-touch { - --columnGap: 2rem; } } - @media screen and (min-width: 1056px) { - .columns.is-variable.is-8-desktop { - --columnGap: 2rem; } } - @media screen and (min-width: 1056px) and (max-width: 1215px) { - .columns.is-variable.is-8-desktop-only { - --columnGap: 2rem; } } - @media screen and (min-width: 1216px) { - .columns.is-variable.is-8-widescreen { - --columnGap: 2rem; } } - @media screen and (min-width: 1216px) and (max-width: 1407px) { - .columns.is-variable.is-8-widescreen-only { - --columnGap: 2rem; } } - @media screen and (min-width: 1408px) { - .columns.is-variable.is-8-fullhd { - --columnGap: 2rem; } } -.tile { - align-items: stretch; - display: block; - flex-basis: 0; - flex-grow: 1; - flex-shrink: 1; - min-height: min-content; } - .tile.is-ancestor { - margin-left: -0.75rem; - margin-right: -0.75rem; - margin-top: -0.75rem; } - .tile.is-ancestor:last-child { - margin-bottom: -0.75rem; } - .tile.is-ancestor:not(:last-child) { - margin-bottom: 0.75rem; } - .tile.is-child { - margin: 0 !important; } - .tile.is-parent { - padding: 0.75rem; } - .tile.is-vertical { - flex-direction: column; } - .tile.is-vertical > .tile.is-child:not(:last-child) { - margin-bottom: 1.5rem !important; } - @media screen and (min-width: 769px), print { - .tile:not(.is-child) { - display: flex; } - .tile.is-1 { - flex: none; - width: 8.3333333333%; } - .tile.is-2 { - flex: none; - width: 16.6666666667%; } - .tile.is-3 { - flex: none; - width: 25%; } - .tile.is-4 { - flex: none; - width: 33.3333333333%; } - .tile.is-5 { - flex: none; - width: 41.6666666667%; } - .tile.is-6 { - flex: none; - width: 50%; } - .tile.is-7 { - flex: none; - width: 58.3333333333%; } - .tile.is-8 { - flex: none; - width: 66.6666666667%; } - .tile.is-9 { - flex: none; - width: 75%; } - .tile.is-10 { - flex: none; - width: 83.3333333333%; } - .tile.is-11 { - flex: none; - width: 91.6666666667%; } - .tile.is-12 { - flex: none; - width: 100%; } } -.hero { - align-items: stretch; - display: flex; - flex-direction: column; - justify-content: space-between; } - .hero .navbar { - background: none; } - .hero .tabs ul { - border-bottom: none; } - .hero.is-white { - background-color: white; - color: #0a0a0a; } - .hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - .hero.is-white strong { - color: inherit; } - .hero.is-white .title { - color: #0a0a0a; } - .hero.is-white .subtitle { - color: rgba(10, 10, 10, 0.9); } - .hero.is-white .subtitle a:not(.button), - .hero.is-white .subtitle strong { - color: #0a0a0a; } - @media screen and (max-width: 1055px) { - .hero.is-white .navbar-menu { - background-color: white; } } - .hero.is-white .navbar-item, - .hero.is-white .navbar-link { - color: rgba(10, 10, 10, 0.7); } - .hero.is-white a.navbar-item:hover, .hero.is-white a.navbar-item.is-active, - .hero.is-white .navbar-link:hover, - .hero.is-white .navbar-link.is-active { - background-color: #f2f2f2; - color: #0a0a0a; } - .hero.is-white .tabs a { - color: #0a0a0a; - opacity: 0.9; } - .hero.is-white .tabs a:hover { - opacity: 1; } - .hero.is-white .tabs li.is-active a { - opacity: 1; } - .hero.is-white .tabs.is-boxed a, .hero.is-white .tabs.is-toggle a { - color: #0a0a0a; } - .hero.is-white .tabs.is-boxed a:hover, .hero.is-white .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - .hero.is-white .tabs.is-boxed li.is-active a, .hero.is-white .tabs.is-boxed li.is-active a:hover, .hero.is-white .tabs.is-toggle li.is-active a, .hero.is-white .tabs.is-toggle li.is-active a:hover { - background-color: #0a0a0a; - border-color: #0a0a0a; - color: white; } - .hero.is-white.is-bold { - background-image: linear-gradient(141deg, #e8e3e4 0%, white 71%, white 100%); } - @media screen and (max-width: 768px) { - .hero.is-white.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #e8e3e4 0%, white 71%, white 100%); } } - .hero.is-black { - background-color: #0a0a0a; - color: white; } - .hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - .hero.is-black strong { - color: inherit; } - .hero.is-black .title { - color: white; } - .hero.is-black .subtitle { - color: rgba(255, 255, 255, 0.9); } - .hero.is-black .subtitle a:not(.button), - .hero.is-black .subtitle strong { - color: white; } - @media screen and (max-width: 1055px) { - .hero.is-black .navbar-menu { - background-color: #0a0a0a; } } - .hero.is-black .navbar-item, - .hero.is-black .navbar-link { - color: rgba(255, 255, 255, 0.7); } - .hero.is-black a.navbar-item:hover, .hero.is-black a.navbar-item.is-active, - .hero.is-black .navbar-link:hover, - .hero.is-black .navbar-link.is-active { - background-color: black; - color: white; } - .hero.is-black .tabs a { - color: white; - opacity: 0.9; } - .hero.is-black .tabs a:hover { - opacity: 1; } - .hero.is-black .tabs li.is-active a { - opacity: 1; } - .hero.is-black .tabs.is-boxed a, .hero.is-black .tabs.is-toggle a { - color: white; } - .hero.is-black .tabs.is-boxed a:hover, .hero.is-black .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - .hero.is-black .tabs.is-boxed li.is-active a, .hero.is-black .tabs.is-boxed li.is-active a:hover, .hero.is-black .tabs.is-toggle li.is-active a, .hero.is-black .tabs.is-toggle li.is-active a:hover { - background-color: white; - border-color: white; - color: #0a0a0a; } - .hero.is-black.is-bold { - background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); } - @media screen and (max-width: 768px) { - .hero.is-black.is-bold .navbar-menu { - background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); } } - .hero.is-light { - background-color: whitesmoke; - color: #363636; } - .hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - .hero.is-light strong { - color: inherit; } - .hero.is-light .title { - color: #363636; } - .hero.is-light .subtitle { - color: rgba(54, 54, 54, 0.9); } - .hero.is-light .subtitle a:not(.button), - .hero.is-light .subtitle strong { - color: #363636; } - @media screen and (max-width: 1055px) { - .hero.is-light .navbar-menu { - background-color: whitesmoke; } } - .hero.is-light .navbar-item, - .hero.is-light .navbar-link { - color: rgba(54, 54, 54, 0.7); } - .hero.is-light a.navbar-item:hover, .hero.is-light a.navbar-item.is-active, - .hero.is-light .navbar-link:hover, - .hero.is-light .navbar-link.is-active { - background-color: #e8e8e8; - color: #363636; } - .hero.is-light .tabs a { - color: #363636; - opacity: 0.9; } - .hero.is-light .tabs a:hover { - opacity: 1; } - .hero.is-light .tabs li.is-active a { - opacity: 1; } - .hero.is-light .tabs.is-boxed a, .hero.is-light .tabs.is-toggle a { - color: #363636; } - .hero.is-light .tabs.is-boxed a:hover, .hero.is-light .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - .hero.is-light .tabs.is-boxed li.is-active a, .hero.is-light .tabs.is-boxed li.is-active a:hover, .hero.is-light .tabs.is-toggle li.is-active a, .hero.is-light .tabs.is-toggle li.is-active a:hover { - background-color: #363636; - border-color: #363636; - color: whitesmoke; } - .hero.is-light.is-bold { - background-image: linear-gradient(141deg, #dfd8d9 0%, whitesmoke 71%, white 100%); } - @media screen and (max-width: 768px) { - .hero.is-light.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #dfd8d9 0%, whitesmoke 71%, white 100%); } } - .hero.is-dark, .content kbd.hero { - background-color: #363636; - color: whitesmoke; } - .hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), .content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - .hero.is-dark strong, - .content kbd.hero strong { - color: inherit; } - .hero.is-dark .title, .content kbd.hero .title { - color: whitesmoke; } - .hero.is-dark .subtitle, .content kbd.hero .subtitle { - color: rgba(245, 245, 245, 0.9); } - .hero.is-dark .subtitle a:not(.button), .content kbd.hero .subtitle a:not(.button), - .hero.is-dark .subtitle strong, - .content kbd.hero .subtitle strong { - color: whitesmoke; } - @media screen and (max-width: 1055px) { - .hero.is-dark .navbar-menu, .content kbd.hero .navbar-menu { - background-color: #363636; } } - .hero.is-dark .navbar-item, .content kbd.hero .navbar-item, - .hero.is-dark .navbar-link, - .content kbd.hero .navbar-link { - color: rgba(245, 245, 245, 0.7); } - .hero.is-dark a.navbar-item:hover, .content kbd.hero a.navbar-item:hover, .hero.is-dark a.navbar-item.is-active, .content kbd.hero a.navbar-item.is-active, - .hero.is-dark .navbar-link:hover, - .content kbd.hero .navbar-link:hover, - .hero.is-dark .navbar-link.is-active, - .content kbd.hero .navbar-link.is-active { - background-color: #292929; - color: whitesmoke; } - .hero.is-dark .tabs a, .content kbd.hero .tabs a { - color: whitesmoke; - opacity: 0.9; } - .hero.is-dark .tabs a:hover, .content kbd.hero .tabs a:hover { - opacity: 1; } - .hero.is-dark .tabs li.is-active a, .content kbd.hero .tabs li.is-active a { - opacity: 1; } - .hero.is-dark .tabs.is-boxed a, .content kbd.hero .tabs.is-boxed a, .hero.is-dark .tabs.is-toggle a, .content kbd.hero .tabs.is-toggle a { - color: whitesmoke; } - .hero.is-dark .tabs.is-boxed a:hover, .content kbd.hero .tabs.is-boxed a:hover, .hero.is-dark .tabs.is-toggle a:hover, .content kbd.hero .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - .hero.is-dark .tabs.is-boxed li.is-active a, .content kbd.hero .tabs.is-boxed li.is-active a, .hero.is-dark .tabs.is-boxed li.is-active a:hover, .hero.is-dark .tabs.is-toggle li.is-active a, .content kbd.hero .tabs.is-toggle li.is-active a, .hero.is-dark .tabs.is-toggle li.is-active a:hover { - background-color: whitesmoke; - border-color: whitesmoke; - color: #363636; } - .hero.is-dark.is-bold, .content kbd.hero.is-bold { - background-image: linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%); } - @media screen and (max-width: 768px) { - .hero.is-dark.is-bold .navbar-menu, .content kbd.hero.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%); } } - .hero.is-primary, .docstring > section > a.hero.docs-sourcelink { - background-color: #4eb5de; - color: #fff; } - .hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), .docstring > section > a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - .hero.is-primary strong, - .docstring > section > a.hero.docs-sourcelink strong { - color: inherit; } - .hero.is-primary .title, .docstring > section > a.hero.docs-sourcelink .title { - color: #fff; } - .hero.is-primary .subtitle, .docstring > section > a.hero.docs-sourcelink .subtitle { - color: rgba(255, 255, 255, 0.9); } - .hero.is-primary .subtitle a:not(.button), .docstring > section > a.hero.docs-sourcelink .subtitle a:not(.button), - .hero.is-primary .subtitle strong, - .docstring > section > a.hero.docs-sourcelink .subtitle strong { - color: #fff; } - @media screen and (max-width: 1055px) { - .hero.is-primary .navbar-menu, .docstring > section > a.hero.docs-sourcelink .navbar-menu { - background-color: #4eb5de; } } - .hero.is-primary .navbar-item, .docstring > section > a.hero.docs-sourcelink .navbar-item, - .hero.is-primary .navbar-link, - .docstring > section > a.hero.docs-sourcelink .navbar-link { - color: rgba(255, 255, 255, 0.7); } - .hero.is-primary a.navbar-item:hover, .docstring > section > a.hero.docs-sourcelink a.navbar-item:hover, .hero.is-primary a.navbar-item.is-active, .docstring > section > a.hero.docs-sourcelink a.navbar-item.is-active, - .hero.is-primary .navbar-link:hover, - .docstring > section > a.hero.docs-sourcelink .navbar-link:hover, - .hero.is-primary .navbar-link.is-active, - .docstring > section > a.hero.docs-sourcelink .navbar-link.is-active { - background-color: #39acda; - color: #fff; } - .hero.is-primary .tabs a, .docstring > section > a.hero.docs-sourcelink .tabs a { - color: #fff; - opacity: 0.9; } - .hero.is-primary .tabs a:hover, .docstring > section > a.hero.docs-sourcelink .tabs a:hover { - opacity: 1; } - .hero.is-primary .tabs li.is-active a, .docstring > section > a.hero.docs-sourcelink .tabs li.is-active a { - opacity: 1; } - .hero.is-primary .tabs.is-boxed a, .docstring > section > a.hero.docs-sourcelink .tabs.is-boxed a, .hero.is-primary .tabs.is-toggle a, .docstring > section > a.hero.docs-sourcelink .tabs.is-toggle a { - color: #fff; } - .hero.is-primary .tabs.is-boxed a:hover, .docstring > section > a.hero.docs-sourcelink .tabs.is-boxed a:hover, .hero.is-primary .tabs.is-toggle a:hover, .docstring > section > a.hero.docs-sourcelink .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - .hero.is-primary .tabs.is-boxed li.is-active a, .docstring > section > a.hero.docs-sourcelink .tabs.is-boxed li.is-active a, .hero.is-primary .tabs.is-boxed li.is-active a:hover, .hero.is-primary .tabs.is-toggle li.is-active a, .docstring > section > a.hero.docs-sourcelink .tabs.is-toggle li.is-active a, .hero.is-primary .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #4eb5de; } - .hero.is-primary.is-bold, .docstring > section > a.hero.is-bold.docs-sourcelink { - background-image: linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%); } - @media screen and (max-width: 768px) { - .hero.is-primary.is-bold .navbar-menu, .docstring > section > a.hero.is-bold.docs-sourcelink .navbar-menu { - background-image: linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%); } } - .hero.is-link { - background-color: #2e63b8; - color: #fff; } - .hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - .hero.is-link strong { - color: inherit; } - .hero.is-link .title { - color: #fff; } - .hero.is-link .subtitle { - color: rgba(255, 255, 255, 0.9); } - .hero.is-link .subtitle a:not(.button), - .hero.is-link .subtitle strong { - color: #fff; } - @media screen and (max-width: 1055px) { - .hero.is-link .navbar-menu { - background-color: #2e63b8; } } - .hero.is-link .navbar-item, - .hero.is-link .navbar-link { - color: rgba(255, 255, 255, 0.7); } - .hero.is-link a.navbar-item:hover, .hero.is-link a.navbar-item.is-active, - .hero.is-link .navbar-link:hover, - .hero.is-link .navbar-link.is-active { - background-color: #2958a4; - color: #fff; } - .hero.is-link .tabs a { - color: #fff; - opacity: 0.9; } - .hero.is-link .tabs a:hover { - opacity: 1; } - .hero.is-link .tabs li.is-active a { - opacity: 1; } - .hero.is-link .tabs.is-boxed a, .hero.is-link .tabs.is-toggle a { - color: #fff; } - .hero.is-link .tabs.is-boxed a:hover, .hero.is-link .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - .hero.is-link .tabs.is-boxed li.is-active a, .hero.is-link .tabs.is-boxed li.is-active a:hover, .hero.is-link .tabs.is-toggle li.is-active a, .hero.is-link .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #2e63b8; } - .hero.is-link.is-bold { - background-image: linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%); } - @media screen and (max-width: 768px) { - .hero.is-link.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%); } } - .hero.is-info { - background-color: #209cee; - color: #fff; } - .hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - .hero.is-info strong { - color: inherit; } - .hero.is-info .title { - color: #fff; } - .hero.is-info .subtitle { - color: rgba(255, 255, 255, 0.9); } - .hero.is-info .subtitle a:not(.button), - .hero.is-info .subtitle strong { - color: #fff; } - @media screen and (max-width: 1055px) { - .hero.is-info .navbar-menu { - background-color: #209cee; } } - .hero.is-info .navbar-item, - .hero.is-info .navbar-link { - color: rgba(255, 255, 255, 0.7); } - .hero.is-info a.navbar-item:hover, .hero.is-info a.navbar-item.is-active, - .hero.is-info .navbar-link:hover, - .hero.is-info .navbar-link.is-active { - background-color: #1190e3; - color: #fff; } - .hero.is-info .tabs a { - color: #fff; - opacity: 0.9; } - .hero.is-info .tabs a:hover { - opacity: 1; } - .hero.is-info .tabs li.is-active a { - opacity: 1; } - .hero.is-info .tabs.is-boxed a, .hero.is-info .tabs.is-toggle a { - color: #fff; } - .hero.is-info .tabs.is-boxed a:hover, .hero.is-info .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - .hero.is-info .tabs.is-boxed li.is-active a, .hero.is-info .tabs.is-boxed li.is-active a:hover, .hero.is-info .tabs.is-toggle li.is-active a, .hero.is-info .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #209cee; } - .hero.is-info.is-bold { - background-image: linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%); } - @media screen and (max-width: 768px) { - .hero.is-info.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%); } } - .hero.is-success { - background-color: #22c35b; - color: #fff; } - .hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - .hero.is-success strong { - color: inherit; } - .hero.is-success .title { - color: #fff; } - .hero.is-success .subtitle { - color: rgba(255, 255, 255, 0.9); } - .hero.is-success .subtitle a:not(.button), - .hero.is-success .subtitle strong { - color: #fff; } - @media screen and (max-width: 1055px) { - .hero.is-success .navbar-menu { - background-color: #22c35b; } } - .hero.is-success .navbar-item, - .hero.is-success .navbar-link { - color: rgba(255, 255, 255, 0.7); } - .hero.is-success a.navbar-item:hover, .hero.is-success a.navbar-item.is-active, - .hero.is-success .navbar-link:hover, - .hero.is-success .navbar-link.is-active { - background-color: #1ead51; - color: #fff; } - .hero.is-success .tabs a { - color: #fff; - opacity: 0.9; } - .hero.is-success .tabs a:hover { - opacity: 1; } - .hero.is-success .tabs li.is-active a { - opacity: 1; } - .hero.is-success .tabs.is-boxed a, .hero.is-success .tabs.is-toggle a { - color: #fff; } - .hero.is-success .tabs.is-boxed a:hover, .hero.is-success .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - .hero.is-success .tabs.is-boxed li.is-active a, .hero.is-success .tabs.is-boxed li.is-active a:hover, .hero.is-success .tabs.is-toggle li.is-active a, .hero.is-success .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #22c35b; } - .hero.is-success.is-bold { - background-image: linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%); } - @media screen and (max-width: 768px) { - .hero.is-success.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%); } } - .hero.is-warning { - background-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); } - .hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - .hero.is-warning strong { - color: inherit; } - .hero.is-warning .title { - color: rgba(0, 0, 0, 0.7); } - .hero.is-warning .subtitle { - color: rgba(0, 0, 0, 0.9); } - .hero.is-warning .subtitle a:not(.button), - .hero.is-warning .subtitle strong { - color: rgba(0, 0, 0, 0.7); } - @media screen and (max-width: 1055px) { - .hero.is-warning .navbar-menu { - background-color: #ffdd57; } } - .hero.is-warning .navbar-item, - .hero.is-warning .navbar-link { - color: rgba(0, 0, 0, 0.7); } - .hero.is-warning a.navbar-item:hover, .hero.is-warning a.navbar-item.is-active, - .hero.is-warning .navbar-link:hover, - .hero.is-warning .navbar-link.is-active { - background-color: #ffd83e; - color: rgba(0, 0, 0, 0.7); } - .hero.is-warning .tabs a { - color: rgba(0, 0, 0, 0.7); - opacity: 0.9; } - .hero.is-warning .tabs a:hover { - opacity: 1; } - .hero.is-warning .tabs li.is-active a { - opacity: 1; } - .hero.is-warning .tabs.is-boxed a, .hero.is-warning .tabs.is-toggle a { - color: rgba(0, 0, 0, 0.7); } - .hero.is-warning .tabs.is-boxed a:hover, .hero.is-warning .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - .hero.is-warning .tabs.is-boxed li.is-active a, .hero.is-warning .tabs.is-boxed li.is-active a:hover, .hero.is-warning .tabs.is-toggle li.is-active a, .hero.is-warning .tabs.is-toggle li.is-active a:hover { - background-color: rgba(0, 0, 0, 0.7); - border-color: rgba(0, 0, 0, 0.7); - color: #ffdd57; } - .hero.is-warning.is-bold { - background-image: linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%); } - @media screen and (max-width: 768px) { - .hero.is-warning.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%); } } - .hero.is-danger { - background-color: #da0b00; - color: #fff; } - .hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), - .hero.is-danger strong { - color: inherit; } - .hero.is-danger .title { - color: #fff; } - .hero.is-danger .subtitle { - color: rgba(255, 255, 255, 0.9); } - .hero.is-danger .subtitle a:not(.button), - .hero.is-danger .subtitle strong { - color: #fff; } - @media screen and (max-width: 1055px) { - .hero.is-danger .navbar-menu { - background-color: #da0b00; } } - .hero.is-danger .navbar-item, - .hero.is-danger .navbar-link { - color: rgba(255, 255, 255, 0.7); } - .hero.is-danger a.navbar-item:hover, .hero.is-danger a.navbar-item.is-active, - .hero.is-danger .navbar-link:hover, - .hero.is-danger .navbar-link.is-active { - background-color: #c10a00; - color: #fff; } - .hero.is-danger .tabs a { - color: #fff; - opacity: 0.9; } - .hero.is-danger .tabs a:hover { - opacity: 1; } - .hero.is-danger .tabs li.is-active a { - opacity: 1; } - .hero.is-danger .tabs.is-boxed a, .hero.is-danger .tabs.is-toggle a { - color: #fff; } - .hero.is-danger .tabs.is-boxed a:hover, .hero.is-danger .tabs.is-toggle a:hover { - background-color: rgba(10, 10, 10, 0.1); } - .hero.is-danger .tabs.is-boxed li.is-active a, .hero.is-danger .tabs.is-boxed li.is-active a:hover, .hero.is-danger .tabs.is-toggle li.is-active a, .hero.is-danger .tabs.is-toggle li.is-active a:hover { - background-color: #fff; - border-color: #fff; - color: #da0b00; } - .hero.is-danger.is-bold { - background-image: linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%); } - @media screen and (max-width: 768px) { - .hero.is-danger.is-bold .navbar-menu { - background-image: linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%); } } - .hero.is-small .hero-body, #documenter .docs-sidebar form.docs-search > input.hero .hero-body { - padding-bottom: 1.5rem; - padding-top: 1.5rem; } - @media screen and (min-width: 769px), print { - .hero.is-medium .hero-body { - padding-bottom: 9rem; - padding-top: 9rem; } } - @media screen and (min-width: 769px), print { - .hero.is-large .hero-body { - padding-bottom: 18rem; - padding-top: 18rem; } } - .hero.is-halfheight .hero-body, .hero.is-fullheight .hero-body, .hero.is-fullheight-with-navbar .hero-body { - align-items: center; - display: flex; } - .hero.is-halfheight .hero-body > .container, .hero.is-fullheight .hero-body > .container, .hero.is-fullheight-with-navbar .hero-body > .container { - flex-grow: 1; - flex-shrink: 1; } - .hero.is-halfheight { - min-height: 50vh; } - .hero.is-fullheight { - min-height: 100vh; } - -.hero-video { - overflow: hidden; } - .hero-video video { - left: 50%; - min-height: 100%; - min-width: 100%; - position: absolute; - top: 50%; - transform: translate3d(-50%, -50%, 0); } - .hero-video.is-transparent { - opacity: 0.3; } - @media screen and (max-width: 768px) { - .hero-video { - display: none; } } -.hero-buttons { - margin-top: 1.5rem; } - @media screen and (max-width: 768px) { - .hero-buttons .button { - display: flex; } - .hero-buttons .button:not(:last-child) { - margin-bottom: 0.75rem; } } - @media screen and (min-width: 769px), print { - .hero-buttons { - display: flex; - justify-content: center; } - .hero-buttons .button:not(:last-child) { - margin-right: 1.5rem; } } -.hero-head, -.hero-foot { - flex-grow: 0; - flex-shrink: 0; } - -.hero-body { - flex-grow: 1; - flex-shrink: 0; - padding: 3rem 1.5rem; } - -.section { - padding: 3rem 1.5rem; } - @media screen and (min-width: 1056px) { - .section.is-medium { - padding: 9rem 1.5rem; } - .section.is-large { - padding: 18rem 1.5rem; } } -.footer { - background-color: #fafafa; - padding: 3rem 1.5rem 6rem; } - -h1 .docs-heading-anchor, h1 .docs-heading-anchor:hover, h1 .docs-heading-anchor:visited, h2 .docs-heading-anchor, h2 .docs-heading-anchor:hover, h2 .docs-heading-anchor:visited, h3 .docs-heading-anchor, h3 .docs-heading-anchor:hover, h3 .docs-heading-anchor:visited, h4 .docs-heading-anchor, h4 .docs-heading-anchor:hover, h4 .docs-heading-anchor:visited, h5 .docs-heading-anchor, h5 .docs-heading-anchor:hover, h5 .docs-heading-anchor:visited, h6 .docs-heading-anchor, h6 .docs-heading-anchor:hover, h6 .docs-heading-anchor:visited { - color: #222222; } - -h1 .docs-heading-anchor-permalink, h2 .docs-heading-anchor-permalink, h3 .docs-heading-anchor-permalink, h4 .docs-heading-anchor-permalink, h5 .docs-heading-anchor-permalink, h6 .docs-heading-anchor-permalink { - visibility: hidden; - vertical-align: middle; - margin-left: 0.5em; - font-size: 0.7rem; } - h1 .docs-heading-anchor-permalink::before, h2 .docs-heading-anchor-permalink::before, h3 .docs-heading-anchor-permalink::before, h4 .docs-heading-anchor-permalink::before, h5 .docs-heading-anchor-permalink::before, h6 .docs-heading-anchor-permalink::before { - font-family: "Font Awesome 5 Free"; - font-weight: 900; - content: "\f0c1"; } - -h1:hover .docs-heading-anchor-permalink, h2:hover .docs-heading-anchor-permalink, h3:hover .docs-heading-anchor-permalink, h4:hover .docs-heading-anchor-permalink, h5:hover .docs-heading-anchor-permalink, h6:hover .docs-heading-anchor-permalink { - visibility: visible; } - -.docs-dark-only { - display: none !important; } - -pre { - position: relative; - overflow: hidden; } - pre code, pre code.hljs { - padding: 0 0.75rem !important; - overflow: auto; - display: block; } - pre code:first-of-type, pre code.hljs:first-of-type { - padding-top: 0.5rem !important; } - pre code:last-of-type, pre code.hljs:last-of-type { - padding-bottom: 0.5rem !important; } - pre .copy-button { - opacity: 0.2; - transition: opacity 0.2s; - position: absolute; - right: 0em; - top: 0em; - padding: 0.5em; - width: 2.5em; - height: 2.5em; - background: transparent; - border: none; - font-family: "Font Awesome 5 Free"; - color: #222222; - cursor: pointer; - text-align: center; } - pre .copy-button:focus, pre .copy-button:hover { - opacity: 1; - background: rgba(34, 34, 34, 0.1); - color: #2e63b8; } - pre .copy-button.success { - color: #259a12; - opacity: 1; } - pre .copy-button.error { - color: #cb3c33; - opacity: 1; } - pre:hover .copy-button { - opacity: 1; } - -.admonition { - background-color: #b5b5b5; - border-style: solid; - border-width: 1px; - border-color: #363636; - border-radius: 4px; - font-size: 1rem; } - .admonition strong { - color: currentColor; } - .admonition.is-small, #documenter .docs-sidebar form.docs-search > input.admonition { - font-size: 0.75rem; } - .admonition.is-medium { - font-size: 1.25rem; } - .admonition.is-large { - font-size: 1.5rem; } - .admonition.is-default { - background-color: #b5b5b5; - border-color: #363636; } - .admonition.is-default > .admonition-header { - background-color: #363636; - color: #fff; } - .admonition.is-default > .admonition-body { - color: #fff; } - .admonition.is-info { - background-color: #def0fc; - border-color: #209cee; } - .admonition.is-info > .admonition-header { - background-color: #209cee; - color: #fff; } - .admonition.is-info > .admonition-body { - color: rgba(0, 0, 0, 0.7); } - .admonition.is-success { - background-color: #bdf4d1; - border-color: #22c35b; } - .admonition.is-success > .admonition-header { - background-color: #22c35b; - color: #fff; } - .admonition.is-success > .admonition-body { - color: rgba(0, 0, 0, 0.7); } - .admonition.is-warning { - background-color: #fff3c5; - border-color: #ffdd57; } - .admonition.is-warning > .admonition-header { - background-color: #ffdd57; - color: rgba(0, 0, 0, 0.7); } - .admonition.is-warning > .admonition-body { - color: rgba(0, 0, 0, 0.7); } - .admonition.is-danger { - background-color: #ffaba7; - border-color: #da0b00; } - .admonition.is-danger > .admonition-header { - background-color: #da0b00; - color: #fff; } - .admonition.is-danger > .admonition-body { - color: rgba(0, 0, 0, 0.7); } - .admonition.is-compat { - background-color: #bdeff5; - border-color: #1db5c9; } - .admonition.is-compat > .admonition-header { - background-color: #1db5c9; - color: #fff; } - .admonition.is-compat > .admonition-body { - color: rgba(0, 0, 0, 0.7); } - -.admonition-header { - color: #fff; - background-color: #363636; - align-items: center; - font-weight: 700; - justify-content: space-between; - line-height: 1.25; - padding: 0.5rem 0.75rem; - position: relative; } - .admonition-header:before { - font-family: "Font Awesome 5 Free"; - font-weight: 900; - margin-right: 0.75rem; - content: "\f06a"; } - -.admonition-body { - color: #222222; - padding: 0.5rem 0.75rem; } - .admonition-body pre { - background-color: whitesmoke; } - .admonition-body code { - background-color: rgba(0, 0, 0, 0.05); } - -.docstring { - margin-bottom: 1em; - background-color: transparent; - border: 1px solid #dbdbdb; - box-shadow: 2px 2px 3px rgba(10, 10, 10, 0.1); - max-width: 100%; } - .docstring > header { - display: flex; - flex-grow: 1; - align-items: stretch; - padding: 0.5rem 0.75rem; - background-color: whitesmoke; - box-shadow: 0 1px 2px rgba(10, 10, 10, 0.1); - box-shadow: none; - border-bottom: 1px solid #dbdbdb; } - .docstring > header code { - background-color: transparent; } - .docstring > header .docstring-binding { - margin-right: 0.3em; } - .docstring > header .docstring-category { - margin-left: 0.3em; } - .docstring > section { - position: relative; - padding: 0.75rem 0.75rem; - border-bottom: 1px solid #dbdbdb; } - .docstring > section:last-child { - border-bottom: none; } - .docstring > section > a.docs-sourcelink { - transition: opacity 0.3s; - opacity: 0; - position: absolute; - right: 0.375rem; - bottom: 0.375rem; } - .docstring > section > a.docs-sourcelink:focus { - opacity: 1 !important; } - .docstring:hover > section > a.docs-sourcelink { - opacity: 0.2; } - .docstring:focus-within > section > a.docs-sourcelink { - opacity: 0.2; } - .docstring > section:hover a.docs-sourcelink { - opacity: 1; } - -.documenter-example-output { - background-color: white; } - -.outdated-warning-overlay { - position: fixed; - top: 0; - left: 0; - right: 0; - box-shadow: 0 0 10px rgba(0, 0, 0, 0.3); - z-index: 999; - background-color: #ffaba7; - color: rgba(0, 0, 0, 0.7); - border-bottom: 3px solid #da0b00; - padding: 10px 35px; - text-align: center; - font-size: 15px; } - .outdated-warning-overlay .outdated-warning-closer { - position: absolute; - top: calc(50% - 10px); - right: 18px; - cursor: pointer; - width: 12px; } - .outdated-warning-overlay a { - color: #2e63b8; } - .outdated-warning-overlay a:hover { - color: #363636; } - -.content pre { - border: 1px solid #dbdbdb; } - -.content code { - font-weight: inherit; } - -.content a code { - color: #2e63b8; } - -.content h1 code, .content h2 code, .content h3 code, .content h4 code, .content h5 code, .content h6 code { - color: #222222; } - -.content table { - display: block; - width: initial; - max-width: 100%; - overflow-x: auto; } - -.content blockquote > ul:first-child, .content blockquote > ol:first-child, .content .admonition-body > ul:first-child, .content .admonition-body > ol:first-child { - margin-top: 0; } - -pre, code { - font-variant-ligatures: no-contextual; } - -.breadcrumb a.is-disabled { - cursor: default; - pointer-events: none; } - .breadcrumb a.is-disabled, .breadcrumb a.is-disabled:hover { - color: #222222; } - -.hljs { - background: initial !important; } - -.katex .katex-mathml { - top: 0; - right: 0; } - -.katex-display, mjx-container, .MathJax_Display { - margin: 0.5em 0 !important; } - -html { - -moz-osx-font-smoothing: auto; - -webkit-font-smoothing: auto; } - -li.no-marker { - list-style: none; } - -/* This file contain the overall layout. - * - * The main container is
that is identified by id #documenter. - */ -#documenter .docs-main > article { - overflow-wrap: break-word; } - #documenter .docs-main > article .math-container { - overflow-x: auto; - overflow-y: hidden; } - -@media screen and (min-width: 1056px) { - #documenter .docs-main { - max-width: 52rem; - margin-left: 20rem; - padding-right: 1rem; } } - -@media screen and (max-width: 1055px) { - #documenter .docs-main { - width: 100%; } - #documenter .docs-main > article { - max-width: 52rem; - margin-left: auto; - margin-right: auto; - margin-bottom: 1rem; - padding: 0 1rem; } - #documenter .docs-main > header, #documenter .docs-main > nav { - max-width: 100%; - width: 100%; - margin: 0; } } - -#documenter .docs-main header.docs-navbar { - background-color: white; - border-bottom: 1px solid #dbdbdb; - z-index: 2; - min-height: 4rem; - margin-bottom: 1rem; - display: flex; } - #documenter .docs-main header.docs-navbar .breadcrumb { - flex-grow: 1; } - #documenter .docs-main header.docs-navbar .docs-right { - display: flex; - white-space: nowrap; } - #documenter .docs-main header.docs-navbar .docs-right .docs-icon, #documenter .docs-main header.docs-navbar .docs-right .docs-label, #documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button { - display: inline-block; } - #documenter .docs-main header.docs-navbar .docs-right .docs-label { - padding: 0; - margin-left: 0.3em; } - #documenter .docs-main header.docs-navbar .docs-right .docs-settings-button { - margin: auto 0 auto 1rem; } - #documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button { - font-size: 1.5rem; - margin: auto 0 auto 1rem; } - #documenter .docs-main header.docs-navbar > * { - margin: auto 0; } - @media screen and (max-width: 1055px) { - #documenter .docs-main header.docs-navbar { - position: sticky; - top: 0; - padding: 0 1rem; - /* For Headroom.js */ - transition-property: top, box-shadow; - -webkit-transition-property: top, box-shadow; - /* Safari */ - transition-duration: 0.3s; - -webkit-transition-duration: 0.3s; - /* Safari */ } - #documenter .docs-main header.docs-navbar.headroom--not-top { - box-shadow: 0.2rem 0rem 0.4rem #bbb; - transition-duration: 0.7s; - -webkit-transition-duration: 0.7s; - /* Safari */ } - #documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom { - top: -4.5rem; - transition-duration: 0.7s; - -webkit-transition-duration: 0.7s; - /* Safari */ } } -#documenter .docs-main section.footnotes { - border-top: 1px solid #dbdbdb; } - #documenter .docs-main section.footnotes li .tag:first-child, #documenter .docs-main section.footnotes li .docstring > section > a.docs-sourcelink:first-child, #documenter .docs-main section.footnotes li .content kbd:first-child, .content #documenter .docs-main section.footnotes li kbd:first-child { - margin-right: 1em; - margin-bottom: 0.4em; } - -#documenter .docs-main .docs-footer { - display: flex; - flex-wrap: wrap; - margin-left: 0; - margin-right: 0; - border-top: 1px solid #dbdbdb; - padding-top: 1rem; - padding-bottom: 1rem; } - @media screen and (max-width: 1055px) { - #documenter .docs-main .docs-footer { - padding-left: 1rem; - padding-right: 1rem; } } - #documenter .docs-main .docs-footer .docs-footer-nextpage, #documenter .docs-main .docs-footer .docs-footer-prevpage { - flex-grow: 1; } - #documenter .docs-main .docs-footer .docs-footer-nextpage { - text-align: right; } - #documenter .docs-main .docs-footer .flexbox-break { - flex-basis: 100%; - height: 0; } - #documenter .docs-main .docs-footer .footer-message { - font-size: 0.8em; - margin: 0.5em auto 0 auto; - text-align: center; } - -#documenter .docs-sidebar { - display: flex; - flex-direction: column; - color: #0a0a0a; - background-color: whitesmoke; - border-right: 1px solid #dbdbdb; - padding: 0; - flex: 0 0 18rem; - z-index: 5; - font-size: 1rem; - position: fixed; - left: -18rem; - width: 18rem; - height: 100%; - transition: left 0.3s; - /* Setting up a nicer theme style for the scrollbar */ } - #documenter .docs-sidebar.visible { - left: 0; - box-shadow: 0.4rem 0rem 0.8rem #bbb; } - @media screen and (min-width: 1056px) { - #documenter .docs-sidebar.visible { - box-shadow: none; } } - @media screen and (min-width: 1056px) { - #documenter .docs-sidebar { - left: 0; - top: 0; } } - #documenter .docs-sidebar .docs-logo { - margin-top: 1rem; - padding: 0 1rem; } - #documenter .docs-sidebar .docs-logo > img { - max-height: 6rem; - margin: auto; } - #documenter .docs-sidebar .docs-package-name { - flex-shrink: 0; - font-size: 1.5rem; - font-weight: 700; - text-align: center; - white-space: nowrap; - overflow: hidden; - padding: 0.5rem 0; } - #documenter .docs-sidebar .docs-package-name .docs-autofit { - max-width: 16.2rem; } - #documenter .docs-sidebar .docs-package-name a, #documenter .docs-sidebar .docs-package-name a:hover { - color: #0a0a0a; } - #documenter .docs-sidebar .docs-version-selector { - border-top: 1px solid #dbdbdb; - display: none; - padding: 0.5rem; } - #documenter .docs-sidebar .docs-version-selector.visible { - display: flex; } - #documenter .docs-sidebar ul.docs-menu { - flex-grow: 1; - user-select: none; - border-top: 1px solid #dbdbdb; - padding-bottom: 1.5rem; - /* Managing collapsible submenus */ } - #documenter .docs-sidebar ul.docs-menu > li > .tocitem { - font-weight: bold; } - #documenter .docs-sidebar ul.docs-menu > li li { - font-size: 0.95rem; - margin-left: 1em; - border-left: 1px solid #dbdbdb; } - #documenter .docs-sidebar ul.docs-menu input.collapse-toggle { - display: none; } - #documenter .docs-sidebar ul.docs-menu ul.collapsed { - display: none; } - #documenter .docs-sidebar ul.docs-menu input:checked ~ ul.collapsed { - display: block; } - #documenter .docs-sidebar ul.docs-menu label.tocitem { - display: flex; } - #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label { - flex-grow: 2; } - #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron { - display: inline-block; - font-style: normal; - font-variant: normal; - text-rendering: auto; - line-height: 1; - font-size: 0.75rem; - margin-left: 1rem; - margin-top: auto; - margin-bottom: auto; } - #documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before { - font-family: "Font Awesome 5 Free"; - font-weight: 900; - content: "\f054"; } - #documenter .docs-sidebar ul.docs-menu input:checked ~ label.tocitem .docs-chevron::before { - content: "\f078"; } - #documenter .docs-sidebar ul.docs-menu .tocitem { - display: block; - padding: 0.5rem 0.5rem; } - #documenter .docs-sidebar ul.docs-menu .tocitem, #documenter .docs-sidebar ul.docs-menu .tocitem:hover { - color: #0a0a0a; - background: whitesmoke; } - #documenter .docs-sidebar ul.docs-menu a.tocitem:hover, #documenter .docs-sidebar ul.docs-menu label.tocitem:hover { - color: #0a0a0a; - background-color: #ebebeb; } - #documenter .docs-sidebar ul.docs-menu li.is-active { - border-top: 1px solid #dbdbdb; - border-bottom: 1px solid #dbdbdb; - background-color: white; } - #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem, #documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover { - background-color: white; - color: #0a0a0a; } - #documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover { - background-color: #ebebeb; - color: #0a0a0a; } - #documenter .docs-sidebar ul.docs-menu > li.is-active:first-child { - border-top: none; } - #documenter .docs-sidebar ul.docs-menu ul.internal { - margin: 0 0.5rem 0.5rem; - border-top: 1px solid #dbdbdb; } - #documenter .docs-sidebar ul.docs-menu ul.internal li { - font-size: 0.85rem; - border-left: none; - margin-left: 0; - margin-top: 0.5rem; } - #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem { - width: 100%; - padding: 0; } - #documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before { - content: "⚬"; - margin-right: 0.4em; } - #documenter .docs-sidebar form.docs-search { - margin: auto; - margin-top: 0.5rem; - margin-bottom: 0.5rem; } - #documenter .docs-sidebar form.docs-search > input { - width: 14.4rem; } - @media screen and (min-width: 1056px) { - #documenter .docs-sidebar ul.docs-menu { - overflow-y: auto; - -webkit-overflow-scroll: touch; } - #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar { - width: .3rem; - background: none; } - #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb { - border-radius: 5px 0px 0px 5px; - background: #e0e0e0; } - #documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover { - background: #cccccc; } } - @media screen and (max-width: 1055px) { - #documenter .docs-sidebar { - overflow-y: auto; - -webkit-overflow-scroll: touch; } - #documenter .docs-sidebar::-webkit-scrollbar { - width: .3rem; - background: none; } - #documenter .docs-sidebar::-webkit-scrollbar-thumb { - border-radius: 5px 0px 0px 5px; - background: #e0e0e0; } - #documenter .docs-sidebar::-webkit-scrollbar-thumb:hover { - background: #cccccc; } } -#documenter .docs-main #documenter-search-info { - margin-bottom: 1rem; } - -#documenter .docs-main #documenter-search-results { - list-style-type: circle; - list-style-position: outside; } - #documenter .docs-main #documenter-search-results li { - margin-left: 2rem; } - #documenter .docs-main #documenter-search-results .docs-highlight { - background-color: yellow; } - -.ansi span.sgr1 { - font-weight: bolder; } - -.ansi span.sgr2 { - font-weight: lighter; } - -.ansi span.sgr3 { - font-style: italic; } - -.ansi span.sgr4 { - text-decoration: underline; } - -.ansi span.sgr7 { - color: white; - background-color: #222222; } - -.ansi span.sgr8 { - color: transparent; } - .ansi span.sgr8 span { - color: transparent; } - -.ansi span.sgr9 { - text-decoration: line-through; } - -.ansi span.sgr30 { - color: #242424; } - -.ansi span.sgr31 { - color: #a7201f; } - -.ansi span.sgr32 { - color: #066f00; } - -.ansi span.sgr33 { - color: #856b00; } - -.ansi span.sgr34 { - color: #2149b0; } - -.ansi span.sgr35 { - color: #7d4498; } - -.ansi span.sgr36 { - color: #007989; } - -.ansi span.sgr37 { - color: gray; } - -.ansi span.sgr40 { - background-color: #242424; } - -.ansi span.sgr41 { - background-color: #a7201f; } - -.ansi span.sgr42 { - background-color: #066f00; } - -.ansi span.sgr43 { - background-color: #856b00; } - -.ansi span.sgr44 { - background-color: #2149b0; } - -.ansi span.sgr45 { - background-color: #7d4498; } - -.ansi span.sgr46 { - background-color: #007989; } - -.ansi span.sgr47 { - background-color: gray; } - -.ansi span.sgr90 { - color: #616161; } - -.ansi span.sgr91 { - color: #cb3c33; } - -.ansi span.sgr92 { - color: #0e8300; } - -.ansi span.sgr93 { - color: #a98800; } - -.ansi span.sgr94 { - color: #3c5dcd; } - -.ansi span.sgr95 { - color: #9256af; } - -.ansi span.sgr96 { - color: #008fa3; } - -.ansi span.sgr97 { - color: whitesmoke; } - -.ansi span.sgr100 { - background-color: #616161; } - -.ansi span.sgr101 { - background-color: #cb3c33; } - -.ansi span.sgr102 { - background-color: #0e8300; } - -.ansi span.sgr103 { - background-color: #a98800; } - -.ansi span.sgr104 { - background-color: #3c5dcd; } - -.ansi span.sgr105 { - background-color: #9256af; } - -.ansi span.sgr106 { - background-color: #008fa3; } - -.ansi span.sgr107 { - background-color: whitesmoke; } - -code.language-julia-repl > span.hljs-meta { - color: #066f00; - font-weight: bolder; } - -/*! +@keyframes spinAround{from{transform:rotate(0deg)}to{transform:rotate(359deg)}}.tabs,.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis,.breadcrumb,.file,.button,.is-unselectable,.modal-close,.delete{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.navbar-link:not(.is-arrowless)::after,.select:not(.is-multiple):not(.is-loading)::after{border:3px solid rgba(0,0,0,0);border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:0.625em;margin-top:-0.4375em;pointer-events:none;position:absolute;top:50%;transform:rotate(-45deg);transform-origin:center;width:0.625em}.admonition:not(:last-child),.tabs:not(:last-child),.message:not(:last-child),.list:not(:last-child),.level:not(:last-child),.breadcrumb:not(:last-child),.highlight:not(:last-child),.block:not(:last-child),.title:not(:last-child),.subtitle:not(:last-child),.table-container:not(:last-child),.table:not(:last-child),.progress:not(:last-child),.notification:not(:last-child),.content:not(:last-child),.box:not(:last-child){margin-bottom:1.5rem}.modal-close,.delete{-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,0.2);border:none;border-radius:290486px;cursor:pointer;pointer-events:auto;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:none;position:relative;vertical-align:top;width:20px}.modal-close::before,.delete::before,.modal-close::after,.delete::after{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.modal-close::before,.delete::before{height:2px;width:50%}.modal-close::after,.delete::after{height:50%;width:2px}.modal-close:hover,.delete:hover,.modal-close:focus,.delete:focus{background-color:rgba(10,10,10,0.3)}.modal-close:active,.delete:active{background-color:rgba(10,10,10,0.4)}.is-small.modal-close,#documenter .docs-sidebar form.docs-search>input.modal-close,.is-small.delete,#documenter .docs-sidebar form.docs-search>input.delete{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}.is-medium.modal-close,.is-medium.delete{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}.is-large.modal-close,.is-large.delete{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}.control.is-loading::after,.select.is-loading::after,.loader,.button.is-loading::after{animation:spinAround 500ms infinite linear;border:2px solid #dbdbdb;border-radius:290486px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}.hero-video,.modal-background,.modal,.image.is-square img,#documenter .docs-sidebar .docs-logo>img.is-square img,.image.is-square .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,.image.is-1by1 img,#documenter .docs-sidebar .docs-logo>img.is-1by1 img,.image.is-1by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,.image.is-5by4 img,#documenter .docs-sidebar .docs-logo>img.is-5by4 img,.image.is-5by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,.image.is-4by3 img,#documenter .docs-sidebar .docs-logo>img.is-4by3 img,.image.is-4by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,.image.is-3by2 img,#documenter .docs-sidebar .docs-logo>img.is-3by2 img,.image.is-3by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,.image.is-5by3 img,#documenter .docs-sidebar .docs-logo>img.is-5by3 img,.image.is-5by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,.image.is-16by9 img,#documenter .docs-sidebar .docs-logo>img.is-16by9 img,.image.is-16by9 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,.image.is-2by1 img,#documenter .docs-sidebar .docs-logo>img.is-2by1 img,.image.is-2by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,.image.is-3by1 img,#documenter .docs-sidebar .docs-logo>img.is-3by1 img,.image.is-3by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,.image.is-4by5 img,#documenter .docs-sidebar .docs-logo>img.is-4by5 img,.image.is-4by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,.image.is-3by4 img,#documenter .docs-sidebar .docs-logo>img.is-3by4 img,.image.is-3by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,.image.is-2by3 img,#documenter .docs-sidebar .docs-logo>img.is-2by3 img,.image.is-2by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,.image.is-3by5 img,#documenter .docs-sidebar .docs-logo>img.is-3by5 img,.image.is-3by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,.image.is-9by16 img,#documenter .docs-sidebar .docs-logo>img.is-9by16 img,.image.is-9by16 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,.image.is-1by2 img,#documenter .docs-sidebar .docs-logo>img.is-1by2 img,.image.is-1by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,.image.is-1by3 img,#documenter .docs-sidebar .docs-logo>img.is-1by3 img,.image.is-1by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio,.is-overlay{bottom:0;left:0;position:absolute;right:0;top:0}.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis,.file-cta,.file-name,.select select,.textarea,.input,#documenter .docs-sidebar form.docs-search>input,.button{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:4px;box-shadow:none;display:inline-flex;font-size:1rem;height:2.25em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(0.375em - 1px);padding-left:calc(0.625em - 1px);padding-right:calc(0.625em - 1px);padding-top:calc(0.375em - 1px);position:relative;vertical-align:top}.pagination-previous:focus,.pagination-next:focus,.pagination-link:focus,.pagination-ellipsis:focus,.file-cta:focus,.file-name:focus,.select select:focus,.textarea:focus,.input:focus,#documenter .docs-sidebar form.docs-search>input:focus,.button:focus,.is-focused.pagination-previous,.is-focused.pagination-next,.is-focused.pagination-link,.is-focused.pagination-ellipsis,.is-focused.file-cta,.is-focused.file-name,.select select.is-focused,.is-focused.textarea,.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-focused.button,.pagination-previous:active,.pagination-next:active,.pagination-link:active,.pagination-ellipsis:active,.file-cta:active,.file-name:active,.select select:active,.textarea:active,.input:active,#documenter .docs-sidebar form.docs-search>input:active,.button:active,.is-active.pagination-previous,.is-active.pagination-next,.is-active.pagination-link,.is-active.pagination-ellipsis,.is-active.file-cta,.is-active.file-name,.select select.is-active,.is-active.textarea,.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.is-active.button{outline:none}.pagination-previous[disabled],.pagination-next[disabled],.pagination-link[disabled],.pagination-ellipsis[disabled],.file-cta[disabled],.file-name[disabled],.select select[disabled],.textarea[disabled],.input[disabled],#documenter .docs-sidebar form.docs-search>input[disabled],.button[disabled],fieldset[disabled] .pagination-previous,fieldset[disabled] .pagination-next,fieldset[disabled] .pagination-link,fieldset[disabled] .pagination-ellipsis,fieldset[disabled] .file-cta,fieldset[disabled] .file-name,fieldset[disabled] .select select,.select fieldset[disabled] select,fieldset[disabled] .textarea,fieldset[disabled] .input,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input,fieldset[disabled] .button{cursor:not-allowed}/*! minireset.css v0.0.4 | MIT License | github.com/jgthms/minireset.css */html,body,p,ol,ul,li,dl,dt,dd,blockquote,figure,fieldset,legend,textarea,pre,iframe,hr,h1,h2,h3,h4,h5,h6{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,*::before,*::after{box-sizing:inherit}img,embed,iframe,object,video{height:auto;max-width:100%}audio{max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}td:not([align]),th:not([align]){text-align:left}html{background-color:#fff;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:auto;overflow-y:scroll;text-rendering:optimizeLegibility;text-size-adjust:100%}article,aside,figure,footer,header,hgroup,section{display:block}body,button,input,select,textarea{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace}body{color:#222;font-size:1em;font-weight:400;line-height:1.5}a{color:#2e63b8;cursor:pointer;text-decoration:none}a strong{color:currentColor}a:hover{color:#363636}code{background-color:rgba(0,0,0,0.05);color:#000;font-size:.875em;font-weight:normal;padding:.1em}hr{background-color:#f5f5f5;border:none;display:block;height:2px;margin:1.5rem 0}img{height:auto;max-width:100%}input[type="checkbox"],input[type="radio"]{vertical-align:baseline}small{font-size:.875em}span{font-style:inherit;font-weight:inherit}strong{color:#222;font-weight:700}fieldset{border:none}pre{-webkit-overflow-scrolling:touch;background-color:#f5f5f5;color:#222;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}table td,table th{vertical-align:top}table td:not([align]),table th:not([align]){text-align:left}table th{color:#222}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left !important}.is-pulled-right{float:right !important}.is-clipped{overflow:hidden !important}.is-size-1{font-size:3rem !important}.is-size-2{font-size:2.5rem !important}.is-size-3{font-size:2rem !important}.is-size-4{font-size:1.5rem !important}.is-size-5{font-size:1.25rem !important}.is-size-6{font-size:1rem !important}.is-size-7,.docstring>section>a.docs-sourcelink{font-size:.75rem !important}@media screen and (max-width: 768px){.is-size-1-mobile{font-size:3rem !important}.is-size-2-mobile{font-size:2.5rem !important}.is-size-3-mobile{font-size:2rem !important}.is-size-4-mobile{font-size:1.5rem !important}.is-size-5-mobile{font-size:1.25rem !important}.is-size-6-mobile{font-size:1rem !important}.is-size-7-mobile{font-size:.75rem !important}}@media screen and (min-width: 769px),print{.is-size-1-tablet{font-size:3rem !important}.is-size-2-tablet{font-size:2.5rem !important}.is-size-3-tablet{font-size:2rem !important}.is-size-4-tablet{font-size:1.5rem !important}.is-size-5-tablet{font-size:1.25rem !important}.is-size-6-tablet{font-size:1rem !important}.is-size-7-tablet{font-size:.75rem !important}}@media screen and (max-width: 1055px){.is-size-1-touch{font-size:3rem !important}.is-size-2-touch{font-size:2.5rem !important}.is-size-3-touch{font-size:2rem !important}.is-size-4-touch{font-size:1.5rem !important}.is-size-5-touch{font-size:1.25rem !important}.is-size-6-touch{font-size:1rem !important}.is-size-7-touch{font-size:.75rem !important}}@media screen and (min-width: 1056px){.is-size-1-desktop{font-size:3rem !important}.is-size-2-desktop{font-size:2.5rem !important}.is-size-3-desktop{font-size:2rem !important}.is-size-4-desktop{font-size:1.5rem !important}.is-size-5-desktop{font-size:1.25rem !important}.is-size-6-desktop{font-size:1rem !important}.is-size-7-desktop{font-size:.75rem !important}}@media screen and (min-width: 1216px){.is-size-1-widescreen{font-size:3rem !important}.is-size-2-widescreen{font-size:2.5rem !important}.is-size-3-widescreen{font-size:2rem !important}.is-size-4-widescreen{font-size:1.5rem !important}.is-size-5-widescreen{font-size:1.25rem !important}.is-size-6-widescreen{font-size:1rem !important}.is-size-7-widescreen{font-size:.75rem !important}}@media screen and (min-width: 1408px){.is-size-1-fullhd{font-size:3rem !important}.is-size-2-fullhd{font-size:2.5rem !important}.is-size-3-fullhd{font-size:2rem !important}.is-size-4-fullhd{font-size:1.5rem !important}.is-size-5-fullhd{font-size:1.25rem !important}.is-size-6-fullhd{font-size:1rem !important}.is-size-7-fullhd{font-size:.75rem !important}}.has-text-centered{text-align:center !important}.has-text-justified{text-align:justify !important}.has-text-left{text-align:left !important}.has-text-right{text-align:right !important}@media screen and (max-width: 768px){.has-text-centered-mobile{text-align:center !important}}@media screen and (min-width: 769px),print{.has-text-centered-tablet{text-align:center !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-centered-tablet-only{text-align:center !important}}@media screen and (max-width: 1055px){.has-text-centered-touch{text-align:center !important}}@media screen and (min-width: 1056px){.has-text-centered-desktop{text-align:center !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-centered-desktop-only{text-align:center !important}}@media screen and (min-width: 1216px){.has-text-centered-widescreen{text-align:center !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-centered-widescreen-only{text-align:center !important}}@media screen and (min-width: 1408px){.has-text-centered-fullhd{text-align:center !important}}@media screen and (max-width: 768px){.has-text-justified-mobile{text-align:justify !important}}@media screen and (min-width: 769px),print{.has-text-justified-tablet{text-align:justify !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-justified-tablet-only{text-align:justify !important}}@media screen and (max-width: 1055px){.has-text-justified-touch{text-align:justify !important}}@media screen and (min-width: 1056px){.has-text-justified-desktop{text-align:justify !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-justified-desktop-only{text-align:justify !important}}@media screen and (min-width: 1216px){.has-text-justified-widescreen{text-align:justify !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-justified-widescreen-only{text-align:justify !important}}@media screen and (min-width: 1408px){.has-text-justified-fullhd{text-align:justify !important}}@media screen and (max-width: 768px){.has-text-left-mobile{text-align:left !important}}@media screen and (min-width: 769px),print{.has-text-left-tablet{text-align:left !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-left-tablet-only{text-align:left !important}}@media screen and (max-width: 1055px){.has-text-left-touch{text-align:left !important}}@media screen and (min-width: 1056px){.has-text-left-desktop{text-align:left !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-left-desktop-only{text-align:left !important}}@media screen and (min-width: 1216px){.has-text-left-widescreen{text-align:left !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-left-widescreen-only{text-align:left !important}}@media screen and (min-width: 1408px){.has-text-left-fullhd{text-align:left !important}}@media screen and (max-width: 768px){.has-text-right-mobile{text-align:right !important}}@media screen and (min-width: 769px),print{.has-text-right-tablet{text-align:right !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.has-text-right-tablet-only{text-align:right !important}}@media screen and (max-width: 1055px){.has-text-right-touch{text-align:right !important}}@media screen and (min-width: 1056px){.has-text-right-desktop{text-align:right !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.has-text-right-desktop-only{text-align:right !important}}@media screen and (min-width: 1216px){.has-text-right-widescreen{text-align:right !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.has-text-right-widescreen-only{text-align:right !important}}@media screen and (min-width: 1408px){.has-text-right-fullhd{text-align:right !important}}.is-capitalized{text-transform:capitalize !important}.is-lowercase{text-transform:lowercase !important}.is-uppercase{text-transform:uppercase !important}.is-italic{font-style:italic !important}.has-text-white{color:#fff !important}a.has-text-white:hover,a.has-text-white:focus{color:#e6e6e6 !important}.has-background-white{background-color:#fff !important}.has-text-black{color:#0a0a0a !important}a.has-text-black:hover,a.has-text-black:focus{color:#000 !important}.has-background-black{background-color:#0a0a0a !important}.has-text-light{color:#f5f5f5 !important}a.has-text-light:hover,a.has-text-light:focus{color:#dbdbdb !important}.has-background-light{background-color:#f5f5f5 !important}.has-text-dark{color:#363636 !important}a.has-text-dark:hover,a.has-text-dark:focus{color:#1c1c1c !important}.has-background-dark{background-color:#363636 !important}.has-text-primary{color:#4eb5de !important}a.has-text-primary:hover,a.has-text-primary:focus{color:#27a1d2 !important}.has-background-primary{background-color:#4eb5de !important}.has-text-link{color:#2e63b8 !important}a.has-text-link:hover,a.has-text-link:focus{color:#244d8f !important}.has-background-link{background-color:#2e63b8 !important}.has-text-info{color:#209cee !important}a.has-text-info:hover,a.has-text-info:focus{color:#1081cb !important}.has-background-info{background-color:#209cee !important}.has-text-success{color:#22c35b !important}a.has-text-success:hover,a.has-text-success:focus{color:#1a9847 !important}.has-background-success{background-color:#22c35b !important}.has-text-warning{color:#ffdd57 !important}a.has-text-warning:hover,a.has-text-warning:focus{color:#ffd324 !important}.has-background-warning{background-color:#ffdd57 !important}.has-text-danger{color:#da0b00 !important}a.has-text-danger:hover,a.has-text-danger:focus{color:#a70800 !important}.has-background-danger{background-color:#da0b00 !important}.has-text-black-bis{color:#121212 !important}.has-background-black-bis{background-color:#121212 !important}.has-text-black-ter{color:#242424 !important}.has-background-black-ter{background-color:#242424 !important}.has-text-grey-darker{color:#363636 !important}.has-background-grey-darker{background-color:#363636 !important}.has-text-grey-dark{color:#4a4a4a !important}.has-background-grey-dark{background-color:#4a4a4a !important}.has-text-grey{color:#6b6b6b !important}.has-background-grey{background-color:#6b6b6b !important}.has-text-grey-light{color:#b5b5b5 !important}.has-background-grey-light{background-color:#b5b5b5 !important}.has-text-grey-lighter{color:#dbdbdb !important}.has-background-grey-lighter{background-color:#dbdbdb !important}.has-text-white-ter{color:#f5f5f5 !important}.has-background-white-ter{background-color:#f5f5f5 !important}.has-text-white-bis{color:#fafafa !important}.has-background-white-bis{background-color:#fafafa !important}.has-text-weight-light{font-weight:300 !important}.has-text-weight-normal{font-weight:400 !important}.has-text-weight-medium{font-weight:500 !important}.has-text-weight-semibold{font-weight:600 !important}.has-text-weight-bold{font-weight:700 !important}.is-family-primary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-secondary{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-sans-serif{font-family:"Lato Medium",-apple-system,BlinkMacSystemFont,"Segoe UI","Helvetica Neue","Helvetica","Arial",sans-serif !important}.is-family-monospace{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-family-code{font-family:"JuliaMono","SFMono-Regular","Menlo","Consolas","Liberation Mono","DejaVu Sans Mono",monospace !important}.is-block{display:block !important}@media screen and (max-width: 768px){.is-block-mobile{display:block !important}}@media screen and (min-width: 769px),print{.is-block-tablet{display:block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-block-tablet-only{display:block !important}}@media screen and (max-width: 1055px){.is-block-touch{display:block !important}}@media screen and (min-width: 1056px){.is-block-desktop{display:block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-block-desktop-only{display:block !important}}@media screen and (min-width: 1216px){.is-block-widescreen{display:block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-block-widescreen-only{display:block !important}}@media screen and (min-width: 1408px){.is-block-fullhd{display:block !important}}.is-flex{display:flex !important}@media screen and (max-width: 768px){.is-flex-mobile{display:flex !important}}@media screen and (min-width: 769px),print{.is-flex-tablet{display:flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-flex-tablet-only{display:flex !important}}@media screen and (max-width: 1055px){.is-flex-touch{display:flex !important}}@media screen and (min-width: 1056px){.is-flex-desktop{display:flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-flex-desktop-only{display:flex !important}}@media screen and (min-width: 1216px){.is-flex-widescreen{display:flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-flex-widescreen-only{display:flex !important}}@media screen and (min-width: 1408px){.is-flex-fullhd{display:flex !important}}.is-inline{display:inline !important}@media screen and (max-width: 768px){.is-inline-mobile{display:inline !important}}@media screen and (min-width: 769px),print{.is-inline-tablet{display:inline !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-tablet-only{display:inline !important}}@media screen and (max-width: 1055px){.is-inline-touch{display:inline !important}}@media screen and (min-width: 1056px){.is-inline-desktop{display:inline !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-desktop-only{display:inline !important}}@media screen and (min-width: 1216px){.is-inline-widescreen{display:inline !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-widescreen-only{display:inline !important}}@media screen and (min-width: 1408px){.is-inline-fullhd{display:inline !important}}.is-inline-block{display:inline-block !important}@media screen and (max-width: 768px){.is-inline-block-mobile{display:inline-block !important}}@media screen and (min-width: 769px),print{.is-inline-block-tablet{display:inline-block !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-block-tablet-only{display:inline-block !important}}@media screen and (max-width: 1055px){.is-inline-block-touch{display:inline-block !important}}@media screen and (min-width: 1056px){.is-inline-block-desktop{display:inline-block !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-block-desktop-only{display:inline-block !important}}@media screen and (min-width: 1216px){.is-inline-block-widescreen{display:inline-block !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-block-widescreen-only{display:inline-block !important}}@media screen and (min-width: 1408px){.is-inline-block-fullhd{display:inline-block !important}}.is-inline-flex{display:inline-flex !important}@media screen and (max-width: 768px){.is-inline-flex-mobile{display:inline-flex !important}}@media screen and (min-width: 769px),print{.is-inline-flex-tablet{display:inline-flex !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-inline-flex-tablet-only{display:inline-flex !important}}@media screen and (max-width: 1055px){.is-inline-flex-touch{display:inline-flex !important}}@media screen and (min-width: 1056px){.is-inline-flex-desktop{display:inline-flex !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-inline-flex-desktop-only{display:inline-flex !important}}@media screen and (min-width: 1216px){.is-inline-flex-widescreen{display:inline-flex !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-inline-flex-widescreen-only{display:inline-flex !important}}@media screen and (min-width: 1408px){.is-inline-flex-fullhd{display:inline-flex !important}}.is-hidden{display:none !important}.is-sr-only{border:none !important;clip:rect(0, 0, 0, 0) !important;height:0.01em !important;overflow:hidden !important;padding:0 !important;position:absolute !important;white-space:nowrap !important;width:0.01em !important}@media screen and (max-width: 768px){.is-hidden-mobile{display:none !important}}@media screen and (min-width: 769px),print{.is-hidden-tablet{display:none !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-hidden-tablet-only{display:none !important}}@media screen and (max-width: 1055px){.is-hidden-touch{display:none !important}}@media screen and (min-width: 1056px){.is-hidden-desktop{display:none !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-hidden-desktop-only{display:none !important}}@media screen and (min-width: 1216px){.is-hidden-widescreen{display:none !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-hidden-widescreen-only{display:none !important}}@media screen and (min-width: 1408px){.is-hidden-fullhd{display:none !important}}.is-invisible{visibility:hidden !important}@media screen and (max-width: 768px){.is-invisible-mobile{visibility:hidden !important}}@media screen and (min-width: 769px),print{.is-invisible-tablet{visibility:hidden !important}}@media screen and (min-width: 769px) and (max-width: 1055px){.is-invisible-tablet-only{visibility:hidden !important}}@media screen and (max-width: 1055px){.is-invisible-touch{visibility:hidden !important}}@media screen and (min-width: 1056px){.is-invisible-desktop{visibility:hidden !important}}@media screen and (min-width: 1056px) and (max-width: 1215px){.is-invisible-desktop-only{visibility:hidden !important}}@media screen and (min-width: 1216px){.is-invisible-widescreen{visibility:hidden !important}}@media screen and (min-width: 1216px) and (max-width: 1407px){.is-invisible-widescreen-only{visibility:hidden !important}}@media screen and (min-width: 1408px){.is-invisible-fullhd{visibility:hidden !important}}.is-marginless{margin:0 !important}.is-paddingless{padding:0 !important}.is-radiusless{border-radius:0 !important}.is-shadowless{box-shadow:none !important}.is-relative{position:relative !important}.box{background-color:#fff;border-radius:6px;box-shadow:0 2px 3px rgba(10,10,10,0.1),0 0 0 1px rgba(10,10,10,0.1);color:#222;display:block;padding:1.25rem}a.box:hover,a.box:focus{box-shadow:0 2px 3px rgba(10,10,10,0.1),0 0 0 1px #2e63b8}a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2),0 0 0 1px #2e63b8}.button{background-color:#fff;border-color:#dbdbdb;border-width:1px;color:#363636;cursor:pointer;justify-content:center;padding-bottom:calc(0.375em - 1px);padding-left:.75em;padding-right:.75em;padding-top:calc(0.375em - 1px);text-align:center;white-space:nowrap}.button strong{color:inherit}.button .icon,.button .icon.is-small,.button #documenter .docs-sidebar form.docs-search>input.icon,#documenter .docs-sidebar .button form.docs-search>input.icon,.button .icon.is-medium,.button .icon.is-large{height:1.5em;width:1.5em}.button .icon:first-child:not(:last-child){margin-left:calc(-0.375em - 1px);margin-right:0.1875em}.button .icon:last-child:not(:first-child){margin-left:0.1875em;margin-right:calc(-0.375em - 1px)}.button .icon:first-child:last-child{margin-left:calc(-0.375em - 1px);margin-right:calc(-0.375em - 1px)}.button:hover,.button.is-hovered{border-color:#b5b5b5;color:#363636}.button:focus,.button.is-focused{border-color:#3c5dcd;color:#363636}.button:focus:not(:active),.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.button:active,.button.is-active{border-color:#4a4a4a;color:#363636}.button.is-text{background-color:transparent;border-color:transparent;color:#222;text-decoration:underline}.button.is-text:hover,.button.is-text.is-hovered,.button.is-text:focus,.button.is-text.is-focused{background-color:#f5f5f5;color:#222}.button.is-text:active,.button.is-text.is-active{background-color:#e8e8e8;color:#222}.button.is-text[disabled],fieldset[disabled] .button.is-text{background-color:transparent;border-color:transparent;box-shadow:none}.button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}.button.is-white:hover,.button.is-white.is-hovered{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.button.is-white:focus,.button.is-white.is-focused{border-color:transparent;color:#0a0a0a}.button.is-white:focus:not(:active),.button.is-white.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.button.is-white:active,.button.is-white.is-active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.button.is-white[disabled],fieldset[disabled] .button.is-white{background-color:#fff;border-color:transparent;box-shadow:none}.button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted:hover,.button.is-white.is-inverted.is-hovered{background-color:#000}.button.is-white.is-inverted[disabled],fieldset[disabled] .button.is-white.is-inverted{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}.button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-white.is-outlined:hover,.button.is-white.is-outlined.is-hovered,.button.is-white.is-outlined:focus,.button.is-white.is-outlined.is-focused{background-color:#fff;border-color:#fff;color:#0a0a0a}.button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-white.is-outlined.is-loading:hover::after,.button.is-white.is-outlined.is-loading.is-hovered::after,.button.is-white.is-outlined.is-loading:focus::after,.button.is-white.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-white.is-outlined[disabled],fieldset[disabled] .button.is-white.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-white.is-inverted.is-outlined:hover,.button.is-white.is-inverted.is-outlined.is-hovered,.button.is-white.is-inverted.is-outlined:focus,.button.is-white.is-inverted.is-outlined.is-focused{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-outlined.is-loading:hover::after,.button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-white.is-inverted.is-outlined.is-loading:focus::after,.button.is-white.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-white.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}.button.is-black:hover,.button.is-black.is-hovered{background-color:#040404;border-color:transparent;color:#fff}.button.is-black:focus,.button.is-black.is-focused{border-color:transparent;color:#fff}.button.is-black:focus:not(:active),.button.is-black.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.button.is-black:active,.button.is-black.is-active{background-color:#000;border-color:transparent;color:#fff}.button.is-black[disabled],fieldset[disabled] .button.is-black{background-color:#0a0a0a;border-color:transparent;box-shadow:none}.button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted:hover,.button.is-black.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-black.is-inverted[disabled],fieldset[disabled] .button.is-black.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}.button.is-black.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-black.is-outlined:hover,.button.is-black.is-outlined.is-hovered,.button.is-black.is-outlined:focus,.button.is-black.is-outlined.is-focused{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-black.is-outlined.is-loading:hover::after,.button.is-black.is-outlined.is-loading.is-hovered::after,.button.is-black.is-outlined.is-loading:focus::after,.button.is-black.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-black.is-outlined[disabled],fieldset[disabled] .button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-black.is-inverted.is-outlined:hover,.button.is-black.is-inverted.is-outlined.is-hovered,.button.is-black.is-inverted.is-outlined:focus,.button.is-black.is-inverted.is-outlined.is-focused{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-outlined.is-loading:hover::after,.button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-black.is-inverted.is-outlined.is-loading:focus::after,.button.is-black.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #0a0a0a #0a0a0a !important}.button.is-black.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-light{background-color:#f5f5f5;border-color:transparent;color:#363636}.button.is-light:hover,.button.is-light.is-hovered{background-color:#eee;border-color:transparent;color:#363636}.button.is-light:focus,.button.is-light.is-focused{border-color:transparent;color:#363636}.button.is-light:focus:not(:active),.button.is-light.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.button.is-light:active,.button.is-light.is-active{background-color:#e8e8e8;border-color:transparent;color:#363636}.button.is-light[disabled],fieldset[disabled] .button.is-light{background-color:#f5f5f5;border-color:transparent;box-shadow:none}.button.is-light.is-inverted{background-color:#363636;color:#f5f5f5}.button.is-light.is-inverted:hover,.button.is-light.is-inverted.is-hovered{background-color:#292929}.button.is-light.is-inverted[disabled],fieldset[disabled] .button.is-light.is-inverted{background-color:#363636;border-color:transparent;box-shadow:none;color:#f5f5f5}.button.is-light.is-loading::after{border-color:transparent transparent #363636 #363636 !important}.button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-light.is-outlined:hover,.button.is-light.is-outlined.is-hovered,.button.is-light.is-outlined:focus,.button.is-light.is-outlined.is-focused{background-color:#f5f5f5;border-color:#f5f5f5;color:#363636}.button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-light.is-outlined.is-loading:hover::after,.button.is-light.is-outlined.is-loading.is-hovered::after,.button.is-light.is-outlined.is-loading:focus::after,.button.is-light.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #363636 #363636 !important}.button.is-light.is-outlined[disabled],fieldset[disabled] .button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;box-shadow:none;color:#f5f5f5}.button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-light.is-inverted.is-outlined:hover,.button.is-light.is-inverted.is-outlined.is-hovered,.button.is-light.is-inverted.is-outlined:focus,.button.is-light.is-inverted.is-outlined.is-focused{background-color:#363636;color:#f5f5f5}.button.is-light.is-inverted.is-outlined.is-loading:hover::after,.button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-light.is-inverted.is-outlined.is-loading:focus::after,.button.is-light.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-light.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:#363636;box-shadow:none;color:#363636}.button.is-dark,.content kbd.button{background-color:#363636;border-color:transparent;color:#f5f5f5}.button.is-dark:hover,.content kbd.button:hover,.button.is-dark.is-hovered,.content kbd.button.is-hovered{background-color:#2f2f2f;border-color:transparent;color:#f5f5f5}.button.is-dark:focus,.content kbd.button:focus,.button.is-dark.is-focused,.content kbd.button.is-focused{border-color:transparent;color:#f5f5f5}.button.is-dark:focus:not(:active),.content kbd.button:focus:not(:active),.button.is-dark.is-focused:not(:active),.content kbd.button.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.button.is-dark:active,.content kbd.button:active,.button.is-dark.is-active,.content kbd.button.is-active{background-color:#292929;border-color:transparent;color:#f5f5f5}.button.is-dark[disabled],.content kbd.button[disabled],fieldset[disabled] .button.is-dark,fieldset[disabled] .content kbd.button,.content fieldset[disabled] kbd.button{background-color:#363636;border-color:transparent;box-shadow:none}.button.is-dark.is-inverted,.content kbd.button.is-inverted{background-color:#f5f5f5;color:#363636}.button.is-dark.is-inverted:hover,.content kbd.button.is-inverted:hover,.button.is-dark.is-inverted.is-hovered,.content kbd.button.is-inverted.is-hovered{background-color:#e8e8e8}.button.is-dark.is-inverted[disabled],.content kbd.button.is-inverted[disabled],fieldset[disabled] .button.is-dark.is-inverted,fieldset[disabled] .content kbd.button.is-inverted,.content fieldset[disabled] kbd.button.is-inverted{background-color:#f5f5f5;border-color:transparent;box-shadow:none;color:#363636}.button.is-dark.is-loading::after,.content kbd.button.is-loading::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-dark.is-outlined,.content kbd.button.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-dark.is-outlined:hover,.content kbd.button.is-outlined:hover,.button.is-dark.is-outlined.is-hovered,.content kbd.button.is-outlined.is-hovered,.button.is-dark.is-outlined:focus,.content kbd.button.is-outlined:focus,.button.is-dark.is-outlined.is-focused,.content kbd.button.is-outlined.is-focused{background-color:#363636;border-color:#363636;color:#f5f5f5}.button.is-dark.is-outlined.is-loading::after,.content kbd.button.is-outlined.is-loading::after{border-color:transparent transparent #363636 #363636 !important}.button.is-dark.is-outlined.is-loading:hover::after,.content kbd.button.is-outlined.is-loading:hover::after,.button.is-dark.is-outlined.is-loading.is-hovered::after,.content kbd.button.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-outlined.is-loading:focus::after,.content kbd.button.is-outlined.is-loading:focus::after,.button.is-dark.is-outlined.is-loading.is-focused::after,.content kbd.button.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #f5f5f5 #f5f5f5 !important}.button.is-dark.is-outlined[disabled],.content kbd.button.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-outlined,fieldset[disabled] .content kbd.button.is-outlined,.content fieldset[disabled] kbd.button.is-outlined{background-color:transparent;border-color:#363636;box-shadow:none;color:#363636}.button.is-dark.is-inverted.is-outlined,.content kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-dark.is-inverted.is-outlined:hover,.content kbd.button.is-inverted.is-outlined:hover,.button.is-dark.is-inverted.is-outlined.is-hovered,.content kbd.button.is-inverted.is-outlined.is-hovered,.button.is-dark.is-inverted.is-outlined:focus,.content kbd.button.is-inverted.is-outlined:focus,.button.is-dark.is-inverted.is-outlined.is-focused,.content kbd.button.is-inverted.is-outlined.is-focused{background-color:#f5f5f5;color:#363636}.button.is-dark.is-inverted.is-outlined.is-loading:hover::after,.content kbd.button.is-inverted.is-outlined.is-loading:hover::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after,.content kbd.button.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-dark.is-inverted.is-outlined.is-loading:focus::after,.content kbd.button.is-inverted.is-outlined.is-loading:focus::after,.button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after,.content kbd.button.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #363636 #363636 !important}.button.is-dark.is-inverted.is-outlined[disabled],.content kbd.button.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-dark.is-inverted.is-outlined,fieldset[disabled] .content kbd.button.is-inverted.is-outlined,.content fieldset[disabled] kbd.button.is-inverted.is-outlined{background-color:transparent;border-color:#f5f5f5;box-shadow:none;color:#f5f5f5}.button.is-primary,.docstring>section>a.button.docs-sourcelink{background-color:#4eb5de;border-color:transparent;color:#fff}.button.is-primary:hover,.docstring>section>a.button.docs-sourcelink:hover,.button.is-primary.is-hovered,.docstring>section>a.button.is-hovered.docs-sourcelink{background-color:#43b1dc;border-color:transparent;color:#fff}.button.is-primary:focus,.docstring>section>a.button.docs-sourcelink:focus,.button.is-primary.is-focused,.docstring>section>a.button.is-focused.docs-sourcelink{border-color:transparent;color:#fff}.button.is-primary:focus:not(:active),.docstring>section>a.button.docs-sourcelink:focus:not(:active),.button.is-primary.is-focused:not(:active),.docstring>section>a.button.is-focused.docs-sourcelink:not(:active){box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.button.is-primary:active,.docstring>section>a.button.docs-sourcelink:active,.button.is-primary.is-active,.docstring>section>a.button.is-active.docs-sourcelink{background-color:#39acda;border-color:transparent;color:#fff}.button.is-primary[disabled],.docstring>section>a.button.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary,fieldset[disabled] .docstring>section>a.button.docs-sourcelink{background-color:#4eb5de;border-color:transparent;box-shadow:none}.button.is-primary.is-inverted,.docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;color:#4eb5de}.button.is-primary.is-inverted:hover,.docstring>section>a.button.is-inverted.docs-sourcelink:hover,.button.is-primary.is-inverted.is-hovered,.docstring>section>a.button.is-inverted.is-hovered.docs-sourcelink{background-color:#f2f2f2}.button.is-primary.is-inverted[disabled],.docstring>section>a.button.is-inverted.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-inverted,fieldset[disabled] .docstring>section>a.button.is-inverted.docs-sourcelink{background-color:#fff;border-color:transparent;box-shadow:none;color:#4eb5de}.button.is-primary.is-loading::after,.docstring>section>a.button.is-loading.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}.button.is-primary.is-outlined,.docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#4eb5de;color:#4eb5de}.button.is-primary.is-outlined:hover,.docstring>section>a.button.is-outlined.docs-sourcelink:hover,.button.is-primary.is-outlined.is-hovered,.docstring>section>a.button.is-outlined.is-hovered.docs-sourcelink,.button.is-primary.is-outlined:focus,.docstring>section>a.button.is-outlined.docs-sourcelink:focus,.button.is-primary.is-outlined.is-focused,.docstring>section>a.button.is-outlined.is-focused.docs-sourcelink{background-color:#4eb5de;border-color:#4eb5de;color:#fff}.button.is-primary.is-outlined.is-loading::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink::after{border-color:transparent transparent #4eb5de #4eb5de !important}.button.is-primary.is-outlined.is-loading:hover::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:hover::after,.button.is-primary.is-outlined.is-loading.is-hovered::after,.docstring>section>a.button.is-outlined.is-loading.is-hovered.docs-sourcelink::after,.button.is-primary.is-outlined.is-loading:focus::after,.docstring>section>a.button.is-outlined.is-loading.docs-sourcelink:focus::after,.button.is-primary.is-outlined.is-loading.is-focused::after,.docstring>section>a.button.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #fff #fff !important}.button.is-primary.is-outlined[disabled],.docstring>section>a.button.is-outlined.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-outlined,fieldset[disabled] .docstring>section>a.button.is-outlined.docs-sourcelink{background-color:transparent;border-color:#4eb5de;box-shadow:none;color:#4eb5de}.button.is-primary.is-inverted.is-outlined,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;color:#fff}.button.is-primary.is-inverted.is-outlined:hover,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:hover,.button.is-primary.is-inverted.is-outlined.is-hovered,.docstring>section>a.button.is-inverted.is-outlined.is-hovered.docs-sourcelink,.button.is-primary.is-inverted.is-outlined:focus,.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink:focus,.button.is-primary.is-inverted.is-outlined.is-focused,.docstring>section>a.button.is-inverted.is-outlined.is-focused.docs-sourcelink{background-color:#fff;color:#4eb5de}.button.is-primary.is-inverted.is-outlined.is-loading:hover::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:hover::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.is-hovered.docs-sourcelink::after,.button.is-primary.is-inverted.is-outlined.is-loading:focus::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.docs-sourcelink:focus::after,.button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after,.docstring>section>a.button.is-inverted.is-outlined.is-loading.is-focused.docs-sourcelink::after{border-color:transparent transparent #4eb5de #4eb5de !important}.button.is-primary.is-inverted.is-outlined[disabled],.docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink[disabled],fieldset[disabled] .button.is-primary.is-inverted.is-outlined,fieldset[disabled] .docstring>section>a.button.is-inverted.is-outlined.docs-sourcelink{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-link{background-color:#2e63b8;border-color:transparent;color:#fff}.button.is-link:hover,.button.is-link.is-hovered{background-color:#2b5eae;border-color:transparent;color:#fff}.button.is-link:focus,.button.is-link.is-focused{border-color:transparent;color:#fff}.button.is-link:focus:not(:active),.button.is-link.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.button.is-link:active,.button.is-link.is-active{background-color:#2958a4;border-color:transparent;color:#fff}.button.is-link[disabled],fieldset[disabled] .button.is-link{background-color:#2e63b8;border-color:transparent;box-shadow:none}.button.is-link.is-inverted{background-color:#fff;color:#2e63b8}.button.is-link.is-inverted:hover,.button.is-link.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-link.is-inverted[disabled],fieldset[disabled] .button.is-link.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#2e63b8}.button.is-link.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-link.is-outlined{background-color:transparent;border-color:#2e63b8;color:#2e63b8}.button.is-link.is-outlined:hover,.button.is-link.is-outlined.is-hovered,.button.is-link.is-outlined:focus,.button.is-link.is-outlined.is-focused{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #2e63b8 #2e63b8 !important}.button.is-link.is-outlined.is-loading:hover::after,.button.is-link.is-outlined.is-loading.is-hovered::after,.button.is-link.is-outlined.is-loading:focus::after,.button.is-link.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-link.is-outlined[disabled],fieldset[disabled] .button.is-link.is-outlined{background-color:transparent;border-color:#2e63b8;box-shadow:none;color:#2e63b8}.button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-link.is-inverted.is-outlined:hover,.button.is-link.is-inverted.is-outlined.is-hovered,.button.is-link.is-inverted.is-outlined:focus,.button.is-link.is-inverted.is-outlined.is-focused{background-color:#fff;color:#2e63b8}.button.is-link.is-inverted.is-outlined.is-loading:hover::after,.button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-link.is-inverted.is-outlined.is-loading:focus::after,.button.is-link.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #2e63b8 #2e63b8 !important}.button.is-link.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-info{background-color:#209cee;border-color:transparent;color:#fff}.button.is-info:hover,.button.is-info.is-hovered{background-color:#1497ed;border-color:transparent;color:#fff}.button.is-info:focus,.button.is-info.is-focused{border-color:transparent;color:#fff}.button.is-info:focus:not(:active),.button.is-info.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.button.is-info:active,.button.is-info.is-active{background-color:#1190e3;border-color:transparent;color:#fff}.button.is-info[disabled],fieldset[disabled] .button.is-info{background-color:#209cee;border-color:transparent;box-shadow:none}.button.is-info.is-inverted{background-color:#fff;color:#209cee}.button.is-info.is-inverted:hover,.button.is-info.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-info.is-inverted[disabled],fieldset[disabled] .button.is-info.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#209cee}.button.is-info.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-info.is-outlined{background-color:transparent;border-color:#209cee;color:#209cee}.button.is-info.is-outlined:hover,.button.is-info.is-outlined.is-hovered,.button.is-info.is-outlined:focus,.button.is-info.is-outlined.is-focused{background-color:#209cee;border-color:#209cee;color:#fff}.button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #209cee #209cee !important}.button.is-info.is-outlined.is-loading:hover::after,.button.is-info.is-outlined.is-loading.is-hovered::after,.button.is-info.is-outlined.is-loading:focus::after,.button.is-info.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-info.is-outlined[disabled],fieldset[disabled] .button.is-info.is-outlined{background-color:transparent;border-color:#209cee;box-shadow:none;color:#209cee}.button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-info.is-inverted.is-outlined:hover,.button.is-info.is-inverted.is-outlined.is-hovered,.button.is-info.is-inverted.is-outlined:focus,.button.is-info.is-inverted.is-outlined.is-focused{background-color:#fff;color:#209cee}.button.is-info.is-inverted.is-outlined.is-loading:hover::after,.button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-info.is-inverted.is-outlined.is-loading:focus::after,.button.is-info.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #209cee #209cee !important}.button.is-info.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-success{background-color:#22c35b;border-color:transparent;color:#fff}.button.is-success:hover,.button.is-success.is-hovered{background-color:#20b856;border-color:transparent;color:#fff}.button.is-success:focus,.button.is-success.is-focused{border-color:transparent;color:#fff}.button.is-success:focus:not(:active),.button.is-success.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.button.is-success:active,.button.is-success.is-active{background-color:#1ead51;border-color:transparent;color:#fff}.button.is-success[disabled],fieldset[disabled] .button.is-success{background-color:#22c35b;border-color:transparent;box-shadow:none}.button.is-success.is-inverted{background-color:#fff;color:#22c35b}.button.is-success.is-inverted:hover,.button.is-success.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-success.is-inverted[disabled],fieldset[disabled] .button.is-success.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#22c35b}.button.is-success.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-success.is-outlined{background-color:transparent;border-color:#22c35b;color:#22c35b}.button.is-success.is-outlined:hover,.button.is-success.is-outlined.is-hovered,.button.is-success.is-outlined:focus,.button.is-success.is-outlined.is-focused{background-color:#22c35b;border-color:#22c35b;color:#fff}.button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #22c35b #22c35b !important}.button.is-success.is-outlined.is-loading:hover::after,.button.is-success.is-outlined.is-loading.is-hovered::after,.button.is-success.is-outlined.is-loading:focus::after,.button.is-success.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-success.is-outlined[disabled],fieldset[disabled] .button.is-success.is-outlined{background-color:transparent;border-color:#22c35b;box-shadow:none;color:#22c35b}.button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-success.is-inverted.is-outlined:hover,.button.is-success.is-inverted.is-outlined.is-hovered,.button.is-success.is-inverted.is-outlined:focus,.button.is-success.is-inverted.is-outlined.is-focused{background-color:#fff;color:#22c35b}.button.is-success.is-inverted.is-outlined.is-loading:hover::after,.button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-success.is-inverted.is-outlined.is-loading:focus::after,.button.is-success.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #22c35b #22c35b !important}.button.is-success.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-warning{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:hover,.button.is-warning.is-hovered{background-color:#ffda4a;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:focus,.button.is-warning.is-focused{border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning:focus:not(:active),.button.is-warning.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.button.is-warning:active,.button.is-warning.is-active{background-color:#ffd83e;border-color:transparent;color:rgba(0,0,0,0.7)}.button.is-warning[disabled],fieldset[disabled] .button.is-warning{background-color:#ffdd57;border-color:transparent;box-shadow:none}.button.is-warning.is-inverted{background-color:rgba(0,0,0,0.7);color:#ffdd57}.button.is-warning.is-inverted:hover,.button.is-warning.is-inverted.is-hovered{background-color:rgba(0,0,0,0.7)}.button.is-warning.is-inverted[disabled],fieldset[disabled] .button.is-warning.is-inverted{background-color:rgba(0,0,0,0.7);border-color:transparent;box-shadow:none;color:#ffdd57}.button.is-warning.is-loading::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-warning.is-outlined{background-color:transparent;border-color:#ffdd57;color:#ffdd57}.button.is-warning.is-outlined:hover,.button.is-warning.is-outlined.is-hovered,.button.is-warning.is-outlined:focus,.button.is-warning.is-outlined.is-focused{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,0.7)}.button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ffdd57 #ffdd57 !important}.button.is-warning.is-outlined.is-loading:hover::after,.button.is-warning.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-outlined.is-loading:focus::after,.button.is-warning.is-outlined.is-loading.is-focused::after{border-color:transparent transparent rgba(0,0,0,0.7) rgba(0,0,0,0.7) !important}.button.is-warning.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-outlined{background-color:transparent;border-color:#ffdd57;box-shadow:none;color:#ffdd57}.button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);color:rgba(0,0,0,0.7)}.button.is-warning.is-inverted.is-outlined:hover,.button.is-warning.is-inverted.is-outlined.is-hovered,.button.is-warning.is-inverted.is-outlined:focus,.button.is-warning.is-inverted.is-outlined.is-focused{background-color:rgba(0,0,0,0.7);color:#ffdd57}.button.is-warning.is-inverted.is-outlined.is-loading:hover::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-warning.is-inverted.is-outlined.is-loading:focus::after,.button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #ffdd57 #ffdd57 !important}.button.is-warning.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,0.7);box-shadow:none;color:rgba(0,0,0,0.7)}.button.is-danger{background-color:#da0b00;border-color:transparent;color:#fff}.button.is-danger:hover,.button.is-danger.is-hovered{background-color:#cd0a00;border-color:transparent;color:#fff}.button.is-danger:focus,.button.is-danger.is-focused{border-color:transparent;color:#fff}.button.is-danger:focus:not(:active),.button.is-danger.is-focused:not(:active){box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.button.is-danger:active,.button.is-danger.is-active{background-color:#c10a00;border-color:transparent;color:#fff}.button.is-danger[disabled],fieldset[disabled] .button.is-danger{background-color:#da0b00;border-color:transparent;box-shadow:none}.button.is-danger.is-inverted{background-color:#fff;color:#da0b00}.button.is-danger.is-inverted:hover,.button.is-danger.is-inverted.is-hovered{background-color:#f2f2f2}.button.is-danger.is-inverted[disabled],fieldset[disabled] .button.is-danger.is-inverted{background-color:#fff;border-color:transparent;box-shadow:none;color:#da0b00}.button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff !important}.button.is-danger.is-outlined{background-color:transparent;border-color:#da0b00;color:#da0b00}.button.is-danger.is-outlined:hover,.button.is-danger.is-outlined.is-hovered,.button.is-danger.is-outlined:focus,.button.is-danger.is-outlined.is-focused{background-color:#da0b00;border-color:#da0b00;color:#fff}.button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #da0b00 #da0b00 !important}.button.is-danger.is-outlined.is-loading:hover::after,.button.is-danger.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-outlined.is-loading:focus::after,.button.is-danger.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #fff #fff !important}.button.is-danger.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-outlined{background-color:transparent;border-color:#da0b00;box-shadow:none;color:#da0b00}.button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-danger.is-inverted.is-outlined:hover,.button.is-danger.is-inverted.is-outlined.is-hovered,.button.is-danger.is-inverted.is-outlined:focus,.button.is-danger.is-inverted.is-outlined.is-focused{background-color:#fff;color:#da0b00}.button.is-danger.is-inverted.is-outlined.is-loading:hover::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after,.button.is-danger.is-inverted.is-outlined.is-loading:focus::after,.button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after{border-color:transparent transparent #da0b00 #da0b00 !important}.button.is-danger.is-inverted.is-outlined[disabled],fieldset[disabled] .button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-small,#documenter .docs-sidebar form.docs-search>input.button{border-radius:2px;font-size:.75rem}.button.is-normal{font-size:1rem}.button.is-medium{font-size:1.25rem}.button.is-large{font-size:1.5rem}.button[disabled],fieldset[disabled] .button{background-color:#fff;border-color:#dbdbdb;box-shadow:none;opacity:.5}.button.is-fullwidth{display:flex;width:100%}.button.is-loading{color:transparent !important;pointer-events:none}.button.is-loading::after{position:absolute;left:calc(50% - (1em / 2));top:calc(50% - (1em / 2));position:absolute !important}.button.is-static{background-color:#f5f5f5;border-color:#dbdbdb;color:#6b6b6b;box-shadow:none;pointer-events:none}.button.is-rounded,#documenter .docs-sidebar form.docs-search>input.button{border-radius:290486px;padding-left:1em;padding-right:1em}.buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.buttons .button{margin-bottom:0.5rem}.buttons .button:not(:last-child):not(.is-fullwidth){margin-right:0.5rem}.buttons:last-child{margin-bottom:-0.5rem}.buttons:not(:last-child){margin-bottom:1rem}.buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large){border-radius:2px;font-size:.75rem}.buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large){font-size:1.25rem}.buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium){font-size:1.5rem}.buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.buttons.has-addons .button:last-child{margin-right:0}.buttons.has-addons .button:hover,.buttons.has-addons .button.is-hovered{z-index:2}.buttons.has-addons .button:focus,.buttons.has-addons .button.is-focused,.buttons.has-addons .button:active,.buttons.has-addons .button.is-active,.buttons.has-addons .button.is-selected{z-index:3}.buttons.has-addons .button:focus:hover,.buttons.has-addons .button.is-focused:hover,.buttons.has-addons .button:active:hover,.buttons.has-addons .button.is-active:hover,.buttons.has-addons .button.is-selected:hover{z-index:4}.buttons.has-addons .button.is-expanded{flex-grow:1;flex-shrink:1}.buttons.is-centered{justify-content:center}.buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}.buttons.is-right{justify-content:flex-end}.buttons.is-right:not(.has-addons) .button:not(.is-fullwidth){margin-left:0.25rem;margin-right:0.25rem}.container{flex-grow:1;margin:0 auto;position:relative;width:auto}@media screen and (min-width: 1056px){.container{max-width:992px}.container.is-fluid{margin-left:32px;margin-right:32px;max-width:none}}@media screen and (max-width: 1215px){.container.is-widescreen{max-width:1152px}}@media screen and (max-width: 1407px){.container.is-fullhd{max-width:1344px}}@media screen and (min-width: 1216px){.container{max-width:1152px}}@media screen and (min-width: 1408px){.container{max-width:1344px}}.content li+li{margin-top:0.25em}.content p:not(:last-child),.content dl:not(:last-child),.content ol:not(:last-child),.content ul:not(:last-child),.content blockquote:not(:last-child),.content pre:not(:last-child),.content table:not(:last-child){margin-bottom:1em}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6{color:#222;font-weight:600;line-height:1.125}.content h1{font-size:2em;margin-bottom:0.5em}.content h1:not(:first-child){margin-top:1em}.content h2{font-size:1.75em;margin-bottom:0.5714em}.content h2:not(:first-child){margin-top:1.1428em}.content h3{font-size:1.5em;margin-bottom:0.6666em}.content h3:not(:first-child){margin-top:1.3333em}.content h4{font-size:1.25em;margin-bottom:0.8em}.content h5{font-size:1.125em;margin-bottom:0.8888em}.content h6{font-size:1em;margin-bottom:1em}.content blockquote{background-color:#f5f5f5;border-left:5px solid #dbdbdb;padding:1.25em 1.5em}.content ol{list-style-position:outside;margin-left:2em;margin-top:1em}.content ol:not([type]){list-style-type:decimal}.content ol.is-lower-alpha:not([type]){list-style-type:lower-alpha}.content ol.is-lower-roman:not([type]){list-style-type:lower-roman}.content ol.is-upper-alpha:not([type]){list-style-type:upper-alpha}.content ol.is-upper-roman:not([type]){list-style-type:upper-roman}.content ul{list-style:disc outside;margin-left:2em;margin-top:1em}.content ul ul{list-style-type:circle;margin-top:0.5em}.content ul ul ul{list-style-type:square}.content dd{margin-left:2em}.content figure{margin-left:2em;margin-right:2em;text-align:center}.content figure:not(:first-child){margin-top:2em}.content figure:not(:last-child){margin-bottom:2em}.content figure img{display:inline-block}.content figure figcaption{font-style:italic}.content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:0;white-space:pre;word-wrap:normal}.content sup,.content sub{font-size:75%}.content table{width:100%}.content table td,.content table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}.content table th{color:#222}.content table th:not([align]){text-align:left}.content table thead td,.content table thead th{border-width:0 0 2px;color:#222}.content table tfoot td,.content table tfoot th{border-width:2px 0 0;color:#222}.content table tbody tr:last-child td,.content table tbody tr:last-child th{border-bottom-width:0}.content .tabs li+li{margin-top:0}.content.is-small,#documenter .docs-sidebar form.docs-search>input.content{font-size:.75rem}.content.is-medium{font-size:1.25rem}.content.is-large{font-size:1.5rem}.icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}.icon.is-small,#documenter .docs-sidebar form.docs-search>input.icon{height:1rem;width:1rem}.icon.is-medium{height:2rem;width:2rem}.icon.is-large{height:3rem;width:3rem}.image,#documenter .docs-sidebar .docs-logo>img{display:block;position:relative}.image img,#documenter .docs-sidebar .docs-logo>img img{display:block;height:auto;width:100%}.image img.is-rounded,#documenter .docs-sidebar .docs-logo>img img.is-rounded{border-radius:290486px}.image.is-square img,#documenter .docs-sidebar .docs-logo>img.is-square img,.image.is-square .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-square .has-ratio,.image.is-1by1 img,#documenter .docs-sidebar .docs-logo>img.is-1by1 img,.image.is-1by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by1 .has-ratio,.image.is-5by4 img,#documenter .docs-sidebar .docs-logo>img.is-5by4 img,.image.is-5by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by4 .has-ratio,.image.is-4by3 img,#documenter .docs-sidebar .docs-logo>img.is-4by3 img,.image.is-4by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by3 .has-ratio,.image.is-3by2 img,#documenter .docs-sidebar .docs-logo>img.is-3by2 img,.image.is-3by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by2 .has-ratio,.image.is-5by3 img,#documenter .docs-sidebar .docs-logo>img.is-5by3 img,.image.is-5by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-5by3 .has-ratio,.image.is-16by9 img,#documenter .docs-sidebar .docs-logo>img.is-16by9 img,.image.is-16by9 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-16by9 .has-ratio,.image.is-2by1 img,#documenter .docs-sidebar .docs-logo>img.is-2by1 img,.image.is-2by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by1 .has-ratio,.image.is-3by1 img,#documenter .docs-sidebar .docs-logo>img.is-3by1 img,.image.is-3by1 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by1 .has-ratio,.image.is-4by5 img,#documenter .docs-sidebar .docs-logo>img.is-4by5 img,.image.is-4by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-4by5 .has-ratio,.image.is-3by4 img,#documenter .docs-sidebar .docs-logo>img.is-3by4 img,.image.is-3by4 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by4 .has-ratio,.image.is-2by3 img,#documenter .docs-sidebar .docs-logo>img.is-2by3 img,.image.is-2by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-2by3 .has-ratio,.image.is-3by5 img,#documenter .docs-sidebar .docs-logo>img.is-3by5 img,.image.is-3by5 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-3by5 .has-ratio,.image.is-9by16 img,#documenter .docs-sidebar .docs-logo>img.is-9by16 img,.image.is-9by16 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-9by16 .has-ratio,.image.is-1by2 img,#documenter .docs-sidebar .docs-logo>img.is-1by2 img,.image.is-1by2 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by2 .has-ratio,.image.is-1by3 img,#documenter .docs-sidebar .docs-logo>img.is-1by3 img,.image.is-1by3 .has-ratio,#documenter .docs-sidebar .docs-logo>img.is-1by3 .has-ratio{height:100%;width:100%}.image.is-square,#documenter .docs-sidebar .docs-logo>img.is-square,.image.is-1by1,#documenter .docs-sidebar .docs-logo>img.is-1by1{padding-top:100%}.image.is-5by4,#documenter .docs-sidebar .docs-logo>img.is-5by4{padding-top:80%}.image.is-4by3,#documenter .docs-sidebar .docs-logo>img.is-4by3{padding-top:75%}.image.is-3by2,#documenter .docs-sidebar .docs-logo>img.is-3by2{padding-top:66.6666%}.image.is-5by3,#documenter .docs-sidebar .docs-logo>img.is-5by3{padding-top:60%}.image.is-16by9,#documenter .docs-sidebar .docs-logo>img.is-16by9{padding-top:56.25%}.image.is-2by1,#documenter .docs-sidebar .docs-logo>img.is-2by1{padding-top:50%}.image.is-3by1,#documenter .docs-sidebar .docs-logo>img.is-3by1{padding-top:33.3333%}.image.is-4by5,#documenter .docs-sidebar .docs-logo>img.is-4by5{padding-top:125%}.image.is-3by4,#documenter .docs-sidebar .docs-logo>img.is-3by4{padding-top:133.3333%}.image.is-2by3,#documenter .docs-sidebar .docs-logo>img.is-2by3{padding-top:150%}.image.is-3by5,#documenter .docs-sidebar .docs-logo>img.is-3by5{padding-top:166.6666%}.image.is-9by16,#documenter .docs-sidebar .docs-logo>img.is-9by16{padding-top:177.7777%}.image.is-1by2,#documenter .docs-sidebar .docs-logo>img.is-1by2{padding-top:200%}.image.is-1by3,#documenter .docs-sidebar .docs-logo>img.is-1by3{padding-top:300%}.image.is-16x16,#documenter .docs-sidebar .docs-logo>img.is-16x16{height:16px;width:16px}.image.is-24x24,#documenter .docs-sidebar .docs-logo>img.is-24x24{height:24px;width:24px}.image.is-32x32,#documenter .docs-sidebar .docs-logo>img.is-32x32{height:32px;width:32px}.image.is-48x48,#documenter .docs-sidebar .docs-logo>img.is-48x48{height:48px;width:48px}.image.is-64x64,#documenter .docs-sidebar .docs-logo>img.is-64x64{height:64px;width:64px}.image.is-96x96,#documenter .docs-sidebar .docs-logo>img.is-96x96{height:96px;width:96px}.image.is-128x128,#documenter .docs-sidebar .docs-logo>img.is-128x128{height:128px;width:128px}.notification{background-color:#f5f5f5;border-radius:4px;padding:1.25rem 2.5rem 1.25rem 1.5rem;position:relative}.notification a:not(.button):not(.dropdown-item){color:currentColor;text-decoration:underline}.notification strong{color:currentColor}.notification code,.notification pre{background:#fff}.notification pre code{background:transparent}.notification>.delete{position:absolute;right:0.5rem;top:0.5rem}.notification .title,.notification .subtitle,.notification .content{color:currentColor}.notification.is-white{background-color:#fff;color:#0a0a0a}.notification.is-black{background-color:#0a0a0a;color:#fff}.notification.is-light{background-color:#f5f5f5;color:#363636}.notification.is-dark,.content kbd.notification{background-color:#363636;color:#f5f5f5}.notification.is-primary,.docstring>section>a.notification.docs-sourcelink{background-color:#4eb5de;color:#fff}.notification.is-link{background-color:#2e63b8;color:#fff}.notification.is-info{background-color:#209cee;color:#fff}.notification.is-success{background-color:#22c35b;color:#fff}.notification.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.notification.is-danger{background-color:#da0b00;color:#fff}.progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:290486px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}.progress::-webkit-progress-bar{background-color:#dbdbdb}.progress::-webkit-progress-value{background-color:#222}.progress::-moz-progress-bar{background-color:#222}.progress::-ms-fill{background-color:#222;border:none}.progress.is-white::-webkit-progress-value{background-color:#fff}.progress.is-white::-moz-progress-bar{background-color:#fff}.progress.is-white::-ms-fill{background-color:#fff}.progress.is-white:indeterminate{background-image:linear-gradient(to right, #fff 30%, #dbdbdb 30%)}.progress.is-black::-webkit-progress-value{background-color:#0a0a0a}.progress.is-black::-moz-progress-bar{background-color:#0a0a0a}.progress.is-black::-ms-fill{background-color:#0a0a0a}.progress.is-black:indeterminate{background-image:linear-gradient(to right, #0a0a0a 30%, #dbdbdb 30%)}.progress.is-light::-webkit-progress-value{background-color:#f5f5f5}.progress.is-light::-moz-progress-bar{background-color:#f5f5f5}.progress.is-light::-ms-fill{background-color:#f5f5f5}.progress.is-light:indeterminate{background-image:linear-gradient(to right, #f5f5f5 30%, #dbdbdb 30%)}.progress.is-dark::-webkit-progress-value,.content kbd.progress::-webkit-progress-value{background-color:#363636}.progress.is-dark::-moz-progress-bar,.content kbd.progress::-moz-progress-bar{background-color:#363636}.progress.is-dark::-ms-fill,.content kbd.progress::-ms-fill{background-color:#363636}.progress.is-dark:indeterminate,.content kbd.progress:indeterminate{background-image:linear-gradient(to right, #363636 30%, #dbdbdb 30%)}.progress.is-primary::-webkit-progress-value,.docstring>section>a.progress.docs-sourcelink::-webkit-progress-value{background-color:#4eb5de}.progress.is-primary::-moz-progress-bar,.docstring>section>a.progress.docs-sourcelink::-moz-progress-bar{background-color:#4eb5de}.progress.is-primary::-ms-fill,.docstring>section>a.progress.docs-sourcelink::-ms-fill{background-color:#4eb5de}.progress.is-primary:indeterminate,.docstring>section>a.progress.docs-sourcelink:indeterminate{background-image:linear-gradient(to right, #4eb5de 30%, #dbdbdb 30%)}.progress.is-link::-webkit-progress-value{background-color:#2e63b8}.progress.is-link::-moz-progress-bar{background-color:#2e63b8}.progress.is-link::-ms-fill{background-color:#2e63b8}.progress.is-link:indeterminate{background-image:linear-gradient(to right, #2e63b8 30%, #dbdbdb 30%)}.progress.is-info::-webkit-progress-value{background-color:#209cee}.progress.is-info::-moz-progress-bar{background-color:#209cee}.progress.is-info::-ms-fill{background-color:#209cee}.progress.is-info:indeterminate{background-image:linear-gradient(to right, #209cee 30%, #dbdbdb 30%)}.progress.is-success::-webkit-progress-value{background-color:#22c35b}.progress.is-success::-moz-progress-bar{background-color:#22c35b}.progress.is-success::-ms-fill{background-color:#22c35b}.progress.is-success:indeterminate{background-image:linear-gradient(to right, #22c35b 30%, #dbdbdb 30%)}.progress.is-warning::-webkit-progress-value{background-color:#ffdd57}.progress.is-warning::-moz-progress-bar{background-color:#ffdd57}.progress.is-warning::-ms-fill{background-color:#ffdd57}.progress.is-warning:indeterminate{background-image:linear-gradient(to right, #ffdd57 30%, #dbdbdb 30%)}.progress.is-danger::-webkit-progress-value{background-color:#da0b00}.progress.is-danger::-moz-progress-bar{background-color:#da0b00}.progress.is-danger::-ms-fill{background-color:#da0b00}.progress.is-danger:indeterminate{background-image:linear-gradient(to right, #da0b00 30%, #dbdbdb 30%)}.progress:indeterminate{animation-duration:1.5s;animation-iteration-count:infinite;animation-name:moveIndeterminate;animation-timing-function:linear;background-color:#dbdbdb;background-image:linear-gradient(to right, #222 30%, #dbdbdb 30%);background-position:top left;background-repeat:no-repeat;background-size:150% 150%}.progress:indeterminate::-webkit-progress-bar{background-color:transparent}.progress:indeterminate::-moz-progress-bar{background-color:transparent}.progress.is-small,#documenter .docs-sidebar form.docs-search>input.progress{height:.75rem}.progress.is-medium{height:1.25rem}.progress.is-large{height:1.5rem}@keyframes moveIndeterminate{from{background-position:200% 0}to{background-position:-200% 0}}.table{background-color:#fff;color:#363636}.table td,.table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:0.5em 0.75em;vertical-align:top}.table td.is-white,.table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}.table td.is-black,.table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.table td.is-light,.table th.is-light{background-color:#f5f5f5;border-color:#f5f5f5;color:#363636}.table td.is-dark,.table th.is-dark{background-color:#363636;border-color:#363636;color:#f5f5f5}.table td.is-primary,.table th.is-primary{background-color:#4eb5de;border-color:#4eb5de;color:#fff}.table td.is-link,.table th.is-link{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.table td.is-info,.table th.is-info{background-color:#209cee;border-color:#209cee;color:#fff}.table td.is-success,.table th.is-success{background-color:#22c35b;border-color:#22c35b;color:#fff}.table td.is-warning,.table th.is-warning{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,0.7)}.table td.is-danger,.table th.is-danger{background-color:#da0b00;border-color:#da0b00;color:#fff}.table td.is-narrow,.table th.is-narrow{white-space:nowrap;width:1%}.table td.is-selected,.table th.is-selected{background-color:#4eb5de;color:#fff}.table td.is-selected a,.table td.is-selected strong,.table th.is-selected a,.table th.is-selected strong{color:currentColor}.table th{color:#222}.table th:not([align]){text-align:left}.table tr.is-selected{background-color:#4eb5de;color:#fff}.table tr.is-selected a,.table tr.is-selected strong{color:currentColor}.table tr.is-selected td,.table tr.is-selected th{border-color:#fff;color:currentColor}.table thead{background-color:rgba(0,0,0,0)}.table thead td,.table thead th{border-width:0 0 2px;color:#222}.table tfoot{background-color:rgba(0,0,0,0)}.table tfoot td,.table tfoot th{border-width:2px 0 0;color:#222}.table tbody{background-color:rgba(0,0,0,0)}.table tbody tr:last-child td,.table tbody tr:last-child th{border-bottom-width:0}.table.is-bordered td,.table.is-bordered th{border-width:1px}.table.is-bordered tr:last-child td,.table.is-bordered tr:last-child th{border-bottom-width:1px}.table.is-fullwidth{width:100%}.table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even){background-color:#f5f5f5}.table.is-narrow td,.table.is-narrow th{padding:0.25em 0.5em}.table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#fafafa}.table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}.tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.tags .tag,.tags .content kbd,.content .tags kbd,.tags .docstring>section>a.docs-sourcelink{margin-bottom:0.5rem}.tags .tag:not(:last-child),.tags .content kbd:not(:last-child),.content .tags kbd:not(:last-child),.tags .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0.5rem}.tags:last-child{margin-bottom:-0.5rem}.tags:not(:last-child){margin-bottom:1rem}.tags.are-medium .tag:not(.is-normal):not(.is-large),.tags.are-medium .content kbd:not(.is-normal):not(.is-large),.content .tags.are-medium kbd:not(.is-normal):not(.is-large),.tags.are-medium .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-large){font-size:1rem}.tags.are-large .tag:not(.is-normal):not(.is-medium),.tags.are-large .content kbd:not(.is-normal):not(.is-medium),.content .tags.are-large kbd:not(.is-normal):not(.is-medium),.tags.are-large .docstring>section>a.docs-sourcelink:not(.is-normal):not(.is-medium){font-size:1.25rem}.tags.is-centered{justify-content:center}.tags.is-centered .tag,.tags.is-centered .content kbd,.content .tags.is-centered kbd,.tags.is-centered .docstring>section>a.docs-sourcelink{margin-right:0.25rem;margin-left:0.25rem}.tags.is-right{justify-content:flex-end}.tags.is-right .tag:not(:first-child),.tags.is-right .content kbd:not(:first-child),.content .tags.is-right kbd:not(:first-child),.tags.is-right .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0.5rem}.tags.is-right .tag:not(:last-child),.tags.is-right .content kbd:not(:last-child),.content .tags.is-right kbd:not(:last-child),.tags.is-right .docstring>section>a.docs-sourcelink:not(:last-child){margin-right:0}.tags.has-addons .tag,.tags.has-addons .content kbd,.content .tags.has-addons kbd,.tags.has-addons .docstring>section>a.docs-sourcelink{margin-right:0}.tags.has-addons .tag:not(:first-child),.tags.has-addons .content kbd:not(:first-child),.content .tags.has-addons kbd:not(:first-child),.tags.has-addons .docstring>section>a.docs-sourcelink:not(:first-child){margin-left:0;border-bottom-left-radius:0;border-top-left-radius:0}.tags.has-addons .tag:not(:last-child),.tags.has-addons .content kbd:not(:last-child),.content .tags.has-addons kbd:not(:last-child),.tags.has-addons .docstring>section>a.docs-sourcelink:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.tag:not(body),.content kbd:not(body),.docstring>section>a.docs-sourcelink:not(body){align-items:center;background-color:#f5f5f5;border-radius:4px;color:#222;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:0.75em;padding-right:0.75em;white-space:nowrap}.tag:not(body) .delete,.content kbd:not(body) .delete,.docstring>section>a.docs-sourcelink:not(body) .delete{margin-left:0.25rem;margin-right:-0.375rem}.tag.is-white:not(body),.content kbd.is-white:not(body),.docstring>section>a.docs-sourcelink.is-white:not(body){background-color:#fff;color:#0a0a0a}.tag.is-black:not(body),.content kbd.is-black:not(body),.docstring>section>a.docs-sourcelink.is-black:not(body){background-color:#0a0a0a;color:#fff}.tag.is-light:not(body),.content kbd.is-light:not(body),.docstring>section>a.docs-sourcelink.is-light:not(body){background-color:#f5f5f5;color:#363636}.tag.is-dark:not(body),.content kbd:not(body),.docstring>section>a.docs-sourcelink.is-dark:not(body),.content .docstring>section>kbd:not(body){background-color:#363636;color:#f5f5f5}.tag.is-primary:not(body),.content kbd.is-primary:not(body),.docstring>section>a.docs-sourcelink:not(body){background-color:#4eb5de;color:#fff}.tag.is-link:not(body),.content kbd.is-link:not(body),.docstring>section>a.docs-sourcelink.is-link:not(body){background-color:#2e63b8;color:#fff}.tag.is-info:not(body),.content kbd.is-info:not(body),.docstring>section>a.docs-sourcelink.is-info:not(body){background-color:#209cee;color:#fff}.tag.is-success:not(body),.content kbd.is-success:not(body),.docstring>section>a.docs-sourcelink.is-success:not(body){background-color:#22c35b;color:#fff}.tag.is-warning:not(body),.content kbd.is-warning:not(body),.docstring>section>a.docs-sourcelink.is-warning:not(body){background-color:#ffdd57;color:rgba(0,0,0,0.7)}.tag.is-danger:not(body),.content kbd.is-danger:not(body),.docstring>section>a.docs-sourcelink.is-danger:not(body){background-color:#da0b00;color:#fff}.tag.is-normal:not(body),.content kbd.is-normal:not(body),.docstring>section>a.docs-sourcelink.is-normal:not(body){font-size:.75rem}.tag.is-medium:not(body),.content kbd.is-medium:not(body),.docstring>section>a.docs-sourcelink.is-medium:not(body){font-size:1rem}.tag.is-large:not(body),.content kbd.is-large:not(body),.docstring>section>a.docs-sourcelink.is-large:not(body){font-size:1.25rem}.tag:not(body) .icon:first-child:not(:last-child),.content kbd:not(body) .icon:first-child:not(:last-child),.docstring>section>a.docs-sourcelink:not(body) .icon:first-child:not(:last-child){margin-left:-0.375em;margin-right:0.1875em}.tag:not(body) .icon:last-child:not(:first-child),.content kbd:not(body) .icon:last-child:not(:first-child),.docstring>section>a.docs-sourcelink:not(body) .icon:last-child:not(:first-child){margin-left:0.1875em;margin-right:-0.375em}.tag:not(body) .icon:first-child:last-child,.content kbd:not(body) .icon:first-child:last-child,.docstring>section>a.docs-sourcelink:not(body) .icon:first-child:last-child{margin-left:-0.375em;margin-right:-0.375em}.tag.is-delete:not(body),.content kbd.is-delete:not(body),.docstring>section>a.docs-sourcelink.is-delete:not(body){margin-left:1px;padding:0;position:relative;width:2em}.tag.is-delete:not(body)::before,.content kbd.is-delete:not(body)::before,.docstring>section>a.docs-sourcelink.is-delete:not(body)::before,.tag.is-delete:not(body)::after,.content kbd.is-delete:not(body)::after,.docstring>section>a.docs-sourcelink.is-delete:not(body)::after{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;transform:translateX(-50%) translateY(-50%) rotate(45deg);transform-origin:center center}.tag.is-delete:not(body)::before,.content kbd.is-delete:not(body)::before,.docstring>section>a.docs-sourcelink.is-delete:not(body)::before{height:1px;width:50%}.tag.is-delete:not(body)::after,.content kbd.is-delete:not(body)::after,.docstring>section>a.docs-sourcelink.is-delete:not(body)::after{height:50%;width:1px}.tag.is-delete:not(body):hover,.content kbd.is-delete:not(body):hover,.docstring>section>a.docs-sourcelink.is-delete:not(body):hover,.tag.is-delete:not(body):focus,.content kbd.is-delete:not(body):focus,.docstring>section>a.docs-sourcelink.is-delete:not(body):focus{background-color:#e8e8e8}.tag.is-delete:not(body):active,.content kbd.is-delete:not(body):active,.docstring>section>a.docs-sourcelink.is-delete:not(body):active{background-color:#dbdbdb}.tag.is-rounded:not(body),#documenter .docs-sidebar form.docs-search>input:not(body),.content kbd.is-rounded:not(body),#documenter .docs-sidebar .content form.docs-search>input:not(body),.docstring>section>a.docs-sourcelink.is-rounded:not(body){border-radius:290486px}a.tag:hover,.docstring>section>a.docs-sourcelink:hover{text-decoration:underline}.title,.subtitle{word-break:break-word}.title em,.title span,.subtitle em,.subtitle span{font-weight:inherit}.title sub,.subtitle sub{font-size:.75em}.title sup,.subtitle sup{font-size:.75em}.title .tag,.title .content kbd,.content .title kbd,.title .docstring>section>a.docs-sourcelink,.subtitle .tag,.subtitle .content kbd,.content .subtitle kbd,.subtitle .docstring>section>a.docs-sourcelink{vertical-align:middle}.title{color:#363636;font-size:2rem;font-weight:600;line-height:1.125}.title strong{color:inherit;font-weight:inherit}.title+.highlight{margin-top:-0.75rem}.title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}.title.is-1{font-size:3rem}.title.is-2{font-size:2.5rem}.title.is-3{font-size:2rem}.title.is-4{font-size:1.5rem}.title.is-5{font-size:1.25rem}.title.is-6{font-size:1rem}.title.is-7{font-size:.75rem}.subtitle{color:#4a4a4a;font-size:1.25rem;font-weight:400;line-height:1.25}.subtitle strong{color:#363636;font-weight:600}.subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}.subtitle.is-1{font-size:3rem}.subtitle.is-2{font-size:2.5rem}.subtitle.is-3{font-size:2rem}.subtitle.is-4{font-size:1.5rem}.subtitle.is-5{font-size:1.25rem}.subtitle.is-6{font-size:1rem}.subtitle.is-7{font-size:.75rem}.heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}.highlight{font-weight:400;max-width:100%;overflow:hidden;padding:0}.highlight pre{overflow:auto;max-width:100%}.number{align-items:center;background-color:#f5f5f5;border-radius:290486px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:0.25rem 0.5rem;text-align:center;vertical-align:top}.select select,.textarea,.input,#documenter .docs-sidebar form.docs-search>input{background-color:#fff;border-color:#dbdbdb;border-radius:4px;color:#363636}.select select::-moz-placeholder,.textarea::-moz-placeholder,.input::-moz-placeholder,#documenter .docs-sidebar form.docs-search>input::-moz-placeholder{color:rgba(54,54,54,0.3)}.select select::-webkit-input-placeholder,.textarea::-webkit-input-placeholder,.input::-webkit-input-placeholder,#documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder{color:rgba(54,54,54,0.3)}.select select:-moz-placeholder,.textarea:-moz-placeholder,.input:-moz-placeholder,#documenter .docs-sidebar form.docs-search>input:-moz-placeholder{color:rgba(54,54,54,0.3)}.select select:-ms-input-placeholder,.textarea:-ms-input-placeholder,.input:-ms-input-placeholder,#documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder{color:rgba(54,54,54,0.3)}.select select:hover,.textarea:hover,.input:hover,#documenter .docs-sidebar form.docs-search>input:hover,.select select.is-hovered,.is-hovered.textarea,.is-hovered.input,#documenter .docs-sidebar form.docs-search>input.is-hovered{border-color:#b5b5b5}.select select:focus,.textarea:focus,.input:focus,#documenter .docs-sidebar form.docs-search>input:focus,.select select.is-focused,.is-focused.textarea,.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.select select:active,.textarea:active,.input:active,#documenter .docs-sidebar form.docs-search>input:active,.select select.is-active,.is-active.textarea,.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{border-color:#2e63b8;box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.select select[disabled],.textarea[disabled],.input[disabled],#documenter .docs-sidebar form.docs-search>input[disabled],fieldset[disabled] .select select,.select fieldset[disabled] select,fieldset[disabled] .textarea,fieldset[disabled] .input,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none;color:#6b6b6b}.select select[disabled]::-moz-placeholder,.textarea[disabled]::-moz-placeholder,.input[disabled]::-moz-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]::-moz-placeholder,fieldset[disabled] .select select::-moz-placeholder,.select fieldset[disabled] select::-moz-placeholder,fieldset[disabled] .textarea::-moz-placeholder,fieldset[disabled] .input::-moz-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input::-moz-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input::-moz-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]::-webkit-input-placeholder,.textarea[disabled]::-webkit-input-placeholder,.input[disabled]::-webkit-input-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]::-webkit-input-placeholder,fieldset[disabled] .select select::-webkit-input-placeholder,.select fieldset[disabled] select::-webkit-input-placeholder,fieldset[disabled] .textarea::-webkit-input-placeholder,fieldset[disabled] .input::-webkit-input-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input::-webkit-input-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input::-webkit-input-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]:-moz-placeholder,.textarea[disabled]:-moz-placeholder,.input[disabled]:-moz-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]:-moz-placeholder,fieldset[disabled] .select select:-moz-placeholder,.select fieldset[disabled] select:-moz-placeholder,fieldset[disabled] .textarea:-moz-placeholder,fieldset[disabled] .input:-moz-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input:-moz-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input:-moz-placeholder{color:rgba(107,107,107,0.3)}.select select[disabled]:-ms-input-placeholder,.textarea[disabled]:-ms-input-placeholder,.input[disabled]:-ms-input-placeholder,#documenter .docs-sidebar form.docs-search>input[disabled]:-ms-input-placeholder,fieldset[disabled] .select select:-ms-input-placeholder,.select fieldset[disabled] select:-ms-input-placeholder,fieldset[disabled] .textarea:-ms-input-placeholder,fieldset[disabled] .input:-ms-input-placeholder,fieldset[disabled] #documenter .docs-sidebar form.docs-search>input:-ms-input-placeholder,#documenter .docs-sidebar fieldset[disabled] form.docs-search>input:-ms-input-placeholder{color:rgba(107,107,107,0.3)}.textarea,.input,#documenter .docs-sidebar form.docs-search>input{box-shadow:inset 0 1px 2px rgba(10,10,10,0.1);max-width:100%;width:100%}.textarea[readonly],.input[readonly],#documenter .docs-sidebar form.docs-search>input[readonly]{box-shadow:none}.is-white.textarea,.is-white.input,#documenter .docs-sidebar form.docs-search>input.is-white{border-color:#fff}.is-white.textarea:focus,.is-white.input:focus,#documenter .docs-sidebar form.docs-search>input.is-white:focus,.is-white.is-focused.textarea,.is-white.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-white.textarea:active,.is-white.input:active,#documenter .docs-sidebar form.docs-search>input.is-white:active,.is-white.is-active.textarea,.is-white.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.is-black.textarea,.is-black.input,#documenter .docs-sidebar form.docs-search>input.is-black{border-color:#0a0a0a}.is-black.textarea:focus,.is-black.input:focus,#documenter .docs-sidebar form.docs-search>input.is-black:focus,.is-black.is-focused.textarea,.is-black.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-black.textarea:active,.is-black.input:active,#documenter .docs-sidebar form.docs-search>input.is-black:active,.is-black.is-active.textarea,.is-black.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.is-light.textarea,.is-light.input,#documenter .docs-sidebar form.docs-search>input.is-light{border-color:#f5f5f5}.is-light.textarea:focus,.is-light.input:focus,#documenter .docs-sidebar form.docs-search>input.is-light:focus,.is-light.is-focused.textarea,.is-light.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-light.textarea:active,.is-light.input:active,#documenter .docs-sidebar form.docs-search>input.is-light:active,.is-light.is-active.textarea,.is-light.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.is-dark.textarea,.content kbd.textarea,.is-dark.input,#documenter .docs-sidebar form.docs-search>input.is-dark,.content kbd.input{border-color:#363636}.is-dark.textarea:focus,.content kbd.textarea:focus,.is-dark.input:focus,#documenter .docs-sidebar form.docs-search>input.is-dark:focus,.content kbd.input:focus,.is-dark.is-focused.textarea,.content kbd.is-focused.textarea,.is-dark.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.content kbd.is-focused.input,#documenter .docs-sidebar .content form.docs-search>input.is-focused,.is-dark.textarea:active,.content kbd.textarea:active,.is-dark.input:active,#documenter .docs-sidebar form.docs-search>input.is-dark:active,.content kbd.input:active,.is-dark.is-active.textarea,.content kbd.is-active.textarea,.is-dark.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.content kbd.is-active.input,#documenter .docs-sidebar .content form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.is-primary.textarea,.docstring>section>a.textarea.docs-sourcelink,.is-primary.input,#documenter .docs-sidebar form.docs-search>input.is-primary,.docstring>section>a.input.docs-sourcelink{border-color:#4eb5de}.is-primary.textarea:focus,.docstring>section>a.textarea.docs-sourcelink:focus,.is-primary.input:focus,#documenter .docs-sidebar form.docs-search>input.is-primary:focus,.docstring>section>a.input.docs-sourcelink:focus,.is-primary.is-focused.textarea,.docstring>section>a.is-focused.textarea.docs-sourcelink,.is-primary.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.docstring>section>a.is-focused.input.docs-sourcelink,.is-primary.textarea:active,.docstring>section>a.textarea.docs-sourcelink:active,.is-primary.input:active,#documenter .docs-sidebar form.docs-search>input.is-primary:active,.docstring>section>a.input.docs-sourcelink:active,.is-primary.is-active.textarea,.docstring>section>a.is-active.textarea.docs-sourcelink,.is-primary.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active,.docstring>section>a.is-active.input.docs-sourcelink{box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.is-link.textarea,.is-link.input,#documenter .docs-sidebar form.docs-search>input.is-link{border-color:#2e63b8}.is-link.textarea:focus,.is-link.input:focus,#documenter .docs-sidebar form.docs-search>input.is-link:focus,.is-link.is-focused.textarea,.is-link.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-link.textarea:active,.is-link.input:active,#documenter .docs-sidebar form.docs-search>input.is-link:active,.is-link.is-active.textarea,.is-link.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.is-info.textarea,.is-info.input,#documenter .docs-sidebar form.docs-search>input.is-info{border-color:#209cee}.is-info.textarea:focus,.is-info.input:focus,#documenter .docs-sidebar form.docs-search>input.is-info:focus,.is-info.is-focused.textarea,.is-info.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-info.textarea:active,.is-info.input:active,#documenter .docs-sidebar form.docs-search>input.is-info:active,.is-info.is-active.textarea,.is-info.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.is-success.textarea,.is-success.input,#documenter .docs-sidebar form.docs-search>input.is-success{border-color:#22c35b}.is-success.textarea:focus,.is-success.input:focus,#documenter .docs-sidebar form.docs-search>input.is-success:focus,.is-success.is-focused.textarea,.is-success.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-success.textarea:active,.is-success.input:active,#documenter .docs-sidebar form.docs-search>input.is-success:active,.is-success.is-active.textarea,.is-success.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.is-warning.textarea,.is-warning.input,#documenter .docs-sidebar form.docs-search>input.is-warning{border-color:#ffdd57}.is-warning.textarea:focus,.is-warning.input:focus,#documenter .docs-sidebar form.docs-search>input.is-warning:focus,.is-warning.is-focused.textarea,.is-warning.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-warning.textarea:active,.is-warning.input:active,#documenter .docs-sidebar form.docs-search>input.is-warning:active,.is-warning.is-active.textarea,.is-warning.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.is-danger.textarea,.is-danger.input,#documenter .docs-sidebar form.docs-search>input.is-danger{border-color:#da0b00}.is-danger.textarea:focus,.is-danger.input:focus,#documenter .docs-sidebar form.docs-search>input.is-danger:focus,.is-danger.is-focused.textarea,.is-danger.is-focused.input,#documenter .docs-sidebar form.docs-search>input.is-focused,.is-danger.textarea:active,.is-danger.input:active,#documenter .docs-sidebar form.docs-search>input.is-danger:active,.is-danger.is-active.textarea,.is-danger.is-active.input,#documenter .docs-sidebar form.docs-search>input.is-active{box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.is-small.textarea,.is-small.input,#documenter .docs-sidebar form.docs-search>input{border-radius:2px;font-size:.75rem}.is-medium.textarea,.is-medium.input,#documenter .docs-sidebar form.docs-search>input.is-medium{font-size:1.25rem}.is-large.textarea,.is-large.input,#documenter .docs-sidebar form.docs-search>input.is-large{font-size:1.5rem}.is-fullwidth.textarea,.is-fullwidth.input,#documenter .docs-sidebar form.docs-search>input.is-fullwidth{display:block;width:100%}.is-inline.textarea,.is-inline.input,#documenter .docs-sidebar form.docs-search>input.is-inline{display:inline;width:auto}.input.is-rounded,#documenter .docs-sidebar form.docs-search>input{border-radius:290486px;padding-left:1em;padding-right:1em}.input.is-static,#documenter .docs-sidebar form.docs-search>input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}.textarea{display:block;max-width:100%;min-width:100%;padding:0.625em;resize:vertical}.textarea:not([rows]){max-height:600px;min-height:120px}.textarea[rows]{height:initial}.textarea.has-fixed-size{resize:none}.radio,.checkbox{cursor:pointer;display:inline-block;line-height:1.25;position:relative}.radio input,.checkbox input{cursor:pointer}.radio:hover,.checkbox:hover{color:#363636}.radio[disabled],.checkbox[disabled],fieldset[disabled] .radio,fieldset[disabled] .checkbox{color:#6b6b6b;cursor:not-allowed}.radio+.radio{margin-left:0.5em}.select{display:inline-block;max-width:100%;position:relative;vertical-align:top}.select:not(.is-multiple){height:2.25em}.select:not(.is-multiple):not(.is-loading)::after{border-color:#2e63b8;right:1.125em;z-index:4}.select.is-rounded select,#documenter .docs-sidebar form.docs-search>input.select select{border-radius:290486px;padding-left:1em}.select select{cursor:pointer;display:block;font-size:1em;max-width:100%;outline:none}.select select::-ms-expand{display:none}.select select[disabled]:hover,fieldset[disabled] .select select:hover{border-color:#f5f5f5}.select select:not([multiple]){padding-right:2.5em}.select select[multiple]{height:auto;padding:0}.select select[multiple] option{padding:0.5em 1em}.select:not(.is-multiple):not(.is-loading):hover::after{border-color:#363636}.select.is-white:not(:hover)::after{border-color:#fff}.select.is-white select{border-color:#fff}.select.is-white select:hover,.select.is-white select.is-hovered{border-color:#f2f2f2}.select.is-white select:focus,.select.is-white select.is-focused,.select.is-white select:active,.select.is-white select.is-active{box-shadow:0 0 0 0.125em rgba(255,255,255,0.25)}.select.is-black:not(:hover)::after{border-color:#0a0a0a}.select.is-black select{border-color:#0a0a0a}.select.is-black select:hover,.select.is-black select.is-hovered{border-color:#000}.select.is-black select:focus,.select.is-black select.is-focused,.select.is-black select:active,.select.is-black select.is-active{box-shadow:0 0 0 0.125em rgba(10,10,10,0.25)}.select.is-light:not(:hover)::after{border-color:#f5f5f5}.select.is-light select{border-color:#f5f5f5}.select.is-light select:hover,.select.is-light select.is-hovered{border-color:#e8e8e8}.select.is-light select:focus,.select.is-light select.is-focused,.select.is-light select:active,.select.is-light select.is-active{box-shadow:0 0 0 0.125em rgba(245,245,245,0.25)}.select.is-dark:not(:hover)::after,.content kbd.select:not(:hover)::after{border-color:#363636}.select.is-dark select,.content kbd.select select{border-color:#363636}.select.is-dark select:hover,.content kbd.select select:hover,.select.is-dark select.is-hovered,.content kbd.select select.is-hovered{border-color:#292929}.select.is-dark select:focus,.content kbd.select select:focus,.select.is-dark select.is-focused,.content kbd.select select.is-focused,.select.is-dark select:active,.content kbd.select select:active,.select.is-dark select.is-active,.content kbd.select select.is-active{box-shadow:0 0 0 0.125em rgba(54,54,54,0.25)}.select.is-primary:not(:hover)::after,.docstring>section>a.select.docs-sourcelink:not(:hover)::after{border-color:#4eb5de}.select.is-primary select,.docstring>section>a.select.docs-sourcelink select{border-color:#4eb5de}.select.is-primary select:hover,.docstring>section>a.select.docs-sourcelink select:hover,.select.is-primary select.is-hovered,.docstring>section>a.select.docs-sourcelink select.is-hovered{border-color:#39acda}.select.is-primary select:focus,.docstring>section>a.select.docs-sourcelink select:focus,.select.is-primary select.is-focused,.docstring>section>a.select.docs-sourcelink select.is-focused,.select.is-primary select:active,.docstring>section>a.select.docs-sourcelink select:active,.select.is-primary select.is-active,.docstring>section>a.select.docs-sourcelink select.is-active{box-shadow:0 0 0 0.125em rgba(78,181,222,0.25)}.select.is-link:not(:hover)::after{border-color:#2e63b8}.select.is-link select{border-color:#2e63b8}.select.is-link select:hover,.select.is-link select.is-hovered{border-color:#2958a4}.select.is-link select:focus,.select.is-link select.is-focused,.select.is-link select:active,.select.is-link select.is-active{box-shadow:0 0 0 0.125em rgba(46,99,184,0.25)}.select.is-info:not(:hover)::after{border-color:#209cee}.select.is-info select{border-color:#209cee}.select.is-info select:hover,.select.is-info select.is-hovered{border-color:#1190e3}.select.is-info select:focus,.select.is-info select.is-focused,.select.is-info select:active,.select.is-info select.is-active{box-shadow:0 0 0 0.125em rgba(32,156,238,0.25)}.select.is-success:not(:hover)::after{border-color:#22c35b}.select.is-success select{border-color:#22c35b}.select.is-success select:hover,.select.is-success select.is-hovered{border-color:#1ead51}.select.is-success select:focus,.select.is-success select.is-focused,.select.is-success select:active,.select.is-success select.is-active{box-shadow:0 0 0 0.125em rgba(34,195,91,0.25)}.select.is-warning:not(:hover)::after{border-color:#ffdd57}.select.is-warning select{border-color:#ffdd57}.select.is-warning select:hover,.select.is-warning select.is-hovered{border-color:#ffd83e}.select.is-warning select:focus,.select.is-warning select.is-focused,.select.is-warning select:active,.select.is-warning select.is-active{box-shadow:0 0 0 0.125em rgba(255,221,87,0.25)}.select.is-danger:not(:hover)::after{border-color:#da0b00}.select.is-danger select{border-color:#da0b00}.select.is-danger select:hover,.select.is-danger select.is-hovered{border-color:#c10a00}.select.is-danger select:focus,.select.is-danger select.is-focused,.select.is-danger select:active,.select.is-danger select.is-active{box-shadow:0 0 0 0.125em rgba(218,11,0,0.25)}.select.is-small,#documenter .docs-sidebar form.docs-search>input.select{border-radius:2px;font-size:.75rem}.select.is-medium{font-size:1.25rem}.select.is-large{font-size:1.5rem}.select.is-disabled::after{border-color:#6b6b6b}.select.is-fullwidth{width:100%}.select.is-fullwidth select{width:100%}.select.is-loading::after{margin-top:0;position:absolute;right:0.625em;top:0.625em;transform:none}.select.is-loading.is-small:after,#documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}.select.is-loading.is-medium:after{font-size:1.25rem}.select.is-loading.is-large:after{font-size:1.5rem}.file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}.file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}.file.is-white:hover .file-cta,.file.is-white.is-hovered .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.file.is-white:focus .file-cta,.file.is-white.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,255,255,0.25);color:#0a0a0a}.file.is-white:active .file-cta,.file.is-white.is-active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}.file.is-black:hover .file-cta,.file.is-black.is-hovered .file-cta{background-color:#040404;border-color:transparent;color:#fff}.file.is-black:focus .file-cta,.file.is-black.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(10,10,10,0.25);color:#fff}.file.is-black:active .file-cta,.file.is-black.is-active .file-cta{background-color:#000;border-color:transparent;color:#fff}.file.is-light .file-cta{background-color:#f5f5f5;border-color:transparent;color:#363636}.file.is-light:hover .file-cta,.file.is-light.is-hovered .file-cta{background-color:#eee;border-color:transparent;color:#363636}.file.is-light:focus .file-cta,.file.is-light.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(245,245,245,0.25);color:#363636}.file.is-light:active .file-cta,.file.is-light.is-active .file-cta{background-color:#e8e8e8;border-color:transparent;color:#363636}.file.is-dark .file-cta,.content kbd.file .file-cta{background-color:#363636;border-color:transparent;color:#f5f5f5}.file.is-dark:hover .file-cta,.content kbd.file:hover .file-cta,.file.is-dark.is-hovered .file-cta,.content kbd.file.is-hovered .file-cta{background-color:#2f2f2f;border-color:transparent;color:#f5f5f5}.file.is-dark:focus .file-cta,.content kbd.file:focus .file-cta,.file.is-dark.is-focused .file-cta,.content kbd.file.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(54,54,54,0.25);color:#f5f5f5}.file.is-dark:active .file-cta,.content kbd.file:active .file-cta,.file.is-dark.is-active .file-cta,.content kbd.file.is-active .file-cta{background-color:#292929;border-color:transparent;color:#f5f5f5}.file.is-primary .file-cta,.docstring>section>a.file.docs-sourcelink .file-cta{background-color:#4eb5de;border-color:transparent;color:#fff}.file.is-primary:hover .file-cta,.docstring>section>a.file.docs-sourcelink:hover .file-cta,.file.is-primary.is-hovered .file-cta,.docstring>section>a.file.is-hovered.docs-sourcelink .file-cta{background-color:#43b1dc;border-color:transparent;color:#fff}.file.is-primary:focus .file-cta,.docstring>section>a.file.docs-sourcelink:focus .file-cta,.file.is-primary.is-focused .file-cta,.docstring>section>a.file.is-focused.docs-sourcelink .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(78,181,222,0.25);color:#fff}.file.is-primary:active .file-cta,.docstring>section>a.file.docs-sourcelink:active .file-cta,.file.is-primary.is-active .file-cta,.docstring>section>a.file.is-active.docs-sourcelink .file-cta{background-color:#39acda;border-color:transparent;color:#fff}.file.is-link .file-cta{background-color:#2e63b8;border-color:transparent;color:#fff}.file.is-link:hover .file-cta,.file.is-link.is-hovered .file-cta{background-color:#2b5eae;border-color:transparent;color:#fff}.file.is-link:focus .file-cta,.file.is-link.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(46,99,184,0.25);color:#fff}.file.is-link:active .file-cta,.file.is-link.is-active .file-cta{background-color:#2958a4;border-color:transparent;color:#fff}.file.is-info .file-cta{background-color:#209cee;border-color:transparent;color:#fff}.file.is-info:hover .file-cta,.file.is-info.is-hovered .file-cta{background-color:#1497ed;border-color:transparent;color:#fff}.file.is-info:focus .file-cta,.file.is-info.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(32,156,238,0.25);color:#fff}.file.is-info:active .file-cta,.file.is-info.is-active .file-cta{background-color:#1190e3;border-color:transparent;color:#fff}.file.is-success .file-cta{background-color:#22c35b;border-color:transparent;color:#fff}.file.is-success:hover .file-cta,.file.is-success.is-hovered .file-cta{background-color:#20b856;border-color:transparent;color:#fff}.file.is-success:focus .file-cta,.file.is-success.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(34,195,91,0.25);color:#fff}.file.is-success:active .file-cta,.file.is-success.is-active .file-cta{background-color:#1ead51;border-color:transparent;color:#fff}.file.is-warning .file-cta{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-warning:hover .file-cta,.file.is-warning.is-hovered .file-cta{background-color:#ffda4a;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-warning:focus .file-cta,.file.is-warning.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(255,221,87,0.25);color:rgba(0,0,0,0.7)}.file.is-warning:active .file-cta,.file.is-warning.is-active .file-cta{background-color:#ffd83e;border-color:transparent;color:rgba(0,0,0,0.7)}.file.is-danger .file-cta{background-color:#da0b00;border-color:transparent;color:#fff}.file.is-danger:hover .file-cta,.file.is-danger.is-hovered .file-cta{background-color:#cd0a00;border-color:transparent;color:#fff}.file.is-danger:focus .file-cta,.file.is-danger.is-focused .file-cta{border-color:transparent;box-shadow:0 0 0.5em rgba(218,11,0,0.25);color:#fff}.file.is-danger:active .file-cta,.file.is-danger.is-active .file-cta{background-color:#c10a00;border-color:transparent;color:#fff}.file.is-small,#documenter .docs-sidebar form.docs-search>input.file{font-size:.75rem}.file.is-medium{font-size:1.25rem}.file.is-medium .file-icon .fa{font-size:21px}.file.is-large{font-size:1.5rem}.file.is-large .file-icon .fa{font-size:28px}.file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}.file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}.file.has-name.is-empty .file-cta{border-radius:4px}.file.has-name.is-empty .file-name{display:none}.file.is-boxed .file-label{flex-direction:column}.file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}.file.is-boxed .file-name{border-width:0 1px 1px}.file.is-boxed .file-icon{height:1.5em;width:1.5em}.file.is-boxed .file-icon .fa{font-size:21px}.file.is-boxed.is-small .file-icon .fa,#documenter .docs-sidebar form.docs-search>input.is-boxed .file-icon .fa{font-size:14px}.file.is-boxed.is-medium .file-icon .fa{font-size:28px}.file.is-boxed.is-large .file-icon .fa{font-size:35px}.file.is-boxed.has-name .file-cta{border-radius:4px 4px 0 0}.file.is-boxed.has-name .file-name{border-radius:0 0 4px 4px;border-width:0 1px 1px}.file.is-centered{justify-content:center}.file.is-fullwidth .file-label{width:100%}.file.is-fullwidth .file-name{flex-grow:1;max-width:none}.file.is-right{justify-content:flex-end}.file.is-right .file-cta{border-radius:0 4px 4px 0}.file.is-right .file-name{border-radius:4px 0 0 4px;border-width:1px 0 1px 1px;order:-1}.file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}.file-label:hover .file-cta{background-color:#eee;color:#363636}.file-label:hover .file-name{border-color:#d5d5d5}.file-label:active .file-cta{background-color:#e8e8e8;color:#363636}.file-label:active .file-name{border-color:#cfcfcf}.file-input{height:100%;left:0;opacity:0;outline:none;position:absolute;top:0;width:100%}.file-cta,.file-name{border-color:#dbdbdb;border-radius:4px;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}.file-cta{background-color:#f5f5f5;color:#4a4a4a}.file-name{border-color:#dbdbdb;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:left;text-overflow:ellipsis}.file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:0.5em;width:1em}.file-icon .fa{font-size:14px}.label{color:#363636;display:block;font-size:1rem;font-weight:700}.label:not(:last-child){margin-bottom:0.5em}.label.is-small,#documenter .docs-sidebar form.docs-search>input.label{font-size:.75rem}.label.is-medium{font-size:1.25rem}.label.is-large{font-size:1.5rem}.help{display:block;font-size:.75rem;margin-top:0.25rem}.help.is-white{color:#fff}.help.is-black{color:#0a0a0a}.help.is-light{color:#f5f5f5}.help.is-dark,.content kbd.help{color:#363636}.help.is-primary,.docstring>section>a.help.docs-sourcelink{color:#4eb5de}.help.is-link{color:#2e63b8}.help.is-info{color:#209cee}.help.is-success{color:#22c35b}.help.is-warning{color:#ffdd57}.help.is-danger{color:#da0b00}.field:not(:last-child){margin-bottom:0.75rem}.field.has-addons{display:flex;justify-content:flex-start}.field.has-addons .control:not(:last-child){margin-right:-1px}.field.has-addons .control:not(:first-child):not(:last-child) .button,.field.has-addons .control:not(:first-child):not(:last-child) .input,.field.has-addons .control:not(:first-child):not(:last-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:not(:first-child):not(:last-child) form.docs-search>input,.field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}.field.has-addons .control:first-child:not(:only-child) .button,.field.has-addons .control:first-child:not(:only-child) .input,.field.has-addons .control:first-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:first-child:not(:only-child) form.docs-search>input,.field.has-addons .control:first-child:not(:only-child) .select select{border-bottom-right-radius:0;border-top-right-radius:0}.field.has-addons .control:last-child:not(:only-child) .button,.field.has-addons .control:last-child:not(:only-child) .input,.field.has-addons .control:last-child:not(:only-child) #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .field.has-addons .control:last-child:not(:only-child) form.docs-search>input,.field.has-addons .control:last-child:not(:only-child) .select select{border-bottom-left-radius:0;border-top-left-radius:0}.field.has-addons .control .button:not([disabled]):hover,.field.has-addons .control .button.is-hovered:not([disabled]),.field.has-addons .control .input:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):hover,.field.has-addons .control .input.is-hovered:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-hovered:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-hovered:not([disabled]),.field.has-addons .control .select select:not([disabled]):hover,.field.has-addons .control .select select.is-hovered:not([disabled]){z-index:2}.field.has-addons .control .button:not([disabled]):focus,.field.has-addons .control .button.is-focused:not([disabled]),.field.has-addons .control .button:not([disabled]):active,.field.has-addons .control .button.is-active:not([disabled]),.field.has-addons .control .input:not([disabled]):focus,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus,.field.has-addons .control .input.is-focused:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]),.field.has-addons .control .input:not([disabled]):active,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active,.field.has-addons .control .input.is-active:not([disabled]),.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]),#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]),.field.has-addons .control .select select:not([disabled]):focus,.field.has-addons .control .select select.is-focused:not([disabled]),.field.has-addons .control .select select:not([disabled]):active,.field.has-addons .control .select select.is-active:not([disabled]){z-index:3}.field.has-addons .control .button:not([disabled]):focus:hover,.field.has-addons .control .button.is-focused:not([disabled]):hover,.field.has-addons .control .button:not([disabled]):active:hover,.field.has-addons .control .button.is-active:not([disabled]):hover,.field.has-addons .control .input:not([disabled]):focus:hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):focus:hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):focus:hover,.field.has-addons .control .input.is-focused:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-focused:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-focused:not([disabled]):hover,.field.has-addons .control .input:not([disabled]):active:hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input:not([disabled]):active:hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input:not([disabled]):active:hover,.field.has-addons .control .input.is-active:not([disabled]):hover,.field.has-addons .control #documenter .docs-sidebar form.docs-search>input.is-active:not([disabled]):hover,#documenter .docs-sidebar .field.has-addons .control form.docs-search>input.is-active:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]):focus:hover,.field.has-addons .control .select select.is-focused:not([disabled]):hover,.field.has-addons .control .select select:not([disabled]):active:hover,.field.has-addons .control .select select.is-active:not([disabled]):hover{z-index:4}.field.has-addons .control.is-expanded{flex-grow:1;flex-shrink:1}.field.has-addons.has-addons-centered{justify-content:center}.field.has-addons.has-addons-right{justify-content:flex-end}.field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}.field.is-grouped{display:flex;justify-content:flex-start}.field.is-grouped>.control{flex-shrink:0}.field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:0.75rem}.field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}.field.is-grouped.is-grouped-centered{justify-content:center}.field.is-grouped.is-grouped-right{justify-content:flex-end}.field.is-grouped.is-grouped-multiline{flex-wrap:wrap}.field.is-grouped.is-grouped-multiline>.control:last-child,.field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:0.75rem}.field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-0.75rem}.field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width: 769px),print{.field.is-horizontal{display:flex}}.field-label .label{font-size:inherit}@media screen and (max-width: 768px){.field-label{margin-bottom:0.5rem}}@media screen and (min-width: 769px),print{.field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}.field-label.is-small,#documenter .docs-sidebar form.docs-search>input.field-label{font-size:.75rem;padding-top:0.375em}.field-label.is-normal{padding-top:0.375em}.field-label.is-medium{font-size:1.25rem;padding-top:0.375em}.field-label.is-large{font-size:1.5rem;padding-top:0.375em}}.field-body .field .field{margin-bottom:0}@media screen and (min-width: 769px),print{.field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}.field-body .field{margin-bottom:0}.field-body>.field{flex-shrink:1}.field-body>.field:not(.is-narrow){flex-grow:1}.field-body>.field:not(:last-child){margin-right:0.75rem}}.control{box-sizing:border-box;clear:both;font-size:1rem;position:relative;text-align:left}.control.has-icons-left .input:focus~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input:focus~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input:focus~.icon,.control.has-icons-left .select:focus~.icon,.control.has-icons-right .input:focus~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input:focus~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input:focus~.icon,.control.has-icons-right .select:focus~.icon{color:#6b6b6b}.control.has-icons-left .input.is-small~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input~.icon,.control.has-icons-left .select.is-small~.icon,.control.has-icons-right .input.is-small~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input~.icon,.control.has-icons-right .select.is-small~.icon{font-size:.75rem}.control.has-icons-left .input.is-medium~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-medium~.icon,.control.has-icons-left .select.is-medium~.icon,.control.has-icons-right .input.is-medium~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-medium~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-medium~.icon,.control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}.control.has-icons-left .input.is-large~.icon,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input.is-large~.icon,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input.is-large~.icon,.control.has-icons-left .select.is-large~.icon,.control.has-icons-right .input.is-large~.icon,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input.is-large~.icon,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input.is-large~.icon,.control.has-icons-right .select.is-large~.icon{font-size:1.5rem}.control.has-icons-left .icon,.control.has-icons-right .icon{color:#dbdbdb;height:2.25em;pointer-events:none;position:absolute;top:0;width:2.25em;z-index:4}.control.has-icons-left .input,.control.has-icons-left #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .control.has-icons-left form.docs-search>input,.control.has-icons-left .select select{padding-left:2.25em}.control.has-icons-left .icon.is-left{left:0}.control.has-icons-right .input,.control.has-icons-right #documenter .docs-sidebar form.docs-search>input,#documenter .docs-sidebar .control.has-icons-right form.docs-search>input,.control.has-icons-right .select select{padding-right:2.25em}.control.has-icons-right .icon.is-right{right:0}.control.is-loading::after{position:absolute !important;right:0.625em;top:0.625em;z-index:4}.control.is-loading.is-small:after,#documenter .docs-sidebar form.docs-search>input.is-loading:after{font-size:.75rem}.control.is-loading.is-medium:after{font-size:1.25rem}.control.is-loading.is-large:after{font-size:1.5rem}.breadcrumb{font-size:1rem;white-space:nowrap}.breadcrumb a{align-items:center;color:#2e63b8;display:flex;justify-content:center;padding:0 .75em}.breadcrumb a:hover{color:#363636}.breadcrumb li{align-items:center;display:flex}.breadcrumb li:first-child a{padding-left:0}.breadcrumb li.is-active a{color:#222;cursor:default;pointer-events:none}.breadcrumb li+li::before{color:#b5b5b5;content:"\0002f"}.breadcrumb ul,.breadcrumb ol{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}.breadcrumb .icon:first-child{margin-right:0.5em}.breadcrumb .icon:last-child{margin-left:0.5em}.breadcrumb.is-centered ol,.breadcrumb.is-centered ul{justify-content:center}.breadcrumb.is-right ol,.breadcrumb.is-right ul{justify-content:flex-end}.breadcrumb.is-small,#documenter .docs-sidebar form.docs-search>input.breadcrumb{font-size:.75rem}.breadcrumb.is-medium{font-size:1.25rem}.breadcrumb.is-large{font-size:1.5rem}.breadcrumb.has-arrow-separator li+li::before{content:"\02192"}.breadcrumb.has-bullet-separator li+li::before{content:"\02022"}.breadcrumb.has-dot-separator li+li::before{content:"\000b7"}.breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}.card{background-color:#fff;box-shadow:0 2px 3px rgba(10,10,10,0.1),0 0 0 1px rgba(10,10,10,0.1);color:#222;max-width:100%;position:relative}.card-header{background-color:rgba(0,0,0,0);align-items:stretch;box-shadow:0 1px 2px rgba(10,10,10,0.1);display:flex}.card-header-title{align-items:center;color:#222;display:flex;flex-grow:1;font-weight:700;padding:.75rem}.card-header-title.is-centered{justify-content:center}.card-header-icon{align-items:center;cursor:pointer;display:flex;justify-content:center;padding:.75rem}.card-image{display:block;position:relative}.card-content{background-color:rgba(0,0,0,0);padding:1.5rem}.card-footer{background-color:rgba(0,0,0,0);border-top:1px solid #dbdbdb;align-items:stretch;display:flex}.card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}.card-footer-item:not(:last-child){border-right:1px solid #dbdbdb}.card .media:not(:last-child){margin-bottom:1.5rem}.dropdown{display:inline-flex;position:relative;vertical-align:top}.dropdown.is-active .dropdown-menu,.dropdown.is-hoverable:hover .dropdown-menu{display:block}.dropdown.is-right .dropdown-menu{left:auto;right:0}.dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}.dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}.dropdown-content{background-color:#fff;border-radius:4px;box-shadow:0 2px 3px rgba(10,10,10,0.1),0 0 0 1px rgba(10,10,10,0.1);padding-bottom:.5rem;padding-top:.5rem}.dropdown-item{color:#4a4a4a;display:block;font-size:0.875rem;line-height:1.5;padding:0.375rem 1rem;position:relative}a.dropdown-item,button.dropdown-item{padding-right:3rem;text-align:left;white-space:nowrap;width:100%}a.dropdown-item:hover,button.dropdown-item:hover{background-color:#f5f5f5;color:#0a0a0a}a.dropdown-item.is-active,button.dropdown-item.is-active{background-color:#2e63b8;color:#fff}.dropdown-divider{background-color:#dbdbdb;border:none;display:block;height:1px;margin:0.5rem 0}.level{align-items:center;justify-content:space-between}.level code{border-radius:4px}.level img{display:inline-block;vertical-align:top}.level.is-mobile{display:flex}.level.is-mobile .level-left,.level.is-mobile .level-right{display:flex}.level.is-mobile .level-left+.level-right{margin-top:0}.level.is-mobile .level-item:not(:last-child){margin-bottom:0;margin-right:.75rem}.level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width: 769px),print{.level{display:flex}.level>.level-item:not(.is-narrow){flex-grow:1}}.level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}.level-item .title,.level-item .subtitle{margin-bottom:0}@media screen and (max-width: 768px){.level-item:not(:last-child){margin-bottom:.75rem}}.level-left,.level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.level-left .level-item.is-flexible,.level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width: 769px),print{.level-left .level-item:not(:last-child),.level-right .level-item:not(:last-child){margin-right:.75rem}}.level-left{align-items:center;justify-content:flex-start}@media screen and (max-width: 768px){.level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width: 769px),print{.level-left{display:flex}}.level-right{align-items:center;justify-content:flex-end}@media screen and (min-width: 769px),print{.level-right{display:flex}}.list{background-color:#fff;border-radius:4px;box-shadow:0 2px 3px rgba(10,10,10,0.1),0 0 0 1px rgba(10,10,10,0.1)}.list-item{display:block;padding:0.5em 1em}.list-item:not(a){color:#222}.list-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-item:last-child{border-bottom-left-radius:4px;border-bottom-right-radius:4px}.list-item:not(:last-child){border-bottom:1px solid #dbdbdb}.list-item.is-active{background-color:#2e63b8;color:#fff}a.list-item{background-color:#f5f5f5;cursor:pointer}.media{align-items:flex-start;display:flex;text-align:left}.media .content:not(:last-child){margin-bottom:0.75rem}.media .media{border-top:1px solid rgba(219,219,219,0.5);display:flex;padding-top:0.75rem}.media .media .content:not(:last-child),.media .media .control:not(:last-child){margin-bottom:0.5rem}.media .media .media{padding-top:0.5rem}.media .media .media+.media{margin-top:0.5rem}.media+.media{border-top:1px solid rgba(219,219,219,0.5);margin-top:1rem;padding-top:1rem}.media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}.media-left,.media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.media-left{margin-right:1rem}.media-right{margin-left:1rem}.media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:left}@media screen and (max-width: 768px){.media-content{overflow-x:auto}}.menu{font-size:1rem}.menu.is-small,#documenter .docs-sidebar form.docs-search>input.menu{font-size:.75rem}.menu.is-medium{font-size:1.25rem}.menu.is-large{font-size:1.5rem}.menu-list{line-height:1.25}.menu-list a{border-radius:2px;color:#222;display:block;padding:0.5em 0.75em}.menu-list a:hover{background-color:#f5f5f5;color:#222}.menu-list a.is-active{background-color:#2e63b8;color:#fff}.menu-list li ul{border-left:1px solid #dbdbdb;margin:.75em;padding-left:.75em}.menu-label{color:#6b6b6b;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}.menu-label:not(:first-child){margin-top:1em}.menu-label:not(:last-child){margin-bottom:1em}.message{background-color:#f5f5f5;border-radius:4px;font-size:1rem}.message strong{color:currentColor}.message a:not(.button):not(.tag):not(.dropdown-item){color:currentColor;text-decoration:underline}.message.is-small,#documenter .docs-sidebar form.docs-search>input.message{font-size:.75rem}.message.is-medium{font-size:1.25rem}.message.is-large{font-size:1.5rem}.message.is-white{background-color:#fff}.message.is-white .message-header{background-color:#fff;color:#0a0a0a}.message.is-white .message-body{border-color:#fff;color:#4d4d4d}.message.is-black{background-color:#fafafa}.message.is-black .message-header{background-color:#0a0a0a;color:#fff}.message.is-black .message-body{border-color:#0a0a0a;color:#090909}.message.is-light{background-color:#fafafa}.message.is-light .message-header{background-color:#f5f5f5;color:#363636}.message.is-light .message-body{border-color:#f5f5f5;color:#505050}.message.is-dark,.content kbd.message{background-color:#fafafa}.message.is-dark .message-header,.content kbd.message .message-header{background-color:#363636;color:#f5f5f5}.message.is-dark .message-body,.content kbd.message .message-body{border-color:#363636;color:#2a2a2a}.message.is-primary,.docstring>section>a.message.docs-sourcelink{background-color:#f6fbfd}.message.is-primary .message-header,.docstring>section>a.message.docs-sourcelink .message-header{background-color:#4eb5de;color:#fff}.message.is-primary .message-body,.docstring>section>a.message.docs-sourcelink .message-body{border-color:#4eb5de;color:#1f556a}.message.is-link{background-color:#f7f9fd}.message.is-link .message-header{background-color:#2e63b8;color:#fff}.message.is-link .message-body{border-color:#2e63b8;color:#264981}.message.is-info{background-color:#f6fbfe}.message.is-info .message-header{background-color:#209cee;color:#fff}.message.is-info .message-body{border-color:#209cee;color:#12537d}.message.is-success{background-color:#f6fdf9}.message.is-success .message-header{background-color:#22c35b;color:#fff}.message.is-success .message-body{border-color:#22c35b;color:#0f361d}.message.is-warning{background-color:#fffdf5}.message.is-warning .message-header{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.message.is-warning .message-body{border-color:#ffdd57;color:#3c3108}.message.is-danger{background-color:#fff5f5}.message.is-danger .message-header{background-color:#da0b00;color:#fff}.message.is-danger .message-body{border-color:#da0b00;color:#9b0c04}.message-header{align-items:center;background-color:#222;border-radius:4px 4px 0 0;color:#fff;display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.75em 1em;position:relative}.message-header .delete{flex-grow:0;flex-shrink:0;margin-left:0.75em}.message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}.message-body{border-color:#dbdbdb;border-radius:4px;border-style:solid;border-width:0 0 0 4px;color:#222;padding:1.25em 1.5em}.message-body code,.message-body pre{background-color:#fff}.message-body pre code{background-color:rgba(0,0,0,0)}.modal{align-items:center;display:none;flex-direction:column;justify-content:center;overflow:hidden;position:fixed;z-index:40}.modal.is-active{display:flex}.modal-background{background-color:rgba(10,10,10,0.86)}.modal-content,.modal-card{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width: 769px),print{.modal-content,.modal-card{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}.modal-close{background:none;height:40px;position:fixed;right:20px;top:20px;width:40px}.modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden;-ms-overflow-y:visible}.modal-card-head,.modal-card-foot{align-items:center;background-color:#f5f5f5;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}.modal-card-head{border-bottom:1px solid #dbdbdb;border-top-left-radius:6px;border-top-right-radius:6px}.modal-card-title{color:#222;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}.modal-card-foot{border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:1px solid #dbdbdb}.modal-card-foot .button:not(:last-child){margin-right:0.5em}.modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}.navbar{background-color:#fff;min-height:3.25rem;position:relative;z-index:30}.navbar.is-white{background-color:#fff;color:#0a0a0a}.navbar.is-white .navbar-brand>.navbar-item,.navbar.is-white .navbar-brand .navbar-link{color:#0a0a0a}.navbar.is-white .navbar-brand>a.navbar-item:focus,.navbar.is-white .navbar-brand>a.navbar-item:hover,.navbar.is-white .navbar-brand>a.navbar-item.is-active,.navbar.is-white .navbar-brand .navbar-link:focus,.navbar.is-white .navbar-brand .navbar-link:hover,.navbar.is-white .navbar-brand .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-burger{color:#0a0a0a}@media screen and (min-width: 1056px){.navbar.is-white .navbar-start>.navbar-item,.navbar.is-white .navbar-start .navbar-link,.navbar.is-white .navbar-end>.navbar-item,.navbar.is-white .navbar-end .navbar-link{color:#0a0a0a}.navbar.is-white .navbar-start>a.navbar-item:focus,.navbar.is-white .navbar-start>a.navbar-item:hover,.navbar.is-white .navbar-start>a.navbar-item.is-active,.navbar.is-white .navbar-start .navbar-link:focus,.navbar.is-white .navbar-start .navbar-link:hover,.navbar.is-white .navbar-start .navbar-link.is-active,.navbar.is-white .navbar-end>a.navbar-item:focus,.navbar.is-white .navbar-end>a.navbar-item:hover,.navbar.is-white .navbar-end>a.navbar-item.is-active,.navbar.is-white .navbar-end .navbar-link:focus,.navbar.is-white .navbar-end .navbar-link:hover,.navbar.is-white .navbar-end .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-start .navbar-link::after,.navbar.is-white .navbar-end .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-white .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}.navbar.is-black{background-color:#0a0a0a;color:#fff}.navbar.is-black .navbar-brand>.navbar-item,.navbar.is-black .navbar-brand .navbar-link{color:#fff}.navbar.is-black .navbar-brand>a.navbar-item:focus,.navbar.is-black .navbar-brand>a.navbar-item:hover,.navbar.is-black .navbar-brand>a.navbar-item.is-active,.navbar.is-black .navbar-brand .navbar-link:focus,.navbar.is-black .navbar-brand .navbar-link:hover,.navbar.is-black .navbar-brand .navbar-link.is-active{background-color:#000;color:#fff}.navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-black .navbar-start>.navbar-item,.navbar.is-black .navbar-start .navbar-link,.navbar.is-black .navbar-end>.navbar-item,.navbar.is-black .navbar-end .navbar-link{color:#fff}.navbar.is-black .navbar-start>a.navbar-item:focus,.navbar.is-black .navbar-start>a.navbar-item:hover,.navbar.is-black .navbar-start>a.navbar-item.is-active,.navbar.is-black .navbar-start .navbar-link:focus,.navbar.is-black .navbar-start .navbar-link:hover,.navbar.is-black .navbar-start .navbar-link.is-active,.navbar.is-black .navbar-end>a.navbar-item:focus,.navbar.is-black .navbar-end>a.navbar-item:hover,.navbar.is-black .navbar-end>a.navbar-item.is-active,.navbar.is-black .navbar-end .navbar-link:focus,.navbar.is-black .navbar-end .navbar-link:hover,.navbar.is-black .navbar-end .navbar-link.is-active{background-color:#000;color:#fff}.navbar.is-black .navbar-start .navbar-link::after,.navbar.is-black .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-black .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link{background-color:#000;color:#fff}.navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}.navbar.is-light{background-color:#f5f5f5;color:#363636}.navbar.is-light .navbar-brand>.navbar-item,.navbar.is-light .navbar-brand .navbar-link{color:#363636}.navbar.is-light .navbar-brand>a.navbar-item:focus,.navbar.is-light .navbar-brand>a.navbar-item:hover,.navbar.is-light .navbar-brand>a.navbar-item.is-active,.navbar.is-light .navbar-brand .navbar-link:focus,.navbar.is-light .navbar-brand .navbar-link:hover,.navbar.is-light .navbar-brand .navbar-link.is-active{background-color:#e8e8e8;color:#363636}.navbar.is-light .navbar-brand .navbar-link::after{border-color:#363636}.navbar.is-light .navbar-burger{color:#363636}@media screen and (min-width: 1056px){.navbar.is-light .navbar-start>.navbar-item,.navbar.is-light .navbar-start .navbar-link,.navbar.is-light .navbar-end>.navbar-item,.navbar.is-light .navbar-end .navbar-link{color:#363636}.navbar.is-light .navbar-start>a.navbar-item:focus,.navbar.is-light .navbar-start>a.navbar-item:hover,.navbar.is-light .navbar-start>a.navbar-item.is-active,.navbar.is-light .navbar-start .navbar-link:focus,.navbar.is-light .navbar-start .navbar-link:hover,.navbar.is-light .navbar-start .navbar-link.is-active,.navbar.is-light .navbar-end>a.navbar-item:focus,.navbar.is-light .navbar-end>a.navbar-item:hover,.navbar.is-light .navbar-end>a.navbar-item.is-active,.navbar.is-light .navbar-end .navbar-link:focus,.navbar.is-light .navbar-end .navbar-link:hover,.navbar.is-light .navbar-end .navbar-link.is-active{background-color:#e8e8e8;color:#363636}.navbar.is-light .navbar-start .navbar-link::after,.navbar.is-light .navbar-end .navbar-link::after{border-color:#363636}.navbar.is-light .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-light .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link{background-color:#e8e8e8;color:#363636}.navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#363636}}.navbar.is-dark,.content kbd.navbar{background-color:#363636;color:#f5f5f5}.navbar.is-dark .navbar-brand>.navbar-item,.content kbd.navbar .navbar-brand>.navbar-item,.navbar.is-dark .navbar-brand .navbar-link,.content kbd.navbar .navbar-brand .navbar-link{color:#f5f5f5}.navbar.is-dark .navbar-brand>a.navbar-item:focus,.content kbd.navbar .navbar-brand>a.navbar-item:focus,.navbar.is-dark .navbar-brand>a.navbar-item:hover,.content kbd.navbar .navbar-brand>a.navbar-item:hover,.navbar.is-dark .navbar-brand>a.navbar-item.is-active,.content kbd.navbar .navbar-brand>a.navbar-item.is-active,.navbar.is-dark .navbar-brand .navbar-link:focus,.content kbd.navbar .navbar-brand .navbar-link:focus,.navbar.is-dark .navbar-brand .navbar-link:hover,.content kbd.navbar .navbar-brand .navbar-link:hover,.navbar.is-dark .navbar-brand .navbar-link.is-active,.content kbd.navbar .navbar-brand .navbar-link.is-active{background-color:#292929;color:#f5f5f5}.navbar.is-dark .navbar-brand .navbar-link::after,.content kbd.navbar .navbar-brand .navbar-link::after{border-color:#f5f5f5}.navbar.is-dark .navbar-burger,.content kbd.navbar .navbar-burger{color:#f5f5f5}@media screen and (min-width: 1056px){.navbar.is-dark .navbar-start>.navbar-item,.content kbd.navbar .navbar-start>.navbar-item,.navbar.is-dark .navbar-start .navbar-link,.content kbd.navbar .navbar-start .navbar-link,.navbar.is-dark .navbar-end>.navbar-item,.content kbd.navbar .navbar-end>.navbar-item,.navbar.is-dark .navbar-end .navbar-link,.content kbd.navbar .navbar-end .navbar-link{color:#f5f5f5}.navbar.is-dark .navbar-start>a.navbar-item:focus,.content kbd.navbar .navbar-start>a.navbar-item:focus,.navbar.is-dark .navbar-start>a.navbar-item:hover,.content kbd.navbar .navbar-start>a.navbar-item:hover,.navbar.is-dark .navbar-start>a.navbar-item.is-active,.content kbd.navbar .navbar-start>a.navbar-item.is-active,.navbar.is-dark .navbar-start .navbar-link:focus,.content kbd.navbar .navbar-start .navbar-link:focus,.navbar.is-dark .navbar-start .navbar-link:hover,.content kbd.navbar .navbar-start .navbar-link:hover,.navbar.is-dark .navbar-start .navbar-link.is-active,.content kbd.navbar .navbar-start .navbar-link.is-active,.navbar.is-dark .navbar-end>a.navbar-item:focus,.content kbd.navbar .navbar-end>a.navbar-item:focus,.navbar.is-dark .navbar-end>a.navbar-item:hover,.content kbd.navbar .navbar-end>a.navbar-item:hover,.navbar.is-dark .navbar-end>a.navbar-item.is-active,.content kbd.navbar .navbar-end>a.navbar-item.is-active,.navbar.is-dark .navbar-end .navbar-link:focus,.content kbd.navbar .navbar-end .navbar-link:focus,.navbar.is-dark .navbar-end .navbar-link:hover,.content kbd.navbar .navbar-end .navbar-link:hover,.navbar.is-dark .navbar-end .navbar-link.is-active,.content kbd.navbar .navbar-end .navbar-link.is-active{background-color:#292929;color:#f5f5f5}.navbar.is-dark .navbar-start .navbar-link::after,.content kbd.navbar .navbar-start .navbar-link::after,.navbar.is-dark .navbar-end .navbar-link::after,.content kbd.navbar .navbar-end .navbar-link::after{border-color:#f5f5f5}.navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link,.content kbd.navbar .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link,.content kbd.navbar .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,.content kbd.navbar .navbar-item.has-dropdown.is-active .navbar-link{background-color:#292929;color:#f5f5f5}.navbar.is-dark .navbar-dropdown a.navbar-item.is-active,.content kbd.navbar .navbar-dropdown a.navbar-item.is-active{background-color:#363636;color:#f5f5f5}}.navbar.is-primary,.docstring>section>a.navbar.docs-sourcelink{background-color:#4eb5de;color:#fff}.navbar.is-primary .navbar-brand>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>.navbar-item,.navbar.is-primary .navbar-brand .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link{color:#fff}.navbar.is-primary .navbar-brand>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:focus,.navbar.is-primary .navbar-brand>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item:hover,.navbar.is-primary .navbar-brand>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-brand>a.navbar-item.is-active,.navbar.is-primary .navbar-brand .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:focus,.navbar.is-primary .navbar-brand .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link:hover,.navbar.is-primary .navbar-brand .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link.is-active{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-brand .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-burger,.docstring>section>a.navbar.docs-sourcelink .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-primary .navbar-start>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-start>.navbar-item,.navbar.is-primary .navbar-start .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link,.navbar.is-primary .navbar-end>.navbar-item,.docstring>section>a.navbar.docs-sourcelink .navbar-end>.navbar-item,.navbar.is-primary .navbar-end .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link{color:#fff}.navbar.is-primary .navbar-start>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:focus,.navbar.is-primary .navbar-start>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item:hover,.navbar.is-primary .navbar-start>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-start>a.navbar-item.is-active,.navbar.is-primary .navbar-start .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:focus,.navbar.is-primary .navbar-start .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link:hover,.navbar.is-primary .navbar-start .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link.is-active,.navbar.is-primary .navbar-end>a.navbar-item:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:focus,.navbar.is-primary .navbar-end>a.navbar-item:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item:hover,.navbar.is-primary .navbar-end>a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-end>a.navbar-item.is-active,.navbar.is-primary .navbar-end .navbar-link:focus,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:focus,.navbar.is-primary .navbar-end .navbar-link:hover,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link:hover,.navbar.is-primary .navbar-end .navbar-link.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link.is-active{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-start .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-start .navbar-link::after,.navbar.is-primary .navbar-end .navbar-link::after,.docstring>section>a.navbar.docs-sourcelink .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,.docstring>section>a.navbar.docs-sourcelink .navbar-item.has-dropdown.is-active .navbar-link{background-color:#39acda;color:#fff}.navbar.is-primary .navbar-dropdown a.navbar-item.is-active,.docstring>section>a.navbar.docs-sourcelink .navbar-dropdown a.navbar-item.is-active{background-color:#4eb5de;color:#fff}}.navbar.is-link{background-color:#2e63b8;color:#fff}.navbar.is-link .navbar-brand>.navbar-item,.navbar.is-link .navbar-brand .navbar-link{color:#fff}.navbar.is-link .navbar-brand>a.navbar-item:focus,.navbar.is-link .navbar-brand>a.navbar-item:hover,.navbar.is-link .navbar-brand>a.navbar-item.is-active,.navbar.is-link .navbar-brand .navbar-link:focus,.navbar.is-link .navbar-brand .navbar-link:hover,.navbar.is-link .navbar-brand .navbar-link.is-active{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-link .navbar-start>.navbar-item,.navbar.is-link .navbar-start .navbar-link,.navbar.is-link .navbar-end>.navbar-item,.navbar.is-link .navbar-end .navbar-link{color:#fff}.navbar.is-link .navbar-start>a.navbar-item:focus,.navbar.is-link .navbar-start>a.navbar-item:hover,.navbar.is-link .navbar-start>a.navbar-item.is-active,.navbar.is-link .navbar-start .navbar-link:focus,.navbar.is-link .navbar-start .navbar-link:hover,.navbar.is-link .navbar-start .navbar-link.is-active,.navbar.is-link .navbar-end>a.navbar-item:focus,.navbar.is-link .navbar-end>a.navbar-item:hover,.navbar.is-link .navbar-end>a.navbar-item.is-active,.navbar.is-link .navbar-end .navbar-link:focus,.navbar.is-link .navbar-end .navbar-link:hover,.navbar.is-link .navbar-end .navbar-link.is-active{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-start .navbar-link::after,.navbar.is-link .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-link .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link{background-color:#2958a4;color:#fff}.navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#2e63b8;color:#fff}}.navbar.is-info{background-color:#209cee;color:#fff}.navbar.is-info .navbar-brand>.navbar-item,.navbar.is-info .navbar-brand .navbar-link{color:#fff}.navbar.is-info .navbar-brand>a.navbar-item:focus,.navbar.is-info .navbar-brand>a.navbar-item:hover,.navbar.is-info .navbar-brand>a.navbar-item.is-active,.navbar.is-info .navbar-brand .navbar-link:focus,.navbar.is-info .navbar-brand .navbar-link:hover,.navbar.is-info .navbar-brand .navbar-link.is-active{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-info .navbar-start>.navbar-item,.navbar.is-info .navbar-start .navbar-link,.navbar.is-info .navbar-end>.navbar-item,.navbar.is-info .navbar-end .navbar-link{color:#fff}.navbar.is-info .navbar-start>a.navbar-item:focus,.navbar.is-info .navbar-start>a.navbar-item:hover,.navbar.is-info .navbar-start>a.navbar-item.is-active,.navbar.is-info .navbar-start .navbar-link:focus,.navbar.is-info .navbar-start .navbar-link:hover,.navbar.is-info .navbar-start .navbar-link.is-active,.navbar.is-info .navbar-end>a.navbar-item:focus,.navbar.is-info .navbar-end>a.navbar-item:hover,.navbar.is-info .navbar-end>a.navbar-item.is-active,.navbar.is-info .navbar-end .navbar-link:focus,.navbar.is-info .navbar-end .navbar-link:hover,.navbar.is-info .navbar-end .navbar-link.is-active{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-start .navbar-link::after,.navbar.is-info .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-info .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1190e3;color:#fff}.navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#209cee;color:#fff}}.navbar.is-success{background-color:#22c35b;color:#fff}.navbar.is-success .navbar-brand>.navbar-item,.navbar.is-success .navbar-brand .navbar-link{color:#fff}.navbar.is-success .navbar-brand>a.navbar-item:focus,.navbar.is-success .navbar-brand>a.navbar-item:hover,.navbar.is-success .navbar-brand>a.navbar-item.is-active,.navbar.is-success .navbar-brand .navbar-link:focus,.navbar.is-success .navbar-brand .navbar-link:hover,.navbar.is-success .navbar-brand .navbar-link.is-active{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-success .navbar-start>.navbar-item,.navbar.is-success .navbar-start .navbar-link,.navbar.is-success .navbar-end>.navbar-item,.navbar.is-success .navbar-end .navbar-link{color:#fff}.navbar.is-success .navbar-start>a.navbar-item:focus,.navbar.is-success .navbar-start>a.navbar-item:hover,.navbar.is-success .navbar-start>a.navbar-item.is-active,.navbar.is-success .navbar-start .navbar-link:focus,.navbar.is-success .navbar-start .navbar-link:hover,.navbar.is-success .navbar-start .navbar-link.is-active,.navbar.is-success .navbar-end>a.navbar-item:focus,.navbar.is-success .navbar-end>a.navbar-item:hover,.navbar.is-success .navbar-end>a.navbar-item.is-active,.navbar.is-success .navbar-end .navbar-link:focus,.navbar.is-success .navbar-end .navbar-link:hover,.navbar.is-success .navbar-end .navbar-link.is-active{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-start .navbar-link::after,.navbar.is-success .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-success .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link{background-color:#1ead51;color:#fff}.navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#22c35b;color:#fff}}.navbar.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand>.navbar-item,.navbar.is-warning .navbar-brand .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand>a.navbar-item:focus,.navbar.is-warning .navbar-brand>a.navbar-item:hover,.navbar.is-warning .navbar-brand>a.navbar-item.is-active,.navbar.is-warning .navbar-brand .navbar-link:focus,.navbar.is-warning .navbar-brand .navbar-link:hover,.navbar.is-warning .navbar-brand .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-burger{color:rgba(0,0,0,0.7)}@media screen and (min-width: 1056px){.navbar.is-warning .navbar-start>.navbar-item,.navbar.is-warning .navbar-start .navbar-link,.navbar.is-warning .navbar-end>.navbar-item,.navbar.is-warning .navbar-end .navbar-link{color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-start>a.navbar-item:focus,.navbar.is-warning .navbar-start>a.navbar-item:hover,.navbar.is-warning .navbar-start>a.navbar-item.is-active,.navbar.is-warning .navbar-start .navbar-link:focus,.navbar.is-warning .navbar-start .navbar-link:hover,.navbar.is-warning .navbar-start .navbar-link.is-active,.navbar.is-warning .navbar-end>a.navbar-item:focus,.navbar.is-warning .navbar-end>a.navbar-item:hover,.navbar.is-warning .navbar-end>a.navbar-item.is-active,.navbar.is-warning .navbar-end .navbar-link:focus,.navbar.is-warning .navbar-end .navbar-link:hover,.navbar.is-warning .navbar-end .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-start .navbar-link::after,.navbar.is-warning .navbar-end .navbar-link::after{border-color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ffdd57;color:rgba(0,0,0,0.7)}}.navbar.is-danger{background-color:#da0b00;color:#fff}.navbar.is-danger .navbar-brand>.navbar-item,.navbar.is-danger .navbar-brand .navbar-link{color:#fff}.navbar.is-danger .navbar-brand>a.navbar-item:focus,.navbar.is-danger .navbar-brand>a.navbar-item:hover,.navbar.is-danger .navbar-brand>a.navbar-item.is-active,.navbar.is-danger .navbar-brand .navbar-link:focus,.navbar.is-danger .navbar-brand .navbar-link:hover,.navbar.is-danger .navbar-brand .navbar-link.is-active{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-burger{color:#fff}@media screen and (min-width: 1056px){.navbar.is-danger .navbar-start>.navbar-item,.navbar.is-danger .navbar-start .navbar-link,.navbar.is-danger .navbar-end>.navbar-item,.navbar.is-danger .navbar-end .navbar-link{color:#fff}.navbar.is-danger .navbar-start>a.navbar-item:focus,.navbar.is-danger .navbar-start>a.navbar-item:hover,.navbar.is-danger .navbar-start>a.navbar-item.is-active,.navbar.is-danger .navbar-start .navbar-link:focus,.navbar.is-danger .navbar-start .navbar-link:hover,.navbar.is-danger .navbar-start .navbar-link.is-active,.navbar.is-danger .navbar-end>a.navbar-item:focus,.navbar.is-danger .navbar-end>a.navbar-item:hover,.navbar.is-danger .navbar-end>a.navbar-item.is-active,.navbar.is-danger .navbar-end .navbar-link:focus,.navbar.is-danger .navbar-end .navbar-link:hover,.navbar.is-danger .navbar-end .navbar-link.is-active{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-start .navbar-link::after,.navbar.is-danger .navbar-end .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link,.navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link{background-color:#c10a00;color:#fff}.navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#da0b00;color:#fff}}.navbar>.container{align-items:stretch;display:flex;min-height:3.25rem;width:100%}.navbar.has-shadow{box-shadow:0 2px 0 0 #f5f5f5}.navbar.is-fixed-bottom,.navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom{bottom:0}.navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #f5f5f5}.navbar.is-fixed-top{top:0}html.has-navbar-fixed-top,body.has-navbar-fixed-top{padding-top:3.25rem}html.has-navbar-fixed-bottom,body.has-navbar-fixed-bottom{padding-bottom:3.25rem}.navbar-brand,.navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:3.25rem}.navbar-brand a.navbar-item:focus,.navbar-brand a.navbar-item:hover{background-color:transparent}.navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}.navbar-burger{color:#4a4a4a;cursor:pointer;display:block;height:3.25rem;position:relative;width:3.25rem;margin-left:auto}.navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;transform-origin:center;transition-duration:86ms;transition-property:background-color, opacity, transform;transition-timing-function:ease-out;width:16px}.navbar-burger span:nth-child(1){top:calc(50% - 6px)}.navbar-burger span:nth-child(2){top:calc(50% - 1px)}.navbar-burger span:nth-child(3){top:calc(50% + 4px)}.navbar-burger:hover{background-color:rgba(0,0,0,0.05)}.navbar-burger.is-active span:nth-child(1){transform:translateY(5px) rotate(45deg)}.navbar-burger.is-active span:nth-child(2){opacity:0}.navbar-burger.is-active span:nth-child(3){transform:translateY(-5px) rotate(-45deg)}.navbar-menu{display:none}.navbar-item,.navbar-link{color:#4a4a4a;display:block;line-height:1.5;padding:0.5rem 0.75rem;position:relative}.navbar-item .icon:only-child,.navbar-link .icon:only-child{margin-left:-0.25rem;margin-right:-0.25rem}a.navbar-item,.navbar-link{cursor:pointer}a.navbar-item:focus,a.navbar-item:focus-within,a.navbar-item:hover,a.navbar-item.is-active,.navbar-link:focus,.navbar-link:focus-within,.navbar-link:hover,.navbar-link.is-active{background-color:#fafafa;color:#2e63b8}.navbar-item{display:block;flex-grow:0;flex-shrink:0}.navbar-item img{max-height:1.75rem}.navbar-item.has-dropdown{padding:0}.navbar-item.is-expanded{flex-grow:1;flex-shrink:1}.navbar-item.is-tab{border-bottom:1px solid transparent;min-height:3.25rem;padding-bottom:calc(0.5rem - 1px)}.navbar-item.is-tab:focus,.navbar-item.is-tab:hover{background-color:rgba(0,0,0,0);border-bottom-color:#2e63b8}.navbar-item.is-tab.is-active{background-color:rgba(0,0,0,0);border-bottom-color:#2e63b8;border-bottom-style:solid;border-bottom-width:3px;color:#2e63b8;padding-bottom:calc(0.5rem - 3px)}.navbar-content{flex-grow:1;flex-shrink:1}.navbar-link:not(.is-arrowless){padding-right:2.5em}.navbar-link:not(.is-arrowless)::after{border-color:#2e63b8;margin-top:-0.375em;right:1.125em}.navbar-dropdown{font-size:0.875rem;padding-bottom:0.5rem;padding-top:0.5rem}.navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}.navbar-divider{background-color:#f5f5f5;border:none;display:none;height:2px;margin:0.5rem 0}@media screen and (max-width: 1055px){.navbar>.container{display:block}.navbar-brand .navbar-item,.navbar-tabs .navbar-item{align-items:center;display:flex}.navbar-link::after{display:none}.navbar-menu{background-color:#fff;box-shadow:0 8px 16px rgba(10,10,10,0.1);padding:0.5rem 0}.navbar-menu.is-active{display:block}.navbar.is-fixed-bottom-touch,.navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-touch{bottom:0}.navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}.navbar.is-fixed-top-touch{top:0}.navbar.is-fixed-top .navbar-menu,.navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 3.25rem);overflow:auto}html.has-navbar-fixed-top-touch,body.has-navbar-fixed-top-touch{padding-top:3.25rem}html.has-navbar-fixed-bottom-touch,body.has-navbar-fixed-bottom-touch{padding-bottom:3.25rem}}@media screen and (min-width: 1056px){.navbar,.navbar-menu,.navbar-start,.navbar-end{align-items:stretch;display:flex}.navbar{min-height:3.25rem}.navbar.is-spaced{padding:1rem 2rem}.navbar.is-spaced .navbar-start,.navbar.is-spaced .navbar-end{align-items:center}.navbar.is-spaced a.navbar-item,.navbar.is-spaced .navbar-link{border-radius:4px}.navbar.is-transparent a.navbar-item:focus,.navbar.is-transparent a.navbar-item:hover,.navbar.is-transparent a.navbar-item.is-active,.navbar.is-transparent .navbar-link:focus,.navbar.is-transparent .navbar-link:hover,.navbar.is-transparent .navbar-link.is-active{background-color:transparent !important}.navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent !important}.navbar.is-transparent .navbar-dropdown a.navbar-item:focus,.navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#2e63b8}.navbar-burger{display:none}.navbar-item,.navbar-link{align-items:center;display:flex}.navbar-item{display:flex}.navbar-item.has-dropdown{align-items:stretch}.navbar-item.has-dropdown-up .navbar-link::after{transform:rotate(135deg) translate(0.25em, -0.25em)}.navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:2px solid #dbdbdb;border-radius:6px 6px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,0.1);top:auto}.navbar-item.is-active .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar.is-spaced .navbar-item.is-active .navbar-dropdown,.navbar-item.is-active .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown,.navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown,.navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed{opacity:1;pointer-events:auto;transform:translateY(0)}.navbar-menu{flex-grow:1;flex-shrink:0}.navbar-start{justify-content:flex-start;margin-right:auto}.navbar-end{justify-content:flex-end;margin-left:auto}.navbar-dropdown{background-color:#fff;border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:2px solid #dbdbdb;box-shadow:0 8px 8px rgba(10,10,10,0.1);display:none;font-size:0.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}.navbar-dropdown .navbar-item{padding:0.375rem 1rem;white-space:nowrap}.navbar-dropdown a.navbar-item{padding-right:3rem}.navbar-dropdown a.navbar-item:focus,.navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#2e63b8}.navbar.is-spaced .navbar-dropdown,.navbar-dropdown.is-boxed{border-radius:6px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,0.1), 0 0 0 1px rgba(10,10,10,0.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));transform:translateY(-5px);transition-duration:86ms;transition-property:opacity, transform}.navbar-dropdown.is-right{left:auto;right:0}.navbar-divider{display:block}.navbar>.container .navbar-brand,.container>.navbar .navbar-brand{margin-left:-.75rem}.navbar>.container .navbar-menu,.container>.navbar .navbar-menu{margin-right:-.75rem}.navbar.is-fixed-bottom-desktop,.navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-desktop{bottom:0}.navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,0.1)}.navbar.is-fixed-top-desktop{top:0}html.has-navbar-fixed-top-desktop,body.has-navbar-fixed-top-desktop{padding-top:3.25rem}html.has-navbar-fixed-bottom-desktop,body.has-navbar-fixed-bottom-desktop{padding-bottom:3.25rem}html.has-spaced-navbar-fixed-top,body.has-spaced-navbar-fixed-top{padding-top:5.25rem}html.has-spaced-navbar-fixed-bottom,body.has-spaced-navbar-fixed-bottom{padding-bottom:5.25rem}a.navbar-item.is-active,.navbar-link.is-active{color:#0a0a0a}a.navbar-item.is-active:not(:focus):not(:hover),.navbar-link.is-active:not(:focus):not(:hover){background-color:rgba(0,0,0,0)}.navbar-item.has-dropdown:focus .navbar-link,.navbar-item.has-dropdown:hover .navbar-link,.navbar-item.has-dropdown.is-active .navbar-link{background-color:#fafafa}}.hero.is-fullheight-with-navbar{min-height:calc(100vh - 3.25rem)}.pagination{font-size:1rem;margin:-.25rem}.pagination.is-small,#documenter .docs-sidebar form.docs-search>input.pagination{font-size:.75rem}.pagination.is-medium{font-size:1.25rem}.pagination.is-large{font-size:1.5rem}.pagination.is-rounded .pagination-previous,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-previous,.pagination.is-rounded .pagination-next,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-next{padding-left:1em;padding-right:1em;border-radius:290486px}.pagination.is-rounded .pagination-link,#documenter .docs-sidebar form.docs-search>input.pagination .pagination-link{border-radius:290486px}.pagination,.pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}.pagination-previous,.pagination-next,.pagination-link,.pagination-ellipsis{font-size:1em;justify-content:center;margin:.25rem;padding-left:.5em;padding-right:.5em;text-align:center}.pagination-previous,.pagination-next,.pagination-link{border-color:#dbdbdb;color:#363636;min-width:2.25em}.pagination-previous:hover,.pagination-next:hover,.pagination-link:hover{border-color:#b5b5b5;color:#363636}.pagination-previous:focus,.pagination-next:focus,.pagination-link:focus{border-color:#3c5dcd}.pagination-previous:active,.pagination-next:active,.pagination-link:active{box-shadow:inset 0 1px 2px rgba(10,10,10,0.2)}.pagination-previous[disabled],.pagination-next[disabled],.pagination-link[disabled]{background-color:#dbdbdb;border-color:#dbdbdb;box-shadow:none;color:#6b6b6b;opacity:0.5}.pagination-previous,.pagination-next{padding-left:0.75em;padding-right:0.75em;white-space:nowrap}.pagination-link.is-current{background-color:#2e63b8;border-color:#2e63b8;color:#fff}.pagination-ellipsis{color:#b5b5b5;pointer-events:none}.pagination-list{flex-wrap:wrap}@media screen and (max-width: 768px){.pagination{flex-wrap:wrap}.pagination-previous,.pagination-next{flex-grow:1;flex-shrink:1}.pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width: 769px),print{.pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}.pagination-previous{order:2}.pagination-next{order:3}.pagination{justify-content:space-between}.pagination.is-centered .pagination-previous{order:1}.pagination.is-centered .pagination-list{justify-content:center;order:2}.pagination.is-centered .pagination-next{order:3}.pagination.is-right .pagination-previous{order:1}.pagination.is-right .pagination-next{order:2}.pagination.is-right .pagination-list{justify-content:flex-end;order:3}}.panel{font-size:1rem}.panel:not(:last-child){margin-bottom:1.5rem}.panel-heading,.panel-tabs,.panel-block{border-bottom:1px solid #dbdbdb;border-left:1px solid #dbdbdb;border-right:1px solid #dbdbdb}.panel-heading:first-child,.panel-tabs:first-child,.panel-block:first-child{border-top:1px solid #dbdbdb}.panel-heading{background-color:#f5f5f5;border-radius:4px 4px 0 0;color:#222;font-size:1.25em;font-weight:300;line-height:1.25;padding:0.5em 0.75em}.panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}.panel-tabs a{border-bottom:1px solid #dbdbdb;margin-bottom:-1px;padding:0.5em}.panel-tabs a.is-active{border-bottom-color:#4a4a4a;color:#363636}.panel-list a{color:#222}.panel-list a:hover{color:#2e63b8}.panel-block{align-items:center;color:#222;display:flex;justify-content:flex-start;padding:0.5em 0.75em}.panel-block input[type="checkbox"]{margin-right:0.75em}.panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}.panel-block.is-wrapped{flex-wrap:wrap}.panel-block.is-active{border-left-color:#2e63b8;color:#363636}.panel-block.is-active .panel-icon{color:#2e63b8}a.panel-block,label.panel-block{cursor:pointer}a.panel-block:hover,label.panel-block:hover{background-color:#f5f5f5}.panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#6b6b6b;margin-right:0.75em}.panel-icon .fa{font-size:inherit;line-height:inherit}.tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}.tabs a{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;color:#222;display:flex;justify-content:center;margin-bottom:-1px;padding:0.5em 1em;vertical-align:top}.tabs a:hover{border-bottom-color:#222;color:#222}.tabs li{display:block}.tabs li.is-active a{border-bottom-color:#2e63b8;color:#2e63b8}.tabs ul{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}.tabs ul.is-left{padding-right:0.75em}.tabs ul.is-center{flex:none;justify-content:center;padding-left:0.75em;padding-right:0.75em}.tabs ul.is-right{justify-content:flex-end;padding-left:0.75em}.tabs .icon:first-child{margin-right:0.5em}.tabs .icon:last-child{margin-left:0.5em}.tabs.is-centered ul{justify-content:center}.tabs.is-right ul{justify-content:flex-end}.tabs.is-boxed a{border:1px solid transparent;border-radius:4px 4px 0 0}.tabs.is-boxed a:hover{background-color:#f5f5f5;border-bottom-color:#dbdbdb}.tabs.is-boxed li.is-active a{background-color:#fff;border-color:#dbdbdb;border-bottom-color:rgba(0,0,0,0) !important}.tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}.tabs.is-toggle a{border-color:#dbdbdb;border-style:solid;border-width:1px;margin-bottom:0;position:relative}.tabs.is-toggle a:hover{background-color:#f5f5f5;border-color:#b5b5b5;z-index:2}.tabs.is-toggle li+li{margin-left:-1px}.tabs.is-toggle li:first-child a{border-radius:4px 0 0 4px}.tabs.is-toggle li:last-child a{border-radius:0 4px 4px 0}.tabs.is-toggle li.is-active a{background-color:#2e63b8;border-color:#2e63b8;color:#fff;z-index:1}.tabs.is-toggle ul{border-bottom:none}.tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:290486px;border-top-left-radius:290486px;padding-left:1.25em}.tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:290486px;border-top-right-radius:290486px;padding-right:1.25em}.tabs.is-small,#documenter .docs-sidebar form.docs-search>input.tabs{font-size:.75rem}.tabs.is-medium{font-size:1.25rem}.tabs.is-large{font-size:1.5rem}.column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>.column.is-narrow{flex:none}.columns.is-mobile>.column.is-full{flex:none;width:100%}.columns.is-mobile>.column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>.column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>.column.is-half{flex:none;width:50%}.columns.is-mobile>.column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>.column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>.column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>.column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>.column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>.column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>.column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>.column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>.column.is-offset-half{margin-left:50%}.columns.is-mobile>.column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>.column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>.column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>.column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>.column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>.column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>.column.is-0{flex:none;width:0%}.columns.is-mobile>.column.is-offset-0{margin-left:0%}.columns.is-mobile>.column.is-1{flex:none;width:8.3333333333%}.columns.is-mobile>.column.is-offset-1{margin-left:8.3333333333%}.columns.is-mobile>.column.is-2{flex:none;width:16.6666666667%}.columns.is-mobile>.column.is-offset-2{margin-left:16.6666666667%}.columns.is-mobile>.column.is-3{flex:none;width:25%}.columns.is-mobile>.column.is-offset-3{margin-left:25%}.columns.is-mobile>.column.is-4{flex:none;width:33.3333333333%}.columns.is-mobile>.column.is-offset-4{margin-left:33.3333333333%}.columns.is-mobile>.column.is-5{flex:none;width:41.6666666667%}.columns.is-mobile>.column.is-offset-5{margin-left:41.6666666667%}.columns.is-mobile>.column.is-6{flex:none;width:50%}.columns.is-mobile>.column.is-offset-6{margin-left:50%}.columns.is-mobile>.column.is-7{flex:none;width:58.3333333333%}.columns.is-mobile>.column.is-offset-7{margin-left:58.3333333333%}.columns.is-mobile>.column.is-8{flex:none;width:66.6666666667%}.columns.is-mobile>.column.is-offset-8{margin-left:66.6666666667%}.columns.is-mobile>.column.is-9{flex:none;width:75%}.columns.is-mobile>.column.is-offset-9{margin-left:75%}.columns.is-mobile>.column.is-10{flex:none;width:83.3333333333%}.columns.is-mobile>.column.is-offset-10{margin-left:83.3333333333%}.columns.is-mobile>.column.is-11{flex:none;width:91.6666666667%}.columns.is-mobile>.column.is-offset-11{margin-left:91.6666666667%}.columns.is-mobile>.column.is-12{flex:none;width:100%}.columns.is-mobile>.column.is-offset-12{margin-left:100%}@media screen and (max-width: 768px){.column.is-narrow-mobile{flex:none}.column.is-full-mobile{flex:none;width:100%}.column.is-three-quarters-mobile{flex:none;width:75%}.column.is-two-thirds-mobile{flex:none;width:66.6666%}.column.is-half-mobile{flex:none;width:50%}.column.is-one-third-mobile{flex:none;width:33.3333%}.column.is-one-quarter-mobile{flex:none;width:25%}.column.is-one-fifth-mobile{flex:none;width:20%}.column.is-two-fifths-mobile{flex:none;width:40%}.column.is-three-fifths-mobile{flex:none;width:60%}.column.is-four-fifths-mobile{flex:none;width:80%}.column.is-offset-three-quarters-mobile{margin-left:75%}.column.is-offset-two-thirds-mobile{margin-left:66.6666%}.column.is-offset-half-mobile{margin-left:50%}.column.is-offset-one-third-mobile{margin-left:33.3333%}.column.is-offset-one-quarter-mobile{margin-left:25%}.column.is-offset-one-fifth-mobile{margin-left:20%}.column.is-offset-two-fifths-mobile{margin-left:40%}.column.is-offset-three-fifths-mobile{margin-left:60%}.column.is-offset-four-fifths-mobile{margin-left:80%}.column.is-0-mobile{flex:none;width:0%}.column.is-offset-0-mobile{margin-left:0%}.column.is-1-mobile{flex:none;width:8.3333333333%}.column.is-offset-1-mobile{margin-left:8.3333333333%}.column.is-2-mobile{flex:none;width:16.6666666667%}.column.is-offset-2-mobile{margin-left:16.6666666667%}.column.is-3-mobile{flex:none;width:25%}.column.is-offset-3-mobile{margin-left:25%}.column.is-4-mobile{flex:none;width:33.3333333333%}.column.is-offset-4-mobile{margin-left:33.3333333333%}.column.is-5-mobile{flex:none;width:41.6666666667%}.column.is-offset-5-mobile{margin-left:41.6666666667%}.column.is-6-mobile{flex:none;width:50%}.column.is-offset-6-mobile{margin-left:50%}.column.is-7-mobile{flex:none;width:58.3333333333%}.column.is-offset-7-mobile{margin-left:58.3333333333%}.column.is-8-mobile{flex:none;width:66.6666666667%}.column.is-offset-8-mobile{margin-left:66.6666666667%}.column.is-9-mobile{flex:none;width:75%}.column.is-offset-9-mobile{margin-left:75%}.column.is-10-mobile{flex:none;width:83.3333333333%}.column.is-offset-10-mobile{margin-left:83.3333333333%}.column.is-11-mobile{flex:none;width:91.6666666667%}.column.is-offset-11-mobile{margin-left:91.6666666667%}.column.is-12-mobile{flex:none;width:100%}.column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width: 769px),print{.column.is-narrow,.column.is-narrow-tablet{flex:none}.column.is-full,.column.is-full-tablet{flex:none;width:100%}.column.is-three-quarters,.column.is-three-quarters-tablet{flex:none;width:75%}.column.is-two-thirds,.column.is-two-thirds-tablet{flex:none;width:66.6666%}.column.is-half,.column.is-half-tablet{flex:none;width:50%}.column.is-one-third,.column.is-one-third-tablet{flex:none;width:33.3333%}.column.is-one-quarter,.column.is-one-quarter-tablet{flex:none;width:25%}.column.is-one-fifth,.column.is-one-fifth-tablet{flex:none;width:20%}.column.is-two-fifths,.column.is-two-fifths-tablet{flex:none;width:40%}.column.is-three-fifths,.column.is-three-fifths-tablet{flex:none;width:60%}.column.is-four-fifths,.column.is-four-fifths-tablet{flex:none;width:80%}.column.is-offset-three-quarters,.column.is-offset-three-quarters-tablet{margin-left:75%}.column.is-offset-two-thirds,.column.is-offset-two-thirds-tablet{margin-left:66.6666%}.column.is-offset-half,.column.is-offset-half-tablet{margin-left:50%}.column.is-offset-one-third,.column.is-offset-one-third-tablet{margin-left:33.3333%}.column.is-offset-one-quarter,.column.is-offset-one-quarter-tablet{margin-left:25%}.column.is-offset-one-fifth,.column.is-offset-one-fifth-tablet{margin-left:20%}.column.is-offset-two-fifths,.column.is-offset-two-fifths-tablet{margin-left:40%}.column.is-offset-three-fifths,.column.is-offset-three-fifths-tablet{margin-left:60%}.column.is-offset-four-fifths,.column.is-offset-four-fifths-tablet{margin-left:80%}.column.is-0,.column.is-0-tablet{flex:none;width:0%}.column.is-offset-0,.column.is-offset-0-tablet{margin-left:0%}.column.is-1,.column.is-1-tablet{flex:none;width:8.3333333333%}.column.is-offset-1,.column.is-offset-1-tablet{margin-left:8.3333333333%}.column.is-2,.column.is-2-tablet{flex:none;width:16.6666666667%}.column.is-offset-2,.column.is-offset-2-tablet{margin-left:16.6666666667%}.column.is-3,.column.is-3-tablet{flex:none;width:25%}.column.is-offset-3,.column.is-offset-3-tablet{margin-left:25%}.column.is-4,.column.is-4-tablet{flex:none;width:33.3333333333%}.column.is-offset-4,.column.is-offset-4-tablet{margin-left:33.3333333333%}.column.is-5,.column.is-5-tablet{flex:none;width:41.6666666667%}.column.is-offset-5,.column.is-offset-5-tablet{margin-left:41.6666666667%}.column.is-6,.column.is-6-tablet{flex:none;width:50%}.column.is-offset-6,.column.is-offset-6-tablet{margin-left:50%}.column.is-7,.column.is-7-tablet{flex:none;width:58.3333333333%}.column.is-offset-7,.column.is-offset-7-tablet{margin-left:58.3333333333%}.column.is-8,.column.is-8-tablet{flex:none;width:66.6666666667%}.column.is-offset-8,.column.is-offset-8-tablet{margin-left:66.6666666667%}.column.is-9,.column.is-9-tablet{flex:none;width:75%}.column.is-offset-9,.column.is-offset-9-tablet{margin-left:75%}.column.is-10,.column.is-10-tablet{flex:none;width:83.3333333333%}.column.is-offset-10,.column.is-offset-10-tablet{margin-left:83.3333333333%}.column.is-11,.column.is-11-tablet{flex:none;width:91.6666666667%}.column.is-offset-11,.column.is-offset-11-tablet{margin-left:91.6666666667%}.column.is-12,.column.is-12-tablet{flex:none;width:100%}.column.is-offset-12,.column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width: 1055px){.column.is-narrow-touch{flex:none}.column.is-full-touch{flex:none;width:100%}.column.is-three-quarters-touch{flex:none;width:75%}.column.is-two-thirds-touch{flex:none;width:66.6666%}.column.is-half-touch{flex:none;width:50%}.column.is-one-third-touch{flex:none;width:33.3333%}.column.is-one-quarter-touch{flex:none;width:25%}.column.is-one-fifth-touch{flex:none;width:20%}.column.is-two-fifths-touch{flex:none;width:40%}.column.is-three-fifths-touch{flex:none;width:60%}.column.is-four-fifths-touch{flex:none;width:80%}.column.is-offset-three-quarters-touch{margin-left:75%}.column.is-offset-two-thirds-touch{margin-left:66.6666%}.column.is-offset-half-touch{margin-left:50%}.column.is-offset-one-third-touch{margin-left:33.3333%}.column.is-offset-one-quarter-touch{margin-left:25%}.column.is-offset-one-fifth-touch{margin-left:20%}.column.is-offset-two-fifths-touch{margin-left:40%}.column.is-offset-three-fifths-touch{margin-left:60%}.column.is-offset-four-fifths-touch{margin-left:80%}.column.is-0-touch{flex:none;width:0%}.column.is-offset-0-touch{margin-left:0%}.column.is-1-touch{flex:none;width:8.3333333333%}.column.is-offset-1-touch{margin-left:8.3333333333%}.column.is-2-touch{flex:none;width:16.6666666667%}.column.is-offset-2-touch{margin-left:16.6666666667%}.column.is-3-touch{flex:none;width:25%}.column.is-offset-3-touch{margin-left:25%}.column.is-4-touch{flex:none;width:33.3333333333%}.column.is-offset-4-touch{margin-left:33.3333333333%}.column.is-5-touch{flex:none;width:41.6666666667%}.column.is-offset-5-touch{margin-left:41.6666666667%}.column.is-6-touch{flex:none;width:50%}.column.is-offset-6-touch{margin-left:50%}.column.is-7-touch{flex:none;width:58.3333333333%}.column.is-offset-7-touch{margin-left:58.3333333333%}.column.is-8-touch{flex:none;width:66.6666666667%}.column.is-offset-8-touch{margin-left:66.6666666667%}.column.is-9-touch{flex:none;width:75%}.column.is-offset-9-touch{margin-left:75%}.column.is-10-touch{flex:none;width:83.3333333333%}.column.is-offset-10-touch{margin-left:83.3333333333%}.column.is-11-touch{flex:none;width:91.6666666667%}.column.is-offset-11-touch{margin-left:91.6666666667%}.column.is-12-touch{flex:none;width:100%}.column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width: 1056px){.column.is-narrow-desktop{flex:none}.column.is-full-desktop{flex:none;width:100%}.column.is-three-quarters-desktop{flex:none;width:75%}.column.is-two-thirds-desktop{flex:none;width:66.6666%}.column.is-half-desktop{flex:none;width:50%}.column.is-one-third-desktop{flex:none;width:33.3333%}.column.is-one-quarter-desktop{flex:none;width:25%}.column.is-one-fifth-desktop{flex:none;width:20%}.column.is-two-fifths-desktop{flex:none;width:40%}.column.is-three-fifths-desktop{flex:none;width:60%}.column.is-four-fifths-desktop{flex:none;width:80%}.column.is-offset-three-quarters-desktop{margin-left:75%}.column.is-offset-two-thirds-desktop{margin-left:66.6666%}.column.is-offset-half-desktop{margin-left:50%}.column.is-offset-one-third-desktop{margin-left:33.3333%}.column.is-offset-one-quarter-desktop{margin-left:25%}.column.is-offset-one-fifth-desktop{margin-left:20%}.column.is-offset-two-fifths-desktop{margin-left:40%}.column.is-offset-three-fifths-desktop{margin-left:60%}.column.is-offset-four-fifths-desktop{margin-left:80%}.column.is-0-desktop{flex:none;width:0%}.column.is-offset-0-desktop{margin-left:0%}.column.is-1-desktop{flex:none;width:8.3333333333%}.column.is-offset-1-desktop{margin-left:8.3333333333%}.column.is-2-desktop{flex:none;width:16.6666666667%}.column.is-offset-2-desktop{margin-left:16.6666666667%}.column.is-3-desktop{flex:none;width:25%}.column.is-offset-3-desktop{margin-left:25%}.column.is-4-desktop{flex:none;width:33.3333333333%}.column.is-offset-4-desktop{margin-left:33.3333333333%}.column.is-5-desktop{flex:none;width:41.6666666667%}.column.is-offset-5-desktop{margin-left:41.6666666667%}.column.is-6-desktop{flex:none;width:50%}.column.is-offset-6-desktop{margin-left:50%}.column.is-7-desktop{flex:none;width:58.3333333333%}.column.is-offset-7-desktop{margin-left:58.3333333333%}.column.is-8-desktop{flex:none;width:66.6666666667%}.column.is-offset-8-desktop{margin-left:66.6666666667%}.column.is-9-desktop{flex:none;width:75%}.column.is-offset-9-desktop{margin-left:75%}.column.is-10-desktop{flex:none;width:83.3333333333%}.column.is-offset-10-desktop{margin-left:83.3333333333%}.column.is-11-desktop{flex:none;width:91.6666666667%}.column.is-offset-11-desktop{margin-left:91.6666666667%}.column.is-12-desktop{flex:none;width:100%}.column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width: 1216px){.column.is-narrow-widescreen{flex:none}.column.is-full-widescreen{flex:none;width:100%}.column.is-three-quarters-widescreen{flex:none;width:75%}.column.is-two-thirds-widescreen{flex:none;width:66.6666%}.column.is-half-widescreen{flex:none;width:50%}.column.is-one-third-widescreen{flex:none;width:33.3333%}.column.is-one-quarter-widescreen{flex:none;width:25%}.column.is-one-fifth-widescreen{flex:none;width:20%}.column.is-two-fifths-widescreen{flex:none;width:40%}.column.is-three-fifths-widescreen{flex:none;width:60%}.column.is-four-fifths-widescreen{flex:none;width:80%}.column.is-offset-three-quarters-widescreen{margin-left:75%}.column.is-offset-two-thirds-widescreen{margin-left:66.6666%}.column.is-offset-half-widescreen{margin-left:50%}.column.is-offset-one-third-widescreen{margin-left:33.3333%}.column.is-offset-one-quarter-widescreen{margin-left:25%}.column.is-offset-one-fifth-widescreen{margin-left:20%}.column.is-offset-two-fifths-widescreen{margin-left:40%}.column.is-offset-three-fifths-widescreen{margin-left:60%}.column.is-offset-four-fifths-widescreen{margin-left:80%}.column.is-0-widescreen{flex:none;width:0%}.column.is-offset-0-widescreen{margin-left:0%}.column.is-1-widescreen{flex:none;width:8.3333333333%}.column.is-offset-1-widescreen{margin-left:8.3333333333%}.column.is-2-widescreen{flex:none;width:16.6666666667%}.column.is-offset-2-widescreen{margin-left:16.6666666667%}.column.is-3-widescreen{flex:none;width:25%}.column.is-offset-3-widescreen{margin-left:25%}.column.is-4-widescreen{flex:none;width:33.3333333333%}.column.is-offset-4-widescreen{margin-left:33.3333333333%}.column.is-5-widescreen{flex:none;width:41.6666666667%}.column.is-offset-5-widescreen{margin-left:41.6666666667%}.column.is-6-widescreen{flex:none;width:50%}.column.is-offset-6-widescreen{margin-left:50%}.column.is-7-widescreen{flex:none;width:58.3333333333%}.column.is-offset-7-widescreen{margin-left:58.3333333333%}.column.is-8-widescreen{flex:none;width:66.6666666667%}.column.is-offset-8-widescreen{margin-left:66.6666666667%}.column.is-9-widescreen{flex:none;width:75%}.column.is-offset-9-widescreen{margin-left:75%}.column.is-10-widescreen{flex:none;width:83.3333333333%}.column.is-offset-10-widescreen{margin-left:83.3333333333%}.column.is-11-widescreen{flex:none;width:91.6666666667%}.column.is-offset-11-widescreen{margin-left:91.6666666667%}.column.is-12-widescreen{flex:none;width:100%}.column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width: 1408px){.column.is-narrow-fullhd{flex:none}.column.is-full-fullhd{flex:none;width:100%}.column.is-three-quarters-fullhd{flex:none;width:75%}.column.is-two-thirds-fullhd{flex:none;width:66.6666%}.column.is-half-fullhd{flex:none;width:50%}.column.is-one-third-fullhd{flex:none;width:33.3333%}.column.is-one-quarter-fullhd{flex:none;width:25%}.column.is-one-fifth-fullhd{flex:none;width:20%}.column.is-two-fifths-fullhd{flex:none;width:40%}.column.is-three-fifths-fullhd{flex:none;width:60%}.column.is-four-fifths-fullhd{flex:none;width:80%}.column.is-offset-three-quarters-fullhd{margin-left:75%}.column.is-offset-two-thirds-fullhd{margin-left:66.6666%}.column.is-offset-half-fullhd{margin-left:50%}.column.is-offset-one-third-fullhd{margin-left:33.3333%}.column.is-offset-one-quarter-fullhd{margin-left:25%}.column.is-offset-one-fifth-fullhd{margin-left:20%}.column.is-offset-two-fifths-fullhd{margin-left:40%}.column.is-offset-three-fifths-fullhd{margin-left:60%}.column.is-offset-four-fifths-fullhd{margin-left:80%}.column.is-0-fullhd{flex:none;width:0%}.column.is-offset-0-fullhd{margin-left:0%}.column.is-1-fullhd{flex:none;width:8.3333333333%}.column.is-offset-1-fullhd{margin-left:8.3333333333%}.column.is-2-fullhd{flex:none;width:16.6666666667%}.column.is-offset-2-fullhd{margin-left:16.6666666667%}.column.is-3-fullhd{flex:none;width:25%}.column.is-offset-3-fullhd{margin-left:25%}.column.is-4-fullhd{flex:none;width:33.3333333333%}.column.is-offset-4-fullhd{margin-left:33.3333333333%}.column.is-5-fullhd{flex:none;width:41.6666666667%}.column.is-offset-5-fullhd{margin-left:41.6666666667%}.column.is-6-fullhd{flex:none;width:50%}.column.is-offset-6-fullhd{margin-left:50%}.column.is-7-fullhd{flex:none;width:58.3333333333%}.column.is-offset-7-fullhd{margin-left:58.3333333333%}.column.is-8-fullhd{flex:none;width:66.6666666667%}.column.is-offset-8-fullhd{margin-left:66.6666666667%}.column.is-9-fullhd{flex:none;width:75%}.column.is-offset-9-fullhd{margin-left:75%}.column.is-10-fullhd{flex:none;width:83.3333333333%}.column.is-offset-10-fullhd{margin-left:83.3333333333%}.column.is-11-fullhd{flex:none;width:91.6666666667%}.column.is-offset-11-fullhd{margin-left:91.6666666667%}.column.is-12-fullhd{flex:none;width:100%}.column.is-offset-12-fullhd{margin-left:100%}}.columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.columns:last-child{margin-bottom:-.75rem}.columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}.columns.is-centered{justify-content:center}.columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}.columns.is-gapless>.column{margin:0;padding:0 !important}.columns.is-gapless:not(:last-child){margin-bottom:1.5rem}.columns.is-gapless:last-child{margin-bottom:0}.columns.is-mobile{display:flex}.columns.is-multiline{flex-wrap:wrap}.columns.is-vcentered{align-items:center}@media screen and (min-width: 769px),print{.columns:not(.is-desktop){display:flex}}@media screen and (min-width: 1056px){.columns.is-desktop{display:flex}}.columns.is-variable{--columnGap: 0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}.columns.is-variable .column{padding-left:var(--columnGap);padding-right:var(--columnGap)}.columns.is-variable.is-0{--columnGap: 0rem}@media screen and (max-width: 768px){.columns.is-variable.is-0-mobile{--columnGap: 0rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-0-tablet{--columnGap: 0rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-0-tablet-only{--columnGap: 0rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-0-touch{--columnGap: 0rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-0-desktop{--columnGap: 0rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-0-desktop-only{--columnGap: 0rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-0-widescreen{--columnGap: 0rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-0-widescreen-only{--columnGap: 0rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-0-fullhd{--columnGap: 0rem}}.columns.is-variable.is-1{--columnGap: .25rem}@media screen and (max-width: 768px){.columns.is-variable.is-1-mobile{--columnGap: .25rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-1-tablet{--columnGap: .25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-1-tablet-only{--columnGap: .25rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-1-touch{--columnGap: .25rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-1-desktop{--columnGap: .25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-1-desktop-only{--columnGap: .25rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-1-widescreen{--columnGap: .25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-1-widescreen-only{--columnGap: .25rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-1-fullhd{--columnGap: .25rem}}.columns.is-variable.is-2{--columnGap: .5rem}@media screen and (max-width: 768px){.columns.is-variable.is-2-mobile{--columnGap: .5rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-2-tablet{--columnGap: .5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-2-tablet-only{--columnGap: .5rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-2-touch{--columnGap: .5rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-2-desktop{--columnGap: .5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-2-desktop-only{--columnGap: .5rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-2-widescreen{--columnGap: .5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-2-widescreen-only{--columnGap: .5rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-2-fullhd{--columnGap: .5rem}}.columns.is-variable.is-3{--columnGap: .75rem}@media screen and (max-width: 768px){.columns.is-variable.is-3-mobile{--columnGap: .75rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-3-tablet{--columnGap: .75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-3-tablet-only{--columnGap: .75rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-3-touch{--columnGap: .75rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-3-desktop{--columnGap: .75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-3-desktop-only{--columnGap: .75rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-3-widescreen{--columnGap: .75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-3-widescreen-only{--columnGap: .75rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-3-fullhd{--columnGap: .75rem}}.columns.is-variable.is-4{--columnGap: 1rem}@media screen and (max-width: 768px){.columns.is-variable.is-4-mobile{--columnGap: 1rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-4-tablet{--columnGap: 1rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-4-tablet-only{--columnGap: 1rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-4-touch{--columnGap: 1rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-4-desktop{--columnGap: 1rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-4-desktop-only{--columnGap: 1rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-4-widescreen{--columnGap: 1rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-4-widescreen-only{--columnGap: 1rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-4-fullhd{--columnGap: 1rem}}.columns.is-variable.is-5{--columnGap: 1.25rem}@media screen and (max-width: 768px){.columns.is-variable.is-5-mobile{--columnGap: 1.25rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-5-tablet{--columnGap: 1.25rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-5-tablet-only{--columnGap: 1.25rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-5-touch{--columnGap: 1.25rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-5-desktop{--columnGap: 1.25rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-5-desktop-only{--columnGap: 1.25rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-5-widescreen{--columnGap: 1.25rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-5-widescreen-only{--columnGap: 1.25rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-5-fullhd{--columnGap: 1.25rem}}.columns.is-variable.is-6{--columnGap: 1.5rem}@media screen and (max-width: 768px){.columns.is-variable.is-6-mobile{--columnGap: 1.5rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-6-tablet{--columnGap: 1.5rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-6-tablet-only{--columnGap: 1.5rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-6-touch{--columnGap: 1.5rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-6-desktop{--columnGap: 1.5rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-6-desktop-only{--columnGap: 1.5rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-6-widescreen{--columnGap: 1.5rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-6-widescreen-only{--columnGap: 1.5rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-6-fullhd{--columnGap: 1.5rem}}.columns.is-variable.is-7{--columnGap: 1.75rem}@media screen and (max-width: 768px){.columns.is-variable.is-7-mobile{--columnGap: 1.75rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-7-tablet{--columnGap: 1.75rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-7-tablet-only{--columnGap: 1.75rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-7-touch{--columnGap: 1.75rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-7-desktop{--columnGap: 1.75rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-7-desktop-only{--columnGap: 1.75rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-7-widescreen{--columnGap: 1.75rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-7-widescreen-only{--columnGap: 1.75rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-7-fullhd{--columnGap: 1.75rem}}.columns.is-variable.is-8{--columnGap: 2rem}@media screen and (max-width: 768px){.columns.is-variable.is-8-mobile{--columnGap: 2rem}}@media screen and (min-width: 769px),print{.columns.is-variable.is-8-tablet{--columnGap: 2rem}}@media screen and (min-width: 769px) and (max-width: 1055px){.columns.is-variable.is-8-tablet-only{--columnGap: 2rem}}@media screen and (max-width: 1055px){.columns.is-variable.is-8-touch{--columnGap: 2rem}}@media screen and (min-width: 1056px){.columns.is-variable.is-8-desktop{--columnGap: 2rem}}@media screen and (min-width: 1056px) and (max-width: 1215px){.columns.is-variable.is-8-desktop-only{--columnGap: 2rem}}@media screen and (min-width: 1216px){.columns.is-variable.is-8-widescreen{--columnGap: 2rem}}@media screen and (min-width: 1216px) and (max-width: 1407px){.columns.is-variable.is-8-widescreen-only{--columnGap: 2rem}}@media screen and (min-width: 1408px){.columns.is-variable.is-8-fullhd{--columnGap: 2rem}}.tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:min-content}.tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.tile.is-ancestor:last-child{margin-bottom:-.75rem}.tile.is-ancestor:not(:last-child){margin-bottom:.75rem}.tile.is-child{margin:0 !important}.tile.is-parent{padding:.75rem}.tile.is-vertical{flex-direction:column}.tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem !important}@media screen and (min-width: 769px),print{.tile:not(.is-child){display:flex}.tile.is-1{flex:none;width:8.3333333333%}.tile.is-2{flex:none;width:16.6666666667%}.tile.is-3{flex:none;width:25%}.tile.is-4{flex:none;width:33.3333333333%}.tile.is-5{flex:none;width:41.6666666667%}.tile.is-6{flex:none;width:50%}.tile.is-7{flex:none;width:58.3333333333%}.tile.is-8{flex:none;width:66.6666666667%}.tile.is-9{flex:none;width:75%}.tile.is-10{flex:none;width:83.3333333333%}.tile.is-11{flex:none;width:91.6666666667%}.tile.is-12{flex:none;width:100%}}.hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}.hero .navbar{background:none}.hero .tabs ul{border-bottom:none}.hero.is-white{background-color:#fff;color:#0a0a0a}.hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-white strong{color:inherit}.hero.is-white .title{color:#0a0a0a}.hero.is-white .subtitle{color:rgba(10,10,10,0.9)}.hero.is-white .subtitle a:not(.button),.hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width: 1055px){.hero.is-white .navbar-menu{background-color:#fff}}.hero.is-white .navbar-item,.hero.is-white .navbar-link{color:rgba(10,10,10,0.7)}.hero.is-white a.navbar-item:hover,.hero.is-white a.navbar-item.is-active,.hero.is-white .navbar-link:hover,.hero.is-white .navbar-link.is-active{background-color:#f2f2f2;color:#0a0a0a}.hero.is-white .tabs a{color:#0a0a0a;opacity:0.9}.hero.is-white .tabs a:hover{opacity:1}.hero.is-white .tabs li.is-active a{opacity:1}.hero.is-white .tabs.is-boxed a,.hero.is-white .tabs.is-toggle a{color:#0a0a0a}.hero.is-white .tabs.is-boxed a:hover,.hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-white .tabs.is-boxed li.is-active a,.hero.is-white .tabs.is-boxed li.is-active a:hover,.hero.is-white .tabs.is-toggle li.is-active a,.hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.hero.is-white.is-bold{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}@media screen and (max-width: 768px){.hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg, #e8e3e4 0%, #fff 71%, #fff 100%)}}.hero.is-black{background-color:#0a0a0a;color:#fff}.hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-black strong{color:inherit}.hero.is-black .title{color:#fff}.hero.is-black .subtitle{color:rgba(255,255,255,0.9)}.hero.is-black .subtitle a:not(.button),.hero.is-black .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-black .navbar-menu{background-color:#0a0a0a}}.hero.is-black .navbar-item,.hero.is-black .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-black a.navbar-item:hover,.hero.is-black a.navbar-item.is-active,.hero.is-black .navbar-link:hover,.hero.is-black .navbar-link.is-active{background-color:#000;color:#fff}.hero.is-black .tabs a{color:#fff;opacity:0.9}.hero.is-black .tabs a:hover{opacity:1}.hero.is-black .tabs li.is-active a{opacity:1}.hero.is-black .tabs.is-boxed a,.hero.is-black .tabs.is-toggle a{color:#fff}.hero.is-black .tabs.is-boxed a:hover,.hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-black .tabs.is-boxed li.is-active a,.hero.is-black .tabs.is-boxed li.is-active a:hover,.hero.is-black .tabs.is-toggle li.is-active a,.hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.hero.is-black.is-bold{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}@media screen and (max-width: 768px){.hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg, #000 0%, #0a0a0a 71%, #181616 100%)}}.hero.is-light{background-color:#f5f5f5;color:#363636}.hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-light strong{color:inherit}.hero.is-light .title{color:#363636}.hero.is-light .subtitle{color:rgba(54,54,54,0.9)}.hero.is-light .subtitle a:not(.button),.hero.is-light .subtitle strong{color:#363636}@media screen and (max-width: 1055px){.hero.is-light .navbar-menu{background-color:#f5f5f5}}.hero.is-light .navbar-item,.hero.is-light .navbar-link{color:rgba(54,54,54,0.7)}.hero.is-light a.navbar-item:hover,.hero.is-light a.navbar-item.is-active,.hero.is-light .navbar-link:hover,.hero.is-light .navbar-link.is-active{background-color:#e8e8e8;color:#363636}.hero.is-light .tabs a{color:#363636;opacity:0.9}.hero.is-light .tabs a:hover{opacity:1}.hero.is-light .tabs li.is-active a{opacity:1}.hero.is-light .tabs.is-boxed a,.hero.is-light .tabs.is-toggle a{color:#363636}.hero.is-light .tabs.is-boxed a:hover,.hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-light .tabs.is-boxed li.is-active a,.hero.is-light .tabs.is-boxed li.is-active a:hover,.hero.is-light .tabs.is-toggle li.is-active a,.hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:#363636;border-color:#363636;color:#f5f5f5}.hero.is-light.is-bold{background-image:linear-gradient(141deg, #dfd8d9 0%, #f5f5f5 71%, #fff 100%)}@media screen and (max-width: 768px){.hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg, #dfd8d9 0%, #f5f5f5 71%, #fff 100%)}}.hero.is-dark,.content kbd.hero{background-color:#363636;color:#f5f5f5}.hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.content kbd.hero a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-dark strong,.content kbd.hero strong{color:inherit}.hero.is-dark .title,.content kbd.hero .title{color:#f5f5f5}.hero.is-dark .subtitle,.content kbd.hero .subtitle{color:rgba(245,245,245,0.9)}.hero.is-dark .subtitle a:not(.button),.content kbd.hero .subtitle a:not(.button),.hero.is-dark .subtitle strong,.content kbd.hero .subtitle strong{color:#f5f5f5}@media screen and (max-width: 1055px){.hero.is-dark .navbar-menu,.content kbd.hero .navbar-menu{background-color:#363636}}.hero.is-dark .navbar-item,.content kbd.hero .navbar-item,.hero.is-dark .navbar-link,.content kbd.hero .navbar-link{color:rgba(245,245,245,0.7)}.hero.is-dark a.navbar-item:hover,.content kbd.hero a.navbar-item:hover,.hero.is-dark a.navbar-item.is-active,.content kbd.hero a.navbar-item.is-active,.hero.is-dark .navbar-link:hover,.content kbd.hero .navbar-link:hover,.hero.is-dark .navbar-link.is-active,.content kbd.hero .navbar-link.is-active{background-color:#292929;color:#f5f5f5}.hero.is-dark .tabs a,.content kbd.hero .tabs a{color:#f5f5f5;opacity:0.9}.hero.is-dark .tabs a:hover,.content kbd.hero .tabs a:hover{opacity:1}.hero.is-dark .tabs li.is-active a,.content kbd.hero .tabs li.is-active a{opacity:1}.hero.is-dark .tabs.is-boxed a,.content kbd.hero .tabs.is-boxed a,.hero.is-dark .tabs.is-toggle a,.content kbd.hero .tabs.is-toggle a{color:#f5f5f5}.hero.is-dark .tabs.is-boxed a:hover,.content kbd.hero .tabs.is-boxed a:hover,.hero.is-dark .tabs.is-toggle a:hover,.content kbd.hero .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-dark .tabs.is-boxed li.is-active a,.content kbd.hero .tabs.is-boxed li.is-active a,.hero.is-dark .tabs.is-boxed li.is-active a:hover,.hero.is-dark .tabs.is-toggle li.is-active a,.content kbd.hero .tabs.is-toggle li.is-active a,.hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#f5f5f5;border-color:#f5f5f5;color:#363636}.hero.is-dark.is-bold,.content kbd.hero.is-bold{background-image:linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%)}@media screen and (max-width: 768px){.hero.is-dark.is-bold .navbar-menu,.content kbd.hero.is-bold .navbar-menu{background-image:linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%)}}.hero.is-primary,.docstring>section>a.hero.docs-sourcelink{background-color:#4eb5de;color:#fff}.hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.docstring>section>a.hero.docs-sourcelink a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-primary strong,.docstring>section>a.hero.docs-sourcelink strong{color:inherit}.hero.is-primary .title,.docstring>section>a.hero.docs-sourcelink .title{color:#fff}.hero.is-primary .subtitle,.docstring>section>a.hero.docs-sourcelink .subtitle{color:rgba(255,255,255,0.9)}.hero.is-primary .subtitle a:not(.button),.docstring>section>a.hero.docs-sourcelink .subtitle a:not(.button),.hero.is-primary .subtitle strong,.docstring>section>a.hero.docs-sourcelink .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-primary .navbar-menu,.docstring>section>a.hero.docs-sourcelink .navbar-menu{background-color:#4eb5de}}.hero.is-primary .navbar-item,.docstring>section>a.hero.docs-sourcelink .navbar-item,.hero.is-primary .navbar-link,.docstring>section>a.hero.docs-sourcelink .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-primary a.navbar-item:hover,.docstring>section>a.hero.docs-sourcelink a.navbar-item:hover,.hero.is-primary a.navbar-item.is-active,.docstring>section>a.hero.docs-sourcelink a.navbar-item.is-active,.hero.is-primary .navbar-link:hover,.docstring>section>a.hero.docs-sourcelink .navbar-link:hover,.hero.is-primary .navbar-link.is-active,.docstring>section>a.hero.docs-sourcelink .navbar-link.is-active{background-color:#39acda;color:#fff}.hero.is-primary .tabs a,.docstring>section>a.hero.docs-sourcelink .tabs a{color:#fff;opacity:0.9}.hero.is-primary .tabs a:hover,.docstring>section>a.hero.docs-sourcelink .tabs a:hover{opacity:1}.hero.is-primary .tabs li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs li.is-active a{opacity:1}.hero.is-primary .tabs.is-boxed a,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a,.hero.is-primary .tabs.is-toggle a,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a{color:#fff}.hero.is-primary .tabs.is-boxed a:hover,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed a:hover,.hero.is-primary .tabs.is-toggle a:hover,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-primary .tabs.is-boxed li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs.is-boxed li.is-active a,.hero.is-primary .tabs.is-boxed li.is-active a:hover,.hero.is-primary .tabs.is-toggle li.is-active a,.docstring>section>a.hero.docs-sourcelink .tabs.is-toggle li.is-active a,.hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#4eb5de}.hero.is-primary.is-bold,.docstring>section>a.hero.is-bold.docs-sourcelink{background-image:linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%)}@media screen and (max-width: 768px){.hero.is-primary.is-bold .navbar-menu,.docstring>section>a.hero.is-bold.docs-sourcelink .navbar-menu{background-image:linear-gradient(141deg, #1bc7de 0%, #4eb5de 71%, #5fa9e7 100%)}}.hero.is-link{background-color:#2e63b8;color:#fff}.hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-link strong{color:inherit}.hero.is-link .title{color:#fff}.hero.is-link .subtitle{color:rgba(255,255,255,0.9)}.hero.is-link .subtitle a:not(.button),.hero.is-link .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-link .navbar-menu{background-color:#2e63b8}}.hero.is-link .navbar-item,.hero.is-link .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-link a.navbar-item:hover,.hero.is-link a.navbar-item.is-active,.hero.is-link .navbar-link:hover,.hero.is-link .navbar-link.is-active{background-color:#2958a4;color:#fff}.hero.is-link .tabs a{color:#fff;opacity:0.9}.hero.is-link .tabs a:hover{opacity:1}.hero.is-link .tabs li.is-active a{opacity:1}.hero.is-link .tabs.is-boxed a,.hero.is-link .tabs.is-toggle a{color:#fff}.hero.is-link .tabs.is-boxed a:hover,.hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-link .tabs.is-boxed li.is-active a,.hero.is-link .tabs.is-boxed li.is-active a:hover,.hero.is-link .tabs.is-toggle li.is-active a,.hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#2e63b8}.hero.is-link.is-bold{background-image:linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%)}@media screen and (max-width: 768px){.hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg, #1b6098 0%, #2e63b8 71%, #2d51d2 100%)}}.hero.is-info{background-color:#209cee;color:#fff}.hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-info strong{color:inherit}.hero.is-info .title{color:#fff}.hero.is-info .subtitle{color:rgba(255,255,255,0.9)}.hero.is-info .subtitle a:not(.button),.hero.is-info .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-info .navbar-menu{background-color:#209cee}}.hero.is-info .navbar-item,.hero.is-info .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-info a.navbar-item:hover,.hero.is-info a.navbar-item.is-active,.hero.is-info .navbar-link:hover,.hero.is-info .navbar-link.is-active{background-color:#1190e3;color:#fff}.hero.is-info .tabs a{color:#fff;opacity:0.9}.hero.is-info .tabs a:hover{opacity:1}.hero.is-info .tabs li.is-active a{opacity:1}.hero.is-info .tabs.is-boxed a,.hero.is-info .tabs.is-toggle a{color:#fff}.hero.is-info .tabs.is-boxed a:hover,.hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-info .tabs.is-boxed li.is-active a,.hero.is-info .tabs.is-boxed li.is-active a:hover,.hero.is-info .tabs.is-toggle li.is-active a,.hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#209cee}.hero.is-info.is-bold{background-image:linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%)}@media screen and (max-width: 768px){.hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg, #05a6d6 0%, #209cee 71%, #3287f5 100%)}}.hero.is-success{background-color:#22c35b;color:#fff}.hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-success strong{color:inherit}.hero.is-success .title{color:#fff}.hero.is-success .subtitle{color:rgba(255,255,255,0.9)}.hero.is-success .subtitle a:not(.button),.hero.is-success .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-success .navbar-menu{background-color:#22c35b}}.hero.is-success .navbar-item,.hero.is-success .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-success a.navbar-item:hover,.hero.is-success a.navbar-item.is-active,.hero.is-success .navbar-link:hover,.hero.is-success .navbar-link.is-active{background-color:#1ead51;color:#fff}.hero.is-success .tabs a{color:#fff;opacity:0.9}.hero.is-success .tabs a:hover{opacity:1}.hero.is-success .tabs li.is-active a{opacity:1}.hero.is-success .tabs.is-boxed a,.hero.is-success .tabs.is-toggle a{color:#fff}.hero.is-success .tabs.is-boxed a:hover,.hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-success .tabs.is-boxed li.is-active a,.hero.is-success .tabs.is-boxed li.is-active a:hover,.hero.is-success .tabs.is-toggle li.is-active a,.hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#22c35b}.hero.is-success.is-bold{background-image:linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%)}@media screen and (max-width: 768px){.hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg, #12a02c 0%, #22c35b 71%, #1fdf83 100%)}}.hero.is-warning{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-warning strong{color:inherit}.hero.is-warning .title{color:rgba(0,0,0,0.7)}.hero.is-warning .subtitle{color:rgba(0,0,0,0.9)}.hero.is-warning .subtitle a:not(.button),.hero.is-warning .subtitle strong{color:rgba(0,0,0,0.7)}@media screen and (max-width: 1055px){.hero.is-warning .navbar-menu{background-color:#ffdd57}}.hero.is-warning .navbar-item,.hero.is-warning .navbar-link{color:rgba(0,0,0,0.7)}.hero.is-warning a.navbar-item:hover,.hero.is-warning a.navbar-item.is-active,.hero.is-warning .navbar-link:hover,.hero.is-warning .navbar-link.is-active{background-color:#ffd83e;color:rgba(0,0,0,0.7)}.hero.is-warning .tabs a{color:rgba(0,0,0,0.7);opacity:0.9}.hero.is-warning .tabs a:hover{opacity:1}.hero.is-warning .tabs li.is-active a{opacity:1}.hero.is-warning .tabs.is-boxed a,.hero.is-warning .tabs.is-toggle a{color:rgba(0,0,0,0.7)}.hero.is-warning .tabs.is-boxed a:hover,.hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-warning .tabs.is-boxed li.is-active a,.hero.is-warning .tabs.is-boxed li.is-active a:hover,.hero.is-warning .tabs.is-toggle li.is-active a,.hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,0.7);border-color:rgba(0,0,0,0.7);color:#ffdd57}.hero.is-warning.is-bold{background-image:linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%)}@media screen and (max-width: 768px){.hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg, #ffae24 0%, #ffdd57 71%, #fffa71 100%)}}.hero.is-danger{background-color:#da0b00;color:#fff}.hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current),.hero.is-danger strong{color:inherit}.hero.is-danger .title{color:#fff}.hero.is-danger .subtitle{color:rgba(255,255,255,0.9)}.hero.is-danger .subtitle a:not(.button),.hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width: 1055px){.hero.is-danger .navbar-menu{background-color:#da0b00}}.hero.is-danger .navbar-item,.hero.is-danger .navbar-link{color:rgba(255,255,255,0.7)}.hero.is-danger a.navbar-item:hover,.hero.is-danger a.navbar-item.is-active,.hero.is-danger .navbar-link:hover,.hero.is-danger .navbar-link.is-active{background-color:#c10a00;color:#fff}.hero.is-danger .tabs a{color:#fff;opacity:0.9}.hero.is-danger .tabs a:hover{opacity:1}.hero.is-danger .tabs li.is-active a{opacity:1}.hero.is-danger .tabs.is-boxed a,.hero.is-danger .tabs.is-toggle a{color:#fff}.hero.is-danger .tabs.is-boxed a:hover,.hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,0.1)}.hero.is-danger .tabs.is-boxed li.is-active a,.hero.is-danger .tabs.is-boxed li.is-active a:hover,.hero.is-danger .tabs.is-toggle li.is-active a,.hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#da0b00}.hero.is-danger.is-bold{background-image:linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%)}@media screen and (max-width: 768px){.hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg, #a70013 0%, #da0b00 71%, #f43500 100%)}}.hero.is-small .hero-body,#documenter .docs-sidebar form.docs-search>input.hero .hero-body{padding-bottom:1.5rem;padding-top:1.5rem}@media screen and (min-width: 769px),print{.hero.is-medium .hero-body{padding-bottom:9rem;padding-top:9rem}}@media screen and (min-width: 769px),print{.hero.is-large .hero-body{padding-bottom:18rem;padding-top:18rem}}.hero.is-halfheight .hero-body,.hero.is-fullheight .hero-body,.hero.is-fullheight-with-navbar .hero-body{align-items:center;display:flex}.hero.is-halfheight .hero-body>.container,.hero.is-fullheight .hero-body>.container,.hero.is-fullheight-with-navbar .hero-body>.container{flex-grow:1;flex-shrink:1}.hero.is-halfheight{min-height:50vh}.hero.is-fullheight{min-height:100vh}.hero-video{overflow:hidden}.hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;transform:translate3d(-50%, -50%, 0)}.hero-video.is-transparent{opacity:0.3}@media screen and (max-width: 768px){.hero-video{display:none}}.hero-buttons{margin-top:1.5rem}@media screen and (max-width: 768px){.hero-buttons .button{display:flex}.hero-buttons .button:not(:last-child){margin-bottom:0.75rem}}@media screen and (min-width: 769px),print{.hero-buttons{display:flex;justify-content:center}.hero-buttons .button:not(:last-child){margin-right:1.5rem}}.hero-head,.hero-foot{flex-grow:0;flex-shrink:0}.hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}.section{padding:3rem 1.5rem}@media screen and (min-width: 1056px){.section.is-medium{padding:9rem 1.5rem}.section.is-large{padding:18rem 1.5rem}}.footer{background-color:#fafafa;padding:3rem 1.5rem 6rem}h1 .docs-heading-anchor,h1 .docs-heading-anchor:hover,h1 .docs-heading-anchor:visited,h2 .docs-heading-anchor,h2 .docs-heading-anchor:hover,h2 .docs-heading-anchor:visited,h3 .docs-heading-anchor,h3 .docs-heading-anchor:hover,h3 .docs-heading-anchor:visited,h4 .docs-heading-anchor,h4 .docs-heading-anchor:hover,h4 .docs-heading-anchor:visited,h5 .docs-heading-anchor,h5 .docs-heading-anchor:hover,h5 .docs-heading-anchor:visited,h6 .docs-heading-anchor,h6 .docs-heading-anchor:hover,h6 .docs-heading-anchor:visited{color:#222}h1 .docs-heading-anchor-permalink,h2 .docs-heading-anchor-permalink,h3 .docs-heading-anchor-permalink,h4 .docs-heading-anchor-permalink,h5 .docs-heading-anchor-permalink,h6 .docs-heading-anchor-permalink{visibility:hidden;vertical-align:middle;margin-left:0.5em;font-size:0.7rem}h1 .docs-heading-anchor-permalink::before,h2 .docs-heading-anchor-permalink::before,h3 .docs-heading-anchor-permalink::before,h4 .docs-heading-anchor-permalink::before,h5 .docs-heading-anchor-permalink::before,h6 .docs-heading-anchor-permalink::before{font-family:"Font Awesome 5 Free";font-weight:900;content:"\f0c1"}h1:hover .docs-heading-anchor-permalink,h2:hover .docs-heading-anchor-permalink,h3:hover .docs-heading-anchor-permalink,h4:hover .docs-heading-anchor-permalink,h5:hover .docs-heading-anchor-permalink,h6:hover .docs-heading-anchor-permalink{visibility:visible}.docs-dark-only{display:none !important}pre{position:relative;overflow:hidden}pre code,pre code.hljs{padding:0 .75rem !important;overflow:auto;display:block}pre code:first-of-type,pre code.hljs:first-of-type{padding-top:0.5rem !important}pre code:last-of-type,pre code.hljs:last-of-type{padding-bottom:0.5rem !important}pre .copy-button{opacity:0.2;transition:opacity 0.2s;position:absolute;right:0em;top:0em;padding:0.5em;width:2.5em;height:2.5em;background:transparent;border:none;font-family:"Font Awesome 5 Free";color:#222;cursor:pointer;text-align:center}pre .copy-button:focus,pre .copy-button:hover{opacity:1;background:rgba(34,34,34,0.1);color:#2e63b8}pre .copy-button.success{color:#259a12;opacity:1}pre .copy-button.error{color:#cb3c33;opacity:1}pre:hover .copy-button{opacity:1}.admonition{background-color:#b5b5b5;border-style:solid;border-width:1px;border-color:#363636;border-radius:4px;font-size:1rem}.admonition strong{color:currentColor}.admonition.is-small,#documenter .docs-sidebar form.docs-search>input.admonition{font-size:.75rem}.admonition.is-medium{font-size:1.25rem}.admonition.is-large{font-size:1.5rem}.admonition.is-default{background-color:#b5b5b5;border-color:#363636}.admonition.is-default>.admonition-header{background-color:#363636;color:#fff}.admonition.is-default>.admonition-body{color:#fff}.admonition.is-info{background-color:#def0fc;border-color:#209cee}.admonition.is-info>.admonition-header{background-color:#209cee;color:#fff}.admonition.is-info>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-success{background-color:#bdf4d1;border-color:#22c35b}.admonition.is-success>.admonition-header{background-color:#22c35b;color:#fff}.admonition.is-success>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-warning{background-color:#fff3c5;border-color:#ffdd57}.admonition.is-warning>.admonition-header{background-color:#ffdd57;color:rgba(0,0,0,0.7)}.admonition.is-warning>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-danger{background-color:#ffaba7;border-color:#da0b00}.admonition.is-danger>.admonition-header{background-color:#da0b00;color:#fff}.admonition.is-danger>.admonition-body{color:rgba(0,0,0,0.7)}.admonition.is-compat{background-color:#bdeff5;border-color:#1db5c9}.admonition.is-compat>.admonition-header{background-color:#1db5c9;color:#fff}.admonition.is-compat>.admonition-body{color:rgba(0,0,0,0.7)}.admonition-header{color:#fff;background-color:#363636;align-items:center;font-weight:700;justify-content:space-between;line-height:1.25;padding:0.5rem .75rem;position:relative}.admonition-header:before{font-family:"Font Awesome 5 Free";font-weight:900;margin-right:.75rem;content:"\f06a"}.admonition-body{color:#222;padding:0.5rem .75rem}.admonition-body pre{background-color:#f5f5f5}.admonition-body code{background-color:rgba(0,0,0,0.05)}.docstring{margin-bottom:1em;background-color:rgba(0,0,0,0);border:1px solid #dbdbdb;box-shadow:2px 2px 3px rgba(10,10,10,0.1);max-width:100%}.docstring>header{display:flex;flex-grow:1;align-items:stretch;padding:0.5rem .75rem;background-color:#f5f5f5;box-shadow:0 1px 2px rgba(10,10,10,0.1);box-shadow:none;border-bottom:1px solid #dbdbdb}.docstring>header code{background-color:transparent}.docstring>header .docstring-binding{margin-right:0.3em}.docstring>header .docstring-category{margin-left:0.3em}.docstring>section{position:relative;padding:.75rem .75rem;border-bottom:1px solid #dbdbdb}.docstring>section:last-child{border-bottom:none}.docstring>section>a.docs-sourcelink{transition:opacity 0.3s;opacity:0;position:absolute;right:.375rem;bottom:.375rem}.docstring>section>a.docs-sourcelink:focus{opacity:1 !important}.docstring:hover>section>a.docs-sourcelink{opacity:0.2}.docstring:focus-within>section>a.docs-sourcelink{opacity:0.2}.docstring>section:hover a.docs-sourcelink{opacity:1}.documenter-example-output{background-color:#fff}.outdated-warning-overlay{position:fixed;top:0;left:0;right:0;box-shadow:0 0 10px rgba(0,0,0,0.3);z-index:999;background-color:#ffaba7;color:rgba(0,0,0,0.7);border-bottom:3px solid #da0b00;padding:10px 35px;text-align:center;font-size:15px}.outdated-warning-overlay .outdated-warning-closer{position:absolute;top:calc(50% - 10px);right:18px;cursor:pointer;width:12px}.outdated-warning-overlay a{color:#2e63b8}.outdated-warning-overlay a:hover{color:#363636}.content pre{border:1px solid #dbdbdb}.content code{font-weight:inherit}.content a code{color:#2e63b8}.content h1 code,.content h2 code,.content h3 code,.content h4 code,.content h5 code,.content h6 code{color:#222}.content table{display:block;width:initial;max-width:100%;overflow-x:auto}.content blockquote>ul:first-child,.content blockquote>ol:first-child,.content .admonition-body>ul:first-child,.content .admonition-body>ol:first-child{margin-top:0}pre,code{font-variant-ligatures:no-contextual}.breadcrumb a.is-disabled{cursor:default;pointer-events:none}.breadcrumb a.is-disabled,.breadcrumb a.is-disabled:hover{color:#222}.hljs{background:initial !important}.katex .katex-mathml{top:0;right:0}.katex-display,mjx-container,.MathJax_Display{margin:0.5em 0 !important}html{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto}li.no-marker{list-style:none}#documenter .docs-main>article{overflow-wrap:break-word}#documenter .docs-main>article .math-container{overflow-x:auto;overflow-y:hidden}@media screen and (min-width: 1056px){#documenter .docs-main{max-width:52rem;margin-left:20rem;padding-right:1rem}}@media screen and (max-width: 1055px){#documenter .docs-main{width:100%}#documenter .docs-main>article{max-width:52rem;margin-left:auto;margin-right:auto;margin-bottom:1rem;padding:0 1rem}#documenter .docs-main>header,#documenter .docs-main>nav{max-width:100%;width:100%;margin:0}}#documenter .docs-main header.docs-navbar{background-color:#fff;border-bottom:1px solid #dbdbdb;z-index:2;min-height:4rem;margin-bottom:1rem;display:flex}#documenter .docs-main header.docs-navbar .breadcrumb{flex-grow:1}#documenter .docs-main header.docs-navbar .docs-right{display:flex;white-space:nowrap}#documenter .docs-main header.docs-navbar .docs-right .docs-icon,#documenter .docs-main header.docs-navbar .docs-right .docs-label,#documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button{display:inline-block}#documenter .docs-main header.docs-navbar .docs-right .docs-label{padding:0;margin-left:0.3em}#documenter .docs-main header.docs-navbar .docs-right .docs-settings-button{margin:auto 0 auto 1rem}#documenter .docs-main header.docs-navbar .docs-right .docs-sidebar-button{font-size:1.5rem;margin:auto 0 auto 1rem}#documenter .docs-main header.docs-navbar>*{margin:auto 0}@media screen and (max-width: 1055px){#documenter .docs-main header.docs-navbar{position:sticky;top:0;padding:0 1rem;transition-property:top, box-shadow;-webkit-transition-property:top, box-shadow;transition-duration:0.3s;-webkit-transition-duration:0.3s}#documenter .docs-main header.docs-navbar.headroom--not-top{box-shadow:.2rem 0rem .4rem #bbb;transition-duration:0.7s;-webkit-transition-duration:0.7s}#documenter .docs-main header.docs-navbar.headroom--unpinned.headroom--not-top.headroom--not-bottom{top:-4.5rem;transition-duration:0.7s;-webkit-transition-duration:0.7s}}#documenter .docs-main section.footnotes{border-top:1px solid #dbdbdb}#documenter .docs-main section.footnotes li .tag:first-child,#documenter .docs-main section.footnotes li .docstring>section>a.docs-sourcelink:first-child,#documenter .docs-main section.footnotes li .content kbd:first-child,.content #documenter .docs-main section.footnotes li kbd:first-child{margin-right:1em;margin-bottom:0.4em}#documenter .docs-main .docs-footer{display:flex;flex-wrap:wrap;margin-left:0;margin-right:0;border-top:1px solid #dbdbdb;padding-top:1rem;padding-bottom:1rem}@media screen and (max-width: 1055px){#documenter .docs-main .docs-footer{padding-left:1rem;padding-right:1rem}}#documenter .docs-main .docs-footer .docs-footer-nextpage,#documenter .docs-main .docs-footer .docs-footer-prevpage{flex-grow:1}#documenter .docs-main .docs-footer .docs-footer-nextpage{text-align:right}#documenter .docs-main .docs-footer .flexbox-break{flex-basis:100%;height:0}#documenter .docs-main .docs-footer .footer-message{font-size:0.8em;margin:0.5em auto 0 auto;text-align:center}#documenter .docs-sidebar{display:flex;flex-direction:column;color:#0a0a0a;background-color:#f5f5f5;border-right:1px solid #dbdbdb;padding:0;flex:0 0 18rem;z-index:5;font-size:1rem;position:fixed;left:-18rem;width:18rem;height:100%;transition:left 0.3s}#documenter .docs-sidebar.visible{left:0;box-shadow:.4rem 0rem .8rem #bbb}@media screen and (min-width: 1056px){#documenter .docs-sidebar.visible{box-shadow:none}}@media screen and (min-width: 1056px){#documenter .docs-sidebar{left:0;top:0}}#documenter .docs-sidebar .docs-logo{margin-top:1rem;padding:0 1rem}#documenter .docs-sidebar .docs-logo>img{max-height:6rem;margin:auto}#documenter .docs-sidebar .docs-package-name{flex-shrink:0;font-size:1.5rem;font-weight:700;text-align:center;white-space:nowrap;overflow:hidden;padding:0.5rem 0}#documenter .docs-sidebar .docs-package-name .docs-autofit{max-width:16.2rem}#documenter .docs-sidebar .docs-package-name a,#documenter .docs-sidebar .docs-package-name a:hover{color:#0a0a0a}#documenter .docs-sidebar .docs-version-selector{border-top:1px solid #dbdbdb;display:none;padding:0.5rem}#documenter .docs-sidebar .docs-version-selector.visible{display:flex}#documenter .docs-sidebar ul.docs-menu{flex-grow:1;user-select:none;border-top:1px solid #dbdbdb;padding-bottom:1.5rem}#documenter .docs-sidebar ul.docs-menu>li>.tocitem{font-weight:bold}#documenter .docs-sidebar ul.docs-menu>li li{font-size:.95rem;margin-left:1em;border-left:1px solid #dbdbdb}#documenter .docs-sidebar ul.docs-menu input.collapse-toggle{display:none}#documenter .docs-sidebar ul.docs-menu ul.collapsed{display:none}#documenter .docs-sidebar ul.docs-menu input:checked~ul.collapsed{display:block}#documenter .docs-sidebar ul.docs-menu label.tocitem{display:flex}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-label{flex-grow:2}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron{display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1;font-size:.75rem;margin-left:1rem;margin-top:auto;margin-bottom:auto}#documenter .docs-sidebar ul.docs-menu label.tocitem .docs-chevron::before{font-family:"Font Awesome 5 Free";font-weight:900;content:"\f054"}#documenter .docs-sidebar ul.docs-menu input:checked~label.tocitem .docs-chevron::before{content:"\f078"}#documenter .docs-sidebar ul.docs-menu .tocitem{display:block;padding:0.5rem 0.5rem}#documenter .docs-sidebar ul.docs-menu .tocitem,#documenter .docs-sidebar ul.docs-menu .tocitem:hover{color:#0a0a0a;background:#f5f5f5}#documenter .docs-sidebar ul.docs-menu a.tocitem:hover,#documenter .docs-sidebar ul.docs-menu label.tocitem:hover{color:#0a0a0a;background-color:#ebebeb}#documenter .docs-sidebar ul.docs-menu li.is-active{border-top:1px solid #dbdbdb;border-bottom:1px solid #dbdbdb;background-color:#fff}#documenter .docs-sidebar ul.docs-menu li.is-active .tocitem,#documenter .docs-sidebar ul.docs-menu li.is-active .tocitem:hover{background-color:#fff;color:#0a0a0a}#documenter .docs-sidebar ul.docs-menu li.is-active ul.internal .tocitem:hover{background-color:#ebebeb;color:#0a0a0a}#documenter .docs-sidebar ul.docs-menu>li.is-active:first-child{border-top:none}#documenter .docs-sidebar ul.docs-menu ul.internal{margin:0 0.5rem 0.5rem;border-top:1px solid #dbdbdb}#documenter .docs-sidebar ul.docs-menu ul.internal li{font-size:.85rem;border-left:none;margin-left:0;margin-top:0.5rem}#documenter .docs-sidebar ul.docs-menu ul.internal .tocitem{width:100%;padding:0}#documenter .docs-sidebar ul.docs-menu ul.internal .tocitem::before{content:"⚬";margin-right:0.4em}#documenter .docs-sidebar form.docs-search{margin:auto;margin-top:0.5rem;margin-bottom:0.5rem}#documenter .docs-sidebar form.docs-search>input{width:14.4rem}@media screen and (min-width: 1056px){#documenter .docs-sidebar ul.docs-menu{overflow-y:auto;-webkit-overflow-scroll:touch}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar{width:.3rem;background:none}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#e0e0e0}#documenter .docs-sidebar ul.docs-menu::-webkit-scrollbar-thumb:hover{background:#ccc}}@media screen and (max-width: 1055px){#documenter .docs-sidebar{overflow-y:auto;-webkit-overflow-scroll:touch}#documenter .docs-sidebar::-webkit-scrollbar{width:.3rem;background:none}#documenter .docs-sidebar::-webkit-scrollbar-thumb{border-radius:5px 0px 0px 5px;background:#e0e0e0}#documenter .docs-sidebar::-webkit-scrollbar-thumb:hover{background:#ccc}}#documenter .docs-main #documenter-search-info{margin-bottom:1rem}#documenter .docs-main #documenter-search-results{list-style-type:circle;list-style-position:outside}#documenter .docs-main #documenter-search-results li{margin-left:2rem}#documenter .docs-main #documenter-search-results .docs-highlight{background-color:yellow}.ansi span.sgr1{font-weight:bolder}.ansi span.sgr2{font-weight:lighter}.ansi span.sgr3{font-style:italic}.ansi span.sgr4{text-decoration:underline}.ansi span.sgr7{color:#fff;background-color:#222}.ansi span.sgr8{color:transparent}.ansi span.sgr8 span{color:transparent}.ansi span.sgr9{text-decoration:line-through}.ansi span.sgr30{color:#242424}.ansi span.sgr31{color:#a7201f}.ansi span.sgr32{color:#066f00}.ansi span.sgr33{color:#856b00}.ansi span.sgr34{color:#2149b0}.ansi span.sgr35{color:#7d4498}.ansi span.sgr36{color:#007989}.ansi span.sgr37{color:gray}.ansi span.sgr40{background-color:#242424}.ansi span.sgr41{background-color:#a7201f}.ansi span.sgr42{background-color:#066f00}.ansi span.sgr43{background-color:#856b00}.ansi span.sgr44{background-color:#2149b0}.ansi span.sgr45{background-color:#7d4498}.ansi span.sgr46{background-color:#007989}.ansi span.sgr47{background-color:gray}.ansi span.sgr90{color:#616161}.ansi span.sgr91{color:#cb3c33}.ansi span.sgr92{color:#0e8300}.ansi span.sgr93{color:#a98800}.ansi span.sgr94{color:#3c5dcd}.ansi span.sgr95{color:#9256af}.ansi span.sgr96{color:#008fa3}.ansi span.sgr97{color:#f5f5f5}.ansi span.sgr100{background-color:#616161}.ansi span.sgr101{background-color:#cb3c33}.ansi span.sgr102{background-color:#0e8300}.ansi span.sgr103{background-color:#a98800}.ansi span.sgr104{background-color:#3c5dcd}.ansi span.sgr105{background-color:#9256af}.ansi span.sgr106{background-color:#008fa3}.ansi span.sgr107{background-color:#f5f5f5}code.language-julia-repl>span.hljs-meta{color:#066f00;font-weight:bolder}/*! Theme: Default Description: Original highlight.js style Author: (c) Ivan Sagalaev @@ -7644,95 +6,4 @@ code.language-julia-repl > span.hljs-meta { Website: https://highlightjs.org/ License: see project LICENSE Touched: 2021 -*/ -/* -This is left on purpose making default.css the single file that can be lifted -as-is from the repository directly without the need for a build step - -Typically this "required" baseline CSS is added by `makestuff.js` during build. -*/ -pre code.hljs { - display: block; - overflow-x: auto; } - -code.hljs { - padding: 3px 5px; } - -/* end baseline CSS */ -.hljs { - background: #F0F0F0; - color: #444; } - -/* Base color: saturation 0; */ -.hljs-subst { - /* default */ } - -/* purposely ignored */ -.hljs-comment { - color: #888888; } - -.hljs-tag, -.hljs-punctuation { - color: #444a; } - -.hljs-tag .hljs-name, -.hljs-tag .hljs-attr { - color: #444; } - -.hljs-keyword, -.hljs-attribute, -.hljs-selector-tag, -.hljs-meta .hljs-keyword, -.hljs-doctag, -.hljs-name { - font-weight: bold; } - -/* User color: hue: 0 */ -.hljs-type, -.hljs-string, -.hljs-number, -.hljs-selector-id, -.hljs-selector-class, -.hljs-quote, -.hljs-template-tag, -.hljs-deletion { - color: #880000; } - -.hljs-title, -.hljs-section { - color: #880000; - font-weight: bold; } - -.hljs-regexp, -.hljs-symbol, -.hljs-variable, -.hljs-template-variable, -.hljs-link, -.hljs-selector-attr, -.hljs-operator, -.hljs-selector-pseudo { - color: #BC6060; } - -/* Language color: hue: 90; */ -.hljs-literal { - color: #78A960; } - -.hljs-built_in, -.hljs-bullet, -.hljs-code, -.hljs-addition { - color: #397300; } - -/* Meta color: hue: 200 */ -.hljs-meta { - color: #1f7199; } - -.hljs-meta .hljs-string { - color: #4d99bf; } - -/* Misc effects */ -.hljs-emphasis { - font-style: italic; } - -.hljs-strong { - font-weight: bold; } +*/pre code.hljs{display:block;overflow-x:auto}code.hljs{padding:3px 5px}.hljs{background:#F0F0F0;color:#444}.hljs-comment{color:#888888}.hljs-tag,.hljs-punctuation{color:#444a}.hljs-tag .hljs-name,.hljs-tag .hljs-attr{color:#444}.hljs-keyword,.hljs-attribute,.hljs-selector-tag,.hljs-meta .hljs-keyword,.hljs-doctag,.hljs-name{font-weight:bold}.hljs-type,.hljs-string,.hljs-number,.hljs-selector-id,.hljs-selector-class,.hljs-quote,.hljs-template-tag,.hljs-deletion{color:#880000}.hljs-title,.hljs-section{color:#880000;font-weight:bold}.hljs-regexp,.hljs-symbol,.hljs-variable,.hljs-template-variable,.hljs-link,.hljs-selector-attr,.hljs-operator,.hljs-selector-pseudo{color:#BC6060}.hljs-literal{color:#78A960}.hljs-built_in,.hljs-bullet,.hljs-code,.hljs-addition{color:#397300}.hljs-meta{color:#1f7199}.hljs-meta .hljs-string{color:#4d99bf}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:bold} diff --git a/examples/blownwing-acoustics/index.html b/examples/blownwing-acoustics/index.html index 6755b9f9..3f9d3080 100644 --- a/examples/blownwing-acoustics/index.html +++ b/examples/blownwing-acoustics/index.html @@ -3,4 +3,4 @@ function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-B7CBF7WC7L', {'page_path': location.pathname + location.search + location.hash}); - + diff --git a/examples/blownwing-aero/index.html b/examples/blownwing-aero/index.html index d696365b..99630319 100644 --- a/examples/blownwing-aero/index.html +++ b/examples/blownwing-aero/index.html @@ -1,15 +1,15 @@ -Wing-on-Prop Interactions · FLOWUnsteady

Wing-on-Prop Interactions

+

Aerodynamic Solution

-

In this example we show mount propellers on a swept wing. The wing is modeled using the actuator line model that represents the wing as a lifting line. This wing model is accurate for capturing wing-on-prop interactions. For instance, the rotor will experience an unsteady blade loading (and increased tonal noise) caused by the turning of the flow ahead of the wing leading edge. However, this simple wing model is not adecuate for capturing prop-on-wing interactions (see the next two sections to accurately predict prop-on-wing interactions).

#=##############################################################################
+
#=##############################################################################
 # DESCRIPTION
     Simulation of swept-back wing with twin props mounted mid span blowing on
     the wing.
@@ -196,8 +196,8 @@
 
     # Account for angle of attack of wing
     nrm = sqrt(x^2 + z^2)
-    x = (x==0 ? 1 : sign(x))*nrm*cosd(AOAwing)
-    z = -(z==0 ? 1 : sign(z))*nrm*sind(AOAwing)
+    x = nrm*cosd(AOAwing)
+    z = -nrm*sind(AOAwing)
 
     # Translate rotor to its position along wing
     O = [x, y, z]                                       # New position
@@ -378,4 +378,4 @@
     Vid here
 
-
Unsteady Loading Animation

Check the full example under examples/blownwing/ to see how to postprocess the simulation and generate this animation.

+
Unsteady Loading Animation

Check the full example under examples/blownwing/ to see how to postprocess the simulation and generate this animation.

diff --git a/examples/blownwing-asm/index.html b/examples/blownwing-asm/index.html index a83bab46..43671a24 100644 --- a/examples/blownwing-asm/index.html +++ b/examples/blownwing-asm/index.html @@ -3,14 +3,14 @@ function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-B7CBF7WC7L', {'page_path': location.pathname + location.search + location.hash}); -

Actuator Surface Model

The aerodynamic solution computed in the first section was intended to be a mid-low fidelity simulation, which modeled the wing using an actuator line model (ALM). The ALM places all the surface vorticity associated with lift at the quarter chord of the wing, while placing all the trailing bound vorticity at the three-quarter chord, as shown here:

+

Actuator Surface Model

The aerodynamic solution computed in the first section was intended to be a mid-low fidelity simulation, which modeled the wing using an actuator line model (ALM). The ALM places all the surface vorticity associated with lift at the quarter chord of the wing, while placing all the trailing bound vorticity at the three-quarter chord, as shown here:

Pic here
-

The ALM is very accurate for isolated wings and even cases with mild wake interactions. However, for cases with stronger wake interactions (e.g., a wake directly impinging on the wing surface), the ALM can lead to unphysical results as the flow tends to cross the airfoil centerline. To address this, we have developed an actuator surface model (ASM) to embed the wing surface in the LES domain and better represent the physics.

The ASM spreads the surface vorticity following a pressure-like distribution. This produces a velocity field at the wing surface that minimizes the mass flow that crosses the airfoil centerline, thus better representing a solid surface:

+

The ALM is very accurate for isolated wings and even cases with mild wake interactions. However, for cases with stronger wake interactions (e.g., a wake directly impinging on the wing surface), we have developed an actuator surface model (ASM) that introduces the surface vorticity into the LES domain that better represents the physics. This is done by spreading the surface vorticity following a pressure-like distribution, which ends up producing a velocity field at the wing surface that minimizes the flow that crosses the airfoil centerline, thus better representing a solid surface:

Pic here Pic here
-

For an in-depth discussion of the actuator models implemented in FLOWUnsteady, see Chapter 6 in Alvarez' Dissertation[2] (also published in Alvarez & Ning, 2023[3]).

In order to activate the actuator surface model, we define the following parameters:

thickness_w     = 0.15                      # Wing airfoil thickness t/c
+

For an in-depth discussion of the actuator line and surface models implemented in FLOWUnsteady, see Chapter 6 in Alvarez' Dissertation.[2]

In order to activate the actuator surface model, we define the following parameters:

thickness_w     = 0.15                      # Wing airfoil thickness t/c
 
 # ---------- Vortex sheet parameters ---------------
 vlm_vortexsheet = true                      # Whether to spread the wing circulation as a vortex sheet
@@ -37,14 +37,14 @@
 add_unsteadyforce           = false         # Whether to add the unsteady force to Ftot or to simply output it
 
 include_parasiticdrag       = true          # Include parasitic-drag force
-add_skinfriction            = true          # If false, the parasitic drag is purely form, meaning no skin friction
+add_skinfriction            = true          # If false, the parasitic drag is purely parasitic, meaning no skin friction
 calc_cd_from_cl             = false         # Whether to calculate cd from cl or effective AOA
 wing_polar_file             = "xf-rae101-il-1000000.csv"    # Airfoil polar for parasitic drag

Then we use a custom-defined function for calculating aerodynamic forces that uses the vortex sheet:

# ---------- Aerodynamic forces --------------
 
 forces = []
 
 # Calculate Kutta-Joukowski force
-kuttajoukowski = uns.generate_aerodynamicforce_kuttajoukowski(KJforce_type,
+kuttajoukowski = uns.generate_calc_aerodynamicforce_kuttajoukowski(KJforce_type,
                                 sigma_vlm_surf, sigma_rotor_surf,
                                 vlm_vortexsheet, vlm_vortexsheet_overlap,
                                 vlm_vortexsheet_distribution,
@@ -113,4 +113,4 @@
                     vlm_vortexsheet_sigma_tbv=vlm_vortexsheet_sigma_tbv,
                     max_static_particles=vlm_vortexsheet_maxstaticparticle
                     ...
-                    )
ASM Example

The next section shows an example on how to set up and run a simulation using the actuator surface model.

  • 2E. J. Alvarez (2022), "Reformulated Vortex Particle Method and Meshless Large Eddy Simulation of Multirotor Aircraft," Doctoral Dissertation, Brigham Young University. [VIDEO] [PDF]
  • 3E. J. Alvarez and A. Ning (2023), "Meshless Large-Eddy Simulation of Propeller–Wing Interactions with Reformulated Vortex Particle Method," Journal of Aircraft. [DOI][PDF]
+ )
ASM and High Fidelity

ASM uses a very high density of particles at the wing surface (~100k particles per wing) to accuratelly introduce the solid boundary into the LES. This increases the computational cost of the simulation considerably. Hence, we recommend using ASM only for high-fidelity simulations.

  • 2E. J. Alvarez (2022), "Reformulated Vortex Particle Method and Meshless Large Eddy Simulation of Multirotor Aircraft," Doctoral Dissertation, Brigham Young University. [VIDEO] [PDF]
diff --git a/examples/heavingwing/index.html b/examples/heavingwing/index.html index 420f60e4..890c61ef 100644 --- a/examples/heavingwing/index.html +++ b/examples/heavingwing/index.html @@ -3,7 +3,7 @@ function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-B7CBF7WC7L', {'page_path': location.pathname + location.search + location.hash}); -

Heaving Wing

+

Heaving Wing

@@ -282,4 +282,4 @@

As the simulation runs, you will see the monitor shown below plotting the blade loading along with thrust and torque coefficients and propulsive efficiency.

Pic here
(red = beginning, -blue = end)
+blue = end)
diff --git a/examples/propeller-incidence/index.html b/examples/propeller-incidence/index.html index aa6b37d6..b9f2b1a5 100644 --- a/examples/propeller-incidence/index.html +++ b/examples/propeller-incidence/index.html @@ -3,7 +3,7 @@ function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-B7CBF7WC7L', {'page_path': location.pathname + location.search + location.hash}); -

Incidence Sweep

+

Incidence Sweep

Vid here

In simple cases like a propeller in cruise, steady and quasi-steady methods like blade element momentum theory can be as accurate as a fully unsteady simulation, and even faster. However, in more complex cases, quasi-steady solvers are far from accurate and a fully unsteady solver is needed. We now highlight one of such cases: the case of a propeller at an incidence angle.

A rotor operating at an incidence angle relative to the freestream experiences an unsteady loading due to the blade seeing a larger local velocity in the advancing side of the rotor and a smaller local velocity in the retreating side. This also causes a wake that is skewed. For this example we will run a sweep of simulations on a 4-bladed propeller operating at multiple incidence angles $\alpha$ (where $\alpha=0^\circ$ is fully axial inflow, and $\alpha=90^\circ$ is fully edgewise inflow).

#=##############################################################################
 # DESCRIPTION
@@ -221,4 +221,4 @@
 
 

Check examples/propeller/propeller_incidence.jl to postprocess and plot the results as shown below.

Pic here -
Paraview visualization

The .pvsm file visualizing the simulation as shown at the top of this page is available here: LINK (right click → save as...). To open in Paraview: File → Load State → (select .pvsm file) then select "Search files under specified directory" and point it to the folder where the simulation was saved.

+
Paraview visualization

The .pvsm file visualizing the simulation as shown at the top of this page is available here: LINK (right click → save as...). To open in Paraview: File → Load State → (select .pvsm file) then select "Search files under specified directory" and point it to the folder where the simulation was saved.

diff --git a/examples/propeller-jsweep/index.html b/examples/propeller-jsweep/index.html index 67cad0c7..5547f5c9 100644 --- a/examples/propeller-jsweep/index.html +++ b/examples/propeller-jsweep/index.html @@ -3,7 +3,7 @@ function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-B7CBF7WC7L', {'page_path': location.pathname + location.search + location.hash}); -

$J$ Sweep

Using the same rotor from the previous section, we now run a sweep of the advance ratio $J = \frac{u_\infty}{n d}$ to characterize the performance of the propeller.

#=##############################################################################
+

$J$ Sweep

Using the same rotor from the previous section, we now run a sweep of the advance ratio $J = \frac{u_\infty}{n d}$ to characterize the performance of the propeller.

#=##############################################################################
 # DESCRIPTION
     Advance ratio sweep on APC 10 x7 propeller
 =###############################################################################
@@ -104,4 +104,4 @@
 

Check examples/propeller/propeller_jsweep.jl to postprocess and plot the results as shown below.


Pic here -
+
diff --git a/examples/propeller-quasisteady/index.html b/examples/propeller-quasisteady/index.html index 24a162fd..7d2340da 100644 --- a/examples/propeller-quasisteady/index.html +++ b/examples/propeller-quasisteady/index.html @@ -3,6 +3,6 @@ function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-B7CBF7WC7L', {'page_path': location.pathname + location.search + location.hash}); -

Quasi-Steady Solver

While unsteady simulations are resolved using the reformulated VPM, FLOWUnsteady also provides a quasi-steady solver for low-fidelity simulations. The quasi-steady solver replaces the particle field with semi-infinite rigid wakes in wings and blade-element momentum theory in rotors.

The quasi-steady solver is invoked by simply changing the line

VehicleType     = uns.UVLMVehicle

to

VehicleType   = uns.QVLMVehicle

in the previous sections. The results of the quasi-steady solver are shown below, predicted through blade-element momentum theory.

+

Quasi-Steady Solver

While unsteady simulations are resolved using the reformulated VPM, FLOWUnsteady also provides a quasi-steady solver for low-fidelity simulations. The quasi-steady solver replaces the particle field with semi-infinite rigid wakes in wings and blade-element momentum theory in rotors.

The quasi-steady solver is invoked by simply changing the line

VehicleType     = uns.UVLMVehicle

to

VehicleType   = uns.QVLMVehicle

in the previous sections. The results of the quasi-steady solver are shown below, predicted through blade-element momentum theory.

Pic here -
+
diff --git a/examples/prowim-aero/index.html b/examples/prowim-aero/index.html deleted file mode 100644 index 5823b351..00000000 --- a/examples/prowim-aero/index.html +++ /dev/null @@ -1,618 +0,0 @@ - -Prop-on-Wing Interactions · FLOWUnsteady

Prop-on-Wing Interactions

Pic here

In this example we use the actuator surface model (ASM) to more accurately predict the effects of props blowing on a wing. This case simulates the PROWIM experiment in Leo Veldhuis' dissertation (2005), and reproduces the validation study published in Alvarez & Ning (2023).

In this example you can vary the fidelity of the simulation setting the following parameters:

ParameterLow fidelityMid-low fidelityMid-high fidelityHigh fidelityDescription
n_wing505050100Number of wing elements per semispan
n_rotor12122050Number of blade elements per blade
nsteps_per_rev36363672Time steps per revolution
p_per_step2555Particle sheds per time step
shed_startingfalsefalsefalsetrueWhether to shed starting vortex
shed_unsteadyfalsefalsefalsetrueWhether to shed vorticity from unsteady loading
treat_waketruetruetruefalseTreat wake to avoid instabilities
vlm_vortexsheet_overlap2.125/102.125/102.125/102.125Particle overlap in ASM vortex sheet
vpm_integrationvpm.eulervpm.eulerRK3$^\star$RK3$^\star$VPM time integration scheme
vpm_SFSNone$^\dag$None$^\dag$Dynamic$^\ddag$Dynamic$^\ddag$VPM LES subfilter-scale model
  • $^\star$RK3: vpm_integration = vpm.rungekutta3
  • $^\dag$None: vpm_SFS = vpm.SFS_none
  • $^\ddag$Dynamic: vpm_SFS = vpm.SFS_Cd_twolevel_nobackscatter

(Low fidelity settings may be inadequate for accurately capturing prop-on-wing interactions, but mid-low or higher should do well)

As a reference, high-fidelity looks like this (except that the video shows a tip-mounted configuration with ailerons):

- -
#=##############################################################################
-# DESCRIPTION
-    Validation of prop-on-wing interactions with twin props mounted mid span
-    blowing on a wing. This case simulates the PROWIM experiment in Leo
-    Veldhuis' dissertation (2005), “Propeller Wing Aerodynamic Interference.”
-
-    In this simulation we use the actuator surface model for the wing in order
-    to accurately capture prop-on-wing interactional effects. The rotors still
-    use the actuator line model.
-
-    The high-fidelity settings replicate the results presented in Alvarez &
-    Ning (2023), "Meshless Large-Eddy Simulation of Propeller–Wing Interactions
-    with Reformulated Vortex Particle Method," Sec. IV.B, also available in
-    Alvarez (2022), "Reformulated Vortex Particle Method and Meshless Large Eddy
-    Simulation of Multirotor Aircraft," Sec. 8.4.
-
-# ABOUT
-  * Author          : Eduardo J. Alvarez (edoalvarez.com)
-  * Email           : Edo.AlvarezR@gmail.com
-  * Created         : January 2024
-  * Last updated    : January 2024
-  * License         : MIT
-=###############################################################################
-
-
-import FLOWUnsteady as uns
-import FLOWUnsteady: vlm, vpm
-
-run_name        = "prowim"                  # Name of this simulation
-save_path       = run_name*"-example2"       # Where to save this simulation
-prompt          = true                      # Whether to prompt the user
-paraview        = true                      # Whether to visualize with Paraview
-
-add_wing        = true                      # Whether to add wing to simulation
-add_rotors      = true                      # Whether to add rotors to simulation
-
-# ----------------- GEOMETRY PARAMETERS ----------------------------------------
-# Wing geometry
-b               = 2*0.64                    # (m) span length
-ar              = 5.33                      # Aspect ratio b/c_tip
-tr              = 1.0                       # Taper ratio c_tip/c_root
-twist_root      = 0.0                       # (deg) twist at root
-twist_tip       = 0.0                       # (deg) twist at tip
-lambda          = 0.0                       # (deg) sweep
-gamma           = 0.0                       # (deg) dihedral
-thickness_w     = 0.15                      # Thickness t/c of wing airfoil
-
-# Rotor geometry
-rotor_file      = "beaver.csv"              # Rotor geometry
-data_path       = uns.def_data_path         # Path to rotor database
-read_polar      = vlm.ap.read_polar2        # What polar reader to use
-pitch           = 2.5                       # (deg) collective pitch of blades
-xfoil           = false                     # Whether to run XFOIL
-ncrit           = 6                         # Turbulence criterion for XFOIL
-
-# Read radius of this rotor and number of blades
-R, B            = uns.read_rotor(rotor_file; data_path=data_path)[[1,3]]
-
-# Vehicle assembly
-AOAwing         = 0.0                       # (deg) wing angle of attack
-spanpos         = [-0.46875, 0.46875]       # Semi-span position of each rotor, 2*y/b
-xpos            = [-0.8417, -0.8417]        # x-position of rotors relative to LE, x/c
-zpos            = [0.0, 0.0]                # z-position of rotors relative to LE, z/c
-CWs             = [false, true]             # Rotation direction of each rotor: outboard up
-# CWs             = [true, false]           # Rotation direction of each rotor: inboard up
-nrotors         = length(spanpos)           # Number of rotors
-
-# Discretization
-n_wing          = 50                        # Number of spanwise elements per side
-r_wing          = 2.0                       # Geometric expansion of elements
-# n_rotor         = 20                        # Number of blade elements per blade
-n_rotor         = 12
-r_rotor         = 1/10                      # Geometric expansion of elements
-
-# Check that we declared all the inputs that we need for each rotor
-@assert nrotors==length(spanpos)==length(xpos)==length(zpos)==length(CWs) ""*
-    "Invalid rotor inputs! Check that spanpos, xpos, zpos, and CWs have the same length"
-
-# ----------------- SIMULATION PARAMETERS --------------------------------------
-# Freestream
-magVinf         = 49.5                      # (m/s) freestream velocity
-AOA             = 4.0                       # (deg) vehicle angle of attack
-rho             = 1.225                     # (kg/m^3) air density
-mu              = 1.79e-5                   # (kg/ms) air dynamic viscosity
-speedofsound    = 342.35                    # (m/s) speed of sound
-qinf            = 0.5*rho*magVinf^2         # (Pa) reference static pressure
-Vinf(X, t)      = magVinf*[cosd(AOA), 0, sind(AOA)]  # Freestream function
-
-# Rotor operation
-J               = 0.85                      # Advance ratio Vinf/(nD)
-RPM             = 60*magVinf/(J*2*R)        # RPM
-
-# Reference non-dimensional parameters
-Rec             = rho * magVinf * (b/ar) / mu       # Chord-based wing Reynolds number
-ReD             = 2*pi*RPM/60*R * rho/mu * 2*R      # Diameter-based rotor Reynolds number
-Mtip            = 2*pi*RPM/60 * R / speedofsound    # Tip Mach number
-
-println("""
-    Vinf:   $(round(magVinf, digits=1)) m/s
-    RPM:    $(RPM)
-    Mtip:   $(round(Mtip, digits=3))
-    ReD:    $(round(ReD, digits=0))
-    Rec:    $(round(Rec, digits=0))
-""")
-
-
-# NOTE: Modify the variable `AOA` in order to change the angle of attack.
-#       `AOAwing` will only change the angle of attack of the wing (while
-#       leaving the propellers unaffected), while `AOA` changes the angle of
-#       attack of the freestream (affecting both wing and props).
-
-# ----------------- SOLVER PARAMETERS ------------------------------------------
-
-# Aerodynamic solver
-VehicleType     = uns.UVLMVehicle           # Unsteady solver
-# VehicleType     = uns.QVLMVehicle         # Quasi-steady solver
-const_solution  = VehicleType==uns.QVLMVehicle  # Whether to assume that the
-                                                # solution is constant or not
-# Time parameters
-nrevs           = 8                         # Number of revolutions in simulation
-nsteps_per_rev  = 36                        # Time steps per revolution
-nsteps          = const_solution ? 2 : nrevs*nsteps_per_rev # Number of time steps
-ttot            = nsteps/nsteps_per_rev / (RPM/60)       # (s) total simulation time
-
-# VPM particle shedding
-# p_per_step      = 5                         # Sheds per time step
-p_per_step      = 2
-shed_starting   = false                     # Whether to shed starting vortex (NOTE: starting vortex might make simulation unstable with AOA>8)
-shed_unsteady   = false                     # Whether to shed vorticity from unsteady loading
-unsteady_shedcrit = 0.001                   # Shed unsteady loading whenever circulation
-                                            #  fluctuates by more than this ratio
-treat_wake      = true                      # Treat wake to avoid instabilities
-max_particles   = 1                         # Maximum number of particles
-max_particles   += add_rotors * (nrotors*((2*n_rotor+1)*B)*nsteps*p_per_step)
-max_particles   += add_wing * (nsteps+1)*(2*n_wing*(p_per_step+1) + p_per_step)
-
-# Regularization
-sigma_vlm_surf  = b/200                     # VLM-on-VPM smoothing radius (σLBV of wing)
-sigma_rotor_surf= R/80                      # Rotor-on-VPM smoothing radius (σ of rotor)
-lambda_vpm      = 2.125                     # VPM core overlap
-                                            # VPM smoothing radius (σ of wakes)
-sigma_vpm_overwrite = lambda_vpm * 2*pi*R/(nsteps_per_rev*p_per_step)
-
-# Rotor solver
-vlm_rlx         = 0.3                       # VLM relaxation <-- this also applied to rotors
-hubtiploss_correction = ( (0.75, 10, 0.5, 0.05), (1, 1, 1, 1.0) ) # Hub/tip correction
-# VPM solver
-# vpm_integration = vpm.rungekutta3           # VPM temporal integration scheme
-vpm_integration = vpm.euler
-
-vpm_viscous     = vpm.Inviscid()            # VPM viscous diffusion scheme
-                                            # Uncomment this to make it viscous
-# vpm_viscous   = vpm.CoreSpreading(-1, -1, vpm.zeta_fmm; beta=100.0, itmax=20, tol=1e-1)
-
-vpm_SFS       = vpm.SFS_none              # VPM LES subfilter-scale model
-# vpm_SFS         = vpm.DynamicSFS(vpm.Estr_fmm, vpm.pseudo3level_positive;
-                                  # alpha=0.999, maxC=1.0,
-                                  # clippings=[vpm.clipping_backscatter])
-
-# NOTE: By default we make this simulation inviscid since at such high Reynolds
-#       number the viscous effects in the wake are actually negligible.
-#       Notice that while viscous diffusion is negligible, turbulent diffusion
-#       is important and non-negigible, so we have activated the subfilter-scale
-#       (SFS) model.
-
-if VehicleType == uns.QVLMVehicle
-    # Mute warnings regarding potential colinear vortex filaments. This is
-    # needed since the quasi-steady solver will probe induced velocities at the
-    # lifting line of the blade
-    uns.vlm.VLMSolver._mute_warning(true)
-end
-
-println("""
-    Resolving wake for $(round(ttot*magVinf/b, digits=1)) span distances
-""")
-
-
-
-
-
-# ----------------- ACTUATOR SURFACE MODEL PARAMETERS (WING) -------------------
-
-# ---------- Vortex sheet parameters ---------------
-vlm_vortexsheet = true                      # Spread wing circulation as a vortex sheet (activates the ASM)
-vlm_vortexsheet_overlap = 2.125/10          # Particle overlap in vortex sheet
-vlm_vortexsheet_distribution = uns.g_pressure   # Distribution of the vortex sheet
-
-vlm_vortexsheet_sigma_tbv = thickness_w*(b/ar) / 128 # Smoothing radius of trailing bound vorticity, σTBV for VLM-on-VPM
-
-vlm_vortexsheet_maxstaticparticle = 10^6    # Particles to preallocate for vortex sheet
-
-if add_wing && vlm_vortexsheet
-    max_particles += vlm_vortexsheet_maxstaticparticle
-end
-
-
-# ---------- Force calculation parameters ----------
-KJforce_type                = "regular"     # KJ force evaluated at middle of bound vortices
-# KJforce_type              = "averaged"    # KJ force evaluated at average vortex sheet
-# KJforce_type              = "weighted"    # KJ force evaluated at strength-weighted vortex sheet
-
-include_trailingboundvortex = false         # Include trailing bound vortices in force calculations
-
-include_freevortices        = false         # Include free vortices in force calculation
-include_freevortices_TBVs   = false         # Include trailing bound vortex in free-vortex force
-
-include_unsteadyforce       = true          # Include unsteady force
-add_unsteadyforce           = false         # Whether to add the unsteady force to Ftot or to simply output it
-
-include_parasiticdrag       = true          # Include parasitic-drag force
-add_skinfriction            = true          # If false, the parasitic drag is purely form, meaning no skin friction
-calc_cd_from_cl             = true          # Whether to calculate cd from cl or effective AOA
-# calc_cd_from_cl             = false
-
-# NOTE: We use a polar at a low Reynolds number (100k as opposed to 600k from
-#       the experiment) as this particular polar better resembles the drag of
-#       the tripped airfoil used in the experiment
-wing_polar_file             = "xf-n64015a-il-100000-n5.csv"    # Airfoil polar for parasitic drag (from airfoiltools.com)
-
-
-if include_freevortices && Threads.nthreads()==1
-    @warn("Free-vortex force calculation requested, but Julia was initiated"*
-          " with only one CPU thread. This will be extremely slow!"*
-          " Initate Julia with `-t num` where num is the number of cores"*
-          " availabe to speed up the computation.")
-end
-
-
-
-
-
-# ----------------- WAKE TREATMENT ---------------------------------------------
-
-wake_treatments = []
-
-# Remove particles by particle strength: remove particles neglibly weak, remove
-# particles potentially blown up
-rmv_strngth = 2.0 * magVinf*(b/ar)/2 * magVinf*ttot/nsteps/p_per_step  # Reference strength (maxCL=2.0)
-minmaxGamma = rmv_strngth*[0.0001, 10.0]    # Strength bounds (removes particles outside of these bounds)
-wake_treatment_strength = uns.remove_particles_strength( minmaxGamma[1]^2, minmaxGamma[2]^2; every_nsteps=1)
-
-if treat_wake
-    push!(wake_treatments, wake_treatment_strength)
-end
-
-
-
-
-
-# ----------------- 1) VEHICLE DEFINITION --------------------------------------
-
-# -------- Generate components
-println("Generating geometry...")
-
-# Generate wing
-wing = vlm.simpleWing(b, ar, tr, twist_root, lambda, gamma;
-                                    twist_tip=twist_tip, n=n_wing, r=r_wing);
-
-# Pitch wing to its angle of attack
-O = [0.0, 0.0, 0.0]                                 # New position
-Oaxis = uns.gt.rotation_matrix2(0, -AOAwing, 0)     # New orientation
-vlm.setcoordsystem(wing, O, Oaxis)
-
-# Generate rotors
-rotors = vlm.Rotor[]
-for ri in 1:nrotors
-
-    # Generate rotor
-    rotor = uns.generate_rotor(rotor_file;
-                                pitch=pitch,
-                                n=n_rotor, CW=CWs[ri], blade_r=r_rotor,
-                                altReD=[RPM, J, mu/rho],
-                                xfoil=xfoil,
-                                ncrit=ncrit,
-                                data_path=data_path,
-                                read_polar=read_polar,
-                                verbose=true,
-                                verbose_xfoil=false,
-                                plot_disc=false
-                                );
-
-    # Simulate only one rotor if the wing is not in the simulation
-    if !add_wing
-        push!(rotors, rotor)
-        break
-    end
-
-    # Determine position along wing LE
-    y = spanpos[ri]*b/2
-    x = abs(y)*tand(lambda) + xpos[ri]*b/ar
-    z = abs(y)*tand(gamma) + zpos[ri]*b/ar
-
-    # Account for angle of attack of wing
-    nrm = sqrt(x^2 + z^2)
-    x = (x==0 ? 1 : sign(x))*nrm*cosd(AOAwing)
-    z = -(z==0 ? 1 : sign(z))*nrm*sind(AOAwing)
-
-    # Translate rotor to its position along wing
-    O_r = [x, y, z]                                     # New position
-    Oaxis_r = uns.gt.rotation_matrix2(0, 0, 0)          # New orientation
-    vlm.setcoordsystem(rotor, O_r, Oaxis_r; user=true)
-
-    push!(rotors, rotor)
-end
-
-
-# -------- Generate vehicle
-println("Generating vehicle...")
-
-# System of all FLOWVLM objects
-system = vlm.WingSystem()
-
-if add_wing
-    vlm.addwing(system, "Wing", wing)
-end
-
-if add_rotors
-    for (ri, rotor) in enumerate(rotors)
-        vlm.addwing(system, "Rotor$(ri)", rotor)
-    end
-end
-
-# System solved through VLM solver
-vlm_system = vlm.WingSystem()
-add_wing ? vlm.addwing(vlm_system, "Wing", wing) : nothing
-
-# Systems of rotors
-rotor_systems = add_rotors ? (rotors, ) : NTuple{0, Array{vlm.Rotor, 1}}()
-
-# System that will shed a VPM wake
-wake_system = vlm.WingSystem()              # System that will shed a VPM wake
-add_wing ? vlm.addwing(wake_system, "Wing", wing) : nothing
-                                            # NOTE: Do NOT include rotor when using the quasi-steady solver
-if VehicleType != uns.QVLMVehicle && add_rotors
-    for (ri, rotor) in enumerate(rotors)
-        vlm.addwing(wake_system, "Rotor$(ri)", rotor)
-    end
-end
-
-# Pitch vehicle to its angle of attack (0 in this case since we have tilted the freestream instead)
-O = [0.0, 0.0, 0.0]                                 # New position
-Oaxis = uns.gt.rotation_matrix2(0, 0, 0)            # New orientation
-vlm.setcoordsystem(system, O, Oaxis)
-
-vehicle = VehicleType(   system;
-                            vlm_system=vlm_system,
-                            rotor_systems=rotor_systems,
-                            wake_system=wake_system
-                         );
-
-
-
-
-
-
-# ------------- 2) MANEUVER DEFINITION -----------------------------------------
-# Non-dimensional translational velocity of vehicle over time
-Vvehicle(t) = [-1, 0, 0]        # <---- Vehicle is traveling in the -x direction
-
-# Angle of the vehicle over time
-anglevehicle(t) = zeros(3)
-
-# RPM control input over time (RPM over `RPMref`)
-RPMcontrol(t) = 1.0
-
-angles = ()                                 # Angle of each tilting system (none)
-RPMs = add_rotors ? (RPMcontrol, ) : ()     # RPM of each rotor system
-
-maneuver = uns.KinematicManeuver(angles, RPMs, Vvehicle, anglevehicle)
-
-
-
-
-
-
-# ------------- 3) SIMULATION DEFINITION ---------------------------------------
-
-Vref = 0.0                                  # Reference velocity to scale maneuver by
-RPMref = RPM                                # Reference RPM to scale maneuver by
-Vinit = Vref*Vvehicle(0)                    # Initial vehicle velocity
-Winit = pi/180*(anglevehicle(1e-6) - anglevehicle(0))/(1e-6*ttot)  # Initial angular velocity
-
-simulation = uns.Simulation(vehicle, maneuver, Vref, RPMref, ttot;
-                                                    Vinit=Vinit, Winit=Winit);
-
-
-
-
-
-# ------------- *) AERODYNAMIC FORCES ------------------------------------------
-# Here we define the different components of aerodynamic of force that we desire
-# to capture with the wing using the actuator surface model
-
-forces = []
-
-# Calculate Kutta-Joukowski force
-kuttajoukowski = uns.generate_aerodynamicforce_kuttajoukowski(KJforce_type,
-                                sigma_vlm_surf, sigma_rotor_surf,
-                                vlm_vortexsheet, vlm_vortexsheet_overlap,
-                                vlm_vortexsheet_distribution,
-                                vlm_vortexsheet_sigma_tbv;
-                                vehicle=vehicle)
-push!(forces, kuttajoukowski)
-
-# Free-vortex force
-if include_freevortices
-    freevortices = uns.generate_calc_aerodynamicforce_freevortices(
-                                            vlm_vortexsheet_maxstaticparticle,
-                                            sigma_vlm_surf,
-                                            vlm_vortexsheet,
-                                            vlm_vortexsheet_overlap,
-                                            vlm_vortexsheet_distribution,
-                                            vlm_vortexsheet_sigma_tbv;
-                                            Ffv=uns.Ffv_direct,
-                                            include_TBVs=include_freevortices_TBVs
-                                            )
-    push!(forces, freevortices)
-end
-
-# Force due to unsteady circulation
-if include_unsteadyforce
-    unsteady(args...; optargs...) = uns.calc_aerodynamicforce_unsteady(args...;
-                                      add_to_Ftot=add_unsteadyforce, optargs...)
-
-    push!(forces, unsteady)
-end
-
-# Parasatic-drag force (form drag and skin friction)
-if include_parasiticdrag
-    parasiticdrag = uns.generate_aerodynamicforce_parasiticdrag(
-                            wing_polar_file;
-                            read_path=joinpath(data_path, "airfoils"),
-                            calc_cd_from_cl=calc_cd_from_cl,
-                            add_skinfriction=add_skinfriction,
-                            Mach=speedofsound!=nothing ? magVinf/speedofsound : nothing
-                            )
-
-    push!(forces, parasiticdrag)
-end
-
-
-# Stitch all the forces into one function
-function calc_aerodynamicforce_fun(vlm_system, args...; per_unit_span=false, optargs...)
-
-    # Delete any previous force field
-    fieldname = per_unit_span ? "ftot" : "Ftot"
-    if fieldname in keys(vlm_system.sol)
-        pop!(vlm_system.sol, fieldname)
-    end
-
-    Ftot = nothing
-
-    for (fi, force) in enumerate(forces)
-        Ftot = force(vlm_system, args...; per_unit_span=per_unit_span, optargs...)
-    end
-
-    return Ftot
-end
-
-
-
-
-
-
-# ------------- 4) MONITORS DEFINITIONS ----------------------------------------
-
-# Generate wing monitor
-L_dir = [-sind(AOA), 0, cosd(AOA)]          # Direction of lift
-D_dir = [ cosd(AOA), 0, sind(AOA)]          # Direction of drag
-
-monitor_wing = uns.generate_monitor_wing(wing, Vinf, b, ar,
-                                            rho, qinf, nsteps;
-                                            calc_aerodynamicforce_fun=calc_aerodynamicforce_fun,
-                                            include_trailingboundvortex=include_trailingboundvortex,
-                                            L_dir=L_dir,
-                                            D_dir=D_dir,
-                                            save_path=save_path,
-                                            run_name=run_name*"-wing",
-                                            figname="wing monitor",
-                                            )
-
-# Generate rotors monitor
-monitor_rotors = uns.generate_monitor_rotors(rotors, J, rho, RPM, nsteps;
-                                            t_scale=RPM/60,        # Scaling factor for time in plots
-                                            t_lbl="Revolutions",   # Label for time axis
-                                            save_path=save_path,
-                                            run_name=run_name*"-rotors",
-                                            figname="rotors monitor",
-                                            )
-
-# Generate monitor of flow enstrophy (indicates numerical stability)
-monitor_enstrophy = uns.generate_monitor_enstrophy(;
-                                            save_path=save_path,
-                                            run_name=run_name,
-                                            figname="enstrophy monitor"
-                                            )
-
-# Generate monitor of SFS model coefficient Cd
-monitor_Cd = uns.generate_monitor_Cd(;      save_path=save_path,
-                                            run_name=run_name,
-                                            figname="Cd monitor"
-                                            )
-
-
-# Concatenate monitors
-all_monitors = [monitor_enstrophy, monitor_Cd]
-
-add_wing ? push!(all_monitors, monitor_wing) : nothing
-add_rotors ? push!(all_monitors, monitor_rotors) : nothing
-
-monitors = uns.concatenate(all_monitors...)
-
-# Concatenate user-defined runtime function
-extra_runtime_function = uns.concatenate(monitors, wake_treatments...)
-
-
-
-# ------------- 5) RUN SIMULATION ----------------------------------------------
-println("Running simulation...")
-
-
-# Run simulation
-uns.run_simulation(simulation, nsteps;
-
-                    # ----- SIMULATION OPTIONS -------------
-                    Vinf=Vinf,
-                    rho=rho, mu=mu, sound_spd=speedofsound,
-
-                    # ----- SOLVERS OPTIONS ----------------
-                    vpm_integration=vpm_integration,
-                    vpm_viscous=vpm_viscous,
-                    vpm_SFS=vpm_SFS,
-
-                    p_per_step=p_per_step,
-                    max_particles=max_particles,
-
-                    sigma_vpm_overwrite=sigma_vpm_overwrite,
-                    sigma_rotor_surf=sigma_rotor_surf,
-                    sigma_vlm_surf=sigma_vlm_surf,
-
-                    vlm_rlx=vlm_rlx,
-                    vlm_vortexsheet=vlm_vortexsheet,
-                    vlm_vortexsheet_overlap=vlm_vortexsheet_overlap,
-                    vlm_vortexsheet_distribution=vlm_vortexsheet_distribution,
-                    vlm_vortexsheet_sigma_tbv=vlm_vortexsheet_sigma_tbv,
-                    max_static_particles=vlm_vortexsheet_maxstaticparticle,
-
-                    hubtiploss_correction=hubtiploss_correction,
-
-                    shed_starting=shed_starting,
-                    shed_unsteady=shed_unsteady,
-                    unsteady_shedcrit=unsteady_shedcrit,
-
-                    extra_runtime_function=extra_runtime_function,
-
-                    # ----- OUTPUT OPTIONS ------------------
-                    save_path=save_path,
-                    run_name=run_name,
-                    prompt=prompt,
-                    save_wopwopin=false,  # <--- Generates input files for PSU-WOPWOP noise analysis if true
-
-                    );
-
-
-
-
-
-
-# ----------------- 6) VISUALIZATION -------------------------------------------
-if paraview
-    println("Calling Paraview...")
-
-    # Files to open in Paraview
-    files = joinpath(save_path, run_name*"_pfield...xmf;")
-
-    if add_rotors
-        for ri in 1:nrotors
-            for bi in 1:B
-                global files *= run_name*"_Rotor$(ri)_Blade$(bi)_loft...vtk;"
-            end
-        end
-    end
-
-    if add_wing
-        files *= run_name*"_Wing_vlm...vtk;"
-    end
-
-    # Call Paraview
-    run(`paraview --data=$(files)`)
-
-end
- Low fidelity run time: 13 minutes a Dell Precision 7760 laptop.
- Mid-low fidelity run time: 25 minutes a Dell Precision 7760 laptop.
- Mid-high fidelity run time: 70 minutes a Dell Precision 7760 laptop.
- High fidelity runtime: ~2 days on a 16-core AMD EPYC 7302 processor. -
-

-

- Mid-High Fidelity -
- Pic here -



- High Fidelity -
- Pic here -


-

The favorable comparison with the experiment at $\alpha=0^\circ$ and $4^\circ$ confirms that ASM accurately predicts prop-on-wing interactions up to a moderate angle of attack. At $\alpha=10^\circ$ we suspect that the wing is mildly stalled in the experiment, leading to a larger discrepancy (further discussed in Alvarez' Dissertation[1] and Alvarez & Ning, 2023[2]).

Source file

Full example available under examples/prowim/.

  • 1E. J. Alvarez (2022), "Reformulated Vortex Particle Method and Meshless Large Eddy Simulation of Multirotor Aircraft," Doctoral Dissertation, Brigham Young University. [VIDEO] [PDF]
  • 2E. J. Alvarez and A. Ning (2023), "Meshless Large-Eddy Simulation of Propeller–Wing Interactions with Reformulated Vortex Particle Method," Journal of Aircraft. [DOI][PDF]
diff --git a/examples/rotorhover-acoustics/index.html b/examples/rotorhover-acoustics/index.html index 22ae9c61..fb3d706f 100644 --- a/examples/rotorhover-acoustics/index.html +++ b/examples/rotorhover-acoustics/index.html @@ -3,7 +3,7 @@ function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-B7CBF7WC7L', {'page_path': location.pathname + location.search + location.hash}); -

Aeroacoustic Noise

+

Aeroacoustic Noise

Pic here

Using the aerodynamic solution obtained in the previous section, we can now feed the time-resolved loading and blade motion to PSU-WOPWOP and BPM.jl to compute aeroacoustic noise. PSU-WOPWOP is a Ffowcs Williams-Hawkings acoustic analogy using the time-domain integral Farassat 1A formulation to compute tonal noise from loading and thickness sources (FLOWUnsteady uses a compact representation for the loading source, while using the actual 3D loft of the blade for the thickness source). BPM.jl is an implementation of the semi-empirical methodology developed by Brooks, Pope, and Marcolini to predict broadband noise. The methodology models five self-noise mechanisms due to boundary-layer phenomena: boundary-layer turbulence passing the trailing edge, separated boundary-layer and stalled-airfoil flow, vortex shedding due to laminar-boundary-layer instabilities, vortex shedding from blunt trailing edges, and turbulent flow due to vortex tip formation.

In the following code we exemplify the following:

  • How to define observers (microphones) to probe the aeroacoustic noise
  • How to call PSU-WOPWOP through uns.run_noise_wopwop
  • How to call BPM.jl through uns.run_noise_bpm
  • How to add the tonal and broadband noise together and postprocess

As a reference, this is the orientation of the rotor and microphone array used in this example:

Pic here @@ -389,4 +389,4 @@ plot_csv=plot_experimental, rticks=40:10:70, rlims=[40, 72], rorigin=30)
Pic here -
  • 1N. S. Zawodny, D. D. Boyd, Jr., and C. L. Burley, “Acoustic Characterization and Prediction of Representative, Small-scale Rotary-wing Unmanned Aircraft System Components,” in 72nd American Helicopter Society (AHS) Annual Forum (2016).
+
  • 1N. S. Zawodny, D. D. Boyd, Jr., and C. L. Burley, “Acoustic Characterization and Prediction of Representative, Small-scale Rotary-wing Unmanned Aircraft System Components,” in 72nd American Helicopter Society (AHS) Annual Forum (2016).
diff --git a/examples/rotorhover-aero/index.html b/examples/rotorhover-aero/index.html index 39ae1892..4a6c7e59 100644 --- a/examples/rotorhover-aero/index.html +++ b/examples/rotorhover-aero/index.html @@ -3,7 +3,7 @@ function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-B7CBF7WC7L', {'page_path': location.pathname + location.search + location.hash}); -

Variable Fidelity

+

Variable Fidelity

-
- ``` - - """) - - println(fout, "```julia") - - open(joinpath(example_path, "prowim.jl"), "r") do fin - - ignore = false - - for l in eachline(fin) - if contains(l, "6) POSTPROCESSING") - break - end - - # if l=="#=" || contains(l, "# Uncomment this") - if l=="#=" - ignore=true - end - - if !ignore && !contains(l, "save_code=") - println(fout, l) - end - - if l=="=#" || contains(l, "# paraview = false") - ignore=false - end - end - end - - println(fout, "```") - - println(fout, """ - ```@raw html - - Low fidelity run time: 13 minutes a Dell Precision 7760 laptop.
- Mid-low fidelity run time: 25 minutes a Dell Precision 7760 laptop.
- Mid-high fidelity run time: 70 minutes a Dell Precision 7760 laptop.
- High fidelity runtime: ~2 days on a 16-core AMD EPYC 7302 processor. -
-

- ``` - - ```@raw html -
-

- Mid-High Fidelity -
- Pic here -



- High Fidelity -
- Pic here -


-
- ``` - - The favorable comparison with the experiment at \$\\alpha=0^\\circ\$ and - \$4^\\circ\$ confirms that ASM accurately predicts prop-on-wing - interactions up to a moderate angle of attack. At \$\\alpha=10^\\circ\$ we suspect - that the wing is mildly stalled in the experiment, leading to a larger discrepancy (further - discussed in [Alvarez' Dissertation](https://scholarsarchive.byu.edu/etd/9589)[^1] - and - [Alvarez & Ning, 2023](https://arc.aiaa.org/doi/abs/10.2514/1.C037279)[^2]). - - !!! info "Source file" - Full example available under - [examples/prowim/](https://github.com/byuflowlab/FLOWUnsteady/blob/master/examples/prowim). - - - - [^1]: E. J. Alvarez (2022), "Reformulated Vortex Particle Method and - Meshless Large Eddy Simulation of Multirotor Aircraft," *Doctoral - Dissertation, Brigham Young University*. - [**[VIDEO]**](https://www.nas.nasa.gov/pubs/ams/2022/08-09-22.html) - [**[PDF]**](https://scholarsarchive.byu.edu/etd/9589/) - [^2]: E. J. Alvarez and A. Ning (2023), "Meshless Large-Eddy Simulation of - Propeller–Wing Interactions with Reformulated Vortex Particle Method," - *Journal of Aircraft*. - [**[DOI]**](https://arc.aiaa.org/doi/abs/10.2514/1.C037279)[**[PDF]**](https://scholarsarchive.byu.edu/facpub/6902/) - """) - -end diff --git a/index.html b/index.html index f2780b40..0e60d2f2 100644 --- a/index.html +++ b/index.html @@ -3,7 +3,7 @@ function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-B7CBF7WC7L', {'page_path': location.pathname + location.search + location.hash}); -
FLOWUnsteady logo

+

FLOWUnsteady logo

Interactional aerodynamics solver for multirotor aircraft and wind energy @@ -24,11 +24,11 @@ allowfullscreen>

Variable Fidelity

rVPM considerably reduces engineering time by avoiding the hurdles of mesh generation. Furthermore, since it is not limited by the time-step and stability constraints of conventional mesh-based CFD, rVPM can be used across all levels of fidelity, all in the same framework by simply coarsening or refining the simulation. In the low end of fidelity, simulations are similar to a free-wake method, while in the high end simulations become meshless large eddy simulations. Thus, FLOWUnsteady can be used as a high-fidelity tool that is orders of magnitude faster than mesh-based CFD, or as a variable-fidelity tool for the different stages of design.

img -

Capabilities

Simulation: Tilting wings and rotors • Rotors with variable RPM and variable pitch • Asymmetric and stacked rotors • Maneuvering vehicle with prescribed kinematics

rVPM Solver: Fast-multipole acceleration through ExaFMM • CPU parallelization through OpenMP • Second-order spatial accuracy and third-order RK time integration • Numerically stable by reshaping particles subject to vortex stretching • Subfilter-scale (SFS) model of turbulence associated to vortex stretching • SFS model coefficient computed dynamically or prescribed • Viscous diffusion through core spreading

Wing Models: Actuator line model through lifting line + VLM • Actuator surface model through vortex sheet + VLM • Parasitic drag through airfoil lookup tables

Rotor Model: Actuator line model through blade elements • Airfoil lookup tables automatically generated through XFOIL • Aeroacoustic noise through FW-H (PSU-WOPWOP) and BPM

Geometry: Simple lofts and bodies of revolution through FLOWUnsteady • Import complex geometry from OpenVSP

Under development (🤞coming soon): Advanced actuator surface models through 3D panel method (for ducts, wings, and fuselage) • Unstructured surface grids • Bluff bodies through vortex sheet method

Limitations: Viscous drag and separation is only captured through airfoil lookup tables, without attempting to shed separation wakes • Incompressible flow only (though wave drag can be captured through airfoil lookup tables) • CPU parallelization through OpenMP without support for distributed memory (no MPI, i.e., only single-node runs)

Coded in the Julia language for Linux, MacOS, and Windows WSL.

More about the models inside FLOWUnsteady:

+

Capabilities

Simulation: Tilting wings and rotors • Rotors with variable RPM and variable pitch • Asymmetric and stacked rotors • Maneuvering vehicle with prescribed kinematics

rVPM Solver: Fast-multipole acceleration through ExaFMM • CPU parallelization through OpenMP • Second-order spatial accuracy and third-order RK time integration • Numerically stable by reshaping particles subject to vortex stretching • Subfilter-scale (SFS) model of turbulence associated to vortex stretching • SFS model coefficient computed dynamically or prescribed • Viscous diffusion through core spreading

Wing Models: Actuator line model through lifting line + VLM • Actuator surface model through vortex sheet + VLM • Parasitic drag through airfoil lookup tables

Rotor Model: Actuator line model through blade elements • Airfoil lookup tables automatically generated through XFOIL • Aeroacoustic noise through FW-H (PSU-WOPWOP) and BPM

Geometry: Simple lofts and bodies of revolution through FLOWUnsteady • Import complex geometry from OpenVSP

Under development (🤞coming soon): Advanced actuator surface models through 3D panel method (for ducts, wings, and fuselage) • Unstructured surface grids • Bluff bodies through vortex sheet method

Limitations: Viscous drag and separation is only captured through airfoil lookup tables, without attempting to shed separation wakes • Incompressible flow only (though wave drag can be captured through airfoil lookup tables) • CPU parallelization through OpenMP without support for distributed memory (no MPI, i.e., only single-node runs)

Coded in the Julia language for Linux, MacOS, and Windows WSL.

More about the models inside FLOWUnsteady:

https://www.nas.nasa.gov/pubs/ams/2022/08-09-22.html -


Selected Publications

See the following publications for an in-depth dive into the theory and validation:

  • E. J. Alvarez, J. Mehr, & A. Ning (2022), "FLOWUnsteady: An Interactional Aerodynamics Solver for Multirotor Aircraft and Wind Energy," AIAA AVIATION Forum. [VIDEO] [PDF]
  • E. J. Alvarez (2022), "Reformulated Vortex Particle Method and Meshless Large Eddy Simulation of Multirotor Aircraft.," Doctoral Dissertation, Brigham Young University. [VIDEO] [PDF]
  • E. J. Alvarez & A. Ning (2023), "Stable Vortex Particle Method Formulation for Meshless Large-Eddy Simulation," AIAA Journal. [PDF]


Examples and Tutorials

Propeller: [Tutorial] [Validation]

+


Selected Publications

See the following publications for an in-depth dive into the theory and validation:

  • E. J. Alvarez, J. Mehr, & A. Ning (2022), "FLOWUnsteady: An Interactional Aerodynamics Solver for Multirotor Aircraft and Wind Energy," AIAA AVIATION Forum. [VIDEO] [PDF]
  • E. J. Alvarez & A. Ning (2022), "Reviving the Vortex Particle Method: A Stable Formulation for Meshless Large Eddy Simulation," (accepted in AIAAJ). [PDF]
  • E. J. Alvarez (2022), "Reformulated Vortex Particle Method and Meshless Large Eddy Simulation of Multirotor Aircraft.," Doctoral Dissertation, Brigham Young University. [VIDEO] [PDF]


Examples

Propeller: [Tutorial] [Validation]

-

Blown Wing: [Tutorial] [Validation]

- -

Ducted Fan: [Slides]

- -

Airborne-Wind-Energy Aircraft: [Video]

+

Blown Wing: [Tutorial] [Validation]

+ img +


Airborne-Wind-Energy Aircraft: [Video]

img

eVTOL Transition: [Tutorial]

Mid-fidelity

-

Aeroacoustic Noise: [Tutorial] [Validation]

+

Aeroacoustic Noise: [Tutorial] [Validation]

+ Vid +

-

- Vid -

Sponsors

+

Sponsors

img


-

About

FLOWUnsteady is an open-source project jointly led by the FLOW Lab at Brigham Young University and Whisper Aero. All contributions are welcome.

If you find FLOWUnsteady useful in your work, we kindly request that you cite the following paper [URL] [PDF]:

Alvarez, E. J., Mehr, J., and Ning, A., “FLOWUnsteady: An Interactional Aerodynamics Solver for Multirotor Aircraft and Wind Energy,” AIAA AVIATION 2022 Forum, Chicago, IL, 2022. DOI:10.2514/6.2022-3218.

If you were to encounter any issues or have questions, please first read through the documentation, open/closed issues, and the discussion forum. If the issue still persists, please participate in the discussion forum and/or open a new issue.

+

About

FLOWUnsteady is an open-source project jointly led by the FLOW Lab at Brigham Young University and Whisper Aero. All contributions are welcome.

If you find FLOWUnsteady useful in your work, we kindly request that you cite the following paper [URL] [PDF]:

Alvarez, E. J., Mehr, J., and Ning, A., “FLOWUnsteady: An Interactional Aerodynamics Solver for Multirotor Aircraft and Wind Energy,” AIAA AVIATION 2022 Forum, Chicago, IL, 2022. DOI:10.2514/6.2022-3218.

If you were to encounter any issues or have questions, please first read through the documentation, open/closed issues, and the discussion forum. If the issue still persists, please open a new issue and/or participate in the discussion forum.

diff --git a/installation/general/index.html b/installation/general/index.html index eb3e7d8d..264a15f9 100644 --- a/installation/general/index.html +++ b/installation/general/index.html @@ -3,7 +3,7 @@ function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-B7CBF7WC7L', {'page_path': location.pathname + location.search + location.hash}); -

Installation Instructions

FLOWUnsteady is developed in the Julia programming language, which is a modern, high-level, dynamic programming language for high-performance computing. For visualization and postprocessing, FLOWUnsteady uses ParaView, which is an open-source software for scientific and HPC visualization.

The following instructions walk you through how to install Julia, ParaView, and FLOWUnsteady.

Windows Users

On Windows please follow these instructions first to set up Windows Subsystem for Linux.

Julia

  • Download and install Julia: julialang.org (currently we are only supporting up to Julia v1.8.5, so we recommend using v1.8.5 or v1.6.7 LTS )
  • Add Julia to user-level bin folder
    sudo ln -s /[user-specific-path/Julia-1.x.x]/bin/julia /usr/local/bin/julia
    Replace /[user-specific-path/Julia-1.x.x]/ with the path where Julia got installed. For instance, in MacOS the full path looks like this: /Applications/Julia-1.8.app/Contents/Resources/julia/bin/julia

If you were successfull, typing the following in the terminal will launch the Julia REPL:

julia

ParaView

  • Download and install ParaView: paraview.org
  • Add ParaView to user-level bin folder
    sudo ln -s /[user-specific-path/ParaView-5.x.x]/paraview /usr/local/bin/paraview
    Replace /[user-specific-path/ParaView-5.x.x]/ with the path where ParaView got installed. For instance, in MacOS the full path looks like this: /Applications/ParaView-5.11.0.app/Contents/MacOS/paraview

If you were successfull, typing the following in the terminal will launch the ParaView:

paraview

To test that ParaView is correctly installed, run one of the examples of the GeometricTools package as follows (copy/paste this in the Julia REPL):

# Install GeometricTools
+

Installation Instructions

FLOWUnsteady is developed in the Julia programming language, which is a modern, high-level, dynamic programming language for high-performance computing. For visualization and postprocessing, FLOWUnsteady uses ParaView, which is an open-source software for scientific and HPC visualization.

The following instructions walk you through how to install Julia, ParaView, and FLOWUnsteady.

Windows Users

On Windows please follow these instructions first to set up Windows Subsystem for Linux.

Julia

  • Download and install Julia: julialang.org (currently we are supporting up to Julia v1.10, so we recommend using v1.10.2 or v1.6.7 LTS )
  • Add Julia to user-level bin folder
    sudo ln -s /[user-specific-path/Julia-1.x.x]/bin/julia /usr/local/bin/julia
    Replace /[user-specific-path/Julia-1.x.x]/ with the path where Julia got installed. For instance, in MacOS the full path looks like this: /Applications/Julia-1.10.app/Contents/Resources/julia/bin/julia

If you were successfull, typing the following in the terminal will launch the Julia REPL:

julia

ParaView

  • Download and install ParaView: paraview.org
  • Add ParaView to user-level bin folder
    sudo ln -s /[user-specific-path/ParaView-5.x.x]/paraview /usr/local/bin/paraview
    Replace /[user-specific-path/ParaView-5.x.x]/ with the path where ParaView got installed. For instance, in MacOS the full path looks like this: /Applications/ParaView-5.12.0.app/Contents/MacOS/paraview

If you were successfull, typing the following in the terminal will launch the ParaView:

paraview

To test that ParaView is correctly installed, run one of the examples of the GeometricTools package as follows (copy/paste this in the Julia REPL):

# Install GeometricTools
 import Pkg; Pkg.add("GeometricTools")
 
 import GeometricTools as gt
@@ -25,15 +25,15 @@
 Pkg.build("PyCall")

Then close and reopen the Julia REPL, and run:

import PyCall
 PyCall.pyversion

which should reveal your Python version:

v"3.8"

Since PyCall now relies on a custom install of Python3, make sure that:

  • matplotlib, mpmath, and scipy are installed in that Python,
    pip3 install matplotlib mpmath scipy --user
  • For optimal experience, verify that matplotlib uses the Qt5Agg backend. Useful instructions can be found here and here.

If you run into errors with PyPlot while running FLOWUnsteady, they are likely related to one of those two items.

FLOWVPM

FLOWVPM uses a fast multipole code called ExaFMM that accelerates the computation of particle interactions. ExaFMM is written in C++ and we have developed a Julia wrapper for it: FLOWExaFMM.

Before installing FLOWVPM, first you will have to install FLOWExaFMM and compile ExaFMM, as follows.

  • Make sure you have CMake, GCC, and OpenMP. On Linux, type to following to install them

    sudo apt-get update
     sudo apt-get install cmake g++ mpich
  • [Julia REPL] Install CxxWrap:

    import Pkg
    -Pkg.add(name="CxxWrap", version="0.11.2")
  • [Terminal] Clone FLOWExaFMM:

    git clone https://github.com/byuflowlab/FLOWExaFMM path/to/FLOWExaFMM

    (replace path/to/FLOWExaFMM with your preferred path in your local)

  • Compile ExaFMM running the script build.sh:
    cd path/to/FLOWExaFMM
    +Pkg.add(name="CxxWrap", version="0.15.0")
  • [Terminal] Clone FLOWExaFMM:

    git clone https://github.com/byuflowlab/FLOWExaFMM path/to/FLOWExaFMM

    (replace path/to/FLOWExaFMM with your preferred path in your local)

  • Compile ExaFMM running the script build.sh:
    cd path/to/FLOWExaFMM
     sh build.sh
    or in MacOS:
    cd path/to/FLOWExaFMM
     sh build_macos.sh
    This should have generated the file fmm.so (or fmm.dylib in MacOS) under src/, which is a binary library containing ExaFMM.

Now that ExaFMM is compiled, you can add FLOWExaFMM to your Julia environment as a development package pointing directly to where you compiled the package and add FLOWVPM:

  • Add FLOWExaFMM:
    # In the Julia REPL
    -] develop path/to/FLOWExaFMM
  • [Optional] Test FLOWExaFMM:
    ] test FLOWExaFMM
    This will return a heart-warming "Hello world!" if ExaFMM was correctly compiled.
  • Add FLOWVPM:
    ] add https://github.com/byuflowlab/FLOWVPM.jl
  • [Optional] Test FLOWVPM:
    ] test FLOWVPM

If you run into any issues, please try the following:

  • Test that you can correctly compile C++ code wrapped for Julia following these instructions: LINK
  • Mac users, take a look at this thread: LINK
  • Instructions for BYU Fulton supercomputer: LINK

If issues persist, please check the resolved issues in the FLOWExaFMM repo, the discussion forum in the FLOWUnsteady repo, and feel free to open a new issue or discussion for help.

Other Packages

Run the following commands in the Julia REPL to add some dependencies that are not in the official Julia registry:

import Pkg
+] develop path/to/FLOWExaFMM
  • [Optional] Test FLOWExaFMM:
    ] test FLOWExaFMM
    If ExaFMM was correctly compiled, this will return a heart-warming "Hello world!"
  • Add FLOWVPM:
    ] add https://github.com/byuflowlab/FLOWVPM.jl
  • [Optional] Test FLOWVPM:
    ] test FLOWVPM

If you run into any issues, please try the following:

  • Test that you can correctly compile C++ code wrapped for Julia following these instructions: LINK
  • Mac users, take a look at this thread: LINK
  • Instructions for BYU Fulton supercomputer: LINK

If issues persist, please check the resolved issues in the FLOWExaFMM repo, the discussion forum in the FLOWUnsteady repo, and feel free to open a new issue or discussion for help.

Other Packages

Run the following commands in the Julia REPL to add some dependencies that are not in the official Julia registry:

import Pkg
 
 url = "https://github.com/byuflowlab/"
 
-packages = (("AirfoilPrep.jl", "v2.1.2"), ("FLOWVLM", "v2.1.2"),
-            ("BPM.jl", "v2.0.1"), ("FLOWNoise", "v2.3.2"), ("VSPGeom.jl", nothing))
+packages = [ ("AirfoilPrep.jl", "v2.1.2"), ("FLOWVLM", "v2.1.2"),
+             ("FLOWNoise", "v2.3.3"),      ("BPM.jl", "v2.0.1")  ]
 
 Pkg.add([ Pkg.PackageSpec(; url=url*name, rev=v) for (name, v) in packages ])
Troubleshooting

Some things you might need to look out for:

  • (MacOS users) Make sure your Homebrew (in Julia) is up to date. You may need to run the following in order to update your Homebrew: using Homebrew; Homebrew.brew(`update-reset`)
  • Make sure that things are in place in your Julia settings. Having things like Conda, HDF5, etc. on your machine doesn't necessarily mean that the Julia implementation has them as well.

Add FLOWUnsteady

You are now ready to install the FLOWUnsteady package. Type this in the Julia REPL:

] add https://github.com/byuflowlab/FLOWUnsteady

Test FLOWUnsteady

In order to test that FLOWUnsteady and all dependencies were successfully installed, try running some of the examples under FLOWUnsteady/examples/.

For instance, you can run the Simple Wing example as follows:

import FLOWUnsteady as uns
 
@@ -46,4 +46,4 @@
 
 
 



-



2D View

When opening a simulation with a flat surface (like wing.jl), ParaView automatically activates its 2D view mode. Disable the 2D view by clicking these two buttons: pic

CPU Parallelization

If any of the examples is taking longer than 10 to 20 minutes to run, it is possible that ExaFMM was compiled without OpenMP, thus running in only one core as opposed to parallelizing the computation across all your CPU cores.

To confirm that ExaFMM is successfully parallelized, pull up whatever CPU monitor is available in your operative system and confirm that Julia is using all the cores as the simulation is running. For instance, the Resources tab of the Task Manager in Windows should look like this: pic and htop in the terminal (Linux and MacOS) should look like this: pic

+



2D View

When opening a simulation with a flat surface (like wing.jl), ParaView automatically activates its 2D view mode. Disable the 2D view by clicking these two buttons: pic

CPU Parallelization

If any of the examples is taking longer than 10 to 20 minutes to run, it is possible that ExaFMM was compiled without OpenMP, thus running in only one core as opposed to parallelizing the computation across all your CPU cores.

To confirm that ExaFMM is successfully parallelized, pull up whatever CPU monitor is available in your operative system and confirm that Julia is using all the cores as the simulation is running. For instance, the Resources tab of the Task Manager in Windows should look like this: pic and htop in the terminal (Linux and MacOS) should look like this: pic

diff --git a/installation/windows/index.html b/installation/windows/index.html index 3d0f4b84..2608e8ea 100644 --- a/installation/windows/index.html +++ b/installation/windows/index.html @@ -3,7 +3,7 @@ function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-B7CBF7WC7L', {'page_path': location.pathname + location.search + location.hash}); -

Windows Instructions

(Tested on Windows 11)

Install Windows Subsystem for Linux (WSL)

  • Follow this guide to setup Ubuntu 22.04: LINK
  • If you run into issues, try the following:
    • Enable bash for Windows LINK
    • Enable virtualization LINK. For instance, here are instructions specific for a Dell Precision 7760: LINK1 LINK2 (make sure to check "Hyper-V")

To launch WSL, we recommend launching it from the Microsoft Store as opposed to the Programs Menu or the terminal, otherwise Windows' PATH will not be passed onto WSL.

Set up Environment

Once inside WSL, do the following

Install Julia

Still inside WSL,

  • Download Julia:
    wget -O julia.tar.gz "https://julialang-s3.julialang.org/bin/linux/x64/1.10/julia-1.10.2-linux-x86_64.tar.gz"
  • Decompress Julia:
    tar -xvf julia.tar.gz -C ~/Programs/
  • Add Julia to user-level path:
    sudo ln -s ~/Programs/julia-1.10.2/bin/julia /usr/local/bin/

Install ParaView

  • Donwload and install ParaView v5.9.1
  • Identify the location of paraview.exe (most likely, this is C:\Program Files\ParaView 5.9.1\bin\)
  • Add the path of ParaView (e.g., C:\Program Files\ParaView 5.9.1\bin\) to the system-level PATH: LINK
  • Create a paraview alias inside WSL typing this in the WSL terminal:
    which paraview.exe | xargs -I{} sudo ln -s {} /usr/local/bin/paraview
ParaView 5.10+ on Windows

ParaView versions 5.10 and newer on Windows cannot open XDMF files (like the particle field) from the WSL file system. Please copy them to a Windows file system or use Paraview 5.9.1.


Now you can proceed with the general instructions (you can skip the Julia and ParaView instructions since we already took care of that)

diff --git a/search/index.html b/search/index.html index b135332e..b7a75c7c 100644 --- a/search/index.html +++ b/search/index.html @@ -3,4 +3,4 @@ function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-B7CBF7WC7L', {'page_path': location.pathname + location.search + location.hash}); - + diff --git a/search_index.js b/search_index.js index 78cc5128..ed1430fc 100644 --- a/search_index.js +++ b/search_index.js @@ -1,3 +1,3 @@ var documenterSearchIndex = {"docs": -[{"location":"api/flowunsteady-vehicle-asm/#Actuator-surface-model","page":"Actuator surface model","title":"Actuator surface model","text":"","category":"section"},{"location":"api/flowunsteady-vehicle-asm/","page":"Actuator surface model","title":"Actuator surface model","text":"FLOWUnsteady.g_uniform\nFLOWUnsteady.g_linear\nFLOWUnsteady.g_piecewiselinear\nFLOWUnsteady.g_pressure","category":"page"},{"location":"api/flowunsteady-vehicle-asm/#FLOWUnsteady.g_uniform","page":"Actuator surface model","title":"FLOWUnsteady.g_uniform","text":"Uniform vortex-sheet distribution for actuator surface model. See Alvarez' dissertation, Sec. 6.3.2.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-vehicle-asm/#FLOWUnsteady.g_linear","page":"Actuator surface model","title":"FLOWUnsteady.g_linear","text":"Linear vortex-sheet distribution for actuator surface model. See Alvarez' dissertation, Sec. 6.3.2.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-vehicle-asm/#FLOWUnsteady.g_piecewiselinear","page":"Actuator surface model","title":"FLOWUnsteady.g_piecewiselinear","text":"Alias for FLOWUnsteady.g_linear.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-vehicle-asm/#FLOWUnsteady.g_pressure","page":"Actuator surface model","title":"FLOWUnsteady.g_pressure","text":"Pressure-like vortex-sheet distribution for actuator surface model. See Alvarez' dissertation, Sec. 6.3.2.\n\n\n\n\n\n","category":"function"},{"location":"api/flowvpm-utils/#Utilities","page":"Utilities","title":"Utilities","text":"","category":"section"},{"location":"api/flowvpm-utils/","page":"Utilities","title":"Utilities","text":"FLOWUnsteady.vpm.run_vpm!\nFLOWUnsteady.vpm.save\nFLOWUnsteady.vpm.read\nFLOWUnsteady.vpm.save_settings\nFLOWUnsteady.vpm.read_settings","category":"page"},{"location":"api/flowvpm-utils/#FLOWVPM.run_vpm!","page":"Utilities","title":"FLOWVPM.run_vpm!","text":"run_vpm!(pfield, dt, nsteps; runtime_function=nothing, save_path=nothing, run_name=\"pfield\", nsteps_save=1, verbose=true, prompt=true)\n\nSolves nsteps of the particle field with a time step of dt.\n\nOptional Arguments\n\nruntime_function::Function : Give it a function of the form myfun(pfield, t, dt). On each time step it will call this function. Use this for adding particles, deleting particles, etc.\nstatic_particles_function::Function : Give it a function of the form myfun(pfield, t, dt) to add static particles representing solid boundaries to the solver. This function is called at every time step right before solving the governing equations, and any new particles added by this function are immediately removed.\nsave_path::String : Give it a string for saving VTKs of the particle field. Creates the given path.\nrun_name::String : Name of output files.\nnsteps_save::Int64 : Saves vtks every this many time steps.\nprompt::Bool : If save_path already exist, it will prompt the user before overwritting the folder if true; it will directly overwrite it if false.\nverbose::Bool : Prints progress of the run to the terminal.\nverbose_nsteps::Bool: Number of time steps between verbose.\n\n\n\n\n\n","category":"function"},{"location":"api/flowvpm-utils/#FLOWVPM.save","page":"Utilities","title":"FLOWVPM.save","text":"save(pfield, file_name; path=\"\")\n\nSaves the particle field in HDF5 format and a XDMF file especifying its the attributes. This format can be opened in Paraview for post-processing and visualization.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-vehicle-types/#vehicle_types","page":"Vehicle types","title":"Vehicle types","text":"","category":"section"},{"location":"api/flowunsteady-vehicle-types/","page":"Vehicle types","title":"Vehicle types","text":"FLOWUnsteady.UVLMVehicle\nFLOWUnsteady.VLMVehicle\nFLOWUnsteady.QVLMVehicle","category":"page"},{"location":"api/flowunsteady-vehicle-types/#FLOWUnsteady.UVLMVehicle","page":"Vehicle types","title":"FLOWUnsteady.UVLMVehicle","text":"UVLMVehicle{N, M, R}(system; tilting_systems, rotors_systems,\n vlm_system, wake_system, grids)\n\nType handling all geometries and subsystems that define a vehicle made out of FLOWVLM components (Wing, WingSystem, Rotor).\n\nARGUMENTS\n\nsystem::FLOWVLM.WingSystem: System of all FLOWVLM objects. This system is considered as the entire vehicle. Not all components in this system will be solved, but they will all be rotated and translated according to the maneuver.\n\nOPTIONAL ARGUMENTS\n\ntilting_systems::NTuple{N, FLOWVLM.WingSystem}: Tuple of all FLOWVLM tilting objects, where tilting_systems[i] contains the i-th FLOWVLM system of lifting surfaces and rotors that tilt together.\nrotors_systems::NTuple{M, Array{vlm.Rotor}}: Tuple of groups of Rotors that share a common RPM.\nvlm_system::FLOWVLM.WingSystem: System of all FLOWVLM objects to be solved through the VLM solver.\nwake_system::FLOWVLM.WingSystem: System of all FLOWVLM objects that will shed a VPM wake.\ngrids::Array{gt.GridTypes}: Array of grids that will be translated and rotated along with system.\n\nState variables\n\nV::Vector : Current vehicle velocity\nW::Vector : Current vehicle angular velocity\nprev_data::Array{Any} : Information about previous step\ngrid_O::Vector{Vector} : Origin of every grid\n\n\n\n\n\n","category":"type"},{"location":"api/flowunsteady-vehicle-types/#FLOWUnsteady.VLMVehicle","page":"Vehicle types","title":"FLOWUnsteady.VLMVehicle","text":"Alias for FLOWUnsteady.UVLMVehicle\n\n\n\n\n\n","category":"type"},{"location":"api/flowunsteady-vehicle-types/#FLOWUnsteady.QVLMVehicle","page":"Vehicle types","title":"FLOWUnsteady.QVLMVehicle","text":"QVLMVehicle{N, M, R}(system; optargs...)\n\nSame than FLOWUnsteady.UVLMVehicle but replacing the VPM wake with a semi-infinite rigid VLM wake, making the simulation quasi-ssteady.\n\nNOTE: For the solver to work correctly, all components in wake_system (if any) need to be also components of vlm_system.\n\nNOTE 2: It is recommended that wake_system doesn't include any Rotor object. Otherwise, blades will generate a wake going straight out of every blade trailing edge pointing oposite to the direction of rotation instead of generating a streamtube.\n\n\n\n\n\n","category":"type"},{"location":"api/flowunsteady-postprocessing-noise/#Aeroacoustic-Noise","page":"Aeroacoustic Noise","title":"Aeroacoustic Noise","text":"","category":"section"},{"location":"api/flowunsteady-postprocessing-noise/","page":"Aeroacoustic Noise","title":"Aeroacoustic Noise","text":"FLOWUnsteady.run_noise_wopwop\nFLOWUnsteady.run_noise_bpm","category":"page"},{"location":"api/flowunsteady-postprocessing-noise/#FLOWUnsteady.run_noise_wopwop","page":"Aeroacoustic Noise","title":"FLOWUnsteady.run_noise_wopwop","text":"Given the path of a FLOWUnsteady simulation read_path, it runs the noise analysis on the rotors of the simulation. It uses PSU-WOPWOP to calculate the tonal noise from thickness and loading sources on the geometry and aerodynamic loading.\n\nrun_noise_wopwop(\n read_path::String, # Path from where to read aerodynamic solution (FLOWUnsteady simulation)\n run_name, # Run name (prefix of rotor files to read)\n RPM::Real, # Reference RPM to convert `nrevs` to simulation time\n rho::Real, speedofsound::Real, # Air density and speed of sound\n rotorsystems, # `rotorsystems[i][j]` is the number of blades of the j-th rotor in the i-th system\n ww_nrevs, # Run PSU-WOPWOP for this many revolutions\n ww_nsteps_per_rev, # Number of steps per revolution to use in WW\n save_path::String, # Where to save PSU-WOPWOP results\n wopwopbin; # Path to PSU-WOPWOP binary\n nrevs = nothing, # Number of revolutions to read (defaults to `ww_nrevs`)\n nsteps_per_rev = nothing, # Number of steps per revolution to read (default to `ww_nsteps_per_rev`)\n\n # ---------- OBSERVERS ---------------------------------------\n Vobserver = nothing, # (m/s) velocity of observer (vector)\n sph_R = 1.5*6.5, # (m) sphere radius\n sph_nR = 0, # Number of cells in radial direction\n sph_ntht = 24, sph_nphi = 24, # Number of cells in polar and azimuthal directions\n sph_thtmin = 5, sph_thtmax = 175, # (deg) Bounds of polar direction\n sph_phimax = 180, # (deg) maximum azimuthal angle (use 180 to make a hemisphere)\n sph_rotation= [0, 90, 0], # (degs) rotate the sphere by these angles\n sph_C = zeros(3), # (m) center of sphere\n microphoneX = nothing, # If given, replaces sphere with one observer at this position\n highpass = nothing, lowpass = nothing, # Low and high pass filters\n windowing = nothing, # Windowing method\n output_octaves = true, # Whether to output octave bands\n Noctave = 3, # Number of octave bands\n\n # ---------- SIMULATION OPTIONS -----------------------------\n periodic = true, # Whether rotor loading and translation in aerodynamic solution is periodic\n\n # ---------- INPUT OPTIONS ----------------------------------\n num_min = 0, # Start reading loading files from this number\n const_geometry = false, # Whether to run PSW on a constant geometry, obtained from num_min\n axisrot = \"automatic\", # Axis of rotation to use for constant geometry (defaults to [1,0,0])\n CW = true, # Clockwise or counter-clockwise rotation of constant geometry\n\n # ---------- OUTPUT OPTIONS ---------------------------------\n prompt = true, # Whether to prompt the user\n verbose = true, # Whether to verbose\n v_lvl = 0, # Indentation level when printing verbose\n debug_paraview = false, # Whether to visualize the grid of observers in Paraview before running\n debuglvl = 1, # PSU-WOPWOP debug level\n observerf_name = \"observergrid\",# .xyz file with observer grid\n case_name = \"runcase\", # Name of case to create and run\n)\n\nNOTE: This function will call the PSU-WOPWOP binary indicated through wopwopbin. This binary is not included with FLOWUnsteady and must be provided by the user. This method has been tested on PSU-WOPWOP v3.4.2.\n\nNOTE 2: Make sure that the simulation was run with nsteps_save=1, otherwise the time in PSU-WOPWOP will get messed up.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-postprocessing-noise/#FLOWUnsteady.run_noise_bpm","page":"Aeroacoustic Noise","title":"FLOWUnsteady.run_noise_bpm","text":"Calculates broadband rotor noise through the Brooks, Pope, and Marcolini method using the BPM.jl package.\n\nThis writes the results to a file in the same format than PSU-WOPWOP, which can be read afterwards with FLOWNoise.readwopwopoutput(). It writes three files: SPL (non-weighted), A-weighted SPL, and OASPL.\n\nThis method assumes steady conditions and that all rotors have the same RPM.\n\nfunction run_noise_bpm(\n rotors::Array{vlm.Rotor, 1}, # Rotors\n RPM::Real, # RPM of rotors\n Vinf::Function, # Freestream\n rho::Real, mu::Real, speedofsound::Real, # Air density, dynamic viscosity, and speed of sound\n save_path::String; # Where to save results\n\n # ---------- OBSERVERS --------------------------------------\n sph_R = 1.5*6.5, # (m) sphere radius\n sph_nR = 0, # Number of cells in radial direction\n sph_ntht = 24, sph_nphi = 24, # Number of cells in polar and azimuthal directions\n sph_thtmin = 5, sph_thtmax = 175, # (deg) Bounds of polar direction\n sph_phimax = 180, # (deg) maximum azimuthal angle (use 180 to make a hemisphere)\n sph_rotation= [0, 90, 0], # (degs) rotate the sphere by these angles\n sph_C = zeros(3), # (m) center of sphere\n microphoneX = nothing, # If given, replaces sphere with one observer at this position\n\n # ---------- BPM OPTIONS ------------------------------------\n noise_correction = 0.5, # Broadband calibration correction\n TE_thickness::Union{Float64, Array{Float64, 1}}=16.15, # Trailing edge thickness (in degrees)\n freq_bins = BPM.default_f, # Frequency bins\n db_offset = BPM.default_AdB, # dB offset of every frequency for A-weighting\n\n # ---------- OUTPUT OPTIONS ---------------------------------\n prompt = true, # Whether to prompt the user\n verbose = true, # Whether to verbose\n v_lvl = 0, # Indentation level when printing verbose\n)\n\n\n\n\n\n","category":"function"},{"location":"api/flowvpm-particle/#Particle-Field","page":"Particle Field","title":"Particle Field","text":"","category":"section"},{"location":"api/flowvpm-particle/","page":"Particle Field","title":"Particle Field","text":"FLOWUnsteady.vpm.Particle\nFLOWUnsteady.vpm.ParticleField\nFLOWUnsteady.vpm.ClassicVPM\nFLOWUnsteady.vpm.ReformulatedVPM\nFLOWUnsteady.vpm.add_particle\nFLOWUnsteady.vpm.get_particle\nFLOWUnsteady.vpm.remove_particle\nFLOWUnsteady.vpm.get_np\nFLOWUnsteady.vpm.iterate\nFLOWUnsteady.vpm.get_particleiterator","category":"page"},{"location":"api/flowvpm-particle/#FLOWVPM.Particle","page":"Particle Field","title":"FLOWVPM.Particle","text":"`Particle{T}`\n\nVortex particle data structure\n\nState variables\n\nX::Array{T, 1} : Position (3-elem array)\nGamma::Array{T, 1} : Vectorial circulation (3-elem array)\nsigma::Array{T, 1} : Smoothing radius (1-elem array)\nvol::Array{T, 1} : Volume (1-elem array)\ncirculation::Array{T, 1} : Scalar circulation (1-elem array)\n\nPublic calculations\n\nU::Array{T, 1} : Velocity at particle (3-elem array)\nJ::Array{T, 2} : Jacobian at particle J[i,j]=dUi/dxj (9-elem array)\n\n\n\n\n\n","category":"type"},{"location":"api/flowvpm-particle/#FLOWVPM.add_particle","page":"Particle Field","title":"FLOWVPM.add_particle","text":"add_particle(self::ParticleField, X, Gamma, sigma; vol=0, index=np)\n\nAdd a particle to the field.\n\n\n\n\n\nadd_particle(self::ParticleField, P::Particle)\n\nAdd a copy of Particle P to the field.\n\n\n\n\n\n","category":"function"},{"location":"api/flowvpm-particle/#FLOWVPM.get_particle","page":"Particle Field","title":"FLOWVPM.get_particle","text":"`get_particle(pfield::ParticleField, i)`\n\nReturns the i-th particle in the field.\n\n\n\n\n\n","category":"function"},{"location":"api/flowvpm-particle/#FLOWVPM.remove_particle","page":"Particle Field","title":"FLOWVPM.remove_particle","text":"remove_particle(pfield::ParticleField, i)\n\nRemove the i-th particle in the field. This is done by moving the last particle that entered the field into the memory slot of the target particle. To remove particles sequentally, you will need to go from the last particle back to the first one (see documentation of get_particleiterator for an example).\n\n\n\n\n\n","category":"function"},{"location":"api/flowvpm-particle/#FLOWVPM.get_np","page":"Particle Field","title":"FLOWVPM.get_np","text":"`get_np(pfield::ParticleField)`\n\nReturns current number of particles in the field.\n\n\n\n\n\n","category":"function"},{"location":"api/flowvpm-particle/#FLOWVPM.iterate","page":"Particle Field","title":"FLOWVPM.iterate","text":"Alias for get_particleiterator\n\n\n\n\n\n","category":"function"},{"location":"api/flowvpm-particle/#FLOWVPM.get_particleiterator","page":"Particle Field","title":"FLOWVPM.get_particleiterator","text":"`get_particleiterator(pfield::ParticleField; start_i=1, end_i=np)`\n\nReturn an iterator over particles that can be used as follows\n\njulia> # Initiate particle field\n pfield = FLOWVPM.ParticleField(10);\n\njulia> # Add particles\n for i in 1:4\n FLOWVPM.add_particle(pfield, (i*10^0, i*10^1, i*10^2), zeros(3), 1.0)\n end\n\njulia> # Iterate over particles\n for P in FLOWVPM.get_particleiterator(pfield)\n println(P.X)\n end\n[1.0, 10.0, 100.0]\n[2.0, 20.0, 200.0]\n[3.0, 30.0, 300.0]\n[4.0, 40.0, 400.0]\n\n\n\n\n\n","category":"function"},{"location":"theory/publications/#Publications","page":"Publications","title":"Publications","text":"","category":"section"},{"location":"theory/publications/","page":"Publications","title":"Publications","text":"The following is a compilation of studies that have used FLOWUnsteady","category":"page"},{"location":"theory/publications/","page":"Publications","title":"Publications","text":"Sarojini D., et al, (2024) “Review of Computational Models for Large-Scale MDAO of Urban Air Mobility Concepts,” AIAA SCITECH Forum. [DOI]\nS. Shahjahan, A. Gong, A. Moore, D. Verstraete, (2024) “Optimisation of proprotors for tilt-wing eVTOL aircraft,” Aerospace Science and Technology. [PDF]\nE. J. Alvarez, C. Joseph, & A. Ning (2023), \"Vortex Particle Method for Electric Ducted Fan in Non-Axisymmetric Flow,\" AIAA AVIATION Forum. [PDF]\nAnderson, R., Ning, A., Xiang, R., Schie, S. P. C. van, Sperry, M., Sarojini, D., Kamensky, D., & Hwang, J. T., (2023) “Aerostructural Predictions Combining FEniCS and a Viscous Vortex Particle Method,” AIAA SCITECH Forum. [PDF]\nE. J. Alvarez & A. Ning (2023), \"Meshless Large Eddy Simulation of Propeller-Wing Interactions Through the Reformulated Vortex Particle Method,\" Journal of Aircraft. [PDF]\nE. J. Alvarez & A. Ning (2023), \"Stable Vortex Particle Method Formulation for Meshless Large-Eddy Simulation,\" AIAA Journal. [PDF]\nE. J. Alvarez (2022), \"Reformulated Vortex Particle Method and Meshless Large Eddy Simulation of Multirotor Aircraft,\" Doctoral Dissertation, Brigham Young University. [PDF]\nJ. Mehr, E. J. Alvarez, & A. Ning (2022), \"Interactional Aerodynamics Analysis of a Multi-Rotor Energy Kite,\" (in review).\nE. J. Alvarez, J. Mehr, & A. Ning (2022), \"FLOWUnsteady: An Interactional Aerodynamics Solver for Multirotor Aircraft and Wind Energy,\" AIAA AVIATION Forum. [VIDEO] [PDF]\nR. M. Erhard & J. J. Alonso (2022), \"Comparison of Propeller Wake Models for Distributed Electric Propulsion and eVTOL Aircraft in Complex Flow Conditions,\" AIAA SciTech Forum. [PDF]\nE. J. Alvarez & A. Ning (2020), \"High-Fidelity Modeling of Multirotor Aerodynamic Interactions for Aircraft Design,\" AIAA Journal. [DOI] [PDF]\nJ. Mehr, E. J. Alvarez, & A. Ning (2020), \"Unsteady Aerodynamic Analysis of Wind Harvesting Aircraft,\" AIAA AVIATION Forum. [VIDEO] [PDF]\nE. J. Alvarez, A. Schenk, T. Critchfield, & A. Ning (2020), “Rotor-on-Rotor Aeroacoustic Interactions of Multirotor in Hover,” VFS 76th Forum. [PDF]\nE. J. Alvarez & A. Ning (2019), \"Modeling Multirotor Aerodynamic Interactions Through the Vortex Particle Method,\" AIAA AVIATION Forum. [PDF]\nE. J. Alvarez & A. Ning (2018). \"Development of a Vortex Particle Code for the Modeling of Wake Interaction in Distributed Propulsion,\" AIAA AVIATION Forum. [PDF]","category":"page"},{"location":"theory/publications/","page":"Publications","title":"Publications","text":"\"Vid","category":"page"},{"location":"installation/general/#installation","page":"Installation","title":"Installation Instructions","text":"","category":"section"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"FLOWUnsteady is developed in the Julia programming language, which is a modern, high-level, dynamic programming language for high-performance computing. For visualization and postprocessing, FLOWUnsteady uses ParaView, which is an open-source software for scientific and HPC visualization.","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"The following instructions walk you through how to install Julia, ParaView, and FLOWUnsteady.","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"info: Windows Users\nOn Windows please follow these instructions first to set up Windows Subsystem for Linux.","category":"page"},{"location":"installation/general/#Julia","page":"Installation","title":"Julia","text":"","category":"section"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"Download and install Julia: julialang.org (currently we are only supporting up to Julia v1.8.5, so we recommend using v1.8.5 or v1.6.7 LTS )\nAdd Julia to user-level bin folder\nsudo ln -s /[user-specific-path/Julia-1.x.x]/bin/julia /usr/local/bin/julia\nReplace /[user-specific-path/Julia-1.x.x]/ with the path where Julia got installed. For instance, in MacOS the full path looks like this: /Applications/Julia-1.8.app/Contents/Resources/julia/bin/julia","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"If you were successfull, typing the following in the terminal will launch the Julia REPL:","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"julia","category":"page"},{"location":"installation/general/#paraview","page":"Installation","title":"ParaView","text":"","category":"section"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"Download and install ParaView: paraview.org\nAdd ParaView to user-level bin folder\nsudo ln -s /[user-specific-path/ParaView-5.x.x]/paraview /usr/local/bin/paraview\nReplace /[user-specific-path/ParaView-5.x.x]/ with the path where ParaView got installed. For instance, in MacOS the full path looks like this: /Applications/ParaView-5.11.0.app/Contents/MacOS/paraview","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"If you were successfull, typing the following in the terminal will launch the ParaView:","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"paraview","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"To test that ParaView is correctly installed, run one of the examples of the GeometricTools package as follows (copy/paste this in the Julia REPL):","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"# Install GeometricTools\nimport Pkg; Pkg.add(\"GeometricTools\")\n\nimport GeometricTools as gt\n\n# Load example\nexamplepath = joinpath(dirname(pathof(gt)), \"..\", \"examples\", \"example_simple.jl\")\ninclude(examplepath)\n\n# Run example: it will pull up paraview with a good-looking cube\nsimple_box2()","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"ParaView will then pull up with a rendering of a cube (click the Apply button under Properties to make it visible).","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"

\n \"Pic\n

","category":"page"},{"location":"installation/general/#pycall","page":"Installation","title":"PyCall","text":"","category":"section"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"One of the dependencies (AirfoilPrep.jl) is a wrapper of Python code that is written in Python v3.8+. For this reason, make sure that your Python version linked to PyCall is 3.8 or higher. You can do that as follows:","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"# Install PyCall\nimport Pkg; Pkg.add(\"PyCall\")\n\n# Point environment to your Python 3.8 (or higher)\nENV[\"PYTHON\"] = \"path/to/your/python3\"\n\n# Rebuild PyCall\nPkg.build(\"PyCall\")","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"Then close and reopen the Julia REPL, and run:","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"import PyCall\nPyCall.pyversion","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"which should reveal your Python version:","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"v\"3.8\"","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"Since PyCall now relies on a custom install of Python3, make sure that:","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"matplotlib, mpmath, and scipy are installed in that Python,\npip3 install matplotlib mpmath scipy --user\nFor optimal experience, verify that matplotlib uses the Qt5Agg backend. Useful instructions can be found here and here.","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"If you run into errors with PyPlot while running FLOWUnsteady, they are likely related to one of those two items.","category":"page"},{"location":"installation/general/#FLOWVPM","page":"Installation","title":"FLOWVPM","text":"","category":"section"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"FLOWVPM uses a fast multipole code called ExaFMM that accelerates the computation of particle interactions. ExaFMM is written in C++ and we have developed a Julia wrapper for it: FLOWExaFMM.","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"Before installing FLOWVPM, first you will have to install FLOWExaFMM and compile ExaFMM, as follows.","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"Make sure you have CMake, GCC, and OpenMP. On Linux, type to following to install them\nsudo apt-get update\nsudo apt-get install cmake g++ mpich\n[Julia REPL] Install CxxWrap:\nimport Pkg\nPkg.add(name=\"CxxWrap\", version=\"0.11.2\")\n[Terminal] Clone FLOWExaFMM:\ngit clone https://github.com/byuflowlab/FLOWExaFMM path/to/FLOWExaFMM\n(replace path/to/FLOWExaFMM with your preferred path in your local)","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"Compile ExaFMM running the script build.sh:\ncd path/to/FLOWExaFMM\nsh build.sh\nor in MacOS:\ncd path/to/FLOWExaFMM\nsh build_macos.sh\nThis should have generated the file fmm.so (or fmm.dylib in MacOS) under src/, which is a binary library containing ExaFMM.","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"Now that ExaFMM is compiled, you can add FLOWExaFMM to your Julia environment as a development package pointing directly to where you compiled the package and add FLOWVPM:","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"Add FLOWExaFMM:\n# In the Julia REPL\n] develop path/to/FLOWExaFMM","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"[Optional] Test FLOWExaFMM:\n] test FLOWExaFMM\nThis will return a heart-warming \"Hello world!\" if ExaFMM was correctly compiled.","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"Add FLOWVPM:\n] add https://github.com/byuflowlab/FLOWVPM.jl","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"[Optional] Test FLOWVPM:\n] test FLOWVPM","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"If you run into any issues, please try the following:","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"Test that you can correctly compile C++ code wrapped for Julia following these instructions: LINK\nMac users, take a look at this thread: LINK\nInstructions for BYU Fulton supercomputer: LINK","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"If issues persist, please check the resolved issues in the FLOWExaFMM repo, the discussion forum in the FLOWUnsteady repo, and feel free to open a new issue or discussion for help.","category":"page"},{"location":"installation/general/#Other-Packages","page":"Installation","title":"Other Packages","text":"","category":"section"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"Run the following commands in the Julia REPL to add some dependencies that are not in the official Julia registry:","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"import Pkg\n\nurl = \"https://github.com/byuflowlab/\"\n\npackages = ((\"AirfoilPrep.jl\", \"v2.1.2\"), (\"FLOWVLM\", \"v2.1.2\"),\n (\"BPM.jl\", \"v2.0.1\"), (\"FLOWNoise\", \"v2.3.2\"), (\"VSPGeom.jl\", nothing))\n\nPkg.add([ Pkg.PackageSpec(; url=url*name, rev=v) for (name, v) in packages ])","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"info: Troubleshooting\nSome things you might need to look out for:(MacOS users) Make sure your Homebrew (in Julia) is up to date. You may need to run the following in order to update your Homebrew: using Homebrew; Homebrew.brew(`update-reset`)\nMake sure that things are in place in your Julia settings. Having things like Conda, HDF5, etc. on your machine doesn't necessarily mean that the Julia implementation has them as well.","category":"page"},{"location":"installation/general/#Add-FLOWUnsteady","page":"Installation","title":"Add FLOWUnsteady","text":"","category":"section"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"You are now ready to install the FLOWUnsteady package. Type this in the Julia REPL:","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"] add https://github.com/byuflowlab/FLOWUnsteady","category":"page"},{"location":"installation/general/#Test-FLOWUnsteady","page":"Installation","title":"Test FLOWUnsteady","text":"","category":"section"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"In order to test that FLOWUnsteady and all dependencies were successfully installed, try running some of the examples under FLOWUnsteady/examples/.","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"For instance, you can run the Simple Wing example as follows:","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"import FLOWUnsteady as uns\n\ninclude(joinpath(uns.examples_path, \"wing\", \"wing.jl\"))","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"or you can run the Tethered Wing example:","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"import FLOWUnsteady as uns\n\ninclude(joinpath(uns.examples_path, \"tetheredwing.jl\"))","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"This will pull up Paraview visualizing the simulation. Kick off your shoes, sit back, and enjoy the simulation that you have just run.","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"

\n\n
\n \"Vid\n
\n\n



\n



","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"info: 2D View\nWhen opening a simulation with a flat surface (like wing.jl), ParaView automatically activates its 2D view mode. Disable the 2D view by clicking these two buttons: (Image: pic)","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"info: CPU Parallelization\nIf any of the examples is taking longer than 10 to 20 minutes to run, it is possible that ExaFMM was compiled without OpenMP, thus running in only one core as opposed to parallelizing the computation across all your CPU cores.To confirm that ExaFMM is successfully parallelized, pull up whatever CPU monitor is available in your operative system and confirm that Julia is using all the cores as the simulation is running. For instance, the Resources tab of the Task Manager in Windows should look like this: (Image: pic) and htop in the terminal (Linux and MacOS) should look like this: (Image: pic)","category":"page"},{"location":"api/flowvpm-time/#Time-Integration","page":"Time Integration","title":"Time Integration","text":"","category":"section"},{"location":"api/flowvpm-time/","page":"Time Integration","title":"Time Integration","text":"FLOWUnsteady.vpm.euler\nFLOWUnsteady.vpm.rungekutta3\nFLOWUnsteady.vpm.euler\nFLOWUnsteady.vpm.euler\nFLOWUnsteady.vpm.euler\nFLOWUnsteady.vpm.euler","category":"page"},{"location":"api/flowvpm-time/#FLOWVPM.euler","page":"Time Integration","title":"FLOWVPM.euler","text":"Steps the field forward in time by dt in a first-order Euler integration scheme.\n\n\n\n\n\nSteps the field forward in time by dt in a first-order Euler integration scheme using the VPM reformulation. See notebook 20210104.\n\n\n\n\n\n","category":"function"},{"location":"api/flowvpm-time/#FLOWVPM.rungekutta3","page":"Time Integration","title":"FLOWVPM.rungekutta3","text":"Steps the field forward in time by dt in a third-order low-storage Runge-Kutta integration scheme. See Notebook entry 20180105.\n\n\n\n\n\nSteps the field forward in time by dt in a third-order low-storage Runge-Kutta integration scheme using the VPM reformulation. See Notebook entry 20180105 (RK integration) and notebook 20210104 (reformulation).\n\n\n\n\n\n","category":"function"},{"location":"examples/propeller-jsweep/#J-Sweep","page":"J Sweep","title":"J Sweep","text":"","category":"section"},{"location":"examples/propeller-jsweep/","page":"J Sweep","title":"J Sweep","text":"Using the same rotor from the previous section, we now run a sweep of the advance ratio J = fracu_inftyn d to characterize the performance of the propeller.","category":"page"},{"location":"examples/propeller-jsweep/","page":"J Sweep","title":"J Sweep","text":"#=##############################################################################\n# DESCRIPTION\n Advance ratio sweep on APC 10 x7 propeller\n=###############################################################################\n\ncase_name = \"propeller-Jsweep-example\"# Name of this sweep case\nsave_path = case_name # Where to save this sweep\n\nJs = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.775] # Advance ratios Vinf/(nD)\n\n# Create path where to save sweep\nuns.gt.create_path(save_path, true)\n\n# ----------------- J SWEEP ----------------------------------------------------\nfor J in Js\n\n println(\"\\n\\n Running J = $(J)\")\n\n magVinf = J*RPM/60*(2*R)\n Vinf(X, t) = magVinf*[cosd(AOA), sind(AOA), 0] # (m/s) freestream velocity vector\n\n # ------------- 1) VEHICLE DEFINITION ---------\n println(\"\\tGenerating geometry...\")\n\n # Generate rotor\n rotor = uns.generate_rotor(rotor_file; pitch=pitch,\n n=n, CW=CW, blade_r=r,\n altReD=[RPM, J, mu/rho],\n xfoil=xfoil,\n ncrit=ncrit,\n data_path=data_path,\n verbose=false,\n verbose_xfoil=false,\n plot_disc=false\n );\n\n\n # Generate vehicle\n system = vlm.WingSystem() # System of all FLOWVLM objects\n vlm.addwing(system, \"Rotor\", rotor)\n\n rotors = [rotor]; # Defining this rotor as its own system\n rotor_systems = (rotors, ); # All systems of rotors\n\n wake_system = vlm.WingSystem() # System that will shed a VPM wake\n # NOTE: Do NOT include rotor when using the quasi-steady solver\n if VehicleType != uns.QVLMVehicle\n vlm.addwing(wake_system, \"Rotor\", rotor)\n end\n\n vehicle = VehicleType( system;\n rotor_systems=rotor_systems,\n wake_system=wake_system\n );\n\n # ------------- 2) MANEUVER DEFINITION --------\n # No changes\n\n # ------------- 3) SIMULATION DEFINITION ------\n simulation = uns.Simulation(vehicle, maneuver, Vref, RPMref, ttot;\n Vinit=Vinit, Winit=Winit);\n\n # ------------- 4) MONITOR DEFINITION ---------\n monitor_rotor = uns.generate_monitor_rotors(rotors, J, rho, RPM, nsteps;\n t_scale=RPM/60,\n t_lbl=\"Revolutions\",\n save_path=save_path,\n run_name=\"J$(ceil(Int, J*100))\",\n disp_conv=false,\n figname=\"rotor monitor J=$(J)\",\n )\n\n # ------------- 5) RUN SIMULATION -------------\n println(\"\\tRunning simulation...\")\n\n uns.run_simulation(simulation, nsteps;\n # ----- SIMULATION OPTIONS -------------\n Vinf=Vinf,\n rho=rho, mu=mu, sound_spd=speedofsound,\n # ----- SOLVERS OPTIONS ----------------\n p_per_step=p_per_step,\n max_particles=max_particles,\n vpm_viscous=vpm_viscous,\n sigma_vlm_surf=sigma_rotor_surf,\n sigma_rotor_surf=sigma_rotor_surf,\n sigma_vpm_overwrite=sigma_vpm_overwrite,\n vlm_rlx=vlm_rlx,\n shed_unsteady=shed_unsteady,\n shed_starting=shed_starting,\n extra_runtime_function=monitor_rotor,\n # ----- OUTPUT OPTIONS ------------------\n save_path=nothing,\n v_lvl=1, verbose_nsteps=24\n );\nend\n","category":"page"},{"location":"examples/propeller-jsweep/","page":"J Sweep","title":"J Sweep","text":"\n Run time: ~12 minutes on a Dell Precision 7760 laptop.\n\n

","category":"page"},{"location":"examples/propeller-jsweep/","page":"J Sweep","title":"J Sweep","text":"Check examples/propeller/propeller_jsweep.jl to postprocess and plot the results as shown below.","category":"page"},{"location":"examples/propeller-jsweep/","page":"J Sweep","title":"J Sweep","text":"
\n
\n \"Pic\n
","category":"page"},{"location":"examples/wing-4p2aoa/#simple_wing","page":"Basics","title":"Simple Wing","text":"","category":"section"},{"location":"examples/wing-4p2aoa/","page":"Basics","title":"Basics","text":"
\n \"Pic\n \"Pic\n
","category":"page"},{"location":"examples/wing-4p2aoa/","page":"Basics","title":"Basics","text":"
","category":"page"},{"location":"examples/wing-4p2aoa/","page":"Basics","title":"Basics","text":"In this example we simulate a 45^circ swept-back wing at an angle of attack of 42^circ. In the process we exemplify the basic structure of simulations, which is always the same, no matter how complex the simulation might be. The structure consists of six steps:","category":"page"},{"location":"examples/wing-4p2aoa/","page":"Basics","title":"Basics","text":"(1) Vehicle Definition: Generate the geometry of the vehicle and declare each vehicle subsystem in a FLOWUnsteady.VLMVehicle object","category":"page"},{"location":"examples/wing-4p2aoa/","page":"Basics","title":"Basics","text":"(2) Maneuver Definition: Generate functions that prescribe the kinematics of the vehicle and specify the control inputs for tilting and rotor subsystems in a FLOWUnsteady.KinematicManeuver object","category":"page"},{"location":"examples/wing-4p2aoa/","page":"Basics","title":"Basics","text":"(3) Simulation Definition: A FLOWUnsteady.Simulation object is generated stating the vehicle, maneuver, and total time and speed at which to perform the maneuver","category":"page"},{"location":"examples/wing-4p2aoa/","page":"Basics","title":"Basics","text":"(4) Monitors Definitions: Functions are generated for calculating, monitoring, and outputting different metrics throughout the simulation","category":"page"},{"location":"examples/wing-4p2aoa/","page":"Basics","title":"Basics","text":"(5) Run Simulation: Call to FLOWUnsteady.run_simulation","category":"page"},{"location":"examples/wing-4p2aoa/","page":"Basics","title":"Basics","text":"(6) Viz and Postprocessing: The simulation is visualized in Paraview and results are postprocessed","category":"page"},{"location":"examples/wing-4p2aoa/","page":"Basics","title":"Basics","text":"
","category":"page"},{"location":"examples/wing-4p2aoa/","page":"Basics","title":"Basics","text":"While in this example we show the basic structure without much explanation, in subsequent examples we will dive into the details and options of each step (which are also listed in the API Guide).","category":"page"},{"location":"examples/wing-4p2aoa/","page":"Basics","title":"Basics","text":"
","category":"page"},{"location":"examples/wing-4p2aoa/","page":"Basics","title":"Basics","text":"#=##############################################################################\n# DESCRIPTION\n 45° swept-back wing at an angle of attack of 4.2°. This wing has an aspect\n ratio of 5.0, a RAE 101 airfoil section with 12% thickness, and no dihedral,\n twist, nor taper. This test case matches the experimental setup of Weber,\n J., and Brebner, G., “Low-Speed Tests on 45-deg Swept-Back Wings, Part I,”\n Tech. rep., 1951. The same case is used in a VLM calculation in Bertin's\n Aerodynamics for Engineers, Example 7.2, pp. 343.\n\n# AUTHORSHIP\n * Author : Eduardo J. Alvarez (edoalvarez.com)\n * Email : Edo.AlvarezR@gmail.com\n * Created : Feb 2023\n * Last updated : Feb 2023\n * License : MIT\n=###############################################################################\n\nimport FLOWUnsteady as uns\nimport FLOWVLM as vlm\n\nrun_name = \"wing-example\" # Name of this simulation\n\nsave_path = run_name # Where to save this simulation\nparaview = true # Whether to visualize with Paraview\n\n\n# ----------------- SIMULATION PARAMETERS --------------------------------------\nAOA = 4.2 # (deg) angle of attack\nmagVinf = 49.7 # (m/s) freestream velocity\nrho = 0.93 # (kg/m^3) air density\nqinf = 0.5*rho*magVinf^2 # (Pa) static pressure\n\nVinf(X, t) = magVinf*[cosd(AOA), 0.0, sind(AOA)] # Freestream function\n\n\n# ----------------- GEOMETRY PARAMETERS ----------------------------------------\nb = 2.489 # (m) span length\nar = 5.0 # Aspect ratio b/c_tip\ntr = 1.0 # Taper ratio c_tip/c_root\ntwist_root = 0.0 # (deg) twist at root\ntwist_tip = 0.0 # (deg) twist at tip\nlambda = 45.0 # (deg) sweep\ngamma = 0.0 # (deg) dihedral\n\n# Discretization\nn = 50 # Number of spanwise elements per side\nr = 10.0 # Geometric expansion of elements\ncentral = false # Whether expansion is central\n\n# NOTE: A geometric expansion of 10 that is not central means that the last\n# element is 10 times wider than the first element. If central, the\n# middle element is 10 times wider than the peripheral elements.\n\n# ----------------- SOLVER PARAMETERS ------------------------------------------\n# Time parameters\nwakelength = 2.75*b # (m) length of wake to be resolved\nttot = wakelength/magVinf # (s) total simulation time\nnsteps = 200 # Number of time steps\n\n# VLM and VPM parameters\np_per_step = 1 # Number of particle sheds per time step\n\nlambda_vpm = 2.0 # VPM core overlap\nsigma_vpm_overwrite = lambda_vpm * magVinf * (ttot/nsteps)/p_per_step # Smoothing core size\nsigma_vlm_solver= -1 # VLM-on-VLM smoothing radius (deactivated with <0)\nsigma_vlm_surf = 0.05*b # VLM-on-VPM smoothing radius\n\nshed_starting = true # Whether to shed starting vortex\nvlm_rlx = 0.7 # VLM relaxation\n\n\n\n\n# ----------------- 1) VEHICLE DEFINITION --------------------------------------\nprintln(\"Generating geometry...\")\n\n# Generate wing\nwing = vlm.simpleWing(b, ar, tr, twist_root, lambda, gamma;\n twist_tip=twist_tip, n=n, r=r, central=central);\n\n# NOTE: `FLOWVLM.simpleWing` is an auxiliary function in FLOWVLM for creating a\n# VLM wing with constant sweep, dihedral, and taper ratio, and a linear\n# twist between the root and the wing tips\n\nprintln(\"Generating vehicle...\")\n\n# Generate vehicle\nsystem = vlm.WingSystem() # System of all FLOWVLM objects\nvlm.addwing(system, \"Wing\", wing)\n\nvlm_system = system; # System solved through VLM solver\nwake_system = system; # System that will shed a VPM wake\n\nvehicle = uns.VLMVehicle( system;\n vlm_system=vlm_system,\n wake_system=wake_system\n );\n\n# NOTE: `FLOWUnsteady.VLMVehicle` creates a vehicle made out of multiple VLM and\n# rotor subsystems. The argument `system` represents the vehicle as a\n# whole which will be translated and rotated with the kinematics\n# prescribed by the maneuver. The subsystem `vlm_system` will be solved\n# with the VLM solver. The subsystems `rotor_systems` are solved with\n# blade elements (none in this case). The subsystem `wake_system` will\n# shed the VPM wake.\n\n\n\n\n# ------------- 2) MANEUVER DEFINITION -----------------------------------------\n\nVvehicle(t) = zeros(3) # Translational velocity of vehicle over time\nanglevehicle(t) = zeros(3) # Angle of the vehicle over time\n\nangle = () # Angle of each tilting system (none)\nRPM = () # RPM of each rotor system (none)\n\nmaneuver = uns.KinematicManeuver(angle, RPM, Vvehicle, anglevehicle)\n\n# NOTE: `FLOWUnsteady.KinematicManeuver` defines a maneuver with prescribed\n# kinematics. `Vvehicle` defines the velocity of the vehicle (a vector)\n# over time. `anglevehicle` defines the attitude of the vehicle over time\n# (a vector with inclination angles with respect to each axis of the\n# global coordinate system). `angle` defines the tilting angle of each\n# tilting system over time (none in this case). `RPM` defines the RPM of\n# each rotor system over time (none in this case).\n# Each of these functions receives a nondimensional time `t`, which is the\n# simulation time normalized by the total time `ttot`, from 0 to\n# 1, beginning to end of simulation. They all return a nondimensional\n# output that is then scaled up by either a reference velocity (`Vref`) or\n# a reference RPM (`RPMref`). Defining the kinematics and controls of the\n# maneuver in this way allows the user to have more control over how fast\n# to perform the maneuver, since the total time, reference velocity and\n# RPM are then defined in the simulation parameters shown below.\n\n\n\n\n# ------------- 3) SIMULATION DEFINITION ---------------------------------------\n\nVref = 0.0 # Reference velocity to scale maneuver by\nRPMref = 0.0 # Reference RPM to scale maneuver by\nVinit = Vref*Vvehicle(0) # Initial vehicle velocity\nWinit = pi/180*(anglevehicle(1e-6) - anglevehicle(0))/(1e-6*ttot) # Initial angular velocity\n\n # Maximum number of particles\nmax_particles = (nsteps+1)*(vlm.get_m(vehicle.vlm_system)*(p_per_step+1) + p_per_step)\n\nsimulation = uns.Simulation(vehicle, maneuver, Vref, RPMref, ttot;\n Vinit=Vinit, Winit=Winit);\n\n\n\n\n# ------------- 4) MONITORS DEFINITIONS ----------------------------------------\n\n# NOTE: Monitors are functions that are called at every time step to perform\n# some secondary computation after the solution of that time step has been\n# obtained. In this case, the wing monitor uses the circulation and\n# induced velocities to compute aerodynamic forces and decompose them\n# into lift and drag. The monitor then plots these forces at every time\n# step while also saving them under a CSV file in the simulation folder.\n\n# Generate function that calculates aerodynamic forces\n# NOTE: We exclude skin friction since we want to compare to the experimental\n# data reported in Weber 1951 that was measured with pressure taps\ncalc_aerodynamicforce_fun = uns.generate_calc_aerodynamicforce(;\n add_parasiticdrag=true,\n add_skinfriction=false,\n airfoilpolar=\"xf-rae101-il-1000000.csv\"\n )\n\nD_dir = [cosd(AOA), 0.0, sind(AOA)] # Direction of drag\nL_dir = uns.cross(D_dir, [0,1,0]) # Direction of lift\n\nfigs, figaxs = [], [] # Figures generated by monitor\n\n# Generate wing monitor\nmonitor_wing = uns.generate_monitor_wing(wing, Vinf, b, ar,\n rho, qinf, nsteps;\n calc_aerodynamicforce_fun=calc_aerodynamicforce_fun,\n L_dir=L_dir,\n D_dir=D_dir,\n out_figs=figs,\n out_figaxs=figaxs,\n save_path=save_path,\n run_name=run_name,\n figname=\"wing monitor\",\n );\n\n\n\n\n# ------------- 5) RUN SIMULATION ----------------------------------------------\nprintln(\"Running simulation...\")\n\nuns.run_simulation(simulation, nsteps;\n # ----- SIMULATION OPTIONS -------------\n Vinf=Vinf,\n rho=rho,\n # ----- SOLVERS OPTIONS ----------------\n p_per_step=p_per_step,\n max_particles=max_particles,\n sigma_vlm_solver=sigma_vlm_solver,\n sigma_vlm_surf=sigma_vlm_surf,\n sigma_rotor_surf=sigma_vlm_surf,\n sigma_vpm_overwrite=sigma_vpm_overwrite,\n shed_starting=shed_starting,\n vlm_rlx=vlm_rlx,\n extra_runtime_function=monitor_wing,\n # ----- OUTPUT OPTIONS ------------------\n save_path=save_path,\n run_name=run_name\n );\n\n\n\n\n# ----------------- 6) VISUALIZATION -------------------------------------------\nif paraview\n println(\"Calling Paraview...\")\n\n # Files to open in Paraview\n files = joinpath(save_path, run_name*\"_Wing_vlm...vtk\")\n files *= \";\"*run_name*\"_pfield...xmf;\"\n\n # Call Paraview\n run(`paraview --data=$(files)`)\n\nend\n\n","category":"page"},{"location":"examples/wing-4p2aoa/","page":"Basics","title":"Basics","text":"\n Run time: ~3 minutes on a Dell Precision 7760 laptop.\n
\n Reduce resolution (n and steps) to speed up simulation without loss of accuracy.\n
\n

","category":"page"},{"location":"examples/wing-4p2aoa/","page":"Basics","title":"Basics","text":"As the simulation runs, you will see the monitor (shown below) plotting the lift and drag coefficients over time along with the loading distribution. For comparison, here we have also added the experimental measurements reported by Weber and Brebner, 1951.","category":"page"},{"location":"examples/wing-4p2aoa/","page":"Basics","title":"Basics","text":"(red = beginning,\nblue = end)","category":"page"},{"location":"examples/wing-4p2aoa/","page":"Basics","title":"Basics","text":"
\n \"Pic\n
","category":"page"},{"location":"examples/wing-4p2aoa/","page":"Basics","title":"Basics","text":" Experimental FLOWUnsteady Error\nC_L 0.238 0.23506 1.234%\nC_D 0.005 0.00501 0.143%","category":"page"},{"location":"examples/wing-4p2aoa/","page":"Basics","title":"Basics","text":"info: Paraview visualization\nThe .pvsm file visualizing the simulation as shown at the top of this page is available here: LINK (right click → save as...). To open in Paraview: File → Load State → (select .pvsm file) then select \"Search files under specified directory\" and point it to the folder where the simulation was saved.","category":"page"},{"location":"visualization/#Visualization-Guide","page":"Visualization","title":"Visualization Guide","text":"","category":"section"},{"location":"visualization/#What-*NOT*-to-do","page":"Visualization","title":"What NOT to do","text":"","category":"section"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Unfortunately, the first thing that ParaView shows when you open a particle field is a \"scatter plot\" full of confusing colors like this:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"
\n \"Pic\n
","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Not surprisingly, the VPM literature is full of these visualizations, which provide very little information about the simulation. Poor colormap aside, why is this a bad visualization? Even though we are coloring the strengths of the particles, one must remember that the particle strength boldsymbolGamma is the integral of the vorticity over the volume that is discretized by the particle, boldsymbolGamma = intlimits_mathrmVol boldsymbolomega mathrmdV. This is equivalent to the average vorticity times the volume, boldsymbolGamma = overlineboldsymbolomega mathrmVol, which means that the particle strength is proportional to the volume that it discretizes. Thus, the particle strength has no physical significance, but is purely a numerical artifact. (In fact, boldsymbolGamma are nothing more than the coefficients of the radial basis function that reconstructs the vorticity field as overlineboldsymbolomegaleft( mathbfxright) approx sumlimits_p boldsymbolGamma_p zeta_sigma_p(mathbfx-mathbfx_p).)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Another VPM visualization that is commonly found in the literature simply shows the position of the particles:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"
\n \"Pic\n
","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Why is this a bad visualization? Even though its intent is to depict the flow field by taking advantage of the fact that particles follow streamlines and vortical structures, what is actually visualized is the spatial discretization. After all, we are just looking at the position of the computational elements. Here is an equivalent visualization of the computational elements in a mesh-based simulation of the same rotor in hover:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"
\n \"Pic\n
","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Not very insightful, is it?","category":"page"},{"location":"visualization/#What-we-recommend","page":"Visualization","title":"What we recommend","text":"","category":"section"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"In order to correctly visualize the flow field that is predicted by the VPM solver, one must reconstruct the vorticity field using the particles as a radial basis function and compute the velocity field using the Biot-Savart law. This can be computationally intensive and is not a streamlined process.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Alternatively, a quick visualization that sheds insights into both the flow field and the discretization is to make glyphs that point in the direction of boldsymbolGamma (arrows scaled by magnitude), thus forming the vortex lines:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"
\n \"Pic\n
","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"
\n \"Pic\n
","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"This type of visualization has four advantages:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"It clearly reveals the vortical structure (vortex lines) in a quick glimpse\nOne can envision the velocity field around the vortex lines using the right hand rule (Biot-Savart law shown below)\nAdding small points at the position of each particle gives us an idea of the spatial resolution around vortices\nOne can easily spot if the simulation is becoming numerically unstable since blown-up particles become giant arrows","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"
\n \"Pic\n
","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"info: Glyph Visualization\nA .pvsm file with a glyph visualization of the particle field is available here: LINK (right click → save as...).To open in ParaView: File → Load State → (select .pvsm file) then select \"Search files under specified directory\" and point it to the folder where the simulation was saved.","category":"page"},{"location":"visualization/#Fluid-domain","page":"Visualization","title":"Fluid domain","text":"","category":"section"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"While the \"glyph\" visualization shown above uses the native variables that are computed and outputted by the VPM (boldsymbolGamma_p and mathbfx_p), the full fluid domain can be computed from the particle field in postprocessing. This is done using the particles as a radial basis function to construct a continuous and analytical vorticity field boldsymbolomega(mathbfx), and the Biot-Savart law is used to obtain a continuous and analytical velocity field mathbfu(mathbfx). Since boldsymbolomega(mathbfx) and mathbfu(mathbfx) are analytical functions, their values and their derivatives can be calculated anywhere in space.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"FLOWUnsteady provides the function uns.computefluiddomain that reads a simulation and processes it to generate its fluid domain. See the Rotor in Hover tutorial for an example on how to use uns.computefluiddomain.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Whenever reporting results, we recommend showing the vortex elements (glyph visualization) and the fluid domain side by side to give a clear idea of the spatial resolution and the resulting flow field (see example below), which is custom in conventional mesh-based CFD.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"
\n \"Pic\n
","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":" \"Pic","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"

","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Here is an example of a simulation superimposing the particle field and the resulting fluid domain:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"
\n \n
","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"info: Volume Rendering\nA .pvsm file with a volume rendering of the vorticity field is available here: LINK (right click → save as...).To open in ParaView: File → Load State → (select .pvsm file) then select \"Search files under specified directory\" and point it to the folder where the simulation was saved.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"tip: Practice Dataset and Template\nTo help you practice in ParaView, we have uploaded the particle field and fluid domain of the DJI 9443 rotor case of mid-high fidelity and high fidelity simulations:High fidelity: LINK\nMid-high fidelity: LINKWe have also added a .pvsm ParaView state file that you can use as a template for visualizing your particle field with glyphs and processing the fluid domain. To open in ParaView: File → Load State → (select .pvsm file) then select \"Search files under specified directory\" and point it to the folder with your simulation results.","category":"page"},{"location":"examples/propeller-J040/#Basics","page":"Basics","title":"Basics","text":"","category":"section"},{"location":"examples/propeller-J040/","page":"Basics","title":"Basics","text":"
\n \"Vid\n
","category":"page"},{"location":"examples/propeller-J040/","page":"Basics","title":"Basics","text":"
","category":"page"},{"location":"examples/propeller-J040/","page":"Basics","title":"Basics","text":"In this example we first simulate an APC Thin-Electric 10x7 propeller operating in cruise conditions. Along the way, we demonstrate the basics of how to set up and run a rotor simulation.","category":"page"},{"location":"examples/propeller-J040/","page":"Basics","title":"Basics","text":"Rotors are generated through the function FLOWUnsteady.generate_rotor, which can receive either a set of parameters that define the rotor geometry (like twist/chord/sweep distributions, etc), or it can read the rotor geometry from a file. FLOWunsteady provides a prepopulated database of airfoil and rotor geometries to automate the generation of rotors, which is found under database/. This database can be accessed through the variable FLOWUnsteady.default_database. Alternatively, users can define their own database with custom rotors and airfoils.","category":"page"},{"location":"examples/propeller-J040/","page":"Basics","title":"Basics","text":"The following slides describe the structure of the database, using a DJI rotor as an example:","category":"page"},{"location":"examples/propeller-J040/","page":"Basics","title":"Basics","text":"
\n \n
\n

","category":"page"},{"location":"examples/propeller-J040/","page":"Basics","title":"Basics","text":"In this simulation we exemplify the following:","category":"page"},{"location":"examples/propeller-J040/","page":"Basics","title":"Basics","text":"How to generate a rotor with uns.generate_rotor\nHow to generate a rotor monitor with uns.generate_monitor_rotors\nHow to set up and run a rotor simulation.","category":"page"},{"location":"examples/propeller-J040/","page":"Basics","title":"Basics","text":"
","category":"page"},{"location":"examples/propeller-J040/","page":"Basics","title":"Basics","text":"#=##############################################################################\n# DESCRIPTION\n Simulation of an APC Thin-Electric 10x7 propeller (two-bladed rotor, 10-inch\n diameter).\n\n This example replicates the experiment and simulation described in McCrink &\n Gregory (2017), \"Blade Element Momentum Modeling of Low-Reynolds Electric\n Propulsion Systems.\"\n\n# AUTHORSHIP\n * Author : Eduardo J. Alvarez (edoalvarez.com)\n * Email : Edo.AlvarezR@gmail.com\n * Created : Mar 2023\n * Last updated : Mar 2023\n * License : MIT\n=###############################################################################\n\nimport FLOWUnsteady as uns\nimport FLOWVLM as vlm\nimport FLOWVPM as vpm\n\nrun_name = \"propeller-example\" # Name of this simulation\n\nsave_path = run_name # Where to save this simulation\nparaview = true # Whether to visualize with Paraview\n\n\n# ----------------- GEOMETRY PARAMETERS ----------------------------------------\n\n# Rotor geometry\nrotor_file = \"apc10x7.csv\" # Rotor geometry\ndata_path = uns.def_data_path # Path to rotor database\npitch = 0.0 # (deg) collective pitch of blades\nCW = false # Clock-wise rotation\nxfoil = true # Whether to run XFOIL\nncrit = 9 # Turbulence criterion for XFOIL\n\n# NOTE: If `xfoil=true`, XFOIL will be run to generate the airfoil polars used\n# by blade elements before starting the simulation. XFOIL is run\n# on the airfoil contours found in `rotor_file` at the corresponding\n# local Reynolds and Mach numbers along the blade.\n# Alternatively, the user can provide pre-computer airfoil polars using\n# `xfoil=false` and pointing to polar files through `rotor_file`.\n\n# Discretization\nn = 20 # Number of blade elements per blade\nr = 1/5 # Geometric expansion of elements\n\n# NOTE: Here a geometric expansion of 1/5 means that the spacing between the\n# tip elements is 1/5 of the spacing between the hub elements. Refine the\n# discretization towards the blade tip like this in order to better\n# resolve the tip vortex.\n\n# Read radius of this rotor and number of blades\nR, B = uns.read_rotor(rotor_file; data_path=data_path)[[1,3]]\n\n# ----------------- SIMULATION PARAMETERS --------------------------------------\n\n# Operating conditions\nRPM = 9200 # RPM\nJ = 0.4 # Advance ratio Vinf/(nD)\nAOA = 0 # (deg) Angle of attack (incidence angle)\n\nrho = 1.225 # (kg/m^3) air density\nmu = 1.81e-5 # (kg/ms) air dynamic viscosity\nspeedofsound = 342.35 # (m/s) speed of sound\n\nmagVinf = J*RPM/60*(2*R)\nVinf(X, t) = magVinf*[cosd(AOA), sind(AOA), 0] # (m/s) freestream velocity vector\n\nReD = 2*pi*RPM/60*R * rho/mu * 2*R # Diameter-based Reynolds number\nMatip = 2*pi*RPM/60*R / speedofsound # Tip Mach number\n\nprintln(\"\"\"\n RPM: $(RPM)\n Vinf: $(Vinf(zeros(3), 0)) m/s\n Matip: $(round(Matip, digits=3))\n ReD: $(round(ReD, digits=0))\n\"\"\")\n\n# ----------------- SOLVER PARAMETERS ------------------------------------------\n\n# Aerodynamic solver\nVehicleType = uns.UVLMVehicle # Unsteady solver\n# VehicleType = uns.QVLMVehicle # Quasi-steady solver\nconst_solution = VehicleType==uns.QVLMVehicle # Whether to assume that the\n # solution is constant or not\n# Time parameters\nnrevs = 4 # Number of revolutions in simulation\nnsteps_per_rev = 36 # Time steps per revolution\nnsteps = const_solution ? 2 : nrevs*nsteps_per_rev # Number of time steps\nttot = nsteps/nsteps_per_rev / (RPM/60) # (s) total simulation time\n\n# VPM particle shedding\np_per_step = 2 # Sheds per time step\nshed_starting = true # Whether to shed starting vortex\nshed_unsteady = true # Whether to shed vorticity from unsteady loading\nmax_particles = ((2*n+1)*B)*nsteps*p_per_step + 1 # Maximum number of particles\n\n# Regularization\nsigma_rotor_surf= R/40 # Rotor-on-VPM smoothing radius\nlambda_vpm = 2.125 # VPM core overlap\n # VPM smoothing radius\nsigma_vpm_overwrite = lambda_vpm * 2*pi*R/(nsteps_per_rev*p_per_step)\n\n# Rotor solver\nvlm_rlx = 0.7 # VLM relaxation <-- this also applied to rotors\nhubtiploss_correction = vlm.hubtiploss_nocorrection # Hub and tip loss correction\n\n# VPM solver\nvpm_viscous = vpm.Inviscid() # VPM viscous diffusion scheme\n\n# NOTE: In most practical situations, open rotors operate at a Reynolds number\n# high enough that viscous diffusion in the wake is negligible.\n# Hence, it does not make much of a difference whether we run the\n# simulation with viscous diffusion enabled or not.\n\n\nif VehicleType == uns.QVLMVehicle\n # NOTE: If the quasi-steady solver is used, this mutes warnings regarding\n # potential colinear vortex filaments. This is needed since the\n # quasi-steady solver will probe induced velocities at the lifting\n # line of the blade\n uns.vlm.VLMSolver._mute_warning(true)\nend\n\n# ----------------- 1) VEHICLE DEFINITION --------------------------------------\nprintln(\"Generating geometry...\")\n\n# Generate rotor\nrotor = uns.generate_rotor(rotor_file; pitch=pitch,\n n=n, CW=CW, blade_r=r,\n altReD=[RPM, J, mu/rho],\n xfoil=xfoil,\n ncrit=ncrit,\n data_path=data_path,\n verbose=true,\n verbose_xfoil=false,\n plot_disc=true\n );\n\nprintln(\"Generating vehicle...\")\n\n# Generate vehicle\nsystem = vlm.WingSystem() # System of all FLOWVLM objects\nvlm.addwing(system, \"Rotor\", rotor)\n\nrotors = [rotor]; # Defining this rotor as its own system\nrotor_systems = (rotors, ); # All systems of rotors\n\nwake_system = vlm.WingSystem() # System that will shed a VPM wake\n # NOTE: Do NOT include rotor when using the quasi-steady solver\nif VehicleType != uns.QVLMVehicle\n vlm.addwing(wake_system, \"Rotor\", rotor)\nend\n\nvehicle = VehicleType( system;\n rotor_systems=rotor_systems,\n wake_system=wake_system\n );\n\n# NOTE: Through the `rotor_systems` keyword argument to `uns.VLMVehicle` we\n# have declared any systems (groups) of rotors that share a common RPM.\n# We will later declare the control inputs to each rotor system when we\n# define the `uns.KinematicManeuver`.\n\n\n# ------------- 2) MANEUVER DEFINITION -----------------------------------------\n# Non-dimensional translational velocity of vehicle over time\nVvehicle(t) = zeros(3)\n\n# Angle of the vehicle over time\nanglevehicle(t) = zeros(3)\n\n# RPM control input over time (RPM over `RPMref`)\nRPMcontrol(t) = 1.0\n\nangles = () # Angle of each tilting system (none)\nRPMs = (RPMcontrol, ) # RPM of each rotor system\n\nmaneuver = uns.KinematicManeuver(angles, RPMs, Vvehicle, anglevehicle)\n\n# NOTE: `FLOWUnsteady.KinematicManeuver` defines a maneuver with prescribed\n# kinematics. `Vvehicle` defines the velocity of the vehicle (a vector)\n# over time. `anglevehicle` defines the attitude of the vehicle over time.\n# `angle` defines the tilting angle of each tilting system over time.\n# `RPM` defines the RPM of each rotor system over time.\n# Each of these functions receives a nondimensional time `t`, which is the\n# simulation time normalized by the total time `ttot`, from 0 to\n# 1, beginning to end of simulation. They all return a nondimensional\n# output that is then scaled by either a reference velocity (`Vref`) or\n# a reference RPM (`RPMref`). Defining the kinematics and controls of the\n# maneuver in this way allows the user to have more control over how fast\n# to perform the maneuver, since the total time, reference velocity and\n# RPM are then defined in the simulation parameters shown below.\n\n\n# ------------- 3) SIMULATION DEFINITION ---------------------------------------\n\nVref = 0.0 # Reference velocity to scale maneuver by\nRPMref = RPM # Reference RPM to scale maneuver by\n\nVinit = Vref*Vvehicle(0) # Initial vehicle velocity\nWinit = pi/180*(anglevehicle(1e-6) - anglevehicle(0))/(1e-6*ttot) # Initial angular velocity\n\nsimulation = uns.Simulation(vehicle, maneuver, Vref, RPMref, ttot;\n Vinit=Vinit, Winit=Winit);\n\n\n# ------------- 4) MONITORS DEFINITIONS ----------------------------------------\nfigs, figaxs = [], [] # Figures generated by monitor\n\n# Generate rotor monitor\nmonitor_rotor = uns.generate_monitor_rotors(rotors, J, rho, RPM, nsteps;\n t_scale=RPM/60, # Scaling factor for time in plots\n t_lbl=\"Revolutions\", # Label for time axis\n out_figs=figs,\n out_figaxs=figaxs,\n save_path=save_path,\n run_name=run_name,\n figname=\"rotor monitor\",\n )\n\n\n# ------------- 5) RUN SIMULATION ----------------------------------------------\nprintln(\"Running simulation...\")\n\nuns.run_simulation(simulation, nsteps;\n # ----- SIMULATION OPTIONS -------------\n Vinf=Vinf,\n rho=rho, mu=mu, sound_spd=speedofsound,\n # ----- SOLVERS OPTIONS ----------------\n p_per_step=p_per_step,\n max_particles=max_particles,\n vpm_viscous=vpm_viscous,\n sigma_vlm_surf=sigma_rotor_surf,\n sigma_rotor_surf=sigma_rotor_surf,\n sigma_vpm_overwrite=sigma_vpm_overwrite,\n vlm_rlx=vlm_rlx,\n hubtiploss_correction=hubtiploss_correction,\n shed_unsteady=shed_unsteady,\n shed_starting=shed_starting,\n extra_runtime_function=monitor_rotor,\n # ----- OUTPUT OPTIONS ------------------\n save_path=save_path,\n run_name=run_name,\n );\n\n\n\n\n# ----------------- 6) VISUALIZATION -------------------------------------------\nif paraview\n println(\"Calling Paraview...\")\n\n # Files to open in Paraview\n files = joinpath(save_path, run_name*\"_pfield...xmf;\")\n for bi in 1:B\n global files\n files *= run_name*\"_Rotor_Blade$(bi)_loft...vtk;\"\n files *= run_name*\"_Rotor_Blade$(bi)_vlm...vtk;\"\n end\n\n # Call Paraview\n run(`paraview --data=$(files)`)\n\nend\n\n","category":"page"},{"location":"examples/propeller-J040/","page":"Basics","title":"Basics","text":"\n Run time: ~2 minutes on a Dell Precision 7760 laptop.\n\n

","category":"page"},{"location":"examples/propeller-J040/","page":"Basics","title":"Basics","text":"As the simulation runs, you will see the monitor shown below plotting the blade loading along with thrust and torque coefficients and propulsive efficiency.","category":"page"},{"location":"examples/propeller-J040/","page":"Basics","title":"Basics","text":"
\n \"Pic\n
","category":"page"},{"location":"examples/propeller-J040/","page":"Basics","title":"Basics","text":"(red = beginning,\nblue = end)","category":"page"},{"location":"examples/rotorhover-acoustics/#rotorhovernoise","page":"Aeroacoustics","title":"Aeroacoustic Noise","text":"","category":"section"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"
\n \"Pic\n
","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"Using the aerodynamic solution obtained in the previous section, we can now feed the time-resolved loading and blade motion to PSU-WOPWOP and BPM.jl to compute aeroacoustic noise. PSU-WOPWOP is a Ffowcs Williams-Hawkings acoustic analogy using the time-domain integral Farassat 1A formulation to compute tonal noise from loading and thickness sources (FLOWUnsteady uses a compact representation for the loading source, while using the actual 3D loft of the blade for the thickness source). BPM.jl is an implementation of the semi-empirical methodology developed by Brooks, Pope, and Marcolini to predict broadband noise. The methodology models five self-noise mechanisms due to boundary-layer phenomena: boundary-layer turbulence passing the trailing edge, separated boundary-layer and stalled-airfoil flow, vortex shedding due to laminar-boundary-layer instabilities, vortex shedding from blunt trailing edges, and turbulent flow due to vortex tip formation.","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"In the following code we exemplify the following:","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"How to define observers (microphones) to probe the aeroacoustic noise\nHow to call PSU-WOPWOP through uns.run_noise_wopwop\nHow to call BPM.jl through uns.run_noise_bpm\nHow to add the tonal and broadband noise together and postprocess","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"As a reference, this is the orientation of the rotor and microphone array used in this example:","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"
\n \"Pic\n
","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"info: PSU-WOPWOP\nPSU-WOPWOP is a closed-source code that is not included in FLOWUnsteady, but is graciously made available as a binary by its developers at Penn State University upon inquiry. We recommend contacting them directly to obtain a binary.FLOWUnsteady has been tested with PSU-WOPWOP v3.4.4.","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"","category":"page"},{"location":"examples/rotorhover-acoustics/#Preamble","page":"Aeroacoustics","title":"Preamble","text":"","category":"section"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"We load FLOWUnsteady and the FLOWUnsteady.noise module:","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"import FLOWUnsteady as uns\nimport FLOWUnsteady: gt, vlm, noise\n\n# Path where to read and save simulation data\nsims_path = \"/media/edoalvar/T7/simulationdata202304\"\n","category":"page"},{"location":"examples/rotorhover-acoustics/#Tonal-Noise","page":"Aeroacoustics","title":"Tonal Noise","text":"","category":"section"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"First, we calculate the tonal noise from loading and thickness sources. The loading of each blade is read from each time step of the the aerodynamic solution, which is an unsteady loading. The thickness is computed from the 3D lofted geometry that is also outputted by the aero solution.","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"These files are read calling uns.run_noise_wopwop, which converts the outputs of the aero solution into a PSU-WOPWOP case. The PSU-WOPWOP binary is then called to read the case and propagate the noise to a set of observers (microphones). The PSU-WOPWOP solution is then written to the same case folder.","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"# Path from where to read aerodynamic solution\nread_path = joinpath(sims_path, \"rotorhover-example-midhigh00\") # <-- This must point to you aero simulation\n\n# Path where to save PSU-WOPWOP outputs\nsave_ww_path = read_path*\"-pww/\"\n\n# Path to PSU-WOPWOP binary (not included in FLOWUnsteady)\nwopwopbin = \"/home/edoalvar/Dropbox/WhisperAero/OtherCodes/PSU-WOPWOP_v3.4.4/wopwop3_linux_serial\"\n\n# Run name (prefix of rotor files to read)\nrun_name = \"singlerotor\"\n\n# Make this `true` if the aero simulation used the quasi-steady solver. If so,\n# PSU-WOPWOP will assume that the blade loading and geometry stays constant\n# and will read only one step out of the aero solution\nconst_solution = false\n\n# ------------ PARAMETERS ------------------------------------------------------\n# NOTE: Make sure that these parameters match what was used in the\n# aerodynamic solution\n\n# Rotor geometry\nrotor_file = \"DJI9443.csv\" # Rotor geometry\ndata_path = uns.def_data_path # Path to rotor database\n\n# Read radius of this rotor and number of blades\nR, B = uns.read_rotor(rotor_file; data_path=data_path)[[1,3]]\n\nrotorsystems = [[B]] # rotorsystems[si][ri] is the number of blades of the ri-th rotor in the si-th system\n\n# Simulation parameters\nRPM = 5400 # RPM here is a reference value to go from nrevs to simulation time\nCW = false # Clock-wise rotation of constant geometry (used if const_solution=true)\nrho = 1.071778 # (kg/m^3) air density\nspeedofsound = 342.35 # (m/s) speed of sound\n\n# Aero input parameters\nnrevs = 2 # Number of revolutions to read\nnrevs_min = 6 # Start reading from this revolution\nnsteps_per_rev = 72 # Number of steps per revolution in aero solution\nnum_min = ceil(Int, nrevs_min*nsteps_per_rev) # Start reading aero files from this step number\n\nif const_solution # If constant solution, it overrides to read only the first time step\n nrevs = nothing\n nsteps_per_rev = nothing\n num_min = 1\nend\n\n\n# PSU-WOPWOP parameters\nww_nrevs = 18 # Number of revolutions in PSU-WOPWOP (18 revs at 5400 RPM gives fbin = 5 Hz)\nww_nsteps_per_rev = max(120, 2*nsteps_per_rev) # Number of steps per revolution in PSU-WOPWOP\nconst_geometry = const_solution # Whether to run PSU-WOPWOP on constant geometry read from num_min\nperiodic = true # Periodic aerodynamic solution\nhighpass = 0.0 # High pass filter (set this to >0 to get rid of 0th freq in OASPL)\n\n# NOTE: `periodic=true` assumes that the aero solution is periodic, which allows\n# PSU-WOPWOP to simulate more revolutions (`ww_nrevs`) that what is\n# read from the aero simulation (`nrevs`). This is a good assumption for\n# an unsteady simulation as long as the loading is somewhat periodic after\n# the initial transient state (even with small unsteady fluctuations),\n# but set it to `false` in simulations with complex control inputs\n# (e.g., maneuvering aircraft, variable RPM, etc). If the outputs of\n# PSU-WOPWOP seem nonsensical, try setting this to false and increasing\n# the number of revolutions in the aero solution (`nrevs`).\n\n\n# Observer definition: Circular array of microphones\nsph_R = 1.905 # (m) radial distance from rotor hub\nsph_nR = 0 # Number of microphones in the radial direction\nsph_nphi = 0 # Number of microphones in the zenith direction\nsph_ntht = 72 # Number of microphones in the azimuthal direction\nsph_thtmin = 0 # (deg) first microphone's angle\nsph_thtmax = 360 # (deg) last microphone's angle\nsph_phimax = 180\nsph_rotation = [90, 0, 0] # Rotation of grid of microphones\n\n# NOTE: Here we have defined the microphone array as a circular array, but\n# we could have defined a hemisphere instead by simply making `sph_nphi`\n# different than zero, or a full volumetric spherical mesh making `sph_nR`\n# different than zero\n\n# Alternative observer definition: Single microphone\nRmic = 1.905 # (m) radial distance from rotor hub\nanglemic = 90*pi/180 # (rad) microphone angle from plane of rotation (- below, + above)\n # 0deg is at the plane of rotation, 90deg is upstream\nmicrophoneX = nothing # Comment and uncomment this to switch from array to single microphone\n# microphoneX = Rmic*[-sin(anglemic), cos(anglemic), 0]\n\n\n# ------------ RUN PSU-WOPWOP ----------------------------------------------\n@time uns.run_noise_wopwop(read_path, run_name, RPM, rho, speedofsound, rotorsystems,\n ww_nrevs, ww_nsteps_per_rev, save_ww_path, wopwopbin;\n nrevs=nrevs, nsteps_per_rev=nsteps_per_rev,\n # ---------- OBSERVERS -------------------------\n sph_R=sph_R,\n sph_nR=sph_nR, sph_ntht=sph_ntht,\n sph_nphi=sph_nphi, sph_phimax=sph_phimax,\n sph_rotation=sph_rotation,\n sph_thtmin=sph_thtmin, sph_thtmax=sph_thtmax,\n microphoneX=microphoneX,\n # ---------- SIMULATION OPTIONS ----------------\n periodic=periodic,\n # ---------- INPUT OPTIONS ---------------------\n num_min=num_min,\n const_geometry=const_geometry,\n axisrot=\"automatic\",\n CW=CW,\n highpass=highpass,\n # ---------- OUTPUT OPTIONS --------------------\n verbose=true, v_lvl=0,\n prompt=true, debug_paraview=false,\n debuglvl=0, # PSU-WOPWOP debug level (verbose)\n observerf_name=\"observergrid\", # .xyz file with observer grid\n case_name=\"runcase\", # Name of case to create and run\n );\n","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"\n Run time: ~1 minute on a Dell Precision 7760 laptop.\n\n

","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"info: Frequency bins\nThe length of the frequency bins in the SPL spectrum obtained from the FFT falls out from the following relationshipsbeginalign*\n f_mathrmbin\n =\n fracf_mathrmsamplen_mathrmsamples\n =\n frac1n_mathrmsamples Delta t_mathrmsample\n =\n fracmathrmRPM60frac1n_mathrmrevs\nendalign*Thus, in order to obtain the desired frequency bin f_mathrmbin, the number of revolutions that PSU-WOPWOP needs to simulate (ww_nrevs) isbeginalign*\n n_mathrmrevs\n =\n fracmathrmRPM60frac1f_mathrmbin\nendalign*","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"If you need to debug the aero→acoustics workflow, it is useful to convert the input files that we gave to PSU-WOPWOP back to VTK and visualize them in ParaView. This helps verify that we are passing the right things to PSU-WOPWOP. The following lines grab those input files that are formated for PSU-WOPWOP, converts them into VTK files, and opens them in ParaView:","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"\nread_ww_path = joinpath(save_ww_path, \"runcase\") # Path to PWW's input files\nsave_vtk_path = joinpath(read_ww_path, \"vtks\") # Where to save VTK files\n\n# Generate VTK files\nvtk_str = noise.save_geomwopwop2vtk(read_ww_path, save_vtk_path)\n\nprintln(\"Generated the following files:\\n\\t$(vtk_str)\")\n\n# Call Paraview to visualize VTKs\nrun(`paraview --data=$(vtk_str)`)\n","category":"page"},{"location":"examples/rotorhover-acoustics/#Broadband-Noise","page":"Aeroacoustics","title":"Broadband Noise","text":"","category":"section"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"Now, we calculate the broadband noise from non-deterministic sources through BPM. This is done calling uns.run_noise_bpm as follows:","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"# Path where to save BPM outputs\nsave_bpm_path = joinpath(sims_path, \"rotorhover-example-midhigh00-bpm\")\n\n# ------------ PARAMETERS --------------------------------------------------\n# NOTE: Make sure that these parameters match what was used in the\n# aerodynamic solution\n\n# Rotor geometry\nrotor_file = \"DJI9443.csv\" # Rotor geometry\ndata_path = uns.def_data_path # Path to rotor database\nread_polar = vlm.ap.read_polar2 # What polar reader to use\npitch = 0.0 # (deg) collective pitch of blades\nn = 50 # Number of blade elements (this does not need to match the aero solution)\nCW = false # Clock-wise rotation\n\n# Read radius of this rotor and number of blades\nR, B = uns.read_rotor(rotor_file; data_path=data_path)[[1,3]]\n\n# Simulation parameters\nRPM = 5400 # RPM\nJ = 0.0001 # Advance ratio Vinf/(nD)\nAOA = 0 # (deg) Angle of attack (incidence angle)\n\nrho = 1.071778 # (kg/m^3) air density\nmu = 1.85508e-5 # (kg/ms) air dynamic viscosity\nspeedofsound = 342.35 # (m/s) speed of sound\n\nmagVinf = J*RPM/60*(2*R)\nVinf(X,t) = magVinf*[cosd(AOA), sind(AOA), 0] # (m/s) freestream velocity\n\n# BPM parameters\nTE_thickness = 16.0 # (deg) trailing edge thickness\nnoise_correction= 1.00 # Calibration parameter (1 = no correction)\nfreq_bins = uns.BPM.default_f # Frequency bins (default is one-third octave band)\n\n# Observer definition: Circular array of microphones\nsph_R = 1.905 # (m) radial distance from rotor hub\nsph_nR = 0 # Number of microphones in the radial direction\nsph_nphi = 0 # Number of microphones in the zenith direction\nsph_thtmin = 0 # (deg) first microphone's angle\nsph_thtmax = 360 # (deg) last microphone's angle\nsph_phimax = 180\nsph_rotation = [90, 0, 0] # Rotation of grid of microphones\n\n# Alternative observer definition: Single microphone\nRmic = 1.905 # (m) radial distance from rotor hub\nanglemic = 90*pi/180 # (rad) microphone angle from plane of rotation (- below, + above)\n # 0deg is at the plane of rotation, 90deg is upstream\nmicrophoneX = nothing # Comment and uncomment this to switch from array to single microphone\n# microphoneX = Rmic*[-sin(anglemic), cos(anglemic), 0]\n\n# ------------ GENERATE GEOMETRY -------------------------------------------\n# Generate rotor\nrotor = uns.generate_rotor(rotor_file; pitch=pitch,\n n=n, CW=CW, ReD=0.0,\n verbose=false, xfoil=false,\n data_path=data_path,\n read_polar=read_polar,\n plot_disc=false)\n\nrotors = vlm.Rotor[rotor] # All rotors in the computational domain\n\n# ------------ RUN BPM -----------------------------------------------------\nuns.run_noise_bpm(rotors, RPM, Vinf, rho, mu, speedofsound,\n save_bpm_path;\n # ---------- OBSERVERS -------------------------\n sph_R=sph_R,\n sph_nR=sph_nR, sph_ntht=sph_ntht,\n sph_nphi=sph_nphi, sph_phimax=sph_phimax,\n sph_rotation=sph_rotation,\n sph_thtmin=sph_thtmin, sph_thtmax=sph_thtmax,\n microphoneX=microphoneX,\n # ---------- BPM OPTIONS -----------------------\n noise_correction=noise_correction,\n TE_thickness=TE_thickness,\n freq_bins=freq_bins,\n # ---------- OUTPUT OPTIONS --------------------\n prompt=true\n );\n","category":"page"},{"location":"examples/rotorhover-acoustics/#Results","page":"Aeroacoustics","title":"Results","text":"","category":"section"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"Finally, we add tonal and broadband noise together and plot the results","category":"page"},{"location":"examples/rotorhover-acoustics/#Read-datasets","page":"Aeroacoustics","title":"Read datasets","text":"","category":"section"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"We start by reading the outputs from PSU-WOPWOP and BPM:","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"# Dataset to read and associated information\ndataset_infos = [ # (label, PWW solution, BPM solution, line style, color)\n (\"FLOWUnsteady\",\n joinpath(sims_path, \"rotorhover-example-midhigh00-pww/runcase/\"),\n joinpath(sims_path, \"rotorhover-example-midhigh00-bpm\"),\n \"-\", \"steelblue\"),\n ]\n\ndatasets_pww = Dict() # Stores PWW data in this dictionary\ndatasets_bpm = Dict() # Stores BPM data in this dictionary\n\n# Read datasets and stores them in dictionaries\nnoise.read_data(dataset_infos; datasets_pww=datasets_pww, datasets_bpm=datasets_bpm)\n\nprintln(\"Done!\")\n","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"Also, we need to recreate the circular array of microphones that was used when generating the aeroacoustic solutions:","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"# These parameters will be used for plotting\nRPM = 5400 # RPM of solution\nnblades = 2 # Number of blades\nBPF = nblades*RPM/60 # Blade passing frequency\n\n# Make sure this grid is the same used as an observer by the aeroacoustic solution\nsph_R = 1.905 # (m) radial distance from rotor hub\nsph_nR = 0\nsph_nphi = 0\nsph_ntht = 72 # Number of microphones\nsph_thtmin = 0 # (deg) first microphone's angle\nsph_thtmax = 360 # (deg) last microphone's angle\nsph_phimax = 180\nsph_rotation = [90, 0, 0] # Rotation of grid of microphones\n\n# Create observer grid\ngrid = noise.observer_sphere(sph_R, sph_nR, sph_ntht, sph_nphi;\n thtmin=sph_thtmin, thtmax=sph_thtmax, phimax=sph_phimax,\n rotation=sph_rotation);\n\n# This function calculates the angle that corresponds to every microphone\npangle(i) = -180/pi*atan(gt.get_node(grid, i)[1], gt.get_node(grid, i)[2])\n","category":"page"},{"location":"examples/rotorhover-acoustics/#Pressure-waveform","page":"Aeroacoustics","title":"Pressure waveform","text":"","category":"section"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"Here we plot the pressure waveform at some of the microphones. This pressure waveform includes only the tonal component, as given by PSU-WOPWOP.","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"microphones = [-45, 90] # (deg) microphones to plot\n\nnoise.plot_pressure(dataset_infos, microphones, RPM, sph_ntht, pangle;\n datasets_pww=datasets_pww, xlims=[0, 5])\n","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"
\n \"Pic\n \"Pic\n
","category":"page"},{"location":"examples/rotorhover-acoustics/#SPL-Spectrum","page":"Aeroacoustics","title":"SPL Spectrum","text":"","category":"section"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"We now compare the (sound pressure level) SPL spectrum at the microphone -45^circ below the plane of rotation with the experimental data reported by Zawodny et al.[1].","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"[1]: N. S. Zawodny, D. D. Boyd, Jr., and C. L. Burley, “Acoustic Characterization and Prediction of Representative, Small-scale Rotary-wing Unmanned Aircraft System Components,” in 72nd American Helicopter Society (AHS) Annual Forum (2016).","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"One-third octave band:","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"microphones = [-45] # (deg) microphone to plot\nAweighted = false # Plot A-weighted SPL\nonethirdoctave = true # Plot 1/3 octave band\n\n# Experimental data from Zawodny et al., Fig. 9\nzawodny_path = joinpath(uns.examples_path, \"..\", \"docs\", \"resources\", \"data\", \"zawodny2016\")\nexp_filename = joinpath(zawodny_path, \"zawodny_dji9443-fig9-OTO-5400.csv\")\nplot_experimental = [(exp_filename, \"Experimental\", \"o:k\", Aweighted, [])]\n\n# Plot SPL spectrum\nnoise.plot_spectrum_spl(dataset_infos, microphones, BPF, sph_ntht, pangle;\n datasets_pww=datasets_pww, datasets_bpm=datasets_bpm,\n Aweighted=Aweighted,\n onethirdoctave=onethirdoctave,\n plot_csv=plot_experimental,\n xBPF=false, xlims=[100, 3e4], ylims=[0, 80], BPF_lines=8)\n","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"
\n \"Pic\n
","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"A-weighted narrow band:","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"Aweighted = true # Plot A-weighted SPL\n\n# Experimental data from Zawodny et al., Fig. 9\nexp_filename = joinpath(zawodny_path, \"zawodny_dji9443_spl_5400_01.csv\")\nplot_experimental = [(exp_filename, \"Experimental\", \"k\", Aweighted, [])]\n\n# Plot SPL spectrum\nnoise.plot_spectrum_spl(dataset_infos, microphones, BPF, sph_ntht, pangle;\n datasets_pww=datasets_pww, datasets_bpm=datasets_bpm,\n Aweighted=Aweighted,\n plot_csv=plot_experimental,\n xBPF=false, xlims=[100, 3e4], BPF_lines=21)","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"
\n \"Pic\n
","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"In the narrow band spectrum, keep in mind that the broadband output of BPM has been converted from 1/3 octaves into narrow band (5 hz bin) in order to plot it together with the tonal noise, but this is a very rough approximation (we lack enough information to interpolate from a coarse band to a narrow band besides just smearing the energy content). Hence, the broadband component seems to overpredict relative to the experimental, but this is an artifice of the 1/3 octave rightarrow narrow band conversion. In the OASPL directivity plots we will see that the A-weighted OASPL predicted with BPM actually matches the experimental values very well.","category":"page"},{"location":"examples/rotorhover-acoustics/#Tonal-noise","page":"Aeroacoustics","title":"Tonal noise","text":"","category":"section"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"Here we plot only the tonal component of noise associated with harmonics of the blade passing frequency (BPF),","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"Tonal SPL spectrum","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"Aweighted = false\nadd_broadband = false\n\n# Experimental data from Zawodny et al., Fig. 9\nexp_filename = joinpath(zawodny_path, \"zawodny_dji9443_spl_5400_01.csv\")\nplot_experimental = [(exp_filename, \"Experimental\", \"k\", Aweighted, [])]\n\n# Plot SPL spectrum\nnoise.plot_spectrum_spl(dataset_infos, microphones, BPF, sph_ntht, pangle;\n datasets_pww=datasets_pww, datasets_bpm=datasets_bpm,\n Aweighted=Aweighted,\n plot_csv=plot_experimental,\n add_broadband=add_broadband,\n xBPF=false, xlims=[100, 3e4], BPF_lines=21)\n","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"
\n \"Pic\n
","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"Directivity of 1^mathrmst BPF","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"BPFi = 1 # Multiple of blade-passing frequency to plot\n\n# Experimental and computational data reported by Zawodny et al., Fig. 14\nfilename1 = joinpath(zawodny_path, \"zawodny_fig14_topright_exp00.csv\")\nfilename2 = joinpath(zawodny_path, \"zawodny_fig14_topright_of00.csv\")\nfilename3 = joinpath(zawodny_path, \"zawodny_fig14_topright_pas00.csv\")\n\nplot_experimental = [(filename1, \"Experimental\", \"ok\", Aweighted, []),\n (filename2, \"OVERFLOW2\", \"-y\", Aweighted, [(:alpha, 0.8)])]\n\n# Plot SPL directivity of first blade-passing frequency\nnoise.plot_directivity_splbpf(dataset_infos, BPFi, BPF, pangle;\n datasets_pww=datasets_pww,\n datasets_bpm=datasets_bpm,\n plot_csv=plot_experimental,\n rticks=40:4:52, rlims=[40, 54], rorigin=36)\n","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"
\n \"Pic\n
","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"Directivity of 2^mathrmnd BPF","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"BPFi = 2 # Multiple of blade-passing frequency to plot\n\n# Experimental and computational data reported by Zawodny et al., Fig. 14\nfilename1 = joinpath(zawodny_path, \"zawodny_fig14_bottomright_exp00.csv\")\nfilename2 = joinpath(zawodny_path, \"zawodny_fig14_bottomright_of00.csv\")\nfilename3 = joinpath(zawodny_path, \"zawodny_fig14_bottomright_pas00.csv\")\n\nplot_experimental = [(filename1, \"Experimental\", \"ok\", Aweighted, []),\n (filename2, \"OVERFLOW2\", \"-y\", Aweighted, [(:alpha, 0.8)])]\n\n# Plot SPL directivity of first blade-passing frequency\nnoise.plot_directivity_splbpf(dataset_infos, BPFi, BPF, pangle;\n datasets_pww=datasets_pww,\n datasets_bpm=datasets_bpm,\n plot_csv=plot_experimental,\n rticks=15:5:30, rlims=[0, 32], rorigin=0)\n","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"
\n \"Pic\n
","category":"page"},{"location":"examples/rotorhover-acoustics/#OASPL-directivity","page":"Aeroacoustics","title":"OASPL directivity","text":"","category":"section"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"Unweighted overall SPL (OASPL)","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"Aweighted = false\n\n# Experimental and computational data reported by Zawodny et al., Fig. 12\nexp_filename = joinpath(zawodny_path, \"zawodny_fig12_left_5400_00.csv\")\nplot_experimental = [(exp_filename, \"Experimental\", \"ok\", Aweighted, [])]\n\n# Plot OASPL directivity\nnoise.plot_directivity_oaspl(dataset_infos, pangle;\n datasets_pww=datasets_pww,\n datasets_bpm=datasets_bpm,\n Aweighted=Aweighted,\n plot_csv=plot_experimental,\n rticks=40:10:70, rlims=[40, 72], rorigin=30)\n","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"
\n \"Pic\n
","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"A-weighted OASPL","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"Aweighted = true\n\n# Experimental and computational data reported by Zawodny et al., Fig. 12\nexp_filename = joinpath(zawodny_path, \"zawodny_fig12_right_5400_00.csv\")\nplot_experimental = [(exp_filename, \"Experimental\", \"ok\", Aweighted, [])]\n\n# Plot OASPL directivity\nnoise.plot_directivity_oaspl(dataset_infos, pangle;\n datasets_pww=datasets_pww,\n datasets_bpm=datasets_bpm,\n Aweighted=Aweighted,\n plot_csv=plot_experimental,\n rticks=40:10:70, rlims=[40, 72], rorigin=30)","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"
\n\"Pic\n
","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"","category":"page"},{"location":"examples/vahana-maneuver/#vahanamaneuver","page":"Maneuver Definition","title":"Maneuver Definition","text":"","category":"section"},{"location":"examples/vahana-maneuver/","page":"Maneuver Definition","title":"Maneuver Definition","text":"In this section we define a function that generates the eVTOL transition maneuver (a uns.KinematicManeuver object). This maneuver object contains the non-dimensional velocity and attitude of the aircraft over a non-dimensional time (where t=0 is the beginning of the maneuver and t=1 is the end), which prescribes the kinematics of the vehicle. It also contains the control inputs for the aircraft over time: tilting angles for each tilting system and RPM for each rotor system shown below.","category":"page"},{"location":"examples/vahana-maneuver/","page":"Maneuver Definition","title":"Maneuver Definition","text":"\n \n \n \n \n
\n \"Pic\n \n \"Pic\n
","category":"page"},{"location":"examples/vahana-maneuver/","page":"Maneuver Definition","title":"Maneuver Definition","text":"The maneuver here defined contains five stages:","category":"page"},{"location":"examples/vahana-maneuver/","page":"Maneuver Definition","title":"Maneuver Definition","text":"Takeoff, climb, hover\nHover rightarrow cruise transition (powered lift to wing-borne flight)\nCruise\nCruise rightarrow hover transition (wing-borne flight to powered lift)\nHover, descend, landing","category":"page"},{"location":"examples/vahana-maneuver/","page":"Maneuver Definition","title":"Maneuver Definition","text":"Since the vehicle kinematics and control inputs used in the maneuver definition are non-dimensional, the maneuver can be performed as fast or as slow as desired when we define the total time, reference velocity, and reference RPM of uns.Simulation later in the next section, without needing to change the maneuver definition shown here.","category":"page"},{"location":"examples/vahana-maneuver/","page":"Maneuver Definition","title":"Maneuver Definition","text":"\"\"\"\n Generates the eVTOL transition maneuver of Vahana aircraft\n\"\"\"\nfunction generate_maneuver_vahana(; disp_plot=false, # If true, it will display a plot of the maneuver\n add_rotors=true, # Whether to add rotors contorl inputs to the maneuver\n V0=0.0001 # Initial non-dimensional velocity (slightly different than zero to avoid instabilities)\n )\n\n # NOTE: The following parameters are non-dimensional and scaled between 0\n # and 1. Here, t=0 is the beginning of the maneuver and t=1 is the end.\n\n # Define end time of each stage\n # Stage 1: [0, t1] -> Take off\n # Stage 2: [t1, t2] -> Transition\n # Stage 3: [t2, t3] -> Cruise\n # Stage 4: [t3, t4] -> Transition\n # Stage 5: [t4, 1 ] -> Landing\n t1, t2, t3, t4 = 0.2, 0.3, 0.5, 0.6\n\n # Target velocity at each stage (ratio of cruise velocity)\n V1 = 0.25\n V2 = 0.10\n V3 = 1.00\n V4 = V2\n V5 = 0.5*V1\n\n # Target RPM at each stage (ratio of hover RPM)\n RPM1 = 1.10\n RPM2 = 1.50\n RPM3 = 0.75\n RPM3_stacked = 2/600\n RPM4 = 1.00\n RPM5 = 0.90\n\n r_RPMh_stup = 3.50 # Ratio between stacked and main rotor RPM in hover\n r_RPMh_tw = 0.75 # Ratio between tandem and main rotor RPM in hover\n\n # NOTE: -x is in the direction of flight and +z is climb with ground at z=0\n\n\n ############################################################################\n # AIRCRAFT VELOCITY\n ############################################################################\n \"\"\"\n Receives a nondimensional time between 0 and 1, and returns the\n non-dimensional velocity vector of the aircraft at that instant.\n \"\"\"\n function Vaircraft(t)\n\n # ------------ TAKE OFF ------------------------------------------------\n if t\n

\n \"Pic\n



\n \"Pic\n","category":"page"},{"location":"examples/vahana-maneuver/","page":"Maneuver Definition","title":"Maneuver Definition","text":"Notice that this plot shows four rotor systems instead of only three. This is because the system of stacked rotors was split into two (all upper stack rotors are grouped together, while all lower stack rotors are also grouped together). This way we could change the index angle of the stacked rotors throughout the simulation by modulating upper and lower RPMs independently. However, for simplicity, in this example we have kept upper and lower RPMs the same.","category":"page"},{"location":"api/flowvpm-uj/#UJ-Scheme","page":"UJ Scheme","title":"UJ Scheme","text":"","category":"section"},{"location":"api/flowvpm-uj/","page":"UJ Scheme","title":"UJ Scheme","text":"FLOWUnsteady.vpm.Kernel\nFLOWUnsteady.vpm.UJ_direct\nFLOWUnsteady.vpm.UJ_fmm\nFLOWUnsteady.vpm.FMM","category":"page"},{"location":"api/flowvpm-uj/#FLOWVPM.Kernel","page":"UJ Scheme","title":"FLOWVPM.Kernel","text":"Kernel(zeta, g, dgdr, g_dgdr, EXAFMM_P2P, EXAFMM_L2P)\n\nArguments\n\nzeta::Function : Basis function zeta(r).\ng::Function : Regularizing function g(r).\ndgdr::Function : Derivative of g(r).\ng_dgdr::Function : Efficient evaluation of g and dgdr.\nEXAFMM_P2P::Int : Flag for the ExaFMM P2P function to call.\nEXAFMM_L2P::Int : Flag for the ExaFMM L2P function to call.\n\n\n\n\n\n","category":"type"},{"location":"api/flowvpm-uj/#FLOWVPM.UJ_direct","page":"UJ Scheme","title":"FLOWVPM.UJ_direct","text":"UJ_direct(pfield)\n\nCalculates the velocity and Jacobian that the field exerts on itself by direct particle-to-particle interaction, saving U and J on the particles.\n\nNOTE: This method accumulates the calculation on the properties U and J of every particle without previously emptying those properties.\n\n\n\n\n\nUJ_direct(source, target)\n\nCalculates the velocity and Jacobian that the field source exerts on every particle of field target, saving U and J on the particles.\n\nNOTE: This method accumulates the calculation on the properties U and J of every particle without previously emptying those properties.\n\n\n\n\n\n","category":"function"},{"location":"api/flowvpm-uj/#FLOWVPM.UJ_fmm","page":"UJ Scheme","title":"FLOWVPM.UJ_fmm","text":"UJ_fmm(pfield)\n\nCalculates the velocity and Jacobian that the field exerts on itself through a fast-multipole approximation, saving U and J on the particles.\n\nNOTE: This method accumulates the calculation on the properties U and J of every particle without previously emptying those properties.\n\n\n\n\n\n","category":"function"},{"location":"examples/prowim-aero/#prowimaero","page":"Prop-on-Wing Interactions","title":"Prop-on-Wing Interactions","text":"","category":"section"},{"location":"examples/prowim-aero/","page":"Prop-on-Wing Interactions","title":"Prop-on-Wing Interactions","text":" \"Pic","category":"page"},{"location":"examples/prowim-aero/","page":"Prop-on-Wing Interactions","title":"Prop-on-Wing Interactions","text":"

","category":"page"},{"location":"examples/prowim-aero/","page":"Prop-on-Wing Interactions","title":"Prop-on-Wing Interactions","text":"In this example we use the actuator surface model (ASM) to more accurately predict the effects of props blowing on a wing. This case simulates the PROWIM experiment in Leo Veldhuis' dissertation (2005), and reproduces the validation study published in Alvarez & Ning (2023).","category":"page"},{"location":"examples/prowim-aero/","page":"Prop-on-Wing Interactions","title":"Prop-on-Wing Interactions","text":"In this example you can vary the fidelity of the simulation setting the following parameters:","category":"page"},{"location":"examples/prowim-aero/","page":"Prop-on-Wing Interactions","title":"Prop-on-Wing Interactions","text":"Parameter Low fidelity Mid-low fidelity Mid-high fidelity High fidelity Description\nn_wing 50 50 50 100 Number of wing elements per semispan\nn_rotor 12 12 20 50 Number of blade elements per blade\nnsteps_per_rev 36 36 36 72 Time steps per revolution\np_per_step 2 5 5 5 Particle sheds per time step\nshed_starting false false false true Whether to shed starting vortex\nshed_unsteady false false false true Whether to shed vorticity from unsteady loading\ntreat_wake true true true false Treat wake to avoid instabilities\nvlm_vortexsheet_overlap 2.125/10 2.125/10 2.125/10 2.125 Particle overlap in ASM vortex sheet\nvpm_integration vpm.euler vpm.euler RK3^star RK3^star VPM time integration scheme\nvpm_SFS None^dag None^dag Dynamic^ddag Dynamic^ddag VPM LES subfilter-scale model","category":"page"},{"location":"examples/prowim-aero/","page":"Prop-on-Wing Interactions","title":"Prop-on-Wing Interactions","text":"^starRK3: vpm_integration = vpm.rungekutta3\n^dagNone: vpm_SFS = vpm.SFS_none\n^ddagDynamic: vpm_SFS = vpm.SFS_Cd_twolevel_nobackscatter","category":"page"},{"location":"examples/prowim-aero/","page":"Prop-on-Wing Interactions","title":"Prop-on-Wing Interactions","text":"(Low fidelity settings may be inadequate for accurately capturing prop-on-wing interactions, but mid-low or higher should do well)","category":"page"},{"location":"examples/prowim-aero/","page":"Prop-on-Wing Interactions","title":"Prop-on-Wing Interactions","text":"As a reference, high-fidelity looks like this (except that the video shows a tip-mounted configuration with ailerons):","category":"page"},{"location":"examples/prowim-aero/","page":"Prop-on-Wing Interactions","title":"Prop-on-Wing Interactions","text":"
\n \n
","category":"page"},{"location":"examples/prowim-aero/","page":"Prop-on-Wing Interactions","title":"Prop-on-Wing Interactions","text":"#=##############################################################################\n# DESCRIPTION\n Validation of prop-on-wing interactions with twin props mounted mid span\n blowing on a wing. This case simulates the PROWIM experiment in Leo\n Veldhuis' dissertation (2005), “Propeller Wing Aerodynamic Interference.”\n\n In this simulation we use the actuator surface model for the wing in order\n to accurately capture prop-on-wing interactional effects. The rotors still\n use the actuator line model.\n\n The high-fidelity settings replicate the results presented in Alvarez &\n Ning (2023), \"Meshless Large-Eddy Simulation of Propeller–Wing Interactions\n with Reformulated Vortex Particle Method,\" Sec. IV.B, also available in\n Alvarez (2022), \"Reformulated Vortex Particle Method and Meshless Large Eddy\n Simulation of Multirotor Aircraft,\" Sec. 8.4.\n\n# ABOUT\n * Author : Eduardo J. Alvarez (edoalvarez.com)\n * Email : Edo.AlvarezR@gmail.com\n * Created : January 2024\n * Last updated : January 2024\n * License : MIT\n=###############################################################################\n\n\nimport FLOWUnsteady as uns\nimport FLOWUnsteady: vlm, vpm\n\nrun_name = \"prowim\" # Name of this simulation\nsave_path = run_name*\"-example2\" # Where to save this simulation\nprompt = true # Whether to prompt the user\nparaview = true # Whether to visualize with Paraview\n\nadd_wing = true # Whether to add wing to simulation\nadd_rotors = true # Whether to add rotors to simulation\n\n# ----------------- GEOMETRY PARAMETERS ----------------------------------------\n# Wing geometry\nb = 2*0.64 # (m) span length\nar = 5.33 # Aspect ratio b/c_tip\ntr = 1.0 # Taper ratio c_tip/c_root\ntwist_root = 0.0 # (deg) twist at root\ntwist_tip = 0.0 # (deg) twist at tip\nlambda = 0.0 # (deg) sweep\ngamma = 0.0 # (deg) dihedral\nthickness_w = 0.15 # Thickness t/c of wing airfoil\n\n# Rotor geometry\nrotor_file = \"beaver.csv\" # Rotor geometry\ndata_path = uns.def_data_path # Path to rotor database\nread_polar = vlm.ap.read_polar2 # What polar reader to use\npitch = 2.5 # (deg) collective pitch of blades\nxfoil = false # Whether to run XFOIL\nncrit = 6 # Turbulence criterion for XFOIL\n\n# Read radius of this rotor and number of blades\nR, B = uns.read_rotor(rotor_file; data_path=data_path)[[1,3]]\n\n# Vehicle assembly\nAOAwing = 0.0 # (deg) wing angle of attack\nspanpos = [-0.46875, 0.46875] # Semi-span position of each rotor, 2*y/b\nxpos = [-0.8417, -0.8417] # x-position of rotors relative to LE, x/c\nzpos = [0.0, 0.0] # z-position of rotors relative to LE, z/c\nCWs = [false, true] # Rotation direction of each rotor: outboard up\n# CWs = [true, false] # Rotation direction of each rotor: inboard up\nnrotors = length(spanpos) # Number of rotors\n\n# Discretization\nn_wing = 50 # Number of spanwise elements per side\nr_wing = 2.0 # Geometric expansion of elements\n# n_rotor = 20 # Number of blade elements per blade\nn_rotor = 12\nr_rotor = 1/10 # Geometric expansion of elements\n\n# Check that we declared all the inputs that we need for each rotor\n@assert nrotors==length(spanpos)==length(xpos)==length(zpos)==length(CWs) \"\"*\n \"Invalid rotor inputs! Check that spanpos, xpos, zpos, and CWs have the same length\"\n\n# ----------------- SIMULATION PARAMETERS --------------------------------------\n# Freestream\nmagVinf = 49.5 # (m/s) freestream velocity\nAOA = 4.0 # (deg) vehicle angle of attack\nrho = 1.225 # (kg/m^3) air density\nmu = 1.79e-5 # (kg/ms) air dynamic viscosity\nspeedofsound = 342.35 # (m/s) speed of sound\nqinf = 0.5*rho*magVinf^2 # (Pa) reference static pressure\nVinf(X, t) = magVinf*[cosd(AOA), 0, sind(AOA)] # Freestream function\n\n# Rotor operation\nJ = 0.85 # Advance ratio Vinf/(nD)\nRPM = 60*magVinf/(J*2*R) # RPM\n\n# Reference non-dimensional parameters\nRec = rho * magVinf * (b/ar) / mu # Chord-based wing Reynolds number\nReD = 2*pi*RPM/60*R * rho/mu * 2*R # Diameter-based rotor Reynolds number\nMtip = 2*pi*RPM/60 * R / speedofsound # Tip Mach number\n\nprintln(\"\"\"\n Vinf: $(round(magVinf, digits=1)) m/s\n RPM: $(RPM)\n Mtip: $(round(Mtip, digits=3))\n ReD: $(round(ReD, digits=0))\n Rec: $(round(Rec, digits=0))\n\"\"\")\n\n\n# NOTE: Modify the variable `AOA` in order to change the angle of attack.\n# `AOAwing` will only change the angle of attack of the wing (while\n# leaving the propellers unaffected), while `AOA` changes the angle of\n# attack of the freestream (affecting both wing and props).\n\n# ----------------- SOLVER PARAMETERS ------------------------------------------\n\n# Aerodynamic solver\nVehicleType = uns.UVLMVehicle # Unsteady solver\n# VehicleType = uns.QVLMVehicle # Quasi-steady solver\nconst_solution = VehicleType==uns.QVLMVehicle # Whether to assume that the\n # solution is constant or not\n# Time parameters\nnrevs = 8 # Number of revolutions in simulation\nnsteps_per_rev = 36 # Time steps per revolution\nnsteps = const_solution ? 2 : nrevs*nsteps_per_rev # Number of time steps\nttot = nsteps/nsteps_per_rev / (RPM/60) # (s) total simulation time\n\n# VPM particle shedding\n# p_per_step = 5 # Sheds per time step\np_per_step = 2\nshed_starting = false # Whether to shed starting vortex (NOTE: starting vortex might make simulation unstable with AOA>8)\nshed_unsteady = false # Whether to shed vorticity from unsteady loading\nunsteady_shedcrit = 0.001 # Shed unsteady loading whenever circulation\n # fluctuates by more than this ratio\ntreat_wake = true # Treat wake to avoid instabilities\nmax_particles = 1 # Maximum number of particles\nmax_particles += add_rotors * (nrotors*((2*n_rotor+1)*B)*nsteps*p_per_step)\nmax_particles += add_wing * (nsteps+1)*(2*n_wing*(p_per_step+1) + p_per_step)\n\n# Regularization\nsigma_vlm_surf = b/200 # VLM-on-VPM smoothing radius (σLBV of wing)\nsigma_rotor_surf= R/80 # Rotor-on-VPM smoothing radius (σ of rotor)\nlambda_vpm = 2.125 # VPM core overlap\n # VPM smoothing radius (σ of wakes)\nsigma_vpm_overwrite = lambda_vpm * 2*pi*R/(nsteps_per_rev*p_per_step)\n\n# Rotor solver\nvlm_rlx = 0.3 # VLM relaxation <-- this also applied to rotors\nhubtiploss_correction = ( (0.75, 10, 0.5, 0.05), (1, 1, 1, 1.0) ) # Hub/tip correction\n# VPM solver\n# vpm_integration = vpm.rungekutta3 # VPM temporal integration scheme\nvpm_integration = vpm.euler\n\nvpm_viscous = vpm.Inviscid() # VPM viscous diffusion scheme\n # Uncomment this to make it viscous\n# vpm_viscous = vpm.CoreSpreading(-1, -1, vpm.zeta_fmm; beta=100.0, itmax=20, tol=1e-1)\n\nvpm_SFS = vpm.SFS_none # VPM LES subfilter-scale model\n# vpm_SFS = vpm.DynamicSFS(vpm.Estr_fmm, vpm.pseudo3level_positive;\n # alpha=0.999, maxC=1.0,\n # clippings=[vpm.clipping_backscatter])\n\n# NOTE: By default we make this simulation inviscid since at such high Reynolds\n# number the viscous effects in the wake are actually negligible.\n# Notice that while viscous diffusion is negligible, turbulent diffusion\n# is important and non-negigible, so we have activated the subfilter-scale\n# (SFS) model.\n\nif VehicleType == uns.QVLMVehicle\n # Mute warnings regarding potential colinear vortex filaments. This is\n # needed since the quasi-steady solver will probe induced velocities at the\n # lifting line of the blade\n uns.vlm.VLMSolver._mute_warning(true)\nend\n\nprintln(\"\"\"\n Resolving wake for $(round(ttot*magVinf/b, digits=1)) span distances\n\"\"\")\n\n\n\n\n\n# ----------------- ACTUATOR SURFACE MODEL PARAMETERS (WING) -------------------\n\n# ---------- Vortex sheet parameters ---------------\nvlm_vortexsheet = true # Spread wing circulation as a vortex sheet (activates the ASM)\nvlm_vortexsheet_overlap = 2.125/10 # Particle overlap in vortex sheet\nvlm_vortexsheet_distribution = uns.g_pressure # Distribution of the vortex sheet\n\nvlm_vortexsheet_sigma_tbv = thickness_w*(b/ar) / 128 # Smoothing radius of trailing bound vorticity, σTBV for VLM-on-VPM\n\nvlm_vortexsheet_maxstaticparticle = 10^6 # Particles to preallocate for vortex sheet\n\nif add_wing && vlm_vortexsheet\n max_particles += vlm_vortexsheet_maxstaticparticle\nend\n\n\n# ---------- Force calculation parameters ----------\nKJforce_type = \"regular\" # KJ force evaluated at middle of bound vortices\n# KJforce_type = \"averaged\" # KJ force evaluated at average vortex sheet\n# KJforce_type = \"weighted\" # KJ force evaluated at strength-weighted vortex sheet\n\ninclude_trailingboundvortex = false # Include trailing bound vortices in force calculations\n\ninclude_freevortices = false # Include free vortices in force calculation\ninclude_freevortices_TBVs = false # Include trailing bound vortex in free-vortex force\n\ninclude_unsteadyforce = true # Include unsteady force\nadd_unsteadyforce = false # Whether to add the unsteady force to Ftot or to simply output it\n\ninclude_parasiticdrag = true # Include parasitic-drag force\nadd_skinfriction = true # If false, the parasitic drag is purely form, meaning no skin friction\ncalc_cd_from_cl = true # Whether to calculate cd from cl or effective AOA\n# calc_cd_from_cl = false\n\n# NOTE: We use a polar at a low Reynolds number (100k as opposed to 600k from\n# the experiment) as this particular polar better resembles the drag of\n# the tripped airfoil used in the experiment\nwing_polar_file = \"xf-n64015a-il-100000-n5.csv\" # Airfoil polar for parasitic drag (from airfoiltools.com)\n\n\nif include_freevortices && Threads.nthreads()==1\n @warn(\"Free-vortex force calculation requested, but Julia was initiated\"*\n \" with only one CPU thread. This will be extremely slow!\"*\n \" Initate Julia with `-t num` where num is the number of cores\"*\n \" availabe to speed up the computation.\")\nend\n\n\n\n\n\n# ----------------- WAKE TREATMENT ---------------------------------------------\n\nwake_treatments = []\n\n# Remove particles by particle strength: remove particles neglibly weak, remove\n# particles potentially blown up\nrmv_strngth = 2.0 * magVinf*(b/ar)/2 * magVinf*ttot/nsteps/p_per_step # Reference strength (maxCL=2.0)\nminmaxGamma = rmv_strngth*[0.0001, 10.0] # Strength bounds (removes particles outside of these bounds)\nwake_treatment_strength = uns.remove_particles_strength( minmaxGamma[1]^2, minmaxGamma[2]^2; every_nsteps=1)\n\nif treat_wake\n push!(wake_treatments, wake_treatment_strength)\nend\n\n\n\n\n\n# ----------------- 1) VEHICLE DEFINITION --------------------------------------\n\n# -------- Generate components\nprintln(\"Generating geometry...\")\n\n# Generate wing\nwing = vlm.simpleWing(b, ar, tr, twist_root, lambda, gamma;\n twist_tip=twist_tip, n=n_wing, r=r_wing);\n\n# Pitch wing to its angle of attack\nO = [0.0, 0.0, 0.0] # New position\nOaxis = uns.gt.rotation_matrix2(0, -AOAwing, 0) # New orientation\nvlm.setcoordsystem(wing, O, Oaxis)\n\n# Generate rotors\nrotors = vlm.Rotor[]\nfor ri in 1:nrotors\n\n # Generate rotor\n rotor = uns.generate_rotor(rotor_file;\n pitch=pitch,\n n=n_rotor, CW=CWs[ri], blade_r=r_rotor,\n altReD=[RPM, J, mu/rho],\n xfoil=xfoil,\n ncrit=ncrit,\n data_path=data_path,\n read_polar=read_polar,\n verbose=true,\n verbose_xfoil=false,\n plot_disc=false\n );\n\n # Simulate only one rotor if the wing is not in the simulation\n if !add_wing\n push!(rotors, rotor)\n break\n end\n\n # Determine position along wing LE\n y = spanpos[ri]*b/2\n x = abs(y)*tand(lambda) + xpos[ri]*b/ar\n z = abs(y)*tand(gamma) + zpos[ri]*b/ar\n\n # Account for angle of attack of wing\n nrm = sqrt(x^2 + z^2)\n x = (x==0 ? 1 : sign(x))*nrm*cosd(AOAwing)\n z = -(z==0 ? 1 : sign(z))*nrm*sind(AOAwing)\n\n # Translate rotor to its position along wing\n O_r = [x, y, z] # New position\n Oaxis_r = uns.gt.rotation_matrix2(0, 0, 0) # New orientation\n vlm.setcoordsystem(rotor, O_r, Oaxis_r; user=true)\n\n push!(rotors, rotor)\nend\n\n\n# -------- Generate vehicle\nprintln(\"Generating vehicle...\")\n\n# System of all FLOWVLM objects\nsystem = vlm.WingSystem()\n\nif add_wing\n vlm.addwing(system, \"Wing\", wing)\nend\n\nif add_rotors\n for (ri, rotor) in enumerate(rotors)\n vlm.addwing(system, \"Rotor$(ri)\", rotor)\n end\nend\n\n# System solved through VLM solver\nvlm_system = vlm.WingSystem()\nadd_wing ? vlm.addwing(vlm_system, \"Wing\", wing) : nothing\n\n# Systems of rotors\nrotor_systems = add_rotors ? (rotors, ) : NTuple{0, Array{vlm.Rotor, 1}}()\n\n# System that will shed a VPM wake\nwake_system = vlm.WingSystem() # System that will shed a VPM wake\nadd_wing ? vlm.addwing(wake_system, \"Wing\", wing) : nothing\n # NOTE: Do NOT include rotor when using the quasi-steady solver\nif VehicleType != uns.QVLMVehicle && add_rotors\n for (ri, rotor) in enumerate(rotors)\n vlm.addwing(wake_system, \"Rotor$(ri)\", rotor)\n end\nend\n\n# Pitch vehicle to its angle of attack (0 in this case since we have tilted the freestream instead)\nO = [0.0, 0.0, 0.0] # New position\nOaxis = uns.gt.rotation_matrix2(0, 0, 0) # New orientation\nvlm.setcoordsystem(system, O, Oaxis)\n\nvehicle = VehicleType( system;\n vlm_system=vlm_system,\n rotor_systems=rotor_systems,\n wake_system=wake_system\n );\n\n\n\n\n\n\n# ------------- 2) MANEUVER DEFINITION -----------------------------------------\n# Non-dimensional translational velocity of vehicle over time\nVvehicle(t) = [-1, 0, 0] # <---- Vehicle is traveling in the -x direction\n\n# Angle of the vehicle over time\nanglevehicle(t) = zeros(3)\n\n# RPM control input over time (RPM over `RPMref`)\nRPMcontrol(t) = 1.0\n\nangles = () # Angle of each tilting system (none)\nRPMs = add_rotors ? (RPMcontrol, ) : () # RPM of each rotor system\n\nmaneuver = uns.KinematicManeuver(angles, RPMs, Vvehicle, anglevehicle)\n\n\n\n\n\n\n# ------------- 3) SIMULATION DEFINITION ---------------------------------------\n\nVref = 0.0 # Reference velocity to scale maneuver by\nRPMref = RPM # Reference RPM to scale maneuver by\nVinit = Vref*Vvehicle(0) # Initial vehicle velocity\nWinit = pi/180*(anglevehicle(1e-6) - anglevehicle(0))/(1e-6*ttot) # Initial angular velocity\n\nsimulation = uns.Simulation(vehicle, maneuver, Vref, RPMref, ttot;\n Vinit=Vinit, Winit=Winit);\n\n\n\n\n\n# ------------- *) AERODYNAMIC FORCES ------------------------------------------\n# Here we define the different components of aerodynamic of force that we desire\n# to capture with the wing using the actuator surface model\n\nforces = []\n\n# Calculate Kutta-Joukowski force\nkuttajoukowski = uns.generate_aerodynamicforce_kuttajoukowski(KJforce_type,\n sigma_vlm_surf, sigma_rotor_surf,\n vlm_vortexsheet, vlm_vortexsheet_overlap,\n vlm_vortexsheet_distribution,\n vlm_vortexsheet_sigma_tbv;\n vehicle=vehicle)\npush!(forces, kuttajoukowski)\n\n# Free-vortex force\nif include_freevortices\n freevortices = uns.generate_calc_aerodynamicforce_freevortices(\n vlm_vortexsheet_maxstaticparticle,\n sigma_vlm_surf,\n vlm_vortexsheet,\n vlm_vortexsheet_overlap,\n vlm_vortexsheet_distribution,\n vlm_vortexsheet_sigma_tbv;\n Ffv=uns.Ffv_direct,\n include_TBVs=include_freevortices_TBVs\n )\n push!(forces, freevortices)\nend\n\n# Force due to unsteady circulation\nif include_unsteadyforce\n unsteady(args...; optargs...) = uns.calc_aerodynamicforce_unsteady(args...;\n add_to_Ftot=add_unsteadyforce, optargs...)\n\n push!(forces, unsteady)\nend\n\n# Parasatic-drag force (form drag and skin friction)\nif include_parasiticdrag\n parasiticdrag = uns.generate_aerodynamicforce_parasiticdrag(\n wing_polar_file;\n read_path=joinpath(data_path, \"airfoils\"),\n calc_cd_from_cl=calc_cd_from_cl,\n add_skinfriction=add_skinfriction,\n Mach=speedofsound!=nothing ? magVinf/speedofsound : nothing\n )\n\n push!(forces, parasiticdrag)\nend\n\n\n# Stitch all the forces into one function\nfunction calc_aerodynamicforce_fun(vlm_system, args...; per_unit_span=false, optargs...)\n\n # Delete any previous force field\n fieldname = per_unit_span ? \"ftot\" : \"Ftot\"\n if fieldname in keys(vlm_system.sol)\n pop!(vlm_system.sol, fieldname)\n end\n\n Ftot = nothing\n\n for (fi, force) in enumerate(forces)\n Ftot = force(vlm_system, args...; per_unit_span=per_unit_span, optargs...)\n end\n\n return Ftot\nend\n\n\n\n\n\n\n# ------------- 4) MONITORS DEFINITIONS ----------------------------------------\n\n# Generate wing monitor\nL_dir = [-sind(AOA), 0, cosd(AOA)] # Direction of lift\nD_dir = [ cosd(AOA), 0, sind(AOA)] # Direction of drag\n\nmonitor_wing = uns.generate_monitor_wing(wing, Vinf, b, ar,\n rho, qinf, nsteps;\n calc_aerodynamicforce_fun=calc_aerodynamicforce_fun,\n include_trailingboundvortex=include_trailingboundvortex,\n L_dir=L_dir,\n D_dir=D_dir,\n save_path=save_path,\n run_name=run_name*\"-wing\",\n figname=\"wing monitor\",\n )\n\n# Generate rotors monitor\nmonitor_rotors = uns.generate_monitor_rotors(rotors, J, rho, RPM, nsteps;\n t_scale=RPM/60, # Scaling factor for time in plots\n t_lbl=\"Revolutions\", # Label for time axis\n save_path=save_path,\n run_name=run_name*\"-rotors\",\n figname=\"rotors monitor\",\n )\n\n# Generate monitor of flow enstrophy (indicates numerical stability)\nmonitor_enstrophy = uns.generate_monitor_enstrophy(;\n save_path=save_path,\n run_name=run_name,\n figname=\"enstrophy monitor\"\n )\n\n# Generate monitor of SFS model coefficient Cd\nmonitor_Cd = uns.generate_monitor_Cd(; save_path=save_path,\n run_name=run_name,\n figname=\"Cd monitor\"\n )\n\n\n# Concatenate monitors\nall_monitors = [monitor_enstrophy, monitor_Cd]\n\nadd_wing ? push!(all_monitors, monitor_wing) : nothing\nadd_rotors ? push!(all_monitors, monitor_rotors) : nothing\n\nmonitors = uns.concatenate(all_monitors...)\n\n# Concatenate user-defined runtime function\nextra_runtime_function = uns.concatenate(monitors, wake_treatments...)\n\n\n\n# ------------- 5) RUN SIMULATION ----------------------------------------------\nprintln(\"Running simulation...\")\n\n\n# Run simulation\nuns.run_simulation(simulation, nsteps;\n\n # ----- SIMULATION OPTIONS -------------\n Vinf=Vinf,\n rho=rho, mu=mu, sound_spd=speedofsound,\n\n # ----- SOLVERS OPTIONS ----------------\n vpm_integration=vpm_integration,\n vpm_viscous=vpm_viscous,\n vpm_SFS=vpm_SFS,\n\n p_per_step=p_per_step,\n max_particles=max_particles,\n\n sigma_vpm_overwrite=sigma_vpm_overwrite,\n sigma_rotor_surf=sigma_rotor_surf,\n sigma_vlm_surf=sigma_vlm_surf,\n\n vlm_rlx=vlm_rlx,\n vlm_vortexsheet=vlm_vortexsheet,\n vlm_vortexsheet_overlap=vlm_vortexsheet_overlap,\n vlm_vortexsheet_distribution=vlm_vortexsheet_distribution,\n vlm_vortexsheet_sigma_tbv=vlm_vortexsheet_sigma_tbv,\n max_static_particles=vlm_vortexsheet_maxstaticparticle,\n\n hubtiploss_correction=hubtiploss_correction,\n\n shed_starting=shed_starting,\n shed_unsteady=shed_unsteady,\n unsteady_shedcrit=unsteady_shedcrit,\n\n extra_runtime_function=extra_runtime_function,\n\n # ----- OUTPUT OPTIONS ------------------\n save_path=save_path,\n run_name=run_name,\n prompt=prompt,\n save_wopwopin=false, # <--- Generates input files for PSU-WOPWOP noise analysis if true\n\n );\n\n\n\n\n\n\n# ----------------- 6) VISUALIZATION -------------------------------------------\nif paraview\n println(\"Calling Paraview...\")\n\n # Files to open in Paraview\n files = joinpath(save_path, run_name*\"_pfield...xmf;\")\n\n if add_rotors\n for ri in 1:nrotors\n for bi in 1:B\n global files *= run_name*\"_Rotor$(ri)_Blade$(bi)_loft...vtk;\"\n end\n end\n end\n\n if add_wing\n files *= run_name*\"_Wing_vlm...vtk;\"\n end\n\n # Call Paraview\n run(`paraview --data=$(files)`)\n\nend","category":"page"},{"location":"examples/prowim-aero/","page":"Prop-on-Wing Interactions","title":"Prop-on-Wing Interactions","text":"\n Low fidelity run time: 13 minutes a Dell Precision 7760 laptop.
\n Mid-low fidelity run time: 25 minutes a Dell Precision 7760 laptop.
\n Mid-high fidelity run time: 70 minutes a Dell Precision 7760 laptop.
\n High fidelity runtime: ~2 days on a 16-core AMD EPYC 7302 processor.\n
\n

","category":"page"},{"location":"examples/prowim-aero/","page":"Prop-on-Wing Interactions","title":"Prop-on-Wing Interactions","text":"
\n

\n Mid-High Fidelity\n
\n \"Pic\n



\n High Fidelity\n
\n \"Pic\n


\n
","category":"page"},{"location":"examples/prowim-aero/","page":"Prop-on-Wing Interactions","title":"Prop-on-Wing Interactions","text":"The favorable comparison with the experiment at alpha=0^circ and 4^circ confirms that ASM accurately predicts prop-on-wing interactions up to a moderate angle of attack. At alpha=10^circ we suspect that the wing is mildly stalled in the experiment, leading to a larger discrepancy (further discussed in Alvarez' Dissertation[1] and Alvarez & Ning, 2023[2]).","category":"page"},{"location":"examples/prowim-aero/","page":"Prop-on-Wing Interactions","title":"Prop-on-Wing Interactions","text":"info: Source file\nFull example available under examples/prowim/.","category":"page"},{"location":"examples/prowim-aero/","page":"Prop-on-Wing Interactions","title":"Prop-on-Wing Interactions","text":"[1]: E. J. Alvarez (2022), \"Reformulated Vortex Particle Method and Meshless Large Eddy Simulation of Multirotor Aircraft,\" Doctoral Dissertation, Brigham Young University. [VIDEO] [PDF]","category":"page"},{"location":"examples/prowim-aero/","page":"Prop-on-Wing Interactions","title":"Prop-on-Wing Interactions","text":"[2]: E. J. Alvarez and A. Ning (2023), \"Meshless Large-Eddy Simulation of Propeller–Wing Interactions with Reformulated Vortex Particle Method,\" Journal of Aircraft. [DOI][PDF]","category":"page"},{"location":"theory/validation/#Validation","page":"Validation","title":"Validation","text":"","category":"section"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"The following is a compilation of validation studies found in the literature using FLOWUnsteady.","category":"page"},{"location":"theory/validation/#Wing","page":"Validation","title":"Wing","text":"","category":"section"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Sources: E. J. Alvarez, 2022,[1] and E. J. Alvarez and A. Ning, 2023[2]","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"
\n \"Pic\n \"Pic\n
","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Case: 45^circ swept-back wing at an angle of attack of 42^circ, aspect ratio of 5.0, RAE 101 airfoil section with 12% thickness, no dihedral, twist, nor taper. Freestream velocity of 497mathrmms, corresponding to a chord-based Reynolds number of 17 times 10^6. The high sweep of the wing causes non-negligible spanwise flow. The wing loads reported by Weber and Brebner (experimental) were integrated from pressure-tap measurements, hence the drag reported in this section includes induced and form drag while excluding skin friction drag.","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Results: (Excerpt from E. J. Alvarez and A. Ning, 2022[2]) \"Fig. 9 shows the loading distribution and integrated lift and drag across AOA predicted with the actuator surface model (ASM), compared to the experimental measurements. The loading distribution shows satisfactory agreement with the experiment, validating that both the circulation solver and the force calculation... are accurate for predicting not only lift but also drag distribution across the span. The integrated lift and drag (Fig. 9, bottom) show excellent agreement with the experiment from 0^circ to 105^circ. We expect this to be the case only for mild AOAs before approaching stall conditions since our ASM does not capture the mechanisms of flow separation. Thus, through this swept-wing case, we gain confidence that our ASM yields accurate predictions in conditions with spanwise flow up to a moderate AOA.\"","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"
\n \"Pic\n
","category":"page"},{"location":"theory/validation/#Rotor","page":"Validation","title":"Rotor","text":"","category":"section"},{"location":"theory/validation/#Hover-Case:-Aero","page":"Validation","title":"Hover Case: Aero","text":"","category":"section"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Source: E. J. Alvarez, 2022[1], and E. J. Alvarez and A. Ning, 2022[6]","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"
\n \"Pic\n
","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Case: DJI 9443 rotor in hover at 5400 RPM. This is a two-bladed rotor with a diameter of 9.4 inches. Validation case at Mach number of 0.2, mathrmRe_c = 6 times 10^4, and mathrmRe_07D = 7 times 10^5. Thrust and blade loading are compared to experiment and mesh-based CFD. Computational time is benchmarked against conventional mesh-based CFD.","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Results: (Excerpt from E. J. Alvarez and A. Ning, 2020[6]) \"...the VPM simulation shows excellent agreement with the experiment, predicting a mean C_T value within 2% of the experimental mean value... Our meshless LES appears to be two orders of magnitude faster than a mesh-based LES with similar fidelity, while being one order of magnitude faster than a low-fidelity URANS simulation and three orders of magnitude than high-fidelity DES.\"","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"\n
\n \"Pic\n \"Pic\n

\n \"Pic\n
\n\n
","category":"page"},{"location":"theory/validation/#Hover-Case:-Acoustics","page":"Validation","title":"Hover Case: Acoustics","text":"","category":"section"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Source: E. J. Alvarez, A. Schenk, T. Critchfield, and A. Ning, 2020[7]","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Case: Same DJI 9443 case in hover. FLOWUnsteady predictions (VPM) are compared against experiment and URANS (STAR-CCM+) and DES (OVERFLOW2).","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"\n
\n \"Pic\n

\n \"Pic\n
\n\n
","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"NOTE: The broadband results in E. J. Alvarez, A. Schenk, T. Critchfield, and A. Ning, 2020[7] contained a bug that ended up evaluating the microphone array in the wrong plane, which led to a large discrepancy in A-weighted OASPL. For updated results, see the Rotor in Hover tutorial.","category":"page"},{"location":"theory/validation/#Forward-Flight-Case","page":"Validation","title":"Forward Flight Case","text":"","category":"section"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Source: R. M. Erhard and J. J. Alonso, 2022[8]","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"
\n \"Pic\n
","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Case: TUD F29 rotor in forward flight at an incidence angle (edgewise flow). This is a four-bladed rotor. Thrust and power predicted by FLOWUnsteady (VPM) was compared to experiment and low-fidelity methods at multiple incidence angles alpha and advance ratios J.","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Results: Good agreement between FLOWUnsteady and experiment for incidence angles up to alpha=60^circ across advance ratio.","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"\n
\n \"Pic\n
\n\n
","category":"page"},{"location":"theory/validation/#Wind-Turbine","page":"Validation","title":"Wind Turbine","text":"","category":"section"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Source: J. Mehr, E. J. Alvarez, and A. Ning, 2022[5]","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"
\n \"Pic\n
","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Case: Test series \"H\" from UAE study at US Department of Energy. Sweep on tip speed ratio lambda = fracomega Ru_infty.","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Results: (Excerpt from J. Mehr, E. J. Alvarez, and A. Ning, 2020[5]) \"The torque coefficient outputs are also within 10% for tip speed ratios above, and within 25% for tip speed ratios under, lambda = 20; also notice that the absolute magnitudes of the torque coefficient are very small at low tip speed ratios, assuaging any concerns about the higher relative errors at those operational states.\"","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"\n
\n \"Pic\n
\n\n
","category":"page"},{"location":"theory/validation/#Propeller","page":"Validation","title":"Propeller","text":"","category":"section"},{"location":"theory/validation/#APC-10x7-Case","page":"Validation","title":"APC 10x7 Case","text":"","category":"section"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Source: E. J. Alvarez and A. Ning, 2020[3]","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"
\n \"Pic\n
","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Case: APC 10x7E propeller (2 blades, 10'' diameter, solidity 0.1) at a tip Mach number of 0.36, mathrmRe_c = 62 times 10^4, and mathrmRe_D = 65 times 10^5. Sweep on advance ratio J = fracu_inftyn d.","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Results: (Excerpt from E. J. Alvarez and A. Ning, 2020[3]) \"... it is confirmed that the VPM propeller model is valid... across low and moderately high advance ratios.\"","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"\n
\n \"Pic\n
\n\n
","category":"page"},{"location":"theory/validation/#Beaver-Case","page":"Validation","title":"Beaver Case","text":"","category":"section"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Source: E. J. Alvarez, 2022[1], and E. J. Alvarez and A. Ning, 2023[2]","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"
\n \"Vid\n
","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Case: Beaver propeller (4 blades, 0.237 m diameter) at mathrmRe_07D = 18times 10^6. Extensive validation with predicted thrust, torque, efficiency, blade loading, and flow field compared to experimental measurements.","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"\n
\n Sweep of advance ratio
\n \"Pic\n\n
\n Sweep of incidence angle
\n \"Pic\n\n

\n Blade loading
\n \"Pic\n\n
\n Wake structure
\n \"Pic\n\n

\n Flow field
\n \"Pic\n
\n \"Pic\n\n
\n \"Vid\n \"Vid\n
\n\n
","category":"page"},{"location":"theory/validation/#Rotor-Rotor-Interactions","page":"Validation","title":"Rotor-Rotor Interactions","text":"","category":"section"},{"location":"theory/validation/#Side-by-Side-Rotors-in-Hover","page":"Validation","title":"Side-by-Side Rotors in Hover","text":"","category":"section"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Source: E. J. Alvarez and A. Ning, 2020[3]","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"
\n \"Pic\n
","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Case: Two side-by-side DJI rotors in hover. Two-bladed rotors with a diameter of 9.4 inches. Test at 4860 RPM, tip Mach number of 0.18, mathrmRe_c = 62times 10^4, and mathrmRe_07D = 65times 10^5. Aerodynamic interactions as the tip-to-tip spacing s between rotors is decreased.","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Results: FLOWUnsteady accurately captures both the drop in thrust and the increase in fluctuations as rotors are brought closer together.","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"\n
\n \"Pic\n
\n\n
","category":"page"},{"location":"theory/validation/#Side-by-Side-and-Tandem-Propeller","page":"Validation","title":"Side-by-Side and Tandem Propeller","text":"","category":"section"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Source: R. M. Erhard and J. J. Alonso, 2022[8]","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"
\n \"Pic\n
","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Case: Two TUD F29 propellers in side-by-side and tandem configurations at an multile incidence angles (edgewise flow). This is a four-bladed rotor. Thrust and power predicted by FLOWUnsteady (VPM) was compared to experiment and low-fidelity methods at multiple incidence angles alpha and advance ratios J.","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Results: Good agreement between FLOWUnsteady and experiment for incidence angles up to alpha=60^circ across advance ratio.","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"\n
\n \"Pic\n \"Pic\n \"Pic\n \"Pic\n
\n\n
","category":"page"},{"location":"theory/validation/#Rotor-Wing-Interactions","page":"Validation","title":"Rotor-Wing Interactions","text":"","category":"section"},{"location":"theory/validation/#Tailplane-w/-Tip-Mounted-Propellers","page":"Validation","title":"Tailplane w/ Tip-Mounted Propellers","text":"","category":"section"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Source: E. J. Alvarez, 2022[1], and E. J. Alvarez and A. Ning, 2023[2]","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"
\n \"Pic\n
","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Case: Horizontal stabilizer (tailplane) with tip-mounted Beaver propellers. Wing with low aspect ratio (bc=27), symmetric NACA 64_2-mathrmA015 profile, and elevator flap. Test at advance ratio J of 0.8 and inboard-up propeller rotation at a thrust setting of C_T = 00935. Flap deflection captured in the actuator surface model (ASM) through an equivalent twist. Effects of wake impingement on wing loading predicted by FLOWUnsteady are compared to experiment.","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"\n
\n Flat wing ($\\alpha = 0^\\circ$, $\\delta_e=0^\\circ$)
\n \"Pic\n\n


\n Lift augmentation
\n \"Pic\n \"Pic\n\n


\n Wing wake and Streamtube
\n \"Pic\n \"Pic\n\n


\n Effects of swirl direction
\n \"Pic\n\n


\n Strong impingement
\n \"Pic\n
\n\n
","category":"page"},{"location":"theory/validation/#Blown-Wing","page":"Validation","title":"Blown Wing","text":"","category":"section"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Source: E. J. Alvarez, 2022[1], and E. J. Alvarez and A. Ning, 2023[2]","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"
\n \"Pic\n
","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Case: Straight wing with Beaver propellers mounted mid-span. Wing of aspect ratio bc=533, symmetric NACA 64_2-mathrmA015 profile. Test at advance ratio J of 0.85 and inboard-up propeller rotation at a thrust setting of C_T = 0121. Effects of wake impingement on wing loading predicted by FLOWUnsteady are compared to experiment.","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"
\n \"Pic\n \"Pic\n
\n\n
","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"[1]: E. J. Alvarez (2022), \"Reformulated Vortex Particle Method and Meshless Large Eddy Simulation of Multirotor Aircraft,\" Doctoral Dissertation, Brigham Young University. [PDF]","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"[2]: E. J. Alvarez & A. Ning (2023), \"Meshless Large Eddy Simulation of Propeller-Wing Interactions Through the Reformulated Vortex Particle Method,\" Journal of Aircraft. [DOI] [PDF]","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"[3]: E. J. Alvarez & A. Ning (2020), \"High-Fidelity Modeling of Multirotor Aerodynamic Interactions for Aircraft Design,\" AIAA Journal. [DOI] [PDF]","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"[5]: J. Mehr, E. J. Alvarez, & A. Ning (2022), \"Interactional Aerodynamics Analysis of a Multi-Rotor Energy Kite,\" (in review).","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"[6]: E. J. Alvarez & A. Ning (2023), \"Stable Vortex Particle Method Formulation for Meshless Large-Eddy Simulation,\" AIAA Journal. [DOI] [PDF]","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"[7]: E. J. Alvarez, A. Schenk, T. Critchfield, and A. Ning (2020), “Rotor-on-Rotor Aeroacoustic Interactions of Multirotor in Hover,” VFS 76th Forum. [PDF]","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"[8]: R. M. Erhard and J. J. Alonso (2022), \"Comparison of Propeller Wake Models for Distributed Electric Propulsion and eVTOL Aircraft in Complex Flow Conditions,\" AIAA SciTech Forum. [PDF]","category":"page"},{"location":"api/flowunsteady-postprocessing-fdom/#fluid_domain","page":"Fluid Domain","title":"Fluid Domain","text":"","category":"section"},{"location":"api/flowunsteady-postprocessing-fdom/","page":"Fluid Domain","title":"Fluid Domain","text":" FLOWUnsteady.computefluiddomain\n FLOWUnsteady.generate_preprocessing_fluiddomain_pfield","category":"page"},{"location":"api/flowunsteady-postprocessing-fdom/#FLOWUnsteady.computefluiddomain","page":"Fluid Domain","title":"FLOWUnsteady.computefluiddomain","text":"computefluiddomain( pfield::FLOWVPM.ParticleField,\n grids::Array{<:GeometricTools.AbstractGrid};\n optargs...\n )\n\nEvaluate the velocity and vorticity field induced by the particle field pfield at all nodes in a set of grids grids. The fields are added as solution fields U and W in each grid. The analytic Jacobian of the velocity field can also be saved using the optional argument add_J=true.\n\nOPTIONAL ARGUMENTS\n\nProcessing options\n\nadd_J::Bool=false : Add the solution fields J1, J2, and J3 to each grid, where Ji[j]=dUi/dxj.\nadd_Uinf::Bool=false : It evaluates and adds the uniform freestream to the U field.\nadd_Wapprox::Bool=false : It evaluates and saves the RBF-approximated vorticity field under the field Wapprox.\nzeta::Function=FLOWVPM.zeta_fmm : Method for evaluating RBF-approximated vorticity (used only if add_Wapprox==true).\nscale_sigma::Real=1.0 : It rescales the smoothing radius of each particle by this factor before evaluating the particle field.\n\nOutput options\n\nsave_path::String : If used, it will save the grids as XDMF files under this path.\nfile_pref::String : Prefix for XDMF files.\ngrid_names::String : Name of each grid for XDMF files. If not given, it will generate their names automatically.\nnum::Int : If given, the name of the XDMF files will be \"$(file_pref)$(grid_names[i]).$(num).vtk\"\nverbose::Bool=true : Activate/deactivate verbose.\nv_lvl::Int=0 : Indentation level for printing verbose.\n\nNOTE: The solution fields U, W, and Jacobian do not include the freestream field, but rather they only include the fields induced by the particles. To add the freestream to U, use the optional argument add_Uinf=true.\n\n\n\n\n\ncomputefluiddomain(pfield::vpm.ParticleField,\n nums::Vector{Int}, read_path::String, file_pref::String,\n grids;\n origin=nothing,\n orientation=nothing,\n other_read_paths=[],\n other_file_prefs=[],\n userfunction_pfield=(pfield, num, grids)->nothing,\n optargs...\n )\n\nEvaluate the fluid domain at each time step in nums that is induced by a particle field saved under read_path. file_pref indicates the prefix of the .h5 files to read.\n\nTo translate and re-orient the grids at each time step, the user can pass the new origin vector and orientation matrix through the functions origin and orientation, which will be called as origin(pfield, num) and orientation(pfield, num) at each time step.\n\npfield is a place holder for loading the particles that are read, so the user must make sure that sufficient memory has been preallocated to hold the number of particles of each time step that will be read, plus the number of nodes in the grids. The fluid domain will be evaluated using the UJ and FMM configuration of the given pfield particle field.\n\nTo read and add more than one particle field at each time step, pass a list of paths and prefixes through other_read_paths and other_file_prefs. This is useful for reading and incluiding a set of static particles, for example.\n\nGive it a function userfunction_pfield to pre-process the resulting particle field before evaluating the fluid domain (e.g., remove particles, resize core sizes, etc).\n\n\n\n\n\ncomputefluiddomain(maxparticles::Int, args...;\n UJ::Function=vpm.UJ_fmm,\n fmm::FLOWVPM.FMM=vpm.FMM(; p=4, ncrit=50, theta=0.4, phi=0.5),\n pfield_optargs=[]\n optargs...)\n\nLike the other computefluiddomain(args...; optargs...) methods, but automatically pre-allocating and initializing the particle field with the given maximum number of particles, UJ evaluation method, and FMM configuration (if FMM is used by UJ).\n\nUse pfield_optargs to pass any additional optional arguments to the particle field constructor.\n\n\n\n\n\ncomputefluiddomain(P_min, P_max, NDIVS, args...;\n spacetransform=nothing,\n O=zeros(3), Oaxis=Float64[i==j for i in 1:3, j in 1:3],\n optargs...)`\n\nLike the other computefluiddomain(args...; optargs...) methods, but automatically generating a fluid domain grid. The grid is generated as a Cartesian box with minimum and maximum corners P_min and P_max and NDIVS cells.\n\nFor instance, P_min=[-1, -1, -1], P_max=[-1, -1, -1], and NDIVS=[10, 10, 50] will grid the volumetric space between -1 and 1 in all directions, with 10 cells in both the x and y-direction, and 50 cells in the z-direction.\n\nEven though the grid is first generated as a Cartesian grid, this can be transformed into any other structured space through the argument spacetransform, which is a function that takes any vector and returns another vector of the same dimensions. For instance, P_min=[0.5, 0, 0], P_max=[1, 2*pi, 5], NDIVS=[10, 20, 30], spacetransform=GeometricTools.cylindrical3D will generate a cylindrical grid discretizing the radial annulus from 0.5 to 1 with 10 cells, the polar angle from 0 to 360deg with 20 cells, and the axial z-distance from 0 through 5 with 30 cells.\n\nAny number of dimensions can be used, but make sure that P_min, P_max, and NDIVS always have three dimensions and indicate the dimensions that are \"collapsed\" with a 0 in NDIVS. Even though the grid is defined in the Cartesian axes, the origin and orientation of the grid can be specified with the O and Oaxis optional arguments. For instance, P_min=[0, 0, 1], P_max=[2, 3.5, 1], NDIVS=[10, 10, 0] will generate a 2D surface laying in the xy-plane at z=1.0, spanning from (x,y)=(0,0) to (x,y)=(2,3.5). Use O=[0, 0, -1] to move the surface back to the xy-plane at z=0. Use Oaxis=[1 0 0; 0 0 -1; 0 1 0] to re-orient the surface to lay in the zx-plane. The same thing can be achieved with Oaxis=GeometricTools.rotation_matrix2(-90, 0, 0) which generates the rotation matrix corresponding to a -90deg rotation about the x-axis.\n\nNOTE: The order of operation is (1) Cartesian grid generation, (2) space transformation if any, and (3) translation and re-orientation to the given origin and orientation.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-postprocessing-fdom/#FLOWUnsteady.generate_preprocessing_fluiddomain_pfield","page":"Fluid Domain","title":"FLOWUnsteady.generate_preprocessing_fluiddomain_pfield","text":"generate_preprocessing_fluiddomain_pfield(maxsigma, maxmagGamma;\n verbose=true, v_lvl=1)\n\nGenerate function for pre-processing particle fields before generating fluid domain: shrink oversized particles and correct blown-up particles.\n\nPass the output function to FLOWUnsteady.computefluiddomain through the keyword argument userfunction_pfield. For example:\n\npreprocess_pfield = generate_preprocessing_fluiddomain_pfield(maxsigma, maxmagGamma;\n verbose=true, v_lvl=1)\n\ncomputefluiddomain( ... ; userfunction_pfield=preprocess_pfield, ...)\n\n\n\n\n\n","category":"function"},{"location":"installation/windows/#windows","page":"Windows Instructions","title":"Windows Instructions","text":"","category":"section"},{"location":"installation/windows/","page":"Windows Instructions","title":"Windows Instructions","text":"(Tested on Windows 11)","category":"page"},{"location":"installation/windows/#Install-Windows-Subsystem-for-Linux-(WSL)","page":"Windows Instructions","title":"Install Windows Subsystem for Linux (WSL)","text":"","category":"section"},{"location":"installation/windows/","page":"Windows Instructions","title":"Windows Instructions","text":"Follow this guide to setup Ubuntu 22.04: LINK\nIf you run into issues, try the following:\nEnable bash for Windows LINK\nEnable virtualization LINK. For instance, here are instructions specific for a Dell Precision 7760: LINK1 LINK2 (make sure to check \"Hyper-V\")","category":"page"},{"location":"installation/windows/","page":"Windows Instructions","title":"Windows Instructions","text":"To launch WSL, we recommend launching it from the Microsoft Store as opposed to the Programs Menu or the terminal, otherwise Windows' PATH will not be passed onto WSL.","category":"page"},{"location":"installation/windows/#Set-up-Environment","page":"Windows Instructions","title":"Set up Environment","text":"","category":"section"},{"location":"installation/windows/","page":"Windows Instructions","title":"Windows Instructions","text":"Once inside WSL, do the following","category":"page"},{"location":"installation/windows/","page":"Windows Instructions","title":"Windows Instructions","text":"Install system-level packages:\nsudo apt-get update\nsudo apt-get install cmake g++ mpich\nInstall python packages:\nsudo apt-get install python3-pip python3-tk\npip3 install matplotlib mpmath scipy --user\nCreate a folder where to install programs\nmkdir ~/Programs\ncd ~/Programs","category":"page"},{"location":"installation/windows/#Install-Julia","page":"Windows Instructions","title":"Install Julia","text":"","category":"section"},{"location":"installation/windows/","page":"Windows Instructions","title":"Windows Instructions","text":"Download Julia:\nwget -O julia.tar.gz \"https://julialang-s3.julialang.org/bin/linux/x64/1.8/julia-1.8.5-linux-x86_64.tar.gz\"\nDecompress Julia:\ntar -xvf julia.tar.gz -C ~/Programs/\nAdd Julia to user-level path:\nsudo ln -s ~/Programs/julia-1.8.5/bin/julia /usr/local/bin/","category":"page"},{"location":"installation/windows/#Install-ParaView","page":"Windows Instructions","title":"Install ParaView","text":"","category":"section"},{"location":"installation/windows/","page":"Windows Instructions","title":"Windows Instructions","text":"Donwload and install ParaView v5.9.1\nIdentify the location of paraview.exe (most likely, this is C:\\Program Files\\ParaView 5.9.1\\bin\\)\nAdd the path of ParaView (e.g., C:\\Program Files\\ParaView 5.9.1\\bin\\) to the system-level PATH: LINK\nCreate a paraview alias inside WSL typing this in the WSL terminal:\nwhich paraview.exe | xargs -I{} sudo ln -s {} /usr/local/bin/paraview","category":"page"},{"location":"installation/windows/","page":"Windows Instructions","title":"Windows Instructions","text":"info: ParaView 5.10+ on Windows\nParaView versions 5.10 and newer on Windows cannot open XDMF files (like the particle field) from the WSL file system. Please copy them to a Windows file system or use Paraview 5.9.1.","category":"page"},{"location":"installation/windows/","page":"Windows Instructions","title":"Windows Instructions","text":"","category":"page"},{"location":"installation/windows/","page":"Windows Instructions","title":"Windows Instructions","text":"Now you can proceed with the general instructions (you can skip the Julia and ParaView since we already took care of that)","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"\"FLOWUnsteady","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"

\n \n Interactional aerodynamics solver for multirotor aircraft and wind energy\n \n

","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"

\n \n \n \n \n \n \n

","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"FLOWUnsteady is an open-source variable-fidelity framework for unsteady aerodynamics and aeroacoustics based on the reformulated vortex particle method (rVPM). This suite brings together various tools developed by the FLOW Lab at Brigham Young University: Vortex lattice method, strip theory, blade elements, 3D panel method, and rVPM. The suite also integrates an FW-H solver and a BPM code for tonal and broadband prediction of aeroacoustic noise. In the low end of fidelity, simulations are similar to a free-wake method, while in the high end simulations become meshless large eddy simulations.","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"Documentation: flow.byu.edu/FLOWUnsteady\nCode: github.com/byuflowlab/FLOWUnsteady","category":"page"},{"location":"#What-is-the-Reformulated-VPM?","page":"Intro","title":"What is the Reformulated VPM?","text":"","category":"section"},{"location":"","page":"Intro","title":"Intro","text":"The reformulated VPM is a meshless CFD method solving the LES-filtered incompressible Navier-Stokes equations in their vorticity form,","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"

\n \"img\"\n

","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"It uses a Lagrangian (meshless) scheme, which not only avoids the hurdles of mesh generation, but it also conserves vortical structures over long distances with minimal numerical dissipation.","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"The rVPM uses particles to discretize the Navier-Stokes equations, with the particles representing radial basis functions that construct a continuous vorticity/velocity field. The basis functions become the LES filter, providing a variable filter width and spatial adaptation as the particles are convected and stretched by the velocity field. The local evolution of the filter width provides an extra degree of freedom to reinforce conservation laws, which makes the reformulated VPM numerically stable (overcoming the numerical issues that plague the classic VPM).","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"This meshless LES has several advantages over conventional mesh-based CFD. In the absence of a mesh, ","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"the rVPM does not suffer from the numerical dissipation introduced by a mesh\nintegrates over coarser discretizations without losing physical accuracy\nderivatives are calculated analytically rather than approximated through a stencil.","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"Furthermore, rVPM is highly efficient since it uses computational elements only where there is vorticity (rather than meshing the entire space), usually being ~100x faster than conventional mesh-based LES with comparable accuracy.","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"While rVPM is well suited for resolving unbounded flows (wakes), complications arise when attempting to impose boundary conditions (solid boundaries) on the flow. This is because (1) the method is meshless, and (2) boundary conditions must be imposed on the Navier-Stokes equations in the form of vorticity. FLOWUnsteady is a framework designed to introduce solid boundaries into the rVPM using actuator models. Wings and rotors are introduced in the computational domain through actuator line and surface models that use low-fidelity aerodynamic methods (e.g., VLM, lifting line, panels, etc) to compute forces and embed the associated vorticity back into the LES domain.","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"


","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"
\n \n
","category":"page"},{"location":"#Variable-Fidelity","page":"Intro","title":"Variable Fidelity","text":"","category":"section"},{"location":"","page":"Intro","title":"Intro","text":"rVPM considerably reduces engineering time by avoiding the hurdles of mesh generation. Furthermore, since it is not limited by the time-step and stability constraints of conventional mesh-based CFD, rVPM can be used across all levels of fidelity, all in the same framework by simply coarsening or refining the simulation. In the low end of fidelity, simulations are similar to a free-wake method, while in the high end simulations become meshless large eddy simulations. Thus, FLOWUnsteady can be used as a high-fidelity tool that is orders of magnitude faster than mesh-based CFD, or as a variable-fidelity tool for the different stages of design.","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"

\n \"img\"\n

","category":"page"},{"location":"#Capabilities","page":"Intro","title":"Capabilities","text":"","category":"section"},{"location":"","page":"Intro","title":"Intro","text":"Simulation: Tilting wings and rotors • Rotors with variable RPM and variable pitch • Asymmetric and stacked rotors • Maneuvering vehicle with prescribed kinematicsrVPM Solver: Fast-multipole acceleration through ExaFMM • CPU parallelization through OpenMP • Second-order spatial accuracy and third-order RK time integration • Numerically stable by reshaping particles subject to vortex stretching • Subfilter-scale (SFS) model of turbulence associated to vortex stretching • SFS model coefficient computed dynamically or prescribed • Viscous diffusion through core spreadingWing Models: Actuator line model through lifting line + VLM • Actuator surface model through vortex sheet + VLM • Parasitic drag through airfoil lookup tablesRotor Model: Actuator line model through blade elements • Airfoil lookup tables automatically generated through XFOIL • Aeroacoustic noise through FW-H (PSU-WOPWOP) and BPMGeometry: Simple lofts and bodies of revolution through FLOWUnsteady • Import complex geometry from OpenVSPUnder development (🤞coming soon): Advanced actuator surface models through 3D panel method (for ducts, wings, and fuselage) • Unstructured surface grids • Bluff bodies through vortex sheet methodLimitations: Viscous drag and separation is only captured through airfoil lookup tables, without attempting to shed separation wakes • Incompressible flow only (though wave drag can be captured through airfoil lookup tables) • CPU parallelization through OpenMP without support for distributed memory (no MPI, i.e., only single-node runs)Coded in the Julia language for Linux, MacOS, and Windows WSL.","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"More about the models inside FLOWUnsteady:","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"

\n \n \"https://www.nas.nasa.gov/pubs/ams/2022/08-09-22.html\"\n \n

","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"


","category":"page"},{"location":"#Selected-Publications","page":"Intro","title":"Selected Publications","text":"","category":"section"},{"location":"","page":"Intro","title":"Intro","text":"See the following publications for an in-depth dive into the theory and validation:","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"E. J. Alvarez, J. Mehr, & A. Ning (2022), \"FLOWUnsteady: An Interactional Aerodynamics Solver for Multirotor Aircraft and Wind Energy,\" AIAA AVIATION Forum. [VIDEO] [PDF]\nE. J. Alvarez (2022), \"Reformulated Vortex Particle Method and Meshless Large Eddy Simulation of Multirotor Aircraft.,\" Doctoral Dissertation, Brigham Young University. [VIDEO] [PDF]\nE. J. Alvarez & A. Ning (2023), \"Stable Vortex Particle Method Formulation for Meshless Large-Eddy Simulation,\" AIAA Journal. [PDF]","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"


","category":"page"},{"location":"#Examples-and-Tutorials","page":"Intro","title":"Examples and Tutorials","text":"","category":"section"},{"location":"","page":"Intro","title":"Intro","text":"Propeller: [Tutorial] [Validation]","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"
\n \n
","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"Rotor in Hover: [Tutorial] [Validation]","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"
\n \n
","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"Blown Wing: [Tutorial] [Validation]","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"
\n \n
","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"Ducted Fan: [Slides]","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"
\n \n
","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"Airborne-Wind-Energy Aircraft: [Video]","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"

\n \"img\"\n

","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"eVTOL Transition: [Tutorial]","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"Mid-fidelity","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"
\n \n
","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"High-fidelity","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"
\n \n
","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"Aeroacoustic Noise: [Tutorial] [Validation]","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"
\n \n
","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"

\n \"Vid\"\n

","category":"page"},{"location":"#Sponsors","page":"Intro","title":"Sponsors","text":"","category":"section"},{"location":"","page":"Intro","title":"Intro","text":"

\n \"img\"\n


\n

","category":"page"},{"location":"#About","page":"Intro","title":"About","text":"","category":"section"},{"location":"","page":"Intro","title":"Intro","text":"FLOWUnsteady is an open-source project jointly led by the FLOW Lab at Brigham Young University and Whisper Aero. All contributions are welcome.","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"If you find FLOWUnsteady useful in your work, we kindly request that you cite the following paper [URL] [PDF]:","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"Alvarez, E. J., Mehr, J., and Ning, A., “FLOWUnsteady: An Interactional Aerodynamics Solver for Multirotor Aircraft and Wind Energy,” AIAA AVIATION 2022 Forum, Chicago, IL, 2022. DOI:10.2514/6.2022-3218.","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"If you were to encounter any issues or have questions, please first read through the documentation, open/closed issues, and the discussion forum. If the issue still persists, please participate in the discussion forum and/or open a new issue.","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"Developers/contributors : Eduardo J. Alvarez (main), Cibin Joseph, Judd Mehr, Ryan Anderson, Eric Green\nCreated : Sep 2017\nLicense : MIT License","category":"page"},{"location":"examples/blownwing-acoustics/#Acoustic-Solution","page":"Acoustic Solution","title":"Acoustic Solution","text":"","category":"section"},{"location":"api/flowunsteady-monitor/#(4)-Monitors-Definitions","page":"(4) Monitors Definitions","title":"(4) Monitors Definitions","text":"","category":"section"},{"location":"api/flowunsteady-monitor/","page":"(4) Monitors Definitions","title":"(4) Monitors Definitions","text":"A monitor is a function that is passed to FLOWUnsteady.run_simulation as an extra runtime function that is called at every time step. Runtime functions are expected to return a Boolean that indicates the need of stopping the simulation, such that if extra_runtime_function ever returns true, the simulation will immediately be ended.","category":"page"},{"location":"api/flowunsteady-monitor/","page":"(4) Monitors Definitions","title":"(4) Monitors Definitions","text":"Multiple monitors can be concatenated with boolean logic as follows","category":"page"},{"location":"api/flowunsteady-monitor/","page":"(4) Monitors Definitions","title":"(4) Monitors Definitions","text":"import FLOWUnsteady as uns\n\nmonitor_states = uns.generate_monitor_statevariables()\nmonitor_enstrophy = uns.generate_monitor_enstrophy()\n\nmonitors(args...; optargs...) = monitor_states(args...; optargs...) || monitor_enstrophy(args...; optargs...)","category":"page"},{"location":"api/flowunsteady-monitor/","page":"(4) Monitors Definitions","title":"(4) Monitors Definitions","text":"Then pass the monitor to the simulation as","category":"page"},{"location":"api/flowunsteady-monitor/","page":"(4) Monitors Definitions","title":"(4) Monitors Definitions","text":"uns.run_simulation(sim, nsteps; extra_runtime_function=monitors, ...)","category":"page"},{"location":"api/flowunsteady-monitor/","page":"(4) Monitors Definitions","title":"(4) Monitors Definitions","text":"compat: Monitor concatenation\nFLOWUnsteady facilitates the concatenation of monitors through the function FLOWUnsteady.concatenate. Using this function, the example above looks like this:monitor_states = uns.generate_monitor_statevariables()\nmonitor_enstrophy = uns.generate_monitor_enstrophy()\n\nallmonitors = [monitor_states, monitor_enstrophy]\n\nmonitors = uns.concatenate(monitors)\n\nuns.run_simulation(sim, nsteps; extra_runtime_function=monitors, ...)","category":"page"},{"location":"api/flowunsteady-monitor/#Monitor-Generators","page":"(4) Monitors Definitions","title":"Monitor Generators","text":"","category":"section"},{"location":"api/flowunsteady-monitor/","page":"(4) Monitors Definitions","title":"(4) Monitors Definitions","text":"The following are functions for generating the monitors that serve most use cases. See the source code of these monitors to get an idea of how to write your own user-defined monitors.","category":"page"},{"location":"api/flowunsteady-monitor/","page":"(4) Monitors Definitions","title":"(4) Monitors Definitions","text":"FLOWUnsteady.generate_monitor_statevariables\nFLOWUnsteady.generate_monitor_wing\nFLOWUnsteady.generate_monitor_rotors\nFLOWUnsteady.generate_monitor_enstrophy\nFLOWUnsteady.generate_monitor_Cd\nFLOWUnsteady.concatenate","category":"page"},{"location":"api/flowunsteady-monitor/#FLOWUnsteady.generate_monitor_statevariables","page":"(4) Monitors Definitions","title":"FLOWUnsteady.generate_monitor_statevariables","text":"generate_monitor_statevariables(; save_path=nothing)\n\nGenerate a monitor plotting the state variables of the vehicle at every time step. The state variables are vehicle velocity, vehicle angular velocity, and vehicle position.\n\nUse save_path to indicate a directory where to save the plots.\n\nHere is an example of this monitor on a vehicle flying a circular path: (Image: image)\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-monitor/#FLOWUnsteady.generate_monitor_wing","page":"(4) Monitors Definitions","title":"FLOWUnsteady.generate_monitor_wing","text":"generate_monitor_wing(wing::Union{vlm.Wing, vlm.WingSystem},\n Vinf::Function, b_ref::Real, ar_ref::Real,\n rho_ref::Real, qinf_ref::Real, nsteps_sim::Int;\n L_dir=[0,0,1], # Direction of lift component\n D_dir=[1,0,0], # Direction of drag component\n calc_aerodynamicforce_fun=FLOWUnsteady.generate_calc_aerodynamicforce())\n\nGenerate a wing monitor computing and plotting the aerodynamic force and wing loading at every time step.\n\nThe aerodynamic force is integrated, decomposed, and reported as overall lift coefficient C_L = fracLfrac12rho u_infty^2 b c and drag coefficient C_D = fracDfrac12rho u_infty^2 b c. The wing loading is reported as the sectional lift and drag coefficients defined as c_ell = fracellfrac12rho u_infty^2 c and c_d = fracdfrac12rho u_infty^2 c, respectively.\n\nThe aerodynamic force is calculated through the function calc_aerodynamicforce_fun, which is a user-defined function. The function can also be automatically generated through, generate_calc_aerodynamicforce which defaults to incluiding the Kutta-Joukowski force, parasitic drag (calculated from a NACA 0012 airfoil polar), and unsteady-circulation force.\n\nb_ref : Reference span length.\nar_ref : Reference aspect ratio, used to calculate the equivalent chord c = fracbmathrmar.\nrho_ref : Reference density.\nqinf_ref : Reference dynamic pressure q_infty = frac12rho u_infty^2.\nnsteps_sim : the number of time steps by the end of the simulation (used for generating the color gradient).\nUse save_path to indicate a directory where to save the plots. If so, it will also generate a CSV file with C_L and C_D.\n\nHere is an example of this monitor: (Image: image)\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-monitor/#FLOWUnsteady.generate_monitor_rotors","page":"(4) Monitors Definitions","title":"FLOWUnsteady.generate_monitor_rotors","text":"generate_monitor_rotors(rotors::Array{vlm.Rotor}, J_ref::Real,\n rho_ref::Real, RPM_ref::Real, nsteps_sim::Int;\n save_path=nothing)\n\nGenerate a rotor monitor plotting the aerodynamic performance and blade loading at every time step.\n\nThe aerodynamic performance consists of thrust coefficient C_T=fracTrho n^2 d^4, torque coefficient C_Q = fracQrho n^2 d^5, and propulsive efficiency eta = fracT u_infty2pi n Q.\n\nJ_ref and rho_ref are the reference advance ratio and air density used for calculating propulsive efficiency and coefficients. The advance ratio used here is defined as J=fracu_inftyn d with n = fracmathrmRPM60.\nRPM_ref is the reference RPM used to estimate the age of the wake.\nnsteps_sim is the number of time steps by the end of the simulation (used for generating the color gradient).\nUse save_path to indicate a directory where to save the plots. If so, it will also generate a CSV file with C_T, C_Q, and eta.\n\n(Image: image)\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-monitor/#FLOWUnsteady.generate_monitor_enstrophy","page":"(4) Monitors Definitions","title":"FLOWUnsteady.generate_monitor_enstrophy","text":"generate_monitor_enstrophy(; save_path=nothing)\n\nGenerate a monitor plotting the global enstrophy of the flow at every time step (computed through the particle field). This is calculated by integrating the local enstrophy defined as ξ = ω⋅ω / 2.\n\nEnstrophy is approximated as 0.5*Σ( Γ𝑝⋅ω(x𝑝) ). This is consistent with Winckelamns' 1995 CTR report, \"Some Progress in LES using the 3-D VPM\".\n\nUse save_path to indicate a directory where to save the plots. If so, it will also generate a CSV file with ξ.\n\nHere is an example of this monitor: (Image: image)\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-monitor/#FLOWUnsteady.generate_monitor_Cd","page":"(4) Monitors Definitions","title":"FLOWUnsteady.generate_monitor_Cd","text":"generate_monitor_Cd(; save_path=nothing)\n\nGenerate a monitor plotting the mean value of the SFS model coefficient C_d across the particle field at every time step. It also plots the ratio of C_d values that were clipped to zero (not included in the mean).\n\nUse save_path to indicate a directory where to save the plots. If so, it will also generate a CSV file with the statistics of C_d (particles whose coefficients have been clipped are ignored).\n\nHere is an example of this monitor: (Image: image)\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-monitor/#FLOWUnsteady.concatenate","page":"(4) Monitors Definitions","title":"FLOWUnsteady.concatenate","text":"concatenate(monitors::Array{Function})\nconcatenate(monitors::NTuple{N, Function})\nconcatenate(monitor1, monitor2, ...)\n\nConcatenates a collection of monitors into a pipeline, returning one monitor of the form\n\nmonitor(args...; optargs...) =\n monitors[1](args...; optargs...) || monitors[2](args...; optargs...) || ...\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-monitor/#Force-Calculators","page":"(4) Monitors Definitions","title":"Force Calculators","text":"","category":"section"},{"location":"api/flowunsteady-monitor/","page":"(4) Monitors Definitions","title":"(4) Monitors Definitions","text":"The following are some possible methods for calculating aerodynamic forces. Generator functions return a function that can be directly passed to FLOWUnsteady.generate_monitor_wing through the keyword argument calc_aerodynamicforce_fun.","category":"page"},{"location":"api/flowunsteady-monitor/","page":"(4) Monitors Definitions","title":"(4) Monitors Definitions","text":"FLOWUnsteady.generate_calc_aerodynamicforce\nFLOWUnsteady.generate_aerodynamicforce_kuttajoukowski\nFLOWUnsteady.generate_aerodynamicforce_parasiticdrag\nFLOWUnsteady.calc_aerodynamicforce_unsteady","category":"page"},{"location":"api/flowunsteady-monitor/#FLOWUnsteady.generate_calc_aerodynamicforce","page":"(4) Monitors Definitions","title":"FLOWUnsteady.generate_calc_aerodynamicforce","text":"generate_calc_aerodynamicforce(; add_parasiticdrag=false,\n add_skinfriction=true,\n airfoilpolar=\"xf-n0012-il-500000-n5.csv\",\n parasiticdrag_args=(),\n )\n\nDefault method for calculating aerodynamic forces.\n\nPass the output of this function to generate_monitor_wing, or use this as an example on how to define your own costumized force calculations.\n\nThis function stitches together the outputs of generate_aerodynamicforce_kuttajoukowski and generate_aerodynamicforce_parasiticdrag, and calc_aerodynamicforce_unsteady. See Alvarez' dissertation, Sec. 6.3.3.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-monitor/#FLOWUnsteady.generate_aerodynamicforce_kuttajoukowski","page":"(4) Monitors Definitions","title":"FLOWUnsteady.generate_aerodynamicforce_kuttajoukowski","text":"generate_aerodynamicforce_kuttajoukowski(KJforce_type::String,\n sigma_vlm_surf, sigma_rotor_surf,\n vlm_vortexsheet,\n vlm_vortexsheet_overlap,\n vlm_vortexsheet_distribution,\n vlm_vortexsheet_sigma_tbv;\n vehicle=nothing\n )\n\nCalculates the aerodynamic force at each element of a VLM system using its current Gamma solution and the Kutta-Joukowski theorem. It saves the force as the field vlm_system.sol[\"Ftot\"]\n\nThis force calculated through the Kutta-Joukowski theorem uses the freestream velocity, kinematic velocity, and wake-induced velocity on each bound vortex. See Alvarez' dissertation, Sec. 6.3.3.\n\nARGUMENTS\n\nvlm_vortexsheet::Bool : If true, the bound vorticity is approximated with and actuator surface model through a vortex sheet. If false, it is approximated with an actuator line model with horseshoe vortex filaments.\nvlm_vortexsheet_overlap::Bool : Target core overlap between particles representing the vortex sheet (if vlm_vortexsheet=true).\nvlm_vortexsheet_distribution::Function : Vorticity distribution in vortex sheet (see g_uniform, g_linear, and g_pressure).\nKJforce_type::String : If vlm_vortexsheet=true, it specifies how to weight the force of each particle in the vortex sheet. If KJforce_type==\"averaged\", the KJ force is a chordwise average of the force experienced by the particles. If KJforce_type==\"weighted\", the KJ force is chordwise weighted by the strength of each particle. If KJforce_type==\"regular\", the vortex sheet is ignored, and the KJ force is calculated from the velocity induced at midpoint between the horseshoe filaments.\nvehicle::VLMVehicle : If vlm_vortexsheet=true, it is expected that the vehicle object is passed through this argument.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-monitor/#FLOWUnsteady.generate_aerodynamicforce_parasiticdrag","page":"(4) Monitors Definitions","title":"FLOWUnsteady.generate_aerodynamicforce_parasiticdrag","text":"generate_aerodynamicforce_parasiticdrag(polar_file::String;\n read_path=FLOWUnsteady.default_database*\"/airfoils\",\n calc_cd_from_cl=false,\n add_skinfriction=true,\n Mach=nothing)\n\nCalculates the parasitic drag along the wing using a lookup airfoil table. It adds this force to the field vlm_system.sol[\"Ftot\"].\n\nThe lookup table is read from the file polar_file under the directory read_path. The parasitic drag includes form drag, skin friction, and wave drag, assuming that each of these components are included in the lookup polar. polar_file can be any polar file downloaded from airfoiltools.com.\n\nTo ignore skin friction drag, use add_skinfriction=false.\n\nThe drag will be calculated from the local effective angle of attack, unless calc_cd_from_cl=true is used, which then will be calculated from the local lift coefficient given by the circulation distribution. cd from cl tends to be more accurate than from AOA, but the method might fail to correlate cd and cl depending on how noise the polar data is.\n\nIf Mach != nothing, it will use a Prandtl-Glauert correction to pre-correct the lookup cl. This will have no effects if calc_cd_from_cl=false.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-monitor/#FLOWUnsteady.calc_aerodynamicforce_unsteady","page":"(4) Monitors Definitions","title":"FLOWUnsteady.calc_aerodynamicforce_unsteady","text":"calc_aerodynamicforce_unsteady(vlm_system::Union{vlm.Wing, vlm.WingSystem},\n prev_vlm_system, pfield, Vinf, dt, rho; t=0.0,\n per_unit_span=false, spandir=[0, 1, 0],\n include_trailingboundvortex=false,\n add_to_Ftot=false\n )\n\nForce from unsteady circulation.\n\nThis force tends to add a lot of numerical noise, which in most cases ends up cancelling out when the loading is time-averaged. Hence, add_to_Ftot=false will calculate the unsteady loading and save it under the field Funs-vector, but it will not be added to the Ftot vector that is used to calculate the wing's overall aerodynamic force.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-monitor/#waketreatmentapi","page":"(4) Monitors Definitions","title":"Wake Treatment","text":"","category":"section"},{"location":"api/flowunsteady-monitor/","page":"(4) Monitors Definitions","title":"(4) Monitors Definitions","text":"Since the full set of state variables is passed to extra_runtime_function, this function can also be used to alter the simulation on the fly. In some circumstances it is desirable to be able to remove or modify particles, which process we call \"wake treatment.\" Wake treatment is often used to reduce computational cost (for instance, by removing particle in regions of the flow that are not of interest), and it can also be used to force numerical stability (for instance, by removing or clipping particles with vortex strengths that grow beyond certain threshold).","category":"page"},{"location":"api/flowunsteady-monitor/","page":"(4) Monitors Definitions","title":"(4) Monitors Definitions","text":"These wake treatment methods can be added into the pipeline of extra_runtime_function as follows:","category":"page"},{"location":"api/flowunsteady-monitor/","page":"(4) Monitors Definitions","title":"(4) Monitors Definitions","text":"import FLOWUnsteady as uns\n\n# Define monitors\nmonitor_states = uns.generate_monitor_statevariables()\nmonitor_enstrophy = uns.generate_monitor_enstrophy()\n\n# Monitor pipeline\nmonitors = uns.concatenate(monitor_states, monitor_enstrophy)\n\n# Define wake treatment\nwake_treatment = uns.remove_particles_sphere(1.0, 1; Xoff=zeros(3))\n\n# Extra runtime function pipeline\nextra_runtime_function = uns.concatenate(monitors, wake_treatment)\n","category":"page"},{"location":"api/flowunsteady-monitor/","page":"(4) Monitors Definitions","title":"(4) Monitors Definitions","text":"Then pass this pipeline to the simulation as","category":"page"},{"location":"api/flowunsteady-monitor/","page":"(4) Monitors Definitions","title":"(4) Monitors Definitions","text":"uns.run_simulation(sim, nsteps; extra_runtime_function=extra_runtime_function, ...)","category":"page"},{"location":"api/flowunsteady-monitor/","page":"(4) Monitors Definitions","title":"(4) Monitors Definitions","text":"Below we list a few generator functions that return common wake treatment methods.","category":"page"},{"location":"api/flowunsteady-monitor/","page":"(4) Monitors Definitions","title":"(4) Monitors Definitions","text":"FLOWUnsteady.remove_particles_sphere\nFLOWUnsteady.remove_particles_box\nFLOWUnsteady.remove_particles_lowstrength\nFLOWUnsteady.remove_particles_strength\nFLOWUnsteady.remove_particles_sigma","category":"page"},{"location":"api/flowunsteady-monitor/#FLOWUnsteady.remove_particles_sphere","page":"(4) Monitors Definitions","title":"FLOWUnsteady.remove_particles_sphere","text":"remove_particles_sphere(Rsphere2, step::Int; Xoff::Vector=zeros(3))\n\nReturns an extra_runtime_function that every step steps removes all particles that are outside of a sphere of radius sqrt(Rsphere2) centered around the vehicle or with an offset Xoff from the center of the vehicle.\n\nUse this wake treatment to avoid unnecesary computation by removing particles that have gone beyond the region of interest.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-monitor/#FLOWUnsteady.remove_particles_box","page":"(4) Monitors Definitions","title":"FLOWUnsteady.remove_particles_box","text":"remove_particles_box(Pmin::Vector, Pmax::Vector, step::Int)\n\nReturns an extra_runtime_function that every step steps removes all particles that are outside of a box of minimum and maximum vertices Pmin and Pmax.\n\nUse this wake treatment to avoid unnecesary computation by removing particles that have gone beyond the region of interest.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-monitor/#FLOWUnsteady.remove_particles_lowstrength","page":"(4) Monitors Definitions","title":"FLOWUnsteady.remove_particles_lowstrength","text":"remove_particles_lowstrength(critGamma2, step)\n\nReturns an extra_runtime_function that removes all particles with a vortex strength magnitude that is smaller than sqrt(critGamma2). Use this wake treatment to avoid unnecesary computation by removing particles that have negligibly-low strength.\n\nstep indicates every how many steps to remove particles.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-monitor/#FLOWUnsteady.remove_particles_strength","page":"(4) Monitors Definitions","title":"FLOWUnsteady.remove_particles_strength","text":"remove_particles_strength(minGamma2, maxGamma2; every_nsteps=1)\n\nReturns an extra_runtime_function that removes all particles with a vortex strength magnitude that is larger than sqrt(maxGamma2) or smaller than sqrt(minGamma2). Use every_nsteps to indicate every how many steps to remove particles.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-monitor/#FLOWUnsteady.remove_particles_sigma","page":"(4) Monitors Definitions","title":"FLOWUnsteady.remove_particles_sigma","text":"remove_particles_sigma(minsigma, maxsigma; every_nsteps=1)\n\nReturns an extra_runtime_function that removes all particles with a smoothing radius that is larger than maxsigma or smaller than minsigma. Use every_nsteps to indicate every how many steps to remove particles.\n\n\n\n\n\n","category":"function"},{"location":"api/flowvpm-relaxation/#Relaxation-Scheme","page":"Relaxation Scheme","title":"Relaxation Scheme","text":"","category":"section"},{"location":"api/flowvpm-relaxation/","page":"Relaxation Scheme","title":"Relaxation Scheme","text":"FLOWUnsteady.vpm.FMM\nFLOWUnsteady.vpm.Relaxation\nFLOWUnsteady.vpm.relax_pedrizzetti\nFLOWUnsteady.vpm.relax_correctedpedrizzetti","category":"page"},{"location":"api/flowvpm-relaxation/#FLOWVPM.FMM","page":"Relaxation Scheme","title":"FLOWVPM.FMM","text":"`FMM(; p::Int=4, ncrit::Int=50, theta::Real=0.4, phi::Real=0.3)`\n\nParameters for FMM solver.\n\nArguments\n\np : Order of multipole expansion (number of terms).\nncrit : Maximum number of particles per leaf.\ntheta : Neighborhood criterion. This criterion defines the distance where the far field starts. The criterion is that if θ*r < R1+R2 the interaction between two cells is resolved through P2P, where r is the distance between cell centers, and R1 and R2 are each cell radius. This means that at θ=1, P2P is done only on cells that have overlap; at θ=0.5, P2P is done on cells that their distance is less than double R1+R2; at θ=0.25, P2P is done on cells that their distance is less than four times R1+R2; at θ=0, P2P is done on cells all cells.\nphi : Regularizing neighborhood criterion. This criterion avoid approximating interactions with the singular-FMM between regularized particles that are sufficiently close to each other across cell boundaries. Used together with the θ-criterion, P2P is performed between two cells if φ < σ/dx, where σ is the average smoothing radius in between all particles in both cells, and dx is the distance between cell boundaries ( dx = r-(R1+R2) ). This means that at φ = 1, P2P is done on cells with boundaries closer than the average smoothing radius; at φ = 0.5, P2P is done on cells closer than two times the smoothing radius; at φ = 0.25, P2P is done on cells closer than four times the smoothing radius.\n\n\n\n\n\n","category":"type"},{"location":"api/flowvpm-relaxation/#FLOWVPM.Relaxation","page":"Relaxation Scheme","title":"FLOWVPM.Relaxation","text":"`Relaxation(relax, nsteps_relax, rlxf)`\n\nDefines a relaxation method implemented in the function relax(rlxf::Real, p::Particle) where rlxf is the relaxation factor between 0 and 1, with 0 == no relaxation, and 1 == full relaxation. The simulation is relaxed every nsteps_relax steps.\n\n\n\n\n\n","category":"type"},{"location":"api/flowvpm-relaxation/#FLOWVPM.relax_pedrizzetti","page":"Relaxation Scheme","title":"FLOWVPM.relax_pedrizzetti","text":"`relax_Pedrizzetti(rlxf::Real, p::Particle)`\n\nRelaxation scheme where the vortex strength is aligned with the local vorticity.\n\n\n\n\n\n","category":"function"},{"location":"api/flowvpm-relaxation/#FLOWVPM.relax_correctedpedrizzetti","page":"Relaxation Scheme","title":"FLOWVPM.relax_correctedpedrizzetti","text":"`relax_correctedPedrizzetti(rlxf::Real, p::Particle)`\n\nRelaxation scheme where the vortex strength is aligned with the local vorticity. This version fixes the error in Pedrizzetti's relaxation that made the strength to continually decrease over time. See notebook 20200921 for derivation.\n\n\n\n\n\n","category":"function"},{"location":"examples/wing-aoasweep/#AOA-Sweep","page":"AOA Sweep","title":"AOA Sweep","text":"","category":"section"},{"location":"examples/wing-aoasweep/","page":"AOA Sweep","title":"AOA Sweep","text":"Using the same vehicle, maneuver, and simulation defined in the previous section, we now run a sweep of the angle of attack.","category":"page"},{"location":"examples/wing-aoasweep/","page":"AOA Sweep","title":"AOA Sweep","text":"#=##############################################################################\n# DESCRIPTION\n AOA sweep on 45° swept-back wing\n=###############################################################################\nimport FLOWUnsteady: cross, dot, norm, plt, @L_str\n\nAOAs = [0, 2.1, 4.2, 6.3, 8.4, 10.5, 12] # (deg) angles of attack\nXac = [0.25*b/ar, 0, 0] # (m) aerodynamic center for moment calculation\n\n# Results are stored in these arrays\nCLs, CDs = [], [] # Lift and drag at each angle of attack\nrolls, pitchs, yaws = [], [], [] # Rolling, pitching, and yawing moment\n\nls, ds = [], [] # Load and drag distributions\nspanposs = [] # Spanwise positions for load distributions\n\n\n# ----------------- AOA SWEEP --------------------------------------------------\nfor AOA in AOAs\n\n println(\"\\n\\n Running AOA = $(AOA) deg\")\n\n # ------------- RUN SIMULATION ----------------\n\n # Freestream function\n Vinf(X, t) = magVinf*[cosd(AOA), 0.0, sind(AOA)]\n\n # Define wing monitor with new reference freestream direction\n Shat = [0, 1, 0] # Spanwise direction\n Dhat = [cosd(AOA), 0.0, sind(AOA)] # Direction of drag\n Lhat = cross(Dhat, Shat) # Direction of lift\n\n # Generate wing monitor\n monitor = uns.generate_monitor_wing(wing, Vinf, b, ar,\n rho, qinf, nsteps;\n calc_aerodynamicforce_fun=calc_aerodynamicforce_fun,\n L_dir=Lhat,\n D_dir=Dhat,\n save_path=nothing,\n disp_plot=false\n )\n\n # Run simulation\n pfield = uns.run_simulation(simulation, nsteps;\n # SIMULATION OPTIONS\n Vinf=Vinf,\n rho=rho,\n # SOLVERS OPTIONS\n p_per_step=p_per_step,\n max_particles=max_particles,\n sigma_vlm_solver=sigma_vlm_solver,\n sigma_vlm_surf=sigma_vlm_surf,\n sigma_rotor_surf=sigma_vlm_surf,\n sigma_vpm_overwrite=sigma_vpm_overwrite,\n shed_starting=shed_starting,\n extra_runtime_function=monitor,\n # OUTPUT OPTIONS\n save_path=nothing,\n v_lvl=1, verbose_nsteps=60\n )\n\n # ------------- POST-PROCESSING ---------------\n\n # Integrate total lift and drag\n L = sum(wing.sol[\"L\"])\n D = sum(wing.sol[\"D\"])\n\n # Lift and drag coefficients\n CL = norm(L) / (qinf*b^2/ar)\n CD = norm(D) / (qinf*b^2/ar)\n\n # Control point of each element\n Xs = [vlm.getControlPoint(wing, i) for i in 1:vlm.get_m(wing)]\n\n # Force of each element\n Fs = wing.sol[\"Ftot\"]\n\n # Integrate the total moment with respect to aerodynamic center\n M = sum( cross(X - Xac, F) for (X, F) in zip(Xs, Fs) )\n\n # Integrated moment decomposed into rolling, pitching, and yawing moments\n lhat = Dhat # Rolling direction\n mhat = Shat # Pitching direction\n nhat = Lhat # Yawing direction\n\n roll = dot(M, lhat)\n pitch = dot(M, mhat)\n yaw = dot(M, nhat)\n\n # Sectional loading (in vector form) at each control point\n fs = wing.sol[\"ftot\"]\n\n # Decompose vectors into lift and drag distribution\n l = [ dot(f, Lhat) for f in fs ]\n d = [ dot(f, Dhat) for f in fs ]\n\n # Span position of each control point\n spanpos = [ dot(X, Shat) / (b/2) for X in Xs ]\n\n # Store results\n push!(CLs, CL)\n push!(CDs, CD)\n\n push!(rolls, roll)\n push!(pitchs, pitch)\n push!(yaws, yaw)\n\n push!(spanposs, spanpos)\n push!(ls, l)\n push!(ds, d)\n\nend\n\n","category":"page"},{"location":"examples/wing-aoasweep/","page":"AOA Sweep","title":"AOA Sweep","text":"\n Run time: ~15 minutes on a Dell Precision 7760 laptop.\n
\n Reduce resolution (n and steps) to speed up simulation without loss of accuracy.\n
\n

","category":"page"},{"location":"examples/wing-aoasweep/","page":"AOA Sweep","title":"AOA Sweep","text":"Check examples/wing/wing_aoasweep.jl to see how to postprocess and plot the results as shown below.","category":"page"},{"location":"examples/wing-aoasweep/","page":"AOA Sweep","title":"AOA Sweep","text":"
\n
Spanwise loading distribution\n \"Pic\n\n

Vehicle lift and drag\n \"Pic\n\n

Pitching moment
\n \"Pic\n
","category":"page"},{"location":"examples/rotorhover-fdom/#rotorfdom","page":"Fluid Domain","title":"Fluid Domain","text":"","category":"section"},{"location":"examples/rotorhover-fdom/","page":"Fluid Domain","title":"Fluid Domain","text":"
\n \"Pic\n
","category":"page"},{"location":"examples/rotorhover-fdom/","page":"Fluid Domain","title":"Fluid Domain","text":"
","category":"page"},{"location":"examples/rotorhover-fdom/","page":"Fluid Domain","title":"Fluid Domain","text":"The full fluid domain can be computed in a postprocessing step from the particle field. This is possible because the particle field is a radial basis function that constructs the vorticity field, and the velocity field can be recovered from vorticity through the Biot-Savart law.","category":"page"},{"location":"examples/rotorhover-fdom/","page":"Fluid Domain","title":"Fluid Domain","text":"Here we show how to use uns.computefluiddomain to read a simulation and process it to generate its fluid domain.","category":"page"},{"location":"examples/rotorhover-fdom/","page":"Fluid Domain","title":"Fluid Domain","text":"#=##############################################################################\n Computes the fluid domain of DJI 9443 simulation using a volumetric domain.\n This is done probing the velocity and vorticity that the particle field\n induces at each node of a Cartesian grids.\n\n NOTE: The fluid domain generated here does not include the freestream\n velocity, which needs to be added manually inside ParaView (if any).\n=###############################################################################\n\nimport FLOWUnsteady as uns\nimport FLOWUnsteady: vpm, gt, dot, norm\n\n# --------------- INPUTS AND OUTPUTS -------------------------------------------\n# INPUT OPTIONS\nsimulation_name = \"rotorhover-example-midhigh00\" # Simulation to read\nread_path = \"/home/edoalvar/simulationdata202330/\"*simulation_name # Where to read simulation from\n\npfield_prefix = \"singlerotor_pfield\" # Prefix of particle field files to read\nstaticpfield_prefix = \"singlerotor_staticpfield\" # Prefix of static particle field files to read\n\nnums = [719] # Time steps to process\n\n# OUTPUT OPTIONS\nsave_path = joinpath(read_path, \"..\", simulation_name*\"-fdom\") # Where to save fluid domain\noutput_prefix = \"singlerotor\" # Prefix of output files\nprompt = true # Whether to prompt the user\nverbose = true # Enable verbose\nv_lvl = 0 # Verbose indentation level\n\n\n# -------------- PARAMETERS ----------------------------------------------------\n# Simulation information\nR = 0.12 # (m) rotor radius\nAOA = 0.0 # (deg) angle of attack or incidence angle\n\n# Grid\nL = R # (m) reference length\ndx, dy, dz = L/50, L/50, L/50 # (m) cell size in each direction\nPmin = L*[-0.50, -1.25, -1.25] # (m) minimum bounds\nPmax = L*[ 2.00, 1.25, 1.25] # (m) maximum bounds\nNDIVS = ceil.(Int, (Pmax .- Pmin)./[dx, dy, dz]) # Number of cells in each direction\nnnodes = prod(NDIVS .+ 1) # Total number of nodes\n\nOaxis = gt.rotation_matrix2(0, 0, AOA) # Orientation of grid\n\n# VPM settings\nmaxparticles = Int(1.0e6 + nnodes) # Maximum number of particles\nfmm = vpm.FMM(; p=4, ncrit=50, theta=0.4, phi=0.3) # FMM parameters (decrease phi to reduce FMM noise)\nscale_sigma = 1.00 # Shrink smoothing radii by this factor\nf_sigma = 0.5 # Smoothing of node particles as sigma = f_sigma*meansigma\n\nmaxsigma = L/10 # Particles larger than this get shrunk to this size (this helps speed up computation)\nmaxmagGamma = Inf # Any vortex strengths larger than this get clipped to this value\n\ninclude_staticparticles = true # Whether to include the static particles embedded in the solid surfaces\n\nother_file_prefs = include_staticparticles ? [staticpfield_prefix] : []\nother_read_paths = [read_path for i in 1:length(other_file_prefs)]\n\nif verbose\n println(\"\\t\"^(v_lvl)*\"Fluid domain grid\")\n println(\"\\t\"^(v_lvl)*\"NDIVS =\\t$(NDIVS)\")\n println(\"\\t\"^(v_lvl)*\"Number of nodes =\\t$(nnodes)\")\nend\n\n# --------------- PROCESSING SETUP ---------------------------------------------\nif verbose\n println(\"\\t\"^(v_lvl)*\"Getting ready to process $(read_path)\")\n println(\"\\t\"^(v_lvl)*\"Results will be saved under $(save_path)\")\nend\n\n# Create save path\nif save_path != read_path\n gt.create_path(save_path, prompt)\nend\n\n\n# Generate function to process the field clipping particle sizes\npreprocessing_pfield = uns.generate_preprocessing_fluiddomain_pfield(maxsigma, maxmagGamma;\n verbose=verbose, v_lvl=v_lvl+1)\n\n# --------------- PROCESS SIMULATION -------------------------------------------\n\nnthreads = 1 # Total number of threads\nnthread = 1 # Number of this thread\ndnum = floor(Int, length(nums)/nthreads) # Number of time steps per thread\nthreaded_nums = [view(nums, dnum*i+1:(i\n Run time: ~1 minute on a Dell Precision 7760 laptop.\n\n\n

","category":"page"},{"location":"examples/rotorhover-fdom/","page":"Fluid Domain","title":"Fluid Domain","text":"
\n Mid-High Fidelity\n
\n \"Pic\n \"Pic\n \"Pic\n


\n High Fidelity\n
\n \"Pic\n \"Pic\n \"Pic\n
","category":"page"},{"location":"examples/rotorhover-fdom/","page":"Fluid Domain","title":"Fluid Domain","text":"info: ParaView Visualization\nThe .pvsm files visualizing the fluid domain as shown above are available in the following linksHigh fidelity: LINK\nMid-high fidelity: LINK(right click → save as...).To open in ParaView: File → Load State → (select .pvsm file) then select \"Search files under specified directory\" and point it to the folder where the simulation was saved.","category":"page"},{"location":"api/flowunsteady-vehicle-components/#Generating-components","page":"Generating components","title":"Generating components","text":"","category":"section"},{"location":"api/flowunsteady-vehicle-components/#Rotor","page":"Generating components","title":"Rotor","text":"","category":"section"},{"location":"api/flowunsteady-vehicle-components/","page":"Generating components","title":"Generating components","text":"FLOWunsteady uses a database of airfoil and rotor geometries to automate the generation of rotors. A prepopulated database is found in the directory under FLOWUnsteady.default_database. Alternatively, users can define their own database with custom rotors and airfoils.","category":"page"},{"location":"api/flowunsteady-vehicle-components/","page":"Generating components","title":"Generating components","text":"The following slides describe the structure of the database, using the DJI 9443 rotor as an example:","category":"page"},{"location":"api/flowunsteady-vehicle-components/","page":"Generating components","title":"Generating components","text":"
\n\n
","category":"page"},{"location":"api/flowunsteady-vehicle-components/","page":"Generating components","title":"Generating components","text":"Rotors can then be generated calling any of following functions:","category":"page"},{"location":"api/flowunsteady-vehicle-components/","page":"Generating components","title":"Generating components","text":"FLOWUnsteady.generate_rotor(::String)\nFLOWUnsteady.generate_rotor(::Real, ::Real, ::Int, ::String)\nFLOWUnsteady.generate_rotor(::Real, ::Real, ::Int, ::Array{Float64,2},\n ::Array{Float64,2}, ::Array{Float64,2},\n ::Array{Float64,2},\n ::Array{Tuple{Float64,Array{Float64, 2},String},1})\nFLOWUnsteady.vlm.rotate","category":"page"},{"location":"api/flowunsteady-vehicle-components/#FLOWUnsteady.generate_rotor-Tuple{String}","page":"Generating components","title":"FLOWUnsteady.generate_rotor","text":"generate_rotor(rotor_file::String;\n data_path=FLOWUnsteady.default_database, optargs...)\n\nGenerates a FLOWVLM.Rotor reading the full rotor geometry from the rotor file rotor_file found in the database data_path.\n\n\n\n\n\n","category":"method"},{"location":"api/flowunsteady-vehicle-components/#FLOWUnsteady.generate_rotor-Tuple{Real, Real, Int64, String}","page":"Generating components","title":"FLOWUnsteady.generate_rotor","text":"generate_rotor(Rtip, Rhub, B, blade_file::String;\n data_path=FLOWUnsteady.default_database, optargs...)\n\nGenerates a FLOWVLM.Rotor reading the blade geometry from the blade file blade_file found in the database data_path.\n\n\n\n\n\n","category":"method"},{"location":"api/flowunsteady-vehicle-components/#FLOWUnsteady.generate_rotor-Tuple{Real, Real, Int64, Matrix{Float64}, Matrix{Float64}, Matrix{Float64}, Matrix{Float64}, Vector{Tuple{Float64, Matrix{Float64}, String}}}","page":"Generating components","title":"FLOWUnsteady.generate_rotor","text":"generate_rotor(Rtip, Rhub, B,\n chorddist, twistdist, sweepdist, heightdist,\n airfoil_contours;\n\n # MORE ROTOR PARAMETERS\n pitch=0.0,\n CW=true,\n\n # DISCRETIZATION SETTINGS\n n=10, blade_r=1.0,\n rediscretize_airfoils=true,\n rfl_n_lower=15, rfl_n_upper=15,\n spline_k=5, spline_s=0.001, spline_bc=\"extrapolate\",\n\n # AIRFOIL PROCESSING\n data_path=FLOWUnsteady.default_database,\n read_polar=vlm.ap.read_polar,\n xfoil=false,\n alphas=[i for i in -20:1.0:20], ncrit=9,\n ReD=5e5, altReD=nothing, Matip=0.0,\n\n # OUTPUT OPTIONS\n verbose=false, verbose_xfoil=false, v_lvl=1,\n plot_disc=true, save_polars=nothing)\n\nGenerates a FLOWVLM.Rotor from direct inputs.\n\nARGUMENTS\n\nRtip::Real : (m) rotor radius (from centerline to blade tip)\nRhub::Real : (m) hub radius (from centerline to blade root)\nB::Int : Number of blades\nchorddist::Matrix : Chord distribution (chorddist[:, 1] = r/R, chorddist[:, 2] = c/R\ntwistdist::Matrix : Twist distribution (twistdist[:, 1] = r/R, twistdist[:, 2] = degs\nsweepdist::Matrix : LE sweep distribution (sweepdist[:, 1] = r/R, sweepdist[:, 2] = x/R\nheightdist::Matrix : LE height distribution (heightdist[:, 1] = r/R, heightdist[:, 2] = z/R\nairfoil_contours::Array{ Tuple{Float64, Array{Float64, 2}, String} } : Airfoil contours along the span. It must follow the pattern (pos, contour, polarfile) = airfoil_contours[i], where pos = (r-Rhub)/(Rtip-Rhub) is the spanwise position (with root=0, tip=1), contour is the airfoil profile (contour[:, 1] = x/c, contour[:, 2] = y/c), and polarfile is any file from airfoiltools.com with the airfoil lookup table (airfoil polar).\n\nThe function allows airfoil_contours::Array{ Tuple{Float64, String, String} }, following the pattern (pos, contourfile, polarfile) = airfoil_contours[i] where contourfile is a CSV file with columns x/c and y/c.\n\nKEYWORD ARGUMENTS\n\nExtra rotor parameters\n\npitch::Real : (deg) rotor collective pitch\nCW::Bool : Whether the rotor rotates in the clockwise (true) or counter-clockwise (false)\n\nDiscretization\n\nn::Int : Number of blade elements per blade.\nr::Real : Spacing between elements at the tip, divided by the spacing between elements at the root.\nspline_k::Int, spline_s::Real, spline_bc::String : To discretize the blade, the blade distributions are splined and re-discretize into n elements. These splines are done through the Dierckx package, with spline_k the order of the spline, spline_s the smoothing parameter, and spline_bc the boundary condition.\nrediscretize_airfoils : If true, it will spline the airfoil contours and re-discretize them. It will discretize the lower side of the contour into rfl_n_lower panels, and the upper side into rfl_n_upper panels. This is necessary unless all the airfoil contours already have the same number of points.\n\nAirfoil processing\n\ndata_path::String : Path to database where to read the airfoil polars from.\nread_polar::Function : Function used for parsing the airfoil files. Use vlm.ap.read_polar for files that are direct outputs from XFOIL. Use vlm.ap.read_polar2 for CSV files.\nxfoil::Bool : If true, the polar files will be ignored and XFOIL will be used to generate the polars instead. This will be done sweeping AOA as in alphas (in degrees) and ncrit for inflow turbulence parameter.\nReD::Real, Matip::Real, altReD::Tuple{Real, Real, Real}\n\nReD is the diameter Reynolds number based on rotational speed calculated as ReD = (omega*R)*(2*R)/nu, and Matip is the rotational+freestream Mach number at the tip. These number will be used for running XFOIL to compute airfoil polars, and will be ignored if airfoil polars are prescribed.\n\nGive it altReD = (RPM, J, nu), and it will calculate the chord-based Reynolds accounting for the effective velocity at every station, ignoring ReD (this is more accurate, but not needed).\n\nNOTE: If Matip is different than zero while running XFOIL, you must deactive compressibility corrections in run_simulation by using sound_spd=nothing. Otherwise, compressibility effects will be double accounted for.\n\nOutputs\n\nverbose::Bool : Whether to verbose while generating the rotor\nverbose_xfoil::Bool : Whether to verbose while running XFOIL\nv_lvl::Int : Indentation level for printing the verbose\nplot_disc : If true, it will plot the discretization process of the blade, which is useful for verification and debugging. It will also plot the airfoil polars.\nsave_polars::String : Give it a path to a directory and it will save the polars plot in that directory\n\n\n\n\n\n","category":"method"},{"location":"api/flowunsteady-vehicle-components/#FLOWVLM.rotate","page":"Generating components","title":"FLOWVLM.rotate","text":"rotate(rotor::Rotor, degs::Real)\n\nRotates the rotor by degs degrees in the direction of rotation (rotor.CW).\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-vehicle-components/#VLM-Wing","page":"Generating components","title":"VLM Wing","text":"","category":"section"},{"location":"api/flowunsteady-vehicle-components/","page":"Generating components","title":"Generating components","text":"FLOWUnsteady.vlm.simpleWing\nFLOWUnsteady.vlm.complexWing","category":"page"},{"location":"api/flowunsteady-vehicle-components/#FLOWVLM.simpleWing","page":"Generating components","title":"FLOWVLM.simpleWing","text":"simpleWing(b, ar, tr, twist, lambda, gamma; twist_tip=twist, n=20, r=2.0)\n\nGenerates a simple wing with constant twist, sweep, dihedral, and taper ratio.\n\nArguments\n\nb : (float) span\nar : (float) aspect ratio (span / tip chord)\ntr : (float) taper ratio (tip chord / root chord)\ntwist : (float) twist of the root in degrees\nlambda : (float) sweep in degrees\ngamma : (float) dihedral in degrees\ntwist_tip : (float) twist of the tip (if different than root)\nn : (int) number of horseshoes per semi-span\nr : (float) horseshoes' expansion ratio\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-vehicle-components/#FLOWVLM.complexWing","page":"Generating components","title":"FLOWVLM.complexWing","text":"complexWing(b, AR, tr, n, pos, twist, sweep, dihed; symmetric=true)\n\nGenerates a wing with an abritrary distribution of twist, sweep, dihedral, and chord length.\n\nArguments\n\nb::Float64 : Span\nAR::Float64 : Reference aspect ratio (span / tip chord)\nn::Int64 : Number of horseshoes per semi-span\npos::Array{Float64,1} : Position of stations along the semi-span\nclen::Array{Float64,1} : Chord length at each station (normalized by tip chord)\ntwist::Array{Float64,1} : (deg) twist at each station\nsweep::Array{Float64,1} : (deg) sweep between each station\ndihed::Array{Float64,1} : (deg) dihedral between each station\n\nOptional Arguments\n\nsymmetric::Bool=true : If false, generates only a half-span\nchordalign::Float64=0.0 : Indicate position along chord length to align chords. Give it 0 for alignment about leading edge, 0.25 for alignment about quarter chord, and 1.0 for alignment about trailing edge.\n\nExample\n\n# Wing dimensions\nb = 1.0 # (m) span\nAR = 12.0 # Span over tip chord\nn = 50 # Horseshoes per semi-span\n\n# Define chord, twist, sweep, and dihedral distributions\npos = [0, 0.25, 0.75, 1] # Position of stations along semi-span\nclen = [2.0, 1.5, 1.5, 1] # Normalized chord length at each station\ntwist = [0.0, 0.0, -2.0, -4.0] # (deg) twist at each station\nsweep = [10.0, 15.0, 35.0] # (deg) sweep between stations\ndihed = [2.0, 5.0, 7.5] # (deg) dihedral between stations\n\n# Generate the wing\nwing = vlm.complexWing(b, AR, n, pos, clen, twist, sweep, dihed)\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-vehicle-components/#FLOWVLM-Systems","page":"Generating components","title":"FLOWVLM Systems","text":"","category":"section"},{"location":"api/flowunsteady-vehicle-components/","page":"Generating components","title":"Generating components","text":"FLOWUnsteady.vlm.WingSystem\n\nFLOWUnsteady.vlm.addwing\nFLOWUnsteady.vlm.get_wing\nFLOWUnsteady.vlm.setcoordsystem\nFLOWUnsteady.vlm.get_m\nFLOWUnsteady.vlm.get_mBlade","category":"page"},{"location":"api/flowunsteady-vehicle-components/#FLOWVLM.WingSystem","page":"Generating components","title":"FLOWVLM.WingSystem","text":"WingSystem(wings::Array{Union{Wing, WingSystem}}, wing_names::Array{String})\n\nInitiates a system of wings. All methods applicable to a Wing object are applicable to a WingSystem. When solved, it will calculate the interaction between wings.\n\n\n\n\n\n","category":"type"},{"location":"api/flowunsteady-vehicle-components/#FLOWVLM.addwing","page":"Generating components","title":"FLOWVLM.addwing","text":"addwing(self::WingSystem, wing_name::String, wing::Union{Wing, Rotor})\n\nAdds a wing (or rotor) to the system. The local reference frame of the wing then is then in relation to the local reference frame of the System.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-vehicle-components/#FLOWVLM.get_wing","page":"Generating components","title":"FLOWVLM.get_wing","text":"get_wing(self::WingSystem, wing_name::String)\n\nReturns the wing of name wing_name.\n\n\n\n\n\nget_wing(self::WingSystem, wing_i::Int)\n\nReturns the i-th wing.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-vehicle-components/#FLOWVLM.setcoordsystem","page":"Generating components","title":"FLOWVLM.setcoordsystem","text":"setcoordsystem(wing::Wing, O::Vector, Oaxis::Matrix)\n\nRedefines the local coordinate system of the wing, where O is the new origin and Oaxis is the matrix of unit vectors\n\n\n\n\n\nsetcoordsystem(system::WingSystem, O::Vector, Oaxis::Matrix; wings=String[])\n\nRedefines the local coordinate system of the system, where O is the new origin and Oaxis is the matrix of unit vectors. It transforms the coordinates of all wings in the system accordingly.\n\nTo change the local coordinate system of a specific wing relative to the system's coordinate system, give the name of the wing in an array under argument wings.\n\n\n\n\n\nsetcoordsystem(rotor::Rotor, O::Vector, Oaxis::Matrix; user=false)\n\nRedefines the local coordinate system of the rotor, where O is the new origin and Oaxis is the matrix of unit vectors. If the user is calling this function, give user=true, otherwise it will not do the automatic translation to blade coordinate system.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-vehicle-components/#FLOWVLM.get_m","page":"Generating components","title":"FLOWVLM.get_m","text":"get_m(wing::Wing)\n\nReturns the number of horseshoes in the wing\n\n\n\n\n\nget_m(system::WingSystem)\n\nReturns the total number of horseshoes in the system\n\n\n\n\n\nget_m(rotor::Rotor)\n\nReturns the total number of horseshoes in the rotor\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-vehicle-components/#FLOWVLM.get_mBlade","page":"Generating components","title":"FLOWVLM.get_mBlade","text":"get_mBlade(rotor::Rotor)\n\nReturns the number of horseshoes per blade\n\n\n\n\n\n","category":"function"},{"location":"api/flowvpm-viscous/#Viscous-Scheme","page":"Viscous Scheme","title":"Viscous Scheme","text":"","category":"section"},{"location":"api/flowvpm-viscous/","page":"Viscous Scheme","title":"Viscous Scheme","text":"FLOWUnsteady.vpm.ViscousScheme\nFLOWUnsteady.vpm.Inviscid\nFLOWUnsteady.vpm.CoreSpreading\nFLOWUnsteady.vpm.ParticleStrengthExchange\nFLOWUnsteady.vpm.rbf_conjugategradient","category":"page"},{"location":"api/flowvpm-viscous/#FLOWVPM.ViscousScheme","page":"Viscous Scheme","title":"FLOWVPM.ViscousScheme","text":"`ViscousScheme{R}`\n\nType declaring viscous scheme.\n\nImplementations must have the following properties: * nu::R : Kinematic viscosity.\n\n\n\n\n\n","category":"type"},{"location":"api/flowvpm-viscous/#FLOWVPM.rbf_conjugategradient","page":"Viscous Scheme","title":"FLOWVPM.rbf_conjugategradient","text":"Radial basis function interpolation of Gamma using the conjugate gradient method. This method only works on a particle field with uniform smoothing radius sigma.\n\nSee 20180818 notebook and https://en.wikipedia.org/wiki/Conjugategradientmethod#Theresultingalgorithm\n\n\n\n\n\n","category":"function"},{"location":"examples/vahana-vehicle/#vahanavehicle","page":"Vehicle Definition","title":"Vehicle Definition","text":"","category":"section"},{"location":"examples/vahana-vehicle/","page":"Vehicle Definition","title":"Vehicle Definition","text":"In this example we simulate the eVTOL transition maneuver of a tandem tilt-wing multirotor aircraft. The aircraft configuration resembles the Vahana eVTOL aircraft but with tilt and stacked rotors:","category":"page"},{"location":"examples/vahana-vehicle/","page":"Vehicle Definition","title":"Vehicle Definition","text":"\n \n \n \n \n
\n \"Pic\n
\n
Takeoff and landing
\n
\n \"Pic\n
\n
Cruise
\n
","category":"page"},{"location":"examples/vahana-vehicle/","page":"Vehicle Definition","title":"Vehicle Definition","text":"Due to the complexity of this simulation, each step of the simulation setup is quite involved. Hence, we have broken down each step into a function that can be call when we setup the simulation.","category":"page"},{"location":"examples/vahana-vehicle/","page":"Vehicle Definition","title":"Vehicle Definition","text":"Below is the function that defines the vehicle for the simulation (uns.UVLMVehicle). Along with defining the vehicle geometry, it also defines two tilting systems (a tilting system is a set of components that tilt together) and three rotor systems (a rotor system is a set of rotors with a common RPM). Later in the next section we will define the control inputs for these tilting and rotor systems.","category":"page"},{"location":"examples/vahana-vehicle/","page":"Vehicle Definition","title":"Vehicle Definition","text":"\n \n \n \n \n
\n
\n \"Pic\n
\n
\n
\n \"Pic\n
\n
","category":"page"},{"location":"examples/vahana-vehicle/","page":"Vehicle Definition","title":"Vehicle Definition","text":"\"\"\"\n Generates the geometry of Vahana aircraft\n\"\"\"\nfunction generate_vahana_vehicle(;\n # VEHICLE OPTIONS\n xfoil = true, # Whether to run XFOIL\n n_factor::Int = 1, # Discretization factor\n add_wings = true, # Whether to add the wings\n add_rotors = true, # Whether to add the rotors\n VehicleType = uns.VLMVehicle, # Type of vehicle to generate (uns.QVLMVehicle for quasi-steady solver)\n data_path = uns.def_data_path,# Database path\n # OUTPUT OPTIONS\n run_name = \"vahana\",\n verbose = true,\n v_lvl = 0\n )\n\n ############################################################################\n # PARAMETERS\n ############################################################################\n\n if verbose; println(\"\\t\"^(v_lvl)*\"Defining parameters...\"); end;\n\n # ------------ GEOMETRIC PARAMETERS ------------------------------------\n # Tilt and fixed rotors\n tiltrotor_file = \"VahanaTilt.csv\" # Tilt-rotor file\n R_w = 0.75 # (m) main-wing rotor radius (reference)\n R_tw = R_w # (m) tandem-wing rotor radius (reference)\n CW_w = true # Clockwise rotation of main-wing rotor\n CW_tw = false # Clockwise rotation of tandem-wing rotor\n nr_w = 2 # Number of rotors per side of main wing\n nr_tw = 2 # Number of rotors per side of tandem wing\n pitch = 0.0 # (deg) collective pitch for tiltrotors rotors on main and tandem wings\n main_outtilt = 10 # (deg) Mount main-wing rotors with this out-tilt angle\n tandem_pitchtilt= 10 # (deg) Mount tandem-wing rotors with this alternating pitch-tilt angle\n xoc_offset_main = 0.175 # Axial distance of main-wing rotors from LE, divided by chord\n xoc_offset_tandem = 0.10 # Axial distance of tandem-wing rotors from LE, divided by chord\n soD = 0.1 # Tip-to-tip distance of rotors, divided by diameter\n ReD07 = 1.5e6 # Assumed diameter-based Reynolds number for all rotors at r/R=0.7\n ReD = ReD07/0.7 # Reynolds number at blade tip (for XFOIL)\n n_rotor = 7*n_factor # Number of blade elements per blade\n r_rotor = 1/20 # Geometric expansion between blade elements\n tilt_read_polar = vlm.ap.read_polar # What polar reader to use\n\n # Stacked rotors\n stackedrotor_file = \"VahanaStacked.csv\" # Stacked-rotor file\n stacked = [nr_w, nr_w+1] # Index of main-wing rotors that will be stacked rotors\n stckd_xoc_offset= -1.40 # Axial distance of stacked rotors from LE, divided by chord\n stckd_zoc_offset= 0.10 # Height of stacked rotors above wing, divided by chord\n stckd_zoR_offset= -0.05 # Stacking distance between stacked rotors, divided by R\n stckd_corotating= true # Co-rotating stacked rotors if true, counter-rotating otherwise\n stckd_phase = -10 # (deg) initial phase difference of stacked rotors (index angle)\n stckd_pitch_up = 5.0 # (deg) collective pitch of upper rotor in stack\n stckd_pitch_low = stckd_pitch_up + 7.5 # (deg) collective pitch of lower rotor in stack\n stacked_read_polar = vlm.ap.read_polar2 # What polar reader to use\n\n # Main wing\n b_w = 5.86 # (m) span\n AR_w = 7.4 # Aspect ratio (b/c_tip)\n tr_w = 1.0 # Taper ratio (c_tip/c_root)\n twist_r_w = 14.0 # (deg) twist at root\n twist_t_w = twist_r_w # (deg) twist at tip\n lambda_w = main_outtilt # (deg) sweep\n gamma_w = 5.0 # (deg) dihedral\n md_w = 0.9 # Length of middle section, divided by span\n pivot_w = 1/4 # Pivot point along chord of tilt-wing\n n_w = 24*n_factor # Number of wing elements per side\n r_w = 2.0 # Geometric expansion of wing elements\n\n # Main-wing winglets\n b_wl = b_w/4 # (m) span of winglet from top to bottom\n AR_wl = 3.0 # Aspect ratio (b/c_tip)\n tr_wl = (b_wl/AR_wl)/(b_w/AR_w/tr_w) # Taper ratio (c_tip/c_root)\n twist_r_wl = 2.5 # (deg) twist at root\n twist_t_wl = 0.0 # (deg) twist at tip\n lambda_wl = 40.0 # (deg) sweep\n gamma_wl = 15.0 # (deg) dihedral\n n_wl = 8*n_factor # Number of wing elements per side\n r_wl = 2.0 # Geometric expansion of wing elements\n\n # Tandem wing\n b_tw = b_w*1.0 # (m) span\n AR_tw = 9.5 # Aspect ratio (b/c_tip)\n tr_tw = 1.0 # Taper ratio (c_tip/c_root)\n twist_r_tw = 14.0 # (deg) twist at root\n twist_t_tw = twist_r_tw # (deg) twist at tip\n lambda_tw = 0.0 # (deg) sweep\n gamma_tw = 0.0 # (deg) dihedral\n md_tw = 0.2 # Length of middle section, divided by span\n pivot_tw = pivot_w # Pivot point along chord of tilt-wing\n n_tw = 2*n_w # Number of wing elements per side\n r_tw = r_w # Geometric expansion of wing elements\n\n # Fuselage\n l_f = 5.86 # (m) length\n h_f = 2.81*2/3 # (m) height\n\n # ------------ ASSEMBLY PARAMETERS ------------------------------------\n # Position of wings on fuselage\n h_pos_w = 0.90*h_f # (m) height position of wing\n h_pos_tw = 0.15*h_f # (m) height position of tandem wing\n l_pos_w = 0.95*l_f-b_w/AR_w/tr_w# (m) length position of wing\n l_pos_tw = 0.05*l_f # (m) length position of tandem wing\n\n # Position of rotors along main wing\n d_rotor_w = (1+soD)*(2*R_w) # Distance between rotors\n y_pos_rotor_w = Float64[b_w/2 - i*d_rotor_w for i in 0:nr_w-1] # y-positions\n\n # Position of rotors along tandem wing\n d_rotor_tw = (1+soD)*(2*R_tw) # Distance between rotors on wing\n y_pos_rotor_tw = Float64[b_tw/2 - i*d_rotor_tw for i in 0:nr_tw-1] # y-positions\n\n init_ori = 90.0 # (deg) initial orientation of wings\n init_ori_rotor = 0.0 # (deg) initial orientation of rotors\n init_ori_stackedrotor = 30.0 # (deg) initial orientation of stacked rotors\n\n\n ############################################################################\n # GENERATE COMPONENTS\n ############################################################################\n\n if verbose; println(\"\\t\"^(v_lvl)*\"Generating components...\"); end;\n\n # ------------ ROTORS ------------------------------------------------\n # Generate base rotors (one for each rotation orientation)\n if add_rotors\n\n tiltrotors = vlm.Rotor[] # Tilt rotors\n\n if verbose; println(\"\\t\"^(v_lvl+1)*\"Generating first tilt-rotor...\"); end;\n push!(tiltrotors, uns.generate_rotor(tiltrotor_file; pitch=pitch,\n n=n_rotor, blade_r=r_rotor, CW=!CW_w, ReD=ReD,\n verbose=verbose, v_lvl=v_lvl+2, xfoil=xfoil,\n read_polar=tilt_read_polar,\n data_path=data_path, plot_disc=false))\n\n if verbose; println(\"\\t\"^(v_lvl+1)*\"Generating second tilt-rotor...\"); end;\n push!(tiltrotors, uns.generate_rotor(tiltrotor_file; pitch=pitch,\n n=n_rotor, blade_r=r_rotor, CW=CW_w, ReD=ReD,\n verbose=verbose, v_lvl=v_lvl+2, xfoil=xfoil,\n read_polar=tilt_read_polar,\n data_path=data_path, plot_disc=false))\n\n stackedrotors = vlm.Rotor[] # Upper rotor in stacked rotors\n\n if verbose; println(\"\\t\"^(v_lvl+1)*\"Generating first stacked-rotor...\"); end;\n push!(stackedrotors, uns.generate_rotor(stackedrotor_file; pitch=stckd_pitch_up,\n n=n_rotor, blade_r=r_rotor, CW=!CW_w, ReD=ReD,\n verbose=verbose, v_lvl=v_lvl+2, xfoil=xfoil,\n read_polar=stacked_read_polar,\n data_path=data_path, plot_disc=false))\n\n if verbose; println(\"\\t\"^(v_lvl+1)*\"Generating second stacked-rotor...\"); end;\n push!(stackedrotors, uns.generate_rotor(stackedrotor_file; pitch=stckd_pitch_up,\n n=n_rotor, blade_r=r_rotor, CW=CW_w, ReD=ReD,\n verbose=verbose, v_lvl=v_lvl+2, xfoil=xfoil,\n read_polar=stacked_read_polar,\n data_path=data_path, plot_disc=false))\n\n stackedrotors_low = vlm.Rotor[] # Lower rotor in stacked rotors\n\n if stckd_pitch_up != stckd_pitch_low\n\n if verbose; println(\"\\t\"^(v_lvl+1)*\"Generating first lower-stacked-rotor...\"); end;\n push!(stackedrotors_low, uns.generate_rotor(stackedrotor_file; pitch=stckd_pitch_low,\n n=n_rotor, blade_r=r_rotor, CW=!CW_w, ReD=ReD,\n verbose=verbose, v_lvl=v_lvl+2, xfoil=xfoil,\n read_polar=stacked_read_polar,\n data_path=data_path, plot_disc=false))\n\n if verbose; println(\"\\t\"^(v_lvl+1)*\"Generating second lower-stacked-rotor...\"); end;\n push!(stackedrotors_low, uns.generate_rotor(stackedrotor_file; pitch=stckd_pitch_low,\n n=n_rotor, blade_r=r_rotor, CW=CW_w, ReD=ReD,\n verbose=verbose, v_lvl=v_lvl+2, xfoil=xfoil,\n read_polar=stacked_read_polar,\n data_path=data_path, plot_disc=false))\n\n else\n\n for rotor in stackedrotors\n push!(stackedrotors_low, rotor)\n end\n\n end\n end\n\n\n # ------------ MAIN WING ---------------------------------------------\n # Generate wing\n if verbose; println(\"\\t\"^(v_lvl+1)*\"Generating main wing assembly...\"); end;\n\n # Middle section\n pos_md_w = [0.0, md_w]\n clen_md_w = [1/tr_w, md_w + (1/tr_w)*(1-md_w)]\n twist_md_w = [twist_r_w, twist_r_w + md_w*(twist_t_w-twist_r_w)]\n wing_md = vlm.complexWing(b_w, AR_w, ceil(Int, md_w*n_w), pos_md_w, clen_md_w, twist_md_w,\n lambda_w*ones(1), gamma_w*ones(1);\n symmetric=true, chordalign=0.0,\n _ign1=true)\n\n # Left section\n pos_l_w = [0, -(1-md_w)] # NOTE: Here we define this wing section from right to left\n clen_l_w = [1, clen_md_w[end]]\n twist_l_w = [twist_t_w, twist_md_w[end]]\n wing_L = vlm.complexWing(b_w, AR_w, ceil(Int, (1-md_w)*n_w/2), pos_l_w, clen_l_w,\n twist_l_w, -lambda_w*ones(1), -gamma_w*ones(1);\n symmetric=false, chordalign=0.0,\n _ign1=true)\n\n # Right section\n pos_r_w = [0, (1-md_w)]\n clen_r_w = [clen_md_w[end], 1]\n twist_r_w = [twist_md_w[end], twist_t_w]\n wing_R = vlm.complexWing(b_w, AR_w, ceil(Int, (1-md_w)*n_w/2), pos_r_w, clen_r_w,\n twist_r_w, lambda_w*ones(1), gamma_w*ones(1);\n symmetric=false, chordalign=0.0,\n _ign1=true)\n\n # Translate right and left sections to position\n O_w_R = (md_w*b_w/2)*[0, 1, 0]\n O_w_L = [1 0 0; 0 -1 0; 0 0 1]*O_w_R\n vlm.setcoordsystem(wing_R, O_w_R, Im)\n vlm.setcoordsystem(wing_L, O_w_L, Im)\n\n # Winglets\n winglet_R = vlm.simpleWing(b_wl, AR_wl, tr_wl, twist_r_wl, lambda_wl, gamma_wl;\n twist_tip=twist_t_wl, n=n_wl, r=r_wl)\n\n winglet_L = vlm.simpleWing(b_wl, AR_wl, tr_wl, twist_r_wl, lambda_wl, gamma_wl;\n twist_tip=twist_t_wl, n=n_wl, r=r_wl)\n\n # Translate winglets to position\n O_wl_R = (b_w/2)*[0, 1, 0]\n O_wl_R += ((1-md_w)*b_w/2)*[tan(lambda_w*pi/180), 0, tan(gamma_w*pi/180)]\n O_wl_L = [1 0 0; 0 -1 0; 0 0 1]*O_wl_R\n Oaxis_wl_R = gt.rotation_matrix(0.0, 0.0, 90.0)\n Oaxis_wl_L = gt.rotation_matrix(0.0, 0.0, -90.0)\n vlm.setcoordsystem(winglet_R, O_wl_R, Oaxis_wl_R)\n vlm.setcoordsystem(winglet_L, O_wl_L, Oaxis_wl_L)\n\n # Generate main-wing rotors (from right to left)\n if add_rotors\n\n if verbose; println(\"\\t\"^(v_lvl+2)*\"Generating main-wing rotors...\"); end;\n\n O_rotor_w = [ # Position of each rotor\n (ypos - md_w*b_w/2)*[tan(lambda_w*pi/180), 0, -tan(gamma_w*pi/180)] +\n ypos*[0, 1, 0] +\n [-(i in stacked ? stckd_xoc_offset : xoc_offset_main)*AR_w/b_w, 0, 0] +\n [0, 0, (i in stacked ? stckd_zoc_offset*tan(gamma_w*pi/180) : 0)*AR_w/b_w]\n for (i, ypos) in enumerate(y_pos_rotor_w)]\n\n rotors_w = vlm.Rotor[] # Rotors get stored in these arrays\n rotors_w_stacked_up = vlm.Rotor[]\n rotors_w_stacked_low = vlm.Rotor[]\n\n for i in 1:2*nr_w\n right = i<=nr_w # Indicates which side of the wing\n\n copy_rotor = i in stacked ? stackedrotors[1+i%2] : tiltrotors[1+i%2]\n this_rotor = deepcopy(copy_rotor) # Alternates rotation orientation\n\n this_O = O_rotor_w[ right ? i : nr_w-(i-nr_w-1)] # Chooses position\n this_O = [1 0 0; 0 (-1)^!right 0; 0 0 1]*this_O # Places it in correct side\n this_Oaxis = i in stacked ? gt.rotation_matrix(0.0, 90, 0.0) :\n gt.rotation_matrix((-1)^(i%2==0)*main_outtilt, 0.0, 0.0)\n\n # Place rotor in position\n vlm.setcoordsystem(this_rotor, this_O, this_Oaxis; user=true)\n\n # Rotate rotor to be tip-to-tip with others\n vlm.rotate(this_rotor, (-1)^(!CW_w) * (i in stacked ? init_ori_stackedrotor : init_ori_rotor))\n\n # Add the original polars that are not copied with deepcopy\n this_rotor.airfoils = copy_rotor.airfoils\n this_rotor._polars = copy_rotor._polars\n this_rotor._polarroot = copy_rotor._polarroot\n this_rotor._polartip = copy_rotor._polartip\n\n if !(i in stacked)\n\n push!(rotors_w, this_rotor)\n\n else\n push!(rotors_w_stacked_up, this_rotor)\n\n # Generate lower rotor if this is a stacked rotor\n copy_rotor = stackedrotors_low[ 1+(i+1*!stckd_corotating)%2 ]\n this_rotor = deepcopy(copy_rotor)\n\n # Place rotor in position\n this_O += R_w*[0, 0, stckd_zoR_offset]\n vlm.setcoordsystem(this_rotor, this_O, this_Oaxis; user=true)\n\n # Rotate rotor to be tip-to-tip with others\n vlm.rotate(this_rotor, (-1)^(!CW_w) * (init_ori_stackedrotor+stckd_phase))\n\n # Add the original polars that are not copied with deepcopy\n this_rotor.airfoils = copy_rotor.airfoils\n this_rotor._polars = copy_rotor._polars\n this_rotor._polarroot = copy_rotor._polarroot\n this_rotor._polartip = copy_rotor._polartip\n\n push!(rotors_w_stacked_low, this_rotor)\n end\n end\n end\n\n # Assemble fixed section of the wing (middle section + stacked rotors)\n main_wing_fixed = vlm.WingSystem()\n vlm.addwing(main_wing_fixed, \"WingM\", wing_md)\n\n if add_rotors\n for (i, rotor) in enumerate(rotors_w_stacked_up)\n vlm.addwing(main_wing_fixed, \"StackedRotorUp$i\", rotor)\n end\n for (i, rotor) in enumerate(rotors_w_stacked_low)\n vlm.addwing(main_wing_fixed, \"StackedRotorLow$i\", rotor)\n end\n end\n\n # Assemble wing tip sections\n main_wing_R = vlm.WingSystem()\n vlm.addwing(main_wing_R, \"Tip\", wing_R)\n vlm.addwing(main_wing_R, \"Winglet\", winglet_R)\n\n main_wing_L = vlm.WingSystem()\n vlm.addwing(main_wing_L, \"Tip\", wing_L)\n vlm.addwing(main_wing_L, \"Winglet\", winglet_L)\n\n # Assemble moving sections of the wing\n main_wing_moving = vlm.WingSystem()\n vlm.addwing(main_wing_moving, \"WingR\", main_wing_R)\n vlm.addwing(main_wing_moving, \"WingL\", main_wing_L)\n\n if add_rotors\n for (i, rotor) in enumerate(rotors_w)\n vlm.addwing(main_wing_moving, \"Rotor$i\", rotor)\n end\n end\n\n\n # Align moving and fixed section with their pivot line\n x_off_w = pivot_w*b_w/AR_w # offset to align with pivot line\n O_off_w = [-x_off_w, 0.0, 0.0]\n\n vlm.setcoordsystem(wing_md, O_off_w, Im)\n\n for vlmwing in main_wing_moving.wings\n if typeof(vlmwing)==vlm.Rotor\n vlm.setcoordsystem(vlmwing, vlmwing._wingsystem.O + O_off_w,\n vlmwing._wingsystem.Oaxis; user=false)\n else\n vlm.setcoordsystem(vlmwing, vlmwing.O + O_off_w, vlmwing.Oaxis)\n end\n end\n\n # Place tilting sections at main-wing tip\n O_mv = (md_w*b_w/2)*[tand(lambda_w), 0, tand(gamma_w)]\n\n # Initial rotation of moving sections\n Oaxis_wmv = gt.rotation_matrix(0.0, -init_ori, 0.0)\n vlm.setcoordsystem(main_wing_moving, O_mv, Oaxis_wmv)\n\n # Assemble main wing\n main_wing = vlm.WingSystem()\n vlm.addwing(main_wing, \"Fixed\", main_wing_fixed)\n vlm.addwing(main_wing, \"Moving\", main_wing_moving)\n\n # Position of main wing\n O_w = [l_pos_w + x_off_w, 0, h_pos_w]\n Oaxis_w = gt.rotation_matrix(0.0, 0.0, 0.0)\n vlm.setcoordsystem(main_wing, O_w, Oaxis_w)\n\n # ------------ TANDEM WING -------------------------------------------\n if verbose; println(\"\\t\"^(v_lvl+1)*\"Generating tandem wing assembly...\"); end;\n\n # Generate tandem wing\n twing = vlm.simpleWing(b_tw, AR_tw, tr_tw, twist_r_tw, lambda_tw,\n gamma_tw; twist_tip=twist_t_tw, n=n_tw, r=r_tw)\n\n # Middle section\n pos_md_tw = [-md_tw, 0.0, md_tw]\n clen_md_tw = [md_tw + (1/tr_tw)*(1-md_tw), 1/tr_tw, md_tw + (1/tr_tw)*(1-md_tw)]\n twist_md_tw = [twist_r_tw + md_tw*(twist_t_tw-twist_r_tw),\n twist_r_tw, twist_r_tw + md_tw*(twist_t_tw-twist_r_tw)]\n twing_md = vlm.complexWing(b_tw, AR_tw, ceil(Int, md_tw*n_tw), pos_md_tw,\n clen_md_tw, twist_md_tw,\n lambda_tw*ones(2), gamma_tw*ones(2);\n symmetric=false, chordalign=0.0,\n _ign1=true)\n # Left section\n pos_l_tw = [-1, pos_md_tw[1]]\n clen_l_tw = [1, clen_md_tw[1]]\n twist_l_tw = [twist_t_tw, twist_md_tw[1]]\n twing_L = vlm.complexWing(b_tw, AR_tw, ceil(Int, (1-md_tw)*n_tw/2), pos_l_tw,\n clen_l_tw, twist_l_tw,\n lambda_tw*ones(1), gamma_tw*ones(1);\n symmetric=false, chordalign=0.0,\n _ign1=true)\n # Right section\n pos_r_tw = [pos_md_tw[end], 1]\n clen_r_tw = [clen_md_tw[end], 1]\n twist_r_tw = [twist_md_tw[end], twist_t_tw]\n twing_R = vlm.complexWing(b_tw, AR_tw, ceil(Int, (1-md_tw)*n_tw/2), pos_r_tw,\n clen_r_tw, twist_r_tw,\n lambda_tw*ones(1), gamma_tw*ones(1);\n symmetric=false, chordalign=0.0,\n _ign1=true)\n\n ## Generate tandem-wing rotors (from right to left)\n if add_rotors\n\n if verbose; println(\"\\t\"^(v_lvl+2)*\"Generating tandem-wing rotors...\"); end;\n\n O_rotor_tw = [ ypos*[tan(lambda_tw*pi/180), 1, tan(gamma_tw*pi/180)] +\n [-xoc_offset_tandem*AR_tw/b_tw, 0, 0]\n for ypos in y_pos_rotor_tw]\n\n rotors_tw = vlm.Rotor[]\n\n for i in 1:2*nr_tw\n right = i<=nr_tw # Indicates which side of the wing\n\n copy_rotor = tiltrotors[1+(i+(CW_tw!=CW_w))%2]\n this_rotor = deepcopy(copy_rotor) # Alternates rotation orientation\n\n this_O = O_rotor_tw[ right ? i : nr_tw-(i-nr_tw-1)] # Chooses position\n this_O = [1 0 0; 0 (-1)^!right 0; 0 0 1]*this_O # Places it in correct side\n this_Oaxis = gt.rotation_matrix(0, (-1)^(i%2==0)*(-1)^right*tandem_pitchtilt, 0)\n\n # Place rotor in position\n vlm.setcoordsystem(this_rotor, this_O, this_Oaxis; user=true)\n\n # Rotates rotor to be tip-to-tip with others\n vlm.rotate(this_rotor, (-1)^(!CW_tw) * init_ori_rotor)\n\n # Add the original polars that are not copied with deepcopy\n this_rotor.airfoils = copy_rotor.airfoils\n this_rotor._polars = copy_rotor._polars\n this_rotor._polarroot = copy_rotor._polarroot\n this_rotor._polartip = copy_rotor._polartip\n\n push!(rotors_tw, this_rotor)\n end\n end\n\n # Assemble moving sections of the wing\n tandem_wing_moving = vlm.WingSystem()\n vlm.addwing(tandem_wing_moving, \"WingR\", twing_R)\n vlm.addwing(tandem_wing_moving, \"WingL\", twing_L)\n\n if add_rotors\n for (i, rotor) in enumerate(rotors_tw)\n vlm.addwing(tandem_wing_moving, \"Rotor$i\", rotor)\n end\n end\n\n # Align moving and fixed section with their pivot line\n x_off_tw = pivot_tw*b_tw/AR_tw # offset to align with pivot line\n O_off_tw = [-x_off_tw, 0.0, 0.0]\n\n vlm.setcoordsystem(twing_md, O_off_tw, Im)\n\n for vlmwing in tandem_wing_moving.wings\n if typeof(vlmwing)==vlm.Rotor\n vlm.setcoordsystem(vlmwing, vlmwing._wingsystem.O + O_off_tw,\n vlmwing._wingsystem.Oaxis; user=false)\n else\n vlm.setcoordsystem(vlmwing, vlmwing.O + O_off_tw, vlmwing.Oaxis)\n end\n end\n\n # Initial rotation of moving sections\n Oaxis_twmv = gt.rotation_matrix(0.0, -init_ori, 0.0)\n vlm.setcoordsystem(tandem_wing_moving, zeros(3), Oaxis_twmv)\n\n # Assemble tandem wing\n tandem_wing = vlm.WingSystem()\n vlm.addwing(tandem_wing, \"FixedWing\", twing_md)\n vlm.addwing(tandem_wing, \"Moving\", tandem_wing_moving)\n\n # Position of tandem wing\n O_tw = [l_pos_tw + x_off_tw, 0, h_pos_tw]\n Oaxis_tw = gt.rotation_matrix(0.0, 0.0, 0.0)\n vlm.setcoordsystem(tandem_wing, O_tw, Oaxis_tw)\n\n # ------------ FUSELAGE ----------------------------------------------\n if verbose; println(\"\\t\"^(v_lvl+1)*\"Generating fuselage...\"); end;\n\n # Generate fuselage\n fuselage = generatefuselage_vahana(l_f; ncells=20)\n\n # All grids get stored here\n body = gt.MultiGrid(3)\n gt.addgrid(body, \"Fuselage\", fuselage)\n\n # Generate pylons of stacked rotors\n if add_rotors\n if verbose; println(\"\\t\"^(v_lvl+1)*\"Generating pylons...\"); end;\n\n pylon_pos = 0.70\n pylon_length = stckd_xoc_offset*AR_w/b_w * pylon_pos\n\n for i in stacked\n pylon = generatepylon(pylon_length; ncells=5)\n\n right = i<=nr_w\n this_O = O_rotor_w[ right ? i : nr_w-(i-nr_w-1)] # Chooses position\n this_O = [1 0 0; 0 (-1)^!right 0; 0 0 1]*this_O # Places it in correct side\n this_O += main_wing.O # Translates it with the wing\n # Offsets it according to length\n this_O += [1/3*0.5*pylon_pos, 0, 3*R_w*stckd_zoR_offset]\n rotation = gt.rotation_matrix2(0, 0, 0)\n\n gt.lintransform!(pylon, rotation, this_O)\n\n gt.addgrid(body, \"Pylon$i\", pylon)\n end\n end\n\n\n ############################################################################\n # DEFINE VEHICLE\n ############################################################################\n\n # System of all FLOWVLM objects\n system = vlm.WingSystem()\n vlm.addwing(system, \"MainWing\", main_wing)\n vlm.addwing(system, \"TandemWing\", tandem_wing)\n\n # Tilting systems\n tilting_systems = (main_wing_moving, tandem_wing_moving)\n\n # Rotors grouped by systems with shared RPM control\n if add_rotors\n rotor_systems = (rotors_w, rotors_w_stacked_up, rotors_w_stacked_low, rotors_tw)\n else\n rotor_systems = ()\n end\n\n # System solved through VLM solver\n vlm_system_m = vlm.WingSystem()\n vlm.addwing(vlm_system_m, \"letL\", winglet_L)\n vlm.addwing(vlm_system_m, \"L\", wing_L)\n vlm.addwing(vlm_system_m, \"middle\", wing_md)\n vlm.addwing(vlm_system_m, \"R\", wing_R)\n vlm.addwing(vlm_system_m, \"letR\", winglet_R)\n\n vlm_system_t = vlm.WingSystem()\n vlm.addwing(vlm_system_t, \"L\", twing_L)\n vlm.addwing(vlm_system_t, \"R\", twing_R)\n\n vlm_system = vlm.WingSystem()\n if add_wings\n vlm.addwing(vlm_system, \"MWing\", vlm_system_m)\n vlm.addwing(vlm_system, \"TWing\", vlm_system_t)\n end\n\n # All rotors\n if add_rotors\n rotors = vcat(rotors_w, rotors_w_stacked_up, rotors_w_stacked_low, rotors_tw)\n end\n\n # System that will shed a VPM wake\n wake_system = vlm.WingSystem()\n\n if add_wings\n vlm.addwing(wake_system, \"SolveVLM\", vlm_system)\n end\n\n if add_rotors\n if VehicleType==uns.VLMVehicle\n for (i, rotor) in enumerate(rotors)\n vlm.addwing(wake_system, \"Rotor$i\", rotor)\n end\n else\n # Mute warnings regarding potential colinear vortex filaments. This is\n # needed since the quasi-steady solver will probe induced velocities at the\n # lifting line of the blade\n uns.vlm.VLMSolver._mute_warning(true)\n end\n end\n\n # Visualization grids that are rotated and translated along with the vehicle\n grids = [body]\n\n # Define vehicle\n vehicle = VehicleType( system;\n tilting_systems=tilting_systems,\n rotor_systems=rotor_systems,\n vlm_system=vlm_system,\n wake_system=wake_system,\n grids=grids\n )\n\n return vehicle\nend","category":"page"},{"location":"examples/vahana-vehicle/","page":"Vehicle Definition","title":"Vehicle Definition","text":"info: Full example\nThe function that defines the fuselage is given in the full example under examples/vahana/vahana_vehicle.jl","category":"page"},{"location":"examples/heavingwing/#Heaving-Wing","page":"Heaving Wing","title":"Heaving Wing","text":"","category":"section"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"
\n \n
","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"In this example we extend the simple wing case to create a case of interactional aerodynamics. We will place a straight wing flying in front of the original swept-back wing. The front wing will be moving in a heaving motion, shedding a wake that impinges on the back wing causing an unsteady loading.","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"This simulation exemplify the following features:","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"Defining a uns.VLMVehicle with multiple surfaces, one of them declared as a tilting surface\nDefining the control inputs for a tilting system in uns.KinematicManeuver (in this case, tilting the surface over time in a heaving motion)","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"
","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"#=##############################################################################\n# DESCRIPTION\n Swept-back wing flying in the wake of a tandem wing in heaving motion.\n\n# AUTHORSHIP\n * Author : Eduardo J. Alvarez (edoalvarez.com)\n * Email : Edo.AlvarezR@gmail.com\n * Created : Mar 2023\n * Last updated : Mar 2023\n * License : MIT\n=###############################################################################\n\nimport FLOWUnsteady as uns\nimport FLOWVLM as vlm\n\nrun_name = \"heavingwing-example\" # Name of this simulation\n\nsave_path = run_name # Where to save this simulation\nparaview = true # Whether to visualize with Paraview\n\n\n# ----------------- GEOMETRY PARAMETERS ----------------------------------------\n# Back wing description\nb_back = 2.489 # (m) span length\nar_back = 5.0 # Aspect ratio b/c_tip\ntr_back = 1.0 # Taper ratio c_tip/c_root\ntwist_root_back = 0.0 # (deg) twist at root\ntwist_tip_back = 0.0 # (deg) twist at tip\nlambda_back = 45.0 # (deg) sweep\ngamma_back = 0.0 # (deg) dihedral\n\n# Front wing description\nb_front = 0.75*b_back\nar_front = 5.0\ntr_front = 1.0\ntwist_root_front= 5.0\ntwist_tip_front = 0.0\nlambda_front = 0.0\ngamma_front = 0.0\n\ndx = 0.75*b_back # (m) spacing between back and front wings\n\n# Discretization\nn_back = 50 # Number of spanwise elements per side\nr_back = 2.0 # Geometric expansion of elements\ncentral_back = false # Whether expansion is central\n\nn_front = 40\nr_front = 10.0\ncentral_front = false\n\n# ----------------- SIMULATION PARAMETERS --------------------------------------\n# Vehicle motion\nmagVvehicle = 49.7 # (m/s) vehicle velocity\nAOA = 4.2 # (deg) angle of attack of back wing\nfrequency = 25.0 # (Hz) oscillation frequency in heaving motion\namplitude = 5.0 # (deg) AOA amplitude in heaving motion\n\n# Freestream\nmagVinf = 1e-8 # (m/s) freestream velocity\nrho = 0.93 # (kg/m^3) air density\nqinf = 0.5*rho*magVvehicle^2 # (Pa) static pressure (reference)\n\nVinf(X, t) = t==0 ? magVvehicle*[1,0,0] : magVinf*[1,0,0] # Freestream function\n\n# NOTE: In this simulation we will have the vehicle (the two wings) move while\n# the freestream is zero. However, a zero freestream can cause some\n# numerical instabilities in the solvers. To avoid instabilities, it is\n# recommended giving a full freestream velocity (or the velocity of the\n# vehicle) in the first time step `t=0`, and a negligible small velocity\n# at any other time, as shown above in the definition of `Vinf(X ,t)`.\n\nmagVref = magVvehicle # (m/s) reference velocity (for calculation\n # purposes since freestream is zero)\n\n# ----------------- SOLVER PARAMETERS ------------------------------------------\n# Time parameters\nwakelength = 4.0*b_back # (m) length of wake to be resolved\nttot = wakelength/magVref # (s) total simulation time\nnsteps = 200 # Number of time steps\n\n# VLM and VPM parameters\np_per_step = 2 # Number of particle sheds per time step\n\nsigma_vlm_solver= -1 # VLM-on-VLM smoothing radius (deactivated with <0)\nsigma_vlm_surf = 0.05*b_back # VLM-on-VPM smoothing radius\nlambda_vpm = 2.0 # VPM core overlap\n # VPM smoothing radius\nsigma_vpm_overwrite = lambda_vpm * magVref * (ttot/nsteps)/p_per_step\n\nshed_starting = true # Whether to shed starting vortex\nvlm_rlx = 0.7 # VLM relaxation\n\n\n# ----------------- 1) VEHICLE DEFINITION --------------------------------------\nprintln(\"Generating geometry...\")\n\n# Generate back wing\nbackwing = vlm.simpleWing(b_back, ar_back, tr_back, twist_root_back,\n lambda_back, gamma_back; twist_tip=twist_tip_back,\n n=n_back, r=r_back, central=central_back);\n\n# Pitch back wing to its angle of attack\nO = [0.0, 0.0, 0.0] # New position\nOaxis = uns.gt.rotation_matrix2(0.0, -AOA, 0.0) # New orientation\nvlm.setcoordsystem(backwing, O, Oaxis)\n\n# Generate front wing\nfrontwing = vlm.simpleWing(b_front, ar_front, tr_front, twist_root_front,\n lambda_front, gamma_front; twist_tip=twist_tip_front,\n n=n_front, r=r_front, central=central_front);\n\n# Move wing to the front\nO = [-dx, 0.0, 0.0] # New position\nOaxis = uns.gt.rotation_matrix2(0.0, 0.0, 0.0) # New orientation\nvlm.setcoordsystem(frontwing, O, Oaxis)\n\n\nprintln(\"Generating vehicle...\")\n\n# Places the front wing into its own system that will be heaving\nheavingsystem = vlm.WingSystem() # Tilting system\nvlm.addwing(heavingsystem, \"FrontWing\", frontwing)\n\n# Generate vehicle\nsystem = vlm.WingSystem() # System of all FLOWVLM objects\nvlm.addwing(system, \"BackWing\", backwing)\nvlm.addwing(system, \"Heaving\", heavingsystem)\n\ntilting_systems = (heavingsystem, ); # Tilting systems\n\nvlm_system = system; # System solved through VLM solver\nwake_system = system; # System that will shed a VPM wake\n\nvehicle = uns.VLMVehicle( system;\n tilting_systems=tilting_systems,\n vlm_system=vlm_system,\n wake_system=wake_system\n );\n\n# NOTE: Through the `tilting_systems` keyword argument to `uns.VLMVehicle` we\n# have declared that the front wing will be tilting throughout the\n# simulation, acting as a control surface. We will later declare the\n# control inputs to this tilting surface when we define the\n# `uns.KinematicManeuver`\n\n\n# ------------- 2) MANEUVER DEFINITION -----------------------------------------\n\n# Non-dimensional translational velocity of vehicle over time\nVvehicle(t) = [-1, 0, 0] # <---- Vehicle is traveling in the -x direction\n\n# Angle of the vehicle over time\nanglevehicle(t) = zeros(3)\n\n# Control inputs\nangle_frontwing(t) = [0, amplitude*sin(2*pi*frequency * t*ttot), 0] # Tilt angle of front wing\n\nangle = (angle_frontwing, ) # Angle of each tilting system\nRPM = () # RPM of each rotor system (none)\n\nmaneuver = uns.KinematicManeuver(angle, RPM, Vvehicle, anglevehicle)\n\n# NOTE: `FLOWUnsteady.KinematicManeuver` defines a maneuver with prescribed\n# kinematics. `Vvehicle` defines the velocity of the vehicle (a vector)\n# over time. `anglevehicle` defines the attitude of the vehicle over time.\n# `angle` defines the tilting angle of each tilting system over time.\n# `RPM` defines the RPM of each rotor system over time.\n# Each of these functions receives a nondimensional time `t`, which is the\n# simulation time normalized by the total time `ttot`, from 0 to\n# 1, beginning to end of simulation. They all return a nondimensional\n# output that is then scaled by either a reference velocity (`Vref`) or\n# a reference RPM (`RPMref`). Defining the kinematics and controls of the\n# maneuver in this way allows the user to have more control over how fast\n# to perform the maneuver, since the total time, reference velocity and\n# RPM are then defined in the simulation parameters shown below.\n ","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"At this point we can verify that we have correctly defined the control inputs of the maneuver calling FLOWUnsteady.plot_maneuver as follows:","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"uns.plot_maneuver(maneuver)","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"
\n \"Pic\n
\n
","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"Here we confirm that the angle of the tilting surface along the y-axis of the vehicle (pitch) will change sinusoidally with amplitude 5^circ, as expected. This function also plots the kinematics of the vehicle, which in this case are rather uneventful (straight line).","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"Now we continue defining the simulation:","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"# ------------- 3) SIMULATION DEFINITION ---------------------------------------\n\nVref = magVvehicle # Reference velocity to scale maneuver by\nRPMref = 0.0 # Reference RPM to scale maneuver by\nVinit = Vref*Vvehicle(0) # Initial vehicle velocity\nWinit = pi/180*(anglevehicle(1e-6) - anglevehicle(0))/(1e-6*ttot) # Initial angular velocity\n\n # Maximum number of particles\nmax_particles = (nsteps+1)*(vlm.get_m(vehicle.vlm_system)*(p_per_step+1) + p_per_step)\n\nsimulation = uns.Simulation(vehicle, maneuver, Vref, RPMref, ttot;\n Vinit=Vinit, Winit=Winit);\n\n\n\n\n# ------------- 4) MONITORS DEFINITIONS ----------------------------------------\n\nfigs, figaxs = [], [] # Figures generated by monitors\n\n# Generate function that computes aerodynamic forces\ncalc_aerodynamicforce_fun = uns.generate_calc_aerodynamicforce(;\n add_parasiticdrag=true,\n add_skinfriction=true,\n airfoilpolar=\"xf-rae101-il-1000000.csv\"\n )\n\nL_dir(t) = [0, 0, 1] # Direction of lift\nD_dir(t) = [1, 0, 0] # Direction of drag\n\n# Generate back wing monitor\nmonitor_backwing = uns.generate_monitor_wing(backwing, Vinf, b_back, ar_back,\n rho, qinf, nsteps;\n calc_aerodynamicforce_fun=calc_aerodynamicforce_fun,\n L_dir=L_dir,\n D_dir=D_dir,\n out_figs=figs,\n out_figaxs=figaxs,\n save_path=save_path,\n run_name=run_name*\"-backwing\",\n title_lbl=\"Back Wing\",\n figname=\"back-wing monitor\",\n )\n\n# Generate front wing monitor\nmonitor_frontwing = uns.generate_monitor_wing(frontwing, Vinf, b_front, ar_front,\n rho, qinf, nsteps;\n calc_aerodynamicforce_fun=calc_aerodynamicforce_fun,\n L_dir=L_dir,\n D_dir=D_dir,\n out_figs=figs,\n out_figaxs=figaxs,\n save_path=save_path,\n run_name=run_name*\"-frontwing\",\n title_lbl=\"Front Wing\",\n figname=\"front-wing monitor\",\n )\n\nmonitors = uns.concatenate(monitor_backwing, monitor_frontwing)\n\n\n# ------------- 5) RUN SIMULATION ----------------------------------------------\nprintln(\"Running simulation...\")\n\nuns.run_simulation(simulation, nsteps;\n # ----- SIMULATION OPTIONS -------------\n Vinf=Vinf,\n rho=rho,\n # ----- SOLVERS OPTIONS ----------------\n p_per_step=p_per_step,\n max_particles=max_particles,\n sigma_vlm_solver=sigma_vlm_solver,\n sigma_vlm_surf=sigma_vlm_surf,\n sigma_rotor_surf=sigma_vlm_surf,\n sigma_vpm_overwrite=sigma_vpm_overwrite,\n vlm_rlx=vlm_rlx,\n shed_starting=shed_starting,\n extra_runtime_function=monitors,\n # ----- OUTPUT OPTIONS ------------------\n save_path=save_path,\n run_name=run_name,\n );\n\n\n\n\n# ----------------- 6) VISUALIZATION -------------------------------------------\nif paraview\n println(\"Calling Paraview...\")\n\n # Files to open in Paraview\n files = joinpath(save_path, run_name*\"_BackWing_vlm...vtk;\")\n files *= run_name*\"_Heaving_FrontWing_vlm...vtk;\"\n files *= run_name*\"_pfield...xmf;\"\n\n # Call Paraview\n run(`paraview --data=$(files)`)\n\nend\n\n","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"\n Run time: ~10 minutes on a Dell Precision 7760 laptop.\n
\n Reduce resolution (`n` and `nsteps`) to speed up simulation without loss of accuracy.\n
\n

","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"As the simulation runs, you will see the monitors (shown below) plotting the lift and drag coefficients over time along with the loading distribution.","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"
\n \"Pic\n
\n
\n \"Pic\n
\n
","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"(red = beginning,\nblue = end)","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"In these monitors, we clearly see the fluctuation of C_L and C_D over time due to the heaving motion (front wing) and the wake impingement (back wing). The plots of loading distribution seem very convoluted since the loading fluctuates over time, and all the time steps are super imposed in the monitor.","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"To more clearly see what the loading distribution is doing, it is insightful to plot the loading as an animation as shown below.","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"
\n \"Vid\n
\n
","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"info: Animations\nCheck the full example under examples/heavingwing/ to see how to postprocess the simulation and generate this animation.","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"info: Quasi-steady solver\nFLOWUnsteady also provides a quasi-steady solver for low-fidelity simulations that replaces the particle field with rigid semi-infinite wakes. The quasi-steady solver is invoked by simply changing the line that defines the vehicle fromvehicle = uns.VLMVehicle(...)tovehicle = uns.QVLMVehicle(...)(yes, it is only one character of a difference)Use the keyword argument save_horseshoes = false in uns.run_simulation to visualize the semi-infinite rigid wake. The quasi-steady simulation looks like this:","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"

\n \"Vid\"\n

","category":"page"},{"location":"examples/blownwing-aero/#blownwingaero","page":"Wing-on-Prop Interactions","title":"Wing-on-Prop Interactions","text":"","category":"section"},{"location":"examples/blownwing-aero/","page":"Wing-on-Prop Interactions","title":"Wing-on-Prop Interactions","text":"
\n \n
","category":"page"},{"location":"examples/blownwing-aero/","page":"Wing-on-Prop Interactions","title":"Wing-on-Prop Interactions","text":"In this example we show mount propellers on a swept wing. The wing is modeled using the actuator line model that represents the wing as a lifting line. This wing model is accurate for capturing wing-on-prop interactions. For instance, the rotor will experience an unsteady blade loading (and increased tonal noise) caused by the turning of the flow ahead of the wing leading edge. However, this simple wing model is not adecuate for capturing prop-on-wing interactions (see the next two sections to accurately predict prop-on-wing interactions).","category":"page"},{"location":"examples/blownwing-aero/","page":"Wing-on-Prop Interactions","title":"Wing-on-Prop Interactions","text":"#=##############################################################################\n# DESCRIPTION\n Simulation of swept-back wing with twin props mounted mid span blowing on\n the wing.\n\n# AUTHORSHIP\n * Author : Eduardo J. Alvarez (edoalvarez.com)\n * Email : Edo.AlvarezR@gmail.com\n * Created : Apr 2023\n * Last updated : Apr 2023\n * License : MIT\n=###############################################################################\n\n\nimport FLOWUnsteady as uns\nimport FLOWVLM as vlm\nimport FLOWVPM as vpm\n\nrun_name = \"blownwing-example\" # Name of this simulation\nsave_path = run_name # Where to save this simulation\nparaview = true # Whether to visualize with Paraview\n\n# ----------------- GEOMETRY PARAMETERS ----------------------------------------\n# Wing geometry\nb = 2.489 # (m) span length\nar = 5.0 # Aspect ratio b/c_tip\ntr = 1.0 # Taper ratio c_tip/c_root\ntwist_root = 0.0 # (deg) twist at root\ntwist_tip = 0.0 # (deg) twist at tip\nlambda = 45.0 # (deg) sweep\ngamma = 0.0 # (deg) dihedral\n\n# Rotor geometry\nR = 0.075*b # (m) rotor radius\nRhub = 0.075*R # (m) hub radius\nB = 2 # Number of blades\nblade_file = \"apc10x7_blade.csv\" # Blade geometry\ndata_path = uns.def_data_path # Path to rotor database\npitch = 5.0 # (deg) collective pitch of blades\nxfoil = true # Whether to run XFOIL\nncrit = 9 # Turbulence criterion for XFOIL\n\n# Vehicle assembly\nAOAwing = 4.2 # (deg) wing angle of attack\nspanpos = [-0.5, 0.5] # Semi-span position of each rotor, 2*y/b\nxpos = [-0.5, -0.5] # x-position of rotors relative to LE, x/c\nzpos = [0.0, 0.0] # z-position of rotors relative to LE, z/c\nCWs = [false, true] # Clockwise rotation for each rotor\nnrotors = length(spanpos) # Number of rotors\n\n# Discretization\nn_wing = 50 # Number of spanwise elements per side\nr_wing = 2.0 # Geometric expansion of elements\nn_rotor = 15 # Number of blade elements per blade\nr_rotor = 1/10 # Geometric expansion of elements\n\n# Check that we declared all the inputs that we need for each rotor\n@assert length(spanpos)==length(xpos)==length(zpos)==length(CWs) \"\"*\n \"Invalid rotor inputs! Check that spanpos, xpos, zpos, and CWs have the same length\"\n\n# ----------------- SIMULATION PARAMETERS --------------------------------------\n# Vehicle motion\nmagVvehicle = 49.7 # (m/s) vehicle velocity\nAOA = 0.0 # (deg) vehicle angle of attack\n\n# Freestream\nmagVinf = 1e-8 # (m/s) freestream velocity\nrho = 0.93 # (kg/m^3) air density\nmu = 1.85508e-5 # (kg/ms) air dynamic viscosity\nspeedofsound = 342.35 # (m/s) speed of sound\nmagVref = sqrt(magVinf^2 + magVvehicle^2) # (m/s) reference velocity\nqinf = 0.5*rho*magVref^2 # (Pa) reference static pressure\n\nVinf(X, t) = t==0 ? magVvehicle*[1,0,0] : magVinf*[1,0,0] # Freestream function\n\n# Rotor operation\nJ = 0.9 # Advance ratio Vref/(nD)\nRPM = 60*magVref/(J*2*R) # RPM\n\nRec = rho * magVref * (b/ar) / mu # Chord-based wing Reynolds number\nReD = 2*pi*RPM/60*R * rho/mu * 2*R # Diameter-based rotor Reynolds number\nMatip = 2*pi*RPM/60 * R / speedofsound # Tip Mach number\n\nprintln(\"\"\"\n Vref: $(round(magVref, digits=1)) m/s\n RPM: $(RPM)\n Matip: $(round(Matip, digits=3))\n ReD: $(round(ReD, digits=0))\n Rec: $(round(Rec, digits=0))\n\"\"\")\n\n# ----------------- SOLVER PARAMETERS ------------------------------------------\n\n# Aerodynamic solver\nVehicleType = uns.UVLMVehicle # Unsteady solver\n# VehicleType = uns.QVLMVehicle # Quasi-steady solver\nconst_solution = VehicleType==uns.QVLMVehicle # Whether to assume that the\n # solution is constant or not\n# Time parameters\nnrevs = 15 # Number of revolutions in simulation\nnsteps_per_rev = 36 # Time steps per revolution\nnsteps = const_solution ? 2 : nrevs*nsteps_per_rev # Number of time steps\nttot = nsteps/nsteps_per_rev / (RPM/60) # (s) total simulation time\n\n# VPM particle shedding\np_per_step = 4 # Sheds per time step\nshed_starting = true # Whether to shed starting vortex\nshed_unsteady = true # Whether to shed vorticity from unsteady loading\nunsteady_shedcrit = 0.001 # Shed unsteady loading whenever circulation\n # fluctuates by more than this ratio\nmax_particles = nrotors*((2*n_rotor+1)*B)*nsteps*p_per_step + 1 # Maximum number of particles\nmax_particles += (nsteps+1)*(2*n_wing*(p_per_step+1) + p_per_step)\n\n# Regularization\nsigma_vlm_surf = b/100 # VLM-on-VPM smoothing radius\nsigma_rotor_surf= R/50 # Rotor-on-VPM smoothing radius\nlambda_vpm = 2.125 # VPM core overlap\n # VPM smoothing radius\nsigma_vpm_overwrite = lambda_vpm * 2*pi*R/(nsteps_per_rev*p_per_step)\nsigmafactor_vpmonvlm= 1 # Shrink particles by this factor when\n # calculating VPM-on-VLM/Rotor induced velocities\n\n# Rotor solver\nvlm_rlx = 0.5 # VLM relaxation <-- this also applied to rotors\nhubtiploss_correction = vlm.hubtiploss_nocorrection # Hub and tip correction\n\n# VPM solver\nvpm_integration = vpm.rungekutta3 # VPM temporal integration scheme\n# vpm_integration = vpm.euler\n\nvpm_viscous = vpm.Inviscid() # VPM viscous diffusion scheme\n# vpm_viscous = vpm.CoreSpreading(-1, -1, vpm.zeta_fmm; beta=100.0, itmax=20, tol=1e-1)\n\nvpm_SFS = vpm.SFS_none # VPM LES subfilter-scale model\n# vpm_SFS = vpm.DynamicSFS(vpm.Estr_fmm, vpm.pseudo3level_positive;\n# alpha=0.999, maxC=1.0,\n# clippings=[vpm.clipping_backscatter])\n\nif VehicleType == uns.QVLMVehicle\n # Mute warnings regarding potential colinear vortex filaments. This is\n # needed since the quasi-steady solver will probe induced velocities at the\n # lifting line of the blade\n uns.vlm.VLMSolver._mute_warning(true)\nend\n\nprintln(\"\"\"\n Resolving wake for $(round(ttot*magVref/b, digits=1)) span distances\n\"\"\")\n\n# ----------------- 1) VEHICLE DEFINITION --------------------------------------\n\n# -------- Generate components\nprintln(\"Generating geometry...\")\n\n# Generate wing\nwing = vlm.simpleWing(b, ar, tr, twist_root, lambda, gamma;\n twist_tip=twist_tip, n=n_wing, r=r_wing);\n\n# Pitch wing to its angle of attack\nO = [0.0, 0.0, 0.0] # New position\nOaxis = uns.gt.rotation_matrix2(0, -AOAwing, 0) # New orientation\nvlm.setcoordsystem(wing, O, Oaxis)\n\n# Generate rotors\nrotors = vlm.Rotor[]\nfor ri in 1:nrotors\n\n # Generate rotor\n rotor = uns.generate_rotor(R, Rhub, B, blade_file;\n pitch=pitch,\n n=n_rotor, CW=CWs[ri], blade_r=r_rotor,\n altReD=[RPM, J, mu/rho],\n xfoil=xfoil,\n ncrit=ncrit,\n data_path=data_path,\n verbose=true,\n verbose_xfoil=false,\n plot_disc=false\n );\n\n # Determine position along wing LE\n y = spanpos[ri]*b/2\n x = abs(y)*tand(lambda) + xpos[ri]*b/ar\n z = abs(y)*tand(gamma) + zpos[ri]*b/ar\n\n # Account for angle of attack of wing\n nrm = sqrt(x^2 + z^2)\n x = (x==0 ? 1 : sign(x))*nrm*cosd(AOAwing)\n z = -(z==0 ? 1 : sign(z))*nrm*sind(AOAwing)\n\n # Translate rotor to its position along wing\n O = [x, y, z] # New position\n Oaxis = uns.gt.rotation_matrix2(0, 0, 180) # New orientation\n vlm.setcoordsystem(rotor, O, Oaxis)\n\n push!(rotors, rotor)\nend\n\n\n# -------- Generate vehicle\nprintln(\"Generating vehicle...\")\n\n# System of all FLOWVLM objects\nsystem = vlm.WingSystem()\n\nvlm.addwing(system, \"Wing\", wing)\n\nfor (ri, rotor) in enumerate(rotors)\n vlm.addwing(system, \"Rotor$(ri)\", rotor)\nend\n\n# System solved through VLM solver\nvlm_system = vlm.WingSystem()\nvlm.addwing(vlm_system, \"Wing\", wing)\n\n# Systems of rotors\nrotor_systems = (rotors, );\n\n# System that will shed a VPM wake\nwake_system = vlm.WingSystem() # System that will shed a VPM wake\nvlm.addwing(wake_system, \"Wing\", wing)\n # NOTE: Do NOT include rotor when using the quasi-steady solver\nif VehicleType != uns.QVLMVehicle\n for (ri, rotor) in enumerate(rotors)\n vlm.addwing(wake_system, \"Rotor$(ri)\", rotor)\n end\nend\n\n# Pitch vehicle to its angle of attack\nO = [0.0, 0.0, 0.0] # New position\nOaxis = uns.gt.rotation_matrix2(0, -AOA, 0) # New orientation\nvlm.setcoordsystem(system, O, Oaxis)\n\nvehicle = VehicleType( system;\n vlm_system=vlm_system,\n rotor_systems=rotor_systems,\n wake_system=wake_system\n );\n\n\n# ------------- 2) MANEUVER DEFINITION -----------------------------------------\n# Non-dimensional translational velocity of vehicle over time\nVvehicle(t) = [-1, 0, 0] # <---- Vehicle is traveling in the -x direction\n\n# Angle of the vehicle over time\nanglevehicle(t) = zeros(3)\n\n# RPM control input over time (RPM over `RPMref`)\nRPMcontrol(t) = 1.0\n\nangles = () # Angle of each tilting system (none)\nRPMs = (RPMcontrol, ) # RPM of each rotor system\n\nmaneuver = uns.KinematicManeuver(angles, RPMs, Vvehicle, anglevehicle)\n\n\n# ------------- 3) SIMULATION DEFINITION ---------------------------------------\n\nVref = magVvehicle # Reference velocity to scale maneuver by\nRPMref = RPM # Reference RPM to scale maneuver by\nVinit = Vref*Vvehicle(0) # Initial vehicle velocity\nWinit = pi/180*(anglevehicle(1e-6) - anglevehicle(0))/(1e-6*ttot) # Initial angular velocity\n\nsimulation = uns.Simulation(vehicle, maneuver, Vref, RPMref, ttot;\n Vinit=Vinit, Winit=Winit);\n\n# ------------- 4) MONITORS DEFINITIONS ----------------------------------------\n\n# Generate function that computes wing aerodynamic forces\ncalc_aerodynamicforce_fun = uns.generate_calc_aerodynamicforce(;\n add_parasiticdrag=true,\n add_skinfriction=true,\n airfoilpolar=\"xf-rae101-il-1000000.csv\"\n )\n\nL_dir(t) = [0, 0, 1] # Direction of lift\nD_dir(t) = [1, 0, 0] # Direction of drag\n\n# Generate wing monitor\nmonitor_wing = uns.generate_monitor_wing(wing, Vinf, b, ar,\n rho, qinf, nsteps;\n calc_aerodynamicforce_fun=calc_aerodynamicforce_fun,\n L_dir=L_dir,\n D_dir=D_dir,\n save_path=save_path,\n run_name=run_name*\"-wing\",\n figname=\"wing monitor\",\n )\n\n# Generate rotors monitor\nmonitor_rotors = uns.generate_monitor_rotors(rotors, J, rho, RPM, nsteps;\n t_scale=RPM/60, # Scaling factor for time in plots\n t_lbl=\"Revolutions\", # Label for time axis\n save_path=save_path,\n run_name=run_name*\"-rotors\",\n figname=\"rotors monitor\",\n )\n# Concatenate monitors\nmonitors = uns.concatenate(monitor_wing, monitor_rotors)\n\n\n# ------------- 5) RUN SIMULATION ----------------------------------------------\nprintln(\"Running simulation...\")\n\n\n# Run simulation\nuns.run_simulation(simulation, nsteps;\n # ----- SIMULATION OPTIONS -------------\n Vinf=Vinf,\n rho=rho, mu=mu, sound_spd=speedofsound,\n # ----- SOLVERS OPTIONS ----------------\n p_per_step=p_per_step,\n max_particles=max_particles,\n vpm_integration=vpm_integration,\n vpm_viscous=vpm_viscous,\n vpm_SFS=vpm_SFS,\n sigma_vlm_surf=sigma_vlm_surf,\n sigma_rotor_surf=sigma_rotor_surf,\n sigma_vpm_overwrite=sigma_vpm_overwrite,\n sigmafactor_vpmonvlm=sigmafactor_vpmonvlm,\n vlm_rlx=vlm_rlx,\n hubtiploss_correction=hubtiploss_correction,\n shed_starting=shed_starting,\n shed_unsteady=shed_unsteady,\n unsteady_shedcrit=unsteady_shedcrit,\n extra_runtime_function=monitors,\n # ----- OUTPUT OPTIONS ------------------\n save_path=save_path,\n run_name=run_name,\n save_wopwopin=true, # <--- Generates input files for PSU-WOPWOP noise analysis\n );\n\n\n\n\n# ----------------- 6) VISUALIZATION -------------------------------------------\nif paraview\n println(\"Calling Paraview...\")\n\n # Files to open in Paraview\n files = joinpath(save_path, run_name*\"_pfield...xmf;\")\n for ri in 1:nrotors\n for bi in 1:B\n global files *= run_name*\"_Rotor$(ri)_Blade$(bi)_loft...vtk;\"\n end\n end\n files *= run_name*\"_Wing_vlm...vtk;\"\n\n # Call Paraview\n run(`paraview --data=$(files)`)\n\nend\n\n","category":"page"},{"location":"examples/blownwing-aero/","page":"Wing-on-Prop Interactions","title":"Wing-on-Prop Interactions","text":"\n Run time: ~60 minutes on a 16-core AMD EPYC 7302 processor.
\n
\n

","category":"page"},{"location":"examples/blownwing-aero/","page":"Wing-on-Prop Interactions","title":"Wing-on-Prop Interactions","text":"
\n \"Pic\n
\n
\n \"Pic\n
\n
","category":"page"},{"location":"examples/blownwing-aero/","page":"Wing-on-Prop Interactions","title":"Wing-on-Prop Interactions","text":"(red = beginning,\nblue = end)","category":"page"},{"location":"examples/blownwing-aero/","page":"Wing-on-Prop Interactions","title":"Wing-on-Prop Interactions","text":"
\n \"Vid\n
\n
","category":"page"},{"location":"examples/blownwing-aero/","page":"Wing-on-Prop Interactions","title":"Wing-on-Prop Interactions","text":"info: Unsteady Loading Animation\nCheck the full example under examples/blownwing/ to see how to postprocess the simulation and generate this animation.","category":"page"},{"location":"examples/propeller-quasisteady/#Quasi-Steady-Solver","page":"Quasi-Steady Solver","title":"Quasi-Steady Solver","text":"","category":"section"},{"location":"examples/propeller-quasisteady/","page":"Quasi-Steady Solver","title":"Quasi-Steady Solver","text":"While unsteady simulations are resolved using the reformulated VPM, FLOWUnsteady also provides a quasi-steady solver for low-fidelity simulations. The quasi-steady solver replaces the particle field with semi-infinite rigid wakes in wings and blade-element momentum theory in rotors.","category":"page"},{"location":"examples/propeller-quasisteady/","page":"Quasi-Steady Solver","title":"Quasi-Steady Solver","text":"The quasi-steady solver is invoked by simply changing the line","category":"page"},{"location":"examples/propeller-quasisteady/","page":"Quasi-Steady Solver","title":"Quasi-Steady Solver","text":"VehicleType = uns.UVLMVehicle","category":"page"},{"location":"examples/propeller-quasisteady/","page":"Quasi-Steady Solver","title":"Quasi-Steady Solver","text":"to","category":"page"},{"location":"examples/propeller-quasisteady/","page":"Quasi-Steady Solver","title":"Quasi-Steady Solver","text":"VehicleType = uns.QVLMVehicle","category":"page"},{"location":"examples/propeller-quasisteady/","page":"Quasi-Steady Solver","title":"Quasi-Steady Solver","text":"in the previous sections. The results of the quasi-steady solver are shown below, predicted through blade-element momentum theory.","category":"page"},{"location":"examples/propeller-quasisteady/","page":"Quasi-Steady Solver","title":"Quasi-Steady Solver","text":"
\n \"Pic\n
","category":"page"},{"location":"examples/rotorhover-quasisteady/#Quasi-Steady-Solver","page":"Quasi-Steady Solver","title":"Quasi-Steady Solver","text":"","category":"section"},{"location":"examples/rotorhover-quasisteady/","page":"Quasi-Steady Solver","title":"Quasi-Steady Solver","text":"The aerodynamic and aeroacoustic analysis can also be performed using the quasi-steady solver (which uses BEMT for the aerodynamic solution), by simply changing the following parameter in the aero solution:","category":"page"},{"location":"examples/rotorhover-quasisteady/","page":"Quasi-Steady Solver","title":"Quasi-Steady Solver","text":"VehicleType = uns.QVLMVehicle\nn = 50 # <---- For some reason PSU-WOPWOP breaks with less blade elements","category":"page"},{"location":"examples/rotorhover-quasisteady/","page":"Quasi-Steady Solver","title":"Quasi-Steady Solver","text":"and this parameter when calling PSU-WOPWOP:","category":"page"},{"location":"examples/rotorhover-quasisteady/","page":"Quasi-Steady Solver","title":"Quasi-Steady Solver","text":"const_solution = true","category":"page"},{"location":"examples/vahana-monitor/#vahanamonitor","page":"Monitors Definitions","title":"Monitors Definitions","text":"","category":"section"},{"location":"examples/vahana-monitor/","page":"Monitors Definitions","title":"Monitors Definitions","text":"Here we define the monitors of the simulation and concatenate them all.","category":"page"},{"location":"examples/vahana-monitor/","page":"Monitors Definitions","title":"Monitors Definitions","text":"\"\"\"\n Generates the monitors of Vahana eVTOL simulation\n\"\"\"\nfunction generate_monitor_vahana(vehicle, rho, RPMref, nsteps, save_path, Vinf;\n add_wings=true,\n wingmonitor_optargs=[])\n\n # Collect all monitors here\n monitors = []\n\n # -------------------- WING MONITORS ---------------------------------------\n # Reference parameters for calculating coefficients\n # NOTE: make b, ar, and qinf equals to 1.0 to obtain dimensional force\n b_ref, ar_ref = 1.0, 1.0\n qinf = 1.0\n Jref = 1.0\n\n # Force axis labels\n CL_lbl = \"Lift (N)\"\n CD_lbl = \"Drag (N)\"\n\n # Directions of force components\n L_dir = [0, 0, 1]\n D_dir = [-1, 0, 0]\n\n # Generate function that computes wing aerodynamic forces\n calc_aerodynamicforce_fun = uns.generate_calc_aerodynamicforce(;\n add_parasiticdrag=true,\n add_skinfriction=true,\n airfoilpolar=\"xf-n0012-il-500000-n5.csv\"\n )\n\n if add_wings\n\n # Main wing monitor\n monitor_name = \"wing_main\"\n mainwing_system = vlm.get_wing(vehicle.vlm_system, \"MWing\")\n mainwing_monitor = uns.generate_monitor_wing(mainwing_system, Vinf, b_ref, ar_ref,\n rho, qinf, nsteps;\n calc_aerodynamicforce_fun=calc_aerodynamicforce_fun,\n save_path=save_path,\n run_name=monitor_name,\n figname=monitor_name,\n CL_lbl=CL_lbl,\n CD_lbl=CD_lbl,\n L_dir=L_dir,\n D_dir=D_dir,\n wingmonitor_optargs...)\n\n # Tandem wing monitor\n monitor_name = \"wing_tandem\"\n tandemwing_system = vlm.get_wing(vehicle.vlm_system, \"TWing\")\n tandemwing_monitor = uns.generate_monitor_wing(tandemwing_system, Vinf, b_ref, ar_ref,\n rho, qinf, nsteps;\n calc_aerodynamicforce_fun=calc_aerodynamicforce_fun,\n save_path=save_path,\n run_name=monitor_name,\n figname=monitor_name,\n CL_lbl=CL_lbl,\n CD_lbl=CD_lbl,\n L_dir=L_dir,\n D_dir=D_dir,\n wingmonitor_optargs...)\n\n push!(monitors, mainwing_monitor)\n push!(monitors, tandemwing_monitor)\n end\n\n\n\n\n # -------------------- ROTOR MONITORS --------------------------------------\n for (si, rotors) in enumerate(vehicle.rotor_systems)\n\n monitor_name = \"rotorsys$(si)\"\n\n rotors_monitor = uns.generate_monitor_rotors(rotors, Jref, rho, RPMref,\n nsteps;\n save_path=save_path,\n run_name=monitor_name,\n figname=monitor_name,\n save_init_plots=false)\n push!(monitors, rotors_monitor)\n end\n\n\n # -------------------- OTHER MONITORS --------------------------------------\n\n # State-variable monitor\n statevariable_monitor = uns.generate_monitor_statevariables(; save_path=save_path)\n\n # Global enstrophy monitor (numerical stability)\n monitor_enstrophy = uns.generate_monitor_enstrophy(; save_path=save_path)\n\n # Monitor of SFS model coefficient Cd\n monitor_Cd = uns.generate_monitor_Cd(; save_path=save_path)\n\n\n # -------------------- CONCATENATE MONITORS --------------------------------\n return uns.concatenate(statevariable_monitor, monitor_enstrophy, monitor_Cd, monitors...)\nend","category":"page"},{"location":"examples/rotorhover-aero/#rotorhoveraero","page":"Variable Fidelity","title":"Variable Fidelity","text":"","category":"section"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"
\n \n
","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"While propeller simulations tend to be numerically well behaved, a hover case can pose multiple numerical challenges. The rotation of blades in static air drives a strong axial flow that is solely caused by the shedding of tip vortices. This is challenging to simulate since, in the absence of a freestream, the wake quickly becomes fully turbulent and breaks down as tip vortices leapfrog and mix close to the rotor. Thus, a rotor in hover is a good engineering application to showcase the numerical stability and accuracy of FLOWUnsteady.","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"In this example we simulate a DJI rotor in hover, and we use this case to demonstrate some of the advanced features of FLOWUnsteady that make it robust and accurate in resolving turbulent mixing:","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"Subfilter scale (SFS) model of turbulence related to vortex stretching\nHow to monitor the dynamic SFS model coefficient with uns.generate_monitor_Cd\nHow to monitor the global flow enstrophy with uns.generate_monitor_enstrophy and track numerical stability\nDefining a wake treatment procedure to suppress initial hub wake, avoiding hub fountain effects and accelerating convergence\nDefining hub and tip loss corrections","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"Also, in this example you can vary the fidelity of the simulation setting the following parameters:","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"Parameter Mid-low fidelity Mid-high fidelity High fidelity Description\nn 20 50 50 Number of blade elements per blade\nnsteps_per_rev 36 72 360 Time steps per revolution\np_per_step 4 2 2 Particle sheds per time step\nsigma_rotor_surf R/10 R/10 R/80 Rotor-on-VPM smoothing radius\nsigmafactor_vpmonvlm 1.0 1.0 5.5 Expand particles by this factor when calculating VPM-on-VLM/Rotor induced velocities\nshed_starting false false true Whether to shed starting vortex\nsuppress_fountain true true false Whether to suppress hub fountain effect\nvpm_integration vpm.euler RK3^star RK3^star VPM time integration scheme\nvpm_SFS None^dag None^dag Dynamic^ddag VPM LES subfilter-scale model","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"^starRK3: vpm_integration = vpm.rungekutta3\n^dagNone: vpm_SFS = vpm.SFS_none\n^ddagDynamic: vpm_SFS = vpm.SFS_Cd_twolevel_nobackscatter","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"
\n\n\n \n \n \n \n \n
\n \"Pic\n
\n
Mid-Low
70k particles
~7 mins.
\n
\n \"Pic\n
\n
Mid-High
200k particles
~60 mins.
\n
\n \"Pic\n
\n
High
1M particles
~30 hrs.
\n
","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"
","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"#=##############################################################################\n# DESCRIPTION\n Simulation of a DJI 9443 rotor in hover (two-bladed rotor, 9.4 inches\n diameter).\n\n This example replicates the experiment described in Zawodny & Boyd (2016),\n \"Acoustic Characterization and Prediction of Representative,\n Small-scale Rotary-wing Unmanned Aircraft System Components.\"\n\n# AUTHORSHIP\n * Author : Eduardo J. Alvarez (edoalvarez.com)\n * Email : Edo.AlvarezR@gmail.com\n * Created : Mar 2023\n * Last updated : Mar 2023\n * License : MIT\n=###############################################################################\n\n\nimport FLOWUnsteady as uns\nimport FLOWVLM as vlm\nimport FLOWVPM as vpm\n\nrun_name = \"rotorhover-example\" # Name of this simulation\nsave_path = run_name # Where to save this simulation\nparaview = true # Whether to visualize with Paraview\n\n# ----------------- GEOMETRY PARAMETERS ----------------------------------------\n\n# Rotor geometry\nrotor_file = \"DJI9443.csv\" # Rotor geometry\ndata_path = uns.def_data_path # Path to rotor database\npitch = 0.0 # (deg) collective pitch of blades\nCW = false # Clock-wise rotation\nxfoil = false # Whether to run XFOIL\nread_polar = vlm.ap.read_polar2 # What polar reader to use\n\n# NOTE: If `xfoil=true`, XFOIL will be run to generate the airfoil polars used\n# by blade elements before starting the simulation. XFOIL is run\n# on the airfoil contours found in `rotor_file` at the corresponding\n# local Reynolds and Mach numbers along the blade.\n# Alternatively, the user can provide pre-computer airfoil polars using\n# `xfoil=false` and providing the polar files through `rotor_file`.\n# `read_polar` is the function that will be used to parse polar files. Use\n# `vlm.ap.read_polar` for files that are direct outputs of XFOIL (e.g., as\n# downloaded from www.airfoiltools.com). Use `vlm.ap.read_polar2` for CSV\n# files.\n\n# Discretization\nn = 20 # Number of blade elements per blade\nr = 1/10 # Geometric expansion of elements\n\n# NOTE: Here a geometric expansion of 1/10 means that the spacing between the\n# tip elements is 1/10 of the spacing between the hub elements. Refine the\n# discretization towards the blade tip like this in order to better\n# resolve the tip vortex.\n\n# Read radius of this rotor and number of blades\nR, B = uns.read_rotor(rotor_file; data_path=data_path)[[1,3]]\n\n# ----------------- SIMULATION PARAMETERS --------------------------------------\n\n# Operating conditions\nRPM = 5400 # RPM\nJ = 0.0001 # Advance ratio Vinf/(nD)\nAOA = 0 # (deg) Angle of attack (incidence angle)\n\nrho = 1.071778 # (kg/m^3) air density\nmu = 1.85508e-5 # (kg/ms) air dynamic viscosity\nspeedofsound = 342.35 # (m/s) speed of sound\n\n# NOTE: For cases with zero freestream velocity, it is recommended that a\n# negligible small velocity is used instead of zero in order to avoid\n# potential numerical instabilities (hence, J here is negligible small\n# instead of zero)\n\nmagVinf = J*RPM/60*(2*R)\nVinf(X, t) = magVinf*[cos(AOA*pi/180), sin(AOA*pi/180), 0] # (m/s) freestream velocity vector\n\nReD = 2*pi*RPM/60*R * rho/mu * 2*R # Diameter-based Reynolds number\nMatip = 2*pi*RPM/60 * R / speedofsound # Tip Mach number\n\nprintln(\"\"\"\n RPM: $(RPM)\n Vinf: $(Vinf(zeros(3), 0)) m/s\n Matip: $(round(Matip, digits=3))\n ReD: $(round(ReD, digits=0))\n\"\"\")\n\n# ----------------- SOLVER PARAMETERS ------------------------------------------\n\n# Aerodynamic solver\nVehicleType = uns.UVLMVehicle # Unsteady solver\n# VehicleType = uns.QVLMVehicle # Quasi-steady solver\nconst_solution = VehicleType==uns.QVLMVehicle # Whether to assume that the\n # solution is constant or not\n# Time parameters\nnrevs = 10 # Number of revolutions in simulation\nnsteps_per_rev = 36 # Time steps per revolution\nnsteps = const_solution ? 2 : nrevs*nsteps_per_rev # Number of time steps\nttot = nsteps/nsteps_per_rev / (RPM/60) # (s) total simulation time\n\n# VPM particle shedding\np_per_step = 4 # Sheds per time step\nshed_starting = false # Whether to shed starting vortex\nshed_unsteady = true # Whether to shed vorticity from unsteady loading\nunsteady_shedcrit = 0.001 # Shed unsteady loading whenever circulation\n # fluctuates by more than this ratio\nmax_particles = ((2*n+1)*B)*nsteps*p_per_step + 1 # Maximum number of particles\n\n# Regularization\nsigma_rotor_surf= R/10 # Rotor-on-VPM smoothing radius\nlambda_vpm = 2.125 # VPM core overlap\n # VPM smoothing radius\nsigma_vpm_overwrite = lambda_vpm * 2*pi*R/(nsteps_per_rev*p_per_step)\nsigmafactor_vpmonvlm= 1 # Shrink particles by this factor when\n # calculating VPM-on-VLM/Rotor induced velocities\n\n# Rotor solver\nvlm_rlx = 0.5 # VLM relaxation <-- this also applied to rotors\nhubtiploss_correction = ((0.4, 5, 0.1, 0.05), (2, 1, 0.25, 0.05)) # Hub and tip correction\n\n# VPM solver\nvpm_integration = vpm.euler # VPM temporal integration scheme\n# vpm_integration = vpm.rungekutta3\n\nvpm_viscous = vpm.Inviscid() # VPM viscous diffusion scheme\n# vpm_viscous = vpm.CoreSpreading(-1, -1, vpm.zeta_fmm; beta=100.0, itmax=20, tol=1e-1)\n\nvpm_SFS = vpm.SFS_none # VPM LES subfilter-scale model\n# vpm_SFS = vpm.SFS_Cd_twolevel_nobackscatter\n# vpm_SFS = vpm.SFS_Cd_threelevel_nobackscatter\n# vpm_SFS = vpm.DynamicSFS(vpm.Estr_fmm, vpm.pseudo3level_positive;\n# alpha=0.999, maxC=1.0,\n# clippings=[vpm.clipping_backscatter])\n# vpm_SFS = vpm.DynamicSFS(vpm.Estr_fmm, vpm.pseudo3level_positive;\n# alpha=0.999, rlxf=0.005, minC=0, maxC=1\n# clippings=[vpm.clipping_backscatter],\n# controls=[vpm.control_sigmasensor],\n# )\n\n# NOTE: In most practical situations, open rotors operate at a Reynolds number\n# high enough that viscous diffusion in the wake is actually negligible.\n# Hence, it does not make much of a difference whether we run the\n# simulation with viscous diffusion enabled or not. On the other hand,\n# such high Reynolds numbers mean that the wake quickly becomes turbulent\n# and it is crucial to use a subfilter-scale (SFS) model to accurately\n# capture the turbulent decay of the wake (turbulent diffusion).\n\nif VehicleType == uns.QVLMVehicle\n # Mute warnings regarding potential colinear vortex filaments. This is\n # needed since the quasi-steady solver will probe induced velocities at the\n # lifting line of the blade\n uns.vlm.VLMSolver._mute_warning(true)\nend\n\n\n\n# ----------------- WAKE TREATMENT ---------------------------------------------\n# NOTE: It is known in the CFD community that rotor simulations with an\n# impulsive RPM start (*i.e.*, 0 to RPM in the first time step, as opposed\n# to gradually ramping up the RPM) leads to the hub \"fountain effect\",\n# with the root wake reversing the flow near the hub.\n# The fountain eventually goes away as the wake develops, but this happens\n# very slowly, which delays the convergence of the simulation to a steady\n# state. To accelerate convergence, here we define a wake treatment\n# procedure that suppresses the hub wake for the first three revolutions,\n# avoiding the fountain effect altogether.\n# This is especially helpful in low and mid-fidelity simulations.\n\nsuppress_fountain = true # Toggle\n\n# Supress wake shedding on blade elements inboard of this r/R radial station\nno_shedding_Rthreshold = suppress_fountain ? 0.35 : 0.0\n\n# Supress wake shedding for this many time steps\nno_shedding_nstepsthreshold = 3*nsteps_per_rev\n\nomit_shedding = [] # Index of blade elements to supress wake shedding\n\n# Function to suppress or activate wake shedding\nfunction wake_treatment_supress(sim, args...; optargs...)\n\n # Case: start of simulation -> suppress shedding\n if sim.nt == 1\n\n # Identify blade elements on which to suppress shedding\n for i in 1:vlm.get_m(rotor)\n HS = vlm.getHorseshoe(rotor, i)\n CP = HS[5]\n\n if uns.vlm.norm(CP - vlm._get_O(rotor)) <= no_shedding_Rthreshold*R\n push!(omit_shedding, i)\n end\n end\n end\n\n # Case: sufficient time steps -> enable shedding\n if sim.nt == no_shedding_nstepsthreshold\n\n # Flag to stop suppressing\n omit_shedding .= -1\n\n end\n\n return false\nend\n\n\n# ----------------- 1) VEHICLE DEFINITION --------------------------------------\nprintln(\"Generating geometry...\")\n\n# Generate rotor\nrotor = uns.generate_rotor(rotor_file; pitch=pitch,\n n=n, CW=CW, blade_r=r,\n altReD=[RPM, J, mu/rho],\n xfoil=xfoil,\n read_polar=read_polar,\n data_path=data_path,\n verbose=true,\n plot_disc=true\n );\n\nprintln(\"Generating vehicle...\")\n\n# Generate vehicle\nsystem = vlm.WingSystem() # System of all FLOWVLM objects\nvlm.addwing(system, \"Rotor\", rotor)\n\nrotors = [rotor]; # Defining this rotor as its own system\nrotor_systems = (rotors, ); # All systems of rotors\n\nwake_system = vlm.WingSystem() # System that will shed a VPM wake\n # NOTE: Do NOT include rotor when using the quasi-steady solver\nif VehicleType != uns.QVLMVehicle\n vlm.addwing(wake_system, \"Rotor\", rotor)\nend\n\nvehicle = VehicleType( system;\n rotor_systems=rotor_systems,\n wake_system=wake_system\n );\n\n\n# ------------- 2) MANEUVER DEFINITION -----------------------------------------\n# Non-dimensional translational velocity of vehicle over time\nVvehicle(t) = zeros(3)\n\n# Angle of the vehicle over time\nanglevehicle(t) = zeros(3)\n\n# RPM control input over time (RPM over `RPMref`)\nRPMcontrol(t) = 1.0\n\nangles = () # Angle of each tilting system (none)\nRPMs = (RPMcontrol, ) # RPM of each rotor system\n\nmaneuver = uns.KinematicManeuver(angles, RPMs, Vvehicle, anglevehicle)\n\n\n# ------------- 3) SIMULATION DEFINITION ---------------------------------------\n\nVref = 0.0 # Reference velocity to scale maneuver by\nRPMref = RPM # Reference RPM to scale maneuver by\nVinit = Vref*Vvehicle(0) # Initial vehicle velocity\nWinit = pi/180*(anglevehicle(1e-6) - anglevehicle(0))/(1e-6*ttot) # Initial angular velocity\n\nsimulation = uns.Simulation(vehicle, maneuver, Vref, RPMref, ttot;\n Vinit=Vinit, Winit=Winit);\n\n# Restart simulation\nrestart_file = nothing\n\n# NOTE: Uncomment the following line to restart a previous simulation.\n# Point it to a particle field file (with its full path) at a specific\n# time step, and `run_simulation` will start this simulation with the\n# particle field found in the restart simulation.\n\n# restart_file = \"/path/to/a/previous/simulation/rotorhover-example_pfield.360\"\n\n\n# ------------- 4) MONITORS DEFINITIONS ----------------------------------------\n\n# Generate rotor monitor\nmonitor_rotor = uns.generate_monitor_rotors(rotors, J, rho, RPM, nsteps;\n t_scale=RPM/60, # Scaling factor for time in plots\n t_lbl=\"Revolutions\", # Label for time axis\n save_path=save_path,\n run_name=run_name,\n figname=\"rotor monitor\",\n )\n\n# Generate monitor of flow enstrophy (numerical stability)\nmonitor_enstrophy = uns.generate_monitor_enstrophy(;\n save_path=save_path,\n run_name=run_name,\n figname=\"enstrophy monitor\"\n )\n\n# Generate monitor of SFS model coefficient Cd\nmonitor_Cd = uns.generate_monitor_Cd(;\n save_path=save_path,\n run_name=run_name,\n figname=\"Cd monitor\"\n )\n# Concatenate monitors\nmonitors = uns.concatenate(monitor_rotor, monitor_enstrophy, monitor_Cd)\n\n\n# ------------- 5) RUN SIMULATION ----------------------------------------------\nprintln(\"Running simulation...\")\n\n# Concatenate monitors and wake treatment procedure into one runtime function\nruntime_function = uns.concatenate(monitors, wake_treatment_supress)\n\n# Run simulation\nuns.run_simulation(simulation, nsteps;\n # ----- SIMULATION OPTIONS -------------\n Vinf=Vinf,\n rho=rho, mu=mu, sound_spd=speedofsound,\n # ----- SOLVERS OPTIONS ----------------\n p_per_step=p_per_step,\n max_particles=max_particles,\n vpm_integration=vpm_integration,\n vpm_viscous=vpm_viscous,\n vpm_SFS=vpm_SFS,\n sigma_vlm_surf=sigma_rotor_surf,\n sigma_rotor_surf=sigma_rotor_surf,\n sigma_vpm_overwrite=sigma_vpm_overwrite,\n sigmafactor_vpmonvlm=sigmafactor_vpmonvlm,\n vlm_rlx=vlm_rlx,\n hubtiploss_correction=hubtiploss_correction,\n shed_starting=shed_starting,\n shed_unsteady=shed_unsteady,\n unsteady_shedcrit=unsteady_shedcrit,\n omit_shedding=omit_shedding,\n extra_runtime_function=runtime_function,\n # ----- RESTART OPTIONS -----------------\n restart_vpmfile=restart_file,\n # ----- OUTPUT OPTIONS ------------------\n save_path=save_path,\n run_name=run_name,\n save_wopwopin=true, # <--- Generates input files for PSU-WOPWOP noise analysis\n );\n\n\n\n\n# ----------------- 6) VISUALIZATION -------------------------------------------\nif paraview\n println(\"Calling Paraview...\")\n\n # Files to open in Paraview\n files = joinpath(save_path, run_name*\"_pfield...xmf;\")\n for bi in 1:B\n global files\n files *= run_name*\"_Rotor_Blade$(bi)_loft...vtk;\"\n files *= run_name*\"_Rotor_Blade$(bi)_vlm...vtk;\"\n end\n\n # Call Paraview\n run(`paraview --data=$(files)`)\n\nend\n\n","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"\n Mid-low fidelity runtime: ~7 minutes on a 16-core AMD EPYC 7302 processor.
\n Mid-high fidelity runtime: ~60 minutes on a 16-core AMD EPYC 7302 processor.
\n High fidelity runtime: ~30 hours on a 16-core AMD EPYC 7302 processor.\n
\n

","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"Rotor monitor in the high-fidelity case:","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"
\n \"Pic\n
","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"As the simulation runs, you will see the monitor shown below plotting the global enstrophy of the flow. The global enstrophy achieves a steady state once the rate of enstrophy produced by the rotor eventually balances out with the forward scatter of the SFS turbulence model, making the simulation indefinitely stable.","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"
\n \"Pic\n
","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"The SFS model uses a dynamic procedure to compute its own model coefficient C_d as the simulation evolves. The value of the model coefficient varies for each particle in space and time. The C_d-monitor shown below plots the mean value from all the particle in the field that have a non-zero C_d (left), and also the ratio of the number of particles that got clipped to a zero C_d over the total number of particles (right).","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"
\n \"Pic\n
","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"info: Prescribing the Model Coefficient\nThe SFS model helps the simulation to more accurately capture the effects of turbulence from the scales that are not resolved, but it adds computational cost. The following table summarizes the cost of the rVPM, the SFS model, and the C_d dynamic procedure. (Image: pic) The dynamic procedure is the most costly operation, which increases the simulation runtime by about 35%.If you need to run a case multiple times with only slight changes (e.g., sweeping the AOA and/or RPM), you can first run the simulation with the dynamic procedure (vpm_SFS = vpm.SFS_Cd_twolevel_nobackscatter), take note of what the mean C_d shown in the monitor converges to, and then prescribe that value to subsequent simulations. Prescribing C_d ends up in a simulation that is only 8% slower than the classic VPM without any SFS model.C_d can then be prescribed as followsvpm_SFS = vpm.ConstantSFS(vpm.Estr_fmm; Cs=value, clippings=[vpm.clipping_backscatter])where CS = value is the value to prescribe for the model coefficient, and clippings=[vpm.clipping_backscatter] clips the backscatter of enstrophy (making it a purely diffusive model). As a reference, in this hover case, C_d converges to 026 in the high-fidelity simulation.","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"In examples/rotorhover/rotorhover_postprocessing.jl we show how to postprocess the simulations to compare C_T and blade loading to experimental data by Zawodny et al.[1] and a URANS simulation (STAR-CCM+) by Schenk[2]:","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"
\n \"Pic\n \"Pic\n
","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":" C_T Error\nExperimental 0.072 –\nURANS 0.071 1%\nrVPM – high fidelity 0.073 1%\nrVPM – mid-high fidelity 0.066 8%\nrVPM – mid-low fidelity 0.064 11%\nBEMT (quasi-steady) 0.073 2%","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"[1]: N. S. Zawodny, D. D. Boyd, Jr., and C. L. Burley, “Acoustic Characterization and Prediction of Representative, Small-scale Rotary-wing Unmanned Aircraft System Components,” in 72nd American Helicopter Society (AHS) Annual Forum (2016).","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"[2]: A. R. Schenk, \"Computational Investigation of the Effects of Rotor-on-Rotor Interactions on Thrust and Noise,\" Masters thesis, Brigham Young University (2020).","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"info: Hub/Tip Loss Correction\nIn the rotor actuator line model, hub and tip corrections can be applied to c_ell to account for the effects that bring the aerodynamic loading to zero at the hub and tips. These correction factors, F_mathrmtip and F_mathrmhub, are defined as modified Prandtl loss functions,beginalign*\n F_mathrmtip\n =\n frac2pi cos^-1 left( expleft( -f_mathrmtip right) right)\n qquad\n f_mathrmtip\n=\n fracB2\n frac\n left left( fracR_mathrmrotorr right)^t_1 - 1 right^t_2\n \n vert sin left( theta_mathrmeff right) vert^t_3\n \n\n F_mathrmhub\n =\n frac2pi cos^-1 left( expleft( -f_mathrmhub right) right)\n qquad\n f_mathrmhub\n=\n fracB2\n frac\n left left( fracrR_mathrmhub right)^h_1 - 1 right^h_2\n \n vert sin left( theta_mathrmeff right) vert^h_3\n \nendalign*where R_mathrmrotor and R_mathrmhub are the rotor and hub radii, B is the number of blades, r is the radial position of the blade element, and t_1, t_2, t_3, h_1, h_2, and h_3 are tunable parameters. The normal and tangential force coefficients, respectively c_n and c_t, are then calculated asbeginalign*\n c_n\n =\n F_mathrmtip F_mathrmhub c_ellcostheta_mathrmeff + c_dsintheta_mathrmeff\n\n c_t\n =\n F_mathrmtip F_mathrmhub c_ellsintheta_mathrmeff - c_dcostheta_mathrmeff\nendalign*The hub and tip corrections are passed to uns.run_simulation through the keyword argument hubtiploss_correction = ((t1, t2, t3, tminangle), (h1, h2, h3, hminangle)), where tminangle and hminangle are clipping thresholds for the minimum allowable value of verttheta_mathrmeffvert (in degs) that is used in tip and hub corrections. The following corrections are predefined in FLOWVLM for the user:","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"import FLOWVLM as vlm\n\n# No corrections\nvlm.hubtiploss_nocorrection","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"import FLOWUnsteady: vlm # hide\n\n# Original Prandtl corrections\nvlm.hubtiploss_correction_prandtl","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"import FLOWUnsteady: vlm # hide\n\n# Modified Prandtl with a strong hub correction\nvlm.hubtiploss_correction_modprandtl","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"info: ParaView Visualization\nThe .pvsm file visualizing the simulation as shown at the top of this page is available here: LINK (right click → save as...).To open in ParaView: File → Load State → (select .pvsm file) then select \"Search files under specified directory\" and point it to the folder where the simulation was saved.","category":"page"},{"location":"api/flowunsteady-simulation/#(3)-Simulation-Definition","page":"(3) Simulation Definition","title":"(3) Simulation Definition","text":"","category":"section"},{"location":"api/flowunsteady-simulation/","page":"(3) Simulation Definition","title":"(3) Simulation Definition","text":"FLOWUnsteady.Simulation\nFLOWUnsteady.save_vtk","category":"page"},{"location":"api/flowunsteady-simulation/#FLOWUnsteady.Simulation","page":"(3) Simulation Definition","title":"FLOWUnsteady.Simulation","text":"Simulation{V<:AbstractVehicle, M<:AbstractManeuver, R<:Real}(vehicle::V,\n maneuver::M, Vref::R, RPMref::R, ttot::R, optargs...)\n\nSimulation interface. This type carries the simulation's options and connects vehicle and maneuver together.\n\nARGUMENTS\n\nvehicle : Vehicle\nmaneuver : Maneuver\nVref : Reference velocity for the maneuver\nRPMref : Reference RPM for the maneuver\nttot : Total time in which to perform the maneuver\n\nOPTIONAL ARGUMENTS\n\nVinit = zeros(3) : Initial vehicle velocity\nWinit = zeros(3) : Initial vehicle angular velocity\n\nState variables\n\nt::Real : Time of current step\nnt::Int : Current time step number\n\n\n\n\n\n","category":"type"},{"location":"api/flowunsteady-simulation/#FLOWUnsteady.save_vtk","page":"(3) Simulation Definition","title":"FLOWUnsteady.save_vtk","text":"save_vtk(self::AbstractVehicle, prefix; path=\"\", optargs...)\n\nOutput VTK files with vehicle geometry and solution fields.\n\n\n\n\n\nsave_vtk(sim::Simulation, prefix; path=\"\", save_wopwopin=false, optargs...)\n\nOutput VTK files with vehicle geometry and solution fields. The file names will have the prefix prefix, and will be saved in the directory path. If save_wopwopin=true, it will also generate PSU-WOPWOP input files that can be used to run the acoustic analysis (see run_noise_wopwop).\n\n\n\n\n\n","category":"function"},{"location":"theory/rvpm/#Reformulated-VPM","page":"Reformulated VPM","title":"Reformulated VPM","text":"","category":"section"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"The following is an excerpt from E. J. Alvarez & A. Ning (2022), \"Meshless Large Eddy Simulation of Rotor-Wing Interactions Through the Reformulated Vortex Particle Method,\" (in review).","category":"page"},{"location":"theory/rvpm/#Vorticity-Navier-Stokes","page":"Reformulated VPM","title":"Vorticity Navier-Stokes","text":"","category":"section"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"In recent work[1][2], a new formulation of the vortex particle method (VPM) has been derived from the LES-filtered Navier-Stokes equations. The new method, referred to as the reformulated VPM or rVPM, is an LES that is both numerically stable and meshless, and is able to accurately resolve mean and fluctuating large-scale features of turbulent flow with minimal computational effort. Hereby we concisely summarize the governing equations of the reformulated VPM, and the reader is referred to Ref.[1] and the doctoral dissertation[2] accompanying this work for a detailed derivation of the method.","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"The reformulated VPM uses a Lagrangian scheme to solve the vorticity form of the LES-filtered Navier-Stokes equations","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"beginalign\n fracpartial overline omega_i partial t\n + overline u_j fracpartial overline omega_i partial x_j\n =\n overline omega_j fracpartial overline u_i partial x_j\n +\n nu nabla^2 overline omega_i -\n fracpartial T_ijpartial x_j +\n fracpartial T_ijpartial x_j\nendalign","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"where the bar denotes the filter operator,[a] and T_ij equiv overline u_i omega_j - overline u_i overline omega_j is the subfilter-scale (SFS) vorticity stress capturing the interactions between large-scale dynamics and SFS dynamics. The term fracpartial T_ijpartial x_j represents the SFS contributions arising from the advective term (vorticity advection), while fracpartial T_ijpartial x_j represents the contributions arising from vortex stretching. For simplicity, Eq. (1) is written in vector notation as","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"beginalign\n fractextd textd t overline boldsymbolomega \n = left( overline boldsymbolomega cdot nabla right) overline mathbfu +\n nu nabla^2 overline boldsymbolomega \n - mathbfE_mathrmadv - mathbfE_mathrmstr\nendalign","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"where left( mathbfE_mathrmadv right)_i equiv fracpartial T_ijpartial x_j is the SFS vorticity advection, left( mathbfE_mathrmstr right)_i equiv - fracpartial T_ijpartial x_j is the SFS vortex stretching, and the fractextd textd t operator is the linearized version of the filtered material derivative, fractextd textd t () equiv fracpartial partial t() + (overline bf u cdot nabla)(). Notice that casting the Navier-Stokes equation into this vorticity form gets rid of all dependance on pressure. Furthermore, this equation depends on boldsymbolomega alone since bfu can be calculated directly from boldsymbolomega = nabla times bfu through the Biot-Savart law.","category":"page"},{"location":"theory/rvpm/#particlediscretization","page":"Reformulated VPM","title":"Particle Discretization","text":"","category":"section"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"The material derivative in Eq. (2) and the material-conservative nature of the vorticity makes the boldsymbolomega field especially well fit for a Lagrangian description. The unfiltered boldsymbolomega field is discretized with singular vortex particles of positions bf x_p and coefficients boldsymbolGamma_p (called vortex strength), approximating boldsymbolomega as","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"beginalign labeleqparticledirac\n boldsymbolomega(bf xt) approx sum\n limits_p boldsymbolGamma_p (t)\n delta (bf x - bf x_p(t))\nendalign","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"where delta is the Dirac delta. Applying the filter operator,","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"beginalign*\n overline boldsymbolomega left( mathbfx right)\n =\n intlimits_-infty^infty\n boldsymbolomegaleft( mathbfy right)\n zeta_sigma(mathbfx-mathbfy)\n mathrmdmathbfy\n \n approx\n intlimits_-infty^infty\n left(\n sumlimits_p\n boldsymbolGamma_p\n delta (textbf y - textbf x_p)\n right)\n zeta_sigma(mathbfx-mathbfy)\n mathrmdmathbfy\nendalign*","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"the Dirac delta collapses the integral, obtaining an approximation of the filtered vorticity field as","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"beginalign labeleqparticleblob\n overlineboldsymbolomegaleft( mathbfxt right)\n approx\n sumlimits_p\n boldsymbolGamma_p (t)\n zeta_sigma_p(mathbfx-mathbfx_p(t))\nendalign","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"where zeta_sigma(mathbfx) equiv frac1sigma^3 zeta left(fracVert mathbfx Vertsigma right) is the filter kernel of width sigma and radial basis zeta. As seen in Eq. (4), the filter operator has the effect of spreading the vortex strength boldsymbolGamma_p in space, regularizing the singularity originally introduced by the Dirac delta. Thus, the filter kernel takes the role of a basis function that is used to discretize overlineboldsymbolomega through particles. We let the filter width sigma (here on called smoothing radius or core size) change in time and space according to the evolution of each individual particle. The particle field constructs a continuous vorticity field through radial basis functions as given by Eq. (4), and also a continuous velocity field by inverting the relation overlineboldsymbolomega = nabla times overlinemathbfu as","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"beginalign labeleqUreg\n overline mathbfu left( mathbfx right)\n =\n - frac14pisumlimits_p g_sigma_pleft( mathbfx-mathbfx_p right)\n fracmathbfx-mathbfx_pVertmathbfx-mathbfx_pVert^3\n times\n boldsymbolGamma_p\nendalign","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"where g_sigma is the regularizing function[3] associated with the filter kernel zeta_sigma. Hence, all fluid properties—like overlinemathbfu and its spatial derivatives—are continuous and can be computed analytically.","category":"page"},{"location":"theory/rvpm/#Governing-Equations","page":"Reformulated VPM","title":"Governing Equations","text":"","category":"section"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"Similar to the process that led from Eq. (3) to Eq. (4), we use singular particles to discretize the LES-filtered vorticity equation given in Eq. (2), and arrive to the governing equations of the reformulated VPM:","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"beginalign\n labeleqrvpmgedxdt\n bullet quad\n \n fractextdtextdtbf x_p\n =\n overlinemathbfu(bf x_p)\nendalign","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"beginalign\n labeleqrvpmgedGammadt\n beginsplit\n bullet quad\n fracmathrmd mathrmd t boldsymbolGamma_p\n =\n left(\n boldsymbolGamma_p cdot nabla\n right)\n overlinemathbfu (bf x_p)\n -\n fracg + ffrac13 + f\n left\n left\n left(\n boldsymbolGamma_p cdot nabla\n right)\n overlinemathbfu small (bf x_p)\n right\n cdot hatboldsymbolGamma_p\n right hatboldsymbolGamma_p\n \n qquad qquad \n qquad qquad quad \n - fracC_dzeta_sigma_p (bf 0)\n left\n mathbfE_mathrmstr (bf x_p)\n -\n fracffrac13 + f\n left(\n mathbfE_mathrmstr (bf x_p) cdot hatboldsymbolGamma_p\n right) hatboldsymbolGamma_p\n right\n endsplit\nendalign","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"beginalign\n labeleqrvpmgedsigmadt\n bullet quad\n \n fracmathrmd mathrmd t sigma_p\n =\n - left(\n fracg + f1 + 3f\n right)\n fracsigma_pVert boldsymbolGamma_p Vert\n left\n left(\n boldsymbolGamma_p cdot nabla\n right)\n overlinemathbfu small (bf x_p)\n right\n cdot hatboldsymbolGamma_p\n +\n left(\n fracf1 + 3f\n right)\n fracsigma_pVert boldsymbolGamma_p Vert\n fracC_dzeta_sigma_p (bf 0)\n mathbfE_mathrmstr (bf x_p) cdot hatboldsymbolGamma_p\nendalign","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"beginalign\n labeleqrvpmgeviscous\n bullet quad\n \n left(\n fractextd textd t overline boldsymbolomega \n right)_mathrmviscous\n =\n nu nabla^2 overline boldsymbolomega \nendalign","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"where Eq. (6) resolves vorticity advection by convecting the particles, Eq. (7) governs the evolution of vortex strength, and Eq. (8) governs the evolution of particle size. Eq. (7) in conjunction with Eqs. (6) and (8) resolve the inviscid part of the LES-filtered vorticity Navier-Stokes equation, while the viscous part in Eq. (9) can be resolved through any of the schemes previously proposed in the literature (e.g., vortex redistribution method, particle strength exchange, or core spreading).","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"The main headway of the reformulated VPM over the classic VPM is that rVPM uses the particle size, or fracmathrmd mathrmd t sigma_p, as an extra degree of freedom to reinforce conservation laws. As shown in References [1] and [2], momentum and mass conservation leads to f = 0 and g = frac15, and Eqs. (7) and (8) become","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"beginalign*\n bullet quad\n fracmathrmd mathrmd t boldsymbolGamma_p\n =\n left(\n boldsymbolGamma_p cdot nabla\n right)\n overline mathbfu (mathbfx_p)\n -\n frac35\n left\n left\n left(\n boldsymbolGamma_p cdot nabla\n right)\n overline mathbfu small (mathbfx_p)\n right\n cdot hatboldsymbolGamma_p\n right hatboldsymbolGamma_p\n - fracC_dzeta_sigma_p (mathbf0)\n mathbfE_mathrmstr (mathbfx_p)\n \n bullet quad\n \n fracmathrmd mathrmd t sigma_p\n =\n -\n frac15\n fracsigma_pVert boldsymbolGamma_p Vert\n left\n left(\n boldsymbolGamma_p cdot nabla\n right)\n overline mathbfu small (mathbfx_p)\n right\n cdot hatboldsymbolGamma_p\nendalign*","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"which is the formulation referred to as the \"reformulated VPM.\" Notice that when f = g = 0 and mathbfE_mathrmstr is neglected, Eqs. (7) and (8) collapse back to the classic VPM equations, making these equations a generalization of the classic method. In Reference [2] is shown that the classic VPM turns out to violate both conservation of momentum and mass when it assumes fracmathrmd mathrmd t sigma_p = 0, which explains the tendency of the classic VPM to be numerically unstable. Furthermore, notice that the rVPM equations do not require more computation than the classic VPM: when SFS effects are neglected (mathbfE_mathrmstr=0), both fracmathrmd sigma_p mathrmdt and fracmathrmd boldsymbolGamma_pmathrmd t are calculated directly and solely from vortex stretching, left( boldsymbolGamma_p cdot nabla right) overlinemathbfu (bf x_p).","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"For an in-depth derivation of the rVPM governing equations, see Chapters 1 and 2 in Alvarez' Dissertation.[2]","category":"page"},{"location":"theory/rvpm/#sfsmodel","page":"Reformulated VPM","title":"Turbulence Model","text":"","category":"section"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"Turning our attention back to the SFS stress tensor T_ij, the accuracy of LES hinges on the modeling of this tensor. Its divergence represents the rate at which enstrophy—a measure of rotational kinetic energy—is transferred from resolved scales to subfilter scales (diffusion) and from subfilter scales to resolved scales (backscatter). In vortex methods, the most common SFS models use variants of the Smagorinsky eddy-viscosity model formulated for the vorticity stress.[4][5] However, these models are developed on the basis of homogeneous isotropic turbulence, which makes them overly diffusive in simulations with coherent vortical structures. In Reference [1], the following anisotropic model of SFS vortex stretching is proposed:","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"beginalign* labeleqEstr\n mathbfE_mathrmstr left( mathbfx right)\n approx\n sumlimits_q\n zeta_sigma(mathbfx-mathbfx_q)\n left(\n boldsymbolGamma_q cdot nabla\n right)\n left(\n overlinemathbfu left( mathbfx right) - overlinemathbfu left( mathbfx_q right)\n right)\nendalign*","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"The model coefficient C_d is calculated dynamically at the position of every particle as","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"beginalign* labeleqCdGammaMLave\n C_d\n =\n frac\n left boldsymbolGamma_p cdot mathbfL right\n \n left boldsymbolGamma_p cdot mathbfm right\n \nendalign*","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"where left cdot right denotes an integration along Lagrangian trajectories[6], and","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"beginalign*\n \n mathbfm =\n fracsigma^3zeta(0) fracpartial mathbfE_mathrmstr partial sigma (mathbfx_p)\n \n \n mathbfL =\n frac3sigma\n left( boldsymbolGamma_p cdot nabla right)\n left(\n mathbfu (mathbfx_p) - overlinemathbfu (mathbfx_p)\n right)\n +\n left( boldsymbolGamma_p cdot nabla right)\n fracpartial overlinemathbfu partial sigma (mathbfx_p)\nendalign*","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"This dynamic procedure is based on a simultaneous balance of enstrophy-production and derivatives between true and modeled SFS contributions. Backscatter is controlled by clipping the model coefficient to C_d=0 whenever the condition C_d boldsymbolGamma_p cdot mathbfE_mathrmstr (mathbfx_p) geq 0 is not satisfied. This results in a low-dissipation SFS model that uses vortex stretching as the physical mechanism for turbulence, which is well suited for flows with coherent vortical structures where the predominant cascade mechanism is vortex stretching.","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"For an in-depth derivation of the SFS model, see Chapter 3 in Alvarez' Dissertation.[2]","category":"page"},{"location":"theory/rvpm/#Immersed-Vorticity","page":"Reformulated VPM","title":"Immersed Vorticity","text":"","category":"section"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"In order to immerse the vorticity of solid boundaries into the LES-filtered Navier-Stokes equations, the filtered vorticity field overlineboldsymbolomega(mathbfx t) is decomposed into a free-vorticity field overlineboldsymbolomega_mathrmfree(mathbfx t) and a bound-vorticity field overlineboldsymbolomega_mathrmbound(mathbfx t) as","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"beginalign*\n overlineboldsymbolomega\n =\n overlineboldsymbolomega_mathrmfree + overlineboldsymbolomega_mathrmbound\nendalign*","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"Both components can be discretized with vortex particles as","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"beginalign*\n overlineboldsymbolomega (mathbfx)\n =\n underbrace\n sumlimits_p boldsymbolGamma_p zeta_sigma_p left( mathbfx - mathbfx_p right)\n _overlineboldsymbolomega_mathrmfree\n +\n underbrace\n sumlimits_b boldsymbolGamma_b zeta_sigma_b left( mathbfx - mathbfx_b right)\n _overlineboldsymbolomega_mathrmbound\nendalign*","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"where the particles discretizing the free-vorticity field evolve according to the rVPM governing equations, Eqs. (6) through (9), while the ones discretizing the bound-vorticity are embedded on the solid boundaries and their strength is calculated by actuator models derived in Alvarez' Dissertation,[2] Chapter 6. The velocity field is obtained by inverting the relation boldsymbolomega = nabla times mathbfu, resulting in","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"beginalign*\n overline mathbfu left( mathbfx right)\n =\n underbrace\n sumlimits_p g_sigma_pleft( mathbfx-mathbfx_p right)\n mathbfKleft( mathbfx-mathbfx_p right)\n times\n boldsymbolGamma_p\n _overlinemathbfu_mathrmfree\n +\n underbrace\n sumlimits_b g_sigma_bleft( mathbfx-mathbfx_b right)\n mathbfKleft( mathbfx-mathbfx_b right)\n times\n boldsymbolGamma_b\n _overlinemathbfu_mathrmbound\nendalign*","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"which includes the velocity induced by both free and bound vorticity components, and where mathbfKleft( mathbfx right) equiv - frac14pi fracmathbfxVertmathbfxVert^3. Thus, the evolution of the free particles is influenced by the vorticity immersed at the solid boundaries, affecting their convection and vortex stretching through the velocity field induced by the bound particles.","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"The immersed vorticity not only affects the evolution of existing free vorticity, but it also creates new free vorticity at the boundary through viscous diffusion. In reality, vorticity is created in the boundary layer, it builds up as it travels along the surface, and it is eventually shed off the surface either by the Kutta condition at the trailing edge, flow separation, or other turbulent mechanisms. On a slender body, the vorticity can be assumed to be shed at the trailing edge.","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"In most models inside FLOWUnsteady, instead of creating vorticity through the viscous diffusion equation, the immersed vorticity is shed along a prescribed trailing edge. This approach neglects the wake created by flow separation. However, the effects of flow separation on loading (like the drop in lift and increase in pressure drag on a stalled airfoil) can still be captured whenever lookup airfoil tables are used.","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"compat: Recommended\nFor an in-depth discussion of the actuator line and surface models implemented in FLOWUnsteady, see Chapter 6 in Alvarez' Dissertation.[2]","category":"page"},{"location":"theory/rvpm/#Other-Schemes","page":"Reformulated VPM","title":"Other Schemes","text":"","category":"section"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"In the default settings of FLOWUnsteady, vortex stretching is resolved with the transposed scheme and the divergence of the vorticity field is treated through the relaxation scheme developed by Pedrizzeti.[7] The time integration of the governing equations is done through a low-storage third-order Runge-Kutta scheme. A Gaussian kernel is used as the LES filter zeta_sigma (or VPM radial basis function). Like the classic VPM, the reformulated VPM is spatially second-order accurate in the convective term when a Gaussian basis is used. Viscous diffusion is solved through the core spreading method coupled with the radial basis function interpolation approach for spatial adaptation developed by Barba.[8] This viscous scheme has second-order spatial convergence, while showing linear convergence when coupled with spatial adaptation. The fast multipole method (FMM) is used for the computation of the regularized Biot-Savart law, approximating the velocity field and vortex stretching through spherical harmonics with computational complexity mathcalO(N), where N is the number of particles. The FMM computation of vortex stretching is performed through an efficient complex-step derivative approximation,[9] implemented in a modified version of the open-source, parallelized code ExaFMM. FLOWVPM and FLOWUnsteady are implemented in the Julia language, which is a modern, high-level, dynamic programming language for high-performance computing.","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"compat: Recommended\nFor an in-depth discussion of the numerical schemes implemented in FLOWUnsteady, see Chapter 4 in Alvarez' Dissertation.[2]","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"[1]: E. J. Alvarez & A. Ning (2022), \"Reviving the Vortex Particle Method: A Stable Formulation for Meshless Large Eddy Simulation,\" (in review). [PDF]","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"[2]: E. J. Alvarez (2022), \"Reformulated Vortex Particle Method and Meshless Large Eddy Simulation of Multirotor Aircraft,\" Doctoral Dissertation, Brigham Young University. [VIDEO] [PDF]","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"[3]: Winckelmans, G., and Leonard, A., “Contributions to Vortex Particle Methods for the Computation of Three-Dimensional Incompressible Unsteady Flows,” Journal of Computational Physics, Vol. 109, No. 2, 1993.","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"[4]: Winckelmans, G. S., “Some progress in large-eddy simulation using the 3D vortex particle method,” CTR Annual Research Briefs, , No. 2, 1995, pp. 391–415.","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"[5]: Mansfield, J. R., Knio, O. M., and Meneveau, C., “A Dynamic LES Scheme for the Vorticity Transport Equation: Formulation and a Priori Tests,” Journal of Computational Physics, Vol. 145, No. 2, 1998, pp. 693–730.","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"[6]: Meneveau, C., Lund, T. S., and Cabot, W. H., “A Lagrangian dynamic subgrid-scale model of turbulence,” Journal of Fluid Mechanics, Vol. 319, No. -1, 1996, p. 353.","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"[7]: Pedrizzetti, G., “Insight into singular vortex flows,” Fluid Dynamics Research, Vol. 10, No. 2, 1992, pp. 101–115.","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"[8]: Barba, L. A., Leonard, A., and Allen, C. B., “Advances in viscous vortex methods - Meshless spatial adaption based on radial basis function interpolation,” International Journal for Numerical Methods in Fluids, Vol. 47, No. 5, 2005, pp. 387–421. Also, Barba, L. A., “Vortex Method for computing high-Reynolds number Flows: Increased accuracy with a fully mesh-less formulation,” California Institute of Technology, Vol. 2004, 2004.","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"[9]: Alvarez, E. J., and Ning, A., “High-Fidelity Modeling of Multirotor Aerodynamic Interactions for Aircraft Design,” AIAA Journal, Vol. 58, No. 10, 2020, pp. 4385–4400.","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"[a]: Let phi be a field and zeta_sigma a filter kernel with cutoff length sigma, the filter operator is defined as overlinephi left( mathbfx right) equiv intlimits_-infty^infty phi(mathbfy)zeta_sigma(mathbfx-mathbfy) mathrmdmathbfy.","category":"page"},{"location":"examples/blownwing-asm/#asm","page":"Actuator Surface Model","title":"Actuator Surface Model","text":"","category":"section"},{"location":"examples/blownwing-asm/","page":"Actuator Surface Model","title":"Actuator Surface Model","text":"The aerodynamic solution computed in the first section was intended to be a mid-low fidelity simulation, which modeled the wing using an actuator line model (ALM). The ALM places all the surface vorticity associated with lift at the quarter chord of the wing, while placing all the trailing bound vorticity at the three-quarter chord, as shown here:","category":"page"},{"location":"examples/blownwing-asm/","page":"Actuator Surface Model","title":"Actuator Surface Model","text":"
\n \"Pic\n
\n
","category":"page"},{"location":"examples/blownwing-asm/","page":"Actuator Surface Model","title":"Actuator Surface Model","text":"The ALM is very accurate for isolated wings and even cases with mild wake interactions. However, for cases with stronger wake interactions (e.g., a wake directly impinging on the wing surface), the ALM can lead to unphysical results as the flow tends to cross the airfoil centerline. To address this, we have developed an actuator surface model (ASM) to embed the wing surface in the LES domain and better represent the physics.","category":"page"},{"location":"examples/blownwing-asm/","page":"Actuator Surface Model","title":"Actuator Surface Model","text":"The ASM spreads the surface vorticity following a pressure-like distribution. This produces a velocity field at the wing surface that minimizes the mass flow that crosses the airfoil centerline, thus better representing a solid surface:","category":"page"},{"location":"examples/blownwing-asm/","page":"Actuator Surface Model","title":"Actuator Surface Model","text":"
\n \"Pic\n \"Pic\n
\n
","category":"page"},{"location":"examples/blownwing-asm/","page":"Actuator Surface Model","title":"Actuator Surface Model","text":"For an in-depth discussion of the actuator models implemented in FLOWUnsteady, see Chapter 6 in Alvarez' Dissertation[2] (also published in Alvarez & Ning, 2023[3]).","category":"page"},{"location":"examples/blownwing-asm/","page":"Actuator Surface Model","title":"Actuator Surface Model","text":"[2]: E. J. Alvarez (2022), \"Reformulated Vortex Particle Method and Meshless Large Eddy Simulation of Multirotor Aircraft,\" Doctoral Dissertation, Brigham Young University. [VIDEO] [PDF]","category":"page"},{"location":"examples/blownwing-asm/","page":"Actuator Surface Model","title":"Actuator Surface Model","text":"[3]: E. J. Alvarez and A. Ning (2023), \"Meshless Large-Eddy Simulation of Propeller–Wing Interactions with Reformulated Vortex Particle Method,\" Journal of Aircraft. [DOI][PDF]","category":"page"},{"location":"examples/blownwing-asm/","page":"Actuator Surface Model","title":"Actuator Surface Model","text":"In order to activate the actuator surface model, we define the following parameters:","category":"page"},{"location":"examples/blownwing-asm/","page":"Actuator Surface Model","title":"Actuator Surface Model","text":"thickness_w = 0.15 # Wing airfoil thickness t/c\n\n# ---------- Vortex sheet parameters ---------------\nvlm_vortexsheet = true # Whether to spread the wing circulation as a vortex sheet\nvlm_vortexsheet_overlap = 2.125 # Overlap of the particles that make the vortex sheet\nvlm_vortexsheet_distribution = uns.g_pressure # Distribution of the vortex sheet\n\nsigma_vlm_surf = b/100 # Smoothing radius of lifting bound vorticity\nvlm_vortexsheet_sigma_tbv = thickness_w*(b/ar) / 100 # Smoothing radius of trailing bound vorticity\n\nvlm_vortexsheet_maxstaticparticle = 1000000 # How many particles to preallocate for the vortex sheet\n\n\n# ---------- Force calculation parameters ----------\nKJforce_type = \"regular\" # KJ force evaluated at middle of bound vortices\n# KJforce_type = \"averaged\" # KJ force evaluated at average vortex sheet\n# KJforce_type = \"weighted\" # KJ force evaluated at strength-weighted vortex sheet\n\ninclude_trailingboundvortex = false # Include trailing bound vortices in force calculations\n\ninclude_freevortices = false # Include free vortices in force calculation\ninclude_freevortices_TBVs = false # Include trailing bound vortex in free-vortex force\n\ninclude_unsteadyforce = true # Include unsteady force\nadd_unsteadyforce = false # Whether to add the unsteady force to Ftot or to simply output it\n\ninclude_parasiticdrag = true # Include parasitic-drag force\nadd_skinfriction = true # If false, the parasitic drag is purely form, meaning no skin friction\ncalc_cd_from_cl = false # Whether to calculate cd from cl or effective AOA\nwing_polar_file = \"xf-rae101-il-1000000.csv\" # Airfoil polar for parasitic drag","category":"page"},{"location":"examples/blownwing-asm/","page":"Actuator Surface Model","title":"Actuator Surface Model","text":"Then we use a custom-defined function for calculating aerodynamic forces that uses the vortex sheet:","category":"page"},{"location":"examples/blownwing-asm/","page":"Actuator Surface Model","title":"Actuator Surface Model","text":"# ---------- Aerodynamic forces --------------\n\nforces = []\n\n# Calculate Kutta-Joukowski force\nkuttajoukowski = uns.generate_aerodynamicforce_kuttajoukowski(KJforce_type,\n sigma_vlm_surf, sigma_rotor_surf,\n vlm_vortexsheet, vlm_vortexsheet_overlap,\n vlm_vortexsheet_distribution,\n vlm_vortexsheet_sigma_tbv;\n vehicle=vehicle)\npush!(forces, kuttajoukowski)\n\n# Free-vortex force\nif include_freevortices\n freevortices = uns.generate_calc_aerodynamicforce_freevortices(\n vlm_vortexsheet_maxstaticparticle,\n sigma_vlm_surf,\n vlm_vortexsheet,\n vlm_vortexsheet_overlap,\n vlm_vortexsheet_distribution,\n vlm_vortexsheet_sigma_tbv;\n Ffv=uns.Ffv_direct,\n include_TBVs=include_freevortices_TBVs\n )\n push!(forces, freevortices)\nend\n\n# Force due to unsteady circulation\nif include_unsteadyforce\n unsteady(args...; optargs...) = uns.calc_aerodynamicforce_unsteady(args...; add_to_Ftot=add_unsteadyforce, optargs...)\n\n push!(forces, unsteady)\nend\n\n# Parasatic-drag force (form drag and skin friction)\nif include_parasiticdrag\n parasiticdrag = uns.generate_aerodynamicforce_parasiticdrag(wing_polar_file;\n read_path=joinpath(data_path, \"airfoils\"),\n calc_cd_from_cl=calc_cd_from_cl,\n add_skinfriction=add_skinfriction,\n Mach=speedofsound!=nothing ? magVref/speedofsound : nothing)\n push!(forces, parasiticdrag)\nend\n\n\n# Stitch all the forces into one function\nfunction calc_aerodynamicforce_fun(vlm_system, args...; per_unit_span=false, optargs...)\n\n # Delete any previous force field\n fieldname = per_unit_span ? \"ftot\" : \"Ftot\"\n if fieldname in keys(vlm_system.sol)\n pop!(vlm_system.sol, fieldname)\n end\n\n Ftot = nothing\n\n for (fi, force) in enumerate(forces)\n Ftot = force(vlm_system, args...; per_unit_span=per_unit_span, optargs...)\n end\n\n return Ftot\nend","category":"page"},{"location":"examples/blownwing-asm/","page":"Actuator Surface Model","title":"Actuator Surface Model","text":"This custom-defined force needs to be passed to uns.generate_monitor_wing:","category":"page"},{"location":"examples/blownwing-asm/","page":"Actuator Surface Model","title":"Actuator Surface Model","text":"monitor_wing = uns.generate_monitor_wing( ...\n include_trailingboundvortex=include_trailingboundvortex,\n calc_aerodynamicforce_fun=calc_aerodynamicforce_fun,\n ...\n )","category":"page"},{"location":"examples/blownwing-asm/","page":"Actuator Surface Model","title":"Actuator Surface Model","text":"Finally, pass the following keyword arguments to uns.run_simulation:","category":"page"},{"location":"examples/blownwing-asm/","page":"Actuator Surface Model","title":"Actuator Surface Model","text":"# ------------- 5) RUN SIMULATION ------------------------------------------\nuns.run_simulation( ...\n vlm_vortexsheet=vlm_vortexsheet,\n vlm_vortexsheet_overlap=vlm_vortexsheet_overlap,\n vlm_vortexsheet_distribution=vlm_vortexsheet_distribution,\n vlm_vortexsheet_sigma_tbv=vlm_vortexsheet_sigma_tbv,\n max_static_particles=vlm_vortexsheet_maxstaticparticle\n ...\n )","category":"page"},{"location":"examples/blownwing-asm/","page":"Actuator Surface Model","title":"Actuator Surface Model","text":"info: ASM Example\nThe next section shows an example on how to set up and run a simulation using the actuator surface model.","category":"page"},{"location":"api/flowunsteady-openvsp/#openvsp_import","page":"OpenVSP geometry","title":"OpenVSP geometry","text":"","category":"section"},{"location":"api/flowunsteady-openvsp/","page":"OpenVSP geometry","title":"OpenVSP geometry","text":"FLOWUnsteady.read_degengeom\nFLOWUnsteady.import_vsp","category":"page"},{"location":"api/flowunsteady-openvsp/#FLOWUnsteady.read_degengeom","page":"OpenVSP geometry","title":"FLOWUnsteady.read_degengeom","text":"`read_degengeom(filename::String)`\n\nRead all geometry components from a DegenGeom file written out by OpenVSP\n\nArguments\n\nfilename::String: DegenGeom filename\n\nReturns\n\ncomp: Vector of vsp.VSPComponent objects\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-openvsp/#FLOWUnsteady.import_vsp","page":"OpenVSP geometry","title":"FLOWUnsteady.import_vsp","text":"`import_vsp(comp::vsp.VSPComponent; geomType::String=\"\",\n flip_y::Bool=false, transpose_grid::Bool=false)`\n\nImports properties from OpenVSP component to FLOWUnsteady objects. Importing prop and duct geometries are under development.\n\nArguments\n\ncomp::vsp.VSPComponent: Single vsp.VSPComponent object\ngeomType::String : Geometry type may be one of - wing, fuselage, prop, duct\nsymmetric::Bool : Creates a symmetric wing using the semi-span coordinates\nflip_y::Bool : Flip y-coordinates about longitudinal plane. Useful for symmetric geometry\ntranspose_grid::Bool : Swap ordering of grid points\n\nReturns\n\ngeom: FLOWUnsteady geometry\n\n\n\n\n\n","category":"function"},{"location":"examples/openvsp-aircraft/#OpenVSP-Geometry","page":"OpenVSP Geometry","title":"OpenVSP Geometry","text":"","category":"section"},{"location":"examples/openvsp-aircraft/","page":"OpenVSP Geometry","title":"OpenVSP Geometry","text":"In this example, we import an aircraft model created in OpenVSP into the FLOWUnsteady environment. The aircraft.vsp3 file used here is available in the folder examples/aircraft-vsp/ in the FLOWUnsteady GitHub repo.","category":"page"},{"location":"examples/openvsp-aircraft/","page":"OpenVSP Geometry","title":"OpenVSP Geometry","text":"After creating the aircraft geometry in OpenVSP, we write out a DegenGeom file using the tab Analysis > DegenGeom as shown below. This creates a CSV file that contains all the components of the aircraft geometry.","category":"page"},{"location":"examples/openvsp-aircraft/","page":"OpenVSP Geometry","title":"OpenVSP Geometry","text":"(Image: DegenGeom)","category":"page"},{"location":"examples/openvsp-aircraft/","page":"OpenVSP Geometry","title":"OpenVSP Geometry","text":"Let's import the geometry into Julia using the FLOWUnsteady.read_degengeom function and inspect it.","category":"page"},{"location":"examples/openvsp-aircraft/","page":"OpenVSP Geometry","title":"OpenVSP Geometry","text":"import FLOWUnsteady as uns\n\ngeom_path = joinpath(uns.examples_path, \"aircraft-vsp\", \"aircraft.csv\")\ncomp = uns.read_degengeom(geom_path);\n\nfor i in 1:length(comp)\n println(\"$i. $(comp[i].name)\")\nend","category":"page"},{"location":"examples/openvsp-aircraft/","page":"OpenVSP Geometry","title":"OpenVSP Geometry","text":"Now that we have a good idea about the index of the components in the geometry, we can use them in FLOWUnsteady using the function FLOWUnsteady.import_vsp. The following example script imports the OpenVSP geometry, creates FLOWUnsteady data structures and writes it out to a vtk file. The geometry can be used with the FLOWUnsteady solver by following one of the previous examples.","category":"page"},{"location":"examples/openvsp-aircraft/","page":"OpenVSP Geometry","title":"OpenVSP Geometry","text":"#=##############################################################################\n# DESCRIPTION\n Import of OpenVSP geometry into FLOWUnsteady\n\n# AUTHORSHIP\n * Author : Cibin Joseph\n * Email : cibinjoseph92@gmail.com\n * Created : Aug 2023\n * Last updated : Aug 2023\n * License : MIT\n=###############################################################################\n\nimport FLOWUnsteady as uns\n\nrun_name = \"aircraft-vsp\" # Name of this simulation\nsave_path = run_name # Where to save this simulation\n\n# Path to DegenGeom file\ngeom_path = joinpath(uns.examples_path, \"aircraft-vsp\", \"aircraft.csv\")\n\nVinf(X, t) = [1.0, 0.0, 0.0] # Freestream function\n\n# ----------------- 1) VEHICLE DEFINITION --------------------------------------\nprintln(\"Importing geometry...\")\n\n# Import VSP Components from DegenGeom file\ncomp = uns.read_degengeom(geom_path);\n\nfuselage = uns.import_vsp(comp[1])\nwingL = uns.import_vsp(comp[2])\nwingR = uns.import_vsp(comp[2]; flip_y=true)\nbasefuse = uns.import_vsp(comp[4])\nhorstabL = uns.import_vsp(comp[5])\nhorstabR = uns.import_vsp(comp[5]; flip_y=true)\nverstab = uns.import_vsp(comp[7])\n\nprintln(\"Generating vehicle...\")\n\n# Generate vehicle\nsystem = uns.vlm.WingSystem() # System of all FLOWVLM objects\nuns.vlm.addwing(system, \"WingL\", wingL)\nuns.vlm.addwing(system, \"WingR\", wingR)\nuns.vlm.addwing(system, \"HorStabL\", horstabL)\nuns.vlm.addwing(system, \"HorStabR\", horstabR)\nuns.vlm.addwing(system, \"VerStab\", verstab)\n\nfuse_grid = uns.gt.MultiGrid(3)\nuns.gt.addgrid(fuse_grid, \"Fuselage\", fuselage)\n\nbasefuse_grid = uns.gt.MultiGrid(3)\nuns.gt.addgrid(basefuse_grid, \"BaseFuse\", basefuse)\n\ngrids = [fuse_grid, basefuse_grid]\n\nvlm_system = system # System solved through VLM solver\nwake_system = system # System that will shed a VPM wake\n\nvehicle = uns.VLMVehicle( system;\n vlm_system=vlm_system,\n wake_system=wake_system,\n grids=grids\n );\n\n# ----------------- EXPORT GEOMETRY --------------------------------------------\nif isdir(save_path); rm(save_path, recursive=true, force=true); end\nmkdir(save_path)\n\nuns.vlm.setVinf(system, Vinf)\nstr = uns.save_vtk(vehicle, run_name; path=save_path)\n\n# Open up geometry in ParaView\nstr = joinpath(save_path, str)\nrun(`paraview -data=$(str)`)","category":"page"},{"location":"examples/openvsp-aircraft/","page":"OpenVSP Geometry","title":"OpenVSP Geometry","text":"(Image: Paraview)","category":"page"},{"location":"theory/convergence/#Convergence","page":"Convergence","title":"Convergence","text":"","category":"section"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"The following is a compilation of convergence studies found in the literature using FLOWUnsteady.","category":"page"},{"location":"theory/convergence/#Wing-Performance","page":"Convergence","title":"Wing Performance","text":"","category":"section"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"Source: E. J. Alvarez, 2022[1]","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"
\n \"Pic\n \"Pic\n
","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"Case: 45^circ swept-back wing at an angle of attack of 42^circ. Aspect ratio of 5.0, RAE 101 airfoil section with 12% thickness, no dihedral, twist, nor taper. Freestream velocity of 497mathrmms, corresponding to a chord-based Reynolds number of 17 times 10^6. Convergence of loading distribution and integrated lift and drag as the number of wing elements is increased.","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"Takeaways:Resolving the wake for about 1.5 span-distances is sufficient to converge wing loading\nUsing between 100 and 200 elements fully resolves the wing loading (C_D changes by less than 1% with n_mathrmwing 100)","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"\n \n \n \n \n
\n \"Pic\n \n \"Pic\n
\n\n
\n\n
\n \"Pic\n
","category":"page"},{"location":"theory/convergence/#Rotor-Performance","page":"Convergence","title":"Rotor Performance","text":"","category":"section"},{"location":"theory/convergence/#APC-10x7-Propeller-Case","page":"Convergence","title":"APC 10x7 Propeller Case","text":"","category":"section"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"Source: E. J. Alvarez and A. Ning, 2020[2]","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"
\n \"Pic\n
","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"Case: APC 10x7E propeller at an advance ratio of 0.6, tip Mach number of 0.36, and mathrmRe_c = 62 times 10^4 and mathrmRe_D = 65 times 10^5. Convergence of thrust w.r.t. the following parameters:N_mathrmsteps, number of time steps per revolution.\nN_mathrmsheds, number of particle sheds per revolution.\nlambda, core overlap between tip particles defined as lambda=fracsigmaDelta x. Also controlled with the particle smoothing factor f_sigma = sigmaR, .\nn, number of blade elements per blade.Default values: N_mathrmsteps=72, N_mathrmsheds=144, lambda=2125 (or f_sigma=0093), and n=50 as each parameter is independently varied.","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"Takeaways:Temporal discretization error less than 1% with N_mathrmsteps geq 72 (or time step smaller than 5^circ)\nSpatial discretization error less than 1% with N_mathrmsheds geq 144 and n = 50.\nC_T starts to diverge as the stability threshold (lambda=1) is approached, while also diverging as f_sigma025 (equivalent to sigma larger than 025R) leads to unphysical wake dynamics caused by excessive smoothing. Since the instability associated with lambdarightarrow1 plateaus at lambdaapprox2, we recommend using lambda approx 2125 whenever possible.","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"\n
\n \"Pic\n
\n\n\n \n \n \n \n
\n \"Pic\n \n \"Pic\n
\n\n
","category":"page"},{"location":"theory/convergence/#Wind-Turbine-Case","page":"Convergence","title":"Wind Turbine Case","text":"","category":"section"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"Source: J. Mehr, E. J. Alvarez, and A. Ning, 2022[4]","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"
\n \"Pic\n
","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"Case: Test series \"H\" from UAE study at US Department of Energy.","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"Takeaways:Spatio-temporal discretization error on thrust C_T is less than 1% with 72 steps per revolution (or 5^circ per step), while error on power C_P is less than 3%.\nBlade discretization error less than 0.1% with 50 blade elements per blade.","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"\n
\n \"Pic\n \"Pic\n
\n\n
","category":"page"},{"location":"theory/convergence/#Beaver-Propeller-Case","page":"Convergence","title":"Beaver Propeller Case","text":"","category":"section"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"Source: E. J. Alvarez, 2022[1], and E. J. Alvarez and A. Ning, 2023[3]","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"
\n \"Pic\n
","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"Case: Beaver propeller at an advance ratio of 0.8, tip Mach number of 0.46, and mathrmRe_07D = 18 times 10^6. Convergence of thrust, torque, and blade loading w.r.t. the following parameters:N_mathrmsheds, number of particle sheds per revolution.\nn, number of blade elements per blade.Constant parameters: N_mathrmsteps=72 and lambda=fracsigmaDelta x = fracsigma N_mathrmsheds2pi R = 2125, which leads to a decreasing sigma as N_mathrmshedsincreases.","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"\n
\n \"Pic\n \"Pic\n \"Pic\n
\n\n
","category":"page"},{"location":"theory/convergence/#Rotor-Wake","page":"Convergence","title":"Rotor Wake","text":"","category":"section"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"Source: E. J. Alvarez, 2022[1], and E. J. Alvarez and A. Ning, 2023[3]","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"Case: Continuation of Beaver propeller convergence study. Wake structure and flow field compared to experimental PIV measurements.","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"Takeaways: Even though the aerodynamic performance of the rotor (thrust, torque, and blade loading) is sufficiently converged with N_mathrmsheds=144 and n=50, higher refinement might be needed in order to properly time-resolve the vortical structure downstream of the rotor (which might be important when the rotor wake impinges on another surface). However, N_mathrmsheds=144 and n=50 is sufficient to capture the time-average velocity in the wake. This study shows that tip vortices and the inner vortex sheet can be resolved with as much granularity as desired by going to finer discretizations.","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"\n
\n \"Pic\n

\n \"Pic\n

\n \"Pic\n\n
\n \"Vid\n \"Vid\n
\n\n
","category":"page"},{"location":"theory/convergence/#Immersed-Vorticity","page":"Convergence","title":"Immersed Vorticity","text":"","category":"section"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"We have noticed that in cases with strong wake interactions (e.g., a rotor wake impinging on a wing surface), the size of the particles used to immerse the surface vorticity can change the effects of the interaction. However, over the years we have discovered a heuristic that seems to converge to the right solution, independent of the nature of the problem: the size of the embedded particles needs to be about two orders of magnitude smaller than the relevant length scale.In FLOWUnsteady, there are three different core sizes related to the immersed vorticity:sigma_mathrmrotor, smoothing radius of the rotor bound vorticity (sigma_rotor_surf)\nsigma_mathrmLBV, smoothing radius of the lifting bound vorticity of wings (sigma_vlm_surf)\nsigma_mathrmTBV, smoothing radius of the trailing bound vorticity of wings (vlm_vortexsheet_sigma_tbv)Accordingly, whenever possible, we recommend choosing sigma-values close tosigma_mathrmrotor approx 001D, where D is the rotor diameter\nsigma_mathrmLBV approx 001b, where b is the wing span\nsigma_mathrmTBV approx 001t, where t is the thickness of the wingThe following is an excerpt from E. J. Alvarez, 2022,[1] Sec. 8.3., confirming the validity of the \"sigma approx 001ell\" heuristic:","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"\n
\n \"Pic\n \"Pic\n \"Pic\n
\n \"Pic\n \"Pic\n \"Pic\n
\n\n
","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"[1]: E. J. Alvarez (2022), \"Reformulated Vortex Particle Method and Meshless Large Eddy Simulation of Multirotor Aircraft,\" Doctoral Dissertation, Brigham Young University. [PDF]","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"[2]: E. J. Alvarez & A. Ning (2020), \"High-Fidelity Modeling of Multirotor Aerodynamic Interactions for Aircraft Design,\" AIAA Journal. [DOI] [PDF]","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"[3]: E. J. Alvarez & A. Ning (2023), \"Meshless Large Eddy Simulation of Propeller-Wing Interactions Through the Reformulated Vortex Particle Method,\" Journal of Aircraft. [DOI] [PDF]","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"[4]: J. Mehr, E. J. Alvarez, & A. Ning (2022), \"Interactional Aerodynamics Analysis of a Multi-Rotor Energy Kite,\" (in review).","category":"page"},{"location":"api/flowvpm-sfs/#SFS-Scheme","page":"SFS Scheme","title":"SFS Scheme","text":"","category":"section"},{"location":"api/flowvpm-sfs/","page":"SFS Scheme","title":"SFS Scheme","text":"FLOWUnsteady.vpm.SubFilterScale\nFLOWUnsteady.vpm.NoSFS\nFLOWUnsteady.vpm.ConstantSFS\nFLOWUnsteady.vpm.DynamicSFS\nFLOWUnsteady.vpm.clipping_backscatter\nFLOWUnsteady.vpm.control_directional\nFLOWUnsteady.vpm.control_magnitude\nFLOWUnsteady.vpm.dynamicprocedure_pseudo3level\nFLOWUnsteady.vpm.dynamicprocedure_sensorfunction\nFLOWUnsteady.vpm.Estr_direct\nFLOWUnsteady.vpm.Estr_fmm\nFLOWUnsteady.vpm.Estr_direct\nFLOWUnsteady.vpm.Estr_direct","category":"page"},{"location":"api/flowvpm-sfs/#FLOWVPM.SubFilterScale","page":"SFS Scheme","title":"FLOWVPM.SubFilterScale","text":"Implementation of calculations associated with subfilter-scale turbulence\n\nmodel.\n\nNOTE: Any implementation is expected to evaluate UJ and SFS terms of the particles which will be used by the time integration routine so make sure they are stored in the memory (see implementation of ConstantSFS as an example).\n\nNOTE2: Any control strategy is implemented as a function that returns true whenever the SFS model needs to be clipped. Subsequently, the model coefficient of the targeted particle will be turned to zero.\n\n\n\n\n\n","category":"type"},{"location":"api/flowvpm-sfs/#FLOWVPM.DynamicSFS","page":"SFS Scheme","title":"FLOWVPM.DynamicSFS","text":"Subfilter-scale scheme with an associated dynamic procedure for calculating\n\nthe model coefficient.\n\n\n\n\n\n","category":"type"},{"location":"api/flowvpm-sfs/#FLOWVPM.clipping_backscatter","page":"SFS Scheme","title":"FLOWVPM.clipping_backscatter","text":"Backscatter control strategy of SFS enstrophy production by clipping of the\n\nSFS model. See 20210901 notebook for derivation.\n\n\n\n\n\n","category":"function"},{"location":"api/flowvpm-sfs/#FLOWVPM.control_directional","page":"SFS Scheme","title":"FLOWVPM.control_directional","text":"Directional control strategy of SFS enstrophy production forcing the model\n\nto affect only the vortex strength magnitude and not the vortex orientation. See 20210901 notebook for derivation.\n\n\n\n\n\n","category":"function"},{"location":"api/flowvpm-sfs/#FLOWVPM.control_magnitude","page":"SFS Scheme","title":"FLOWVPM.control_magnitude","text":"Magnitude control strategy of SFS enstrophy production limiting the\n\nmagnitude of the forward scattering (diffussion) of the model. See 20210901 notebook for derivation.\n\n\n\n\n\n","category":"function"},{"location":"api/flowvpm-sfs/#FLOWVPM.dynamicprocedure_pseudo3level","page":"SFS Scheme","title":"FLOWVPM.dynamicprocedure_pseudo3level","text":"Dynamic procedure for SFS model coefficient based on enstrophy and\n\nderivative balance between resolved and unresolved domain, numerically implemented through pseudo-three filtering levels. See 20210901 notebook for derivation.\n\nNOTES\n\nrlxf = Δ𝑡/𝑇 ≤ 1 is the relaxation factor of the Lagrangian average, where Δ𝑡\n\nis the time step of the simulation, and 𝑇 is the time length of the ensemble average.\n\nThe scaling constant becomes 1 for alpha_tau = 1 (but notice that the\n\nderivative approximation becomes zero at that point). Hence, the pseudo-three-level procedure converges to the two-level procedure for alpha_tau rightarrow 1**.\n\nThe scaling constant tends to zero when alpha_tau rightarrow 23. Hence,\n\nit can be used to arbitrarely attenuate the SFS contributions with alpha_tau rightarrow 23, or let it trully be a self-regulated dynamic procedure with alpha_tau rightarrow 1.\n\nalpha_tau\nshould not be made smaller than 23 as the constant becomes\n\nnegative beyond that point. This strains the assumption that sigma_tau is small enough to approximate the singular velocity field as mathbfu approx mathbftildeu, which now is only true if sigma is small enough.\n\n𝛼𝜏=0.999 ⇒ 3𝛼𝜏−2=0.997 𝛼𝜏=0.990 ⇒ 3𝛼𝜏−2=0.970 𝛼𝜏=0.900 ⇒ 3𝛼𝜏−2=0.700 𝛼𝜏=0.833 ⇒ 3𝛼𝜏−2=0.499 𝛼𝜏=0.750 ⇒ 3𝛼𝜏−2=0.250 𝛼𝜏=0.700 ⇒ 3𝛼𝜏−2=0.100 𝛼𝜏=0.675 ⇒ 3𝛼𝜏−2=0.025 𝛼𝜏=0.670 ⇒ 3𝛼𝜏−2=0.010 𝛼𝜏=0.667 ⇒ 3𝛼𝜏−2=0.001 𝛼𝜏=0.6667⇒ 3𝛼𝜏−2=0.0001\n\n\n\n\n\n","category":"function"},{"location":"api/flowvpm-sfs/#FLOWVPM.dynamicprocedure_sensorfunction","page":"SFS Scheme","title":"FLOWVPM.dynamicprocedure_sensorfunction","text":"Dynamic procedure for SFS model coefficient based on sensor function of\n\nenstrophy between resolved and unresolved domain, numerically implemented through a test filter. See 20210901 notebook for derivation.\n\n\n\n\n\n","category":"function"},{"location":"api/flowvpm-sfs/#FLOWVPM.Estr_direct","page":"SFS Scheme","title":"FLOWVPM.Estr_direct","text":"Model of vortex-stretching SFS contributions evaluated with direct\n\nparticle-to-particle interactions. See 20210901 notebook for derivation.\n\n\n\n\n\n","category":"function"},{"location":"api/flowvpm-sfs/#FLOWVPM.Estr_fmm","page":"SFS Scheme","title":"FLOWVPM.Estr_fmm","text":"Model of vortex-stretching SFS contributions evaluated with fast multipole\n\nmethod. See 20210901 notebook for derivation.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-run/#(5)-Run-Simulation","page":"(5) Run Simulation","title":"(5) Run Simulation","text":"","category":"section"},{"location":"api/flowunsteady-run/","page":"(5) Run Simulation","title":"(5) Run Simulation","text":"FLOWUnsteady.run_simulation","category":"page"},{"location":"api/flowunsteady-run/#FLOWUnsteady.run_simulation","page":"(5) Run Simulation","title":"FLOWUnsteady.run_simulation","text":"Run the FLOWUnsteady simulation sim in nsteps number of time steps.\n\nrun_simulation(\n\n sim::Simulation, # Simulation object\n nsteps::Int; # Total time steps in simulation\n\n # -------- SIMULATION OPTIONS -----------------------------------------\n Vinf = (X, t)->zeros(3), # Freestream velocity\n sound_spd = 343, # (m/s) speed of sound\n rho = 1.225, # (kg/m^3) air density\n mu = 1.81e-5, # (Pa*s) air dynamic viscosity\n tquit = Inf, # (s) force quit the simulation at this time\n rand_RPM = false, # (experimental) randomize RPM fluctuations\n\n extra_runtime_function = (sim, PFIELD, T, DT; optargs...)->false,\n\n # -------- SOLVERS OPTIONS --------------------------------------------\n # Vortex particle method\n max_particles = Int(1e5), # Maximum number of particles\n max_static_particles = nothing, # Maximum number of static particles (use `nothing` to automatically estimate it)\n p_per_step = 1, # Particle sheds per time step\n vpm_formulation = vpm.rVPM, # VPM formulation (`vpm.rVPM` or `vpm.cVPM`)\n vpm_kernel = vpm.gaussianerf, # VPM kernel (`vpm.gaussianerf` or `vpm.winckelmans`)\n vpm_UJ = vpm.UJ_fmm, # VPM particle-to-particle interaction scheme (`vpm.UJ_fmm` or `vpm.UJ_direct`)\n vpm_SFS = vpm.SFS_none, # VPM LES subfilter-scale model (`SFS_none`, `SFS_Cd_threelevel_nobackscatter`, `SFS_Cd_twolevel_nobackscatter`, or `SFS_Cs_nobackscatter`)\n vpm_integration = vpm.rungekutta3, # VPM time integration scheme (`vpm.euler` or `vpm.rungekutta3`)\n vpm_transposed = true, # VPM transposed stretching scheme\n vpm_viscous = vpm.Inviscid(), # VPM viscous diffusion scheme (`vpm.Inviscid()`, `vpm.CoreSpreading(nu, sgm0, zeta)`, or `vpm.ParticleStrengthExchange(nu)`)\n vpm_fmm = vpm.FMM(; p=4, ncrit=50, theta=0.4, phi=0.5), # VPM's FMM settings\n vpm_relaxation = vpm.pedrizzetti, # VPM relaxation scheme (`vpm.norelaxation`, `vpm.correctedpedrizzetti`, or `vpm.pedrizzetti`)\n vpm_surface = true, # Whether to include surfaces in the VPM through ASM/ALM\n\n # Actuator surface/line model (ASM/ALM): VLM and blade elements\n vlm_vortexsheet = false, # Whether to spread surface circulation as a vortex sheet in the VPM (turns ASM on; ALM if false)\n vlm_vortexsheet_overlap = 2.125,# Overlap of particles that make the vortex sheet\n vlm_vortexsheet_distribution= g_pressure, # Vorticity distribution of vortex sheet (`g_uniform`, `g_linear`, or `g_pressure`)\n vlm_vortexsheet_sigma_tbv = nothing, # Size of particles in trailing bound vortices (defaults to `sigma_vlm_surf` if not given)\n vlm_rlx = -1, # VLM relaxation (>0.9 can cause divergence, <0.2 slows simulation too much, deactivated with <0)\n vlm_init = false, # Initialize the first step with the VLM semi-infinite wake solution\n hubtiploss_correction = vlm.hubtiploss_nocorrection, # Hub and tip loss correction of rotors (ignored in quasi-steady solver)\n\n # Wake shedding\n wake_coupled = true, # Couple VPM wake -> VLM solution\n shed_unsteady = true, # Whether to shed vorticity from unsteady loading\n unsteady_shedcrit = 0.01, # Criterion for unsteady-loading shedding\n shed_starting = false, # Whether to shed starting vortex (only when `shed_unsteady=true`)\n shed_boundarylayer = false, # (experimental) whether to shed vorticity from boundary layer of surfaces\n boundarylayer_prescribedCd = 0.1, # (experimental) prescribed Cd for boundary layer shedding used for wings\n boundarylayer_d = 0.0, # (experimental) dipole width for boundary layer shedding\n omit_shedding = [], # Indices of elements in `sim.vehicle.wake_system` on which omit shedding VPM particles\n\n # Regularization of solvers\n sigma_vlm_solver = -1, # Regularization of VLM solver (internal VLM-on-VLM)\n sigma_vlm_surf = -1, # (REQUIRED!) Size of embedded particles in ASM/ALM wing surfaces (for VLM-on-VPM and VLM-on-Rotor)\n sigma_rotor_surf = -1, # (REQUIRED!) Size of embedded particles in ALM blade surfaces (for Rotor-on-VPM, Rotor-on-VLM, and Rotor-on-Rotor)\n sigmafactor_vpm = 1.0, # Core overlap of wake particles\n sigmafactor_vpmonvlm = 1, # (experimental) shrinks the particles by this factor when calculating VPM-on-VLM/Rotor induced velocities\n sigma_vpm_overwrite = nothing, # Overwrite core size of wake to this value (ignoring `sigmafactor_vpm`)\n\n # -------- RESTART OPTIONS --------------------------------------------\n restart_vpmfile = nothing, # VPM restart file to restart simulation\n\n # -------- OUTPUT OPTIONS ---------------------------------------------\n save_path = nothing, # Where to save simulation\n run_name = \"flowunsteadysim\",# Suffix of output files\n create_savepath = true, # Whether to create `save_path`\n prompt = true, # Whether to prompt the user\n verbose = true, # Enable verbose\n v_lvl = 0, # Indentation level of verbose\n verbose_nsteps = 10, # Verbose every this many steps\n raisewarnings = true, # Whether to raise warnings\n debug = false, # Output extra states for debugging\n nsteps_save = 1, # Save vtks every this many steps\n nsteps_restart = -1, # Save jlds every this many steps (restart files)\n save_code = \"\", # Copy the source code in this path to `save_path`\n save_horseshoes = false, # Whether to output VLM horseshoes in VTKs\n save_static_particles = true, # Whether to save ASM/ALM embedded particles\n save_wopwopin = false, # Generate input files for PSU-WOPWOP\n\n)\n\nEven though a bast number of settings are exposed to the user, the only required keyword arguments are sigma_vlm_surf and sigma_rotor_surf. Thus, running the simulation can be as simple as\n\nrun_simulation(sim::Simulation, nsteps::Int;\n sigma_vlm_surf = ..., sigma_rotor_surf = ...)\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-run/","page":"(5) Run Simulation","title":"(5) Run Simulation","text":"compat: Extra Runtime Function\nextra_runtime_function is a function that is called at every time step after the state variables are updated and before outputting VTK files. The state variables of the simulation are passed to this function, giving the user complete freedom to modify the states of the simulation (e.g., add/remove particles, clip vortex strengths, re-orient the vehicle) or to do some extra computation (e.g., compute aerodynamic forces, create plots, write to files, etc).This function is expected be of the formextra_runtime_function(sim, pfield, t, dt; vprintln) -> Boolwhere sim is the FLOWUnsteady.Simulation object, pfield is the FLOWVPM.ParticleField, t is the current simulation time, dt is the length of the current time step, and vprintln(str, v_lvl) is a function for printing the verbose of the simulation (default to vprintln = (args...)->nothing if there is nothing to add to the verbose).The output of extra_runtime_function is a flag for breaking the simulation at the current time step, such that if it ever returns true, the simulation will immediately quit.","category":"page"},{"location":"api/flowunsteady-run/","page":"(5) Run Simulation","title":"(5) Run Simulation","text":"compat: So, what is going on under the hood?\nFLOWUnsteady is simply a runtime function that is provided to FLOWVPM, as shown below. Hence, FLOWVPM (green block) is the solver that is actually driving the simulation. FLOWUnsteady (blue block) acts as a runtime function inside a VPM simulation that at each time step uses the solvers in the gray block to compute surface vorticities and adds particles to embed such vorticity in the flow field (thus implementing the actuator surface/line models developed in Alvarez' dissertation, Chapter 6).This workflow makes it very easy to couple more solvers in the simulation. For instance, a structural solver can be inserted as a runtime function (step 6 of the blue block) that deflects the geometry according to the aerodynamic loads, obtaining a full aeroelastic simulation.","category":"page"},{"location":"api/flowunsteady-run/","page":"(5) Run Simulation","title":"(5) Run Simulation","text":"
\n \"Pic\n
","category":"page"},{"location":"examples/propeller-incidence/#Incidence-Sweep","page":"Incidence Sweep","title":"Incidence Sweep","text":"","category":"section"},{"location":"examples/propeller-incidence/","page":"Incidence Sweep","title":"Incidence Sweep","text":"
\n \"Vid\n
","category":"page"},{"location":"examples/propeller-incidence/","page":"Incidence Sweep","title":"Incidence Sweep","text":"In simple cases like a propeller in cruise, steady and quasi-steady methods like blade element momentum theory can be as accurate as a fully unsteady simulation, and even faster. However, in more complex cases, quasi-steady solvers are far from accurate and a fully unsteady solver is needed. We now highlight one of such cases: the case of a propeller at an incidence angle.","category":"page"},{"location":"examples/propeller-incidence/","page":"Incidence Sweep","title":"Incidence Sweep","text":"A rotor operating at an incidence angle relative to the freestream experiences an unsteady loading due to the blade seeing a larger local velocity in the advancing side of the rotor and a smaller local velocity in the retreating side. This also causes a wake that is skewed. For this example we will run a sweep of simulations on a 4-bladed propeller operating at multiple incidence angles alpha (where alpha=0^circ is fully axial inflow, and alpha=90^circ is fully edgewise inflow).","category":"page"},{"location":"examples/propeller-incidence/","page":"Incidence Sweep","title":"Incidence Sweep","text":"#=##############################################################################\n# DESCRIPTION\n Simulation of Beaver propeller (four-bladed rotor, 9.34-inch diameter) at\n various incidence angles.\n\n This example uses the blade geometry reported in Sinnige & de Vries (2018),\n \"Unsteady Pylon Loading Caused by Propeller-Slipstream Impingement for\n Tip-Mounted Propellers,\" and replicates the experiment conducted by Sinnige\n et al. (2019), \"Wingtip-Mounted Propellers: Aerodynamic Analysis of\n Interaction Effects and Comparison with Conventional Layout.\"\n\n# AUTHORSHIP\n * Author : Eduardo J. Alvarez (edoalvarez.com)\n * Email : Edo.AlvarezR@gmail.com\n * Created : Mar 2023\n * Last updated : Mar 2023\n * License : MIT\n=###############################################################################\n\nimport FLOWUnsteady as uns\nimport FLOWVLM as vlm\n\ncase_name = \"propeller-incidencesweep-example\" # Name of this sweep case\n\nsave_path = case_name # Where to save this sweep\noutput_runs = [20] # Saves the VTK output of these AOAs for viz\n\n\n# ----------------- GEOMETRY PARAMETERS ----------------------------------------\n\n# Rotor geometry\nrotor_file = \"beaver.csv\" # Rotor geometry\ndata_path = uns.def_data_path # Path to rotor database\npitch = 0.0 # (deg) collective pitch of blades\nCW = false # Clock-wise rotation\nxfoil = false # Whether to run XFOIL\nread_polar = vlm.ap.read_polar2 # What polar reader to use\n\n# Discretization\nn = 20 # Number of blade elements per blade\nr = 1/5 # Geometric expansion of elements\n\n# Read radius of this rotor and number of blades\nR, B = uns.read_rotor(rotor_file; data_path=data_path)[[1,3]]\n\n# ----------------- SIMULATION PARAMETERS --------------------------------------\n\n# Operating conditions\nAOAs = 0:4:20 # (deg) incidence angles to evaluate\nmagVinf = 40.0 # (m/s) freestream velocity\nJ = 0.9 # Advance ratio Vinf/(nD)\nRPM = magVinf / (2*R/60) / J # RPM\n\nrho = 1.225 # (kg/m^3) air density\nmu = 1.79e-5 # (kg/ms) air dynamic viscosity\nspeedofsound = 342.35 # (m/s) speed of sound\n\n\nReD = 2*pi*RPM/60*R * rho/mu * 2*R # Diameter-based Reynolds number\nMatip = 2*pi*RPM/60*R / speedofsound # Tip Mach number\n\nprintln(\"\"\"\n RPM: $(RPM)\n Vinf: $(magVinf) m/s\n Matip: $(round(Matip, digits=3))\n ReD: $(round(ReD, digits=0))\n\"\"\")\n\n# ----------------- SOLVER PARAMETERS ------------------------------------------\n\n# Aerodynamic solver\nVehicleType = uns.UVLMVehicle # Unsteady solver\n\n# Time parameters\nnrevs = 4 # Number of revolutions in simulation\nnsteps_per_rev = 36 # Time steps per revolution\nnsteps = nrevs*nsteps_per_rev # Number of time steps\nttot = nsteps/nsteps_per_rev / (RPM/60) # (s) total simulation time\n\n# VPM particle shedding\np_per_step = 2 # Sheds per time step\nshed_starting = true # Whether to shed starting vortex\nshed_unsteady = true # Whether to shed vorticity from unsteady loading\nmax_particles = ((2*n+1)*B)*nsteps*p_per_step + 1 # Maximum number of particles\n\n# Regularization\nsigma_rotor_surf= R/40 # Rotor-on-VPM smoothing radius\n# sigma_rotor_surf= R/80\nlambda_vpm = 2.125 # VPM core overlap\n # VPM smoothing radius\nsigma_vpm_overwrite = lambda_vpm * 2*pi*R/(nsteps_per_rev*p_per_step)\n\n# Rotor solver\nvlm_rlx = 0.7 # VLM relaxation <-- this also applied to rotors\n # Prandtl's tip correction with a strong hub\nhubtiploss_correction = ( (0.75, 10, 0.5, 0.05), (1, 1, 1, 1.0) ) # correction up to r/R = 0.35\n\nif VehicleType == uns.QVLMVehicle # Mute colinear warnings if quasi-steady solver\n uns.vlm.VLMSolver._mute_warning(true)\nend\n\n\n# ----------------- 1) VEHICLE DEFINITION --------------------------------------\nprintln(\"Generating geometry...\")\n\n# Generate rotor\nrotor = uns.generate_rotor(rotor_file; pitch=pitch,\n n=n, CW=CW, blade_r=r,\n altReD=[RPM, J, mu/rho],\n xfoil=xfoil,\n read_polar=read_polar,\n data_path=data_path,\n verbose=true,\n verbose_xfoil=false,\n plot_disc=true\n );\n\nprintln(\"Generating vehicle...\")\n\n# Generate vehicle\nsystem = vlm.WingSystem() # System of all FLOWVLM objects\nvlm.addwing(system, \"Rotor\", rotor)\n\nrotors = [rotor]; # Defining this rotor as its own system\nrotor_systems = (rotors, ); # All systems of rotors\n\nwake_system = vlm.WingSystem() # System that will shed a VPM wake\n # NOTE: Do NOT include rotor when using the quasi-steady solver\nif VehicleType != uns.QVLMVehicle\n vlm.addwing(wake_system, \"Rotor\", rotor)\nend\n\nvehicle = VehicleType( system;\n rotor_systems=rotor_systems,\n wake_system=wake_system\n );\n\n\n# ------------- 2) MANEUVER DEFINITION -----------------------------------------\n# Non-dimensional translational velocity of vehicle over time\nVvehicle(t) = zeros(3)\n\n# Angle of the vehicle over time\nanglevehicle(t) = zeros(3)\n\n# RPM control input over time (RPM over `RPMref`)\nRPMcontrol(t) = 1.0\n\nangles = () # Angle of each tilting system (none)\nRPMs = (RPMcontrol, ) # RPM of each rotor system\n\nmaneuver = uns.KinematicManeuver(angles, RPMs, Vvehicle, anglevehicle)\n\n\n# ------------- 3) SIMULATION DEFINITION ---------------------------------------\n\nVref = 0.0 # Reference velocity to scale maneuver by\nRPMref = RPM # Reference RPM to scale maneuver by\n\nVinit = Vref*Vvehicle(0) # Initial vehicle velocity\nWinit = pi/180*(anglevehicle(1e-6) - anglevehicle(0))/(1e-6*ttot) # Initial angular velocity\n\nsimulation = uns.Simulation(vehicle, maneuver, Vref, RPMref, ttot;\n Vinit=Vinit, Winit=Winit);\n\n# ------------- RUN AOA SWEEP --------------------------------------------------\n\n# Create path where to save sweep\nuns.gt.create_path(save_path, true)\n\nfor AOA in AOAs\n\n println(\"\\n\\nRunning AOA = $(AOA)\")\n\n Vinf(X, t) = magVinf*[cosd(AOA), sind(AOA), 0] # (m/s) freestream velocity vector\n\n # ------------- 4) MONITOR DEFINITION ---------\n monitor_rotor = uns.generate_monitor_rotors(rotors, J, rho, RPM, nsteps;\n t_scale=RPM/60,\n t_lbl=\"Revolutions\",\n save_path=save_path,\n run_name=\"AOA$(ceil(Int, AOA*100))\",\n disp_conv=false\n )\n\n # ------------- 5) RUN SIMULATION -------------\n println(\"\\tRunning simulation...\")\n\n save_vtks = AOA in output_runs ? save_path*\"-AOA$(ceil(Int, AOA*100))\" : nothing\n\n uns.run_simulation(simulation, nsteps;\n # ----- SIMULATION OPTIONS -------------\n Vinf=Vinf,\n rho=rho, mu=mu, sound_spd=speedofsound,\n # ----- SOLVERS OPTIONS ----------------\n p_per_step=p_per_step,\n max_particles=max_particles,\n sigma_vlm_surf=sigma_rotor_surf,\n sigma_rotor_surf=sigma_rotor_surf,\n sigma_vpm_overwrite=sigma_vpm_overwrite,\n vlm_rlx=vlm_rlx,\n hubtiploss_correction=hubtiploss_correction,\n shed_unsteady=shed_unsteady,\n shed_starting=shed_starting,\n extra_runtime_function=monitor_rotor,\n # ----- OUTPUT OPTIONS ------------------\n save_path=save_vtks,\n run_name=\"singlerotor\",\n v_lvl=1, verbose_nsteps=24\n );\nend\n","category":"page"},{"location":"examples/propeller-incidence/","page":"Incidence Sweep","title":"Incidence Sweep","text":"\n Run time: ~15 minutes on a Dell Precision 7760 laptop.\n\n

","category":"page"},{"location":"examples/propeller-incidence/","page":"Incidence Sweep","title":"Incidence Sweep","text":"Check examples/propeller/propeller_incidence.jl to postprocess and plot the results as shown below.","category":"page"},{"location":"examples/propeller-incidence/","page":"Incidence Sweep","title":"Incidence Sweep","text":"
\n \"Pic\n
","category":"page"},{"location":"examples/propeller-incidence/","page":"Incidence Sweep","title":"Incidence Sweep","text":"info: Paraview visualization\nThe .pvsm file visualizing the simulation as shown at the top of this page is available here: LINK (right click → save as...). To open in Paraview: File → Load State → (select .pvsm file) then select \"Search files under specified directory\" and point it to the folder where the simulation was saved.","category":"page"},{"location":"examples/tetheredwing/#Tethered-Wing","page":"Tethered Wing","title":"Tethered Wing","text":"","category":"section"},{"location":"examples/tetheredwing/","page":"Tethered Wing","title":"Tethered Wing","text":"
\n \"Vid\n
","category":"page"},{"location":"examples/tetheredwing/","page":"Tethered Wing","title":"Tethered Wing","text":"
","category":"page"},{"location":"examples/tetheredwing/","page":"Tethered Wing","title":"Tethered Wing","text":"In this example we extend the simple wing case to fly a circular path. This simulates a kite tethered to the ground with a crosswind that causes it to fly in circles. The kite effectively acts as a turbine extracting energy from the wind to sustain flight, which is the basis for the field of airborne wind energy.","category":"page"},{"location":"examples/tetheredwing/","page":"Tethered Wing","title":"Tethered Wing","text":"This simulation exemplify the following features:","category":"page"},{"location":"examples/tetheredwing/","page":"Tethered Wing","title":"Tethered Wing","text":"Translating and re-orienting the initial position of the vehicle using FLOWVLM.setcoordsystem\nDefining a uns.KinematicManeuver object that prescribes the kinematics of a circular path\nCustomizing the wing monitor (uns.generate_monitor_wing) to compute and plot forces decomposed in arbitrary directions (in this case, following the orientation of the vehicle along the circular path)\nMonitoring the vehicle state variables with uns.generate_monitor_statevariables","category":"page"},{"location":"examples/tetheredwing/","page":"Tethered Wing","title":"Tethered Wing","text":"
","category":"page"},{"location":"examples/tetheredwing/","page":"Tethered Wing","title":"Tethered Wing","text":"#=##############################################################################\n# DESCRIPTION\n Kite flying in a circular path with crosswind while tethered to the ground.\n The kite is the same 45° swept-back wing from the previous example.\n\n# AUTHORSHIP\n * Author : Eduardo J. Alvarez (edoalvarez.com)\n * Email : Edo.AlvarezR@gmail.com\n * Created : Feb 2023\n * Last updated : Feb 2023\n * License : MIT\n=###############################################################################\n\nimport FLOWUnsteady as uns\nimport FLOWVLM as vlm\n\nrun_name = \"tetheredwing-example\" # Name of this simulation\n\nsave_path = run_name # Where to save this simulation\nparaview = true # Whether to visualize with Paraview\n\n\n# ----------------- GEOMETRY PARAMETERS ----------------------------------------\n# Wing description\nb = 2.489 # (m) span length\nar = 5.0 # Aspect ratio b/c_tip\ntr = 1.0 # Taper ratio c_tip/c_root\ntwist_root = 0.0 # (deg) twist at root\ntwist_tip = 0.0 # (deg) twist at tip\nlambda = 45.0 # (deg) sweep\ngamma = 0.0 # (deg) dihedral\n\n# Discretization\nn = 50 # Number of spanwise elements per side\nr = 10.0 # Geometric expansion of elements\ncentral = false # Whether expansion is central\n\n# ----------------- SIMULATION PARAMETERS --------------------------------------\n# Freestream\nmagVinf = 5.0 # (m/s) freestream velocity\nmagVeff = 49.7 # (m/s) vehicle effective velocity\nAOAeff = 4.2 # (deg) vehicle effective AOA\nrho = 0.93 # (kg/m^3) air density\nqinf = 0.5*rho*magVeff^2 # (Pa) static pressure\n\nVinf(X, t) = magVinf*[1, 0, 0] # Freestream function\n\n# Circular path\nR = 3.0*b # (m) radius of circular path\nmagVvehicle = sqrt(magVeff^2 - magVinf^2) # (m/s) vehicle velocity\nomega = magVvehicle/R # (rad/s) angular velocity\nalpha = AOAeff - atand(magVinf, magVvehicle) # (deg) vehicle pitch angle\n\n# ----------------- SOLVER PARAMETERS ------------------------------------------\n# Time parameters\nnrevs = 2.50 # Revolutions to resolve\nnsteps_per_rev = 144 # Number of time steps per revolution\n\nttot = nrevs / (omega/(2*pi)) # (s) total simulation time\nnsteps = ceil(Int, nrevs * nsteps_per_rev) # Number of time steps\n\n# VLM and VPM parameters\np_per_step = 4 # Number of particle sheds per time step\n\nsigma_vlm_solver= -1 # VLM-on-VLM smoothing radius (deactivated with <0)\nsigma_vlm_surf = 0.05*b # VLM-on-VPM smoothing radius\nlambda_vpm = 2.125 # VPM core overlap\n # VPM smoothing radius\nsigma_vpm_overwrite = lambda_vpm * magVeff * (ttot/nsteps)/p_per_step\n\nshed_starting = true # Whether to shed starting vortex\nvlm_rlx = 0.7 # VLM relaxation\n\n# NOTE: In some cases the starting vortex can cause numerical instabilities at\n# the beginning of the simulation. If so, consider omitting shedding of\n# the starting vortex with `shed_starting=false`, or relax the VLM solver\n# with `0.2 < vlm_rlx < 0.9`\n\n\n# ----------------- 1) VEHICLE DEFINITION --------------------------------------\nprintln(\"Generating geometry...\")\n\n# Generate wing\nwing = vlm.simpleWing(b, ar, tr, twist_root, lambda, gamma;\n twist_tip=twist_tip, n=n, r=r, central=central);\n\n# Rotate wing to pitch\nO = [0.0, 0.0, 0.0] # New position\nOaxis = uns.gt.rotation_matrix2(0.0, -alpha, 0.0) # New orientation\nvlm.setcoordsystem(wing, O, Oaxis)\n\n\nprintln(\"Generating vehicle...\")\n\n# Generate vehicle\nsystem = vlm.WingSystem() # System of all FLOWVLM objects\nvlm.addwing(system, \"Wing\", wing)\n\nvlm_system = system; # System solved through VLM solver\nwake_system = system; # System that will shed a VPM wake\n\nvehicle = uns.VLMVehicle( system;\n vlm_system=vlm_system,\n wake_system=wake_system\n );\n\n # Rotate vehicle to be perpendicular to crosswind\n # and translate it to start at (x, y, z) = (0, R, 0)\n O = [0, R, 0] # New position\n Oaxis = uns.gt.rotation_matrix2(0.0, -90, 0.0) # New orientation\n\n vlm.setcoordsystem(system, O, Oaxis)\n\n\n# ------------- 2) MANEUVER DEFINITION -----------------------------------------\n\n# Translational velocity of vehicle over time\nfunction Vvehicle(t)\n\n # NOTE: This function receives a non-dimensional time `t` (with t=0 being\n # the start of simulation and t=1 the end), and returns a\n # non-dimensional velocity vector. This vector will later be scaled\n # by `Vref`.\n\n Vx = 0\n Vy = -sin(2*pi*nrevs*t)\n Vz = cos(2*pi*nrevs*t)\n\n return [0, Vy, Vz]\nend\n\n# Angle of the vehicle over time\nfunction anglevehicle(t)\n\n # NOTE: This function receives the non-dimensional time `t` and returns the\n # attitude of the vehicle (a vector with inclination angles with\n # respect to each axis of the global coordinate system)\n\n return [0, 0, 360*nrevs*t]\nend\n\nangle = () # Angle of each tilting system (none)\nRPM = () # RPM of each rotor system (none)\n\nmaneuver = uns.KinematicManeuver(angle, RPM, Vvehicle, anglevehicle)\n\n# NOTE: `FLOWUnsteady.KinematicManeuver` defines a maneuver with prescribed\n# kinematics. `Vvehicle` defines the velocity of the vehicle (a vector)\n# over time. `anglevehicle` defines the attitude of the vehicle over time.\n# `angle` defines the tilting angle of each tilting system over time (none\n# in this case). `RPM` defines the RPM of each rotor system over time\n# (none in this case).\n# Each of these functions receives a nondimensional time `t`, which is the\n# simulation time normalized by the total time `ttot`, from 0 to\n# 1, beginning to end of simulation. They all return a nondimensional\n# output that is then scaled by either a reference velocity (`Vref`) or\n# a reference RPM (`RPMref`). Defining the kinematics and controls of the\n# maneuver in this way allows the user to have more control over how fast\n# to perform the maneuver, since the total time, reference velocity and\n# RPM are then defined in the simulation parameters shown below.\n\n\n\n\n# ------------- 3) SIMULATION DEFINITION ---------------------------------------\n\nVref = magVvehicle # Reference velocity to scale maneuver by\nRPMref = 0.0 # Reference RPM to scale maneuver by\nVinit = Vref*Vvehicle(0) # Initial vehicle velocity\nWinit = pi/180*(anglevehicle(1e-6) - anglevehicle(0))/(1e-6*ttot) # Initial angular velocity\n\n # Maximum number of particles\nmax_particles = (nsteps+1)*(vlm.get_m(vehicle.vlm_system)*(p_per_step+1) + p_per_step)\n\nsimulation = uns.Simulation(vehicle, maneuver, Vref, RPMref, ttot;\n Vinit=Vinit, Winit=Winit);\n\n\n\n\n# ------------- 4) MONITORS DEFINITIONS ----------------------------------------\n\nfigs, figaxs = [], [] # Figures generated by monitors\nimport FLOWUnsteady: @L_str # Macro for writing LaTeX labels\n\n# Generate function that computes aerodynamic forces\ncalc_aerodynamicforce_fun = uns.generate_calc_aerodynamicforce(;\n add_parasiticdrag=true,\n add_skinfriction=true,\n airfoilpolar=\"xf-rae101-il-1000000.csv\"\n )\n\n# Time-varying directions used to decompose the aerodynamic force\nN_dir(t) = [1, 0, 0] # Direction of normal force\nT_dir(t) = [0, sin(omega*t), -cos(omega*t)] # Direction of tangent force\nS_dir(t) = uns.cross(N_dir(t), T_dir(t)) # Spanwise direction\n\nX_offset(t) = system.O # Reference wing origin (for calculating spanwise position)\nS_proj(t) = S_dir(t) # Reference span direction (for calculating spanwise position)\n\n# Generate wing monitor\nmonitor_wing = uns.generate_monitor_wing(wing, Vinf, b, ar,\n rho, qinf, nsteps;\n calc_aerodynamicforce_fun=calc_aerodynamicforce_fun,\n L_dir=N_dir,\n D_dir=T_dir,\n X_offset=X_offset,\n S_proj=S_proj,\n CL_lbl=L\"Normal force $C_n$\",\n CD_lbl=L\"Tangent force $C_t$\",\n cl_lbl=L\"Sectional normal force $c_n$\",\n cd_lbl=L\"Sectional tangent force $c_t$\",\n cl_ttl=\"Normal force distribution\",\n cd_ttl=\"Tangent force distribution\",\n out_figs=figs,\n out_figaxs=figaxs,\n save_path=save_path,\n run_name=run_name,\n figname=\"wing monitor\",\n );\n\n# Generate monitor of state variables\nmonitor_states = uns.generate_monitor_statevariables(; save_path=save_path,\n run_name=run_name,\n out_figs=figs,\n out_figaxs=figaxs,\n nsteps_savefig=10)\n\nmonitors = uns.concatenate(monitor_wing, monitor_states)\n\n\n# ------------- 5) RUN SIMULATION ----------------------------------------------\nprintln(\"Running simulation...\")\n\nuns.run_simulation(simulation, nsteps;\n # ----- SIMULATION OPTIONS -------------\n Vinf=Vinf,\n rho=rho,\n # ----- SOLVERS OPTIONS ----------------\n p_per_step=p_per_step,\n max_particles=max_particles,\n sigma_vlm_solver=sigma_vlm_solver,\n sigma_vlm_surf=sigma_vlm_surf,\n sigma_rotor_surf=sigma_vlm_surf,\n sigma_vpm_overwrite=sigma_vpm_overwrite,\n vlm_rlx=vlm_rlx,\n shed_starting=shed_starting,\n extra_runtime_function=monitors,\n # ----- OUTPUT OPTIONS ------------------\n save_path=save_path,\n run_name=run_name,\n );\n\n\n\n\n# ----------------- 6) VISUALIZATION -------------------------------------------\nif paraview\n println(\"Calling Paraview...\")\n\n # Files to open in Paraview\n files = joinpath(save_path, run_name*\"_Wing_vlm...vtk\")\n files *= \";\"*run_name*\"_pfield...xmf;\"\n\n # Call Paraview\n run(`paraview --data=$(files)`)\n\nend\n\n","category":"page"},{"location":"examples/tetheredwing/","page":"Tethered Wing","title":"Tethered Wing","text":"\n Run time: ~20 minutes on a Dell Precision 7760 laptop.\n
\n Reduce resolution (n and steps) to speed up simulation without loss of accuracy.\n
\n

","category":"page"},{"location":"examples/tetheredwing/","page":"Tethered Wing","title":"Tethered Wing","text":"As the simulation runs, you will see the monitor shown below plotting the state variables of the vehicle. The components of both velocity and position follow a sinusoidal function, which is consistent with the circular path, while the angular velocity is constant.","category":"page"},{"location":"examples/tetheredwing/","page":"Tethered Wing","title":"Tethered Wing","text":"
\n \"Pic\n
\n
","category":"page"},{"location":"examples/tetheredwing/","page":"Tethered Wing","title":"Tethered Wing","text":"The force monitor (shown below) plots the force components that are normal and tangential to the plane of rotation. Notice that the tangential force is negative, which is equivalent to having a negative drag, meaning that the vehicle is actually being propelled by the crosswind. Also notice that the forces are perturbed every time it completes a revolution. This is due to encountering the starting point of the wake that is slowly traveling downstream. It takes a couple revolutions for the forces to converge once the wake has been fully deployed.","category":"page"},{"location":"examples/tetheredwing/","page":"Tethered Wing","title":"Tethered Wing","text":"(red = beginning,\nblue = end)","category":"page"},{"location":"examples/tetheredwing/","page":"Tethered Wing","title":"Tethered Wing","text":"
\n \"Pic\n
","category":"page"},{"location":"examples/tetheredwing/","page":"Tethered Wing","title":"Tethered Wing","text":"info: Disable monitors to speed up simulation\nFor unknown reasons, the simulation oftentimes halts in between time steps while plotting the monitors. This slows down the overall simulation time, sometimes taking up to 2x longer. If you are not particularly interested in the plots of the monitors, you can disable the plots passing the keyword disp_plot=false to each monitor generator.","category":"page"},{"location":"examples/tetheredwing/","page":"Tethered Wing","title":"Tethered Wing","text":"info: ParaView visualization\nThe .pvsm file visualizing the simulation as shown at the top of this page is available here: LINK (right click → save as...).To open in ParaView: File → Load State → (select .pvsm file) then select \"Search files under specified directory\" and point it to the folder where the simulation was saved.","category":"page"},{"location":"examples/vahana-run/#vahanarun","page":"Run Simulation","title":"Run Simulation","text":"","category":"section"},{"location":"examples/vahana-run/","page":"Run Simulation","title":"Run Simulation","text":"A mid fidelity resolution makes the computational cost tractable and possible to be run the full maneuver (30 seconds of real time) overnight on a laptop computer. This is a video of the full maneuver in mid fidelity:","category":"page"},{"location":"examples/vahana-run/","page":"Run Simulation","title":"Run Simulation","text":"
\n \n
","category":"page"},{"location":"examples/vahana-run/","page":"Run Simulation","title":"Run Simulation","text":"With a finer temporal and spatial resolution, it becomes impractical to resolve the entire maneuver, and instead we recommend simulating one fragment of the maneuver at a time. For instance, here is a high-fidelity simulation of the transition from hover to cruise:","category":"page"},{"location":"examples/vahana-run/","page":"Run Simulation","title":"Run Simulation","text":"
\n \n
","category":"page"},{"location":"examples/vahana-run/","page":"Run Simulation","title":"Run Simulation","text":"As a reference, here are the parameters that we have used for the mid and high fidelity simulations:","category":"page"},{"location":"examples/vahana-run/","page":"Run Simulation","title":"Run Simulation","text":"Parameter Mid fidelity High fidelity Description\nn_factor 1 4 Factor that controls the level of discretization of wings and blade surfaces\nnsteps 4*5400 8*5400 Time steps for the entire maneuver\nt_start 0 0.20*ttot (s) start simulation at this point in time\nt_quit ttot 0.30*ttot (s) end imulation at this point in time\nlambda_vpm 2.125 1.5*2.125 VPM core overlap\nvlm_vortexsheet false true Whether to spread the wing surface vorticity as a vortex sheet\nvpm_integration vpm.euler vpm.rungekutta3 VPM time integration scheme","category":"page"},{"location":"examples/vahana-run/","page":"Run Simulation","title":"Run Simulation","text":"
","category":"page"},{"location":"examples/vahana-run/","page":"Run Simulation","title":"Run Simulation","text":"Along the way, in this simulation we exemplify the following advanced features:","category":"page"},{"location":"examples/vahana-run/","page":"Run Simulation","title":"Run Simulation","text":"Defining a variable pitch for rotors between hover and cruise\nUsing the actuator surface model for wing surfaces\nDefining a wake treatment that speeds up the simulation by removing particles that can be neglected","category":"page"},{"location":"examples/vahana-run/","page":"Run Simulation","title":"Run Simulation","text":"
","category":"page"},{"location":"examples/vahana-run/","page":"Run Simulation","title":"Run Simulation","text":"#=##############################################################################\n# DESCRIPTION\n Simulation of eVTOL transition maneuver of a tandem tilt-wing multirotor\n aircraft. The aircraft configuration resembles the Vahana eVTOL aircraft\n but with tilt, stacked, and variable-pitch rotors.\n\n# AUTHORSHIP\n * Author : Eduardo J. Alvarez (edoalvarez.com)\n * Email : Edo.AlvarezR@gmail.com\n * Created : Feb 2021\n * Last updated : Feb 2021\n * License : MIT\n=###############################################################################\n\n\n\nimport FLOWUnsteady as uns\nimport FLOWUnsteady: vlm, vpm, gt, Im\n\ninclude(joinpath(uns.examples_path, \"vahana\", \"vahana_vehicle.jl\"))\ninclude(joinpath(uns.examples_path, \"vahana\", \"vahana_maneuver.jl\"))\ninclude(joinpath(uns.examples_path, \"vahana\", \"vahana_monitor.jl\"))\n\nrun_name = \"vahana\" # Name of this simulation\nsave_path = \"vahana-example\" # Where to save this simulation\nparaview = true # Whether to visualize with Paraview\n\n# ----------------- GEOMETRY PARAMETERS ----------------------------------------\nn_factor = 1 # Discretization factor\nadd_wings = true # Whether to include wings\nadd_rotors = true # Whether to include rotors\n\n# Reference lengths\nR = 0.75 # (m) reference blade radius\nb = 5.86 # (m) reference wing span\nchord = b/7.4 # (m) reference wing chord\nthickness = 0.04*chord # (m) reference wing thickness\n\n# ----------------- SIMULATION PARAMETERS --------------------------------------\n# Maneuver settings\nVcruise = 15.0 # (m/s) cruise speed (reference)\nRPMh_w = 600.0 # RPM of main-wing rotors in hover (reference)\nttot = 30.0 # (s) total time to perform maneuver\n\nuse_variable_pitch = true # Whether to use variable pitch in cruise\n\n# Freestream\nVinf(X,t) = 1e-5*[1, 0, -1] # (m/s) freestream velocity (if 0 the solvers can become unstable)\nrho = 1.225 # (kg/m^3) air density\nmu = 1.81e-5 # (kg/ms) air dynamic viscosity\n\n# NOTE: Use these parameters to start and end the simulation at any arbitrary\n# point along the eVTOL maneuver (tstart=0 and tquit=ttot will simulate\n# the entire maneuver, tstart=0.20*ttot will start it at the beginning of\n# the hover->cruise transition)\ntstart = 0.00*ttot # (s) start simulation at this point in time\ntquit = 1.00*ttot # (s) end simulation at this point in time\n\nstart_kinmaneuver = true # If true, it starts the maneuver with the\n # velocity and angles of tstart.\n # If false, starts with velocity=0\n # and angles as initiated by the geometry\n# ----------------- SOLVER PARAMETERS ------------------------------------------\n\n# Aerodynamic solver\nVehicleType = uns.UVLMVehicle # Unsteady solver\n# VehicleType = uns.QVLMVehicle # Quasi-steady solver\n\n# Time parameters\nnsteps = 4*5400 # Time steps for entire maneuver\ndt = ttot/nsteps # (s) time step\n\n# VPM particle shedding\np_per_step = 5 # Sheds per time step\nshed_starting = false # Whether to shed starting vortex\nshed_unsteady = true # Whether to shed vorticity from unsteady loading\nunsteady_shedcrit = 0.001 # Shed unsteady loading whenever circulation\n # fluctuates by more than this ratio\n\n# Regularization of embedded vorticity\nsigma_vlm_surf = b/400 # VLM-on-VPM smoothing radius\nsigma_rotor_surf= R/20 # Rotor-on-VPM smoothing radius\nlambda_vpm = 2.125 # VPM core overlap\n # VPM smoothing radius\nsigma_vpm_overwrite = lambda_vpm * (2*pi*RPMh_w/60*R + Vcruise)*dt / p_per_step\nsigmafactor_vpmonvlm = 1 # Shrink particles by this factor when\n # calculating VPM-on-VLM/Rotor induced velocities\n\n# Rotor solver\nvlm_rlx = 0.2 # VLM relaxation <-- this also applied to rotors\nhubtiploss_correction = vlm.hubtiploss_correction_prandtl # Hub and tip correction\n\n# Wing solver: actuator surface model (ASM)\nvlm_vortexsheet = false # Whether to spread the wing surface vorticity as a vortex sheet (activates ASM)\nvlm_vortexsheet_overlap = 2.125 # Overlap of the particles that make the vortex sheet\nvlm_vortexsheet_distribution= uns.g_pressure# Distribution of the vortex sheet\n# vlm_vortexsheet_sigma_tbv = thickness*chord / 100 # Size of particles in trailing bound vortices\nvlm_vortexsheet_sigma_tbv = sigma_vpm_overwrite\n # How many particles to preallocate for the vortex sheet\nvlm_vortexsheet_maxstaticparticle = vlm_vortexsheet==false ? nothing : 6000000\n\n# Wing solver: force calculation\nKJforce_type = \"regular\" # KJ force evaluated at middle of bound vortices_vortexsheet also true)\ninclude_trailingboundvortex = false # Include trailing bound vortices in force calculations\n\ninclude_unsteadyforce = true # Include unsteady force\nadd_unsteadyforce = false # Whether to add the unsteady force to Ftot or to simply output it\n\ninclude_parasiticdrag = true # Include parasitic-drag force\nadd_skinfriction = true # If false, the parasitic drag is purely parasitic, meaning no skin friction\ncalc_cd_from_cl = false # Whether to calculate cd from cl or effective AOA\nwing_polar_file = \"xf-n0012-il-500000-n5.csv\" # Airfoil polar for parasitic drag\n\n\n# VPM solver\n# vpm_integration = vpm.rungekutta3 # VPM temporal integration scheme\nvpm_integration = vpm.euler\n\nvpm_viscous = vpm.Inviscid() # VPM viscous diffusion scheme\n# vpm_viscous = vpm.CoreSpreading(-1, -1, vpm.zeta_fmm; beta=100.0, itmax=20, tol=1e-1)\n\n# vpm_SFS = vpm.SFS_none # VPM LES subfilter-scale model\nvpm_SFS = vpm.DynamicSFS(vpm.Estr_fmm, vpm.pseudo3level_positive;\n alpha=0.999, maxC=1.0,\n clippings=[vpm.clipping_backscatter],\n controls=[vpm.control_directional, vpm.control_magnitude])\n\nif VehicleType == uns.QVLMVehicle\n # Mute warnings regarding potential colinear vortex filaments. This is\n # needed since the quasi-steady solver will probe induced velocities at the\n # lifting line of the blade\n uns.vlm.VLMSolver._mute_warning(true)\nend\n\n\n\n\n# ----------------- 1) VEHICLE DEFINITION --------------------------------------\nvehicle = generate_vahana_vehicle(; xfoil = false,\n n_factor = n_factor,\n add_wings = add_wings,\n add_rotors = add_rotors,\n VehicleType = VehicleType,\n run_name = \"vahana\"\n )\n\n\n\n# ------------- 2) MANEUVER DEFINITION -----------------------------------------\nmaneuver = generate_maneuver_vahana(; add_rotors=add_rotors)\n\n# Plot maneuver before running the simulation\nuns.plot_maneuver(maneuver)\n\n\n\n# ------------- 3) SIMULATION DEFINITION ---------------------------------------\n# Reference parameters\nVref = Vcruise # Reference velocity to scale maneuver by\nRPMref = RPMh_w # Reference RPM to scale maneuver by\n\n# Initial conditions\nt0 = tstart/ttot*start_kinmaneuver # Time at start of simulation\nVinit = Vref*maneuver.Vvehicle(t0) # Initial vehicle velocity\nWinit = pi/180 * (maneuver.anglevehicle(t0+1e-12)- maneuver.anglevehicle(t0))/(ttot*1e-12) # Initial angular velocity\n\n# Define simulation\nsimulation = uns.Simulation(vehicle, maneuver, Vref, RPMref, ttot;\n Vinit=Vinit, Winit=Winit, t=tstart);\n\n# Maximum number of particles (for pre-allocating memory)\nmax_particles = ceil(Int, (nsteps+2)*(2*vlm.get_m(vehicle.wake_system)*(p_per_step+1) + p_per_step) )\nmax_particles = tquit != Inf ? ceil(Int, max_particles*(tquit-tstart)/ttot) : max_particles\nmax_particles = min(10000000, max_particles)\nmax_particles = VehicleType==uns.QVLMVehicle ? 10000 : max_particles\n\n\n\n\n\n\n# ------------- 4) MONITORS DEFINITIONS ----------------------------------------\n\n# ------------- Routine for force calculation on wings\nforces = []\n\n# Calculate Kutta-Joukowski force\nkuttajoukowski = uns.generate_aerodynamicforce_kuttajoukowski(KJforce_type,\n sigma_vlm_surf, sigma_rotor_surf,\n vlm_vortexsheet, vlm_vortexsheet_overlap,\n vlm_vortexsheet_distribution,\n vlm_vortexsheet_sigma_tbv;\n vehicle=vehicle)\npush!(forces, kuttajoukowski)\n\n\n# Force due to unsteady circulation\nif include_unsteadyforce\n unsteady(args...; optargs...) = uns.calc_aerodynamicforce_unsteady(args...; add_to_Ftot=add_unsteadyforce, optargs...)\n\n push!(forces, unsteady)\nend\n\n# Parasatic-drag force (form drag and skin friction)\nif include_parasiticdrag\n parasiticdrag = uns.generate_aerodynamicforce_parasiticdrag(wing_polar_file;\n calc_cd_from_cl=calc_cd_from_cl,\n add_skinfriction=add_skinfriction)\n push!(forces, parasiticdrag)\nend\n\n\n# Stitch all the forces into one function\nfunction calc_aerodynamicforce_fun(vlm_system, args...; per_unit_span=false, optargs...)\n\n # Delete any previous force field\n fieldname = per_unit_span ? \"ftot\" : \"Ftot\"\n if fieldname in keys(vlm_system.sol)\n pop!(vlm_system.sol, fieldname)\n end\n\n Ftot = nothing\n\n for force in forces\n Ftot = force(vlm_system, args...; per_unit_span=per_unit_span, optargs...)\n end\n\n return Ftot\nend\n\n\n# Extra options for generation of wing monitors\nwingmonitor_optargs = (\n include_trailingboundvortex=include_trailingboundvortex,\n calc_aerodynamicforce_fun=calc_aerodynamicforce_fun\n )\n\n# ------------- Create monitors\nmonitors = generate_monitor_vahana(vehicle, rho, RPMref, nsteps,\n save_path, Vinf;\n add_wings=add_wings,\n wingmonitor_optargs=wingmonitor_optargs)\n\n\n\n\n# ------------- INTERMEDIATE STEP BEFORE RUN ------------------------------------\n\n# ------------- Define function for variable pitch\n\n# Original blade twists\norg_theta = [\n [\n deepcopy(rotor._theta) for (ri, rotor) in enumerate(rotors)\n ]\n for (si, rotors) in enumerate(simulation.vehicle.rotor_systems)\n ]\n\n# End time of each stage\n# Stage 1: [0, t1] -> Take off\n# Stage 2: [t1, t2] -> Transition\n# Stage 3: [t2, t3] -> Cruise\n# Stage 4: [t3, t4] -> Transition\n# Stage 5: [t4, 1] -> Landing\nt1, t2, t3, t4 = 0.2, 0.3, 0.5, 0.6\n\n# Pitch at each stage\npitch_takeoff = 0\npitch_cruise = 35\npitch_landing = 0\n\n# Function for smoothly transitioning pitch between stages\ncollective(tstr) = tstr < t1 ? pitch_takeoff :\n tstr < t2 ? pitch_takeoff + (pitch_cruise-pitch_takeoff)*(tstr-t1)/(t2-t1) :\n tstr < t3 ? pitch_cruise :\n tstr < t4 ? pitch_cruise + (pitch_landing-pitch_cruise)*(tstr-t3)/(t4-t3) :\n pitch_landing\n\nfunction variable_pitch(sim, args...; optargs...)\n\n if !use_variable_pitch\n return false\n end\n\n tstr = sim.t/sim.ttot # Non-dimensional time\n\n for (si, rotors) in enumerate(sim.vehicle.rotor_systems)\n for (ri, rotor) in enumerate(rotors)\n\n if si==1 # Main wing rotors\n\n # Restore original twist distribution\n rotor._theta .= org_theta[si][ri]\n\n # Add collective pitch\n rotor._theta .+= 1.0 * (-1)^(rotor.CW)*collective(tstr)\n\n elseif si==2 # Stacked upper rotors\n nothing\n\n elseif si==3 # Stacked lower rotors\n nothing\n\n elseif si==4 # Tandem-wing rotors\n rotor._theta .= org_theta[si][ri]\n rotor._theta .+= 1.25 * (-1)^(rotor.CW)*collective(tstr)\n\n end\n\n end\n end\n\n return false\nend\n\n\n# ------------- Define wake treatment\n\n# Remove by particle strength\n# (remove particles neglibly faint, remove blown up)\nrmv_strngth = 2*2/p_per_step * dt/(30/(4*5400)) # Reference strength\nminmaxGamma = rmv_strngth*[0.0001, 0.05] # Strength bounds (removes particles outside of these bounds)\nwake_treatment_strength = uns.remove_particles_strength( minmaxGamma[1]^2, minmaxGamma[2]^2; every_nsteps=1)\n\n# Remove by particle size\n# (remove particle nearly singular, remove negligibly smeared)\nminmaxsigma = sigma_vpm_overwrite*[0.1, 5] # Size bounds (removes particles outside of these bounds)\nwake_treatment_sigma = uns.remove_particles_sigma( minmaxsigma[1], minmaxsigma[2]; every_nsteps=1)\n\n# Remove by distance\n# (remove particles outside of the computational domain of interest, i.e., far from vehicle)\nwake_treatment_sphere = uns.remove_particles_sphere((1.25*b)^2, 1; Xoff=[4.0, 0, 0])\n\n# Concatenate all wake treatments\nwake_treatment = uns.concatenate(wake_treatment_sphere, wake_treatment_strength, wake_treatment_sigma)\n\n\n\n# ------------- Define runtime function: monitors + variable pitch + wake treatment\nruntime_function = uns.concatenate(wake_treatment, monitors, variable_pitch)\n\n\n\n\n\n\n# ------------- 5) RUN SIMULATION ----------------------------------------------\nprintln(\"Running simulation...\")\n\n\n# Run simulation\nuns.run_simulation(simulation, nsteps;\n # ----- SIMULATION OPTIONS -------------\n Vinf=Vinf,\n rho=rho, mu=mu, tquit=tquit,\n # ----- SOLVERS OPTIONS ----------------\n p_per_step=p_per_step,\n max_particles=max_particles,\n max_static_particles=vlm_vortexsheet_maxstaticparticle,\n vpm_integration=vpm_integration,\n vpm_viscous=vpm_viscous,\n vpm_SFS=vpm_SFS,\n sigma_vlm_surf=sigma_vlm_surf,\n sigma_rotor_surf=sigma_rotor_surf,\n sigma_vpm_overwrite=sigma_vpm_overwrite,\n sigmafactor_vpmonvlm=sigmafactor_vpmonvlm,\n vlm_vortexsheet=vlm_vortexsheet,\n vlm_vortexsheet_overlap=vlm_vortexsheet_overlap,\n vlm_vortexsheet_distribution=vlm_vortexsheet_distribution,\n vlm_vortexsheet_sigma_tbv=vlm_vortexsheet_sigma_tbv,\n vlm_rlx=vlm_rlx,\n hubtiploss_correction=hubtiploss_correction,\n shed_starting=shed_starting,\n shed_unsteady=shed_unsteady,\n unsteady_shedcrit=unsteady_shedcrit,\n extra_runtime_function=runtime_function,\n # ----- OUTPUT OPTIONS ------------------\n save_path=save_path,\n run_name=run_name,\n save_wopwopin=true, # <--- Generates input files for PSU-WOPWOP noise analysis\n );","category":"page"},{"location":"api/flowunsteady-maneuver/#(2)-Maneuver-Definition","page":"(2) Maneuver Definition","title":"(2) Maneuver Definition","text":"","category":"section"},{"location":"api/flowunsteady-maneuver/","page":"(2) Maneuver Definition","title":"(2) Maneuver Definition","text":"FLOWUnsteady.KinematicManeuver\nFLOWUnsteady.DynamicManeuver\n\nFLOWUnsteady.plot_maneuver\nFLOWUnsteady.visualize_kinematics","category":"page"},{"location":"api/flowunsteady-maneuver/#FLOWUnsteady.KinematicManeuver","page":"(2) Maneuver Definition","title":"FLOWUnsteady.KinematicManeuver","text":"KinematicManeuver{N, M}(angle, RPM, Vvehicle, anglevehicle)\n\nA vehicle maneuver that prescribes the kinematics of the vehicle through the functions Vvehicle and anglevehicle. Control inputs to each tilting and rotor systems are given by the collection of functions angle and RPM, respectively.\n\nARGUMENTS\n\nangle::NTuple{N, Function} where angle[i](t) returns the angles [Ax, Ay, Az] (in degrees) of the i-th tilting system at time t (t is nondimensionalized by the total time of the maneuver, from 0 to 1, beginning to end).\nRPM::NTuple{M, Function} where RPM[i](t) returns the normalized RPM of the i-th rotor system at time t. These RPM values are normalized by an arbitrary RPM value (usually RPM in hover or cruise).\nVvehicle::Function where Vvehicle(t) returns the normalized vehicle velocity [Vx, Vy, Vz] at the normalized time t. The velocity is normalized by a reference velocity (typically, cruise velocity).\nanglevehicle::Function where anglevehicle(t) returns the angles [Ax, Ay, Az] (in degrees) of the vehicle relative to the global coordinate system at the normalized time t.\n\n\n\n\n\n","category":"type"},{"location":"api/flowunsteady-maneuver/#FLOWUnsteady.DynamicManeuver","page":"(2) Maneuver Definition","title":"FLOWUnsteady.DynamicManeuver","text":"DynamicManeuver{N, M}(angle, RPM)\n\nA vehicle maneuver that automatically couples the kinematics of the vehicle with the forces and moments, resulting in a fully dynamic simulation. Control inputs to each tilting and rotor systems are given by the collection of functions angle and RPM, respectively.\n\nNOTE: This methods has not been implemented yet, but it may be developed in future versions of FLOWunsteady.\n\n\n\n\n\n","category":"type"},{"location":"api/flowunsteady-maneuver/#FLOWUnsteady.plot_maneuver","page":"(2) Maneuver Definition","title":"FLOWUnsteady.plot_maneuver","text":"plot_maneuver(maneuver::KinematicManeuver; ti::Real=0, tf::Real=1,\n vis_nsteps=300, figname=\"maneuver\", tstages=[])\n\nPlots the kinematics and controls of a KinematicManeuver.\n\n(Image: image) (Image: image)\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-maneuver/#FLOWUnsteady.visualize_kinematics","page":"(2) Maneuver Definition","title":"FLOWUnsteady.visualize_kinematics","text":"visualize_kinematics(sim::Simulation, nsteps::Int, save_path::String)\n\nSteps the vehicle through the prescribed kinematics, outputting VTK files of the vehicle at every time step. Use this to visualize and debug a maneuver.\n\nnsteps is the number of time steps in which to perform the maneuver. save_path is the path where to save the VTK files.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-postprocessing-misc/#miscellaneous","page":"Miscellaneous","title":"Miscellaneous","text":"","category":"section"},{"location":"api/flowunsteady-postprocessing-misc/","page":"Miscellaneous","title":"Miscellaneous","text":" FLOWUnsteady.postprocess_statistics\n FLOWUnsteady.postprocess_bladeloading","category":"page"},{"location":"api/flowunsteady-postprocessing-misc/#FLOWUnsteady.postprocess_statistics","page":"Miscellaneous","title":"FLOWUnsteady.postprocess_statistics","text":"postprocess_statistics(read_path, save_path, nums;\n # PROCESSING OPTIONS\n idens = [\"\"], # Use this to agglomerate multiple simulations\n to_exclude = [], # Exclude file names containing these words\n cyl_axial_dir = nothing, # Calculate cylindrical statistics if given an axial axis (vector)\n # OUTPUT OPTIONS\n prompt=true, debug=false,\n verbose=true, v_lvl=0)\n\nCalculate statistics of the simulation VTK outputs over a given range of time steps given by nums. Use this to calculate, for instance, the mean load distribution and fluctuations on wings and rotors.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-postprocessing-misc/#FLOWUnsteady.postprocess_bladeloading","page":"Miscellaneous","title":"FLOWUnsteady.postprocess_bladeloading","text":"postprocess_bladeloading(read_path;\n O = zeros(3), # Rotor center\n rotor_axis = [-1, 0, 0], # Rotor centerline axis\n Ftot_axis = nothing, # Use a different centerline axis for forces if given\n filename = \"singlerotor_Rotor_Blade1_vlm-statistics.vtk\", # File name\n fieldsuff = \"-mean\" # Suffix of fields \"Gamma\" and \"Ftot\", if any\n )\n\nRead a blade VTK file filename under directory read_path and returns the circulation and force components of the load distribution along the blade.\n\nReturn: rs, Gamma, Np, Tp, Rp, Zhat, Rhat, That, Ftot\n\n\n\n\n\n","category":"function"}] +[{"location":"api/flowunsteady-vehicle-asm/#Actuator-surface-model","page":"Actuator surface model","title":"Actuator surface model","text":"","category":"section"},{"location":"api/flowunsteady-vehicle-asm/","page":"Actuator surface model","title":"Actuator surface model","text":"FLOWUnsteady.g_uniform\nFLOWUnsteady.g_linear\nFLOWUnsteady.g_piecewiselinear\nFLOWUnsteady.g_pressure","category":"page"},{"location":"api/flowunsteady-vehicle-asm/#FLOWUnsteady.g_uniform","page":"Actuator surface model","title":"FLOWUnsteady.g_uniform","text":"Uniform vortex-sheet distribution for actuator surface model. See Alvarez' dissertation, Sec. 6.3.2.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-vehicle-asm/#FLOWUnsteady.g_linear","page":"Actuator surface model","title":"FLOWUnsteady.g_linear","text":"Linear vortex-sheet distribution for actuator surface model. See Alvarez' dissertation, Sec. 6.3.2.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-vehicle-asm/#FLOWUnsteady.g_piecewiselinear","page":"Actuator surface model","title":"FLOWUnsteady.g_piecewiselinear","text":"Alias for FLOWUnsteady.g_linear.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-vehicle-asm/#FLOWUnsteady.g_pressure","page":"Actuator surface model","title":"FLOWUnsteady.g_pressure","text":"Pressure-like vortex-sheet distribution for actuator surface model. See Alvarez' dissertation, Sec. 6.3.2.\n\n\n\n\n\n","category":"function"},{"location":"api/flowvpm-utils/#Utilities","page":"Utilities","title":"Utilities","text":"","category":"section"},{"location":"api/flowvpm-utils/","page":"Utilities","title":"Utilities","text":"FLOWUnsteady.vpm.run_vpm!\nFLOWUnsteady.vpm.save\nFLOWUnsteady.vpm.read\nFLOWUnsteady.vpm.save_settings\nFLOWUnsteady.vpm.read_settings","category":"page"},{"location":"api/flowvpm-utils/#FLOWVPM.run_vpm!","page":"Utilities","title":"FLOWVPM.run_vpm!","text":"run_vpm!(pfield, dt, nsteps; runtime_function=nothing, save_path=nothing, run_name=\"pfield\", nsteps_save=1, verbose=true, prompt=true)\n\nSolves nsteps of the particle field with a time step of dt.\n\nOptional Arguments\n\nruntime_function::Function : Give it a function of the form myfun(pfield, t, dt). On each time step it will call this function. Use this for adding particles, deleting particles, etc.\nstatic_particles_function::Function : Give it a function of the form myfun(pfield, t, dt) to add static particles representing solid boundaries to the solver. This function is called at every time step right before solving the governing equations, and any new particles added by this function are immediately removed.\nsave_path::String : Give it a string for saving VTKs of the particle field. Creates the given path.\nrun_name::String : Name of output files.\nnsteps_save::Int64 : Saves vtks every this many time steps.\nprompt::Bool : If save_path already exist, it will prompt the user before overwritting the folder if true; it will directly overwrite it if false.\nverbose::Bool : Prints progress of the run to the terminal.\nverbose_nsteps::Bool: Number of time steps between verbose.\n\n\n\n\n\n","category":"function"},{"location":"api/flowvpm-utils/#FLOWVPM.save","page":"Utilities","title":"FLOWVPM.save","text":"save(pfield, file_name; path=\"\")\n\nSaves the particle field in HDF5 format and a XDMF file especifying its the attributes. This format can be opened in Paraview for post-processing and visualization.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-vehicle-types/#vehicle_types","page":"Vehicle types","title":"Vehicle types","text":"","category":"section"},{"location":"api/flowunsteady-vehicle-types/","page":"Vehicle types","title":"Vehicle types","text":"FLOWUnsteady.UVLMVehicle\nFLOWUnsteady.VLMVehicle\nFLOWUnsteady.QVLMVehicle","category":"page"},{"location":"api/flowunsteady-vehicle-types/#FLOWUnsteady.UVLMVehicle","page":"Vehicle types","title":"FLOWUnsteady.UVLMVehicle","text":"UVLMVehicle{N, M, R}(system; tilting_systems, rotors_systems,\n vlm_system, wake_system, grids)\n\nType handling all geometries and subsystems that define a vehicle made out of FLOWVLM components (Wing, WingSystem, Rotor).\n\nARGUMENTS\n\nsystem::FLOWVLM.WingSystem: System of all FLOWVLM objects. This system is considered as the entire vehicle. Not all components in this system will be solved, but they will all be rotated and translated according to the maneuver.\n\nOPTIONAL ARGUMENTS\n\ntilting_systems::NTuple{N, FLOWVLM.WingSystem}: Tuple of all FLOWVLM tilting objects, where tilting_systems[i] contains the i-th FLOWVLM system of lifting surfaces and rotors that tilt together.\nrotors_systems::NTuple{M, Array{vlm.Rotor}}: Tuple of groups of Rotors that share a common RPM.\nvlm_system::FLOWVLM.WingSystem: System of all FLOWVLM objects to be solved through the VLM solver.\nwake_system::FLOWVLM.WingSystem: System of all FLOWVLM objects that will shed a VPM wake.\ngrids::Array{gt.GridTypes}: Array of grids that will be translated and rotated along with system.\n\nState variables\n\nV::Vector : Current vehicle velocity\nW::Vector : Current vehicle angular velocity\nprev_data::Array{Any} : Information about previous step\ngrid_O::Vector{Vector} : Origin of every grid\n\n\n\n\n\n","category":"type"},{"location":"api/flowunsteady-vehicle-types/#FLOWUnsteady.VLMVehicle","page":"Vehicle types","title":"FLOWUnsteady.VLMVehicle","text":"Alias for FLOWUnsteady.UVLMVehicle\n\n\n\n\n\n","category":"type"},{"location":"api/flowunsteady-vehicle-types/#FLOWUnsteady.QVLMVehicle","page":"Vehicle types","title":"FLOWUnsteady.QVLMVehicle","text":"QVLMVehicle{N, M, R}(system; optargs...)\n\nSame than FLOWUnsteady.UVLMVehicle but replacing the VPM wake with a semi-infinite rigid VLM wake, making the simulation quasi-ssteady.\n\nNOTE: For the solver to work correctly, all components in wake_system (if any) need to be also components of vlm_system.\n\nNOTE 2: It is recommended that wake_system doesn't include any Rotor object. Otherwise, blades will generate a wake going straight out of every blade trailing edge pointing oposite to the direction of rotation instead of generating a streamtube.\n\n\n\n\n\n","category":"type"},{"location":"api/flowunsteady-postprocessing-noise/#Aeroacoustic-Noise","page":"Aeroacoustic Noise","title":"Aeroacoustic Noise","text":"","category":"section"},{"location":"api/flowunsteady-postprocessing-noise/","page":"Aeroacoustic Noise","title":"Aeroacoustic Noise","text":"FLOWUnsteady.run_noise_wopwop\nFLOWUnsteady.run_noise_bpm","category":"page"},{"location":"api/flowunsteady-postprocessing-noise/#FLOWUnsteady.run_noise_wopwop","page":"Aeroacoustic Noise","title":"FLOWUnsteady.run_noise_wopwop","text":"Given the path of a FLOWUnsteady simulation read_path, it runs the noise analysis on the rotors of the simulation. It uses PSU-WOPWOP to calculate the tonal noise from thickness and loading sources on the geometry and aerodynamic loading.\n\nrun_noise_wopwop(\n read_path::String, # Path from where to read aerodynamic solution (FLOWUnsteady simulation)\n run_name, # Run name (prefix of rotor files to read)\n RPM::Real, # Reference RPM to convert `nrevs` to simulation time\n rho::Real, speedofsound::Real, # Air density and speed of sound\n rotorsystems, # `rotorsystems[i][j]` is the number of blades of the j-th rotor in the i-th system\n ww_nrevs, # Run PSU-WOPWOP for this many revolutions\n ww_nsteps_per_rev, # Number of steps per revolution to use in WW\n save_path::String, # Where to save PSU-WOPWOP results\n wopwopbin; # Path to PSU-WOPWOP binary\n nrevs = nothing, # Number of revolutions to read (defaults to `ww_nrevs`)\n nsteps_per_rev = nothing, # Number of steps per revolution to read (default to `ww_nsteps_per_rev`)\n\n # ---------- OBSERVERS ---------------------------------------\n Vobserver = nothing, # (m/s) velocity of observer (vector)\n sph_R = 1.5*6.5, # (m) sphere radius\n sph_nR = 0, # Number of cells in radial direction\n sph_ntht = 24, sph_nphi = 24, # Number of cells in polar and azimuthal directions\n sph_thtmin = 5, sph_thtmax = 175, # (deg) Bounds of polar direction\n sph_phimax = 180, # (deg) maximum azimuthal angle (use 180 to make a hemisphere)\n sph_rotation= [0, 90, 0], # (degs) rotate the sphere by these angles\n sph_C = zeros(3), # (m) center of sphere\n microphoneX = nothing, # If given, replaces sphere with one observer at this position\n highpass = nothing, lowpass = nothing, # Low and high pass filters\n windowing = nothing, # Windowing method\n output_octaves = true, # Whether to output octave bands\n Noctave = 3, # Number of octave bands\n\n # ---------- SIMULATION OPTIONS -----------------------------\n periodic = true, # Whether rotor loading and translation in aerodynamic solution is periodic\n\n # ---------- INPUT OPTIONS ----------------------------------\n num_min = 0, # Start reading loading files from this number\n const_geometry = false, # Whether to run PSW on a constant geometry, obtained from num_min\n axisrot = \"automatic\", # Axis of rotation to use for constant geometry (defaults to [1,0,0])\n CW = true, # Clockwise or counter-clockwise rotation of constant geometry\n\n # ---------- OUTPUT OPTIONS ---------------------------------\n prompt = true, # Whether to prompt the user\n verbose = true, # Whether to verbose\n v_lvl = 0, # Indentation level when printing verbose\n debug_paraview = false, # Whether to visualize the grid of observers in Paraview before running\n debuglvl = 1, # PSU-WOPWOP debug level\n observerf_name = \"observergrid\",# .xyz file with observer grid\n case_name = \"runcase\", # Name of case to create and run\n)\n\nNOTE: This function will call the PSU-WOPWOP binary indicated through wopwopbin. This binary is not included with FLOWUnsteady and must be provided by the user. This method has been tested on PSU-WOPWOP v3.4.2.\n\nNOTE 2: Make sure that the simulation was run with nsteps_save=1, otherwise the time in PSU-WOPWOP will get messed up.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-postprocessing-noise/#FLOWUnsteady.run_noise_bpm","page":"Aeroacoustic Noise","title":"FLOWUnsteady.run_noise_bpm","text":"Calculates broadband rotor noise through the Brooks, Pope, and Marcolini method using the BPM.jl package.\n\nThis writes the results to a file in the same format than PSU-WOPWOP, which can be read afterwards with FLOWNoise.readwopwopoutput(). It writes three files: SPL (non-weighted), A-weighted SPL, and OASPL.\n\nThis method assumes steady conditions and that all rotors have the same RPM.\n\nfunction run_noise_bpm(\n rotors::Array{vlm.Rotor, 1}, # Rotors\n RPM::Real, # RPM of rotors\n Vinf::Function, # Freestream\n rho::Real, mu::Real, speedofsound::Real, # Air density, dynamic viscosity, and speed of sound\n save_path::String; # Where to save results\n\n # ---------- OBSERVERS --------------------------------------\n sph_R = 1.5*6.5, # (m) sphere radius\n sph_nR = 0, # Number of cells in radial direction\n sph_ntht = 24, sph_nphi = 24, # Number of cells in polar and azimuthal directions\n sph_thtmin = 5, sph_thtmax = 175, # (deg) Bounds of polar direction\n sph_phimax = 180, # (deg) maximum azimuthal angle (use 180 to make a hemisphere)\n sph_rotation= [0, 90, 0], # (degs) rotate the sphere by these angles\n sph_C = zeros(3), # (m) center of sphere\n microphoneX = nothing, # If given, replaces sphere with one observer at this position\n\n # ---------- BPM OPTIONS ------------------------------------\n noise_correction = 0.5, # Broadband calibration correction\n TE_thickness::Union{Float64, Array{Float64, 1}}=16.15, # Trailing edge thickness (in degrees)\n freq_bins = BPM.default_f, # Frequency bins\n db_offset = BPM.default_AdB, # dB offset of every frequency for A-weighting\n\n # ---------- OUTPUT OPTIONS ---------------------------------\n prompt = true, # Whether to prompt the user\n verbose = true, # Whether to verbose\n v_lvl = 0, # Indentation level when printing verbose\n)\n\n\n\n\n\n","category":"function"},{"location":"api/flowvpm-particle/#Particle-Field","page":"Particle Field","title":"Particle Field","text":"","category":"section"},{"location":"api/flowvpm-particle/","page":"Particle Field","title":"Particle Field","text":"FLOWUnsteady.vpm.Particle\nFLOWUnsteady.vpm.ParticleField\nFLOWUnsteady.vpm.ClassicVPM\nFLOWUnsteady.vpm.ReformulatedVPM\nFLOWUnsteady.vpm.add_particle\nFLOWUnsteady.vpm.get_particle\nFLOWUnsteady.vpm.remove_particle\nFLOWUnsteady.vpm.get_np\nFLOWUnsteady.vpm.iterate\nFLOWUnsteady.vpm.get_particleiterator","category":"page"},{"location":"api/flowvpm-particle/#FLOWVPM.Particle","page":"Particle Field","title":"FLOWVPM.Particle","text":"`Particle{T}`\n\nVortex particle data structure\n\nState variables\n\nX::Array{T, 1} : Position (3-elem array)\nGamma::Array{T, 1} : Vectorial circulation (3-elem array)\nsigma::Array{T, 1} : Smoothing radius (1-elem array)\nvol::Array{T, 1} : Volume (1-elem array)\ncirculation::Array{T, 1} : Scalar circulation (1-elem array)\n\nPublic calculations\n\nU::Array{T, 1} : Velocity at particle (3-elem array)\nJ::Array{T, 2} : Jacobian at particle J[i,j]=dUi/dxj (9-elem array)\n\n\n\n\n\n","category":"type"},{"location":"api/flowvpm-particle/#FLOWVPM.add_particle","page":"Particle Field","title":"FLOWVPM.add_particle","text":"add_particle(self::ParticleField, X, Gamma, sigma; vol=0, index=np)\n\nAdd a particle to the field.\n\n\n\n\n\nadd_particle(self::ParticleField, P::Particle)\n\nAdd a copy of Particle P to the field.\n\n\n\n\n\n","category":"function"},{"location":"api/flowvpm-particle/#FLOWVPM.get_particle","page":"Particle Field","title":"FLOWVPM.get_particle","text":"`get_particle(pfield::ParticleField, i)`\n\nReturns the i-th particle in the field.\n\n\n\n\n\n","category":"function"},{"location":"api/flowvpm-particle/#FLOWVPM.remove_particle","page":"Particle Field","title":"FLOWVPM.remove_particle","text":"remove_particle(pfield::ParticleField, i)\n\nRemove the i-th particle in the field. This is done by moving the last particle that entered the field into the memory slot of the target particle. To remove particles sequentally, you will need to go from the last particle back to the first one (see documentation of get_particleiterator for an example).\n\n\n\n\n\n","category":"function"},{"location":"api/flowvpm-particle/#FLOWVPM.get_np","page":"Particle Field","title":"FLOWVPM.get_np","text":"`get_np(pfield::ParticleField)`\n\nReturns current number of particles in the field.\n\n\n\n\n\n","category":"function"},{"location":"api/flowvpm-particle/#FLOWVPM.iterate","page":"Particle Field","title":"FLOWVPM.iterate","text":"Alias for get_particleiterator\n\n\n\n\n\n","category":"function"},{"location":"api/flowvpm-particle/#FLOWVPM.get_particleiterator","page":"Particle Field","title":"FLOWVPM.get_particleiterator","text":"`get_particleiterator(pfield::ParticleField; start_i=1, end_i=np)`\n\nReturn an iterator over particles that can be used as follows\n\njulia> # Initiate particle field\n pfield = FLOWVPM.ParticleField(10);\n\njulia> # Add particles\n for i in 1:4\n FLOWVPM.add_particle(pfield, (i*10^0, i*10^1, i*10^2), zeros(3), 1.0)\n end\n\njulia> # Iterate over particles\n for P in FLOWVPM.get_particleiterator(pfield)\n println(P.X)\n end\n[1.0, 10.0, 100.0]\n[2.0, 20.0, 200.0]\n[3.0, 30.0, 300.0]\n[4.0, 40.0, 400.0]\n\n\n\n\n\n","category":"function"},{"location":"theory/publications/#Publications","page":"Publications","title":"Publications","text":"","category":"section"},{"location":"theory/publications/","page":"Publications","title":"Publications","text":"The following is a compilation of studies that have used FLOWUnsteady","category":"page"},{"location":"theory/publications/","page":"Publications","title":"Publications","text":"Anderson, R., Ning, A., Xiang, R., Schie, S. P. C. van, Sperry, M., Sarojini, D., Kamensky, D., & Hwang, J. T., (2023) “Aerostructural Predictions Combining FEniCS and a Viscous Vortex Particle Method,” AIAA SCITECH Forum. [PDF]\nE. J. Alvarez (2022), \"Reformulated Vortex Particle Method and Meshless Large Eddy Simulation of Multirotor Aircraft,\" Doctoral Dissertation, Brigham Young University. [PDF]\nE. J. Alvarez & A. Ning (2022), \"Reviving the Vortex Particle Method: A Stable Formulation for Meshless Large Eddy Simulation,\" (in review). [PDF]\nE. J. Alvarez & A. Ning (2022), \"Meshless Large Eddy Simulation of Rotor-Wing Interactions Through the Reformulated Vortex Particle Method,\" (in review).\nJ. Mehr, E. J. Alvarez, & A. Ning (2022), \"Interactional Aerodynamics Analysis of a Multi-Rotor Energy Kite,\" (in review).\nE. J. Alvarez, J. Mehr, & A. Ning (2022), \"FLOWUnsteady: An Interactional Aerodynamics Solver for Multirotor Aircraft and Wind Energy,\" AIAA AVIATION Forum. [VIDEO] [PDF]\nR. M. Erhard & J. J. Alonso (2022), \"Comparison of Propeller Wake Models for Distributed Electric Propulsion and eVTOL Aircraft in Complex Flow Conditions,\" AIAA SciTech Forum. [PDF]\nE. J. Alvarez & A. Ning (2020), \"High-Fidelity Modeling of Multirotor Aerodynamic Interactions for Aircraft Design,\" AIAA Journal. [DOI] [PDF]\nJ. Mehr, E. J. Alvarez, & A. Ning (2020), \"Unsteady Aerodynamic Analysis of Wind Harvesting Aircraft,\" AIAA AVIATION Forum. [VIDEO] [PDF]\nE. J. Alvarez, A. Schenk, T. Critchfield, & A. Ning (2020), “Rotor-on-Rotor Aeroacoustic Interactions of Multirotor in Hover,” VFS 76th Forum. [PDF]\nE. J. Alvarez & A. Ning (2019), \"Modeling Multirotor Aerodynamic Interactions Through the Vortex Particle Method,\" AIAA AVIATION Forum. [PDF]\nE. J. Alvarez & A. Ning (2018). \"Development of a Vortex Particle Code for the Modeling of Wake Interaction in Distributed Propulsion,\" AIAA AVIATION Forum. [PDF]","category":"page"},{"location":"theory/publications/","page":"Publications","title":"Publications","text":"\"Vid","category":"page"},{"location":"installation/general/#installation","page":"Installation","title":"Installation Instructions","text":"","category":"section"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"FLOWUnsteady is developed in the Julia programming language, which is a modern, high-level, dynamic programming language for high-performance computing. For visualization and postprocessing, FLOWUnsteady uses ParaView, which is an open-source software for scientific and HPC visualization.","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"The following instructions walk you through how to install Julia, ParaView, and FLOWUnsteady.","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"info: Windows Users\nOn Windows please follow these instructions first to set up Windows Subsystem for Linux.","category":"page"},{"location":"installation/general/#Julia","page":"Installation","title":"Julia","text":"","category":"section"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"Download and install Julia: julialang.org (currently we are supporting up to Julia v1.10, so we recommend using v1.10.2 or v1.6.7 LTS )\nAdd Julia to user-level bin folder\nsudo ln -s /[user-specific-path/Julia-1.x.x]/bin/julia /usr/local/bin/julia\nReplace /[user-specific-path/Julia-1.x.x]/ with the path where Julia got installed. For instance, in MacOS the full path looks like this: /Applications/Julia-1.10.app/Contents/Resources/julia/bin/julia","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"If you were successfull, typing the following in the terminal will launch the Julia REPL:","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"julia","category":"page"},{"location":"installation/general/#paraview","page":"Installation","title":"ParaView","text":"","category":"section"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"Download and install ParaView: paraview.org\nAdd ParaView to user-level bin folder\nsudo ln -s /[user-specific-path/ParaView-5.x.x]/paraview /usr/local/bin/paraview\nReplace /[user-specific-path/ParaView-5.x.x]/ with the path where ParaView got installed. For instance, in MacOS the full path looks like this: /Applications/ParaView-5.12.0.app/Contents/MacOS/paraview","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"If you were successfull, typing the following in the terminal will launch the ParaView:","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"paraview","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"To test that ParaView is correctly installed, run one of the examples of the GeometricTools package as follows (copy/paste this in the Julia REPL):","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"# Install GeometricTools\nimport Pkg; Pkg.add(\"GeometricTools\")\n\nimport GeometricTools as gt\n\n# Load example\nexamplepath = joinpath(dirname(pathof(gt)), \"..\", \"examples\", \"example_simple.jl\")\ninclude(examplepath)\n\n# Run example: it will pull up paraview with a good-looking cube\nsimple_box2()","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"ParaView will then pull up with a rendering of a cube (click the Apply button under Properties to make it visible).","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"

\n \"Pic\n

","category":"page"},{"location":"installation/general/#pycall","page":"Installation","title":"PyCall","text":"","category":"section"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"One of the dependencies (AirfoilPrep.jl) is a wrapper of Python code that is written in Python v3.8+. For this reason, make sure that your Python version linked to PyCall is 3.8 or higher. You can do that as follows:","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"# Install PyCall\nimport Pkg; Pkg.add(\"PyCall\")\n\n# Point environment to your Python 3.8 (or higher)\nENV[\"PYTHON\"] = \"path/to/your/python3\"\n\n# Rebuild PyCall\nPkg.build(\"PyCall\")","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"Then close and reopen the Julia REPL, and run:","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"import PyCall\nPyCall.pyversion","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"which should reveal your Python version:","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"v\"3.8\"","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"Since PyCall now relies on a custom install of Python3, make sure that:","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"matplotlib, mpmath, and scipy are installed in that Python,\npip3 install matplotlib mpmath scipy --user\nFor optimal experience, verify that matplotlib uses the Qt5Agg backend. Useful instructions can be found here and here.","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"If you run into errors with PyPlot while running FLOWUnsteady, they are likely related to one of those two items.","category":"page"},{"location":"installation/general/#FLOWVPM","page":"Installation","title":"FLOWVPM","text":"","category":"section"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"FLOWVPM uses a fast multipole code called ExaFMM that accelerates the computation of particle interactions. ExaFMM is written in C++ and we have developed a Julia wrapper for it: FLOWExaFMM.","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"Before installing FLOWVPM, first you will have to install FLOWExaFMM and compile ExaFMM, as follows.","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"Make sure you have CMake, GCC, and OpenMP. On Linux, type to following to install them\nsudo apt-get update\nsudo apt-get install cmake g++ mpich\n[Julia REPL] Install CxxWrap:\nimport Pkg\nPkg.add(name=\"CxxWrap\", version=\"0.15.0\")\n[Terminal] Clone FLOWExaFMM:\ngit clone https://github.com/byuflowlab/FLOWExaFMM path/to/FLOWExaFMM\n(replace path/to/FLOWExaFMM with your preferred path in your local)","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"Compile ExaFMM running the script build.sh:\ncd path/to/FLOWExaFMM\nsh build.sh\nor in MacOS:\ncd path/to/FLOWExaFMM\nsh build_macos.sh\nThis should have generated the file fmm.so (or fmm.dylib in MacOS) under src/, which is a binary library containing ExaFMM.","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"Now that ExaFMM is compiled, you can add FLOWExaFMM to your Julia environment as a development package pointing directly to where you compiled the package and add FLOWVPM:","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"Add FLOWExaFMM:\n# In the Julia REPL\n] develop path/to/FLOWExaFMM","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"[Optional] Test FLOWExaFMM:\n] test FLOWExaFMM\nIf ExaFMM was correctly compiled, this will return a heart-warming \"Hello world!\"","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"Add FLOWVPM:\n] add https://github.com/byuflowlab/FLOWVPM.jl","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"[Optional] Test FLOWVPM:\n] test FLOWVPM","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"If you run into any issues, please try the following:","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"Test that you can correctly compile C++ code wrapped for Julia following these instructions: LINK\nMac users, take a look at this thread: LINK\nInstructions for BYU Fulton supercomputer: LINK","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"If issues persist, please check the resolved issues in the FLOWExaFMM repo, the discussion forum in the FLOWUnsteady repo, and feel free to open a new issue or discussion for help.","category":"page"},{"location":"installation/general/#Other-Packages","page":"Installation","title":"Other Packages","text":"","category":"section"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"Run the following commands in the Julia REPL to add some dependencies that are not in the official Julia registry:","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"import Pkg\n\nurl = \"https://github.com/byuflowlab/\"\n\npackages = [ (\"AirfoilPrep.jl\", \"v2.1.2\"), (\"FLOWVLM\", \"v2.1.2\"),\n (\"FLOWNoise\", \"v2.3.3\"), (\"BPM.jl\", \"v2.0.1\") ]\n\nPkg.add([ Pkg.PackageSpec(; url=url*name, rev=v) for (name, v) in packages ])","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"info: Troubleshooting\nSome things you might need to look out for:(MacOS users) Make sure your Homebrew (in Julia) is up to date. You may need to run the following in order to update your Homebrew: using Homebrew; Homebrew.brew(`update-reset`)\nMake sure that things are in place in your Julia settings. Having things like Conda, HDF5, etc. on your machine doesn't necessarily mean that the Julia implementation has them as well.","category":"page"},{"location":"installation/general/#Add-FLOWUnsteady","page":"Installation","title":"Add FLOWUnsteady","text":"","category":"section"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"You are now ready to install the FLOWUnsteady package. Type this in the Julia REPL:","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"] add https://github.com/byuflowlab/FLOWUnsteady","category":"page"},{"location":"installation/general/#Test-FLOWUnsteady","page":"Installation","title":"Test FLOWUnsteady","text":"","category":"section"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"In order to test that FLOWUnsteady and all dependencies were successfully installed, try running some of the examples under FLOWUnsteady/examples/.","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"For instance, you can run the Simple Wing example as follows:","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"import FLOWUnsteady as uns\n\ninclude(joinpath(uns.examples_path, \"wing\", \"wing.jl\"))","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"or you can run the Tethered Wing example:","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"import FLOWUnsteady as uns\n\ninclude(joinpath(uns.examples_path, \"tetheredwing.jl\"))","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"This will pull up Paraview visualizing the simulation. Kick off your shoes, sit back, and enjoy the simulation that you have just run.","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"

\n\n
\n \"Vid\n
\n\n



\n



","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"info: 2D View\nWhen opening a simulation with a flat surface (like wing.jl), ParaView automatically activates its 2D view mode. Disable the 2D view by clicking these two buttons: (Image: pic)","category":"page"},{"location":"installation/general/","page":"Installation","title":"Installation","text":"info: CPU Parallelization\nIf any of the examples is taking longer than 10 to 20 minutes to run, it is possible that ExaFMM was compiled without OpenMP, thus running in only one core as opposed to parallelizing the computation across all your CPU cores.To confirm that ExaFMM is successfully parallelized, pull up whatever CPU monitor is available in your operative system and confirm that Julia is using all the cores as the simulation is running. For instance, the Resources tab of the Task Manager in Windows should look like this: (Image: pic) and htop in the terminal (Linux and MacOS) should look like this: (Image: pic)","category":"page"},{"location":"api/flowvpm-time/#Time-Integration","page":"Time Integration","title":"Time Integration","text":"","category":"section"},{"location":"api/flowvpm-time/","page":"Time Integration","title":"Time Integration","text":"FLOWUnsteady.vpm.euler\nFLOWUnsteady.vpm.rungekutta3\nFLOWUnsteady.vpm.euler\nFLOWUnsteady.vpm.euler\nFLOWUnsteady.vpm.euler\nFLOWUnsteady.vpm.euler","category":"page"},{"location":"api/flowvpm-time/#FLOWVPM.euler","page":"Time Integration","title":"FLOWVPM.euler","text":"Steps the field forward in time by dt in a first-order Euler integration scheme.\n\n\n\n\n\nSteps the field forward in time by dt in a first-order Euler integration scheme using the VPM reformulation. See notebook 20210104.\n\n\n\n\n\n","category":"function"},{"location":"api/flowvpm-time/#FLOWVPM.rungekutta3","page":"Time Integration","title":"FLOWVPM.rungekutta3","text":"Steps the field forward in time by dt in a third-order low-storage Runge-Kutta integration scheme. See Notebook entry 20180105.\n\n\n\n\n\nSteps the field forward in time by dt in a third-order low-storage Runge-Kutta integration scheme using the VPM reformulation. See Notebook entry 20180105 (RK integration) and notebook 20210104 (reformulation).\n\n\n\n\n\n","category":"function"},{"location":"examples/propeller-jsweep/#J-Sweep","page":"J Sweep","title":"J Sweep","text":"","category":"section"},{"location":"examples/propeller-jsweep/","page":"J Sweep","title":"J Sweep","text":"Using the same rotor from the previous section, we now run a sweep of the advance ratio J = fracu_inftyn d to characterize the performance of the propeller.","category":"page"},{"location":"examples/propeller-jsweep/","page":"J Sweep","title":"J Sweep","text":"#=##############################################################################\n# DESCRIPTION\n Advance ratio sweep on APC 10 x7 propeller\n=###############################################################################\n\ncase_name = \"propeller-Jsweep-example\"# Name of this sweep case\nsave_path = case_name # Where to save this sweep\n\nJs = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.775] # Advance ratios Vinf/(nD)\n\n# Create path where to save sweep\nuns.gt.create_path(save_path, true)\n\n# ----------------- J SWEEP ----------------------------------------------------\nfor J in Js\n\n println(\"\\n\\n Running J = $(J)\")\n\n magVinf = J*RPM/60*(2*R)\n Vinf(X, t) = magVinf*[cosd(AOA), sind(AOA), 0] # (m/s) freestream velocity vector\n\n # ------------- 1) VEHICLE DEFINITION ---------\n println(\"\\tGenerating geometry...\")\n\n # Generate rotor\n rotor = uns.generate_rotor(rotor_file; pitch=pitch,\n n=n, CW=CW, blade_r=r,\n altReD=[RPM, J, mu/rho],\n xfoil=xfoil,\n ncrit=ncrit,\n data_path=data_path,\n verbose=false,\n verbose_xfoil=false,\n plot_disc=false\n );\n\n\n # Generate vehicle\n system = vlm.WingSystem() # System of all FLOWVLM objects\n vlm.addwing(system, \"Rotor\", rotor)\n\n rotors = [rotor]; # Defining this rotor as its own system\n rotor_systems = (rotors, ); # All systems of rotors\n\n wake_system = vlm.WingSystem() # System that will shed a VPM wake\n # NOTE: Do NOT include rotor when using the quasi-steady solver\n if VehicleType != uns.QVLMVehicle\n vlm.addwing(wake_system, \"Rotor\", rotor)\n end\n\n vehicle = VehicleType( system;\n rotor_systems=rotor_systems,\n wake_system=wake_system\n );\n\n # ------------- 2) MANEUVER DEFINITION --------\n # No changes\n\n # ------------- 3) SIMULATION DEFINITION ------\n simulation = uns.Simulation(vehicle, maneuver, Vref, RPMref, ttot;\n Vinit=Vinit, Winit=Winit);\n\n # ------------- 4) MONITOR DEFINITION ---------\n monitor_rotor = uns.generate_monitor_rotors(rotors, J, rho, RPM, nsteps;\n t_scale=RPM/60,\n t_lbl=\"Revolutions\",\n save_path=save_path,\n run_name=\"J$(ceil(Int, J*100))\",\n disp_conv=false,\n figname=\"rotor monitor J=$(J)\",\n )\n\n # ------------- 5) RUN SIMULATION -------------\n println(\"\\tRunning simulation...\")\n\n uns.run_simulation(simulation, nsteps;\n # ----- SIMULATION OPTIONS -------------\n Vinf=Vinf,\n rho=rho, mu=mu, sound_spd=speedofsound,\n # ----- SOLVERS OPTIONS ----------------\n p_per_step=p_per_step,\n max_particles=max_particles,\n vpm_viscous=vpm_viscous,\n sigma_vlm_surf=sigma_rotor_surf,\n sigma_rotor_surf=sigma_rotor_surf,\n sigma_vpm_overwrite=sigma_vpm_overwrite,\n vlm_rlx=vlm_rlx,\n shed_unsteady=shed_unsteady,\n shed_starting=shed_starting,\n extra_runtime_function=monitor_rotor,\n # ----- OUTPUT OPTIONS ------------------\n save_path=nothing,\n v_lvl=1, verbose_nsteps=24\n );\nend\n","category":"page"},{"location":"examples/propeller-jsweep/","page":"J Sweep","title":"J Sweep","text":"\n Run time: ~12 minutes on a Dell Precision 7760 laptop.\n\n

","category":"page"},{"location":"examples/propeller-jsweep/","page":"J Sweep","title":"J Sweep","text":"Check examples/propeller/propeller_jsweep.jl to postprocess and plot the results as shown below.","category":"page"},{"location":"examples/propeller-jsweep/","page":"J Sweep","title":"J Sweep","text":"
\n
\n \"Pic\n
","category":"page"},{"location":"examples/wing-4p2aoa/#simple_wing","page":"Basics","title":"Simple Wing","text":"","category":"section"},{"location":"examples/wing-4p2aoa/","page":"Basics","title":"Basics","text":"
\n \"Pic\n \"Pic\n
","category":"page"},{"location":"examples/wing-4p2aoa/","page":"Basics","title":"Basics","text":"
","category":"page"},{"location":"examples/wing-4p2aoa/","page":"Basics","title":"Basics","text":"In this example we simulate a 45^circ swept-back wing at an angle of attack of 42^circ. In the process we exemplify the basic structure of simulations, which is always the same, no matter how complex the simulation might be. The structure consists of six steps:","category":"page"},{"location":"examples/wing-4p2aoa/","page":"Basics","title":"Basics","text":"(1) Vehicle Definition: Generate the geometry of the vehicle and declare each vehicle subsystem in a FLOWUnsteady.VLMVehicle object","category":"page"},{"location":"examples/wing-4p2aoa/","page":"Basics","title":"Basics","text":"(2) Maneuver Definition: Generate functions that prescribe the kinematics of the vehicle and specify the control inputs for tilting and rotor subsystems in a FLOWUnsteady.KinematicManeuver object","category":"page"},{"location":"examples/wing-4p2aoa/","page":"Basics","title":"Basics","text":"(3) Simulation Definition: A FLOWUnsteady.Simulation object is generated stating the vehicle, maneuver, and total time and speed at which to perform the maneuver","category":"page"},{"location":"examples/wing-4p2aoa/","page":"Basics","title":"Basics","text":"(4) Monitors Definitions: Functions are generated for calculating, monitoring, and outputting different metrics throughout the simulation","category":"page"},{"location":"examples/wing-4p2aoa/","page":"Basics","title":"Basics","text":"(5) Run Simulation: Call to FLOWUnsteady.run_simulation","category":"page"},{"location":"examples/wing-4p2aoa/","page":"Basics","title":"Basics","text":"(6) Viz and Postprocessing: The simulation is visualized in Paraview and results are postprocessed","category":"page"},{"location":"examples/wing-4p2aoa/","page":"Basics","title":"Basics","text":"
","category":"page"},{"location":"examples/wing-4p2aoa/","page":"Basics","title":"Basics","text":"While in this example we show the basic structure without much explanation, in subsequent examples we will dive into the details and options of each step (which are also listed in the API Guide).","category":"page"},{"location":"examples/wing-4p2aoa/","page":"Basics","title":"Basics","text":"
","category":"page"},{"location":"examples/wing-4p2aoa/","page":"Basics","title":"Basics","text":"#=##############################################################################\n# DESCRIPTION\n 45° swept-back wing at an angle of attack of 4.2°. This wing has an aspect\n ratio of 5.0, a RAE 101 airfoil section with 12% thickness, and no dihedral,\n twist, nor taper. This test case matches the experimental setup of Weber,\n J., and Brebner, G., “Low-Speed Tests on 45-deg Swept-Back Wings, Part I,”\n Tech. rep., 1951. The same case is used in a VLM calculation in Bertin's\n Aerodynamics for Engineers, Example 7.2, pp. 343.\n\n# AUTHORSHIP\n * Author : Eduardo J. Alvarez (edoalvarez.com)\n * Email : Edo.AlvarezR@gmail.com\n * Created : Feb 2023\n * Last updated : Feb 2023\n * License : MIT\n=###############################################################################\n\nimport FLOWUnsteady as uns\nimport FLOWVLM as vlm\n\nrun_name = \"wing-example\" # Name of this simulation\n\nsave_path = run_name # Where to save this simulation\nparaview = true # Whether to visualize with Paraview\n\n\n# ----------------- SIMULATION PARAMETERS --------------------------------------\nAOA = 4.2 # (deg) angle of attack\nmagVinf = 49.7 # (m/s) freestream velocity\nrho = 0.93 # (kg/m^3) air density\nqinf = 0.5*rho*magVinf^2 # (Pa) static pressure\n\nVinf(X, t) = magVinf*[cosd(AOA), 0.0, sind(AOA)] # Freestream function\n\n\n# ----------------- GEOMETRY PARAMETERS ----------------------------------------\nb = 2.489 # (m) span length\nar = 5.0 # Aspect ratio b/c_tip\ntr = 1.0 # Taper ratio c_tip/c_root\ntwist_root = 0.0 # (deg) twist at root\ntwist_tip = 0.0 # (deg) twist at tip\nlambda = 45.0 # (deg) sweep\ngamma = 0.0 # (deg) dihedral\n\n# Discretization\nn = 50 # Number of spanwise elements per side\nr = 10.0 # Geometric expansion of elements\ncentral = false # Whether expansion is central\n\n# NOTE: A geometric expansion of 10 that is not central means that the last\n# element is 10 times wider than the first element. If central, the\n# middle element is 10 times wider than the peripheral elements.\n\n# ----------------- SOLVER PARAMETERS ------------------------------------------\n# Time parameters\nwakelength = 2.75*b # (m) length of wake to be resolved\nttot = wakelength/magVinf # (s) total simulation time\nnsteps = 200 # Number of time steps\n\n# VLM and VPM parameters\np_per_step = 1 # Number of particle sheds per time step\n\nlambda_vpm = 2.0 # VPM core overlap\nsigma_vpm_overwrite = lambda_vpm * magVinf * (ttot/nsteps)/p_per_step # Smoothing core size\nsigma_vlm_solver= -1 # VLM-on-VLM smoothing radius (deactivated with <0)\nsigma_vlm_surf = 0.05*b # VLM-on-VPM smoothing radius\n\nshed_starting = true # Whether to shed starting vortex\nvlm_rlx = 0.7 # VLM relaxation\n\n\n\n\n# ----------------- 1) VEHICLE DEFINITION --------------------------------------\nprintln(\"Generating geometry...\")\n\n# Generate wing\nwing = vlm.simpleWing(b, ar, tr, twist_root, lambda, gamma;\n twist_tip=twist_tip, n=n, r=r, central=central);\n\n# NOTE: `FLOWVLM.simpleWing` is an auxiliary function in FLOWVLM for creating a\n# VLM wing with constant sweep, dihedral, and taper ratio, and a linear\n# twist between the root and the wing tips\n\nprintln(\"Generating vehicle...\")\n\n# Generate vehicle\nsystem = vlm.WingSystem() # System of all FLOWVLM objects\nvlm.addwing(system, \"Wing\", wing)\n\nvlm_system = system; # System solved through VLM solver\nwake_system = system; # System that will shed a VPM wake\n\nvehicle = uns.VLMVehicle( system;\n vlm_system=vlm_system,\n wake_system=wake_system\n );\n\n# NOTE: `FLOWUnsteady.VLMVehicle` creates a vehicle made out of multiple VLM and\n# rotor subsystems. The argument `system` represents the vehicle as a\n# whole which will be translated and rotated with the kinematics\n# prescribed by the maneuver. The subsystem `vlm_system` will be solved\n# with the VLM solver. The subsystems `rotor_systems` are solved with\n# blade elements (none in this case). The subsystem `wake_system` will\n# shed the VPM wake.\n\n\n\n\n# ------------- 2) MANEUVER DEFINITION -----------------------------------------\n\nVvehicle(t) = zeros(3) # Translational velocity of vehicle over time\nanglevehicle(t) = zeros(3) # Angle of the vehicle over time\n\nangle = () # Angle of each tilting system (none)\nRPM = () # RPM of each rotor system (none)\n\nmaneuver = uns.KinematicManeuver(angle, RPM, Vvehicle, anglevehicle)\n\n# NOTE: `FLOWUnsteady.KinematicManeuver` defines a maneuver with prescribed\n# kinematics. `Vvehicle` defines the velocity of the vehicle (a vector)\n# over time. `anglevehicle` defines the attitude of the vehicle over time\n# (a vector with inclination angles with respect to each axis of the\n# global coordinate system). `angle` defines the tilting angle of each\n# tilting system over time (none in this case). `RPM` defines the RPM of\n# each rotor system over time (none in this case).\n# Each of these functions receives a nondimensional time `t`, which is the\n# simulation time normalized by the total time `ttot`, from 0 to\n# 1, beginning to end of simulation. They all return a nondimensional\n# output that is then scaled up by either a reference velocity (`Vref`) or\n# a reference RPM (`RPMref`). Defining the kinematics and controls of the\n# maneuver in this way allows the user to have more control over how fast\n# to perform the maneuver, since the total time, reference velocity and\n# RPM are then defined in the simulation parameters shown below.\n\n\n\n\n# ------------- 3) SIMULATION DEFINITION ---------------------------------------\n\nVref = 0.0 # Reference velocity to scale maneuver by\nRPMref = 0.0 # Reference RPM to scale maneuver by\nVinit = Vref*Vvehicle(0) # Initial vehicle velocity\nWinit = pi/180*(anglevehicle(1e-6) - anglevehicle(0))/(1e-6*ttot) # Initial angular velocity\n\n # Maximum number of particles\nmax_particles = (nsteps+1)*(vlm.get_m(vehicle.vlm_system)*(p_per_step+1) + p_per_step)\n\nsimulation = uns.Simulation(vehicle, maneuver, Vref, RPMref, ttot;\n Vinit=Vinit, Winit=Winit);\n\n\n\n\n# ------------- 4) MONITORS DEFINITIONS ----------------------------------------\n\n# NOTE: Monitors are functions that are called at every time step to perform\n# some secondary computation after the solution of that time step has been\n# obtained. In this case, the wing monitor uses the circulation and\n# induced velocities to compute aerodynamic forces and decompose them\n# into lift and drag. The monitor then plots these forces at every time\n# step while also saving them under a CSV file in the simulation folder.\n\n# Generate function that calculates aerodynamic forces\n# NOTE: We exclude skin friction since we want to compare to the experimental\n# data reported in Weber 1951 that was measured with pressure taps\ncalc_aerodynamicforce_fun = uns.generate_calc_aerodynamicforce(;\n add_parasiticdrag=true,\n add_skinfriction=false,\n airfoilpolar=\"xf-rae101-il-1000000.csv\"\n )\n\nD_dir = [cosd(AOA), 0.0, sind(AOA)] # Direction of drag\nL_dir = uns.cross(D_dir, [0,1,0]) # Direction of lift\n\nfigs, figaxs = [], [] # Figures generated by monitor\n\n# Generate wing monitor\nmonitor_wing = uns.generate_monitor_wing(wing, Vinf, b, ar,\n rho, qinf, nsteps;\n calc_aerodynamicforce_fun=calc_aerodynamicforce_fun,\n L_dir=L_dir,\n D_dir=D_dir,\n out_figs=figs,\n out_figaxs=figaxs,\n save_path=save_path,\n run_name=run_name,\n figname=\"wing monitor\",\n );\n\n\n\n\n# ------------- 5) RUN SIMULATION ----------------------------------------------\nprintln(\"Running simulation...\")\n\nuns.run_simulation(simulation, nsteps;\n # ----- SIMULATION OPTIONS -------------\n Vinf=Vinf,\n rho=rho,\n # ----- SOLVERS OPTIONS ----------------\n p_per_step=p_per_step,\n max_particles=max_particles,\n sigma_vlm_solver=sigma_vlm_solver,\n sigma_vlm_surf=sigma_vlm_surf,\n sigma_rotor_surf=sigma_vlm_surf,\n sigma_vpm_overwrite=sigma_vpm_overwrite,\n shed_starting=shed_starting,\n vlm_rlx=vlm_rlx,\n extra_runtime_function=monitor_wing,\n # ----- OUTPUT OPTIONS ------------------\n save_path=save_path,\n run_name=run_name\n );\n\n\n\n\n# ----------------- 6) VISUALIZATION -------------------------------------------\nif paraview\n println(\"Calling Paraview...\")\n\n # Files to open in Paraview\n files = joinpath(save_path, run_name*\"_Wing_vlm...vtk\")\n files *= \";\"*run_name*\"_pfield...xmf;\"\n\n # Call Paraview\n run(`paraview --data=$(files)`)\n\nend\n\n","category":"page"},{"location":"examples/wing-4p2aoa/","page":"Basics","title":"Basics","text":"\n Run time: ~3 minutes on a Dell Precision 7760 laptop.\n
\n Reduce resolution (n and steps) to speed up simulation without loss of accuracy.\n
\n

","category":"page"},{"location":"examples/wing-4p2aoa/","page":"Basics","title":"Basics","text":"As the simulation runs, you will see the monitor (shown below) plotting the lift and drag coefficients over time along with the loading distribution. For comparison, here we have also added the experimental measurements reported by Weber and Brebner, 1951.","category":"page"},{"location":"examples/wing-4p2aoa/","page":"Basics","title":"Basics","text":"(red = beginning,\nblue = end)","category":"page"},{"location":"examples/wing-4p2aoa/","page":"Basics","title":"Basics","text":"
\n \"Pic\n
","category":"page"},{"location":"examples/wing-4p2aoa/","page":"Basics","title":"Basics","text":" Experimental FLOWUnsteady Error\nC_L 0.238 0.23506 1.234%\nC_D 0.005 0.00501 0.143%","category":"page"},{"location":"examples/wing-4p2aoa/","page":"Basics","title":"Basics","text":"info: Paraview visualization\nThe .pvsm file visualizing the simulation as shown at the top of this page is available here: LINK (right click → save as...). To open in Paraview: File → Load State → (select .pvsm file) then select \"Search files under specified directory\" and point it to the folder where the simulation was saved.","category":"page"},{"location":"visualization/#Visualization-Guide","page":"Visualization","title":"Visualization Guide","text":"","category":"section"},{"location":"visualization/#What-*NOT*-to-do","page":"Visualization","title":"What NOT to do","text":"","category":"section"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Unfortunately, the first thing that ParaView shows when you open a particle field is a \"scatter plot\" full of confusing colors like this:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"
\n \"Pic\n
","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Not surprisingly, the VPM literature is full of these visualizations, which provide very little information about the simulation. Poor colormap aside, why is this a bad visualization? Even though we are coloring the strengths of the particles, one must remember that the particle strength boldsymbolGamma is the integral of the vorticity over the volume that is discretized by the particle, boldsymbolGamma = intlimits_mathrmVol boldsymbolomega mathrmdV. This is equivalent to the average vorticity times the volume, boldsymbolGamma = overlineboldsymbolomega mathrmVol, which means that the particle strength is proportional to the volume that it discretizes. Thus, the particle strength has no physical significance, but is purely a numerical artifact. (In fact, boldsymbolGamma are nothing more than the coefficients of the radial basis function that reconstructs the vorticity field as overlineboldsymbolomegaleft( mathbfxright) approx sumlimits_p boldsymbolGamma_p zeta_sigma_p(mathbfx-mathbfx_p).)","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Another VPM visualization that is commonly found in the literature simply shows the position of the particles:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"
\n \"Pic\n
","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Why is this a bad visualization? Even though its intent is to depict the flow field by taking advantage of the fact that particles follow streamlines and vortical structures, what is actually visualized is the spatial discretization. After all, we are just looking at the position of the computational elements. Here is an equivalent visualization of the computational elements in a mesh-based simulation of the same rotor in hover:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"
\n \"Pic\n
","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Not very insightful, is it?","category":"page"},{"location":"visualization/#What-we-recommend","page":"Visualization","title":"What we recommend","text":"","category":"section"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"In order to correctly visualize the flow field that is predicted by the VPM solver, one must reconstruct the vorticity field using the particles as a radial basis function and compute the velocity field using the Biot-Savart law. This can be computationally intensive and is not a streamlined process.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Alternatively, a quick visualization that sheds insights into both the flow field and the discretization is to make glyphs that point in the direction of boldsymbolGamma (arrows scaled by magnitude), thus forming the vortex lines:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"
\n \"Pic\n
","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"
\n \"Pic\n
","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"This type of visualization has four advantages:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"It clearly reveals the vortical structure (vortex lines) in a quick glimpse\nOne can envision the velocity field around the vortex lines using the right hand rule (Biot-Savart law shown below)\nAdding small points at the position of each particle gives us an idea of the spatial resolution around vortices\nOne can easily spot if the simulation is becoming numerically unstable since blown-up particles become giant arrows","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"
\n \"Pic\n
","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"info: Glyph Visualization\nA .pvsm file with a glyph visualization of the particle field is available here: LINK (right click → save as...).To open in ParaView: File → Load State → (select .pvsm file) then select \"Search files under specified directory\" and point it to the folder where the simulation was saved.","category":"page"},{"location":"visualization/#Fluid-domain","page":"Visualization","title":"Fluid domain","text":"","category":"section"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"While the \"glyph\" visualization shown above uses the native variables that are computed and outputted by the VPM (boldsymbolGamma_p and mathbfx_p), the full fluid domain can be computed from the particle field in postprocessing. This is done using the particles as a radial basis function to construct a continuous and analytical vorticity field boldsymbolomega(mathbfx), and the Biot-Savart law is used to obtain a continuous and analytical velocity field mathbfu(mathbfx). Since boldsymbolomega(mathbfx) and mathbfu(mathbfx) are analytical functions, their values and their derivatives can be calculated anywhere in space.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"FLOWUnsteady provides the function uns.computefluiddomain that reads a simulation and processes it to generate its fluid domain. See the Rotor in Hover tutorial for an example on how to use uns.computefluiddomain.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Whenever reporting results, we recommend showing the vortex elements (glyph visualization) and the fluid domain side by side to give a clear idea of the spatial resolution and the resulting flow field (see example below), which is custom in conventional mesh-based CFD.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"
\n \"Pic\n
","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":" \"Pic","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"

","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"Here is an example of a simulation superimposing the particle field and the resulting fluid domain:","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"
\n \n
","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"info: Volume Rendering\nA .pvsm file with a volume rendering of the vorticity field is available here: LINK (right click → save as...).To open in ParaView: File → Load State → (select .pvsm file) then select \"Search files under specified directory\" and point it to the folder where the simulation was saved.","category":"page"},{"location":"visualization/","page":"Visualization","title":"Visualization","text":"tip: Practice Dataset and Template\nTo help you practice in ParaView, we have uploaded the particle field and fluid domain of the DJI 9443 rotor case of mid-high fidelity and high fidelity simulations:High fidelity: LINK\nMid-high fidelity: LINKWe have also added a .pvsm ParaView state file that you can use as a template for visualizing your particle field with glyphs and processing the fluid domain. To open in ParaView: File → Load State → (select .pvsm file) then select \"Search files under specified directory\" and point it to the folder with your simulation results.","category":"page"},{"location":"examples/propeller-J040/#Basics","page":"Basics","title":"Basics","text":"","category":"section"},{"location":"examples/propeller-J040/","page":"Basics","title":"Basics","text":"
\n \"Vid\n
","category":"page"},{"location":"examples/propeller-J040/","page":"Basics","title":"Basics","text":"
","category":"page"},{"location":"examples/propeller-J040/","page":"Basics","title":"Basics","text":"In this example we first simulate an APC Thin-Electric 10x7 propeller operating in cruise conditions. Along the way, we demonstrate the basics of how to set up and run a rotor simulation.","category":"page"},{"location":"examples/propeller-J040/","page":"Basics","title":"Basics","text":"Rotors are generated through the function FLOWUnsteady.generate_rotor, which can receive either a set of parameters that define the rotor geometry (like twist/chord/sweep distributions, etc), or it can read the rotor geometry from a file. FLOWunsteady provides a prepopulated database of airfoil and rotor geometries to automate the generation of rotors, which is found under database/. This database can be accessed through the variable FLOWUnsteady.default_database. Alternatively, users can define their own database with custom rotors and airfoils.","category":"page"},{"location":"examples/propeller-J040/","page":"Basics","title":"Basics","text":"The following slides describe the structure of the database, using a DJI rotor as an example:","category":"page"},{"location":"examples/propeller-J040/","page":"Basics","title":"Basics","text":"
\n \n
\n

","category":"page"},{"location":"examples/propeller-J040/","page":"Basics","title":"Basics","text":"In this simulation we exemplify the following:","category":"page"},{"location":"examples/propeller-J040/","page":"Basics","title":"Basics","text":"How to generate a rotor with uns.generate_rotor\nHow to generate a rotor monitor with uns.generate_monitor_rotors\nHow to set up and run a rotor simulation.","category":"page"},{"location":"examples/propeller-J040/","page":"Basics","title":"Basics","text":"
","category":"page"},{"location":"examples/propeller-J040/","page":"Basics","title":"Basics","text":"#=##############################################################################\n# DESCRIPTION\n Simulation of an APC Thin-Electric 10x7 propeller (two-bladed rotor, 10-inch\n diameter).\n\n This example replicates the experiment and simulation described in McCrink &\n Gregory (2017), \"Blade Element Momentum Modeling of Low-Reynolds Electric\n Propulsion Systems.\"\n\n# AUTHORSHIP\n * Author : Eduardo J. Alvarez (edoalvarez.com)\n * Email : Edo.AlvarezR@gmail.com\n * Created : Mar 2023\n * Last updated : Mar 2023\n * License : MIT\n=###############################################################################\n\nimport FLOWUnsteady as uns\nimport FLOWVLM as vlm\nimport FLOWVPM as vpm\n\nrun_name = \"propeller-example\" # Name of this simulation\n\nsave_path = run_name # Where to save this simulation\nparaview = true # Whether to visualize with Paraview\n\n\n# ----------------- GEOMETRY PARAMETERS ----------------------------------------\n\n# Rotor geometry\nrotor_file = \"apc10x7.csv\" # Rotor geometry\ndata_path = uns.def_data_path # Path to rotor database\npitch = 0.0 # (deg) collective pitch of blades\nCW = false # Clock-wise rotation\nxfoil = true # Whether to run XFOIL\nncrit = 9 # Turbulence criterion for XFOIL\n\n# NOTE: If `xfoil=true`, XFOIL will be run to generate the airfoil polars used\n# by blade elements before starting the simulation. XFOIL is run\n# on the airfoil contours found in `rotor_file` at the corresponding\n# local Reynolds and Mach numbers along the blade.\n# Alternatively, the user can provide pre-computer airfoil polars using\n# `xfoil=false` and pointing to polar files through `rotor_file`.\n\n# Discretization\nn = 20 # Number of blade elements per blade\nr = 1/5 # Geometric expansion of elements\n\n# NOTE: Here a geometric expansion of 1/5 means that the spacing between the\n# tip elements is 1/5 of the spacing between the hub elements. Refine the\n# discretization towards the blade tip like this in order to better\n# resolve the tip vortex.\n\n# Read radius of this rotor and number of blades\nR, B = uns.read_rotor(rotor_file; data_path=data_path)[[1,3]]\n\n# ----------------- SIMULATION PARAMETERS --------------------------------------\n\n# Operating conditions\nRPM = 9200 # RPM\nJ = 0.4 # Advance ratio Vinf/(nD)\nAOA = 0 # (deg) Angle of attack (incidence angle)\n\nrho = 1.225 # (kg/m^3) air density\nmu = 1.81e-5 # (kg/ms) air dynamic viscosity\nspeedofsound = 342.35 # (m/s) speed of sound\n\nmagVinf = J*RPM/60*(2*R)\nVinf(X, t) = magVinf*[cosd(AOA), sind(AOA), 0] # (m/s) freestream velocity vector\n\nReD = 2*pi*RPM/60*R * rho/mu * 2*R # Diameter-based Reynolds number\nMatip = 2*pi*RPM/60*R / speedofsound # Tip Mach number\n\nprintln(\"\"\"\n RPM: $(RPM)\n Vinf: $(Vinf(zeros(3), 0)) m/s\n Matip: $(round(Matip, digits=3))\n ReD: $(round(ReD, digits=0))\n\"\"\")\n\n# ----------------- SOLVER PARAMETERS ------------------------------------------\n\n# Aerodynamic solver\nVehicleType = uns.UVLMVehicle # Unsteady solver\n# VehicleType = uns.QVLMVehicle # Quasi-steady solver\nconst_solution = VehicleType==uns.QVLMVehicle # Whether to assume that the\n # solution is constant or not\n# Time parameters\nnrevs = 4 # Number of revolutions in simulation\nnsteps_per_rev = 36 # Time steps per revolution\nnsteps = const_solution ? 2 : nrevs*nsteps_per_rev # Number of time steps\nttot = nsteps/nsteps_per_rev / (RPM/60) # (s) total simulation time\n\n# VPM particle shedding\np_per_step = 2 # Sheds per time step\nshed_starting = true # Whether to shed starting vortex\nshed_unsteady = true # Whether to shed vorticity from unsteady loading\nmax_particles = ((2*n+1)*B)*nsteps*p_per_step + 1 # Maximum number of particles\n\n# Regularization\nsigma_rotor_surf= R/40 # Rotor-on-VPM smoothing radius\nlambda_vpm = 2.125 # VPM core overlap\n # VPM smoothing radius\nsigma_vpm_overwrite = lambda_vpm * 2*pi*R/(nsteps_per_rev*p_per_step)\n\n# Rotor solver\nvlm_rlx = 0.7 # VLM relaxation <-- this also applied to rotors\nhubtiploss_correction = vlm.hubtiploss_nocorrection # Hub and tip loss correction\n\n# VPM solver\nvpm_viscous = vpm.Inviscid() # VPM viscous diffusion scheme\n\n# NOTE: In most practical situations, open rotors operate at a Reynolds number\n# high enough that viscous diffusion in the wake is negligible.\n# Hence, it does not make much of a difference whether we run the\n# simulation with viscous diffusion enabled or not.\n\n\nif VehicleType == uns.QVLMVehicle\n # NOTE: If the quasi-steady solver is used, this mutes warnings regarding\n # potential colinear vortex filaments. This is needed since the\n # quasi-steady solver will probe induced velocities at the lifting\n # line of the blade\n uns.vlm.VLMSolver._mute_warning(true)\nend\n\n# ----------------- 1) VEHICLE DEFINITION --------------------------------------\nprintln(\"Generating geometry...\")\n\n# Generate rotor\nrotor = uns.generate_rotor(rotor_file; pitch=pitch,\n n=n, CW=CW, blade_r=r,\n altReD=[RPM, J, mu/rho],\n xfoil=xfoil,\n ncrit=ncrit,\n data_path=data_path,\n verbose=true,\n verbose_xfoil=false,\n plot_disc=true\n );\n\nprintln(\"Generating vehicle...\")\n\n# Generate vehicle\nsystem = vlm.WingSystem() # System of all FLOWVLM objects\nvlm.addwing(system, \"Rotor\", rotor)\n\nrotors = [rotor]; # Defining this rotor as its own system\nrotor_systems = (rotors, ); # All systems of rotors\n\nwake_system = vlm.WingSystem() # System that will shed a VPM wake\n # NOTE: Do NOT include rotor when using the quasi-steady solver\nif VehicleType != uns.QVLMVehicle\n vlm.addwing(wake_system, \"Rotor\", rotor)\nend\n\nvehicle = VehicleType( system;\n rotor_systems=rotor_systems,\n wake_system=wake_system\n );\n\n# NOTE: Through the `rotor_systems` keyword argument to `uns.VLMVehicle` we\n# have declared any systems (groups) of rotors that share a common RPM.\n# We will later declare the control inputs to each rotor system when we\n# define the `uns.KinematicManeuver`.\n\n\n# ------------- 2) MANEUVER DEFINITION -----------------------------------------\n# Non-dimensional translational velocity of vehicle over time\nVvehicle(t) = zeros(3)\n\n# Angle of the vehicle over time\nanglevehicle(t) = zeros(3)\n\n# RPM control input over time (RPM over `RPMref`)\nRPMcontrol(t) = 1.0\n\nangles = () # Angle of each tilting system (none)\nRPMs = (RPMcontrol, ) # RPM of each rotor system\n\nmaneuver = uns.KinematicManeuver(angles, RPMs, Vvehicle, anglevehicle)\n\n# NOTE: `FLOWUnsteady.KinematicManeuver` defines a maneuver with prescribed\n# kinematics. `Vvehicle` defines the velocity of the vehicle (a vector)\n# over time. `anglevehicle` defines the attitude of the vehicle over time.\n# `angle` defines the tilting angle of each tilting system over time.\n# `RPM` defines the RPM of each rotor system over time.\n# Each of these functions receives a nondimensional time `t`, which is the\n# simulation time normalized by the total time `ttot`, from 0 to\n# 1, beginning to end of simulation. They all return a nondimensional\n# output that is then scaled by either a reference velocity (`Vref`) or\n# a reference RPM (`RPMref`). Defining the kinematics and controls of the\n# maneuver in this way allows the user to have more control over how fast\n# to perform the maneuver, since the total time, reference velocity and\n# RPM are then defined in the simulation parameters shown below.\n\n\n# ------------- 3) SIMULATION DEFINITION ---------------------------------------\n\nVref = 0.0 # Reference velocity to scale maneuver by\nRPMref = RPM # Reference RPM to scale maneuver by\n\nVinit = Vref*Vvehicle(0) # Initial vehicle velocity\nWinit = pi/180*(anglevehicle(1e-6) - anglevehicle(0))/(1e-6*ttot) # Initial angular velocity\n\nsimulation = uns.Simulation(vehicle, maneuver, Vref, RPMref, ttot;\n Vinit=Vinit, Winit=Winit);\n\n\n# ------------- 4) MONITORS DEFINITIONS ----------------------------------------\nfigs, figaxs = [], [] # Figures generated by monitor\n\n# Generate rotor monitor\nmonitor_rotor = uns.generate_monitor_rotors(rotors, J, rho, RPM, nsteps;\n t_scale=RPM/60, # Scaling factor for time in plots\n t_lbl=\"Revolutions\", # Label for time axis\n out_figs=figs,\n out_figaxs=figaxs,\n save_path=save_path,\n run_name=run_name,\n figname=\"rotor monitor\",\n )\n\n\n# ------------- 5) RUN SIMULATION ----------------------------------------------\nprintln(\"Running simulation...\")\n\nuns.run_simulation(simulation, nsteps;\n # ----- SIMULATION OPTIONS -------------\n Vinf=Vinf,\n rho=rho, mu=mu, sound_spd=speedofsound,\n # ----- SOLVERS OPTIONS ----------------\n p_per_step=p_per_step,\n max_particles=max_particles,\n vpm_viscous=vpm_viscous,\n sigma_vlm_surf=sigma_rotor_surf,\n sigma_rotor_surf=sigma_rotor_surf,\n sigma_vpm_overwrite=sigma_vpm_overwrite,\n vlm_rlx=vlm_rlx,\n hubtiploss_correction=hubtiploss_correction,\n shed_unsteady=shed_unsteady,\n shed_starting=shed_starting,\n extra_runtime_function=monitor_rotor,\n # ----- OUTPUT OPTIONS ------------------\n save_path=save_path,\n run_name=run_name,\n );\n\n\n\n\n# ----------------- 6) VISUALIZATION -------------------------------------------\nif paraview\n println(\"Calling Paraview...\")\n\n # Files to open in Paraview\n files = joinpath(save_path, run_name*\"_pfield...xmf;\")\n for bi in 1:B\n global files\n files *= run_name*\"_Rotor_Blade$(bi)_loft...vtk;\"\n files *= run_name*\"_Rotor_Blade$(bi)_vlm...vtk;\"\n end\n\n # Call Paraview\n run(`paraview --data=$(files)`)\n\nend\n\n","category":"page"},{"location":"examples/propeller-J040/","page":"Basics","title":"Basics","text":"\n Run time: ~2 minutes on a Dell Precision 7760 laptop.\n\n

","category":"page"},{"location":"examples/propeller-J040/","page":"Basics","title":"Basics","text":"As the simulation runs, you will see the monitor shown below plotting the blade loading along with thrust and torque coefficients and propulsive efficiency.","category":"page"},{"location":"examples/propeller-J040/","page":"Basics","title":"Basics","text":"
\n \"Pic\n
","category":"page"},{"location":"examples/propeller-J040/","page":"Basics","title":"Basics","text":"(red = beginning,\nblue = end)","category":"page"},{"location":"examples/rotorhover-acoustics/#rotorhovernoise","page":"Aeroacoustics","title":"Aeroacoustic Noise","text":"","category":"section"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"
\n \"Pic\n
","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"Using the aerodynamic solution obtained in the previous section, we can now feed the time-resolved loading and blade motion to PSU-WOPWOP and BPM.jl to compute aeroacoustic noise. PSU-WOPWOP is a Ffowcs Williams-Hawkings acoustic analogy using the time-domain integral Farassat 1A formulation to compute tonal noise from loading and thickness sources (FLOWUnsteady uses a compact representation for the loading source, while using the actual 3D loft of the blade for the thickness source). BPM.jl is an implementation of the semi-empirical methodology developed by Brooks, Pope, and Marcolini to predict broadband noise. The methodology models five self-noise mechanisms due to boundary-layer phenomena: boundary-layer turbulence passing the trailing edge, separated boundary-layer and stalled-airfoil flow, vortex shedding due to laminar-boundary-layer instabilities, vortex shedding from blunt trailing edges, and turbulent flow due to vortex tip formation.","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"In the following code we exemplify the following:","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"How to define observers (microphones) to probe the aeroacoustic noise\nHow to call PSU-WOPWOP through uns.run_noise_wopwop\nHow to call BPM.jl through uns.run_noise_bpm\nHow to add the tonal and broadband noise together and postprocess","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"As a reference, this is the orientation of the rotor and microphone array used in this example:","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"
\n \"Pic\n
","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"info: PSU-WOPWOP\nPSU-WOPWOP is a closed-source code that is not included in FLOWUnsteady, but is graciously made available as a binary by its developers at Penn State University upon inquiry. We recommend contacting them directly to obtain a binary.FLOWUnsteady has been tested with PSU-WOPWOP v3.4.4.","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"","category":"page"},{"location":"examples/rotorhover-acoustics/#Preamble","page":"Aeroacoustics","title":"Preamble","text":"","category":"section"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"We load FLOWUnsteady and the FLOWUnsteady.noise module:","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"import FLOWUnsteady as uns\nimport FLOWUnsteady: gt, vlm, noise\n\n# Path where to read and save simulation data\nsims_path = \"/media/edoalvar/T7/simulationdata202304\"\n","category":"page"},{"location":"examples/rotorhover-acoustics/#Tonal-Noise","page":"Aeroacoustics","title":"Tonal Noise","text":"","category":"section"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"First, we calculate the tonal noise from loading and thickness sources. The loading of each blade is read from each time step of the the aerodynamic solution, which is an unsteady loading. The thickness is computed from the 3D lofted geometry that is also outputted by the aero solution.","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"These files are read calling uns.run_noise_wopwop, which converts the outputs of the aero solution into a PSU-WOPWOP case. The PSU-WOPWOP binary is then called to read the case and propagate the noise to a set of observers (microphones). The PSU-WOPWOP solution is then written to the same case folder.","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"# Path from where to read aerodynamic solution\nread_path = joinpath(sims_path, \"rotorhover-example-midhigh00\") # <-- This must point to you aero simulation\n\n# Path where to save PSU-WOPWOP outputs\nsave_ww_path = read_path*\"-pww/\"\n\n# Path to PSU-WOPWOP binary (not included in FLOWUnsteady)\nwopwopbin = \"/home/edoalvar/Dropbox/WhisperAero/OtherCodes/PSU-WOPWOP_v3.4.4/wopwop3_linux_serial\"\n\n# Run name (prefix of rotor files to read)\nrun_name = \"singlerotor\"\n\n# Make this `true` if the aero simulation used the quasi-steady solver. If so,\n# PSU-WOPWOP will assume that the blade loading and geometry stays constant\n# and will read only one step out of the aero solution\nconst_solution = false\n\n# ------------ PARAMETERS ------------------------------------------------------\n# NOTE: Make sure that these parameters match what was used in the\n# aerodynamic solution\n\n# Rotor geometry\nrotor_file = \"DJI9443.csv\" # Rotor geometry\ndata_path = uns.def_data_path # Path to rotor database\n\n# Read radius of this rotor and number of blades\nR, B = uns.read_rotor(rotor_file; data_path=data_path)[[1,3]]\n\nrotorsystems = [[B]] # rotorsystems[si][ri] is the number of blades of the ri-th rotor in the si-th system\n\n# Simulation parameters\nRPM = 5400 # RPM here is a reference value to go from nrevs to simulation time\nCW = false # Clock-wise rotation of constant geometry (used if const_solution=true)\nrho = 1.071778 # (kg/m^3) air density\nspeedofsound = 342.35 # (m/s) speed of sound\n\n# Aero input parameters\nnrevs = 2 # Number of revolutions to read\nnrevs_min = 6 # Start reading from this revolution\nnsteps_per_rev = 72 # Number of steps per revolution in aero solution\nnum_min = ceil(Int, nrevs_min*nsteps_per_rev) # Start reading aero files from this step number\n\nif const_solution # If constant solution, it overrides to read only the first time step\n nrevs = nothing\n nsteps_per_rev = nothing\n num_min = 1\nend\n\n\n# PSU-WOPWOP parameters\nww_nrevs = 18 # Number of revolutions in PSU-WOPWOP (18 revs at 5400 RPM gives fbin = 5 Hz)\nww_nsteps_per_rev = max(120, 2*nsteps_per_rev) # Number of steps per revolution in PSU-WOPWOP\nconst_geometry = const_solution # Whether to run PSU-WOPWOP on constant geometry read from num_min\nperiodic = true # Periodic aerodynamic solution\nhighpass = 0.0 # High pass filter (set this to >0 to get rid of 0th freq in OASPL)\n\n# NOTE: `periodic=true` assumes that the aero solution is periodic, which allows\n# PSU-WOPWOP to simulate more revolutions (`ww_nrevs`) that what is\n# read from the aero simulation (`nrevs`). This is a good assumption for\n# an unsteady simulation as long as the loading is somewhat periodic after\n# the initial transient state (even with small unsteady fluctuations),\n# but set it to `false` in simulations with complex control inputs\n# (e.g., maneuvering aircraft, variable RPM, etc). If the outputs of\n# PSU-WOPWOP seem nonsensical, try setting this to false and increasing\n# the number of revolutions in the aero solution (`nrevs`).\n\n\n# Observer definition: Circular array of microphones\nsph_R = 1.905 # (m) radial distance from rotor hub\nsph_nR = 0 # Number of microphones in the radial direction\nsph_nphi = 0 # Number of microphones in the zenith direction\nsph_ntht = 72 # Number of microphones in the azimuthal direction\nsph_thtmin = 0 # (deg) first microphone's angle\nsph_thtmax = 360 # (deg) last microphone's angle\nsph_phimax = 180\nsph_rotation = [90, 0, 0] # Rotation of grid of microphones\n\n# NOTE: Here we have defined the microphone array as a circular array, but\n# we could have defined a hemisphere instead by simply making `sph_nphi`\n# different than zero, or a full volumetric spherical mesh making `sph_nR`\n# different than zero\n\n# Alternative observer definition: Single microphone\nRmic = 1.905 # (m) radial distance from rotor hub\nanglemic = 90*pi/180 # (rad) microphone angle from plane of rotation (- below, + above)\n # 0deg is at the plane of rotation, 90deg is upstream\nmicrophoneX = nothing # Comment and uncomment this to switch from array to single microphone\n# microphoneX = Rmic*[-sin(anglemic), cos(anglemic), 0]\n\n\n# ------------ RUN PSU-WOPWOP ----------------------------------------------\n@time uns.run_noise_wopwop(read_path, run_name, RPM, rho, speedofsound, rotorsystems,\n ww_nrevs, ww_nsteps_per_rev, save_ww_path, wopwopbin;\n nrevs=nrevs, nsteps_per_rev=nsteps_per_rev,\n # ---------- OBSERVERS -------------------------\n sph_R=sph_R,\n sph_nR=sph_nR, sph_ntht=sph_ntht,\n sph_nphi=sph_nphi, sph_phimax=sph_phimax,\n sph_rotation=sph_rotation,\n sph_thtmin=sph_thtmin, sph_thtmax=sph_thtmax,\n microphoneX=microphoneX,\n # ---------- SIMULATION OPTIONS ----------------\n periodic=periodic,\n # ---------- INPUT OPTIONS ---------------------\n num_min=num_min,\n const_geometry=const_geometry,\n axisrot=\"automatic\",\n CW=CW,\n highpass=highpass,\n # ---------- OUTPUT OPTIONS --------------------\n verbose=true, v_lvl=0,\n prompt=true, debug_paraview=false,\n debuglvl=0, # PSU-WOPWOP debug level (verbose)\n observerf_name=\"observergrid\", # .xyz file with observer grid\n case_name=\"runcase\", # Name of case to create and run\n );\n","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"\n Run time: ~1 minute on a Dell Precision 7760 laptop.\n\n

","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"info: Frequency bins\nThe length of the frequency bins in the SPL spectrum obtained from the FFT falls out from the following relationshipsbeginalign*\n f_mathrmbin\n =\n fracf_mathrmsamplen_mathrmsamples\n =\n frac1n_mathrmsamples Delta t_mathrmsample\n =\n fracmathrmRPM60frac1n_mathrmrevs\nendalign*Thus, in order to obtain the desired frequency bin f_mathrmbin, the number of revolutions that PSU-WOPWOP needs to simulate (ww_nrevs) isbeginalign*\n n_mathrmrevs\n =\n fracmathrmRPM60frac1f_mathrmbin\nendalign*","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"If you need to debug the aero→acoustics workflow, it is useful to convert the input files that we gave to PSU-WOPWOP back to VTK and visualize them in ParaView. This helps verify that we are passing the right things to PSU-WOPWOP. The following lines grab those input files that are formated for PSU-WOPWOP, converts them into VTK files, and opens them in ParaView:","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"\nread_ww_path = joinpath(save_ww_path, \"runcase\") # Path to PWW's input files\nsave_vtk_path = joinpath(read_ww_path, \"vtks\") # Where to save VTK files\n\n# Generate VTK files\nvtk_str = noise.save_geomwopwop2vtk(read_ww_path, save_vtk_path)\n\nprintln(\"Generated the following files:\\n\\t$(vtk_str)\")\n\n# Call Paraview to visualize VTKs\nrun(`paraview --data=$(vtk_str)`)\n","category":"page"},{"location":"examples/rotorhover-acoustics/#Broadband-Noise","page":"Aeroacoustics","title":"Broadband Noise","text":"","category":"section"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"Now, we calculate the broadband noise from non-deterministic sources through BPM. This is done calling uns.run_noise_bpm as follows:","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"# Path where to save BPM outputs\nsave_bpm_path = joinpath(sims_path, \"rotorhover-example-midhigh00-bpm\")\n\n# ------------ PARAMETERS --------------------------------------------------\n# NOTE: Make sure that these parameters match what was used in the\n# aerodynamic solution\n\n# Rotor geometry\nrotor_file = \"DJI9443.csv\" # Rotor geometry\ndata_path = uns.def_data_path # Path to rotor database\nread_polar = vlm.ap.read_polar2 # What polar reader to use\npitch = 0.0 # (deg) collective pitch of blades\nn = 50 # Number of blade elements (this does not need to match the aero solution)\nCW = false # Clock-wise rotation\n\n# Read radius of this rotor and number of blades\nR, B = uns.read_rotor(rotor_file; data_path=data_path)[[1,3]]\n\n# Simulation parameters\nRPM = 5400 # RPM\nJ = 0.0001 # Advance ratio Vinf/(nD)\nAOA = 0 # (deg) Angle of attack (incidence angle)\n\nrho = 1.071778 # (kg/m^3) air density\nmu = 1.85508e-5 # (kg/ms) air dynamic viscosity\nspeedofsound = 342.35 # (m/s) speed of sound\n\nmagVinf = J*RPM/60*(2*R)\nVinf(X,t) = magVinf*[cosd(AOA), sind(AOA), 0] # (m/s) freestream velocity\n\n# BPM parameters\nTE_thickness = 16.0 # (deg) trailing edge thickness\nnoise_correction= 1.00 # Calibration parameter (1 = no correction)\nfreq_bins = uns.BPM.default_f # Frequency bins (default is one-third octave band)\n\n# Observer definition: Circular array of microphones\nsph_R = 1.905 # (m) radial distance from rotor hub\nsph_nR = 0 # Number of microphones in the radial direction\nsph_nphi = 0 # Number of microphones in the zenith direction\nsph_thtmin = 0 # (deg) first microphone's angle\nsph_thtmax = 360 # (deg) last microphone's angle\nsph_phimax = 180\nsph_rotation = [90, 0, 0] # Rotation of grid of microphones\n\n# Alternative observer definition: Single microphone\nRmic = 1.905 # (m) radial distance from rotor hub\nanglemic = 90*pi/180 # (rad) microphone angle from plane of rotation (- below, + above)\n # 0deg is at the plane of rotation, 90deg is upstream\nmicrophoneX = nothing # Comment and uncomment this to switch from array to single microphone\n# microphoneX = Rmic*[-sin(anglemic), cos(anglemic), 0]\n\n# ------------ GENERATE GEOMETRY -------------------------------------------\n# Generate rotor\nrotor = uns.generate_rotor(rotor_file; pitch=pitch,\n n=n, CW=CW, ReD=0.0,\n verbose=false, xfoil=false,\n data_path=data_path,\n read_polar=read_polar,\n plot_disc=false)\n\nrotors = vlm.Rotor[rotor] # All rotors in the computational domain\n\n# ------------ RUN BPM -----------------------------------------------------\nuns.run_noise_bpm(rotors, RPM, Vinf, rho, mu, speedofsound,\n save_bpm_path;\n # ---------- OBSERVERS -------------------------\n sph_R=sph_R,\n sph_nR=sph_nR, sph_ntht=sph_ntht,\n sph_nphi=sph_nphi, sph_phimax=sph_phimax,\n sph_rotation=sph_rotation,\n sph_thtmin=sph_thtmin, sph_thtmax=sph_thtmax,\n microphoneX=microphoneX,\n # ---------- BPM OPTIONS -----------------------\n noise_correction=noise_correction,\n TE_thickness=TE_thickness,\n freq_bins=freq_bins,\n # ---------- OUTPUT OPTIONS --------------------\n prompt=true\n );\n","category":"page"},{"location":"examples/rotorhover-acoustics/#Results","page":"Aeroacoustics","title":"Results","text":"","category":"section"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"Finally, we add tonal and broadband noise together and plot the results","category":"page"},{"location":"examples/rotorhover-acoustics/#Read-datasets","page":"Aeroacoustics","title":"Read datasets","text":"","category":"section"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"We start by reading the outputs from PSU-WOPWOP and BPM:","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"# Dataset to read and associated information\ndataset_infos = [ # (label, PWW solution, BPM solution, line style, color)\n (\"FLOWUnsteady\",\n joinpath(sims_path, \"rotorhover-example-midhigh00-pww/runcase/\"),\n joinpath(sims_path, \"rotorhover-example-midhigh00-bpm\"),\n \"-\", \"steelblue\"),\n ]\n\ndatasets_pww = Dict() # Stores PWW data in this dictionary\ndatasets_bpm = Dict() # Stores BPM data in this dictionary\n\n# Read datasets and stores them in dictionaries\nnoise.read_data(dataset_infos; datasets_pww=datasets_pww, datasets_bpm=datasets_bpm)\n\nprintln(\"Done!\")\n","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"Also, we need to recreate the circular array of microphones that was used when generating the aeroacoustic solutions:","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"# These parameters will be used for plotting\nRPM = 5400 # RPM of solution\nnblades = 2 # Number of blades\nBPF = nblades*RPM/60 # Blade passing frequency\n\n# Make sure this grid is the same used as an observer by the aeroacoustic solution\nsph_R = 1.905 # (m) radial distance from rotor hub\nsph_nR = 0\nsph_nphi = 0\nsph_ntht = 72 # Number of microphones\nsph_thtmin = 0 # (deg) first microphone's angle\nsph_thtmax = 360 # (deg) last microphone's angle\nsph_phimax = 180\nsph_rotation = [90, 0, 0] # Rotation of grid of microphones\n\n# Create observer grid\ngrid = noise.observer_sphere(sph_R, sph_nR, sph_ntht, sph_nphi;\n thtmin=sph_thtmin, thtmax=sph_thtmax, phimax=sph_phimax,\n rotation=sph_rotation);\n\n# This function calculates the angle that corresponds to every microphone\npangle(i) = -180/pi*atan(gt.get_node(grid, i)[1], gt.get_node(grid, i)[2])\n","category":"page"},{"location":"examples/rotorhover-acoustics/#Pressure-waveform","page":"Aeroacoustics","title":"Pressure waveform","text":"","category":"section"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"Here we plot the pressure waveform at some of the microphones. This pressure waveform includes only the tonal component, as given by PSU-WOPWOP.","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"microphones = [-45, 90] # (deg) microphones to plot\n\nnoise.plot_pressure(dataset_infos, microphones, RPM, sph_ntht, pangle;\n datasets_pww=datasets_pww, xlims=[0, 5])\n","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"
\n \"Pic\n \"Pic\n
","category":"page"},{"location":"examples/rotorhover-acoustics/#SPL-Spectrum","page":"Aeroacoustics","title":"SPL Spectrum","text":"","category":"section"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"We now compare the (sound pressure level) SPL spectrum at the microphone -45^circ below the plane of rotation with the experimental data reported by Zawodny et al.[1].","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"[1]: N. S. Zawodny, D. D. Boyd, Jr., and C. L. Burley, “Acoustic Characterization and Prediction of Representative, Small-scale Rotary-wing Unmanned Aircraft System Components,” in 72nd American Helicopter Society (AHS) Annual Forum (2016).","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"One-third octave band:","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"microphones = [-45] # (deg) microphone to plot\nAweighted = false # Plot A-weighted SPL\nonethirdoctave = true # Plot 1/3 octave band\n\n# Experimental data from Zawodny et al., Fig. 9\nzawodny_path = joinpath(uns.examples_path, \"..\", \"docs\", \"resources\", \"data\", \"zawodny2016\")\nexp_filename = joinpath(zawodny_path, \"zawodny_dji9443-fig9-OTO-5400.csv\")\nplot_experimental = [(exp_filename, \"Experimental\", \"o:k\", Aweighted, [])]\n\n# Plot SPL spectrum\nnoise.plot_spectrum_spl(dataset_infos, microphones, BPF, sph_ntht, pangle;\n datasets_pww=datasets_pww, datasets_bpm=datasets_bpm,\n Aweighted=Aweighted,\n onethirdoctave=onethirdoctave,\n plot_csv=plot_experimental,\n xBPF=false, xlims=[100, 3e4], ylims=[0, 80], BPF_lines=8)\n","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"
\n \"Pic\n
","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"A-weighted narrow band:","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"Aweighted = true # Plot A-weighted SPL\n\n# Experimental data from Zawodny et al., Fig. 9\nexp_filename = joinpath(zawodny_path, \"zawodny_dji9443_spl_5400_01.csv\")\nplot_experimental = [(exp_filename, \"Experimental\", \"k\", Aweighted, [])]\n\n# Plot SPL spectrum\nnoise.plot_spectrum_spl(dataset_infos, microphones, BPF, sph_ntht, pangle;\n datasets_pww=datasets_pww, datasets_bpm=datasets_bpm,\n Aweighted=Aweighted,\n plot_csv=plot_experimental,\n xBPF=false, xlims=[100, 3e4], BPF_lines=21)","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"
\n \"Pic\n
","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"In the narrow band spectrum, keep in mind that the broadband output of BPM has been converted from 1/3 octaves into narrow band (5 hz bin) in order to plot it together with the tonal noise, but this is a very rough approximation (we lack enough information to interpolate from a coarse band to a narrow band besides just smearing the energy content). Hence, the broadband component seems to overpredict relative to the experimental, but this is an artifice of the 1/3 octave rightarrow narrow band conversion. In the OASPL directivity plots we will see that the A-weighted OASPL predicted with BPM actually matches the experimental values very well.","category":"page"},{"location":"examples/rotorhover-acoustics/#Tonal-noise","page":"Aeroacoustics","title":"Tonal noise","text":"","category":"section"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"Here we plot only the tonal component of noise associated with harmonics of the blade passing frequency (BPF),","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"Tonal SPL spectrum","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"Aweighted = false\nadd_broadband = false\n\n# Experimental data from Zawodny et al., Fig. 9\nexp_filename = joinpath(zawodny_path, \"zawodny_dji9443_spl_5400_01.csv\")\nplot_experimental = [(exp_filename, \"Experimental\", \"k\", Aweighted, [])]\n\n# Plot SPL spectrum\nnoise.plot_spectrum_spl(dataset_infos, microphones, BPF, sph_ntht, pangle;\n datasets_pww=datasets_pww, datasets_bpm=datasets_bpm,\n Aweighted=Aweighted,\n plot_csv=plot_experimental,\n add_broadband=add_broadband,\n xBPF=false, xlims=[100, 3e4], BPF_lines=21)\n","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"
\n \"Pic\n
","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"Directivity of 1^mathrmst BPF","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"BPFi = 1 # Multiple of blade-passing frequency to plot\n\n# Experimental and computational data reported by Zawodny et al., Fig. 14\nfilename1 = joinpath(zawodny_path, \"zawodny_fig14_topright_exp00.csv\")\nfilename2 = joinpath(zawodny_path, \"zawodny_fig14_topright_of00.csv\")\nfilename3 = joinpath(zawodny_path, \"zawodny_fig14_topright_pas00.csv\")\n\nplot_experimental = [(filename1, \"Experimental\", \"ok\", Aweighted, []),\n (filename2, \"OVERFLOW2\", \"-y\", Aweighted, [(:alpha, 0.8)])]\n\n# Plot SPL directivity of first blade-passing frequency\nnoise.plot_directivity_splbpf(dataset_infos, BPFi, BPF, pangle;\n datasets_pww=datasets_pww,\n datasets_bpm=datasets_bpm,\n plot_csv=plot_experimental,\n rticks=40:4:52, rlims=[40, 54], rorigin=36)\n","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"
\n \"Pic\n
","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"Directivity of 2^mathrmnd BPF","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"BPFi = 2 # Multiple of blade-passing frequency to plot\n\n# Experimental and computational data reported by Zawodny et al., Fig. 14\nfilename1 = joinpath(zawodny_path, \"zawodny_fig14_bottomright_exp00.csv\")\nfilename2 = joinpath(zawodny_path, \"zawodny_fig14_bottomright_of00.csv\")\nfilename3 = joinpath(zawodny_path, \"zawodny_fig14_bottomright_pas00.csv\")\n\nplot_experimental = [(filename1, \"Experimental\", \"ok\", Aweighted, []),\n (filename2, \"OVERFLOW2\", \"-y\", Aweighted, [(:alpha, 0.8)])]\n\n# Plot SPL directivity of first blade-passing frequency\nnoise.plot_directivity_splbpf(dataset_infos, BPFi, BPF, pangle;\n datasets_pww=datasets_pww,\n datasets_bpm=datasets_bpm,\n plot_csv=plot_experimental,\n rticks=15:5:30, rlims=[0, 32], rorigin=0)\n","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"
\n \"Pic\n
","category":"page"},{"location":"examples/rotorhover-acoustics/#OASPL-directivity","page":"Aeroacoustics","title":"OASPL directivity","text":"","category":"section"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"Unweighted overall SPL (OASPL)","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"Aweighted = false\n\n# Experimental and computational data reported by Zawodny et al., Fig. 12\nexp_filename = joinpath(zawodny_path, \"zawodny_fig12_left_5400_00.csv\")\nplot_experimental = [(exp_filename, \"Experimental\", \"ok\", Aweighted, [])]\n\n# Plot OASPL directivity\nnoise.plot_directivity_oaspl(dataset_infos, pangle;\n datasets_pww=datasets_pww,\n datasets_bpm=datasets_bpm,\n Aweighted=Aweighted,\n plot_csv=plot_experimental,\n rticks=40:10:70, rlims=[40, 72], rorigin=30)\n","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"
\n \"Pic\n
","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"A-weighted OASPL","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"Aweighted = true\n\n# Experimental and computational data reported by Zawodny et al., Fig. 12\nexp_filename = joinpath(zawodny_path, \"zawodny_fig12_right_5400_00.csv\")\nplot_experimental = [(exp_filename, \"Experimental\", \"ok\", Aweighted, [])]\n\n# Plot OASPL directivity\nnoise.plot_directivity_oaspl(dataset_infos, pangle;\n datasets_pww=datasets_pww,\n datasets_bpm=datasets_bpm,\n Aweighted=Aweighted,\n plot_csv=plot_experimental,\n rticks=40:10:70, rlims=[40, 72], rorigin=30)","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"
\n\"Pic\n
","category":"page"},{"location":"examples/rotorhover-acoustics/","page":"Aeroacoustics","title":"Aeroacoustics","text":"","category":"page"},{"location":"examples/vahana-maneuver/#vahanamaneuver","page":"Maneuver Definition","title":"Maneuver Definition","text":"","category":"section"},{"location":"examples/vahana-maneuver/","page":"Maneuver Definition","title":"Maneuver Definition","text":"In this section we define a function that generates the eVTOL transition maneuver (a uns.KinematicManeuver object). This maneuver object contains the non-dimensional velocity and attitude of the aircraft over a non-dimensional time (where t=0 is the beginning of the maneuver and t=1 is the end), which prescribes the kinematics of the vehicle. It also contains the control inputs for the aircraft over time: tilting angles for each tilting system and RPM for each rotor system shown below.","category":"page"},{"location":"examples/vahana-maneuver/","page":"Maneuver Definition","title":"Maneuver Definition","text":"\n \n \n \n \n
\n \"Pic\n \n \"Pic\n
","category":"page"},{"location":"examples/vahana-maneuver/","page":"Maneuver Definition","title":"Maneuver Definition","text":"The maneuver here defined contains five stages:","category":"page"},{"location":"examples/vahana-maneuver/","page":"Maneuver Definition","title":"Maneuver Definition","text":"Takeoff, climb, hover\nHover rightarrow cruise transition (powered lift to wing-borne flight)\nCruise\nCruise rightarrow hover transition (wing-borne flight to powered lift)\nHover, descend, landing","category":"page"},{"location":"examples/vahana-maneuver/","page":"Maneuver Definition","title":"Maneuver Definition","text":"Since the vehicle kinematics and control inputs used in the maneuver definition are non-dimensional, the maneuver can be performed as fast or as slow as desired when we define the total time, reference velocity, and reference RPM of uns.Simulation later in the next section, without needing to change the maneuver definition shown here.","category":"page"},{"location":"examples/vahana-maneuver/","page":"Maneuver Definition","title":"Maneuver Definition","text":"\"\"\"\n Generates the eVTOL transition maneuver of Vahana aircraft\n\"\"\"\nfunction generate_maneuver_vahana(; disp_plot=false, # If true, it will display a plot of the maneuver\n add_rotors=true, # Whether to add rotors contorl inputs to the maneuver\n V0=0.0001 # Initial non-dimensional velocity (slightly different than zero to avoid instabilities)\n )\n\n # NOTE: The following parameters are non-dimensional and scaled between 0\n # and 1. Here, t=0 is the beginning of the maneuver and t=1 is the end.\n\n # Define end time of each stage\n # Stage 1: [0, t1] -> Take off\n # Stage 2: [t1, t2] -> Transition\n # Stage 3: [t2, t3] -> Cruise\n # Stage 4: [t3, t4] -> Transition\n # Stage 5: [t4, 1 ] -> Landing\n t1, t2, t3, t4 = 0.2, 0.3, 0.5, 0.6\n\n # Target velocity at each stage (ratio of cruise velocity)\n V1 = 0.25\n V2 = 0.10\n V3 = 1.00\n V4 = V2\n V5 = 0.5*V1\n\n # Target RPM at each stage (ratio of hover RPM)\n RPM1 = 1.10\n RPM2 = 1.50\n RPM3 = 0.75\n RPM3_stacked = 2/600\n RPM4 = 1.00\n RPM5 = 0.90\n\n r_RPMh_stup = 3.50 # Ratio between stacked and main rotor RPM in hover\n r_RPMh_tw = 0.75 # Ratio between tandem and main rotor RPM in hover\n\n # NOTE: -x is in the direction of flight and +z is climb with ground at z=0\n\n\n ############################################################################\n # AIRCRAFT VELOCITY\n ############################################################################\n \"\"\"\n Receives a nondimensional time between 0 and 1, and returns the\n non-dimensional velocity vector of the aircraft at that instant.\n \"\"\"\n function Vaircraft(t)\n\n # ------------ TAKE OFF ------------------------------------------------\n if t\n

\n \"Pic\n



\n \"Pic\n","category":"page"},{"location":"examples/vahana-maneuver/","page":"Maneuver Definition","title":"Maneuver Definition","text":"Notice that this plot shows four rotor systems instead of only three. This is because the system of stacked rotors was split into two (all upper stack rotors are grouped together, while all lower stack rotors are also grouped together). This way we could change the index angle of the stacked rotors throughout the simulation by modulating upper and lower RPMs independently. However, for simplicity, in this example we have kept upper and lower RPMs the same.","category":"page"},{"location":"api/flowvpm-uj/#UJ-Scheme","page":"UJ Scheme","title":"UJ Scheme","text":"","category":"section"},{"location":"api/flowvpm-uj/","page":"UJ Scheme","title":"UJ Scheme","text":"FLOWUnsteady.vpm.Kernel\nFLOWUnsteady.vpm.UJ_direct\nFLOWUnsteady.vpm.UJ_fmm\nFLOWUnsteady.vpm.FMM","category":"page"},{"location":"api/flowvpm-uj/#FLOWVPM.Kernel","page":"UJ Scheme","title":"FLOWVPM.Kernel","text":"Kernel(zeta, g, dgdr, g_dgdr, EXAFMM_P2P, EXAFMM_L2P)\n\nArguments\n\nzeta::Function : Basis function zeta(r).\ng::Function : Regularizing function g(r).\ndgdr::Function : Derivative of g(r).\ng_dgdr::Function : Efficient evaluation of g and dgdr.\nEXAFMM_P2P::Int : Flag for the ExaFMM P2P function to call.\nEXAFMM_L2P::Int : Flag for the ExaFMM L2P function to call.\n\n\n\n\n\n","category":"type"},{"location":"api/flowvpm-uj/#FLOWVPM.UJ_direct","page":"UJ Scheme","title":"FLOWVPM.UJ_direct","text":"UJ_direct(pfield)\n\nCalculates the velocity and Jacobian that the field exerts on itself by direct particle-to-particle interaction, saving U and J on the particles.\n\nNOTE: This method accumulates the calculation on the properties U and J of every particle without previously emptying those properties.\n\n\n\n\n\nUJ_direct(source, target)\n\nCalculates the velocity and Jacobian that the field source exerts on every particle of field target, saving U and J on the particles.\n\nNOTE: This method accumulates the calculation on the properties U and J of every particle without previously emptying those properties.\n\n\n\n\n\n","category":"function"},{"location":"api/flowvpm-uj/#FLOWVPM.UJ_fmm","page":"UJ Scheme","title":"FLOWVPM.UJ_fmm","text":"UJ_fmm(pfield)\n\nCalculates the velocity and Jacobian that the field exerts on itself through a fast-multipole approximation, saving U and J on the particles.\n\nNOTE: This method accumulates the calculation on the properties U and J of every particle without previously emptying those properties.\n\n\n\n\n\n","category":"function"},{"location":"theory/validation/#Validation","page":"Validation","title":"Validation","text":"","category":"section"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"The following is a compilation of validation studies found in the literature using FLOWUnsteady.","category":"page"},{"location":"theory/validation/#Wing","page":"Validation","title":"Wing","text":"","category":"section"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Sources: E. J. Alvarez, 2022,[1] and E. J. Alvarez and A. Ning, 2022[2]","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"
\n \"Pic\n \"Pic\n
","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Case: 45^circ swept-back wing at an angle of attack of 42^circ, aspect ratio of 5.0, RAE 101 airfoil section with 12% thickness, no dihedral, twist, nor taper. Freestream velocity of 497mathrmms, corresponding to a chord-based Reynolds number of 17 times 10^6. The high sweep of the wing causes non-negligible spanwise flow. The wing loads reported by Weber and Brebner (experimental) were integrated from pressure-tap measurements, hence the drag reported in this section includes induced and form drag while excluding skin friction drag.","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Results: (Excerpt from E. J. Alvarez and A. Ning, 2022[2]) \"Fig. 9 shows the loading distribution and integrated lift and drag across AOA predicted with the actuator surface model (ASM), compared to the experimental measurements. The loading distribution shows satisfactory agreement with the experiment, validating that both the circulation solver and the force calculation... are accurate for predicting not only lift but also drag distribution across the span. The integrated lift and drag (Fig. 9, bottom) show excellent agreement with the experiment from 0^circ to 105^circ. We expect this to be the case only for mild AOAs before approaching stall conditions since our ASM does not capture the mechanisms of flow separation. Thus, through this swept-wing case, we gain confidence that our ASM yields accurate predictions in conditions with spanwise flow up to a moderate AOA.\"","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"
\n \"Pic\n
","category":"page"},{"location":"theory/validation/#Rotor","page":"Validation","title":"Rotor","text":"","category":"section"},{"location":"theory/validation/#Hover-Case:-Aero","page":"Validation","title":"Hover Case: Aero","text":"","category":"section"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Source: E. J. Alvarez, 2022[1], and E. J. Alvarez and A. Ning, 2022[6]","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"
\n \"Pic\n
","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Case: DJI 9443 rotor in hover at 5400 RPM. This is a two-bladed rotor with a diameter of 9.4 inches. Validation case at Mach number of 0.2, mathrmRe_c = 6 times 10^4, and mathrmRe_07D = 7 times 10^5. Thrust and blade loading are compared to experiment and mesh-based CFD. Computational time is benchmarked against conventional mesh-based CFD.","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Results: (Excerpt from E. J. Alvarez and A. Ning, 2020[6]) \"...the VPM simulation shows excellent agreement with the experiment, predicting a mean C_T value within 2% of the experimental mean value... Our meshless LES appears to be two orders of magnitude faster than a mesh-based LES with similar fidelity, while being one order of magnitude faster than a low-fidelity URANS simulation and three orders of magnitude than high-fidelity DES.\"","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"\n
\n \"Pic\n \"Pic\n

\n \"Pic\n
\n\n
","category":"page"},{"location":"theory/validation/#Hover-Case:-Acoustics","page":"Validation","title":"Hover Case: Acoustics","text":"","category":"section"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Source: E. J. Alvarez, A. Schenk, T. Critchfield, and A. Ning, 2020[7]","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Case: Same DJI 9443 case in hover. FLOWUnsteady predictions (VPM) are compared against experiment and URANS (STAR-CCM+) and DES (OVERFLOW2).","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"\n
\n \"Pic\n

\n \"Pic\n
\n\n
","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"NOTE: The broadband results in E. J. Alvarez, A. Schenk, T. Critchfield, and A. Ning, 2020[7] contained a bug that ended up evaluating the microphone array in the wrong plane, which led to a large discrepancy in A-weighted OASPL. For updated results, see the Rotor in Hover tutorial.","category":"page"},{"location":"theory/validation/#Forward-Flight-Case","page":"Validation","title":"Forward Flight Case","text":"","category":"section"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Source: R. M. Erhard and J. J. Alonso, 2022[8]","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"
\n \"Pic\n
","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Case: TUD F29 rotor in forward flight at an incidence angle (edgewise flow). This is a four-bladed rotor. Thrust and power predicted by FLOWUnsteady (VPM) was compared to experiment and low-fidelity methods at multiple incidence angles alpha and advance ratios J.","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Results: Good agreement between FLOWUnsteady and experiment for incidence angles up to alpha=60^circ across advance ratio.","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"\n
\n \"Pic\n
\n\n
","category":"page"},{"location":"theory/validation/#Wind-Turbine","page":"Validation","title":"Wind Turbine","text":"","category":"section"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Source: J. Mehr, E. J. Alvarez, and A. Ning, 2022[5]","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"
\n \"Pic\n
","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Case: Test series \"H\" from UAE study at US Department of Energy. Sweep on tip speed ratio lambda = fracomega Ru_infty.","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Results: (Excerpt from J. Mehr, E. J. Alvarez, and A. Ning, 2020[5]) \"The torque coefficient outputs are also within 10% for tip speed ratios above, and within 25% for tip speed ratios under, lambda = 20; also notice that the absolute magnitudes of the torque coefficient are very small at low tip speed ratios, assuaging any concerns about the higher relative errors at those operational states.\"","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"\n
\n \"Pic\n
\n\n
","category":"page"},{"location":"theory/validation/#Propeller","page":"Validation","title":"Propeller","text":"","category":"section"},{"location":"theory/validation/#APC-10x7-Case","page":"Validation","title":"APC 10x7 Case","text":"","category":"section"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Source: E. J. Alvarez and A. Ning, 2020[3]","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"
\n \"Pic\n
","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Case: APC 10x7E propeller (2 blades, 10'' diameter, solidity 0.1) at a tip Mach number of 0.36, mathrmRe_c = 62 times 10^4, and mathrmRe_D = 65 times 10^5. Sweep on advance ratio J = fracu_inftyn d.","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Results: (Excerpt from E. J. Alvarez and A. Ning, 2020[3]) \"... it is confirmed that the VPM propeller model is valid... across low and moderately high advance ratios.\"","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"\n
\n \"Pic\n
\n\n
","category":"page"},{"location":"theory/validation/#Beaver-Case","page":"Validation","title":"Beaver Case","text":"","category":"section"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Source: E. J. Alvarez, 2022[1], and E. J. Alvarez and A. Ning, 2022[9]","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"
\n \"Vid\n
","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Case: Beaver propeller (4 blades, 0.237 m diameter) at mathrmRe_07D = 18times 10^6. Extensive validation with predicted thrust, torque, efficiency, blade loading, and flow field compared to experimental measurements.","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"\n
\n Sweep of advance ratio
\n \"Pic\n\n
\n Sweep of incidence angle
\n \"Pic\n\n

\n Blade loading
\n \"Pic\n\n
\n Wake structure
\n \"Pic\n\n

\n Flow field
\n \"Pic\n
\n \"Pic\n\n
\n \"Vid\n \"Vid\n
\n\n
","category":"page"},{"location":"theory/validation/#Rotor-Rotor-Interactions","page":"Validation","title":"Rotor-Rotor Interactions","text":"","category":"section"},{"location":"theory/validation/#Side-by-Side-Rotors-in-Hover","page":"Validation","title":"Side-by-Side Rotors in Hover","text":"","category":"section"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Source: E. J. Alvarez and A. Ning, 2020[3]","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"
\n \"Pic\n
","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Case: Two side-by-side DJI rotors in hover. Two-bladed rotors with a diameter of 9.4 inches. Test at 4860 RPM, tip Mach number of 0.18, mathrmRe_c = 62times 10^4, and mathrmRe_07D = 65times 10^5. Aerodynamic interactions as the tip-to-tip spacing s between rotors is decreased.","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Results: FLOWUnsteady accurately captures both the drop in thrust and the increase in fluctuations as rotors are brought closer together.","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"\n
\n \"Pic\n
\n\n
","category":"page"},{"location":"theory/validation/#Side-by-Side-and-Tandem-Propeller","page":"Validation","title":"Side-by-Side and Tandem Propeller","text":"","category":"section"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Source: R. M. Erhard and J. J. Alonso, 2022[8]","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"
\n \"Pic\n
","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Case: Two TUD F29 propellers in side-by-side and tandem configurations at an multile incidence angles (edgewise flow). This is a four-bladed rotor. Thrust and power predicted by FLOWUnsteady (VPM) was compared to experiment and low-fidelity methods at multiple incidence angles alpha and advance ratios J.","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Results: Good agreement between FLOWUnsteady and experiment for incidence angles up to alpha=60^circ across advance ratio.","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"\n
\n \"Pic\n \"Pic\n \"Pic\n \"Pic\n
\n\n
","category":"page"},{"location":"theory/validation/#Rotor-Wing-Interactions","page":"Validation","title":"Rotor-Wing Interactions","text":"","category":"section"},{"location":"theory/validation/#Tailplane-w/-Tip-Mounted-Propellers","page":"Validation","title":"Tailplane w/ Tip-Mounted Propellers","text":"","category":"section"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Source: E. J. Alvarez, 2022[1], and E. J. Alvarez and A. Ning, 2022[9]","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"
\n \"Pic\n
","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Case: Horizontal stabilizer (tailplane) with tip-mounted Beaver propellers. Wing with low aspect ratio (bc=27), symmetric NACA 64_2-mathrmA015 profile, and elevator flap. Test at advance ratio J of 0.8 and inboard-up propeller rotation at a thrust setting of C_T = 00935. Flap deflection captured in the actuator surface model (ASM) through an equivalent twist. Effects of wake impingement on wing loading predicted by FLOWUnsteady are compared to experiment.","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"\n
\n Flat wing ($\\alpha = 0^\\circ$, $\\delta_e=0^\\circ$)
\n \"Pic\n\n


\n Lift augmentation
\n \"Pic\n \"Pic\n\n


\n Wing wake and Streamtube
\n \"Pic\n \"Pic\n\n


\n Effects of swirl direction
\n \"Pic\n\n


\n Strong impingement
\n \"Pic\n
\n\n
","category":"page"},{"location":"theory/validation/#Blown-Wing","page":"Validation","title":"Blown Wing","text":"","category":"section"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Source: E. J. Alvarez, 2022[1], and E. J. Alvarez and A. Ning, 2022[9]","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"
\n \"Pic\n
","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"Case: Straight wing with Beaver propellers mounted mid-span. Wing of aspect ratio bc=533, symmetric NACA 64_2-mathrmA015 profile. Test at advance ratio J of 0.85 and inboard-up propeller rotation at a thrust setting of C_T = 0121. Effects of wake impingement on wing loading predicted by FLOWUnsteady are compared to experiment.","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"
\n \"Pic\n \"Pic\n
\n\n
","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"[1]: E. J. Alvarez (2022), \"Reformulated Vortex Particle Method and Meshless Large Eddy Simulation of Multirotor Aircraft,\" Doctoral Dissertation, Brigham Young University. [PDF]","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"[2]: E. J. Alvarez & A. Ning (2022), \"Meshless Large Eddy Simulation of Rotor-Wing Interactions Through the Reformulated Vortex Particle Method,\" (in review).","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"[3]: E. J. Alvarez & A. Ning (2020), \"High-Fidelity Modeling of Multirotor Aerodynamic Interactions for Aircraft Design,\" AIAA Journal. [DOI] [PDF]","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"[5]: J. Mehr, E. J. Alvarez, & A. Ning (2022), \"Interactional Aerodynamics Analysis of a Multi-Rotor Energy Kite,\" (in review).","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"[6]: E. J. Alvarez & A. Ning (2022), \"Reviving the Vortex Particle Method: A Stable Formulation for Meshless Large Eddy Simulation,\" (in review). [PDF]","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"[7]: E. J. Alvarez, A. Schenk, T. Critchfield, and A. Ning (2020), “Rotor-on-Rotor Aeroacoustic Interactions of Multirotor in Hover,” VFS 76th Forum. [PDF]","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"[8]: R. M. Erhard and J. J. Alonso (2022), \"Comparison of Propeller Wake Models for Distributed Electric Propulsion and eVTOL Aircraft in Complex Flow Conditions,\" AIAA SciTech Forum. [PDF]","category":"page"},{"location":"theory/validation/","page":"Validation","title":"Validation","text":"[9]: E. J. Alvarez & A. Ning (2022), \"Meshless Large Eddy Simulation of Rotor-Wing Interactions with Reformulated Vortex Particle Method,\" (in review).","category":"page"},{"location":"api/flowunsteady-postprocessing-fdom/#fluid_domain","page":"Fluid Domain","title":"Fluid Domain","text":"","category":"section"},{"location":"api/flowunsteady-postprocessing-fdom/","page":"Fluid Domain","title":"Fluid Domain","text":" FLOWUnsteady.computefluiddomain\n FLOWUnsteady.generate_preprocessing_fluiddomain_pfield","category":"page"},{"location":"api/flowunsteady-postprocessing-fdom/#FLOWUnsteady.computefluiddomain","page":"Fluid Domain","title":"FLOWUnsteady.computefluiddomain","text":"computefluiddomain( pfield::FLOWVPM.ParticleField,\n grids::Array{<:GeometricTools.AbstractGrid};\n optargs...\n )\n\nEvaluate the velocity and vorticity field induced by the particle field pfield at all nodes in a set of grids grids. The fields are added as solution fields U and W in each grid. The analytic Jacobian of the velocity field can also be saved using the optional argument add_J=true.\n\nOPTIONAL ARGUMENTS\n\nProcessing options\n\nadd_J::Bool=false : Add the solution fields J1, J2, and J3 to each grid, where Ji[j]=dUi/dxj.\nadd_Uinf::Bool=false : It evaluates and adds the uniform freestream to the U field.\nadd_Wapprox::Bool=false : It evaluates and saves the RBF-approximated vorticity field under the field Wapprox.\nzeta::Function=FLOWVPM.zeta_fmm : Method for evaluating RBF-approximated vorticity (used only if add_Wapprox==true).\nscale_sigma::Real=1.0 : It rescales the smoothing radius of each particle by this factor before evaluating the particle field.\n\nOutput options\n\nsave_path::String : If used, it will save the grids as XDMF files under this path.\nfile_pref::String : Prefix for XDMF files.\ngrid_names::String : Name of each grid for XDMF files. If not given, it will generate their names automatically.\nnum::Int : If given, the name of the XDMF files will be \"$(file_pref)$(grid_names[i]).$(num).vtk\"\nverbose::Bool=true : Activate/deactivate verbose.\nv_lvl::Int=0 : Indentation level for printing verbose.\n\nNOTE: The solution fields U, W, and Jacobian do not include the freestream field, but rather they only include the fields induced by the particles. To add the freestream to U, use the optional argument add_Uinf=true.\n\n\n\n\n\ncomputefluiddomain(pfield::vpm.ParticleField,\n nums::Vector{Int}, read_path::String, file_pref::String,\n grids;\n origin=nothing,\n orientation=nothing,\n other_read_paths=[],\n other_file_prefs=[],\n userfunction_pfield=(pfield, num, grids)->nothing,\n optargs...\n )\n\nEvaluate the fluid domain at each time step in nums that is induced by a particle field saved under read_path. file_pref indicates the prefix of the .h5 files to read.\n\nTo translate and re-orient the grids at each time step, the user can pass the new origin vector and orientation matrix through the functions origin and orientation, which will be called as origin(pfield, num) and orientation(pfield, num) at each time step.\n\npfield is a place holder for loading the particles that are read, so the user must make sure that sufficient memory has been preallocated to hold the number of particles of each time step that will be read, plus the number of nodes in the grids. The fluid domain will be evaluated using the UJ and FMM configuration of the given pfield particle field.\n\nTo read and add more than one particle field at each time step, pass a list of paths and prefixes through other_read_paths and other_file_prefs. This is useful for reading and incluiding a set of static particles, for example.\n\nGive it a function userfunction_pfield to pre-process the resulting particle field before evaluating the fluid domain (e.g., remove particles, resize core sizes, etc).\n\n\n\n\n\ncomputefluiddomain(maxparticles::Int, args...;\n UJ::Function=vpm.UJ_fmm,\n fmm::FLOWVPM.FMM=vpm.FMM(; p=4, ncrit=50, theta=0.4, phi=0.5),\n pfield_optargs=[]\n optargs...)\n\nLike the other computefluiddomain(args...; optargs...) methods, but automatically pre-allocating and initializing the particle field with the given maximum number of particles, UJ evaluation method, and FMM configuration (if FMM is used by UJ).\n\nUse pfield_optargs to pass any additional optional arguments to the particle field constructor.\n\n\n\n\n\ncomputefluiddomain(P_min, P_max, NDIVS, args...;\n spacetransform=nothing,\n O=zeros(3), Oaxis=Float64[i==j for i in 1:3, j in 1:3],\n optargs...)`\n\nLike the other computefluiddomain(args...; optargs...) methods, but automatically generating a fluid domain grid. The grid is generated as a Cartesian box with minimum and maximum corners P_min and P_max and NDIVS cells.\n\nFor instance, P_min=[-1, -1, -1], P_max=[-1, -1, -1], and NDIVS=[10, 10, 50] will grid the volumetric space between -1 and 1 in all directions, with 10 cells in both the x and y-direction, and 50 cells in the z-direction.\n\nEven though the grid is first generated as a Cartesian grid, this can be transformed into any other structured space through the argument spacetransform, which is a function that takes any vector and returns another vector of the same dimensions. For instance, P_min=[0.5, 0, 0], P_max=[1, 2*pi, 5], NDIVS=[10, 20, 30], spacetransform=GeometricTools.cylindrical3D will generate a cylindrical grid discretizing the radial annulus from 0.5 to 1 with 10 cells, the polar angle from 0 to 360deg with 20 cells, and the axial z-distance from 0 through 5 with 30 cells.\n\nAny number of dimensions can be used, but make sure that P_min, P_max, and NDIVS always have three dimensions and indicate the dimensions that are \"collapsed\" with a 0 in NDIVS. Even though the grid is defined in the Cartesian axes, the origin and orientation of the grid can be specified with the O and Oaxis optional arguments. For instance, P_min=[0, 0, 1], P_max=[2, 3.5, 1], NDIVS=[10, 10, 0] will generate a 2D surface laying in the xy-plane at z=1.0, spanning from (x,y)=(0,0) to (x,y)=(2,3.5). Use O=[0, 0, -1] to move the surface back to the xy-plane at z=0. Use Oaxis=[1 0 0; 0 0 -1; 0 1 0] to re-orient the surface to lay in the zx-plane. The same thing can be achieved with Oaxis=GeometricTools.rotation_matrix2(-90, 0, 0) which generates the rotation matrix corresponding to a -90deg rotation about the x-axis.\n\nNOTE: The order of operation is (1) Cartesian grid generation, (2) space transformation if any, and (3) translation and re-orientation to the given origin and orientation.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-postprocessing-fdom/#FLOWUnsteady.generate_preprocessing_fluiddomain_pfield","page":"Fluid Domain","title":"FLOWUnsteady.generate_preprocessing_fluiddomain_pfield","text":"generate_preprocessing_fluiddomain_pfield(maxsigma, maxmagGamma;\n verbose=true, v_lvl=1)\n\nGenerate function for pre-processing particle fields before generating fluid domain: shrink oversized particles and correct blown-up particles.\n\nPass the output function to FLOWUnsteady.computefluiddomain through the keyword argument userfunction_pfield. For example:\n\npreprocess_pfield = generate_preprocessing_fluiddomain_pfield(maxsigma, maxmagGamma;\n verbose=true, v_lvl=1)\n\ncomputefluiddomain( ... ; userfunction_pfield=preprocess_pfield, ...)\n\n\n\n\n\n","category":"function"},{"location":"installation/windows/#windows","page":"Windows Instructions","title":"Windows Instructions","text":"","category":"section"},{"location":"installation/windows/","page":"Windows Instructions","title":"Windows Instructions","text":"(Tested on Windows 11)","category":"page"},{"location":"installation/windows/#Install-Windows-Subsystem-for-Linux-(WSL)","page":"Windows Instructions","title":"Install Windows Subsystem for Linux (WSL)","text":"","category":"section"},{"location":"installation/windows/","page":"Windows Instructions","title":"Windows Instructions","text":"Follow this guide to setup Ubuntu 22.04: LINK\nIf you run into issues, try the following:\nEnable bash for Windows LINK\nEnable virtualization LINK. For instance, here are instructions specific for a Dell Precision 7760: LINK1 LINK2 (make sure to check \"Hyper-V\")","category":"page"},{"location":"installation/windows/","page":"Windows Instructions","title":"Windows Instructions","text":"To launch WSL, we recommend launching it from the Microsoft Store as opposed to the Programs Menu or the terminal, otherwise Windows' PATH will not be passed onto WSL.","category":"page"},{"location":"installation/windows/#Set-up-Environment","page":"Windows Instructions","title":"Set up Environment","text":"","category":"section"},{"location":"installation/windows/","page":"Windows Instructions","title":"Windows Instructions","text":"Once inside WSL, do the following","category":"page"},{"location":"installation/windows/","page":"Windows Instructions","title":"Windows Instructions","text":"Install system-level packages:\nsudo apt-get update\nsudo apt-get install cmake g++ mpich\nInstall python packages:\nsudo apt-get install python3-pip python3-tk\npip3 install matplotlib mpmath scipy --user\nCreate a folder where to install programs\nmkdir ~/Programs\ncd ~/Programs","category":"page"},{"location":"installation/windows/#Install-Julia","page":"Windows Instructions","title":"Install Julia","text":"","category":"section"},{"location":"installation/windows/","page":"Windows Instructions","title":"Windows Instructions","text":"Still inside WSL,","category":"page"},{"location":"installation/windows/","page":"Windows Instructions","title":"Windows Instructions","text":"Download Julia:\nwget -O julia.tar.gz \"https://julialang-s3.julialang.org/bin/linux/x64/1.10/julia-1.10.2-linux-x86_64.tar.gz\"\nDecompress Julia:\ntar -xvf julia.tar.gz -C ~/Programs/\nAdd Julia to user-level path:\nsudo ln -s ~/Programs/julia-1.10.2/bin/julia /usr/local/bin/","category":"page"},{"location":"installation/windows/#Install-ParaView","page":"Windows Instructions","title":"Install ParaView","text":"","category":"section"},{"location":"installation/windows/","page":"Windows Instructions","title":"Windows Instructions","text":"Donwload and install ParaView v5.9.1\nIdentify the location of paraview.exe (most likely, this is C:\\Program Files\\ParaView 5.9.1\\bin\\)\nAdd the path of ParaView (e.g., C:\\Program Files\\ParaView 5.9.1\\bin\\) to the system-level PATH: LINK\nCreate a paraview alias inside WSL typing this in the WSL terminal:\nwhich paraview.exe | xargs -I{} sudo ln -s {} /usr/local/bin/paraview","category":"page"},{"location":"installation/windows/","page":"Windows Instructions","title":"Windows Instructions","text":"info: ParaView 5.10+ on Windows\nParaView versions 5.10 and newer on Windows cannot open XDMF files (like the particle field) from the WSL file system. Please copy them to a Windows file system or use Paraview 5.9.1.","category":"page"},{"location":"installation/windows/","page":"Windows Instructions","title":"Windows Instructions","text":"","category":"page"},{"location":"installation/windows/","page":"Windows Instructions","title":"Windows Instructions","text":"Now you can proceed with the general instructions (you can skip the Julia and ParaView instructions since we already took care of that)","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"\"FLOWUnsteady","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"

\n \n Interactional aerodynamics solver for multirotor aircraft and wind energy\n \n

","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"

\n \n \n \n \n \n \n

","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"FLOWUnsteady is an open-source variable-fidelity framework for unsteady aerodynamics and aeroacoustics based on the reformulated vortex particle method (rVPM). This suite brings together various tools developed by the FLOW Lab at Brigham Young University: Vortex lattice method, strip theory, blade elements, 3D panel method, and rVPM. The suite also integrates an FW-H solver and a BPM code for tonal and broadband prediction of aeroacoustic noise. In the low end of fidelity, simulations are similar to a free-wake method, while in the high end simulations become meshless large eddy simulations.","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"Documentation: flow.byu.edu/FLOWUnsteady\nCode: github.com/byuflowlab/FLOWUnsteady","category":"page"},{"location":"#What-is-the-Reformulated-VPM?","page":"Intro","title":"What is the Reformulated VPM?","text":"","category":"section"},{"location":"","page":"Intro","title":"Intro","text":"The reformulated VPM is a meshless CFD method solving the LES-filtered incompressible Navier-Stokes equations in their vorticity form,","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"

\n \"img\"\n

","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"It uses a Lagrangian (meshless) scheme, which not only avoids the hurdles of mesh generation, but it also conserves vortical structures over long distances with minimal numerical dissipation.","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"The rVPM uses particles to discretize the Navier-Stokes equations, with the particles representing radial basis functions that construct a continuous vorticity/velocity field. The basis functions become the LES filter, providing a variable filter width and spatial adaptation as the particles are convected and stretched by the velocity field. The local evolution of the filter width provides an extra degree of freedom to reinforce conservation laws, which makes the reformulated VPM numerically stable (overcoming the numerical issues that plague the classic VPM).","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"This meshless LES has several advantages over conventional mesh-based CFD. In the absence of a mesh, ","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"the rVPM does not suffer from the numerical dissipation introduced by a mesh\nintegrates over coarser discretizations without losing physical accuracy\nderivatives are calculated analytically rather than approximated through a stencil.","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"Furthermore, rVPM is highly efficient since it uses computational elements only where there is vorticity (rather than meshing the entire space), usually being ~100x faster than conventional mesh-based LES with comparable accuracy.","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"While rVPM is well suited for resolving unbounded flows (wakes), complications arise when attempting to impose boundary conditions (solid boundaries) on the flow. This is because (1) the method is meshless, and (2) boundary conditions must be imposed on the Navier-Stokes equations in the form of vorticity. FLOWUnsteady is a framework designed to introduce solid boundaries into the rVPM using actuator models. Wings and rotors are introduced in the computational domain through actuator line and surface models that use low-fidelity aerodynamic methods (e.g., VLM, lifting line, panels, etc) to compute forces and embed the associated vorticity back into the LES domain.","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"


","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"
\n \n
","category":"page"},{"location":"#Variable-Fidelity","page":"Intro","title":"Variable Fidelity","text":"","category":"section"},{"location":"","page":"Intro","title":"Intro","text":"rVPM considerably reduces engineering time by avoiding the hurdles of mesh generation. Furthermore, since it is not limited by the time-step and stability constraints of conventional mesh-based CFD, rVPM can be used across all levels of fidelity, all in the same framework by simply coarsening or refining the simulation. In the low end of fidelity, simulations are similar to a free-wake method, while in the high end simulations become meshless large eddy simulations. Thus, FLOWUnsteady can be used as a high-fidelity tool that is orders of magnitude faster than mesh-based CFD, or as a variable-fidelity tool for the different stages of design.","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"

\n \"img\"\n

","category":"page"},{"location":"#Capabilities","page":"Intro","title":"Capabilities","text":"","category":"section"},{"location":"","page":"Intro","title":"Intro","text":"Simulation: Tilting wings and rotors • Rotors with variable RPM and variable pitch • Asymmetric and stacked rotors • Maneuvering vehicle with prescribed kinematicsrVPM Solver: Fast-multipole acceleration through ExaFMM • CPU parallelization through OpenMP • Second-order spatial accuracy and third-order RK time integration • Numerically stable by reshaping particles subject to vortex stretching • Subfilter-scale (SFS) model of turbulence associated to vortex stretching • SFS model coefficient computed dynamically or prescribed • Viscous diffusion through core spreadingWing Models: Actuator line model through lifting line + VLM • Actuator surface model through vortex sheet + VLM • Parasitic drag through airfoil lookup tablesRotor Model: Actuator line model through blade elements • Airfoil lookup tables automatically generated through XFOIL • Aeroacoustic noise through FW-H (PSU-WOPWOP) and BPMGeometry: Simple lofts and bodies of revolution through FLOWUnsteady • Import complex geometry from OpenVSPUnder development (🤞coming soon): Advanced actuator surface models through 3D panel method (for ducts, wings, and fuselage) • Unstructured surface grids • Bluff bodies through vortex sheet methodLimitations: Viscous drag and separation is only captured through airfoil lookup tables, without attempting to shed separation wakes • Incompressible flow only (though wave drag can be captured through airfoil lookup tables) • CPU parallelization through OpenMP without support for distributed memory (no MPI, i.e., only single-node runs)Coded in the Julia language for Linux, MacOS, and Windows WSL.","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"More about the models inside FLOWUnsteady:","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"

\n \n \"https://www.nas.nasa.gov/pubs/ams/2022/08-09-22.html\"\n \n

","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"


","category":"page"},{"location":"#Selected-Publications","page":"Intro","title":"Selected Publications","text":"","category":"section"},{"location":"","page":"Intro","title":"Intro","text":"See the following publications for an in-depth dive into the theory and validation:","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"E. J. Alvarez, J. Mehr, & A. Ning (2022), \"FLOWUnsteady: An Interactional Aerodynamics Solver for Multirotor Aircraft and Wind Energy,\" AIAA AVIATION Forum. [VIDEO] [PDF]\nE. J. Alvarez & A. Ning (2022), \"Reviving the Vortex Particle Method: A Stable Formulation for Meshless Large Eddy Simulation,\" (accepted in AIAAJ). [PDF]\nE. J. Alvarez (2022), \"Reformulated Vortex Particle Method and Meshless Large Eddy Simulation of Multirotor Aircraft.,\" Doctoral Dissertation, Brigham Young University. [VIDEO] [PDF]","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"


","category":"page"},{"location":"#Examples","page":"Intro","title":"Examples","text":"","category":"section"},{"location":"","page":"Intro","title":"Intro","text":"Propeller: [Tutorial] [Validation]","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"
\n \n
","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"Rotor in Hover: [Tutorial] [Validation]","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"
\n \n
","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"Blown Wing: [Tutorial] [Validation]","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"

\n \"img\"\n

","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"


","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"Airborne-Wind-Energy Aircraft: [Video]","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"

\n \"img\"\n

","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"eVTOL Transition: [Tutorial]","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"Mid-fidelity","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"
\n \n
","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"High-fidelity","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"
\n \n
","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"Aeroacoustic Noise: [Tutorial] [Validation]","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"

\n \"Vid\"\n

","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"
\n \n
","category":"page"},{"location":"#Sponsors","page":"Intro","title":"Sponsors","text":"","category":"section"},{"location":"","page":"Intro","title":"Intro","text":"

\n \"img\"\n


\n

","category":"page"},{"location":"#About","page":"Intro","title":"About","text":"","category":"section"},{"location":"","page":"Intro","title":"Intro","text":"FLOWUnsteady is an open-source project jointly led by the FLOW Lab at Brigham Young University and Whisper Aero. All contributions are welcome.","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"If you find FLOWUnsteady useful in your work, we kindly request that you cite the following paper [URL] [PDF]:","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"Alvarez, E. J., Mehr, J., and Ning, A., “FLOWUnsteady: An Interactional Aerodynamics Solver for Multirotor Aircraft and Wind Energy,” AIAA AVIATION 2022 Forum, Chicago, IL, 2022. DOI:10.2514/6.2022-3218.","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"If you were to encounter any issues or have questions, please first read through the documentation, open/closed issues, and the discussion forum. If the issue still persists, please open a new issue and/or participate in the discussion forum.","category":"page"},{"location":"","page":"Intro","title":"Intro","text":"Developers/contributors : Eduardo J. Alvarez (main), Cibin Joseph, Judd Mehr, Ryan Anderson, Eric Green\nCreated : Sep 2017\nLicense : MIT License","category":"page"},{"location":"examples/blownwing-acoustics/#Acoustic-Solution","page":"Acoustic Solution","title":"Acoustic Solution","text":"","category":"section"},{"location":"api/flowunsteady-monitor/#(4)-Monitors-Definitions","page":"(4) Monitors Definitions","title":"(4) Monitors Definitions","text":"","category":"section"},{"location":"api/flowunsteady-monitor/","page":"(4) Monitors Definitions","title":"(4) Monitors Definitions","text":"A monitor is a function that is passed to FLOWUnsteady.run_simulation as an extra runtime function that is called at every time step. Runtime functions are expected to return a Boolean that indicates the need of stopping the simulation, such that if extra_runtime_function ever returns true, the simulation will immediately be ended.","category":"page"},{"location":"api/flowunsteady-monitor/","page":"(4) Monitors Definitions","title":"(4) Monitors Definitions","text":"Multiple monitors can be concatenated with boolean logic as follows","category":"page"},{"location":"api/flowunsteady-monitor/","page":"(4) Monitors Definitions","title":"(4) Monitors Definitions","text":"import FLOWUnsteady as uns\n\nmonitor_states = uns.generate_monitor_statevariables()\nmonitor_enstrophy = uns.generate_monitor_enstrophy()\n\nmonitors(args...; optargs...) = monitor_states(args...; optargs...) || monitor_enstrophy(args...; optargs...)","category":"page"},{"location":"api/flowunsteady-monitor/","page":"(4) Monitors Definitions","title":"(4) Monitors Definitions","text":"Then pass the monitor to the simulation as","category":"page"},{"location":"api/flowunsteady-monitor/","page":"(4) Monitors Definitions","title":"(4) Monitors Definitions","text":"uns.run_simulation(sim, nsteps; extra_runtime_function=monitors, ...)","category":"page"},{"location":"api/flowunsteady-monitor/","page":"(4) Monitors Definitions","title":"(4) Monitors Definitions","text":"compat: Monitor concatenation\nFLOWUnsteady facilitates the concatenation of monitors through the function FLOWUnsteady.concatenate. Using this function, the example above looks like this:monitor_states = uns.generate_monitor_statevariables()\nmonitor_enstrophy = uns.generate_monitor_enstrophy()\n\nallmonitors = [monitor_states, monitor_enstrophy]\n\nmonitors = uns.concatenate(monitors)\n\nuns.run_simulation(sim, nsteps; extra_runtime_function=monitors, ...)","category":"page"},{"location":"api/flowunsteady-monitor/#Monitor-Generators","page":"(4) Monitors Definitions","title":"Monitor Generators","text":"","category":"section"},{"location":"api/flowunsteady-monitor/","page":"(4) Monitors Definitions","title":"(4) Monitors Definitions","text":"The following are functions for generating the monitors that serve most use cases. See the source code of these monitors to get an idea of how to write your own user-defined monitors.","category":"page"},{"location":"api/flowunsteady-monitor/","page":"(4) Monitors Definitions","title":"(4) Monitors Definitions","text":"FLOWUnsteady.generate_monitor_statevariables\nFLOWUnsteady.generate_monitor_wing\nFLOWUnsteady.generate_monitor_rotors\nFLOWUnsteady.generate_monitor_enstrophy\nFLOWUnsteady.generate_monitor_Cd\nFLOWUnsteady.concatenate","category":"page"},{"location":"api/flowunsteady-monitor/#FLOWUnsteady.generate_monitor_statevariables","page":"(4) Monitors Definitions","title":"FLOWUnsteady.generate_monitor_statevariables","text":"generate_monitor_statevariables(; save_path=nothing)\n\nGenerate a monitor plotting the state variables of the vehicle at every time step. The state variables are vehicle velocity, vehicle angular velocity, and vehicle position.\n\nUse save_path to indicate a directory where to save the plots.\n\nHere is an example of this monitor on a vehicle flying a circular path: (Image: image)\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-monitor/#FLOWUnsteady.generate_monitor_wing","page":"(4) Monitors Definitions","title":"FLOWUnsteady.generate_monitor_wing","text":"generate_monitor_wing(wing::Union{vlm.Wing, vlm.WingSystem},\n Vinf::Function, b_ref::Real, ar_ref::Real,\n rho_ref::Real, qinf_ref::Real, nsteps_sim::Int;\n L_dir=[0,0,1], # Direction of lift component\n D_dir=[1,0,0], # Direction of drag component\n calc_aerodynamicforce_fun=FLOWUnsteady.generate_calc_aerodynamicforce())\n\nGenerate a wing monitor computing and plotting the aerodynamic force and wing loading at every time step.\n\nThe aerodynamic force is integrated, decomposed, and reported as overall lift coefficient C_L = fracLfrac12rho u_infty^2 b c and drag coefficient C_D = fracDfrac12rho u_infty^2 b c. The wing loading is reported as the sectional lift and drag coefficients defined as c_ell = fracellfrac12rho u_infty^2 c and c_d = fracdfrac12rho u_infty^2 c, respectively.\n\nThe aerodynamic force is calculated through the function calc_aerodynamicforce_fun, which is a user-defined function. The function can also be automatically generated through, generate_calc_aerodynamicforce which defaults to incluiding the Kutta-Joukowski force, parasitic drag (calculated from a NACA 0012 airfoil polar), and unsteady-circulation force.\n\nb_ref : Reference span length.\nar_ref : Reference aspect ratio, used to calculate the equivalent chord c = fracbmathrmar.\nrho_ref : Reference density.\nqinf_ref : Reference dynamic pressure q_infty = frac12rho u_infty^2.\nnsteps_sim : the number of time steps by the end of the simulation (used for generating the color gradient).\nUse save_path to indicate a directory where to save the plots. If so, it will also generate a CSV file with C_L and C_D.\n\nHere is an example of this monitor: (Image: image)\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-monitor/#FLOWUnsteady.generate_monitor_rotors","page":"(4) Monitors Definitions","title":"FLOWUnsteady.generate_monitor_rotors","text":"generate_monitor_rotors(rotors::Array{vlm.Rotor}, J_ref::Real,\n rho_ref::Real, RPM_ref::Real, nsteps_sim::Int;\n save_path=nothing)\n\nGenerate a rotor monitor plotting the aerodynamic performance and blade loading at every time step.\n\nThe aerodynamic performance consists of thrust coefficient C_T=fracTrho n^2 d^4, torque coefficient C_Q = fracQrho n^2 d^5, and propulsive efficiency eta = fracT u_infty2pi n Q.\n\nJ_ref and rho_ref are the reference advance ratio and air density used for calculating propulsive efficiency and coefficients. The advance ratio used here is defined as J=fracu_inftyn d with n = fracmathrmRPM60.\nRPM_ref is the reference RPM used to estimate the age of the wake.\nnsteps_sim is the number of time steps by the end of the simulation (used for generating the color gradient).\nUse save_path to indicate a directory where to save the plots. If so, it will also generate a CSV file with C_T, C_Q, and eta.\n\n(Image: image)\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-monitor/#FLOWUnsteady.generate_monitor_enstrophy","page":"(4) Monitors Definitions","title":"FLOWUnsteady.generate_monitor_enstrophy","text":"generate_monitor_enstrophy(; save_path=nothing)\n\nGenerate a monitor plotting the global enstrophy of the flow at every time step (computed through the particle field). This is calculated by integrating the local enstrophy defined as ξ = ω⋅ω / 2.\n\nEnstrophy is approximated as 0.5*Σ( Γ𝑝⋅ω(x𝑝) ). This is consistent with Winckelamns' 1995 CTR report, \"Some Progress in LES using the 3-D VPM\".\n\nUse save_path to indicate a directory where to save the plots. If so, it will also generate a CSV file with ξ.\n\nHere is an example of this monitor: (Image: image)\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-monitor/#FLOWUnsteady.generate_monitor_Cd","page":"(4) Monitors Definitions","title":"FLOWUnsteady.generate_monitor_Cd","text":"generate_monitor_Cd(; save_path=nothing)\n\nGenerate a monitor plotting the mean value of the SFS model coefficient C_d across the particle field at every time step. It also plots the ratio of C_d values that were clipped to zero (not included in the mean).\n\nUse save_path to indicate a directory where to save the plots. If so, it will also generate a CSV file with the statistics of C_d (particles whose coefficients have been clipped are ignored).\n\nHere is an example of this monitor: (Image: image)\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-monitor/#FLOWUnsteady.concatenate","page":"(4) Monitors Definitions","title":"FLOWUnsteady.concatenate","text":"concatenate(monitors::Array{Function})\nconcatenate(monitors::NTuple{N, Function})\nconcatenate(monitor1, monitor2, ...)\n\nConcatenates a collection of monitors into a pipeline, returning one monitor of the form\n\nmonitor(args...; optargs...) =\n monitors[1](args...; optargs...) || monitors[2](args...; optargs...) || ...\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-monitor/#Force-Calculators","page":"(4) Monitors Definitions","title":"Force Calculators","text":"","category":"section"},{"location":"api/flowunsteady-monitor/","page":"(4) Monitors Definitions","title":"(4) Monitors Definitions","text":"The following are some possible methods for calculating aerodynamic forces. Generator functions return a function that can be directly passed to FLOWUnsteady.generate_monitor_wing through the keyword argument calc_aerodynamicforce_fun.","category":"page"},{"location":"api/flowunsteady-monitor/","page":"(4) Monitors Definitions","title":"(4) Monitors Definitions","text":"FLOWUnsteady.generate_calc_aerodynamicforce\nFLOWUnsteady.generate_aerodynamicforce_kuttajoukowski\nFLOWUnsteady.generate_aerodynamicforce_parasiticdrag\nFLOWUnsteady.calc_aerodynamicforce_unsteady","category":"page"},{"location":"api/flowunsteady-monitor/#FLOWUnsteady.generate_calc_aerodynamicforce","page":"(4) Monitors Definitions","title":"FLOWUnsteady.generate_calc_aerodynamicforce","text":"generate_calc_aerodynamicforce(; add_parasiticdrag=false,\n add_skinfriction=true,\n airfoilpolar=\"xf-n0012-il-500000-n5.csv\",\n parasiticdrag_args=(),\n )\n\nDefault method for calculating aerodynamic forces.\n\nPass the output of this function to generate_monitor_wing, or use this as an example on how to define your own costumized force calculations.\n\nThis function stitches together the outputs of generate_aerodynamicforce_kuttajoukowski and generate_aerodynamicforce_parasiticdrag, and calc_aerodynamicforce_unsteady. See Alvarez' dissertation, Sec. 6.3.3.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-monitor/#FLOWUnsteady.generate_aerodynamicforce_kuttajoukowski","page":"(4) Monitors Definitions","title":"FLOWUnsteady.generate_aerodynamicforce_kuttajoukowski","text":"generate_aerodynamicforce_kuttajoukowski(KJforce_type::String,\n sigma_vlm_surf, sigma_rotor_surf,\n vlm_vortexsheet,\n vlm_vortexsheet_overlap,\n vlm_vortexsheet_distribution,\n vlm_vortexsheet_sigma_tbv;\n vehicle=nothing\n )\n\nCalculates the aerodynamic force at each element of a VLM system using its current Gamma solution and the Kutta-Joukowski theorem. It saves the force as the field vlm_system.sol[\"Ftot\"]\n\nThis force calculated through the Kutta-Joukowski theorem uses the freestream velocity, kinematic velocity, and wake-induced velocity on each bound vortex. See Alvarez' dissertation, Sec. 6.3.3.\n\nARGUMENTS\n\nvlm_vortexsheet::Bool : If true, the bound vorticity is approximated with and actuator surface model through a vortex sheet. If false, it is approximated with an actuator line model with horseshoe vortex filaments.\nvlm_vortexsheet_overlap::Bool : Target core overlap between particles representing the vortex sheet (if vlm_vortexsheet=true).\nvlm_vortexsheet_distribution::Function : Vorticity distribution in vortex sheet (see g_uniform, g_linear, and g_pressure).\nKJforce_type::String : If vlm_vortexsheet=true, it specifies how to weight the force of each particle in the vortex sheet. If KJforce_type==\"averaged\", the KJ force is a chordwise average of the force experienced by the particles. If KJforce_type==\"weighted\", the KJ force is chordwise weighted by the strength of each particle. If KJforce_type==\"regular\", the vortex sheet is ignored, and the KJ force is calculated from the velocity induced at midpoint between the horseshoe filaments.\nvehicle::VLMVehicle : If vlm_vortexsheet=true, it is expected that the vehicle object is passed through this argument.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-monitor/#FLOWUnsteady.generate_aerodynamicforce_parasiticdrag","page":"(4) Monitors Definitions","title":"FLOWUnsteady.generate_aerodynamicforce_parasiticdrag","text":"generate_aerodynamicforce_parasiticdrag(polar_file::String;\n read_path=FLOWUnsteady.default_database*\"/airfoils\",\n calc_cd_from_cl=false,\n add_skinfriction=true,\n Mach=nothing)\n\nCalculates the parasitic drag along the wing using a lookup airfoil table. It adds this force to the field vlm_system.sol[\"Ftot\"].\n\nThe lookup table is read from the file polar_file under the directory read_path. The parasitic drag includes form drag, skin friction, and wave drag, assuming that each of these components are included in the lookup polar. polar_file can be any polar file downloaded from airfoiltools.com.\n\nTo ignore skin friction drag, use add_skinfriction=false.\n\nThe drag will be calculated from the local effective angle of attack, unless calc_cd_from_cl=true is used, which then will be calculated from the local lift coefficient given by the circulation distribution. cd from cl tends to be more accurate than from AOA, but the method might fail to correlate cd and cl depending on how noise the polar data is.\n\nIf Mach != nothing, it will use a Prandtl-Glauert correction to pre-correct the lookup cl. This will have no effects if calc_cd_from_cl=false.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-monitor/#FLOWUnsteady.calc_aerodynamicforce_unsteady","page":"(4) Monitors Definitions","title":"FLOWUnsteady.calc_aerodynamicforce_unsteady","text":"calc_aerodynamicforce_unsteady(vlm_system::Union{vlm.Wing, vlm.WingSystem},\n prev_vlm_system, pfield, Vinf, dt, rho; t=0.0,\n per_unit_span=false, spandir=[0, 1, 0],\n include_trailingboundvortex=false,\n add_to_Ftot=false\n )\n\nForce from unsteady circulation.\n\nThis force tends to add a lot of numerical noise, which in most cases ends up cancelling out when the loading is time-averaged. Hence, add_to_Ftot=false will calculate the unsteady loading and save it under the field Funs-vector, but it will not be added to the Ftot vector that is used to calculate the wing's overall aerodynamic force.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-monitor/#waketreatmentapi","page":"(4) Monitors Definitions","title":"Wake Treatment","text":"","category":"section"},{"location":"api/flowunsteady-monitor/","page":"(4) Monitors Definitions","title":"(4) Monitors Definitions","text":"Since the full set of state variables is passed to extra_runtime_function, this function can also be used to alter the simulation on the fly. In some circumstances it is desirable to be able to remove or modify particles, which process we call \"wake treatment.\" Wake treatment is often used to reduce computational cost (for instance, by removing particle in regions of the flow that are not of interest), and it can also be used to force numerical stability (for instance, by removing or clipping particles with vortex strengths that grow beyond certain threshold).","category":"page"},{"location":"api/flowunsteady-monitor/","page":"(4) Monitors Definitions","title":"(4) Monitors Definitions","text":"These wake treatment methods can be added into the pipeline of extra_runtime_function as follows:","category":"page"},{"location":"api/flowunsteady-monitor/","page":"(4) Monitors Definitions","title":"(4) Monitors Definitions","text":"import FLOWUnsteady as uns\n\n# Define monitors\nmonitor_states = uns.generate_monitor_statevariables()\nmonitor_enstrophy = uns.generate_monitor_enstrophy()\n\n# Monitor pipeline\nmonitors = uns.concatenate(monitor_states, monitor_enstrophy)\n\n# Define wake treatment\nwake_treatment = uns.remove_particles_sphere(1.0, 1; Xoff=zeros(3))\n\n# Extra runtime function pipeline\nextra_runtime_function = uns.concatenate(monitors, wake_treatment)\n","category":"page"},{"location":"api/flowunsteady-monitor/","page":"(4) Monitors Definitions","title":"(4) Monitors Definitions","text":"Then pass this pipeline to the simulation as","category":"page"},{"location":"api/flowunsteady-monitor/","page":"(4) Monitors Definitions","title":"(4) Monitors Definitions","text":"uns.run_simulation(sim, nsteps; extra_runtime_function=extra_runtime_function, ...)","category":"page"},{"location":"api/flowunsteady-monitor/","page":"(4) Monitors Definitions","title":"(4) Monitors Definitions","text":"Below we list a few generator functions that return common wake treatment methods.","category":"page"},{"location":"api/flowunsteady-monitor/","page":"(4) Monitors Definitions","title":"(4) Monitors Definitions","text":"FLOWUnsteady.remove_particles_sphere\nFLOWUnsteady.remove_particles_box\nFLOWUnsteady.remove_particles_lowstrength\nFLOWUnsteady.remove_particles_strength\nFLOWUnsteady.remove_particles_sigma","category":"page"},{"location":"api/flowunsteady-monitor/#FLOWUnsteady.remove_particles_sphere","page":"(4) Monitors Definitions","title":"FLOWUnsteady.remove_particles_sphere","text":"remove_particles_sphere(Rsphere2, step::Int; Xoff::Vector=zeros(3))\n\nReturns an extra_runtime_function that every step steps removes all particles that are outside of a sphere of radius sqrt(Rsphere2) centered around the vehicle or with an offset Xoff from the center of the vehicle.\n\nUse this wake treatment to avoid unnecesary computation by removing particles that have gone beyond the region of interest.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-monitor/#FLOWUnsteady.remove_particles_box","page":"(4) Monitors Definitions","title":"FLOWUnsteady.remove_particles_box","text":"remove_particles_box(Pmin::Vector, Pmax::Vector, step::Int)\n\nReturns an extra_runtime_function that every step steps removes all particles that are outside of a box of minimum and maximum vertices Pmin and Pmax.\n\nUse this wake treatment to avoid unnecesary computation by removing particles that have gone beyond the region of interest.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-monitor/#FLOWUnsteady.remove_particles_lowstrength","page":"(4) Monitors Definitions","title":"FLOWUnsteady.remove_particles_lowstrength","text":"remove_particles_lowstrength(critGamma2, step)\n\nReturns an extra_runtime_function that removes all particles with a vortex strength magnitude that is smaller than sqrt(critGamma2). Use this wake treatment to avoid unnecesary computation by removing particles that have negligibly-low strength.\n\nstep indicates every how many steps to remove particles.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-monitor/#FLOWUnsteady.remove_particles_strength","page":"(4) Monitors Definitions","title":"FLOWUnsteady.remove_particles_strength","text":"remove_particles_strength(minGamma2, maxGamma2; every_nsteps=1)\n\nReturns an extra_runtime_function that removes all particles with a vortex strength magnitude that is larger than sqrt(maxGamma2) or smaller than sqrt(minGamma2). Use every_nsteps to indicate every how many steps to remove particles.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-monitor/#FLOWUnsteady.remove_particles_sigma","page":"(4) Monitors Definitions","title":"FLOWUnsteady.remove_particles_sigma","text":"remove_particles_sigma(minsigma, maxsigma; every_nsteps=1)\n\nReturns an extra_runtime_function that removes all particles with a smoothing radius that is larger than maxsigma or smaller than minsigma. Use every_nsteps to indicate every how many steps to remove particles.\n\n\n\n\n\n","category":"function"},{"location":"api/flowvpm-relaxation/#Relaxation-Scheme","page":"Relaxation Scheme","title":"Relaxation Scheme","text":"","category":"section"},{"location":"api/flowvpm-relaxation/","page":"Relaxation Scheme","title":"Relaxation Scheme","text":"FLOWUnsteady.vpm.FMM\nFLOWUnsteady.vpm.Relaxation\nFLOWUnsteady.vpm.relax_pedrizzetti\nFLOWUnsteady.vpm.relax_correctedpedrizzetti","category":"page"},{"location":"api/flowvpm-relaxation/#FLOWVPM.FMM","page":"Relaxation Scheme","title":"FLOWVPM.FMM","text":"`FMM(; p::Int=4, ncrit::Int=50, theta::Real=0.4, phi::Real=0.3)`\n\nParameters for FMM solver.\n\nArguments\n\np : Order of multipole expansion (number of terms).\nncrit : Maximum number of particles per leaf.\ntheta : Neighborhood criterion. This criterion defines the distance where the far field starts. The criterion is that if θ*r < R1+R2 the interaction between two cells is resolved through P2P, where r is the distance between cell centers, and R1 and R2 are each cell radius. This means that at θ=1, P2P is done only on cells that have overlap; at θ=0.5, P2P is done on cells that their distance is less than double R1+R2; at θ=0.25, P2P is done on cells that their distance is less than four times R1+R2; at θ=0, P2P is done on cells all cells.\nphi : Regularizing neighborhood criterion. This criterion avoid approximating interactions with the singular-FMM between regularized particles that are sufficiently close to each other across cell boundaries. Used together with the θ-criterion, P2P is performed between two cells if φ < σ/dx, where σ is the average smoothing radius in between all particles in both cells, and dx is the distance between cell boundaries ( dx = r-(R1+R2) ). This means that at φ = 1, P2P is done on cells with boundaries closer than the average smoothing radius; at φ = 0.5, P2P is done on cells closer than two times the smoothing radius; at φ = 0.25, P2P is done on cells closer than four times the smoothing radius.\n\n\n\n\n\n","category":"type"},{"location":"api/flowvpm-relaxation/#FLOWVPM.Relaxation","page":"Relaxation Scheme","title":"FLOWVPM.Relaxation","text":"`Relaxation(relax, nsteps_relax, rlxf)`\n\nDefines a relaxation method implemented in the function relax(rlxf::Real, p::Particle) where rlxf is the relaxation factor between 0 and 1, with 0 == no relaxation, and 1 == full relaxation. The simulation is relaxed every nsteps_relax steps.\n\n\n\n\n\n","category":"type"},{"location":"api/flowvpm-relaxation/#FLOWVPM.relax_pedrizzetti","page":"Relaxation Scheme","title":"FLOWVPM.relax_pedrizzetti","text":"`relax_Pedrizzetti(rlxf::Real, p::Particle)`\n\nRelaxation scheme where the vortex strength is aligned with the local vorticity.\n\n\n\n\n\n","category":"function"},{"location":"api/flowvpm-relaxation/#FLOWVPM.relax_correctedpedrizzetti","page":"Relaxation Scheme","title":"FLOWVPM.relax_correctedpedrizzetti","text":"`relax_correctedPedrizzetti(rlxf::Real, p::Particle)`\n\nRelaxation scheme where the vortex strength is aligned with the local vorticity. This version fixes the error in Pedrizzetti's relaxation that made the strength to continually decrease over time. See notebook 20200921 for derivation.\n\n\n\n\n\n","category":"function"},{"location":"examples/wing-aoasweep/#AOA-Sweep","page":"AOA Sweep","title":"AOA Sweep","text":"","category":"section"},{"location":"examples/wing-aoasweep/","page":"AOA Sweep","title":"AOA Sweep","text":"Using the same vehicle, maneuver, and simulation defined in the previous section, we now run a sweep of the angle of attack.","category":"page"},{"location":"examples/wing-aoasweep/","page":"AOA Sweep","title":"AOA Sweep","text":"#=##############################################################################\n# DESCRIPTION\n AOA sweep on 45° swept-back wing\n=###############################################################################\nimport FLOWUnsteady: cross, dot, norm, plt, @L_str\n\nAOAs = [0, 2.1, 4.2, 6.3, 8.4, 10.5, 12] # (deg) angles of attack\nXac = [0.25*b/ar, 0, 0] # (m) aerodynamic center for moment calculation\n\n# Results are stored in these arrays\nCLs, CDs = [], [] # Lift and drag at each angle of attack\nrolls, pitchs, yaws = [], [], [] # Rolling, pitching, and yawing moment\n\nls, ds = [], [] # Load and drag distributions\nspanposs = [] # Spanwise positions for load distributions\n\n\n# ----------------- AOA SWEEP --------------------------------------------------\nfor AOA in AOAs\n\n println(\"\\n\\n Running AOA = $(AOA) deg\")\n\n # ------------- RUN SIMULATION ----------------\n\n # Freestream function\n Vinf(X, t) = magVinf*[cosd(AOA), 0.0, sind(AOA)]\n\n # Define wing monitor with new reference freestream direction\n Shat = [0, 1, 0] # Spanwise direction\n Dhat = [cosd(AOA), 0.0, sind(AOA)] # Direction of drag\n Lhat = cross(Dhat, Shat) # Direction of lift\n\n # Generate wing monitor\n monitor = uns.generate_monitor_wing(wing, Vinf, b, ar,\n rho, qinf, nsteps;\n calc_aerodynamicforce_fun=calc_aerodynamicforce_fun,\n L_dir=Lhat,\n D_dir=Dhat,\n save_path=nothing,\n disp_plot=false\n )\n\n # Run simulation\n pfield = uns.run_simulation(simulation, nsteps;\n # SIMULATION OPTIONS\n Vinf=Vinf,\n rho=rho,\n # SOLVERS OPTIONS\n p_per_step=p_per_step,\n max_particles=max_particles,\n sigma_vlm_solver=sigma_vlm_solver,\n sigma_vlm_surf=sigma_vlm_surf,\n sigma_rotor_surf=sigma_vlm_surf,\n sigma_vpm_overwrite=sigma_vpm_overwrite,\n shed_starting=shed_starting,\n extra_runtime_function=monitor,\n # OUTPUT OPTIONS\n save_path=nothing,\n v_lvl=1, verbose_nsteps=60\n )\n\n # ------------- POST-PROCESSING ---------------\n\n # Integrate total lift and drag\n L = sum(wing.sol[\"L\"])\n D = sum(wing.sol[\"D\"])\n\n # Lift and drag coefficients\n CL = norm(L) / (qinf*b^2/ar)\n CD = norm(D) / (qinf*b^2/ar)\n\n # Control point of each element\n Xs = [vlm.getControlPoint(wing, i) for i in 1:vlm.get_m(wing)]\n\n # Force of each element\n Fs = wing.sol[\"Ftot\"]\n\n # Integrate the total moment with respect to aerodynamic center\n M = sum( cross(X - Xac, F) for (X, F) in zip(Xs, Fs) )\n\n # Integrated moment decomposed into rolling, pitching, and yawing moments\n lhat = Dhat # Rolling direction\n mhat = Shat # Pitching direction\n nhat = Lhat # Yawing direction\n\n roll = dot(M, lhat)\n pitch = dot(M, mhat)\n yaw = dot(M, nhat)\n\n # Sectional loading (in vector form) at each control point\n fs = wing.sol[\"ftot\"]\n\n # Decompose vectors into lift and drag distribution\n l = [ dot(f, Lhat) for f in fs ]\n d = [ dot(f, Dhat) for f in fs ]\n\n # Span position of each control point\n spanpos = [ dot(X, Shat) / (b/2) for X in Xs ]\n\n # Store results\n push!(CLs, CL)\n push!(CDs, CD)\n\n push!(rolls, roll)\n push!(pitchs, pitch)\n push!(yaws, yaw)\n\n push!(spanposs, spanpos)\n push!(ls, l)\n push!(ds, d)\n\nend\n\n","category":"page"},{"location":"examples/wing-aoasweep/","page":"AOA Sweep","title":"AOA Sweep","text":"\n Run time: ~15 minutes on a Dell Precision 7760 laptop.\n
\n Reduce resolution (n and steps) to speed up simulation without loss of accuracy.\n
\n

","category":"page"},{"location":"examples/wing-aoasweep/","page":"AOA Sweep","title":"AOA Sweep","text":"Check examples/wing/wing_aoasweep.jl to see how to postprocess and plot the results as shown below.","category":"page"},{"location":"examples/wing-aoasweep/","page":"AOA Sweep","title":"AOA Sweep","text":"
\n
Spanwise loading distribution\n \"Pic\n\n

Vehicle lift and drag\n \"Pic\n\n

Pitching moment
\n \"Pic\n
","category":"page"},{"location":"examples/rotorhover-fdom/#rotorfdom","page":"Fluid Domain","title":"Fluid Domain","text":"","category":"section"},{"location":"examples/rotorhover-fdom/","page":"Fluid Domain","title":"Fluid Domain","text":"
\n \"Pic\n
","category":"page"},{"location":"examples/rotorhover-fdom/","page":"Fluid Domain","title":"Fluid Domain","text":"
","category":"page"},{"location":"examples/rotorhover-fdom/","page":"Fluid Domain","title":"Fluid Domain","text":"The full fluid domain can be computed in a postprocessing step from the particle field. This is possible because the particle field is a radial basis function that constructs the vorticity field, and the velocity field can be recovered from vorticity through the Biot-Savart law.","category":"page"},{"location":"examples/rotorhover-fdom/","page":"Fluid Domain","title":"Fluid Domain","text":"Here we show how to use uns.computefluiddomain to read a simulation and process it to generate its fluid domain.","category":"page"},{"location":"examples/rotorhover-fdom/","page":"Fluid Domain","title":"Fluid Domain","text":"#=##############################################################################\n Computes the fluid domain of DJI 9443 simulation using a volumetric domain.\n This is done probing the velocity and vorticity that the particle field\n induces at each node of a Cartesian grids.\n\n NOTE: The fluid domain generated here does not include the freestream\n velocity, which needs to be added manually inside ParaView (if any).\n=###############################################################################\n\nimport FLOWUnsteady as uns\nimport FLOWUnsteady: vpm, gt, dot, norm\n\n# --------------- INPUTS AND OUTPUTS -------------------------------------------\n# INPUT OPTIONS\nsimulation_name = \"rotorhover-example-midhigh00\" # Simulation to read\nread_path = \"/home/edoalvar/simulationdata202330/\"*simulation_name # Where to read simulation from\n\npfield_prefix = \"singlerotor_pfield\" # Prefix of particle field files to read\nstaticpfield_prefix = \"singlerotor_staticpfield\" # Prefix of static particle field files to read\n\nnums = [719] # Time steps to process\n\n# OUTPUT OPTIONS\nsave_path = joinpath(read_path, \"..\", simulation_name*\"-fdom\") # Where to save fluid domain\noutput_prefix = \"singlerotor\" # Prefix of output files\nprompt = true # Whether to prompt the user\nverbose = true # Enable verbose\nv_lvl = 0 # Verbose indentation level\n\n\n# -------------- PARAMETERS ----------------------------------------------------\n# Simulation information\nR = 0.12 # (m) rotor radius\nAOA = 0.0 # (deg) angle of attack or incidence angle\n\n# Grid\nL = R # (m) reference length\ndx, dy, dz = L/50, L/50, L/50 # (m) cell size in each direction\nPmin = L*[-0.50, -1.25, -1.25] # (m) minimum bounds\nPmax = L*[ 2.00, 1.25, 1.25] # (m) maximum bounds\nNDIVS = ceil.(Int, (Pmax .- Pmin)./[dx, dy, dz]) # Number of cells in each direction\nnnodes = prod(NDIVS .+ 1) # Total number of nodes\n\nOaxis = gt.rotation_matrix2(0, 0, AOA) # Orientation of grid\n\n# VPM settings\nmaxparticles = Int(1.0e6 + nnodes) # Maximum number of particles\nfmm = vpm.FMM(; p=4, ncrit=50, theta=0.4, phi=0.3) # FMM parameters (decrease phi to reduce FMM noise)\nscale_sigma = 1.00 # Shrink smoothing radii by this factor\nf_sigma = 0.5 # Smoothing of node particles as sigma = f_sigma*meansigma\n\nmaxsigma = L/10 # Particles larger than this get shrunk to this size (this helps speed up computation)\nmaxmagGamma = Inf # Any vortex strengths larger than this get clipped to this value\n\ninclude_staticparticles = true # Whether to include the static particles embedded in the solid surfaces\n\nother_file_prefs = include_staticparticles ? [staticpfield_prefix] : []\nother_read_paths = [read_path for i in 1:length(other_file_prefs)]\n\nif verbose\n println(\"\\t\"^(v_lvl)*\"Fluid domain grid\")\n println(\"\\t\"^(v_lvl)*\"NDIVS =\\t$(NDIVS)\")\n println(\"\\t\"^(v_lvl)*\"Number of nodes =\\t$(nnodes)\")\nend\n\n# --------------- PROCESSING SETUP ---------------------------------------------\nif verbose\n println(\"\\t\"^(v_lvl)*\"Getting ready to process $(read_path)\")\n println(\"\\t\"^(v_lvl)*\"Results will be saved under $(save_path)\")\nend\n\n# Create save path\nif save_path != read_path\n gt.create_path(save_path, prompt)\nend\n\n\n# Generate function to process the field clipping particle sizes\npreprocessing_pfield = uns.generate_preprocessing_fluiddomain_pfield(maxsigma, maxmagGamma;\n verbose=verbose, v_lvl=v_lvl+1)\n\n# --------------- PROCESS SIMULATION -------------------------------------------\n\nnthreads = 1 # Total number of threads\nnthread = 1 # Number of this thread\ndnum = floor(Int, length(nums)/nthreads) # Number of time steps per thread\nthreaded_nums = [view(nums, dnum*i+1:(i\n Run time: ~1 minute on a Dell Precision 7760 laptop.\n\n\n

","category":"page"},{"location":"examples/rotorhover-fdom/","page":"Fluid Domain","title":"Fluid Domain","text":"
\n Mid-High Fidelity\n
\n \"Pic\n \"Pic\n \"Pic\n


\n High Fidelity\n
\n \"Pic\n \"Pic\n \"Pic\n
","category":"page"},{"location":"examples/rotorhover-fdom/","page":"Fluid Domain","title":"Fluid Domain","text":"info: ParaView Visualization\nThe .pvsm files visualizing the fluid domain as shown above are available in the following linksHigh fidelity: LINK\nMid-high fidelity: LINK(right click → save as...).To open in ParaView: File → Load State → (select .pvsm file) then select \"Search files under specified directory\" and point it to the folder where the simulation was saved.","category":"page"},{"location":"api/flowunsteady-vehicle-components/#Generating-components","page":"Generating components","title":"Generating components","text":"","category":"section"},{"location":"api/flowunsteady-vehicle-components/#Rotor","page":"Generating components","title":"Rotor","text":"","category":"section"},{"location":"api/flowunsteady-vehicle-components/","page":"Generating components","title":"Generating components","text":"FLOWunsteady uses a database of airfoil and rotor geometries to automate the generation of rotors. A prepopulated database is found in the directory under FLOWUnsteady.default_database. Alternatively, users can define their own database with custom rotors and airfoils.","category":"page"},{"location":"api/flowunsteady-vehicle-components/","page":"Generating components","title":"Generating components","text":"The following slides describe the structure of the database, using the DJI 9443 rotor as an example:","category":"page"},{"location":"api/flowunsteady-vehicle-components/","page":"Generating components","title":"Generating components","text":"
\n\n
","category":"page"},{"location":"api/flowunsteady-vehicle-components/","page":"Generating components","title":"Generating components","text":"Rotors can then be generated calling any of following functions:","category":"page"},{"location":"api/flowunsteady-vehicle-components/","page":"Generating components","title":"Generating components","text":"FLOWUnsteady.generate_rotor(::String)\nFLOWUnsteady.generate_rotor(::Real, ::Real, ::Int, ::String)\nFLOWUnsteady.generate_rotor(::Real, ::Real, ::Int, ::Array{Float64,2},\n ::Array{Float64,2}, ::Array{Float64,2},\n ::Array{Float64,2},\n ::Array{Tuple{Float64,Array{Float64, 2},String},1})\nFLOWUnsteady.vlm.rotate","category":"page"},{"location":"api/flowunsteady-vehicle-components/#FLOWUnsteady.generate_rotor-Tuple{String}","page":"Generating components","title":"FLOWUnsteady.generate_rotor","text":"generate_rotor(rotor_file::String;\n data_path=FLOWUnsteady.default_database, optargs...)\n\nGenerates a FLOWVLM.Rotor reading the full rotor geometry from the rotor file rotor_file found in the database data_path.\n\n\n\n\n\n","category":"method"},{"location":"api/flowunsteady-vehicle-components/#FLOWUnsteady.generate_rotor-Tuple{Real, Real, Int64, String}","page":"Generating components","title":"FLOWUnsteady.generate_rotor","text":"generate_rotor(Rtip, Rhub, B, blade_file::String;\n data_path=FLOWUnsteady.default_database, optargs...)\n\nGenerates a FLOWVLM.Rotor reading the blade geometry from the blade file blade_file found in the database data_path.\n\n\n\n\n\n","category":"method"},{"location":"api/flowunsteady-vehicle-components/#FLOWUnsteady.generate_rotor-Tuple{Real, Real, Int64, Matrix{Float64}, Matrix{Float64}, Matrix{Float64}, Matrix{Float64}, Vector{Tuple{Float64, Matrix{Float64}, String}}}","page":"Generating components","title":"FLOWUnsteady.generate_rotor","text":"generate_rotor(Rtip, Rhub, B,\n chorddist, twistdist, sweepdist, heightdist,\n airfoil_contours;\n\n # MORE ROTOR PARAMETERS\n pitch=0.0,\n CW=true,\n\n # DISCRETIZATION SETTINGS\n n=10, blade_r=1.0,\n rediscretize_airfoils=true,\n rfl_n_lower=15, rfl_n_upper=15,\n spline_k=5, spline_s=0.001, spline_bc=\"extrapolate\",\n\n # AIRFOIL PROCESSING\n data_path=FLOWUnsteady.default_database,\n read_polar=vlm.ap.read_polar,\n xfoil=false,\n alphas=[i for i in -20:1.0:20], ncrit=9,\n ReD=5e5, altReD=nothing, Matip=0.0,\n\n # OUTPUT OPTIONS\n verbose=false, verbose_xfoil=false, v_lvl=1,\n plot_disc=true, save_polars=nothing)\n\nGenerates a FLOWVLM.Rotor from direct inputs.\n\nARGUMENTS\n\nRtip::Real : (m) rotor radius (from centerline to blade tip)\nRhub::Real : (m) hub radius (from centerline to blade root)\nB::Int : Number of blades\nchorddist::Matrix : Chord distribution (chorddist[:, 1] = r/R, chorddist[:, 2] = c/R\ntwistdist::Matrix : Twist distribution (twistdist[:, 1] = r/R, twistdist[:, 2] = degs\nsweepdist::Matrix : LE sweep distribution (sweepdist[:, 1] = r/R, sweepdist[:, 2] = x/R\nheightdist::Matrix : LE height distribution (heightdist[:, 1] = r/R, heightdist[:, 2] = z/R\nairfoil_contours::Array{ Tuple{Float64, Array{Float64, 2}, String} } : Airfoil contours along the span. It must follow the pattern (pos, contour, polarfile) = airfoil_contours[i], where pos = (r-Rhub)/(Rtip-Rhub) is the spanwise position (with root=0, tip=1), contour is the airfoil profile (contour[:, 1] = x/c, contour[:, 2] = y/c), and polarfile is any file from airfoiltools.com with the airfoil lookup table (airfoil polar).\n\nThe function allows airfoil_contours::Array{ Tuple{Float64, String, String} }, following the pattern (pos, contourfile, polarfile) = airfoil_contours[i] where contourfile is a CSV file with columns x/c and y/c.\n\nKEYWORD ARGUMENTS\n\nExtra rotor parameters\n\npitch::Real : (deg) rotor collective pitch\nCW::Bool : Whether the rotor rotates in the clockwise (true) or counter-clockwise (false)\n\nDiscretization\n\nn::Int : Number of blade elements per blade.\nr::Real : Spacing between elements at the tip, divided by the spacing between elements at the root.\nspline_k::Int, spline_s::Real, spline_bc::String : To discretize the blade, the blade distributions are splined and re-discretize into n elements. These splines are done through the Dierckx package, with spline_k the order of the spline, spline_s the smoothing parameter, and spline_bc the boundary condition.\nrediscretize_airfoils : If true, it will spline the airfoil contours and re-discretize them. It will discretize the lower side of the contour into rfl_n_lower panels, and the upper side into rfl_n_upper panels. This is necessary unless all the airfoil contours already have the same number of points.\n\nAirfoil processing\n\ndata_path::String : Path to database where to read the airfoil polars from.\nread_polar::Function : Function used for parsing the airfoil files. Use vlm.ap.read_polar for files that are direct outputs from XFOIL. Use vlm.ap.read_polar2 for CSV files.\nxfoil::Bool : If true, the polar files will be ignored and XFOIL will be used to generate the polars instead. This will be done sweeping AOA as in alphas (in degrees) and ncrit for inflow turbulence parameter.\nReD::Real, Matip::Real, altReD::Tuple{Real, Real, Real}\n\nReD is the diameter Reynolds number based on rotational speed calculated as ReD = (omega*R)*(2*R)/nu, and Matip is the rotational+freestream Mach number at the tip. These number will be used for running XFOIL to compute airfoil polars, and will be ignored if airfoil polars are prescribed.\n\nGive it altReD = (RPM, J, nu), and it will calculate the chord-based Reynolds accounting for the effective velocity at every station, ignoring ReD (this is more accurate, but not needed).\n\nNOTE: If Matip is different than zero while running XFOIL, you must deactive compressibility corrections in run_simulation by using sound_spd=nothing. Otherwise, compressibility effects will be double accounted for.\n\nOutputs\n\nverbose::Bool : Whether to verbose while generating the rotor\nverbose_xfoil::Bool : Whether to verbose while running XFOIL\nv_lvl::Int : Indentation level for printing the verbose\nplot_disc : If true, it will plot the discretization process of the blade, which is useful for verification and debugging. It will also plot the airfoil polars.\nsave_polars::String : Give it a path to a directory and it will save the polars plot in that directory\n\n\n\n\n\n","category":"method"},{"location":"api/flowunsteady-vehicle-components/#FLOWVLM.rotate","page":"Generating components","title":"FLOWVLM.rotate","text":"rotate(rotor::Rotor, degs::Real)\n\nRotates the rotor by degs degrees in the direction of rotation (rotor.CW).\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-vehicle-components/#VLM-Wing","page":"Generating components","title":"VLM Wing","text":"","category":"section"},{"location":"api/flowunsteady-vehicle-components/","page":"Generating components","title":"Generating components","text":"FLOWUnsteady.vlm.simpleWing\nFLOWUnsteady.vlm.complexWing","category":"page"},{"location":"api/flowunsteady-vehicle-components/#FLOWVLM.simpleWing","page":"Generating components","title":"FLOWVLM.simpleWing","text":"simpleWing(b, ar, tr, twist, lambda, gamma; twist_tip=twist, n=20, r=2.0)\n\nGenerates a simple wing with constant twist, sweep, dihedral, and taper ratio.\n\nArguments\n\nb : (float) span\nar : (float) aspect ratio (span / tip chord)\ntr : (float) taper ratio (tip chord / root chord)\ntwist : (float) twist of the root in degrees\nlambda : (float) sweep in degrees\ngamma : (float) dihedral in degrees\ntwist_tip : (float) twist of the tip (if different than root)\nn : (int) number of horseshoes per semi-span\nr : (float) horseshoes' expansion ratio\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-vehicle-components/#FLOWVLM.complexWing","page":"Generating components","title":"FLOWVLM.complexWing","text":"complexWing(b, AR, tr, n, pos, twist, sweep, dihed; symmetric=true)\n\nGenerates a wing with an abritrary distribution of twist, sweep, dihedral, and chord length.\n\nArguments\n\nb::Float64 : Span\nAR::Float64 : Reference aspect ratio (span / tip chord)\nn::Int64 : Number of horseshoes per semi-span\npos::Array{Float64,1} : Position of stations along the semi-span\nclen::Array{Float64,1} : Chord length at each station (normalized by tip chord)\ntwist::Array{Float64,1} : (deg) twist at each station\nsweep::Array{Float64,1} : (deg) sweep between each station\ndihed::Array{Float64,1} : (deg) dihedral between each station\n\nOptional Arguments\n\nsymmetric::Bool=true : If false, generates only a half-span\nchordalign::Float64=0.0 : Indicate position along chord length to align chords. Give it 0 for alignment about leading edge, 0.25 for alignment about quarter chord, and 1.0 for alignment about trailing edge.\n\nExample\n\n# Wing dimensions\nb = 1.0 # (m) span\nAR = 12.0 # Span over tip chord\nn = 50 # Horseshoes per semi-span\n\n# Define chord, twist, sweep, and dihedral distributions\npos = [0, 0.25, 0.75, 1] # Position of stations along semi-span\nclen = [2.0, 1.5, 1.5, 1] # Normalized chord length at each station\ntwist = [0.0, 0.0, -2.0, -4.0] # (deg) twist at each station\nsweep = [10.0, 15.0, 35.0] # (deg) sweep between stations\ndihed = [2.0, 5.0, 7.5] # (deg) dihedral between stations\n\n# Generate the wing\nwing = vlm.complexWing(b, AR, n, pos, clen, twist, sweep, dihed)\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-vehicle-components/#FLOWVLM-Systems","page":"Generating components","title":"FLOWVLM Systems","text":"","category":"section"},{"location":"api/flowunsteady-vehicle-components/","page":"Generating components","title":"Generating components","text":"FLOWUnsteady.vlm.WingSystem\n\nFLOWUnsteady.vlm.addwing\nFLOWUnsteady.vlm.get_wing\nFLOWUnsteady.vlm.setcoordsystem\nFLOWUnsteady.vlm.get_m\nFLOWUnsteady.vlm.get_mBlade","category":"page"},{"location":"api/flowunsteady-vehicle-components/#FLOWVLM.WingSystem","page":"Generating components","title":"FLOWVLM.WingSystem","text":"WingSystem(wings::Array{Union{Wing, WingSystem}}, wing_names::Array{String})\n\nInitiates a system of wings. All methods applicable to a Wing object are applicable to a WingSystem. When solved, it will calculate the interaction between wings.\n\n\n\n\n\n","category":"type"},{"location":"api/flowunsteady-vehicle-components/#FLOWVLM.addwing","page":"Generating components","title":"FLOWVLM.addwing","text":"addwing(self::WingSystem, wing_name::String, wing::Union{Wing, Rotor})\n\nAdds a wing (or rotor) to the system. The local reference frame of the wing then is then in relation to the local reference frame of the System.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-vehicle-components/#FLOWVLM.get_wing","page":"Generating components","title":"FLOWVLM.get_wing","text":"get_wing(self::WingSystem, wing_name::String)\n\nReturns the wing of name wing_name.\n\n\n\n\n\nget_wing(self::WingSystem, wing_i::Int)\n\nReturns the i-th wing.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-vehicle-components/#FLOWVLM.setcoordsystem","page":"Generating components","title":"FLOWVLM.setcoordsystem","text":"setcoordsystem(wing::Wing, O::Vector, Oaxis::Matrix)\n\nRedefines the local coordinate system of the wing, where O is the new origin and Oaxis is the matrix of unit vectors\n\n\n\n\n\nsetcoordsystem(system::WingSystem, O::Vector, Oaxis::Matrix; wings=String[])\n\nRedefines the local coordinate system of the system, where O is the new origin and Oaxis is the matrix of unit vectors. It transforms the coordinates of all wings in the system accordingly.\n\nTo change the local coordinate system of a specific wing relative to the system's coordinate system, give the name of the wing in an array under argument wings.\n\n\n\n\n\nsetcoordsystem(rotor::Rotor, O::Vector, Oaxis::Matrix; user=false)\n\nRedefines the local coordinate system of the rotor, where O is the new origin and Oaxis is the matrix of unit vectors. If the user is calling this function, give user=true, otherwise it will not do the automatic translation to blade coordinate system.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-vehicle-components/#FLOWVLM.get_m","page":"Generating components","title":"FLOWVLM.get_m","text":"get_m(wing::Wing)\n\nReturns the number of horseshoes in the wing\n\n\n\n\n\nget_m(system::WingSystem)\n\nReturns the total number of horseshoes in the system\n\n\n\n\n\nget_m(rotor::Rotor)\n\nReturns the total number of horseshoes in the rotor\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-vehicle-components/#FLOWVLM.get_mBlade","page":"Generating components","title":"FLOWVLM.get_mBlade","text":"get_mBlade(rotor::Rotor)\n\nReturns the number of horseshoes per blade\n\n\n\n\n\n","category":"function"},{"location":"api/flowvpm-viscous/#Viscous-Scheme","page":"Viscous Scheme","title":"Viscous Scheme","text":"","category":"section"},{"location":"api/flowvpm-viscous/","page":"Viscous Scheme","title":"Viscous Scheme","text":"FLOWUnsteady.vpm.ViscousScheme\nFLOWUnsteady.vpm.Inviscid\nFLOWUnsteady.vpm.CoreSpreading\nFLOWUnsteady.vpm.ParticleStrengthExchange\nFLOWUnsteady.vpm.rbf_conjugategradient","category":"page"},{"location":"api/flowvpm-viscous/#FLOWVPM.ViscousScheme","page":"Viscous Scheme","title":"FLOWVPM.ViscousScheme","text":"`ViscousScheme{R}`\n\nType declaring viscous scheme.\n\nImplementations must have the following properties: * nu::R : Kinematic viscosity.\n\n\n\n\n\n","category":"type"},{"location":"api/flowvpm-viscous/#FLOWVPM.rbf_conjugategradient","page":"Viscous Scheme","title":"FLOWVPM.rbf_conjugategradient","text":"Radial basis function interpolation of Gamma using the conjugate gradient method. This method only works on a particle field with uniform smoothing radius sigma.\n\nSee 20180818 notebook and https://en.wikipedia.org/wiki/Conjugategradientmethod#Theresultingalgorithm\n\n\n\n\n\n","category":"function"},{"location":"examples/vahana-vehicle/#vahanavehicle","page":"Vehicle Definition","title":"Vehicle Definition","text":"","category":"section"},{"location":"examples/vahana-vehicle/","page":"Vehicle Definition","title":"Vehicle Definition","text":"In this example we simulate the eVTOL transition maneuver of a tandem tilt-wing multirotor aircraft. The aircraft configuration resembles the Vahana eVTOL aircraft but with tilt and stacked rotors:","category":"page"},{"location":"examples/vahana-vehicle/","page":"Vehicle Definition","title":"Vehicle Definition","text":"\n \n \n \n \n
\n \"Pic\n
\n
Takeoff and landing
\n
\n \"Pic\n
\n
Cruise
\n
","category":"page"},{"location":"examples/vahana-vehicle/","page":"Vehicle Definition","title":"Vehicle Definition","text":"Due to the complexity of this simulation, each step of the simulation setup is quite involved. Hence, we have broken down each step into a function that can be call when we setup the simulation.","category":"page"},{"location":"examples/vahana-vehicle/","page":"Vehicle Definition","title":"Vehicle Definition","text":"Below is the function that defines the vehicle for the simulation (uns.UVLMVehicle). Along with defining the vehicle geometry, it also defines two tilting systems (a tilting system is a set of components that tilt together) and three rotor systems (a rotor system is a set of rotors with a common RPM). Later in the next section we will define the control inputs for these tilting and rotor systems.","category":"page"},{"location":"examples/vahana-vehicle/","page":"Vehicle Definition","title":"Vehicle Definition","text":"\n \n \n \n \n
\n
\n \"Pic\n
\n
\n
\n \"Pic\n
\n
","category":"page"},{"location":"examples/vahana-vehicle/","page":"Vehicle Definition","title":"Vehicle Definition","text":"\"\"\"\n Generates the geometry of Vahana aircraft\n\"\"\"\nfunction generate_vahana_vehicle(;\n # VEHICLE OPTIONS\n xfoil = true, # Whether to run XFOIL\n n_factor::Int = 1, # Discretization factor\n add_wings = true, # Whether to add the wings\n add_rotors = true, # Whether to add the rotors\n VehicleType = uns.VLMVehicle, # Type of vehicle to generate (uns.QVLMVehicle for quasi-steady solver)\n data_path = uns.def_data_path,# Database path\n # OUTPUT OPTIONS\n run_name = \"vahana\",\n verbose = true,\n v_lvl = 0\n )\n\n ############################################################################\n # PARAMETERS\n ############################################################################\n\n if verbose; println(\"\\t\"^(v_lvl)*\"Defining parameters...\"); end;\n\n # ------------ GEOMETRIC PARAMETERS ------------------------------------\n # Tilt and fixed rotors\n tiltrotor_file = \"VahanaTilt.csv\" # Tilt-rotor file\n R_w = 0.75 # (m) main-wing rotor radius (reference)\n R_tw = R_w # (m) tandem-wing rotor radius (reference)\n CW_w = true # Clockwise rotation of main-wing rotor\n CW_tw = false # Clockwise rotation of tandem-wing rotor\n nr_w = 2 # Number of rotors per side of main wing\n nr_tw = 2 # Number of rotors per side of tandem wing\n pitch = 0.0 # (deg) collective pitch for tiltrotors rotors on main and tandem wings\n main_outtilt = 10 # (deg) Mount main-wing rotors with this out-tilt angle\n tandem_pitchtilt= 10 # (deg) Mount tandem-wing rotors with this alternating pitch-tilt angle\n xoc_offset_main = 0.175 # Axial distance of main-wing rotors from LE, divided by chord\n xoc_offset_tandem = 0.10 # Axial distance of tandem-wing rotors from LE, divided by chord\n soD = 0.1 # Tip-to-tip distance of rotors, divided by diameter\n ReD07 = 1.5e6 # Assumed diameter-based Reynolds number for all rotors at r/R=0.7\n ReD = ReD07/0.7 # Reynolds number at blade tip (for XFOIL)\n n_rotor = 7*n_factor # Number of blade elements per blade\n r_rotor = 1/20 # Geometric expansion between blade elements\n tilt_read_polar = vlm.ap.read_polar # What polar reader to use\n\n # Stacked rotors\n stackedrotor_file = \"VahanaStacked.csv\" # Stacked-rotor file\n stacked = [nr_w, nr_w+1] # Index of main-wing rotors that will be stacked rotors\n stckd_xoc_offset= -1.40 # Axial distance of stacked rotors from LE, divided by chord\n stckd_zoc_offset= 0.10 # Height of stacked rotors above wing, divided by chord\n stckd_zoR_offset= -0.05 # Stacking distance between stacked rotors, divided by R\n stckd_corotating= true # Co-rotating stacked rotors if true, counter-rotating otherwise\n stckd_phase = -10 # (deg) initial phase difference of stacked rotors (index angle)\n stckd_pitch_up = 5.0 # (deg) collective pitch of upper rotor in stack\n stckd_pitch_low = stckd_pitch_up + 7.5 # (deg) collective pitch of lower rotor in stack\n stacked_read_polar = vlm.ap.read_polar2 # What polar reader to use\n\n # Main wing\n b_w = 5.86 # (m) span\n AR_w = 7.4 # Aspect ratio (b/c_tip)\n tr_w = 1.0 # Taper ratio (c_tip/c_root)\n twist_r_w = 14.0 # (deg) twist at root\n twist_t_w = twist_r_w # (deg) twist at tip\n lambda_w = main_outtilt # (deg) sweep\n gamma_w = 5.0 # (deg) dihedral\n md_w = 0.9 # Length of middle section, divided by span\n pivot_w = 1/4 # Pivot point along chord of tilt-wing\n n_w = 24*n_factor # Number of wing elements per side\n r_w = 2.0 # Geometric expansion of wing elements\n\n # Main-wing winglets\n b_wl = b_w/4 # (m) span of winglet from top to bottom\n AR_wl = 3.0 # Aspect ratio (b/c_tip)\n tr_wl = (b_wl/AR_wl)/(b_w/AR_w/tr_w) # Taper ratio (c_tip/c_root)\n twist_r_wl = 2.5 # (deg) twist at root\n twist_t_wl = 0.0 # (deg) twist at tip\n lambda_wl = 40.0 # (deg) sweep\n gamma_wl = 15.0 # (deg) dihedral\n n_wl = 8*n_factor # Number of wing elements per side\n r_wl = 2.0 # Geometric expansion of wing elements\n\n # Tandem wing\n b_tw = b_w*1.0 # (m) span\n AR_tw = 9.5 # Aspect ratio (b/c_tip)\n tr_tw = 1.0 # Taper ratio (c_tip/c_root)\n twist_r_tw = 14.0 # (deg) twist at root\n twist_t_tw = twist_r_tw # (deg) twist at tip\n lambda_tw = 0.0 # (deg) sweep\n gamma_tw = 0.0 # (deg) dihedral\n md_tw = 0.2 # Length of middle section, divided by span\n pivot_tw = pivot_w # Pivot point along chord of tilt-wing\n n_tw = 2*n_w # Number of wing elements per side\n r_tw = r_w # Geometric expansion of wing elements\n\n # Fuselage\n l_f = 5.86 # (m) length\n h_f = 2.81*2/3 # (m) height\n\n # ------------ ASSEMBLY PARAMETERS ------------------------------------\n # Position of wings on fuselage\n h_pos_w = 0.90*h_f # (m) height position of wing\n h_pos_tw = 0.15*h_f # (m) height position of tandem wing\n l_pos_w = 0.95*l_f-b_w/AR_w/tr_w# (m) length position of wing\n l_pos_tw = 0.05*l_f # (m) length position of tandem wing\n\n # Position of rotors along main wing\n d_rotor_w = (1+soD)*(2*R_w) # Distance between rotors\n y_pos_rotor_w = Float64[b_w/2 - i*d_rotor_w for i in 0:nr_w-1] # y-positions\n\n # Position of rotors along tandem wing\n d_rotor_tw = (1+soD)*(2*R_tw) # Distance between rotors on wing\n y_pos_rotor_tw = Float64[b_tw/2 - i*d_rotor_tw for i in 0:nr_tw-1] # y-positions\n\n init_ori = 90.0 # (deg) initial orientation of wings\n init_ori_rotor = 0.0 # (deg) initial orientation of rotors\n init_ori_stackedrotor = 30.0 # (deg) initial orientation of stacked rotors\n\n\n ############################################################################\n # GENERATE COMPONENTS\n ############################################################################\n\n if verbose; println(\"\\t\"^(v_lvl)*\"Generating components...\"); end;\n\n # ------------ ROTORS ------------------------------------------------\n # Generate base rotors (one for each rotation orientation)\n if add_rotors\n\n tiltrotors = vlm.Rotor[] # Tilt rotors\n\n if verbose; println(\"\\t\"^(v_lvl+1)*\"Generating first tilt-rotor...\"); end;\n push!(tiltrotors, uns.generate_rotor(tiltrotor_file; pitch=pitch,\n n=n_rotor, blade_r=r_rotor, CW=!CW_w, ReD=ReD,\n verbose=verbose, v_lvl=v_lvl+2, xfoil=xfoil,\n read_polar=tilt_read_polar,\n data_path=data_path, plot_disc=false))\n\n if verbose; println(\"\\t\"^(v_lvl+1)*\"Generating second tilt-rotor...\"); end;\n push!(tiltrotors, uns.generate_rotor(tiltrotor_file; pitch=pitch,\n n=n_rotor, blade_r=r_rotor, CW=CW_w, ReD=ReD,\n verbose=verbose, v_lvl=v_lvl+2, xfoil=xfoil,\n read_polar=tilt_read_polar,\n data_path=data_path, plot_disc=false))\n\n stackedrotors = vlm.Rotor[] # Upper rotor in stacked rotors\n\n if verbose; println(\"\\t\"^(v_lvl+1)*\"Generating first stacked-rotor...\"); end;\n push!(stackedrotors, uns.generate_rotor(stackedrotor_file; pitch=stckd_pitch_up,\n n=n_rotor, blade_r=r_rotor, CW=!CW_w, ReD=ReD,\n verbose=verbose, v_lvl=v_lvl+2, xfoil=xfoil,\n read_polar=stacked_read_polar,\n data_path=data_path, plot_disc=false))\n\n if verbose; println(\"\\t\"^(v_lvl+1)*\"Generating second stacked-rotor...\"); end;\n push!(stackedrotors, uns.generate_rotor(stackedrotor_file; pitch=stckd_pitch_up,\n n=n_rotor, blade_r=r_rotor, CW=CW_w, ReD=ReD,\n verbose=verbose, v_lvl=v_lvl+2, xfoil=xfoil,\n read_polar=stacked_read_polar,\n data_path=data_path, plot_disc=false))\n\n stackedrotors_low = vlm.Rotor[] # Lower rotor in stacked rotors\n\n if stckd_pitch_up != stckd_pitch_low\n\n if verbose; println(\"\\t\"^(v_lvl+1)*\"Generating first lower-stacked-rotor...\"); end;\n push!(stackedrotors_low, uns.generate_rotor(stackedrotor_file; pitch=stckd_pitch_low,\n n=n_rotor, blade_r=r_rotor, CW=!CW_w, ReD=ReD,\n verbose=verbose, v_lvl=v_lvl+2, xfoil=xfoil,\n read_polar=stacked_read_polar,\n data_path=data_path, plot_disc=false))\n\n if verbose; println(\"\\t\"^(v_lvl+1)*\"Generating second lower-stacked-rotor...\"); end;\n push!(stackedrotors_low, uns.generate_rotor(stackedrotor_file; pitch=stckd_pitch_low,\n n=n_rotor, blade_r=r_rotor, CW=CW_w, ReD=ReD,\n verbose=verbose, v_lvl=v_lvl+2, xfoil=xfoil,\n read_polar=stacked_read_polar,\n data_path=data_path, plot_disc=false))\n\n else\n\n for rotor in stackedrotors\n push!(stackedrotors_low, rotor)\n end\n\n end\n end\n\n\n # ------------ MAIN WING ---------------------------------------------\n # Generate wing\n if verbose; println(\"\\t\"^(v_lvl+1)*\"Generating main wing assembly...\"); end;\n\n # Middle section\n pos_md_w = [0.0, md_w]\n clen_md_w = [1/tr_w, md_w + (1/tr_w)*(1-md_w)]\n twist_md_w = [twist_r_w, twist_r_w + md_w*(twist_t_w-twist_r_w)]\n wing_md = vlm.complexWing(b_w, AR_w, ceil(Int, md_w*n_w), pos_md_w, clen_md_w, twist_md_w,\n lambda_w*ones(1), gamma_w*ones(1);\n symmetric=true, chordalign=0.0,\n _ign1=true)\n\n # Left section\n pos_l_w = [0, -(1-md_w)] # NOTE: Here we define this wing section from right to left\n clen_l_w = [1, clen_md_w[end]]\n twist_l_w = [twist_t_w, twist_md_w[end]]\n wing_L = vlm.complexWing(b_w, AR_w, ceil(Int, (1-md_w)*n_w/2), pos_l_w, clen_l_w,\n twist_l_w, -lambda_w*ones(1), -gamma_w*ones(1);\n symmetric=false, chordalign=0.0,\n _ign1=true)\n\n # Right section\n pos_r_w = [0, (1-md_w)]\n clen_r_w = [clen_md_w[end], 1]\n twist_r_w = [twist_md_w[end], twist_t_w]\n wing_R = vlm.complexWing(b_w, AR_w, ceil(Int, (1-md_w)*n_w/2), pos_r_w, clen_r_w,\n twist_r_w, lambda_w*ones(1), gamma_w*ones(1);\n symmetric=false, chordalign=0.0,\n _ign1=true)\n\n # Translate right and left sections to position\n O_w_R = (md_w*b_w/2)*[0, 1, 0]\n O_w_L = [1 0 0; 0 -1 0; 0 0 1]*O_w_R\n vlm.setcoordsystem(wing_R, O_w_R, Im)\n vlm.setcoordsystem(wing_L, O_w_L, Im)\n\n # Winglets\n winglet_R = vlm.simpleWing(b_wl, AR_wl, tr_wl, twist_r_wl, lambda_wl, gamma_wl;\n twist_tip=twist_t_wl, n=n_wl, r=r_wl)\n\n winglet_L = vlm.simpleWing(b_wl, AR_wl, tr_wl, twist_r_wl, lambda_wl, gamma_wl;\n twist_tip=twist_t_wl, n=n_wl, r=r_wl)\n\n # Translate winglets to position\n O_wl_R = (b_w/2)*[0, 1, 0]\n O_wl_R += ((1-md_w)*b_w/2)*[tan(lambda_w*pi/180), 0, tan(gamma_w*pi/180)]\n O_wl_L = [1 0 0; 0 -1 0; 0 0 1]*O_wl_R\n Oaxis_wl_R = gt.rotation_matrix(0.0, 0.0, 90.0)\n Oaxis_wl_L = gt.rotation_matrix(0.0, 0.0, -90.0)\n vlm.setcoordsystem(winglet_R, O_wl_R, Oaxis_wl_R)\n vlm.setcoordsystem(winglet_L, O_wl_L, Oaxis_wl_L)\n\n # Generate main-wing rotors (from right to left)\n if add_rotors\n\n if verbose; println(\"\\t\"^(v_lvl+2)*\"Generating main-wing rotors...\"); end;\n\n O_rotor_w = [ # Position of each rotor\n (ypos - md_w*b_w/2)*[tan(lambda_w*pi/180), 0, -tan(gamma_w*pi/180)] +\n ypos*[0, 1, 0] +\n [-(i in stacked ? stckd_xoc_offset : xoc_offset_main)*AR_w/b_w, 0, 0] +\n [0, 0, (i in stacked ? stckd_zoc_offset*tan(gamma_w*pi/180) : 0)*AR_w/b_w]\n for (i, ypos) in enumerate(y_pos_rotor_w)]\n\n rotors_w = vlm.Rotor[] # Rotors get stored in these arrays\n rotors_w_stacked_up = vlm.Rotor[]\n rotors_w_stacked_low = vlm.Rotor[]\n\n for i in 1:2*nr_w\n right = i<=nr_w # Indicates which side of the wing\n\n copy_rotor = i in stacked ? stackedrotors[1+i%2] : tiltrotors[1+i%2]\n this_rotor = deepcopy(copy_rotor) # Alternates rotation orientation\n\n this_O = O_rotor_w[ right ? i : nr_w-(i-nr_w-1)] # Chooses position\n this_O = [1 0 0; 0 (-1)^!right 0; 0 0 1]*this_O # Places it in correct side\n this_Oaxis = i in stacked ? gt.rotation_matrix(0.0, 90, 0.0) :\n gt.rotation_matrix((-1)^(i%2==0)*main_outtilt, 0.0, 0.0)\n\n # Place rotor in position\n vlm.setcoordsystem(this_rotor, this_O, this_Oaxis; user=true)\n\n # Rotate rotor to be tip-to-tip with others\n vlm.rotate(this_rotor, (-1)^(!CW_w) * (i in stacked ? init_ori_stackedrotor : init_ori_rotor))\n\n # Add the original polars that are not copied with deepcopy\n this_rotor.airfoils = copy_rotor.airfoils\n this_rotor._polars = copy_rotor._polars\n this_rotor._polarroot = copy_rotor._polarroot\n this_rotor._polartip = copy_rotor._polartip\n\n if !(i in stacked)\n\n push!(rotors_w, this_rotor)\n\n else\n push!(rotors_w_stacked_up, this_rotor)\n\n # Generate lower rotor if this is a stacked rotor\n copy_rotor = stackedrotors_low[ 1+(i+1*!stckd_corotating)%2 ]\n this_rotor = deepcopy(copy_rotor)\n\n # Place rotor in position\n this_O += R_w*[0, 0, stckd_zoR_offset]\n vlm.setcoordsystem(this_rotor, this_O, this_Oaxis; user=true)\n\n # Rotate rotor to be tip-to-tip with others\n vlm.rotate(this_rotor, (-1)^(!CW_w) * (init_ori_stackedrotor+stckd_phase))\n\n # Add the original polars that are not copied with deepcopy\n this_rotor.airfoils = copy_rotor.airfoils\n this_rotor._polars = copy_rotor._polars\n this_rotor._polarroot = copy_rotor._polarroot\n this_rotor._polartip = copy_rotor._polartip\n\n push!(rotors_w_stacked_low, this_rotor)\n end\n end\n end\n\n # Assemble fixed section of the wing (middle section + stacked rotors)\n main_wing_fixed = vlm.WingSystem()\n vlm.addwing(main_wing_fixed, \"WingM\", wing_md)\n\n if add_rotors\n for (i, rotor) in enumerate(rotors_w_stacked_up)\n vlm.addwing(main_wing_fixed, \"StackedRotorUp$i\", rotor)\n end\n for (i, rotor) in enumerate(rotors_w_stacked_low)\n vlm.addwing(main_wing_fixed, \"StackedRotorLow$i\", rotor)\n end\n end\n\n # Assemble wing tip sections\n main_wing_R = vlm.WingSystem()\n vlm.addwing(main_wing_R, \"Tip\", wing_R)\n vlm.addwing(main_wing_R, \"Winglet\", winglet_R)\n\n main_wing_L = vlm.WingSystem()\n vlm.addwing(main_wing_L, \"Tip\", wing_L)\n vlm.addwing(main_wing_L, \"Winglet\", winglet_L)\n\n # Assemble moving sections of the wing\n main_wing_moving = vlm.WingSystem()\n vlm.addwing(main_wing_moving, \"WingR\", main_wing_R)\n vlm.addwing(main_wing_moving, \"WingL\", main_wing_L)\n\n if add_rotors\n for (i, rotor) in enumerate(rotors_w)\n vlm.addwing(main_wing_moving, \"Rotor$i\", rotor)\n end\n end\n\n\n # Align moving and fixed section with their pivot line\n x_off_w = pivot_w*b_w/AR_w # offset to align with pivot line\n O_off_w = [-x_off_w, 0.0, 0.0]\n\n vlm.setcoordsystem(wing_md, O_off_w, Im)\n\n for vlmwing in main_wing_moving.wings\n if typeof(vlmwing)==vlm.Rotor\n vlm.setcoordsystem(vlmwing, vlmwing._wingsystem.O + O_off_w,\n vlmwing._wingsystem.Oaxis; user=false)\n else\n vlm.setcoordsystem(vlmwing, vlmwing.O + O_off_w, vlmwing.Oaxis)\n end\n end\n\n # Place tilting sections at main-wing tip\n O_mv = (md_w*b_w/2)*[tand(lambda_w), 0, tand(gamma_w)]\n\n # Initial rotation of moving sections\n Oaxis_wmv = gt.rotation_matrix(0.0, -init_ori, 0.0)\n vlm.setcoordsystem(main_wing_moving, O_mv, Oaxis_wmv)\n\n # Assemble main wing\n main_wing = vlm.WingSystem()\n vlm.addwing(main_wing, \"Fixed\", main_wing_fixed)\n vlm.addwing(main_wing, \"Moving\", main_wing_moving)\n\n # Position of main wing\n O_w = [l_pos_w + x_off_w, 0, h_pos_w]\n Oaxis_w = gt.rotation_matrix(0.0, 0.0, 0.0)\n vlm.setcoordsystem(main_wing, O_w, Oaxis_w)\n\n # ------------ TANDEM WING -------------------------------------------\n if verbose; println(\"\\t\"^(v_lvl+1)*\"Generating tandem wing assembly...\"); end;\n\n # Generate tandem wing\n twing = vlm.simpleWing(b_tw, AR_tw, tr_tw, twist_r_tw, lambda_tw,\n gamma_tw; twist_tip=twist_t_tw, n=n_tw, r=r_tw)\n\n # Middle section\n pos_md_tw = [-md_tw, 0.0, md_tw]\n clen_md_tw = [md_tw + (1/tr_tw)*(1-md_tw), 1/tr_tw, md_tw + (1/tr_tw)*(1-md_tw)]\n twist_md_tw = [twist_r_tw + md_tw*(twist_t_tw-twist_r_tw),\n twist_r_tw, twist_r_tw + md_tw*(twist_t_tw-twist_r_tw)]\n twing_md = vlm.complexWing(b_tw, AR_tw, ceil(Int, md_tw*n_tw), pos_md_tw,\n clen_md_tw, twist_md_tw,\n lambda_tw*ones(2), gamma_tw*ones(2);\n symmetric=false, chordalign=0.0,\n _ign1=true)\n # Left section\n pos_l_tw = [-1, pos_md_tw[1]]\n clen_l_tw = [1, clen_md_tw[1]]\n twist_l_tw = [twist_t_tw, twist_md_tw[1]]\n twing_L = vlm.complexWing(b_tw, AR_tw, ceil(Int, (1-md_tw)*n_tw/2), pos_l_tw,\n clen_l_tw, twist_l_tw,\n lambda_tw*ones(1), gamma_tw*ones(1);\n symmetric=false, chordalign=0.0,\n _ign1=true)\n # Right section\n pos_r_tw = [pos_md_tw[end], 1]\n clen_r_tw = [clen_md_tw[end], 1]\n twist_r_tw = [twist_md_tw[end], twist_t_tw]\n twing_R = vlm.complexWing(b_tw, AR_tw, ceil(Int, (1-md_tw)*n_tw/2), pos_r_tw,\n clen_r_tw, twist_r_tw,\n lambda_tw*ones(1), gamma_tw*ones(1);\n symmetric=false, chordalign=0.0,\n _ign1=true)\n\n ## Generate tandem-wing rotors (from right to left)\n if add_rotors\n\n if verbose; println(\"\\t\"^(v_lvl+2)*\"Generating tandem-wing rotors...\"); end;\n\n O_rotor_tw = [ ypos*[tan(lambda_tw*pi/180), 1, tan(gamma_tw*pi/180)] +\n [-xoc_offset_tandem*AR_tw/b_tw, 0, 0]\n for ypos in y_pos_rotor_tw]\n\n rotors_tw = vlm.Rotor[]\n\n for i in 1:2*nr_tw\n right = i<=nr_tw # Indicates which side of the wing\n\n copy_rotor = tiltrotors[1+(i+(CW_tw!=CW_w))%2]\n this_rotor = deepcopy(copy_rotor) # Alternates rotation orientation\n\n this_O = O_rotor_tw[ right ? i : nr_tw-(i-nr_tw-1)] # Chooses position\n this_O = [1 0 0; 0 (-1)^!right 0; 0 0 1]*this_O # Places it in correct side\n this_Oaxis = gt.rotation_matrix(0, (-1)^(i%2==0)*(-1)^right*tandem_pitchtilt, 0)\n\n # Place rotor in position\n vlm.setcoordsystem(this_rotor, this_O, this_Oaxis; user=true)\n\n # Rotates rotor to be tip-to-tip with others\n vlm.rotate(this_rotor, (-1)^(!CW_tw) * init_ori_rotor)\n\n # Add the original polars that are not copied with deepcopy\n this_rotor.airfoils = copy_rotor.airfoils\n this_rotor._polars = copy_rotor._polars\n this_rotor._polarroot = copy_rotor._polarroot\n this_rotor._polartip = copy_rotor._polartip\n\n push!(rotors_tw, this_rotor)\n end\n end\n\n # Assemble moving sections of the wing\n tandem_wing_moving = vlm.WingSystem()\n vlm.addwing(tandem_wing_moving, \"WingR\", twing_R)\n vlm.addwing(tandem_wing_moving, \"WingL\", twing_L)\n\n if add_rotors\n for (i, rotor) in enumerate(rotors_tw)\n vlm.addwing(tandem_wing_moving, \"Rotor$i\", rotor)\n end\n end\n\n # Align moving and fixed section with their pivot line\n x_off_tw = pivot_tw*b_tw/AR_tw # offset to align with pivot line\n O_off_tw = [-x_off_tw, 0.0, 0.0]\n\n vlm.setcoordsystem(twing_md, O_off_tw, Im)\n\n for vlmwing in tandem_wing_moving.wings\n if typeof(vlmwing)==vlm.Rotor\n vlm.setcoordsystem(vlmwing, vlmwing._wingsystem.O + O_off_tw,\n vlmwing._wingsystem.Oaxis; user=false)\n else\n vlm.setcoordsystem(vlmwing, vlmwing.O + O_off_tw, vlmwing.Oaxis)\n end\n end\n\n # Initial rotation of moving sections\n Oaxis_twmv = gt.rotation_matrix(0.0, -init_ori, 0.0)\n vlm.setcoordsystem(tandem_wing_moving, zeros(3), Oaxis_twmv)\n\n # Assemble tandem wing\n tandem_wing = vlm.WingSystem()\n vlm.addwing(tandem_wing, \"FixedWing\", twing_md)\n vlm.addwing(tandem_wing, \"Moving\", tandem_wing_moving)\n\n # Position of tandem wing\n O_tw = [l_pos_tw + x_off_tw, 0, h_pos_tw]\n Oaxis_tw = gt.rotation_matrix(0.0, 0.0, 0.0)\n vlm.setcoordsystem(tandem_wing, O_tw, Oaxis_tw)\n\n # ------------ FUSELAGE ----------------------------------------------\n if verbose; println(\"\\t\"^(v_lvl+1)*\"Generating fuselage...\"); end;\n\n # Generate fuselage\n fuselage = generatefuselage_vahana(l_f; ncells=20)\n\n # All grids get stored here\n body = gt.MultiGrid(3)\n gt.addgrid(body, \"Fuselage\", fuselage)\n\n # Generate pylons of stacked rotors\n if add_rotors\n if verbose; println(\"\\t\"^(v_lvl+1)*\"Generating pylons...\"); end;\n\n pylon_pos = 0.70\n pylon_length = stckd_xoc_offset*AR_w/b_w * pylon_pos\n\n for i in stacked\n pylon = generatepylon(pylon_length; ncells=5)\n\n right = i<=nr_w\n this_O = O_rotor_w[ right ? i : nr_w-(i-nr_w-1)] # Chooses position\n this_O = [1 0 0; 0 (-1)^!right 0; 0 0 1]*this_O # Places it in correct side\n this_O += main_wing.O # Translates it with the wing\n # Offsets it according to length\n this_O += [1/3*0.5*pylon_pos, 0, 3*R_w*stckd_zoR_offset]\n rotation = gt.rotation_matrix2(0, 0, 0)\n\n gt.lintransform!(pylon, rotation, this_O)\n\n gt.addgrid(body, \"Pylon$i\", pylon)\n end\n end\n\n\n ############################################################################\n # DEFINE VEHICLE\n ############################################################################\n\n # System of all FLOWVLM objects\n system = vlm.WingSystem()\n vlm.addwing(system, \"MainWing\", main_wing)\n vlm.addwing(system, \"TandemWing\", tandem_wing)\n\n # Tilting systems\n tilting_systems = (main_wing_moving, tandem_wing_moving)\n\n # Rotors grouped by systems with shared RPM control\n if add_rotors\n rotor_systems = (rotors_w, rotors_w_stacked_up, rotors_w_stacked_low, rotors_tw)\n else\n rotor_systems = ()\n end\n\n # System solved through VLM solver\n vlm_system_m = vlm.WingSystem()\n vlm.addwing(vlm_system_m, \"letL\", winglet_L)\n vlm.addwing(vlm_system_m, \"L\", wing_L)\n vlm.addwing(vlm_system_m, \"middle\", wing_md)\n vlm.addwing(vlm_system_m, \"R\", wing_R)\n vlm.addwing(vlm_system_m, \"letR\", winglet_R)\n\n vlm_system_t = vlm.WingSystem()\n vlm.addwing(vlm_system_t, \"L\", twing_L)\n vlm.addwing(vlm_system_t, \"R\", twing_R)\n\n vlm_system = vlm.WingSystem()\n if add_wings\n vlm.addwing(vlm_system, \"MWing\", vlm_system_m)\n vlm.addwing(vlm_system, \"TWing\", vlm_system_t)\n end\n\n # All rotors\n if add_rotors\n rotors = vcat(rotors_w, rotors_w_stacked_up, rotors_w_stacked_low, rotors_tw)\n end\n\n # System that will shed a VPM wake\n wake_system = vlm.WingSystem()\n\n if add_wings\n vlm.addwing(wake_system, \"SolveVLM\", vlm_system)\n end\n\n if add_rotors\n if VehicleType==uns.VLMVehicle\n for (i, rotor) in enumerate(rotors)\n vlm.addwing(wake_system, \"Rotor$i\", rotor)\n end\n else\n # Mute warnings regarding potential colinear vortex filaments. This is\n # needed since the quasi-steady solver will probe induced velocities at the\n # lifting line of the blade\n uns.vlm.VLMSolver._mute_warning(true)\n end\n end\n\n # Visualization grids that are rotated and translated along with the vehicle\n grids = [body]\n\n # Define vehicle\n vehicle = VehicleType( system;\n tilting_systems=tilting_systems,\n rotor_systems=rotor_systems,\n vlm_system=vlm_system,\n wake_system=wake_system,\n grids=grids\n )\n\n return vehicle\nend","category":"page"},{"location":"examples/vahana-vehicle/","page":"Vehicle Definition","title":"Vehicle Definition","text":"info: Full example\nThe function that defines the fuselage is given in the full example under examples/vahana/vahana_vehicle.jl","category":"page"},{"location":"examples/heavingwing/#Heaving-Wing","page":"Heaving Wing","title":"Heaving Wing","text":"","category":"section"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"
\n \n
","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"In this example we extend the simple wing case to create a case of interactional aerodynamics. We will place a straight wing flying in front of the original swept-back wing. The front wing will be moving in a heaving motion, shedding a wake that impinges on the back wing causing an unsteady loading.","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"This simulation exemplify the following features:","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"Defining a uns.VLMVehicle with multiple surfaces, one of them declared as a tilting surface\nDefining the control inputs for a tilting system in uns.KinematicManeuver (in this case, tilting the surface over time in a heaving motion)","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"
","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"#=##############################################################################\n# DESCRIPTION\n Swept-back wing flying in the wake of a tandem wing in heaving motion.\n\n# AUTHORSHIP\n * Author : Eduardo J. Alvarez (edoalvarez.com)\n * Email : Edo.AlvarezR@gmail.com\n * Created : Mar 2023\n * Last updated : Mar 2023\n * License : MIT\n=###############################################################################\n\nimport FLOWUnsteady as uns\nimport FLOWVLM as vlm\n\nrun_name = \"heavingwing-example\" # Name of this simulation\n\nsave_path = run_name # Where to save this simulation\nparaview = true # Whether to visualize with Paraview\n\n\n# ----------------- GEOMETRY PARAMETERS ----------------------------------------\n# Back wing description\nb_back = 2.489 # (m) span length\nar_back = 5.0 # Aspect ratio b/c_tip\ntr_back = 1.0 # Taper ratio c_tip/c_root\ntwist_root_back = 0.0 # (deg) twist at root\ntwist_tip_back = 0.0 # (deg) twist at tip\nlambda_back = 45.0 # (deg) sweep\ngamma_back = 0.0 # (deg) dihedral\n\n# Front wing description\nb_front = 0.75*b_back\nar_front = 5.0\ntr_front = 1.0\ntwist_root_front= 5.0\ntwist_tip_front = 0.0\nlambda_front = 0.0\ngamma_front = 0.0\n\ndx = 0.75*b_back # (m) spacing between back and front wings\n\n# Discretization\nn_back = 50 # Number of spanwise elements per side\nr_back = 2.0 # Geometric expansion of elements\ncentral_back = false # Whether expansion is central\n\nn_front = 40\nr_front = 10.0\ncentral_front = false\n\n# ----------------- SIMULATION PARAMETERS --------------------------------------\n# Vehicle motion\nmagVvehicle = 49.7 # (m/s) vehicle velocity\nAOA = 4.2 # (deg) angle of attack of back wing\nfrequency = 25.0 # (Hz) oscillation frequency in heaving motion\namplitude = 5.0 # (deg) AOA amplitude in heaving motion\n\n# Freestream\nmagVinf = 1e-8 # (m/s) freestream velocity\nrho = 0.93 # (kg/m^3) air density\nqinf = 0.5*rho*magVvehicle^2 # (Pa) static pressure (reference)\n\nVinf(X, t) = t==0 ? magVvehicle*[1,0,0] : magVinf*[1,0,0] # Freestream function\n\n# NOTE: In this simulation we will have the vehicle (the two wings) move while\n# the freestream is zero. However, a zero freestream can cause some\n# numerical instabilities in the solvers. To avoid instabilities, it is\n# recommended giving a full freestream velocity (or the velocity of the\n# vehicle) in the first time step `t=0`, and a negligible small velocity\n# at any other time, as shown above in the definition of `Vinf(X ,t)`.\n\nmagVref = magVvehicle # (m/s) reference velocity (for calculation\n # purposes since freestream is zero)\n\n# ----------------- SOLVER PARAMETERS ------------------------------------------\n# Time parameters\nwakelength = 4.0*b_back # (m) length of wake to be resolved\nttot = wakelength/magVref # (s) total simulation time\nnsteps = 200 # Number of time steps\n\n# VLM and VPM parameters\np_per_step = 2 # Number of particle sheds per time step\n\nsigma_vlm_solver= -1 # VLM-on-VLM smoothing radius (deactivated with <0)\nsigma_vlm_surf = 0.05*b_back # VLM-on-VPM smoothing radius\nlambda_vpm = 2.0 # VPM core overlap\n # VPM smoothing radius\nsigma_vpm_overwrite = lambda_vpm * magVref * (ttot/nsteps)/p_per_step\n\nshed_starting = true # Whether to shed starting vortex\nvlm_rlx = 0.7 # VLM relaxation\n\n\n# ----------------- 1) VEHICLE DEFINITION --------------------------------------\nprintln(\"Generating geometry...\")\n\n# Generate back wing\nbackwing = vlm.simpleWing(b_back, ar_back, tr_back, twist_root_back,\n lambda_back, gamma_back; twist_tip=twist_tip_back,\n n=n_back, r=r_back, central=central_back);\n\n# Pitch back wing to its angle of attack\nO = [0.0, 0.0, 0.0] # New position\nOaxis = uns.gt.rotation_matrix2(0.0, -AOA, 0.0) # New orientation\nvlm.setcoordsystem(backwing, O, Oaxis)\n\n# Generate front wing\nfrontwing = vlm.simpleWing(b_front, ar_front, tr_front, twist_root_front,\n lambda_front, gamma_front; twist_tip=twist_tip_front,\n n=n_front, r=r_front, central=central_front);\n\n# Move wing to the front\nO = [-dx, 0.0, 0.0] # New position\nOaxis = uns.gt.rotation_matrix2(0.0, 0.0, 0.0) # New orientation\nvlm.setcoordsystem(frontwing, O, Oaxis)\n\n\nprintln(\"Generating vehicle...\")\n\n# Places the front wing into its own system that will be heaving\nheavingsystem = vlm.WingSystem() # Tilting system\nvlm.addwing(heavingsystem, \"FrontWing\", frontwing)\n\n# Generate vehicle\nsystem = vlm.WingSystem() # System of all FLOWVLM objects\nvlm.addwing(system, \"BackWing\", backwing)\nvlm.addwing(system, \"Heaving\", heavingsystem)\n\ntilting_systems = (heavingsystem, ); # Tilting systems\n\nvlm_system = system; # System solved through VLM solver\nwake_system = system; # System that will shed a VPM wake\n\nvehicle = uns.VLMVehicle( system;\n tilting_systems=tilting_systems,\n vlm_system=vlm_system,\n wake_system=wake_system\n );\n\n# NOTE: Through the `tilting_systems` keyword argument to `uns.VLMVehicle` we\n# have declared that the front wing will be tilting throughout the\n# simulation, acting as a control surface. We will later declare the\n# control inputs to this tilting surface when we define the\n# `uns.KinematicManeuver`\n\n\n# ------------- 2) MANEUVER DEFINITION -----------------------------------------\n\n# Non-dimensional translational velocity of vehicle over time\nVvehicle(t) = [-1, 0, 0] # <---- Vehicle is traveling in the -x direction\n\n# Angle of the vehicle over time\nanglevehicle(t) = zeros(3)\n\n# Control inputs\nangle_frontwing(t) = [0, amplitude*sin(2*pi*frequency * t*ttot), 0] # Tilt angle of front wing\n\nangle = (angle_frontwing, ) # Angle of each tilting system\nRPM = () # RPM of each rotor system (none)\n\nmaneuver = uns.KinematicManeuver(angle, RPM, Vvehicle, anglevehicle)\n\n# NOTE: `FLOWUnsteady.KinematicManeuver` defines a maneuver with prescribed\n# kinematics. `Vvehicle` defines the velocity of the vehicle (a vector)\n# over time. `anglevehicle` defines the attitude of the vehicle over time.\n# `angle` defines the tilting angle of each tilting system over time.\n# `RPM` defines the RPM of each rotor system over time.\n# Each of these functions receives a nondimensional time `t`, which is the\n# simulation time normalized by the total time `ttot`, from 0 to\n# 1, beginning to end of simulation. They all return a nondimensional\n# output that is then scaled by either a reference velocity (`Vref`) or\n# a reference RPM (`RPMref`). Defining the kinematics and controls of the\n# maneuver in this way allows the user to have more control over how fast\n# to perform the maneuver, since the total time, reference velocity and\n# RPM are then defined in the simulation parameters shown below.\n ","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"At this point we can verify that we have correctly defined the control inputs of the maneuver calling FLOWUnsteady.plot_maneuver as follows:","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"uns.plot_maneuver(maneuver)","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"
\n \"Pic\n
\n
","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"Here we confirm that the angle of the tilting surface along the y-axis of the vehicle (pitch) will change sinusoidally with amplitude 5^circ, as expected. This function also plots the kinematics of the vehicle, which in this case are rather uneventful (straight line).","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"Now we continue defining the simulation:","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"# ------------- 3) SIMULATION DEFINITION ---------------------------------------\n\nVref = magVvehicle # Reference velocity to scale maneuver by\nRPMref = 0.0 # Reference RPM to scale maneuver by\nVinit = Vref*Vvehicle(0) # Initial vehicle velocity\nWinit = pi/180*(anglevehicle(1e-6) - anglevehicle(0))/(1e-6*ttot) # Initial angular velocity\n\n # Maximum number of particles\nmax_particles = (nsteps+1)*(vlm.get_m(vehicle.vlm_system)*(p_per_step+1) + p_per_step)\n\nsimulation = uns.Simulation(vehicle, maneuver, Vref, RPMref, ttot;\n Vinit=Vinit, Winit=Winit);\n\n\n\n\n# ------------- 4) MONITORS DEFINITIONS ----------------------------------------\n\nfigs, figaxs = [], [] # Figures generated by monitors\n\n# Generate function that computes aerodynamic forces\ncalc_aerodynamicforce_fun = uns.generate_calc_aerodynamicforce(;\n add_parasiticdrag=true,\n add_skinfriction=true,\n airfoilpolar=\"xf-rae101-il-1000000.csv\"\n )\n\nL_dir(t) = [0, 0, 1] # Direction of lift\nD_dir(t) = [1, 0, 0] # Direction of drag\n\n# Generate back wing monitor\nmonitor_backwing = uns.generate_monitor_wing(backwing, Vinf, b_back, ar_back,\n rho, qinf, nsteps;\n calc_aerodynamicforce_fun=calc_aerodynamicforce_fun,\n L_dir=L_dir,\n D_dir=D_dir,\n out_figs=figs,\n out_figaxs=figaxs,\n save_path=save_path,\n run_name=run_name*\"-backwing\",\n title_lbl=\"Back Wing\",\n figname=\"back-wing monitor\",\n )\n\n# Generate front wing monitor\nmonitor_frontwing = uns.generate_monitor_wing(frontwing, Vinf, b_front, ar_front,\n rho, qinf, nsteps;\n calc_aerodynamicforce_fun=calc_aerodynamicforce_fun,\n L_dir=L_dir,\n D_dir=D_dir,\n out_figs=figs,\n out_figaxs=figaxs,\n save_path=save_path,\n run_name=run_name*\"-frontwing\",\n title_lbl=\"Front Wing\",\n figname=\"front-wing monitor\",\n )\n\nmonitors = uns.concatenate(monitor_backwing, monitor_frontwing)\n\n\n# ------------- 5) RUN SIMULATION ----------------------------------------------\nprintln(\"Running simulation...\")\n\nuns.run_simulation(simulation, nsteps;\n # ----- SIMULATION OPTIONS -------------\n Vinf=Vinf,\n rho=rho,\n # ----- SOLVERS OPTIONS ----------------\n p_per_step=p_per_step,\n max_particles=max_particles,\n sigma_vlm_solver=sigma_vlm_solver,\n sigma_vlm_surf=sigma_vlm_surf,\n sigma_rotor_surf=sigma_vlm_surf,\n sigma_vpm_overwrite=sigma_vpm_overwrite,\n vlm_rlx=vlm_rlx,\n shed_starting=shed_starting,\n extra_runtime_function=monitors,\n # ----- OUTPUT OPTIONS ------------------\n save_path=save_path,\n run_name=run_name,\n );\n\n\n\n\n# ----------------- 6) VISUALIZATION -------------------------------------------\nif paraview\n println(\"Calling Paraview...\")\n\n # Files to open in Paraview\n files = joinpath(save_path, run_name*\"_BackWing_vlm...vtk;\")\n files *= run_name*\"_Heaving_FrontWing_vlm...vtk;\"\n files *= run_name*\"_pfield...xmf;\"\n\n # Call Paraview\n run(`paraview --data=$(files)`)\n\nend\n\n","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"\n Run time: ~10 minutes on a Dell Precision 7760 laptop.\n
\n Reduce resolution (`n` and `nsteps`) to speed up simulation without loss of accuracy.\n
\n

","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"As the simulation runs, you will see the monitors (shown below) plotting the lift and drag coefficients over time along with the loading distribution.","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"
\n \"Pic\n
\n
\n \"Pic\n
\n
","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"(red = beginning,\nblue = end)","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"In these monitors, we clearly see the fluctuation of C_L and C_D over time due to the heaving motion (front wing) and the wake impingement (back wing). The plots of loading distribution seem very convoluted since the loading fluctuates over time, and all the time steps are super imposed in the monitor.","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"To more clearly see what the loading distribution is doing, it is insightful to plot the loading as an animation as shown below.","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"
\n \"Vid\n
\n
","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"info: Animations\nCheck the full example under examples/heavingwing/ to see how to postprocess the simulation and generate this animation.","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"info: Quasi-steady solver\nFLOWUnsteady also provides a quasi-steady solver for low-fidelity simulations that replaces the particle field with rigid semi-infinite wakes. The quasi-steady solver is invoked by simply changing the line that defines the vehicle fromvehicle = uns.VLMVehicle(...)tovehicle = uns.QVLMVehicle(...)(yes, it is only one character of a difference)Use the keyword argument save_horseshoes = false in uns.run_simulation to visualize the semi-infinite rigid wake. The quasi-steady simulation looks like this:","category":"page"},{"location":"examples/heavingwing/","page":"Heaving Wing","title":"Heaving Wing","text":"

\n \"Vid\"\n

","category":"page"},{"location":"examples/blownwing-aero/#blownwingaero","page":"Aerodynamic Solution","title":"Aerodynamic Solution","text":"","category":"section"},{"location":"examples/blownwing-aero/","page":"Aerodynamic Solution","title":"Aerodynamic Solution","text":"
\n \n
","category":"page"},{"location":"examples/blownwing-aero/","page":"Aerodynamic Solution","title":"Aerodynamic Solution","text":"#=##############################################################################\n# DESCRIPTION\n Simulation of swept-back wing with twin props mounted mid span blowing on\n the wing.\n\n# AUTHORSHIP\n * Author : Eduardo J. Alvarez (edoalvarez.com)\n * Email : Edo.AlvarezR@gmail.com\n * Created : Apr 2023\n * Last updated : Apr 2023\n * License : MIT\n=###############################################################################\n\n\nimport FLOWUnsteady as uns\nimport FLOWVLM as vlm\nimport FLOWVPM as vpm\n\nrun_name = \"blownwing-example\" # Name of this simulation\nsave_path = run_name # Where to save this simulation\nparaview = true # Whether to visualize with Paraview\n\n# ----------------- GEOMETRY PARAMETERS ----------------------------------------\n# Wing geometry\nb = 2.489 # (m) span length\nar = 5.0 # Aspect ratio b/c_tip\ntr = 1.0 # Taper ratio c_tip/c_root\ntwist_root = 0.0 # (deg) twist at root\ntwist_tip = 0.0 # (deg) twist at tip\nlambda = 45.0 # (deg) sweep\ngamma = 0.0 # (deg) dihedral\n\n# Rotor geometry\nR = 0.075*b # (m) rotor radius\nRhub = 0.075*R # (m) hub radius\nB = 2 # Number of blades\nblade_file = \"apc10x7_blade.csv\" # Blade geometry\ndata_path = uns.def_data_path # Path to rotor database\npitch = 5.0 # (deg) collective pitch of blades\nxfoil = true # Whether to run XFOIL\nncrit = 9 # Turbulence criterion for XFOIL\n\n# Vehicle assembly\nAOAwing = 4.2 # (deg) wing angle of attack\nspanpos = [-0.5, 0.5] # Semi-span position of each rotor, 2*y/b\nxpos = [-0.5, -0.5] # x-position of rotors relative to LE, x/c\nzpos = [0.0, 0.0] # z-position of rotors relative to LE, z/c\nCWs = [false, true] # Clockwise rotation for each rotor\nnrotors = length(spanpos) # Number of rotors\n\n# Discretization\nn_wing = 50 # Number of spanwise elements per side\nr_wing = 2.0 # Geometric expansion of elements\nn_rotor = 15 # Number of blade elements per blade\nr_rotor = 1/10 # Geometric expansion of elements\n\n# Check that we declared all the inputs that we need for each rotor\n@assert length(spanpos)==length(xpos)==length(zpos)==length(CWs) \"\"*\n \"Invalid rotor inputs! Check that spanpos, xpos, zpos, and CWs have the same length\"\n\n# ----------------- SIMULATION PARAMETERS --------------------------------------\n# Vehicle motion\nmagVvehicle = 49.7 # (m/s) vehicle velocity\nAOA = 0.0 # (deg) vehicle angle of attack\n\n# Freestream\nmagVinf = 1e-8 # (m/s) freestream velocity\nrho = 0.93 # (kg/m^3) air density\nmu = 1.85508e-5 # (kg/ms) air dynamic viscosity\nspeedofsound = 342.35 # (m/s) speed of sound\nmagVref = sqrt(magVinf^2 + magVvehicle^2) # (m/s) reference velocity\nqinf = 0.5*rho*magVref^2 # (Pa) reference static pressure\n\nVinf(X, t) = t==0 ? magVvehicle*[1,0,0] : magVinf*[1,0,0] # Freestream function\n\n# Rotor operation\nJ = 0.9 # Advance ratio Vref/(nD)\nRPM = 60*magVref/(J*2*R) # RPM\n\nRec = rho * magVref * (b/ar) / mu # Chord-based wing Reynolds number\nReD = 2*pi*RPM/60*R * rho/mu * 2*R # Diameter-based rotor Reynolds number\nMatip = 2*pi*RPM/60 * R / speedofsound # Tip Mach number\n\nprintln(\"\"\"\n Vref: $(round(magVref, digits=1)) m/s\n RPM: $(RPM)\n Matip: $(round(Matip, digits=3))\n ReD: $(round(ReD, digits=0))\n Rec: $(round(Rec, digits=0))\n\"\"\")\n\n# ----------------- SOLVER PARAMETERS ------------------------------------------\n\n# Aerodynamic solver\nVehicleType = uns.UVLMVehicle # Unsteady solver\n# VehicleType = uns.QVLMVehicle # Quasi-steady solver\nconst_solution = VehicleType==uns.QVLMVehicle # Whether to assume that the\n # solution is constant or not\n# Time parameters\nnrevs = 15 # Number of revolutions in simulation\nnsteps_per_rev = 36 # Time steps per revolution\nnsteps = const_solution ? 2 : nrevs*nsteps_per_rev # Number of time steps\nttot = nsteps/nsteps_per_rev / (RPM/60) # (s) total simulation time\n\n# VPM particle shedding\np_per_step = 4 # Sheds per time step\nshed_starting = true # Whether to shed starting vortex\nshed_unsteady = true # Whether to shed vorticity from unsteady loading\nunsteady_shedcrit = 0.001 # Shed unsteady loading whenever circulation\n # fluctuates by more than this ratio\nmax_particles = nrotors*((2*n_rotor+1)*B)*nsteps*p_per_step + 1 # Maximum number of particles\nmax_particles += (nsteps+1)*(2*n_wing*(p_per_step+1) + p_per_step)\n\n# Regularization\nsigma_vlm_surf = b/100 # VLM-on-VPM smoothing radius\nsigma_rotor_surf= R/50 # Rotor-on-VPM smoothing radius\nlambda_vpm = 2.125 # VPM core overlap\n # VPM smoothing radius\nsigma_vpm_overwrite = lambda_vpm * 2*pi*R/(nsteps_per_rev*p_per_step)\nsigmafactor_vpmonvlm= 1 # Shrink particles by this factor when\n # calculating VPM-on-VLM/Rotor induced velocities\n\n# Rotor solver\nvlm_rlx = 0.5 # VLM relaxation <-- this also applied to rotors\nhubtiploss_correction = vlm.hubtiploss_nocorrection # Hub and tip correction\n\n# VPM solver\nvpm_integration = vpm.rungekutta3 # VPM temporal integration scheme\n# vpm_integration = vpm.euler\n\nvpm_viscous = vpm.Inviscid() # VPM viscous diffusion scheme\n# vpm_viscous = vpm.CoreSpreading(-1, -1, vpm.zeta_fmm; beta=100.0, itmax=20, tol=1e-1)\n\nvpm_SFS = vpm.SFS_none # VPM LES subfilter-scale model\n# vpm_SFS = vpm.DynamicSFS(vpm.Estr_fmm, vpm.pseudo3level_positive;\n# alpha=0.999, maxC=1.0,\n# clippings=[vpm.clipping_backscatter])\n\nif VehicleType == uns.QVLMVehicle\n # Mute warnings regarding potential colinear vortex filaments. This is\n # needed since the quasi-steady solver will probe induced velocities at the\n # lifting line of the blade\n uns.vlm.VLMSolver._mute_warning(true)\nend\n\nprintln(\"\"\"\n Resolving wake for $(round(ttot*magVref/b, digits=1)) span distances\n\"\"\")\n\n# ----------------- 1) VEHICLE DEFINITION --------------------------------------\n\n# -------- Generate components\nprintln(\"Generating geometry...\")\n\n# Generate wing\nwing = vlm.simpleWing(b, ar, tr, twist_root, lambda, gamma;\n twist_tip=twist_tip, n=n_wing, r=r_wing);\n\n# Pitch wing to its angle of attack\nO = [0.0, 0.0, 0.0] # New position\nOaxis = uns.gt.rotation_matrix2(0, -AOAwing, 0) # New orientation\nvlm.setcoordsystem(wing, O, Oaxis)\n\n# Generate rotors\nrotors = vlm.Rotor[]\nfor ri in 1:nrotors\n\n # Generate rotor\n rotor = uns.generate_rotor(R, Rhub, B, blade_file;\n pitch=pitch,\n n=n_rotor, CW=CWs[ri], blade_r=r_rotor,\n altReD=[RPM, J, mu/rho],\n xfoil=xfoil,\n ncrit=ncrit,\n data_path=data_path,\n verbose=true,\n verbose_xfoil=false,\n plot_disc=false\n );\n\n # Determine position along wing LE\n y = spanpos[ri]*b/2\n x = abs(y)*tand(lambda) + xpos[ri]*b/ar\n z = abs(y)*tand(gamma) + zpos[ri]*b/ar\n\n # Account for angle of attack of wing\n nrm = sqrt(x^2 + z^2)\n x = nrm*cosd(AOAwing)\n z = -nrm*sind(AOAwing)\n\n # Translate rotor to its position along wing\n O = [x, y, z] # New position\n Oaxis = uns.gt.rotation_matrix2(0, 0, 180) # New orientation\n vlm.setcoordsystem(rotor, O, Oaxis)\n\n push!(rotors, rotor)\nend\n\n\n# -------- Generate vehicle\nprintln(\"Generating vehicle...\")\n\n# System of all FLOWVLM objects\nsystem = vlm.WingSystem()\n\nvlm.addwing(system, \"Wing\", wing)\n\nfor (ri, rotor) in enumerate(rotors)\n vlm.addwing(system, \"Rotor$(ri)\", rotor)\nend\n\n# System solved through VLM solver\nvlm_system = vlm.WingSystem()\nvlm.addwing(vlm_system, \"Wing\", wing)\n\n# Systems of rotors\nrotor_systems = (rotors, );\n\n# System that will shed a VPM wake\nwake_system = vlm.WingSystem() # System that will shed a VPM wake\nvlm.addwing(wake_system, \"Wing\", wing)\n # NOTE: Do NOT include rotor when using the quasi-steady solver\nif VehicleType != uns.QVLMVehicle\n for (ri, rotor) in enumerate(rotors)\n vlm.addwing(wake_system, \"Rotor$(ri)\", rotor)\n end\nend\n\n# Pitch vehicle to its angle of attack\nO = [0.0, 0.0, 0.0] # New position\nOaxis = uns.gt.rotation_matrix2(0, -AOA, 0) # New orientation\nvlm.setcoordsystem(system, O, Oaxis)\n\nvehicle = VehicleType( system;\n vlm_system=vlm_system,\n rotor_systems=rotor_systems,\n wake_system=wake_system\n );\n\n\n# ------------- 2) MANEUVER DEFINITION -----------------------------------------\n# Non-dimensional translational velocity of vehicle over time\nVvehicle(t) = [-1, 0, 0] # <---- Vehicle is traveling in the -x direction\n\n# Angle of the vehicle over time\nanglevehicle(t) = zeros(3)\n\n# RPM control input over time (RPM over `RPMref`)\nRPMcontrol(t) = 1.0\n\nangles = () # Angle of each tilting system (none)\nRPMs = (RPMcontrol, ) # RPM of each rotor system\n\nmaneuver = uns.KinematicManeuver(angles, RPMs, Vvehicle, anglevehicle)\n\n\n# ------------- 3) SIMULATION DEFINITION ---------------------------------------\n\nVref = magVvehicle # Reference velocity to scale maneuver by\nRPMref = RPM # Reference RPM to scale maneuver by\nVinit = Vref*Vvehicle(0) # Initial vehicle velocity\nWinit = pi/180*(anglevehicle(1e-6) - anglevehicle(0))/(1e-6*ttot) # Initial angular velocity\n\nsimulation = uns.Simulation(vehicle, maneuver, Vref, RPMref, ttot;\n Vinit=Vinit, Winit=Winit);\n\n# ------------- 4) MONITORS DEFINITIONS ----------------------------------------\n\n# Generate function that computes wing aerodynamic forces\ncalc_aerodynamicforce_fun = uns.generate_calc_aerodynamicforce(;\n add_parasiticdrag=true,\n add_skinfriction=true,\n airfoilpolar=\"xf-rae101-il-1000000.csv\"\n )\n\nL_dir(t) = [0, 0, 1] # Direction of lift\nD_dir(t) = [1, 0, 0] # Direction of drag\n\n# Generate wing monitor\nmonitor_wing = uns.generate_monitor_wing(wing, Vinf, b, ar,\n rho, qinf, nsteps;\n calc_aerodynamicforce_fun=calc_aerodynamicforce_fun,\n L_dir=L_dir,\n D_dir=D_dir,\n save_path=save_path,\n run_name=run_name*\"-wing\",\n figname=\"wing monitor\",\n )\n\n# Generate rotors monitor\nmonitor_rotors = uns.generate_monitor_rotors(rotors, J, rho, RPM, nsteps;\n t_scale=RPM/60, # Scaling factor for time in plots\n t_lbl=\"Revolutions\", # Label for time axis\n save_path=save_path,\n run_name=run_name*\"-rotors\",\n figname=\"rotors monitor\",\n )\n# Concatenate monitors\nmonitors = uns.concatenate(monitor_wing, monitor_rotors)\n\n\n# ------------- 5) RUN SIMULATION ----------------------------------------------\nprintln(\"Running simulation...\")\n\n\n# Run simulation\nuns.run_simulation(simulation, nsteps;\n # ----- SIMULATION OPTIONS -------------\n Vinf=Vinf,\n rho=rho, mu=mu, sound_spd=speedofsound,\n # ----- SOLVERS OPTIONS ----------------\n p_per_step=p_per_step,\n max_particles=max_particles,\n vpm_integration=vpm_integration,\n vpm_viscous=vpm_viscous,\n vpm_SFS=vpm_SFS,\n sigma_vlm_surf=sigma_vlm_surf,\n sigma_rotor_surf=sigma_rotor_surf,\n sigma_vpm_overwrite=sigma_vpm_overwrite,\n sigmafactor_vpmonvlm=sigmafactor_vpmonvlm,\n vlm_rlx=vlm_rlx,\n hubtiploss_correction=hubtiploss_correction,\n shed_starting=shed_starting,\n shed_unsteady=shed_unsteady,\n unsteady_shedcrit=unsteady_shedcrit,\n extra_runtime_function=monitors,\n # ----- OUTPUT OPTIONS ------------------\n save_path=save_path,\n run_name=run_name,\n save_wopwopin=true, # <--- Generates input files for PSU-WOPWOP noise analysis\n );\n\n\n\n\n# ----------------- 6) VISUALIZATION -------------------------------------------\nif paraview\n println(\"Calling Paraview...\")\n\n # Files to open in Paraview\n files = joinpath(save_path, run_name*\"_pfield...xmf;\")\n for ri in 1:nrotors\n for bi in 1:B\n global files *= run_name*\"_Rotor$(ri)_Blade$(bi)_loft...vtk;\"\n end\n end\n files *= run_name*\"_Wing_vlm...vtk;\"\n\n # Call Paraview\n run(`paraview --data=$(files)`)\n\nend\n\n","category":"page"},{"location":"examples/blownwing-aero/","page":"Aerodynamic Solution","title":"Aerodynamic Solution","text":"\n Run time: ~60 minutes on a 16-core AMD EPYC 7302 processor.
\n
\n

","category":"page"},{"location":"examples/blownwing-aero/","page":"Aerodynamic Solution","title":"Aerodynamic Solution","text":"
\n \"Pic\n
\n
\n \"Pic\n
\n
","category":"page"},{"location":"examples/blownwing-aero/","page":"Aerodynamic Solution","title":"Aerodynamic Solution","text":"(red = beginning,\nblue = end)","category":"page"},{"location":"examples/blownwing-aero/","page":"Aerodynamic Solution","title":"Aerodynamic Solution","text":"
\n \"Vid\n
\n
","category":"page"},{"location":"examples/blownwing-aero/","page":"Aerodynamic Solution","title":"Aerodynamic Solution","text":"info: Unsteady Loading Animation\nCheck the full example under examples/blownwing/ to see how to postprocess the simulation and generate this animation.","category":"page"},{"location":"examples/propeller-quasisteady/#Quasi-Steady-Solver","page":"Quasi-Steady Solver","title":"Quasi-Steady Solver","text":"","category":"section"},{"location":"examples/propeller-quasisteady/","page":"Quasi-Steady Solver","title":"Quasi-Steady Solver","text":"While unsteady simulations are resolved using the reformulated VPM, FLOWUnsteady also provides a quasi-steady solver for low-fidelity simulations. The quasi-steady solver replaces the particle field with semi-infinite rigid wakes in wings and blade-element momentum theory in rotors.","category":"page"},{"location":"examples/propeller-quasisteady/","page":"Quasi-Steady Solver","title":"Quasi-Steady Solver","text":"The quasi-steady solver is invoked by simply changing the line","category":"page"},{"location":"examples/propeller-quasisteady/","page":"Quasi-Steady Solver","title":"Quasi-Steady Solver","text":"VehicleType = uns.UVLMVehicle","category":"page"},{"location":"examples/propeller-quasisteady/","page":"Quasi-Steady Solver","title":"Quasi-Steady Solver","text":"to","category":"page"},{"location":"examples/propeller-quasisteady/","page":"Quasi-Steady Solver","title":"Quasi-Steady Solver","text":"VehicleType = uns.QVLMVehicle","category":"page"},{"location":"examples/propeller-quasisteady/","page":"Quasi-Steady Solver","title":"Quasi-Steady Solver","text":"in the previous sections. The results of the quasi-steady solver are shown below, predicted through blade-element momentum theory.","category":"page"},{"location":"examples/propeller-quasisteady/","page":"Quasi-Steady Solver","title":"Quasi-Steady Solver","text":"
\n \"Pic\n
","category":"page"},{"location":"examples/rotorhover-quasisteady/#Quasi-Steady-Solver","page":"Quasi-Steady Solver","title":"Quasi-Steady Solver","text":"","category":"section"},{"location":"examples/rotorhover-quasisteady/","page":"Quasi-Steady Solver","title":"Quasi-Steady Solver","text":"The aerodynamic and aeroacoustic analysis can also be performed using the quasi-steady solver (which uses BEMT for the aerodynamic solution), by simply changing the following parameter in the aero solution:","category":"page"},{"location":"examples/rotorhover-quasisteady/","page":"Quasi-Steady Solver","title":"Quasi-Steady Solver","text":"VehicleType = uns.QVLMVehicle\nn = 50 # <---- For some reason PSU-WOPWOP breaks with less blade elements","category":"page"},{"location":"examples/rotorhover-quasisteady/","page":"Quasi-Steady Solver","title":"Quasi-Steady Solver","text":"and this parameter when calling PSU-WOPWOP:","category":"page"},{"location":"examples/rotorhover-quasisteady/","page":"Quasi-Steady Solver","title":"Quasi-Steady Solver","text":"const_solution = true","category":"page"},{"location":"examples/vahana-monitor/#vahanamonitor","page":"Monitors Definitions","title":"Monitors Definitions","text":"","category":"section"},{"location":"examples/vahana-monitor/","page":"Monitors Definitions","title":"Monitors Definitions","text":"Here we define the monitors of the simulation and concatenate them all.","category":"page"},{"location":"examples/vahana-monitor/","page":"Monitors Definitions","title":"Monitors Definitions","text":"\"\"\"\n Generates the monitors of Vahana eVTOL simulation\n\"\"\"\nfunction generate_monitor_vahana(vehicle, rho, RPMref, nsteps, save_path, Vinf;\n add_wings=true,\n wingmonitor_optargs=[])\n\n # Collect all monitors here\n monitors = []\n\n # -------------------- WING MONITORS ---------------------------------------\n # Reference parameters for calculating coefficients\n # NOTE: make b, ar, and qinf equals to 1.0 to obtain dimensional force\n b_ref, ar_ref = 1.0, 1.0\n qinf = 1.0\n Jref = 1.0\n\n # Force axis labels\n CL_lbl = \"Lift (N)\"\n CD_lbl = \"Drag (N)\"\n\n # Directions of force components\n L_dir = [0, 0, 1]\n D_dir = [-1, 0, 0]\n\n # Generate function that computes wing aerodynamic forces\n calc_aerodynamicforce_fun = uns.generate_calc_aerodynamicforce(;\n add_parasiticdrag=true,\n add_skinfriction=true,\n airfoilpolar=\"xf-n0012-il-500000-n5.csv\"\n )\n\n if add_wings\n\n # Main wing monitor\n monitor_name = \"wing_main\"\n mainwing_system = vlm.get_wing(vehicle.vlm_system, \"MWing\")\n mainwing_monitor = uns.generate_monitor_wing(mainwing_system, Vinf, b_ref, ar_ref,\n rho, qinf, nsteps;\n calc_aerodynamicforce_fun=calc_aerodynamicforce_fun,\n save_path=save_path,\n run_name=monitor_name,\n figname=monitor_name,\n CL_lbl=CL_lbl,\n CD_lbl=CD_lbl,\n L_dir=L_dir,\n D_dir=D_dir,\n wingmonitor_optargs...)\n\n # Tandem wing monitor\n monitor_name = \"wing_tandem\"\n tandemwing_system = vlm.get_wing(vehicle.vlm_system, \"TWing\")\n tandemwing_monitor = uns.generate_monitor_wing(tandemwing_system, Vinf, b_ref, ar_ref,\n rho, qinf, nsteps;\n calc_aerodynamicforce_fun=calc_aerodynamicforce_fun,\n save_path=save_path,\n run_name=monitor_name,\n figname=monitor_name,\n CL_lbl=CL_lbl,\n CD_lbl=CD_lbl,\n L_dir=L_dir,\n D_dir=D_dir,\n wingmonitor_optargs...)\n\n push!(monitors, mainwing_monitor)\n push!(monitors, tandemwing_monitor)\n end\n\n\n\n\n # -------------------- ROTOR MONITORS --------------------------------------\n for (si, rotors) in enumerate(vehicle.rotor_systems)\n\n monitor_name = \"rotorsys$(si)\"\n\n rotors_monitor = uns.generate_monitor_rotors(rotors, Jref, rho, RPMref,\n nsteps;\n save_path=save_path,\n run_name=monitor_name,\n figname=monitor_name,\n save_init_plots=false)\n push!(monitors, rotors_monitor)\n end\n\n\n # -------------------- OTHER MONITORS --------------------------------------\n\n # State-variable monitor\n statevariable_monitor = uns.generate_monitor_statevariables(; save_path=save_path)\n\n # Global enstrophy monitor (numerical stability)\n monitor_enstrophy = uns.generate_monitor_enstrophy(; save_path=save_path)\n\n # Monitor of SFS model coefficient Cd\n monitor_Cd = uns.generate_monitor_Cd(; save_path=save_path)\n\n\n # -------------------- CONCATENATE MONITORS --------------------------------\n return uns.concatenate(statevariable_monitor, monitor_enstrophy, monitor_Cd, monitors...)\nend","category":"page"},{"location":"examples/rotorhover-aero/#rotorhoveraero","page":"Variable Fidelity","title":"Variable Fidelity","text":"","category":"section"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"
\n \n
","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"While propeller simulations tend to be numerically well behaved, a hover case can pose multiple numerical challenges. The rotation of blades in static air drives a strong axial flow that is solely caused by the shedding of tip vortices. This is challenging to simulate since, in the absence of a freestream, the wake quickly becomes fully turbulent and breaks down as tip vortices leapfrog and mix close to the rotor. Thus, a rotor in hover is a good engineering application to showcase the numerical stability and accuracy of FLOWUnsteady.","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"In this example we simulate a DJI rotor in hover, and we use this case to demonstrate some of the advanced features of FLOWUnsteady that make it robust and accurate in resolving turbulent mixing:","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"Subfilter scale (SFS) model of turbulence related to vortex stretching\nHow to monitor the dynamic SFS model coefficient with uns.generate_monitor_Cd\nHow to monitor the global flow enstrophy with uns.generate_monitor_enstrophy and track numerical stability\nDefining a wake treatment procedure to suppress initial hub wake, avoiding hub fountain effects and accelerating convergence\nDefining hub and tip loss corrections","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"Also, in this example you can vary the fidelity of the simulation setting the following parameters:","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"Parameter Mid-low fidelity Mid-high fidelity High fidelity Description\nn 20 50 50 Number of blade elements per blade\nnsteps_per_rev 36 72 360 Time steps per revolution\np_per_step 4 2 2 Particle sheds per time step\nsigma_rotor_surf R/10 R/10 R/80 Rotor-on-VPM smoothing radius\nsigmafactor_vpmonvlm 1.0 1.0 5.5 Expand particles by this factor when calculating VPM-on-VLM/Rotor induced velocities\nshed_starting false false true Whether to shed starting vortex\nsuppress_fountain true true false Whether to suppress hub fountain effect\nvpm_integration vpm.euler RK3^star RK3^star VPM time integration scheme\nvpm_SFS None^dag None^dag Dynamic^ddag VPM LES subfilter-scale model","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"^starRK3: vpm_integration = vpm.rungekutta3\n^dagNone: vpm_SFS = vpm.SFS_none\n^ddagDynamic: vpm_SFS = vpm.SFS_Cd_twolevel_nobackscatter","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"
\n\n\n \n \n \n \n \n
\n \"Pic\n
\n
Mid-Low
70k particles
~7 mins.
\n
\n \"Pic\n
\n
Mid-High
200k particles
~60 mins.
\n
\n \"Pic\n
\n
High
1M particles
~30 hrs.
\n
","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"
","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"#=##############################################################################\n# DESCRIPTION\n Simulation of a DJI 9443 rotor in hover (two-bladed rotor, 9.4 inches\n diameter).\n\n This example replicates the experiment described in Zawodny & Boyd (2016),\n \"Acoustic Characterization and Prediction of Representative,\n Small-scale Rotary-wing Unmanned Aircraft System Components.\"\n\n# AUTHORSHIP\n * Author : Eduardo J. Alvarez (edoalvarez.com)\n * Email : Edo.AlvarezR@gmail.com\n * Created : Mar 2023\n * Last updated : Mar 2023\n * License : MIT\n=###############################################################################\n\n\nimport FLOWUnsteady as uns\nimport FLOWVLM as vlm\nimport FLOWVPM as vpm\n\nrun_name = \"rotorhover-example\" # Name of this simulation\nsave_path = run_name # Where to save this simulation\nparaview = true # Whether to visualize with Paraview\n\n# ----------------- GEOMETRY PARAMETERS ----------------------------------------\n\n# Rotor geometry\nrotor_file = \"DJI9443.csv\" # Rotor geometry\ndata_path = uns.def_data_path # Path to rotor database\npitch = 0.0 # (deg) collective pitch of blades\nCW = false # Clock-wise rotation\nxfoil = false # Whether to run XFOIL\nread_polar = vlm.ap.read_polar2 # What polar reader to use\n\n# NOTE: If `xfoil=true`, XFOIL will be run to generate the airfoil polars used\n# by blade elements before starting the simulation. XFOIL is run\n# on the airfoil contours found in `rotor_file` at the corresponding\n# local Reynolds and Mach numbers along the blade.\n# Alternatively, the user can provide pre-computer airfoil polars using\n# `xfoil=false` and providing the polar files through `rotor_file`.\n# `read_polar` is the function that will be used to parse polar files. Use\n# `vlm.ap.read_polar` for files that are direct outputs of XFOIL (e.g., as\n# downloaded from www.airfoiltools.com). Use `vlm.ap.read_polar2` for CSV\n# files.\n\n# Discretization\nn = 20 # Number of blade elements per blade\nr = 1/10 # Geometric expansion of elements\n\n# NOTE: Here a geometric expansion of 1/10 means that the spacing between the\n# tip elements is 1/10 of the spacing between the hub elements. Refine the\n# discretization towards the blade tip like this in order to better\n# resolve the tip vortex.\n\n# Read radius of this rotor and number of blades\nR, B = uns.read_rotor(rotor_file; data_path=data_path)[[1,3]]\n\n# ----------------- SIMULATION PARAMETERS --------------------------------------\n\n# Operating conditions\nRPM = 5400 # RPM\nJ = 0.0001 # Advance ratio Vinf/(nD)\nAOA = 0 # (deg) Angle of attack (incidence angle)\n\nrho = 1.071778 # (kg/m^3) air density\nmu = 1.85508e-5 # (kg/ms) air dynamic viscosity\nspeedofsound = 342.35 # (m/s) speed of sound\n\n# NOTE: For cases with zero freestream velocity, it is recommended that a\n# negligible small velocity is used instead of zero in order to avoid\n# potential numerical instabilities (hence, J here is negligible small\n# instead of zero)\n\nmagVinf = J*RPM/60*(2*R)\nVinf(X, t) = magVinf*[cos(AOA*pi/180), sin(AOA*pi/180), 0] # (m/s) freestream velocity vector\n\nReD = 2*pi*RPM/60*R * rho/mu * 2*R # Diameter-based Reynolds number\nMatip = 2*pi*RPM/60 * R / speedofsound # Tip Mach number\n\nprintln(\"\"\"\n RPM: $(RPM)\n Vinf: $(Vinf(zeros(3), 0)) m/s\n Matip: $(round(Matip, digits=3))\n ReD: $(round(ReD, digits=0))\n\"\"\")\n\n# ----------------- SOLVER PARAMETERS ------------------------------------------\n\n# Aerodynamic solver\nVehicleType = uns.UVLMVehicle # Unsteady solver\n# VehicleType = uns.QVLMVehicle # Quasi-steady solver\nconst_solution = VehicleType==uns.QVLMVehicle # Whether to assume that the\n # solution is constant or not\n# Time parameters\nnrevs = 10 # Number of revolutions in simulation\nnsteps_per_rev = 36 # Time steps per revolution\nnsteps = const_solution ? 2 : nrevs*nsteps_per_rev # Number of time steps\nttot = nsteps/nsteps_per_rev / (RPM/60) # (s) total simulation time\n\n# VPM particle shedding\np_per_step = 4 # Sheds per time step\nshed_starting = false # Whether to shed starting vortex\nshed_unsteady = true # Whether to shed vorticity from unsteady loading\nunsteady_shedcrit = 0.001 # Shed unsteady loading whenever circulation\n # fluctuates by more than this ratio\nmax_particles = ((2*n+1)*B)*nsteps*p_per_step + 1 # Maximum number of particles\n\n# Regularization\nsigma_rotor_surf= R/10 # Rotor-on-VPM smoothing radius\nlambda_vpm = 2.125 # VPM core overlap\n # VPM smoothing radius\nsigma_vpm_overwrite = lambda_vpm * 2*pi*R/(nsteps_per_rev*p_per_step)\nsigmafactor_vpmonvlm= 1 # Shrink particles by this factor when\n # calculating VPM-on-VLM/Rotor induced velocities\n\n# Rotor solver\nvlm_rlx = 0.5 # VLM relaxation <-- this also applied to rotors\nhubtiploss_correction = ((0.4, 5, 0.1, 0.05), (2, 1, 0.25, 0.05)) # Hub and tip correction\n\n# VPM solver\nvpm_integration = vpm.euler # VPM temporal integration scheme\n# vpm_integration = vpm.rungekutta3\n\nvpm_viscous = vpm.Inviscid() # VPM viscous diffusion scheme\n# vpm_viscous = vpm.CoreSpreading(-1, -1, vpm.zeta_fmm; beta=100.0, itmax=20, tol=1e-1)\n\nvpm_SFS = vpm.SFS_none # VPM LES subfilter-scale model\n# vpm_SFS = vpm.SFS_Cd_twolevel_nobackscatter\n# vpm_SFS = vpm.SFS_Cd_threelevel_nobackscatter\n# vpm_SFS = vpm.DynamicSFS(vpm.Estr_fmm, vpm.pseudo3level_positive;\n# alpha=0.999, maxC=1.0,\n# clippings=[vpm.clipping_backscatter])\n# vpm_SFS = vpm.DynamicSFS(vpm.Estr_fmm, vpm.pseudo3level_positive;\n# alpha=0.999, rlxf=0.005, minC=0, maxC=1\n# clippings=[vpm.clipping_backscatter],\n# controls=[vpm.control_sigmasensor],\n# )\n\n# NOTE: In most practical situations, open rotors operate at a Reynolds number\n# high enough that viscous diffusion in the wake is actually negligible.\n# Hence, it does not make much of a difference whether we run the\n# simulation with viscous diffusion enabled or not. On the other hand,\n# such high Reynolds numbers mean that the wake quickly becomes turbulent\n# and it is crucial to use a subfilter-scale (SFS) model to accurately\n# capture the turbulent decay of the wake (turbulent diffusion).\n\nif VehicleType == uns.QVLMVehicle\n # Mute warnings regarding potential colinear vortex filaments. This is\n # needed since the quasi-steady solver will probe induced velocities at the\n # lifting line of the blade\n uns.vlm.VLMSolver._mute_warning(true)\nend\n\n\n\n# ----------------- WAKE TREATMENT ---------------------------------------------\n# NOTE: It is known in the CFD community that rotor simulations with an\n# impulsive RPM start (*i.e.*, 0 to RPM in the first time step, as opposed\n# to gradually ramping up the RPM) leads to the hub \"fountain effect\",\n# with the root wake reversing the flow near the hub.\n# The fountain eventually goes away as the wake develops, but this happens\n# very slowly, which delays the convergence of the simulation to a steady\n# state. To accelerate convergence, here we define a wake treatment\n# procedure that suppresses the hub wake for the first three revolutions,\n# avoiding the fountain effect altogether.\n# This is especially helpful in low and mid-fidelity simulations.\n\nsuppress_fountain = true # Toggle\n\n# Supress wake shedding on blade elements inboard of this r/R radial station\nno_shedding_Rthreshold = suppress_fountain ? 0.35 : 0.0\n\n# Supress wake shedding for this many time steps\nno_shedding_nstepsthreshold = 3*nsteps_per_rev\n\nomit_shedding = [] # Index of blade elements to supress wake shedding\n\n# Function to suppress or activate wake shedding\nfunction wake_treatment_supress(sim, args...; optargs...)\n\n # Case: start of simulation -> suppress shedding\n if sim.nt == 1\n\n # Identify blade elements on which to suppress shedding\n for i in 1:vlm.get_m(rotor)\n HS = vlm.getHorseshoe(rotor, i)\n CP = HS[5]\n\n if uns.vlm.norm(CP - vlm._get_O(rotor)) <= no_shedding_Rthreshold*R\n push!(omit_shedding, i)\n end\n end\n end\n\n # Case: sufficient time steps -> enable shedding\n if sim.nt == no_shedding_nstepsthreshold\n\n # Flag to stop suppressing\n omit_shedding .= -1\n\n end\n\n return false\nend\n\n\n# ----------------- 1) VEHICLE DEFINITION --------------------------------------\nprintln(\"Generating geometry...\")\n\n# Generate rotor\nrotor = uns.generate_rotor(rotor_file; pitch=pitch,\n n=n, CW=CW, blade_r=r,\n altReD=[RPM, J, mu/rho],\n xfoil=xfoil,\n read_polar=read_polar,\n data_path=data_path,\n verbose=true,\n plot_disc=true\n );\n\nprintln(\"Generating vehicle...\")\n\n# Generate vehicle\nsystem = vlm.WingSystem() # System of all FLOWVLM objects\nvlm.addwing(system, \"Rotor\", rotor)\n\nrotors = [rotor]; # Defining this rotor as its own system\nrotor_systems = (rotors, ); # All systems of rotors\n\nwake_system = vlm.WingSystem() # System that will shed a VPM wake\n # NOTE: Do NOT include rotor when using the quasi-steady solver\nif VehicleType != uns.QVLMVehicle\n vlm.addwing(wake_system, \"Rotor\", rotor)\nend\n\nvehicle = VehicleType( system;\n rotor_systems=rotor_systems,\n wake_system=wake_system\n );\n\n\n# ------------- 2) MANEUVER DEFINITION -----------------------------------------\n# Non-dimensional translational velocity of vehicle over time\nVvehicle(t) = zeros(3)\n\n# Angle of the vehicle over time\nanglevehicle(t) = zeros(3)\n\n# RPM control input over time (RPM over `RPMref`)\nRPMcontrol(t) = 1.0\n\nangles = () # Angle of each tilting system (none)\nRPMs = (RPMcontrol, ) # RPM of each rotor system\n\nmaneuver = uns.KinematicManeuver(angles, RPMs, Vvehicle, anglevehicle)\n\n\n# ------------- 3) SIMULATION DEFINITION ---------------------------------------\n\nVref = 0.0 # Reference velocity to scale maneuver by\nRPMref = RPM # Reference RPM to scale maneuver by\nVinit = Vref*Vvehicle(0) # Initial vehicle velocity\nWinit = pi/180*(anglevehicle(1e-6) - anglevehicle(0))/(1e-6*ttot) # Initial angular velocity\n\nsimulation = uns.Simulation(vehicle, maneuver, Vref, RPMref, ttot;\n Vinit=Vinit, Winit=Winit);\n\n# Restart simulation\nrestart_file = nothing\n\n# NOTE: Uncomment the following line to restart a previous simulation.\n# Point it to a particle field file (with its full path) at a specific\n# time step, and `run_simulation` will start this simulation with the\n# particle field found in the restart simulation.\n\n# restart_file = \"/path/to/a/previous/simulation/rotorhover-example_pfield.360\"\n\n\n# ------------- 4) MONITORS DEFINITIONS ----------------------------------------\n\n# Generate rotor monitor\nmonitor_rotor = uns.generate_monitor_rotors(rotors, J, rho, RPM, nsteps;\n t_scale=RPM/60, # Scaling factor for time in plots\n t_lbl=\"Revolutions\", # Label for time axis\n save_path=save_path,\n run_name=run_name,\n figname=\"rotor monitor\",\n )\n\n# Generate monitor of flow enstrophy (numerical stability)\nmonitor_enstrophy = uns.generate_monitor_enstrophy(;\n save_path=save_path,\n run_name=run_name,\n figname=\"enstrophy monitor\"\n )\n\n# Generate monitor of SFS model coefficient Cd\nmonitor_Cd = uns.generate_monitor_Cd(;\n save_path=save_path,\n run_name=run_name,\n figname=\"Cd monitor\"\n )\n# Concatenate monitors\nmonitors = uns.concatenate(monitor_rotor, monitor_enstrophy, monitor_Cd)\n\n\n# ------------- 5) RUN SIMULATION ----------------------------------------------\nprintln(\"Running simulation...\")\n\n# Concatenate monitors and wake treatment procedure into one runtime function\nruntime_function = uns.concatenate(monitors, wake_treatment_supress)\n\n# Run simulation\nuns.run_simulation(simulation, nsteps;\n # ----- SIMULATION OPTIONS -------------\n Vinf=Vinf,\n rho=rho, mu=mu, sound_spd=speedofsound,\n # ----- SOLVERS OPTIONS ----------------\n p_per_step=p_per_step,\n max_particles=max_particles,\n vpm_integration=vpm_integration,\n vpm_viscous=vpm_viscous,\n vpm_SFS=vpm_SFS,\n sigma_vlm_surf=sigma_rotor_surf,\n sigma_rotor_surf=sigma_rotor_surf,\n sigma_vpm_overwrite=sigma_vpm_overwrite,\n sigmafactor_vpmonvlm=sigmafactor_vpmonvlm,\n vlm_rlx=vlm_rlx,\n hubtiploss_correction=hubtiploss_correction,\n shed_starting=shed_starting,\n shed_unsteady=shed_unsteady,\n unsteady_shedcrit=unsteady_shedcrit,\n omit_shedding=omit_shedding,\n extra_runtime_function=runtime_function,\n # ----- RESTART OPTIONS -----------------\n restart_vpmfile=restart_file,\n # ----- OUTPUT OPTIONS ------------------\n save_path=save_path,\n run_name=run_name,\n save_wopwopin=true, # <--- Generates input files for PSU-WOPWOP noise analysis\n );\n\n\n\n\n# ----------------- 6) VISUALIZATION -------------------------------------------\nif paraview\n println(\"Calling Paraview...\")\n\n # Files to open in Paraview\n files = joinpath(save_path, run_name*\"_pfield...xmf;\")\n for bi in 1:B\n global files\n files *= run_name*\"_Rotor_Blade$(bi)_loft...vtk;\"\n files *= run_name*\"_Rotor_Blade$(bi)_vlm...vtk;\"\n end\n\n # Call Paraview\n run(`paraview --data=$(files)`)\n\nend\n\n","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"\n Mid-low fidelity runtime: ~7 minutes on a 16-core AMD EPYC 7302 processor.
\n Mid-high fidelity runtime: ~60 minutes on a 16-core AMD EPYC 7302 processor.
\n High fidelity runtime: ~30 hours on a 16-core AMD EPYC 7302 processor.\n
\n

","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"Rotor monitor in the high-fidelity case:","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"
\n \"Pic\n
","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"As the simulation runs, you will see the monitor shown below plotting the global enstrophy of the flow. The global enstrophy achieves a steady state once the rate of enstrophy produced by the rotor eventually balances out with the forward scatter of the SFS turbulence model, making the simulation indefinitely stable.","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"
\n \"Pic\n
","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"The SFS model uses a dynamic procedure to compute its own model coefficient C_d as the simulation evolves. The value of the model coefficient varies for each particle in space and time. The C_d-monitor shown below plots the mean value from all the particle in the field that have a non-zero C_d (left), and also the ratio of the number of particles that got clipped to a zero C_d over the total number of particles (right).","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"
\n \"Pic\n
","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"info: Prescribing the Model Coefficient\nThe SFS model helps the simulation to more accurately capture the effects of turbulence from the scales that are not resolved, but it adds computational cost. The following table summarizes the cost of the rVPM, the SFS model, and the C_d dynamic procedure. (Image: pic) The dynamic procedure is the most costly operation, which increases the simulation runtime by about 35%.If you need to run a case multiple times with only slight changes (e.g., sweeping the AOA and/or RPM), you can first run the simulation with the dynamic procedure (vpm_SFS = vpm.SFS_Cd_twolevel_nobackscatter), take note of what the mean C_d shown in the monitor converges to, and then prescribe that value to subsequent simulations. Prescribing C_d ends up in a simulation that is only 8% slower than the classic VPM without any SFS model.C_d can then be prescribed as followsvpm_SFS = vpm.ConstantSFS(vpm.Estr_fmm; Cs=value, clippings=[vpm.clipping_backscatter])where CS = value is the value to prescribe for the model coefficient, and clippings=[vpm.clipping_backscatter] clips the backscatter of enstrophy (making it a purely diffusive model). As a reference, in this hover case, C_d converges to 026 in the high-fidelity simulation.","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"In examples/rotorhover/rotorhover_postprocessing.jl we show how to postprocess the simulations to compare C_T and blade loading to experimental data by Zawodny et al.[1] and a URANS simulation (STAR-CCM+) by Schenk[2]:","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"
\n \"Pic\n \"Pic\n
","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":" C_T Error\nExperimental 0.072 –\nURANS 0.071 1%\nrVPM – high fidelity 0.073 1%\nrVPM – mid-high fidelity 0.066 8%\nrVPM – mid-low fidelity 0.064 11%\nBEMT (quasi-steady) 0.073 2%","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"[1]: N. S. Zawodny, D. D. Boyd, Jr., and C. L. Burley, “Acoustic Characterization and Prediction of Representative, Small-scale Rotary-wing Unmanned Aircraft System Components,” in 72nd American Helicopter Society (AHS) Annual Forum (2016).","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"[2]: A. R. Schenk, \"Computational Investigation of the Effects of Rotor-on-Rotor Interactions on Thrust and Noise,\" Masters thesis, Brigham Young University (2020).","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"info: Hub/Tip Loss Correction\nIn the rotor actuator line model, hub and tip corrections can be applied to c_ell to account for the effects that bring the aerodynamic loading to zero at the hub and tips. These correction factors, F_mathrmtip and F_mathrmhub, are defined as modified Prandtl loss functions,beginalign*\n F_mathrmtip\n =\n frac2pi cos^-1 left( expleft( -f_mathrmtip right) right)\n qquad\n f_mathrmtip\n=\n fracB2\n frac\n left left( fracR_mathrmrotorr right)^t_1 - 1 right^t_2\n \n vert sin left( theta_mathrmeff right) vert^t_3\n \n\n F_mathrmhub\n =\n frac2pi cos^-1 left( expleft( -f_mathrmhub right) right)\n qquad\n f_mathrmhub\n=\n fracB2\n frac\n left left( fracrR_mathrmhub right)^h_1 - 1 right^h_2\n \n vert sin left( theta_mathrmeff right) vert^h_3\n \nendalign*where R_mathrmrotor and R_mathrmhub are the rotor and hub radii, B is the number of blades, r is the radial position of the blade element, and t_1, t_2, t_3, h_1, h_2, and h_3 are tunable parameters. The normal and tangential force coefficients, respectively c_n and c_t, are then calculated asbeginalign*\n c_n\n =\n F_mathrmtip F_mathrmhub c_ellcostheta_mathrmeff + c_dsintheta_mathrmeff\n\n c_t\n =\n F_mathrmtip F_mathrmhub c_ellsintheta_mathrmeff - c_dcostheta_mathrmeff\nendalign*The hub and tip corrections are passed to uns.run_simulation through the keyword argument hubtiploss_correction = ((t1, t2, t3, tminangle), (h1, h2, h3, hminangle)), where tminangle and hminangle are clipping thresholds for the minimum allowable value of verttheta_mathrmeffvert (in degs) that is used in tip and hub corrections. The following corrections are predefined in FLOWVLM for the user:","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"import FLOWVLM as vlm\n\n# No corrections\nvlm.hubtiploss_nocorrection","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"import FLOWUnsteady: vlm # hide\n\n# Original Prandtl corrections\nvlm.hubtiploss_correction_prandtl","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"import FLOWUnsteady: vlm # hide\n\n# Modified Prandtl with a strong hub correction\nvlm.hubtiploss_correction_modprandtl","category":"page"},{"location":"examples/rotorhover-aero/","page":"Variable Fidelity","title":"Variable Fidelity","text":"info: ParaView Visualization\nThe .pvsm file visualizing the simulation as shown at the top of this page is available here: LINK (right click → save as...).To open in ParaView: File → Load State → (select .pvsm file) then select \"Search files under specified directory\" and point it to the folder where the simulation was saved.","category":"page"},{"location":"api/flowunsteady-simulation/#(3)-Simulation-Definition","page":"(3) Simulation Definition","title":"(3) Simulation Definition","text":"","category":"section"},{"location":"api/flowunsteady-simulation/","page":"(3) Simulation Definition","title":"(3) Simulation Definition","text":"FLOWUnsteady.Simulation\nFLOWUnsteady.save_vtk","category":"page"},{"location":"api/flowunsteady-simulation/#FLOWUnsteady.Simulation","page":"(3) Simulation Definition","title":"FLOWUnsteady.Simulation","text":"Simulation{V<:AbstractVehicle, M<:AbstractManeuver, R<:Real}(vehicle::V,\n maneuver::M, Vref::R, RPMref::R, ttot::R, optargs...)\n\nSimulation interface. This type carries the simulation's options and connects vehicle and maneuver together.\n\nARGUMENTS\n\nvehicle : Vehicle\nmaneuver : Maneuver\nVref : Reference velocity for the maneuver\nRPMref : Reference RPM for the maneuver\nttot : Total time in which to perform the maneuver\n\nOPTIONAL ARGUMENTS\n\nVinit = zeros(3) : Initial vehicle velocity\nWinit = zeros(3) : Initial vehicle angular velocity\n\nState variables\n\nt::Real : Time of current step\nnt::Int : Current time step number\n\n\n\n\n\n","category":"type"},{"location":"api/flowunsteady-simulation/#FLOWUnsteady.save_vtk","page":"(3) Simulation Definition","title":"FLOWUnsteady.save_vtk","text":"save_vtk(self::AbstractVehicle, prefix; path=\"\", optargs...)\n\nOutput VTK files with vehicle geometry and solution fields.\n\n\n\n\n\nsave_vtk(sim::Simulation, prefix; path=\"\", save_wopwopin=false, optargs...)\n\nOutput VTK files with vehicle geometry and solution fields. The file names will have the prefix prefix, and will be saved in the directory path. If save_wopwopin=true, it will also generate PSU-WOPWOP input files that can be used to run the acoustic analysis (see run_noise_wopwop).\n\n\n\n\n\n","category":"function"},{"location":"theory/rvpm/#Reformulated-VPM","page":"Reformulated VPM","title":"Reformulated VPM","text":"","category":"section"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"The following is an excerpt from E. J. Alvarez & A. Ning (2022), \"Meshless Large Eddy Simulation of Rotor-Wing Interactions Through the Reformulated Vortex Particle Method,\" (in review).","category":"page"},{"location":"theory/rvpm/#Vorticity-Navier-Stokes","page":"Reformulated VPM","title":"Vorticity Navier-Stokes","text":"","category":"section"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"In recent work[1][2], a new formulation of the vortex particle method (VPM) has been derived from the LES-filtered Navier-Stokes equations. The new method, referred to as the reformulated VPM or rVPM, is an LES that is both numerically stable and meshless, and is able to accurately resolve mean and fluctuating large-scale features of turbulent flow with minimal computational effort. Hereby we concisely summarize the governing equations of the reformulated VPM, and the reader is referred to Ref.[1] and the doctoral dissertation[2] accompanying this work for a detailed derivation of the method.","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"The reformulated VPM uses a Lagrangian scheme to solve the vorticity form of the LES-filtered Navier-Stokes equations","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"beginalign\n fracpartial overline omega_i partial t\n + overline u_j fracpartial overline omega_i partial x_j\n =\n overline omega_j fracpartial overline u_i partial x_j\n +\n nu nabla^2 overline omega_i -\n fracpartial T_ijpartial x_j +\n fracpartial T_ijpartial x_j\nendalign","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"where the bar denotes the filter operator,[a] and T_ij equiv overline u_i omega_j - overline u_i overline omega_j is the subfilter-scale (SFS) vorticity stress capturing the interactions between large-scale dynamics and SFS dynamics. The term fracpartial T_ijpartial x_j represents the SFS contributions arising from the advective term (vorticity advection), while fracpartial T_ijpartial x_j represents the contributions arising from vortex stretching. For simplicity, Eq. (1) is written in vector notation as","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"beginalign\n fractextd textd t overline boldsymbolomega \n = left( overline boldsymbolomega cdot nabla right) overline mathbfu +\n nu nabla^2 overline boldsymbolomega \n - mathbfE_mathrmadv - mathbfE_mathrmstr\nendalign","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"where left( mathbfE_mathrmadv right)_i equiv fracpartial T_ijpartial x_j is the SFS vorticity advection, left( mathbfE_mathrmstr right)_i equiv - fracpartial T_ijpartial x_j is the SFS vortex stretching, and the fractextd textd t operator is the linearized version of the filtered material derivative, fractextd textd t () equiv fracpartial partial t() + (overline bf u cdot nabla)(). Notice that casting the Navier-Stokes equation into this vorticity form gets rid of all dependance on pressure. Furthermore, this equation depends on boldsymbolomega alone since bfu can be calculated directly from boldsymbolomega = nabla times bfu through the Biot-Savart law.","category":"page"},{"location":"theory/rvpm/#particlediscretization","page":"Reformulated VPM","title":"Particle Discretization","text":"","category":"section"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"The material derivative in Eq. (2) and the material-conservative nature of the vorticity makes the boldsymbolomega field especially well fit for a Lagrangian description. The unfiltered boldsymbolomega field is discretized with singular vortex particles of positions bf x_p and coefficients boldsymbolGamma_p (called vortex strength), approximating boldsymbolomega as","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"beginalign labeleqparticledirac\n boldsymbolomega(bf xt) approx sum\n limits_p boldsymbolGamma_p (t)\n delta (bf x - bf x_p(t))\nendalign","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"where delta is the Dirac delta. Applying the filter operator,","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"beginalign*\n overline boldsymbolomega left( mathbfx right)\n =\n intlimits_-infty^infty\n boldsymbolomegaleft( mathbfy right)\n zeta_sigma(mathbfx-mathbfy)\n mathrmdmathbfy\n \n approx\n intlimits_-infty^infty\n left(\n sumlimits_p\n boldsymbolGamma_p\n delta (textbf y - textbf x_p)\n right)\n zeta_sigma(mathbfx-mathbfy)\n mathrmdmathbfy\nendalign*","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"the Dirac delta collapses the integral, obtaining an approximation of the filtered vorticity field as","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"beginalign labeleqparticleblob\n overlineboldsymbolomegaleft( mathbfxt right)\n approx\n sumlimits_p\n boldsymbolGamma_p (t)\n zeta_sigma_p(mathbfx-mathbfx_p(t))\nendalign","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"where zeta_sigma(mathbfx) equiv frac1sigma^3 zeta left(fracVert mathbfx Vertsigma right) is the filter kernel of width sigma and radial basis zeta. As seen in Eq. (4), the filter operator has the effect of spreading the vortex strength boldsymbolGamma_p in space, regularizing the singularity originally introduced by the Dirac delta. Thus, the filter kernel takes the role of a basis function that is used to discretize overlineboldsymbolomega through particles. We let the filter width sigma (here on called smoothing radius or core size) change in time and space according to the evolution of each individual particle. The particle field constructs a continuous vorticity field through radial basis functions as given by Eq. (4), and also a continuous velocity field by inverting the relation overlineboldsymbolomega = nabla times overlinemathbfu as","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"beginalign labeleqUreg\n overline mathbfu left( mathbfx right)\n =\n - frac14pisumlimits_p g_sigma_pleft( mathbfx-mathbfx_p right)\n fracmathbfx-mathbfx_pVertmathbfx-mathbfx_pVert^3\n times\n boldsymbolGamma_p\nendalign","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"where g_sigma is the regularizing function[3] associated with the filter kernel zeta_sigma. Hence, all fluid properties—like overlinemathbfu and its spatial derivatives—are continuous and can be computed analytically.","category":"page"},{"location":"theory/rvpm/#Governing-Equations","page":"Reformulated VPM","title":"Governing Equations","text":"","category":"section"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"Similar to the process that led from Eq. (3) to Eq. (4), we use singular particles to discretize the LES-filtered vorticity equation given in Eq. (2), and arrive to the governing equations of the reformulated VPM:","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"beginalign\n labeleqrvpmgedxdt\n bullet quad\n \n fractextdtextdtbf x_p\n =\n overlinemathbfu(bf x_p)\nendalign","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"beginalign\n labeleqrvpmgedGammadt\n beginsplit\n bullet quad\n fracmathrmd mathrmd t boldsymbolGamma_p\n =\n left(\n boldsymbolGamma_p cdot nabla\n right)\n overlinemathbfu (bf x_p)\n -\n fracg + ffrac13 + f\n left\n left\n left(\n boldsymbolGamma_p cdot nabla\n right)\n overlinemathbfu small (bf x_p)\n right\n cdot hatboldsymbolGamma_p\n right hatboldsymbolGamma_p\n \n qquad qquad \n qquad qquad quad \n - fracC_dzeta_sigma_p (bf 0)\n left\n mathbfE_mathrmstr (bf x_p)\n -\n fracffrac13 + f\n left(\n mathbfE_mathrmstr (bf x_p) cdot hatboldsymbolGamma_p\n right) hatboldsymbolGamma_p\n right\n endsplit\nendalign","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"beginalign\n labeleqrvpmgedsigmadt\n bullet quad\n \n fracmathrmd mathrmd t sigma_p\n =\n - left(\n fracg + f1 + 3f\n right)\n fracsigma_pVert boldsymbolGamma_p Vert\n left\n left(\n boldsymbolGamma_p cdot nabla\n right)\n overlinemathbfu small (bf x_p)\n right\n cdot hatboldsymbolGamma_p\n +\n left(\n fracf1 + 3f\n right)\n fracsigma_pVert boldsymbolGamma_p Vert\n fracC_dzeta_sigma_p (bf 0)\n mathbfE_mathrmstr (bf x_p) cdot hatboldsymbolGamma_p\nendalign","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"beginalign\n labeleqrvpmgeviscous\n bullet quad\n \n left(\n fractextd textd t overline boldsymbolomega \n right)_mathrmviscous\n =\n nu nabla^2 overline boldsymbolomega \nendalign","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"where Eq. (6) resolves vorticity advection by convecting the particles, Eq. (7) governs the evolution of vortex strength, and Eq. (8) governs the evolution of particle size. Eq. (7) in conjunction with Eqs. (6) and (8) resolve the inviscid part of the LES-filtered vorticity Navier-Stokes equation, while the viscous part in Eq. (9) can be resolved through any of the schemes previously proposed in the literature (e.g., vortex redistribution method, particle strength exchange, or core spreading).","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"The main headway of the reformulated VPM over the classic VPM is that rVPM uses the particle size, or fracmathrmd mathrmd t sigma_p, as an extra degree of freedom to reinforce conservation laws. As shown in References [1] and [2], momentum and mass conservation leads to f = 0 and g = frac15, and Eqs. (7) and (8) become","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"beginalign*\n bullet quad\n fracmathrmd mathrmd t boldsymbolGamma_p\n =\n left(\n boldsymbolGamma_p cdot nabla\n right)\n overline mathbfu (mathbfx_p)\n -\n frac35\n left\n left\n left(\n boldsymbolGamma_p cdot nabla\n right)\n overline mathbfu small (mathbfx_p)\n right\n cdot hatboldsymbolGamma_p\n right hatboldsymbolGamma_p\n - fracC_dzeta_sigma_p (mathbf0)\n mathbfE_mathrmstr (mathbfx_p)\n \n bullet quad\n \n fracmathrmd mathrmd t sigma_p\n =\n -\n frac15\n fracsigma_pVert boldsymbolGamma_p Vert\n left\n left(\n boldsymbolGamma_p cdot nabla\n right)\n overline mathbfu small (mathbfx_p)\n right\n cdot hatboldsymbolGamma_p\nendalign*","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"which is the formulation referred to as the \"reformulated VPM.\" Notice that when f = g = 0 and mathbfE_mathrmstr is neglected, Eqs. (7) and (8) collapse back to the classic VPM equations, making these equations a generalization of the classic method. In Reference [2] is shown that the classic VPM turns out to violate both conservation of momentum and mass when it assumes fracmathrmd mathrmd t sigma_p = 0, which explains the tendency of the classic VPM to be numerically unstable. Furthermore, notice that the rVPM equations do not require more computation than the classic VPM: when SFS effects are neglected (mathbfE_mathrmstr=0), both fracmathrmd sigma_p mathrmdt and fracmathrmd boldsymbolGamma_pmathrmd t are calculated directly and solely from vortex stretching, left( boldsymbolGamma_p cdot nabla right) overlinemathbfu (bf x_p).","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"For an in-depth derivation of the rVPM governing equations, see Chapters 1 and 2 in Alvarez' Dissertation.[2]","category":"page"},{"location":"theory/rvpm/#sfsmodel","page":"Reformulated VPM","title":"Turbulence Model","text":"","category":"section"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"Turning our attention back to the SFS stress tensor T_ij, the accuracy of LES hinges on the modeling of this tensor. Its divergence represents the rate at which enstrophy—a measure of rotational kinetic energy—is transferred from resolved scales to subfilter scales (diffusion) and from subfilter scales to resolved scales (backscatter). In vortex methods, the most common SFS models use variants of the Smagorinsky eddy-viscosity model formulated for the vorticity stress.[4][5] However, these models are developed on the basis of homogeneous isotropic turbulence, which makes them overly diffusive in simulations with coherent vortical structures. In Reference [1], the following anisotropic model of SFS vortex stretching is proposed:","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"beginalign* labeleqEstr\n mathbfE_mathrmstr left( mathbfx right)\n approx\n sumlimits_q\n zeta_sigma(mathbfx-mathbfx_q)\n left(\n boldsymbolGamma_q cdot nabla\n right)\n left(\n overlinemathbfu left( mathbfx right) - overlinemathbfu left( mathbfx_q right)\n right)\nendalign*","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"The model coefficient C_d is calculated dynamically at the position of every particle as","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"beginalign* labeleqCdGammaMLave\n C_d\n =\n frac\n left boldsymbolGamma_p cdot mathbfL right\n \n left boldsymbolGamma_p cdot mathbfm right\n \nendalign*","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"where left cdot right denotes an integration along Lagrangian trajectories[6], and","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"beginalign*\n \n mathbfm =\n fracsigma^3zeta(0) fracpartial mathbfE_mathrmstr partial sigma (mathbfx_p)\n \n \n mathbfL =\n frac3sigma\n left( boldsymbolGamma_p cdot nabla right)\n left(\n mathbfu (mathbfx_p) - overlinemathbfu (mathbfx_p)\n right)\n +\n left( boldsymbolGamma_p cdot nabla right)\n fracpartial overlinemathbfu partial sigma (mathbfx_p)\nendalign*","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"This dynamic procedure is based on a simultaneous balance of enstrophy-production and derivatives between true and modeled SFS contributions. Backscatter is controlled by clipping the model coefficient to C_d=0 whenever the condition C_d boldsymbolGamma_p cdot mathbfE_mathrmstr (mathbfx_p) geq 0 is not satisfied. This results in a low-dissipation SFS model that uses vortex stretching as the physical mechanism for turbulence, which is well suited for flows with coherent vortical structures where the predominant cascade mechanism is vortex stretching.","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"For an in-depth derivation of the SFS model, see Chapter 3 in Alvarez' Dissertation.[2]","category":"page"},{"location":"theory/rvpm/#Immersed-Vorticity","page":"Reformulated VPM","title":"Immersed Vorticity","text":"","category":"section"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"In order to immerse the vorticity of solid boundaries into the LES-filtered Navier-Stokes equations, the filtered vorticity field overlineboldsymbolomega(mathbfx t) is decomposed into a free-vorticity field overlineboldsymbolomega_mathrmfree(mathbfx t) and a bound-vorticity field overlineboldsymbolomega_mathrmbound(mathbfx t) as","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"beginalign*\n overlineboldsymbolomega\n =\n overlineboldsymbolomega_mathrmfree + overlineboldsymbolomega_mathrmbound\nendalign*","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"Both components can be discretized with vortex particles as","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"beginalign*\n overlineboldsymbolomega (mathbfx)\n =\n underbrace\n sumlimits_p boldsymbolGamma_p zeta_sigma_p left( mathbfx - mathbfx_p right)\n _overlineboldsymbolomega_mathrmfree\n +\n underbrace\n sumlimits_b boldsymbolGamma_b zeta_sigma_b left( mathbfx - mathbfx_b right)\n _overlineboldsymbolomega_mathrmbound\nendalign*","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"where the particles discretizing the free-vorticity field evolve according to the rVPM governing equations, Eqs. (6) through (9), while the ones discretizing the bound-vorticity are embedded on the solid boundaries and their strength is calculated by actuator models derived in Alvarez' Dissertation,[2] Chapter 6. The velocity field is obtained by inverting the relation boldsymbolomega = nabla times mathbfu, resulting in","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"beginalign*\n overline mathbfu left( mathbfx right)\n =\n underbrace\n sumlimits_p g_sigma_pleft( mathbfx-mathbfx_p right)\n mathbfKleft( mathbfx-mathbfx_p right)\n times\n boldsymbolGamma_p\n _overlinemathbfu_mathrmfree\n +\n underbrace\n sumlimits_b g_sigma_bleft( mathbfx-mathbfx_b right)\n mathbfKleft( mathbfx-mathbfx_b right)\n times\n boldsymbolGamma_b\n _overlinemathbfu_mathrmbound\nendalign*","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"which includes the velocity induced by both free and bound vorticity components, and where mathbfKleft( mathbfx right) equiv - frac14pi fracmathbfxVertmathbfxVert^3. Thus, the evolution of the free particles is influenced by the vorticity immersed at the solid boundaries, affecting their convection and vortex stretching through the velocity field induced by the bound particles.","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"The immersed vorticity not only affects the evolution of existing free vorticity, but it also creates new free vorticity at the boundary through viscous diffusion. In reality, vorticity is created in the boundary layer, it builds up as it travels along the surface, and it is eventually shed off the surface either by the Kutta condition at the trailing edge, flow separation, or other turbulent mechanisms. On a slender body, the vorticity can be assumed to be shed at the trailing edge.","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"In most models inside FLOWUnsteady, instead of creating vorticity through the viscous diffusion equation, the immersed vorticity is shed along a prescribed trailing edge. This approach neglects the wake created by flow separation. However, the effects of flow separation on loading (like the drop in lift and increase in pressure drag on a stalled airfoil) can still be captured whenever lookup airfoil tables are used.","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"compat: Recommended\nFor an in-depth discussion of the actuator line and surface models implemented in FLOWUnsteady, see Chapter 6 in Alvarez' Dissertation.[2]","category":"page"},{"location":"theory/rvpm/#Other-Schemes","page":"Reformulated VPM","title":"Other Schemes","text":"","category":"section"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"In the default settings of FLOWUnsteady, vortex stretching is resolved with the transposed scheme and the divergence of the vorticity field is treated through the relaxation scheme developed by Pedrizzeti.[7] The time integration of the governing equations is done through a low-storage third-order Runge-Kutta scheme. A Gaussian kernel is used as the LES filter zeta_sigma (or VPM radial basis function). Like the classic VPM, the reformulated VPM is spatially second-order accurate in the convective term when a Gaussian basis is used. Viscous diffusion is solved through the core spreading method coupled with the radial basis function interpolation approach for spatial adaptation developed by Barba.[8] This viscous scheme has second-order spatial convergence, while showing linear convergence when coupled with spatial adaptation. The fast multipole method (FMM) is used for the computation of the regularized Biot-Savart law, approximating the velocity field and vortex stretching through spherical harmonics with computational complexity mathcalO(N), where N is the number of particles. The FMM computation of vortex stretching is performed through an efficient complex-step derivative approximation,[9] implemented in a modified version of the open-source, parallelized code ExaFMM. FLOWVPM and FLOWUnsteady are implemented in the Julia language, which is a modern, high-level, dynamic programming language for high-performance computing.","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"compat: Recommended\nFor an in-depth discussion of the numerical schemes implemented in FLOWUnsteady, see Chapter 4 in Alvarez' Dissertation.[2]","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"[1]: E. J. Alvarez & A. Ning (2022), \"Reviving the Vortex Particle Method: A Stable Formulation for Meshless Large Eddy Simulation,\" (in review). [PDF]","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"[2]: E. J. Alvarez (2022), \"Reformulated Vortex Particle Method and Meshless Large Eddy Simulation of Multirotor Aircraft,\" Doctoral Dissertation, Brigham Young University. [VIDEO] [PDF]","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"[3]: Winckelmans, G., and Leonard, A., “Contributions to Vortex Particle Methods for the Computation of Three-Dimensional Incompressible Unsteady Flows,” Journal of Computational Physics, Vol. 109, No. 2, 1993.","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"[4]: Winckelmans, G. S., “Some progress in large-eddy simulation using the 3D vortex particle method,” CTR Annual Research Briefs, , No. 2, 1995, pp. 391–415.","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"[5]: Mansfield, J. R., Knio, O. M., and Meneveau, C., “A Dynamic LES Scheme for the Vorticity Transport Equation: Formulation and a Priori Tests,” Journal of Computational Physics, Vol. 145, No. 2, 1998, pp. 693–730.","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"[6]: Meneveau, C., Lund, T. S., and Cabot, W. H., “A Lagrangian dynamic subgrid-scale model of turbulence,” Journal of Fluid Mechanics, Vol. 319, No. -1, 1996, p. 353.","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"[7]: Pedrizzetti, G., “Insight into singular vortex flows,” Fluid Dynamics Research, Vol. 10, No. 2, 1992, pp. 101–115.","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"[8]: Barba, L. A., Leonard, A., and Allen, C. B., “Advances in viscous vortex methods - Meshless spatial adaption based on radial basis function interpolation,” International Journal for Numerical Methods in Fluids, Vol. 47, No. 5, 2005, pp. 387–421. Also, Barba, L. A., “Vortex Method for computing high-Reynolds number Flows: Increased accuracy with a fully mesh-less formulation,” California Institute of Technology, Vol. 2004, 2004.","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"[9]: Alvarez, E. J., and Ning, A., “High-Fidelity Modeling of Multirotor Aerodynamic Interactions for Aircraft Design,” AIAA Journal, Vol. 58, No. 10, 2020, pp. 4385–4400.","category":"page"},{"location":"theory/rvpm/","page":"Reformulated VPM","title":"Reformulated VPM","text":"[a]: Let phi be a field and zeta_sigma a filter kernel with cutoff length sigma, the filter operator is defined as overlinephi left( mathbfx right) equiv intlimits_-infty^infty phi(mathbfy)zeta_sigma(mathbfx-mathbfy) mathrmdmathbfy.","category":"page"},{"location":"examples/blownwing-asm/#asm","page":"Actuator Surface Model","title":"Actuator Surface Model","text":"","category":"section"},{"location":"examples/blownwing-asm/","page":"Actuator Surface Model","title":"Actuator Surface Model","text":"The aerodynamic solution computed in the first section was intended to be a mid-low fidelity simulation, which modeled the wing using an actuator line model (ALM). The ALM places all the surface vorticity associated with lift at the quarter chord of the wing, while placing all the trailing bound vorticity at the three-quarter chord, as shown here:","category":"page"},{"location":"examples/blownwing-asm/","page":"Actuator Surface Model","title":"Actuator Surface Model","text":"
\n \"Pic\n
\n
","category":"page"},{"location":"examples/blownwing-asm/","page":"Actuator Surface Model","title":"Actuator Surface Model","text":"The ALM is very accurate for isolated wings and even cases with mild wake interactions. However, for cases with stronger wake interactions (e.g., a wake directly impinging on the wing surface), we have developed an actuator surface model (ASM) that introduces the surface vorticity into the LES domain that better represents the physics. This is done by spreading the surface vorticity following a pressure-like distribution, which ends up producing a velocity field at the wing surface that minimizes the flow that crosses the airfoil centerline, thus better representing a solid surface:","category":"page"},{"location":"examples/blownwing-asm/","page":"Actuator Surface Model","title":"Actuator Surface Model","text":"
\n \"Pic\n \"Pic\n
\n
","category":"page"},{"location":"examples/blownwing-asm/","page":"Actuator Surface Model","title":"Actuator Surface Model","text":"For an in-depth discussion of the actuator line and surface models implemented in FLOWUnsteady, see Chapter 6 in Alvarez' Dissertation.[2]","category":"page"},{"location":"examples/blownwing-asm/","page":"Actuator Surface Model","title":"Actuator Surface Model","text":"[2]: E. J. Alvarez (2022), \"Reformulated Vortex Particle Method and Meshless Large Eddy Simulation of Multirotor Aircraft,\" Doctoral Dissertation, Brigham Young University. [VIDEO] [PDF]","category":"page"},{"location":"examples/blownwing-asm/","page":"Actuator Surface Model","title":"Actuator Surface Model","text":"In order to activate the actuator surface model, we define the following parameters:","category":"page"},{"location":"examples/blownwing-asm/","page":"Actuator Surface Model","title":"Actuator Surface Model","text":"thickness_w = 0.15 # Wing airfoil thickness t/c\n\n# ---------- Vortex sheet parameters ---------------\nvlm_vortexsheet = true # Whether to spread the wing circulation as a vortex sheet\nvlm_vortexsheet_overlap = 2.125 # Overlap of the particles that make the vortex sheet\nvlm_vortexsheet_distribution = uns.g_pressure # Distribution of the vortex sheet\n\nsigma_vlm_surf = b/100 # Smoothing radius of lifting bound vorticity\nvlm_vortexsheet_sigma_tbv = thickness_w*(b/ar) / 100 # Smoothing radius of trailing bound vorticity\n\nvlm_vortexsheet_maxstaticparticle = 1000000 # How many particles to preallocate for the vortex sheet\n\n\n# ---------- Force calculation parameters ----------\nKJforce_type = \"regular\" # KJ force evaluated at middle of bound vortices\n# KJforce_type = \"averaged\" # KJ force evaluated at average vortex sheet\n# KJforce_type = \"weighted\" # KJ force evaluated at strength-weighted vortex sheet\n\ninclude_trailingboundvortex = false # Include trailing bound vortices in force calculations\n\ninclude_freevortices = false # Include free vortices in force calculation\ninclude_freevortices_TBVs = false # Include trailing bound vortex in free-vortex force\n\ninclude_unsteadyforce = true # Include unsteady force\nadd_unsteadyforce = false # Whether to add the unsteady force to Ftot or to simply output it\n\ninclude_parasiticdrag = true # Include parasitic-drag force\nadd_skinfriction = true # If false, the parasitic drag is purely parasitic, meaning no skin friction\ncalc_cd_from_cl = false # Whether to calculate cd from cl or effective AOA\nwing_polar_file = \"xf-rae101-il-1000000.csv\" # Airfoil polar for parasitic drag","category":"page"},{"location":"examples/blownwing-asm/","page":"Actuator Surface Model","title":"Actuator Surface Model","text":"Then we use a custom-defined function for calculating aerodynamic forces that uses the vortex sheet:","category":"page"},{"location":"examples/blownwing-asm/","page":"Actuator Surface Model","title":"Actuator Surface Model","text":"# ---------- Aerodynamic forces --------------\n\nforces = []\n\n# Calculate Kutta-Joukowski force\nkuttajoukowski = uns.generate_calc_aerodynamicforce_kuttajoukowski(KJforce_type,\n sigma_vlm_surf, sigma_rotor_surf,\n vlm_vortexsheet, vlm_vortexsheet_overlap,\n vlm_vortexsheet_distribution,\n vlm_vortexsheet_sigma_tbv;\n vehicle=vehicle)\npush!(forces, kuttajoukowski)\n\n# Free-vortex force\nif include_freevortices\n freevortices = uns.generate_calc_aerodynamicforce_freevortices(\n vlm_vortexsheet_maxstaticparticle,\n sigma_vlm_surf,\n vlm_vortexsheet,\n vlm_vortexsheet_overlap,\n vlm_vortexsheet_distribution,\n vlm_vortexsheet_sigma_tbv;\n Ffv=uns.Ffv_direct,\n include_TBVs=include_freevortices_TBVs\n )\n push!(forces, freevortices)\nend\n\n# Force due to unsteady circulation\nif include_unsteadyforce\n unsteady(args...; optargs...) = uns.calc_aerodynamicforce_unsteady(args...; add_to_Ftot=add_unsteadyforce, optargs...)\n\n push!(forces, unsteady)\nend\n\n# Parasatic-drag force (form drag and skin friction)\nif include_parasiticdrag\n parasiticdrag = uns.generate_aerodynamicforce_parasiticdrag(wing_polar_file;\n read_path=joinpath(data_path, \"airfoils\"),\n calc_cd_from_cl=calc_cd_from_cl,\n add_skinfriction=add_skinfriction,\n Mach=speedofsound!=nothing ? magVref/speedofsound : nothing)\n push!(forces, parasiticdrag)\nend\n\n\n# Stitch all the forces into one function\nfunction calc_aerodynamicforce_fun(vlm_system, args...; per_unit_span=false, optargs...)\n\n # Delete any previous force field\n fieldname = per_unit_span ? \"ftot\" : \"Ftot\"\n if fieldname in keys(vlm_system.sol)\n pop!(vlm_system.sol, fieldname)\n end\n\n Ftot = nothing\n\n for (fi, force) in enumerate(forces)\n Ftot = force(vlm_system, args...; per_unit_span=per_unit_span, optargs...)\n end\n\n return Ftot\nend","category":"page"},{"location":"examples/blownwing-asm/","page":"Actuator Surface Model","title":"Actuator Surface Model","text":"This custom-defined force needs to be passed to uns.generate_monitor_wing:","category":"page"},{"location":"examples/blownwing-asm/","page":"Actuator Surface Model","title":"Actuator Surface Model","text":"monitor_wing = uns.generate_monitor_wing( ...\n include_trailingboundvortex=include_trailingboundvortex,\n calc_aerodynamicforce_fun=calc_aerodynamicforce_fun,\n ...\n )","category":"page"},{"location":"examples/blownwing-asm/","page":"Actuator Surface Model","title":"Actuator Surface Model","text":"Finally, pass the following keyword arguments to uns.run_simulation:","category":"page"},{"location":"examples/blownwing-asm/","page":"Actuator Surface Model","title":"Actuator Surface Model","text":"# ------------- 5) RUN SIMULATION ------------------------------------------\nuns.run_simulation( ...\n vlm_vortexsheet=vlm_vortexsheet,\n vlm_vortexsheet_overlap=vlm_vortexsheet_overlap,\n vlm_vortexsheet_distribution=vlm_vortexsheet_distribution,\n vlm_vortexsheet_sigma_tbv=vlm_vortexsheet_sigma_tbv,\n max_static_particles=vlm_vortexsheet_maxstaticparticle\n ...\n )","category":"page"},{"location":"examples/blownwing-asm/","page":"Actuator Surface Model","title":"Actuator Surface Model","text":"info: ASM and High Fidelity\nASM uses a very high density of particles at the wing surface (~100k particles per wing) to accuratelly introduce the solid boundary into the LES. This increases the computational cost of the simulation considerably. Hence, we recommend using ASM only for high-fidelity simulations.","category":"page"},{"location":"api/flowunsteady-openvsp/#openvsp_import","page":"Importing OpenVSP geometry","title":"Importing OpenVSP geometry","text":"","category":"section"},{"location":"api/flowunsteady-openvsp/","page":"Importing OpenVSP geometry","title":"Importing OpenVSP geometry","text":"FLOWUnsteady.read_degengeom\nFLOWUnsteady.import_vsp","category":"page"},{"location":"api/flowunsteady-openvsp/#FLOWUnsteady.read_degengeom","page":"Importing OpenVSP geometry","title":"FLOWUnsteady.read_degengeom","text":"`read_degengeom(filename::String)`\n\nRead all geometry components from a DegenGeom file written out by OpenVSP\n\nArguments\n\nfilename::String: DegenGeom filename\n\nReturns\n\ncomp: Vector of vsp.VSPComponent objects\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-openvsp/#FLOWUnsteady.import_vsp","page":"Importing OpenVSP geometry","title":"FLOWUnsteady.import_vsp","text":"`import_vsp(comp::vsp.VSPComponent; geomType::String=\"\",\n flip_y::Bool=false, transpose_grid::Bool=false)`\n\nImports properties from OpenVSP component to FLOWUnsteady objects. Importing prop and duct geometries are under development.\n\nArguments\n\ncomp::vsp.VSPComponent: Single vsp.VSPComponent object\ngeomType::String : Geometry type may be one of - wing, fuselage, prop, duct\nsymmetric::Bool : Creates a symmetric wing using the semi-span coordinates\nflip_y::Bool : Flip y-coordinates about longitudinal plane. Useful for symmetric geometry\ntranspose_grid::Bool : Swap ordering of grid points\n\nReturns\n\ngeom: FLOWUnsteady geometry\n\n\n\n\n\n","category":"function"},{"location":"examples/openvsp-aircraft/#OpenVSP-Geometry","page":"OpenVSP Geometry","title":"OpenVSP Geometry","text":"","category":"section"},{"location":"examples/openvsp-aircraft/","page":"OpenVSP Geometry","title":"OpenVSP Geometry","text":"In this example, we import an aircraft model created in OpenVSP into the FLOWUnsteady environment. The aircraft.vsp3 file used here is available in the folder examples/aircraft-vsp/ in the FLOWUnsteady GitHub repo.","category":"page"},{"location":"examples/openvsp-aircraft/","page":"OpenVSP Geometry","title":"OpenVSP Geometry","text":"After creating the aircraft geometry in OpenVSP, we write out a DegenGeom file using the tab Analysis > DegenGeom as shown below. This creates a CSV file that contains all the components of the aircraft geometry.","category":"page"},{"location":"examples/openvsp-aircraft/","page":"OpenVSP Geometry","title":"OpenVSP Geometry","text":"(Image: DegenGeom)","category":"page"},{"location":"examples/openvsp-aircraft/","page":"OpenVSP Geometry","title":"OpenVSP Geometry","text":"Let's import the geometry into Julia using the FLOWUnsteady.read_degengeom function and inspect it.","category":"page"},{"location":"examples/openvsp-aircraft/","page":"OpenVSP Geometry","title":"OpenVSP Geometry","text":"import FLOWUnsteady as uns\n\ngeom_path = joinpath(uns.examples_path, \"aircraft-vsp\", \"aircraft.csv\")\ncomp = uns.read_degengeom(geom_path);\n\nfor i in 1:length(comp)\n println(\"$i. $(comp[i].name)\")\nend","category":"page"},{"location":"examples/openvsp-aircraft/","page":"OpenVSP Geometry","title":"OpenVSP Geometry","text":"Now that we have a good idea about the index of the components in the geometry, we can use them in FLOWUnsteady using the function FLOWUnsteady.import_vsp. The following example script imports the OpenVSP geometry, creates FLOWUnsteady data structures and writes it out to a vtk file. The geometry can be used with the FLOWUnsteady solver by following one of the previous examples.","category":"page"},{"location":"examples/openvsp-aircraft/","page":"OpenVSP Geometry","title":"OpenVSP Geometry","text":"#=##############################################################################\n# DESCRIPTION\n Import of OpenVSP geometry into FLOWUnsteady\n\n# AUTHORSHIP\n * Author : Cibin Joseph\n * Email : cibinjoseph92@gmail.com\n * Created : Aug 2023\n * Last updated : Aug 2023\n * License : MIT\n=###############################################################################\n\nimport FLOWUnsteady as uns\n\nrun_name = \"aircraft-vsp\" # Name of this simulation\nsave_path = run_name # Where to save this simulation\n\n# Path to DegenGeom file\ngeom_path = joinpath(uns.examples_path, \"aircraft-vsp\", \"aircraft.csv\")\n\nVinf(X, t) = [1.0, 0.0, 0.0] # Freestream function\n\n# ----------------- 1) VEHICLE DEFINITION --------------------------------------\nprintln(\"Importing geometry...\")\n\n# Import VSP Components from DegenGeom file\ncomp = uns.read_degengeom(geom_path);\n\nfuselage = uns.import_vsp(comp[1])\nwingL = uns.import_vsp(comp[2])\nwingR = uns.import_vsp(comp[2]; flip_y=true)\nbasefuse = uns.import_vsp(comp[4])\nhorstabL = uns.import_vsp(comp[5])\nhorstabR = uns.import_vsp(comp[5]; flip_y=true)\nverstab = uns.import_vsp(comp[7])\n\nprintln(\"Generating vehicle...\")\n\n# Generate vehicle\nsystem = uns.vlm.WingSystem() # System of all FLOWVLM objects\nuns.vlm.addwing(system, \"WingL\", wingL)\nuns.vlm.addwing(system, \"WingR\", wingR)\nuns.vlm.addwing(system, \"HorStabL\", horstabL)\nuns.vlm.addwing(system, \"HorStabR\", horstabR)\nuns.vlm.addwing(system, \"VerStab\", verstab)\n\nfuse_grid = uns.gt.MultiGrid(3)\nuns.gt.addgrid(fuse_grid, \"Fuselage\", fuselage)\n\nbasefuse_grid = uns.gt.MultiGrid(3)\nuns.gt.addgrid(basefuse_grid, \"BaseFuse\", basefuse)\n\ngrids = [fuse_grid, basefuse_grid]\n\nvlm_system = system # System solved through VLM solver\nwake_system = system # System that will shed a VPM wake\n\nvehicle = uns.VLMVehicle( system;\n vlm_system=vlm_system,\n wake_system=wake_system,\n grids=grids\n );\n\n# ----------------- EXPORT GEOMETRY --------------------------------------------\nif isdir(save_path); rm(save_path, recursive=true, force=true); end\nmkdir(save_path)\n\nuns.vlm.setVinf(system, Vinf)\nstr = uns.save_vtk(vehicle, run_name; path=save_path)\n\n# Open up geometry in ParaView\nstr = joinpath(save_path, str)\nrun(`paraview -data=$(str)`)","category":"page"},{"location":"examples/openvsp-aircraft/","page":"OpenVSP Geometry","title":"OpenVSP Geometry","text":"(Image: Paraview)","category":"page"},{"location":"theory/convergence/#Convergence","page":"Convergence","title":"Convergence","text":"","category":"section"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"The following is a compilation of convergence studies found in the literature using FLOWUnsteady.","category":"page"},{"location":"theory/convergence/#Wing-Performance","page":"Convergence","title":"Wing Performance","text":"","category":"section"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"Source: E. J. Alvarez, 2022[1]","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"
\n \"Pic\n \"Pic\n
","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"Case: 45^circ swept-back wing at an angle of attack of 42^circ. Aspect ratio of 5.0, RAE 101 airfoil section with 12% thickness, no dihedral, twist, nor taper. Freestream velocity of 497mathrmms, corresponding to a chord-based Reynolds number of 17 times 10^6. Convergence of loading distribution and integrated lift and drag as the number of wing elements is increased.","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"Takeaways:Resolving the wake for about 1.5 span-distances is sufficient to converge wing loading\nUsing between 100 and 200 elements fully resolves the wing loading (C_D changes by less than 1% with n_mathrmwing 100)","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"\n \n \n \n \n
\n \"Pic\n \n \"Pic\n
\n\n
\n\n
\n \"Pic\n
","category":"page"},{"location":"theory/convergence/#Rotor-Performance","page":"Convergence","title":"Rotor Performance","text":"","category":"section"},{"location":"theory/convergence/#APC-10x7-Propeller-Case","page":"Convergence","title":"APC 10x7 Propeller Case","text":"","category":"section"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"Source: E. J. Alvarez and A. Ning, 2020[2]","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"
\n \"Pic\n
","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"Case: APC 10x7E propeller at an advance ratio of 0.6, tip Mach number of 0.36, and mathrmRe_c = 62 times 10^4 and mathrmRe_D = 65 times 10^5. Convergence of thrust w.r.t. the following parameters:N_mathrmsteps, number of time steps per revolution.\nN_mathrmsheds, number of particle sheds per revolution.\nlambda, core overlap between tip particles defined as lambda=fracsigmaDelta x. Also controlled with the particle smoothing factor f_sigma = sigmaR, .\nn, number of blade elements per blade.Default values: N_mathrmsteps=72, N_mathrmsheds=144, lambda=2125 (or f_sigma=0093), and n=50 as each parameter is independently varied.","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"Takeaways:Temporal discretization error less than 1% with N_mathrmsteps geq 72 (or time step smaller than 5^circ)\nSpatial discretization error less than 1% with N_mathrmsheds geq 144 and n = 50.\nC_T starts to diverge as the stability threshold (lambda=1) is approached, while also diverging as f_sigma025 (equivalent to sigma larger than 025R) leads to unphysical wake dynamics caused by excessive smoothing. Since the instability associated with lambdarightarrow1 plateaus at lambdaapprox2, we recommend using lambda approx 2125 whenever possible.","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"\n
\n \"Pic\n
\n\n\n \n \n \n \n
\n \"Pic\n \n \"Pic\n
\n\n
","category":"page"},{"location":"theory/convergence/#Wind-Turbine-Case","page":"Convergence","title":"Wind Turbine Case","text":"","category":"section"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"Source: J. Mehr, E. J. Alvarez, and A. Ning, 2022[4]","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"
\n \"Pic\n
","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"Case: Test series \"H\" from UAE study at US Department of Energy.","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"Takeaways:Spatio-temporal discretization error on thrust C_T is less than 1% with 72 steps per revolution (or 5^circ per step), while error on power C_P is less than 3%.\nBlade discretization error less than 0.1% with 50 blade elements per blade.","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"\n
\n \"Pic\n \"Pic\n
\n\n
","category":"page"},{"location":"theory/convergence/#Beaver-Propeller-Case","page":"Convergence","title":"Beaver Propeller Case","text":"","category":"section"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"Source: E. J. Alvarez, 2022[1], and E. J. Alvarez and A. Ning, 2022[3]","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"
\n \"Pic\n
","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"Case: Beaver propeller at an advance ratio of 0.8, tip Mach number of 0.46, and mathrmRe_07D = 18 times 10^6. Convergence of thrust, torque, and blade loading w.r.t. the following parameters:N_mathrmsheds, number of particle sheds per revolution.\nn, number of blade elements per blade.Constant parameters: N_mathrmsteps=72 and lambda=fracsigmaDelta x = fracsigma N_mathrmsheds2pi R = 2125, which leads to a decreasing sigma as N_mathrmshedsincreases.","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"\n
\n \"Pic\n \"Pic\n \"Pic\n
\n\n
","category":"page"},{"location":"theory/convergence/#Rotor-Wake","page":"Convergence","title":"Rotor Wake","text":"","category":"section"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"Source: E. J. Alvarez, 2022[1], and E. J. Alvarez and A. Ning, 2022[3]","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"Case: Continuation of Beaver propeller convergence study. Wake structure and flow field compared to experimental PIV measurements.","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"Takeaways: Even though the aerodynamic performance of the rotor (thrust, torque, and blade loading) is sufficiently converged with N_mathrmsheds=144 and n=50, higher refinement might be needed in order to properly time-resolve the vortical structure downstream of the rotor (which might be important when the rotor wake impinges on another surface). However, N_mathrmsheds=144 and n=50 is sufficient to capture the time-average velocity in the wake. This study shows that tip vortices and the inner vortex sheet can be resolved with as much granularity as desired by going to finer discretizations.","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"\n
\n \"Pic\n

\n \"Pic\n

\n \"Pic\n\n
\n \"Vid\n \"Vid\n
\n\n
","category":"page"},{"location":"theory/convergence/#Immersed-Vorticity","page":"Convergence","title":"Immersed Vorticity","text":"","category":"section"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"We have noticed that in cases with strong wake interactions (e.g., a rotor wake impinging on a wing surface), the size of the particles used to immerse the surface vorticity can change the effects of the interaction. However, over the years we have discovered a heuristic that seems to converge to the right solution, independent of the nature of the problem: the size of the embedded particles needs to be about two orders of magnitude smaller than the relevant length scale.In FLOWUnsteady, there are three different core sizes related to the immersed vorticity:sigma_mathrmrotor, smoothing radius of the rotor bound vorticity (sigma_rotor_surf)\nsigma_mathrmLBV, smoothing radius of the lifting bound vorticity of wings (sigma_vlm_surf)\nsigma_mathrmTBV, smoothing radius of the trailing bound vorticity of wings (vlm_vortexsheet_sigma_tbv)Accordingly, whenever possible, we recommend choosing sigma-values close tosigma_mathrmrotor approx 001D, where D is the rotor diameter\nsigma_mathrmLBV approx 001b, where b is the wing span\nsigma_mathrmTBV approx 001t, where t is the thickness of the wingThe following is an excerpt from E. J. Alvarez, 2022,[1] Sec. 8.3., confirming the validity of the \"sigma approx 001ell\" heuristic:","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"\n
\n \"Pic\n \"Pic\n \"Pic\n
\n \"Pic\n \"Pic\n \"Pic\n
\n\n
","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"[1]: E. J. Alvarez (2022), \"Reformulated Vortex Particle Method and Meshless Large Eddy Simulation of Multirotor Aircraft,\" Doctoral Dissertation, Brigham Young University. [PDF]","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"[2]: E. J. Alvarez & A. Ning (2020), \"High-Fidelity Modeling of Multirotor Aerodynamic Interactions for Aircraft Design,\" AIAA Journal. [DOI] [PDF]","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"[3]: E. J. Alvarez & A. Ning (2022), \"Meshless Large Eddy Simulation of Rotor-Wing Interactions with Reformulated Vortex Particle Method,\" (in review).","category":"page"},{"location":"theory/convergence/","page":"Convergence","title":"Convergence","text":"[4]: J. Mehr, E. J. Alvarez, & A. Ning (2022), \"Interactional Aerodynamics Analysis of a Multi-Rotor Energy Kite,\" (in review).","category":"page"},{"location":"api/flowvpm-sfs/#SFS-Scheme","page":"SFS Scheme","title":"SFS Scheme","text":"","category":"section"},{"location":"api/flowvpm-sfs/","page":"SFS Scheme","title":"SFS Scheme","text":"FLOWUnsteady.vpm.SubFilterScale\nFLOWUnsteady.vpm.NoSFS\nFLOWUnsteady.vpm.ConstantSFS\nFLOWUnsteady.vpm.DynamicSFS\nFLOWUnsteady.vpm.clipping_backscatter\nFLOWUnsteady.vpm.control_directional\nFLOWUnsteady.vpm.control_magnitude\nFLOWUnsteady.vpm.dynamicprocedure_pseudo3level\nFLOWUnsteady.vpm.dynamicprocedure_sensorfunction\nFLOWUnsteady.vpm.Estr_direct\nFLOWUnsteady.vpm.Estr_fmm\nFLOWUnsteady.vpm.Estr_direct\nFLOWUnsteady.vpm.Estr_direct","category":"page"},{"location":"api/flowvpm-sfs/#FLOWVPM.SubFilterScale","page":"SFS Scheme","title":"FLOWVPM.SubFilterScale","text":"Implementation of calculations associated with subfilter-scale turbulence\n\nmodel.\n\nNOTE: Any implementation is expected to evaluate UJ and SFS terms of the particles which will be used by the time integration routine so make sure they are stored in the memory (see implementation of ConstantSFS as an example).\n\nNOTE2: Any control strategy is implemented as a function that returns true whenever the SFS model needs to be clipped. Subsequently, the model coefficient of the targeted particle will be turned to zero.\n\n\n\n\n\n","category":"type"},{"location":"api/flowvpm-sfs/#FLOWVPM.DynamicSFS","page":"SFS Scheme","title":"FLOWVPM.DynamicSFS","text":"Subfilter-scale scheme with an associated dynamic procedure for calculating\n\nthe model coefficient.\n\n\n\n\n\n","category":"type"},{"location":"api/flowvpm-sfs/#FLOWVPM.clipping_backscatter","page":"SFS Scheme","title":"FLOWVPM.clipping_backscatter","text":"Backscatter control strategy of SFS enstrophy production by clipping of the\n\nSFS model. See 20210901 notebook for derivation.\n\n\n\n\n\n","category":"function"},{"location":"api/flowvpm-sfs/#FLOWVPM.control_directional","page":"SFS Scheme","title":"FLOWVPM.control_directional","text":"Directional control strategy of SFS enstrophy production forcing the model\n\nto affect only the vortex strength magnitude and not the vortex orientation. See 20210901 notebook for derivation.\n\n\n\n\n\n","category":"function"},{"location":"api/flowvpm-sfs/#FLOWVPM.control_magnitude","page":"SFS Scheme","title":"FLOWVPM.control_magnitude","text":"Magnitude control strategy of SFS enstrophy production limiting the\n\nmagnitude of the forward scattering (diffussion) of the model. See 20210901 notebook for derivation.\n\n\n\n\n\n","category":"function"},{"location":"api/flowvpm-sfs/#FLOWVPM.dynamicprocedure_pseudo3level","page":"SFS Scheme","title":"FLOWVPM.dynamicprocedure_pseudo3level","text":"Dynamic procedure for SFS model coefficient based on enstrophy and\n\nderivative balance between resolved and unresolved domain, numerically implemented through pseudo-three filtering levels. See 20210901 notebook for derivation.\n\nNOTES\n\nrlxf = Δ𝑡/𝑇 ≤ 1 is the relaxation factor of the Lagrangian average, where Δ𝑡\n\nis the time step of the simulation, and 𝑇 is the time length of the ensemble average.\n\nThe scaling constant becomes 1 for alpha_tau = 1 (but notice that the\n\nderivative approximation becomes zero at that point). Hence, the pseudo-three-level procedure converges to the two-level procedure for alpha_tau rightarrow 1**.\n\nThe scaling constant tends to zero when alpha_tau rightarrow 23. Hence,\n\nit can be used to arbitrarely attenuate the SFS contributions with alpha_tau rightarrow 23, or let it trully be a self-regulated dynamic procedure with alpha_tau rightarrow 1.\n\nalpha_tau\nshould not be made smaller than 23 as the constant becomes\n\nnegative beyond that point. This strains the assumption that sigma_tau is small enough to approximate the singular velocity field as mathbfu approx mathbftildeu, which now is only true if sigma is small enough.\n\n𝛼𝜏=0.999 ⇒ 3𝛼𝜏−2=0.997 𝛼𝜏=0.990 ⇒ 3𝛼𝜏−2=0.970 𝛼𝜏=0.900 ⇒ 3𝛼𝜏−2=0.700 𝛼𝜏=0.833 ⇒ 3𝛼𝜏−2=0.499 𝛼𝜏=0.750 ⇒ 3𝛼𝜏−2=0.250 𝛼𝜏=0.700 ⇒ 3𝛼𝜏−2=0.100 𝛼𝜏=0.675 ⇒ 3𝛼𝜏−2=0.025 𝛼𝜏=0.670 ⇒ 3𝛼𝜏−2=0.010 𝛼𝜏=0.667 ⇒ 3𝛼𝜏−2=0.001 𝛼𝜏=0.6667⇒ 3𝛼𝜏−2=0.0001\n\n\n\n\n\n","category":"function"},{"location":"api/flowvpm-sfs/#FLOWVPM.dynamicprocedure_sensorfunction","page":"SFS Scheme","title":"FLOWVPM.dynamicprocedure_sensorfunction","text":"Dynamic procedure for SFS model coefficient based on sensor function of\n\nenstrophy between resolved and unresolved domain, numerically implemented through a test filter. See 20210901 notebook for derivation.\n\n\n\n\n\n","category":"function"},{"location":"api/flowvpm-sfs/#FLOWVPM.Estr_direct","page":"SFS Scheme","title":"FLOWVPM.Estr_direct","text":"Model of vortex-stretching SFS contributions evaluated with direct\n\nparticle-to-particle interactions. See 20210901 notebook for derivation.\n\n\n\n\n\n","category":"function"},{"location":"api/flowvpm-sfs/#FLOWVPM.Estr_fmm","page":"SFS Scheme","title":"FLOWVPM.Estr_fmm","text":"Model of vortex-stretching SFS contributions evaluated with fast multipole\n\nmethod. See 20210901 notebook for derivation.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-run/#(5)-Run-Simulation","page":"(5) Run Simulation","title":"(5) Run Simulation","text":"","category":"section"},{"location":"api/flowunsteady-run/","page":"(5) Run Simulation","title":"(5) Run Simulation","text":"FLOWUnsteady.run_simulation","category":"page"},{"location":"api/flowunsteady-run/#FLOWUnsteady.run_simulation","page":"(5) Run Simulation","title":"FLOWUnsteady.run_simulation","text":"Run the FLOWUnsteady simulation sim in nsteps number of time steps.\n\nrun_simulation(\n\n sim::Simulation, # Simulation object\n nsteps::Int; # Total time steps in simulation\n\n # -------- SIMULATION OPTIONS -----------------------------------------\n Vinf = (X, t)->zeros(3), # Freestream velocity\n sound_spd = 343, # (m/s) speed of sound\n rho = 1.225, # (kg/m^3) air density\n mu = 1.81e-5, # (Pa*s) air dynamic viscosity\n tquit = Inf, # (s) force quit the simulation at this time\n rand_RPM = false, # (experimental) randomize RPM fluctuations\n\n extra_runtime_function = (sim, PFIELD, T, DT; optargs...)->false,\n\n # -------- SOLVERS OPTIONS --------------------------------------------\n # Vortex particle method\n max_particles = Int(1e5), # Maximum number of particles\n max_static_particles = nothing, # Maximum number of static particles (use `nothing` to automatically estimate it)\n p_per_step = 1, # Particle sheds per time step\n vpm_formulation = vpm.rVPM, # VPM formulation (`vpm.rVPM` or `vpm.cVPM`)\n vpm_kernel = vpm.gaussianerf, # VPM kernel (`vpm.gaussianerf` or `vpm.winckelmans`)\n vpm_UJ = vpm.UJ_fmm, # VPM particle-to-particle interaction scheme (`vpm.UJ_fmm` or `vpm.UJ_direct`)\n vpm_SFS = vpm.SFS_none, # VPM LES subfilter-scale model (`SFS_none`, `SFS_Cd_threelevel_nobackscatter`, `SFS_Cd_twolevel_nobackscatter`, or `SFS_Cs_nobackscatter`)\n vpm_integration = vpm.rungekutta3, # VPM time integration scheme (`vpm.euler` or `vpm.rungekutta3`)\n vpm_transposed = true, # VPM transposed stretching scheme\n vpm_viscous = vpm.Inviscid(), # VPM viscous diffusion scheme (`vpm.Inviscid()`, `vpm.CoreSpreading(nu, sgm0, zeta)`, or `vpm.ParticleStrengthExchange(nu)`)\n vpm_fmm = vpm.FMM(; p=4, ncrit=50, theta=0.4, phi=0.5), # VPM's FMM settings\n vpm_relaxation = vpm.pedrizzetti, # VPM relaxation scheme (`vpm.norelaxation`, `vpm.correctedpedrizzetti`, or `vpm.pedrizzetti`)\n vpm_surface = true, # Whether to include surfaces in the VPM through ASM/ALM\n\n # Actuator surface/line model (ASM/ALM): VLM and blade elements\n vlm_vortexsheet = false, # Whether to spread surface circulation as a vortex sheet in the VPM (turns ASM on; ALM if false)\n vlm_vortexsheet_overlap = 2.125,# Overlap of particles that make the vortex sheet\n vlm_vortexsheet_distribution= g_pressure, # Vorticity distribution of vortex sheet (`g_uniform`, `g_linear`, or `g_pressure`)\n vlm_vortexsheet_sigma_tbv = nothing, # Size of particles in trailing bound vortices (defaults to `sigma_vlm_surf` if not given)\n vlm_rlx = -1, # VLM relaxation (>0.9 can cause divergence, <0.2 slows simulation too much, deactivated with <0)\n vlm_init = false, # Initialize the first step with the VLM semi-infinite wake solution\n hubtiploss_correction = vlm.hubtiploss_nocorrection, # Hub and tip loss correction of rotors (ignored in quasi-steady solver)\n\n # Wake shedding\n wake_coupled = true, # Couple VPM wake -> VLM solution\n shed_unsteady = true, # Whether to shed vorticity from unsteady loading\n unsteady_shedcrit = 0.01, # Criterion for unsteady-loading shedding\n shed_starting = false, # Whether to shed starting vortex (only when `shed_unsteady=true`)\n shed_boundarylayer = false, # (experimental) whether to shed vorticity from boundary layer of surfaces\n boundarylayer_prescribedCd = 0.1, # (experimental) prescribed Cd for boundary layer shedding used for wings\n boundarylayer_d = 0.0, # (experimental) dipole width for boundary layer shedding\n omit_shedding = [], # Indices of elements in `sim.vehicle.wake_system` on which omit shedding VPM particles\n\n # Regularization of solvers\n sigma_vlm_solver = -1, # Regularization of VLM solver (internal VLM-on-VLM)\n sigma_vlm_surf = -1, # (REQUIRED!) Size of embedded particles in ASM/ALM wing surfaces (for VLM-on-VPM and VLM-on-Rotor)\n sigma_rotor_surf = -1, # (REQUIRED!) Size of embedded particles in ALM blade surfaces (for Rotor-on-VPM, Rotor-on-VLM, and Rotor-on-Rotor)\n sigmafactor_vpm = 1.0, # Core overlap of wake particles\n sigmafactor_vpmonvlm = 1, # (experimental) shrinks the particles by this factor when calculating VPM-on-VLM/Rotor induced velocities\n sigma_vpm_overwrite = nothing, # Overwrite core size of wake to this value (ignoring `sigmafactor_vpm`)\n\n # -------- RESTART OPTIONS --------------------------------------------\n restart_vpmfile = nothing, # VPM restart file to restart simulation\n\n # -------- OUTPUT OPTIONS ---------------------------------------------\n save_path = nothing, # Where to save simulation\n run_name = \"flowunsteadysim\",# Suffix of output files\n create_savepath = true, # Whether to create `save_path`\n prompt = true, # Whether to prompt the user\n verbose = true, # Enable verbose\n v_lvl = 0, # Indentation level of verbose\n verbose_nsteps = 10, # Verbose every this many steps\n raisewarnings = true, # Whether to raise warnings\n debug = false, # Output extra states for debugging\n nsteps_save = 1, # Save vtks every this many steps\n nsteps_restart = -1, # Save jlds every this many steps (restart files)\n save_code = \"\", # Copy the source code in this path to `save_path`\n save_horseshoes = false, # Whether to output VLM horseshoes in VTKs\n save_static_particles = true, # Whether to save ASM/ALM embedded particles\n save_wopwopin = false, # Generate input files for PSU-WOPWOP\n\n)\n\nEven though a bast number of settings are exposed to the user, the only required keyword arguments are sigma_vlm_surf and sigma_rotor_surf. Thus, running the simulation can be as simple as\n\nrun_simulation(sim::Simulation, nsteps::Int;\n sigma_vlm_surf = ..., sigma_rotor_surf = ...)\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-run/","page":"(5) Run Simulation","title":"(5) Run Simulation","text":"compat: Extra Runtime Function\nextra_runtime_function is a function that is called at every time step after the state variables are updated and before outputting VTK files. The state variables of the simulation are passed to this function, giving the user complete freedom to modify the states of the simulation (e.g., add/remove particles, clip vortex strengths, re-orient the vehicle) or to do some extra computation (e.g., compute aerodynamic forces, create plots, write to files, etc).This function is expected be of the formextra_runtime_function(sim, pfield, t, dt; vprintln) -> Boolwhere sim is the FLOWUnsteady.Simulation object, pfield is the FLOWVPM.ParticleField, t is the current simulation time, dt is the length of the current time step, and vprintln(str, v_lvl) is a function for printing the verbose of the simulation (default to vprintln = (args...)->nothing if there is nothing to add to the verbose).The output of extra_runtime_function is a flag for breaking the simulation at the current time step, such that if it ever returns true, the simulation will immediately quit.","category":"page"},{"location":"api/flowunsteady-run/","page":"(5) Run Simulation","title":"(5) Run Simulation","text":"compat: So, what is going on under the hood?\nFLOWUnsteady is simply a runtime function that is provided to FLOWVPM, as shown below. Hence, FLOWVPM (green block) is the solver that is actually driving the simulation. FLOWUnsteady (blue block) acts as a runtime function inside a VPM simulation that at each time step uses the solvers in the gray block to compute surface vorticities and adds particles to embed such vorticity in the flow field (thus implementing the actuator surface/line models developed in Alvarez' dissertation, Chapter 6).This workflow makes it very easy to couple more solvers in the simulation. For instance, a structural solver can be inserted as a runtime function (step 6 of the blue block) that deflects the geometry according to the aerodynamic loads, obtaining a full aeroelastic simulation.","category":"page"},{"location":"api/flowunsteady-run/","page":"(5) Run Simulation","title":"(5) Run Simulation","text":"
\n \"Pic\n
","category":"page"},{"location":"examples/propeller-incidence/#Incidence-Sweep","page":"Incidence Sweep","title":"Incidence Sweep","text":"","category":"section"},{"location":"examples/propeller-incidence/","page":"Incidence Sweep","title":"Incidence Sweep","text":"
\n \"Vid\n
","category":"page"},{"location":"examples/propeller-incidence/","page":"Incidence Sweep","title":"Incidence Sweep","text":"In simple cases like a propeller in cruise, steady and quasi-steady methods like blade element momentum theory can be as accurate as a fully unsteady simulation, and even faster. However, in more complex cases, quasi-steady solvers are far from accurate and a fully unsteady solver is needed. We now highlight one of such cases: the case of a propeller at an incidence angle.","category":"page"},{"location":"examples/propeller-incidence/","page":"Incidence Sweep","title":"Incidence Sweep","text":"A rotor operating at an incidence angle relative to the freestream experiences an unsteady loading due to the blade seeing a larger local velocity in the advancing side of the rotor and a smaller local velocity in the retreating side. This also causes a wake that is skewed. For this example we will run a sweep of simulations on a 4-bladed propeller operating at multiple incidence angles alpha (where alpha=0^circ is fully axial inflow, and alpha=90^circ is fully edgewise inflow).","category":"page"},{"location":"examples/propeller-incidence/","page":"Incidence Sweep","title":"Incidence Sweep","text":"#=##############################################################################\n# DESCRIPTION\n Simulation of Beaver propeller (four-bladed rotor, 9.34-inch diameter) at\n various incidence angles.\n\n This example uses the blade geometry reported in Sinnige & de Vries (2018),\n \"Unsteady Pylon Loading Caused by Propeller-Slipstream Impingement for\n Tip-Mounted Propellers,\" and replicates the experiment conducted by Sinnige\n et al. (2019), \"Wingtip-Mounted Propellers: Aerodynamic Analysis of\n Interaction Effects and Comparison with Conventional Layout.\"\n\n# AUTHORSHIP\n * Author : Eduardo J. Alvarez (edoalvarez.com)\n * Email : Edo.AlvarezR@gmail.com\n * Created : Mar 2023\n * Last updated : Mar 2023\n * License : MIT\n=###############################################################################\n\nimport FLOWUnsteady as uns\nimport FLOWVLM as vlm\n\ncase_name = \"propeller-incidencesweep-example\" # Name of this sweep case\n\nsave_path = case_name # Where to save this sweep\noutput_runs = [20] # Saves the VTK output of these AOAs for viz\n\n\n# ----------------- GEOMETRY PARAMETERS ----------------------------------------\n\n# Rotor geometry\nrotor_file = \"beaver.csv\" # Rotor geometry\ndata_path = uns.def_data_path # Path to rotor database\npitch = 0.0 # (deg) collective pitch of blades\nCW = false # Clock-wise rotation\nxfoil = false # Whether to run XFOIL\nread_polar = vlm.ap.read_polar2 # What polar reader to use\n\n# Discretization\nn = 20 # Number of blade elements per blade\nr = 1/5 # Geometric expansion of elements\n\n# Read radius of this rotor and number of blades\nR, B = uns.read_rotor(rotor_file; data_path=data_path)[[1,3]]\n\n# ----------------- SIMULATION PARAMETERS --------------------------------------\n\n# Operating conditions\nAOAs = 0:4:20 # (deg) incidence angles to evaluate\nmagVinf = 40.0 # (m/s) freestream velocity\nJ = 0.9 # Advance ratio Vinf/(nD)\nRPM = magVinf / (2*R/60) / J # RPM\n\nrho = 1.225 # (kg/m^3) air density\nmu = 1.79e-5 # (kg/ms) air dynamic viscosity\nspeedofsound = 342.35 # (m/s) speed of sound\n\n\nReD = 2*pi*RPM/60*R * rho/mu * 2*R # Diameter-based Reynolds number\nMatip = 2*pi*RPM/60*R / speedofsound # Tip Mach number\n\nprintln(\"\"\"\n RPM: $(RPM)\n Vinf: $(magVinf) m/s\n Matip: $(round(Matip, digits=3))\n ReD: $(round(ReD, digits=0))\n\"\"\")\n\n# ----------------- SOLVER PARAMETERS ------------------------------------------\n\n# Aerodynamic solver\nVehicleType = uns.UVLMVehicle # Unsteady solver\n\n# Time parameters\nnrevs = 4 # Number of revolutions in simulation\nnsteps_per_rev = 36 # Time steps per revolution\nnsteps = nrevs*nsteps_per_rev # Number of time steps\nttot = nsteps/nsteps_per_rev / (RPM/60) # (s) total simulation time\n\n# VPM particle shedding\np_per_step = 2 # Sheds per time step\nshed_starting = true # Whether to shed starting vortex\nshed_unsteady = true # Whether to shed vorticity from unsteady loading\nmax_particles = ((2*n+1)*B)*nsteps*p_per_step + 1 # Maximum number of particles\n\n# Regularization\nsigma_rotor_surf= R/40 # Rotor-on-VPM smoothing radius\n# sigma_rotor_surf= R/80\nlambda_vpm = 2.125 # VPM core overlap\n # VPM smoothing radius\nsigma_vpm_overwrite = lambda_vpm * 2*pi*R/(nsteps_per_rev*p_per_step)\n\n# Rotor solver\nvlm_rlx = 0.7 # VLM relaxation <-- this also applied to rotors\n # Prandtl's tip correction with a strong hub\nhubtiploss_correction = ( (0.75, 10, 0.5, 0.05), (1, 1, 1, 1.0) ) # correction up to r/R = 0.35\n\nif VehicleType == uns.QVLMVehicle # Mute colinear warnings if quasi-steady solver\n uns.vlm.VLMSolver._mute_warning(true)\nend\n\n\n# ----------------- 1) VEHICLE DEFINITION --------------------------------------\nprintln(\"Generating geometry...\")\n\n# Generate rotor\nrotor = uns.generate_rotor(rotor_file; pitch=pitch,\n n=n, CW=CW, blade_r=r,\n altReD=[RPM, J, mu/rho],\n xfoil=xfoil,\n read_polar=read_polar,\n data_path=data_path,\n verbose=true,\n verbose_xfoil=false,\n plot_disc=true\n );\n\nprintln(\"Generating vehicle...\")\n\n# Generate vehicle\nsystem = vlm.WingSystem() # System of all FLOWVLM objects\nvlm.addwing(system, \"Rotor\", rotor)\n\nrotors = [rotor]; # Defining this rotor as its own system\nrotor_systems = (rotors, ); # All systems of rotors\n\nwake_system = vlm.WingSystem() # System that will shed a VPM wake\n # NOTE: Do NOT include rotor when using the quasi-steady solver\nif VehicleType != uns.QVLMVehicle\n vlm.addwing(wake_system, \"Rotor\", rotor)\nend\n\nvehicle = VehicleType( system;\n rotor_systems=rotor_systems,\n wake_system=wake_system\n );\n\n\n# ------------- 2) MANEUVER DEFINITION -----------------------------------------\n# Non-dimensional translational velocity of vehicle over time\nVvehicle(t) = zeros(3)\n\n# Angle of the vehicle over time\nanglevehicle(t) = zeros(3)\n\n# RPM control input over time (RPM over `RPMref`)\nRPMcontrol(t) = 1.0\n\nangles = () # Angle of each tilting system (none)\nRPMs = (RPMcontrol, ) # RPM of each rotor system\n\nmaneuver = uns.KinematicManeuver(angles, RPMs, Vvehicle, anglevehicle)\n\n\n# ------------- 3) SIMULATION DEFINITION ---------------------------------------\n\nVref = 0.0 # Reference velocity to scale maneuver by\nRPMref = RPM # Reference RPM to scale maneuver by\n\nVinit = Vref*Vvehicle(0) # Initial vehicle velocity\nWinit = pi/180*(anglevehicle(1e-6) - anglevehicle(0))/(1e-6*ttot) # Initial angular velocity\n\nsimulation = uns.Simulation(vehicle, maneuver, Vref, RPMref, ttot;\n Vinit=Vinit, Winit=Winit);\n\n# ------------- RUN AOA SWEEP --------------------------------------------------\n\n# Create path where to save sweep\nuns.gt.create_path(save_path, true)\n\nfor AOA in AOAs\n\n println(\"\\n\\nRunning AOA = $(AOA)\")\n\n Vinf(X, t) = magVinf*[cosd(AOA), sind(AOA), 0] # (m/s) freestream velocity vector\n\n # ------------- 4) MONITOR DEFINITION ---------\n monitor_rotor = uns.generate_monitor_rotors(rotors, J, rho, RPM, nsteps;\n t_scale=RPM/60,\n t_lbl=\"Revolutions\",\n save_path=save_path,\n run_name=\"AOA$(ceil(Int, AOA*100))\",\n disp_conv=false\n )\n\n # ------------- 5) RUN SIMULATION -------------\n println(\"\\tRunning simulation...\")\n\n save_vtks = AOA in output_runs ? save_path*\"-AOA$(ceil(Int, AOA*100))\" : nothing\n\n uns.run_simulation(simulation, nsteps;\n # ----- SIMULATION OPTIONS -------------\n Vinf=Vinf,\n rho=rho, mu=mu, sound_spd=speedofsound,\n # ----- SOLVERS OPTIONS ----------------\n p_per_step=p_per_step,\n max_particles=max_particles,\n sigma_vlm_surf=sigma_rotor_surf,\n sigma_rotor_surf=sigma_rotor_surf,\n sigma_vpm_overwrite=sigma_vpm_overwrite,\n vlm_rlx=vlm_rlx,\n hubtiploss_correction=hubtiploss_correction,\n shed_unsteady=shed_unsteady,\n shed_starting=shed_starting,\n extra_runtime_function=monitor_rotor,\n # ----- OUTPUT OPTIONS ------------------\n save_path=save_vtks,\n run_name=\"singlerotor\",\n v_lvl=1, verbose_nsteps=24\n );\nend\n","category":"page"},{"location":"examples/propeller-incidence/","page":"Incidence Sweep","title":"Incidence Sweep","text":"\n Run time: ~15 minutes on a Dell Precision 7760 laptop.\n\n

","category":"page"},{"location":"examples/propeller-incidence/","page":"Incidence Sweep","title":"Incidence Sweep","text":"Check examples/propeller/propeller_incidence.jl to postprocess and plot the results as shown below.","category":"page"},{"location":"examples/propeller-incidence/","page":"Incidence Sweep","title":"Incidence Sweep","text":"
\n \"Pic\n
","category":"page"},{"location":"examples/propeller-incidence/","page":"Incidence Sweep","title":"Incidence Sweep","text":"info: Paraview visualization\nThe .pvsm file visualizing the simulation as shown at the top of this page is available here: LINK (right click → save as...). To open in Paraview: File → Load State → (select .pvsm file) then select \"Search files under specified directory\" and point it to the folder where the simulation was saved.","category":"page"},{"location":"examples/tetheredwing/#Tethered-Wing","page":"Tethered Wing","title":"Tethered Wing","text":"","category":"section"},{"location":"examples/tetheredwing/","page":"Tethered Wing","title":"Tethered Wing","text":"
\n \"Vid\n
","category":"page"},{"location":"examples/tetheredwing/","page":"Tethered Wing","title":"Tethered Wing","text":"
","category":"page"},{"location":"examples/tetheredwing/","page":"Tethered Wing","title":"Tethered Wing","text":"In this example we extend the simple wing case to fly a circular path. This simulates a kite tethered to the ground with a crosswind that causes it to fly in circles. The kite effectively acts as a turbine extracting energy from the wind to sustain flight, which is the basis for the field of airborne wind energy.","category":"page"},{"location":"examples/tetheredwing/","page":"Tethered Wing","title":"Tethered Wing","text":"This simulation exemplify the following features:","category":"page"},{"location":"examples/tetheredwing/","page":"Tethered Wing","title":"Tethered Wing","text":"Translating and re-orienting the initial position of the vehicle using FLOWVLM.setcoordsystem\nDefining a uns.KinematicManeuver object that prescribes the kinematics of a circular path\nCustomizing the wing monitor (uns.generate_monitor_wing) to compute and plot forces decomposed in arbitrary directions (in this case, following the orientation of the vehicle along the circular path)\nMonitoring the vehicle state variables with uns.generate_monitor_statevariables","category":"page"},{"location":"examples/tetheredwing/","page":"Tethered Wing","title":"Tethered Wing","text":"
","category":"page"},{"location":"examples/tetheredwing/","page":"Tethered Wing","title":"Tethered Wing","text":"#=##############################################################################\n# DESCRIPTION\n Kite flying in a circular path with crosswind while tethered to the ground.\n The kite is the same 45° swept-back wing from the previous example.\n\n# AUTHORSHIP\n * Author : Eduardo J. Alvarez (edoalvarez.com)\n * Email : Edo.AlvarezR@gmail.com\n * Created : Feb 2023\n * Last updated : Feb 2023\n * License : MIT\n=###############################################################################\n\nimport FLOWUnsteady as uns\nimport FLOWVLM as vlm\n\nrun_name = \"tetheredwing-example\" # Name of this simulation\n\nsave_path = run_name # Where to save this simulation\nparaview = true # Whether to visualize with Paraview\n\n\n# ----------------- GEOMETRY PARAMETERS ----------------------------------------\n# Wing description\nb = 2.489 # (m) span length\nar = 5.0 # Aspect ratio b/c_tip\ntr = 1.0 # Taper ratio c_tip/c_root\ntwist_root = 0.0 # (deg) twist at root\ntwist_tip = 0.0 # (deg) twist at tip\nlambda = 45.0 # (deg) sweep\ngamma = 0.0 # (deg) dihedral\n\n# Discretization\nn = 50 # Number of spanwise elements per side\nr = 10.0 # Geometric expansion of elements\ncentral = false # Whether expansion is central\n\n# ----------------- SIMULATION PARAMETERS --------------------------------------\n# Freestream\nmagVinf = 5.0 # (m/s) freestream velocity\nmagVeff = 49.7 # (m/s) vehicle effective velocity\nAOAeff = 4.2 # (deg) vehicle effective AOA\nrho = 0.93 # (kg/m^3) air density\nqinf = 0.5*rho*magVeff^2 # (Pa) static pressure\n\nVinf(X, t) = magVinf*[1, 0, 0] # Freestream function\n\n# Circular path\nR = 3.0*b # (m) radius of circular path\nmagVvehicle = sqrt(magVeff^2 - magVinf^2) # (m/s) vehicle velocity\nomega = magVvehicle/R # (rad/s) angular velocity\nalpha = AOAeff - atand(magVinf, magVvehicle) # (deg) vehicle pitch angle\n\n# ----------------- SOLVER PARAMETERS ------------------------------------------\n# Time parameters\nnrevs = 2.50 # Revolutions to resolve\nnsteps_per_rev = 144 # Number of time steps per revolution\n\nttot = nrevs / (omega/(2*pi)) # (s) total simulation time\nnsteps = ceil(Int, nrevs * nsteps_per_rev) # Number of time steps\n\n# VLM and VPM parameters\np_per_step = 4 # Number of particle sheds per time step\n\nsigma_vlm_solver= -1 # VLM-on-VLM smoothing radius (deactivated with <0)\nsigma_vlm_surf = 0.05*b # VLM-on-VPM smoothing radius\nlambda_vpm = 2.125 # VPM core overlap\n # VPM smoothing radius\nsigma_vpm_overwrite = lambda_vpm * magVeff * (ttot/nsteps)/p_per_step\n\nshed_starting = true # Whether to shed starting vortex\nvlm_rlx = 0.7 # VLM relaxation\n\n# NOTE: In some cases the starting vortex can cause numerical instabilities at\n# the beginning of the simulation. If so, consider omitting shedding of\n# the starting vortex with `shed_starting=false`, or relax the VLM solver\n# with `0.2 < vlm_rlx < 0.9`\n\n\n# ----------------- 1) VEHICLE DEFINITION --------------------------------------\nprintln(\"Generating geometry...\")\n\n# Generate wing\nwing = vlm.simpleWing(b, ar, tr, twist_root, lambda, gamma;\n twist_tip=twist_tip, n=n, r=r, central=central);\n\n# Rotate wing to pitch\nO = [0.0, 0.0, 0.0] # New position\nOaxis = uns.gt.rotation_matrix2(0.0, -alpha, 0.0) # New orientation\nvlm.setcoordsystem(wing, O, Oaxis)\n\n\nprintln(\"Generating vehicle...\")\n\n# Generate vehicle\nsystem = vlm.WingSystem() # System of all FLOWVLM objects\nvlm.addwing(system, \"Wing\", wing)\n\nvlm_system = system; # System solved through VLM solver\nwake_system = system; # System that will shed a VPM wake\n\nvehicle = uns.VLMVehicle( system;\n vlm_system=vlm_system,\n wake_system=wake_system\n );\n\n # Rotate vehicle to be perpendicular to crosswind\n # and translate it to start at (x, y, z) = (0, R, 0)\n O = [0, R, 0] # New position\n Oaxis = uns.gt.rotation_matrix2(0.0, -90, 0.0) # New orientation\n\n vlm.setcoordsystem(system, O, Oaxis)\n\n\n# ------------- 2) MANEUVER DEFINITION -----------------------------------------\n\n# Translational velocity of vehicle over time\nfunction Vvehicle(t)\n\n # NOTE: This function receives a non-dimensional time `t` (with t=0 being\n # the start of simulation and t=1 the end), and returns a\n # non-dimensional velocity vector. This vector will later be scaled\n # by `Vref`.\n\n Vx = 0\n Vy = -sin(2*pi*nrevs*t)\n Vz = cos(2*pi*nrevs*t)\n\n return [0, Vy, Vz]\nend\n\n# Angle of the vehicle over time\nfunction anglevehicle(t)\n\n # NOTE: This function receives the non-dimensional time `t` and returns the\n # attitude of the vehicle (a vector with inclination angles with\n # respect to each axis of the global coordinate system)\n\n return [0, 0, 360*nrevs*t]\nend\n\nangle = () # Angle of each tilting system (none)\nRPM = () # RPM of each rotor system (none)\n\nmaneuver = uns.KinematicManeuver(angle, RPM, Vvehicle, anglevehicle)\n\n# NOTE: `FLOWUnsteady.KinematicManeuver` defines a maneuver with prescribed\n# kinematics. `Vvehicle` defines the velocity of the vehicle (a vector)\n# over time. `anglevehicle` defines the attitude of the vehicle over time.\n# `angle` defines the tilting angle of each tilting system over time (none\n# in this case). `RPM` defines the RPM of each rotor system over time\n# (none in this case).\n# Each of these functions receives a nondimensional time `t`, which is the\n# simulation time normalized by the total time `ttot`, from 0 to\n# 1, beginning to end of simulation. They all return a nondimensional\n# output that is then scaled by either a reference velocity (`Vref`) or\n# a reference RPM (`RPMref`). Defining the kinematics and controls of the\n# maneuver in this way allows the user to have more control over how fast\n# to perform the maneuver, since the total time, reference velocity and\n# RPM are then defined in the simulation parameters shown below.\n\n\n\n\n# ------------- 3) SIMULATION DEFINITION ---------------------------------------\n\nVref = magVvehicle # Reference velocity to scale maneuver by\nRPMref = 0.0 # Reference RPM to scale maneuver by\nVinit = Vref*Vvehicle(0) # Initial vehicle velocity\nWinit = pi/180*(anglevehicle(1e-6) - anglevehicle(0))/(1e-6*ttot) # Initial angular velocity\n\n # Maximum number of particles\nmax_particles = (nsteps+1)*(vlm.get_m(vehicle.vlm_system)*(p_per_step+1) + p_per_step)\n\nsimulation = uns.Simulation(vehicle, maneuver, Vref, RPMref, ttot;\n Vinit=Vinit, Winit=Winit);\n\n\n\n\n# ------------- 4) MONITORS DEFINITIONS ----------------------------------------\n\nfigs, figaxs = [], [] # Figures generated by monitors\nimport FLOWUnsteady: @L_str # Macro for writing LaTeX labels\n\n# Generate function that computes aerodynamic forces\ncalc_aerodynamicforce_fun = uns.generate_calc_aerodynamicforce(;\n add_parasiticdrag=true,\n add_skinfriction=true,\n airfoilpolar=\"xf-rae101-il-1000000.csv\"\n )\n\n# Time-varying directions used to decompose the aerodynamic force\nN_dir(t) = [1, 0, 0] # Direction of normal force\nT_dir(t) = [0, sin(omega*t), -cos(omega*t)] # Direction of tangent force\nS_dir(t) = uns.cross(N_dir(t), T_dir(t)) # Spanwise direction\n\nX_offset(t) = system.O # Reference wing origin (for calculating spanwise position)\nS_proj(t) = S_dir(t) # Reference span direction (for calculating spanwise position)\n\n# Generate wing monitor\nmonitor_wing = uns.generate_monitor_wing(wing, Vinf, b, ar,\n rho, qinf, nsteps;\n calc_aerodynamicforce_fun=calc_aerodynamicforce_fun,\n L_dir=N_dir,\n D_dir=T_dir,\n X_offset=X_offset,\n S_proj=S_proj,\n CL_lbl=L\"Normal force $C_n$\",\n CD_lbl=L\"Tangent force $C_t$\",\n cl_lbl=L\"Sectional normal force $c_n$\",\n cd_lbl=L\"Sectional tangent force $c_t$\",\n cl_ttl=\"Normal force distribution\",\n cd_ttl=\"Tangent force distribution\",\n out_figs=figs,\n out_figaxs=figaxs,\n save_path=save_path,\n run_name=run_name,\n figname=\"wing monitor\",\n );\n\n# Generate monitor of state variables\nmonitor_states = uns.generate_monitor_statevariables(; save_path=save_path,\n run_name=run_name,\n out_figs=figs,\n out_figaxs=figaxs,\n nsteps_savefig=10)\n\nmonitors = uns.concatenate(monitor_wing, monitor_states)\n\n\n# ------------- 5) RUN SIMULATION ----------------------------------------------\nprintln(\"Running simulation...\")\n\nuns.run_simulation(simulation, nsteps;\n # ----- SIMULATION OPTIONS -------------\n Vinf=Vinf,\n rho=rho,\n # ----- SOLVERS OPTIONS ----------------\n p_per_step=p_per_step,\n max_particles=max_particles,\n sigma_vlm_solver=sigma_vlm_solver,\n sigma_vlm_surf=sigma_vlm_surf,\n sigma_rotor_surf=sigma_vlm_surf,\n sigma_vpm_overwrite=sigma_vpm_overwrite,\n vlm_rlx=vlm_rlx,\n shed_starting=shed_starting,\n extra_runtime_function=monitors,\n # ----- OUTPUT OPTIONS ------------------\n save_path=save_path,\n run_name=run_name,\n );\n\n\n\n\n# ----------------- 6) VISUALIZATION -------------------------------------------\nif paraview\n println(\"Calling Paraview...\")\n\n # Files to open in Paraview\n files = joinpath(save_path, run_name*\"_Wing_vlm...vtk\")\n files *= \";\"*run_name*\"_pfield...xmf;\"\n\n # Call Paraview\n run(`paraview --data=$(files)`)\n\nend\n\n","category":"page"},{"location":"examples/tetheredwing/","page":"Tethered Wing","title":"Tethered Wing","text":"\n Run time: ~20 minutes on a Dell Precision 7760 laptop.\n
\n Reduce resolution (n and steps) to speed up simulation without loss of accuracy.\n
\n

","category":"page"},{"location":"examples/tetheredwing/","page":"Tethered Wing","title":"Tethered Wing","text":"As the simulation runs, you will see the monitor shown below plotting the state variables of the vehicle. The components of both velocity and position follow a sinusoidal function, which is consistent with the circular path, while the angular velocity is constant.","category":"page"},{"location":"examples/tetheredwing/","page":"Tethered Wing","title":"Tethered Wing","text":"
\n \"Pic\n
\n
","category":"page"},{"location":"examples/tetheredwing/","page":"Tethered Wing","title":"Tethered Wing","text":"The force monitor (shown below) plots the force components that are normal and tangential to the plane of rotation. Notice that the tangential force is negative, which is equivalent to having a negative drag, meaning that the vehicle is actually being propelled by the crosswind. Also notice that the forces are perturbed every time it completes a revolution. This is due to encountering the starting point of the wake that is slowly traveling downstream. It takes a couple revolutions for the forces to converge once the wake has been fully deployed.","category":"page"},{"location":"examples/tetheredwing/","page":"Tethered Wing","title":"Tethered Wing","text":"(red = beginning,\nblue = end)","category":"page"},{"location":"examples/tetheredwing/","page":"Tethered Wing","title":"Tethered Wing","text":"
\n \"Pic\n
","category":"page"},{"location":"examples/tetheredwing/","page":"Tethered Wing","title":"Tethered Wing","text":"info: Disable monitors to speed up simulation\nFor unknown reasons, the simulation oftentimes halts in between time steps while plotting the monitors. This slows down the overall simulation time, sometimes taking up to 2x longer. If you are not particularly interested in the plots of the monitors, you can disable the plots passing the keyword disp_plot=false to each monitor generator.","category":"page"},{"location":"examples/tetheredwing/","page":"Tethered Wing","title":"Tethered Wing","text":"info: ParaView visualization\nThe .pvsm file visualizing the simulation as shown at the top of this page is available here: LINK (right click → save as...).To open in ParaView: File → Load State → (select .pvsm file) then select \"Search files under specified directory\" and point it to the folder where the simulation was saved.","category":"page"},{"location":"examples/vahana-run/#vahanarun","page":"Run Simulation","title":"Run Simulation","text":"","category":"section"},{"location":"examples/vahana-run/","page":"Run Simulation","title":"Run Simulation","text":"A mid fidelity resolution makes the computational cost tractable and possible to be run the full maneuver (30 seconds of real time) overnight on a laptop computer. This is a video of the full maneuver in mid fidelity:","category":"page"},{"location":"examples/vahana-run/","page":"Run Simulation","title":"Run Simulation","text":"
\n \n
","category":"page"},{"location":"examples/vahana-run/","page":"Run Simulation","title":"Run Simulation","text":"With a finer temporal and spatial resolution, it becomes impractical to resolve the entire maneuver, and instead we recommend simulating one fragment of the maneuver at a time. For instance, here is a high-fidelity simulation of the transition from hover to cruise:","category":"page"},{"location":"examples/vahana-run/","page":"Run Simulation","title":"Run Simulation","text":"
\n \n
","category":"page"},{"location":"examples/vahana-run/","page":"Run Simulation","title":"Run Simulation","text":"As a reference, here are the parameters that we have used for the mid and high fidelity simulations:","category":"page"},{"location":"examples/vahana-run/","page":"Run Simulation","title":"Run Simulation","text":"Parameter Mid fidelity High fidelity Description\nn_factor 1 4 Factor that controls the level of discretization of wings and blade surfaces\nnsteps 4*5400 8*5400 Time steps for the entire maneuver\nt_start 0 0.20*ttot (s) start simulation at this point in time\nt_quit ttot 0.30*ttot (s) end imulation at this point in time\nlambda_vpm 2.125 1.5*2.125 VPM core overlap\nvlm_vortexsheet false true Whether to spread the wing surface vorticity as a vortex sheet\nvpm_integration vpm.euler vpm.rungekutta3 VPM time integration scheme","category":"page"},{"location":"examples/vahana-run/","page":"Run Simulation","title":"Run Simulation","text":"
","category":"page"},{"location":"examples/vahana-run/","page":"Run Simulation","title":"Run Simulation","text":"Along the way, in this simulation we exemplify the following advanced features:","category":"page"},{"location":"examples/vahana-run/","page":"Run Simulation","title":"Run Simulation","text":"Defining a variable pitch for rotors between hover and cruise\nUsing the actuator surface model for wing surfaces\nDefining a wake treatment that speeds up the simulation by removing particles that can be neglected","category":"page"},{"location":"examples/vahana-run/","page":"Run Simulation","title":"Run Simulation","text":"
","category":"page"},{"location":"examples/vahana-run/","page":"Run Simulation","title":"Run Simulation","text":"#=##############################################################################\n# DESCRIPTION\n Simulation of eVTOL transition maneuver of a tandem tilt-wing multirotor\n aircraft. The aircraft configuration resembles the Vahana eVTOL aircraft\n but with tilt, stacked, and variable-pitch rotors.\n\n# AUTHORSHIP\n * Author : Eduardo J. Alvarez (edoalvarez.com)\n * Email : Edo.AlvarezR@gmail.com\n * Created : Feb 2021\n * Last updated : Feb 2021\n * License : MIT\n=###############################################################################\n\n\n\nimport FLOWUnsteady as uns\nimport FLOWUnsteady: vlm, vpm, gt, Im\n\ninclude(joinpath(uns.examples_path, \"vahana\", \"vahana_vehicle.jl\"))\ninclude(joinpath(uns.examples_path, \"vahana\", \"vahana_maneuver.jl\"))\ninclude(joinpath(uns.examples_path, \"vahana\", \"vahana_monitor.jl\"))\n\nrun_name = \"vahana\" # Name of this simulation\nsave_path = \"vahana-example\" # Where to save this simulation\nparaview = true # Whether to visualize with Paraview\n\n# ----------------- GEOMETRY PARAMETERS ----------------------------------------\nn_factor = 1 # Discretization factor\nadd_wings = true # Whether to include wings\nadd_rotors = true # Whether to include rotors\n\n# Reference lengths\nR = 0.75 # (m) reference blade radius\nb = 5.86 # (m) reference wing span\nchord = b/7.4 # (m) reference wing chord\nthickness = 0.04*chord # (m) reference wing thickness\n\n# ----------------- SIMULATION PARAMETERS --------------------------------------\n# Maneuver settings\nVcruise = 15.0 # (m/s) cruise speed (reference)\nRPMh_w = 600.0 # RPM of main-wing rotors in hover (reference)\nttot = 30.0 # (s) total time to perform maneuver\n\nuse_variable_pitch = true # Whether to use variable pitch in cruise\n\n# Freestream\nVinf(X,t) = 1e-5*[1, 0, -1] # (m/s) freestream velocity (if 0 the solvers can become unstable)\nrho = 1.225 # (kg/m^3) air density\nmu = 1.81e-5 # (kg/ms) air dynamic viscosity\n\n# NOTE: Use these parameters to start and end the simulation at any arbitrary\n# point along the eVTOL maneuver (tstart=0 and tquit=ttot will simulate\n# the entire maneuver, tstart=0.20*ttot will start it at the beginning of\n# the hover->cruise transition)\ntstart = 0.00*ttot # (s) start simulation at this point in time\ntquit = 1.00*ttot # (s) end simulation at this point in time\n\nstart_kinmaneuver = true # If true, it starts the maneuver with the\n # velocity and angles of tstart.\n # If false, starts with velocity=0\n # and angles as initiated by the geometry\n# ----------------- SOLVER PARAMETERS ------------------------------------------\n\n# Aerodynamic solver\nVehicleType = uns.UVLMVehicle # Unsteady solver\n# VehicleType = uns.QVLMVehicle # Quasi-steady solver\n\n# Time parameters\nnsteps = 4*5400 # Time steps for entire maneuver\ndt = ttot/nsteps # (s) time step\n\n# VPM particle shedding\np_per_step = 5 # Sheds per time step\nshed_starting = false # Whether to shed starting vortex\nshed_unsteady = true # Whether to shed vorticity from unsteady loading\nunsteady_shedcrit = 0.001 # Shed unsteady loading whenever circulation\n # fluctuates by more than this ratio\n\n# Regularization of embedded vorticity\nsigma_vlm_surf = b/400 # VLM-on-VPM smoothing radius\nsigma_rotor_surf= R/20 # Rotor-on-VPM smoothing radius\nlambda_vpm = 2.125 # VPM core overlap\n # VPM smoothing radius\nsigma_vpm_overwrite = lambda_vpm * (2*pi*RPMh_w/60*R + Vcruise)*dt / p_per_step\nsigmafactor_vpmonvlm = 1 # Shrink particles by this factor when\n # calculating VPM-on-VLM/Rotor induced velocities\n\n# Rotor solver\nvlm_rlx = 0.2 # VLM relaxation <-- this also applied to rotors\nhubtiploss_correction = vlm.hubtiploss_correction_prandtl # Hub and tip correction\n\n# Wing solver: actuator surface model (ASM)\nvlm_vortexsheet = false # Whether to spread the wing surface vorticity as a vortex sheet (activates ASM)\nvlm_vortexsheet_overlap = 2.125 # Overlap of the particles that make the vortex sheet\nvlm_vortexsheet_distribution= uns.g_pressure# Distribution of the vortex sheet\n# vlm_vortexsheet_sigma_tbv = thickness*chord / 100 # Size of particles in trailing bound vortices\nvlm_vortexsheet_sigma_tbv = sigma_vpm_overwrite\n # How many particles to preallocate for the vortex sheet\nvlm_vortexsheet_maxstaticparticle = vlm_vortexsheet==false ? nothing : 6000000\n\n# Wing solver: force calculation\nKJforce_type = \"regular\" # KJ force evaluated at middle of bound vortices_vortexsheet also true)\ninclude_trailingboundvortex = false # Include trailing bound vortices in force calculations\n\ninclude_unsteadyforce = true # Include unsteady force\nadd_unsteadyforce = false # Whether to add the unsteady force to Ftot or to simply output it\n\ninclude_parasiticdrag = true # Include parasitic-drag force\nadd_skinfriction = true # If false, the parasitic drag is purely parasitic, meaning no skin friction\ncalc_cd_from_cl = false # Whether to calculate cd from cl or effective AOA\nwing_polar_file = \"xf-n0012-il-500000-n5.csv\" # Airfoil polar for parasitic drag\n\n\n# VPM solver\n# vpm_integration = vpm.rungekutta3 # VPM temporal integration scheme\nvpm_integration = vpm.euler\n\nvpm_viscous = vpm.Inviscid() # VPM viscous diffusion scheme\n# vpm_viscous = vpm.CoreSpreading(-1, -1, vpm.zeta_fmm; beta=100.0, itmax=20, tol=1e-1)\n\n# vpm_SFS = vpm.SFS_none # VPM LES subfilter-scale model\nvpm_SFS = vpm.DynamicSFS(vpm.Estr_fmm, vpm.pseudo3level_positive;\n alpha=0.999, maxC=1.0,\n clippings=[vpm.clipping_backscatter],\n controls=[vpm.control_directional, vpm.control_magnitude])\n\nif VehicleType == uns.QVLMVehicle\n # Mute warnings regarding potential colinear vortex filaments. This is\n # needed since the quasi-steady solver will probe induced velocities at the\n # lifting line of the blade\n uns.vlm.VLMSolver._mute_warning(true)\nend\n\n\n\n\n# ----------------- 1) VEHICLE DEFINITION --------------------------------------\nvehicle = generate_vahana_vehicle(; xfoil = false,\n n_factor = n_factor,\n add_wings = add_wings,\n add_rotors = add_rotors,\n VehicleType = VehicleType,\n run_name = \"vahana\"\n )\n\n\n\n# ------------- 2) MANEUVER DEFINITION -----------------------------------------\nmaneuver = generate_maneuver_vahana(; add_rotors=add_rotors)\n\n# Plot maneuver before running the simulation\nuns.plot_maneuver(maneuver)\n\n\n\n# ------------- 3) SIMULATION DEFINITION ---------------------------------------\n# Reference parameters\nVref = Vcruise # Reference velocity to scale maneuver by\nRPMref = RPMh_w # Reference RPM to scale maneuver by\n\n# Initial conditions\nt0 = tstart/ttot*start_kinmaneuver # Time at start of simulation\nVinit = Vref*maneuver.Vvehicle(t0) # Initial vehicle velocity\nWinit = pi/180 * (maneuver.anglevehicle(t0+1e-12)- maneuver.anglevehicle(t0))/(ttot*1e-12) # Initial angular velocity\n\n# Define simulation\nsimulation = uns.Simulation(vehicle, maneuver, Vref, RPMref, ttot;\n Vinit=Vinit, Winit=Winit, t=tstart);\n\n# Maximum number of particles (for pre-allocating memory)\nmax_particles = ceil(Int, (nsteps+2)*(2*vlm.get_m(vehicle.wake_system)*(p_per_step+1) + p_per_step) )\nmax_particles = tquit != Inf ? ceil(Int, max_particles*(tquit-tstart)/ttot) : max_particles\nmax_particles = min(10000000, max_particles)\nmax_particles = VehicleType==uns.QVLMVehicle ? 10000 : max_particles\n\n\n\n\n\n\n# ------------- 4) MONITORS DEFINITIONS ----------------------------------------\n\n# ------------- Routine for force calculation on wings\nforces = []\n\n# Calculate Kutta-Joukowski force\nkuttajoukowski = uns.generate_aerodynamicforce_kuttajoukowski(KJforce_type,\n sigma_vlm_surf, sigma_rotor_surf,\n vlm_vortexsheet, vlm_vortexsheet_overlap,\n vlm_vortexsheet_distribution,\n vlm_vortexsheet_sigma_tbv;\n vehicle=vehicle)\npush!(forces, kuttajoukowski)\n\n\n# Force due to unsteady circulation\nif include_unsteadyforce\n unsteady(args...; optargs...) = uns.calc_aerodynamicforce_unsteady(args...; add_to_Ftot=add_unsteadyforce, optargs...)\n\n push!(forces, unsteady)\nend\n\n# Parasatic-drag force (form drag and skin friction)\nif include_parasiticdrag\n parasiticdrag = uns.generate_aerodynamicforce_parasiticdrag(wing_polar_file;\n calc_cd_from_cl=calc_cd_from_cl,\n add_skinfriction=add_skinfriction)\n push!(forces, parasiticdrag)\nend\n\n\n# Stitch all the forces into one function\nfunction calc_aerodynamicforce_fun(vlm_system, args...; per_unit_span=false, optargs...)\n\n # Delete any previous force field\n fieldname = per_unit_span ? \"ftot\" : \"Ftot\"\n if fieldname in keys(vlm_system.sol)\n pop!(vlm_system.sol, fieldname)\n end\n\n Ftot = nothing\n\n for force in forces\n Ftot = force(vlm_system, args...; per_unit_span=per_unit_span, optargs...)\n end\n\n return Ftot\nend\n\n\n# Extra options for generation of wing monitors\nwingmonitor_optargs = (\n include_trailingboundvortex=include_trailingboundvortex,\n calc_aerodynamicforce_fun=calc_aerodynamicforce_fun\n )\n\n# ------------- Create monitors\nmonitors = generate_monitor_vahana(vehicle, rho, RPMref, nsteps,\n save_path, Vinf;\n add_wings=add_wings,\n wingmonitor_optargs=wingmonitor_optargs)\n\n\n\n\n# ------------- INTERMEDIATE STEP BEFORE RUN ------------------------------------\n\n# ------------- Define function for variable pitch\n\n# Original blade twists\norg_theta = [\n [\n deepcopy(rotor._theta) for (ri, rotor) in enumerate(rotors)\n ]\n for (si, rotors) in enumerate(simulation.vehicle.rotor_systems)\n ]\n\n# End time of each stage\n# Stage 1: [0, t1] -> Take off\n# Stage 2: [t1, t2] -> Transition\n# Stage 3: [t2, t3] -> Cruise\n# Stage 4: [t3, t4] -> Transition\n# Stage 5: [t4, 1] -> Landing\nt1, t2, t3, t4 = 0.2, 0.3, 0.5, 0.6\n\n# Pitch at each stage\npitch_takeoff = 0\npitch_cruise = 35\npitch_landing = 0\n\n# Function for smoothly transitioning pitch between stages\ncollective(tstr) = tstr < t1 ? pitch_takeoff :\n tstr < t2 ? pitch_takeoff + (pitch_cruise-pitch_takeoff)*(tstr-t1)/(t2-t1) :\n tstr < t3 ? pitch_cruise :\n tstr < t4 ? pitch_cruise + (pitch_landing-pitch_cruise)*(tstr-t3)/(t4-t3) :\n pitch_landing\n\nfunction variable_pitch(sim, args...; optargs...)\n\n if !use_variable_pitch\n return false\n end\n\n tstr = sim.t/sim.ttot # Non-dimensional time\n\n for (si, rotors) in enumerate(sim.vehicle.rotor_systems)\n for (ri, rotor) in enumerate(rotors)\n\n if si==1 # Main wing rotors\n\n # Restore original twist distribution\n rotor._theta .= org_theta[si][ri]\n\n # Add collective pitch\n rotor._theta .+= 1.0 * (-1)^(rotor.CW)*collective(tstr)\n\n elseif si==2 # Stacked upper rotors\n nothing\n\n elseif si==3 # Stacked lower rotors\n nothing\n\n elseif si==4 # Tandem-wing rotors\n rotor._theta .= org_theta[si][ri]\n rotor._theta .+= 1.25 * (-1)^(rotor.CW)*collective(tstr)\n\n end\n\n end\n end\n\n return false\nend\n\n\n# ------------- Define wake treatment\n\n# Remove by particle strength\n# (remove particles neglibly faint, remove blown up)\nrmv_strngth = 2*2/p_per_step * dt/(30/(4*5400)) # Reference strength\nminmaxGamma = rmv_strngth*[0.0001, 0.05] # Strength bounds (removes particles outside of these bounds)\nwake_treatment_strength = uns.remove_particles_strength( minmaxGamma[1]^2, minmaxGamma[2]^2; every_nsteps=1)\n\n# Remove by particle size\n# (remove particle nearly singular, remove negligibly smeared)\nminmaxsigma = sigma_vpm_overwrite*[0.1, 5] # Size bounds (removes particles outside of these bounds)\nwake_treatment_sigma = uns.remove_particles_sigma( minmaxsigma[1], minmaxsigma[2]; every_nsteps=1)\n\n# Remove by distance\n# (remove particles outside of the computational domain of interest, i.e., far from vehicle)\nwake_treatment_sphere = uns.remove_particles_sphere((1.25*b)^2, 1; Xoff=[4.0, 0, 0])\n\n# Concatenate all wake treatments\nwake_treatment = uns.concatenate(wake_treatment_sphere, wake_treatment_strength, wake_treatment_sigma)\n\n\n\n# ------------- Define runtime function: monitors + variable pitch + wake treatment\nruntime_function = uns.concatenate(wake_treatment, monitors, variable_pitch)\n\n\n\n\n\n\n# ------------- 5) RUN SIMULATION ----------------------------------------------\nprintln(\"Running simulation...\")\n\n\n# Run simulation\nuns.run_simulation(simulation, nsteps;\n # ----- SIMULATION OPTIONS -------------\n Vinf=Vinf,\n rho=rho, mu=mu, tquit=tquit,\n # ----- SOLVERS OPTIONS ----------------\n p_per_step=p_per_step,\n max_particles=max_particles,\n max_static_particles=vlm_vortexsheet_maxstaticparticle,\n vpm_integration=vpm_integration,\n vpm_viscous=vpm_viscous,\n vpm_SFS=vpm_SFS,\n sigma_vlm_surf=sigma_vlm_surf,\n sigma_rotor_surf=sigma_rotor_surf,\n sigma_vpm_overwrite=sigma_vpm_overwrite,\n sigmafactor_vpmonvlm=sigmafactor_vpmonvlm,\n vlm_vortexsheet=vlm_vortexsheet,\n vlm_vortexsheet_overlap=vlm_vortexsheet_overlap,\n vlm_vortexsheet_distribution=vlm_vortexsheet_distribution,\n vlm_vortexsheet_sigma_tbv=vlm_vortexsheet_sigma_tbv,\n vlm_rlx=vlm_rlx,\n hubtiploss_correction=hubtiploss_correction,\n shed_starting=shed_starting,\n shed_unsteady=shed_unsteady,\n unsteady_shedcrit=unsteady_shedcrit,\n extra_runtime_function=runtime_function,\n # ----- OUTPUT OPTIONS ------------------\n save_path=save_path,\n run_name=run_name,\n save_wopwopin=true, # <--- Generates input files for PSU-WOPWOP noise analysis\n );","category":"page"},{"location":"api/flowunsteady-maneuver/#(2)-Maneuver-Definition","page":"(2) Maneuver Definition","title":"(2) Maneuver Definition","text":"","category":"section"},{"location":"api/flowunsteady-maneuver/","page":"(2) Maneuver Definition","title":"(2) Maneuver Definition","text":"FLOWUnsteady.KinematicManeuver\nFLOWUnsteady.DynamicManeuver\n\nFLOWUnsteady.plot_maneuver\nFLOWUnsteady.visualize_kinematics","category":"page"},{"location":"api/flowunsteady-maneuver/#FLOWUnsteady.KinematicManeuver","page":"(2) Maneuver Definition","title":"FLOWUnsteady.KinematicManeuver","text":"KinematicManeuver{N, M}(angle, RPM, Vvehicle, anglevehicle)\n\nA vehicle maneuver that prescribes the kinematics of the vehicle through the functions Vvehicle and anglevehicle. Control inputs to each tilting and rotor systems are given by the collection of functions angle and RPM, respectively.\n\nARGUMENTS\n\nangle::NTuple{N, Function} where angle[i](t) returns the angles [Ax, Ay, Az] (in degrees) of the i-th tilting system at time t (t is nondimensionalized by the total time of the maneuver, from 0 to 1, beginning to end).\nRPM::NTuple{M, Function} where RPM[i](t) returns the normalized RPM of the i-th rotor system at time t. These RPM values are normalized by an arbitrary RPM value (usually RPM in hover or cruise).\nVvehicle::Function where Vvehicle(t) returns the normalized vehicle velocity [Vx, Vy, Vz] at the normalized time t. The velocity is normalized by a reference velocity (typically, cruise velocity).\nanglevehicle::Function where anglevehicle(t) returns the angles [Ax, Ay, Az] (in degrees) of the vehicle relative to the global coordinate system at the normalized time t.\n\n\n\n\n\n","category":"type"},{"location":"api/flowunsteady-maneuver/#FLOWUnsteady.DynamicManeuver","page":"(2) Maneuver Definition","title":"FLOWUnsteady.DynamicManeuver","text":"DynamicManeuver{N, M}(angle, RPM)\n\nA vehicle maneuver that automatically couples the kinematics of the vehicle with the forces and moments, resulting in a fully dynamic simulation. Control inputs to each tilting and rotor systems are given by the collection of functions angle and RPM, respectively.\n\nNOTE: This methods has not been implemented yet, but it may be developed in future versions of FLOWunsteady.\n\n\n\n\n\n","category":"type"},{"location":"api/flowunsteady-maneuver/#FLOWUnsteady.plot_maneuver","page":"(2) Maneuver Definition","title":"FLOWUnsteady.plot_maneuver","text":"plot_maneuver(maneuver::KinematicManeuver; ti::Real=0, tf::Real=1,\n vis_nsteps=300, figname=\"maneuver\", tstages=[])\n\nPlots the kinematics and controls of a KinematicManeuver.\n\n(Image: image) (Image: image)\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-maneuver/#FLOWUnsteady.visualize_kinematics","page":"(2) Maneuver Definition","title":"FLOWUnsteady.visualize_kinematics","text":"visualize_kinematics(sim::Simulation, nsteps::Int, save_path::String)\n\nSteps the vehicle through the prescribed kinematics, outputting VTK files of the vehicle at every time step. Use this to visualize and debug a maneuver.\n\nnsteps is the number of time steps in which to perform the maneuver. save_path is the path where to save the VTK files.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-postprocessing-misc/#miscellaneous","page":"Miscellaneous","title":"Miscellaneous","text":"","category":"section"},{"location":"api/flowunsteady-postprocessing-misc/","page":"Miscellaneous","title":"Miscellaneous","text":" FLOWUnsteady.postprocess_statistics\n FLOWUnsteady.postprocess_bladeloading","category":"page"},{"location":"api/flowunsteady-postprocessing-misc/#FLOWUnsteady.postprocess_statistics","page":"Miscellaneous","title":"FLOWUnsteady.postprocess_statistics","text":"postprocess_statistics(read_path, save_path, nums;\n # PROCESSING OPTIONS\n idens = [\"\"], # Use this to agglomerate multiple simulations\n to_exclude = [], # Exclude file names containing these words\n cyl_axial_dir = nothing, # Calculate cylindrical statistics if given an axial axis (vector)\n # OUTPUT OPTIONS\n prompt=true, debug=false,\n verbose=true, v_lvl=0)\n\nCalculate statistics of the simulation VTK outputs over a given range of time steps given by nums. Use this to calculate, for instance, the mean load distribution and fluctuations on wings and rotors.\n\n\n\n\n\n","category":"function"},{"location":"api/flowunsteady-postprocessing-misc/#FLOWUnsteady.postprocess_bladeloading","page":"Miscellaneous","title":"FLOWUnsteady.postprocess_bladeloading","text":"postprocess_bladeloading(read_path;\n O = zeros(3), # Rotor center\n rotor_axis = [-1, 0, 0], # Rotor centerline axis\n Ftot_axis = nothing, # Use a different centerline axis for forces if given\n filename = \"singlerotor_Rotor_Blade1_vlm-statistics.vtk\", # File name\n fieldsuff = \"-mean\" # Suffix of fields \"Gamma\" and \"Ftot\", if any\n )\n\nRead a blade VTK file filename under directory read_path and returns the circulation and force components of the load distribution along the blade.\n\nReturn: rs, Gamma, Np, Tp, Rp, Zhat, Rhat, That, Ftot\n\n\n\n\n\n","category":"function"}] } diff --git a/sitemap.xml.gz b/sitemap.xml.gz index 03647751..cb5647ff 100644 Binary files a/sitemap.xml.gz and b/sitemap.xml.gz differ diff --git a/theory/convergence/index.html b/theory/convergence/index.html index 1ac864ce..bd62ea01 100644 --- a/theory/convergence/index.html +++ b/theory/convergence/index.html @@ -3,7 +3,7 @@ function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-B7CBF7WC7L', {'page_path': location.pathname + location.search + location.hash}); -

Convergence

The following is a compilation of convergence studies found in the literature using FLOWUnsteady.

Wing Performance

Source: E. J. Alvarez, 2022[1]

+

Convergence

The following is a compilation of convergence studies found in the literature using FLOWUnsteady.

Wing Performance

Source: E. J. Alvarez, 2022[1]

Pic here Pic here

Case: $45^\circ$ swept-back wing at an angle of attack of $4.2^\circ$. Aspect ratio of 5.0, RAE 101 airfoil section with 12% thickness, no dihedral, twist, nor taper. Freestream velocity of $49.7,\mathrm{m/s}$, corresponding to a chord-based Reynolds number of $1.7 \times 10^6$. Convergence of loading distribution and integrated lift and drag as the number of wing elements is increased.

Takeaways:

  • Resolving the wake for about 1.5 span-distances is sufficient to converge wing loading
  • Using between 100 and 200 elements fully resolves the wing loading ($C_D$ changes by less than 1% with $n_\mathrm{wing} > 100$)
@@ -54,7 +54,7 @@ alt="Pic here" style="width: 100%;"/> -

Beaver Propeller Case

Source: E. J. Alvarez, 2022[1], and E. J. Alvarez and A. Ning, 2023[3]

+

Beaver Propeller Case

Source: E. J. Alvarez, 2022[1], and E. J. Alvarez and A. Ning, 2022[3]

Pic here

Case: Beaver propeller at an advance ratio of 0.8, tip Mach number of 0.46, and $\mathrm{Re}_{0.7D} = 1.8 \times 10^6$. Convergence of thrust, torque, and blade loading w.r.t. the following parameters:

  • $N_\mathrm{sheds}$, number of particle sheds per revolution.
  • $n$, number of blade elements per blade.

Constant parameters: $N_\mathrm{steps}=72$ and $\lambda=\frac{\sigma}{\Delta x} = \frac{\sigma N_\mathrm{sheds}}{2\pi R} = 2.125$, which leads to a decreasing $\sigma$ as $N_\mathrm{sheds}$increases.

@@ -66,7 +66,7 @@ alt="Pic here" style="width: 90%;"/>
-

Rotor Wake

Source: E. J. Alvarez, 2022[1], and E. J. Alvarez and A. Ning, 2023[3]

Case: Continuation of Beaver propeller convergence study. Wake structure and flow field compared to experimental PIV measurements.

Takeaways: Even though the aerodynamic performance of the rotor (thrust, torque, and blade loading) is sufficiently converged with $N_\mathrm{sheds}=144$ and $n=50$, higher refinement might be needed in order to properly time-resolve the vortical structure downstream of the rotor (which might be important when the rotor wake impinges on another surface). However, $N_\mathrm{sheds}=144$ and $n=50$ is sufficient to capture the time-average velocity in the wake. This study shows that tip vortices and the inner vortex sheet can be resolved with as much granularity as desired by going to finer discretizations.

+

Rotor Wake

Source: E. J. Alvarez, 2022[1], and E. J. Alvarez and A. Ning, 2022[3]

Case: Continuation of Beaver propeller convergence study. Wake structure and flow field compared to experimental PIV measurements.

Takeaways: Even though the aerodynamic performance of the rotor (thrust, torque, and blade loading) is sufficiently converged with $N_\mathrm{sheds}=144$ and $n=50$, higher refinement might be needed in order to properly time-resolve the vortical structure downstream of the rotor (which might be important when the rotor wake impinges on another surface). However, $N_\mathrm{sheds}=144$ and $n=50$ is sufficient to capture the time-average velocity in the wake. This study shows that tip vortices and the inner vortex sheet can be resolved with as much granularity as desired by going to finer discretizations.

Pic here @@ -101,4 +101,4 @@ alt="Pic here" style="width: 90%;"/>
-
  • 1E. J. Alvarez (2022), "Reformulated Vortex Particle Method and Meshless Large Eddy Simulation of Multirotor Aircraft," Doctoral Dissertation, Brigham Young University. [PDF]
  • 2E. J. Alvarez & A. Ning (2020), "High-Fidelity Modeling of Multirotor Aerodynamic Interactions for Aircraft Design," AIAA Journal. [DOI] [PDF]
  • 3E. J. Alvarez & A. Ning (2023), "Meshless Large Eddy Simulation of Propeller-Wing Interactions Through the Reformulated Vortex Particle Method," Journal of Aircraft. [DOI] [PDF]
  • 4J. Mehr, E. J. Alvarez, & A. Ning (2022), "Interactional Aerodynamics Analysis of a Multi-Rotor Energy Kite," (in review).
+
  • 1E. J. Alvarez (2022), "Reformulated Vortex Particle Method and Meshless Large Eddy Simulation of Multirotor Aircraft," Doctoral Dissertation, Brigham Young University. [PDF]
  • 2E. J. Alvarez & A. Ning (2020), "High-Fidelity Modeling of Multirotor Aerodynamic Interactions for Aircraft Design," AIAA Journal. [DOI] [PDF]
  • 3E. J. Alvarez & A. Ning (2022), "Meshless Large Eddy Simulation of Rotor-Wing Interactions with Reformulated Vortex Particle Method," (in review).
  • 4J. Mehr, E. J. Alvarez, & A. Ning (2022), "Interactional Aerodynamics Analysis of a Multi-Rotor Energy Kite," (in review).
diff --git a/theory/publications/index.html b/theory/publications/index.html index c35533d8..75d0d5bd 100644 --- a/theory/publications/index.html +++ b/theory/publications/index.html @@ -3,5 +3,5 @@ function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-B7CBF7WC7L', {'page_path': location.pathname + location.search + location.hash}); -

Publications

The following is a compilation of studies that have used FLOWUnsteady

  • Sarojini D., et al, (2024) “Review of Computational Models for Large-Scale MDAO of Urban Air Mobility Concepts,” AIAA SCITECH Forum. [DOI]

  • S. Shahjahan, A. Gong, A. Moore, D. Verstraete, (2024) “Optimisation of proprotors for tilt-wing eVTOL aircraft,” Aerospace Science and Technology. [PDF]

  • E. J. Alvarez, C. Joseph, & A. Ning (2023), "Vortex Particle Method for Electric Ducted Fan in Non-Axisymmetric Flow," AIAA AVIATION Forum. [PDF]

  • Anderson, R., Ning, A., Xiang, R., Schie, S. P. C. van, Sperry, M., Sarojini, D., Kamensky, D., & Hwang, J. T., (2023) “Aerostructural Predictions Combining FEniCS and a Viscous Vortex Particle Method,” AIAA SCITECH Forum. [PDF]

  • E. J. Alvarez & A. Ning (2023), "Meshless Large Eddy Simulation of Propeller-Wing Interactions Through the Reformulated Vortex Particle Method," Journal of Aircraft. [PDF]

  • E. J. Alvarez & A. Ning (2023), "Stable Vortex Particle Method Formulation for Meshless Large-Eddy Simulation," AIAA Journal. [PDF]

  • E. J. Alvarez (2022), "Reformulated Vortex Particle Method and Meshless Large Eddy Simulation of Multirotor Aircraft," Doctoral Dissertation, Brigham Young University. [PDF]

  • J. Mehr, E. J. Alvarez, & A. Ning (2022), "Interactional Aerodynamics Analysis of a Multi-Rotor Energy Kite," (in review).

  • E. J. Alvarez, J. Mehr, & A. Ning (2022), "FLOWUnsteady: An Interactional Aerodynamics Solver for Multirotor Aircraft and Wind Energy," AIAA AVIATION Forum. [VIDEO] [PDF]

  • R. M. Erhard & J. J. Alonso (2022), "Comparison of Propeller Wake Models for Distributed Electric Propulsion and eVTOL Aircraft in Complex Flow Conditions," AIAA SciTech Forum. [PDF]

  • E. J. Alvarez & A. Ning (2020), "High-Fidelity Modeling of Multirotor Aerodynamic Interactions for Aircraft Design," AIAA Journal. [DOI] [PDF]

  • J. Mehr, E. J. Alvarez, & A. Ning (2020), "Unsteady Aerodynamic Analysis of Wind Harvesting Aircraft," AIAA AVIATION Forum. [VIDEO] [PDF]

  • E. J. Alvarez, A. Schenk, T. Critchfield, & A. Ning (2020), “Rotor-on-Rotor Aeroacoustic Interactions of Multirotor in Hover,” VFS 76th Forum. [PDF]

  • E. J. Alvarez & A. Ning (2019), "Modeling Multirotor Aerodynamic Interactions Through the Vortex Particle Method," AIAA AVIATION Forum. [PDF]

  • E. J. Alvarez & A. Ning (2018). "Development of a Vortex Particle Code for the Modeling of Wake Interaction in Distributed Propulsion," AIAA AVIATION Forum. [PDF]

Vid here
+

Publications

The following is a compilation of studies that have used FLOWUnsteady

  • Anderson, R., Ning, A., Xiang, R., Schie, S. P. C. van, Sperry, M., Sarojini, D., Kamensky, D., & Hwang, J. T., (2023) “Aerostructural Predictions Combining FEniCS and a Viscous Vortex Particle Method,” AIAA SCITECH Forum. [PDF]

  • E. J. Alvarez (2022), "Reformulated Vortex Particle Method and Meshless Large Eddy Simulation of Multirotor Aircraft," Doctoral Dissertation, Brigham Young University. [PDF]

  • E. J. Alvarez & A. Ning (2022), "Reviving the Vortex Particle Method: A Stable Formulation for Meshless Large Eddy Simulation," (in review). [PDF]

  • E. J. Alvarez & A. Ning (2022), "Meshless Large Eddy Simulation of Rotor-Wing Interactions Through the Reformulated Vortex Particle Method," (in review).

  • J. Mehr, E. J. Alvarez, & A. Ning (2022), "Interactional Aerodynamics Analysis of a Multi-Rotor Energy Kite," (in review).

  • E. J. Alvarez, J. Mehr, & A. Ning (2022), "FLOWUnsteady: An Interactional Aerodynamics Solver for Multirotor Aircraft and Wind Energy," AIAA AVIATION Forum. [VIDEO] [PDF]

  • R. M. Erhard & J. J. Alonso (2022), "Comparison of Propeller Wake Models for Distributed Electric Propulsion and eVTOL Aircraft in Complex Flow Conditions," AIAA SciTech Forum. [PDF]

  • E. J. Alvarez & A. Ning (2020), "High-Fidelity Modeling of Multirotor Aerodynamic Interactions for Aircraft Design," AIAA Journal. [DOI] [PDF]

  • J. Mehr, E. J. Alvarez, & A. Ning (2020), "Unsteady Aerodynamic Analysis of Wind Harvesting Aircraft," AIAA AVIATION Forum. [VIDEO] [PDF]

  • E. J. Alvarez, A. Schenk, T. Critchfield, & A. Ning (2020), “Rotor-on-Rotor Aeroacoustic Interactions of Multirotor in Hover,” VFS 76th Forum. [PDF]

  • E. J. Alvarez & A. Ning (2019), "Modeling Multirotor Aerodynamic Interactions Through the Vortex Particle Method," AIAA AVIATION Forum. [PDF]

  • E. J. Alvarez & A. Ning (2018). "Development of a Vortex Particle Code for the Modeling of Wake Interaction in Distributed Propulsion," AIAA AVIATION Forum. [PDF]

Vid here
diff --git a/theory/rvpm/index.html b/theory/rvpm/index.html index 532ba921..386a7be8 100644 --- a/theory/rvpm/index.html +++ b/theory/rvpm/index.html @@ -3,7 +3,7 @@ function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-B7CBF7WC7L', {'page_path': location.pathname + location.search + location.hash}); -

Reformulated VPM

The following is an excerpt from E. J. Alvarez & A. Ning (2022), "Meshless Large Eddy Simulation of Rotor-Wing Interactions Through the Reformulated Vortex Particle Method," (in review).

Vorticity Navier-Stokes

In recent work[1][2], a new formulation of the vortex particle method (VPM) has been derived from the LES-filtered Navier-Stokes equations. The new method, referred to as the reformulated VPM or rVPM, is an LES that is both numerically stable and meshless, and is able to accurately resolve mean and fluctuating large-scale features of turbulent flow with minimal computational effort. Hereby we concisely summarize the governing equations of the reformulated VPM, and the reader is referred to Ref.[1] and the doctoral dissertation[2] accompanying this work for a detailed derivation of the method.

The reformulated VPM uses a Lagrangian scheme to solve the vorticity form of the LES-filtered Navier-Stokes equations

\[\begin{align} +

Reformulated VPM

The following is an excerpt from E. J. Alvarez & A. Ning (2022), "Meshless Large Eddy Simulation of Rotor-Wing Interactions Through the Reformulated Vortex Particle Method," (in review).

Vorticity Navier-Stokes

In recent work[1][2], a new formulation of the vortex particle method (VPM) has been derived from the LES-filtered Navier-Stokes equations. The new method, referred to as the reformulated VPM or rVPM, is an LES that is both numerically stable and meshless, and is able to accurately resolve mean and fluctuating large-scale features of turbulent flow with minimal computational effort. Hereby we concisely summarize the governing equations of the reformulated VPM, and the reader is referred to Ref.[1] and the doctoral dissertation[2] accompanying this work for a detailed derivation of the method.

The reformulated VPM uses a Lagrangian scheme to solve the vorticity form of the LES-filtered Navier-Stokes equations

\[\begin{align} \frac{\partial \overline{ \omega_i }}{\partial t} + \overline{ u_j } \frac{\partial \overline{ \omega_i }}{\partial x_j} & = @@ -225,4 +225,4 @@ \times \boldsymbol\Gamma_b }_{\overline{\mathbf{u}}_\mathrm{bound}} -,\end{align*}\]

which includes the velocity induced by both free and bound vorticity components, and where $\mathbf{K}\left( \mathbf{x} \right) \equiv - \frac{1}{4\pi} \frac{\mathbf{x}}{\Vert\mathbf{x}\Vert^3}$. Thus, the evolution of the free particles is influenced by the vorticity immersed at the solid boundaries, affecting their convection and vortex stretching through the velocity field induced by the bound particles.

The immersed vorticity not only affects the evolution of existing free vorticity, but it also creates new free vorticity at the boundary through viscous diffusion. In reality, vorticity is created in the boundary layer, it builds up as it travels along the surface, and it is eventually shed off the surface either by the Kutta condition at the trailing edge, flow separation, or other turbulent mechanisms. On a slender body, the vorticity can be assumed to be shed at the trailing edge.

In most models inside FLOWUnsteady, instead of creating vorticity through the viscous diffusion equation, the immersed vorticity is shed along a prescribed trailing edge. This approach neglects the wake created by flow separation. However, the effects of flow separation on loading (like the drop in lift and increase in pressure drag on a stalled airfoil) can still be captured whenever lookup airfoil tables are used.

Recommended

For an in-depth discussion of the actuator line and surface models implemented in FLOWUnsteady, see Chapter 6 in Alvarez' Dissertation.[2]

Other Schemes

In the default settings of FLOWUnsteady, vortex stretching is resolved with the transposed scheme and the divergence of the vorticity field is treated through the relaxation scheme developed by Pedrizzeti.[7] The time integration of the governing equations is done through a low-storage third-order Runge-Kutta scheme. A Gaussian kernel is used as the LES filter $\zeta_\sigma$ (or VPM radial basis function). Like the classic VPM, the reformulated VPM is spatially second-order accurate in the convective term when a Gaussian basis is used. Viscous diffusion is solved through the core spreading method coupled with the radial basis function interpolation approach for spatial adaptation developed by Barba.[8] This viscous scheme has second-order spatial convergence, while showing linear convergence when coupled with spatial adaptation. The fast multipole method (FMM) is used for the computation of the regularized Biot-Savart law, approximating the velocity field and vortex stretching through spherical harmonics with computational complexity $\mathcal{O}(N)$, where $N$ is the number of particles. The FMM computation of vortex stretching is performed through an efficient complex-step derivative approximation,[9] implemented in a modified version of the open-source, parallelized code ExaFMM. FLOWVPM and FLOWUnsteady are implemented in the Julia language, which is a modern, high-level, dynamic programming language for high-performance computing.

Recommended

For an in-depth discussion of the numerical schemes implemented in FLOWUnsteady, see Chapter 4 in Alvarez' Dissertation.[2]

  • 1E. J. Alvarez & A. Ning (2022), "Reviving the Vortex Particle Method: A Stable Formulation for Meshless Large Eddy Simulation," (in review). [PDF]
  • 2E. J. Alvarez (2022), "Reformulated Vortex Particle Method and Meshless Large Eddy Simulation of Multirotor Aircraft," Doctoral Dissertation, Brigham Young University. [VIDEO] [PDF]
  • 3Winckelmans, G., and Leonard, A., “Contributions to Vortex Particle Methods for the Computation of Three-Dimensional Incompressible Unsteady Flows,” Journal of Computational Physics, Vol. 109, No. 2, 1993.
  • 4Winckelmans, G. S., “Some progress in large-eddy simulation using the 3D vortex particle method,” CTR Annual Research Briefs, , No. 2, 1995, pp. 391–415.
  • 5Mansfield, J. R., Knio, O. M., and Meneveau, C., “A Dynamic LES Scheme for the Vorticity Transport Equation: Formulation and a Priori Tests,” Journal of Computational Physics, Vol. 145, No. 2, 1998, pp. 693–730.
  • 6Meneveau, C., Lund, T. S., and Cabot, W. H., “A Lagrangian dynamic subgrid-scale model of turbulence,” Journal of Fluid Mechanics, Vol. 319, No. -1, 1996, p. 353.
  • 7Pedrizzetti, G., “Insight into singular vortex flows,” Fluid Dynamics Research, Vol. 10, No. 2, 1992, pp. 101–115.
  • 8Barba, L. A., Leonard, A., and Allen, C. B., “Advances in viscous vortex methods - Meshless spatial adaption based on radial basis function interpolation,” International Journal for Numerical Methods in Fluids, Vol. 47, No. 5, 2005, pp. 387–421. Also, Barba, L. A., “Vortex Method for computing high-Reynolds number Flows: Increased accuracy with a fully mesh-less formulation,” California Institute of Technology, Vol. 2004, 2004.
  • 9Alvarez, E. J., and Ning, A., “High-Fidelity Modeling of Multirotor Aerodynamic Interactions for Aircraft Design,” AIAA Journal, Vol. 58, No. 10, 2020, pp. 4385–4400.
  • aLet $\phi$ be a field and $\zeta_\sigma$ a filter kernel with cutoff length $\sigma$, the filter operator is defined as $\overline{\phi} \left( \mathbf{x} \right) \equiv \int\limits_{-\infty}^\infty \phi(\mathbf{y})\zeta_\sigma(\mathbf{x}-\mathbf{y}) \,\mathrm{d}\mathbf{y}$.
+,\end{align*}\]

which includes the velocity induced by both free and bound vorticity components, and where $\mathbf{K}\left( \mathbf{x} \right) \equiv - \frac{1}{4\pi} \frac{\mathbf{x}}{\Vert\mathbf{x}\Vert^3}$. Thus, the evolution of the free particles is influenced by the vorticity immersed at the solid boundaries, affecting their convection and vortex stretching through the velocity field induced by the bound particles.

The immersed vorticity not only affects the evolution of existing free vorticity, but it also creates new free vorticity at the boundary through viscous diffusion. In reality, vorticity is created in the boundary layer, it builds up as it travels along the surface, and it is eventually shed off the surface either by the Kutta condition at the trailing edge, flow separation, or other turbulent mechanisms. On a slender body, the vorticity can be assumed to be shed at the trailing edge.

In most models inside FLOWUnsteady, instead of creating vorticity through the viscous diffusion equation, the immersed vorticity is shed along a prescribed trailing edge. This approach neglects the wake created by flow separation. However, the effects of flow separation on loading (like the drop in lift and increase in pressure drag on a stalled airfoil) can still be captured whenever lookup airfoil tables are used.

Recommended

For an in-depth discussion of the actuator line and surface models implemented in FLOWUnsteady, see Chapter 6 in Alvarez' Dissertation.[2]

Other Schemes

In the default settings of FLOWUnsteady, vortex stretching is resolved with the transposed scheme and the divergence of the vorticity field is treated through the relaxation scheme developed by Pedrizzeti.[7] The time integration of the governing equations is done through a low-storage third-order Runge-Kutta scheme. A Gaussian kernel is used as the LES filter $\zeta_\sigma$ (or VPM radial basis function). Like the classic VPM, the reformulated VPM is spatially second-order accurate in the convective term when a Gaussian basis is used. Viscous diffusion is solved through the core spreading method coupled with the radial basis function interpolation approach for spatial adaptation developed by Barba.[8] This viscous scheme has second-order spatial convergence, while showing linear convergence when coupled with spatial adaptation. The fast multipole method (FMM) is used for the computation of the regularized Biot-Savart law, approximating the velocity field and vortex stretching through spherical harmonics with computational complexity $\mathcal{O}(N)$, where $N$ is the number of particles. The FMM computation of vortex stretching is performed through an efficient complex-step derivative approximation,[9] implemented in a modified version of the open-source, parallelized code ExaFMM. FLOWVPM and FLOWUnsteady are implemented in the Julia language, which is a modern, high-level, dynamic programming language for high-performance computing.

Recommended

For an in-depth discussion of the numerical schemes implemented in FLOWUnsteady, see Chapter 4 in Alvarez' Dissertation.[2]

  • 1E. J. Alvarez & A. Ning (2022), "Reviving the Vortex Particle Method: A Stable Formulation for Meshless Large Eddy Simulation," (in review). [PDF]
  • 2E. J. Alvarez (2022), "Reformulated Vortex Particle Method and Meshless Large Eddy Simulation of Multirotor Aircraft," Doctoral Dissertation, Brigham Young University. [VIDEO] [PDF]
  • 3Winckelmans, G., and Leonard, A., “Contributions to Vortex Particle Methods for the Computation of Three-Dimensional Incompressible Unsteady Flows,” Journal of Computational Physics, Vol. 109, No. 2, 1993.
  • 4Winckelmans, G. S., “Some progress in large-eddy simulation using the 3D vortex particle method,” CTR Annual Research Briefs, , No. 2, 1995, pp. 391–415.
  • 5Mansfield, J. R., Knio, O. M., and Meneveau, C., “A Dynamic LES Scheme for the Vorticity Transport Equation: Formulation and a Priori Tests,” Journal of Computational Physics, Vol. 145, No. 2, 1998, pp. 693–730.
  • 6Meneveau, C., Lund, T. S., and Cabot, W. H., “A Lagrangian dynamic subgrid-scale model of turbulence,” Journal of Fluid Mechanics, Vol. 319, No. -1, 1996, p. 353.
  • 7Pedrizzetti, G., “Insight into singular vortex flows,” Fluid Dynamics Research, Vol. 10, No. 2, 1992, pp. 101–115.
  • 8Barba, L. A., Leonard, A., and Allen, C. B., “Advances in viscous vortex methods - Meshless spatial adaption based on radial basis function interpolation,” International Journal for Numerical Methods in Fluids, Vol. 47, No. 5, 2005, pp. 387–421. Also, Barba, L. A., “Vortex Method for computing high-Reynolds number Flows: Increased accuracy with a fully mesh-less formulation,” California Institute of Technology, Vol. 2004, 2004.
  • 9Alvarez, E. J., and Ning, A., “High-Fidelity Modeling of Multirotor Aerodynamic Interactions for Aircraft Design,” AIAA Journal, Vol. 58, No. 10, 2020, pp. 4385–4400.
  • aLet $\phi$ be a field and $\zeta_\sigma$ a filter kernel with cutoff length $\sigma$, the filter operator is defined as $\overline{\phi} \left( \mathbf{x} \right) \equiv \int\limits_{-\infty}^\infty \phi(\mathbf{y})\zeta_\sigma(\mathbf{x}-\mathbf{y}) \,\mathrm{d}\mathbf{y}$.
diff --git a/theory/validation/index.html b/theory/validation/index.html index 4ee32dbf..88b8bc77 100644 --- a/theory/validation/index.html +++ b/theory/validation/index.html @@ -3,7 +3,7 @@ function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-B7CBF7WC7L', {'page_path': location.pathname + location.search + location.hash}); -

Validation

The following is a compilation of validation studies found in the literature using FLOWUnsteady.

Wing

Sources: E. J. Alvarez, 2022,[1] and E. J. Alvarez and A. Ning, 2023[2]

+

Validation

The following is a compilation of validation studies found in the literature using FLOWUnsteady.

Wing

Sources: E. J. Alvarez, 2022,[1] and E. J. Alvarez and A. Ning, 2022[2]

Pic here Pic here

Case: $45^\circ$ swept-back wing at an angle of attack of $4.2^\circ$, aspect ratio of 5.0, RAE 101 airfoil section with 12% thickness, no dihedral, twist, nor taper. Freestream velocity of $49.7,\mathrm{m/s}$, corresponding to a chord-based Reynolds number of $1.7 \times 10^6$. The high sweep of the wing causes non-negligible spanwise flow. The wing loads reported by Weber and Brebner (experimental) were integrated from pressure-tap measurements, hence the drag reported in this section includes induced and form drag while excluding skin friction drag.

Results: (Excerpt from E. J. Alvarez and A. Ning, 2022[2]) "Fig. 9 shows the loading distribution and integrated lift and drag across AOA predicted with the actuator surface model (ASM), compared to the experimental measurements. The loading distribution shows satisfactory agreement with the experiment, validating that both the circulation solver and the force calculation... are accurate for predicting not only lift but also drag distribution across the span. The integrated lift and drag (Fig. 9, bottom) show excellent agreement with the experiment from $0^\circ$ to $10.5^\circ$. We expect this to be the case only for mild AOAs before approaching stall conditions since our ASM does not capture the mechanisms of flow separation. Thus, through this swept-wing case, we gain confidence that our ASM yields accurate predictions in conditions with spanwise flow up to a moderate AOA."

@@ -57,7 +57,7 @@ alt="Pic here" style="width: 100%;"/>
-

Beaver Case

Source: E. J. Alvarez, 2022[1], and E. J. Alvarez and A. Ning, 2023[2]

+

Beaver Case

Source: E. J. Alvarez, 2022[1], and E. J. Alvarez and A. Ning, 2022[9]

Vid here

Case: Beaver propeller (4 blades, 0.237 m diameter) at $\mathrm{Re}_{0.7D} = 1.8\times 10^6$. Extensive validation with predicted thrust, torque, efficiency, blade loading, and flow field compared to experimental measurements.

@@ -119,7 +119,7 @@ alt="Pic here" style="width: 47%;"/>
-

Rotor-Wing Interactions

Tailplane w/ Tip-Mounted Propellers

Source: E. J. Alvarez, 2022[1], and E. J. Alvarez and A. Ning, 2023[2]

+

Rotor-Wing Interactions

Tailplane w/ Tip-Mounted Propellers

Source: E. J. Alvarez, 2022[1], and E. J. Alvarez and A. Ning, 2022[9]

Pic here

Case: Horizontal stabilizer (tailplane) with tip-mounted Beaver propellers. Wing with low aspect ratio ($b/c=2.7$), symmetric NACA $64_2-\mathrm{A}015$ profile, and elevator flap. Test at advance ratio $J$ of 0.8 and inboard-up propeller rotation at a thrust setting of $C_T = 0.0935$. Flap deflection captured in the actuator surface model (ASM) through an equivalent twist. Effects of wake impingement on wing loading predicted by FLOWUnsteady are compared to experiment.

@@ -153,7 +153,7 @@ alt="Pic here" style="width: 100%;"/>
-

Blown Wing

Source: E. J. Alvarez, 2022[1], and E. J. Alvarez and A. Ning, 2023[2]

+

Blown Wing

Source: E. J. Alvarez, 2022[1], and E. J. Alvarez and A. Ning, 2022[9]

Pic here

Case: Straight wing with Beaver propellers mounted mid-span. Wing of aspect ratio $b/c=5.33$, symmetric NACA $64_2-\mathrm{A}015$ profile. Test at advance ratio $J$ of 0.85 and inboard-up propeller rotation at a thrust setting of $C_T = 0.121$. Effects of wake impingement on wing loading predicted by FLOWUnsteady are compared to experiment.

@@ -163,4 +163,4 @@ alt="Pic here" style="width: 80%;"/>
-
  • 1E. J. Alvarez (2022), "Reformulated Vortex Particle Method and Meshless Large Eddy Simulation of Multirotor Aircraft," Doctoral Dissertation, Brigham Young University. [PDF]
  • 2E. J. Alvarez & A. Ning (2023), "Meshless Large Eddy Simulation of Propeller-Wing Interactions Through the Reformulated Vortex Particle Method," Journal of Aircraft. [DOI] [PDF]
  • 3E. J. Alvarez & A. Ning (2020), "High-Fidelity Modeling of Multirotor Aerodynamic Interactions for Aircraft Design," AIAA Journal. [DOI] [PDF]
  • 5J. Mehr, E. J. Alvarez, & A. Ning (2022), "Interactional Aerodynamics Analysis of a Multi-Rotor Energy Kite," (in review).
  • 6E. J. Alvarez & A. Ning (2023), "Stable Vortex Particle Method Formulation for Meshless Large-Eddy Simulation," AIAA Journal. [DOI] [PDF]
  • 7E. J. Alvarez, A. Schenk, T. Critchfield, and A. Ning (2020), “Rotor-on-Rotor Aeroacoustic Interactions of Multirotor in Hover,” VFS 76th Forum. [PDF]
  • 8R. M. Erhard and J. J. Alonso (2022), "Comparison of Propeller Wake Models for Distributed Electric Propulsion and eVTOL Aircraft in Complex Flow Conditions," AIAA SciTech Forum. [PDF]
+
  • 1E. J. Alvarez (2022), "Reformulated Vortex Particle Method and Meshless Large Eddy Simulation of Multirotor Aircraft," Doctoral Dissertation, Brigham Young University. [PDF]
  • 2E. J. Alvarez & A. Ning (2022), "Meshless Large Eddy Simulation of Rotor-Wing Interactions Through the Reformulated Vortex Particle Method," (in review).
  • 3E. J. Alvarez & A. Ning (2020), "High-Fidelity Modeling of Multirotor Aerodynamic Interactions for Aircraft Design," AIAA Journal. [DOI] [PDF]
  • 5J. Mehr, E. J. Alvarez, & A. Ning (2022), "Interactional Aerodynamics Analysis of a Multi-Rotor Energy Kite," (in review).
  • 6E. J. Alvarez & A. Ning (2022), "Reviving the Vortex Particle Method: A Stable Formulation for Meshless Large Eddy Simulation," (in review). [PDF]
  • 7E. J. Alvarez, A. Schenk, T. Critchfield, and A. Ning (2020), “Rotor-on-Rotor Aeroacoustic Interactions of Multirotor in Hover,” VFS 76th Forum. [PDF]
  • 8R. M. Erhard and J. J. Alonso (2022), "Comparison of Propeller Wake Models for Distributed Electric Propulsion and eVTOL Aircraft in Complex Flow Conditions," AIAA SciTech Forum. [PDF]
  • 9E. J. Alvarez & A. Ning (2022), "Meshless Large Eddy Simulation of Rotor-Wing Interactions with Reformulated Vortex Particle Method," (in review).
diff --git a/visualization/index.html b/visualization/index.html index 0a8aa1f1..4d623043 100644 --- a/visualization/index.html +++ b/visualization/index.html @@ -3,7 +3,7 @@ function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-B7CBF7WC7L', {'page_path': location.pathname + location.search + location.hash}); -

Visualization Guide

What NOT to do

Unfortunately, the first thing that ParaView shows when you open a particle field is a "scatter plot" full of confusing colors like this:

+

Visualization Guide

What NOT to do

Unfortunately, the first thing that ParaView shows when you open a particle field is a "scatter plot" full of confusing colors like this:

Pic here

Not surprisingly, the VPM literature is full of these visualizations, which provide very little information about the simulation. Poor colormap aside, why is this a bad visualization? Even though we are coloring the strengths of the particles, one must remember that the particle strength $\boldsymbol\Gamma$ is the integral of the vorticity over the volume that is discretized by the particle, $\boldsymbol\Gamma = \int\limits_{\mathrm{Vol}} \boldsymbol\omega \mathrm{d}V$. This is equivalent to the average vorticity times the volume, $\boldsymbol\Gamma = \overline{\boldsymbol\omega} \mathrm{Vol}$, which means that the particle strength is proportional to the volume that it discretizes. Thus, the particle strength has no physical significance, but is purely a numerical artifact. (In fact, $\boldsymbol\Gamma$ are nothing more than the coefficients of the radial basis function that reconstructs the vorticity field as $\overline{\boldsymbol\omega}\left( \mathbf{x}\right) \approx \sum\limits_p \boldsymbol{\Gamma}_p \zeta_{\sigma_p}(\mathbf{x}-\mathbf{x}_p)$.)

Another VPM visualization that is commonly found in the literature simply shows the position of the particles:

@@ -31,4 +31,4 @@ title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen> -
Volume Rendering

A .pvsm file with a volume rendering of the vorticity field is available here: LINK (right click → save as...).

To open in ParaView: File → Load State → (select .pvsm file) then select "Search files under specified directory" and point it to the folder where the simulation was saved.

Practice Dataset and Template

To help you practice in ParaView, we have uploaded the particle field and fluid domain of the DJI 9443 rotor case of mid-high fidelity and high fidelity simulations:

  • High fidelity: LINK
  • Mid-high fidelity: LINK

We have also added a .pvsm ParaView state file that you can use as a template for visualizing your particle field with glyphs and processing the fluid domain. To open in ParaView: File → Load State → (select .pvsm file) then select "Search files under specified directory" and point it to the folder with your simulation results.

+
Volume Rendering

A .pvsm file with a volume rendering of the vorticity field is available here: LINK (right click → save as...).

To open in ParaView: File → Load State → (select .pvsm file) then select "Search files under specified directory" and point it to the folder where the simulation was saved.

Practice Dataset and Template

To help you practice in ParaView, we have uploaded the particle field and fluid domain of the DJI 9443 rotor case of mid-high fidelity and high fidelity simulations:

  • High fidelity: LINK
  • Mid-high fidelity: LINK

We have also added a .pvsm ParaView state file that you can use as a template for visualizing your particle field with glyphs and processing the fluid domain. To open in ParaView: File → Load State → (select .pvsm file) then select "Search files under specified directory" and point it to the folder with your simulation results.