iccsa-21-wind

Wind Simulation Using High-Frequency Velocity Component Measurements
git clone https://git.igankevich.com/iccsa-21-wind.git
Log | Files | Refs

main.tex (34717B)


      1 \documentclass[runningheads]{llncs}
      2 
      3 \usepackage{amsmath}
      4 \usepackage{amssymb}
      5 \usepackage{booktabs}
      6 \usepackage{cite}
      7 \usepackage{graphicx}
      8 \usepackage{listings}
      9 \usepackage{url}
     10 \usepackage{textcomp}
     11 \usepackage{xcolor}
     12 
     13 \DeclareMathOperator{\Mode}{Mo}
     14 \DeclareMathOperator{\Expectation}{E}
     15 
     16 \begin{document}
     17 
     18 \title{Wind simulation using high-frequency velocity component measurements
     19     \thanks{Supported by Council for grants of the President of the Russian Federation (grant no.~\mbox{MK-383.2020.9}).}}
     20 \author{%
     21     Anton Gavrikov\orcidID{0000-0003-2128-8368} \and\\
     22     Ivan Gankevich\textsuperscript{*}\orcidID{0000-0001-7067-6928}
     23 }
     24 
     25 \lstdefinelanguage{rrr}{
     26     basicstyle={\rmfamily},
     27 	morekeywords={function},
     28     keywordstyle={\bfseries},
     29 	showstringspaces=false,
     30 	texcl=true,
     31 	escapeinside={LATEX}{END},
     32 	otherkeywords={function}
     33 }
     34 \lstset{
     35     language=rrr,
     36     literate={<-}{{$\gets$}}1,
     37 }
     38 
     39 \titlerunning{Wind simulation using high-frequency velocity component measurements}
     40 \authorrunning{A.\,Gavrikov, I.\,Gankevich}
     41 
     42 \institute{Saint Petersburg State University\\
     43     7-9 Universitetskaya Emb., St Petersburg 199034, Russia\\
     44     \email{st047437@student.spbu.ru},\\
     45     \email{i.gankevich@spbu.ru},\\
     46     \url{https://spbu.ru/}}
     47 
     48 \maketitle
     49 
     50 \begin{abstract}
     51 
     52     Wind simulation in the context of ship motions is used to estimate the
     53     effect of the wind on large containerships, sailboats and yachts. Wind
     54     models are typically based on a sum of harmonics with random phases and
     55     different amplitudes.  In this paper we propose to use autoregressive model
     56     to simulate the wind. This model is based on autocovariance function that
     57     can be estimated from the real-world data collected by anemometers.  We
     58     have found none of the data that meets our resolution requirements, and
     59     decided to produce the dataset ourselves using three-axis anemometer.  We
     60     built our own anemometer based on load cells, collected the data with the
     61     required resolution, verified the data using well-established statistical
     62     distributions, estimated autocovariance functions from the data and
     63     simulated the wind using autoregressive model. We have found that the load
     64     cell anemometer is capable of recording wind speed for statistical studies,
     65     but autoregressive model needs further calibration to reproduce the wind
     66     with the same statistical properties.
     67 
     68 \keywords{%
     69     load cell
     70     \and strain gauge
     71     \and anemometer
     72     \and three-dimensional ACF
     73     \and wind velocity PDF
     74     \and autoregressive model
     75     \and turbulence.
     76 }
     77 \end{abstract}
     78 
     79 \section{Introduction}
     80 
     81 Wind simulation in the context of ship motion simulation is the topic where
     82 multiple mathematical models are possible, and the choice of the model depends
     83 on the purpose of the model. In the course of the research where we apply
     84 autoregressive model to ocean wave simulation, we decided to investigate
     85 whether the same model can be used to simulate wind flow around ship hull.
     86 
     87 Wind simulation is studied at different scales and the closest scale for a ship
     88 in the ocean is wind turbine. One of the model that is used to
     89 describe air flow around wind turbines~\cite{veers1984modeling} is similar to
     90 Longuet---Higgins model which is typically used for ocean wave simulations.
     91 This model uses wind velocity frequency spectrum to determine coefficients
     92 and use them to generate wind velocity vector components.
     93 
     94 Wind velocity distribution is described by Kaimal
     95 spectrum~\cite{kaimal1972spectral,veers1988wind}
     96 \begin{equation*}
     97 S(f) = \frac {c_1 u_{*}^2 z / U(z)} {1 + c_2 \left(f z / U(z)\right)^{5/3} },\quad
     98 u_{*}=\frac{k U(z)}{\ln{(z/z_0)}},\quad c_1=105, \quad c_2=33,
     99 \end{equation*}
    100 Here \(u_{*}\) is shear velocity,
    101 \(k=0.4\) is von Karman constant, \(z_0\) is surface roughness
    102 coefficient, \(f\) is frequency,
    103 \(z\) is height above ground, \(U(z)\) is mean speed at height \(z\).
    104 
    105 This spectrum is used to simulate each wind velocity vector component at a
    106 specified point in space. For each component the same spectrum is used, but the
    107 coefficients are different~\cite{veers1984modeling}.
    108 %\begin{align*}
    109 %& c_1 = 12.3 && c_2 = 192 && \text{for }x,\\
    110 %& c_1 = 4    && c_2 = 70  && \text{for }y,\\
    111 %& c_1 = 0.5  && c_2 = 8   && \text{for }z.
    112 %\end{align*}
    113 The spectrum describes wind velocity vector in the plane that is perpendicular to
    114 the mean wind direction vector and travels in the same direction
    115 with mean wind speed. Time series is generated as Fourier series, coefficients
    116 of which are determined from the spectrum, and phases are random
    117 variables~\cite{veers1984modeling}:
    118 \begin{align*}
    119 & V(t) = \overline{V} + \sum\limits_{j=1}^{n}
    120 	\left( A_j \sin\omega_jt + B_j \cos\omega_jt\right), \\
    121 & A_j = \sqrt{\frac{1}{2} S_j \Delta\omega} \sin\phi_j, \quad
    122  B_j = \sqrt{\frac{1}{2} S_j \Delta\omega} \cos\phi_j.
    123 \end{align*}
    124 Here \(S_j\) is spectrum value at frequency \(\omega_j\),
    125 \(\phi_j\) is random variable which is uniformly distributed in \([0,2\pi]\).
    126 The result is one-dimensional vector-valued time series, each element of
    127 which is velocity vector at a specified point in time and space.
    128 
    129 In order to simulate wind velocity vector at multiple points in space,
    130 the authors use the function of coherency~--- the amount of correlation between
    131 wind speed at two points in space. This function has a form of an exponent and
    132 depends on frequency~\cite{veers1988wind}:
    133 \begin{equation*}
    134 \text{Coh}_{jk}(f) = \exp\left( -\frac {C\Delta r_{jk} f} {U(z)} \right),
    135 \end{equation*}
    136 where \(\Delta{}r_{jk}\) is the distance between \(i\) and \(j\) points and
    137 \(C\) is coherency decrement. Time series for each wind velocity vector
    138 component are generated independently and after that their spectra are modified
    139 in accordance with coherence function (the formulae are not presented here).
    140 
    141 In order to simulate wind with autoregressive model it is easier to use
    142 autocovariance function instead of spectra and coherence function. We can obtain
    143 autocovariance function from spectra as inverse Fourier transform using
    144 Wiener---Khinchin theorem. The formula that we obtained this way using
    145 various computer algebra programmes is too complex, but can be approximated by
    146 a decaying exponent:
    147 \begin{equation*}
    148 \gamma(t) = \sigma^2 \exp\left( -0.1 \frac{c_2^{3/5}}{c_1} t\right),
    149 \end{equation*}
    150 where \(\sigma^2\) is process variance (area under the spectrum).
    151 
    152 Unfortunately, this autocovariance function is one-dimensional and there is no
    153 easy way of obtaining three-dimensional analogue from the spectra.  In order
    154 to solve this problem we looked into datasets of wind speed measurements
    155 available for the research. However, most of them contain either one or two
    156 wind velocity vector components (in a form of wind speed and direction), they are difficult
    157 to get and their resolution is very small (we found only one paper that
    158 deals with three components~\cite{yim2000}). For our purposes we need
    159 resolution of at least one sample per second to simulate gusts and some form of
    160 turbulence. To summarise, our requirements for the dataset is to provide all
    161 three wind velocity vector components and has resolution of at least one sample per
    162 second.
    163 
    164 We failed to find such datasets and continued our research into anemometers
    165 that can generate the required dataset. One of the anemometers that can record
    166 all three components is ultrasonic
    167 anemometer~\cite{cosgrove2007ultra,arens2020anemometer,yakunin20173d}.  As
    168 commercial anemometers are too expensive for this research, we built our own
    169 version from the generally available electric components. However, this version
    170 failed to capture any meaningful data, and incidentally we decided to build an
    171 anemometer from load cells and strain gauges (which were originally intended for different research work). This anemometer is
    172 straightforward to construct, the electrical components are inexpensive, and it
    173 is easy to protect them from bad weather. This anemometer is able to record
    174 all three wind velocity vector components multiple times per second.
    175 
    176 In this paper we describe how load cell anemometer is built, then we collect
    177 dataset of all three wind speed components with one-second resolution, verify
    178 this anemometer using commercial analogue, verify measurements from the dataset
    179 using well-established distributions for wind speed and direction, and
    180 estimate autocovariance functions for autoregressive model from our dataset.
    181 Finally, we present preliminary wind simulation results using autoregressive model.
    182 
    183 \section{Methods}
    184 
    185 \subsection{Three-axis wind velocity measurements with load cell anemometer}
    186 
    187 In order to generate wind velocity field using four-dimensional (one temporal
    188 and three spatial dimensions) autoregressive model, we need to use
    189 four-dimensional wind velocity autocovariance function. Using Wiener---Khinchin
    190 theorem it is easy to compute the function from the spectrum. Unfortunately,
    191 most of the existing wind velocity historical data contains only wind velocity
    192 magnitude and direction. We can use them to reconstruct \(x\) and \(y\)
    193 spectrum, but there is no way to get spectrum for \(z\) coordinate from this
    194 data. Also, resolution of historical data is too small for
    195 wind simulation for ship motions. To solve these problems, we decided
    196 to build our own three-axis anemometer that measures wind velocity for all
    197 three axes at one point in space multiple times per second.
    198 
    199 To measure wind velocity we used resistive foil strain gauges mounted on the
    200 arms aligned perpendicular to the axes directions. Inside each arm we placed
    201 aluminium load cell with two strain gauges: one on the bending side and another
    202 one on the lateral side. Load cells use Wheatstone half-bridge to measure the
    203 resistance of the gauges and are connected to the circuit that measures the
    204 resistance and transmits it to the microcontroller in digital format.
    205 Microcontroller then records the value for each load cell and transmits all of
    206 them in textual form to the main computer.  The main computer then adds a
    207 timestamp and saves it to the database.  3-D anemometer model is shown in
    208 figure~\ref{fig-anemometer}.
    209 
    210 \begin{figure}
    211     \centering
    212     \begin{minipage}{0.55\textwidth}
    213         \includegraphics{build/inkscape/anemometer.eps}
    214     \end{minipage}
    215     \begin{minipage}{0.35\textwidth}
    216         Anemometer properties:\phantom{12345}
    217         \begin{tabular}{ll}
    218             \toprule
    219             Load cell capacity & 1 kg \\
    220             Load cell amplifier & HX711 \\
    221             Microcontroller & ATmega328P \\
    222             \bottomrule
    223         \end{tabular}
    224     \end{minipage}
    225     %\includegraphics{build/gnuplot/anemometer.eps}
    226     \caption{Three-axis anemometer. Arms are inserted into the housing
    227     and fixed using bolts that go through the circular holes. Red, green, blue colours
    228 denote load cells for \(x\), \(y\), \(z\) axes respectively.\label{fig-anemometer}}
    229 \end{figure}
    230 
    231 Each load cell faces the direction that is perpendicular to the directions of
    232 other load cells. When the wind blows in the direction of particular load cell, only
    233 this cell bends. When the wind blows in an arbitrary direction which is not
    234 perpendicular to any load cell faces, then all load cells bend, but the
    235 pressure force is smaller. Pressures of all load cells are recorded
    236 simultaneously, and we can use Bernoulli's equation to compute wind velocity
    237 from them.
    238 
    239 Bernoulli's equation is written as
    240 \begin{equation}
    241     \rho\frac{\upsilon^2}{2} + \rho gz = p_0-p.
    242 \end{equation}
    243 Here \(\upsilon\) is wind velocity magnitude, \(g\) is gravitational acceleration,
    244 \(z\) is vertical coordinate, \(\rho\) is air density, \(p\) is pressure on the
    245 load cell and \(p_0\) is atmospheric pressure. Pressure force \(\vec{F}\) acting on a load
    246 cell is written as
    247 \begin{equation}
    248     \vec{F} = p S \vec{n},
    249 \end{equation}
    250 where \(S\) is area of the side of the load cell on which the force is applied
    251 and \(\vec{n}\) is normal vector. Arms in which load cells reside have 
    252 front and back side with much larger areas than the left and right side, therefore
    253 we neglect forces on them. Additionally, on the ground \(\rho{}gz\) term vanishes.
    254 
    255 For all load cells we have a system of three equations
    256 \begin{equation}
    257     \begin{cases}
    258         \upsilon_x^2 \propto F_x \\
    259         \upsilon_y^2 \propto F_y \\
    260         \upsilon_z^2 \propto F_z \\
    261     \end{cases}.
    262 \end{equation}
    263 Hence \(\upsilon_{x}=\alpha_{x}\sqrt{F_{x}}\),
    264 \(\upsilon_{y}=\alpha_{y}\sqrt{F_{y}}\),
    265 \(\upsilon_{z}=\alpha_{z}\sqrt{F_{z}}\) where \(\alpha_{x,y,z}\) are constants of
    266 proportionality. Therefore, to obtain wind velocity we take \emph{square root} of the 
    267 value measured by the load cell and multiply it by some coefficient determined
    268 empirically during anemometer calibration.
    269 
    270 \subsection{Per-axis probability distribution function for wind velocity}
    271 
    272 Scalar wind velocity is described by Weibull distribution~\cite{justus1976}.
    273 Weibull probability distribution function is written as
    274 \begin{equation}
    275     f\left(\upsilon;b,c\right) = b c \left(b \upsilon\right)^{c-1}
    276     \exp\left(-\left(b\upsilon\right)^{c}\right).
    277 \end{equation}
    278 Here \(\upsilon>0\) is scalar wind velocity, \(b>0\) is scale parameter and \(c>0\)
    279 is shape parameter. This function is defined for positive wind velocity, since
    280 scalar wind velocity is a length of wind velocity vector
    281 \(\upsilon=\sqrt{\smash[b]{\upsilon_x^2+\upsilon_y^2+\upsilon_z^2}}\). However, projection of
    282 wind velocity vector on \(x\), \(y\) or \(z\) axis may be negative.
    283 Our solution to this problem is to use two Weibull distributions: one for positive and
    284 one for negative projection~--- but with different parameters.
    285 \begin{equation}
    286     f\left(\upsilon_x;b_1,c_1,b_2,c_2\right) = \begin{cases}
    287         b_1 c_1 \left(b_1 \left|\upsilon_x\right|\right)^{c_1-1} \exp\left(-\left(b_1\left|\upsilon_x\right|\right)^{c_1}\right).
    288         \qquad \text{if } \upsilon_x < 0 \\
    289         b_2 c_2 \left(b_2 \left|\upsilon_x\right|\right)^{c_2-1} \exp\left(-\left(b_2\left|\upsilon_x\right|\right)^{c_2}\right).
    290         \qquad \text{if } \upsilon_x \geq 0 \\
    291 
    292     \end{cases}\label{eq-velocity-distribution}.
    293 \end{equation}
    294 Here \(b_{1,2}>0\) and \(c_{1,2}>0\) are parameters of the distribution
    295 that control the scale and the shape, \(\upsilon_x\) is the projection of the velocity
    296 vector on \(x\) axis. The same formula is used for \(y\) and \(z\) axis.
    297 
    298 %We could simply
    299 %extend Weibull distribution for negative values, but this may lead to multimodal distribution
    300 %because the maximum value may not be located at \(\upsilon=0\). Our solution to
    301 %this problem is to make substitution \(\upsilon_x'=\left|\upsilon_x-\Mode\upsilon_x\right|\),
    302 %where \(\Mode\upsilon_x\) is the mode of wind velocity projection to the corresponding axis,
    303 %and modulus makes the graph symmetric with respect to \(\upsilon_x'=0\).
    304 %The substitution yields
    305 %\begin{equation}
    306 %    f\left(\upsilon_x';b,c\right) = b c
    307 %    \exp\left(-\left|b\upsilon_x'-g\left(c\right)\right|^{c}\right),
    308 %    \qquad
    309 %    g\left(c\right) = \left(\frac{c-1}{c}\right)^{1/c},
    310 %\end{equation}
    311 %which is the formula for the right side of the distribution. In order to get the
    312 %formula for the left side, we have to use an additional set of parameters \(b\), \(c\).
    313 %Then the final formula for both sides is written as
    314 %\begin{equation}
    315 %    f\left(\upsilon_x';b_1,c_1,b_2,c_2\right) = \begin{cases}
    316 %        b_1 c_1 \exp\left(-\left|b_1\upsilon_x'-g\left(c_1\right)\right|^{c_1}\right)
    317 %        \qquad \text{if } \upsilon_x < \Mode\upsilon_x \\
    318 %        b_2 c_2 \exp\left(-\left|b_2\upsilon_x'-g\left(c_2\right)\right|^{c_2}\right)
    319 %        \qquad \text{if } \upsilon_x \geq \Mode\upsilon_x \\
    320 %
    321 %    \end{cases}\label{eq-velocity-distribution}.
    322 %\end{equation}
    323 %Here \(b_{1,2}>0\) and \(c_{1,2}>0\) are parameters of the distribution
    324 %that control the scale and the shape.
    325 
    326 \subsection{Three-dimensional ACF of wind velocity}
    327 
    328 Usually, autocovariance is modelled using exponential functions~\cite{box1976time}.
    329 In this paper we use one-dimensional autocovariance function written as
    330 \begin{equation}
    331     K\left(t\right) = a_3 \exp\left(-\left(b_3 t\right)^{c_3} \right).
    332     \label{eq-acf-approximation}
    333 \end{equation}
    334 Here \(a_3>0\), \(b_3>0\) and \(c_3>0\) are parameters of the autocovariance
    335 function that control the shape of the exponent.
    336 
    337 In order to construct three-dimensional autocovariance function we assume that
    338 one-dimensional autocovariance function is the same for each coordinate and
    339 multiply them.
    340 \begin{equation}
    341     K\left(t,x,y,z\right) = a \exp\left(
    342         -\left(b_t t\right)^{c_t}
    343         -\left(b_x x\right)^{c_x}
    344         -\left(b_y y\right)^{c_y}
    345         -\left(b_z z\right)^{c_z}
    346     \right).
    347     \label{eq-acf}
    348 \end{equation}
    349 Here \(a>0\), \(b_{t,x,y,z}>0\) and \(c_{t,x,y,z}>0\) are parameters of the autocovariance
    350 function. Parameter \(a\) and \(\exp\left(b\right)\) are proportional to wind
    351 velocity projection on the corresponding axis.
    352 Parameter \(c\) controls the shape of the autocovariance function in
    353 the corresponding direction; it does not have simple relationship to the wind
    354 velocity statistical parameters.
    355 
    356 \subsection{Data collection and preprocessing}
    357 
    358 We installed anemometer on the tripod and placed it on the balcony. Then we
    359 connected load cells to the microcontroller via HX711 load cell amplifiers and
    360 programmed the microcontroller to record the output of each sensor every second
    361 and print it on the standard output. Then we connected the microcontroller to
    362 the computer via USB interface and wrote a script to collect the data coming
    363 from the USB and store it in the SQLite database. We decided to store raw
    364 sensor values in the range from 0 to 65535 to be able to calibrate anemometer
    365 later.
    366 
    367 We calibrated three-axis anemometer using commercial anemometer HP-866A and a
    368 fan that rotates with constant speed. First, we measured the wind speed that
    369 the fan generates when attached to commercial anemometer. Then we successively
    370 placed the fan behind and in front of each arm of our anemometer and measured
    371 values that the corresponding load cell reported for each side of the arm with
    372 and without the fan. Then we were able to calculate two coefficients for each
    373 axis: one for negative and another one for positive wind velocities. The
    374 coefficient equals the raw sensor value that is equivalent to the wind speed of 1~m/s
    375 (table~\ref{tab-coefficients}).
    376 
    377 \begin{table}
    378     \begin{minipage}[t]{0.35\textwidth}
    379         \centering
    380         \begin{tabular}{lll}
    381             \toprule
    382             Axis & \(C_1\) & \(C_2\) \\
    383             \midrule
    384             X & 11.19 & 12.31 \\
    385             Y & 11.46 & 11.25 \\
    386             Z & 13.55 & 13.90 \\
    387             \bottomrule
    388         \end{tabular}
    389         \caption{Calibration coefficients for each arm of three-axis anemometer:
    390             \(C_1\) is for negative values and \(C_2\) is for positive values.
    391         \label{tab-coefficients}}
    392     \end{minipage}
    393     ~
    394     \begin{minipage}[t]{0.55\textwidth}
    395         \centering
    396         \begin{tabular}{ll}
    397             \toprule
    398             Time span & 36 days \\
    399             Size & 122 Mb \\
    400             No. of samples & 3\,157\,234 \\
    401             No. of samples after filtering & 2\,775\,387 \\
    402             Resolution & 1 sample per second \\
    403             \bottomrule
    404         \end{tabular}
    405         \caption{Dataset properties.\label{tab-dataset}}
    406     \end{minipage}
    407 \end{table}
    408 
    409 We noticed that ambient temperature affects values reported by our load cells:
    410 when the load cell heats up (cools down), it reports values that increase
    411 (decrease) linearly in time due to thermal expansion of the material. We
    412 removed this linear trend from the measured values using linear regression. The
    413 code in R~\cite{r-language} that transforms raw sensor values into wind speed is
    414 presented in listing~\ref{lst-sample-to-speed}.
    415 
    416 \begin{lstlisting}[label={lst-sample-to-speed},caption={The code that transforms raw load cell sensor values into wind speed projections to the corresponding axis.}]
    417 sampleToSpeed <- function(x, c1, c2) {
    418  t <- c(1:length(x))
    419  reg <- lm(x~t)
    420  x <- x - reg$fitted.values LATEX{\color{black!70}\textit{\# remove linear trend}}END
    421  x <- sign(x)*sqrt(abs(x))  LATEX{\color{black!70}\textit{\# convert from force to velocity}}END
    422  x[x<0] = x[x<0] / c1      LATEX{\color{black!70}\textit{\# scale sensor values to wind speed}}END
    423  x[x>0] = x[x>0] / c2      LATEX{\color{black!70}\textit{\# using calibration coefficients}}END
    424  x
    425 }
    426 \end{lstlisting}
    427 
    428 Over a period of one month we collected 3.1M samples and filtered out 12\% of
    429 them because they had too large unnatural values. We attributed these values to
    430 measurement errors as they spread uniformly across all the time span and are
    431 surrounded by the values of regular magnitude.
    432 %From the remaining data we choose days with wind speeds above the average as
    433 %reported by EMERCOM of Russia\footnote{https://en.mchs.gov.ru/} for Saint
    434 %Petersburg.
    435 After that we divided each day into two-hour intervals over which
    436 we collected the statistics individually.
    437 %From these intervals we choose the
    438 %ones with data distributions close to unimodal, so we could easily fit them
    439 %into the model.
    440 The statistics for each interval is presented in
    441 figure~\ref{fig-intervals}, dataset properties are presented in table~\ref{tab-dataset}.
    442 
    443 Unique feature of three-axis anemometer is that it measures both velocity of
    444 incident air flow towards the arms and the turbulent flow that forms behind the
    445 arms. Turbulent flow velocity distribution peak is often smaller than the peak
    446 of incident flow. To exclude it from the measurements one can choose the side
    447 with the largest peak (either positive or negative part
    448 of~\eqref{eq-velocity-distribution}), but in this paper we left them as is
    449 for the purpose of the research.
    450 
    451 \begin{figure}
    452     \centering
    453     \includegraphics{build/daily-stats.eps}
    454     \caption{The statistics for each interval of the collected data. Here
    455         \(\upsilon_x\), \(\upsilon_y\) and \(\upsilon_z\) are mean speeds for
    456         each interval for the corresponding axes, \(\upsilon\) is mean scalar wind speed
    457         for each interval. The horizontal line shows overall average speed.
    458         Yellow rectangles denote days when EMERCOM of Russia (https://en.mchs.gov.ru/)
    459         reported wind speeds above average.
    460         \label{fig-intervals}}
    461 \end{figure}
    462 
    463 \section{Results}
    464 
    465 \subsection{Anemometer verification}
    466 
    467 In order to verify that our anemometer produces correct measurements we
    468 calculated wind speed and direction from the collected samples and fitted them
    469 into Weibull distribution and von Mises distribution respectively.  These are
    470 typical models for wind speed and direction~\cite{carta2008,carta2008joint}.
    471 Then we found the intervals with the best and the worst fit for these models
    472 using normalised root-mean-square error (NRMSE) calculated as
    473 \begin{equation}
    474     \text{NRMSE} = \frac{\sqrt{\Expectation\left[\left(X_\text{observed}-X_\text{estimated}\right)^2\right]}}{X_\text{max}-X_\text{min}}.
    475 \end{equation}
    476 Here \(\Expectation\) is statistical mean, \(X_\text{observed}\) and
    477 \(X_\text{estimated}\) are observed and estimated values respectively.
    478 
    479 The wind speed data collected with three-axis anemometer was approximated by
    480 Weibull distribution using least-squares fitting. Negative and positive wind
    481 speed projections to each axis both have this distribution, but with different
    482 parameters. Most of the data intervals contain only one prevalent mean wind
    483 direction, which means that one of the distributions is for incident wind flow
    484 on the arm of the anemometer and another one is for the turbulent flow that
    485 forms behind the arm.  For \(z\) axis both left and right distributions have
    486 similar shapes, for \(x\) and \(y\) axes the distribution for incident flow is
    487 taller than the distribution for turbulent flow. The best-fit and worst-fit
    488 distributions for each axis are presented in figure~\ref{fig-velocity-distributions}.
    489 
    490 \begin{figure}
    491     \centering
    492     \includegraphics{build/gnuplot/velocity-dist.eps}
    493     \caption{Per-axis wind velocity distributions fitted into Weibull
    494         distribution.
    495         Data intervals with the largest error (the first row),
    496         data intervals with the smallest error (the second row). Red line shows estimated
    497         probability density of positive wind speed projections, blue line shows estimated
    498         probability density of negative wind speed projections and circles denote observed
    499         probability density of wind speed projections.
    500     \label{fig-velocity-distributions}}
    501 \end{figure}
    502 
    503 Wind direction was approximated by von Mises distribution using least-squares
    504 fitting. Following the common
    505 practice~\cite{feng2015sectors} we divided direction axis
    506 into sectors: from -180\textdegree{} to -90\textdegree{}, from -90\textdegree{} to
    507 0\textdegree{}, from 0 to 90\textdegree{} and from 90\textdegree{} to
    508 180\textdegree{}~--- and fitted each sector independently. We chose four sector
    509 to have one sector for each side of the anemometer.
    510 The best-fit and worst-fit distributions for each sector
    511 are presented in figure~\ref{fig-direction-distributions}.
    512 
    513 \begin{figure}
    514     \centering
    515     \begin{minipage}{0.49\textwidth}
    516         \centering
    517         \includegraphics{build/gnuplot/velocity-xy-dist-max.eps}
    518     \end{minipage}
    519     \begin{minipage}{0.49\textwidth}
    520         \centering
    521         \includegraphics{build/gnuplot/velocity-xy-dist-min.eps}
    522     \end{minipage}
    523     \vskip2\baselineskip
    524     \includegraphics{build/gnuplot/direction-dist.eps}
    525     \caption{Bivariate \(x\) and \(y\) velocity distribution
    526         in polar coordinates (first row), wind direction distributions fitted into
    527         von Mises distribution (second row). Data interval with the largest error (left column), data
    528         interval with the smallest error (right column).
    529         Red line shows estimated
    530         probability density of positive direction angles, blue line shows estimated
    531         probability density of negative direction angles and circles denote observed
    532         probability density of direction angles. 0\textdegree{} is north.
    533     \label{fig-direction-distributions}}
    534 \end{figure}
    535 
    536 In order to verify that our anemometer produces correct time series we
    537 performed synchronous measurements with commercial anemometer HP-866A. Two
    538 anemometers were placed in the open field near the shore. The commercial
    539 anemometer was directed towards the mean wind direction as it measures the speed
    540 only. The data from the two anemometers was recorded synchronously. From the
    541 data we selected intervals with wind gusts and compared the measurements of the
    542 two anemometers. To compare them we scaled load cell anemometer measurements to
    543 minimise NRMSE of the difference between the two time series to compensate for
    544 the errors in calibration coefficients. The results showed that there is some
    545 correspondence between the measurements of the two anemometers
    546 (figure~\ref{fig-hold-peak}).
    547 
    548 \begin{figure}
    549     \centering
    550     \includegraphics{build/gnuplot/hold-peak.eps}
    551     \caption{Comparison of measurements obtained from three-axis and HP-866A
    552     anemometers.\label{fig-hold-peak}}
    553 \end{figure}
    554 
    555 Finally, we computed autocovariance for each axis as
    556 \begin{equation}
    557     K(\tau) = \Expectation\left[ \left(X_t-\bar{X}\right)\left(X_{t-\tau}-\bar{X}\right) \right]
    558 \end{equation}
    559 and fitted it into~\eqref{eq-acf-approximation}.
    560 Per-axis ACFs have pronounced peak at nought lag and long tails.
    561 The largest NRMSE is 2.3\%.
    562 Variances for \(x\) and \(y\) axes are comparable, but ACF for \(z\) axis has
    563 much lower variance.
    564 Parameters \(a\) and \(b\) from~\eqref{eq-acf-approximation} are positively
    565 correlated with wind speed for the corresponding axis.
    566 The best-fit and worst-fit ACFs for each axis
    567 are presented in figure~\ref{fig-acf}.
    568 
    569 \begin{figure}
    570     \centering
    571     \includegraphics{build/gnuplot/acf.eps}
    572     \caption{Per-axis wind velocity ACF fitted into~\eqref{eq-acf-approximation}.
    573         Data intervals with the largest error (the first row),
    574         data intervals with the smallest error (the second row). Red line shows estimated
    575         ACF of positive wind speed projections, blue line shows estimated
    576         ACF of negative wind speed projections and circles denote observed
    577         ACF of wind speed projections. Note: graphs use mirrored axes.
    578     \label{fig-acf}}
    579 \end{figure}
    580 
    581 \subsection{Turbulence coefficient}
    582 
    583 Since our anemometer measures both incident and turbulent flow we took an
    584 opportunity to study the speed of the turbulent flow in relation to incident
    585 flow. We calculated the absolute mean values of positive and negative wind
    586 velocity projections for each time interval of the dataset. We considered the
    587 flow with the larger absolute mean value incident, and the other one is
    588 turbulent.  Then we calculated turbulence coefficient as the ratio of absolute
    589 mean speed of turbulent flow to the absolute mean speed of incident flow. We
    590 found that the average ratio is close to 60\%. It seems, that the ratio
    591 decreases as the wind speed increases for wind speeds of 1--5 m/s, but for
    592 higher wind speeds we do not have the data. Turbulence coefficient
    593 can be used in wind simulation models to control the magnitude of turbulent
    594 flow that forms behind the obstacle~\cite{gavrikov2020wind}.
    595 
    596 \begin{figure}
    597     \centering
    598     \includegraphics{build/gnuplot/turbulence.eps}
    599     \caption{The ratio of absolute mean speed of turbulent flow to the absolute mean
    600     speed of incident flow for each axis.\label{fig-turbulence}}
    601 \end{figure}
    602 
    603 \subsection{Wind simulation using measured ACFs}
    604 
    605 We simulated three-dimensional wind velocity using autoregressive model
    606 implemented in Virtual Testbed~\cite{bogdanov2020vtestbed}~--- a
    607 programme for workstations that simulates ship motions in extreme conditions
    608 and physical phenomena that causes them (ocean waves, wind, compartment
    609 flooding etc.).  Using the data obtained with three-axis anemometer on March 28,
    610 2021, 01:00-03:00 UTC we approximated four-dimensional autocovariance function
    611 using~\eqref{eq-acf} by setting the corresponding parameters from
    612 one-dimensional autocovariance functions estimated from the data obtained with
    613 anemometer, all other parameters were set close to nought. Non-nought
    614 parameters are listed in table~\ref{tab-arma-parameters}.  We found that
    615 velocity and direction distributions and ACFs of each axis of simulated wind
    616 and real wind are similar in shape, but are too far away from each other
    617 (see~figure~\ref{fig-vtestbed}).  We consider these results preliminary and
    618 will investigate them further in future work.
    619 
    620 \begin{table}
    621     \centering
    622     \caption{Input parameters for AR model that were used to simulate wind velocity.
    623     \label{tab-arma-parameters}}
    624     \begin{tabular}{lllll}
    625         \toprule
    626         Axis & ACF \(a\) & \phantom{0}ACF \(b\) & \phantom{0}ACF \(c\) & \phantom{0}Mean velocity, m/s \\
    627         \midrule
    628         \(x\) & 1.793 & \phantom{0}0.0214 & \phantom{0}0.2603 & \phantom{0}-2.439 \\
    629         \(y\) & 1.423 & \phantom{0}0.01429 & \phantom{0}0.2852 & \phantom{0}-2.158 \\
    630         \(z\) & 0.9075 & \phantom{0}0.06322 & \phantom{0}0.3349 & \phantom{0}-1.367 \\
    631         \bottomrule
    632     \end{tabular}
    633 \end{table}
    634 
    635 \begin{figure}
    636     \centering
    637     \includegraphics{build/gnuplot/vtestbed.eps}
    638     \caption{Comparison of simulated wind velocity and direction distributions
    639         and per-axis ACFs
    640     between the data from the anemometer and the data from Virtual Testbed
    641     (2021, March 28, 01:00--03:00, UTC).\label{fig-vtestbed}}
    642 \end{figure}
    643 
    644 \section{Discussion}
    645 
    646 NRMSE of wind speed distribution approximation has positive correlation with
    647 wind speed: the larger the wind speed, the larger the error and vice versa.
    648 Larger error for low wind speeds is caused by larger skewness and kurtosis (see
    649 the first row of figure~\ref{fig-velocity-distributions}). Similar
    650 approximation errors can be found in~\cite{carta2008joint} where the authors
    651 improve approximation accuracy using joint wind speed and direction
    652 distributions. Such studies are outside of the scope of this paper, because
    653 here we verify anemometer measurements using well-established mathematical
    654 models, but the future work may include the study of these improvements.
    655 
    656 NRMSE of wind direction distribution approximation has negative correlation with
    657 wind speed: the larger the wind speed, the smaller the error and vice versa.
    658 This is in agreement with physical laws: the faster the flow is the more
    659 determinate its mean direction becomes, and the slower the flow is the more
    660 indeterminate its mean direction is.
    661 
    662 Three-axis anemometer disadvantages are the following.
    663 The arm for the \(z\) axis is horizontal, and snow and rain put additional load
    664 on this cell distorting the measurements. 
    665 Also, thermal expansion and contraction of the material changes
    666 the resistance of load cells and distorts the measurements. 
    667 Pressure force on the arm is exerted by individual air particles and
    668     is represented by choppy time series, as opposed to real physical signal
    669     that is represented by smooth graph.
    670 The first two defficiences can be compensated in software by removing linear trend
    671 from the corresponding interval. The last one make anemometer useful only for
    672 offline studies, i.e.~it is useful to gather statistics, but is unable to measure
    673 immediate wind speed and direction.
    674 
    675 We used a balcony for long-term measurements and open field for verification
    676 and calibration. We found no clues that the balcony affected the distributions
    677 and ACFs of wind speed. The only visible effect is that the wind direction is
    678 always parallel to the wall which agrees with physical laws. Since we measure
    679 pressure force directly, the mean wind direction does not affect the form
    680 of the distributions, but only their parameters.
    681 
    682 \section{Conclusion}
    683 
    684 In this paper we proposed three-axis anemometer that measures wind speed for
    685 each axis independently. We analysed the data collected by this anemometer and
    686 verified that per-axis wind speeds fit into Weibull distribution with the
    687 largest NRMSE of 6.7\% and wind directions fit into von Mises distribution with
    688 the largest NRMSE of 11\%. We estimated autocovariance functions for wind speed
    689 for each axis of the anemometer and used this approximations to simulate wind
    690 flow in Virtual Testbed. The parameters of these functions allow to control
    691 both wind speed and mean direction. The future work is to construct an array of
    692 anemometers that is able to measure spatial autocovariance using the proposed
    693 anemometer as the base.
    694 
    695 \subsubsection*{Acknowledgements.}
    696 Research work is supported by Council for grants of the President of the
    697 Russian Federation (grant no.~MK-383.2020.9).
    698 
    699 \bibliographystyle{splncs04}
    700 \bibliography{main.bib}
    701 
    702 \end{document}