Commit e2f1ca1f authored by Spencer Sherwin's avatar Spencer Sherwin
Browse files

Updated the branch to use input file specified as...

Updated the branch to use input file specified as USERDEFINEDTYPE="Womersley:WomParams.xml" which takes the form:
<NEKTAR>
  <WOMERSLEYBC>
    <WOMPARAMS>
      <W PROPERTY="Radius" VALUE="0.5" />
      <W PROPERTY="Period" VALUE="1.0" />
      <W PROPERTY="axisnormal" VALUE="0.0,0.0,1.0" />
      <W PROPERTY="axispoint" VALUE="0.0,0.0,0.0" />
    </WOMPARAMS>

    <FOURIERCOEFFS>
      <F ID="0"> 0.600393641193,    0.0               </F>
      <F ID="1"> -0.277707172935,   0.0767582715413   </F>
      <F ID="2"> -0.0229953131146,  0.0760936232478   </F>
      <F ID="3"> 0.00858135174058,  0.017089888642    </F>
      <F ID="4"> 0.0140332527651,   0.0171575122496   </F>
      <F ID="5"> 0.0156970122129,   -0.00547357750345 </F>
      <F ID="6"> 0.00473626554238,  -0.00498786519876 </F>
      <F ID="7"> 0.00204434981523,  -0.00614566561937 </F>
      <F ID="8"> -0.000274697215201, 0.000153571881197 </F>
      <F ID="9"> -0.000148037910774, 2.68919619581e-05 </F>
    </FOURIERCOEFFS>
  </WOMERSLEYBC>
</NEKTAR>
parent 35a231a3
......@@ -874,14 +874,22 @@ the session file:
\subsection{Womersley Boundary Condition}
It is possible to define the time-dependent Womersley velocity profile for pulsatile flow in a pipe (ref). The modulation of the velocity profile is based on the desired peak or centerline velocity which can be represented by a Fourier expansion $U_{max}=A(\omega_n)e^{i\omega_n t}$ where $A$ are the Fourier modes and $\omega $ the frequency. The womersely solution is then defined as:
It is possible to define the time-dependent Womersley velocity profile
for pulsatile flow in a pipe. The modulation of the velocity profile
is based on the desired peak or centerline velocity which can be
represented by a Fourier expansion $U_{max}=A(\omega_n)e^{i\omega_n
t}$ where $A$ are the Fourier modes and $\omega $ the frequency. The
womersely solution is then defined as:
$$ w(r,t) = A_0(1-(r/R)^2) + \sum_{n=1}^N \tilde{A_n}[1-\frac{J_0(i^{3/2}\alpha_n r/R)}{J_0(i^{3/2} \alpha)}]e^{i\omega_n t} $$
$$ w(r,t) = A_0(1-(r/R)^2) + \sum_{n=1}^N
\tilde{A_n}[1-\frac{J_0(i^{3/2}\alpha_n r/R)}{J_0(i^{3/2}
\alpha)}]e^{i\omega_n t} $$
where the womersley number $\alpha$ is defined:
$$ \alpha_n = R\sqrt{\frac{2\pi n}{T\nu}}$$
and $\tilde{A_n}$ ($n=1:N$)are the Fourier coefficients scaled in the following way:
and $\tilde{A_n}$ ($n=1:N$)are the Fourier coefficients scaled in the
following way:
$$ \tilde{A_n} = 2A_n/[1 - \frac{1}{J_0(i^{3/2}\alpha)}] $$
......@@ -889,31 +897,57 @@ The Womersley velocity profile is implemented in the following way:
\begin{lstlisting}[style=XMLStyle]
<REGION REF="0">
<D VAR="u" USERDEFINEDTYPE="Womersley" VALUE="0" />
<D VAR="v" USERDEFINEDTYPE="Womersley" VALUE="0" />
<D VAR="w" USERDEFINEDTYPE="Womersley" VALUE="0" />
<D VAR="u" USERDEFINEDTYPE="Womersley:WomParams.xml" VALUE="0" />
<D VAR="v" USERDEFINEDTYPE="Womersley:WomParams.xml" VALUE="0" />
<D VAR="w" USERDEFINEDTYPE="Womersley:WomParams.xml" VALUE="0" />
<N VAR="p" USERDEFINEDTYPE="H" VALUE="0" />
</REGION>
\end{lstlisting}
A text file containing the Fourier coefficients, $\tilde{A}$, must be in the directory where the solver is called from. The name of the file needs to be "fourier\_coef.txt" and it contains the real and imaginary coefficients in the first and second column respectively. Each value of $\tilde{A}$ is written as a seperate line in the following form:
$(-0.280488272252,0.087836617233)$
The following parameters also need to be defined the parameters section of the .xml file:
\begin{lstlisting}[style=XMLStyle]
<P> x0 = 0.0 </P>
<P> x1 = 0.0 </P>
<P> x2 = 0.0 </P>
<P> Period = 1.0 </P>
<P> Radius = 0.5 </P>
<P> Modes = 10 </P>
<P> n0 = 0.0 </P>
<P> n1 = 0.0 </P>
<P> n2 = 1.0 </P>
\end{lstlisting}
A file containing the Fourier coefficients, $\tilde{A}$, must be in
the directory where the solver is called from. The name of the file is
defined by the string given in the attribute \inltt{USERDEFINEDTYPE}
after the ``:'' and contains the real and imaginary coefficients. This
file has the format
\begin{lstlisting}[style=XMLStyle]
<NEKTAR>
<WOMERSLEYBC>
<WOMPARAMS>
<W PROPERTY="Radius" VALUE="0.5" />
<W PROPERTY="Period" VALUE="1.0" />
<W PROPERTY="axisnormal" VALUE="0.0,0.0,1.0" />
<W PROPERTY="axispoint" VALUE="0.0,0.0,0.0" />
</WOMPARAMS>
<FOURIERCOEFFS>
<F ID="0"> 0.600393641193, 0.0 </F>
<F ID="1"> -0.277707172935, 0.0767582715413 </F>
<F ID="2"> -0.0229953131146, 0.0760936232478 </F>
<F ID="3"> 0.00858135174058, 0.017089888642 </F>
<F ID="4"> 0.0140332527651, 0.0171575122496 </F>
<F ID="5"> 0.0156970122129, -0.00547357750345 </F>
<F ID="6"> 0.00473626554238, -0.00498786519876 </F>
<F ID="7"> 0.00204434981523, -0.00614566561937 </F>
<F ID="8"> -0.000274697215201, 0.000153571881197 </F>
<F ID="9"> -0.000148037910774, 2.68919619581e-05 </F>
</FOURIERCOEFFS>
</WOMERSLEYBC>
</NEKTAR>
\end{lstlisting}
Each value of $\tilde{A}$ is provided in the \inltt{FOURIERCOEFFS}
section and provided as separate entries containing the real and
imaginary components, i.e. the mean component provided above is
$0.600393641193,0.0$.
Similarly in the \inltt{WOMPARAMS} section the key parameters of the boundary condition are also provided as:
\begin{itemize}
\item \inltt{RADIUS} is the radius of the boundary.
\item \inltt{PERIOD} is the cycle time period,
\item \inltt{AXISNORMAL} defines the normal direction to the boundary,
\item \inltt{AXISPOINT} defines a coordinate in the boundary centre,
\end{itemize}
where x0, x1 and x2 define the location of the boundary center, Period is the cycle period, Radius is the boundary radius, Modes is the number of Fourier modes used to define the waveform, and n0, n1 and n2 are the x,y,z components of the inward normal vector of the boundary.
\subsection{Forcing}
\subsubsection{MovingBody}
......
......@@ -47,11 +47,15 @@
#include <LibUtilities/Polylib/Polylib.h>
#include <LibUtilities/BasicUtils/FileSystem.h>
#include <LibUtilities/BasicUtils/PtsIO.h>
#include <algorithm>
#include <complex>
#include <iostream>
#include <fstream>
#include <sstream>
#include <tinyxml.h>
#include <LibUtilities/BasicUtils/ParseUtils.hpp>
using namespace std;
namespace Nektar
......@@ -249,14 +253,14 @@ namespace Nektar
{
if(boost::istarts_with(m_fields[i]->GetBndConditions()[n]->GetUserDefined(),"Womersley"))
{
//m_womersleyParams[n] = SetWomersley(m_fields[i]->GetBndConditions()[n]->GetUSerDefined());
m_womersleyParams[n] = MemoryManager<WomersleyParams>::AllocateSharedPtr(m_spacedim);
#if 0
m_session->LoadParameter("Period",m_womersleyParams[n]->m_period);
m_session->LoadParameter("Radius",m_womersleyParams[n]->m_radius);
m_session->LoadParameter("Modes",m_womersleyParams[n]->m_modes);
NekDouble n0,n1,n2;
m_session->LoadParameter("n0",n0);
m_session->LoadParameter("n1",n1);
......@@ -272,15 +276,9 @@ namespace Nektar
m_womersleyParams[n]->m_axispoint[0] = x0;
m_womersleyParams[n]->m_axispoint[1] = x1;
m_womersleyParams[n]->m_axispoint[2] = x2;
int M = m_womersleyParams[n]->m_modes;
#endif
// Read in fourier coeffs
m_womersleyParams[n]->m_wom_vel_r =
Array<OneD, NekDouble> (M,0.0);
m_womersleyParams[n]->m_wom_vel_i =
Array<OneD, NekDouble> (M,0.0);
SetUpWomersley(n,
m_fields[i]->GetBndConditions()[n]->GetUserDefined());
......@@ -569,7 +567,7 @@ namespace Nektar
std::complex<NekDouble> za, zar, zJ0, zJ0r, zq, zvel, zJ0rJ0;
int i,j,k;
int M = WomParam->m_modes;
int M = WomParam->m_wom_vel_r.size();
NekDouble R = WomParam->m_radius;
NekDouble T = WomParam->m_period;
......@@ -655,33 +653,152 @@ namespace Nektar
// Push back to Coeff space
bc->FwdTrans(wbc,Bvals);
}
}
SetUpWomersley(const int bndid, std::string womStr)
void IncNavierStokes::SetUpWomersley(const int bndid, std::string womStr)
{
std::string::size_type indxBeg = womStr.find_first_of(':') + 1;
string filename = womStr.substr(indxBeg,womStr.end());
string filename = womStr.substr(indxBeg,string::npos);
std::complex<NekDouble> coef;
#if 1
TiXmlDocument doc(filename);
bool loadOkay = doc.LoadFile();
ASSERTL0(loadOkay,(std::string("Failed to load file: ") +
filename).c_str());
TiXmlHandle docHandle(&doc);
int err; /// Error value returned by TinyXML.
TiXmlElement *nektar = doc.FirstChildElement("NEKTAR");
ASSERTL0(nektar, "Unable to find NEKTAR tag in file.");
TiXmlElement *wombc = nektar->FirstChildElement("WOMERSLEYBC");
ASSERTL0(wombc, "Unable to find WOMERSLEYBC tag in file.");
// read womersley parameters
TiXmlElement *womparam = wombc->FirstChildElement("WOMPARAMS");
ASSERTL0(womparam, "Unable to find WOMPARAMS tag in file.");
// Input coefficients
TiXmlElement *params = womparam->FirstChildElement("W");
map<std::string,std::string> Wparams;
// read parameter list
while (params)
{
std::string propstr;
propstr = params->Attribute("PROPERTY");
ASSERTL0(!propstr.empty(),"Failed to read PROPERTY value Womersley BC Parameter");
std::string valstr;
valstr = params->Attribute("VALUE");
ASSERTL0(!valstr.empty(),"Failed to read VALUE value Womersley BC Parameter");
std::transform(propstr.begin(),propstr.end(),propstr.begin(),
::toupper);
Wparams[propstr] = valstr;
params = params->NextSiblingElement("W");
}
bool parseGood;
// Read parameters
ASSERTL0(Wparams.count("RADIUS") == 1,
"Failed to find Radius parameter in Womersley boundary conditions");
std::vector<NekDouble> rad;
parseGood = ParseUtils::GenerateUnOrderedVector(
Wparams["RADIUS"].c_str(),rad);
m_womersleyParams[bndid]->m_radius = rad[0];
ASSERTL0(Wparams.count("PERIOD") == 1,
"Failed to find period parameter in Womersley boundary conditions");
std::vector<NekDouble> period;
parseGood = ParseUtils::GenerateUnOrderedVector(
Wparams["PERIOD"].c_str(),period);
m_womersleyParams[bndid]->m_period = period[0];
ASSERTL0(Wparams.count("AXISNORMAL") == 1,
"Failed to find axisnormal parameter in Womersley boundary conditions");
std::vector<NekDouble> anorm;
parseGood = ParseUtils::GenerateUnOrderedVector(
Wparams["AXISNORMAL"].c_str(),anorm);
m_womersleyParams[bndid]->m_axisnormal[0] = anorm[0];
m_womersleyParams[bndid]->m_axisnormal[1] = anorm[1];
m_womersleyParams[bndid]->m_axisnormal[2] = anorm[2];
ASSERTL0(Wparams.count("AXISPOINT") == 1,
"Failed to find axispoint parameter in Womersley boundary conditions");
std::vector<NekDouble> apt;
parseGood = ParseUtils::GenerateUnOrderedVector(
Wparams["AXISPOINT"].c_str(),apt);
m_womersleyParams[bndid]->m_axispoint[0] = apt[0];
m_womersleyParams[bndid]->m_axispoint[1] = apt[1];
m_womersleyParams[bndid]->m_axispoint[2] = apt[2];
// Read Temporal Foruier Coefficients.
// Find the FourierCoeff tag
TiXmlElement *coeff = wombc->FirstChildElement("FOURIERCOEFFS");
// Input coefficients
TiXmlElement *fval = coeff->FirstChildElement("F");
int indx;
int nextFourierCoeff = -1;
while (fval)
{
nextFourierCoeff++;
TiXmlAttribute *fvalAttr = fval->FirstAttribute();
std::string attrName(fvalAttr->Name());
ASSERTL0(attrName == "ID", (std::string("Unknown attribute name: ") + attrName).c_str());
err = fvalAttr->QueryIntValue(&indx);
ASSERTL0(err == TIXML_SUCCESS, "Unable to read attribute ID.");
std::string coeffStr = fval->FirstChild()->ToText()->ValueStr();
vector<NekDouble> coeffvals;
bool parseGood = ParseUtils::GenerateUnOrderedVector(coeffStr.c_str(),
coeffvals);
ASSERTL0(parseGood,(std::string("Problem reading value of fourier coefficient, ID=") + boost::lexical_cast<string>(indx)).c_str());
ASSERTL1(coeffvals.size() == 2,(std::string("Have not read two entries of Fourier coefficicent from ID="+ boost::lexical_cast<string>(indx)).c_str()));
m_womersleyParams[bndid]->m_wom_vel_r.push_back(coeffvals[0]);
m_womersleyParams[bndid]->m_wom_vel_i.push_back(coeffvals[1]);
fval = fval->NextSiblingElement("F");
}
#else
std::ifstream file(filename);
std::string line;
ASSERTL1(file.is_open(),"Missing file " + filename.c_str());
ASSERTL1(file.is_open(),(std::string("Missing file ") + filename).c_str());
int count = 0;
while(std::getline(file,line))
{
std::stringstream stream(line);
while((stream>>coef) && (count<M))
while(stream>>coef)
{
m_womersleyParams[n]->m_wom_vel_r[count] = coef.real();
m_womersleyParams[n]->m_wom_vel_i[count] = coef.imag();
m_womersleyParams[bndid]->m_wom_vel_r.push_back(coef.real());
m_womersleyParams[bndid]->m_wom_vel_i.push_back(coef.imag());
count++;
}
}
#endif
}
/**
......
......@@ -109,8 +109,8 @@ namespace Nektar
{};
/// Real and imaginary velocity comp. of wom
Array<OneD, NekDouble> m_wom_vel_r;
Array<OneD, NekDouble> m_wom_vel_i;
std::vector<NekDouble> m_wom_vel_r;
std::vector<NekDouble> m_wom_vel_i;
/// Womersley BC constants
NekDouble m_radius;
......@@ -120,7 +120,6 @@ namespace Nektar
// axis but shoudl be generalised to be any point on the axis
Array<OneD, NekDouble> m_axispoint;
int m_modes;
};
typedef boost::shared_ptr<WomersleyParams> WomersleyParamsSharedPtr;
......
<NEKTAR>
<WOMERSLEYBC>
<WOMPARAMS>
<W PROPERTY="Radius" VALUE="0.5" />
<W PROPERTY="Period" VALUE="1.0" />
<W PROPERTY="axisnormal" VALUE="0.0,0.0,1.0" />
<W PROPERTY="axispoint" VALUE="0.0,0.0,0.0" />
</WOMPARAMS>
<FOURIERCOEFFS>
<F ID="0"> 0.600393641193,0.0 </F>
<F ID="1"> -0.277707172935,0.0767582715413 </F>
<F ID="2"> -0.0229953131146,0.0760936232478 </F>
<F ID="3"> 0.00858135174058, 0.017089888642 </F>
<F ID="4"> 0.0140332527651, 0.0171575122496 </F>
<F ID="5"> 0.0156970122129,-0.00547357750345 </F>
<F ID="6"> 0.00473626554238,-0.00498786519876 </F>
<F ID="7"> 0.00204434981523,-0.00614566561937 </F>
<F ID="8"> -0.000274697215201,0.000153571881197 </F>
<F ID="9"> -0.000148037910774, 2.68919619581e-05 </F>
</FOURIERCOEFFS>
</WOMERSLEYBC>
</NEKTAR>
......@@ -5,7 +5,7 @@
<parameters>Womersley_PipeFlow.xml</parameters>
<files>
<file description="Session File">Womersley_PipeFlow.xml</file>
<file description="Session File">fourier_coef.txt</file>
<file description="Session File">WomParams.xml</file>
</files>
<metrics>
<metric type="L2" id="1">
......
......@@ -3138,17 +3138,7 @@
<P> IO_InfoSteps = 1 </P>
<P> IO_CFLSteps = 10 </P>
<P> Kinvis = 1e-1 </P>
<P> x0 = 0.0 </P>
<P> x1 = 0.0 </P>
<P> x2 = 0.0 </P>
<P> T = 1.0 </P>
<P> IterativeSolverTolerance = 1e-8</P>
<P> Period = 1.0 </P>
<P> Radius = 0.5 </P>
<P> Modes = 10 </P>
<P> n0 = 0.0 </P>
<P> n1 = 0.0 </P>
<P> n2 = 1.0 </P>
<P> IterativeSolverTolerance = 1e-8</P>
</PARAMETERS>
<VARIABLES>
<V ID="0"> u </V>
......@@ -3163,9 +3153,9 @@
</BOUNDARYREGIONS>
<BOUNDARYCONDITIONS>
<REGION REF="0">
<D VAR="u" USERDEFINEDTYPE="Womersley" VALUE="0" />
<D VAR="v" USERDEFINEDTYPE="Womersley" VALUE="0" />
<D VAR="w" USERDEFINEDTYPE="Womersley" VALUE="0" />
<D VAR="u" USERDEFINEDTYPE="Womersley:WomParams.xml" VALUE="0" />
<D VAR="v" USERDEFINEDTYPE="Womersley:WomParams.xml" VALUE="0" />
<D VAR="w" USERDEFINEDTYPE="Womersley:WomParams.xml" VALUE="0" />
<N VAR="p" USERDEFINEDTYPE="H" VALUE="0" />
</REGION>
<REGION REF="1">
......
(0.600393641193,0.0)
(-0.277707172935,0.0767582715413)
(-0.0229953131146,0.0760936232478)
(0.00858135174058,0.017089888642)
(0.0140332527651,0.0171575122496)
(0.0156970122129,-0.00547357750345)
(0.00473626554238,-0.00498786519876)
(0.00204434981523,-0.00614566561937)
(-0.000274697215201,0.000153571881197)
(-0.000148037910774,2.68919619581e-05)
(-9.57856939489e-05,-5.08895387701e-06)
(-6.70463926556e-05,-1.65064081916e-05)
(-4.90589738507e-05,-2.09323044963e-05)
(-3.68841015243e-05,-2.24662462663e-05)
(-2.81872974856e-05,-2.26722153401e-05)
(-2.17227349438e-05,-2.22351948795e-05)
(-1.67673268497e-05,-2.14833966211e-05)
(-1.28743417624e-05,-2.05838392404e-05)
(-9.75401301308e-06,-1.9624866773e-05)
(-7.21086814145e-06,-1.86541598669e-05)
(-5.10870548453e-06,-1.76974631393e-05)
(-3.35000329148e-06,-1.67683115763e-05)
(-1.86329382502e-06,-1.58732983678e-05)
(-5.95141100935e-07,-1.50150247488e-05)
(4.9511430622e-07,-1.41937956927e-05)
(1.43889033326e-06,-1.34086142181e-05)
(2.26079739896e-06,-1.26577725159e-05)
(2.98034912363e-06,-1.19392060054e-05)
(3.61318699812e-06,-1.12507054114e-05)
(4.17197166302e-06,-1.05900425903e-05)
(4.66704126604e-06,-9.9550434173e-06)
(5.10690435575e-06,-9.34362798745e-06)
(5.49861343923e-06,-8.75383061281e-06)
(5.84805126807e-06,-8.18380739317e-06)
(6.16015248402e-06,-7.63183624627e-06)
(6.43907681759e-06,-7.09631248003e-06)
(6.68834557648e-06,-6.57574185453e-06)
(6.91095002936e-06,-6.06873235859e-06)
(7.10943806484e-06,-5.57398546495e-06)
(7.28598389921e-06,-5.09028732881e-06)
(7.44244444229e-06,-4.61650020495e-06)
(7.58040506591e-06,-4.15155423445e-06)
(7.70121688497e-06,-3.69443967196e-06)
(7.80602717569e-06,-3.24419957609e-06)
(7.89580419555e-06,-2.79992295217e-06)
(7.97135738502e-06,-2.36073831809e-06)
(8.03335372023e-06,-1.92580765285e-06)
(8.08233080976e-06,-1.49432067999e-06)
(8.11870719962e-06,-1.06548943594e-06)
(8.14279023606e-06,-6.38543071037e-07)
(8.15478175069e-06,-2.12722831331e-07)
(8.15478175069e-06,2.12722831331e-07)
(8.14279023606e-06,6.38543071037e-07)
(8.11870719962e-06,1.06548943594e-06)
(8.08233080976e-06,1.49432067999e-06)
(8.03335372023e-06,1.92580765285e-06)
(7.97135738502e-06,2.36073831809e-06)
(7.89580419555e-06,2.79992295217e-06)
(7.80602717569e-06,3.24419957609e-06)
(7.70121688497e-06,3.69443967196e-06)
(7.58040506591e-06,4.15155423445e-06)
(7.44244444229e-06,4.61650020495e-06)
(7.28598389921e-06,5.09028732881e-06)
(7.10943806484e-06,5.57398546495e-06)
(6.91095002936e-06,6.06873235859e-06)
(6.68834557648e-06,6.57574185453e-06)
(6.43907681759e-06,7.09631248003e-06)
(6.16015248402e-06,7.63183624627e-06)
(5.84805126807e-06,8.18380739317e-06)
(5.49861343923e-06,8.75383061281e-06)
(5.10690435575e-06,9.34362798745e-06)
(4.66704126604e-06,9.9550434173e-06)
(4.17197166302e-06,1.05900425903e-05)
(3.61318699812e-06,1.12507054114e-05)
(2.98034912363e-06,1.19392060054e-05)
(2.26079739896e-06,1.26577725159e-05)
(1.43889033326e-06,1.34086142181e-05)
(4.9511430622e-07,1.41937956927e-05)
(-5.95141100935e-07,1.50150247488e-05)
(-1.86329382502e-06,1.58732983678e-05)
(-3.35000329148e-06,1.67683115763e-05)
(-5.10870548453e-06,1.76974631393e-05)
(-7.21086814145e-06,1.86541598669e-05)
(-9.75401301308e-06,1.9624866773e-05)
(-1.28743417624e-05,2.05838392404e-05)
(-1.67673268497e-05,2.14833966211e-05)
(-2.17227349438e-05,2.22351948795e-05)
(-2.81872974856e-05,2.26722153401e-05)
(-3.68841015243e-05,2.24662462663e-05)
(-4.90589738507e-05,2.09323044963e-05)
(-6.70463926556e-05,1.65064081916e-05)
(-9.57856939489e-05,5.08895387701e-06)
(-0.000148037910774,-2.68919619581e-05)
(-0.000274697215201,-0.000153571881197)
(0.0012487743012,0.00358075433573)
(0.00302716688812,0.00281656804248)
(0.00998667653676,0.0020731499545)
(0.00601647325241,-0.0122940343136)
(0.00100815795054,-0.011467429684)
(-0.0336627073363,-0.0266689931646)
(-0.0792435721149,0.0693290017434)
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment