PyPK is a collection of p-k methods for solving the flutter equation.
The original p-k method is described in [Rodden, Aerodynamic lag functions, divergence, and the British flutter method](https://doi.org/10.2514/3.44772) and its non-iterative version is described in [van Zyl, Aeroelastic Divergence and Aerodynamic Lag Roots](https://doi.org/10.2514/2.2806). The mode tracking algorithm is described in [van Zyl, Use of eigenvectors in the solution of the flutter equation](https://doi.org/10.2514/3.46380).
## Install and run
If you only want to use PyPK, you can install it using
```bash
python3 -m pip install.[--user]
```
and then run a case using
```bash
python3 path/to/case.py
```
If you need to develop in PyPK before using it, you do not need to install anything, and you can just run your case from the repo folder using
```bash
python3 run.py path/to/case.py
```
## Use
PyPK is initialized through its API `init_pypk`. Examples can be found under the tests directory. A case file typically contains the following lines
```python
# Initialize
frompypkimportinit_pypk
cfg={...}
solver=init_pypk(cfg)
solver.set_matrices(m,k,q)
# Compute flutter solution
solver.compute()
solver.find_flutter()
solver.save(case_name)
solver.plot(case_name,show=True,format=fmt)
# Compute gradients (only available for NIPK)
solver.compute_gradients()
```
where `cfg` is a `dict` defining the configuration of the solution method, `m`, `k` and `q` are the mass, stiffness and aerodynamic force matrices provided as `numpy array`, and `case_name` and `fmt` are `str`. The variables are stored as public attributes of the `solver` and are listed in [`Solution.__init__()`](https://gitlab.uliege.be/am-dept/pypk/-/blob/master/pypk/solution.py).
PyPK has also been interfaced with OpenMDAO for performing flutter-constrained optimization, see [OMFlut](https://gitlab.uliege.be/am-dept/omflut). Within that context, its builder must be imported using `from pypk.api_om import PypkBuilder`, then initialized with a configuration dictionary and provided to an OMFLut FlutterGroup as `FlutterGroup(..., flutter=PypkBuilder(cfg))`.
The configuration dictionary contains the following entries
'fluid':str,# fluid type ('unmatched' or 'matched_isa')
# IF 'fluid' is 'unmatched'
'rho_inf':float,# freesteam density
'u_idx':numpyarray,# velocity index range
'mu':float,# mass ratio
'f_ref':float,# frequency of first torsional mode
# IF 'fluid' is 'mached_isa'
'alt':numpyarray,# altitudes range
# PyPK
PyPK is a collection of p-k methods for solving the flutter equation.
The original p-k method is described in [Rodden, Aerodynamic lag functions, divergence, and the British flutter method](https://doi.org/10.2514/3.44772) and its non-iterative version is described in [van Zyl, Aeroelastic Divergence and Aerodynamic Lag Roots](https://doi.org/10.2514/2.2806). The mode tracking algorithm is described in [van Zyl, Use of eigenvectors in the solution of the flutter equation](https://doi.org/10.2514/3.46380). The methodology implemented in PyPk is decribed in this [technical note](https://hdl.handle.net/2268/324281).
## Install and run
If you only want to use PyPK, you can install it using
```bash
python3 -m pip install.[--user]
```
and then run a case using
```bash
python3 path/to/case.py
```
If you need to develop in PyPK before using it, you do not need to install anything, and you can just run your case from the repo folder using
```bash
python3 run.py path/to/case.py
```
## Use
PyPK is initialized through its API `init_pypk`. Examples can be found under the tests directory. A case file typically contains the following lines
```python
# Initialize
frompypkimportinit_pypk
cfg={...}
solver=init_pypk(cfg)
solver.set_matrices(m,k,q)
# Compute flutter solution
solver.compute()
solver.find_flutter()
solver.save(case_name)
solver.plot(case_name,show=True,format=fmt)
# Compute gradients (only available for NIPK)
solver.compute_gradients()
```
where `cfg` is a `dict` defining the configuration of the solution method, `m`, `k` and `q` are the mass, stiffness and aerodynamic force matrices provided as `numpy array`, and `case_name` and `fmt` are `str`. The variables are stored as public attributes of the `solver` and are listed in [`Solution.__init__()`](https://gitlab.uliege.be/am-dept/pypk/-/blob/master/pypk/solution.py).
PyPK has also been interfaced with OpenMDAO for performing flutter-constrained optimization, see [OMFlut](https://gitlab.uliege.be/am-dept/omflut). Within that context, its builder must be imported using `from pypk.api_om import PypkBuilder`, then initialized with a configuration dictionary and provided to an OMFLut FlutterGroup as `FlutterGroup(..., flutter=PypkBuilder(cfg))`.
The configuration dictionary contains the following entries