all of the changes
This commit is contained in:
27
include/FluidSim/OpenEndRadiation.hpp
Normal file
27
include/FluidSim/OpenEndRadiation.hpp
Normal file
@@ -0,0 +1,27 @@
|
||||
#pragma once
|
||||
#include <cmath>
|
||||
|
||||
namespace fluidsim::port {
|
||||
// Causal unflanged circular-pipe reflection fit, Silva et al. (2009), Eq. 16.
|
||||
// R(s)=-(1+n*a/c*s)/(1+d*a/c*s+e*(a/c*s)^2).
|
||||
// Trapezoidal state integration supports the solver's variable CFL timestep.
|
||||
class OpenEndRadiation {
|
||||
public:
|
||||
double process(double incident, double scaled_dt) {
|
||||
if (!initialized_) { position_ = incident; previous_ = incident; initialized_ = true; }
|
||||
constexpr double n = .167, d = n + 2*.6133;
|
||||
constexpr double e = (d*d-n*n-1)/2;
|
||||
const double h = scaled_dt*.5;
|
||||
const double rhs = velocity_ + h/e*(previous_ + incident - position_ - d*velocity_);
|
||||
const double next_velocity = (rhs - h/e*(position_ + h*velocity_)) /
|
||||
(1 + h*d/e + h*h/e);
|
||||
position_ += h*(velocity_ + next_velocity);
|
||||
velocity_ = next_velocity;
|
||||
previous_ = incident;
|
||||
return -(position_ + n*velocity_);
|
||||
}
|
||||
private:
|
||||
double position_{}, velocity_{}, previous_{};
|
||||
bool initialized_{};
|
||||
};
|
||||
} // namespace fluidsim::port
|
||||
Reference in New Issue
Block a user