diff --git a/docs/user-guide/solvers/incompressible-ns.tex b/docs/user-guide/solvers/incompressible-ns.tex index 7349250347425f4de444db7df90bbc18c93e887c..729adb5a4a71f7ce2a9809621cb833d8418c4e85 100644 --- a/docs/user-guide/solvers/incompressible-ns.tex +++ b/docs/user-guide/solvers/incompressible-ns.tex @@ -320,10 +320,10 @@ Possible values are: {Equations} & {\texttt{EQTYPE}} &{Dim.}&{Projections} & Alg.\\ \midrule Steady Stokes (SS)& \texttt{SteadyStokes} & All & CG &VCS \\ -Steady Onseen (SO) & \texttt{SteadyOseen} & All & CG& DS \\ +Steady Oseen (SO) & \texttt{SteadyOseen} & All & CG& DS \\ Unsteady Stokes (US) & \texttt{UnsteadyStokes} & All & CG &VCS \\ Steady Linearised NS (SLNS) & \texttt{SteadyLinearisedNS} & All & CG & DS \\ -Unsteady Linearised NS (ULNS) & \texttt{UnsteadyLinearisedNS} & All & CG & DS \\ +Unsteady Linearised NS (ULNS) & \texttt{UnsteadyLinearisedNS} & All & CG & VCS,DS \\ Unsteady NS (UNS) & \texttt{UnsteadyNavierStokes} & All & CG,CG-DG & VCS \\ \bottomrule \end{tabular} @@ -676,30 +676,64 @@ The following parameters can be specified in the \texttt{PARAMETERS} section of \item \inltt{Re}: sets the Reynolds number \item \inltt{Kinvis}: sets the kinematic viscosity $\nu$. \item \inltt{kdim}: sets the dimension of the Krylov subspace $\kappa$. Can be used in: \inltt{ModifiedArnoldi} and \inltt{Arpack}. Default value: 16. -\item \inltt{evtol}: sets the tolerance of the eigenvalues. Can be used in: \inltt{ModifiedArnoldi} and \inltt{Arpack}. Default value: $10^{-6}$. +\item \inltt{evtol}: sets the tolerance of the eigenvalues. Can be used in: \item \inltt{imagShift}: provide an imaginary shift to the direct sovler eigenvalue problem by the specified value. +ltt{ModifiedArnoldi} and \inltt{Arpack}. Default value: $10^{-6}$. \item \inltt{nits}: sets the maximum number of iterations. Can be used in: \inltt{ModifiedArnoldi} and \inltt{Arpack}. Default value: 500. \item \inltt{LZ}: sets the length in the spanswise direction $L_z$. Can be used in \inltt{Homogeneous} set to \inltt{1D}. Default value: 1. \item \inltt{HomModesZ}: sets the number of planes in the homogeneous directions. Can be used in \inltt{Homogeneous} set to \inltt{1D} and \inltt{ModeType} set to \inltt{MultipleModes}. \item \inltt{N\_slices}: sets the number of temporal slices for Floquet stability analysis. \item \inltt{period}: sets the periodicity of the base flow. +\item \inltt{realShift}: provide a real shift to the direct sovler eigenvalue problem by the specified value. \end{itemize} \subsection{Functions} -\begin{itemize} -\item To be INserted -\end{itemize} +When using the direct solver for stability analysis it is necessary to specify a Forcing function ``StabilityCoupledLNS'' in the form: +\begin{lstlisting}[style=XMLStyle] +<FORCING> + <FORCE TYPE="StabilityCoupledLNS"> + </FORCE> +</FORCING> +\end{lstlisting} + +This is required since we need to tell the solver to use the existing +field as a forcing function to the direct matrix inverse as part of +the Arnoldi iteration. + + +\begin{notebox} +Examples of the set up of the direct solver stability analysis (and +other incompressible Navier-Stokes solvers) can be found in the +regression test directory +\inlsh{NEKTAR/solvers/IncNavierStokesSolver/Tests}. See for example the files +\inlsh{PPF\_R15000\_ModifiedArnoldi\_Shift.tst} and \inlsh{PPF\_R15000\_3D.xml} +noting that some parameters are specified in the .tst files. +\end{notebox} \section{Steady-state solver Session file configuration} \label{SectionSFD_XML} -In this section, we detail how to use the steady-state solver (that implements the selective frequency damping method, see Sec. \ref{SectionSFD}). -Two cases are detailed here: the execution of the classical SFD method and the \textit{adaptive} SFD method, where the control coefficient $\chi$ and the filter width $\Delta$ of the SFD method are updated all along the solver execution. For the second case, the parameters of the SFD method do not need to be defined by the user (they will be automatically calculated all along the solver execution) but several session files must be defined in a very specific way. +In this section, we detail how to use the steady-state solver (that +implements the selective frequency damping method, see +Sec. \ref{SectionSFD}). Two cases are detailed here: the execution of +the classical SFD method and the \textit{adaptive} SFD method, where +the control coefficient $\chi$ and the filter width $\Delta$ of the +SFD method are updated all along the solver execution. For the second +case, the parameters of the SFD method do not need to be defined by +the user (they will be automatically calculated all along the solver +execution) but several session files must be defined in a very +specific way. \subsection{Execution of the classical steady-state solver} \subsubsection{Solver Info} -The definition of \inltt{Eqtype}, \inltt{TimeIntegrationMethod} and \inltt{Projection} is similar as what is explained in \ref{SectionIncNS_SolverInfo_Stab}. The use of the steady-state solver is enforced through the definition of the \inltt{Driver}: is has to be \inltt{SteadyState}. \inltt{EvolutionOperator} does not need to be defined to run the unadapted SFD method (by default, it is \inltt{Nonlinear}). +The definition of \inltt{Eqtype}, \inltt{TimeIntegrationMethod} and +\inltt{Projection} is similar as what is explained in +\ref{SectionIncNS_SolverInfo_Stab}. The use of the steady-state solver +is enforced through the definition of the \inltt{Driver} which has to be +\inltt{SteadyState}. \inltt{EvolutionOperator} does not need to be +defined to run the unadapted SFD method (by default, it is set to +\inltt{Nonlinear}). \subsubsection{Parameters} diff --git a/library/LibUtilities/BasicUtils/SessionReader.cpp b/library/LibUtilities/BasicUtils/SessionReader.cpp index 89acbcda85ec6c639cddaf613503f678c0c34df6..6ed918a77e4be4fade944934631af414ebbf0272 100644 --- a/library/LibUtilities/BasicUtils/SessionReader.cpp +++ b/library/LibUtilities/BasicUtils/SessionReader.cpp @@ -151,7 +151,7 @@ namespace Nektar * This list is populated by ReadGlobalSysSoln if the * GLOBALSYSSOLNINFO section is defined in the input file. * This List allows for details to define for the Global Sys - * solver for each variable. + * solver for each variable. */ GloSysSolnInfoList& SessionReader::GetGloSysSolnList() { @@ -198,7 +198,7 @@ namespace Nektar // type. if (m_comm->GetSize() > 1) { - GetSolverInfoDefaults()["GLOBALSYSSOLN"] = + GetSolverInfoDefaults()["GLOBALSYSSOLN"] = "IterativeStaticCond"; } } @@ -208,9 +208,9 @@ namespace Nektar * */ SessionReader::SessionReader( - int argc, - char *argv[], - const std::vector<std::string> &pFilenames, + int argc, + char *argv[], + const std::vector<std::string> &pFilenames, const CommSharedPtr &pComm) { ASSERTL0(pFilenames.size() > 0, "No filenames specified."); @@ -232,7 +232,7 @@ namespace Nektar if (m_comm->GetSize() > 1) { - GetSolverInfoDefaults()["GLOBALSYSSOLN"] = + GetSolverInfoDefaults()["GLOBALSYSSOLN"] = "IterativeStaticCond"; } } @@ -241,7 +241,7 @@ namespace Nektar // type. if (m_comm->GetSize() > 1) { - GetSolverInfoDefaults()["GLOBALSYSSOLN"] = + GetSolverInfoDefaults()["GLOBALSYSSOLN"] = "IterativeStaticCond"; } } @@ -279,6 +279,9 @@ namespace Nektar // command line. CmdLineOverride(); + // Verify SOLVERINFO values + VerifySolverInfo(); + // In verbose mode, print out parameters and solver info sections if (m_verbose && m_comm) { @@ -320,7 +323,7 @@ namespace Nektar ("verbose,v", "be verbose") ("version,V", "print version information") ("help,h", "print this help message") - ("solverinfo,I", po::value<vector<std::string> >(), + ("solverinfo,I", po::value<vector<std::string> >(), "override a SOLVERINFO property") ("parameter,P", po::value<vector<std::string> >(), "override a parameter") @@ -337,7 +340,7 @@ namespace Nektar "only partition mesh into N partitions.") ("part-info", "Output partition information") ; - + CmdLineArgMap::const_iterator cmdIt; for (cmdIt = GetCmdLineArgMap().begin(); cmdIt != GetCmdLineArgMap().end(); ++cmdIt) @@ -366,7 +369,7 @@ namespace Nektar // specified using the input-file option by the user). po::options_description hidden("Hidden options"); hidden.add_options() - ("input-file", po::value< vector<string> >(), + ("input-file", po::value< vector<string> >(), "input filename") ; @@ -434,14 +437,14 @@ namespace Nektar { m_verbose = false; } - + // Print a warning for unknown options std::vector< po::basic_option<char> >::iterator x; for (x = parsed.options.begin(); x != parsed.options.end(); ++x) { if (x->unregistered) { - cout << "Warning: Unknown option: " << x->string_key + cout << "Warning: Unknown option: " << x->string_key << endl; } } @@ -595,11 +598,11 @@ namespace Nektar */ const std::string SessionReader::GetSessionNameRank() const { - std::string dirname = m_sessionName + "_xml"; + std::string dirname = m_sessionName + "_xml"; fs::path pdirname(dirname); - + std::string vFilename = "P" + boost::lexical_cast<std::string>(m_comm->GetRowComm()->GetRank()); - fs::path pFilename(vFilename); + fs::path pFilename(vFilename); fs::path fullpath = pdirname / pFilename; @@ -667,7 +670,7 @@ namespace Nektar { std::string vName = boost::to_upper_copy(pName); ParameterMap::const_iterator paramIter = m_parameters.find(vName); - ASSERTL0(paramIter != m_parameters.end(), "Required parameter '" + + ASSERTL0(paramIter != m_parameters.end(), "Required parameter '" + pName + "' not specified in session."); pVar = (int)floor(paramIter->second); } @@ -700,7 +703,7 @@ namespace Nektar { std::string vName = boost::to_upper_copy(pName); ParameterMap::const_iterator paramIter = m_parameters.find(vName); - ASSERTL0(paramIter != m_parameters.end(), "Required parameter '" + + ASSERTL0(paramIter != m_parameters.end(), "Required parameter '" + pName + "' not specified in session."); pVar = paramIter->second; } @@ -710,8 +713,8 @@ namespace Nektar * */ void SessionReader::LoadParameter( - const std::string &pName, - NekDouble &pVar, + const std::string &pName, + NekDouble &pVar, const NekDouble &pDefault) const { std::string vName = boost::to_upper_copy(pName); @@ -731,7 +734,7 @@ namespace Nektar /** * */ - void SessionReader::SetParameter(const std::string &pName, int &pVar) + void SessionReader::SetParameter(const std::string &pName, int &pVar) { std::string vName = boost::to_upper_copy(pName); m_parameters[vName] = pVar; @@ -742,7 +745,7 @@ namespace Nektar * */ void SessionReader::SetParameter( - const std::string &pName, NekDouble& pVar) + const std::string &pName, NekDouble& pVar) { std::string vName = boost::to_upper_copy(pName); m_parameters[vName] = pVar; @@ -780,7 +783,7 @@ namespace Nektar * */ void SessionReader::SetSolverInfo( - const std::string &pProperty, const std::string &pValue) + const std::string &pProperty, const std::string &pValue) { std::string vProperty = boost::to_upper_copy(pProperty); SolverInfoMap::iterator iter = m_solverInfo.find(vProperty); @@ -795,8 +798,8 @@ namespace Nektar * */ void SessionReader::LoadSolverInfo( - const std::string &pName, - std::string &pVar, + const std::string &pName, + std::string &pVar, const std::string &pDefault) const { std::string vName = boost::to_upper_copy(pName); @@ -857,7 +860,7 @@ namespace Nektar /** * */ - bool SessionReader::DefinesGlobalSysSolnInfo(const std::string &pVariable, + bool SessionReader::DefinesGlobalSysSolnInfo(const std::string &pVariable, const std::string &pProperty) const { @@ -869,37 +872,37 @@ namespace Nektar } std::string vProperty = boost::to_upper_copy(pProperty); - + GloSysInfoMap::const_iterator iter1 = iter->second.find(vProperty); if(iter1 == iter->second.end()) { return false; } - + return true; } - + /** * */ const std::string &SessionReader::GetGlobalSysSolnInfo(const std::string &pVariable, const std::string &pProperty) const { - GloSysSolnInfoList::const_iterator iter; + GloSysSolnInfoList::const_iterator iter; ASSERTL0( (iter = GetGloSysSolnList().find(pVariable)) != GetGloSysSolnList().end(), "Failed to find variable in GlobalSysSolnInfoList"); std::string vProperty = boost::to_upper_copy(pProperty); - GloSysInfoMap::const_iterator iter1; + GloSysInfoMap::const_iterator iter1; ASSERTL0( (iter1 = iter->second.find(vProperty)) != iter->second.end(), "Failed to find property: " + vProperty + " in GlobalSysSolnInfoList"); - + return iter1->second; } - + /** * */ @@ -1018,8 +1021,8 @@ namespace Nektar /** * */ - void SessionReader::SetVariable(const unsigned int &idx, - std::string newname) + void SessionReader::SetVariable(const unsigned int &idx, + std::string newname) { ASSERTL0(idx < m_variables.size(), "Variable index out of range."); m_variables[idx] = newname; @@ -1104,7 +1107,7 @@ namespace Nektar // Check function is defined somewhere ASSERTL0(specific || wildcard, "No such variable " + pVariable - + " in domain " + boost::lexical_cast<string>(pDomain) + + " in domain " + boost::lexical_cast<string>(pDomain) + " defined for function " + pName + " in session file."); @@ -1161,7 +1164,7 @@ namespace Nektar // Check function is defined somewhere ASSERTL0(specific || wildcard, "No such variable " + pVariable - + " in domain " + boost::lexical_cast<string>(pDomain) + + " in domain " + boost::lexical_cast<string>(pDomain) + " defined for function " + pName + " in session file."); @@ -1192,7 +1195,7 @@ namespace Nektar * */ std::string SessionReader::GetFunctionFilename( - const std::string &pName, + const std::string &pName, const std::string &pVariable, const int pDomain) const { @@ -1216,10 +1219,10 @@ namespace Nektar // Check function is defined somewhere ASSERTL0(specific || wildcard, "No such variable " + pVariable - + " in domain " + boost::lexical_cast<string>(pDomain) + + " in domain " + boost::lexical_cast<string>(pDomain) + " defined for function " + pName + " in session file."); - + // If not specific, must be wildcard if (!specific) { @@ -1234,7 +1237,7 @@ namespace Nektar * */ std::string SessionReader::GetFunctionFilename( - const std::string &pName, + const std::string &pName, const unsigned int &pVar, const int pDomain) const { @@ -1309,7 +1312,7 @@ namespace Nektar * */ void SessionReader::SetTag( - const std::string &pName, + const std::string &pName, const std::string &pValue) { std::string vName = boost::to_upper_copy(pName); @@ -1355,7 +1358,7 @@ namespace Nektar void SessionReader::SubstituteExpressions(std::string& pExpr) { ExpressionMap::iterator exprIter; - for (exprIter = m_expressions.begin(); + for (exprIter = m_expressions.begin(); exprIter != m_expressions.end(); ++exprIter) { boost::replace_all(pExpr, exprIter->first, exprIter->second); @@ -1434,7 +1437,7 @@ namespace Nektar LoadDoc(pFilenames[0], vMainDoc); TiXmlHandle vMainHandle(vMainDoc); - TiXmlElement* vMainNektar = + TiXmlElement* vMainNektar = vMainHandle.FirstChildElement("NEKTAR").Element(); // Read all subsequent XML documents. @@ -1447,16 +1450,16 @@ namespace Nektar { TiXmlDocument* vTempDoc = new TiXmlDocument; LoadDoc(pFilenames[i], vTempDoc); - + TiXmlHandle docHandle(vTempDoc); TiXmlElement* vTempNektar; vTempNektar = docHandle.FirstChildElement("NEKTAR").Element(); ASSERTL0(vTempNektar, "Unable to find NEKTAR tag in file."); TiXmlElement* p = vTempNektar->FirstChildElement(); - + while (p) { - TiXmlElement *vMainEntry = + TiXmlElement *vMainEntry = vMainNektar->FirstChildElement(p->Value()); TiXmlElement *q = new TiXmlElement(*p); if (vMainEntry) @@ -1466,7 +1469,7 @@ namespace Nektar vMainNektar->LinkEndChild(q); p = p->NextSiblingElement(); } - + delete vTempDoc; } } @@ -1507,7 +1510,7 @@ namespace Nektar * */ void SessionReader::CreateComm( - int &argc, + int &argc, char* argv[]) { if (argc == 0) @@ -1607,7 +1610,7 @@ namespace Nektar // Number of partitions is specified by the parameter. int nParts = GetCmdLineArgument<int>("part-only"); SessionReaderSharedPtr vSession = GetSharedThisPtr(); - MeshPartitionSharedPtr vPartitioner = + MeshPartitionSharedPtr vPartitioner = GetMeshPartitionFactory().CreateInstance( vPartitionerName, vSession); vPartitioner->PartitionMesh(nParts, true); @@ -1873,7 +1876,7 @@ namespace Nektar // if not. if (parametersElement) { - TiXmlElement *parameter = + TiXmlElement *parameter = parametersElement->FirstChildElement("P"); ParameterMap caseSensitiveParameters; @@ -1902,7 +1905,7 @@ namespace Nektar catch (...) { ASSERTL0(false, "Syntax error in parameter " - "expression '" + line + "expression '" + line + "' in XML element: \n\t'" + tagcontent.str() + "'"); } @@ -1921,7 +1924,7 @@ namespace Nektar } catch (const std::runtime_error &) { - ASSERTL0(false, + ASSERTL0(false, "Error evaluating parameter expression" " '" + rhs + "' in XML element: \n\t'" + tagcontent.str() + "'"); @@ -1952,12 +1955,12 @@ namespace Nektar return; } - TiXmlElement *solverInfoElement = + TiXmlElement *solverInfoElement = conditions->FirstChildElement("SOLVERINFO"); if (solverInfoElement) { - TiXmlElement *solverInfo = + TiXmlElement *solverInfo = solverInfoElement->FirstChildElement("I"); while (solverInfo) @@ -1968,7 +1971,7 @@ namespace Nektar ASSERTL0(solverInfo->Attribute("PROPERTY"), "Missing PROPERTY attribute in solver info " "XML element: \n\t'" + tagcontent.str() + "'"); - std::string solverProperty = + std::string solverProperty = solverInfo->Attribute("PROPERTY"); ASSERTL0(!solverProperty.empty(), "PROPERTY attribute must be non-empty in XML " @@ -1987,29 +1990,18 @@ namespace Nektar "VALUE attribute must be non-empty in XML " "element: \n\t'" + tagcontent.str() + "'"); - EnumMapList::const_iterator propIt = - GetSolverInfoEnums().find(solverPropertyUpper); - if (propIt != GetSolverInfoEnums().end()) - { - EnumMap::const_iterator valIt = - propIt->second.find(solverValue); - ASSERTL0(valIt != propIt->second.end(), - "Value '" + solverValue + "' is not valid for " - "property '" + solverProperty + "'"); - } - // Set Variable m_solverInfo[solverPropertyUpper] = solverValue; solverInfo = solverInfo->NextSiblingElement("I"); } } - + if (m_comm && m_comm->GetRowComm()->GetSize() > 1) { ASSERTL0( m_solverInfo["GLOBALSYSSOLN"] == "IterativeFull" || m_solverInfo["GLOBALSYSSOLN"] == "IterativeStaticCond" || - m_solverInfo["GLOBALSYSSOLN"] == + m_solverInfo["GLOBALSYSSOLN"] == "IterativeMultiLevelStaticCond" || m_solverInfo["GLOBALSYSSOLN"] == "XxtFull" || m_solverInfo["GLOBALSYSSOLN"] == "XxtStaticCond" || @@ -2080,7 +2072,7 @@ namespace Nektar ASSERTL0(SysSolnInfo->Attribute("PROPERTY"), "Missing PROPERTY attribute in " "GlobalSysSolnInfo for variable(s) '" - + VarList + "' in XML element: \n\t'" + + VarList + "' in XML element: \n\t'" + tagcontent.str() + "'"); std::string SysSolnProperty = @@ -2171,7 +2163,7 @@ namespace Nektar return; } - TiXmlElement *expressionsElement = + TiXmlElement *expressionsElement = conditions->FirstChildElement("EXPRESSIONS"); if (expressionsElement) @@ -2223,14 +2215,14 @@ namespace Nektar return; } - TiXmlElement *variablesElement = + TiXmlElement *variablesElement = conditions->FirstChildElement("VARIABLES"); // See if we have parameters defined. They are optional so we go on // if not. if (variablesElement) { - TiXmlElement *varElement = + TiXmlElement *varElement = variablesElement->FirstChildElement("V"); // Sequential counter for the composite numbers. @@ -2268,7 +2260,7 @@ namespace Nektar ASSERTL0(varChild, "Unable to read variable definition body for " "variable with ID " - + boost::lexical_cast<string>(i) + + boost::lexical_cast<string>(i) + " in XML element: \n\t'" + tagcontent.str() + "'"); std::string variableName = varChild->ToText()->ValueStr(); @@ -2276,10 +2268,10 @@ namespace Nektar std::istringstream variableStrm(variableName); variableStrm >> variableName; - ASSERTL0(std::find(m_variables.begin(), m_variables.end(), + ASSERTL0(std::find(m_variables.begin(), m_variables.end(), variableName) == m_variables.end(), "Variable with ID " - + boost::lexical_cast<string>(i) + + boost::lexical_cast<string>(i) + " in XML element \n\t'" + tagcontent.str() + "'\nhas already been defined."); @@ -2458,7 +2450,7 @@ namespace Nektar } - + // Add variables to function for (unsigned int i = 0; i < variableList.size(); ++i) { @@ -2470,8 +2462,8 @@ namespace Nektar = functionVarMap.find(key); ASSERTL0(fcnsIter == functionVarMap.end(), "Error setting expression '" + variableList[i] - + " in domain " - + boost::lexical_cast<std::string>(domainList[j]) + + " in domain " + + boost::lexical_cast<std::string>(domainList[j]) + "' in function '" + functionStr + "'. " "Expression has already been defined."); @@ -2487,7 +2479,7 @@ namespace Nektar } } } - + variable = variable->NextSiblingElement(); } // Add function definition to map @@ -2540,7 +2532,7 @@ namespace Nektar filter = filter->NextSiblingElement("FILTER"); } } - + void SessionReader::ParseEquals( const std::string &line, std::string &lhs, @@ -2555,7 +2547,7 @@ namespace Nektar if (end != line.find_last_of("=")) throw 1; // Check for no equals sign if (end == std::string::npos) throw 1; - + lhs = line.substr(line.find_first_not_of(" "), end-beg); lhs = lhs .substr(0, lhs.find_last_not_of(" ")+1); @@ -2563,7 +2555,7 @@ namespace Nektar rhs = rhs .substr(rhs.find_first_not_of(" ")); rhs = rhs .substr(0, rhs.find_last_not_of(" ")+1); } - + /** * */ @@ -2572,10 +2564,10 @@ namespace Nektar // Parse solver info overrides if (m_cmdLineOptions.count("solverinfo")) { - std::vector<std::string> solverInfoList = + std::vector<std::string> solverInfoList = m_cmdLineOptions["solverinfo"].as< std::vector<std::string> >(); - + for (int i = 0; i < solverInfoList.size(); ++i) { std::string lhs, rhs; @@ -2583,7 +2575,7 @@ namespace Nektar try { ParseEquals(solverInfoList[i], lhs, rhs); - } + } catch (...) { ASSERTL0(false, "Parse error with command line " @@ -2594,13 +2586,13 @@ namespace Nektar m_solverInfo[lhsUpper] = rhs; } } - + if (m_cmdLineOptions.count("parameter")) { - std::vector<std::string> parametersList = + std::vector<std::string> parametersList = m_cmdLineOptions["parameter"].as< std::vector<std::string> >(); - + for (int i = 0; i < parametersList.size(); ++i) { std::string lhs, rhs; @@ -2608,7 +2600,7 @@ namespace Nektar try { ParseEquals(parametersList[i], lhs, rhs); - } + } catch (...) { ASSERTL0(false, "Parse error with command line " @@ -2616,10 +2608,10 @@ namespace Nektar } std::string lhsUpper = boost::to_upper_copy(lhs); - + try { - m_parameters[lhsUpper] = + m_parameters[lhsUpper] = boost::lexical_cast<NekDouble>(rhs); } catch (...) @@ -2631,6 +2623,28 @@ namespace Nektar } } + void SessionReader::VerifySolverInfo() + { + SolverInfoMap::const_iterator x; + for (x = m_solverInfo.begin(); x != m_solverInfo.end(); ++x) + { + std::string solverProperty = x->first; + std::string solverValue = x->second; + + EnumMapList::const_iterator propIt = + GetSolverInfoEnums().find(solverProperty); + if (propIt != GetSolverInfoEnums().end()) + { + EnumMap::const_iterator valIt = + propIt->second.find(solverValue); + ASSERTL0(valIt != propIt->second.end(), + "Value '" + solverValue + "' is not valid for " + "property '" + solverProperty + "'"); + } + } + } + + void SessionReader::SetUpXmlDoc(void) { m_xmlDoc = MergeDoc(m_filenames); diff --git a/library/LibUtilities/BasicUtils/SessionReader.h b/library/LibUtilities/BasicUtils/SessionReader.h index 9cec7dad1801316082f111ca07e8eefe469f7b23..5d39cc43ec6b5b2829baad394aa70693667b3d28 100644 --- a/library/LibUtilities/BasicUtils/SessionReader.h +++ b/library/LibUtilities/BasicUtils/SessionReader.h @@ -110,17 +110,17 @@ namespace Nektar EquationSharedPtr m_expression; std::string m_fileVariable; }; - - typedef std::map<std::pair<std::string,int>, FunctionVariableDefinition> + + typedef std::map<std::pair<std::string,int>, FunctionVariableDefinition> FunctionVariableMap; - typedef std::map<std::string, FunctionVariableMap > + typedef std::map<std::string, FunctionVariableMap > FunctionMap; class SessionReader; typedef boost::shared_ptr<SessionReader> SessionReaderSharedPtr; /// Reads and parses information from a Nektar++ XML session file. - class SessionReader : + class SessionReader : public boost::enable_shared_from_this<SessionReader> { public: @@ -157,9 +157,9 @@ namespace Nektar * of the object. */ LIB_UTILITIES_EXPORT static SessionReaderSharedPtr CreateInstance( - int argc, - char *argv[], - std::vector<std::string> &pFilenames, + int argc, + char *argv[], + std::vector<std::string> &pFilenames, const CommSharedPtr &pComm = CommSharedPtr()) { SessionReaderSharedPtr p = MemoryManager< @@ -170,9 +170,9 @@ namespace Nektar } LIB_UTILITIES_EXPORT SessionReader( - int argc, - char *argv[], - const std::vector<std::string> &pFilenames, + int argc, + char *argv[], + const std::vector<std::string> &pFilenames, const CommSharedPtr &pComm); /// Destructor @@ -207,29 +207,29 @@ namespace Nektar const std::string &pName) const; /// Load an integer parameter LIB_UTILITIES_EXPORT void LoadParameter( - const std::string &name, + const std::string &name, int &var) const; /// Check for and load an integer parameter. LIB_UTILITIES_EXPORT void LoadParameter( - const std::string &name, - int &var, + const std::string &name, + int &var, const int &def) const; /// Load a double precision parameter LIB_UTILITIES_EXPORT void LoadParameter( - const std::string &name, + const std::string &name, NekDouble &var) const; /// Check for and load a double-precision parameter. LIB_UTILITIES_EXPORT void LoadParameter( - const std::string &name, - NekDouble &var, + const std::string &name, + NekDouble &var, const NekDouble &def) const; /// Set an integer parameter LIB_UTILITIES_EXPORT void SetParameter( - const std::string &name, + const std::string &name, int &var); /// Set a double precision parameter LIB_UTILITIES_EXPORT void SetParameter( - const std::string &name, + const std::string &name, NekDouble &var); @@ -252,35 +252,35 @@ namespace Nektar const std::string &vValue) const; /// Check for and load a solver info property. LIB_UTILITIES_EXPORT void LoadSolverInfo( - const std::string &name, - std::string &var, + const std::string &name, + std::string &var, const std::string &def = "") const; /// Check if the value of a solver info property matches. LIB_UTILITIES_EXPORT void MatchSolverInfo( - const std::string &name, - const std::string &trueval, - bool &var, + const std::string &name, + const std::string &trueval, + bool &var, const bool &def = false) const; /// Check if the value of a solver info property matches. LIB_UTILITIES_EXPORT bool MatchSolverInfo( - const std::string &name, + const std::string &name, const std::string &trueval) const; /// Check if the value of a solver info property matches. template<typename T> inline bool MatchSolverInfoAsEnum( - const std::string &name, + const std::string &name, const T &trueval) const; /// Registers an enumeration value. LIB_UTILITIES_EXPORT inline static std::string RegisterEnumValue( - std::string pEnum, - std::string pString, + std::string pEnum, + std::string pString, int pEnumValue); /// Registers the default string value of a solver info property. - LIB_UTILITIES_EXPORT inline static std::string + LIB_UTILITIES_EXPORT inline static std::string RegisterDefaultSolverInfo( - const std::string &pName, + const std::string &pName, const std::string &pValue); - + /* ----GlobalSysSolnInfo ----- */ LIB_UTILITIES_EXPORT bool DefinesGlobalSysSolnInfo( @@ -298,24 +298,24 @@ namespace Nektar const std::string &name) const; /// Checks for and load a geometric info string property. LIB_UTILITIES_EXPORT void LoadGeometricInfo( - const std::string &name, - std::string &var, + const std::string &name, + std::string &var, const std::string &def = "") const; /// Checks for and loads a geometric info boolean property. LIB_UTILITIES_EXPORT void LoadGeometricInfo( - const std::string &name, - bool &var, + const std::string &name, + bool &var, const bool &def = false) const; /// Checks for and loads a geometric info double-precision property. LIB_UTILITIES_EXPORT void LoadGeometricInfo( - const std::string &name, - NekDouble &var, + const std::string &name, + NekDouble &var, const NekDouble &def = 0.0) const; /// Check if the value of a geometric info string property matches. LIB_UTILITIES_EXPORT void MatchGeometricInfo( - const std::string &name, - const std::string &trueval, - bool &var, + const std::string &name, + const std::string &trueval, + bool &var, const bool &def = false) const; /* ------ VARIABLES ------ */ @@ -335,37 +335,37 @@ namespace Nektar const std::string &name) const; /// Checks if a specified function has a given variable defined. LIB_UTILITIES_EXPORT bool DefinesFunction( - const std::string &name, + const std::string &name, const std::string &variable, const int pDomain = 0) const; /// Returns an EquationSharedPtr to a given function variable. LIB_UTILITIES_EXPORT EquationSharedPtr GetFunction( - const std::string &name, + const std::string &name, const std::string &variable, const int pDomain = 0) const; /// Returns an EquationSharedPtr to a given function variable index. LIB_UTILITIES_EXPORT EquationSharedPtr GetFunction( - const std::string &name, + const std::string &name, const unsigned int &var, const int pDomain = 0) const; /// Returns the type of a given function variable. LIB_UTILITIES_EXPORT enum FunctionType GetFunctionType( - const std::string &name, + const std::string &name, const std::string &variable, const int pDomain = 0) const; /// Returns the type of a given function variable index. LIB_UTILITIES_EXPORT enum FunctionType GetFunctionType( - const std::string &pName, + const std::string &pName, const unsigned int &pVar, const int pDomain = 0) const; /// Returns the filename to be loaded for a given variable. LIB_UTILITIES_EXPORT std::string GetFunctionFilename( - const std::string &name, + const std::string &name, const std::string &variable, const int pDomain = 0) const; /// Returns the filename to be loaded for a given variable index. LIB_UTILITIES_EXPORT std::string GetFunctionFilename( - const std::string &name, + const std::string &name, const unsigned int &var, const int pDomain = 0) const; /// Returns the filename variable to be loaded for a given variable @@ -377,7 +377,7 @@ namespace Nektar /// Returns the instance of AnalyticExpressionEvaluator specific to /// this session. - LIB_UTILITIES_EXPORT AnalyticExpressionEvaluator& + LIB_UTILITIES_EXPORT AnalyticExpressionEvaluator& GetExpressionEvaluator(); /* ------ TAGS ------ */ @@ -386,7 +386,7 @@ namespace Nektar const std::string& pName) const; /// Sets a specified tag. LIB_UTILITIES_EXPORT void SetTag( - const std::string& pName, + const std::string& pName, const std::string& pValue); /// Returns the value of a specified tag. LIB_UTILITIES_EXPORT const std::string &GetTag( @@ -407,10 +407,10 @@ namespace Nektar return m_cmdLineOptions.find(pName)->second.as<T>(); } /// Registers a command-line argument with the session reader. - LIB_UTILITIES_EXPORT inline static std::string + LIB_UTILITIES_EXPORT inline static std::string RegisterCmdLineArgument( - const std::string &pName, - const std::string &pShortName, + const std::string &pName, + const std::string &pShortName, const std::string &pDescription); /// Registers a command-line flag with the session reader. LIB_UTILITIES_EXPORT inline static std::string @@ -462,7 +462,7 @@ namespace Nektar /// Map of original boundary region ordering for parallel periodic /// bcs. BndRegionOrdering m_bndRegOrder; - /// String to enumeration map for Solver Info parameters. + /// String to enumeration map for Solver Info parameters. LIB_UTILITIES_EXPORT static EnumMapList& GetSolverInfoEnums(); /// Default solver info options. LIB_UTILITIES_EXPORT static SolverInfoMap& GetSolverInfoDefaults(); @@ -473,7 +473,7 @@ namespace Nektar /// Main constructor LIB_UTILITIES_EXPORT SessionReader( - int argc, + int argc, char *argv[]); LIB_UTILITIES_EXPORT void InitSession(); @@ -500,7 +500,7 @@ namespace Nektar /// Loads the given XML document and instantiates an appropriate /// communication object. LIB_UTILITIES_EXPORT void CreateComm( - int &argc, + int &argc, char* argv[]); /// Partitions the mesh when running in parallel. @@ -525,6 +525,8 @@ namespace Nektar LIB_UTILITIES_EXPORT void ReadFilters(TiXmlElement *filters); /// Enforce parameters from command line arguments. LIB_UTILITIES_EXPORT void CmdLineOverride(); + /// Check values of solver info options are valid. + LIB_UTILITIES_EXPORT void VerifySolverInfo(); /// Parse a string in the form lhs = rhs. LIB_UTILITIES_EXPORT void ParseEquals( @@ -617,7 +619,7 @@ namespace Nektar * @param pString A valid value for the property. * @param pEnumValue An enumeration value corresponding to this * value. - * + * * @return The value for the property provided by #pString. */ inline std::string SessionReader::RegisterEnumValue( @@ -641,7 +643,7 @@ namespace Nektar * using this function. The property will take this value until it is * overwritten by a value specified in the XML document, or specified * as a command-line argument. Usage has the form: - * + * * @code * std::string GlobalLinSys::def * = LibUtilities::SessionReader::RegisterDefaultSolverInfo( @@ -650,11 +652,11 @@ namespace Nektar * * @param pName The name of the property. * @param pValue The default value of the property. - * + * * @return The default value of the property provided by #pValue. */ inline std::string SessionReader::RegisterDefaultSolverInfo( - const std::string &pName, + const std::string &pName, const std::string &pValue) { std::string vName = boost::to_upper_copy(pName); @@ -667,8 +669,8 @@ namespace Nektar * */ inline std::string SessionReader::RegisterCmdLineArgument( - const std::string &pName, - const std::string &pShortName, + const std::string &pName, + const std::string &pShortName, const std::string &pDescription) { ASSERTL0(!pName.empty(), "Empty name for cmdline argument."); diff --git a/library/MultiRegions/AssemblyMap/AssemblyMapCG.h b/library/MultiRegions/AssemblyMap/AssemblyMapCG.h index 363d7b3017b3233681627665ab874b38acbe1f0e..bd8f166fe9e05811723c7c1598b8d3d32cbfb97c 100644 --- a/library/MultiRegions/AssemblyMap/AssemblyMapCG.h +++ b/library/MultiRegions/AssemblyMap/AssemblyMapCG.h @@ -55,23 +55,25 @@ namespace Nektar typedef vector<map<int, int> > DofGraph; + MULTI_REGIONS_EXPORT pair<int, StdRegions::Orientation> DeterminePeriodicEdgeOrientId( int meshEdgeId, StdRegions::Orientation edgeOrient, const vector<PeriodicEntity> &periodicEdges); + MULTI_REGIONS_EXPORT StdRegions::Orientation DeterminePeriodicFaceOrient( StdRegions::Orientation faceOrient1, StdRegions::Orientation faceOrient2); - + /// Constructs mappings for the C0 scalar continuous Galerkin formulation. class AssemblyMapCG: public AssemblyMap { typedef Array<OneD, const ExpListSharedPtr> BndCondExp; typedef Array<OneD, const SpatialDomains::BoundaryConditionShPtr> BndCond; - + public: /// Default constructor. MULTI_REGIONS_EXPORT AssemblyMapCG( diff --git a/library/SolverUtils/DriverArnoldi.cpp b/library/SolverUtils/DriverArnoldi.cpp index 8856fb8697a481978dac861a25227654e300123a..046596797ba5cabe6aa1bd12201de8c4d27ed0fb 100644 --- a/library/SolverUtils/DriverArnoldi.cpp +++ b/library/SolverUtils/DriverArnoldi.cpp @@ -38,253 +38,285 @@ namespace Nektar { - namespace SolverUtils +namespace SolverUtils +{ + +/** + * Constructor + */ +DriverArnoldi::DriverArnoldi(const LibUtilities::SessionReaderSharedPtr pSession) + : Driver(pSession) +{ + m_session->LoadParameter("IO_InfoSteps", m_infosteps, 1); +}; + + +/** + * Destructor + */ +DriverArnoldi::~DriverArnoldi() +{ +}; + + +/** + * Arnoldi driver initialisation + */ +void DriverArnoldi::v_InitObject(ostream &out) +{ + Driver::v_InitObject(out); + m_session->MatchSolverInfo("SolverType", + "VelocityCorrectionScheme", + m_timeSteppingAlgorithm, false); + + if (m_timeSteppingAlgorithm) { - /** - * - */ - DriverArnoldi::DriverArnoldi(const LibUtilities::SessionReaderSharedPtr pSession) - : Driver(pSession) - { - m_session->LoadParameter("IO_InfoSteps", m_infosteps, 1); - }; + m_period = m_session->GetParameter("TimeStep") + * m_session->GetParameter("NumSteps"); + m_nfields = m_equ[0]->UpdateFields().num_elements() - 1; + } + else + { + m_period = 1.0; + m_nfields = m_equ[0]->UpdateFields().num_elements(); + } - /** - * - */ - DriverArnoldi::~DriverArnoldi() + if(m_session->DefinesSolverInfo("ModeType") && + (boost::iequals(m_session->GetSolverInfo("ModeType"), + "SingleMode")|| + boost::iequals(m_session->GetSolverInfo("ModeType"), + "HalfMode"))) + { + for(int i = 0; i < m_nfields; ++i) { - }; + m_equ[0]->UpdateFields()[i]->SetWaveSpace(true); + } + } + m_negatedOp = m_equ[0]->v_NegatedOp(); + + m_session->LoadParameter("kdim", m_kdim, 16); + m_session->LoadParameter("nvec", m_nvec, 2); + m_session->LoadParameter("nits", m_nits, 500); + m_session->LoadParameter("evtol", m_evtol, 1e-06); + m_session->LoadParameter("realShift", m_realShift, 0.0); + m_equ[0]->SetLambda(m_realShift); - /** - * - */ - void DriverArnoldi::v_InitObject(ostream &out) + m_session->LoadParameter("imagShift", m_imagShift, 0.0); + +} + +void DriverArnoldi::ArnoldiSummary(std::ostream &out) +{ + if (m_comm->GetRank() == 0) + { + if(m_session->DefinesSolverInfo("ModeType") && + boost::iequals(m_session->GetSolverInfo("ModeType"), + "SingleMode")) { - Driver::v_InitObject(out); - m_session->MatchSolverInfo("SolverType","VelocityCorrectionScheme",m_timeSteppingAlgorithm, false); - - if(m_timeSteppingAlgorithm) - { - m_period = m_session->GetParameter("TimeStep")* m_session->GetParameter("NumSteps"); - m_nfields = m_equ[0]->UpdateFields().num_elements() - 1; - - if(m_session->DefinesSolverInfo("ModeType") && - (m_session->GetSolverInfo("ModeType")=="SingleMode"|| m_session->GetSolverInfo("ModeType")=="HalfMode") ) - { - for(int i = 0; i < m_nfields; ++i) - { - m_equ[0]->UpdateFields()[i]->SetWaveSpace(true); - } - } - - } - else - { - m_period = 1.0; - ASSERTL0(m_session->DefinesFunction("BodyForce"),"A BodyForce section needs to be defined for this solver type"); - m_nfields = m_equ[0]->UpdateFields().num_elements(); - } - - m_session->LoadParameter("kdim", m_kdim, 16); - m_session->LoadParameter("nvec", m_nvec, 2); - m_session->LoadParameter("nits", m_nits, 500); - m_session->LoadParameter("evtol", m_evtol, 1e-06); - - m_session->LoadParameter("realShift", m_realShift, 0.0); - m_equ[0]->SetLambda(m_realShift); - - m_session->LoadParameter("imagShift", m_imagShift, 0.0); + out << "\tSingle Fourier mode : true " << endl; + ASSERTL0(m_session->DefinesSolverInfo("Homogeneous"), + "Expected a homogeneous expansion to be defined " + "with single mode"); + } + else + { + out << "\tSingle Fourier mode : false " << endl; + } + if(m_session->DefinesSolverInfo("BetaZero")) + { + out << "\tBeta set to Zero : true (overrides LHom)" + << endl; + } + else + { + out << "\tBeta set to Zero : false " << endl; } - void DriverArnoldi::ArnoldiSummary(std::ostream &out) + if(m_timeSteppingAlgorithm) { - if (m_comm->GetRank() == 0) - { - if(m_session->DefinesSolverInfo("SingleMode")) - { - out << "\tSingle Fourier mode : true " << endl; - ASSERTL0(m_session->DefinesSolverInfo("Homogeneous"), - "Expected a homogeneous expansion to be defined " - "with single mode"); - } - else - { - out << "\tSingle Fourier mode : false " << endl; - } - if(m_session->DefinesSolverInfo("BetaZero")) - { - out << "\tBeta set to Zero : true (overrides LHom)" - << endl; - } - else - { - out << "\tBeta set to Zero : false " << endl; - } - - if(m_timeSteppingAlgorithm) - { - out << "\tEvolution operator : " - << m_session->GetSolverInfo("EvolutionOperator") - << endl; - } - else - { - out << "\tShift (Real,Imag) : " << m_realShift - << "," << m_imagShift << endl; - } - out << "\tKrylov-space dimension : " << m_kdim << endl; - out << "\tNumber of vectors : " << m_nvec << endl; - out << "\tMax iterations : " << m_nits << endl; - out << "\tEigenvalue tolerance : " << m_evtol << endl; - out << "======================================================" - << endl; - } + out << "\tEvolution operator : " + << m_session->GetSolverInfo("EvolutionOperator") + << endl; } + else + { + out << "\tShift (Real,Imag) : " << m_realShift + << "," << m_imagShift << endl; + } + out << "\tKrylov-space dimension : " << m_kdim << endl; + out << "\tNumber of vectors : " << m_nvec << endl; + out << "\tMax iterations : " << m_nits << endl; + out << "\tEigenvalue tolerance : " << m_evtol << endl; + out << "======================================================" + << endl; + } +} + +/** + * Copy Arnoldi array to field variables which depend from + * either the m_fields or m_forces + */ +void DriverArnoldi::CopyArnoldiArrayToField(Array<OneD, NekDouble> &array) +{ + + Array<OneD, MultiRegions::ExpListSharedPtr>& fields = m_equ[0]->UpdateFields(); + int nq = fields[0]->GetNcoeffs(); + + for (int k = 0; k < m_nfields; ++k) + { + Vmath::Vcopy(nq, &array[k*nq], 1, &fields[k]->UpdateCoeffs()[0], 1); + fields[k]->SetPhysState(false); + } +}; + +/** + * Copy field variables which depend from either the m_fields + * or m_forces array the Arnoldi array + */ +void DriverArnoldi::CopyFieldToArnoldiArray(Array<OneD, NekDouble> &array) +{ + + Array<OneD, MultiRegions::ExpListSharedPtr> fields; + + if (m_EvolutionOperator == eAdaptiveSFD) + { + // This matters for the Adaptive SFD method because + // m_equ[1] is the nonlinear problem with non + // homogeneous BCs. + fields = m_equ[0]->UpdateFields(); + } + else + { + fields = m_equ[m_nequ-1]->UpdateFields(); + } + + for (int k = 0; k < m_nfields; ++k) + { + int nq = fields[0]->GetNcoeffs(); + Vmath::Vcopy(nq, &fields[k]->GetCoeffs()[0], 1, &array[k*nq], 1); + fields[k]->SetPhysState(false); + + } +}; + - /** - * Copy Arnoldi array to field variables which depend from - * either the m_fields or m_forces - */ - void DriverArnoldi::CopyArnoldiArrayToField(Array<OneD, NekDouble> &array) +/** + * Initialisation for the transient growth + */ +void DriverArnoldi::CopyFwdToAdj() +{ + Array<OneD, MultiRegions::ExpListSharedPtr> fields; + + if(m_timeSteppingAlgorithm) + { + fields = m_equ[0]->UpdateFields(); + int nq = fields[0]->GetNcoeffs(); + + for (int k=0 ; k < m_nfields; ++k) { - - Array<OneD, MultiRegions::ExpListSharedPtr>& fields = m_equ[0]->UpdateFields(); - int nq = fields[0]->GetNcoeffs(); - - for (int k = 0; k < m_nfields; ++k) - { - Vmath::Vcopy(nq, &array[k*nq], 1, &fields[k]->UpdateCoeffs()[0], 1); - fields[k]->SetPhysState(false); - } - }; - - /** - * Copy field variables which depend from either the m_fields - * or m_forces array the Arnoldi array - */ - void DriverArnoldi::CopyFieldToArnoldiArray(Array<OneD, NekDouble> &array) + Vmath::Vcopy(nq, + &fields[k]->GetCoeffs()[0], 1, + &m_equ[1]->UpdateFields()[k]->UpdateCoeffs()[0], 1); + + } + } + else + { + ASSERTL0(false,"Transient Growth non available for Coupled Solver"); + + } +}; + +void DriverArnoldi::WriteFld(std::string file, std::vector<Array<OneD, NekDouble> > coeffs) +{ + + std::vector<std::string> variables(m_nfields); + + ASSERTL1(coeffs.size() >= m_nfields, "coeffs is not of the correct length"); + for(int i = 0; i < m_nfields; ++i) + { + variables[i] = m_equ[0]->GetVariable(i); + } + + m_equ[0]->WriteFld(file,m_equ[0]->UpdateFields()[0], coeffs, variables); +} + + +void DriverArnoldi::WriteFld(std::string file, Array<OneD, NekDouble> coeffs) +{ + + std::vector<std::string> variables(m_nfields); + std::vector<Array<OneD, NekDouble> > fieldcoeffs(m_nfields); + + int ncoeffs = m_equ[0]->UpdateFields()[0]->GetNcoeffs(); + ASSERTL1(coeffs.num_elements() >= ncoeffs*m_nfields,"coeffs is not of sufficient size"); + + for(int i = 0; i < m_nfields; ++i) + { + variables[i] = m_equ[0]->GetVariable(i); + fieldcoeffs[i] = coeffs + i*ncoeffs; + } + + m_equ[0]->WriteFld(file,m_equ[0]->UpdateFields()[0], fieldcoeffs, variables); +} + +void DriverArnoldi::WriteEvs( + ostream &evlout, + const int i, + const NekDouble re_ev, + const NekDouble im_ev, + NekDouble resid, + bool DumpInverse) +{ + if (m_timeSteppingAlgorithm) + { + NekDouble abs_ev = hypot (re_ev, im_ev); + NekDouble ang_ev = atan2 (im_ev, re_ev); + + evlout << "EV: " << setw(2) << i + << setw(12) << abs_ev + << setw(12) << ang_ev + << setw(12) << log (abs_ev) / m_period + << setw(12) << ang_ev / m_period; + + if(resid != NekConstants::kNekUnsetDouble) { - - Array<OneD, MultiRegions::ExpListSharedPtr> fields; - - if (m_EvolutionOperator == eAdaptiveSFD) - { - //This matters for the Adaptive SFD method - //because m_equ[1] is the nonlinear problem with non homogeneous BCs. - fields = m_equ[0]->UpdateFields(); - } - else - { - fields = m_equ[m_nequ-1]->UpdateFields(); - } - - for (int k = 0; k < m_nfields; ++k) - { - int nq = fields[0]->GetNcoeffs(); - Vmath::Vcopy(nq, &fields[k]->GetCoeffs()[0], 1, &array[k*nq], 1); - fields[k]->SetPhysState(false); - - } - }; - - - /** - * Initialisation for the transient growth - */ - void DriverArnoldi::CopyFwdToAdj() + evlout << setw(12) << resid; + } + evlout << endl; + } + else + { + NekDouble invmag = 1.0/(re_ev*re_ev + im_ev*im_ev); + NekDouble sign; + if(m_negatedOp) { - Array<OneD, MultiRegions::ExpListSharedPtr> fields; - - if(m_timeSteppingAlgorithm) - { - fields = m_equ[0]->UpdateFields(); - int nq = fields[0]->GetNcoeffs(); - - - for (int k=0 ; k < m_nfields; ++k) - { - Vmath::Vcopy(nq, &fields[k]->GetCoeffs()[0], 1,&m_equ[1]->UpdateFields()[k]->UpdateCoeffs()[0], 1); - - } - } - else - { - ASSERTL0(false,"Transient Growth non available for Coupled Solver"); - - } - }; - - void DriverArnoldi::WriteFld(std::string file, std::vector<Array<OneD, NekDouble> > coeffs) + sign = -1.0; + } + else { - - std::vector<std::string> variables(m_nfields); - - ASSERTL1(coeffs.size() >= m_nfields, "coeffs is not of the correct length"); - for(int i = 0; i < m_nfields; ++i) - { - variables[i] = m_equ[0]->GetVariable(i); - } - - m_equ[0]->WriteFld(file,m_equ[0]->UpdateFields()[0], coeffs, variables); + sign = 1.0; } + evlout << "EV: " << setw(2) << i + << setw(14) << sign*re_ev + << setw(14) << sign*im_ev; - void DriverArnoldi::WriteFld(std::string file, Array<OneD, NekDouble> coeffs) + if(DumpInverse) { - - std::vector<std::string> variables(m_nfields); - std::vector<Array<OneD, NekDouble> > fieldcoeffs(m_nfields); - - int ncoeffs = m_equ[0]->UpdateFields()[0]->GetNcoeffs(); - ASSERTL1(coeffs.num_elements() >= ncoeffs*m_nfields,"coeffs is not of sufficient size"); - - for(int i = 0; i < m_nfields; ++i) - { - variables[i] = m_equ[0]->GetVariable(i); - fieldcoeffs[i] = coeffs + i*ncoeffs; - } - - m_equ[0]->WriteFld(file,m_equ[0]->UpdateFields()[0], fieldcoeffs, variables); + evlout << setw(14) << sign*re_ev*invmag + m_realShift + << setw(14) << sign*im_ev*invmag + m_imagShift; } - void DriverArnoldi::WriteEvs(ostream &evlout, const int i, const NekDouble re_ev, const NekDouble im_ev, NekDouble resid) + if(resid != NekConstants::kNekUnsetDouble) { - if(m_timeSteppingAlgorithm) - { - NekDouble abs_ev = hypot (re_ev, im_ev); - NekDouble ang_ev = atan2 (im_ev, re_ev); - - evlout << setw(2) << i - << setw(12) << abs_ev - << setw(12) << ang_ev - << setw(12) << log (abs_ev) / m_period - << setw(12) << ang_ev / m_period; - - if(resid != NekConstants::kNekUnsetDouble) - { - evlout << setw(12) << resid; - } - evlout << endl; - } - else - { - NekDouble invmag = 1.0/(re_ev*re_ev + im_ev*im_ev); - - evlout << setw(2) << i - << setw(14) << re_ev - << setw(14) << im_ev - << setw(14) << -re_ev*invmag + m_realShift - << setw(14) << im_ev*invmag; - - if(resid != NekConstants::kNekUnsetDouble) - { - evlout << setw(12) << resid; - } - evlout << endl; - } + evlout << setw(12) << resid; } + evlout << endl; } } + +} +} diff --git a/library/SolverUtils/DriverArnoldi.h b/library/SolverUtils/DriverArnoldi.h index 6c7218fd7b91ad00ef9944995ee8881c6d689ab1..16d6b6ce957d10f75f40e3f14a3e497ad7f7a65d 100644 --- a/library/SolverUtils/DriverArnoldi.h +++ b/library/SolverUtils/DriverArnoldi.h @@ -40,73 +40,78 @@ namespace Nektar { - namespace SolverUtils +namespace SolverUtils +{ + +/// Base class for the development of solvers. +class DriverArnoldi: public Driver +{ +public: + friend class MemoryManager<DriverArnoldi>; + + SOLVER_UTILS_EXPORT void ArnoldiSummary(std::ostream &out); + +protected: + int m_kdim; /// Dimension of Krylov subspace + int m_nvec; /// Number of vectors to test + int m_nits; /// Maxmum number of iterations + NekDouble m_evtol; /// Tolerance of iteratiosn + NekDouble m_period;/// Period of time stepping algorithm + bool m_timeSteppingAlgorithm; /// underlying operator is time stepping + + int m_infosteps; /// interval to dump information if required. + + int m_nfields; + NekDouble m_realShift; + NekDouble m_imagShift; + int m_negatedOp; /// Operator in solve call is negated + + Array<OneD, NekDouble> m_real_evl; + Array<OneD, NekDouble> m_imag_evl; + + + /// Constructor + DriverArnoldi(const LibUtilities::SessionReaderSharedPtr pSession); + + /// Destructor + virtual ~DriverArnoldi(); + + /// Copy Arnoldi storage to fields. + void CopyArnoldiArrayToField(Array<OneD, NekDouble> &array); + + /// Copy fields to Arnoldi storage. + void CopyFieldToArnoldiArray(Array<OneD, NekDouble> &array); + + /// Copy the forward field to the adjoint system in transient growth + /// calculations + void CopyFwdToAdj(); + + /// Write coefficients to file + void WriteFld(std::string file, + std::vector<Array<OneD, NekDouble> > coeffs); + + void WriteFld(std::string file, Array<OneD, NekDouble> coeffs); + + void WriteEvs(ostream &evlout, const int k, + const NekDouble real, const NekDouble imag, + NekDouble resid = NekConstants::kNekUnsetDouble, + bool DumpInverse = true); + + virtual void v_InitObject(ostream &out = cout); + + virtual Array<OneD, NekDouble> v_GetRealEvl(void) { - /// Base class for the development of solvers. - class DriverArnoldi: public Driver - { - public: - friend class MemoryManager<DriverArnoldi>; - - SOLVER_UTILS_EXPORT void ArnoldiSummary(std::ostream &out); - - protected: - int m_kdim; /// Dimension of Krylov subspace - int m_nvec; /// Number of vectors to test - int m_nits; /// Maxmum number of iterations - NekDouble m_evtol;/// Tolerance of iteratiosn - NekDouble m_period;/// Period of time stepping algorithm - bool m_timeSteppingAlgorithm; /// underlying operator is time stepping - - int m_infosteps; /// interval to dump information if required. - - int m_nfields; - NekDouble m_realShift; - NekDouble m_imagShift; - - Array<OneD, NekDouble> m_real_evl; - Array<OneD, NekDouble> m_imag_evl; - - - /// Constructor - DriverArnoldi(const LibUtilities::SessionReaderSharedPtr pSession); - - /// Destructor - virtual ~DriverArnoldi(); - - /// Copy Arnoldi storage to fields. - void CopyArnoldiArrayToField(Array<OneD, NekDouble> &array); - - /// Copy fields to Arnoldi storage. - void CopyFieldToArnoldiArray(Array<OneD, NekDouble> &array); - - ///Copy the forward field to the adjoint system in transient growth calculations - void CopyFwdToAdj(); - - // write coefficients to file. - void WriteFld(std::string file, std::vector<Array<OneD, NekDouble> > coeffs); - - void WriteFld(std::string file, Array<OneD, NekDouble> coeffs); - - void WriteEvs(ostream &evlout, const int k, - const NekDouble real, const NekDouble imag, - NekDouble resid = NekConstants::kNekUnsetDouble); - - virtual void v_InitObject(ostream &out = cout); - - virtual Array<OneD, NekDouble> v_GetRealEvl(void) - { - return m_real_evl; - } - - virtual Array<OneD, NekDouble> v_GetImagEvl(void) - { - return m_imag_evl; - } - - }; + return m_real_evl; } -} //end of namespace -#endif //NEKTAR_SOLVERUTILS_DRIVERARNOLDI_H + virtual Array<OneD, NekDouble> v_GetImagEvl(void) + { + return m_imag_evl; + } + +}; + +} +} //end of namespace +#endif //NEKTAR_SOLVERUTILS_DRIVERARNOLDI_H \ No newline at end of file diff --git a/library/SolverUtils/DriverArpack.cpp b/library/SolverUtils/DriverArpack.cpp index e2fe1c112244811e3d11356d8af2bd02cab81766..f563f23f32bbc45460ffacfb15350f5758531082 100644 --- a/library/SolverUtils/DriverArpack.cpp +++ b/library/SolverUtils/DriverArpack.cpp @@ -1,311 +1,394 @@ -/////////////////////////////////////////////////////////////////////////////// -// -// File DriverArpack.cpp -// -// For more information, please see: http://www.nektar.info -// -// The MIT License -// -// Copyright (c) 2006 Division of Applied Mathematics, Brown University (USA), -// Department of Aeronautics, Imperial College London (UK), and Scientific -// Computing and Imaging Institute, University of Utah (USA). -// -// License for the specific language governing rights and limitations under -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the "Software"), -// to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, -// and/or sell copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -// DEALINGS IN THE SOFTWARE. -// -// Description: Arnoldi solver using Arpack -// -/////////////////////////////////////////////////////////////////////////////// - -#include <SolverUtils/DriverArpack.h> - -namespace Nektar -{ - namespace SolverUtils - { - std::string DriverArpack::arpackProblemTypeLookupIds[6] = { - LibUtilities::SessionReader::RegisterEnumValue("ArpackProblemType","LargestReal" ,0), - LibUtilities::SessionReader::RegisterEnumValue("ArpackProblemType","SmallestReal" ,1), - LibUtilities::SessionReader::RegisterEnumValue("ArpackProblemType","LargestImag" ,2), - LibUtilities::SessionReader::RegisterEnumValue("ArpackProblemType","SmallestImag" ,3), - LibUtilities::SessionReader::RegisterEnumValue("ArpackProblemType","LargestMag" ,4), - LibUtilities::SessionReader::RegisterEnumValue("ArpackProblemType","SmallestMag" ,5), - }; - std::string DriverArpack::arpackProblemTypeDefault = LibUtilities::SessionReader::RegisterDefaultSolverInfo("ArpackProblemType","LargestMag"); - std::string DriverArpack::driverLookupId = LibUtilities::SessionReader::RegisterEnumValue("Driver","Arpack",0); - - std::string DriverArpack::className = GetDriverFactory().RegisterCreatorFunction("Arpack", DriverArpack::create); - - std::string DriverArpack::ArpackProblemTypeTrans[6] = - { "LR", "SR", "LI", "SI", "LM", "SM" }; - - - /** - * - */ - DriverArpack::DriverArpack(const LibUtilities::SessionReaderSharedPtr pSession) - : DriverArnoldi(pSession) - { - } - - - /** - * - */ - DriverArpack::~DriverArpack() - { - } - - /** - * - */ - void DriverArpack::v_InitObject(ostream &out) - { - DriverArnoldi::v_InitObject(out); - - //Initialisation of Arnoldi parameters - m_maxn = 1000000; // Maximum size of the problem - m_maxnev = 200; // maximum number of eigenvalues requested - m_maxncv = 500; // Largest number of basis vector used in Implicitly Restarted Arnoldi - - // Error alerts - ASSERTL0(m_nvec <= m_maxnev,"NEV is greater than MAXNEV"); - ASSERTL0(m_kdim <= m_maxncv,"NEV is greater than MAXNEV"); - ASSERTL0(2 <= m_kdim-m_nvec,"NCV-NEV is less than 2"); - - m_equ[0]->PrintSummary(out); - - // Print session parameters - out << "\tArnoldi solver type : Arpack" << endl; - - out << "\tArpack problem type : "; - out << ArpackProblemTypeTrans[m_session->GetSolverInfoAsEnum<int>("ArpackProblemType")] << endl; - DriverArnoldi::ArnoldiSummary(out); - - m_equ[m_nequ - 1]->DoInitialise(); - - //FwdTrans Initial conditions to be in Coefficient Space - m_equ[m_nequ-1] ->TransPhysToCoeff(); - - } - - - void DriverArpack::v_Execute(ostream &out) - - { - Array<OneD, NekDouble> tmpworkd; - - int nq = m_equ[0]->UpdateFields()[0]->GetNcoeffs(); // Number of points in the mesh - int n = m_nfields*nq; // Number of points in eigenvalue calculation - int lworkl = 3*m_kdim*(m_kdim+2); // Size of work array - int ido ; //REVERSE COMMUNICATION parameter. At the first call must be initialised at 0 - int info; // do not set initial vector (info=0 random initial vector, info=1 read initial vector from session file) - - int iparam[11]; - int ipntr[14]; - - Array<OneD, int> ritzSelect; - Array<OneD, NekDouble> dr; - Array<OneD, NekDouble> di; - Array<OneD, NekDouble> workev; - Array<OneD, NekDouble> z; - NekDouble sigmar, sigmai; - - Array<OneD, NekDouble> resid(n); - Array<OneD, NekDouble> v(n*m_kdim); - Array<OneD, NekDouble> workl(lworkl); - Array<OneD, NekDouble> workd(3*n, 0.0); - - ASSERTL0(n <= m_maxn, "N is greater than MAXN"); - - if(m_session->DefinesFunction("InitialConditions")) - { - - out << "\tInital vector : input file " << endl; - info = 1; - CopyFieldToArnoldiArray(resid); - - } - else - { - out << "\tInital vector : random " << endl; - info = 0; - } - - - iparam[0] = 1; // strategy for shift-invert - iparam[1] = 0; // (deprecated) - iparam[2] = m_nits; // maximum number of iterations allowed/taken - iparam[3] = 1; // blocksize to be used for recurrence - iparam[4] = 0; // number of converged ritz eigenvalues - iparam[5] = 0; // (deprecated) - if((fabs(m_realShift) > NekConstants::kNekZeroTol)|| // use shift if m_realShift > 1e-12 - (fabs(m_imagShift) > NekConstants::kNekZeroTol)) - { - iparam[6] = 3; - } - else - { - iparam[6] = 1; // computation mode 1=> matrix-vector prod - } - iparam[7] = 0; // (for shift-invert) - iparam[8] = 0; // number of MV operations - iparam[9] = 0; // number of BV operations - iparam[10]= 0; // number of reorthogonalisation steps - - int cycle = 0; - const char* problem = ArpackProblemTypeTrans[m_session->GetSolverInfoAsEnum<int>("ArpackProblemType")].c_str(); - - std::string name = m_session->GetSessionName() + ".evl"; - ofstream pFile(name.c_str()); - - ido = 0; //At the first call must be initialisedat 0 - - while(ido != 99)//ido==-1 || ido==1 || ido==0) - { - //Routine for eigenvalue evaluation for non-symmetric operators - Arpack::Dnaupd( ido, "I", // B='I' for std eval problem - n, problem, m_nvec, - m_evtol, &resid[0], m_kdim, - &v[0], n, iparam, ipntr, &workd[0], - &workl[0], lworkl, info); - - //Plotting of real and imaginary part of the eigenvalues from workl - out << "\rIteration " << cycle << ", output: " << info << ", ido=" << ido << " " << std::flush; - - if(!((cycle-1)%m_kdim)&&(cycle> m_kdim)) - { - pFile << "Krylov spectrum at iteration: " << cycle << endl; - - if(m_timeSteppingAlgorithm) - { - pFile << "EV Magnitude Angle Growth Frequency Residual" << endl; - } - else - { - pFile << "EV Real Imaginary inverse real inverse imag Residual" << endl; - } - - out << endl; - for(int k=0; k<=m_kdim-1; ++k) - { - // write m_nvec eigs to screen - if(m_kdim-1-k < m_nvec) - { - WriteEvs(out,k, workl[ipntr[5]-1+k],workl[ipntr[6]-1+k]); - } - // write m_kdim eigs to screen - WriteEvs(pFile,k, workl[ipntr[5]-1+k],workl[ipntr[6]-1+k]); - } - } - - cycle++; - - if (ido == 99) break; - - ASSERTL0(ido == 1, "Unexpected reverse communication request."); - - //workd[inptr[0]-1] copied into operator fields - CopyArnoldiArrayToField(tmpworkd = workd + (ipntr[0]-1)); - - m_equ[0]->TransCoeffToPhys(); - - m_equ[0]->DoSolve(); - - if(!(cycle%m_infosteps)) - { - out << endl; - m_equ[0]->Output(); - } - - if(m_EvolutionOperator == eTransientGrowth) - { - //start Adjoint with latest fields of direct - CopyFwdToAdj(); - - m_equ[1]->TransCoeffToPhys(); - m_equ[1]->DoSolve(); - } - - // operated fields are copied into workd[inptr[1]-1] - CopyFieldToArnoldiArray(tmpworkd = workd + (ipntr[1]-1)); - - } - - out<< endl << "Converged in " << iparam[8] << " iterations" << endl; - - ASSERTL0(info >= 0," Error with Dnaupd"); - - ritzSelect = Array<OneD, int> (m_kdim,0); - dr = Array<OneD, NekDouble> (m_nvec+1,0.0); - di = Array<OneD, NekDouble> (m_nvec+1,0.0); - workev = Array<OneD, NekDouble> (3*m_kdim); - z = Array<OneD, NekDouble> (n*(m_nvec+1)); - - sigmar = m_realShift; - sigmai = m_imagShift; - - //Setting 'A', Ritz vectors are computed. 'S' for Shur vectors - Arpack::Dneupd(1, "A", ritzSelect.get(), dr.get(), di.get(), z.get(), n, sigmar, sigmai, workev.get(), "I", n, problem, m_nvec, m_evtol, resid.get(), m_kdim, v.get(), n, iparam, ipntr, workd.get(), workl.get(),lworkl,info); - - ASSERTL0(info == 0, " Error with Dneupd"); - int nconv=iparam[4]; - Array<OneD, MultiRegions::ExpListSharedPtr> fields = m_equ[0]->UpdateFields(); - - out << "Converged Eigenvalues: " << nconv << endl; - pFile << "Converged Eigenvalues:"<< nconv << endl; - - if(m_timeSteppingAlgorithm) - { - pFile << "EV Magnitude Angle Growth Frequency" << endl; - } - else - { - pFile << "EV Real Imaginary inverse real inverse imag" << endl; - } - - - for(int i= 0; i< nconv; ++i) - { - WriteEvs(out,i,dr[i],di[i]); - WriteEvs(pFile,i,dr[i],di[i]); - - std::string file = m_session->GetSessionName() + "_eig_" - + boost::lexical_cast<std::string>(i); - WriteFld(file,z + i*nq); - } - - m_real_evl = dr; - m_imag_evl = di; - - pFile.close(); - - for(int j = 0; j < m_equ[0]->GetNvariables(); ++j) - { - NekDouble vL2Error = m_equ[0]->L2Error(j,false); - NekDouble vLinfError = m_equ[0]->LinfError(j); - if (m_comm->GetRank() == 0) - { - out << "L 2 error (variable " << m_equ[0]->GetVariable(j) << ") : " << vL2Error << endl; - out << "L inf error (variable " << m_equ[0]->GetVariable(j) << ") : " << vLinfError << endl; - } - } - } - } -} +/////////////////////////////////////////////////////////////////////////////// +// +// File DriverArpack.cpp +// +// For more information, please see: http://www.nektar.info +// +// The MIT License +// +// Copyright (c) 2006 Division of Applied Mathematics, Brown University (USA), +// Department of Aeronautics, Imperial College London (UK), and Scientific +// Computing and Imaging Institute, University of Utah (USA). +// +// License for the specific language governing rights and limitations under +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. +// +// Description: Arnoldi solver using Arpack +// +/////////////////////////////////////////////////////////////////////////////// + +#include <SolverUtils/DriverArpack.h> + +namespace Nektar +{ +namespace SolverUtils +{ + +std::string DriverArpack::arpackProblemTypeLookupIds[6] = { + LibUtilities::SessionReader::RegisterEnumValue("ArpackProblemType","LargestReal" ,0), + LibUtilities::SessionReader::RegisterEnumValue("ArpackProblemType","SmallestReal" ,1), + LibUtilities::SessionReader::RegisterEnumValue("ArpackProblemType","LargestImag" ,2), + LibUtilities::SessionReader::RegisterEnumValue("ArpackProblemType","SmallestImag" ,3), + LibUtilities::SessionReader::RegisterEnumValue("ArpackProblemType","LargestMag" ,4), + LibUtilities::SessionReader::RegisterEnumValue("ArpackProblemType","SmallestMag" ,5), +}; +std::string DriverArpack::arpackProblemTypeDefault = LibUtilities::SessionReader::RegisterDefaultSolverInfo("ArpackProblemType","LargestMag"); +std::string DriverArpack::driverLookupId = LibUtilities::SessionReader::RegisterEnumValue("Driver","Arpack",0); + +std::string DriverArpack::className = GetDriverFactory().RegisterCreatorFunction("Arpack", DriverArpack::create); + +std::string DriverArpack::ArpackProblemTypeTrans[6] = +{ "LR", "SR", "LI", "SI", "LM", "SM" }; + + +/** + * + */ +DriverArpack::DriverArpack(const LibUtilities::SessionReaderSharedPtr pSession) + : DriverArnoldi(pSession) +{ +} + + +/** + * + */ +DriverArpack::~DriverArpack() +{ +} + +/** + * + */ +void DriverArpack::v_InitObject(ostream &out) +{ + DriverArnoldi::v_InitObject(out); + + //Initialisation of Arnoldi parameters + m_maxn = 1000000; // Maximum size of the problem + m_maxnev = 200; // maximum number of eigenvalues requested + m_maxncv = 500; // Largest number of basis vector used in Implicitly Restarted Arnoldi + + // Error alerts + ASSERTL0(m_nvec <= m_maxnev,"NEV is greater than MAXNEV"); + ASSERTL0(m_kdim <= m_maxncv,"NEV is greater than MAXNEV"); + ASSERTL0(2 <= m_kdim-m_nvec,"NCV-NEV is less than 2"); + + m_equ[0]->PrintSummary(out); + + // Print session parameters + out << "\tArnoldi solver type : Arpack" << endl; + + out << "\tArpack problem type : "; + out << ArpackProblemTypeTrans[m_session->GetSolverInfoAsEnum<int>("ArpackProblemType")] << endl; + DriverArnoldi::ArnoldiSummary(out); + + m_equ[m_nequ - 1]->DoInitialise(); + + // FwdTrans Initial conditions to be in Coefficient Space + m_equ[m_nequ-1] ->TransPhysToCoeff(); + +} + + +void DriverArpack::v_Execute(ostream &out) + +{ + Array<OneD, NekDouble> tmpworkd; + + int nq = m_equ[0]->UpdateFields()[0]->GetNcoeffs(); // Number of points in the mesh + int n = m_nfields*nq; // Number of points in eigenvalue calculation + int lworkl = 3*m_kdim*(m_kdim+2); // Size of work array + int ido ; //REVERSE COMMUNICATION parameter. At the first call must be initialised at 0 + int info; // do not set initial vector (info=0 random initial vector, info=1 read initial vector from session file) + + int iparam[11]; + int ipntr[14]; + + Array<OneD, int> ritzSelect; + Array<OneD, NekDouble> dr; + Array<OneD, NekDouble> di; + Array<OneD, NekDouble> workev; + Array<OneD, NekDouble> z; + NekDouble sigmar, sigmai; + + Array<OneD, NekDouble> resid(n); + Array<OneD, NekDouble> v(n*m_kdim); + Array<OneD, NekDouble> workl(lworkl, 0.0); + Array<OneD, NekDouble> workd(3*n, 0.0); + + ASSERTL0(n <= m_maxn, "N is greater than MAXN"); + + if(m_session->DefinesFunction("InitialConditions")) + { + out << "\tInital vector : input file " << endl; + info = 1; + CopyFieldToArnoldiArray(resid); + } + else + { + out << "\tInital vector : random " << endl; + info = 0; + } + + char B; + + iparam[0] = 1; // strategy for shift-invert + iparam[1] = 0; // (deprecated) + iparam[2] = m_nits; // maximum number of iterations allowed/taken + iparam[3] = 1; // blocksize to be used for recurrence + iparam[4] = 0; // number of converged ritz eigenvalues + iparam[5] = 0; // (deprecated) + + // Use generalized B matrix for coupled solver. + if (m_timeSteppingAlgorithm) + { + iparam[6] = 1; // computation mode 1=> matrix-vector prod + B = 'I'; + } + else { + iparam[6] = 3; // computation mode 1=> matrix-vector prod + B = 'G'; + } +#if 0 + if((fabs(m_realShift) > NekConstants::kNekZeroTol)|| // use shift if m_realShift > 1e-12 + (fabs(m_imagShift) > NekConstants::kNekZeroTol)) + { + iparam[6] = 3; // This was 3 need to know what to set it to + B = 'G'; + } + else + { + iparam[6] = 1; // computation mode 1=> matrix-vector prod + B = 'I'; + } +#endif + iparam[7] = 0; // (for shift-invert) + iparam[8] = 0; // number of MV operations + iparam[9] = 0; // number of BV operations + iparam[10]= 0; // number of reorthogonalisation steps + + int cycle = 0; + const char* problem = ArpackProblemTypeTrans[m_session->GetSolverInfoAsEnum<int>("ArpackProblemType")].c_str(); + + std::string name = m_session->GetSessionName() + ".evl"; + ofstream pFile(name.c_str()); + + ido = 0; //At the first call must be initialisedat 0 + + while(ido != 99)//ido==-1 || ido==1 || ido==0) + { + //Routine for eigenvalue evaluation for non-symmetric operators + Arpack::Dnaupd( ido, &B, // B='I' for std eval problem + n, problem, m_nvec, + m_evtol, &resid[0], m_kdim, + &v[0], n, iparam, ipntr, &workd[0], + &workl[0], lworkl, info); + + //Plotting of real and imaginary part of the + //eigenvalues from workl + out << "\rIteration " << cycle << ", output: " << info << ", ido=" << ido << " " << std::flush; + + if(!((cycle-1)%m_kdim)&&(cycle> m_kdim)&&(ido!=2)) + { + pFile << "Krylov spectrum at iteration: " << cycle << endl; + + if(m_timeSteppingAlgorithm) + { + pFile << "EV Magnitude Angle Growth Frequency Residual" << endl; + } + else + { + pFile << "EV Real Imaginary inverse real inverse imag Residual" << endl; + } + + out << endl; + for(int k = 0; k < m_kdim; ++k) + { + // write m_kdim eigs to screen + WriteEvs(pFile,k, workl[ipntr[5]-1+k],workl[ipntr[6]-1+k]); + } + } + + if (ido == 99) break; + + switch(ido) + { + case -1: + case 1: // Note that ido=1 we are using input x + // (workd[inptr[0]-1]) rather than Mx as + // recommended in manual since it is not + // possible to impose forcing directly. + CopyArnoldiArrayToField(tmpworkd = workd + (ipntr[0]-1)); + + m_equ[0]->TransCoeffToPhys(); + + m_equ[0]->DoSolve(); + if(m_EvolutionOperator == eTransientGrowth) + { + //start Adjoint with latest fields of direct + CopyFwdToAdj(); + + m_equ[1]->TransCoeffToPhys(); + m_equ[1]->DoSolve(); + } + + if(!(cycle%m_infosteps)) + { + out << endl; + m_equ[0]->Output(); + } + + // operated fields are copied into workd[inptr[1]-1] + CopyFieldToArnoldiArray(tmpworkd = workd + (ipntr[1]-1)); + + cycle++; + break; + case 2: // provide y = M x (bwd trans and iproduct); + { + //workd[inptr[0]-1] copied into operator fields + CopyArnoldiArrayToField(tmpworkd = workd + (ipntr[0]-1)); + + m_equ[0]->TransCoeffToPhys(); + + Array<OneD, MultiRegions::ExpListSharedPtr> fields = m_equ[0]->UpdateFields(); + for (int i = 0; i < fields.num_elements(); ++i) + { + fields[i]->IProductWRTBase(fields[i]->GetPhys(), + fields[i]->UpdateCoeffs()); + } + + // operated fields are copied into workd[inptr[1]-1] + CopyFieldToArnoldiArray(tmpworkd = workd + (ipntr[1]-1)); + break; + } + default: + ASSERTL0(false, "Unexpected reverse communication request."); + } + + } + + out<< endl << "Converged in " << iparam[8] << " iterations" << endl; + + ASSERTL0(info >= 0," Error with Dnaupd"); + + ritzSelect = Array<OneD, int> (m_kdim,0); + dr = Array<OneD, NekDouble> (m_nvec+1,0.0); + di = Array<OneD, NekDouble> (m_nvec+1,0.0); + workev = Array<OneD, NekDouble> (3*m_kdim); + z = Array<OneD, NekDouble> (n*(m_nvec+1)); + + if(m_negatedOp) + { + sigmar = -m_realShift; + } + else + { + sigmar = m_realShift; + } + + // Do not pass imaginary shift to Arpack since we have not + // used a Fortran complex number format and so processing + // is mucked up. Need to do some processing afterwards. + sigmai = 0; + + //Setting 'A', Ritz vectors are computed. 'S' for Shur vectors + Arpack::Dneupd(1, "A", ritzSelect.get(), dr.get(), di.get(), + z.get(), n, sigmar, sigmai, workev.get(), &B, + n, problem, m_nvec, m_evtol, resid.get(), m_kdim, + v.get(), n, iparam, ipntr, workd.get(), + workl.get(),lworkl,info); + + ASSERTL0(info == 0, " Error with Dneupd"); + + int nconv=iparam[4]; + + // Subtract off complex shift if it exists + if(m_negatedOp) + { + Vmath::Sadd(nconv,m_imagShift,di,1,di,1); + } + else + { + Vmath::Sadd(nconv,-m_imagShift,di,1,di,1); + } + + WARNINGL0(m_imagShift == 0,"Complex Shift applied. " + "Need to implement Ritz re-evaluation of" + "eigenvalue. Only one half of complex " + "value will be correct"); + + + Array<OneD, MultiRegions::ExpListSharedPtr> fields = m_equ[0]->UpdateFields(); + + out << "Converged Eigenvalues: " << nconv << endl; + pFile << "Converged Eigenvalues: " << nconv << endl; + + if(m_timeSteppingAlgorithm) + { + out << " Magnitude Angle Growth Frequency" << endl; + pFile << " Magnitude Angle Growth Frequency" << endl; + for(int i= 0; i< nconv; ++i) + { + WriteEvs(out,i,dr[i],di[i]); + WriteEvs(pFile,i,dr[i],di[i]); + + std::string file = m_session->GetSessionName() + "_eig_" + + boost::lexical_cast<std::string>(i) + + ".fld"; + WriteFld(file,z + i*n); + } + } + else + { + out << " Real Imaginary " << endl; + pFile << " Real Imaginary " << endl; + for(int i= 0; i< nconv; ++i) + { + WriteEvs(out,i,dr[i],di[i], + NekConstants::kNekUnsetDouble, false); + WriteEvs(pFile,i,dr[i],di[i], + NekConstants::kNekUnsetDouble, false); + + std::string file = m_session->GetSessionName() + "_eig_" + + boost::lexical_cast<std::string>(i) + + ".fld"; + WriteFld(file,z + i*n); + } + } + + m_real_evl = dr; + m_imag_evl = di; + + pFile.close(); + + for(int j = 0; j < m_equ[0]->GetNvariables(); ++j) + { + NekDouble vL2Error = m_equ[0]->L2Error(j,false); + NekDouble vLinfError = m_equ[0]->LinfError(j); + if (m_comm->GetRank() == 0) + { + out << "L 2 error (variable " << m_equ[0]->GetVariable(j) << ") : " << vL2Error << endl; + out << "L inf error (variable " << m_equ[0]->GetVariable(j) << ") : " << vLinfError << endl; + } + } +} + +} +} diff --git a/library/SolverUtils/DriverArpack.h b/library/SolverUtils/DriverArpack.h index a5f71cfe86f1b5dfc054ca358e30a8c382ff88b3..0c45095c5407e38a9d4d5f60a46d1d7c9197aff5 100644 --- a/library/SolverUtils/DriverArpack.h +++ b/library/SolverUtils/DriverArpack.h @@ -42,53 +42,53 @@ namespace Nektar { - namespace SolverUtils - { - /// Base class for the development of solvers. - class DriverArpack: public DriverArnoldi - { - public: - friend class MemoryManager<DriverArpack>; - - /// Creates an instance of this class - static DriverSharedPtr create(const LibUtilities::SessionReaderSharedPtr& pSession) { - DriverSharedPtr p = MemoryManager<DriverArpack>::AllocateSharedPtr(pSession); - p->InitObject(); - return p; - } - - ///Name of the class - static std::string className; - - - - protected: - int m_maxn; //Maximum size of the problem - int m_maxnev; //maximum number of eigenvalues requested - int m_maxncv; //Largest number of basis vector used in Implicitly Restarted Arnoldi - - -// std::string m_arpackProblemType; //Arpack input for problem type - /// Constructor - DriverArpack( const LibUtilities::SessionReaderSharedPtr pSession); - - /// Destructor - virtual ~DriverArpack(); - - /// Virtual function for initialisation implementation. - virtual void v_InitObject(ostream &out = cout); - - /// Virtual function for solve implementation. - virtual void v_Execute(ostream &out = cout); - - static std::string arpackProblemTypeLookupIds[]; - static std::string arpackProblemTypeDefault; - static std::string driverLookupId; - - private: - static std::string ArpackProblemTypeTrans[]; - }; +namespace SolverUtils +{ + +/// Base class for the development of solvers. +class DriverArpack: public DriverArnoldi +{ +public: + friend class MemoryManager<DriverArpack>; + + /// Creates an instance of this class + static DriverSharedPtr create(const LibUtilities::SessionReaderSharedPtr& pSession) { + DriverSharedPtr p = MemoryManager<DriverArpack>::AllocateSharedPtr(pSession); + p->InitObject(); + return p; } + + ///Name of the class + static std::string className; + + + +protected: + int m_maxn;//Maximum size of the problem + int m_maxnev;//maximum number of eigenvalues requested + int m_maxncv;//Largest number of basis vector used in Implicitly Restarted Arnoldi + + /// Constructor + DriverArpack( const LibUtilities::SessionReaderSharedPtr pSession); + + /// Destructor + virtual ~DriverArpack(); + + /// Virtual function for initialisation implementation. + virtual void v_InitObject(ostream &out = cout); + + /// Virtual function for solve implementation. + virtual void v_Execute(ostream &out = cout); + + static std::string arpackProblemTypeLookupIds[]; + static std::string arpackProblemTypeDefault; + static std::string driverLookupId; + +private: + static std::string ArpackProblemTypeTrans[]; +}; + +} } //end of namespace #endif //NEKTAR_SOLVERUTILS_DRIVERARPACK_H diff --git a/library/SolverUtils/DriverModifiedArnoldi.cpp b/library/SolverUtils/DriverModifiedArnoldi.cpp index 35593a40ef785080fe823548e8d35742a57ba087..68c176d87a64fbe618d1e72870b7eebc16f8b468 100644 --- a/library/SolverUtils/DriverModifiedArnoldi.cpp +++ b/library/SolverUtils/DriverModifiedArnoldi.cpp @@ -40,537 +40,546 @@ namespace Nektar { - namespace SolverUtils +namespace SolverUtils +{ + +string DriverModifiedArnoldi::className = + GetDriverFactory().RegisterCreatorFunction("ModifiedArnoldi", + DriverModifiedArnoldi::create); +string DriverModifiedArnoldi::driverLookupId = + LibUtilities::SessionReader::RegisterEnumValue("Driver", + "ModifiedArnoldi",0); + +/** + * + */ +DriverModifiedArnoldi::DriverModifiedArnoldi( + const LibUtilities::SessionReaderSharedPtr pSession) + : DriverArnoldi(pSession) +{ +} + + +/** + * + */ +DriverModifiedArnoldi::~DriverModifiedArnoldi() +{ +} + + +/** + * + */ +void DriverModifiedArnoldi::v_InitObject(ostream &out) +{ + DriverArnoldi::v_InitObject(out); + + m_equ[0]->PrintSummary(out); + + // Print session parameters + if (m_comm->GetRank() == 0) + { + out << "\tArnoldi solver type : Modified Arnoldi" << endl; + } + + DriverArnoldi::ArnoldiSummary(out); + + m_equ[m_nequ - 1]->DoInitialise(); + + //FwdTrans Initial conditions to be in Coefficient Space + m_equ[m_nequ-1] ->TransPhysToCoeff(); + +} + + +/** + * + */ +void DriverModifiedArnoldi::v_Execute(ostream &out) +{ + int i = 0; + int j = 0; + int nq = m_equ[0]->UpdateFields()[0]->GetNcoeffs(); + int ntot = m_nfields*nq; + int converged = 0; + NekDouble resnorm = 0.0; + ofstream evlout; + std::string evlFile = m_session->GetSessionName() + ".evl"; + + if (m_comm->GetRank() == 0) + { + evlout.open(evlFile.c_str()); + } + + // Allocate memory + Array<OneD, NekDouble> alpha = Array<OneD, NekDouble> (m_kdim+1, 0.0); + Array<OneD, NekDouble> wr = Array<OneD, NekDouble> (m_kdim, 0.0); + Array<OneD, NekDouble> wi = Array<OneD, NekDouble> (m_kdim, 0.0); + Array<OneD, NekDouble> zvec = Array<OneD, NekDouble> (m_kdim*m_kdim, 0.0); + + Array<OneD, Array<OneD, NekDouble> > Kseq + = Array<OneD, Array<OneD, NekDouble> > (m_kdim + 1); + Array<OneD, Array<OneD, NekDouble> > Tseq + = Array<OneD, Array<OneD, NekDouble> > (m_kdim + 1); + for (i = 0; i < m_kdim + 1; ++i) + { + Kseq[i] = Array<OneD, NekDouble>(ntot, 0.0); + Tseq[i] = Array<OneD, NekDouble>(ntot, 0.0); + } + + // Copy starting vector into second sequence element (temporary). + if(m_session->DefinesFunction("InitialConditions")) + { + if (m_comm->GetRank() == 0) + { + out << "\tInital vector : specified in input file " << endl; + } + m_equ[0]->SetInitialConditions(0.0,false); + + CopyFieldToArnoldiArray(Kseq[1]); + } + else + { + if (m_comm->GetRank() == 0) + { + out << "\tInital vector : random " << endl; + } + + NekDouble eps=1; + Vmath::FillWhiteNoise(ntot, eps , &Kseq[1][0], 1); + } + + // Perform one iteration to enforce boundary conditions. + // Set this as the initial value in the sequence. + EV_update(Kseq[1], Kseq[0]); + if (m_comm->GetRank() == 0) + { + out << "Iteration: " << 0 << endl; + } + + // Normalise first vector in sequence + alpha[0] = Blas::Ddot(ntot, &Kseq[0][0], 1, &Kseq[0][0], 1); + m_comm->AllReduce(alpha[0], Nektar::LibUtilities::ReduceSum); + alpha[0] = std::sqrt(alpha[0]); + Vmath::Smul(ntot, 1.0/alpha[0], Kseq[0], 1, Kseq[0], 1); + + // Fill initial krylov sequence + NekDouble resid0; + for (i = 1; !converged && i <= m_kdim; ++i) + { + // Compute next vector + EV_update(Kseq[i-1], Kseq[i]); + + // Normalise + alpha[i] = Blas::Ddot(ntot, &Kseq[i][0], 1, &Kseq[i][0], 1); + m_comm->AllReduce(alpha[i], Nektar::LibUtilities::ReduceSum); + alpha[i] = std::sqrt(alpha[i]); + + //alpha[i] = std::sqrt(alpha[i]); + Vmath::Smul(ntot, 1.0/alpha[i], Kseq[i], 1, Kseq[i], 1); + + // Copy Krylov sequence into temporary storage + for (int k = 0; k < i + 1; ++k) + { + Vmath::Vcopy(ntot, Kseq[k], 1, Tseq[k], 1); + } + + // Generate Hessenberg matrix and compute eigenvalues of it. + EV_small(Tseq, ntot, alpha, i, zvec, wr, wi, resnorm); + + // Test for convergence. + converged = EV_test(i, i, zvec, wr, wi, resnorm, + std::min(i, m_nvec), evlout, resid0); + converged = max (converged, 0); + + if (m_comm->GetRank() == 0) + { + out << "Iteration: " << i << " (residual : " << resid0 + << ")" <<endl; + } + } + + // Continue with full sequence + if (!converged) + { + for (i = m_kdim + 1; !converged && i <= m_nits; ++i) + { + // Shift all the vectors in the sequence. + // First vector is removed. + for (int j = 1; j <= m_kdim; ++j) + { + alpha[j-1] = alpha[j]; + Vmath::Vcopy(ntot, Kseq[j], 1, Kseq[j-1], 1); + } + + // Compute next vector + EV_update(Kseq[m_kdim - 1], Kseq[m_kdim]); + + // Compute new scale factor + alpha[m_kdim] = Blas::Ddot(ntot, &Kseq[m_kdim][0], 1, + &Kseq[m_kdim][0], 1); + m_comm->AllReduce(alpha[m_kdim], Nektar::LibUtilities::ReduceSum); + alpha[m_kdim] = std::sqrt(alpha[m_kdim]); + Vmath::Smul(ntot, 1.0/alpha[m_kdim], Kseq[m_kdim], 1, + Kseq[m_kdim], 1); + + // Copy Krylov sequence into temporary storage + for (int k = 0; k < m_kdim + 1; ++k) + { + Vmath::Vcopy(ntot, Kseq[k], 1, Tseq[k], 1); + } + + // Generate Hessenberg matrix and compute eigenvalues of it + EV_small(Tseq, ntot, alpha, m_kdim, zvec, wr, wi, resnorm); + + // Test for convergence. + converged = EV_test(i, m_kdim, zvec, wr, wi, resnorm, + m_nvec, evlout, resid0); + + if (m_comm->GetRank() == 0) + { + out << "Iteration: " << i << " (residual : " + << resid0 << ")" <<endl; + } + } + } + + m_equ[0]->Output(); + + // Evaluate and output computation time and solution accuracy. + // The specific format of the error output is essential for the + // regression tests to work. + // Evaluate L2 Error + for(j = 0; j < m_equ[0]->GetNvariables(); ++j) + { + NekDouble vL2Error = m_equ[0]->L2Error(j,false); + NekDouble vLinfError = m_equ[0]->LinfError(j); + if (m_comm->GetRank() == 0) + { + out << "L 2 error (variable " << m_equ[0]->GetVariable(j) + << ") : " << vL2Error << endl; + out << "L inf error (variable " << m_equ[0]->GetVariable(j) + << ") : " << vLinfError << endl; + } + } + + // Process eigenvectors and write out. + EV_post(Tseq, Kseq, ntot, min(--i, m_kdim), m_nvec, zvec, wr, wi, + converged); + + WARNINGL0(m_imagShift == 0,"Complex Shift applied. " + "Need to implement Ritz re-evaluation of" + "eigenvalue. Only one half of complex " + "value will be correct"); + + // store eigenvalues so they can be accessed from driver class + m_real_evl = wr; + m_imag_evl = wi; + + // Close the runtime info file. + if (m_comm->GetRank() == 0) + { + evlout.close(); + } +} + + +/** + * + */ +void DriverModifiedArnoldi::EV_update( + Array<OneD, NekDouble> &src, + Array<OneD, NekDouble> &tgt) +{ + // Copy starting vector into first sequence element. + CopyArnoldiArrayToField(src); + m_equ[0]->TransCoeffToPhys(); + + m_equ[0]->DoSolve(); + + if(m_EvolutionOperator == eTransientGrowth) { - - string DriverModifiedArnoldi::className = - GetDriverFactory().RegisterCreatorFunction("ModifiedArnoldi", - DriverModifiedArnoldi::create); - string DriverModifiedArnoldi::driverLookupId = - LibUtilities::SessionReader::RegisterEnumValue("Driver", - "ModifiedArnoldi",0); - - /** - * - */ - DriverModifiedArnoldi::DriverModifiedArnoldi( - const LibUtilities::SessionReaderSharedPtr pSession) - : DriverArnoldi(pSession) - { - } - - - /** - * - */ - DriverModifiedArnoldi::~DriverModifiedArnoldi() - { - } - - - /** - * - */ - void DriverModifiedArnoldi::v_InitObject(ostream &out) - { - DriverArnoldi::v_InitObject(out); - - m_equ[0]->PrintSummary(out); - - // Print session parameters - if (m_comm->GetRank() == 0) - { - out << "\tArnoldi solver type : Modified Arnoldi" << endl; - } - - DriverArnoldi::ArnoldiSummary(out); - - m_equ[m_nequ - 1]->DoInitialise(); - - //FwdTrans Initial conditions to be in Coefficient Space - m_equ[m_nequ-1] ->TransPhysToCoeff(); - - } - - - /** - * - */ - void DriverModifiedArnoldi::v_Execute(ostream &out) - { - int i = 0; - int j = 0; - int nq = m_equ[0]->UpdateFields()[0]->GetNcoeffs(); - int ntot = m_nfields*nq; - int converged = 0; - NekDouble resnorm = 0.0; - ofstream evlout; - std::string evlFile = m_session->GetSessionName() + ".evl"; - - if (m_comm->GetRank() == 0) - { - evlout.open(evlFile.c_str()); - } - - // Allocate memory - Array<OneD, NekDouble> alpha = Array<OneD, NekDouble> (m_kdim+1, 0.0); - Array<OneD, NekDouble> wr = Array<OneD, NekDouble> (m_kdim, 0.0); - Array<OneD, NekDouble> wi = Array<OneD, NekDouble> (m_kdim, 0.0); - Array<OneD, NekDouble> zvec = Array<OneD, NekDouble> (m_kdim*m_kdim, 0.0); - - Array<OneD, Array<OneD, NekDouble> > Kseq - = Array<OneD, Array<OneD, NekDouble> > (m_kdim + 1); - Array<OneD, Array<OneD, NekDouble> > Tseq - = Array<OneD, Array<OneD, NekDouble> > (m_kdim + 1); - for (i = 0; i < m_kdim + 1; ++i) - { - Kseq[i] = Array<OneD, NekDouble>(ntot, 0.0); - Tseq[i] = Array<OneD, NekDouble>(ntot, 0.0); - } - - // Copy starting vector into second sequence element (temporary). - if(m_session->DefinesFunction("InitialConditions")) - { - if (m_comm->GetRank() == 0) - { - out << "\tInital vector : specified in input file " << endl; - } - m_equ[0]->SetInitialConditions(0.0,false); - - CopyFieldToArnoldiArray(Kseq[1]); - } - else - { - if (m_comm->GetRank() == 0) - { - out << "\tInital vector : random " << endl; - } - - NekDouble eps=1; - Vmath::FillWhiteNoise(ntot, eps , &Kseq[1][0], 1); - } - - // Perform one iteration to enforce boundary conditions. - // Set this as the initial value in the sequence. - EV_update(Kseq[1], Kseq[0]); - if (m_comm->GetRank() == 0) - { - out << "Iteration: " << 0 << endl; - } - - // Normalise first vector in sequence - alpha[0] = Blas::Ddot(ntot, &Kseq[0][0], 1, &Kseq[0][0], 1); - m_comm->AllReduce(alpha[0], Nektar::LibUtilities::ReduceSum); - alpha[0] = std::sqrt(alpha[0]); - Vmath::Smul(ntot, 1.0/alpha[0], Kseq[0], 1, Kseq[0], 1); - - // Fill initial krylov sequence - NekDouble resid0; - for (i = 1; !converged && i <= m_kdim; ++i) - { - // Compute next vector - EV_update(Kseq[i-1], Kseq[i]); - - // Normalise - alpha[i] = Blas::Ddot(ntot, &Kseq[i][0], 1, &Kseq[i][0], 1); - m_comm->AllReduce(alpha[i], Nektar::LibUtilities::ReduceSum); - alpha[i] = std::sqrt(alpha[i]); - - //alpha[i] = std::sqrt(alpha[i]); - Vmath::Smul(ntot, 1.0/alpha[i], Kseq[i], 1, Kseq[i], 1); - - // Copy Krylov sequence into temporary storage - for (int k = 0; k < i + 1; ++k) - { - Vmath::Vcopy(ntot, Kseq[k], 1, Tseq[k], 1); - } - - // Generate Hessenberg matrix and compute eigenvalues of it. - EV_small(Tseq, ntot, alpha, i, zvec, wr, wi, resnorm); - - // Test for convergence. - converged = EV_test(i, i, zvec, wr, wi, resnorm, - std::min(i, m_nvec), evlout, resid0); - converged = max (converged, 0); - - if (m_comm->GetRank() == 0) - { - out << "Iteration: " << i << " (residual : " << resid0 - << ")" <<endl; - } - } - - // Continue with full sequence - if (!converged) - { - for (i = m_kdim + 1; !converged && i <= m_nits; ++i) - { - // Shift all the vectors in the sequence. - // First vector is removed. - for (int j = 1; j <= m_kdim; ++j) - { - alpha[j-1] = alpha[j]; - Vmath::Vcopy(ntot, Kseq[j], 1, Kseq[j-1], 1); - } - - // Compute next vector - EV_update(Kseq[m_kdim - 1], Kseq[m_kdim]); - - // Compute new scale factor - alpha[m_kdim] = Blas::Ddot(ntot, &Kseq[m_kdim][0], 1, - &Kseq[m_kdim][0], 1); - m_comm->AllReduce(alpha[m_kdim], - Nektar::LibUtilities::ReduceSum); - alpha[m_kdim] = std::sqrt(alpha[m_kdim]); - Vmath::Smul(ntot, 1.0/alpha[m_kdim], Kseq[m_kdim], 1, - Kseq[m_kdim], 1); - - // Copy Krylov sequence into temporary storage - for (int k = 0; k < m_kdim + 1; ++k) - { - Vmath::Vcopy(ntot, Kseq[k], 1, Tseq[k], 1); - } - - // Generate Hessenberg matrix and compute eigenvalues of it - EV_small(Tseq, ntot, alpha, m_kdim, zvec, wr, wi, resnorm); - - // Test for convergence. - converged = EV_test(i, m_kdim, zvec, wr, wi, resnorm, - m_nvec, evlout, resid0); - - if (m_comm->GetRank() == 0) - { - out << "Iteration: " << i << " (residual : " - << resid0 << ")" <<endl; - } - } - } - - m_equ[0]->Output(); - - // Evaluate and output computation time and solution accuracy. - // The specific format of the error output is essential for the - // regression tests to work. - // Evaluate L2 Error - for(j = 0; j < m_equ[0]->GetNvariables(); ++j) - { - NekDouble vL2Error = m_equ[0]->L2Error(j,false); - NekDouble vLinfError = m_equ[0]->LinfError(j); - if (m_comm->GetRank() == 0) - { - out << "L 2 error (variable " << m_equ[0]->GetVariable(j) - << ") : " << vL2Error << endl; - out << "L inf error (variable " << m_equ[0]->GetVariable(j) - << ") : " << vLinfError << endl; - } - } - - // Process eigenvectors and write out. - EV_post(Tseq, Kseq, ntot, min(--i, m_kdim), m_nvec, zvec, wr, wi, - converged); - - // store eigenvalues so they can be access from driver class - m_real_evl = wr; - m_imag_evl = wi; - - // Close the runtime info file. - if (m_comm->GetRank() == 0) - { - evlout.close(); - } - } - - - /** - * - */ - void DriverModifiedArnoldi::EV_update( - Array<OneD, NekDouble> &src, - Array<OneD, NekDouble> &tgt) - { - // Copy starting vector into first sequence element. - CopyArnoldiArrayToField(src); - m_equ[0]->TransCoeffToPhys(); - - m_equ[0]->DoSolve(); - - if(m_EvolutionOperator == eTransientGrowth) - { - Array<OneD, MultiRegions::ExpListSharedPtr> fields; - fields = m_equ[0]->UpdateFields(); - - //start Adjoint with latest fields of direct - CopyFwdToAdj(); - m_equ[1]->TransCoeffToPhys(); - - m_equ[1]->DoSolve(); - } - - // Copy starting vector into first sequence element. - CopyFieldToArnoldiArray(tgt); - } - - - /** - * - */ - void DriverModifiedArnoldi::EV_small( - Array<OneD, Array<OneD, NekDouble> > &Kseq, - const int ntot, - const Array<OneD, NekDouble> &alpha, - const int kdim, - Array<OneD, NekDouble> &zvec, - Array<OneD, NekDouble> &wr, - Array<OneD, NekDouble> &wi, - NekDouble &resnorm) - { - int kdimp = kdim + 1; - int lwork = 10*kdim; - int ier; - Array<OneD, NekDouble> R(kdimp * kdimp, 0.0); - Array<OneD, NekDouble> H(kdimp * kdim, 0.0); - Array<OneD, NekDouble> rwork(lwork, 0.0); - - // Modified G-S orthonormalisation - for (int i = 0; i < kdimp; ++i) - { - NekDouble gsc = Blas::Ddot(ntot, &Kseq[i][0], 1, &Kseq[i][0], 1); - m_comm->AllReduce(gsc, Nektar::LibUtilities::ReduceSum); - gsc = std::sqrt(gsc); - ASSERTL0(gsc != 0.0, "Vectors are linearly independent."); - - R[i*kdimp+i] = gsc; - Vmath::Smul(ntot, 1.0/gsc, Kseq[i], 1, Kseq[i], 1); - - for (int j = i + 1; j < kdimp; ++j) - { - gsc = Blas::Ddot(ntot, &Kseq[i][0], 1, &Kseq[j][0], 1); - m_comm->AllReduce(gsc, Nektar::LibUtilities::ReduceSum); - Vmath::Svtvp(ntot, -gsc, Kseq[i], 1, Kseq[j], 1, Kseq[j], 1); - R[j*kdimp+i] = gsc; - } - } - - // Compute H matrix - for (int i = 0; i < kdim; ++i) - { - for (int j = 0; j < kdim; ++j) - { - H[j*kdim+i] = alpha[j+1] * R[(j+1)*kdimp+i] - - Vmath::Dot(j, &H[0] + i, kdim, &R[0] + j*kdimp, 1); - H[j*kdim+i] /= R[j*kdimp+j]; - } - } - - H[(kdim-1)*kdim+kdim] = alpha[kdim] - * std::fabs(R[kdim*kdimp+kdim] / R[(kdim-1)*kdimp + kdim-1]); - - Lapack::dgeev_('N', 'V', kdim, &H[0], kdim, &wr[0], &wi[0], 0, 1, - &zvec[0], kdim, &rwork[0], lwork, ier); - - ASSERTL0(!ier, "Error with dgeev"); - - resnorm = H[(kdim-1)*kdim + kdim]; - } - - - /** - * - */ - int DriverModifiedArnoldi::EV_test( - const int itrn, - const int kdim, - Array<OneD, NekDouble> &zvec, - Array<OneD, NekDouble> &wr, - Array<OneD, NekDouble> &wi, - const NekDouble resnorm, - const int nvec, - ofstream &evlout, - NekDouble &resid0) - { - int idone = 0; - // NekDouble period = 0.1; - - Array<OneD, NekDouble> resid(kdim); - for (int i = 0; i < kdim; ++i) - { - NekDouble tmp = std::sqrt(Vmath::Dot(kdim, &zvec[0] + i*kdim, 1, - &zvec[0] + i*kdim, 1)); - resid[i] = resnorm * std::fabs(zvec[kdim - 1 + i*kdim]) / tmp; - if (wi[i] < 0.0) - { - resid[i-1] = resid[i] = hypot(resid[i-1], resid[i]); - } - } - - EV_sort(zvec, wr, wi, resid, kdim); - - if (resid[nvec-1] < m_evtol) - { - idone = nvec; - } - - if (m_comm->GetRank() == 0) - { - evlout << "-- Iteration = " << itrn << ", H(k+1, k) = " - << resnorm << endl; - evlout.precision(4); - evlout.setf(ios::scientific, ios::floatfield); - if(m_timeSteppingAlgorithm) - { - evlout << "EV Magnitude Angle Growth " - << "Frequency Residual" << endl; - } - else - { - evlout << "EV Real Imaginary inverse real " - << "inverse imag Residual" << endl; - } - - for (int i = 0; i < kdim; i++) - { - WriteEvs(evlout,i,wr[i],wi[i],resid[i]); - } - } - - resid0 = resid[nvec-1]; - return idone; - } - - - /** - * - */ - void DriverModifiedArnoldi::EV_sort( - Array<OneD, NekDouble> &evec, - Array<OneD, NekDouble> &wr, - Array<OneD, NekDouble> &wi, - Array<OneD, NekDouble> &test, - const int dim) - { - Array<OneD, NekDouble> z_tmp(dim,0.0); - NekDouble wr_tmp, wi_tmp, te_tmp; - for (int j = 1; j < dim; ++j) - { - wr_tmp = wr[j]; - wi_tmp = wi[j]; - te_tmp = test[j]; - Vmath::Vcopy(dim, &evec[0] + j*dim, 1, &z_tmp[0], 1); - int i = j - 1; - while (i >= 0 && test[i] > te_tmp) - { - wr[i+1] = wr[i]; - wi[i+1] = wi[i]; - test[i+1] = test[i]; - Vmath::Vcopy(dim, &evec[0] + i*dim, 1, &evec[0] + (i+1)*dim, 1); - i--; - } - wr[i+1] = wr_tmp; - wi[i+1] = wi_tmp; - test[i+1] = te_tmp; - Vmath::Vcopy(dim, &z_tmp[0], 1, &evec[0] + (i+1)*dim, 1); - } - } - - - /** - * - */ - void DriverModifiedArnoldi::EV_post( - Array<OneD, Array<OneD, NekDouble> > &Tseq, - Array<OneD, Array<OneD, NekDouble> > &Kseq, - const int ntot, - const int kdim, - const int nvec, - Array<OneD, NekDouble> &zvec, - Array<OneD, NekDouble> &wr, - Array<OneD, NekDouble> &wi, - const int icon) - { - if (icon == 0) - { - // Not converged, write final Krylov vector - ASSERTL0(false, "Convergence was not achieved within the " - "prescribed number of iterations."); - } - else if (icon < 0) - { - // Minimum residual reached - ASSERTL0(false, "Minimum residual reached."); - } - else if (icon == nvec) - { - // Converged, write out eigenvectors - EV_big(Tseq, Kseq, ntot, kdim, icon, zvec, wr, wi); - Array<OneD, MultiRegions::ExpListSharedPtr> fields - = m_equ[0]->UpdateFields(); - - for (int j = 0; j < icon; ++j) - { - std::string file = m_session->GetSessionName() + "_eig_" - + boost::lexical_cast<std::string>(j); - - WriteFld(file,Kseq[j]); - } - } - else - { - // Not recognised - ASSERTL0(false, "Unrecognised value."); - } - } - - - /** - * - */ - void DriverModifiedArnoldi::EV_big( - Array<OneD, Array<OneD, NekDouble> > &bvecs, - Array<OneD, Array<OneD, NekDouble> > &evecs, - const int ntot, - const int kdim, - const int nvec, - Array<OneD, NekDouble> &zvec, - Array<OneD, NekDouble> &wr, - Array<OneD, NekDouble> &wi) - { - NekDouble wgt, norm; - - // Generate big eigenvectors - for (int j = 0; j < nvec; ++j) - { - Vmath::Zero(ntot, evecs[j], 1); - for (int i = 0; i < kdim; ++i) - { - wgt = zvec[i + j*kdim]; - Vmath::Svtvp(ntot, wgt, bvecs[i], 1, evecs[j], 1, evecs[j], 1); - } - } - - // Normalise the big eigenvectors - for (int i = 0; i < nvec; ++i) - { - if (wi[i] == 0.0) // Real mode - { - norm = Blas::Ddot(ntot, &evecs[i][0], 1, &evecs[i][0], 1); - m_comm->AllReduce(norm, Nektar::LibUtilities::ReduceSum); - norm = std::sqrt(norm); - Vmath::Smul(ntot, 1.0/norm, evecs[i], 1, evecs[i], 1); - } - else - { - norm = Blas::Ddot(ntot, &evecs[i][0], 1, &evecs[i][0], 1); - norm += Blas::Ddot(ntot, &evecs[i+1][0], 1, &evecs[i+1][0], 1); - m_comm->AllReduce(norm, Nektar::LibUtilities::ReduceSum); - norm = std::sqrt(norm); - - Vmath::Smul(ntot, 1.0/norm, evecs[i], 1, evecs[i], 1); - Vmath::Smul(ntot, 1.0/norm, evecs[i+1], 1, evecs[i+1], 1); - - i++; - } - } - } - + Array<OneD, MultiRegions::ExpListSharedPtr> fields; + fields = m_equ[0]->UpdateFields(); + + //start Adjoint with latest fields of direct + CopyFwdToAdj(); + m_equ[1]->TransCoeffToPhys(); + + m_equ[1]->DoSolve(); + } + + // Copy starting vector into first sequence element. + CopyFieldToArnoldiArray(tgt); +} + + +/** + * Computes the Ritz eigenvalues and eigenvectors of the Hessenberg matrix + * constructed from the Krylov sequence. + */ +void DriverModifiedArnoldi::EV_small( + Array<OneD, Array<OneD, NekDouble> > &Kseq, + const int ntot, + const Array<OneD, NekDouble> &alpha, + const int kdim, + Array<OneD, NekDouble> &zvec, + Array<OneD, NekDouble> &wr, + Array<OneD, NekDouble> &wi, + NekDouble &resnorm) +{ + int kdimp = kdim + 1; + int lwork = 10*kdim; + int ier; + Array<OneD, NekDouble> R(kdimp * kdimp, 0.0); + Array<OneD, NekDouble> H(kdimp * kdim, 0.0); + Array<OneD, NekDouble> rwork(lwork, 0.0); + + // Modified G-S orthonormalisation + for (int i = 0; i < kdimp; ++i) + { + NekDouble gsc = Blas::Ddot(ntot, &Kseq[i][0], 1, &Kseq[i][0], 1); + m_comm->AllReduce(gsc, Nektar::LibUtilities::ReduceSum); + gsc = std::sqrt(gsc); + ASSERTL0(gsc != 0.0, "Vectors are linearly independent."); + + R[i*kdimp+i] = gsc; + Vmath::Smul(ntot, 1.0/gsc, Kseq[i], 1, Kseq[i], 1); + + for (int j = i + 1; j < kdimp; ++j) + { + gsc = Blas::Ddot(ntot, &Kseq[i][0], 1, &Kseq[j][0], 1); + m_comm->AllReduce(gsc, Nektar::LibUtilities::ReduceSum); + Vmath::Svtvp(ntot, -gsc, Kseq[i], 1, Kseq[j], 1, Kseq[j], 1); + R[j*kdimp+i] = gsc; + } + } + + // Compute H matrix + for (int i = 0; i < kdim; ++i) + { + for (int j = 0; j < kdim; ++j) + { + H[j*kdim+i] = alpha[j+1] * R[(j+1)*kdimp+i] + - Vmath::Dot(j, &H[0] + i, kdim, &R[0] + j*kdimp, 1); + H[j*kdim+i] /= R[j*kdimp+j]; + } + } + + H[(kdim-1)*kdim+kdim] = alpha[kdim] + * std::fabs(R[kdim*kdimp+kdim] / R[(kdim-1)*kdimp + kdim-1]); + + Lapack::dgeev_('N', 'V', kdim, &H[0], kdim, &wr[0], &wi[0], 0, 1, + &zvec[0], kdim, &rwork[0], lwork, ier); + + ASSERTL0(!ier, "Error with dgeev"); + + resnorm = H[(kdim-1)*kdim + kdim]; +} + + +/** + * Check for convergence of the residuals of the eigenvalues of H. + */ +int DriverModifiedArnoldi::EV_test( + const int itrn, + const int kdim, + Array<OneD, NekDouble> &zvec, + Array<OneD, NekDouble> &wr, + Array<OneD, NekDouble> &wi, + const NekDouble resnorm, + const int nvec, + ofstream &evlout, + NekDouble &resid0) +{ + int idone = 0; + // NekDouble period = 0.1; + + Array<OneD, NekDouble> resid(kdim); + for (int i = 0; i < kdim; ++i) + { + NekDouble tmp = std::sqrt(Vmath::Dot(kdim, &zvec[0] + i*kdim, 1, + &zvec[0] + i*kdim, 1)); + resid[i] = resnorm * std::fabs(zvec[kdim - 1 + i*kdim]) / tmp; + if (wi[i] < 0.0) + { + resid[i-1] = resid[i] = hypot(resid[i-1], resid[i]); + } + } + + EV_sort(zvec, wr, wi, resid, kdim); + + if (resid[nvec-1] < m_evtol) + { + idone = nvec; + } + + if (m_comm->GetRank() == 0) + { + evlout << "-- Iteration = " << itrn << ", H(k+1, k) = " + << resnorm << endl; + evlout.precision(4); + evlout.setf(ios::scientific, ios::floatfield); + if(m_timeSteppingAlgorithm) + { + evlout << " Magnitude Angle Growth " + << "Frequency Residual" << endl; + } + else + { + evlout << " Real Imaginary inverse real " + << "inverse imag Residual" << endl; + } + + for (int i = 0; i < kdim; i++) + { + WriteEvs(evlout,i,wr[i],wi[i],resid[i]); + } } + + resid0 = resid[nvec-1]; + return idone; +} + + +/** + * Sorts the computed eigenvalues by smallest residual first. + */ +void DriverModifiedArnoldi::EV_sort( + Array<OneD, NekDouble> &evec, + Array<OneD, NekDouble> &wr, + Array<OneD, NekDouble> &wi, + Array<OneD, NekDouble> &test, + const int dim) +{ + Array<OneD, NekDouble> z_tmp(dim,0.0); + NekDouble wr_tmp, wi_tmp, te_tmp; + for (int j = 1; j < dim; ++j) + { + wr_tmp = wr[j]; + wi_tmp = wi[j]; + te_tmp = test[j]; + Vmath::Vcopy(dim, &evec[0] + j*dim, 1, &z_tmp[0], 1); + int i = j - 1; + while (i >= 0 && test[i] > te_tmp) + { + wr[i+1] = wr[i]; + wi[i+1] = wi[i]; + test[i+1] = test[i]; + Vmath::Vcopy(dim, &evec[0] + i*dim, 1, &evec[0] + (i+1)*dim, 1); + i--; + } + wr[i+1] = wr_tmp; + wi[i+1] = wi_tmp; + test[i+1] = te_tmp; + Vmath::Vcopy(dim, &z_tmp[0], 1, &evec[0] + (i+1)*dim, 1); + } +} + + +/** + * Post-process the Ritz eigenvalues/eigenvectors of the matrix H, to compute + * estimations of the leading eigenvalues and eigenvectors of the original + * matrix. + */ +void DriverModifiedArnoldi::EV_post( + Array<OneD, Array<OneD, NekDouble> > &Tseq, + Array<OneD, Array<OneD, NekDouble> > &Kseq, + const int ntot, + const int kdim, + const int nvec, + Array<OneD, NekDouble> &zvec, + Array<OneD, NekDouble> &wr, + Array<OneD, NekDouble> &wi, + const int icon) +{ + if (icon == 0) + { + // Not converged, write final Krylov vector + ASSERTL0(false, "Convergence was not achieved within the " + "prescribed number of iterations."); + } + else if (icon < 0) + { + // Minimum residual reached + ASSERTL0(false, "Minimum residual reached."); + } + else if (icon == nvec) + { + // Converged, write out eigenvectors + EV_big(Tseq, Kseq, ntot, kdim, icon, zvec, wr, wi); + Array<OneD, MultiRegions::ExpListSharedPtr> fields + = m_equ[0]->UpdateFields(); + + for (int j = 0; j < icon; ++j) + { + std::string file = m_session->GetSessionName() + "_eig_" + + boost::lexical_cast<std::string>(j) + + ".fld"; + + WriteEvs(cout, j, wr[j], wi[j]); + WriteFld(file,Kseq[j]); + } + } + else + { + // Not recognised + ASSERTL0(false, "Unrecognised value."); + } +} + + +/** + * Compute estimates of the eigenvalues/eigenvectors of the original system. + */ +void DriverModifiedArnoldi::EV_big( + Array<OneD, Array<OneD, NekDouble> > &bvecs, + Array<OneD, Array<OneD, NekDouble> > &evecs, + const int ntot, + const int kdim, + const int nvec, + Array<OneD, NekDouble> &zvec, + Array<OneD, NekDouble> &wr, + Array<OneD, NekDouble> &wi) +{ + NekDouble wgt, norm; + + // Generate big eigenvectors + for (int j = 0; j < nvec; ++j) + { + Vmath::Zero(ntot, evecs[j], 1); + for (int i = 0; i < kdim; ++i) + { + wgt = zvec[i + j*kdim]; + Vmath::Svtvp(ntot, wgt, bvecs[i], 1, evecs[j], 1, evecs[j], 1); + } + } + + // Normalise the big eigenvectors + for (int i = 0; i < nvec; ++i) + { + if (wi[i] == 0.0) // Real mode + { + norm = Blas::Ddot(ntot, &evecs[i][0], 1, &evecs[i][0], 1); + m_comm->AllReduce(norm, Nektar::LibUtilities::ReduceSum); + norm = std::sqrt(norm); + Vmath::Smul(ntot, 1.0/norm, evecs[i], 1, evecs[i], 1); + } + else + { + norm = Blas::Ddot(ntot, &evecs[i][0], 1, &evecs[i][0], 1); + norm += Blas::Ddot(ntot, &evecs[i+1][0], 1, &evecs[i+1][0], 1); + m_comm->AllReduce(norm, Nektar::LibUtilities::ReduceSum); + norm = std::sqrt(norm); + + Vmath::Smul(ntot, 1.0/norm, evecs[i], 1, evecs[i], 1); + Vmath::Smul(ntot, 1.0/norm, evecs[i+1], 1, evecs[i+1], 1); + + i++; + } + } +} + +} } diff --git a/library/SolverUtils/DriverModifiedArnoldi.h b/library/SolverUtils/DriverModifiedArnoldi.h index 12db360f53f6c7d6a0bc06281e5e210b72c06f37..cf06b617d52874d931adc0d40d88052ac7e52468 100644 --- a/library/SolverUtils/DriverModifiedArnoldi.h +++ b/library/SolverUtils/DriverModifiedArnoldi.h @@ -41,98 +41,98 @@ namespace Nektar { - namespace SolverUtils - { - - class DriverModifiedArnoldi: public DriverArnoldi - { - public: - friend class MemoryManager<DriverModifiedArnoldi>; - - /// Creates an instance of this class - static DriverSharedPtr create( - const LibUtilities::SessionReaderSharedPtr& pSession) - { - DriverSharedPtr p = MemoryManager<DriverModifiedArnoldi> - ::AllocateSharedPtr(pSession); - p->InitObject(); - return p; - } - - ///Name of the class - static std::string className; - - protected: - - /// Constructor - DriverModifiedArnoldi(const LibUtilities::SessionReaderSharedPtr pSession); - - /// Destructor - virtual ~DriverModifiedArnoldi(); - - /// Virtual function for initialisation implementation. - virtual void v_InitObject(ostream &out = cout ); - - /// Virtual function for solve implementation. - virtual void v_Execute(ostream &out = cout); - - private: - /// Generates a new vector in the sequence by applying the linear operator. - void EV_update(Array<OneD, NekDouble> &src, - Array<OneD, NekDouble> &tgt); - - /// Generates the upper Hessenberg matrix H and computes its eigenvalues. - void EV_small(Array<OneD, Array<OneD, NekDouble> > &Kseq, - const int ntot, - const Array<OneD, NekDouble> &alpha, - const int kdim, - Array<OneD, NekDouble> &zvec, - Array<OneD, NekDouble> &wr, - Array<OneD, NekDouble> &wi, - NekDouble &resnorm); - - /// Tests for convergence of eigenvalues of H. - int EV_test(const int itrn, - const int kdim, - Array<OneD, NekDouble> &zvec, - Array<OneD, NekDouble> &wr, - Array<OneD, NekDouble> &wi, - const NekDouble resnorm, - const int nvec, - ofstream &evlout, - NekDouble &resid0); - - - /// Sorts a sequence of eigenvectors/eigenvalues by magnitude. - void EV_sort(Array<OneD, NekDouble> &evec, - Array<OneD, NekDouble> &wr, - Array<OneD, NekDouble> &wi, - Array<OneD, NekDouble> &test, - const int dim); - - void EV_post(Array<OneD, Array<OneD, NekDouble> > &Tseq, - Array<OneD, Array<OneD, NekDouble> > &Kseq, - const int ntot, - const int kdim, - const int nvec, - Array<OneD, NekDouble> &zvec, - Array<OneD, NekDouble> &wr, - Array<OneD, NekDouble> &wi, - const int icon); - - void EV_big(Array<OneD, Array<OneD, NekDouble> > &bvecs, - Array<OneD, Array<OneD, NekDouble> > &evecs, - const int ntot, - const int kdim, - const int nvec, - Array<OneD, NekDouble> &zvec, - Array<OneD, NekDouble> &wr, - Array<OneD, NekDouble> &wi); - - static std::string driverLookupId; - }; - - } +namespace SolverUtils +{ + +class DriverModifiedArnoldi: public DriverArnoldi +{ + public: + friend class MemoryManager<DriverModifiedArnoldi>; + + /// Creates an instance of this class + static DriverSharedPtr create( + const LibUtilities::SessionReaderSharedPtr& pSession) + { + DriverSharedPtr p = MemoryManager<DriverModifiedArnoldi> + ::AllocateSharedPtr(pSession); + p->InitObject(); + return p; + } + + ///Name of the class + static std::string className; + + protected: + + /// Constructor + DriverModifiedArnoldi(const LibUtilities::SessionReaderSharedPtr pSession); + + /// Destructor + virtual ~DriverModifiedArnoldi(); + + /// Virtual function for initialisation implementation. + virtual void v_InitObject(ostream &out = cout ); + + /// Virtual function for solve implementation. + virtual void v_Execute(ostream &out = cout); + + private: + /// Generates a new vector in the sequence by applying the linear operator. + void EV_update( Array<OneD, NekDouble> &src, + Array<OneD, NekDouble> &tgt); + + /// Generates the upper Hessenberg matrix H and computes its eigenvalues. + void EV_small( Array<OneD, Array<OneD, NekDouble> > &Kseq, + const int ntot, + const Array<OneD, NekDouble> &alpha, + const int kdim, + Array<OneD, NekDouble> &zvec, + Array<OneD, NekDouble> &wr, + Array<OneD, NekDouble> &wi, + NekDouble &resnorm); + + /// Tests for convergence of eigenvalues of H. + int EV_test( const int itrn, + const int kdim, + Array<OneD, NekDouble> &zvec, + Array<OneD, NekDouble> &wr, + Array<OneD, NekDouble> &wi, + const NekDouble resnorm, + const int nvec, + ofstream &evlout, + NekDouble &resid0); + + + /// Sorts a sequence of eigenvectors/eigenvalues by magnitude. + void EV_sort( Array<OneD, NekDouble> &evec, + Array<OneD, NekDouble> &wr, + Array<OneD, NekDouble> &wi, + Array<OneD, NekDouble> &test, + const int dim); + + void EV_post( Array<OneD, Array<OneD, NekDouble> > &Tseq, + Array<OneD, Array<OneD, NekDouble> > &Kseq, + const int ntot, + const int kdim, + const int nvec, + Array<OneD, NekDouble> &zvec, + Array<OneD, NekDouble> &wr, + Array<OneD, NekDouble> &wi, + const int icon); + + void EV_big( Array<OneD, Array<OneD, NekDouble> > &bvecs, + Array<OneD, Array<OneD, NekDouble> > &evecs, + const int ntot, + const int kdim, + const int nvec, + Array<OneD, NekDouble> &zvec, + Array<OneD, NekDouble> &wr, + Array<OneD, NekDouble> &wi); + + static std::string driverLookupId; +}; + +} } #endif //NEKTAR_SOLVERS_AUXILIARY_ADRBASE_H diff --git a/library/SolverUtils/DriverSteadyState.cpp b/library/SolverUtils/DriverSteadyState.cpp index 5a3f6f6178efa9bc6da35e3139429e1f3beea95a..356b82d5760a8bc68848ed6c8206fe2a115d6251 100644 --- a/library/SolverUtils/DriverSteadyState.cpp +++ b/library/SolverUtils/DriverSteadyState.cpp @@ -163,7 +163,7 @@ void DriverSteadyState::v_Execute(ostream &out) for(int i = 0; i < NumVar_SFD; ++i) { - q0[i] = Array<OneD, NekDouble> (m_equ[m_nequ-1]->GetTotPoints(), + q0[i] = Array<OneD, NekDouble> (m_equ[m_nequ-1]->GetTotPoints(), 0.0); //q0 is initialised qBar0[i] = Array<OneD, NekDouble> (m_equ[m_nequ-1]->GetTotPoints(), 0.0); @@ -248,13 +248,13 @@ void DriverSteadyState::v_Execute(ostream &out) FlowPartiallyConverged = true; } - else if (m_NonConvergingStepsCounter * m_dt * m_infosteps + else if (m_NonConvergingStepsCounter * m_dt * m_infosteps >= AdaptiveTime) { if (m_comm->GetRank() == 0) { cout << "\n\t We compute stability analysis using" - << " the current flow field as base flow:\n" + << " the current flow field as base flow:\n" << endl; } @@ -296,7 +296,7 @@ void DriverSteadyState::v_Execute(ostream &out) } m_file.close(); - + ///We save the final solution into a .fld file m_equ[m_nequ - 1]->Output(); @@ -512,28 +512,25 @@ void DriverSteadyState::ReadEVfile( { // This routine reads the .evl file written by the Arnoldi algorithm // (written in September 2014) - std::string EVfileName = m_session->GetSessionName() + ".evl"; + std::string line; + int NumLinesInFile = 0; + std::string EVfileName = m_session->GetSessionName() + ".evl"; std::ifstream EVfile(EVfileName.c_str()); - - int NumLinesInFile(0); - NekDouble NonReleventNumber(0.0); + ASSERTL0(EVfile.good(), "Cannot open .evl file."); if(EVfile) { - std::string line; - // This block counts the total number of lines of the .evl file // We keep going util we reach the end of the file while(getline(EVfile, line)) { - NumLinesInFile += 1; + ++NumLinesInFile; } - EVfile.close(); // It may happen that the Stability method that have produced the .elv // file converges in less than m_kdim iterations. In this case, // KrylovSubspaceDim has to be changed here - if(NumLinesInFile < KrylovSubspaceDim*2.0 + if(NumLinesInFile < KrylovSubspaceDim*2.0 + KrylovSubspaceDim*(KrylovSubspaceDim+1.0)/2.0) { for(int i = 1; i <= KrylovSubspaceDim; ++i) @@ -546,28 +543,31 @@ void DriverSteadyState::ReadEVfile( } // go back to the beginning of the file - std::ifstream EVfile(EVfileName.c_str()); + EVfile.clear(); + EVfile.seekg(0, ios::beg); // We now want to go to the line where the most unstable eigenlavue was // written for(int i = 0; i < (NumLinesInFile - KrylovSubspaceDim); ++i) { std::getline(EVfile, line); + cout << "Discard line: " << line << endl; } - // Then we read this line by skipping the first three values written - EVfile >> NonReleventNumber; - EVfile >> NonReleventNumber; - EVfile >> NonReleventNumber; + std::vector<std::string> tokens; + std::getline(EVfile, line); + boost::algorithm::split(tokens, line, + boost::is_any_of("\t "),boost::token_compress_on); - // The growth rate and the frequency of the EV are at the 4th and 5th - // colums of the .evl file - EVfile >> growthEV; - EVfile >> frequencyEV; + ASSERTL0(tokens.size() >= 5, + "Unexpected formatting of .evl file while reading line:\n" + + line); + growthEV = boost::lexical_cast<NekDouble>(tokens[4]); + frequencyEV = boost::lexical_cast<NekDouble>(tokens[5]); } else { - cout << "An error occured when openning the .evl file" << endl; + cout << "An error occurred when opening the .evl file" << endl; } EVfile.close(); } @@ -643,9 +643,9 @@ void DriverSteadyState::PrintSummarySFD() if (m_EvolutionOperator == eAdaptiveSFD) { cout << "\nWe use the adaptive SFD method:" << endl; - cout << " The parameters are updated every " << AdaptiveTime + cout << " The parameters are updated every " << AdaptiveTime << " time units;" << endl; - cout << " until |q-qBar|inf becomes smaller than " << AdaptiveTOL + cout << " until |q-qBar|inf becomes smaller than " << AdaptiveTOL << endl; } cout << "=====================================" diff --git a/library/SolverUtils/EquationSystem.cpp b/library/SolverUtils/EquationSystem.cpp index 089dfac32d58867b76d1d3c73c4296ba440e3af3..4f14533fea5fde7e3a9af7a82e121ffe98963612 100644 --- a/library/SolverUtils/EquationSystem.cpp +++ b/library/SolverUtils/EquationSystem.cpp @@ -133,15 +133,15 @@ namespace Nektar // Set space dimension for use in class m_spacedim = m_graph->GetSpaceDimension(); - + // Setting parameteres for homogenous problems - m_HomoDirec = 0; - m_useFFT = false; - m_homogen_dealiasing = false; - m_SingleMode = false; - m_HalfMode = false; - m_MultipleModes = false; - m_HomogeneousType = eNotHomogeneous; + m_HomoDirec = 0; + m_useFFT = false; + m_homogen_dealiasing = false; + m_singleMode = false; + m_halfMode = false; + m_multipleModes = false; + m_HomogeneousType = eNotHomogeneous; if (m_session->DefinesSolverInfo("HOMOGENEOUS")) { @@ -158,25 +158,25 @@ namespace Nektar if(m_session->DefinesSolverInfo("ModeType")) { m_session->MatchSolverInfo("ModeType", "SingleMode", - m_SingleMode, false); + m_singleMode, false); m_session->MatchSolverInfo("ModeType", "HalfMode", - m_HalfMode, false); + m_halfMode, false); m_session->MatchSolverInfo("ModeType", "MultipleModes", - m_MultipleModes, false); + m_multipleModes, false); } // Stability Analysis flags if (m_session->DefinesSolverInfo("ModeType")) { - if(m_SingleMode) + if(m_singleMode) { m_npointsZ = 2; } - else if(m_HalfMode) + else if(m_halfMode) { m_npointsZ = 1; } - else if(m_MultipleModes) + else if(m_multipleModes) { m_npointsZ = m_session->GetParameter("HomModesZ"); } @@ -331,7 +331,7 @@ namespace Nektar if (m_HomogeneousType == eHomogeneous1D) { // Fourier single mode stability analysis - if (m_SingleMode) + if (m_singleMode) { const LibUtilities::PointsKey PkeyZ( m_npointsZ, @@ -355,7 +355,7 @@ namespace Nektar } } // Half mode stability analysis - else if(m_HalfMode) + else if(m_halfMode) { const LibUtilities::PointsKey PkeyZ( m_npointsZ, @@ -1278,7 +1278,7 @@ namespace Nektar { if (m_HomogeneousType == eHomogeneous1D) { - if (m_SingleMode) + if (m_singleMode) { const LibUtilities::PointsKey PkeyZ(m_npointsZ, LibUtilities::eFourierSingleModeSpaced); @@ -1298,7 +1298,7 @@ namespace Nektar m_base[i]->SetWaveSpace(true); } } - else if (m_HalfMode) + else if (m_halfMode) { //1 plane field (half mode expansion) const LibUtilities::PointsKey PkeyZ(m_npointsZ, @@ -1457,7 +1457,17 @@ namespace Nektar { } - + + /** + * Virtual function to define if operator in DoSolve is + * negated with regard to the strong form. This is currently + * only used in Arnoldi solves. Default is false. + */ + bool EquationSystem::v_NegatedOp(void) + { + return false; + } + /** * */ @@ -1480,6 +1490,7 @@ namespace Nektar { SessionSummary(l); } + /** * Write the field data to file. The file is named according to the session @@ -2231,7 +2242,7 @@ namespace Nektar AddSummaryItem(s, "Num. Hom. Modes (z)", m_npointsZ); AddSummaryItem(s, "Hom. length (LZ)", "m_LhomZ"); AddSummaryItem(s, "FFT Type", m_useFFT ? "FFTW" : "MVM"); - AddSummaryItem(s, "Selected Mode", m_MultipleModes + AddSummaryItem(s, "Selected Mode", m_multipleModes ? boost::lexical_cast<string>(m_NumMode) : "ALL"); } else if(m_HomogeneousType == eHomogeneous2D) diff --git a/library/SolverUtils/EquationSystem.h b/library/SolverUtils/EquationSystem.h index 91058dc07b87f55bd5830233acd1d043d9a7b07a..148885260c0fca9b20790c3269b3d08a42997d02 100644 --- a/library/SolverUtils/EquationSystem.h +++ b/library/SolverUtils/EquationSystem.h @@ -405,6 +405,9 @@ namespace Nektar SOLVER_UTILS_EXPORT int NoCaseStringCompare( const string & s1, const string& s2) ; + /// Virtual function to identify if operator is negated in DoSolve + SOLVER_UTILS_EXPORT virtual bool v_NegatedOp(); + protected: /// Communicator LibUtilities::CommSharedPtr m_comm; @@ -447,11 +450,11 @@ namespace Nektar /// Expansion dimension. int m_expdim; /// Flag to determine if single homogeneous mode is used. - bool m_SingleMode; + bool m_singleMode; /// Flag to determine if half homogeneous mode is used. - bool m_HalfMode; + bool m_halfMode; /// Flag to determine if use multiple homogenenous modes are used. - bool m_MultipleModes; + bool m_multipleModes; /// Flag to determine if FFT is used for homogeneous transform. bool m_useFFT; /** @@ -526,6 +529,7 @@ namespace Nektar /// Virtual function for solve implementation. SOLVER_UTILS_EXPORT virtual void v_DoSolve(); + /// Virtual function for the L_inf error computation between fields and a given exact solution. SOLVER_UTILS_EXPORT virtual NekDouble v_LinfError( unsigned int field, diff --git a/solvers/IncNavierStokesSolver/AdvectionTerms/AdjointAdvection.cpp b/solvers/IncNavierStokesSolver/AdvectionTerms/AdjointAdvection.cpp index 50600334ca0e88e1eb65574a339b38dd975ee2f5..2d2bfc8504ce8a7659346cf7b52b38f7bf3fcc7b 100644 --- a/solvers/IncNavierStokesSolver/AdvectionTerms/AdjointAdvection.cpp +++ b/solvers/IncNavierStokesSolver/AdvectionTerms/AdjointAdvection.cpp @@ -516,7 +516,7 @@ void AdjointAdvection::ImportFldBase(std::string pInfile, { std::string HomoStr = m_session->GetSolverInfo("HOMOGENEOUS"); } - + // copy FieldData into m_fields for(int j = 0; j < nvar; ++j) { @@ -678,14 +678,21 @@ void AdjointAdvection::DFT(const string file, m_interp[i]=Array<OneD,NekDouble>(npoints*m_slices); } - //Import the slides into auxiliary vector - //The base flow should be stored in the form filename_i.bse - for (int i=0; i< m_slices; ++i) + // Import the slides into auxiliary vector + // The base flow should be stored in the form "filename_%d.ext" + // A subdirectory can also be included, such as "dir/filename_%d.ext" + size_t found = file.find("%d"); + ASSERTL0(found != string::npos && file.find("%d", found+1) == string::npos, + "Since N_slices is specified, the filename provided for function " + "'BaseFlow' must include exactly one instance of the format " + "specifier '%d', to index the time-slices."); + char* buffer = new char[file.length() + 8]; + for (int i = 0; i < m_slices; ++i) { - char chkout[16] = ""; - sprintf(chkout, "%d", i); - ImportFldBase(file+"_"+chkout+".bse",pFields,i); + sprintf(buffer, file.c_str(), i); + ImportFldBase(buffer,pFields,i); } + delete[] buffer; // Discrete Fourier Transform of the fields diff --git a/solvers/IncNavierStokesSolver/AdvectionTerms/LinearisedAdvection.cpp b/solvers/IncNavierStokesSolver/AdvectionTerms/LinearisedAdvection.cpp index 77d8c431ba8b3f42b2ee725248a9510d2f194fe1..00429458431a872e2a8d98da1c85c7217af0ea15 100644 --- a/solvers/IncNavierStokesSolver/AdvectionTerms/LinearisedAdvection.cpp +++ b/solvers/IncNavierStokesSolver/AdvectionTerms/LinearisedAdvection.cpp @@ -179,7 +179,7 @@ void LinearisedAdvection::v_InitObject( { std::string ProjectStr = m_session->GetSolverInfo("PROJECTION"); - + if((ProjectStr == "Continuous")||(ProjectStr == "Galerkin")|| (ProjectStr == "CONTINUOUS")||(ProjectStr == "GALERKIN")) { @@ -577,7 +577,7 @@ void LinearisedAdvection::v_Advect( Vmath::Neg(nqtot,outarray[n],1); } } - + void LinearisedAdvection::v_SetBaseFlow( const Array<OneD, Array<OneD, NekDouble> > &inarray) { @@ -634,7 +634,7 @@ void LinearisedAdvection::ImportFldBase(std::string pInfile, { std::string HomoStr = m_session->GetSolverInfo("HOMOGENEOUS"); } - + // copy FieldData into m_fields for(int j = 0; j < nvar; ++j) { @@ -679,7 +679,7 @@ void LinearisedAdvection::ImportFldBase(std::string pInfile, ASSERTL0(flag, (std::string("Order of ") + pInfile + std::string(" data and that defined in " "m_boundaryconditions differs")).c_str()); - + pFields[j]->ExtractDataToCoeffs(FieldDef[i], FieldData[i], FieldDef[i]->m_fields[j], tmp_coeff); @@ -691,7 +691,7 @@ void LinearisedAdvection::ImportFldBase(std::string pInfile, //pFields[j]->SetWaveSpace(true); pFields[j]->GetPlane(0)->BwdTrans(tmp_coeff, m_baseflow[j]); - + if(m_SingleMode) { //copy the bwd into the second plane for single Mode Analysis @@ -714,7 +714,7 @@ void LinearisedAdvection::ImportFldBase(std::string pInfile, for(int i=0; i<nConvectiveFields;++i) { - + Vmath::Vcopy(nqtot, &m_baseflow[i][0], 1, &m_interp[i][slice*nqtot], 1); } @@ -773,7 +773,7 @@ DNekBlkMatSharedPtr LinearisedAdvection::GetFloquetBlockMatrix(FloquetMatType ma StdRegions::StdMatrixKey matkey(StdRegions::eFwdTrans, StdSeg.DetShapeType(), StdSeg); - + loc_mat = StdSeg.GetStdMatrix(matkey); // set up array of block matrices. @@ -801,36 +801,43 @@ void LinearisedAdvection::DFT(const string file, m_interp[i]=Array<OneD,NekDouble>(npoints*m_slices); } - //Import the slides into auxiliary vector - //The base flow should be stored in the form filename_i.bse - for (int i=0; i< m_slices; ++i) + // Import the slides into auxiliary vector + // The base flow should be stored in the form "filename_%d.ext" + // A subdirectory can also be included, such as "dir/filename_%d.ext" + size_t found = file.find("%d"); + ASSERTL0(found != string::npos && file.find("%d", found+1) == string::npos, + "Since N_slices is specified, the filename provided for function " + "'BaseFlow' must include exactly one instance of the format " + "specifier '%d', to index the time-slices."); + char* buffer = new char[file.length() + 8]; + for (int i = 0; i < m_slices; ++i) { - char chkout[16] = ""; - sprintf(chkout, "%d", i); - ImportFldBase(file+"_"+chkout+".bse",pFields,i); + sprintf(buffer, file.c_str(), i); + ImportFldBase(buffer,pFields,i); } + delete[] buffer; // Discrete Fourier Transform of the fields for(int k=0; k< ConvectedFields;++k) { #ifdef NEKTAR_USING_FFTW - + //Discrete Fourier Transform using FFTW Array<OneD, NekDouble> fft_in(npoints*m_slices); Array<OneD, NekDouble> fft_out(npoints*m_slices); - + Array<OneD, NekDouble> m_tmpIN(m_slices); Array<OneD, NekDouble> m_tmpOUT(m_slices); - + //Shuffle the data for(int j= 0; j < m_slices; ++j) { Vmath::Vcopy(npoints,&m_interp[k][j*npoints],1,&(fft_in[j]),m_slices); } - + m_FFT = LibUtilities::GetNektarFFTFactory().CreateInstance("NekFFTW", m_slices); - + //FFT Transform for(int i=0; i<npoints; i++) { @@ -842,7 +849,7 @@ void LinearisedAdvection::DFT(const string file, for(int s = 0; s < m_slices; ++s) { Vmath::Vcopy(npoints,&fft_out[s],m_slices,&m_interp[k][s*npoints],1); - + } Vmath::Zero(fft_in.num_elements(),&fft_in[0],1); diff --git a/solvers/IncNavierStokesSolver/CMakeLists.txt b/solvers/IncNavierStokesSolver/CMakeLists.txt index f92f92df05c82f5793e4e60abf731c52b04c4051..c4cafec3efa289b72be426cbb78e105ea0bc4915 100644 --- a/solvers/IncNavierStokesSolver/CMakeLists.txt +++ b/solvers/IncNavierStokesSolver/CMakeLists.txt @@ -20,6 +20,7 @@ IF( NEKTAR_SOLVER_INCNAVIERSTOKES ) ./Filters/FilterEnergy.cpp ./Filters/FilterMovingBody.cpp ./Forcing/ForcingMovingBody.cpp + ./Forcing/ForcingStabilityCoupledLNS.cpp ./IncNavierStokesSolver.cpp ) @@ -78,11 +79,18 @@ IF( NEKTAR_SOLVER_INCNAVIERSTOKES ) ADD_NEKTAR_TEST(ChanFlow_Standard_BodyForce) ADD_NEKTAR_TEST(Cyl_AdaptiveSFD) - #IF (NEKTAR_USING_ARPACK) - #ADD_NEKTAR_TEST(ChanStability_adj_Ar) ### - #ADD_NEKTAR_TEST(ChanStability_Coupled) ### - #ADD_NEKTAR_TEST(bfs_tg-AR) - #ENDIF (NEKTAR_USING_ARPACK) + ADD_NEKTAR_TEST(PPF_R10000_ModifiedArnoldi_Shift) + ADD_NEKTAR_TEST(PPF_R15000_ModifiedArnoldi_Shift) + + IF (NEKTAR_USE_ARPACK) + ADD_NEKTAR_TEST(ChanStability_adj_Ar) + ADD_NEKTAR_TEST(bfs_tg-AR) + ADD_NEKTAR_TEST(ChanStability_Coupled) + ADD_NEKTAR_TEST(PPF_R10000_Arpack_LM) + ADD_NEKTAR_TEST(PPF_R15000_Arpack_Shift) + #ADD_NEKTAR_TEST(PPF_R15000_Arpack_NoImagShift) + ADD_NEKTAR_TEST(PPF_R15000_Arpack_NoImagShift_LM) + ENDIF (NEKTAR_USE_ARPACK) IF (NEKTAR_USE_FFTW) ADD_NEKTAR_TEST(ChanFlow_3DH1D_FFT) diff --git a/solvers/IncNavierStokesSolver/EquationSystems/CoupledLinearNS.cpp b/solvers/IncNavierStokesSolver/EquationSystems/CoupledLinearNS.cpp index fba9694be5a86d228fd60f640479d89dcc8d3232..d6d7df4eb78952bdbbbb96019958f3e989851839 100644 --- a/solvers/IncNavierStokesSolver/EquationSystems/CoupledLinearNS.cpp +++ b/solvers/IncNavierStokesSolver/EquationSystems/CoupledLinearNS.cpp @@ -57,7 +57,6 @@ namespace Nektar CoupledLinearNS::CoupledLinearNS(const LibUtilities::SessionReaderSharedPtr &pSession): UnsteadySystem(pSession), IncNavierStokes(pSession), - m_singleMode(false), m_zeroMode(false) { } @@ -109,11 +108,10 @@ namespace Nektar // Set up Array of mappings m_locToGloMap = Array<OneD, CoupledLocalToGlobalC0ContMapSharedPtr> (nz); - if(m_session->DefinesSolverInfo("SingleMode")) + if(m_singleMode) { ASSERTL0(nz <=2 ,"For single mode calculation can only have nz <= 2"); - m_singleMode = true; if(m_session->DefinesSolverInfo("BetaZero")) { m_zeroMode = true; @@ -186,11 +184,10 @@ namespace Nektar NekDouble lambda_imag; - // load imaginary componont of any potential shift + // load imaginary component of any potential shift // Probably should be called from DriverArpack but not yet // clear how to do this m_session->LoadParameter("imagShift",lambda_imag,NekConstants::kNekUnsetDouble); - nz = 1; m_mat = Array<OneD, CoupledSolverMatrices> (nz); @@ -1239,68 +1236,68 @@ namespace Nektar SetInitialConditions(0.0); } - case eSteadyStokes: - SetUpCoupledMatrix(0.0); - break; - case eSteadyOseen: + case eSteadyStokes: + SetUpCoupledMatrix(0.0); + break; + case eSteadyOseen: + { + Array<OneD, Array<OneD, NekDouble> > AdvField(m_velocity.num_elements()); + for(int i = 0; i < m_velocity.num_elements(); ++i) + { + AdvField[i] = Array<OneD, NekDouble> (m_fields[m_velocity[i]]->GetTotPoints(),0.0); + } + + ASSERTL0(m_session->DefinesFunction("AdvectionVelocity"), + "Advection Velocity section must be defined in " + "session file."); + + std::vector<std::string> fieldStr; + for(int i = 0; i < m_velocity.num_elements(); ++i) + { + fieldStr.push_back(m_boundaryConditions->GetVariable(m_velocity[i])); + } + EvaluateFunction(fieldStr,AdvField,"AdvectionVelocity"); + + SetUpCoupledMatrix(0.0,AdvField,false); + } + break; + case eSteadyNavierStokes: + { + m_session->LoadParameter("KinvisMin", m_kinvisMin); + m_session->LoadParameter("KinvisPercentage", m_KinvisPercentage); + m_session->LoadParameter("Tolerence", m_tol); + m_session->LoadParameter("MaxIteration", m_maxIt); + m_session->LoadParameter("MatrixSetUpStep", m_MatrixSetUpStep); + m_session->LoadParameter("Restart", m_Restart); + + + DefineForcingTerm(); + + if (m_Restart == 1) + { + ASSERTL0(m_session->DefinesFunction("Restart"), + "Restart section must be defined in session file."); + + Array<OneD, Array<OneD, NekDouble> > Restart(m_velocity.num_elements()); + for(int i = 0; i < m_velocity.num_elements(); ++i) { - Array<OneD, Array<OneD, NekDouble> > AdvField(m_velocity.num_elements()); - for(int i = 0; i < m_velocity.num_elements(); ++i) - { - AdvField[i] = Array<OneD, NekDouble> (m_fields[m_velocity[i]]->GetTotPoints(),0.0); - } - - ASSERTL0(m_session->DefinesFunction("AdvectionVelocity"), - "Advection Velocity section must be defined in " - "session file."); - - std::vector<std::string> fieldStr; - for(int i = 0; i < m_velocity.num_elements(); ++i) - { - fieldStr.push_back(m_boundaryConditions->GetVariable(m_velocity[i])); - } - EvaluateFunction(fieldStr,AdvField,"AdvectionVelocity"); - - SetUpCoupledMatrix(0.0,AdvField,false); + Restart[i] = Array<OneD, NekDouble> (m_fields[m_velocity[i]]->GetTotPoints(),0.0); } - break; - case eSteadyNavierStokes: - { - m_session->LoadParameter("KinvisMin", m_kinvisMin); - m_session->LoadParameter("KinvisPercentage", m_KinvisPercentage); - m_session->LoadParameter("Tolerence", m_tol); - m_session->LoadParameter("MaxIteration", m_maxIt); - m_session->LoadParameter("MatrixSetUpStep", m_MatrixSetUpStep); - m_session->LoadParameter("Restart", m_Restart); - - - DefineForcingTerm(); - - if (m_Restart == 1) - { - ASSERTL0(m_session->DefinesFunction("Restart"), - "Restart section must be defined in session file."); - - Array<OneD, Array<OneD, NekDouble> > Restart(m_velocity.num_elements()); - for(int i = 0; i < m_velocity.num_elements(); ++i) - { - Restart[i] = Array<OneD, NekDouble> (m_fields[m_velocity[i]]->GetTotPoints(),0.0); - } - std::vector<std::string> fieldStr; - for(int i = 0; i < m_velocity.num_elements(); ++i) - { - fieldStr.push_back(m_boundaryConditions->GetVariable(m_velocity[i])); - } - EvaluateFunction(fieldStr, Restart, "Restart"); - - for(int i = 0; i < m_velocity.num_elements(); ++i) - { - m_fields[m_velocity[i]]->FwdTrans_IterPerExp(Restart[i], m_fields[m_velocity[i]]->UpdateCoeffs()); - } - cout << "Saving the RESTART file for m_kinvis = "<< m_kinvis << " (<=> Re = " << 1/m_kinvis << ")" <<endl; - } - else //We solve the Stokes Problem - { + std::vector<std::string> fieldStr; + for(int i = 0; i < m_velocity.num_elements(); ++i) + { + fieldStr.push_back(m_boundaryConditions->GetVariable(m_velocity[i])); + } + EvaluateFunction(fieldStr, Restart, "Restart"); + + for(int i = 0; i < m_velocity.num_elements(); ++i) + { + m_fields[m_velocity[i]]->FwdTrans_IterPerExp(Restart[i], m_fields[m_velocity[i]]->UpdateCoeffs()); + } + cout << "Saving the RESTART file for m_kinvis = "<< m_kinvis << " (<=> Re = " << 1/m_kinvis << ")" <<endl; + } + else //We solve the Stokes Problem + { /*Array<OneD, Array<OneD, NekDouble> >ZERO(m_velocity.num_elements()); * @@ -1318,35 +1315,35 @@ namespace Nektar m_initialStep = false; cout << "Saving the Stokes Flow for m_kinvis = "<< m_kinvis << " (<=> Re = " << 1/m_kinvis << ")" <<endl; } - } - break; - case eSteadyLinearisedNS: - { - SetInitialConditions(0.0); - - Array<OneD, Array<OneD, NekDouble> > AdvField(m_velocity.num_elements()); - for(int i = 0; i < m_velocity.num_elements(); ++i) - { - AdvField[i] = Array<OneD, NekDouble> (m_fields[m_velocity[i]]->GetTotPoints(),0.0); - } - - ASSERTL0(m_session->DefinesFunction("AdvectionVelocity"), - "Advection Velocity section must be defined in " - "session file."); - - std::vector<std::string> fieldStr; - for(int i = 0; i < m_velocity.num_elements(); ++i) - { - fieldStr.push_back(m_boundaryConditions->GetVariable(m_velocity[i])); - } - EvaluateFunction(fieldStr,AdvField,"AdvectionVelocity"); - - SetUpCoupledMatrix(m_lambda,AdvField,true); - } - break; - case eNoEquationType: - default: - ASSERTL0(false,"Unknown or undefined equation type for CoupledLinearNS"); + } + break; + case eSteadyLinearisedNS: + { + SetInitialConditions(0.0); + + Array<OneD, Array<OneD, NekDouble> > AdvField(m_velocity.num_elements()); + for(int i = 0; i < m_velocity.num_elements(); ++i) + { + AdvField[i] = Array<OneD, NekDouble> (m_fields[m_velocity[i]]->GetTotPoints(),0.0); + } + + ASSERTL0(m_session->DefinesFunction("AdvectionVelocity"), + "Advection Velocity section must be defined in " + "session file."); + + std::vector<std::string> fieldStr; + for(int i = 0; i < m_velocity.num_elements(); ++i) + { + fieldStr.push_back(m_boundaryConditions->GetVariable(m_velocity[i])); + } + EvaluateFunction(fieldStr,AdvField,"AdvectionVelocity"); + + SetUpCoupledMatrix(m_lambda,AdvField,true); + } + break; + case eNoEquationType: + default: + ASSERTL0(false,"Unknown or undefined equation type for CoupledLinearNS"); } } @@ -1354,7 +1351,7 @@ namespace Nektar Array<OneD, Array<OneD, NekDouble> > &outarray, const NekDouble time) { - // evaluate convectioln terms + // evaluate convection terms EvaluateAdvectionTerms(inarray,outarray); std::vector<SolverUtils::ForcingSharedPtr>::const_iterator x; @@ -1491,6 +1488,15 @@ namespace Nektar } + /** Virtual function to define if operator in DoSolve is negated + * with regard to the strong form. This is currently only used in + * Arnoldi solves. For Coupledd solver this is true since Stokes + * operator is set up as a LHS rather than RHS operation + */ + bool CoupledLinearNS::v_NegatedOp(void) + { + return true; + } void CoupledLinearNS::Solve(void) { @@ -1573,65 +1579,68 @@ namespace Nektar //while(max(Inf_norm[0], Inf_norm[1]) > m_tol) while(max(L2_norm[0], L2_norm[1]) > m_tol) { - if(m_counter == 1) //At the first Newton step, we use the solution of the Stokes problem (if Restart=0 in input file) - //Or the solution of the .rst file (if Restart=1 in input file) - { - for(int i = 0; i < m_velocity.num_elements(); ++i) - { - RHS_Coeffs[i] = Array<OneD, NekDouble> (m_fields[m_velocity[i]]->GetNcoeffs(),0.0); - RHS_Phys[i] = Array<OneD, NekDouble> (m_fields[m_velocity[i]]->GetTotPoints(),0.0); - } - - for(int i = 0; i < m_velocity.num_elements(); ++i) - { - m_fields[m_velocity[i]]->BwdTrans_IterPerExp(m_fields[m_velocity[i]]->GetCoeffs(), Velocity_Phys[i]); - } - - m_initialStep = true; - EvaluateNewtonRHS(Velocity_Phys, RHS_Coeffs); - SetUpCoupledMatrix(0.0, Velocity_Phys, true); - SolveLinearNS(RHS_Coeffs); - m_initialStep = false; - } - if(m_counter > 1) - { - EvaluateNewtonRHS(Velocity_Phys, RHS_Coeffs); - - if(m_counter%m_MatrixSetUpStep == 0) //Setting Up the matrix is expensive. We do it at each "m_MatrixSetUpStep" step. - { + if(m_counter == 1) + //At the first Newton step, we use the solution of the + //Stokes problem (if Restart=0 in input file) Or the + //solution of the .rst file (if Restart=1 in input + //file) + { + for(int i = 0; i < m_velocity.num_elements(); ++i) + { + RHS_Coeffs[i] = Array<OneD, NekDouble> (m_fields[m_velocity[i]]->GetNcoeffs(),0.0); + RHS_Phys[i] = Array<OneD, NekDouble> (m_fields[m_velocity[i]]->GetTotPoints(),0.0); + } + + for(int i = 0; i < m_velocity.num_elements(); ++i) + { + m_fields[m_velocity[i]]->BwdTrans_IterPerExp(m_fields[m_velocity[i]]->GetCoeffs(), Velocity_Phys[i]); + } + + m_initialStep = true; + EvaluateNewtonRHS(Velocity_Phys, RHS_Coeffs); + SetUpCoupledMatrix(0.0, Velocity_Phys, true); + SolveLinearNS(RHS_Coeffs); + m_initialStep = false; + } + if(m_counter > 1) + { + EvaluateNewtonRHS(Velocity_Phys, RHS_Coeffs); + + if(m_counter%m_MatrixSetUpStep == 0) //Setting Up the matrix is expensive. We do it at each "m_MatrixSetUpStep" step. + { SetUpCoupledMatrix(0.0, Velocity_Phys, true); } SolveLinearNS(RHS_Coeffs); - } - - for(int i = 0; i < m_velocity.num_elements(); ++i) - { - m_fields[m_velocity[i]]->BwdTrans_IterPerExp(RHS_Coeffs[i], RHS_Phys[i]); - m_fields[m_velocity[i]]->BwdTrans_IterPerExp(m_fields[m_velocity[i]]->GetCoeffs(), delta_velocity_Phys[i]); - } - - for(int i = 0; i < m_velocity.num_elements(); ++i) - { - Vmath::Vadd(Velocity_Phys[i].num_elements(),Velocity_Phys[i], 1, delta_velocity_Phys[i], 1, - Velocity_Phys[i], 1); - } - - //InfNorm(delta_velocity_Phys, Inf_norm); - L2Norm(delta_velocity_Phys, L2_norm); - - if(max(Inf_norm[0], Inf_norm[1]) > 100) - { - cout<<"\nThe Newton method has failed at m_kinvis = "<<m_kinvis<<" (<=> Re = " << 1/m_kinvis << ")"<< endl; - ASSERTL0(0, "The Newton method has failed... \n"); - } - - - cout << "\n"; - m_counter++; + } + + for(int i = 0; i < m_velocity.num_elements(); ++i) + { + m_fields[m_velocity[i]]->BwdTrans_IterPerExp(RHS_Coeffs[i], RHS_Phys[i]); + m_fields[m_velocity[i]]->BwdTrans_IterPerExp(m_fields[m_velocity[i]]->GetCoeffs(), delta_velocity_Phys[i]); + } + + for(int i = 0; i < m_velocity.num_elements(); ++i) + { + Vmath::Vadd(Velocity_Phys[i].num_elements(),Velocity_Phys[i], 1, delta_velocity_Phys[i], 1, + Velocity_Phys[i], 1); + } + + //InfNorm(delta_velocity_Phys, Inf_norm); + L2Norm(delta_velocity_Phys, L2_norm); + + if(max(Inf_norm[0], Inf_norm[1]) > 100) + { + cout<<"\nThe Newton method has failed at m_kinvis = "<<m_kinvis<<" (<=> Re = " << 1/m_kinvis << ")"<< endl; + ASSERTL0(0, "The Newton method has failed... \n"); + } + + + cout << "\n"; + m_counter++; } if (m_counter > 1) //We save u:=u+\delta u in u->Coeffs - { + { for(int i = 0; i < m_velocity.num_elements(); ++i) { m_fields[m_velocity[i]]->FwdTrans(Velocity_Phys[i], m_fields[m_velocity[i]]->UpdateCoeffs()); diff --git a/solvers/IncNavierStokesSolver/EquationSystems/CoupledLinearNS.h b/solvers/IncNavierStokesSolver/EquationSystems/CoupledLinearNS.h index 5f208e81e6ee8e6274e9bdc6ddb8a8b3bba557f6..0d4f0decebcb9dc9b571650b37e5fa5a4cfd611d 100644 --- a/solvers/IncNavierStokesSolver/EquationSystems/CoupledLinearNS.h +++ b/solvers/IncNavierStokesSolver/EquationSystems/CoupledLinearNS.h @@ -166,8 +166,6 @@ namespace Nektar virtual void v_InitObject(); private: - /// Identify if a single mode is required for stability analysis. - bool m_singleMode; /// Id to identify when single mode is mean mode (i.e. beta=0); bool m_zeroMode; @@ -209,6 +207,8 @@ namespace Nektar virtual void v_DoSolve(void); + virtual bool v_NegatedOp(void); + virtual void v_TransCoeffToPhys(void); virtual void v_TransPhysToCoeff(void); diff --git a/solvers/IncNavierStokesSolver/EquationSystems/CoupledLocalToGlobalC0ContMap.cpp b/solvers/IncNavierStokesSolver/EquationSystems/CoupledLocalToGlobalC0ContMap.cpp index 21a9d552d31d615aadec55a7e6d99c0d6064c8d4..51ebf088677f8ab78f4cf16919f084bc3d1af677 100644 --- a/solvers/IncNavierStokesSolver/EquationSystems/CoupledLocalToGlobalC0ContMap.cpp +++ b/solvers/IncNavierStokesSolver/EquationSystems/CoupledLocalToGlobalC0ContMap.cpp @@ -42,8 +42,8 @@ #include <MultiRegions/GlobalLinSysDirectStaticCond.h> namespace Nektar -{ - /** +{ + /** * This is an vector extension of * MultiRegions::AssemblyMapCG::SetUp2DExpansionC0ContMap related to the * Linearised Navier Stokes problem @@ -77,7 +77,8 @@ namespace Nektar Array<OneD, unsigned int> edgeInteriorMap; Array<OneD, int> edgeInteriorSign; int nvel = fields.num_elements(); - + MultiRegions::PeriodicMap::const_iterator pIt; + const LocalRegions::ExpansionVector &locExpVector = *(fields[0]->GetExp()); int eid, id, diff; int nel = fields[0]->GetNumElmts(); @@ -97,7 +98,7 @@ namespace Nektar { m_systemSingular = false; } - + /** * STEP 1: Wrap boundary conditions vector in an array * (since routine is set up for multiple fields) and call @@ -114,9 +115,9 @@ namespace Nektar Array<OneD, Array<OneD, const SpatialDomains::BoundaryConditionShPtr> > bndConditionsVec(nvel); for(i = 0; i < nvel; ++i) { - bndConditionsVec[i] = fields[i]->GetBndConditions(); + bndConditionsVec[i] = fields[i]->GetBndConditions(); } - + map<int,int> IsDirVertDof; map<int,int> IsDirEdgeDof; map<int,int>::iterator mapIt; @@ -133,7 +134,7 @@ namespace Nektar BndExpVids[g->GetVid(0)] = g->GetVid(0); BndExpVids[g->GetVid(1)] = g->GetVid(1); } - + for(i = 0; i < nvel; ++i) { if(bndConditionsVec[i][j]->GetBoundaryConditionType()==SpatialDomains::eDirichlet) @@ -145,19 +146,19 @@ namespace Nektar ->as<LocalRegions::Expansion1D>() ->GetGeom1D()->GetEid()] += 1; } - - + + // Set number of Dirichlet conditions at vertices // with a clamp on its maximum value being nvel to // handle corners between expansions for(mapIt = BndExpVids.begin(); mapIt != BndExpVids.end(); mapIt++) { - id = IsDirVertDof[mapIt->second]+1; + id = IsDirVertDof[mapIt->second]+1; IsDirVertDof[mapIt->second] = (id > nvel)?nvel:id; } } else - { + { // Check to see that edge normals have non-zero // component in this direction since otherwise // also can be singular. @@ -170,7 +171,7 @@ namespace Nektar ->as<LocalRegions::Expansion1D>(); locnorm = loc_exp->GetLeftAdjacentElementExp()->GetEdgeNormal(loc_exp->GetLeftAdjacentElementEdge()); //locnorm = bndCondExp[j]->GetExp(k)->Get GetMetricInfo()->GetNormal(); - + int ndir = locnorm.num_elements(); if(i < ndir) // account for Fourier version where n can be larger then ndir { @@ -215,7 +216,7 @@ namespace Nektar break; } } - + ASSERTL0(id != -1," Did not find an edge to attach singular pressure degree of freedom"); // determine element with this edge id. There may be a @@ -226,14 +227,14 @@ namespace Nektar { edgeId = (locExpVector[i]->as<LocalRegions::Expansion2D>() ->GetGeom2D())->GetEid(j); - + if(edgeId == id) { AddMeanPressureToEdgeId[i] = id; break; } } - + if(AddMeanPressureToEdgeId[i] != -1) { break; @@ -252,11 +253,11 @@ namespace Nektar if(Dofs[0].count(vertId) == 0) { Dofs[0][vertId] = nvel*nz_loc; - + // Adjust for a Dirichlet boundary condition to give number to be solved if(IsDirVertDof.count(vertId) != 0) { - Dofs[0][vertId] -= IsDirVertDof[vertId]*nz_loc; + Dofs[0][vertId] -= IsDirVertDof[vertId]*nz_loc; } } @@ -266,7 +267,7 @@ namespace Nektar { Dofs[1][edgeId] = nvel*(locExpVector[eid]->GetEdgeNcoeffs(j)-2)*nz_loc; } - + // Adjust for Dirichlet boundary conditions to give number to be solved if(IsDirEdgeDof.count(edgeId) != 0) { @@ -290,29 +291,29 @@ namespace Nektar firstNonDirGraphVertId, nExtraDirichlet, bottomUpGraph, extraDir, false, 4); */ - + /** * STEP 2a: Set the mean pressure modes to edges depending on * type of direct solver technique; */ - + // determine which edge to add mean pressure dof based on // ensuring that at least one pressure dof from an internal // patch is associated with its boundary system if(m_session->MatchSolverInfoAsEnum("GlobalSysSoln", MultiRegions::eDirectMultiLevelStaticCond)) { - + FindEdgeIdToAddMeanPressure(ReorderedGraphVertId, nel, locExpVector, edgeId, vertId, firstNonDirGraphVertId, IsDirEdgeDof, bottomUpGraph, AddMeanPressureToEdgeId); - } - - // Set unset elmts to non-Dirichlet edges. + } + + // Set unset elmts to non-Dirichlet edges. // special case of singular problem - need to fix one - // pressure dof to a dirichlet edge + // pressure dof to a dirichlet edge for(i = 0; i < nel; ++i) { eid = fields[0]->GetOffset_Elmt_Id(i); @@ -336,9 +337,9 @@ namespace Nektar // Add the mean pressure degree of freedom to this edge Dofs[1][AddMeanPressureToEdgeId[eid]] += nz_loc; } - + map<int,int> pressureEdgeOffset; - + /** * STEP 2: Count out the number of Dirichlet vertices and edges first */ @@ -381,7 +382,7 @@ namespace Nektar */ Array<OneD, int> graphVertOffset(nvel*nz_loc*(ReorderedGraphVertId[0].size() + ReorderedGraphVertId[1].size()),0); graphVertOffset[0] = 0; - + m_signChange = false; for(i = 0; i < nel; ++i) @@ -402,7 +403,7 @@ namespace Nektar graphVertOffset[ReorderedGraphVertId[0][meshVertId]*nvel*nz_loc+k] = 1; graphVertOffset[ReorderedGraphVertId[1][meshEdgeId]*nvel*nz_loc+k] = (nEdgeCoeffs-2); } - + bType = locExpansion->GetEdgeBasisType(j); // need a sign vector for modal expansions if nEdgeCoeffs >=4 if( (nEdgeCoeffs >= 4)&& @@ -414,18 +415,18 @@ namespace Nektar } } - // Add mean pressure modes; + // Add mean pressure modes; for(i = 0; i < nel; ++i) { graphVertOffset[(ReorderedGraphVertId[1][AddMeanPressureToEdgeId[i]]+1)*nvel*nz_loc-1] += nz_loc; //graphVertOffset[(ReorderedGraphVertId[1][AddMeanPressureToEdgeId[i]])*nvel*nz_loc] += nz_loc; } - + // Negate the vertices and edges with only a partial // Dirichlet conditon. Essentially we check to see if an edge // has a mixed Dirichlet with Neumann/Robin Condition and if - // so negate the offset associated with this vertex. - + // so negate the offset associated with this vertex. + map<int,int> DirVertChk; for(i = 0; i < bndConditionsVec[0].num_elements(); ++i) @@ -438,9 +439,9 @@ namespace Nektar cnt ++; } } - + // Case where partial Dirichlet boundary condition - if((cnt > 0)&&(cnt < nvel)) + if((cnt > 0)&&(cnt < nvel)) { for(j = 0; j < nvel; ++j) { @@ -459,7 +460,7 @@ namespace Nektar DirVertChk[id*nvel+j] = 1; for(n = 0; n < nz_loc; ++n) { - graphVertOffset[ReorderedGraphVertId[0][id]*nvel*nz_loc+j*nz_loc + n] *= -1; + graphVertOffset[ReorderedGraphVertId[0][id]*nvel*nz_loc+j*nz_loc + n] *= -1; } } @@ -474,42 +475,42 @@ namespace Nektar graphVertOffset[ReorderedGraphVertId[0][id]*nvel*nz_loc+j*nz_loc+n] *= -1; } } - - // edges with mixed id; + + // edges with mixed id; id = bndCondExp[i]->GetExp(k) ->as<LocalRegions::Expansion1D>() ->GetGeom1D()->GetEid(); for(n = 0; n < nz_loc; ++n) { - graphVertOffset[ReorderedGraphVertId[1][id]*nvel*nz_loc+j*nz_loc +n] *= -1; + graphVertOffset[ReorderedGraphVertId[1][id]*nvel*nz_loc+j*nz_loc +n] *= -1; } } } } } } - + cnt = 0; - // assemble accumulative list of full Dirichlet values. + // assemble accumulative list of full Dirichlet values. for(i = 0; i < firstNonDirGraphVertId*nvel*nz_loc; ++i) { - diff = abs(graphVertOffset[i]); - graphVertOffset[i] = cnt; + diff = abs(graphVertOffset[i]); + graphVertOffset[i] = cnt; cnt += diff; } - + // set Dirichlet values with negative values to Dirichlet value for(i = firstNonDirGraphVertId*nvel*nz_loc; i < graphVertOffset.num_elements(); ++i) { if(graphVertOffset[i] < 0) { - diff = -graphVertOffset[i]; - graphVertOffset[i] = -cnt; + diff = -graphVertOffset[i]; + graphVertOffset[i] = -cnt; cnt += diff; } } - + // Accumulate all interior degrees of freedom with positive values m_numGlobalDirBndCoeffs = cnt; @@ -518,9 +519,9 @@ namespace Nektar { if(graphVertOffset[i] >= 0) { - diff = graphVertOffset[i]; - graphVertOffset[i] = cnt; - cnt += diff; + diff = graphVertOffset[i]; + graphVertOffset[i] = cnt; + cnt += diff; } } @@ -530,14 +531,14 @@ namespace Nektar { if(graphVertOffset[i] < 0) { - graphVertOffset[i] = -graphVertOffset[i]; + graphVertOffset[i] = -graphVertOffset[i]; } } // Allocate the proper amount of space for the class-data and fill // information that is already known - cnt = 0; + cnt = 0; m_numLocalBndCoeffs = 0; m_numLocalCoeffs = 0; @@ -550,21 +551,21 @@ namespace Nektar m_numLocalCoeffs += (pressure->GetExp(i)->GetNcoeffs()-1)*nz_loc; } - m_numLocalCoeffs += m_numLocalBndCoeffs; + m_numLocalCoeffs += m_numLocalBndCoeffs; m_localToGlobalMap = Array<OneD, int>(m_numLocalCoeffs,-1); m_localToGlobalBndMap = Array<OneD, int>(m_numLocalBndCoeffs,-1); m_bndCondCoeffsToGlobalCoeffsMap = Array<OneD, int>(nLocBndCondDofs,-1); - - // Set default sign array. + + // Set default sign array. m_localToGlobalSign = Array<OneD, NekDouble>(m_numLocalCoeffs,1.0); m_localToGlobalBndSign = Array<OneD, NekDouble>(m_numLocalBndCoeffs,1.0); m_staticCondLevel = staticCondLevel; m_numPatches = nel; - + m_numLocalBndCoeffsPerPatch = Array<OneD, unsigned int>(nel); m_numLocalIntCoeffsPerPatch = Array<OneD, unsigned int>(nel); @@ -573,7 +574,7 @@ namespace Nektar m_numLocalBndCoeffsPerPatch[i] = (unsigned int) nz_loc*(nvel*locExpVector[fields[0]->GetOffset_Elmt_Id(i)]->NumBndryCoeffs() + 1); m_numLocalIntCoeffsPerPatch[i] = (unsigned int) nz_loc*(pressure->GetExp(i)->GetNcoeffs()-1); } - + /** * STEP 4: Now, all ingredients are ready to set up the actual * local to global mapping. @@ -586,8 +587,8 @@ namespace Nektar cnt = 0; int nv,velnbndry; Array<OneD, unsigned int> bmap; - - + + // Loop over all the elements in the domain in shuffled // ordering (element type consistency) for(i = 0; i < nel; ++i) @@ -607,7 +608,7 @@ namespace Nektar { inv_bmap[bmap[j]] = j; } - + // Loop over all edges (and vertices) of element i for(j = 0; j < locExpansion->GetNedges(); ++j) { @@ -618,10 +619,23 @@ namespace Nektar ->GetGeom2D())->GetEid(j); meshVertId = (locExpansion->as<LocalRegions::Expansion2D>() ->GetGeom2D())->GetVid(j); - + + pIt = periodicEdges.find(meshEdgeId); + + // See if this edge is periodic. If it is, then we map all + // edges to the one with lowest ID, and align all + // coefficients to this edge orientation. + if (pIt != periodicEdges.end()) + { + pair<int, StdRegions::Orientation> idOrient = + DeterminePeriodicEdgeOrientId( + meshEdgeId, edgeOrient, pIt->second); + edgeOrient = idOrient.second; + } + locExpansion->GetEdgeInteriorMap(j,edgeOrient,edgeInteriorMap,edgeInteriorSign); // Set the global DOF for vertex j of element i - + for(nv = 0; nv < nvel*nz_loc; ++nv) { m_localToGlobalMap[cnt+nv*velnbndry+inv_bmap[locExpansion->GetVertexMap(j)]] = graphVertOffset[ReorderedGraphVertId[0][meshVertId]*nvel*nz_loc+ nv]; @@ -631,7 +645,7 @@ namespace Nektar m_localToGlobalMap[cnt+nv*velnbndry+inv_bmap[edgeInteriorMap[k]]] = graphVertOffset[ReorderedGraphVertId[1][meshEdgeId]*nvel*nz_loc+nv]+k; } } - + // Fill the sign vector if required if(m_signChange) { @@ -645,20 +659,20 @@ namespace Nektar } } - // use difference between two edges of the AddMeanPressureEdgeId to det nEdgeInteriorCoeffs. + // use difference between two edges of the AddMeanPressureEdgeId to det nEdgeInteriorCoeffs. nEdgeInteriorCoeffs = graphVertOffset[(ReorderedGraphVertId[1][AddMeanPressureToEdgeId[eid]])*nvel*nz_loc+1] - graphVertOffset[(ReorderedGraphVertId[1][AddMeanPressureToEdgeId[eid]])*nvel*nz_loc]; int psize = pressure->GetExp(eid)->GetNcoeffs(); for(n = 0; n < nz_loc; ++n) { m_localToGlobalMap[cnt + nz_loc*nvel*velnbndry + n*psize] = graphVertOffset[(ReorderedGraphVertId[1][AddMeanPressureToEdgeId[eid]]+1)*nvel*nz_loc-1]+nEdgeInteriorCoeffs + pressureEdgeOffset[AddMeanPressureToEdgeId[eid]]; - + pressureEdgeOffset[AddMeanPressureToEdgeId[eid]] += 1; } - + cnt += (velnbndry*nvel+ psize)*nz_loc; } - + // Set up the mapping for the boundary conditions offset = cnt = 0; for(nv = 0; nv < nvel; ++nv) @@ -679,7 +693,7 @@ namespace Nektar meshVertId = (bndSegExp->GetGeom1D())->GetVid(k); m_bndCondCoeffsToGlobalCoeffsMap[cnt+bndSegExp->GetVertexMap(k)] = graphVertOffset[ReorderedGraphVertId[0][meshVertId]*nvel*nz_loc+nv*nz_loc+n]; } - + meshEdgeId = (bndSegExp->GetGeom1D())->GetEid(); bndEdgeCnt = 0; nEdgeCoeffs = bndSegExp->GetNcoeffs(); @@ -692,19 +706,19 @@ namespace Nektar bndEdgeCnt++; } } - ncoeffcnt += nEdgeCoeffs; + ncoeffcnt += nEdgeCoeffs; } // Note: Can not use bndCondExp[i]->GetNcoeffs() // due to homogeneous extension not returning just // the value per plane - offset += ncoeffcnt; + offset += ncoeffcnt; } } } - + globalId = Vmath::Vmax(m_numLocalCoeffs,&m_localToGlobalMap[0],1)+1; - m_numGlobalBndCoeffs = globalId; - + m_numGlobalBndCoeffs = globalId; + /** * STEP 5: The boundary condition mapping is generated from the * same vertex renumbering and fill in a unique interior map. @@ -748,27 +762,27 @@ namespace Nektar meshVertId = (locExpansion ->as<LocalRegions::Expansion2D>() ->GetGeom2D())->GetVid(j); - - if(ReorderedGraphVertId[0][meshVertId] >= + + if(ReorderedGraphVertId[0][meshVertId] >= firstNonDirGraphVertId) { vwgts_perm[ReorderedGraphVertId[0][meshVertId]- - firstNonDirGraphVertId] = + firstNonDirGraphVertId] = Dofs[0][meshVertId]; } - - if(ReorderedGraphVertId[1][meshEdgeId] >= + + if(ReorderedGraphVertId[1][meshEdgeId] >= firstNonDirGraphVertId) { vwgts_perm[ReorderedGraphVertId[1][meshEdgeId]- - firstNonDirGraphVertId] = + firstNonDirGraphVertId] = Dofs[1][meshEdgeId]; } } } bottomUpGraph->ExpandGraphWithVertexWeights(vwgts_perm); - + m_nextLevelLocalToGlobalMap = MemoryManager<AssemblyMap>:: AllocateSharedPtr(this,bottomUpGraph); } @@ -783,26 +797,26 @@ void CoupledLocalToGlobalC0ContMap::FindEdgeIdToAddMeanPressure(vector<map<int,i MultiRegions::BottomUpSubStructuredGraphSharedPtr &bottomUpGraph, Array<OneD, int> &AddMeanPressureToEdgeId) { - + int i,j,k; - + // Make list of homogeneous graph edges to elmt mappings Array<TwoD, int> EdgeIdToElmts(ReorderedGraphVertId[1].size(),2,-1); map<int,int> HomGraphEdgeIdToEdgeId; - + for(i = 0; i < nel; ++i) { for(j = 0; j < locExpVector[i]->GetNverts(); ++j) { edgeId = (locExpVector[i]->as<LocalRegions::Expansion2D>() ->GetGeom2D())->GetEid(j); - - // note second condition stops us using mixed boundary condition + + // note second condition stops us using mixed boundary condition if((ReorderedGraphVertId[1][edgeId] >= firstNonDirGraphVertId) && (IsDirEdgeDof.count(edgeId) == 0)) { HomGraphEdgeIdToEdgeId[ReorderedGraphVertId[1][edgeId]-firstNonDirGraphVertId] = edgeId; - + if(EdgeIdToElmts[edgeId][0] == -1) { EdgeIdToElmts[edgeId][0] = i; @@ -814,23 +828,23 @@ void CoupledLocalToGlobalC0ContMap::FindEdgeIdToAddMeanPressure(vector<map<int,i } } } - - + + map<int,int>::iterator mapIt; - + // Start at second to last level and find edge on boundary // to attach element int nlevels = bottomUpGraph->GetNlevels(); - + // determine a default edge to attach pressure modes to // which is part of the inner solve; int defedge = -1; - + vector<MultiRegions::SubGraphSharedPtr> bndgraphs = bottomUpGraph->GetInteriorBlocks(nlevels); for(i = 0; i < bndgraphs.size(); ++i) { int GlobIdOffset = bndgraphs[i]->GetIdOffset(); - + for(j = 0; j < bndgraphs[i]->GetNverts(); ++j) { // find edge in graph vert list @@ -850,27 +864,27 @@ void CoupledLocalToGlobalC0ContMap::FindEdgeIdToAddMeanPressure(vector<map<int,i break; } } - + for(int n = 1; n < nlevels; ++n) { // produce a map with a key that is the element id // that contains which next level patch it belongs to vector<MultiRegions::SubGraphSharedPtr> bndgraphs = bottomUpGraph->GetInteriorBlocks(n+1); - + // Fill next level graph of adjacent elements and their level map<int,int> ElmtInBndry; - + for(i = 0; i < bndgraphs.size(); ++i) { int GlobIdOffset = bndgraphs[i]->GetIdOffset(); - + for(j = 0; j < bndgraphs[i]->GetNverts(); ++j) { // find edge in graph vert list if(HomGraphEdgeIdToEdgeId.count(GlobIdOffset+j) != 0) { - edgeId = HomGraphEdgeIdToEdgeId[GlobIdOffset+j]; - + edgeId = HomGraphEdgeIdToEdgeId[GlobIdOffset+j]; + if(EdgeIdToElmts[edgeId][0] != -1) { ElmtInBndry[EdgeIdToElmts[edgeId][0]] = i; @@ -882,7 +896,7 @@ void CoupledLocalToGlobalC0ContMap::FindEdgeIdToAddMeanPressure(vector<map<int,i } } } - + // Now search interior patches in this level for edges // that share the same element as a boundary edge and // assign this elmt that boundary edge @@ -890,42 +904,42 @@ void CoupledLocalToGlobalC0ContMap::FindEdgeIdToAddMeanPressure(vector<map<int,i for(i = 0; i < intgraphs.size(); ++i) { int GlobIdOffset = intgraphs[i]->GetIdOffset(); - bool SetEdge = false; + bool SetEdge = false; int elmtid = 0; for(j = 0; j < intgraphs[i]->GetNverts(); ++j) { - // Check to see if graph vert is an edge + // Check to see if graph vert is an edge if(HomGraphEdgeIdToEdgeId.count(GlobIdOffset+j) != 0) { edgeId = HomGraphEdgeIdToEdgeId[GlobIdOffset+j]; - + for(k = 0; k < 2; ++k) { // relevant edge id elmtid = EdgeIdToElmts[edgeId][k]; - + if(elmtid != -1) { mapIt = ElmtInBndry.find(elmtid); - + if(mapIt != ElmtInBndry.end()) { - // now find a edge in the next level boundary graph + // now find a edge in the next level boundary graph int GlobIdOffset1 = bndgraphs[mapIt->second]->GetIdOffset(); for(int l = 0; l < bndgraphs[mapIt->second]->GetNverts(); ++l) { // find edge in graph vert list if(HomGraphEdgeIdToEdgeId.count(GlobIdOffset1+l) != 0) { - //June 2012: commenting this condition apparently + //June 2012: commenting this condition apparently //solved the bug caused by the edge reordering procedure - + //if(AddMeanPressureToEdgeId[elmtid] == -1) //{ - + //AddMeanPressureToEdgeId[elmtid] = HomGraphEdgeIdToEdgeId[GlobIdOffset1+l]; AddMeanPressureToEdgeId[elmtid] = defedge; - + //} SetEdge = true; break; @@ -936,15 +950,15 @@ void CoupledLocalToGlobalC0ContMap::FindEdgeIdToAddMeanPressure(vector<map<int,i } } } - - + + // if we have failed to find matching edge in next // level patch boundary then set last found elmt // associated to this interior patch to the // default edget value if(SetEdge == false) { - if(elmtid == -1) // find an elmtid in patch + if(elmtid == -1) // find an elmtid in patch { for(j = 0; j < intgraphs[i]->GetNverts(); ++j) { @@ -974,7 +988,7 @@ void CoupledLocalToGlobalC0ContMap::FindEdgeIdToAddMeanPressure(vector<map<int,i } } } - + } diff --git a/solvers/IncNavierStokesSolver/EquationSystems/IncNavierStokes.cpp b/solvers/IncNavierStokesSolver/EquationSystems/IncNavierStokes.cpp index a3263ea77f01fc206f381cde37263298c68268f7..4e9fe155a259e093f3e44591d4b7fc694c0e6044 100644 --- a/solvers/IncNavierStokesSolver/EquationSystems/IncNavierStokes.cpp +++ b/solvers/IncNavierStokesSolver/EquationSystems/IncNavierStokes.cpp @@ -148,22 +148,24 @@ namespace Nektar std::string vConvectiveType; switch(m_equationType) { - case eUnsteadyStokes: - vConvectiveType = "NoAdvection"; - break; - case eUnsteadyNavierStokes: - case eSteadyNavierStokes: - vConvectiveType = "Convective"; - break; - case eUnsteadyLinearisedNS: - vConvectiveType = "Linearised"; - break; - default: - break; + case eUnsteadyStokes: + case eSteadyLinearisedNS: + vConvectiveType = "NoAdvection"; + break; + case eUnsteadyNavierStokes: + case eSteadyNavierStokes: + vConvectiveType = "Convective"; + break; + case eUnsteadyLinearisedNS: + vConvectiveType = "Linearised"; + break; + default: + break; } // Check if advection type overridden - if (m_session->DefinesTag("AdvectiveType") && m_equationType != eUnsteadyStokes) + if (m_session->DefinesTag("AdvectiveType") && m_equationType != eUnsteadyStokes && + m_equationType != eSteadyLinearisedNS) { vConvectiveType = m_session->GetTag("AdvectiveType"); } @@ -327,7 +329,7 @@ namespace Nektar for(i = 0; i < VelDim; ++i) { - if(m_fields[i]->GetWaveSpace() && !m_SingleMode && !m_HalfMode) + if(m_fields[i]->GetWaveSpace() && !m_singleMode && !m_halfMode) { velocity[i] = Array<OneD, NekDouble>(nqtot,0.0); m_fields[i]->HomogeneousBwdTrans(inarray[m_velocity[i]],velocity[i]); diff --git a/solvers/IncNavierStokesSolver/EquationSystems/VelocityCorrectionScheme.cpp b/solvers/IncNavierStokesSolver/EquationSystems/VelocityCorrectionScheme.cpp index f5ece24d587a1d1396155aa43d9be72915f6b295..649d5634695b8c091201e0bcf4247caff274f997 100644 --- a/solvers/IncNavierStokesSolver/EquationSystems/VelocityCorrectionScheme.cpp +++ b/solvers/IncNavierStokesSolver/EquationSystems/VelocityCorrectionScheme.cpp @@ -113,7 +113,7 @@ namespace Nektar if(m_HomogeneousType == eHomogeneous1D) { - ASSERTL0(m_nConvectiveFields > 2,"Expect to have three velcoity fields with homogenous expansion"); + ASSERTL0(m_nConvectiveFields > 2,"Expect to have three velocity fields with homogenous expansion"); if(m_useHomo1DSpecVanVisc == false) { diff --git a/solvers/IncNavierStokesSolver/Forcing/ForcingStabilityCoupledLNS.cpp b/solvers/IncNavierStokesSolver/Forcing/ForcingStabilityCoupledLNS.cpp new file mode 100644 index 0000000000000000000000000000000000000000..78f3199f15ceaf11c1c452d2816c24d143472bf7 --- /dev/null +++ b/solvers/IncNavierStokesSolver/Forcing/ForcingStabilityCoupledLNS.cpp @@ -0,0 +1,80 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// File: ForcingStabilityCoupledLNS.cpp +// +// For more information, please see: http://www.nektar.info +// +// The MIT License +// +// Copyright (c) 2006 Division of Applied Mathematics, Brown University (USA), +// Department of Aeronautics, Imperial College London (UK), and Scientific +// Computing and Imaging Institute, University of Utah (USA). +// +// License for the specific language governing rights and limitations under +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. +// +// Description: Copy velocity field into forcing terms for stability +// analysis of coupled solver. +// +/////////////////////////////////////////////////////////////////////////////// + +#include <IncNavierStokesSolver/Forcing/ForcingStabilityCoupledLNS.h> +#include <MultiRegions/ExpList.h> + +namespace Nektar +{ +std::string ForcingStabilityCoupledLNS::className = SolverUtils::GetForcingFactory(). + RegisterCreatorFunction("StabilityCoupledLNS", + ForcingStabilityCoupledLNS::create, + "RHS forcing for coupled LNS stability solver"); + +ForcingStabilityCoupledLNS::ForcingStabilityCoupledLNS( + const LibUtilities::SessionReaderSharedPtr& pSession) + : Forcing(pSession) +{ +} + +void ForcingStabilityCoupledLNS::v_InitObject( + const Array<OneD, MultiRegions::ExpListSharedPtr>& pFields, + const unsigned int& pNumForcingFields, + const TiXmlElement* pForce) +{ +} + +void ForcingStabilityCoupledLNS::v_Apply( + const Array<OneD, MultiRegions::ExpListSharedPtr>& fields, + const Array<OneD, Array<OneD, NekDouble> >& inarray, + Array<OneD, Array<OneD, NekDouble> >& outarray, + const NekDouble& time) +{ + int npts = fields[0]->GetTotPoints(); + + ASSERTL1(fields.num_elements() == outarray.num_elements(), + "Fields and outarray are of different size"); + + // Apply m_forcing terms + for (int i = 0; i < fields.num_elements(); i++) + { + Vmath::Vadd(npts, fields[i]->GetPhys(), 1, outarray[i], 1, + outarray[i], 1); + } + +} + +} diff --git a/solvers/IncNavierStokesSolver/Forcing/ForcingStabilityCoupledLNS.h b/solvers/IncNavierStokesSolver/Forcing/ForcingStabilityCoupledLNS.h new file mode 100644 index 0000000000000000000000000000000000000000..d5c5c25e568f398310e74ca274ba6d68697f1be5 --- /dev/null +++ b/solvers/IncNavierStokesSolver/Forcing/ForcingStabilityCoupledLNS.h @@ -0,0 +1,89 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// File: ForcingStabilityCoupledLNS.h +// +// For more information, please see: http://www.nektar.info +// +// The MIT License +// +// Copyright (c) 2006 Division of Applied Mathematics, Brown University (USA), +// Department of Aeronautics, Imperial College London (UK), and Scientific +// Computing and Imaging Institute, University of Utah (USA). +// +// License for the specific language governing rights and limitations under +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. +// +// Description: Forcing to copy velocity field in steady coupled LNS stability +// +/////////////////////////////////////////////////////////////////////////////// + +#ifndef NEKTAR_SOLVERUTILS_FORCINGSTABILITYCOUPLEDLNS +#define NEKTAR_SOLVERUTILS_FORCINGSTABILITYCOUPLEDLNS + +#include <LibUtilities/BasicUtils/NekFactory.hpp> +#include <LibUtilities/BasicUtils/SharedArray.hpp> +#include <SolverUtils/SolverUtilsDeclspec.h> +#include <SolverUtils/Forcing/Forcing.h> + +namespace Nektar +{ + +class ForcingStabilityCoupledLNS : public SolverUtils::Forcing +{ + public: + + friend class MemoryManager<ForcingStabilityCoupledLNS>; + + /// Creates an instance of this class + static SolverUtils::ForcingSharedPtr create( + const LibUtilities::SessionReaderSharedPtr& pSession, + const Array<OneD, MultiRegions::ExpListSharedPtr>& pFields, + const unsigned int& pNumForcingFields, + const TiXmlElement* pForce) + { + SolverUtils::ForcingSharedPtr p = + MemoryManager<ForcingStabilityCoupledLNS>:: + AllocateSharedPtr(pSession); + p->InitObject(pFields, pNumForcingFields, pForce); + return p; + } + + ///Name of the class + static std::string className; + + protected: + virtual void v_InitObject( + const Array<OneD, MultiRegions::ExpListSharedPtr>& pFields, + const unsigned int& pNumForcingFields, + const TiXmlElement* pForce); + + virtual void v_Apply( + const Array<OneD, MultiRegions::ExpListSharedPtr>& fields, + const Array<OneD, Array<OneD, NekDouble> >& inarray, + Array<OneD, Array<OneD, NekDouble> >& outarray, + const NekDouble& time); + + private: + ForcingStabilityCoupledLNS( + const LibUtilities::SessionReaderSharedPtr& pSession); +}; + +} + +#endif diff --git a/solvers/IncNavierStokesSolver/Tests/ChanStability_Coupled.tst b/solvers/IncNavierStokesSolver/Tests/ChanStability_Coupled.tst index 7a0cb6292d76abb1c4df5f3f093145098e74331d..380d0f33197f926377fe9f58a3e06030b5a1f11f 100644 --- a/solvers/IncNavierStokesSolver/Tests/ChanStability_Coupled.tst +++ b/solvers/IncNavierStokesSolver/Tests/ChanStability_Coupled.tst @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <test> - <description>Linear stability with coupled solver (Arpack): Channel</description> + <description>Linear stability with coupled solver (Arpack LI): Channel Largest real Ev = (0.00223554,+/-0.249844i)</description> <executable>IncNavierStokesSolver</executable> <parameters>ChanStability_Coupled.xml</parameters> <files> @@ -9,12 +9,12 @@ </files> <metrics> <metric type="L2" id="1"> - <value variable="u" tolerance="100">2.58948</value> - <value variable="v" tolerance="100">0.000352934</value> + <value variable="u" tolerance="0.0001">2.58904</value> + <value variable="v" tolerance="0.0001">0.00277094</value> </metric> <metric type="Linf" id="2"> - <value variable="u" tolerance="100">1.01298</value> - <value variable="v" tolerance="100">0.000295924</value> + <value variable="u" tolerance="0.00001">1.00159</value> + <value variable="v" tolerance="0.00001">0.00375125</value> </metric> </metrics> </test> diff --git a/solvers/IncNavierStokesSolver/Tests/ChanStability_Coupled.xml b/solvers/IncNavierStokesSolver/Tests/ChanStability_Coupled.xml index 9e10192fceaa1a9956ab3d65d97007892e457025..83163ed2095aa2857197cd6dcc6e8ae7f1bd081f 100644 --- a/solvers/IncNavierStokesSolver/Tests/ChanStability_Coupled.xml +++ b/solvers/IncNavierStokesSolver/Tests/ChanStability_Coupled.xml @@ -253,6 +253,7 @@ <I PROPERTY="TimeIntegrationMethod" VALUE="IMEXOrder1" /> <I PROPERTY="Driver" VALUE="Arpack" /> <I PROPERTY="ArpackProblemType" VALUE="LargestImag" /> + <I PROPERTY="InitialVector" VALUE="Random" /> </SOLVERINFO> <PARAMETERS> @@ -262,8 +263,8 @@ <P> IO_InfoSteps = 20 </P> <P> Re = 7500 </P> <P> Kinvis = 1.0/Re </P> - <P> kdim = 16 </P> - <P> nev =2 </P> + <P> kdim = 64 </P> + <P> nev = 4 </P> </PARAMETERS> <VARIABLES> @@ -276,7 +277,7 @@ <B ID="1"> C[2] </B> <B ID="2"> C[3] </B> </BOUNDARYREGIONS> - + <BOUNDARYCONDITIONS> <REGION REF="0"> <D VAR="u" VALUE="0" /> @@ -291,11 +292,7 @@ <P VAR="v" VALUE="[1]" /> </REGION> </BOUNDARYCONDITIONS> - <FUNCTION NAME="BodyForce"> - <E VAR="u" VALUE="cos(y)" /> - <E VAR="v" VALUE="sin(y)" /> - </FUNCTION> - + <FUNCTION NAME="InitialConditions"> <F VAR="u,v" FILE="ChanStability_Coupled.rst" /> </FUNCTION> @@ -310,5 +307,11 @@ </FUNCTION> </CONDITIONS> + + <FORCING> + <FORCE TYPE="StabilityCoupledLNS"> + </FORCE> + </FORCING> + </NEKTAR> diff --git a/solvers/IncNavierStokesSolver/Tests/ChanStability_adj_Ar.rst b/solvers/IncNavierStokesSolver/Tests/ChanStability_adj_Ar.rst index e038d22be0b2498d837baf5ee9bd8c84b08fc77d..0bea688425dc87e7e72ea9c3f800e128a289eefb 100644 --- a/solvers/IncNavierStokesSolver/Tests/ChanStability_adj_Ar.rst +++ b/solvers/IncNavierStokesSolver/Tests/ChanStability_adj_Ar.rst @@ -1,4 +1,17 @@ <?xml version="1.0" encoding="utf-8" ?> <NEKTAR> - <ELEMENTS FIELDS="u,v,p" SHAPE="Quadrilateral" BASIS="GLL_Lagrange,GLL_Lagrange" NUMMODESPERDIR="UNIORDER:11,11" ID="0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47">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</ELEMENTS> + <Metadata> + <Provenance> + <GitBranch>refs/heads/fix/INSCoupledStabilitySolver</GitBranch> + <GitSHA1>4f2facd61cb14904ec71b360c544ca2c02f1fbfc</GitSHA1> + <Hostname>cc-x250</Hostname> + <NektarVersion>4.2.0</NektarVersion> + <Timestamp>17-Sep-2015 14:46:50</Timestamp> + </Provenance> + <Kinvis>0.00013333333333333334</Kinvis> + <SessionName0>ChanStability_adj_Ar.xml</SessionName0> + <Time>37.519999999999889</Time> + <TimeStep>0.002</TimeStep> + </Metadata> + <ELEMENTS FIELDS="u,v" SHAPE="Quadrilateral" BASIS="GLL_Lagrange,GLL_Lagrange" NUMMODESPERDIR="UNIORDER:11,11" ID="0-47">eJxc23c81Y///38NSilb2SOibNmO87D3lp3sPTKTvSl7b00NDe3xks4jUTSQrEpkJUqFKIp8z7uev88fv7+el3MuF1eXc1yez6f77XJ5Nn+5tOQ1kESS7bmfbn7jWNM1tuUXV7mySbfljOQD2T2b+mMNtlh0HCI9lewVp9/u3sSWf6TNTJaF9Hzsuyf79pSm4dpt+k9sDzQZcWbWPhj2Iw3mhZQ1q8eQIiRbp0/4eEDYTDdaf3CHZ30Py+CGG5y3/HB/7bwLiGlaqXRQHGHDLrKo9gYbOJi7Nd3kjylUsN/9HndZCwJf6PSXVstBY4j2DOcPDriWGeibEnCRbD+25zR9bzxI0e9c1haKB+lN/Zl742PBh4t+UXbqCEzSTMTmxEaC9a2TtaNhoRB8sp1h0skfbH7aZCrruAMp5dWPT9vsYP/zKV7NNGPQOGTicEJPG5a8LFj2/MmF2YNFYqxVudCuoHavvC4HuPcz3hVgzAZvxrCKxv6jUGvSl7iXPQPcwh+n2mxKBc1pb+Eo2iTYoaH3s3A0BuRiXm0sIkfBiwid4xM1kcAoMmy79qoUwq9LbVwYKgV359DtA1OlENS5LNzVVwqd2rcDLqSXQsFOOY6bkyVQvIUzNXetGET9j2+/M1sE7qEKl/lmCuG59b3mR7sL4TaTGqn9WQE8tjCnGN4rhFCWGtpb+4pAc7CVTP1pcD4o5epRXwKOtzyn2WTKYLnppnxCcTk4v+gRiDlbAc2fSvRYbSqhzD22wrehEpz+y6L16KqEeo/KE9f7qe+/TznKZMsH92fShIZWjKD0zkHLtHce4BxQxW0UEw5NrcrWN9YlwqHj+tnXTqaDr7OxeV9kNoT0PJniVi2AzMzDnrsEikB0P9Aw2hfD2ZsPtQ++Kwbv6Ftvkn8VYJ2DI80fvwLMOfuAtVImD500Z/obhLJwpG34eN94Gq5sflljcj8eSRFNLGSDUAyrOzy054stNhkadZCbTUH5Z2qDuZknFPJtnNf76Qd1oc4PbseU42h2/etltXKUWn/yksCJMmRweqm5p7QUjZS9mh04StDdcOcsq0wRPvnjubSypQBLB7h3x73IRh/Lh6TdbEfxU8XplE0h6Rge8d+OAEjDP5evpmZNlWFCtHDD+/EyJIuNuN1/VobnM3W/JCSX4deDMt83finF2/rPWlrXlaIdB7z50VGMuYt/JPuii9DzkZnvS/VCdN3AHeFiXYDvBOuUkzrz0e8zP8k3rxQnNMtus54sRSGt+ypWjaU4xtv2mJ1SitvuQrZEVil2xgS+3LWlFGlltcNDNEvQdaF0d7FpMXbvSDkpebAIo8Yn2V+cK8Qr5h9fvbEoxCjCvUa46oRLIdz1hPuecH/L/HP9CbeTcFMJ9yHhdkSVM3TWFGHt+wT2X0+LUMJyqcFUuBgNBKs0ubKK0WtvR71tbzFOp2g6208Uo0pNOv+5q8V4YObte2+dYvTJVX9t2lqE/ReYCkLsi1AhtpVydlcRMryuEnmmkYYL9YMJZW/SUOF7lrHF7gxM2XrDLv1TJiqNLWk/GziGTec30lw5kY111fXVoptzMVHfptp7ORfbj6x4OSbk4QeP3mNv7+ahcN0G+Zr2PGT4T83SS1wbaXMZ719vM8KzXpcDFZZtcF3HoBGTghu6atEIuFz2xeuLe9K+6IYgXZLrnqjVcOzIZaQ5LxyFxmpf6brSolEn7WPihs2xOMvx54TvpVisuhEu03/pALy/djuk0tIJ3ihxvJWUsYd2OyFnsXBruP32SbzikBHIDI4UZZ5UhS4+2fFzFz9RTEIfsR55q4Kx6cdBZJ0+GhYHw+l2U3w/n+Rj62KBJTvsvtgsKYM9U8pvDQYlGL3wLdbkjBxsa7XysecTgzdHongPvNkOb9epms08ZsNtjnyn3e0l0ClYnPaljCJSvBYefzpKwkr6ux5MLho4kvCCxdJAE7NebO4uv3STMqnrqfBp+Telyuh8lhYfB/YOF3ZYsuzG4Kt5jR+uyuKccHV9TbMyPqo5Y9QTD3j/m+mAwyktrHb3IO3o0cH+21ttmtT00D0zg/Vhrx4+ak28cVxghXx7mYf5zccBsi0HZ7MZJx0auV/pqzrAiwVbJgsN2vZg3LItw7EuOXy7yCYRGaOMCnzhHdZO6rivLm94IUsD6a32NZ+haCL9RC5vpqYWwmRz3atHG6Cj7tnp46WLZGcHumpfju+Uy5dcuwLrWDF6/kTl5bdC+Ev6huqRdAlMOTf93+ikHB5v4JRdP62I1QerGiZ/q2DHdPBc4ZIa9tNJku26SZioWr24aPSbnB+aELb6ZZIsMnjy+WWfJcq7Qf3HyvKsmFhz+rdCriAeZgg/S8ewF72KamjDdspioDpzrEy1PDq92/Vc01gJZU/lCARsUsGaqJm6zFYVPMvyjNug5xeZQ86xtaTuI3no3evqfqkfFLFU1wO0S8y4vnP/xKt0AfwUWqBwuEQMP3RzXhEUlUH/4jPen2P34csDTxbmNyviS4lmjeIGJTQctnvA466M7Vv+uToK/1zW9/9cecLl7fjn7iPc44RbS7hfCLeVcMeG/rkl8ZpydjY/yQrGV3Z+4x0nF7HZL+6/sEhpGQvuoOtmwhZt2ZT2c3zoNU3DUnd3N8pubNB07JDEqY3XfEMWZPGZ47mx90byeNrXt3tXhwLeEzPlLA9VxGeb+k6/V5gnb5uxxMC1t2RXo0Oz+srfKe/lW6U/FDOgqXrfttlnnKi0aWWz/5Zd+Epzy/OLX8TwBK/g5DEaKXR4cOcLaU4GCx4fuz8tK4d8Til+fo1yqF+1lMPN95kcelg/ub35FXlQTPKK38uvFB0XoV/abnTI3g8fuHewYTrLVE9qBS86bH6+74nDLjx1cr72g64oDr+W0eLQ24vf7wUbXVaQwNu1X/MrN0vimTEeumW/cbLE0h9DpdynZO+Zi7y3+D9Scq6Hb47Mo0HjK88GTpzYhrYXmBmXnrJjarzmD+5oHhStinA6xyuIrrc/t2VZ7sJsJvlpswfCKMC5tIPfXgSvTT/YNlDzllxxsEXK8epDMuVGLl1txgjFf661R871J0WM/ZB395uNWJTRdZ739Ha0nTk1dXONFTV5+eUvbdqJw0dG7Dt5uHGGP6aolZMXlXYuTx6c58XG2fPWJoHd5BpNvYrb5bfJle3y/k/7+yhtkp+ELKjfh5bmAlNQ9G9K1+jS6wLpjegs3mEn4rIFhV2SK5/fZERlw5Tow+PM+F1ZfLx0Hyt6Vej0xj5ixZdirg78Ba1kQyvjSx8WL5C5zoQVhso+o7DZH+iUchqjHNvUmC1lO0v5epol9MaPn5STv1sZzsIahZ4p+Xrnk/V4huHLl0NytOj+4v6VtUd0eOzQm3e1QZswz2Z4fZvxLbLKXlUz04OVZAGaV+JVR/+jPD+QPh72s5uyXonVZe3ze0rUFN7nj/pI4VrWojuc/5ViooePb5rOU4xIh4+nnVqgCP4S9pQW+kE5JnSNvNL2g5K7a0sznWolmVvZX/dxWhK5TeT9iM/V45QYxllmuoXblEc6Pm05SS2UhS5NpUMNLyhGVZEebHdeURwtvL0m3PspJu0jdY373lAsB62NT20YpBz3iKsPejFImU125x4DQbJa9iurWrN15FPDXpSPw2KU9ujMIntDDUpQyYfm+jIjyv62AZMHlhYU9sbjFdsvm1OGZetJfIyGlMZkp0c39wHlYIKTsxtZiuLPE/5ktyQv5UGtx183XLvrr/vc558bxnD0r8seOfHXncr6515Mr/3r3uG4+Ne9EuP811V6d/CvK2UR/Nfdv2DaO7qlknJMqYP/SnoSxYj5lluf9nFys8eF9x23bpPXfbRcfGfWQn5fMX/POfwFeWcQ//nDVa/Iqp9f73Mx6yffa/sP74u9IfvPcWxNoxkkr3TEz+7sGCQvMXY5Hz1yi3JAfFzjqEgV5W7W72M5pv+RGR6r+a372E3mvfywmG3oPbm5dtCvOewjOUS1S2Mm/yvZeODqF7SYJ1/JVtLeeH6BTOr4HrR/zw/y3s00z3u7fpBteEx6dDNaKU/mDplm3bhAuWn4uJDG+hn5AZ3FyW9+Y2Sj7pHTxm6zZKvgerE/G5fI4iL9/E/M18ip9xUFN3WtB2+Jek89VVoI9mNY5/iMDkiBacM3IzaBp9hymIJ2N+WPjqREwPwtypHuU4n5a31kC2nTxfdjX8ke6kngnfSbfGi9/lMx2Y1AXp9+3efgFihk+qL23zVGqJ68/2RlhBmY8J5nkgwrcJe/GRNGVvC4tbL47b+3FB2ac4IuXx5SWEoUghkiR8jCJ4KNuW1/kvUeratQ7N0Ik0cMrhrVbIfxyDttkyusMC0i9HgP7U64Ff1i00UubqgUdy78soMXHi/Ns1+Z5YUPUarbO33GKbYyVyLIKU8p/i11W1/t+kiWuqk3TVtAAycapibendoGThfMIeQ5O3x3Onp0LIYHcmJLc87yCcLReBOWKqtd8DyCK86LIgyPX8qMKzmIwHhA5xPlHZ8pYXZDtZa3XlEkZLTXmvu/khUYltWvudPBcd1rd2/vYIPXURvXrVbwAndKpOa8wy4YMrax3KAnCnLZ0xv26O0FE4l81nsKEnDMbcHv9GZJiFDNmrulME+5Zpsheu3PW4rtf6IeqcrfyRPTr6W2lzCAQnfPt63POSHOhvQ6dssueFOdwv7wixhwXtPMPkUjBSstwocM52RAJkAy74esHIQyTtkcbpSDx5l8l6L3/6Tck/dp1eAZp4Qb5abw1C+SY+zq/eW6mSBQi+XhzDk+EO5vun7j7m64FWo459UhCcbTq1aRC7Jg8U1Cd8JIHloWA+dEOxRA7iqtUHWoItSq1Qw+ffWLgt5BPZVnPlJCc++z75f+Qc6i3/lcZIkZ1h+KMppIFwC/jkCGYyVisNc0kl5CVAa0bFwqfsTug/wViZd/NitCks/X6hMNStARL2+7x10ZVpX+uRE+/9yPGf/cwC3/3K7gf24v4fITbivhShCuMuG2Ee69wBtsNka/KXY+ooP3ZiYp1f8lnrDyXSLf4Z6/7SHPCudE+A+Z5ArCqyB/Vz6GvfDoWu/RhJ2yMNN5vVy9Wh5uV1X7mhsrgW3gAGP0JhVIOF12u7RVBbi0FRMiHm1AIaUwhtGSRYpBj3Hunh3fyf2fmJKP17GC0xcnrydvhaBQZfFXUboEiBbw53yblIPqPkdrpmlFOJSZRbP4m+os2DifXFKDA1NKt7y6SRBYFJjbyb9CcSs4fbxqYoBSxHWp+zYnHWBRYkPHAV7g6XTOd2vbA0FtS7alXXLwMfaxVnKMMlie/u+Bi5M6aEkotv/K0oAha6aT9RRNWC8g/TNHUwum6Iw5+O/cJE+creEp/vWbbOsjwxnExwENcyo+Piy7QeuX+4PZq7LwOzdt5HyzMlRFud8YjgfIkWiucjmlBd2Hxjbz9uiA6LH+3Y/U9GDOrerj4149sFdk9DZcUsZLfNop8gxKyCZ3erfGGTk8pDivqMEnhk1MUm2rr7ejwK4DJK4nbJB98PyvI/YSkJlYNftWRhGKv+YkLB4lwa2snQ3sLhqgavt1v62BJkQ+U/3Vc+kAem131yu3dMIWy+an4jL2+LCzJ2R3uDXu6a37LTdkhK1PPE2TT6ri3XTzJPtLn8j3ntMuxb1VAasny8Gi6/ThrKCrdl27KWx4qO9q52IBAUJsA27i2vDc87NAQ5sRQIdA/L5lG/j9nxGJUcEN8mZ//nK+7AteK8HTM7oh8FzocNbh1XBIt7B0OyccBbdKPvl3pkXDA6G5yfWbY6HN8vxm6m6BNwc0y59qpMEDr7750jdpoOXl8dh8dwa4tZUPpn3KhD25gv1PB46BVfmLM5dPZANfOLM1dWfBn54hL+rOgup9HzSoOwuOaliFUHcWcNA38lN3Fmg7TU521BTBw8/V88tPi+Cp0LEi6i6E3fl9UtRdCLlofoa6C6Fn/oEndRdSP5esAnUXQnNX9XofnWLwmqqkNWstAtuNua3UXQj5Mk4/qLsQRHo3y1F3LPysxwbqjoXX6t6q1B0LnokPuqk7Fq7c9j5L3bFwMHXTL+qOBc+t5MvUHQsGHsJB1B0LZ++cmaPuWBhk3hpM3bHgHb1D6q1FIZAJt5FwvxOuEeGWEW4Q4doR7n7CPUm4o4QbSbhpg6OFWVNlYH1tEt+Pl8Ga+a3Y+8/K4OKWMZbE5DJIiOYWpf1SCht37dz0eF0pqBdbi//sKAYm8bGcvugiIMVu736pXgj2/SrjLtYFQKNsxpPcmQ+nJmM33okpB0U3o12/1MrhtTznH4ETZRAmFXtiT2kp5A1ySThylIBu57IPm0wR/J7mi1vdUgBCfX4a8S+y4Wr6QU9RtqPQNK1zY3NIOojuOm4UCGkg59nrnfKrADI4wvL/+BXAzloJ1SoZ6t/1z3+brgllQe/H62/6x9MgyC9B0Px+PMz6PDuuYRAK9GHx2+W/2IKE2sn8vc2maMlHvmhk5okFIbPfNX/6IY1hye4kGz7U6I+WeL5ihORnL8YS33nglSfy8/ox4XiaMgrX1iUi7auegqsn0/GizFaf3shsTM+VTeBWLUDJNP/1uwSKsO7Dwbrt9sW4/VDDJ+d3xSjFsSXR8F4h/jzyqv3mviLMFHqwqQSKUf/HmKxHfQmmugk/YZMpwwOn23gTisvR+Z4VR8zZCkzI1ddntanEaQfR074NlZh0ncTu0VWJRo4z16/3V+KP+DX/tVel+CZ4K9fCUCnWWwiIDUyV4hHrFe2uvlIM3Pim4EJ6KfZGJWnenCxB/Svvb+auFWPbtlbtO7NF+OhUwATfTCFebaH8frS7EE8Z/j7c/oz6Obb7HtzzJxcTRgYjWatyUa+GfnNFXQ7OObNsEWTMxv/O+31t7D+KF0evDuxlz0Cmj0LvbDalovS22dgo2iR0UDc/UzQag+pvf10pIkfhvYYF3Q81kRjU3ka3pTceX51octYRiscrzSIze+NjMa16xk5u6gjOO4wO5sRG4hIoL4+GheJWqYB7k07+WLb+wW4VHXc0Ed/IP7PNDr9X+phopxnjvhsrUaf0tFHpU5zQSR8PbI13X7L+4I4vB1c74YYbenO8EKe54IKfs2rOd1Ac8du5J4XaG2zw8fodFqZ/TPH8Vpvr8Ze1UEr4iVJ5tRw+rpjcw/+DA493OsgyB1+kHN/TkrVoF0IK13J/LevvTVJNkLd3pPMiWewY5v/j7dMkafYji2mXO2kH1zrDKH9XEnuOvLN8oUnTk2Ua/Yguf9JNWuao4W2upF3xL6PSLh9skjyZd/De90gSXYxfqF5KGolOs6zvcPWRpqC5uxvqeKJJR9U+Z14aiW16MdPjJxmaQdrY9unUx3T1ptTvvJP9r3xJivWGbevaw5pUaGqZuWjtSMm3KyU43jiSwg/HuXHt9yBVKgT/7cuCznq7GdI50MmlZINarBxGn7OviqjUwmqWw2lsU6b4w3Zi6PKP/SijpCe547oj3un7nXay0gWFHOU/fLvoht+67dLWD7vjcpD7EWtXD6QJ+deXH2aUCv3HpAh65zIdbtRJ4eHuTu/XSZYot2jiHsbohm6Gtu/fLfgheZnlZZBGKA7x6NX2zUWgZTGzq0FbFK6qVcfF10Tjaa5M1jTPGGwn+rIabWLo5qVwOBQkFGcvFwJGAWvSQ0Je0Ba8NfObqwkEn+wVP9lhgezpLyI+tfvg4lqcaXZLGJ6yPnV+k/wR7Ag6fPlnVyzeIku+lHGNx+tEX97w8MzC5sACsHjzYJ6XIx82rbtwgWyZA2f3f2FjO3UU5kojvojqpMH1LZETvVqJwMxtWn8m9DBwJ31j0twTDGFtFn+e/PaAXpooNv5vB+Em0Zejz97fm/umEtK0v9tWd1WC5H+XL86UV8JxfpH43cyV0Gnb3/lkbwVIO31IF5krg3SfBymh1Ov2XEGImphGCTRH7N66Sa8YBF/9OrznVRGcIfqyrpjtg53OJcAX+1G1PrwUWDI29tycLoN7dKzK96Ir4EfrQ+GNI5XwSlB9r8SXKsg89ena3cJquFVqzhY1VA2GAaM3huerYcsHTZa4her/68ul2Ze5ZysPwZ2tDypthA+DhvU19XnjRNjw8pYWhScdhl5Z2L3pywKDPzc6NTgLIJCv7cBRxyLYfzh9+iF9CUy1PNYkc5UCp5bRhvqcUsgh+rITzf5dd7emIsvS+zNv9JIwiUaeYk46gnr3HFweZQegQLDH4q5ZDRy5dn5WT8gD5s72lvRzRVD/f7M7dTotDpbsfqnfYk6Gd6+Y86qNUuAN0ZfpwvjuM83lYfOOyeXVjznYYKnm60I5hnHOfPWClek4neDHTnmchAnfSqeFQ6NQz3JXWfunAPzW3xj5KN4e5d5eKty8KoraX6Su7FxRgZtEBw739eygXypAwwd79ogKF+D323ujPpzPxRNqviNbBbOwRGvDTOpMOlpKbLkREZiMi+tNYqRIMViDQr/erwvHo9bp+VyrATgY9cHqWaYPthOuHuE6Ee4jwi0k3HzCNSfcT4RbRriVhKtw5J9LQ/TlpqOHRTo/F6K2bEjAslshXvt687p5XAGKsBr3TAXnYc9mpHzRzEYX9/uZW+9m4p+z6Qf1FdKw5eHQvXvSyZgi8oPJiisBtV5mKAhLx6E90ZfVNBzktvfmoZzgK7LX2zxUfMvdnn0jD1OdDh36LZuHSdIFhVmauXhN7OJmi5lsDNV2J6W4ZWHG1QdlHlNHUWyRp/Hn80xsPatad00/Ex8SfXkTZ4/lgGEcmq+wXDt9PB7prisxvHNPxHGx2rKo40lYwkob3R2QjDHKRRKiq8nYUsHRc844BQ1Spy998UzBE7I2ntLuKSiwIn642ykFGb7/68tNJwY2MQ1YonvCEu0xPhvcRemKYHzugNNHrj8b1XXBarpexz8h7ngyP+Z16pondt8Lt+Bi98EWdOhqLfPFyZ8mJ1VSqff3SHGuhAk/HCD6clWuVKKplBY2lBrJZYvr4MTkiYkLi3p48Y/oTz1RIzQOUBvcZ2WK2dbJI9sZLHBoXMkmnN8Si+/bJSQOWuLeUUkOfwMr1It83eseboU5RF9mNqw7c9ZPHwv7OIbnLhlgdcGWzrkDRmihEtkdLGGCV6TG5mVemGJ966XzxrTm2O6cFVr72By1xkc/5DBaYNCnx+kneSzwpNE1iTFeC1wZ/9eXj6xuuc/TrIVvcz/c4O7XRllH/9JAE130NHM3+TmihzY3aOJiLQ0w5kzAK+VgQxT83eAdKWKEHwEOBqUa4epDH6Omc0Yo6XP/9NsG6vtEX3bS26M1VqeOukNe69lDAYcHit2vUc/bjaevtInraGGkrblwQpw22lTdXWoI1cEoP/qYPlZdLAya/GUboIvGIt27nuTrYqDXHsnuSl1sO/yvL4v2sLQvxami2ohjSec2Eo4waexPliAj958suyCSBs5ryTy8Z6iJHW8zjCK5tXBYqXq7WZ0WfjlpKug4o4VPmjP9vm/WxtaRB9xkJm3UIjpwp416nBqzCs4flTnxLlcVc371jdgVkjAtXpgc8JCM897uD/RdNfB0zkL+jKgmbmHvnwu8qIksu69GuHzTxKv3qpi+bNHC5CPFNzezaOEy4foTrsKxf6474V6J++c+IdwcwhUhXGnCPU64coSbSPTl+1vc7i0zK+G9lHju5GBlLK4J0bTRU8XxJ6//NOuS8PkjwdJnnGTMZWn6uSsDMHi9gs8rFQ3U0ZfcTzqigffvvzz1pUAD/R+135Au10D1/68vfzQ6lgb78MhJ6723XOVx+f2o24YpBSz7dGCyP18J77DIWWmyqmBSAc05PQ1V5Iwfn/q4QQ2/73ihuctfDR/EfQvmKlLDMyrjp2hr1DCW6Mu1+z9t0+2XxJ1vvhRvLZVGcc7Q/sYlGeQ1dbjxDeTQjuVGyqD/Prw6WJYyaSWPaV/igvyn5TFn/L+Up0oK+MRMQV3BVoH6+z1lLjgr/F9fbqBRXcfyTQT1BC0tFhRFcRdzMlfovBhy3X0WdujVXnSKkVi6dVQCdzO7cZ16J4mmF1K2Td6Twqs6gVe9xKXxJibWXrCTRgk+j8IAd2lUIfpyjyCcynvMhyOWwLHbQAAH7jcoBiYI4mm2EFrrTiFsvfr+D8c6YdyTs9OW4Zswmrovr2w/JoI9bV4XBl+L4IGANtGcnyLYFhay79sfEfQh+vL66z9ln5qy4YWdLbmcceyocfOsXy3bDhSvDmBk7tyJHGv+R3xduVB1/9UC/gpuzM1k2WHpzoMOQ6RZz+c8+D0q59rj7zwoeGZBNHKVBwuIvvxM4KMLM9tm9F4bY4mOp8f5ht1097y3Im2/tCRL9DZcSHCeXnBixM4wdkchXyb8FcBz3+Q9E47wdns94WHGJvnmYznyzDgmTQlVV2XGBKIvO0Vf3LXo85Ni5F/0RO3JEqXORu+Eeu0vCtf02NveUyuUYVHPQIP4P5RxRb4fG76tURxSydeHgmlw7ZtrrfZFGhzdXrHp40Ma7Dt20/bVExpUI/ryaKH+qGHuOwqn+FygsOIwZThkZKVAcYQyeDqufSBglBLKmkAXmD1G+dHxm+O13zjl5VjMe9vf45Q3P5hqJXUmKMeVFMXiDk5QasNDlc97TVBoN7v/7cA+54vlO6tG1A8L3qK5arCPPNplT0pmNiC7rquh2cJrQ2743Ch30PggmWUfs3OUqAeZfvP5BR42bzJLh2fmoxYfcqUJx432NF9ysWiaGi3Flzz23uuvm3sn4q97q/PaX3fuo81fNzz3+F+XU7Dpr/tp7p/7rujcXzcz+J97xPSf26CQ/tc1IvqyvodvX2PhO7L8sEltofYw2W4qhVtIZ4Ts5s1IP5E8Sma+E8IxWT9GtvwiRJOTP06+tTwkvmv3BNmn5ZtZe+gEmS+X/rFa7gT5UlyK/c2SCbI50Ze9JivHUkJ+khuNpLZbv1wiD4TzOfnW/yJ3Pq14x3BthRzhHUNhzf1DHhSvUS9YWyNvyv66c3sUDbz7MF3OdIMGNqucZ9BupwFBj7zAuQ4a4CL6svkU7bohrs1w6vOHT0mp9HDtbKevZ8BWSN8p+ONx7DZImHe7on2AETJm7kRs9GECYT6D6U1DTMC3xf3lSU5mUJKvTn4nwwwJfnu/71dkhu1EXxa1Fw2XM2KDS3zqk7+j2OGZSf75PsYdsPT+x4Yb7TshbqJp8LYjF9z+nbo/uogbXkdM32d05oHI3yshN5/wQLzum1vF33igfUfAwZRl6pHoy715z0c2tPJBycxwX76+ABgoDHELJgjCttyErf6dQpBZfnihap0wKJft4P75TRicqqasjbNE4NyjsDTTtyKQ8U3AmGtZBMY2DaVn0uwGJPqyfugFO4lZEWhru9TKqCwKobT9nEe/iwEXG+/BqJ69IDar/uPkMQn4xFJp4TMkCVZnyt6m/icFh1+alo6IS8OG+pv3t9pLQ8Nmf6dWd2k4QfTlCxmmAsb9kuBDo9VOvU5Cf4WH8d0lGVjYMNEzBXLg1Cx87pX/PsicmnEYspIHjSsPNd2n5UFiBz8+UlIA3xD7cmlbBfB4Y8RwxlkB3Im+XMHXkFII+0B8Q9WuZld56F6bXsc0pQDs3WtHx/KVQN7mAasxqwqk+3W/NNVQhUbeMPOZDWoQKHvUScRfDdbxazByF6lBm3HSOep1HRSJvvzJ6tytVWYlSF4+wJgerAyht538HfRUof+T9MsnuiQYlNRpfclJhnuvecQkMgA4NkacHlDRgEeF0/laRzTA+Y5r1kKBBnWHFH5QLNeAIaID9/CdNDVgVoHJO5Tv07mq8GJX87RXIQnOaJBFYh6SoabbvNTcVQMWtA7VLYhqwufpXMbIi5ogKhIe5vNNE6x2x3xa2KIFp1kGjjCxaMG6hH9uJOGGEG4I4RYQ7m3CpdH+5zJ8+ucyE64M4TYQ7rtT//qy7R3FZbp4VQgLTqcf2kYC75Y5vgIJMnh4agxFkDTgnOOI0UNDTcj9c7AxjlsLsnd0mNjUacHa+ghJtxktuK/xwfzXZm14PVI/p8OkDceJvlyXEISzderQZzyYtSsUYN1trXN3ZzXgFUVmTU5HC3ob6NXT47SBIg2jt0N1gLQQuPcdqy7UnmqJcg7QhX3lcfEv8nWh45Jl1EClLqzy/+vLYzTcBULNWsBwxj5esF8bNl+5Zxlmogvbu+mXVkb0QI3Cx51saQA5X88EkYMNgWV8mi5WxAhStEU2h6caQWwyz0rzOSPIGdOyH2kwgndEX46l4Yu+5KcPkh7jt39eMoBFb+OzPw8YgdCs8JkICRMIyG27pfjCFD5u7jWzpDUHlra4n6cfmwPDj62V+YwWMF7xTfIMjwXIfvvRNcFLPRJ9+arP+f+spLTAqE7dqUBcB7yKBBevLOpBe6rjJ2NRI/h+7MUNZSuq++6kJjODBZw/UnU1kt8S3nJt7EsetIQrQ8X+gQZWcEfJUswr3AroiL6cfcP4J3UHwK2UhRHqDgBGuQdyTM8d4O6PMJ8xXRfwSGOqoO4AuM9xlzZtzRP2JzuGUHcAkL0vfaDuAOC2Eb5O3QHANjgiRt0BMEj05ZWbbk39hnEAUxX81N0CLdxTaYPuieBJt+JA3S2gR/tbl7pbYL3fZlrqboHkXyV3qbsFOPtFqqm7BTJitJ2ouwWkPUtDqLsFGIm+/JpTfxd1Z0FRPUWNurNAN/BtP3VnQbOhewl1Z0Gr/aNO6s6ChudFztSdBTMFAueoOwukf7QweU4dhbdq0+Sl55kgt++65HX9TCgh+vL8uIgrdRdCzRz9FeouhFkvxVXqLoQbnaXJ08F5YFYpkv5VMxsaWAs9Ge5mAp2WlJmBQhrcVy278590MpxN28S3nysBRqd+Gu6WjgNfogNvm80X37JUALt+zORSdyyUOvyxmjyfC7vDZLoZBLPghW3SXNpMOjywOPQ0MjAZJNqMW2VIMcDd1Wkzti4cbFnSHflXA2ByFUS6Mn0gkHC/ffvnyhHuIcJlIdxXhHuTcA0IV5RwDxDuCuFeV/rXl7/yctQxz+XB3lyfr38+5gB9S3CgK+UYfKBxowhVpsPqAQ9VfJwE7Z9sTURDo0BG5XFcx6cA6G2/7/Mi3h6abiSftF8VBdLS9uLZ3ypoSPRlXRd9h3tbU+GOMvvIW70k0D0fpGtFOgK+geUZbdkBwKq1+FCZel67RLQ80hTyQObokE29XBE4V35f4GRaHH7lgg03mZOxVJTbtsooBTWIvty9NVr4c+UhbK6xFLUWPoy0jMzvvhknYsbFMb4HPOlIujug87ovCx1Zasw1OAswbw/7VKZjEZ6n2ZjwkL4ECzUn3qlzlWIpKeDUhZxSpCX6ct47fp+dziUIfHafL4SX4umkmtyb02VYfu7G2t3oClyb0fy9YaQSpy23MUl8qcJT+aN1dwurMTOvgzVqqBqXgyQah+erUXbnEk/cQjXuJ/ryI6nzkPumEpm31IdWd1WiJVNFx0x5JVq7n67fzVyJQi7raNv2VqA0F6VVZK4Mb79Obw/NK8UbzcIZYholOKnUb79Jrxh/6Y893vOqCE8QffmtAJsMfWABSv/xDuTjyMcZjVIRsMzBxI6YErZTR9GTXj5YTCcN83+/nujTSsQVwytn60IPI+gO/9HaE4yDP/PG2n974PkExR6hbwexm+jLHy7l76BfCsdwOiY+B7kQlE2z9hoW8kLL4VC6BVcTrGtsFD7eYQEcXjpF0+0+kAXiX7JawuDPcy3bTfJH4NjhR14/u2KhtsIoT8Y1Hq4SffmcjrrGAyZFvPZG59bFOimQuLE9fyDJElYPedKHMbpBbdL2mncLflB88dB/QRqh8JzrZEHfXASE5xxxMmiLgumcxPj4mmiwyOnnSPOMAa0qx799eeqSgvimdA6wYW5+rRIrB3RyWWwRldT7YLQXC9uUKfg/n7t2+cd+2DZC2r7juiMcFbgZcbLSBYyiBsa/XXSDYfbhzPXD7jCwYXeCtasHFMhH+Gg9Jzflbx+rUzroSmIWEXYZWwghqZRk3UlcVSGpudZGcdsrkcJ3HlHM/mXSJBk6ahikFtFkLC9YvjrqSXK2cf+2LGhMWj8umvdYnL+pRHZ78js+jyZli9rM8ZZI0uOmm2lc36JJle/UN1ed9m8SMym7Kt+c1CTvoXc9ICGWtGVv6ETvgkzTAC/bqPVqCGnV/U7jdrJiU+Reej1FFxvSYRm16KV69ybTl7oTDyW9m84SfVllm9sOv/cemJeY6ZM974lnTzZWm3t6Y703x4TtrA/2S8sOfbT2w5TG13Hsrv54JeSTtC5tAOY8WUiqsQpA4fnJzrN+AZhmdJCbPzAAbxF9OVGrS1RMLBaHczWlJ7vj8GWh85Yu1kRMpuu6fKQ1CYe4rFvMJpNRHsSL3J+lIHtFX0OXWyrmVja5cd1KxeOr2i1d/akoTvklWziSiiFEX1ban2t26XMCOup3hbWKJ2O10agPf1EqmjyRKZu2zMDaX4O+hxmOoXDTkkdZSDZe7UgVZjPJxYIrH7apFeZhyovjXwZM85Ep7ZK9fUU+3iD68uKFfXpV720gY35b0vY+NvDapR/5480BVEt0OijrHYK+p84EyOnEIDNKZT4dT8Z7MUGlsxsyUE/s+6iS7DE8eE/4crtGNi6vJdPwCOXgXqIvbygv6l9yLAJFj4sUb81CUJZQGs1gyYetvhc/5R7NAte884Z6iunwnJ3XpFYhEYS5TZTWn4gAeOPdaljvA2NZ5ac8BOzAaF9E6adeA/g98a8vq/LKOhrPVYMdF1uoyetqeE7xeqmRWQ3MKT2n5d5Vwbuem+G/2ypBInY+6KVjBRzOLL7f3loGMhWltGxGpaAeLtd4RKYEZIJnKkIaikGI6MtmAXlXIn+XQu0hXrLrVBksqhx9v56/Au53Lfl9cq4El6kq1T2+VeBuvphlvKMaLG821ad7VYPS0ECfbkA1OCZuu+pgWQ2kTeXDquRq6CT6ckjLa5rqpFQo17u+V1wuA8Ro1u2BdVnAo7NH1TcgD8rc+zH1UCHcpuQu7w0qhi0CV8RtN5SCoL3en0LBMlDPOvim80UZaI23BdCxlEMt0Zd5nsJS34o51H/bsOVXozu46b3p7BMPBfIu0uxAaQzMW3nu5DNMgWu3b9CqbM6EMJJLTCFHNvjX1Vqf2JsHK+xll9qYC4A7sLXyEfU+vpnowL8/1Yvmb/PAjd2JuU/uWyKZ+w4d/2EDsJgXZn0c4Qvn3u4l1wsehpsq3x4VNyWC6sOTamTGNKDkHRC0NcsEk1dnH/EEHoM7OxPVVfdngQzhRhPu85f/3F9c/1x5wm0n3CrC1SDcJsK1I9w2wp3t+teXTzwcfPyAHIOvNq1yrz6NRL7AGUZRCEbfRJdqdkEnDKS57LF4Vhvqjqm/KrLygfUBsQwKn8KhLzzZTvtIDAzoyfYW9iZA1kmRsNADSfCZ6MsOAtz05piBWv9JS22MS0e360IefxJTceDwFrQeSkIBncOsnKmxaMRKmq+diUB7l30rTA5BKKHRF3r1izu+ipk2vRxthzcWk3xkOS1xHdGXvfeJaxhZpWDKAdsORtkUDBwTa3OgnlchuUy5wTbJSH7AHleWlIRbNHZQaj4koJWxz+CPmjgUVsyqjE2LwTLdgaNpy0cwu2iwk03nCP6I+NeXKyRUfrlp+mPbUvVHug0BOOvHHXHrewD+ArvoxleBuDU429jDNwiD6tLWl1YEYbOS2svigCC0X14Q+W9zEDL0FHddOBuIZk4zRUOhgehI9GXOjKpxpWor9PtmOV0ybYU68UJqQLbGo/Q3NbUirHH1aXqu2yFrfK3qbx0mao2W59nR6rIVJjdvEqwUsEL9ULo9aVcs0Tl79E5jpCXWEn25/OTZuwd5LPAUBuje2G6B01P6AjsemaO+Rm1j2JoZ3jFi+X2nxRTf9vxYbyhogudtKR8PmBvhwY6bx3xrDJCPbY67w14f3zesXbdp0UMDoi/nPfAQ8rxhhF43Dz0LqDdCCcfTQhhqhOcG9N5dmjLE80pb6d6vGGAx3wzrYKM+vszPDaM300MOq6G5d4s6aNM0v15qQRvvrmq6tMVpoyfRlz/eqQsTPamL0b109A+px/pyjQf8ibpIERGS/c2riyfKTnc+DdLBkre4iSdKG1PnK9ofO2nhaqBOrr6ZJo7aZ3gdS9XAyDuS7s4iGphE9GW3owKK2mzaeGnw7Q41Zm08STcu6vJVC9c3OIa6FWlhIpdCj9qsJvpyVEnLMmmidut+7VtMGnhOglJ1WJ2M6aG8wSavSBhbqK3Rs4eEb6L+dWADS8H4LRxaeDZhuaqWVQuvRnBHqX7XxKBSqZGuGk20+/m2aH6DJjJfu7zXXUYDNdZctJ/FkxG5Qyp33iIh+ZAyS8oBNdSR2t2744EqahF9+aPFP7ePcE8TrhThyhEuPeF6Ee4o4foT7jPJf6460ZcD167XVlRpID1vOncz9fUxl82H+aM1sKz/WtIdMQ0M/37XJFgR8DjvlgrKVXVkF6twj5hXw+3hQaVvTFTxu9gO/zQmFRTbSMfdFq+ME0RfHn1k9nrfKTUs8np+z7laDVt+9Fg98VZDN8tPZavDqtia9Zg7bE4Fv4a2q7lfVMaLgo1pgopK+JX9tvNynwImq1jyjnfIY9ncEEugtTwWE31Z797cx0NuCjg89h/Z84ACmvktvvwsp4Ado/43Z9rl0ey5QQkXkzw2Zhn8ZGLZhwe2Gzepzcli/Immz3tGZDCuxrU6glUG2wsZs1n8pHEv0Zc1zuW/f+4jjfOPwpc3uErjgEGJRrGQNE6ImdPvy5DC299ailciJdH67NFEVhoJ9E8/GkJvtxeF3m4XUX8shlvHth1grBDFkvWTo8EMoviC6MvKzrevZ63fjQZ5B02urYigFOO6iE3dIvhMiD3vjbsI/mZPtKw6I4zNrK4cirW7MJprJVwlXAj5P21rvOkgiGe5DzLcyxBA0D/BMSEs8H99OZPpVav8el6MdPjhkv2LByfn72dtbObBbsEaiSEpHhQ/tJ6cIsuNH1T1GfL7OTElQB+YTXZidsgSs+8AB0o2av3yfciOQ4ub7igAO04RfTl18nnkOIkZxzZnePcrMSPJnOR5np0ZRwwibRgfMmEGOd/EYA8TGuqedhi4sx2zTZ4XmnxgQK402lcz4ltxJrHrptkIPfJ1rt5l0qPHD0RfdguTNYt4SoOu9Qle8q00eDfeUPnECRpMZC4SbTGhwbg7pu9qo9Yo56S8Wd+MrlLuSnfH1/KuUESrM0e8wn9R+vu5rF4oLFOCOOg4X59aoqyG/evLd1zWWlt8JyhFl+8+iPaYoIy53dHdpzhBMS2OoXS9HKcwBoSaRIiMU/Lu3nV1lR2jZFy6IPpbYJSyX9vC9RL/CGXGriiNEYcpZg5flVu2DVNmDP51YM04X9nZMV8yy6nSqJxPvuSkNzfGZkV8yRc2DGaXDHqRYy+dCnt23I0csm2zP32nHflmC2MAF0WfzCog887oPDf5ju3IlqgH+yisNSYk1p1A2fP+n3vkl89f983tkr9uzYvrf90H+9/9dYWOnv7rsibQ/3UvrWP66/4ZkP7r7pEY++cmaP11BYi+bKBUuH6+fIJ8uP3rNt+iCfLyynYddY8Jcpeq46FNy+Pk0QH6FRndcbL2viQZOr0xsv7+q3Yae0fJ7pwOWV78I+SIoQ5/wRvDZGb+L08qfw+RjYm+3COwVG32kgbErSfdnJ7RQB3nXEh6HQ1w1Zg6vzSngRexnIHa0Wtku4JjZXzvV8kd6m4FVjtWyMeqnu3t9f9FZq4M27tdYpm8bvlU1PXyJXII0ZcnbHuanigzgzHXsXbLfcww0Pyh7C4TM8TDxq/zjUywbUfk1UhhJgir9Iu63rAd2suGOiTeM4A15S7jQ9GtcMZF5X3qED0MK80cGtOmh1tEX25aGRBO/8MDnx8/nEr6yQOyp2ZN6JAHthuq7QApHuhSuMZzUI4b4lN4c2+/5oTegIB6fvOdkNDUIvj9LQe8UXXv2d3KDuvbDszTaLPDDNGXH/a03xLfuBtWhzV8Xf6IQGNS2PGmVyIQ723vleApArOF9FtYzwqD3sbGs8HHd4HKrppqyQghuCa5NfWQoyB0dP8H5pkCcMXEiyZQRABqiL6sxRGWzOUrDeYq9KEkV2no6qTb3yAkDfKf61hlM6Sg1nmnwYdISWByM3aaXxOHa0+Hxqds90Lh1AMrocdi8GzuXMqvclHgMt7H4swgCkeIvmy9JK4X4KYAognvG10PKIA47fytaTkFkKdIV3xul4dvTstxnEzy4P7Or2U7yz7wPM5ZpjQnC6aJz3p3jcgAE206ZxCrDHg/GtVc7ycNrURfnro/ZUC9rsOV33vXnKrVIN0s2rHFWw0u0a9j/jWsCsZ9jHBoTgWYLnBpul1Uhp83P8vtUlSCROPHJat9CvCxpUl8ukMebOJnF8Ks5eE30ZcPKr7bebJKA1b218g+pb527q40EYvWgJ/v2+ZQTAMyHg9cSVYECO76frX7qjrwcZlUZsyrQbvCmQ+fTFRht7opaymTCiRVLcUMxCtDPdGBU4dopVg4tOD1BTmWs6xakLMuJlvzuybcb2mO76/RBM7QqqdLGzRh8r8zO3xlNGD4ENOW/ngy0J/JyxK+RYLUqjsyeQfUgGFJmF74gSoMEe5ewn1AuNaE+4BwWQl3jHB/Eq4A4XYSrjzhhhF9mTMu4pchmzZcaEi8q8msDc91XCu9vmqBO2dqo0+RFlxO/L5Ra1YTZnLc/ZSYNEEgn1zeyKQBpNshyanqZOCIK8h1eEWCMFPmuJE9JFgm+nJE1o8rkid1QdtQZtcT6lGa7tslkURd2K6ct0zDpwtfGcdTu4J0AJbeUQSjtCHj8mLZcyctcOxPjDI104THO3945qdqwJk62QAPEQ0IIvpyl2L2oN8NI3grWJUTWm8EIerKc62hRmDFOnDz+pQhRG7hHp5YMYDSHocPI436wPF2VZ7RTA+Ce+jPjy3qQLDG8tV9C9pAc0qYviNOG0SIvmzuss/WjccCrjk4v7m13QIOb7WU4HlkDiaHN12NWjMDnefyH+63mMKR811zpoIm0Kts9cnN3Agiy3VPB9UYwLVDYrqv7PVB5Mm9MccWPXhA9OVi2m2KqtVWcO1LlUr5tBWE1JzI1CRbQ8LQjQydCGvYLnfiiccha1iNEUmIELWGqI+/3+y/bAUnB6OlqwWsoM3rqXTGFUvQKy5qbIq0BCaiLxdvY9jkrukPawffzVJ3ALBXhsdQdwB82zufRN0BYNww40jdAcCYOsxP3QEQnLG2Rt0BwMuY4kPdATDW7cxXfzYQvHpbP1J3AOwj+vLMCieZultg6Kx/D3W3wP6kQ2+ouwU0aj0bqLsF9rS1X6HuFjB9ck+z9kMCVIoejP1ZEwcswXwWcWkx0KtaZ5a+fAQCxe2q2XWOgCTRlx/2SZVTdxbo7ot5Qt1ZIDA6RL+WmAruXm2H9w8lwZCQ6Dmu1FgwPWF79sRMBDRG51SwOQTB0csWCje/uEOavPPGW9F2UHmaJKvCaQnTRF82m3AfRXIMkMZr9NaeRsK210vZ4hAMPEe2DfMJOsGPKqnwsbPamFEosCXPygdj4mkuyn0Kx/fiL35pHIlBkfmC+PzeBFw/EmIQciAJ+4gO/Gj0LU3JNg/YwEa2f3nfEo5vUjHYetgAjXNzhB5G+KIMP/OLc4KHUSO87GBhUyImaDmxqDOm4epliXU2ZpkYPnWvnjvwGK4UM4ip7M/C04RLM/bPfcb6zx37/7lqhMtDuOmE+5Nw0wiXu+SfK/GT6Mt5PyaaV8zxIaP2xsVGdxS5ctKsRzwU5b91HukrjcHW5A0feAxTsFCGa1hpcya+zkl0LeDIRrrZN3rH9+bhfxT+vW3MBVhgU8b1KK4AzxB9uS+q73llUioe/bhpdY9cBqpduraJvC4L0xgM9/oE5OHO54+0Ug8VoolU7tG9QcU4opz1xGZDKZbnuZwpFCxDXf176Z0vyrCo0oubjqUcQ4i+3JWFZpG/S5F/d+Cky1QZHpu+XrSevwLDQvnFPzlX4l3Tlq17fKsw6n5poPGOaiQFHq9K96rGy6P8PboB1Sh69t4tB8tqPN769aMquRo5ib7MLWLmazxXjQGGLzNMXlfjJd1NcxqZ1cg1qPxS7l0VjteKNPxuq8TTNAa3XjpW4Ln7xVuftpbh5v7jB9iM/te3y9ijZUpQo57vR0hDMW4z+NeXs6tO7152LELPV/zMPpqFGLO8KSeTJR/XMX6vyjuahbKuJ1b1FNMRe/3uHFdIxD9fQk9sOBGBNDyXskzqfVAivY7TT8AOmyxmDy32GqAi0ZdH9KN+1b63wY1c+rwGfWzIab+b/vubA7D/nmWJjHcIVJNe3pXViYH19SyqT6nnYeRbZ5vZDRkwaK9xRUn2GNBuSU1s18iGr8+SB7iFciCL6Msp4dnMlz4nwCXDrw6t4skQGh1ox1+UCu/WJAqmLTPgO4tB8GGGY6CYeDWiLCQbCqj3TjaTXBgMLJRRK8yDh3dPsL82zYebrDSp9hX5oEX05Uefj0mKicXCPH246mR3HBwdL+XtYk2EoCdR94+0JsEBp7oBs8lkmFyUvuz+LAUkhng6u9xSwcFXIp3rVirI7AuZ7upPBemN+x0KR1LhKdGXXTf78Pu994CF4v6I7HlP4JH8fs3c0xvu8J5YbzfrA+2PuGmnrP1glYbrCrurP5xZ3OetSxsAI2cj79dYBcChP7+2nvMLgNcKaQ78gQFwzKjI4c6VMFI4ffJ3zSynpoFtJPfeUX7SV9eIMza54aQqoYZtocaRTSnr3WdrwiObmoO6rmTqeze1WIeI7ks2IU38mh5rqNzZ9DXxjzOvqCXJ7OXR1CLNiKb4mwOWGy5kNd2H2Ibqp24k+q2uGUcyApseMSxc5pVUIblNbBoZtbBpoivXCm766k76WObed5A/tKnT5lpaLnXIriqso9mfatd0KIBiWa13kFRid+dAuqtGUzTRlzmsUwxG/QJQeGNGm6t1AIJnlFs/XQD6umUFnnf3R7nGPoMyOz+0oHkRL7Dog8dHEx05/L3RgjFamWvZE9lcxI3iJj3QmP/ayAkfD5Qj+rJlaAHfx8lUFFfQEKicSkX/PeLBds9T8af1npcbIlKRe5GJk6c3BY999mbR+56MxwTYDYNmk1Bf7Edu+/dE/JIebJOdlIBzO1oq6HvjcTvRl2dCVg29hvKRYqKziHIFePlZesdZ6vWj7U60Ze3lAmQq4ucyuViApx7yBKQEF2Al96mWeroC3HGhxi9BIB+74u4urHfOwxGXHZv/91wAA03K374cJtLnlfUnB92CNMK03ufhCfe6cfW7BbiYsfeRJl8R7j1R7XAosBjjtUg2p6JKMHGG3f+WZCnefhSyKF5aigwczj+NW0tR8bKfxf+eYxiV/9eX3xiX6YbJcgM8ip/fVWSLZ9f2ySWvBWLPPRP+36rRqFufd2rGNgX3lrpy8nZn4sPUbSX1mTlIs8fUvpupAG//Rwn6rEI9/3uj7/zvuYvdRF9m5L14dfueYmj9fPrZwNdCEPlcHd1BWwBBz4U2bNiUDfD9edtxiXRouqD9nz9LAig8mrsXnhkGpnzTcTKLbuB7fpQn2kMbFJLpftPa8qEC0ZdbZEJUg3dXw9HKnfX676vA69NnWQmTKuB56rBH3roSzujwXK/5Wg7SdmZe8UplwN+llZLiWQLfavwnVR8Uwd2ngVv/ZBaCeLLWdPKvAjAl+rJ3wCcmLety0J497CTyuhw8ewp3DkVUwDXypYzhxQq4td9YWUy2EhZ2K7QXsleC0jMtHo7rFdRh6Vq2Q7wCipyutjrdLgchb5eu2zHlIED05RN8peMjEwVQnCZqPPW4EF7xji1b/z+u7jMc6////7gQskf2zs7e+3wa2SNbyaZkVbL33nuvhopI0U5K54sy0iAZyV6lQmZGir8+3r//he8lhyt3B+rN43acr5fVPBh19mhwlCuAt+4f9YksCuGK54snvIJFUByVpbVWWQRqb8OtbEeKoObNk03t70VAQqtc/O/cUA3mwH2/+lpaFNMhpS28ok4kExJ36jf6+7LB3Uw6stY9F2jkuO2s3+TBwPbpK7KL+XA3U4hQD18ALtnu94hVC+HDboQuRWghMEQ7m/0753Qf637AutexbhHW9cC6nFh3EOvWYN2zWLcX69Jh3XTMl53eEjE+M4oFW9rolDzHeCiQjtYsNkgChvLyKNOqVPBTURgiIMgE3RtXDe6vZ0Orz48oToFcuPgwcsloNRc2iYRjg33ywDTAg7frUt7e57/vyz+Z+IqdfXTQThCN/VNFCXjk5sJg9ecEvOAj0VR19wQDr7G4ynJ/MKU0283QDIMiqy9u2wQxwKcdcThBIQ507e3EKirjQZHsoNkbjQR4i/myrEn4WEJaMNo9JNVr/ykQvb5Mvjqi4I+k808MjhaeR5FBcu0fbnug7MKCoGMTjqiQW14im/A4Ep0LPnV7VhCJajipl7IpwjeTMouzotpghfmym//qC2llH9RJLvNr/qY3QppD2tGVXuiHV8jKDK8nuhRqoLAk6IG8R5IV+UfckYKm6O9rSa6o8UW3OVmoMxKv/Gw7TuCISmYPRPfdtkcnMF+OIbh3fk3FHDnrVRl8rzVDJ8+SGceHHUdjJSTn1yaM0eaHr7hL1QZIjafc/y2jLlqsz7dNydNC+iwvymy5AOkyLL5vGFdBN37O6JpuKqFmzJfD2SI5d0R0UV/CFMmd5mPolK2ZKXuWFsr0mkkatAbk72HifbtECflPHZ66nSSN9HLGrMObBRDveOlNxkhG9K37HNdi1Ba+o+pbxfTDh7j7mC+/z8j4QE2ojZYTqSkYJzSR5fIr7Wo2DfS8g1i3PVkVJRjQO6lTKCDqVL3Su1pSSJDxpsDdEgH0++T6lzOUrOgRr0Z4K9ch5NctUULO8wcfgPny6yCNuskUQFEMuz2TL9TRbpjPq8EFFRRw+VlZtKwi6o24kkD6QQY9oGIQdrQVQ7pvF77OpfOhTlzMprk/C8rXaP7h+pgS9RdIsyS+JEKJmC9HP3ialxmhimaSxB43TCkj9acqchPOimgp9vfSWxo59LXiYZbIUSnktSpdkcUqjPRNzQonzHhQwoboA/V7DMiIYPudVfpB1NyvUhRjuI1HmANPC2kVcrGqoHSrK7yqhUrokwlV+hV5BTReVa18hU4W3VMT6AhokUCNW1y2l34JorB7WQcnjnKjQCF8R9ZXevSyiWOU+isxMn8c+uHJx9/4D1hXXHi/64V1u7FuBdbtwLrXsO4lrBuLdZew7o2H+11xzJcTVVbyRr8qohzv6JnFWAWk2rx6kshSDo0crnz44Lw0qqvpHQImMbTGKxuvPc+PVhcqqvONOBDtQvmfClI6xM31o5M2jRBNyEhx+Vht4HMxX3a8kApR/bJoe/Pztee3ZZCUQK17xWcptKJpZN04JYbKolS97FSFUMmEfvJnbV6UyekcfAqYER9jN1v6Cwr01UtUmOfmX/znJwnpkfIreMK8fV/2P3DEeqpKApmmxHw6MyiGaPN5DURIjiKV+F6/c0aCKCOyZDvyBy8KOKx6Nb2YDfnefUlybZgO7Vwevi0iexDN/uR7Y3Z2HX/AKykgi30OH475ctK6u9lEhCBKuserlCQigJwGL7+KZeJDOFV18xcneBDnCwITZi02FJvHqCITwoCs6cRU1NjJEQnjmOPm1A6+nv2lVafsEp6D7uCO15lpvAnmy3Y6JpeuxHAjy0INhd+VnOjor76bGU1siKjRtt57hgmxsG7EfnWmRzJcMtq/VClQq2hdTJYaIcqbZG2lTPqFD4mkC6IK+oqf0jLWNLo3hG/DfHlB3pXk7LPDiIPBi/h1DAPy6rcu8CiiQxV8I3pvOakRwZbzS0kJMsRrPPa98PsBdF2urDZ4cwNfuqB//R5uHh8B4WaPnEbxdwi5fj516sErY7487LDgX1hNhujK6Y94SJGi8bGjC/Z7/25ET7U5XJ84gKq9OuaY6//gJZflnn5X/4VnUElr5/Kex38SKEvyb5jAP9vJ0R/W78Gv3BFdq1VvxTtjvtw80//cnXwT33WBUVuqYh3PZPDcm9tjDf+17+5b+qBl/KKuaF3anzm8vvwR94aHM3iCNNcQVDeM32AhOR1h/gEvRhM5Tk3Xgt+oQu8GZB/he07s+zKzz8qVTttRvGukbInyzWE8FFvddt4YxK+vZhXznu3HF7raCxVL9eBLi985Pg/vxLc+Tv6zRt+C93b3adiWfoSfMcrKbDxfhX+Kf9rRRVyGt5bQ/M+BnTV6tcmmjuHVd/krSzjN8Dac/NQ4YVv8CMVvum5dBzyT4cpHcwpn/DDpOEueuxN+rptTo4HEHj/6zmSZrtkWH3Xktf0bDys8cXCGpu24Bd4baf/X5ef++F/30wGB/7pn8Xz/dU/Vb/3XZcftdwsl97v8JfvdQKzrJbjflevd745y7fvyKXTd+qnGKO4gTkf2XcIwLmOK2V29cxBXtyZMYCXZj9vhZn8XvPoBdyMphKr9YCfO5vuh26S3m3HDVL0Lr+If4oSekQkN6VbiukZYhnoni3Ezm/u+PKUp0jS+u4FbUp5mZyxcxxkFxJa3nFrDbb5j3HX0XsY1z54cNf8xh/tSb0K8UzWDi5cbLW8oH8ZNvORY+az7AVf/vNbd4GALritkaEaa/xHuD+bLivmVxQduksEJaSvCo1KkMN04fnZ5lhi0qLpKyWYOgNlv9ea4hj+4ETFT6Rj9XziZKNLOvuh53MSucj28mcClm/F+uenVg9vQ8EgIiGzFHcR8uftzDpUa/jAoutkaXUpggODbHzqoy+jg18c7f8T4qUHoY3qrkCwZ6Iq9rFiYPwDyd9+Dwp8NnEq+8vklzXncM9tBMiWXUdzI1IkXuk49uEbMl6cGV7pzYrmhtOvdu/oqTtjKSV5eb2IDhZ80EmUzTHvPuhaqP870ENohyAhqFPDkuPN3SXVCsDG3ucCa8gun/KH/qWv4V1xkTvgCa9MQjhfz5Yxuxg89EYKQeCiwJVpEAGLqXj1MZuIDd4fLKT0neCDZt77rhBYbFK6XjsSGMECzS/6FUXZyeEp8bIp9ZgcXEjZP2y63hAvHs79TPjuN88R8+YDw9tMPVRIgskOsbTEoBhJk7ypoSY5C0/QY3txIEAQ7nws6/uCF2uN/Eg2K2aBFoNzfeZgOVswzPt+VOQhbZlSPfDzWcV6ExzIHWOdw7pgvvxWZ+pPYLwss0l7H227LQGi0T/+dz1KgRDdjMTglBgPdyVrRqkLwuEL6O+ExXnBMSSB4BMxwgs8rTwtPAeTNjywLqv/i5k/qKa0qrOBSMF9emOG4sfBVEZ5eiNPZjVWA6u8NH+n2Pp5kfqNz83lpcKZkpLRjEgN8KP9Zh3l+6HF44fbaiAOEPg/zfyKlg1S2wzPRaYQwgrPmNrHewB3CHDhkg2P+KKsKUHUHftQrVIKbhZdnbssrgH5Hve0dOlnA10/15LVIQLjWRZGmX4KgwXiQ84goNxjnm+I/fqWHjSnFuZKvxJDwzPrZu97fuOsb+92nWHela7+LsK4A1iXGuixY15ppv7uVu9/9OLPfPf10vxuK+fKoI8VcWYQqjPlkHm+bUgaHrR3Rn86KMMPr6DJEIwfN18cjlI5KwfLDCxp1rMJg9zzi7a4ZD9gnvX8ecY8BDOLaLHrTD0IH0ZlXkUbbuLuYL/OEbvUtpACUTFmK/XyhDrEqJ7y+LKjAgeP43AxZRRiefdt++IMM9DKQs4TaioEs96ddkgw++JbzVSnFnwV+NzupdD+mBMuHTjrLL4lgo2Lfl5/3RQYdJtQGm6KHNWwTmlD4+9HAHTYNcJhNd+lJVgUN4aAQfQoFKKenbnqmJQW1AX5FbSUCoK9kT19AyQraDI8NuLkPAVEr/lIzzx/cYcyXX/9CNkRHdSFB4Kfl/eZjkLYm0siTpQWFBlcuTVsDDKq4tDwpUYIQPQ6fhiRpKPFVq8lrFoATkiSlxyIZ4RO7t9/t6C1cc7lxOHvNQ7wR5stbj2gvrKuYwxElYe25WjMIn6CSSA47Di41l3U2J4whzekRbUW1ATRwtRh0M+rCZVl/lYw8Lcg7SRjuxAXg/02uFY2rwABPtJ7NphKcwnyZoEqaVUbZB5aen3FauOkNhg1MbXs7AIR+ncv5wusJbYKta3s7ACZ/XGYSGHGHl7y669eTXKHj8sXTh0KdYYyi8sokgSNcyS3v/XfPYN7/+XJW5P3EtGAgGu5/5PApEFL/VHwfVfCHUKPvG+OF52HuAD1b720PuKG7EW0w4Qhydde+lBIeB7biQ+yDs4KgViSsF8emiCQ8jj21F9VGu5gvS2uyml3w0YF7Ge3aIYoSqNo8Y9Lozwl0IOLZYUV3TySies/jerk/KrEw/ZKmGYZePVSz+00Qg4rOW9HEK8Qh+xp50auV8Yjt1aRZp0YCIsN82bqWb+GpUSxipnE5nesYj6yDvwgWGSShk7rpF0yqUtEN4uqR3d0MJCF/xOneejaqzDVg2NuF6FCSQ+beLkRJa1z8e7sQRWbwdry/lIdIMQfWFVu926yYjux0hYrviGSiwNOL23192WjyB55sb8eivAG+Zas3eWiwpk9zb8eifs2P93XxBWgrzNdrb8eilrbXpHs7Fn0j/3b43z2ZvFjXFOsew7rnse4PrJv7P93PWJcofL/7Guv+xrpVmC+fcnx5ZmImB32a/NE725aLCE6dT7dczUO0H7KtHOUKEGFk5SqhRSF6733oAq9gEZozSz20VlmERA0mBW1HilB3w9+P2t+L0IPS3YB/95BmYb4s+bHnlaZlMbr2cIlRYLAYTZ3xHBsJKEH1uCm7sV8lSE4vi0NYuhTp999oymUsRYHWbtxM90vQ4VidKmbREnRrPnT41ONilLVQ9v3fvalVmC+rb/npnRMsR+V5Zni98TJ01u6bhZhxGWIuFT8hZ1mKZr6r/bz0sxjFRBfdjVQsQr9lnD7FuReg5y3h2qov8pC32XnfneRcpDlhYRL3OweZYr5cO1JATSOSj564iYsP/sxF7j9aJt4fzEHqX6KGiEjTUUU/0c2rYomI+vFShA99FDr5JTMyMPkiOsNsvyv7ywXde5RNlOy2tyureNyLrbngivm+L/s60Di+lmZHAh4X73Ll2YD2ma+3o3Z9wMLix9KWSihwajCyzNvEgU/C4lWOnmTQNaUXvZWcAae6qEV7aHOgnu6xzpxyLvAwv8v5d48u4dt9X7ZrS9RI28kAw4pz1lrjWWDVVDys3pAD9mmH/rkckDzUcj3vkw/vvl86cy24AGQ5NeMfiRdCVGX3YbHCQugtGGYzbi0Eb/8Hgf/u/W3BfJnaozzo9Gg2zE3zUDfL5MA9i4M/qiJyoLBM/+LlOzmQMnoSjGtz4L7z2YK4czlgw2mwdIskB+4UdnRE8WRDZuyENZFDFjztDPf6d0+xDubL1ePMerNf4yHb38mo9Fs84PTHL9m+jYeC5SZC4oB4GFA1Oc7RFwcfK9OMdFdjwWeXN8F3KQZmU46RdK5Gw7nkhq70mCjYzD5JT94XCV8wXxYTyU2e9PSGGJVAMhdLb7jTW1M5QOINbRT6D6pdvcA6OTynyNYTtBob23l+ecBNC41KJq8z4EC497jZcgc+/zf5EV/dgHlR8GiFhxsMGp/50LOq2ZQ93UMRJnK2SebW+5SBp6FNnrVy6d/aQ9WMH+S/bibya+K4YbzWfcuj6e/ih5q+X+5NmVT1TL0r59X8VqTaGGnPNr1Y97ste8ux6VT/+66mxMQmmzdzjYe/n1RzKurL/EWb1mR+n1GS9Vt8k/3dh2Euluxq6jl5NOwUZk1kJ65bHr5m3eRKWdBFvXBM7UXCxmFOdQu1zZPWy8vrJ5v0UyaUz8vKNkleHP16pt27yRzzZcKAlijfL65IMOicYckDF3Txb4BL1C0nVOLRvuPWYodklN0JhEit0a0UBoJ3ZKZIPb+pOqxRC/ETulanNsqgo0clfZxDmNFSz8Yff/8O/Cbmy4H+taIeRyLRs02H0srIcPTtgWaa6vcQ5ELC2GAfGYh40tosrgX6od125zRnNy+U0y9DnGbiir5Yy/kn8NmiK/mXBE8/NEKHpS3Fg4O1ER7zZUExnLhQWSa6IWvlO1GZgYSU0pY7aNKR26JZ3uKnFHRbOnWWiTkJWRxQDKElj0ef5Asu/SGLQc/PNuasfA9DYbuS1mN6wajLQpii9GYgUsJ82W7giuLKaCFSIB26O/CtEHFbZKSM9RciJuoa4cnEQqSk0i0sN1uAqI2jT/kRFCCpcaV2spU8lK/3N2dwIRf51VAPvxbORdpZXebL73JQIubLb0yUxS/J5qGcjDfsRpCPrgdb5YzVFCCWrZvKDpJFqLbY91FdXjFKOhvl/rCyBIlFmd0JsCpFOUEkUwT1pcj+bz63WHcpiqPsEMsfKEX/58vJxF8bLTcN0d3I6+p9g27IVFDh86Ugf/T3zQia2o5CRycNPj+7lIjmNBoT/1xIR87KdeZOijmIwaawQIlz73l2WsyfxjofUUXLR5/4nI84MF++0/C3gM0rByzyO0xOSWfBOWsvXSP+NBD51sNW8DUBWFZn9T1fRYIDy4V8Eks/cHhbFjPEawvb8teWDhiYoNS3QoVD4u6oXq7z4/t+T8SJ+fLHH+65JGrFMGBm/vL41SKYjNsKKNl7nsxRDJwRYy6A69IXX3tJ58ENy+uzc5Q5wNRvG57akw4bZ1yEFNlS4OScn9v7oERwN77nHqubAH9o9n15l/Qe1eR0EXius7m0vSmC31YtD27EFsHp3qNULguFkMxgVBxCWAil/kpGHN350PjSjyIoPA8uxefcnIRcmHOrTn5pnQM8d9MXc3qzgQZz4J5otoe0FYWQ4QaXTJ4Vwucvv1w48IXAd0th2SatEJy0rtflkBcCw2bpbRWtAtDkWJ/uMM0Hj9aV9HanPCAf2o26W5MLM0zbmeMWuf+/O4p1r2Ldt1iXCeuaYV1KrKuNdS9iXSKs+xPrmmG+vHhv++ZyZx68fy51T4F/7/Pc+8r8Ts2HQlNefejLh4ylG0nuM/kwYRUbsXQ3HzoaRaUJdPLBb3GJS6EtD/rnrPGFJ/NAsdIlaZY/D1QwXz7p7C0Y+jkBSsbuXPglkARMOt8/j31PBpIB8t8TA6nwYlTy/ZUr6fA9V82OkzQTXi77sCZuZkLga5faR5FZMAOftbwbsoDKExes/zoLejBf1hhJPa3Ubgh/PzOe6lq3hsrgnsQ6GRdQsn/x52rNWbAWbKU6rX0BXrUHJbr/9oeE9wKEirzBsHvMSUs8NhTmE2qCTYnDYdFkmPZudTgEYb5shvLHhs1PISfnskN00idQdwdvGHGgJYrkF+Q+P22IcnkFpnMeqKCjn1LUHjTO4hRi/Ujl8cow+epXLW5ZF+rrP0hdazABgo2agHIbM5jBfDnB6PpsKaUiOnCU9XhipQzSGbh63YdPGA3WZw2/+U2NAh4uEQjVH4Y7UiVXpQ3EwHrr66lRIQVYFRfbIIxWA9AROdJ3UgPe3ehk3dTShPzGfV/uc5Jvk/+1jav9sniGj40Jzil8esZPLQhBUrePFNyRBlcJ+2aGF0pQAiRu2iEAPDrWl+WuaIGrgRB/U/cxuPiRd11fSRcspm866PTognvfvi/Lca+UDa9/wp+OY0xKpSeBsq80C3etOSHPmrsAtYgApwt/47O3MvDyCX9Ma6ASzFOeoySwUYfGFJwIW4oGBNq+b7n/XBOuCTwqycRpgUH+vi9P6FBUxpX8wneHK9AVU6zirr1wmR68wgA0XLAlNXAERgcD/PSjxWCjePgN5bQMCH3xo78+owBNpz9dk95QBpG8WJWHq6pA262R4/VODdgH9n2ZL2ym13T1K74hY8l3x2ETd3bqy2tDSQZYoyRgNkzlhbNatUev7e37yeliAzZGaSiEg/POxXJQ2myVJaKnCKMV/R8kiJRB2b+PHpqVwb9u34GfHpjXc7s1i/c9Ud1bJrCOExQsrFBZpYOfTZ2CZHE8MHZ0oMEuWxhMKq9K/+GTgr4RCDUPkQWnvM+bhw8qwMJ4CK6wVhGuZQQOMTgqwQfMl+135v7rmtrsd2OxbgvW7cW6WVi3H+uKYl22if0uP9bll933ZZEAJQEv3mm8CzGJYX7FL9ysKp3+2DtaGLn7LHLsKhdk7LiPv3kgCGOkvDGeHeLQ9snIlHlZGo7R2XgZ6ckB9Tf5PP9OeXhpV1I85quw9/3d9+WAEPPyCZJh/IhWo8gJ6VWc/CWS358yKKHggJmXTxsrBJ94e/gWCR9caXpTu/5NGN4TKZmzb4tDxhm3tyY/pSCV7QV+TEIGDm1nJFo1yIA95ssXZkhu1b/6iG/jJ2KP7/iJK3IXfUNvTwIjwepsN+gPg3Ke2zmePE6oL/gwNGjNB7FPY39FaQrBWdKnnZ6aR4FP2PfcpJQYdKvX3GknEocgzJfJf0QElSR34mu9mRWUOWZxziV8X7+lE0DfI7k6q3IqqOro9F5vZ4QKqXRzhkAOOM0YRcrJzgvcMktl10z5QOXFMR/JZ/wwt1D77buVAPyfL5Myej3qHG/GkxY9DUkJnMCFu+xy2Vtt4Fgcuhp/9RCDPOXEjHsJNQg4Tjvd/c0AT96dNTAiYoH6y+ynOFjZgeh6J38kEycME7oLay9ygjnmy6RqbvIPLj7Gbxp5Rnwc6Md9PqkkXtn5EycWbXedMGAbp/bQ3mhYlBiaZbbItm3IYUhO8J3STRpwVI24Ej5MB/6WL6bPiDKAyaK+mMUzBlCo2/dlb0+JO9ZXq/H8U4K6n1Le4D53bnW6ek/hFFTrNz5ZL+Gk0mkGzq1v4Fgrnd9dMd7F/ea908TbRQhet63a/eQPgvNWWuChVyTgdtJ1qMmHFC5gvvwhdOkFLU0pfpL2jdBGQyOu8E7P8QdMH3EPK7YyvxFP4HIFqmK4PWZxkWaxfe9jfuK+jX+t6rVdwalPxtRJ3l/DJTEeZO6RXMddUPDb2epdxzm27PvyDaqZLTedOPxLtv6wsY+XcY2reVcdBh/jzjE7E19OfoXzkeRNnCl6hwtrUhr4dPUj7klsFwHr6QGcXPIjSUb9z7ifJ73Y5tiGcUSXqfKzp4ZxVMX7Dmylw7n4ysQcH2zvyjNka4QXlvmjWpGlgbeojq/vCeHF10nc/tDKehRXo7Ag6DmrhvsZvLZwJkALRy9Us25yXhtHRXR4ANethfseYhTBqKmFezG232Vj3e8mJ+x3zXO2/+tu0Sf/1x3P2e+e1PvxXxcntN99Kl79X9ebc7/7nsz4v+7Y6L4vHze9McqAInADLbevZ9lexefjR56w0j3BU1JvvMnLfIWn8Raw4Ut9h19YcFgmz/uI5zx88TmF1QCeZ+ItdYLCZ3y53iltVfJh/A3XhqbEj8N4m9B9X7b+Szp2fbEEJ/GA1Ah/txHPmJv6tJ/mI96y+roO9e44Pv1ulfd751l8UXC51WjYT/xWFF4313oFb79ldGHi7hp+YdDsuonkOr6vo0xquHcd/3++PFDxaPp1Zg3ObIZgJMr2DT7Dk+yZutsUPljqrNtFqyV8Smrn6sjGBv6I2n3DdLNdPJ/hg+btD4RoJWGUu0PpICpUoylNbydBxA6VWvoXSNEK5su6XVFtdZ6PcZ1rxn3JI/34tDAZS/6un/iTsoqBCUHb+AgJNqq3YsRonbL3oJAtOXp739LMoYoGLV+Xu5gxRIeq+Cs2WI4yoENnXU0/P2VAZpgvd+bWsLzYasadufgp85HvBP7DR0a68OMb+L4qS6q/XcQozZOv+ncBNcoVm1se3mRAl9ZYzoYcYEFdVEr+zszsqLTIxm7kMCdKU7l6/P4CJzLFfNnN9TQFfVYnbt7kSCUr+yz+e6V26Od0AnTsgzpPcTkVYulXkDboYETSOQafiwM5UGcH1YI/Oy/afB6sS3KcD81dPRBd/owfueWIXDlhLYA2D+z7MmGMdKlb80dcmpRez9brn/jZColXp+xJkM7lLv2n9IfRiaR7MkfyOBEbIyh3W/Oh+zRFj7w1hdCqk4TBcc2j6J76u9MvpcRQ24uYnioicVSD+bKnedOTZ5TDuMh7YRqTkqv4nAz9Y1wZlGh9uYiLvo0VSQ6R00SR8KHPjgE8Xd+EkWJE+7e13+LI6cJxKdWfUmiY/pfLOwkZxCO1I6PVIIPaMV9OtL+RJsM3jXNqq7WrvvoLT0w6SVPxjhZpP1a7X36VC1lPst66+UAQVU08O63VIY4W5m6kEi5Lo8Lqwz/k9eTQm6uVDQ6d8sh4rqDyta8Cuo/5cjjpjF/u7VkcTasleyz/Ov76yNX81RU65KlqnTITy4M6JkLSFLOF0Xm692xzfFIoHkckqhkiiyaeX/c6eHCvYyenmVSriFrHwjgPOiqh90/2u5do9rtbr/a7Y0P73Qms+2t8v3sN66ph3Wqsm4B1h7HuNcJ9X1ZcW0g2+PUVl9rQb3nAYRN/49P3HxSSDOhbK5u8aCovimsmVIwnOYoEm1Z/UjBKo7DNTAnLYjmk5NJrzqGniN4063znJVJGO5ExpjLNyujWg31f7modSrUr/YWzD3pi10y+itd+XPT+xhUGdG47+CvTwBE0E/rngGS0GLqbgvchmJZBO0onDhXNKKCCsK4+gQ1lpNLTmVO9qoq020tXHd+poV9t+77891773cdbn3DBcSGN4vQkyL5c5lKsNSci1SIRrGkRQTWzv/vr38og5Z1m76eBSkguyr9t1Vodldb/WGFI0UCnaNyjbz/XRCeEb5on47SQWuW+LysfMZEKXdvGT48Gq66xMiE358+iVNSC6Oc7orMpd6TRy5jDPGQvlFDL49GviiGAQsRNVyWuaCF8+27Kk+5jqPWOtru2ki46f+VoN/Toov/z5boy6rVrlIpwn+lNUGalDAzKnDGI5BOGsgc+ZjTb1HCufLOCqP4wGluTPM5tIIbWZQZneoUUUGQeaG1FqaFsU1bZ7pMa6PUrqSOrWpqoHvPlcN4bGmPmp0BvlSyNQfoEKLquCpAGWsLoWYLRgGlDYODnkLr8QAVKcjgSaZ/O4qMq+e2E8MqI/m5BkeKyLloYM1grbTBB+BuF74ttzJAO5suGxm13xNoNUVpXn+PrdWvUwO7gXyvjgi7lBQ5cqjmLiLaI/N20LyC/O/VfXX/7o5V3H1zleYOReARflWhsKIq3OTJqTByOlm9/D66rDv//vkx4KEAk5HMCem7KGbomkISy41PmRr8no3NFsyx7Owsh7fU/l6+kI0EqkcscpJkoMT7jfMJmJhJ/QkS3t7OQlDTfY6+GLMRg/uKn3usslIL5Mst81PG9XYgUA8Wc9nYhulTU2byVmo9yXU9T7e1ClLk0f3JvFyKl0E2HvV2IKPgjuPd2IaLoqmTe24VI88uhf7sQBY0Kpe7twv/vywxuP8P2dizKFivw3tuxiPLqebW9HYsOr/h/3tuxyI3rd+XejkXdph/u7+1YtPgibmNvxyIKNtLavR2Lip2pK/d2LPK5T/1kb8eiVqxLhXVD/6d7BOtewLpd/9M9gHVz/qf7AvPlfL1fPyemixDFYXPDtjdFKFOptPpGbBG6CVK0LguFiPtE8q0QwkKUJsXjw9Gdj4ZiyJWDwvPQz4jF0UnIRZ+eOLS9tM5BfYxuF3J7s1EY5suyoRR3SdSKkdLjwtnjV4tQtxJNVUlhITpNnnFDjLkAVS2Q0ntL56Err2bU5ilzEIHbO6W0nnQ0e9x2RZEtBUn5FSp0BSWiV0mCqnG6CUgZ8+V5QpJtNq8cJGR+9Ii9dBZK/nlOwJg/DRm6qREXfk1ADpv+ot6vIpFGOGUUmaUfenlaV3yK1xZpthc/XdE3gQvCRT0D4u7AxkLA+KbfE9pq9n3Zcd3ir86mIWQsZo1+GHSDvosKiuVB/mB77JPs5HYUjPtIHHl2KRFcsi0nti+kwwF6cTInxRw4z2pjqcSZB6uVPxRprPPhivM93ROf84Eb8+WlhOVDl2Tz4NIqzY4h5IMML1H4WE0BfKs/JOkgWQSzbbOP6/KKoS5G++LDyhKIEbBoC7AqhSO89MQH6kth6uJDPbHuUtDMyLDNHyiFC5gvm5XcdlwZLQSLo71DA98K4aM8VeNYfyEwMqc6TSYWQkAkzRm52QKgVHK74kdQAPlVGVSHVvKATODC8OBCLnx46yDUKZwLQwzjV5bf5cBDzJfvrPbkCJVlAoWeU+9EZQaEfb5p95omHU5mG+wsfkoBJrVQa2bmJDj1afgrLXk8XJN5Sf6XLAbOx1zxWv0eBl2m6WLjesFAFC00WXozEA7l7PuyjnpAlceRSKgcsmKoigyHk3deEKl9DwFzKiThEBkIvg97268F+gFn36aHi5sXHBlx7k8zcYXrjdo7iXy2oMnUyXr2oREMWgTThgVrAwXmy4VZDK99v7gCF5tSfskDF3h2rHop6pYTJKOJVPcWOyDZIkwSIrUGicjFnXdkpkBKf7Q8vFEL5L0UQtMbZaBsujvYI4QZ2luips0DOnBZiiVSNUv+aje0ODm/DwQ3xQYOrXQ6eKtRXWmRx5Oda4ouipG0zbduOrf0updmzaHJuWnZRSxQV61jJyWbicqtKc6rXebRNZOmJ5lOkZnGvk34oyK+uzci1DIct2++8E5qGjl9uZyJ77zauTEvwn6y6Ca2+Ws5jP0Balbm5BJ5MUlN0XxT3haTuk2e9nHqaYpnm0DyQKac6Xm1k8YtvHn9umpFiRW4dhxPk7XbUYoPUY5Nbqab//ly04bRZCshE3zEO1zWdZABiqFMr6AMLRA1+ORZMGoCMz8Nyl6vWIEX/eREdL0d6HH9deYtcYILnf4kxbUuMBcbevfbqCvUWBEF/XcvCubLVjf+XDI5r4AoX311ZFsXB+OBR1vdvubwKyPP4RGpC3BXpZ8+vOgJpYZ9AxE4P1gwjWZ/tBQAgTPOFC3twfBWhX3V+lIoGNTYcfx7nX0L5stVzniX6AMBiJuZ00VZ9QJK+PjOv0HmNHrnftuOpMgY9ZwqbxBsNINv0R4NXS0e8KFfMdSj5SK0bvCu7sqEwJ1Yq5813eHwyJ5h5N+5AGnMlwnkmYWk/r0ee5Vu6wRbNrIqsLbTts5AyStnmO9WpiDfLJTJp5eAjgZ/ldLSi0Z0KT45wQFByMNswpJD7Bwi43hSV/PHDcVsW17mWnRECZgvv3iZJpH6uRSFz8yPvOsuRY/5VxTsS0pRhOu0YAddKbJ5j6MMFy1BiqQmdm+Wi9CONo373N5z22yiWNNHowAtqbWe5NTNRzNym97/zl0cxHz5igWJmYZdASrWKheV8ytEAysyve2zRSg+Z/SvU0gJ0pkS2pUdL0UxjxsoWufL0IRRH2VObjn6+yks3ne0HFmH8A6PrpQjbabXRP/OibRhvuyd/fpQfeh5dDA8qb2MMQiV3FfxNoFotMQxS/iIOREdOWdvI/YxDZ3U0pKmYslBN2nukAzt/Tyb6g8L8TtUgEYTrgUKsRWivHv1v/6da/k/X85tiFyqpI8HB1bep64mMcCvr8FBrx8CFmuSWteueoOW9HsZKglN6DjNZerD7IbuFMrIpTEHoE+g10UWH4FKTX+XBNHFouGH8ufKDeMQP+bLd5wf5TOuZ4E/+ynh0fkMOLoe8mHhZSpwlQ0ICl1OBFrvojDizhjofKjSuBgYDLkm4Na/5A38lPM8PfEn4G8/T+AChTCkn02oOfxHGc1hDmy//ceW5ncOnIpU7hIUzAFcwThv4+1MCH/QzR/HnwbacPHTmcVEqNCUeX3pXCwMQejMKi4MiAcKKfWJ/GHtuPTB33+9oZrS5cebZA/YwLriWNcL65Jg3UCsa4R1y/6n+6d/v0tgtt9dxrpkmC87XDNnYN57Pr+uvWFo4pYLOpJqj29G5oDSm1yTIL8ssPpsdVD4WDocOvVepv1pMhS+rsv3UUiAyQjCNTOpWDisHLB0ny0KWPtsQ/glI0AQ82X+B7b5w71ZUMvgRh80lAUjOTyc8w+yIEfjoM1lmSxgESCLMtLKBBIF6s2DC+nAd/SMLIVrGpi85l289y0FeG6QutO9SwYb8vCee3rJ8BLz5bIR9O6EbgR8G6T7W1keCfSMsWaZztHw5uK3+vrLMfBGsPukg3csFBCYLS7/iYUf3B8vFBnFwYW7V63m3ePAcsw7Vso1DlhU2m78O6d3GPPl9xfFGu52mcPFJ6531pmsYVorO/lW60lI2/xMO63hBNKHaBiVzrvCizLFFbcdd5Ah1JyMOOwBAcoa89FFZyHwyy9KoXhPOBN9YvvfucJuzJefT74ylRXRguvbboN/BY9BIK1n8MyyLgTnqMZ48//7/bfHD8xM4NhK71AwhRnUUR97KcBtDuIUT4ydh82BR/aqkJu+BXDFi19z97cAR8yXhzU95Z3O6IFM/iwB1y19ILy//fmZnSFw6nk/mD5qDGbLFfbab03go2NV/QDxcdBnyHfxbzsOgdwe3qk0ZpB78KHEdQ4zOMXyxOrfuU2E+XLtbmuzKV4LfC/unKvr1YZsnViyOEMdMNh5e+3yuC4kX8yPqDbTh582k5XvfA1Ajpr6opGAIVQylUq7/7vH8FeAI/6mIeT5P2gfqzeEQ5gvG7Ryy6lVqENpQ743uS/AXSshT6ZFDTCW4ukk09aCILdanjfh2qBZukhq4XcMbsZqT91j0AHB2+QCx711wCbp2vvX2Tqwo+7INlCqA+yYLyeniDcshKgAq0jQFUNyNRh6UuD7VAQHXtPVCn6qGqBxgISfy0ATjtCmswixa4FFPaKSrtQCriN8gdbzWlBlo8S3QaYNPgb+vtq02nAmfd+Bi36y2vpSKYOAlGRJZpoK8B53y3mUpQbvIj4pJeNxsKp9Yei+kwaU/b0iWCGkCVGPRBbMajVhY3zppv2iJjCH7bSukGuBWaLtLg29FuAwX25b2O/aYd0O0/3uAax7D+sGYN1wrEs/sd89gHWFsO45zJcdzQ+ZhVIrghPxM7NIbyUQrbdI+6O993XxUFzjOqYGTiqW5ztYcPD5aqFmeSLA0ICIyGNlDTCbu3JaNkQD7HAXVudzNKDm6gC1dLEGMGG+zFTPOlWmJgvjqrefCTvKgYo/+fzvL/Iwbfl0/XSWIvgaUT50p1cGF6JaNA4qINLCZP6OSBVIxYnTRb1UIYTnOZ14niqoftt0Y72kCiWYLy8/MWpv6hGH8u3BaJFcScg3521S3ZCCxmbG8lmcDLT9+CCt5CULk2a3+DMt5EArpyYKvstBW3icWoOiPBj7nv8hbiMPbM/uE1c6yMMS5ssFk2oRRPMCsGv8x15JTgieF5kUiCwJw6tTOarPPxwFTVn11upkMWCgTGwUGhEHsVJCirdPJcBauTzcT1QSnl+ormuwlYSaMrflQFdJeI/58n0uupyfL7nA6xsj3laPB2w8rFNVo3iBKP3RamnXEdATufki9AA/HBJjOmK5yA9yTenzuqkCsNEtEM79WQDiNC9IfdsQAC5boe0TuwJgg/nyMQf5wgmdwyB3ozOqP4AR1IwGyUKpmSGOo+4c0xsWsGCufJ3hxAZzmwmX0krZwZo9J8LUnQN2EtpNaN5zwLcP8UUzaxwgtsuWbb7DAWcwXya/p09QRU8GWncnFYzCDwFBqqqHrysFGJaEU8N5KmB+osWPTGjgTpSdlZgrLcx50XXeHKYFETkngt9sdNB9U6N1VZYOaGy/tx9SoYMczJdjq2jY1Pw3cCb9VW/VezZxNEvEfDx3fuNsDug+db/3BwfmDLN2kTu4aB5SyrTJXVyXz1JX3xkCyLMYZ/l7jQAeXzyl2d9IAP4jJQRezQQQc2nfl9kazc/L3RjBMc0pchUZjeHmeB8sLxybwOl1cWsSR0/iWHhSjp4uncJRUwkfjPedxllSvZgt3p7G7XouV2ZpzeA6RpMD4u1ncF1NHA9fu83glP8Y/ufAl18uTrS6aeJeip1WbqhWx7kcHj3o+FQGl8PdOhgc0K7e/+SXMJgr4z2nHT8RvjTAu56dUznjYYF/PLWBRlat8Yvj53LTMm3xREQR9EwkJ/CGxftdaYbl/7ol9zz/69Y4Tf/X9Rq26v3XvZe8/l/3cZ3rf11i0/2u0u/1/7rRm77/dSm6o/7r0mC+LJp1r56lYARPQkx6lQvG8Mvkg8RnNCfwQ9qu8lvRk3jlJBc9+4op/Ip2X2h82DR+nLQ3toxqBt9Y9T3tpu0MnucMbeTcxRm8CpcpaVrYDP4P5ssWomEPYv038HoMixVhHzfxnz+eZp+u/41X5rx4heLxH3yRRNLw4/gd/BF19pdk33fxiLfbsdGLAHF3xPXfqSJA7lvDJ3AvCNC0m7387VcEaMF+35cnNOttZJjIEIN99K1XUYeQERPvobjTFEh4tdfRzY8Kyf6ebXcxpUGBCzwUxS60yKOC4rLcEC1y+X208AsLHWJyuzEeK02HbtcecQ1QpEOEmC9bT2geVD92GLFn35PpuciIZIjdphcomBHJb563BB0s6N1VIiEWezb0jeZs204hOxKd/3t5zZkDfaz9cpXqDQfyOiwlLbPCgSzNM2TbtzlQDubLEkP0bL4tXOgyd/+9O7o8qMaA73BDJC9iyQlWN+k6giijv835HuBHNjt+uomL/Cj7dk9wTaoA4kwL8rn8WQBV8iRX+G8KIIdLdZ3fdgWQPebLGndOJgbMCyCpNzpUdXJC6G6sUObVJWG06nabSqznKFocfV1LkSKGps13H4eMiKN3F1vpyRolUHWlmsYVUUkkKbr05bOtJPKWzmnJd5VE7zBf3jgufaSsRxztPjtpRpQriaYz/14W3JBCOQqPNz/gZFC1ndUoj5csKppynw+0kEO6JLkVwt/l0OuznTEVivKo7MNzPmYbeTQhMSue6SCPyDFf9hgkKk5Rk0VR/r+OMznKoS9nPGZnv8ijR7X4DPMsReSWFCBpSq+MoigcG9tBBalti1PeJ1JF1G3kTdRequiJUsVpmjxVJF1H7b5drvr/fdmhflLHjVoRuXab4Dy8lVDkwpuur9oqSLqDX5v8mBq6YRXr/4gFh26ptISnJQKqNuoeqFPWQKyHpSfEQjSQ8qDc4tccDXSkxlxDtFgDfcAcmCrrz7QjlTLSux/cEZ2mggYUGyuqs9SQR+JZjnA8DoWdF+W/46SBvoYk55cJaaLgAW4Do1pNZM279sNmURNVqhouzpNrIarWJ5zk9FroK9Z9nLnf7b233+3Bum5YNw/rEoTud29iXcC6V7AuO9Z1w3xZ7ac8w2SICkrsH1PBkashZkcT8zsiODThflLHW1UD9WYoKLMYaKIHqZJcvOxaaOTO/M7RSi1UgQs1PT6vhcoe+M4tkWmjq41nxdVptZEN5surRp5VUhXq6OhJll87PoD0LeQaaBc10HY/KT2RthZaDF+3bg3XRkcrL7IZ+x1Dz1kev6tl0EHRumtL+t46iA0fmfgyWwdpyP3u7C7VQccxX2aNOBWgj9dCdUbNLNW92ghHeasm3FAH7V6Q1yge10UheY4818z0kZ9Ug227rwHKkXFQ1BEwRDXpd4gc4w3R/OURpac3DVHb+8DKwXpDpIX5MlX1aO3JM3oojPFLBMstfdQl6mz32M4QhX3sEB87aoyaHq11qr81QVMDl4h6iI8jp3D/ct+244jmmX5UEo0Zui5ApHqVwwyNdJg5TnKaofeYL9f0HTKVENFCz1xGWjcFjyECEnrj8WVdJFyoAmf4DVGDhTKXipkJkjaWFQ2kMENuVo+o+bjNkdPTngKHYXNk+jvVx1nfAv0uy5px8bdADzBf/nLgPemdLnOkV8P4Y4XJGrFOvrtV1XoSEYa7041rOKHrz7mJFc67IupDZj0uO+5o/vmPh2GHPVDr64sNkUVnUWC1bR9/vCfKcPJsiZjxRGuYL58kiZC31Y1AblIZXjfKI9EHPvqOdOdoxDuUuVx3OQZdeHHupr13LNJgG9Pb2y2oWeVyf6FRHKrs+Ptqzj0OsWYd3/z3d3ckrlFy/bsX8SDmy58OCtLu7Sw0sqxTHjiUhRxoJhvmHmShfKE6kr2dtff/t1J3b2chlq+0g3s7C8mDuPDezkIeuIS1vZ2FKh0iAvZ2Fgp6ib7+u8cxDPPlmWou1r1diFS1NW33diFKcLv9dm8Xop2sv7l7uxB1xh133duFaPH09M29XYhe+Mmx+yokoAuM7anmUrHoOnu7+EO2KFTmTf1CQDLi/zswCQdj/N6ORcbtBwiEBHMQxTP1kr0di3aiPO/t7ViUIkEb4rGYiKQJpsIun4tF/KwR7r9wYWj40rkrBkT+KHT3idrfv96I/lCJSFeyB/LHuuPs+10HrDvZuN+dx7pXsK441jX/n2421iXFul6YL3Pr9rEyrWchDV+CZ6PzGehERrffz5epyFDd77PQ5USUa6GqfrAzBl0lljyxHBiM6iXcWgeXvJFw/UPywfgTyHTpgbkApTB66ldcubmtDOOYL9ff5H5TRR+PhvDqJW4mMaiG/Pscg34I6j2nvF151Rs1O3gYckhoIs1kkoyzzG5gnrd0KoU5ALaY3hwgjY+Aga7FhkC6WFA5+Sq7zDAO3jLv+7LzlxKL2tDzcHi9drWEMQjETE7WGEE0VIi9EH/InAilda25oh/TwN/h2SAlSw6w4HWffj6ZB2ZvJGT9DhWAAONPBSG2Qkhj+ttYk1EIVzFfpuYyYNOwK4A+Iqc/sn6FwCi6Xtc+WwQpL4u+OIWUQKXIi1+y46XQpHeLrnW+DG47bvLk5JbDNiv/Dd/R8r29Xkz47++eLb2/JfHvXloNzJflRVZPpX4uhYxVGdr33aWg8SH5on1JKXgBl08HXSkMf9Q5FS5aAgICAg/eLBcBr8ihV3NZhUD97FmVj8a/1/vRtHDq5kOXZnbfv3t0xzFfJnk/HCB1Lgc+tccWn2TLhlgK7T/a1hnAZurUdLcyBeJemMvx6yUAn3ttpLZeNHx+EPU5JCAIEs/ODnGJnQPnpKqjt/+4QTTTnwy+RUfgwHzZsVlXIeZAAMQoNkurqF6ANZYZkkaZ01D70/M4ZZExZJ0w2OBrNEOtxjah71s8UPRG3NyZlotI+uDFgF2ZEBQ0YRVW0x2OQg588fl3T/FBy31fFtmu07Q8rwAUOZT3adbF0ThXcUuX795ziEa77yGpCzIfebLMsOiJ6g6+ro7A+SGCsuT1h0sBaL1q+mdzezAyPRIwYn0pFE3aGJH9u1eZ+f2+L8vx7VDgCZnQ8Uf1m8ccZFBl+tmbgRlaqOdRzPP8URN0pnbZ7PWKFeootqyJrrdDwnPXlXlLnJA0y9etoloXVHRjqfrbqCuydm+48O8eaBvVQBceEV81C1UyLhMm/6bV7LopoT6lJhVvDQG+9oCmYzsHBE7an1OjfZh8Wt/vRBONMF8C/3qY2lJJi1EAUUhTKsMdybvKCk0X3tDeskw3aTpYPWpZQeajthaAK+P+6t/UNuq7Ft57oemudPr9UxG+amHZ45OvZiLUcnbF3h4tD28y4Yz10lXQUqP7y7Zae+Vi09tbhAcDTps3Pbxc87vjl3uTHG1xWMjFU2rNjw8oWrn4qtlivnyu7Uie2bgbdLdTndNYcYfxR5Rmr93OAPeG093Lix5warBUlNXSE7r/jMnbOHkBZ1ko92Nib/imsmxnaOENDzwtRlM9veEr/uMRLh9vsMN8WVlQyY1QOBwEvlx84dcTAYavAwR/00eDz5vf89OvYiCokkTgxpdY0JacjX3WGQfFFD8/a7nEQ7rSx9FHD+Nh/cD4ROZAPBAcdTFymYiH05gvZ+V9SXOciwKqHHUuI9FYuD7DxK+UGw8hVaK1uWZJ0EOSJ9xKngqTBEfP3D+XDn9H+h8JGmZCFrfHvGt2FtjcqDDgNM6GCN/71+uLskEf82WudIIWp0lr5EVMeHNImhHFMZ+bNe6yB9M3pwtTXS4ATXDs+3b1MDgS6ZDVNR4LD7xt7rjuJkIkn+qyiVgqaO8uD95VTYd3hApDKxwZsI35snfW6FnaU3mInD4c91QzF73e2liYZchGt0/4Mq6lpSFg5Pw7o5yIjj1V/+0N0Qh3TL5Y8nYAqrhxnO1CmwfC6TVNPHGwRaET/CxfLA2QEubLO6+euxkvlyOTI6ZfbAbL0UawtK1XcjlyetDy/vJIGUp7sPuu+3Up2qKR7Re3L0FXvFtLnrcXocTBVdts40IkJH6+xFa2AD0Sg5GI+/moGPNli5wXls7bhWhIdU2Z51sR2jmPZ8nnKkEfqSRqTzqUIjPzB6NFHmUoMJedY5SpHNmSalOcPF2OXsTRdZ72LkfZgSpejebl6OEmWW0jrhy9xXzZMUSm2DEmHs1eqjzlLZ2EiqmuMnbtpiL/PsoeVc8sdCz0FwnXuVzkOpR6KM87H23HBdHXHihEOr2M7HPcRUg9/0Kdwtsi9Pa1+t1g2mLE67Hvy96X1y5xbh1HRgqI5FeDK5rWt+PuE/ZDlFSJZ1lzw1Dlj8y5aZ041NuRcVePOBk9Igud4qZPRyFEb8dmBLKQ2HxKtB1NDiqu/NNtFpaD6jAHlmqmlLlA7QaqPdWpKS3mkHit3nXKUR/N+tt8uuh9FhWex3nIsAeh0qtJ+vGPopHBq49DpeQJqIRb972xQTIS7SbuHD2TiozuNL6ZNU1DnVj3DdrvEmLdc//TbcC6cVjXDusWYF1JrKuHddt6930ZKOgyuCEMPK6qtWm+DYQDf2kLnY6dgzISkwMgcwqSUnLK6AK1EfH3DduvWh6InEPr4PKEP/qbosO+5RuGlMD8Q21nFArZTYwes4lBSZgv39I4puWFkqDfQ1DCNSIRFI5/n38TEw9CdAevNo7FgOz3W9q2yeHgfuoDyemVACgRSjYK8/CFpPdqwWd2XKEu3eOn6BVbICSQKyMGc9hV3vflAlnLMmOLOFgTaLzCLh0HnnS2T6L+3T/FM8rQah0L4tZd8QqxMcCQM79ROhsFF8/XjuOvRsAy51zp7+QwSKqj2k7+GwIBXVtuVvoh4If58tEiWm5zTS8ImdSJ7iP0BrKC61yuq95Aq6at6PjRB4gt14KPnPWFn9l83CUlvlA/ciZrw9sX6pAAbfwhX/jhaLv16qYPXISJIG5/HxDCfHmt8YCaTLkFvAifIov/bgFnqpJOCOEsgfeWMFIIsIRrfffHIs5bwusOdpMuIUtYIDM7vHvHAhSfHlwo4LUAZ5bjn5rqzeHiw/wpmmBz8MR8+WJU29l/9wJSkB2UfEZtBrnGUlqGL4/Dww+51Mu7phBHZ0xZ32oC2ikSdaNHjOF5lmzFZXNDcBFi99e9qg+XPU07OO31YJV9++lQuy5UY77sPxrOePaBIXDP45cCbxnC63sKE1N+hsAcb+x16LsBvB4q1rn0Vx/MutzEmJv04FJ8xqme47ogdDLogsDmMVgnudHQt64NW0SsfKXR2rCN+fJmaYSHaIUOuL2tFu/Ye5usVHRYOVoHhn9IVGhw6UCM3MjayXPHIA6G7tKGaMOvKzaaRx20QIuJxpXBTBO8F9k1riVqwLWq+zQlQhrAhvlyEqsWgf5hbShf047XptMGxRk3ktCfWsB/UfrEjTwtOGDeqtW8pAlMt8KjqOk0YVryifYanQZQX/VirdfAAY2rsAvFgBo0pd/W/yCuBk8T9h3Yilyqm5ZJC3I0yE/eZNACe/pLqxarmjB+tziM5rIm6IBdoh+xJpAXavXKSWvA+5GEx0IxOOiZYW/iblCDIB/Le6TOqrDhTiE32KwCspgvbx7a777Cuiew7h2sy4t1abDubazL9GW/6411n2Bdf8yXPb5rapaVacDF46LGHXvv61rdCpIP1YBnA/dHFoU1IJ9SRsNOEWAuu/qX4X118KY2dby3pgrncCciHh1Xgcmc9yk9DMogU0HcpxerBLaYL39Us8rUuaYK4dN+E37lqlBzaJNl+YwqWLN6pTuPq8DbUuMr0ivK0Hr/bezV20qQo2aZM6+oCPOXkoQNB+XhYVH2/+PqvOOpfv//b0eKrOzsUfZex7lwjLJnyN4zo0FoGFFm9myRrDSolNJ5lkhGQlOojMwKiVLk9zpvr+/vj89f3fxzP+d2Xa/reT0e927nHO3iPlX0L/JamdV+VfSredMv73FmFTnopYYGFzt9gl3VUKwPXTezihr6uxBipN+piq40j4637VBFz2eKD0tzqKDrOvSvnv1QQl0taCv/mCKqvH754XUuRTTAwOLUflABXcD9csa040BPgALyUnHe+9NDAU1Lu5SeElVA4Ylb7A1S5NFZ2TPvvaLkUN+XO2xbqGWRxp5Gk+tOe1ClfuzWrA5pZBJzl/9LqRQyrUvbk8gqhURxvxz77usnWlpJ5KTr+8JhXQKV1Dh0L/ZLoIjrZwWofCVQ3H44OFcpjrR/M1bXXhRDUj2JNa+PiCLzpFdNsS4iaCLD7vbls8JoTihidFhSGPHgfrlMZn7wMY0gSlRztc39I4AsrjY9nnssgBR/d6BqBQE077zsfFSFH6WoPPFJGuRFHDEr2jTWPEg08OrI3uGdSKN+GzPzMy5EHtoyoGrEhXbhflmnYqqGRpcN0ew8sV1Qkw3VXihvoOJiQxtZBXUJ5B3IuGVPeJX0DsQc9C4x+x4L6j1hfoZjahuSI/jmvpRjRucCArbMjzKhxOFp6RgTJhSI++U4D/manDYqxFXcSTrRSoXGzs4yTV+mQkkmL0UJ5lTIgFchnOnoBlEyxLrEeWydqDCUIqotvEbc1fku/vixP0R6zqmZAzqrxNuP7of9qvpNPIz75Z3p1qlqgRPEm9EbuR/9J4heV/ceGEATxO8CpVbFg+NEquPftCP3jBNpe5V5+NXHiA9K+Q58Fh8lvrAldnCJfyZWV66+fPD8I/GI6sGuLu6PxJ4rp/7zwEFXGeVj3Z3IXNu0MnjqnMgnTiwsLX90JFPRB6c/qbUnG1mGt/z6ZEGm10psk2HWI4+Q8hmTFDjIfM9H7L1UFYndP5pW0uR0iQ55kgPScvrEvdc2ua/3bXKp1jT+47b1z//HtW0K/Y+b6xzxH/dZ4en/uDLHc//j7mb59B931+omt7ZT9D9uluCmXz4R8SxG/dQEeafBUd3lExNkZ2pTxTGHCXKtRJam1ddx8lTgVfN0jXHyr3DpS/mEMbLIzLHdC+Kj5Fw56DAX+kye7mynJjR/JOcU7wz6Qf+RTO276Zf9HjVkVXdQgeyxnhjBdirg1/S3aqyggtSe0/VD5lRwruZIX+vhDXLuv5+JTz+ukxt6HylR8a+RU0QCox0P/SFHsfFeeKG6So6rNiXtvfybXIb75ZBOkrq5NhuM13SL71FjA9KBi38/sLFBRFBMks/DHcBr+BWGJHaASiWjkMBtFuiXnruxOL4NzjhVOryRYYb+ahdD8mcmSL3GcfSSMRM44H75lunGTXcqQTCYm4rL/y0AxUlHhzNAAJqPtrswKwjA964HWwtV+CHv4tmTqh94oa9qZQe1DQ+sCFa/cR3ZCeQpG1qeDi5gOl1wSsuYC4Jxv3wxjJm/iFYSmiScOL6tS0Bs1JOJ5AEJqNYTCkzylQCyT2SD9VVxkDRa1Jy9KAbR/ZcKl46Iwv3Q91cTXESgzo7HqfSsMKSlCZb2SwqDP+6XB0QUAyYDFOBh2/nd9J4KENOR6p0iqgA87yez9FPkwfAnMHlEyYEtQT2VkVoWzJlKlpuc9oBdb37Q5Q5pOLRXanS9VAru8a28usAqBXO4X87fVaa030sNQmfmOOxc1cCRXSRiSVkNfpqufJDsVAWdCk2z6h2qYHlO8RYDhwqUPE26ePmHEvi8Zp5YGFWEH2f6X8RzKYLWc5Z/gQcVQAr3y+N5oySpch1IsrTnt8P+dgteExzw14FamXh2g0/acDtcoZTzhxYcod719fQ1TTA21vr0WkMDOHupNNXeqwGje7VNcp8qHJlWq9DdrwoyuF+uus1elV+qBx7cz3hasb8JJkfvKMboQWkk+8E5aT3o5yFdsNFAQHvp4Zp+gy68p7G6W/VTB1r7xujqrLQhN+1Q0DMOLZj/1exFSNCEHbgHvvmXZ5jyuw9xdjV6lzkMgL7Qotp8SR9WJvn/MV7QB8m9hFfBdPrgeXSaVl5JD9ZIQ/R88UT42nqIn/0eAYrNBeX/eOiApCJVV9djbVDHuadwrj/O7SrY5H7DuaI41x3n8hpucv/g3D6c64VzCbhffmBm80CfkwRzWboKumwkaDFeKj/03QDOp06Mns81AA+zuY7mBX1o9q1gYWTTh8sytt++selBfte1W+V6RDhgsFVl4w0Bogr41NvkCHAQ98u/YqxYJC4bweG7Sk8pvwNy7ZFfkfIpIxh8qcSjvcsIai67h9iFGcI+5VGVrcdIMHEuZEjMzQC+Bp7l2G6tD1sfjtKWJetBxuHi4RwpPajF/XKVLdsvr0ZTKAp0HAyvNYWlMZaXw5GmIO5UcIB2Zh98IDeqFq7vBa1fNJxsLSaQ/kVVq9vKGD4I9JGEfhtC9vOKxN4VEigNZM7kniLBIO6X2aVSwym/sxLZbax4j8UaZK4c1jJstYKuPexUcxuWYLWV4V91mwWEPyXWvhM1h2pzUn2RjSlINp/K1ru0FzIb6n5wu5pA0nj03OtnxkBdtumXOR/9O6FQZguJajtM4mdsQYTr7Dlxoh0kq6rOqRyxAx1P5X8x4XbAkH3OvVvKDr5HzfKs1duCk7nFVI6ILUz8udTVfMMGMnZWDmyLtoF43C8bLP8Yt9QPhqVfqQYDNCEQFKY25rEUAuvGJzdcBkJhxXhgn3DgQQgmTWxQfsfGvfpi/HLIQajVl+BIYDoIZhuMTK1VoXDfPT9D8HAoINwv27xm5sF6CzgX2ohjvQWGtlwywXoLiO+rvv3UIQGOjz5WwXoL6L6YjMZ6C2yQzx3HegsUTE9YYL0FHHLDyFhvgSSODTmst8Bh3C9PfzNxxXoWbI94Zov1LGCmahLuxvryyvj1CaxnAdWg+RLWs+BCVM07rGdB5eBOseMBB0H60dmjgf+8Ycc1Bz7Fi47gHNE+yIhsoAH3y6No6Z0wioUrmbLCpO6jUBA6GeFtGAbETlVqI2UXIHlJKtAfJaEBo3eK4wYBaA+t06H5z4fR3JB55q+DsYgwQru3tvMkmsn90TKyPx6J4R5Y63F79GEWH5CzH5Q798QGSqJOfX3tvhd1V589Gh4SiKgU7R8q8kchDvO8moQ7p5BQtSMH1mPRPdYhFqzHomiqATasxyKdou87sR6LXjNuci/h3FK7Ta5G9Cb3wf9waXCu6P9wk3CuA861jNj0y49Ebuayrlqhlw1GiYv3vJFhgZzHgHQkaje7eIs7Jxatd+RzjxslooJ4kSljujOo7WCqlBB7OpI72qE4IZGFnvAGyx1gzUZtNRLx1rHZyBr3y7/ennnohvXhqzVTKcFKKah3PN38xUYqssyp5dEJykKrVm53BcNykFf30NOckDyU4n79fS11ARKJL5ubFSpEEkxGyerdhSh3/kBa9I4iFIj75dZRPn7PvwWobvQwo/B0ISpPVfqRu6sY/QppzXF2K0GqyoFvCgNKsV4TJj6yswzNaM+JOvuVIQ8zzW9+IWVI22m4sNmmDLVG+X1oJpahQdwve63S5povliGyqwq/4/sypFO2UhR8pgzVp9jzXxwuRcGsXVJ9z0vQ8ZuCBHnXYhRpf42p5VkhGleU6DtnXoCcBcS4nFTy0cNXLw+caMhDH3G/3NN8a2CHSy4Kmxqru6+fg6ap9V9Mc5xDjc4df36mpaHcn1mTX7SSUezLny8PolMofqYuWOnaEfSw6GXT4fYAxERbT0d2c0QiMztMl+z2YXl30y+XnGi86jvqgB7ViKpIKXMhG/XdVnt7XSGqQi7hrFcEWLxR6WvXjYU34m8Eej8lgPzQuon3RjKkv/EstpBNBY1W47M3ddKhP5qY+UMgA47ifvnCeqGw+9xJuMZ787upTALEao6saeRg5+2jY2aOdQrIMVpwt21NBb2fXp4NYemQd9CrWdI0E1iHpVe9z2VBKP2gi6D5OeCpN753o/Ac9OF+WY2bbEMjHQfVGeMNkf3H4YfmE7E/7KfAY0Z8cfxpPFC3yChc+ZIAlhy/cx50JoJ/odq8gVcSvD6r8OvO7SQQ7Pm2lvk2CTgenw/0+pwEVrhf3h6+65z1Jx8gUUtE6P3whee0ls7PffwhMuLH4wvzATB+9Z8Rr10QZASrO+33CAbzqOC9d+lC4Ou762dNbUOgQGB5e1pQCNzXLbLfFRoC+sUXl069PNTCr7nI09rjSEhV6W+6wmNNuJYhE67wN67FwvPY7vonEYQNSfemIw8PEnj8DZIN8xwI+QYHrEj7Qloe/csXPVxhSxj6YpDp7uLT4pdCtVux6TBBWpm5aMtpN4Lq6UOLDyPTWjK2z95mPZNC4Pm1MP+HIYIQwaVLx0/v1iKf+k9/SGhnS++sll+PuEPLlwP8py7OHmvJd9wWWDnj1eI1U7m9p8aRsDYypOMWeJhQivvl91Xtbn+DQpCRfIFug10I0g6upPLbEoL2dC9m+/kEo3l6J3lfpyBk5PlZZXA5ADXX+/hdCPZHDXTnef1WfVHiOacX+ZM+6Ipc28ylAB8kgvvlvqGnAT2TSejss+n42ukklGN4IaK0Owkd4M3TiziShJac9DLLXiciYcJ45KOlBPTo49jzZwvxKKjcz1bu5ylk95KzpD7+JOIc213B9PoEMsf9supH9snpoXOoW7ooV0k5G3FuaBHtj2ejesuHGSn12WjrdpUqz7pspKSZknYtLBvVjHz80M+Qjc7tCG5qED6HfNUOMnG5ZSE+f2t2yucCmnG/jN7S/atZzUBXuF9abnzIQtnHsn6n3s1GdS8WxrcI5iK1lkmmGmzeyC6Sd6pF56MgPeMjp+UKkLjbUyqBggJ0WWcK9rYVIAGJj/spn2OQH930yyvmeutKjEIwH6I7kuG8H41qpE9NTIaiwo/a41RKMahK5IC/ul0iajR99KG89wxq/cgtopWSgZbmZPLidmSjS4bfDw9o5SCytRWZ8rmLm7hfds9ccuKUzYP9oc0fOxZzYNcgjVwWYzaMXLx4YpQ5HSIOyA0VKSaD4RnBNF2ek/D+2fstoumHoGq0o/Dzby9oqGoWowokAd+7xLM79u9Cvbhf9goTuUorVQYybB8UmT6XwvLpjnABi1JIa2Vu1LMvgWIeWp3K+SL4XVso7KpZCIFiKnuF/PKBN5fzwblHuWD/psiV92wOeMXcGUz4kw3Pcb88V9fv9M6mCK42njfa8q4IZuIZ5UWPFMMWjy9HUpaLQeb8kxxBpRKIan3e0shVAnPn+H/pNRRD5MD3JjWZYrjftavd/24RVEW6PaJ8DqcQ98v8v/mV88eyYSd86f/6NAd2S15N7ljMBabfbg5mFB/PS1Z1tymAC3e/HeyTKITffp72bysLIV5ptNV6uBDypp9UUb6Xaqn+ZhLlc0OuuAcuCu+ubFJOh+sd5331JDJBdSHkuWH/OdhG7A5188kB10/lVSc6c6H1c9vIg+95IDgcOchCzgcRPVLMgnYB1F5QqWGIKQCHOSEC5XNOh3GuH84dwLl/5ze5jDj3MM5twbkyOFcQ597GuQE41wz3y6D3oNvfOAEumXr79TongQjruuZloxRY0t76wbgCm9ufM+um1zNA1J7hTuDyOciWombqEM+BIuPlSKmlHMg0raw5GJoL248Vbes9nwuncL9M39FecOWuEXLNiiTz7JYDodWdH198dAKWU5V31JyCoISprFei6DDMPPx46AwxFtaGEh7xUsWDQ3mzN596IiwY0osmVCbB73elEl16p8Ee98uv/54Su58VjZ7Smj8NGTqK8r5/vl+hfRgtly/FxZ0PRzvfV2nLNASgUVdTdZZpd6RRNsLitM0K1V/l36LyVxJtLXOgKubWgNRmHRs/GRLY/Z9fziL+Oa0dipL6DlZ41ISg30y3T2+rCkZJYtyvD4sFoSK3xmAX6QD0TexAncmIL1LZjlgCz3ij9h/fbSNjPJHFZLmOGLU76mo8rEj5XOEZ3C9fdis/YUWwQanfj6Wb11ujFL2zvXtPWKHkbeJjOePmSNwjT+tz7T5UzWublc5tjG5P232+lWeAhHd7fc0UQshEOGv/rs/ayJnb8ZvDb000hPvlNa9/D+PkjFFGlIQGW5sh+iHOdNQ0xwC9uGHyN84FIe+2yL/GFzRRTyl6xJKmhPp/3C/rbJNAFT7lNNEJXGiH+cC+66dXieM+jP1F126Theg2/TKP+Jm3Q3Qk5G/z7lPfmD5i5ujO1RbUQ/mW99dcMnRQwM/7mjSs6kgukfTlmJEiUtrvX4LOS6BP/rvaWXbwItnXS30aIkxoDU41XhReIxbhfvkhk5GeTSZCo4vrDVqtuqi88Mzpn4va6KCc3hEZDQ3UtuJZxvJKGQls+L0fcpFFSao2jr1ZYuhxOemDeRQPYhDhWwi7tw21TD6pHGilRaW4X976abtccrwOcjA2rC6Z1EIXGj67pvtqoCb6Klc2DlXkbbZ0+YOsIgo+nPk8XVAauUUX9YbbCSO7BLH4z40cKOjO9d8CmfToo0rZ8rLpX6It7oFv2a5wfxDQRm6CqjoTxZro92lWex4tdZQhJFD8kFMF+YoryOc/k0eN6Xey/VYlkdp44EeyghBSuFm4wjXDjm5HnrwwMEWHprZ18e999YfYgXNlcG4qzmVI3uSexbn2ONcb52rj3Gs499jhTe4T5k3u5KVNv5yU0r/HcRZbR//rY9bJ6sj+/V+Cwn5VJJrbUplySAnlnrgZtsgni+a5jO61zYsjVwvHZgFrAaRvdNKHfisbqhapCfqQToO0T+grOzr8Igoe2vTLZfqNEh7vVVDZnWOs2TeU0V4HD2/rYUUkyXx6Z/KULAoh9LsbIykUGXhH8pGxCOqSu+nISuJGin4z0W5PmFHWdUID1KwTNxjeVHxS+0Gsx/2yiBKtR2qdPGLMu9E3NSyLrsfuS3LdugcZjBu/kLaSRKOtFx2Kv4mgS4wO7Lrn+VDYxp31Rx/ZEM9fnxeX1OlRGm9djn3ICtGy5HcG/645oi7uly0Zy2ZXT0kixrSlyCpZCfQn/ml/Pq8YYlcouJ3tIoyOKyW7tRrzodGw7cOVcRxI+oxYbrfQVsR1//QZ++l/RPfdSu516gtEznEBhtWgceIq7peT2he9vE4Lodsxdh4WNYKotae1CwEferXgUpc/uRMFGQmlP/FmRwIfROPfEJmRQveo80ddGqTKoOzInbxMjEPXjOrDJolp04+2vzv/gdiE++XL+VMj5x5zopSLHcHaZziQRg/z4xfn2ZBMFHOVnTQLUvrBozCkyojawueXzn+jRi1H2p1f/vtF5Dn6x3TXvq/E/QKPPpwMHyFyLlbbmYf2E4twv3zsOVvNQA0jsmdVbb+itAWJ21mzDM7QoUuhCj8ypqmRo3aIomrrGjH17VVDOotl4pZ5Lr+QU1+JWY8Ga0S6PhNHTN/KP47oJ76T8nQWym4jNuF+OWf5lp06y2/iY+W9LL2XVojX+ZP68z1/EqdoOwojwxeJlfavJUWovhLFTvbNx7ZOEH2pb5avPR4iMuVd37twoI9YMbIlr5nvCTFy/0eaDrM7xEaVTb9cUuJYaug5QmzZl/euvHaIuKxnYxn//T1RkrjvJtP+N8Q7ve8vaYj1E63vJo07He4kmrgc3Wjc8oQor/xteIz5DpE4Saq4vO0q8azU1icM2iXEaBbh/zxwgeA1cx0gEYU+tbD7jO8lWn5rYep7b0kUpq22PnXChuhvz2BufcuGmFx6n6pl3ZK4rtw+/V3FhNjOfHdQaJ5A7Hiea1osLk/kOR3BP4ZEiFKNm1wOg01uwCvyf9zRRvJ/3P6kq/9xkzbo/+PmLjb9xx3r3eQqfLrzH9f65CZX64TPf9ykok2/vLdQl8RnPkLee/+r1afsIXI2Yw9Vdt978uUrhy6QVd+Q7bgiyEI0/WRDk/LmMO1O8p27p37SfHxM9nz3Lnhp8DZ58oKlzvRwJXnkl8Xr0a0l5HrcL+uPT9Ud2vKbHHtXdPhP8QpZdptSKMOBn+T4n8G7IGiRzEsVwjjya458zvf1CS3yBPnzTTu7i4+HyMcK/wmtevaR1ye4xAjyT8gXWF+6nT12hxyN++Wnr7RCrGoYwXTNv21IaQtk77+wk2GODrL2lXNfmqWGt4ydSQ4da+TCy0a0n22WyQapycdRyley0OeI8NGez2QVIfmLhPB+8h9+81dGKW3klaRNv6zcG1l79gknmP8yntt2lgPUlYbzzC+wQfXe3mPa0ixQJPf12n4VRhBKU8u8ir1O0g413uyVX2TOd3MBM2pfyctUBaQ54xFyrPTqITVSP7kI98tvfQTiDE4LAW9xxKRwjSDsZIheZwE+UBaU2h03uRN6dzFoTnuzw7Fu1x1fETMMCeZzf0I0IHMj5D45bZnsQmcqQjw+SS6+vbY83/yBXIP75c8HL3nwxEsCybd5S7esBDiXdy0+5hWDzs4u8VYXYZgXyqoSMeEDpRODs1/jOECI8GF4q/BW8DQfvcI3/Y/8s9uzbEhtgXzrmDZLb8A42RL3yx1G93P31MlD7eBQfNKwLPh/1slbYNoDLK0rH+9YSsLja8rpu76JwB2dI1FGZXxgzKn6omuEDYzJnkI9qvQg/uD4Rl/ACvlQSO8zTe45chTulyfqfvBavlcBmdq6PQk3lMGKYfCi4bAi5P479vDIlCzsuDbgT0BS8PZFbfI9YxFoNUw/uoXEDXY2L9bMnzADB7Q3F9esk0ErbfGO2g/y4v/5Zf2TgWazGvDr55qrYbI6HLK+ki+Cvd502VhD9CEl8FYpKurnkwVP0hfZynlxQPnKLiNWAmAU8/pIJxMbfMs/ei0wnQaGz+y6FkP5nivcA0Nrw5MeAW34V1sl/a5YE1T/abcxa6nDO5f62ZucKnBirXH95DN5GDxJvma7KgnsJxaqzisIwelChujlaXaYpgrnzZuiA1md80OdA3/I0Tg3Euc6121yq9c3uXSum1xunHsM5/oc3+T2FG1yteg2uYx6m1wW3C9/OSasFROvA0URC38zJ7WgwtVdIt5XA0jn7l5n4FAFhTS1w32yinDzzyLrMUFpCFM4qepqJwx/bvXQNTdywElu7h0vMuiBOqiR08H0L7kB98viyR9nDTMReH9lTZFr1QUV970F04vasJwQ1iOkoQGHDt+WoX2lDG5x5xXaXWShPO5H4b0sMYir2XFnVxQPmL/ZH8R2bxuYkNRPHmmlBU7cL7uJ8pS8oSOBl+zHoq4xffgQpaitKqgHwcMCQlYZOvDI9KLyMos6/Pbhag0xUoRShUQTifMSsLH0weUDKy8ESBsffynMBG/zQjN7hdbIUbhfPs0gvnxUzhj87dUSmNsMYa/zgUHDHAOI/yu6JdIFweBWBhPCBU0oeqioRZemBKyfvj640yYBjObXZSwSuGD3H2ci/elV8jSD2U6hptvEC7hfvpXXF2xOsIHe/PeR++qtgfZd6lmDE1bAkRp7Jn3cHE6cIPYN1u4D/q5SoWRuYzhe1nKsLs8AWGbECAlCCM5aPH7C9lkb1NVZ/ff91oTLuF9OuPmLK0k7FIJVLvS41YTAtSmv9q1VwVAyLat8SCwIGN0vzjhLB8BX7oV9xiO+8P4uVZf/GW9gip8Ri4jxhPqDAavC1O5Q1KX959U1VyjD/TLTVZWf97KiIflnSwXWW2Dyi/Z1rLeADY17AdZbIEWmLgXrLeBVkSXLOu0OI7c+nT+wzQqK2LoU0F9JeHhF2TKHWwMVi3K+85Ihobe4X56rztaqv2sE891Uf39Ky6Ewp3j1zo9OqNfrnpmKUxDy0LXKFy86jEx/bGimEGPRrZJuMaxnoQqdkRe86olIqjw+J74yCU246hd16p1Gv3C/vEo/vBXrhcjgoUDtC+ckdF+OI/mSUQpaTKJTwXohKtdN58R6Ibrf0KmE9UKUkPu2/5l4Drol70XCeiE6qq4Qj/VCpOcyOfnifC7Sxz0wK1/5z7vK6Whwn8QjJJGJAp9vV8B6LDJjrdmN9VhkpcIVjvVY5MLU1Ij1WMR5KuwB1mPRK69yX6zHIrvZ96VYj0VirxmVKd+T6Y9za3k3uRymm1w7nEvAua441wHn7sK5b3GuN85VwrnpuF9eu3phIm8sG71q+pv69WkOirqbaNyxmIu26y+KmKnkoyETCVZ3mwI04kfv2CdRiPT+hZq9rSxEdXop7dbDhSi+N6CB8jtX3UOjOZTvIb2L++XeI4Ya72yK0PKeZpkt74rQnqarQqJHitGLj78oXgNZfqGuEFQqQRX6ziONXCVIUSFLUr+hGF3XC/mhJlOMjmrfYQy4W4SiJ+PommKLUAnul73PqAzSSpUh+e2GB5k+l6KWP4r3BSxKkcl4A6O+fQn2/HhfrpwvQqSW5DxXzUJ0lhs9E/LLR40VcnrZj3JRuX/tFO/ZHGTp+9o/8U82qsL9Ml+z1SCnbB6KefDe+/liDkp88eVuFmM28inOKx5jTkcSglvXixWTUQzzzGvEcxJtiz5oJ55+CLmO+0p9+e2FVK3zSOyBJFRoki8Z77ALOOY2/fKU9YPOCkYhZPC6Zz7ZeT90fK/KGJ0MhSfi9003FGOgIZKmRs0uEVxsbsqW956BJyujSZopGaBatMM8bkc2WFhrKA9o5cCenVtP/fc9urhffuffeadmNQOm9NRZNj5kwdpb8sfUu9lQmLZ3YItgLshtRdQ1IXlQnknDrRadD8xOIcdPyxUAwZeNVaCgACSOGg/sbSsA2pMbwZTv/d2D+2XRAJr16aFzIDlZc1lJORt8M1as7I9nA+3InYqU+mzgSzv52LMuG/4mPa65FpYNIRVua/0M2aAZo/+vQfgcfPc3tudyywJxlkB3yvcUc+F+OTNBNKVnMgmIG33ltdNJ8J52W0FpdxJESvwLjKD8bp9BYHPZ60QImGAuf7SUAAxai6vPFuLh9R+TJrmfp8DuW+56ffxJ8H3ewbD19Ql4j/vlXz/rs/8GhQBr3O1DDXYh4OBsrum3Bfu3/lCXn08w8Gk1B/o6BcG9geWDg8sBsM1x8uKFYH+QfNVt67fqCw2Z6gwFkz7ANHtc9HKAD8gdjb8xuz2wJbNd/4OBw1FCynP+K7FXPAlOXMRag4XoFg03huNt3yIIP6zGe8QlogkpRj94DPYpE7pnv2Gb49TSc4BVnI7Fm0ClIn7v+2FbAk+HNzXz3VgCn7RQs3b0TsIZG40I9lVCi5vfm0VSjx7Bt95g+674NZ2Te59963wjTij0+MOa6TKqI+b16VT9ey5CIVqzWn6n1FLVbLNH4iBLS3nmlg65zl0E7kLHz2GGUgSt2DvMElajxDfc355rPhwlovufYusqx4iOHvWH/w1j/S6X1mRV+gsx++iqt4fVJJGgpyMO0lPE+lO/NTVqp4jJQ1F99z5NEZ1Xef5OzE4RzXe8G+SbmSIqbFd6tETNiX73n8wUy+BEugYyUb/vcaFchrWcWnNudMXlBJ8sNS9qshixyczkQ6qs78I0yfyo8WEpZ0y8APqcHlO6d0wAdX+7eSuLXhDpP5GsWt0miPadE+tmPqCAIuhNSAwaisj4nc0XJT8ltNp8fkSDTgVNiw/XZPapomC5huzJ0+pou4bPwLE5DUQzWirqMquJvjRebtiVrIW8H1248HVAC9EQqn7Sf9dC1ewJ0Yy9ashPMtVOUlEDwTHDTn2SNjrC4vaSXEpET4uy7DT69JFtk35X435DpHG8yGy+0BhVS52U1/Tci/rVksOnLu9DsksyM30epuhX3O0Xd+tN0czsGXarDWp0IaOL1auBHTUZFTbmmYsjM7nniscFlJHTvqy9S3d00M9KkUMGCwaoW1kjsKLNBKEG/31cE2YodMZ4xILOCt1IZRkxTbRGRVWFnG3frZGDlDXLTxVjWOtOr/lCNoTjxjyXvvvqw2XnFdUe0ARpPt2w3Q7SkHbTI8uxeY34wL0vlCdaAWk0vUvz1iOgx0Lb/wzykVDKPr64TyHGiPwyWS5x2ARd/uMm+Vp/PywNyJZMXnKA1oKN9qNi9vAtQ6Gk940NnNxi+NS8ygLLiWmGx2qNwaE/QPFRCxE4WlPPlHAqAWe6YlvtXm7gva8S+Er5H5G9MYQ/QJoLzRD5pgQeuQD1R+d3J8xcIHPV6+0rzQMgcvutUPRxJ6BmpXX/w7cfDD3jj7io2cGB02wMftutYdBv3c52dR9UZUullGL5iLlsoSVJWB8MtRqopagQdB6mORI96Ap2We+kBTJd4VfO56gtvS4w4G+ufyn1AJzl+vpVvMkJ1mRlZ+777IdTRCj//dQOxHkmSFriNvBSqfEb/wMLEOCLYu45YQp+DsG8WYz7QDAqRcqA7ArLOxQ7whNcgfaK9/K5Ly5gGePcWPL6AHDTd2C3qDM4Qk3RoIIjKM3m8rH12YPlguD5mABbIM08sk41tQb+gwq6+85ZALu9bbOBkjlo4dwLOFcN5+7GuZw49wjOVcC51jjXEOeq4VxVnBso6Bv8CuNMcBfd8Sa7QOqNNHKQnQvcCzHvpU8/AK+UX84NWznDlijymZwKR3g35H2m8ooDhB4rSRrMtoOlDlK4xT0b8EwX83nvaQ2dDK3htGlWEPdTczeXhxNo3LbnNDngBFduJZROICcIVK3iSPzhCHGn3P8qODjCWdFJyyKX/aD13KLiGacDfNfRmI25ZgdvKvq8G11sIev26tNMbxtQ/LnAXTlvDcE9T/7dzbKFK8484rJltrD/j1J8+jVb4BRdvNJ81RY6ddT2cIfZQtX+6AadnzaQ56lY5Ybl2Vl1hYpv2PvLD9I4r8FtBerGMi7KAxYg2B4RaKJtAQdbV4ZE/SzAeWtxU+thC7jxc05HONECWkm3eVkDLSA7fZE+/6856Fprec6Jm4OarV0RyzdTaPTVUOo9tQ++3Oz/Fy28Fypd7f1Cd5rARfQ4JLLUGLarJ49ogynsnvzutf7UFOJ3qls8eGQK5bHLWz+kmsI8s2CWML0pHFfNPH1VcB9YLRsVhnwyAY6OS2GZR43h6TDnZICQEYRZ6b6e2mUI4Y28cavVJEh5xPPK0GAfZHA9VfhrtA+iztzmMyfuA8OInd0Ptu4DMccJQ+O0vWChce6Fa70JpFwdN7h13BicBUzu6IkbwUXm4n07P5Gg/1pBU+qcAcR9UVytjTUAj8aBhNKte0H83TWhkyx74eRyR8/fLXvhicbQZfb3JrDbLTJDy8MEO0dSOkmZxqC4+njP9EEj2HozoMBcyhCivHkIj34YgNuKkNYZZgOgV7awdL6sD/w9y0bxRiYQTXp8n3qfCdz0fvt5l4EJzFl+2TfBbgKnk0Bw7Lwx9DXeouruM4KkR7SeLs2GwBSRy2NznAQbjtmwbG2A3besd+5F6ENfRO3uTkbsPO/mulnZaQwVJuePm74whnWpsmrGDmPY6isQe7LEGGLMap26JY3hfRX/zQ8eRkBfbyrCbWUIhonHU714SeDj4BDx8qc+1P74cLCIVx8u8qiYrN7Wg8i89OtydcZwt4jT3eS6MZjxfXs0fBV7nQIm4TdRxuA0k3G/isYY+L1MP2VqG4EhdUmk+G5D8K9vOLFvyQCeCb24PtOrD8/M2PjXl/QgvbVvMi1LD67h3FicG4tzT+BcK5wrinP1ce6R/+F24NxinHsD0qa8bYzBRpO45bu9MSg3yca2WGLvv3NmmUnUGJ59W39S2GAEwa8T+cu/G0LfVZYZ93ES3J5xGVu8bQC2CvVb7Av0QUu3SiKfrAfkuN9DjC56YBEVwB/73AiEQnJqq7uNQCouK3W1zQhudhzafrDYCIi23t6Zu43gccC8GEewISSzN2zh8SXBC7olv1VtA+j7FLDtpKg+kBqDOEOs9UDxGvO1XR8RFF2tvm7DbQTHNAPZC/iMwClum18qpxH8Fnq6g24Wm9eJ91MCTxnC1qWKB73PSGCbnLD6pdMAJkJja4fq9OGCj9Bke5ke5Ok9kXMvRzDhHfCX9wsRdiw8Wy89aQiaBrss8xIMQZybq4EYZwi35GCFZGMI/Jx5Ph+nSZB7MfjbZVUSnFuz/sVKxHqz8O6ww5L6EH2otjtxlx683dvzrbaBCK8PvtCL+KMLFYaHRh/+JUFyzp97Pf9IkJFvcIJ2lQSZQ05qlX0kSLsxcORsCAkeZzBvpLQYQOxkkGxPjz6MuhlJtbTogV3E8aCL0Qjcvvbeq1vRBasCJUGioS4cfFySFneNBI72VHesb5DARJLTRamGBMyXbGnfniKBwg99mnP8JPDsNJyMCzOAzhuZTD0J+vCbZPA85CjG9VIVll0gAsP4/ZXbR3Rhm9qy8Zs2ArCuccoLHyEBi2eirlA0CUyNWJfORpLgx00Foo4pCSJnLh1pnzKAHz3Zxn66BpDS/uvHvJ0+tNzottlhhj2vmUou6+VEiFezHXKQ0YX1PVQjt08Q4G969owQtr+98nXuI/4keH7lzvwrTxKI2g5+5dIigbTB8fQdbw3ARTWC77CMAQiu+hynMdCHmKT6yF1aevAyw/BQzEkihOX5LUox6kLRGyau5wcIYDJcy3rVAdsXbmmhEifK/4NrTXPZkeDBePuivywJ7ku8m73RZQBt8rOuRSIGcPlTzAMmbX1oF8qN6lfWAyNZCcvaI0RYr4gqMqDShaX2F5WP7AiQ6G+D4rH3e6qP330Ze7/H9zJO78Per3louny/Bglijx3v7H1lAH+3/+XjlzYA3b83vft19cGj5t7B7ap6wKF67cfyISIwv5SSbPpLgA8WatcWLAhQjXP1ce4lnCuNc6P/h6uFc8NxLhvO3YFzf+Lc+9p/eMuxdfj7bUW1AFuHt7qvBdixdZieFcn3wdbBjGsprR5bh7JX22YKsXXYscIrxIytw2Gl8DOvsXWgucgz3oCtgxqhH5lj67CSY5Pfga0D42eDEU7s/Xoql6YOYO+3gbesrxN7v3fZlM9vx/YtqfbKP2Zs3wQ4QvmPYPvms3L9KiO2bzCqtX03tm8urYYc+di+VU8VPTfE9k3JPifyC7Zvn+ibXvBhz9mc3dNXfNhzdotak/YM9pzBzMJBXew52xUtTnqBPWdvDmioH8Kes9Ga3zlU9vrQlTHSK4o9Zydb99CLVhAhZHXPrhjsOVuKatF6iz1n98QtXidh52Kxus7LGTsXCWuvQBs7F8Fnor9/ws6FdWfogWLsXND0vlFNws7Fz+PPwvuwc3E09OibUOxcrJtWHpPGzsXld9LZ9di5MJBgsurBzkWWvysH5RyvG+kHdWPn+LOH3gYVdo5Fo+znL2HneCzxr2Iido69Ba+znsLOcXAXj8ZT7Bxvu7hzpRE7x3Kdw6UZ2DlOZLVuKcHOsYhZYakcdo5zjxp9LcbmjnXjTYccbO4Mx/muEbC5czAs9LEBNndo8wzGR7C5s59Px6gcmzs9T78rs2FzR+PDx/Cj2NzR3XvZOxmbO5mcQ+9vYnPnZGNOXBQ2d55atvfaYnNy8bO3eCE2Jz8/jbNJw+Zkl0cimTInndcOz1HmZGmS5jBlTl5kph6nzEnP69aHKHNSzS/0PGVOyqC1FDdsTrYGECwoc7JGR+hJDDbXUwpYXChz/VjIZ0fKXK/we7KVMtdXpDjyKHO9p0IngTLXD/z9kkqZ68J19X8pc/0hl891ylyPvDb8kDLX89iMN4Swub5QeIXXB7uHdhwalqTcQ74ZJWGUe+jihws1lHuI64i3MuUeWnm96nwZu4fuPlRmpNxD927Eri9g95CZ02dpO+weks3mtMzD7qGFK1sYKfdQ4/kQe8q9+duZR4pyb3orXX5DuTdfHUi6Trk3tzd53K/G7k2RDCXVc9i9SaP69a8Edm/62pxhMcPuzSf8I+pz2L3pkBFW+g+7N7Mb9nllYPfmAM59hHPjcW4VzqXFubI4d1llkxuGcx/hXE+cW4Zzr2S2VlFyyaWt6QGUXMLNQh1FySVvRxyEKblE79Pwhy4sl0S+puWl5JJvV68n7MRyyVc+pUVPLJeU5/qO92K5ZIieMFeI5ZKfHg2dv7FcovmqUJqSo2JEqCopOcr7TccnSo6y2NPlR8lRb0lXHSg5avY1ixUlR5FeND6i5CiJ1f1xlBx1SlpffAXLUer1f3juYznq2sKRLEqOknL8foqS+1K9h7gouU8okrWBkvuMCxNCKLlvsTkJUXLfzq3uHxOx3MfD5tMxheU+xRM26pTc5+ShPNGC5b6EiRtTKVjuC62npaLkPtbtDM2UnHq9o0qAklOHEs9xU3LquaLYT5Scyjx4KoKSU1VOBTC7YTn1lezXDEpOFYneRqOP5VTlNMFiSk4l6z6kS8Ny6sp+GpM6LKe2q6QMUnL12gi3IyVXCzs+V6bk6pDdq4ODWK72Mn9vQsnVMx/aFSi5+rJbvzYlV/PX/OCi5GpuS5Y8Sq7u+OGcQsnVcWP3FSi5mnCLsYbSA1ppglIpPeAMm9MuSg8Ieu/OQekBtmoTOyk9YPTjviRKD3hPCHlG6QHpl176UHpALeNDpWNYDwjOKS2i9IBYpZILlB4Qwjr0jtJbXL8Pr8pgvcW86ZAlpbfMnzwYQOkt5XYCEzux3jLpQ+NP6S2cUwPOlN6yFagOUHrLcOjdnZTeojN/+qMS1ls0k+gWjLHewuZqtciJ9ayaO5pjxljPmjq1eJTSs35NmdJSelZ7yT0qRaxnyfrsD6D0LB3Xb52UnsUS3c4Xi/WsBLqeYkrPutn6b43Ss/jPqdlSepZ+kq4npRfyz7tUU3ph8n7OOkovnC8g3qT0Qj7L8DZKL6wu3e5O6YXzDoOelF5oohjmT+mFsbaMrpRemDDq40jphcs76D0ovfBjDxUnpceeeGv9mNJjGe9dZc7GXqdmwmSJ0mOnTxzIpfTYVrdqqQ9Yj9VQsXpK6bF/vrVaxmI9tvtZJkMa1mMfpAbUmmI9dslbSsIQ67EbOFcc5xJwbiTO/YxzX+FcCZxL/32T24pzO3Eurc8mNykvMYniCXo11zUpnmDB2uMsxRO0vnxsT/EE0rHhdBJNTmDxZJmh2Wc/RKfZdVA8Aet9i0MUT+D/3NlZ4IEFhDfZJlA8QVbf4zyKJ1BhJ7ILPnKB+PulDCfNXMBvbYrlteYBkJVM96N4DU2V9w0Ur7ErUu4NxWvY2i9EULzGQMcNdbvVfUAjezuirM0QZvwTrp0W1gchvyej0lQIbtQznqB4mO1bCQsUD0NKrhGMErOH1XnNRYqHaRLpPGJRZQEpg4a/KR7mQULseXILEczuH1gt5VSCfdayJTf3csO1mHNrD5X/EddvCiEvaS5Uc5Kmi+KNXKpVAibJhiBtxuc776sPqdRML1+AJgxq7WmWdZCGuqOzvLrNa8TL9lXyXNEKqFBdcN2T4o3GLhIo3ujI7z3tH0OM0QEz4biEYRP0bev6O+MNamSSxsLp1sCOflmdH84xF0fyyv6+cQLKKIXm26Ufd3SQLm+XAsVz8bqcUKd4rtWHT8Qpnmtuqq6V4rkc+theUTxXIR/rNorn+if/R4Li5RRkBqkoXk50aOIwxcslip6Noni5vLwjUhQv9zCmuZzi5SLabHZTvByV/wgnxcutuSy4UbycZHjgCMXLiWVktlG8XPrkxfMUj7iRTqNC8Yg5iVH/ecQE/b5likcs3xbxgeIR06wj3lE8ojNnpXTMnAaaXHeMp3jEs/lX2IWStZCkYu8GxSOqMag7MnzXQjO0kt8p3rO383o1xXua3rVzpXjP88XZMhTvSeM0GCxDzYtOX1gOy8jkQ+fXLSI1yPxISfAB/7F4AfQs9e1NkzEBpJFr9iqTXhCxSpi9/L1NEHUM2dmJWY0SBZD8P42Ho0Qh9pHla5VjxJA0awPakXGiXK5yMPXuL0Txvtb5IKtJ4rkiWb5u6SliyPxpM1LtFPG919HjTz9NER37RDUWZqeIxJixTxIzU8RG4dknqeqahLnQmeHINsWWo3GaUnKNrTquG5rt3+NECQ8axhJ+CAi1+N3ZTXsxbncLg8fX6PMvaQhHcuK+z1a/ffj9K43+4YfCLVWaL6KkJiYebihNrOR46LQ0Mp9lq9+vQbiu4P9A4ItSy71wHvP4LaqEi6PC4j1T0i2NvekoppBIaPO3yG/oWn549cSRdHK6GkH72707pyVkW3ZUffdQI/19KG/Rc/inDDXB/LdAcOcPBcIf3C/zUx8LURufIpYcj1S79WyKWOt3SYc+eor4I8F21uz9JDH/caTjyscvRDfn5b0mpRPEZ+vuVKmq2DrZmh0iT48SffWvBgz9+ExUfMV78XTCZ2Il7pdVhWb0fVkFkfXetPuBNIJo/jt1jPwTAWSX0y9wXFIArV7b+oxPmB8NmM1OGrfwojOtN90e7OFBNkJRpV23diLNsUg2rUIu5M+7nc2bgwuN6Gz6ZV5byY5yOm3k6nJC1lJKG5Xd5Z08qqiN6Irl0PNfWihmS6WjkK8WutvyzH79mCZStX/sSnTWQFLPCtRu6qojk9mvTDS+asgyXDtgdF31//tlQ/KM6tefpqg0c3jN9owZqu8PpaJTNke3qbddznxgjsbb59ueL5qjHUI6DBbt5mj3IM9qmLE5UhTRJhy6YoaaxM8+l99phhZV5OdU+kzRBdwvf9ifw6nkZIO8nkbQTevYon8xarezQu0QMlBs8rllj5gWHbblvHRA759t/1B6ZT+aaaY5tiTsiN7z34/fvd8R9S9/5hLwckTJjXmmPh6OqAf3y5WxOyTz9u5Dh7yGM+cizNFOnc7HXIes0Xz0kzBBWjvEvUcry63AAc3FrVYbjDgijssHMj/VOqM9VyNfXp89gJLKtXmdalzQ8Sufbzv9dEHlDZt+WV9Mi53OXQS9OMk0yeasiH743tIhxOogvyH+MftwQ6T79pIo+bQZGhwUZ7wuaINM/OBSzqod4hqOjdcV24+EWkn2NMmOiE1xNriSzwkl4n75cJL2CvVDHfgZ/3mOrK8KgQxXP+S7iIJYqAbHNy52pHZYKf7wSRXEudvmiQifPjL8eXUXW5kJYuz53nn9jjk6xaJD1GS0RuvqX+Kyn1ijINwv+9uwHzl+zgToh+9vXN9jCPcj1xheiRJB89Mh/Z2WSnDPSFXKgZkRBkdu62hck0QMPd0nG4000eyPG88jLPTR2SL/avknhih09Yt2hb4x+j+//FT18uybXlPQOGgtSSwzgdOVLpwX2gwgXznwHpWRFuT0lVDZrUqCQnE0H10pLRpZWLhPpyeP2nYR7t2y0UL/cp7xJHPpIUPeT1S78/WRBs4NxrmuONcG59bh3Fic+6Zok6uxuMntwrm0uZtcFZwbjvvlSyZ00tYWllBsI0X9LdQMvlT0TIlvNQEri4v5eiH6IMbEN1nEog7Gr0zFfZdFoM0rds8Zd0b0XOuZuM2l3WjtRWbq1RAVlB39LTPARh1Z4H7Z9g9j10qMNRSEpcexdlmCZmHHGe+DZhBwY0JjB70JFD+Uy/Yf14dbRP1DWoxacPPCci71hBz8kanbNhjBB/Tmoi3iF76S7x51t3jP84f4o23TL0c2hMmfvWAObB5b2EKkzSBC9qZBwIe9YGGem63RbgRNhFamFn4DsMhPL28JIMB621/fjiVVsHPYshAdKgdvVWucRJ+LQ9hDtWirRWHIx/3yD8/Iwy18xhB7okXl9JwhyNCXDQ9tJ4GyyZBwc44e+OxrMsww0IF9j7JWWmjVQIVeZPW5pDxEzVfoX9ERh0Gbw50DT/jANYvx36l6TjiO++VilkH5fjkS3GHQiqLfbgAHyzN42PfpwZ5/+mXeUzow+7s0sTVUHbao+PmNVioCHZOSHa+rJCzJ5X1PyuIDy4EL1xx5t8EzZUbvRHpqiMD98oar39ZWBgOwXu+sHvypB4fbzbjnsomQWPRsq66ENtAtXUely6pg66Wdm/xXHtQlrNGtKnGgLvyW9ViMBzS09r5MrWIEerNzrFWea2R23C/X07ydMlbWh8bdL7345fVgSqOeQ0ZeFziYvrXl/dEEFLchabNNFT4fidH82yAH31YnrKZHxEDJOJxXKoAbvgXJRJfYMELWweICruY18gDul/9067GxXtSDJyXyObUkBFOXgw5ekSeA9eV3Le4CmrBfret0ioMKuDpc55YsloVcD6ay+xxi0BS2dKDHcSfYc7uFtMwyQDdj5POUrD/kStwvPwp2PnbBDOuhe/WvTdcS4WbttgrpKh2oyawbPFGnAWLVY3rT68qgOyfn3SUkC7+vhBZ39orCt1tZKz2iO+GMUkMXwzID7ImRuPWc6S/5GO6BL+mbGnlJ6sHIrxfWSZ5EiNESO9blrgMzLvcHHPw1wHIsr0WSrAx2YwSXrjoZmNR57/PEVxQu7Hmk6OzNBX4ZDU/js+nBPCRLp+TAb/JlnHsQ57L83uSa4twPONcO55rh3DmcW4tzH+Pc9uBNbg7ul5vyG7dcmMHW1areyIOBCOGMInJB7DrQIFL5oUJGAx4q3bxWWqQMxm00xdvOyED4E9lW/gBRcHyb+3HLVS6I7PrePxvEAE5LnZayjn/Igbhffqj3olp2JwKtk26c9bq6MOaGfjQc0IY/Z6yrrqSpw3GNAJ5SNmXgik57f/nOHlD4OHOiqlsEgheX2hS6OKHIm0vngQo9NAZaie10/U1+hPtlESbSxFMxIlw6w5P8+gAB/Bn0znJka0GFg7fom09qcL4uanwiXQk8m+KMGH7tBuS/3VzRUQR+XjSz0T/ACaRv8i6/VulgvwJ7m3/cb3IT7peDkkqSzYi6cIJga3YrQQdcOeR2H+jShPaT0i1LKmowam3FmvdPEZpfPXphIrgbRNQmAyQfCoNR5x8/UioH/IS2hdBJWmgu7b/+cGCF7IH7Zd3ggwO0mQQIWhRX/jukDavSw61X1DVB3o/8aOieKnR/VTm+cUERMqu2SL0ukAax2fuJo0HC4G5YzaCqxwEhyq/mWV/SwsnSVfXYHb/IP1U3/bIkjVoFcQcB9ISF3h3z04ZIs3xg6NIAw0KqyBgnVZA6EFZub6kIp89+j17mlob4W5c8d24ThqrJccbqB+yQbst1uZWFFtxURZf1B5bJPDKbfpm77aOPZ7cOTOl7/57B5kG11RXdvFwNOKvycUuljCqIpU2w35FThB6rXvvxeSkI7VP7ErQiBOxck80PyewQxK/+gdWMFmpkCVd2xqyQy3C/PDTdo1RTowMdvucElmi1Ibfb8XB7pAZkvFvJKsLmwtqBhh51NkVIN9v5r69FCki9xlWN54XAzmU6gz+cHfKEnE1Cmmmgg29FOtpnmbyM++VO0lmTqAodqPI7rtK1oQVBVr+zLkRogNrrsVNzLKpwOvA1Tyq3IliHhG8V75cC2af0uu6vhODYM0mmlVvsMKBU8irelBasSlrpY3NWyK24By6ZtDAKLtOB6Yz4nIVlLeDcI3a92RtbX4OiVc01FZBB4UUXNhTgsnowvWexFFCxXkaCtkLQY8yc/F6MHaKPLgb6idDAL/em4y+Vf5IXca49zt2aucmd2b3J1cO52jj3HM7lxrkDOLcE59p4bHLLcb+84nowIR5bB6+L7p9eY+tgVO52vwZbh9j0acIKtg4LT1YP52LrYGTHWqCCrcPjBengI9g6ZM481qBrYIenWZNPs7F14JI5H3gOW4dA3C87W1opPsP2DRbXx9notEE/CE5PYPsWY8qD7mD7JvGUR8wK27e0F6s3V7B9m82ZiB3D9k3meAivMrZvsY5GlyOxfWOkpx32xPbtBe6XG89FTyRgz9nVhesjjJLacLBibKgee844ZZ5y38WeM6Pb1qwPsefsxfHIKx+w5yz36I5pWew5OybqTe+KPWfHg+5Zi2Hvd3klQWxn9ApZE/fLn/bPcqpi50LCT+ptMHYu2m5mTS91akBVr+FVL+xcWAR3DWpi56JHvm7sPnYuXPJl298zC8Mnqqdhiti5kKjr4B7bTgvtvt7S5/qWyWq4X5bsHH6/lEGAjs98tV+xc6zd+WSoCDvHgg2knlfYOXbvnDu7hp3jSyw8LIPYOZ5qf2a7gJ1jnkhU7omdYzb1W8Q47Bwrzx7J82D7RfbG/fKhnC4mW2zu6OeggHvY3PHOeD/vhc2dnXfH1v9ic6c9J8W6DJs7dTp7xByxuXOosuyeCjZ3epV0Lzljc2d3SkRdLjZ3HH6Gb1C9WiF/xP3yGAezMmVOvg3WffEK20edhJdv2bE5KfBSM/M1NidNlJhyKHPyMVCFUeakpuh2byVsTnZ0je00wubk+pW1Zao/dPA2r7EmDpuTJbhfrqRV/SeHzfXV0I3Q69hc97QTNbiNzXW6VIGhSmyuU2VybyvD5vpOVp9f5dhc3x149yZlro8MKSfLY3N9IX1fzl1srnvlfP+zFZvrP3G/bNngHFKG3UPbylueuWH30En33KkA7B4SYA2fLcfuoaWr0lqUe+h5uuYY5R4SvGeFBLF7qEXKq3Ubdg95fQ2bXcHuIX7ntv3G2D2UhnvgRO9PTd7Yvek+9ZkhxZPy/1Phr3uwe9NFOKjaEbs3jXeMPpbC7s1K2Uo/yr3JsdvEH7B7s81fm8oWuzf/uh9ND8PuTeP3B3oisXvzJs61x7lFOPc5zvXAufY4txbniuDc6zhX2mOT24tzn+F+ua1EhZqSSypqtg9PYbnEzD6KkZJLViExnZJLRN+O7qfkEm+vocBuLJccYbIO7MZyyaKPXFM/lksqaWPS2LBc8jmqkvsTlksGcL+cnbf1KCVHiYh/ta3DchSS6RGuxHLUSYvk/R5YjpI877ZIyVE2h0zjKDnq6sC3REqO+sNd4t+N5aioEZ38ZixHnQht8IzHcpQb7pc/bUm4QMl92tOSIpTcp8q4/c4eLPeRbz/Mp+S+G2ME9f9Hx5lH5bi1f7xRKaV5plmT5rmenqt6mgfNpVFkKJGhSYOIkAaUBiFKE8pUQqnnlqRBEWlSNNFEogwJ+e39dr//vGv9/jrrrLPW9zz2vfd1fT+fs9bBvY9ZuGsM977UONFDU6j33dEcMVRGve/BE9vsAtT7VulVR8mh3jdO+uXTYnpeuKf+vvX8K+6pSU+SLuGeGly6Ix731CL7nem4p4bo/32Je+rmQn4p3FMbuMxrCdRThwVi9p1APVUx/25zAeqpp0i/rA3XxztRr9aZ/ayLe7X+iPU4L+rVGWwlAbhXn2vSi8e9muq35yLu1Ty9jnpiqFcfiA/bdhz16u9ca3b4o17d+dpyVzLq1ftIvyyeZ1iMOWAwLWsz5oBXfyaZBxEH/NlyzARzAKQW+mIO2P927SjmAIbht9GYA3YUZsVdQRzwQkxtphNxQG2SA3MC4gBf0i+3eH2uPYG4Rcbg2LWdiFt2hRbPbkfc0hY35o25hUtea+Eh4pYnPYdeYm7ZdsvgPeaWWxuPhsQgbqms7JWQQ9ySO2Dn7YK4RZL0y8Z7JFh/Is5qLkv8hjlrl8J1xiDEWYphv25izgqK3f4Hc5YR9bKCEeKsL76/bjAhzlLb+qLhDeKsLWHjfBqIs14p+fJ3Ic5aJP2yfKGEJObClf13OTAXTtcVr5ZHXFjMdPc95kLzCrNP5xAX6mu/4t6BuPDd0XzLA4gLH37d0OmAuHCvo4JWEeLCdD0e+W2ICz+SftmlY8atF3Es1xT9BCCOpX7W23IJcez2quDVzIhjw+81v/REHGsRGWz+K48ZZKQW5JkRx4Yqmm/GHJtsmMaDOZYXvFZgjv1A5gqQuevJXAky15XM9SNz95G5LZLLuT5k7jEydw2Za0365Ts1SvPYE1xXSjt5U9mCWPyQYfRaBs21tfMXhDdoEnMvNvlv5mQnnJx9e7XL18HDzWxXb1sagE2Lwss9jmageKrqmmqDBZy5JWVcaGYFrqRfXk9x62N+aEyYNrC+fGSmQ/BEHy8+5ytD2JYSFz8I8kEBa1b1vgRtSGxOmJYSM4P3V/I28lywhgPCjXzYa6wvfTShz+4MFP0rCthr1JB++WRfvwxjgDQ4B6bt5vHWgEna68dGscbArbpvHfYw3bFmwfVJ9jC/IFNRscYFeA6lWWIPw7FQr4g9zJq7M0uMx7yAY/aNEPYwTqRf5tqVFp1pYwtu56smp/c6wE2JyUjsjQ5WJ6hhbySZ7eOLvVHUwemj2BvV7L0Qjb1RrGVAE/ZGP76+FcLeiIvt5V3sjc6Rftlhx2Yu7LkehxozYM9Fvc76H8+lJ3iiFnuuxM5qAey5hs6Xf8CeK8tu7XHsuYjf02ew52LRqFfAnkvkjZk/9lxCpF82iMhTw16u56jcX+zlyj24OLGXO3pc6AH2cqcvGc5gLzcnSgD2csxlB8z3WDlAZPb1DOzl+t9YyqsL2UNkba+dTqcdOJN++eLYQaUrLEagGdORjj1i07ZyWpSGEbiVJGVjj7j+Ia0Qe8Tv22+mY49oucMhCXvEYm8HJ+wR/7VvEv+PRxzbH4k9oizpl81DnoYHrV6D/vyRDNh7Cp62n1JtkID6h9wtcesk4CALVxP2niXoK1jXicIxBYrUQ2URkBv8UPbsthA86JCzN8oRhEOnFn2D+AXhauyyX+5Wa5A2HZugamg+lap9OkF9TbRe5oqeoF5OW83m2jdOHf00qPnr3QdqiNWihdX599RjaRTtJJ0xapEq4917kyPUccq9Ty/nhqmWk7ciYxOHqcn5PTpWT/nruG+7OI5RZeu6ZiKLnxsq1tEKz//mTRaoG14dm5m5qEEZZtOGI8HsdXafD2+ddFChvI+5Frmovr5uKPHIOYGLSw+fTGvl6LRo1w29tqi7ycdcN9hZbjHVaUS5c2bAzH6vYl30Ced7icG8FC7iUJGWDbWusGZoojrFjOJ5X/t9z3rRuuS8l9mKoXqUffRhdZfbcnWHHzPUOo4L1NlcWBEqn/7VeHh217aAy2MPlUm/nHZiyMOMa5gqPPbwxZmfb6kF6k+emJe+oTIFtz1tdeyh8ktSxZ/CS2pzZzHbgU/N1N3CF7qEmeqokzOfg7lNy6hbSvyetrt5Uy+vkeiVN8ukV5F++eePl10v0wSgKe/dZg4nflhwupSWEcALwduvgOllLvCjHk0+UsAGuXHXRE2dGYHRzMiN694Pao7d6E/Nkilq0i7F5xcE+qiPu79HOfO3UC1Iv5x9pfEtT5YOFLWK7g/I1QaVxMtLnaxasFYk0C65Sx0OWzp7FbQqg/k3jVT7IHmIdbjxg1NfCr7mpP5xqReGTd9Y5ayqecHUV7BtYBU3TJJ+mf6XSff0MTvYbxLWev2ZLfxpNeFak2kDxbd6vOVfWkFDubimX54FGB7w33dYzBxefq6pyjIG+NNccKXzkxEUh29Y+vlOH9YkfDjxN0EPLpB+2SgmcF+JtxfwQ47dMxMvoHWa/J6Y9YRr2wvLytw9IW7p69vqQA+Y72ksZpR1hw/rtb9NPXGFdv/8CzqHXWDNg1TIPO0MGyOX+MqknCGS9Mvlg6FtecZ+cPHSsaylNj/Qpy0+1NzjDz9PFZ3Y/ckfRg+4hq/nD4CM29tYFF75Q62fF6+1iT889fW3ox73A0H3k0x2074Qte/9o7P5viBB+uVT16veUis2wotzFz+Yj3tDF3cXh/hJX8heVxrGbeEPGyI6KCmtAXB1oX1/+/tNMKJi8zOTFgizDiEWFkGBUJM3Jc29IxDKIrbxSG4NhCnSL0tReOJUDrjAbImc7ikON9Do+WbUY+gBv6ZFOm7c8QKzbdVNjSI+8CRrQOuFvB8qcC8YO275Q7ljm0PznQCoEbXMDzHdBErGFY2XozZBBOmXU1RCw9Lp1sDx18OKmdse4rmPfHxQ5wSfW8ROemW7gmB0yYtUVw/Q999wRO2pF7R7n3PsqvWGh8B64Z+4L3ArXLU5NOsLitp5JlyWfmBMeuDVVYEcfDw0mDf4vdMw0ArqPWXFdwrbg5V7of1nR2e4R+cP+73WDZSDSlNX3/QAUd/tEsyPvaDZLYGhz9Qb9G+qy5xX9gF9AevHcSk+4EPmDlUu5643XM5NIXMNyVw6mStB5sqSuU1krhmZC2TuRtIv7724aet7bUMIEbH+JlEB0HrtoeeGWAuYfL/K6/qCLTTwBLxauOYEmT+DS5ijXSHWVXzoQ4k7dNkTVsZmnpAhzap318wLVmoSTHsqvICB9MvnJfZ4fyzgAYbSY1eHHsrCgQODv1TXa8GsVe/2WxoUOPkz7lhxMA2UG08rLEbaQOqVTy88mh3g3UJUtDqbM3RnfHRnFXCBcZ6DTHPHXKCS9MvMK50kS1TFCA9fAZ6brozEbJu3YeNqXkj/zlfJRlWEHR/tuEKzdaC0Rkuu4wkFJKoW62TmzKCMrTFgf6UFOIwlZafGW4HIGW7tZFNrkCP98u/WzRlv5biIB/WShXv/PaUzrPUYkczhh1eBZWMiyutgkr9rvL1GE57Tr9C3ShuA5su77L63TGDVhKb+mt+mkPY7Ll4nwBxybXnfDXw3hzjtZb+8+7c4k0flBH26XJfb1IAZuvrfneT6JQ69mbFnXCSVQHzI7+DqI1rw8viz4PM6BkDtFGFxXmMCqbvPHt69xxQKn0bXXCoxg3X+7XylSuYga7fsl49+Sj+2VPGWTjOKFUpkY4Erqxcr4zaKw9l9Fjm5qoqQ96EmXrNSE0zFT/cl8+jDOfaed59uGcNRx1yOdgOA2RtZbesemULuioJpW4oZ0MKW/bJ3mZmnZdoI/UM989shXSZ448yTwnZBFJo32CqeeL4Ofm8bGD9G14Cjrt1uTIO6wLn/Zt4EzQiueNtsPX/FBI79eVbA/QIg7oix5md/lL9y2S+f570w/+vPIB3yNKyPAxM81RF4WyksCkYdp1mmDNfBxp17oq9ba4Ajny2rrpEuUF1EjAfjDSGls8dqlE6BGzaFY3V9VJjYOjl6rh7gv375z4MfAxvNh+npF0ds83wYIdHH7cEvZxEwLhX83lEkD2hEZx1sVAepxVTjtlod0LZe9KycMADP98l+IEqBqbOv6GcUqaA42Ef7yQ7QHrLsgcO1u5g8NXvouxM+KHkfZwLlmr6ByBci0Bs4ncb1Wh7md69KvzqqDszB+40LGnTgbs71r3HjBhAl4zKawEuBfNVK3S0SVFhqufimZ5EKyWSuos5y7h0yl5/MfUTm/iNz/+5Yzm0gc8PI3Ftk7iKZa0b65fsZR00ibIfogXk9VR95GKFR/dPuo/3C4P/78c8ZXXloM3+/iVVKHdbq7Czwc9IBBtZuQny7ASx4r3x267gxXHlBuHGmmkCfRZR483YqPA5Z9stBjdOizHL9dN4zgg5u7owALdyStheF4TeL2wPPt3Kgwcpy8FuyGsjWEDsufNAGodNHJrhG9SFUld3G5bMROMeW6UZ9oMBew0inlIcm8I30yx2tvie/fRqgM/2dbxL3YIDGO4ktLUVCYPRQml1IRA4G77++rxilCrrbpI3t9bXhg8EdVhkBfXj4+lefL7sRMJ7Z/o3vizFEWp35foGgAAvpl2/qfjwaZ9lLd5mPO7HahwG+dp/eVkMRAt1nleusi2Xh4AC/jEv9etgV2HHxXI0WHGIPjc2J0QOnwO9t+V6IW3YMB3zVMAbh7s+sHovGYHth2S9LHeE7cuhzP91rRly6RuAflZ5RXvQkThDWDO0zY+eWhbk5vz9/ZlQgrd7N8ZmeFvQsvvM4O6QLuw/1Vn4rN4Dc74+avsUYgSKr9UAq1Riuai/75VgR0xMODD10/ZyC5qgD/6jhJbP+zX6CcNhTWODgoAyIZX0P7stVAQ2r07PTvzRh+ENxv95ZXWD5t/7rTTcDkDt5vParqBEIvpEf0hswgk+kX+YS+CEx4NpPX5iLNFYyWaIuJt74OTApAGaiBVovUmWgUNNLvVRdBQIu/RIfqtWETU8od2rtdEFdVkxAlsUAQqddyqebDKHu+O8v7seMIF582S8rnXl+Mkerm/48LiLVW+4ftXSVt2SbsCC8tfX5rnhRBrqLzN5L6quAh22TagHK9RqPaKJb6YJN2wU51r/6sC5u3c3yOkMYYObIE40zAgPSLzeUDz+9I/qG7l8lkuP3/C91aeu5GZEaAQjYnLygFywD1y8R5z/+VQamKykGXy5oQq+gkkfhOl1YV2Yr8m1AH7SEd+xRu2AIBVl0kS3eRlBF+uWbrsaLN8M66fXqGvvPKTGAbeO1E3NbBGF0p/ynow0yICE/c3XQRwUYh0dsy55pwtKOnbrjnrrAH3j/nNEqAyj87eZh8swQpksJBoeTRrCHzA1yW879QeaakLn9/5P7d2g5lzt4OZeDzL1K5v4kc71Jvyyy9S1/JzqH9nyZiv3oHPT0t7Aqo3O423bjjBU6hwrlfbeZlpThzPRhsSV0DvUBp71uo3OIGnjyiWlQH/KgI5CCzoFvu/f+PegcPpJ+2Z/1yfcCzW762+NKa2fRd8tpV+zkEUH3rMddMhB9tydVO0xD0HeTrj0y1Iq+2xbmrowp9N0KqzpdVdF3e9FbuasTfbfB05ObKei7ff657JeVDleL2dj10zUu1Jy/CEvUMpuDZmemBED/2f73mmkyIHXpiQ+7hgqoB6/R4XyoCUf8M4TeoXvWEj34noLuGd3lcuFfdM9+7e3p3IruGQ/plxkdq6IbfnXTz1pxuX2O+Uc9Z2n+nscfvTduRq1M9C5ypoolBtC7WBeWEz+G3gVP982diuhd7NTxSLmI3kVVC+XMW/QuGu5Fqcqgd7Hn47Jfdoi5+dturp8uaNi1oZz/H1VXJzckFr3j9ZauEyNcslBUY8XQj94xy9Qv1Tr0jsc5pVYmo3cc/Lf24yf0jt0S/MJn0Tt2O74i7wR6xyfnl/1yq/iXy9FWvXSfwjDaT28GeM1+IrsSzR09dr1iKzR3FF7/kHNDc6ciTSruPJo7XHwdN86huRMZ4beyAM0dR62UlHk0d/Ie50l7obnzX7+cXbf23IaZAXq40J0JbjQn57h2H29Ac5Jv/poHH5qTu08lx8ujOXnwkY2gHZqTMYkDCdJoTrbsUBzEc7I87KA7P5qTz12vHbyI5uSlzGW/3KmeZfJCtp9+Il/jhi+a6/xW13dvQHP9/JoX97zRXE/PtIr4ieY6/XxU5UU0183O+73jRnO9+d6P73iuy6gZVuK5rhI8fA/P9SjSL0eFPdkyhvbQuuJvYoNoDz2lDXbFoj0kS4sun0J7SDi/P58R7SH/nzwmvmgPOUV//CWG9tCHTPEkvIc0eXk24T20+PSpDd5Dsb3LHtiQraq6QqOH/lZ4gmcf2pu2zOxsR9HelMqpYBRAe9M4OX7pBtqb7t9eCV9Be/NB5FxjPNqbQoWnJvHe1N68q3Yz2ptXF/KV8d7c+j+538hcbTJXnMz1IXPtydxGMpeVzKWSuQVk7kXSL+clOW0+gXqJaw7lWxrqJdXeLzbPo16yUp2J5RnqJeu83LTiUC8J1GcIb0W95HnE2n93UC8R4lH0xr3kqqbmV9xL8nns03Avidq97JdFW6Vj3qIepQeHE1NQj/K9vmRZjXpU0Pa12tOoR7mHdM3hHlUvnOyEe5RZZrw97lGTEXrrcY/ybk2/gXtUZNj5QtyjzpJ+eeMplw1bUe+LTrY514t63267PRRm1PvazN+sOYZ6n6uz8yrc+y4e1q5lRL2veV+ADe59hyUK7HDvY66lX8e9L2c+2QT3vo6Ly345i9XAbgL11AS3O3FJqKdSxSbPH0Q99eiKosRzqKda99j3454qy+fNeRL11Ot/Pg7jnrol79XEM9RTrUbP3sA99TtMtuCeeqx72S+Hl4e4hqFePfGvXNsQ9eq+5JOTK1Gv7jz+87kT6tUJ0hz13KhXNwVtHMxDvfpOgXGVE+rVf2w278G9+pK5+H3cq/3uJQvhXh1K+uUzihNb+hEHCH423KyAOODaNh1HGcQB4RInmcUQB/xVJ9w7EAfMJQn/whzwmKfvPxzAGn9bCnOApEGJF+YAXq+NVZgDXpB++Z5mqcQ1xC2dQcHT9xC3vOwq96Yjbrn8MkCdFXHLXidiMARxy70jxWLtiFsChNNcMLe8Fr7AhrlF99EWe8wtfvNun08gbtmosOyX39K7ZacRZ7GUnJHFnKXHrVuHOasv440Q5qzyRGVrzFkrBJ+0/kKcValR7IQ565XYIWXMWakpcgyYsyZ0Sq5/RZx1ifTLHT2RH0cQF07PR/uLIS58WwD/HBAXDkfQWa4hLnR+KHLhJ+JCxpc/JDEX2q9ZCMdcuP3Wvy9GiAvjP/l+rkJcmFD071EY4sL/+uWumDoJzLGTMrPZmGOnmV/6Yo6lswnvxBy7dQN7HObYYCuhOMyxkQsGU0yIYyu2B1b1Io492KjdlIc4dmMx16b/cCyZG0fmrpddzr1P5jaQufvJ3M1k7uH/yU0lc2PJXG3SL3dtG92VRreGXJHj5kzc9uAdtHLqfp0T2B6Q4MKeIK3zqz/2BHnl42uxJ7CvfP7rVa03+CbJuGNPQCk8z4E9QZDmVmbsCTxIvxwezqaEvcbH5l8T6RxuQIu2+9Zt6AEhBj1p2GtoSAunYq+hafrqz3N5P1g5dOBF+y1/4N5kuBZ7jY5d1/dhr8FpkJSHvcbE52W/HNq7IhV7mAXB/BzsYbx0qh6LnUT//rM1mtjD3HWb4cYe5lGapif2MOzHDn3FHmaMI8oSexiPomMK2MPoPvspjD3Mwoplv/y37tJz7I1kac8uY290p/VqJ/ZGURtfl2BvxBdZl4e9kfYVTk3sjcJOU8yxN4rfkJGAvZHi9nkD7I3OfXZcwN5InvTL4Xumk7DnGmBzCsSei/nxB4HJWU+4UnatGXsui93bV9wL9ABwTu/Bnmvf5n616SeuoNX3bBB7rvGWh0nYc23a+cwbe64Q0i+7P9iTi72cY8YGzfJntjAeez8We7lakd2t2MsNMYzlYy930fBTD/Zy36wSQrONAfRj2e1efjKCrh8Z5xfe6YOo0DbJpQQ92EL6ZZPVfyaxR4wsvBGNPaKeyal/2CMmy1g4Y4+YGdS9D3vE39PBT7FHnObc7bVKXwqe36n94VovDFMfYk2tq3nhy67mNe9WcUMY6ZfPCLeodaUJgHBZ+xtOJ374YDe75mwAL1hEKzvSLnNB2t9G5WMFbJB/KmiVuTMjfF5vdWn1vR/UiPWWK3VKpqgzEXHVFwX6qDlOvhed+FuoVqRfnioJP6XHNUwtqPGdPvDzLfXN9745xdI31HtnQ6tuO/ZQvU7v0L8DL6lSWQsPfT81U6+tzaldYqyjzr7X/splWkYddRR8U+blTZ3evrrluWkmfSJoY3RNH9TxTBx/XnScn5IU0Gz/7Jdc3ZEr/TVchXp10SL/Tp0tMqU4fxy8GPVDmZLsyVq7c4UGxcO4PVjzomTdl7mf9ESPdZQ3B6aTtmcq1+n/uXm+m5FGcT38NiL5Aw+l8dC432NegzoW5pwwdT/WOrqbRcyvT0KU2UI+y9GFJeO9sZdOrOMVrFvZG/Hw9Gq2OksdDVHtb7MPHWWNv4d0cdSd9Xy09k2nFsXSfI7l3x8lCpV72S87rj9Re3ZlET1I5ZuR+P279MPcN25rHXpMP8b00f34hnb6cZGqDzo+XfRHIUdLw+z66Mc39Li/TBykS4Yev+B8d4jOJ+VbrDo8TH+gvIZ3ndMI3aZz2S9rK7Fd7smXo8/1DdPP2Q3QJzOOnvV7+oVeadgQb/j6D93m9vPKwF4WwmJRdOLJHw7C+VbN1EcZHuKbfGH3OQU+okBCf3F3BD+xWj762jyjADFL+uVIxwpxn+vsELdhs7fDqwWqwqaK5PRD43QZIlP34ANOgurSYH2sQ5SA4cltk5UyRMHlSLXkRgVCumuDwdRtFcLaTrtt0FSNmBIp7eP0USdUSb9samg5ZCyuC1c3mV81ntQEDQpXB4e+Mgx1Djybd5aAhgnWtNVfe6ks35PKFr1EiZb7MBXQoEiI+V3rv6epSWw8fKB7T7AOsfjl7AH257rELtIvP66+nbXo7wRNAZ0XrawdIbeGqsy50g7cKtuLrrZawoUTXALv+0zhoMvk7VV++vDIJ/NBhbsKaFr76KsWCwHPwtoyKf2n1PWRh085/WMk3Em/HBIsxi7r4AvUQbPwgCM+MHvVT3qPhjf8+bk0/9XJC77GP6/8Pe8Owq2K2Y1OruB9e31OR6ATvAx7OebVbwcRHHT+yWJr2Llp3apv2lZQRPplxxibRwEBgcDVQBP8ahUIfDpiF69yBMIlY+XKGdVNED/atd+j1R8kG8wXWJZ8Yf3k8ze2bD4wuLbn0V+9jTAZoqj+fMgTjub5yb1G+06T9MuLJmtPh5RtAs/wPPtRBpRvHpuZqRQIPSs4xHI1A6H84l5FNlb09+Fzm/eZb4LHhK5GvloApCWtcqBx+0Pqyqqzw0p+EK73b1Ki3hd0SL/cyXPHrybbD+6eZXttZOQPr9in8iv/+EMJ9Uv3vfwAiHGw2xU/FQAHu/byXm0LgM5Faj2/awCk/34j14X2hoZG5/0OKX/4kOyzP7ofzXHSA0skvvj99IMPNORKKgcX+cI888ZCw3Q/qDSY2O+4xR+Gr9RwmH70B61rm06zcgWAkN3fz2kv/aGt2rxHHP3z+hh3G+EffvBazlzLnO4HmmSuJJn7isxlZ1nOvUfmTpO5emSuKJn7msxtInOfk7l8pF9OWRU0ysO/Ec5surxD+dNGMFJx35PB5AOyrue0mAR9Yd8IK+vbSV+QKzwTf8DPD8onjI5c34v9/MsvSxZ+sNozRWMvux942Q9u7fqA/rykX46MlWd6/c0FhtQSeg69d4Xf4+9Sc+XdYTTuzsLtOA/InXknbVjhCWVzsdYZp7yAK8T2vpTQRoDIqtwsl40g7Pt1051NG4F5YKOqIPorjfTLjqmXCg4w2ICUFM/RviJbYHGK2J80Yg8/5t6atHpvgOi0UqkaD2dI6DZoNbByAf/0dTvTZ1zg/ozj91F0n69ti7fgPeQKWzIKflWfcoU80i/rf0zs1UuhQVT9llMPOyzg7/DXtyXHrSD/RojtoxAbGFezM3RTsQNOHcktZZn2kMSo1Od/wgF0dp9ZtONzhOLc/Y+iXRzB4vWLdzLbHEGW9Msr/noFHbtuDn1uttqxj2kguLcvy8DEEogjmukOvVbg2tA+MOtoA2Nliycf77WFKO2vBntU7aBnz6c91aftIP3ahltD1XZQpaT6yoiwgzTSL4vsFN0UVm0GkqnB7w/WmYOCCxMhLmUBc79Ph5cXWAKDWlG+0z8r2FtywaKE2wbOf/KQuldvA+2iaa5fhW2hZmJGRd/IFo6qv35pYW4Lu0m/XKPr/jP+pSmEaAUJHGg3A9vTynPDkjTw6Vn3VPq0BVTHKKpueGcJW1xepfOMWsGs42ER8RRroIxe2Kk4Yg1nFFjXZTPZwGeTtn3nOWyAYduyX34r5JBwYIMp7BRlclk0NYMnKbee9CSbg5DGHO/ejzSwDvO72a1mCRlaO86qKVmBWk+WWWcbyk8GVqO11lCrqvhtycQaKrg3GB+2tAZV0i8L8mXK/RoDWGV8wKpzyBSeml3uD5U2BzUV89SggzSQYpF1n6m1AIux2aFfty3B/5ztGVFnKzj/aKVg/BUrsK10NhR4bAVzwpKnilutYFXrsgd2NdOvmuoCOH3c+8nFblOoM/0eJSZgDmaX8kUCd9FAyV45n78UcYSmAC3znCXMnlOk0nWsYOLPeNJ8khXI3n3KoV5kBdmcV96qXrcCBTJ3H5l7mMztJXMNyVwDMlebzF0icyfJXHEy9zKZO0T65dNbR3yMTABGF3u0D54wBaaPnp1Bj81AN7bbRlCYBqe0uJK+O1pAqYCQSSfVEqZulu5MeWMJmiwvNkqrWIFRcEsLo50VpF6537XFxQoOk3752F2d2fA0Kiw9GL2ySskU9jvLXi/3NQOZdzPfjMvMYSTqK/1ENw1eDRXm7yYsQEnMutbJ0xI+pNgNrSq2hL0zi9/TGyzBalNpf0yLJZwk/XLbm22/5VNMwPNPxU9Gc4Bw1YXmgDZT8O7cYsCxyhwKVto+iNOkwUSZ2lydgAVw3N6xcKbMArJXyXPvn0f3kGllahiPJVyX1vroImwJ86+X/fK5oKxNg4jLM9i53l0IocJRGzE9Ew9TcCns/yyZbgZVEgLXI6+Zw6oVP27sOUaDsDO+8c78FsBXZvA5yM8C2rYKrhY/YAELR0tF8xIsQJ/0y73evL3bl4xhPICBi/uyCXD9O3lr6yuAgpt3jIdEzdC57Y9tVzeHfuvb2cxsNFilYt2/IpMGEvNxSq/7adD5VdDN6DsNBkcVZmp+04CR9Mtp94dFX+YaQ97K9ih3TRPout8vOuwDkHw7VqcS7ffbJ7cbxE6ZQYQfL8dR9M5/KyQ1FVrQ4Gl1xcpaNK/2DuUoOpTQAPq0ao+U06CZ9MueHivXS5oaw+lByefd3RR4GTrL6IPuX7Happc9JaZg4jp0aPddM7DRnt77/pg5rFm1LkKPiwYMDa4+4m40cPt1UqtlNw0ut9xNko6gIa5c9sv0vZU1MzrGICijbZbYQgHqRe95jWkqvG4YvbnqoikkBI4eWrpqBlPxhWsXD5hD+NDUANM/NF9tV3syot99wfP7BbYAGsyvC6KIbqVBKemXf4ptAi5+Y/D8vodPs5QCoSkmuYXNVFDtspFrSjEF4UARs9lcM6AZ/ggOCzaHYAHZQbFZczgs4if0WocGjq0/mAKcaHCXQefdZQ8afCM98MLVod1t5sZgw3l/ajc6h4Hzz+6+/k6Fs011av8K0O+9eTf2a4UZ3NtfRvkSZw5ZRpTFvww0KBbv/GViSUPc4hpajX5vwhtTrjj0e0XLlnPXXlvO1SNzv/5PbjyZW0vm5pC5hWTuBJkbRuYqkH6ZIUN/lRg6h+cGCSEUdA68agHp19E5uFr4Fzejc6C9a8rB59BxgJNlNzqHphDaL2F0DsdV3iZ2onP4XUho+KBzMKOEr7iIzqGD9Muy5hNV3LrGYP28JCIffbd6ZkstS/Td5m/v/8uDvhtVPEHwL/puB59lL86j7ybCcMbq15I51LVxbP1Bo0HJD4rpH3/03Wi3erjQ72Xct+yXE9STeNeje8ant6F+AJ2DHqcQ3QPdszEFRbcX6J5Fy92R2oLu2Y8mrvIedM+ixr6EK6J7ZjhvtJUb3bORmALLOnTPxvUPCgihe0aQfvlVw9Tnh+hdlDocb6Cid1G+SmOoDb2L+h6FpavoXdw6IWgTjt6FVParVwnoXXgw/zQtQPfrcYjoQfwuXFvEmx3Ru1gcXvsyCb0Lb9IvU/rnrgahd8wvOanLhd6xd/OP79vROz5wmNo3gt6x9LZQ0U70jif0U0+yoXcsoC+RxIHese+5HZa96B2/jxGfpqB3fJfzrnkdesdFpF/OvzC69R2aOweO3r+Sj+bOxLEt7/DcmRCqspZCc8dpX1cRnjsBm3+74LmzUntqzAnNHbtUZW08d6oiyqzE0NyJKPzicA7Nnf/65Rmx5Bvr0JxkU9RgZUZz8odqcsomNCcDdupocKI5mbGjqi8ezUmKZocMHc1J9xUysploTgb3Ma4PR3OS9Ubx+T1oTppnp867ojmpTfrlXUxd1Ag01/dqM93Bc93+/ngOnuuVMvNNeK5vfHDvAJ7rezXpjniu60lc2YXnekWdWA6e60ebWyvxXN/ocT8Pz3X25mW/XOz0tgLvoV17+4/gPdR644zjVrSH+jnDJ/AeevdNSe8H2kOH+P2n8R5yqc1lTEV7iN5R1If3UFvEiA4T2kP+nwL0gtAeukl64P1OPq2TaG8O3WMXxHuzZP/+JFG0N93vKvwJQHuzLNZxFx/am9U6M/IZaG/mLGxyrEd7s+Tx2fo5tDeBKNqmhvbmg6hhG7w3T5O5p8jc92RuIZlrS+beJXMfkLkXyNzrZK7x/+Q2kn7ZsWPxKO4lTD9/puFeMnFJwHAX6iWBL48t4l5SLj/bgntJ+9qjtouol9yr1hrHvSTN+IkX7iWXhZ7uwr3k/g67WtxLSkm/fOJpshfuUaqPdNbiHrUqaCwJ9yizLQ/b9qAe9bHfbivuUTLHjzvhHrW3wZId9yiTobpuQ9Sj9laUtuMeZeBVKYx7VBrpl5UTbDkPot5H3d2mj3vfpjRdhRHU+9xPGLHJoN5XubkuHPe+MinfF7j35W6d3oB736/FqWzc+76wudvg3uf599lp3PsmSb8ss8vJAPdUuz1pVbinVn9iPYp7aqWJnibuqUXg6I17qtOja6y4p4a6jU5Xo54anDsjj3uqJMumFbinftxQdAv3VA/SLyt0xu7GvXr0bIgd7tU1lise4l59yuliPe7VA9lzPF9Qr3Yy0HqIe/XdgIFA3Ku1fl06hXt1SF/aU9yrr/UMfcC9mpP0y+shuxRzQIRCtzPmAJnBvAzMAe+o7XME4oC7Xze8dUUcQGntYMcc0LWXOI45QH6b5B3MAclrSg5iDjAf0ruMOSCR9Mudwuc3Y24pTH/ohLmlMeKWA+YW5VRCCnPL7Rs/+TG3WMzF12Ju8Z386om5ZQ3D4lvMLa0hY0qYW+68O/oWc8t//XLMbp6yLsRZjjr8kZizjISHZTFnrVM1PoU5SyfCoMYAcZYZV8D4GcRZ+7MlN2POypcg7DFn0ab7xTFnybUMfRJAf00i/fLs0odSzIU5rwIMMReWh865YC7UElgph7nwzPRhJsyFDe+0D2MutJ73PoG5cMUaox+YC6OPeuliLtyaaxqCuTCA9MD00yMZmGMTX1CrdiCOtT0RsAZzrNJX3o8OiFMzn/w+AYhjc8yW1mCO7cy9k4051lyuKRNzrBARJIg5NjtldgXm2KNkbh+Zu5nMNSFzTcjcPDL3Gpn7nMx1JnN5yNxCMjeM9MvtQvvXYU8QsyeiFHuC4Gdr47EnuOTX9gh7gjmXqiDsCQoDNPmxJ8hhEW7GnqBFuU8HewLXrZefYU9gFvXkBPYE3/SX/fJMpd927DVEq5gNsdcIl+Y+ir2G0Mc9q7HXsDrdJou9RiGj7XbsNSJDus2w14irSA/GXkP48v372GtEb/XkWVPvC/qkX1Ys623FHkahXUEWe5j8/KFb2MMIn7Qbxx7G+BJzFfYwBdFy5qxLvnBLuEHFjs0HlN5eEVrSQ7xtfP8E9jDOUwwJ2MNUkH45ZyLEFHujLSn3b2BvNP/aYhP2Rt89OvXmnNB9yeD7jb0Rc43OGPZGjDxZlOeBTuCvfyljY78dzB/ReIq9kVzs8UfYG0WRftlAMEX+t78TaG1V0bG2dgTPti8t2HPJxDhYX2tFHFvW/gB7rvR2h3kuP31Ys2+1zC3suZpDOzWLhcCLJWj0hv5TqsK+vxNW/xgJOdIv0wxK91HEdcE45IY6ZVIT7Jo1CU59ZYiI+B3z3VkCeOzeOCl87aUedshy/OUlSvRb2VpjL5dpIZ6Ovdy1houp2Mu1NQ2oYy+nuHvZLz/lKU/1wx6xIL7U5dUCdUvSNO+RQ+P0gXdltrEPOIkHiWzDRztEiRcFh59OVMoQeQpbyk80KhCZK2VfTN5WIaqZLkRgj7iCwp6GPaIx6Zc5iG3jxyvk6AGxuw/k2w3Qr+6Nuxjw9Av9tnqrDOX1H3pGmKLWll4Wojj8hffTPxzEgLxcyicZHsLjcbVfngIfMZ4hsissgp8w71Lm/cYoQNDTlv3yjy0zXT4ri+gKV61Uvt67S787X1sueOgxXdxtSnjrhna605qYRzI+XXT70YNV/nZ99D0lNJnGxEF6gJSXoOXdIfpGpdyvisPDdL3shLfSTiP0Iy3zcm5VuhQJ+WSqZ7wixflX0AeH77aUVzqDj+581qk7FluTp5NtQnFZm+N28WzXQ9/ZlmgHRWXK8e6YbxkBWnVq6SLlFcFylNrMsAeHTspRuuX8Wg/9dKLYWnffOfdk7GFzeqNFir5RXXGUxy716ZUUz+wDnUmM4w+zdjyiyM9wUlZ25lGKuj4aK8e9UUlXGDd2axGvOnWDmdJY+OEgvemn8dWYe+f7lFjrdGokTKvkFepqVJb98pR9u5j8wxE6t2vpaGjxKP166xOXU4Nj9F0Z2e3bFT/QNZrbzz7eME53iVHZtV5xgu4WVe7denWCLn9e8dThoQn6yPbiVe+mJ+gfjSzzVKYm6HNyy355zaWUV+xpAoTkJ++C0vuCxDaqxS8BB2HiqSLoBzCIEhosOR1FaWLEszmz/b714sTn23zX2g5JEHv4ta70jUgQSbEHV3uyriFEYkqJwVVriE7SL4cPqed+1NMgvumMTL3bqkkEdze/y2fWJlTXKCffeaFDUOSk04eO6hFd7UMZwdP6xD//+orNUwbEqfX6cRuSDAl6U6GNxStD4gGvL3X/jCHB+XXZL396sPboiLo+odlcb7DD3Ih4z9L1TCyPSowwBAf8fm5GbOZkqV/jYUH4qZrJyWRbETVOhwivABti8zM2u9WXbQnnC21WnAF2xIL+ztrf1+2IKtIvx0VoZ8Xf4iN67zfwHbaVIzRX6a7dJapFXLKkfFh725jwDO8VXfxkTjQLDxQXPLImXPJ57DKH7InqYTH+I/82EFGsk5bdh5yJpbsOHHafnIlo0i/bXqJMqqH+aXA9N2t0mxlYSpvF1jYaQMqx1QPiWxQhuLdi1XH5P/R9nHxHfTepE5r5jnNuWhTiWKpnDzs/jegNimHODrIi9A8nD6x4bU3Ekn5Zx2Ld+RUFHpAl0ZMwJusOLavvf6rpcYH0yIC/UdccgSlIL0frphW8XvhND2ulwsH1IaImcpqwniFI6/gZYeDOeAMsv//Q5ds7HvT1ChB7Sb88pbH6aJa9L0gm7z8qZ+gDuZED6esPboSJEIUocwlPYDxzJcNP3w2yfB1Wa/E4Q+a/LtNIBjsI0y9mZ0F9o3HsB3u7khmcVRFaHccPMEb65SE/vdMqaJ/N3Mp7avrcF3YKer5bh/97bUmJ9Lr7G0GrruWv7zZPiOWW0fd86gZUCUY2FwUXUBXx5k1pcISe+6JBIsft4AHnM0MTXtQ/SA/871KbWnyiHySssN1CoD29o3A8havbB/S+qRjtMfWGhk23VrhqeoFceUSW4St3qE5gzHLf6Qotsfz8/xydIeVMx1nuXEe4yErfGGLoAPfIXNbLy7mnyVx/MledzK0icyXI3EYyt5nMTSZzz5G5fqRfvmqsO7iT7guzKaesU9184X1jsq1/Kjpn64QTZ5y9IcSwOaGlyAv01S3bYks84MjnG3PuZ93g4p1RK59aFzDJbX7ksNUZwhL6PWwznGAl6Zf1mt7ttfHZCA8cvXlmYSMssTyYvTrnBee+rr6b4eEFey7EuXn6eQKI3HRYEvSAsTzxmzo33GCWT+3Ke39XWH/DjUN4mwvIFsQxe8w5wx7SL/+MGf+ndMEVYqhqWifLXaFJ/Uvt4xJX+GYz9s80zBWqu3RvFKD+JnFhdYeAiQtQbpt0MG5xhqk31iNcYk5wKODyiZPdjpCv4DLWb+II8qRf7s2k+z0Kd4R1Dk0DkkccQdlPkk8u2BGs2C78Hv7tAOkPXvzNk3cAf2d1cfPPdtDWMzaak2gLZpJWRc9kbODJjg3l60Stoc8i5JlPvhW8Iv3yUY0/A38a7aBYVt+PqLeD9e0Z736etAOVpHHLaFY7uGkzI+671haS1vU0Xx62hnI75ljHaMQ/P/ouX5W2hG95/74fl7aAxES5zsbrNAgl/fL0ofCRRUtbKOGy2e5CtQXWeFuuPg5bGJm9ons+xQYq9ZskOW9YQ7XjKbWeg1Zw7ebmkml5S0h8mvbGcIQGL/PvHVjx2Ry2SgQmOh00Bybqsl++vLmu+iDiBpePm7MY2G2gM4BhQrXPGgRXa2snb7KGd9se71c4ZQVnWe7FL4VZQvxfuefDihZQM9+h3/TNHAZPi655z2UOzz5brnp7xQzukX65r/7ZFkZbawjsHiiXNbeGE17mSv/4rOHwo8xd6ui8jlSbnAx9aQmc4jkzIYjjuituqPYjrutqKe+dcTUHE/+hWcZwM3D9Ev/FgNMMvpN+Gay8V9h1WEH9DQcxrmbEKYw71c/lWYHujQ23BRWsIGG+1ioq0BIoY6XSks4WcK9icnFYjAZqY4ZFdT/MQPAVq2y3uBmcTKO99r1nCpmkB7YIEXaxvoHyn4+WjpQg7m2qT56NsgKvUzfF55msoNpFLHK9sSXiAY7bqsoWcPXVD7cW9OcPPWSY091pBkKpx4UNf5hC6WJMyMczplBF5tqTuevJ3OtkbgyZW0Dm2pK5l8ncLWTuajK3jMy9TPrlLf2J12fcrUBpUVq2YQP6e256m6yMFZzTbP85dMcS7Ft53xvMIj42sK0JfE8DBvEbYiHV5sDw2P2VXq4ZBBykP2p6ZAoMbfsyAhC/apB++UPzQ5myZ5bA0zJ77+8TS6gI1rx/DHE7dZdaSbeSJZS/yAy/vtMCjvSXXxHaRoMh36deIRRzyBatueEpZwZ6+nxZZ1xNwVBtauzWKEAZ6ZejP5vg/3810GZE4JSAJXAHRqitmbYA233nM28esoCEwIn4gGYatFgd0ulvM4dzuqfrTCrMgNng2OP0fFOIvS769UgJQOhnv8UjU1TgTVr2yw+/d1tmJFqA9xUhY7M4C3g/687p44L+3BwfN8pM0WBFgEOlpi4NLi/+qGUGc+C4fzv9pYIZKCUfO2guhb5Xa/7Mg2oqTEgnjzxaMoEO0i8bTz5cbF2igXehRwDLLxqsCQnefr+TBueZE+ubQmngvyLcga3eHJxtN/Nf60C/M2KPGyvdFH7aTZn8igVY6q6IyV00Adbzi5G7bUzAjvTLf+1vd3rdpAG16Umm0VUaBLUd8vl4iAbMwrZfnonTwLywg+DYYw7qF+M9HhwxA7cMiemKKFOoz7rEvHGeCl09EudCDpjAicQ01/YWCmSQflmCsahIJpoGQlYKH3P30SBYddfTLXY0qOVeZbli0hw27OL822diDv++tR/44G4G/Rk8O446mAKL/dGNESVUKIvbOaKubgJmPv90GhIp8Jn0y1cmJ0Zeb6dBlX7+RHcgDRaydIRMDWngypnNG9NjDn/YrXRGVMwh8PYprtvmZlB9/5dhnJEpEIFLVeuOUCGeddd701UmYLq+lI91EwWukn65epPF7tMbaZAgKiq0yo0GBeep1Jj16J1mZjlIPjMH3uiTB1RkzMFG+hy92MgMpFYKX2HTMQWaxtGLlgeosD3wnv9OFhMYvPf2F/tGCsSRHjixR+/LR/R7t60+V2WOfq+gr6DmR30apK7nCLV8bQ49o+x/SxXN4Uu3jUIg1QyMTaNtQNcUTte/5syIosLqZ3/s3/6jwPnXBy8Yu1Igk8w9Reb6krnryNyDZO4gmfuLzDUhcwvIXG4yt5zMdSf9ctHu17Gp6ByKcrp42dE56JiGukaic2B9NMIggc7h91DQvCI6hxSOtTpF6BwCKzxW4nOIEPL6i8/hORvDh1B0DpElkdyc6BxmSL/M8ejg5lb0e0tSuY+2od9r+ZotSRd9t4MyjxP3ou928NRe4QH03RKeUN9WoO92XHfqRSz6brfrNp1SRt8tb//W99bou93iSk/jQt/tG+mXOYOudwije2akNJ59Ct2zf7mz6n7onj27Ka7JjO6Z9sX3Of3onum7bc+ZQvdMUE7HKgXdMwNx3/PH0D1LWZLvNEf3LLQ6iniN7tkP0i97vDLy80HvgudT5ioqehfnZP5MzqJ38WXnd62X6F28n5YW4kHvoswhU7oevYu0Yd+s2+hdrClkPe2H3sW4ecHPUPQuKqXLyjrQuygn/XJfzO6V7egdD/YUNrCid/zh7Md7+B07XCi59QS94/pjre0s6B2HTj5zLUHvWNbQqooBveM3kXdVZtE71j/xQSUdvWN/L17lIPSOE0i/fMriSfQZNHcivIbDTNHceSQh6eGN5o6N+epeaTR35m7Kp+G589DVk4sFzZ3XmXl+r9DceWijdoeG5s66rVK9D9HcqQ60XmpEc8eS9Mv6icp8OWhOyhxaoXIazcml4sUFPCdbzqxXu4XmpOLR6iE8J4//lPHDczJaKv42npOeBxey8Zxc2toWjucky/VX+/Cc9CT98rH0+vFSNNdrBcOS8Fz/xVybhed6JuvkeTzX+SQTTuK57vt0/yCe6xKu9ZV4rkc1ZUt4obnu2/SUKwPN9Z4W/7e30Vz3IP3yMRFW5s9oD9247L8V7yGrioFJvIfC2Lmn8B6SLlArwnto3L7PBu8hzUiPpGC0h1aNWCnhPeT+dWg13kPZLLlD/mgPVZMeWF1/V4cV2ptfbBzt8N48uHB9G96boztnzPDenOFfPYP35sGY85FqaG/2MgZ5tqK96Zl+6G4P2ptdf2tNjdDePP9R9OwntDcryFw5Mvf3/+R+JXM//E/uKzLXn8xtI3PzydxG0i//HnJUwb3kXUeiGu4lkUwuKriXqCv5n8K9xL9RYAXuJfIvbzxdi3pJgb7ladxLpORVtXEv2eiWX/Ua9ZKLjs3bcS+hkn45SVuAhnuUWK11Nu5RiWxuUrhHvdteEol71O+q76W4RxWbV0ruRD3q1/bWPbhHnTJ/LP0Z9aiU4mgTJtSj3utkUQ1RjzpA+uW9mZtf4N63+fZsEe592yc6/tP7Mnc2SOPel7VFdQPufTp/tljj3ueWVpyOe1+Y2ov5J+g8AiJ5+sdQ7ztVadY6iHrfb9Ivr2O9/xj31O0PUpxwT6333cmEe6pbFpsR7qmBfD66uKdue1Djjntqc3h2H+6pnzi9BYxQT1046VuNe+rOHVF03FOvkn5Z4D7rJ9yrLV68CsK9Wj+gqx/36tzuYU3cq5vf3P7pg3q1cpptNu7VjPQLJrhXpyorBuJe/ZVn7T3cq02MuDNwr3Yn/fL6z4lSmANOPAwowxwgxJk+JYs4wJAraBRzAM8+4R+YAwQbo+QwB7CztP/CHFDmG9jwHw74UNSOOeCOwPYZzAEPSb/s26M/irmlkf6FB3PLdOP9LMwtgatfdmFucbB1i8Pc4mN0PQdzy0x0Thbmlru9V/Zhbqk6ECGOuaUh7mLMf7iF9Mv/tKg6mLNKfiQMfkacdTmUrxVzVlSgwSXMWR7MR5wxZ4V+lPTDnGV/k6MDc5bGqOgzzFl6xjMGmLN2ca7UwZy1g/TLPA8ZhzEXfkxbaYe5UN58tR3mQvZVEccwF5oVzcZgLjztl92IuXA8mOcT5sJNNRdpmAtfV8k3YC5UU1jri7kwl/TAKZFbODHHVm8dccYcm7/lz1nMsWnbpbdijqXyurtjjl2nt5nZCHHscf+/Eh6IY8vbtl3HHFsUzdS5GnHsvzOm53Yijt1C5qaRuYVk7lkyt4DM3UDmypO5J8ncIjK3hMxdIHPtSb/MFK5Zij1B7H7OEewJXA7f+4s9gY99mRX2BMNdaYp+2zxh8GLoDuwJmFadomBP0JSafxx7gnXnmoewJ7gmI1aLPYEl6Zd/Ft6/gb2GIe1ENfYakQuJbdhr/CxxJLDXCMsumMBeQ3v7273Ya9xZNyAYxWAHvPFNk9hraG/nmsVeg8HMfiieH8CB9MvpT9u+YQ8jsDNpAHuYJLMu+9oeF3B7f4aIvuYIOwy3+2jftAKpnLXWe1upMKb++hJVThP2aMRA2hlhUA37qPBp8Q89NIi5+lWvAKFI+uVDm6IvqRMWcMAxd8PYNjP4eZXl58NGA3irLDG2dosinBd+lrdb/g+dHv4lZuMmdeL9faUoVy0KMcp5bS32RmFXklyygqyIj1y567E3+q9f1g1t2XjgFh/RwxrEm2ArR4iyftAOFdUi/Ji/iGDPRTRENf36ZE5w5f3bgj0XXY1XFHuuaKb+z4n/NhBM3ZP62HOlKDEs2X5yJjpIv/y0Pd4Ye7m0yJr57eZGRII7fyr2chyZQ6bYy7HFfrmCvZzLEXtu7OXS1OxvYi/n88KEir2c2zYvwF5uS+36auzluEi/nMaaFYk94uaTP19hjzhiRvRij/gooD8Le0Tj3I23sEes6NzQgj3iyJPAeewRxUJjnmGPOMvXno894pDrUhb2iCdJv5ywYq/6yjQB4kF31HvsPYe7SkUEHYSJPUkcith7rrebTcHesy9p/p9PvThBI+7zY+/JKef4r3dEgmA3eBHiwbqG4BuqFMfe879+2UJvdo/0wxG6dHNxWEjxKH3wUWd5+uAYXdXXeWuw4ge69ELWpacbxuntrpl3tBQn6IWXuO1eXp2gn56XoZwcmqAH2zd+HZ+eoHtULkTrTE3Q/0k9qA+uFKkb1HWuYWruNGZIK3W8yypVlxSQN7oiVYAyXinJ6V4hTclY0V/r4S1N+fenyeVToDhF0MREjWPLGsrSkZ1b9omJU6SYFE6ME4x1a1337bM34K9ryZ56N/aUUqd3fu2X0yUGFB5vk/tX23XrJo+zezcJr6eIKdZLDD+m1oUxa1uXawhTnIa1f9aIatbtPbyToeiMBmVrp1w3yxd2ylMutrk/jbx1c3ImnmrSynW+xst+2Tk9juI3NkEP43NwZ2qeoPMpOrxOjp6gVwy1cv/qG6e/UtCJqR76QBe/x677/fx7etrKvuaVumN0fTrbSrapEbrRgtf0/NwwXWWgqPtY4jB9C+mXzdrFV25bvYbwyfdIL2FaQ7y3cLpxu0GC4Chn26OjIEGEqB4/NiElTlyKp6xlrBclSjZST9FURIiutawLQneEiPC07TyuOYKEcerLX5v5BYkM0i+vv8d/ZD2LEVGfV10krGBEaGjP+qZqGBGnmxi2SS0YEl+k29QvbTUkvkP7WEKMAcESsZ+72FufcOllXpwy0SPM2IPvCW7VJSxvfwod+atD9JN+mXa4R8533o54d/YBr+hxe4LL/shRI00HIsXwU4Z2rQNhEiQo0vTVgaiedH91oMmBuL03vrXIyoEwVRM4l1NkTyTkSP41FrInwtxvjWt32hGLpF8u/hPeM+jhQqzaJHpw3NCVyAjVklva6UYUOuzR33DLnRjNrYv5+NyDiExoZLcr8iRi4yMdeqS8iGY+zuOynl7E0OGzbBKbvYhDbc9sgjZ5EUakX04Ou3cz2tSWEC30HCoLcSBEtu1v5d7jTIirUW8+Y3AjThbVX28460FkdryUtBz0IjzOP9jlfc2bmDssPhEx7UNctlqqt7nqS1jT1t7Z+M2X+K9f7tepblurL03sbfvZbmitQYRL+bu+2GlM7Lcq3SsVYkGciWgQVjlsT6Ss+JCqJOFCcGf66VYtuBGX1HS/9Mh4EguM/VffJ3kRylnH8f9fhPivX9Ys+1j+osMYjHzCPti66UCDYpf9tVgZ2PbugFjAKC8R6H1T/mKENhE+s6D8SMiMMNVqlOTKsybWbbBNvl/lQMhH373Dz+5M7Csziz/T4Ey0kH6Z4JfWWMy1hhVHItpva1mAq8eMAVWTClpFylOWPppgIjIpZ+fFDgLtt4I/5K8jmD+cVS01MyBkb2m4RjqYEUR2r+jYIwtijsJmfMXMiiggPXBobOq9Vz12QFhMZHResYaFt8G2MYgz5QP50+84G8LEi9brdzkVQNDd8PDvbcxEzYdjhZwGaoR1r+pkvZMhkfvQr9FQ0JSgO0vOKWaZEQ/IXAEyd4TMfUbm6v0/uQNkrgOZW0TmVpK5oqRfVurKko523wCsd1k4Hofbg8vpKaHtPNYgKJZ1oXivGeySr9mjLKwHgs91tK8yykDbMB+zsik7oWlgvXj2ghIh8r7CRiBUmxC8al6yw0WP0CL9ctL8cGhhvDPcyolupLzYAAaDQ5xG++1B1Tw82nOlNdw6wLBydNwM7iSnBrpyGYJtU0fUvmlVSDLoFLWPFoPMvICtixWfqAqKcmt7RRbpIaRftnZYySRa6AB6NIV3n1XsoerS9pMNb23gHGPINAVxGG9Ephl1rTn0w5GJA6EUWP2Q44PKDx0Q8updGgtThRsijbyjLXLQGDqxzemrFHSQfvnciKpx0RrUZ7XY2/0/W0DUM7sHZ3ho8Jvm27UuC/FTcKRFhpUxTMp2Nz9YoQtvXRbk85TVwD2SlnPGRA76P+0imBvFIF410f5whQBEk345g8NYLFeDBgn32j7XrjYHhZJT3y7bm8LaLcWlnz8ao/68lSNhrx60+MQmFZZpgPW/jszcTeugKOeiCVumGFgfNT2VKL4KcYRj+BFWRvAn/TLj8/T1QSvN4ZaS0N2dP03hFvcAV0M2FUbCmNJSlIygUtH1rMwvHTi3KjGvlkEdUj/PMP67Jgcz/ZzxAgoicPyGyGTOVXYQ25weXhb4h9pB+mVRxq7cpzpmkB7+WjhNwxTqutwePNEygaLdMmfLlwwg7kTCaMVqHVg9K/Zy5p4qFH9v3rxqRBbMVr0qcdopDKvUZZtT3dih4f3vl0I1f6jWpF9m26PVHltgCsWMR4KDbACmT542FdamgJf6CXkPKQNoOut8oXmjNgSUHIubu7geHhimrGsSkoXQNeXv3/oIwYoNfO8KPq0Am9KIxuRTi9RE0i8/0N2u+sfRFEYeR14/eZMK+setth67bgwhKWEym27qA0WV97sQozbMyUjsjJVbD69+iG5tfCkD5xVtfZ/JCwGH7EPd4R8rILn33mD7yt/UQtIDP48JflCvaArHevftXbuNCpvfW0hIBRmDr0WciuZOfXC48/ama4MW1K12tIq5pQKZe0Uq6nbIgKLT4x7fbYLw/ZxTf0AmK5z8KG9yxWeB2kDmnidz75G52mQu7X9yy8ncLDLXgsyVzVvO5f20nNvauuyXh1UeLJp+Bhj86/x2goMKSvUX2W4LGYMnPfXgPnV9aCy8OVBzXgusxYpvF6eqwMorazlYd8rAjQe+OXNl/1eHeYdj+cbv38omZBNZWWVmxOO58diS7L1LKhWSRKVFREqpzFQy0iLt9LyRyE6iiGwaiKSB+F7X1/35/fE9jt9f93/ncR/Xdb3P93m+hIjd4VnP7+9iJf7YeyvKus1R/Ui+rCy5oPBInCDGz3Tqi5kaERZWe2g9vgbEXNG3ErdUXcL2WenADUEtQt+Dr0DqqQqhHyjVf7xFhoiLi/oj2CxIrHTqrknWWUHEv3goru79h2pB8uUInp9vFZSohKtmW7mkH4WY+UkYSaVvJMBNWW/vkA5hM6Gc1JWqSbBoEnZ+88pEXxFr8pSHDHFkwfXxkrcgkd8f8yZ7noV4vpr1oXnsH2o/yZdf0KoD09F/1rsvzPfEGxKfhB/Lm7foE8k3mdtC9XSIxaBjw6GMmkR18G3+YzLKhPw3Dt+eF2uII+UCBjwpq4i5a01i1p+ZCU6RYFjT/ov6N3OZL8efL/BQS0P/+bDekr/fgDjfdpU53kCfuB+gH+r2fAOh9+jpUM9VDeLGAecZliwl4snKULHjoWuIVhHtiTrTVYQNB7NK6htmIqtgW5YJ32/qQZIvi9CFLmkIUgjZMq8Qlx0GxDar0fuFzXpEalkTV5kX2neH8oa5HTSIfalc8hqSSkTbwf7PI7xrCKae0IDiFwLEXECO5zgfM/HOUdBhdfss1Ybky3z55nz+rYaEcFAbtQ35wZTjzBXbS3pEdk70qm61DcSr9h1SshoaxN6VV96GzygSxbF68mbz0oSy8oKXR5UAkV1MjzC1YyZWnLiz9lbML6o6yZenGr2nm28bEq8zjP6OsBkQawKJVYX79YhbW67+seDbQNBUXPfzCGoQVl4L1xwrFQmv3Vx+g1eliem+0Fh6mABh17iCkHzKRCjnjmpf95ulDpN82W+pmflmoSGx06+h9S6zAaHjtC3TKVKP+Cf7suCywAbi9l+eTdniGgRvQd71yXeKhEHUef2376UJlxVFe97fFyAu23bFDVkzEw7K0zFEyi/qNZIDzyZMjefkId8eZ3Xq+ruRcGCKLTwWjOasxbuWiWEDcWrq2OIskwbh7K5npZ2jSCheVskId5Umdv+cPntQQYAgSn+MmK9hIgQseFmurftJbSN1r5K6/BPLupqkLpXUPU3qupG62qTuQVL3BKnrSupKknxZXZ8r5RY6h6+7HH3uo3PY/8x3vzs6hzfDFNkr6BweHtc5dh2dw4+NB6gL6ByKnVbc+4LOwZbLUXQMnUMgDy3qFzqHiPI3vB7oHJpJvnynLC33Pbq3YqvoqB/o3lLCZPUfoXtrvVdzzxPdWzzTIZBB92ZwRf5TFLq3PQrngkSvSRMtgn2FH9G93Q9JnddC99bN+cfjHro3E5Ivc9guskeidxZgfOf7CHpniZ2rlfzRO7MYvXv1G3pn1cmLO9ajd/ZMtd89Gr2zw1XpXOvQO8tgd0uTR++sz3Do9eNNzISimPLEoYO/qLdJvsxs9mUYz0UAA7O6E5qL6vr6HVfRXJwQ/VlTgOZiRpIp5N8WDSIxwTmeC81FUM3wH0BzscG5MTgAzQWndcrEDjQXXaXu+fJvZ6kBJF++qd8tJI/mOIml1pMNzfGnc/6Kh9AcU4f/tG1Bc2zEU5raheb42oGXr1agOV4XbFOWhOY4dEfWsX40x41Rp27XoznmmmhLqURznE3y5bhw/weXke/oTl940I98p9ZKa4s18h2ntP4N4ch3xtNlNMKR7zi8jXuQiHxn7IHOjUHkO7ktNG8R5DtJoo6dHsh3njY2ryCQ7wiQfNlxiYOKfTLu/VF+7JPpdN7rq5FPHpXZ8HYP8smVxlonsE+yT4OxP/JJ4cuxu34gn1T5Qb/N4iNIOMcVrCpCPuldS7HxQT75muTLqzbxKz5Gvj68ezMhjv7bbt7FsBf5+gyj7m535OvZPQe2FCBfD9Phy8e+vp73kQD29c2/lzYLIF+fT+tdH4983eY068Aa5OuXSL7MObXzAoH20DTt36FRtId8uygtd9EeavHtuxKG9lB0q9dBvIfs7gqJF6A9pJ9bEc6K9tBFvU25v9Ae8hR/t6YC7SHLqM1zOmgPpZMc2D57/TAd7c32mxKP1qC9uZA+KySL9iafz8bjWmhvCu5P0XRCezPuFMUpGu3NhCd/VJ6hvRklEinggvbmyD+fGHu0N8fabkgcR3uzlNSVJ3VnSd1mUncVqStL6u4hdRNJ3Z2krvHism7/22XdEJIvL1U8rppHuUTwoshIIsolBw4MNJxEuUQ3ZcM7X5RLQu74M4ugXDLypsQ+FuWSjGKB3hqUS+ZeVk63oFxC6EsyfUa5hN5J+9KDcskSyZcF3ZklYlGOql4sZ9qKchR/cUY9zlEVKz4n4Rx1aICtFeeoTVPJe3GOOh0W+rIG5agg1N17UI4aeXJI6QrKUUkrijlPoBwVS/LlzJWPXXDuO6fX3Z2Mcp/Ur253nPuo5+cCce6bE6ubwLlPiJ1p1yTKfYp/xvx4UO6zDNIVckS5jyX+sFgayn1Tv140yKDc50Ty5bcCpjtxTnVguzmFc+qabuMYnFMvl/7+iHNqc5f5C5xTG9haL+CcWn7J+vEiyqlvys5lrUI5VWV0T1c6yqnMf0yk81FOtSH5srRox8dLKFfz2557gHP10Vuhr3Cuvl+lHo5zddlMPTvO1fyhJRU4V/NlTPlkoFw918FO5UC52rQ7bCEe5eo64z0cp1CuLiD5ctWTeR/cA/gSiUncAwZa2DtwDyB6RgdxD9DdM03gHvAjPywT94Doga1JGagHyAaIdJ1FPeB1srgSE+oB9X1Mt46gHvCa5MvXPtVmiaLeIkdbG4d7y/gQNwX3Fh7rw89wb5EpF9bFvaVWMmbNQdRbdjp0+q1DvWWTAaf1COotN/tUU4ZQbynqlp/ZgnpLAMmXh6XiruCe9TTnt5oR6lksUXYxuGfReeL7cc86QxsOxj3r295T87hnmXB/jYlAPWtI0WxuE+pZyr+1uDnujFOTUj43taKepUry5dGAJRXcC1tHrq/BvTDUlccK98KDqaq/cS+MtJ9LVkW98DjLXtNbqBdWZ2+Rl0C9UHv3h76zqBfu0lyQEUC98FrDvv3bUC/8jy8HtVT/bUc99ndNXUcb6rGVx3jjYlCP3Zp4saQc9dji9lH2J6jH7imCjT9Qj5U5s0+JE/XYtRtEduIeK/c6NR332NzvBvW4xwqnLesqkrpsr5Z1b5K6pqTug/+PLiepq0bqVpG6Qf/xZanxcswJniTRPMq0zIiI7XVhhCaVOGM8YW3pqUkYxh1PdnVjJwx2Fc4N5K6F05ntHjdM9GHEnhIQuckEwmrU1w5WmoFLcLnFNRMLoJJ8mZeV8WhbsyGhqPOTbuu0gXi8/znDnRhZQqDT5J3rID/kJN4IzorUhoJrwh4gbAJurUpe3JmW0Ogi1/KofBM0lWm5Y65x38pFHnONocBlviwxcLdBQk8GWndIbNa31ACm3oX25p2GUH3Qt0x6hxmIvivwUDlqC2vS1qlhDnPm5+3u+3+cYPbjzUzMYU4nDrhgDnPnsYMY5jD/8WXR7E4mzI0Chh8aYm7EvYs5DnOjvHMVezA3+hyTH425EX+rz4JZjxswaR5wxdzo/K+5bsyNDokdf4K5kZRD3F3Mjc6QfLlCa6QRc67DOaJRmHONPb4lgznX9C7vjZhzxQr+i8OcS07rlQDmXN9bnD0x56pWenUZc660Yi1JzLk+fa70xZwrmOTL3uOVMpjL1eoECGIul8ukfw5zuVQbyTuYyxVNMplhLvdb9vTKg682gb/1dcEbFuhcjWzGMZd7qHLUlSJsC+lGgqYb3tjAJMmXu8+Yd2OOGGQb9Q9zxMNSrA8wRzxibfYQc8Tuou/7MEc8H1oqGndQH8L3vNPFHPFgdoTEVyNdGEza+Q5zxDOc1YmYI8qSfPn4sW3BW1euhp2Ta3/dYFoNn/nN9DH3XEq4ZYi5p+D1m4WYe4p2MuZh7rnlNOFppioKpVdVvouUCcOV11GrnS4JwYrVBbxBq4SgumyZLx+/7ya2bWiM3nMjuZOzboyePhwsf+7AGF2BL+Lzvw+jdLWyUZHHfSN026Wr62eyhukdfWqtLDpD9OGUO4EMXwboh3oTQ8d/9NMfOB7gOXKsn974dVAqdL9Ixe3f3CKHuSUpJ098kv9K1aJIuuzO+NTMQ7Gq3zYYp6laYeAbsTOntPN5F/305fFyzQqxrPsn60vXU151c0Z+M514fjrVw6VzBRNFR24u//MBrgqLBkZJDppFRaDUntDiOA3KZsUPxWHHBCuyTJM+i97Wo+yMsZcyM7apaOb/7He3U40S23vX2vm1RoXlWNAbw3ptyqGyPqVyNWaK9Z9uKWVfOUr4qXWfdrxRqZDoXubLtSGJ7W48/fQOl3/Tin966ckt6fkpRd104TSNQc4tnfTL3d1OSrQ2+tb9F0WzZuvos8JCYw9EK+jaOhNW1MgiOrNmzaCGnj89Ns1vKKoxjVpE8uU7pdSz4ymCsLNngB5svwqCPHilPPz4wbzDx3H2Gg8U7E3be/kGG5gGWXvWujBCM2Ph6+qXv+i3Kbv399Z8oa/crKyR5vGBnsCdT+G7/ppOIfmyZrPIkEL6Big7wsJXfFkbOkZNgvexasG1j++cXneog8Nvli1CzSow+ufIbZ4QBdCpFGplN1oDSp2TRpsbRWDkKTGZU8MPb4KN2B6v44XtJF9W9g4jrsTbQPDT4rDBRmsI0Rx6n3feCgYeqY5LvLWAMxnWE9+yzIBNaE05SJpCXnafJ7J7YJ6na3bOGIBNLr2zaVQP7oXkbFM7pQsJJF/+UXRiutDDDd6dK2TsNHIDbSvJK7xTrjB85mY4m4sr3Auc79gb4AIWIR6iGvLOYB0Q+uhSrSOcc/WlOh93gFOH/GNWnN8CQTIOfsZyW8CM5MutxBrnFENv2OD36nlXgzdwGX9uX9jjA4aWF51p4z5wWDZISGeVLwTtNuk//dYHBGVlv0hTfYD5FVdNyilvoEkoHJ355gUuFE3ukDwv0CL5smnw9SbZ2+6QU6OQPDHiAT0sW5OPJ3rB3/lhPhOaD4zOVxjdeu0LvifsNrMP+0GW6Z+5LTR/SLxy0E8lyB9y1e3uCG/3hzn7xWz9rf6wg+TLqc69q9ijHWANnV9WmtMJROSjfrJsdIGnJ00ex5a6QWv52RU2Ip5glLCfWVfeG3I7wscpd32ghnbXx7PUF7661+jLEX6grzihsme/H3wn+fKZ6COONLollB86kCXCYwvfikM1Zp7ZQ57MCmfGdEcwG5+Kad/iAi+zkx7r1rjBvWeuW18+8YCIrQcvzop5gf7ZurmECS8ICej1WUPzhockB9YQi1N4vZIGC8MaLnZ+FlC8buW7PCFbaNR07Tu3aQukfZp8oL3aCbYdvuD975YLPHE7lNEEbrAkV8+TQ/WA/AsSiduVPMFWOfPFlkRP6CZ1+UlduZFl3WhS9wWpm0PqOpO6L0ndSVL3Aam7hdR9X7TMlyf7rL2ctTfCx9HcFLsSAmJ7W7YmRptBSFiM/sSsNWzbEyHlVmgPl/NFV/dEOsJE+Lmg5HxnEJ99atJMdYWIc5njZoQbeG/xCWIqcYMXa5f58tN3mT+nr/CBfNKSfskTOaA7e12aV9ICpfK/x/JVKWAsaJOis40GJ2RshF+HW8HxintM2dWbYPu5fUq3WLZA6Pe1k3v5HcDaRu+62wkH6CL58o1LL/IU1cWJIUPRlRe8GQnaXTnephX80ETbOcajqwSr/sU2j57dALCU7D71ggKXeMp9tSZNwKnjo7r6XTMYceY2Wh1tAfd4f8VyUizhP748Z9LcaqzIQzwFAbrvoTrqN+p7dYvUVbB5xNLundxaKFulfybmoSZI2VWycUjqgzmVdn7jTSMwNS9JbvltDH3Pxim1nqZwcPhpTuAPUxAuW+bL/Rym6azPx6jHwqr3KWsyw5NPF7tmpyXg+k53oVIxZXD7o5KhfUQLGgYzirrU9UGFNVX5i4gR/KatEU8MNQY2Axf7a9dN4NK8QtvVtabA6b/MlzUihRSCXvRSPSqv6rYzsMDvwXT3JgcJsN8Xy2CtpAQVHCYTqXc1wemyoe1Kbj0YdFyV+77EEBx199t7aBMQtid8hdsLY+hncv8QsdEE3ows8+XBSE530fQBqsGdN0FH1ZlAUtf4S1G6GHDc/UiLrl8LqoPVVbzPNUBQTWsl/b0OeEc43uYlDODLkxLDkFwj+OE9WFlWT8D805et+l7GoFK0zJdjglJEhLh7qTrjH9f7bWSCtUtFWqf5xcC4UH/TCp21cPOYlpCDmQZQpnrDhXR1wIbYxLE+eiPwv+Kv7HmK7jG8euRMOxWMdX55ej8h4CHJl8MCTSsbrPupz6hzL1OcGeGF9F7apI0obA72kGfKUwA2vdzd3yrUIXDd2DD90QYwKj60SXxIH/zNsv84ClJAdKXPikNyVNBp7ArrYCbg3ddlDsz64/0HLuNOauadpZMBR5kg99E5udh6Udi92yhvU6sCPCIm7yv0qIOMOF3nyosNMKx6JX1yQB+G7egfc7kpEK7+sNJdhArjlxjZKmepkEbq/ppa1u0ldcNI3QhSt5TUFSR1v5O6faTuIVL3J6nbQPJlZp2opB63PurWU99TGLkYoeh4C0tGuwjITNMlKZoKIH04VP+SmDq8m5GOCLbdAJ+TzF2zA/TBIrsyuOeYIfBSU2L5EoxgJ1U9AwKoIEdf5sttJg+tD2h1Ud8rmmec3swIip5O609eEgG/lwczqz/IA0+U7fS942oQE5ZjVzmgDYY8HQx3evVgjbPxqqtfDCDvQa3hlX4K3Pu3OrXgkRE0Si3z5YZRuU3qcx+pbCfCedLsGWDWbLujzhVhcDA05CpeJQ+ElIycUNh6eMupXpKirQ0/rxl49q/UA1Y+oW2NzAYQ8yBVwuebIRAGCWu7n1FgRniZL7/aNqpi7PyeanNPOfSYMwPcd1knYKknDIdfe3TM5cmB9SlFu32P18H2gZOD/x5qQfJKrd1H9utC8b0VggZOG2HpCPuukHWGkM8bnAqzhvC+cJkv/90lGTk210Ut70nm4uJcotfmfPfwjBKCRffTZyo45OCnlr2u7GdVCK3OFNLV1oKl8CsT8R91oOByyMO8In3g2bF2w5H9BlBDzbrPaWAIOiRf7jxtuP4Dbyf1R/KG7v17luhDG8vudrsJAWfX85mQD7KwKsrwgeh5VVA9kjTo+0sT/vo/C9I5qwP1t/7W7rTXh9/vmStThAxgW8wXvdpOAzhA8uWEEZUfrCFd1Af/7jn7aizSF+cXGyOGBOHPKO34j1OycFB8ZscGFVWIbzKz2ftYE+5SzF61WujA7jD1e1NLeiB5Qmswp2ojJD5qi2Q6ZgCfSL5c1X1g11vtDqro+pPB0eJL9B3t4Xpf+IXAKGBhq2iGLDQLMxqOaqrCgM++HUZIN3v42WC3qQ4IsDFr1P1BPpSQz2nyZCMQ4jCeF2UAISRfPvCo6YQ1fzd1d3ubWm3dP3rJqV6zk+WCcHTqn8tMkCxonlFqevpHBdYKd7hezNCEJwbGvxtldaCBdXdt/Xs90LU0ojde2gizUjz7B5wNoMV8mQOrOvfobQx6Q50Xzu3et5YBArw/zGzxEQITRlVd6gtZ2FcjzFzkogp3GuiPzV9rQmdmaDyLkw6o+8Q2LLLpQ3/BOtf62o3Q6R/38/lJA/AhdQ1dlnUJkWVdA1JXg9SNJXVzSd0xUleG1B0mdUdI3SSSL8vmPx9PQefA+D3gZBM6h98yQS2p6ByyRBcDFtE5fNbX1XyNzuHeH//IXHQOW/Jucr7D5+By/+8bdA5P2WW036Jz2NEYkTOGzqGQa5kva9zmepeO7u2Z8/O2JnRvio83bRIVEIKEIttMI3RvsV6slQJaqhBYulfGBd3bCncO0Wl0b/z2atu70b3ROsLfO6B7i0tUfXIP3dtdki8bBB1xHA7sot4W0vjerblIL3HoDOpH7+zGGP2tSqIsML/l79iO3hnfoK7MSaRbNuj7vBe9s/PJn679Qe+Mv1u86ip6Z7/kv15kQe/sFsmXX/bJ7VDm6qR2blRQJ/Yu0SXeNEb8Q3PhVRZXtBfNRf8piw5BNBcGm6jB7mgurr8L6VJFc2H4Z6rfD83F84prB4+hucgdDhp8huaikuTLbGNrPy0udFFdr8U+jeZYoqvu2VytjeaYha9bogTNscuLj40CaI5XveV7rYHm+OUx3c0n0By/Dr3lh+fYxX5xRxyaYwGrxPPcaI4tSb5sGR0UfRv5TvGFGJcDyHcYRec1zJDvjKXXhWLfSf3Gehn7zkUGU/5F5DtJEdWB2HdKg91vbkS+s6eg/+Z25DuKi6ZX6ch3HpF8eVvFcas05JMnthpxnUQ+qVfpV6GGfHK8epaxAPnkxMfNtwSQT75OOzOYjHySzWFRAPvkOVnVdOyTJ7/U5mGfZIoLfIt9conky+MsmTcNkK8PZS1wXEC+/jHPqzQR+XrWy56OGuTrA++SFsuQr++QC5SqQr4etGY2Dfv615m6bdjXm8ZnfLGvx1kJZ2Ff9yX58qaFsybq7n1UEV+3xF+cjKD3U/DIebSHmoZ25GxEeyjmYZFeOtpDAsZB7dvQHprbtCCO91DjVPBxvIe0Tj5vx3uoLesZdyXaQ1okX34Y8MzmFNFJ3X3uwbMItDfnfu7wPoH2prnkouAWtDeZqkVlldDeHDmj9gjvzWvFVlvx3lSGOkG8N+9OZ593Q3vTYEdnMR3tTUlStyZwWfckqfvh/+iykLqDpG41qStB6j4ldfVJ3RiSL3v4Pvb9hnLJC7aIoydRLtl9TtD3K8ol2S3FsQwolzw8MbTxK8olK0s5LuNc0ux1zQLnknVbc9ScUC6RaPgZiHPJrfN/+3AuUWJd5stfrtzY/4+rl+p/c4NRIMpRx1Mdc5JRjup7ONCFc9TafzxGOEdxdPvsxTkqLOFD7zqUowbkBMNxjup2sTiCc9TIoN5nL5SjDvxe5stH00afq6Hcl/FEoiQG5T6vm5uVClDum1HP4T2Act/NU6k2OPeNbz1S9wLlvkh69nmc+46MZljh3Kc52DCGc9/qHJ4vOPcV/17my6kv1MwcUE6Vbps+0YFyaqp49tZmlFOrVTKDcE6tfKDLchbl1AXmGirOqX+P5u7BOdUiXZ8F51TCjq3TFeXU4tTwGzinbjNZ5ssSElNbxVCuvv9r/rI8ytVnugxiZ1CuvpS3n+0eytUsQzHrca42OzsShHP1aRkFbpyrGc5mSuBcbVJW44Vz9XmBM4M4V8eTfNlozjXeCPUA2fR9DiqoB2z1SC+yRD3gTRGlC/eAvW9fluIe4OZ+aIkd9YD5Aj5/3ANWvuYOwD3A5eleVtwDGso/+eMeUE/yZbq1+kcV1Fu67pbPZ6Le0qtcEvEa9ZYHh3WluFFv0eOY+jWCekscy8rc76i3lIqcWYl7C1Ns84Qa6i2p+TosuLfkh4dY4t7yMGmZL0twG0hNoZ41yxRAu4l61seG5+y4Z5VxKLy9jnpWSsp6KdyzQuuaz9ShnpVPhAVmoZ7VGvu9pQT1rD9vLqbinqUq/o3APes/vmxzcVHOEfVCQQYLW1vUCzuunrA4hXphPD1GaRz1QgGfRkVX1As7vvaUf0S9cH7qMzfuhUzrXeebUC8UFMkuw71Q7XHRetwLi0kOfKPOhBH3WM+39bq4x2aHSZXiHrsjqrsa99hfM42ncI+VbK0SxT22etqZwD32a6RqfjbqsU3rmARwj809RzXFPXaI1LUmdS+SumGkbjCp+5fUFSJ1X/0f3fekbhmpy0vy5R45Nl9TuiWYrdYrEuaxRe8pkvbjmT14530fYkh3hJ1GqYKYE/AePeuDOQGjzZIw5gS3wk2cMCeYsQqtxJyAb1JIEXMCOsmX132NfMEW7QCivb9apDidoKLoegHmGkdk43djrpGkeqrKWsQTOI6JvNKR94Zt6+vLMdeoCphXxlzjpGMJO+Ya1X93Leze7wdHSL4cGexxGHOYU5YVxpjDCGSnWWMOE3DZ+KMxzQe2tP0Wxhwm79RbPcxhTF0CfmMOw5iqFYg5TIDVlgeYw8TYfr6BOQwHyZd/xVv+LzfK0x6vwtyodnRmAHOj9+0euzA3avtXvQFzo/a/rGzJb32gXoFZeA3VBzgKgmcxN1KrdH6AuRGneKIJ5kbjJF+uj+tnL/Jwg0uCoZKYc8nGptEx51KzKcnEnEsiKIw1LMAF9tkFOmDOtf/Rq1+Yc2ld0T2JOdduhpsvMefyvMJXgjlXAsmXVwdfzcFc7kqzQBvmcnafbxlcPW8F73/w20u+tYDK3ht241lmcEbnL0+lpCmohl5iDjchYEcoQwvmcnSD2h3No3ogGmnwE3O5ApIvv/+wYglzxBPcYqqYI7rNnz+BOeLPswnZmCPqP1sqwRzxK9euNbwhCjB0fY0nh9Ea+JxQHW3fKALx/E3GV2r4YcEhserpOl74J7nMl3deFiqZSBEEk2uP+7fbr4I9qz/pevrxQ/EOZ7Pf13hA7iTTXMYNNih9KO1W58IIJrUGt16+/EUPk77ni7kny9z+qFSPD3TV6s972K+/pqeTfNmWU6XFnqefTvv5zl3kTy+9QTb29qGibvopvrad/+w76SPl4h+laG30hNyk+bTZOnrag8e/nopW0KVjbRd2RRbReXZxHzpj6E9f5WXp1NGQRs21/RX7gZOg9Fad0z/YxE8JTzjqPrFpA8Vnj+rK549WU+ov8PRweG6o2LcjZ4tKjlJFo6K0R4TI+gr2IXrv3uZ1FNW9L/6IJWpS3DwOL2T1MlMmt8nes3GjVejXDB+yekWreLXw5kPYuDxFQDl7kKa7kWLGPdmt6GRAqeEBT8V1uhUzT6gH9qwWotyXY9kxHKNckWgxZfjTXqPiy12ZtfFpzBVWhe8VtgjLUqwnh9se7PhrqP18mS9f2LtfuvDNdWpf9Kb8TzkPqCPUgkfN+6qpagkZjt7mTVRpoU0M3a7t1F+zdJq+1Qfq2697Ok8f7aH2fTiq+aS8j9q4U/2OcH8/NezgAy4Fe7QnVy3z5VZLirBNbhhdU+PqLCvXR6ovi6JQypMpqqd4ViZr/QI119F6UKedhZgLtGic/8tJCA+upq6W5SPeh5k/1lcUIKLqjLgcI1cR7DyaL2YYBQmV7ct8Of146kFaPTuMPm/RLOD6S6e1Lak0i49SNaQDvd7kcxGR0rSkJ6/EiMt5Qk2mpbKEdFsz398qRUJr/MazdaWqxNJEjGGBsRqReVaukctTnbhJ8mXe+HsrjOR0gPI45mztd03I6+HwzTBTAWZj1VNt2yWhjN/gaxpPF93dO/X9KVsxIuFLpmLGCyXiqBVTfpOGJlF3rfe0csgGokTg2AH2Fh0inOTLNvsvFKwJsocXrVyO5pvs4Gw999pHPDZgajW2p7bZHMYXhI8Y9RiDX6Wh1Q9/PVAIWJTu9lQFODdq71UiDI7vWPPf7qulX/l2SsB+iZGwJPny+WuPJ5k2e4G1S+W9LSc9YaP30bIQLQ9wH1L70eHgBlEXD3XnzzqD4bjPVx4HRxAMSqKeDLSH04/Lfxt220D56z9d6gWWEK64hfentgVwbFnmyzwMElmnfP2hfdg9VN/SH0ylhjgEuPyhpzggZ1rND7KseB4HNfhAoUrjm+lFL5B/xpT0k80TvqdPJnnpucOn+YQH432ucHzOZ+07E1fQIflyV+RZ+YBCP4gajxRNYvCH5+dk/uxR9of0C5W2BZr+cHdT2IzuCn/wv5xbMmbqB5Nar1iZ1H1B5fs2kaO8PqBgkOA7q+wNX6jiY5IvvGAXyZebfxjW/bngDQ2yGic+6PuAs4yHe8O8D2yjum22yvWFBbPo0N1ffMGzsF61tcEX7uaFnbF09IUYkZf1v+/5wPGo0+of1/jA031MkQe6vMGe5MBQXXD29RDad7NcZvXXvKClfZ+EaIo3+BVqstwO8AHxCb+dbN98wP6LxQpeHl9wE+Mg7rT5gKu70DXdQB/45qxwR+aXNwhGJSia0r1hD6kbQ+qakbpXSF0XUlee1LUldf1IXQtSd47UlSd1V5J8Wc5aZ9MbPnfgU5CetvrqDoY1BWVqjJ7wrJAqIy/oBcRcZkjYZy94LL6H5uHtDdzbXGdLw7xhuizrGLe5NyzRuY9HsXtDzeqtO9tHvCCQ5MtFe48JBvxwAJnEd1ZBg46gaFqwelrOGSovTEQlx7iA30o5laRbrlB46HGmQaob6HzXfsUg7A5MhmPpZxzcoXNkrUCZnzt4/NRXFkLf4yRf/pXIo6K/YAmVtrTd0letodL/44FTn2whiKU65orbZnjWo8XC5rIFGvo0gzrNHeCCAnuu/4QD7OsSDWi3d4RzejNfeOIcIb6pavFhqiMcI/mymJlV70QCDX40pfD3NphBm6fToudJCzhYJdEhFmIFJQ9EZC1VbOCTFteI0Hlb4BaIDF19ahPcs3qcrCNgB6e9BLfvc7CDY9W/Pspus4Mski8rmya13yoyhe8LvQ8YKmlQ6KPvSDM0h+cfbjB/6bCAuHRx01V2VnBR/5uWfZg1ZBZ7hBDrbeCJxOTWorM2sEFmPKL3oQ0s6cT3GoANjJJ8mfu3z8HK+yaQb6odq/LMFF6tS/thJmUGDA8viPvmmcOFU9aHjy1aAET5cxjwWkFs0uKK0y+sQM6femZYxBpKS1vX6xhYw7kXou1mptbA9GyZL+eIbe6ebDEGYeWTVsYNJvCp6t6YtBQNuqoY44fOmIH4Vo2ZxF5zULwyU3JzwAJkTbSvTSVZQmvANz7JAUuoZTE1usBkBe733x7L4rQCTZIv7zpouZZhkzF8j/Rx7KCaAIMta7b8KVNoWjOZT/lKg+6q6QsiaubQeaipuFHJApSyQ88WNVhAtMwWIzUpS/hzyFbun5ElSDbNmh81twR9ki+HLt55JdNHwEBdx/ZHvcbgtutNTLW0KYh3U5h1D9GAMy1hr9YzMxDyjtieUWoOzGtbfKftLaBu9Fx42HULGF5xM1ag2gKslYXu3ai3gCGSAze9nIyWbCVAdkjyW0K7Mdi2C/JECphCcaLTWp1dNPB22OruVWAGb5521WplmEPUF3++yxtQTo4ulvqM3s36wVKJ9fkWcOFC8p31JRagcXlZN5TUNSF1VUjdHFI3iNR9TurGkbp7SV1NUjeT1JUm+fJfzpSvsfqoL8bpb9sTbwwKqtUZLytNwORNX/KkEA2qLO7WUO3MgFv/6pswqjk4RC6uDOo2h547n6eFVC0g9PQjPgYbC/gBp8cCHSygn+TLnfOP5jpOUWFoeMibS9EYysNjgoU8TSCsm4tTstAU/J/U9ne8o6F+rO3JD2awV2L6p7KrOYRLNEgx3TCHobSFmJQqc1CJ2i4R89ocVpN8+eDtJvOb8UbgxfwhejWVgEMuxwM6XhuD5WftVT85TeHYVFtyqwYN9s9YrgwSNIO1lUsdu4rMQPhfofT2GTNgj3UuDOUzB3pB0R0HEXMoIPmytuPr7kSk33Xi2s8P26ggFHJbHpyM4Xqi7Uq+FBPgGFo421xsCuydv6li8TSoSONTUVtlBjuGnY56eZtBVuWEuwTqZUJTtf+yjpjBB5IvG66e5FOaM4TdP8d+BWQbwWz0z84T6B4PZzX59IqaQMvCUMl6dVPYLtbTfI+VBh7SDleG0mjAPNwf1tBFg89bZM0NZmlw2Sxi4Pk87f/x5dOvnhrmXTAEI9eelJvrjWB11PPYcTcCBnPfpee/Nwb/TI7gD59NQPJ6pbxOhSl4bFaSOmZGg/yLG/7eOk2DTN2/pbQCGkRVZp6OvUWDSyRfXpEQJsxPMQTxNHEmv7cUkNipWp77mwr1GT+KW24Yg2hqmtHjchNQLpBWiI83BfWI+DIRHhrQ8+Y3CjvRIEDqu+Dr3TRgXRBUWxNJAzWSL9+wP9TwTMMQBP8xO0zXUGCN5+bSS2NUYOnnElHLNoY7b30KAopNINPluNS5aFOYEvqg0LVoChLPBOkLNBpEfpyf4/Wlwb/kc1+kt9JgkuTLTPnRG5p4DYHau/Z6zHUKsPhnCQ/UUOGnlV7yaJIxrGO3E9p62QRSFRsdOENM4bAul+C3SVPIPnLlcMMGGhD1VWsD7Wlg3HNzZYELDd6QHPii+PuAQ1RD+KSqXne/jQKXdBgLJWeoYJmW+EjpqjG8FJo333nbBOpadpolx5rCgzcaLs0MNIg3lZHeYE4DqeQb1U/R/6YGOxBH0f+yBizrWpK6vOuWdV1IXSNS9zWpW03q0kndQ6SuCql7idQVIPnyrri7f9vQOXAnaR6LQ+dgf1vYbhidQ5Rwv9AYOoc255iAIHQOG6zuerOjcyjheqz+GZ1D133GwVp0Duc+dlj6onOYNJgTu4bO4SbJl73PXrOvR/e2N+Hd9wV0b3dvFNjlontLuE3ZiO9t42K2gi+6t8OmgdQkdG95pSYvW9G9CZ7znpxG93bLMWuUGf3v5z7TXkH0v7UkXxb4cscLv7OvNYP6Xuid2bjc0U1H72zuvBhjHXpnoeY3fO/gd3YreVcMemdqEU/O8qB3JnrH/y8PemcPPAceVaF39nvFo2Zx9M7Ok3w5YJ/59wtoLg5Fyp+/guYiQd+9ehDNhaHHvOZVNBfr2Vjc36O5iLaS79JFc2F7hPdGPJqLnUOcBffRXIww2p+2RXMB8nbvTqC54Cb58prWrRdV0BzbJlZ/2Ibm2E/38t4kNMejWduG+tEcry+s99FEcxz8t5KhHM3xvVS3hyNojp85S6k3ojk+6tzxcyOa4/hg71V4jsVIvtzRlw2nkO+8WlDZ9h75jm3JpqUXyHfCUjn28SLfETuYdqIR+c7Bm50jwsh3viZ8oasi38kcrNL0QL4zdDdZUwz5Tu5+8/EM5Dv/8eXiqzYiJcgnedSIfCnkk0q9DrqdyCdHuVnVZ5FPSjVd7XuDfLJtMTNuK/JJCeV71N3IJ1vtCnaGIJ9kerKuYzfyyYebX7U4Ip8MJPmyzYTnNPb16r3TRtjX4/8xy2Bft7N0yZBAvs7L/NUO+7qKceQTPuTrL78u+WJfz2Oi5TMiXx8IZxPGvn7LULrqIPL1DyRftms2iD6E9tAveXo93kMSGXIKNWgP1WxcIL6jPSR0UyWFQHvIW7Q0LRztodMJR2/hPaR/tthLGO2h8V2yzngPjV3KFwtCe0ib5MCh0uNT4uiezgQNzMajvfnSlfI+Au3N2LAH5dpobzJqSL/xQHtzbOWiqybam09m33y/iPbm5sNrfMfQ3nwQ+ur6OrQ3n+bscsZ78yCpu4LULSF1C0ndCFKXj9TtInUbSN1NpG4Fqfua1LUh+XJI0lkzWZRLFFRGnuBcUra3ZADnEtNI7VicSwTvpH3GuWRpelcrziVu4l75OJcsbt15DueSUw60OJxLJs9UF+JcIj20zJfdcj+OLdkawzH1dew4Rz365GqCcxT7DxsKzlFhpQxKOEdd1NhmhnPUJxdh4//NUTaCrDhHVZz9+28B5Si29ktKOEfNZS/z5brBrj849w2V/o7Aua95o43MGpT7JlqKGnHuKzwhZ5SEcl/fQsE4zn1L6mdacO6rU/BRxLlvybPdFOc+S7fJOJz7Ski+HLI/2gTn1PLN/AY4p1LWxRTgnBo80lntg3KqnWGZLM6pFWlBDzeinNpwgv1lEsqpQnw/fXBOtXmrzoNzqggP61OcU9NJvtygueMLztUZQ1PvcK5m8giKw7l69boICs7V2wjXIzhXz+64HYJzdQCD4hmcq/fd4I3CuTr84d79OFe/0k7owrn6P77M0xCfg3vA0mTWqx7UA8qaXuTjHrBd/1Uo7gGymsPlFqgHDNz+HoN7gKtvMD/uAe81TGm4B/yTr1qHe4BNKXsx7gHlJF9OuODxVw/3Fq4Uc9xbTtZ/8cK9RfX5+R24t9xTFf3HinrL/sM97ri3+MluPo17y/fzaWa4t9waNqzFvSVw5cf3uLcok3xZ7eune/6oZ3ndWfoUiHqWq2LxnSnUs0Aokwn3rPU5Rx4nop61sS5HHfesqO+BO3HPWiv3wQb3LFffc+9KUb9a5W0/LYi++iRfjn7kJ4F7YZ1ySSPuhZ1j37JxL3T21ZPEvTBswGEv7oUnUuo3414YvT1zAffCurCWo7gXNt16G4N7ocYJI3/cC/NIDhwFfStxj12QMXr2GvVY9+e98SKox9Yx9QbfQj2W72ziW1bUY2+evHeMB/XYHLrbp9uox5YdfrsN99jAOfszuMf2NzEI4h77itQVI3WVZZd1FUjdR6SuEKmbR+oWkLqlpG4YqfuX1H0+scyXfbb9uIA5QVzcTzfMCTiuVOljTjD6dC0Fc4KBzU+DMSc4UTagjjkBz5DzZcwJtCtfdWJOsN3VkYo5Qe+F4ycwJ+gn+bJkRMNv/0I/OFrDz4K5BsPr6VHMNTitRQjMNXKIN+OYaxzLuHwLcw3Wdg4RzDUWx+V0MNfgUE2Lx1yDR4AqsPqFF/iTfDnq/qcbmMNUCVjHYg7jO10mhTlM9qhGO+YwmcGzfzGH+RUgufrHohfsNvzdjTmM5H76J8xhZlMecU70uULdbfbDmMMsiS3z5YmTNAXmzV6wufHDZ8yNfAV1JjE3Ouvtpt3p4AbPr0nJ3Jh1hp2ZQnq8Do4gXTg5jLnRwL71NyndNkDZf+O8RoElPDrC1IC50Q6SL/dGVBjJBNlD1tTQd8y5OO7fbcCc68+Vt6J1zeawn++mErXHGN5Lvbgw468Heuz2Z3s8VWGPy4d2vxJh+Hvoq79nZC29levfe4slRoKN5Mtj9qrnMJe7cp6Nr+67Jpj7O5tmmqnAT8sA3vbtkkDZbsJaxNNF92CIKUywFSNM5T6eu/xCiaiOn3DGXK4qdbsB5nKs6nMKmMsFOi7zZZnuUXOLenZYwdQhdovrL91Kk/NmpfgoVQtNbHM+F9G4Pe7fo1diRGvwEynMEfkKfp3+U6VIcCnO+WKO6H6mZvGGsRqRNnolB3PE6pfLfJkhRPQfd04YPati3ouX6yM1Wav0ReqTKepjZW12zvoFKnNWTa1eOwsxGrM5499fTuJ9dcgPzD0ruifWbVQUIFwyHBww9/zAvHYSc8+IkmW+7BGot8/2zXXq54lzwoU5D6jeIj2Ukn3VVPMNZwK0zJuoyj0N/DWu7dQHYzKa8lYfqLGM7Ydij/ZQjRYvHrlb3kcNZGT+saq/nyrd7eQkZz9AfajVfbYrRJ3y3D/D6kmyXkXzvrNBR38LUZxKS/StuJUou7VFGXqPmFZ8nZhLSNgsV8F260to9YF1FdV7uKbZ+NQo15X9v9wR4KQkya7YUlckR3nAPe6Y3m1e8T+w6fsb</ELEMENTS> </NEKTAR> diff --git a/solvers/IncNavierStokesSolver/Tests/ChanStability_adj_Ar.tst b/solvers/IncNavierStokesSolver/Tests/ChanStability_adj_Ar.tst index ee66dcc938d91a0444cf4ad9f13a30f6163834a2..fd312c62592051c47b9078e2a56f9d0c7a97224a 100644 --- a/solvers/IncNavierStokesSolver/Tests/ChanStability_adj_Ar.tst +++ b/solvers/IncNavierStokesSolver/Tests/ChanStability_adj_Ar.tst @@ -9,15 +9,9 @@ <file description="Session File">ChanStability_adj_Ar.rst</file> </files> <metrics> - <metric type="L2" id="1"> - <value variable="u" tolerance="1e-12">2.58914</value> - <value variable="v" tolerance="1e-12">0.00237598</value> - <value variable="p" tolerance="1e-12">0.00236396</value> - </metric> - <metric type="Linf" id="2"> - <value variable="u" tolerance="1e-12">1</value> - <value variable="v" tolerance="1e-12">0.00200964</value> - <value variable="p" tolerance="1e-12">0.00177702</value> + <metric type="Eigenvalue" id="0"> + <value tolerance="0.001">1.00031,0.0349782</value> + <value tolerance="0.001">1.00031,-0.0349782</value> </metric> </metrics> </test> diff --git a/solvers/IncNavierStokesSolver/Tests/ChanStability_adj_Ar.xml b/solvers/IncNavierStokesSolver/Tests/ChanStability_adj_Ar.xml index e08a405ca56e40ea3db1ad105e30ed1facf75b6a..1539c89c308851d06e305502d8e9d42460e2127f 100644 --- a/solvers/IncNavierStokesSolver/Tests/ChanStability_adj_Ar.xml +++ b/solvers/IncNavierStokesSolver/Tests/ChanStability_adj_Ar.xml @@ -1,257 +1,257 @@ -<?xml version="1.0" encoding="utf-8" ?> -<NEKTAR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="http://www.nektar.info/schema/nektar.xsd"> - <GEOMETRY DIM="2" SPACE="2"> - <VERTEX> - <V ID="0">3.142e+00 1.000e+00 0.000e+00</V> - <V ID="1">2.356e+00 1.000e+00 0.000e+00</V> - <V ID="2">2.356e+00 8.000e-01 0.000e+00</V> - <V ID="3">3.142e+00 8.000e-01 0.000e+00</V> - <V ID="4">2.356e+00 5.000e-01 0.000e+00</V> - <V ID="5">3.142e+00 5.000e-01 0.000e+00</V> - <V ID="6">2.356e+00 -1.561e-12 0.000e+00</V> - <V ID="7">3.142e+00 -2.082e-12 0.000e+00</V> - <V ID="8">2.356e+00 -5.000e-01 0.000e+00</V> - <V ID="9">3.142e+00 -5.000e-01 0.000e+00</V> - <V ID="10">2.356e+00 -8.000e-01 0.000e+00</V> - <V ID="11">3.142e+00 -8.000e-01 0.000e+00</V> - <V ID="12">2.356e+00 -1.000e+00 0.000e+00</V> - <V ID="13">3.142e+00 -1.000e+00 0.000e+00</V> - <V ID="14">1.571e+00 1.000e+00 0.000e+00</V> - <V ID="15">1.571e+00 8.000e-01 0.000e+00</V> - <V ID="16">1.571e+00 5.000e-01 0.000e+00</V> - <V ID="17">1.571e+00 -1.041e-12 0.000e+00</V> - <V ID="18">1.571e+00 -5.000e-01 0.000e+00</V> - <V ID="19">1.571e+00 -8.000e-01 0.000e+00</V> - <V ID="20">1.571e+00 -1.000e+00 0.000e+00</V> - <V ID="21">7.854e-01 1.000e+00 0.000e+00</V> - <V ID="22">7.854e-01 8.000e-01 0.000e+00</V> - <V ID="23">7.854e-01 5.000e-01 0.000e+00</V> - <V ID="24">7.854e-01 -5.205e-13 0.000e+00</V> - <V ID="25">7.854e-01 -5.000e-01 0.000e+00</V> - <V ID="26">7.854e-01 -8.000e-01 0.000e+00</V> - <V ID="27">7.854e-01 -1.000e+00 0.000e+00</V> - <V ID="28">5.551e-12 1.000e+00 0.000e+00</V> - <V ID="29">3.701e-12 8.000e-01 0.000e+00</V> - <V ID="30">1.850e-12 5.000e-01 0.000e+00</V> - <V ID="31">-1.110e-16 5.551e-17 0.000e+00</V> - <V ID="32">-1.850e-12 -5.000e-01 0.000e+00</V> - <V ID="33">-3.701e-12 -8.000e-01 0.000e+00</V> - <V ID="34">-5.551e-12 -1.000e+00 0.000e+00</V> - <V ID="35">-7.854e-01 1.000e+00 0.000e+00</V> - <V ID="36">-7.854e-01 8.000e-01 0.000e+00</V> - <V ID="37">-7.854e-01 5.000e-01 0.000e+00</V> - <V ID="38">-7.854e-01 5.203e-13 0.000e+00</V> - <V ID="39">-7.854e-01 -5.000e-01 0.000e+00</V> - <V ID="40">-7.854e-01 -8.000e-01 0.000e+00</V> - <V ID="41">-7.854e-01 -1.000e+00 0.000e+00</V> - <V ID="42">-1.571e+00 1.000e+00 0.000e+00</V> - <V ID="43">-1.571e+00 8.000e-01 0.000e+00</V> - <V ID="44">-1.571e+00 5.000e-01 0.000e+00</V> - <V ID="45">-1.571e+00 1.041e-12 0.000e+00</V> - <V ID="46">-1.571e+00 -5.000e-01 0.000e+00</V> - <V ID="47">-1.571e+00 -8.000e-01 0.000e+00</V> - <V ID="48">-1.571e+00 -1.000e+00 0.000e+00</V> - <V ID="49">-2.356e+00 1.000e+00 0.000e+00</V> - <V ID="50">-2.356e+00 8.000e-01 0.000e+00</V> - <V ID="51">-2.356e+00 5.000e-01 0.000e+00</V> - <V ID="52">-2.356e+00 1.561e-12 0.000e+00</V> - <V ID="53">-2.356e+00 -5.000e-01 0.000e+00</V> - <V ID="54">-2.356e+00 -8.000e-01 0.000e+00</V> - <V ID="55">-2.356e+00 -1.000e+00 0.000e+00</V> - <V ID="56">-3.142e+00 1.000e+00 0.000e+00</V> - <V ID="57">-3.142e+00 8.000e-01 0.000e+00</V> - <V ID="58">-3.142e+00 5.000e-01 0.000e+00</V> - <V ID="59">-3.142e+00 2.082e-12 0.000e+00</V> - <V ID="60">-3.142e+00 -5.000e-01 0.000e+00</V> - <V ID="61">-3.142e+00 -8.000e-01 0.000e+00</V> - <V ID="62">-3.142e+00 -1.000e+00 0.000e+00</V> - </VERTEX> - <EDGE> - <E ID="0"> 0 1 </E> - <E ID="1"> 1 2 </E> - <E ID="2"> 2 3 </E> - <E ID="3"> 3 0 </E> - <E ID="4"> 2 4 </E> - <E ID="5"> 4 5 </E> - <E ID="6"> 5 3 </E> - <E ID="7"> 4 6 </E> - <E ID="8"> 6 7 </E> - <E ID="9"> 7 5 </E> - <E ID="10"> 6 8 </E> - <E ID="11"> 8 9 </E> - <E ID="12"> 9 7 </E> - <E ID="13"> 8 10 </E> - <E ID="14"> 10 11 </E> - <E ID="15"> 11 9 </E> - <E ID="16"> 10 12 </E> - <E ID="17"> 12 13 </E> - <E ID="18"> 13 11 </E> - <E ID="19"> 1 14 </E> - <E ID="20"> 14 15 </E> - <E ID="21"> 15 2 </E> - <E ID="22"> 15 16 </E> - <E ID="23"> 16 4 </E> - <E ID="24"> 16 17 </E> - <E ID="25"> 17 6 </E> - <E ID="26"> 17 18 </E> - <E ID="27"> 18 8 </E> - <E ID="28"> 18 19 </E> - <E ID="29"> 19 10 </E> - <E ID="30"> 19 20 </E> - <E ID="31"> 20 12 </E> - <E ID="32"> 14 21 </E> - <E ID="33"> 21 22 </E> - <E ID="34"> 22 15 </E> - <E ID="35"> 22 23 </E> - <E ID="36"> 23 16 </E> - <E ID="37"> 23 24 </E> - <E ID="38"> 24 17 </E> - <E ID="39"> 24 25 </E> - <E ID="40"> 25 18 </E> - <E ID="41"> 25 26 </E> - <E ID="42"> 26 19 </E> - <E ID="43"> 26 27 </E> - <E ID="44"> 27 20 </E> - <E ID="45"> 21 28 </E> - <E ID="46"> 28 29 </E> - <E ID="47"> 29 22 </E> - <E ID="48"> 29 30 </E> - <E ID="49"> 30 23 </E> - <E ID="50"> 30 31 </E> - <E ID="51"> 31 24 </E> - <E ID="52"> 31 32 </E> - <E ID="53"> 32 25 </E> - <E ID="54"> 32 33 </E> - <E ID="55"> 33 26 </E> - <E ID="56"> 33 34 </E> - <E ID="57"> 34 27 </E> - <E ID="58"> 28 35 </E> - <E ID="59"> 35 36 </E> - <E ID="60"> 36 29 </E> - <E ID="61"> 36 37 </E> - <E ID="62"> 37 30 </E> - <E ID="63"> 37 38 </E> - <E ID="64"> 38 31 </E> - <E ID="65"> 38 39 </E> - <E ID="66"> 39 32 </E> - <E ID="67"> 39 40 </E> - <E ID="68"> 40 33 </E> - <E ID="69"> 40 41 </E> - <E ID="70"> 41 34 </E> - <E ID="71"> 35 42 </E> - <E ID="72"> 42 43 </E> - <E ID="73"> 43 36 </E> - <E ID="74"> 43 44 </E> - <E ID="75"> 44 37 </E> - <E ID="76"> 44 45 </E> - <E ID="77"> 45 38 </E> - <E ID="78"> 45 46 </E> - <E ID="79"> 46 39 </E> - <E ID="80"> 46 47 </E> - <E ID="81"> 47 40 </E> - <E ID="82"> 47 48 </E> - <E ID="83"> 48 41 </E> - <E ID="84"> 42 49 </E> - <E ID="85"> 49 50 </E> - <E ID="86"> 50 43 </E> - <E ID="87"> 50 51 </E> - <E ID="88"> 51 44 </E> - <E ID="89"> 51 52 </E> - <E ID="90"> 52 45 </E> - <E ID="91"> 52 53 </E> - <E ID="92"> 53 46 </E> - <E ID="93"> 53 54 </E> - <E ID="94"> 54 47 </E> - <E ID="95"> 54 55 </E> - <E ID="96"> 55 48 </E> - <E ID="97"> 49 56 </E> - <E ID="98"> 57 56 </E> - <E ID="99"> 57 50 </E> - <E ID="100"> 58 57 </E> - <E ID="101"> 58 51 </E> - <E ID="102"> 59 58 </E> - <E ID="103"> 59 52 </E> - <E ID="104"> 60 59 </E> - <E ID="105"> 60 53 </E> - <E ID="106"> 61 60 </E> - <E ID="107"> 61 54 </E> - <E ID="108"> 62 61 </E> - <E ID="109"> 62 55 </E> - </EDGE> - <ELEMENT> - <Q ID="0"> 0 1 2 3 </Q> - <Q ID="1"> 2 4 5 6 </Q> - <Q ID="2"> 5 7 8 9 </Q> - <Q ID="3"> 8 10 11 12 </Q> - <Q ID="4"> 11 13 14 15 </Q> - <Q ID="5"> 14 16 17 18 </Q> - <Q ID="6"> 19 20 21 1 </Q> - <Q ID="7"> 21 22 23 4 </Q> - <Q ID="8"> 23 24 25 7 </Q> - <Q ID="9"> 25 26 27 10 </Q> - <Q ID="10"> 27 28 29 13 </Q> - <Q ID="11"> 29 30 31 16 </Q> - <Q ID="12"> 32 33 34 20 </Q> - <Q ID="13"> 34 35 36 22 </Q> - <Q ID="14"> 36 37 38 24 </Q> - <Q ID="15"> 38 39 40 26 </Q> - <Q ID="16"> 40 41 42 28 </Q> - <Q ID="17"> 42 43 44 30 </Q> - <Q ID="18"> 45 46 47 33 </Q> - <Q ID="19"> 47 48 49 35 </Q> - <Q ID="20"> 49 50 51 37 </Q> - <Q ID="21"> 51 52 53 39 </Q> - <Q ID="22"> 53 54 55 41 </Q> - <Q ID="23"> 55 56 57 43 </Q> - <Q ID="24"> 58 59 60 46 </Q> - <Q ID="25"> 60 61 62 48 </Q> - <Q ID="26"> 62 63 64 50 </Q> - <Q ID="27"> 64 65 66 52 </Q> - <Q ID="28"> 66 67 68 54 </Q> - <Q ID="29"> 68 69 70 56 </Q> - <Q ID="30"> 71 72 73 59 </Q> - <Q ID="31"> 73 74 75 61 </Q> - <Q ID="32"> 75 76 77 63 </Q> - <Q ID="33"> 77 78 79 65 </Q> - <Q ID="34"> 79 80 81 67 </Q> - <Q ID="35"> 81 82 83 69 </Q> - <Q ID="36"> 84 85 86 72 </Q> - <Q ID="37"> 86 87 88 74 </Q> - <Q ID="38"> 88 89 90 76 </Q> - <Q ID="39"> 90 91 92 78 </Q> - <Q ID="40"> 92 93 94 80 </Q> - <Q ID="41"> 94 95 96 82 </Q> - <Q ID="42"> 97 98 99 85 </Q> - <Q ID="43"> 99 100 101 87 </Q> - <Q ID="44"> 101 102 103 89 </Q> - <Q ID="45"> 103 104 105 91 </Q> - <Q ID="46"> 105 106 107 93 </Q> - <Q ID="47"> 107 108 109 95 </Q> - </ELEMENT> - <COMPOSITE> - <C ID="0"> Q[0-47] </C> - <C ID="1"> E[17,31,44,57,70,83,96,109,0,19,32,45,58,71,84,97] </C> <!-- Wall --> - <C ID="2"> E[3,6,9,12,15,18] </C> <!-- Inflow --> - <C ID="3"> E[98,100,102,104,106,108] </C> <!-- Outflow --> - </COMPOSITE> - <DOMAIN> C[0] </DOMAIN> - </GEOMETRY> - <EXPANSIONS> - <E COMPOSITE="C[0]" NUMMODES="11" FIELDS="u,v,p" TYPE="GLL_LAGRANGE" /> - </EXPANSIONS> - - <CONDITIONS> - <SOLVERINFO> - <I PROPERTY="SolverType" VALUE="VelocityCorrectionScheme" /> +<?xml version="1.0" encoding="utf-8" ?> +<NEKTAR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="http://www.nektar.info/schema/nektar.xsd"> + <GEOMETRY DIM="2" SPACE="2"> + <VERTEX> + <V ID="0">3.142e+00 1.000e+00 0.000e+00</V> + <V ID="1">2.356e+00 1.000e+00 0.000e+00</V> + <V ID="2">2.356e+00 8.000e-01 0.000e+00</V> + <V ID="3">3.142e+00 8.000e-01 0.000e+00</V> + <V ID="4">2.356e+00 5.000e-01 0.000e+00</V> + <V ID="5">3.142e+00 5.000e-01 0.000e+00</V> + <V ID="6">2.356e+00 -1.561e-12 0.000e+00</V> + <V ID="7">3.142e+00 -2.082e-12 0.000e+00</V> + <V ID="8">2.356e+00 -5.000e-01 0.000e+00</V> + <V ID="9">3.142e+00 -5.000e-01 0.000e+00</V> + <V ID="10">2.356e+00 -8.000e-01 0.000e+00</V> + <V ID="11">3.142e+00 -8.000e-01 0.000e+00</V> + <V ID="12">2.356e+00 -1.000e+00 0.000e+00</V> + <V ID="13">3.142e+00 -1.000e+00 0.000e+00</V> + <V ID="14">1.571e+00 1.000e+00 0.000e+00</V> + <V ID="15">1.571e+00 8.000e-01 0.000e+00</V> + <V ID="16">1.571e+00 5.000e-01 0.000e+00</V> + <V ID="17">1.571e+00 -1.041e-12 0.000e+00</V> + <V ID="18">1.571e+00 -5.000e-01 0.000e+00</V> + <V ID="19">1.571e+00 -8.000e-01 0.000e+00</V> + <V ID="20">1.571e+00 -1.000e+00 0.000e+00</V> + <V ID="21">7.854e-01 1.000e+00 0.000e+00</V> + <V ID="22">7.854e-01 8.000e-01 0.000e+00</V> + <V ID="23">7.854e-01 5.000e-01 0.000e+00</V> + <V ID="24">7.854e-01 -5.205e-13 0.000e+00</V> + <V ID="25">7.854e-01 -5.000e-01 0.000e+00</V> + <V ID="26">7.854e-01 -8.000e-01 0.000e+00</V> + <V ID="27">7.854e-01 -1.000e+00 0.000e+00</V> + <V ID="28">5.551e-12 1.000e+00 0.000e+00</V> + <V ID="29">3.701e-12 8.000e-01 0.000e+00</V> + <V ID="30">1.850e-12 5.000e-01 0.000e+00</V> + <V ID="31">-1.110e-16 5.551e-17 0.000e+00</V> + <V ID="32">-1.850e-12 -5.000e-01 0.000e+00</V> + <V ID="33">-3.701e-12 -8.000e-01 0.000e+00</V> + <V ID="34">-5.551e-12 -1.000e+00 0.000e+00</V> + <V ID="35">-7.854e-01 1.000e+00 0.000e+00</V> + <V ID="36">-7.854e-01 8.000e-01 0.000e+00</V> + <V ID="37">-7.854e-01 5.000e-01 0.000e+00</V> + <V ID="38">-7.854e-01 5.203e-13 0.000e+00</V> + <V ID="39">-7.854e-01 -5.000e-01 0.000e+00</V> + <V ID="40">-7.854e-01 -8.000e-01 0.000e+00</V> + <V ID="41">-7.854e-01 -1.000e+00 0.000e+00</V> + <V ID="42">-1.571e+00 1.000e+00 0.000e+00</V> + <V ID="43">-1.571e+00 8.000e-01 0.000e+00</V> + <V ID="44">-1.571e+00 5.000e-01 0.000e+00</V> + <V ID="45">-1.571e+00 1.041e-12 0.000e+00</V> + <V ID="46">-1.571e+00 -5.000e-01 0.000e+00</V> + <V ID="47">-1.571e+00 -8.000e-01 0.000e+00</V> + <V ID="48">-1.571e+00 -1.000e+00 0.000e+00</V> + <V ID="49">-2.356e+00 1.000e+00 0.000e+00</V> + <V ID="50">-2.356e+00 8.000e-01 0.000e+00</V> + <V ID="51">-2.356e+00 5.000e-01 0.000e+00</V> + <V ID="52">-2.356e+00 1.561e-12 0.000e+00</V> + <V ID="53">-2.356e+00 -5.000e-01 0.000e+00</V> + <V ID="54">-2.356e+00 -8.000e-01 0.000e+00</V> + <V ID="55">-2.356e+00 -1.000e+00 0.000e+00</V> + <V ID="56">-3.142e+00 1.000e+00 0.000e+00</V> + <V ID="57">-3.142e+00 8.000e-01 0.000e+00</V> + <V ID="58">-3.142e+00 5.000e-01 0.000e+00</V> + <V ID="59">-3.142e+00 2.082e-12 0.000e+00</V> + <V ID="60">-3.142e+00 -5.000e-01 0.000e+00</V> + <V ID="61">-3.142e+00 -8.000e-01 0.000e+00</V> + <V ID="62">-3.142e+00 -1.000e+00 0.000e+00</V> + </VERTEX> + <EDGE> + <E ID="0"> 0 1 </E> + <E ID="1"> 1 2 </E> + <E ID="2"> 2 3 </E> + <E ID="3"> 3 0 </E> + <E ID="4"> 2 4 </E> + <E ID="5"> 4 5 </E> + <E ID="6"> 5 3 </E> + <E ID="7"> 4 6 </E> + <E ID="8"> 6 7 </E> + <E ID="9"> 7 5 </E> + <E ID="10"> 6 8 </E> + <E ID="11"> 8 9 </E> + <E ID="12"> 9 7 </E> + <E ID="13"> 8 10 </E> + <E ID="14"> 10 11 </E> + <E ID="15"> 11 9 </E> + <E ID="16"> 10 12 </E> + <E ID="17"> 12 13 </E> + <E ID="18"> 13 11 </E> + <E ID="19"> 1 14 </E> + <E ID="20"> 14 15 </E> + <E ID="21"> 15 2 </E> + <E ID="22"> 15 16 </E> + <E ID="23"> 16 4 </E> + <E ID="24"> 16 17 </E> + <E ID="25"> 17 6 </E> + <E ID="26"> 17 18 </E> + <E ID="27"> 18 8 </E> + <E ID="28"> 18 19 </E> + <E ID="29"> 19 10 </E> + <E ID="30"> 19 20 </E> + <E ID="31"> 20 12 </E> + <E ID="32"> 14 21 </E> + <E ID="33"> 21 22 </E> + <E ID="34"> 22 15 </E> + <E ID="35"> 22 23 </E> + <E ID="36"> 23 16 </E> + <E ID="37"> 23 24 </E> + <E ID="38"> 24 17 </E> + <E ID="39"> 24 25 </E> + <E ID="40"> 25 18 </E> + <E ID="41"> 25 26 </E> + <E ID="42"> 26 19 </E> + <E ID="43"> 26 27 </E> + <E ID="44"> 27 20 </E> + <E ID="45"> 21 28 </E> + <E ID="46"> 28 29 </E> + <E ID="47"> 29 22 </E> + <E ID="48"> 29 30 </E> + <E ID="49"> 30 23 </E> + <E ID="50"> 30 31 </E> + <E ID="51"> 31 24 </E> + <E ID="52"> 31 32 </E> + <E ID="53"> 32 25 </E> + <E ID="54"> 32 33 </E> + <E ID="55"> 33 26 </E> + <E ID="56"> 33 34 </E> + <E ID="57"> 34 27 </E> + <E ID="58"> 28 35 </E> + <E ID="59"> 35 36 </E> + <E ID="60"> 36 29 </E> + <E ID="61"> 36 37 </E> + <E ID="62"> 37 30 </E> + <E ID="63"> 37 38 </E> + <E ID="64"> 38 31 </E> + <E ID="65"> 38 39 </E> + <E ID="66"> 39 32 </E> + <E ID="67"> 39 40 </E> + <E ID="68"> 40 33 </E> + <E ID="69"> 40 41 </E> + <E ID="70"> 41 34 </E> + <E ID="71"> 35 42 </E> + <E ID="72"> 42 43 </E> + <E ID="73"> 43 36 </E> + <E ID="74"> 43 44 </E> + <E ID="75"> 44 37 </E> + <E ID="76"> 44 45 </E> + <E ID="77"> 45 38 </E> + <E ID="78"> 45 46 </E> + <E ID="79"> 46 39 </E> + <E ID="80"> 46 47 </E> + <E ID="81"> 47 40 </E> + <E ID="82"> 47 48 </E> + <E ID="83"> 48 41 </E> + <E ID="84"> 42 49 </E> + <E ID="85"> 49 50 </E> + <E ID="86"> 50 43 </E> + <E ID="87"> 50 51 </E> + <E ID="88"> 51 44 </E> + <E ID="89"> 51 52 </E> + <E ID="90"> 52 45 </E> + <E ID="91"> 52 53 </E> + <E ID="92"> 53 46 </E> + <E ID="93"> 53 54 </E> + <E ID="94"> 54 47 </E> + <E ID="95"> 54 55 </E> + <E ID="96"> 55 48 </E> + <E ID="97"> 49 56 </E> + <E ID="98"> 57 56 </E> + <E ID="99"> 57 50 </E> + <E ID="100"> 58 57 </E> + <E ID="101"> 58 51 </E> + <E ID="102"> 59 58 </E> + <E ID="103"> 59 52 </E> + <E ID="104"> 60 59 </E> + <E ID="105"> 60 53 </E> + <E ID="106"> 61 60 </E> + <E ID="107"> 61 54 </E> + <E ID="108"> 62 61 </E> + <E ID="109"> 62 55 </E> + </EDGE> + <ELEMENT> + <Q ID="0"> 0 1 2 3 </Q> + <Q ID="1"> 2 4 5 6 </Q> + <Q ID="2"> 5 7 8 9 </Q> + <Q ID="3"> 8 10 11 12 </Q> + <Q ID="4"> 11 13 14 15 </Q> + <Q ID="5"> 14 16 17 18 </Q> + <Q ID="6"> 19 20 21 1 </Q> + <Q ID="7"> 21 22 23 4 </Q> + <Q ID="8"> 23 24 25 7 </Q> + <Q ID="9"> 25 26 27 10 </Q> + <Q ID="10"> 27 28 29 13 </Q> + <Q ID="11"> 29 30 31 16 </Q> + <Q ID="12"> 32 33 34 20 </Q> + <Q ID="13"> 34 35 36 22 </Q> + <Q ID="14"> 36 37 38 24 </Q> + <Q ID="15"> 38 39 40 26 </Q> + <Q ID="16"> 40 41 42 28 </Q> + <Q ID="17"> 42 43 44 30 </Q> + <Q ID="18"> 45 46 47 33 </Q> + <Q ID="19"> 47 48 49 35 </Q> + <Q ID="20"> 49 50 51 37 </Q> + <Q ID="21"> 51 52 53 39 </Q> + <Q ID="22"> 53 54 55 41 </Q> + <Q ID="23"> 55 56 57 43 </Q> + <Q ID="24"> 58 59 60 46 </Q> + <Q ID="25"> 60 61 62 48 </Q> + <Q ID="26"> 62 63 64 50 </Q> + <Q ID="27"> 64 65 66 52 </Q> + <Q ID="28"> 66 67 68 54 </Q> + <Q ID="29"> 68 69 70 56 </Q> + <Q ID="30"> 71 72 73 59 </Q> + <Q ID="31"> 73 74 75 61 </Q> + <Q ID="32"> 75 76 77 63 </Q> + <Q ID="33"> 77 78 79 65 </Q> + <Q ID="34"> 79 80 81 67 </Q> + <Q ID="35"> 81 82 83 69 </Q> + <Q ID="36"> 84 85 86 72 </Q> + <Q ID="37"> 86 87 88 74 </Q> + <Q ID="38"> 88 89 90 76 </Q> + <Q ID="39"> 90 91 92 78 </Q> + <Q ID="40"> 92 93 94 80 </Q> + <Q ID="41"> 94 95 96 82 </Q> + <Q ID="42"> 97 98 99 85 </Q> + <Q ID="43"> 99 100 101 87 </Q> + <Q ID="44"> 101 102 103 89 </Q> + <Q ID="45"> 103 104 105 91 </Q> + <Q ID="46"> 105 106 107 93 </Q> + <Q ID="47"> 107 108 109 95 </Q> + </ELEMENT> + <COMPOSITE> + <C ID="0"> Q[0-47] </C> + <C ID="1"> E[17,31,44,57,70,83,96,109,0,19,32,45,58,71,84,97] </C> <!-- Wall --> + <C ID="2"> E[3,6,9,12,15,18] </C> <!-- Inflow --> + <C ID="3"> E[98,100,102,104,106,108] </C> <!-- Outflow --> + </COMPOSITE> + <DOMAIN> C[0] </DOMAIN> + </GEOMETRY> + <EXPANSIONS> + <E COMPOSITE="C[0]" NUMMODES="11" FIELDS="u,v,p" TYPE="GLL_LAGRANGE" /> + </EXPANSIONS> + + <CONDITIONS> + <SOLVERINFO> + <I PROPERTY="SolverType" VALUE="VelocityCorrectionScheme" /> <I PROPERTY="EQTYPE" VALUE="UnsteadyNavierStokes" /> - <I PROPERTY="EvolutionOperator" VALUE="Adjoint" /> - <I PROPERTY="Projection" VALUE="Galerkin" /> + <I PROPERTY="EvolutionOperator" VALUE="Adjoint" /> + <I PROPERTY="Projection" VALUE="Galerkin" /> <I PROPERTY="TimeIntegrationMethod" VALUE="IMEXOrder3" /> <I PROPERTY="Driver" VALUE="Arpack" /> - <I PROPERTY="ArpackProblemType" VALUE="LargestMag" /> - </SOLVERINFO> - + <I PROPERTY="ArpackProblemType" VALUE="LargestMag" /> + </SOLVERINFO> + <PARAMETERS> <P> TimeStep = 0.002 </P> <P> NumSteps = 70 </P> @@ -263,41 +263,41 @@ <P> nvec =2 </P> <P> evtol =1e-6 </P> - </PARAMETERS> - - <VARIABLES> - <V ID="0"> u </V> - <V ID="1"> v </V> - <V ID="2"> p </V> - </VARIABLES> - - <BOUNDARYREGIONS> - <B ID="0"> C[1] </B> - <B ID="1"> C[2] </B> - <B ID="2"> C[3] </B> - </BOUNDARYREGIONS> - - <BOUNDARYCONDITIONS> - <REGION REF="0"> - <D VAR="u" VALUE="0" /> - <D VAR="v" VALUE="0" /> - <N VAR="p" USERDEFINEDTYPE="H" VALUE="0" /> - </REGION> - <REGION REF="1"> - <P VAR="u" VALUE="[2]" /> - <P VAR="v" VALUE="[2]" /> - <P VAR="p" VALUE="[2]" /> - </REGION> - <REGION REF="2"> - <P VAR="u" VALUE="[1]" /> - <P VAR="v" VALUE="[1]" /> - <P VAR="p" VALUE="[1]" /> - </REGION> - </BOUNDARYCONDITIONS> - <FUNCTION NAME="Forcing"> - <E VAR="u" VALUE="0" /> - <E VAR="v" VALUE="0" /> - <E VAR="p" VALUE="0" /> + </PARAMETERS> + + <VARIABLES> + <V ID="0"> u </V> + <V ID="1"> v </V> + <V ID="2"> p </V> + </VARIABLES> + + <BOUNDARYREGIONS> + <B ID="0"> C[1] </B> + <B ID="1"> C[2] </B> + <B ID="2"> C[3] </B> + </BOUNDARYREGIONS> + + <BOUNDARYCONDITIONS> + <REGION REF="0"> + <D VAR="u" VALUE="0" /> + <D VAR="v" VALUE="0" /> + <N VAR="p" USERDEFINEDTYPE="H" VALUE="0" /> + </REGION> + <REGION REF="1"> + <P VAR="u" VALUE="[2]" /> + <P VAR="v" VALUE="[2]" /> + <P VAR="p" VALUE="[2]" /> + </REGION> + <REGION REF="2"> + <P VAR="u" VALUE="[1]" /> + <P VAR="v" VALUE="[1]" /> + <P VAR="p" VALUE="[1]" /> + </REGION> + </BOUNDARYCONDITIONS> + <FUNCTION NAME="Forcing"> + <E VAR="u" VALUE="0" /> + <E VAR="v" VALUE="0" /> + <E VAR="p" VALUE="0" /> </FUNCTION> <FUNCTION NAME="InitialConditions"> @@ -306,13 +306,13 @@ <FUNCTION NAME="BaseFlow"> <F VAR="u,v,p" FILE="ChanStability_adj_Ar.bse" /> - </FUNCTION> - <FUNCTION NAME="ExactSolution"> - <E VAR="u" VALUE="-y*y+1" /> - <E VAR="v" VALUE="0" /> - <E VAR="p" VALUE="-2*Kinvis*(x-1)" /> - </FUNCTION> - - </CONDITIONS> - -</NEKTAR> + </FUNCTION> + <FUNCTION NAME="ExactSolution"> + <E VAR="u" VALUE="-y*y+1" /> + <E VAR="v" VALUE="0" /> + <E VAR="p" VALUE="-2*Kinvis*(x-1)" /> + </FUNCTION> + + </CONDITIONS> + +</NEKTAR> diff --git a/solvers/IncNavierStokesSolver/Tests/PPF_R10000.xml b/solvers/IncNavierStokesSolver/Tests/PPF_R10000.xml new file mode 100644 index 0000000000000000000000000000000000000000..94227a3db6a80b2b036abea3c60db495afdeea37 --- /dev/null +++ b/solvers/IncNavierStokesSolver/Tests/PPF_R10000.xml @@ -0,0 +1,245 @@ +<?xml version="1.0" encoding="utf-8" ?> +<NEKTAR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="http://www.nektar.info/schema/nektar.xsd"> + + <GEOMETRY DIM="2" SPACE="2"> + <VERTEX XSCALE="2*PI"> + <V ID="0"> 0 -1 0.0 </V> + <V ID="1"> 0.25 -1 0.0 </V> + <V ID="2"> 0.5 -1 0.0 </V> + <V ID="3"> 0.75 -1 0.0 </V> + <V ID="4"> 1 -1 0.0 </V> + <V ID="5"> 0 -0.95 0.0 </V> + <V ID="6"> 0.25 -0.95 0.0 </V> + <V ID="7"> 0.5 -0.95 0.0 </V> + <V ID="8"> 0.75 -0.95 0.0 </V> + <V ID="9"> 1 -0.95 0.0 </V> + <V ID="10"> 0 -0.9 0.0 </V> + <V ID="11"> 0.25 -0.9 0.0 </V> + <V ID="12"> 0.5 -0.9 0.0 </V> + <V ID="13"> 0.75 -0.9 0.0 </V> + <V ID="14"> 1 -0.9 0.0 </V> + <V ID="15"> 0 -0.5 0.0 </V> + <V ID="16"> 0.25 -0.5 0.0 </V> + <V ID="17"> 0.5 -0.5 0.0 </V> + <V ID="18"> 0.75 -0.5 0.0 </V> + <V ID="19"> 1 -0.5 0.0 </V> + <V ID="20"> 0 0 0.0 </V> + <V ID="21"> 0.25 0 0.0 </V> + <V ID="22"> 0.5 0 0.0 </V> + <V ID="23"> 0.75 0 0.0 </V> + <V ID="24"> 1 0 0.0 </V> + <V ID="25"> 0 0.5 0.0 </V> + <V ID="26"> 0.25 0.5 0.0 </V> + <V ID="27"> 0.5 0.5 0.0 </V> + <V ID="28"> 0.75 0.5 0.0 </V> + <V ID="29"> 1 0.5 0.0 </V> + <V ID="30"> 0 0.9 0.0 </V> + <V ID="31"> 0.25 0.9 0.0 </V> + <V ID="32"> 0.5 0.9 0.0 </V> + <V ID="33"> 0.75 0.9 0.0 </V> + <V ID="34"> 1 0.9 0.0 </V> + <V ID="35"> 0 0.95 0.0 </V> + <V ID="36"> 0.25 0.95 0.0 </V> + <V ID="37"> 0.5 0.95 0.0 </V> + <V ID="38"> 0.75 0.95 0.0 </V> + <V ID="39"> 1 0.95 0.0 </V> + <V ID="40"> 0 1 0.0 </V> + <V ID="41"> 0.25 1 0.0 </V> + <V ID="42"> 0.5 1 0.0 </V> + <V ID="43"> 0.75 1 0.0 </V> + <V ID="44"> 1 1 0.0 </V> + </VERTEX> + + <EDGE> + <E ID="0"> 0 1 </E> + <E ID="1"> 1 2 </E> + <E ID="2"> 2 3 </E> + <E ID="3"> 3 4 </E> + <E ID="4"> 0 5 </E> + <E ID="5"> 1 6 </E> + <E ID="6"> 2 7 </E> + <E ID="7"> 3 8 </E> + <E ID="8"> 4 9 </E> + <E ID="9"> 5 6 </E> + <E ID="10"> 6 7 </E> + <E ID="11"> 7 8 </E> + <E ID="12"> 8 9 </E> + <E ID="13"> 5 10 </E> + <E ID="14"> 6 11 </E> + <E ID="15"> 7 12 </E> + <E ID="16"> 8 13 </E> + <E ID="17"> 9 14 </E> + <E ID="18"> 10 11 </E> + <E ID="19"> 11 12 </E> + <E ID="20"> 12 13 </E> + <E ID="21"> 13 14 </E> + <E ID="22"> 10 15 </E> + <E ID="23"> 11 16 </E> + <E ID="24"> 12 17 </E> + <E ID="25"> 13 18 </E> + <E ID="26"> 14 19 </E> + <E ID="27"> 15 16 </E> + <E ID="28"> 16 17 </E> + <E ID="29"> 17 18 </E> + <E ID="30"> 18 19 </E> + <E ID="31"> 15 20 </E> + <E ID="32"> 16 21 </E> + <E ID="33"> 17 22 </E> + <E ID="34"> 18 23 </E> + <E ID="35"> 19 24 </E> + <E ID="36"> 20 21 </E> + <E ID="37"> 21 22 </E> + <E ID="38"> 22 23 </E> + <E ID="39"> 23 24 </E> + <E ID="40"> 20 25 </E> + <E ID="41"> 21 26 </E> + <E ID="42"> 22 27 </E> + <E ID="43"> 23 28 </E> + <E ID="44"> 24 29 </E> + <E ID="45"> 25 26 </E> + <E ID="46"> 26 27 </E> + <E ID="47"> 27 28 </E> + <E ID="48"> 28 29 </E> + <E ID="49"> 25 30 </E> + <E ID="50"> 26 31 </E> + <E ID="51"> 27 32 </E> + <E ID="52"> 28 33 </E> + <E ID="53"> 29 34 </E> + <E ID="54"> 30 31 </E> + <E ID="55"> 31 32 </E> + <E ID="56"> 32 33 </E> + <E ID="57"> 33 34 </E> + <E ID="58"> 30 35 </E> + <E ID="59"> 31 36 </E> + <E ID="60"> 32 37 </E> + <E ID="61"> 33 38 </E> + <E ID="62"> 34 39 </E> + <E ID="63"> 35 36 </E> + <E ID="64"> 36 37 </E> + <E ID="65"> 37 38 </E> + <E ID="66"> 38 39 </E> + <E ID="67"> 35 40 </E> + <E ID="68"> 36 41 </E> + <E ID="69"> 37 42 </E> + <E ID="70"> 38 43 </E> + <E ID="71"> 39 44 </E> + <E ID="72"> 40 41 </E> + <E ID="73"> 41 42 </E> + <E ID="74"> 42 43 </E> + <E ID="75"> 43 44 </E> + </EDGE> + + <ELEMENT> + <Q ID="0"> 0 5 9 4 </Q> + <Q ID="1"> 1 6 10 5 </Q> + <Q ID="2"> 2 7 11 6 </Q> + <Q ID="3"> 3 8 12 7 </Q> + <Q ID="4"> 9 14 18 13 </Q> + <Q ID="5"> 10 15 19 14 </Q> + <Q ID="6"> 11 16 20 15 </Q> + <Q ID="7"> 12 17 21 16 </Q> + <Q ID="8"> 18 23 27 22 </Q> + <Q ID="9"> 19 24 28 23 </Q> + <Q ID="10"> 20 25 29 24 </Q> + <Q ID="11"> 21 26 30 25 </Q> + <Q ID="12"> 27 32 36 31 </Q> + <Q ID="13"> 28 33 37 32 </Q> + <Q ID="14"> 29 34 38 33 </Q> + <Q ID="15"> 30 35 39 34 </Q> + <Q ID="16"> 36 41 45 40 </Q> + <Q ID="17"> 37 42 46 41 </Q> + <Q ID="18"> 38 43 47 42 </Q> + <Q ID="19"> 39 44 48 43 </Q> + <Q ID="20"> 45 50 54 49 </Q> + <Q ID="21"> 46 51 55 50 </Q> + <Q ID="22"> 47 52 56 51 </Q> + <Q ID="23"> 48 53 57 52 </Q> + <Q ID="24"> 54 59 63 58 </Q> + <Q ID="25"> 55 60 64 59 </Q> + <Q ID="26"> 56 61 65 60 </Q> + <Q ID="27"> 57 62 66 61 </Q> + <Q ID="28"> 63 68 72 67 </Q> + <Q ID="29"> 64 69 73 68 </Q> + <Q ID="30"> 65 70 74 69 </Q> + <Q ID="31"> 66 71 75 70 </Q> + </ELEMENT> + + <COMPOSITE> + <C ID="0"> Q[0-31] </C> + <C ID="1"> E[0,1,2,3] </C> // south border + <C ID="2"> E[4,13,22,31,40,49,58,67] </C> // west border + <C ID="3"> E[72,73,74,75] </C> // north border + <C ID="4"> E[8,17,26,35,44,53,62,71] </C> // East border + </COMPOSITE> + <DOMAIN> C[0] </DOMAIN> + </GEOMETRY> + + <EXPANSIONS> + <E COMPOSITE="C[0]" NUMMODES="11" FIELDS="u,v" TYPE="MODIFIED" /> + </EXPANSIONS> + + <CONDITIONS> + <SOLVERINFO> + <I PROPERTY="SolverType" VALUE="CoupledLinearisedNS" /> + <I PROPERTY="EQTYPE" VALUE="SteadyLinearisedNS" /> + <I PROPERTY="EvolutionOperator" VALUE="Direct" /> + <I PROPERTY="Projection" VALUE="Galerkin" /> + <I PROPERTY="Driver" VALUE="Arpack" /> + <I PROPERTY="ArpackProblemType" VALUE="LargestMag" /> + </SOLVERINFO> + + <PARAMETERS> + <P> IO_CheckSteps = 1000 </P> + <P> IO_InfoSteps = 20 </P> + <P> Re = 10000 </P> + <P> Kinvis = 1.0/Re </P> + <P> kdim = 256 </P> + <P> realShift = 0.003 </P> + <P> evtol = 1e-6 </P> + <P> nvec = 100 </P> + </PARAMETERS> + + <VARIABLES> + <V ID="0"> u </V> + <V ID="1"> v </V> + </VARIABLES> + + <BOUNDARYREGIONS> + <B ID="0"> C[1] </B> + <B ID="1"> C[2] </B> + <B ID="2"> C[3] </B> + <B ID="3"> C[4] </B> + </BOUNDARYREGIONS> + + <BOUNDARYCONDITIONS> + <REGION REF="0"> + <D VAR="u" VALUE="0" /> + <D VAR="v" VALUE="0" /> + </REGION> + <REGION REF="1"> + <P VAR="u" VALUE="[3]" /> + <P VAR="v" VALUE="[3]" /> + </REGION> + <REGION REF="2"> + <D VAR="u" VALUE="0" /> + <D VAR="v" VALUE="0" /> + </REGION> + <REGION REF="3"> + <P VAR="u" VALUE="[1]" /> + <P VAR="v" VALUE="[1]" /> + </REGION> + </BOUNDARYCONDITIONS> + + <FUNCTION NAME="AdvectionVelocity"> + <E VAR="u" VALUE="1-y*y" /> + <E VAR="v" VALUE="0" /> + </FUNCTION> + </CONDITIONS> + + <FORCING> + <FORCE TYPE="StabilityCoupledLNS"> + </FORCE> + </FORCING> + +</NEKTAR> diff --git a/solvers/IncNavierStokesSolver/Tests/PPF_R10000_3D.xml b/solvers/IncNavierStokesSolver/Tests/PPF_R10000_3D.xml new file mode 100644 index 0000000000000000000000000000000000000000..4d93bf9a48d1918441f6866c21fafdf8587cc810 --- /dev/null +++ b/solvers/IncNavierStokesSolver/Tests/PPF_R10000_3D.xml @@ -0,0 +1,256 @@ +<?xml version="1.0" encoding="utf-8" ?> +<NEKTAR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="http://www.nektar.info/schema/nektar.xsd"> + + <GEOMETRY DIM="2" SPACE="2"> + <VERTEX XSCALE="2.0*PI"> + <V ID="0"> 0 -1 0.0 </V> + <V ID="1"> 0.25 -1 0.0 </V> + <V ID="2"> 0.5 -1 0.0 </V> + <V ID="3"> 0.75 -1 0.0 </V> + <V ID="4"> 1 -1 0.0 </V> + <V ID="5"> 0 -0.95 0.0 </V> + <V ID="6"> 0.25 -0.95 0.0 </V> + <V ID="7"> 0.5 -0.95 0.0 </V> + <V ID="8"> 0.75 -0.95 0.0 </V> + <V ID="9"> 1 -0.95 0.0 </V> + <V ID="10"> 0 -0.9 0.0 </V> + <V ID="11"> 0.25 -0.9 0.0 </V> + <V ID="12"> 0.5 -0.9 0.0 </V> + <V ID="13"> 0.75 -0.9 0.0 </V> + <V ID="14"> 1 -0.9 0.0 </V> + <V ID="15"> 0 -0.5 0.0 </V> + <V ID="16"> 0.25 -0.5 0.0 </V> + <V ID="17"> 0.5 -0.5 0.0 </V> + <V ID="18"> 0.75 -0.5 0.0 </V> + <V ID="19"> 1 -0.5 0.0 </V> + <V ID="20"> 0 0 0.0 </V> + <V ID="21"> 0.25 0 0.0 </V> + <V ID="22"> 0.5 0 0.0 </V> + <V ID="23"> 0.75 0 0.0 </V> + <V ID="24"> 1 0 0.0 </V> + <V ID="25"> 0 0.5 0.0 </V> + <V ID="26"> 0.25 0.5 0.0 </V> + <V ID="27"> 0.5 0.5 0.0 </V> + <V ID="28"> 0.75 0.5 0.0 </V> + <V ID="29"> 1 0.5 0.0 </V> + <V ID="30"> 0 0.9 0.0 </V> + <V ID="31"> 0.25 0.9 0.0 </V> + <V ID="32"> 0.5 0.9 0.0 </V> + <V ID="33"> 0.75 0.9 0.0 </V> + <V ID="34"> 1 0.9 0.0 </V> + <V ID="35"> 0 0.95 0.0 </V> + <V ID="36"> 0.25 0.95 0.0 </V> + <V ID="37"> 0.5 0.95 0.0 </V> + <V ID="38"> 0.75 0.95 0.0 </V> + <V ID="39"> 1 0.95 0.0 </V> + <V ID="40"> 0 1 0.0 </V> + <V ID="41"> 0.25 1 0.0 </V> + <V ID="42"> 0.5 1 0.0 </V> + <V ID="43"> 0.75 1 0.0 </V> + <V ID="44"> 1 1 0.0 </V> + </VERTEX> + + <EDGE> + <E ID="0"> 0 1 </E> + <E ID="1"> 1 2 </E> + <E ID="2"> 2 3 </E> + <E ID="3"> 3 4 </E> + <E ID="4"> 0 5 </E> + <E ID="5"> 1 6 </E> + <E ID="6"> 2 7 </E> + <E ID="7"> 3 8 </E> + <E ID="8"> 4 9 </E> + <E ID="9"> 5 6 </E> + <E ID="10"> 6 7 </E> + <E ID="11"> 7 8 </E> + <E ID="12"> 8 9 </E> + <E ID="13"> 5 10 </E> + <E ID="14"> 6 11 </E> + <E ID="15"> 7 12 </E> + <E ID="16"> 8 13 </E> + <E ID="17"> 9 14 </E> + <E ID="18"> 10 11 </E> + <E ID="19"> 11 12 </E> + <E ID="20"> 12 13 </E> + <E ID="21"> 13 14 </E> + <E ID="22"> 10 15 </E> + <E ID="23"> 11 16 </E> + <E ID="24"> 12 17 </E> + <E ID="25"> 13 18 </E> + <E ID="26"> 14 19 </E> + <E ID="27"> 15 16 </E> + <E ID="28"> 16 17 </E> + <E ID="29"> 17 18 </E> + <E ID="30"> 18 19 </E> + <E ID="31"> 15 20 </E> + <E ID="32"> 16 21 </E> + <E ID="33"> 17 22 </E> + <E ID="34"> 18 23 </E> + <E ID="35"> 19 24 </E> + <E ID="36"> 20 21 </E> + <E ID="37"> 21 22 </E> + <E ID="38"> 22 23 </E> + <E ID="39"> 23 24 </E> + <E ID="40"> 20 25 </E> + <E ID="41"> 21 26 </E> + <E ID="42"> 22 27 </E> + <E ID="43"> 23 28 </E> + <E ID="44"> 24 29 </E> + <E ID="45"> 25 26 </E> + <E ID="46"> 26 27 </E> + <E ID="47"> 27 28 </E> + <E ID="48"> 28 29 </E> + <E ID="49"> 25 30 </E> + <E ID="50"> 26 31 </E> + <E ID="51"> 27 32 </E> + <E ID="52"> 28 33 </E> + <E ID="53"> 29 34 </E> + <E ID="54"> 30 31 </E> + <E ID="55"> 31 32 </E> + <E ID="56"> 32 33 </E> + <E ID="57"> 33 34 </E> + <E ID="58"> 30 35 </E> + <E ID="59"> 31 36 </E> + <E ID="60"> 32 37 </E> + <E ID="61"> 33 38 </E> + <E ID="62"> 34 39 </E> + <E ID="63"> 35 36 </E> + <E ID="64"> 36 37 </E> + <E ID="65"> 37 38 </E> + <E ID="66"> 38 39 </E> + <E ID="67"> 35 40 </E> + <E ID="68"> 36 41 </E> + <E ID="69"> 37 42 </E> + <E ID="70"> 38 43 </E> + <E ID="71"> 39 44 </E> + <E ID="72"> 40 41 </E> + <E ID="73"> 41 42 </E> + <E ID="74"> 42 43 </E> + <E ID="75"> 43 44 </E> + </EDGE> + + <ELEMENT> + <Q ID="0"> 0 5 9 4 </Q> + <Q ID="1"> 1 6 10 5 </Q> + <Q ID="2"> 2 7 11 6 </Q> + <Q ID="3"> 3 8 12 7 </Q> + <Q ID="4"> 9 14 18 13 </Q> + <Q ID="5"> 10 15 19 14 </Q> + <Q ID="6"> 11 16 20 15 </Q> + <Q ID="7"> 12 17 21 16 </Q> + <Q ID="8"> 18 23 27 22 </Q> + <Q ID="9"> 19 24 28 23 </Q> + <Q ID="10"> 20 25 29 24 </Q> + <Q ID="11"> 21 26 30 25 </Q> + <Q ID="12"> 27 32 36 31 </Q> + <Q ID="13"> 28 33 37 32 </Q> + <Q ID="14"> 29 34 38 33 </Q> + <Q ID="15"> 30 35 39 34 </Q> + <Q ID="16"> 36 41 45 40 </Q> + <Q ID="17"> 37 42 46 41 </Q> + <Q ID="18"> 38 43 47 42 </Q> + <Q ID="19"> 39 44 48 43 </Q> + <Q ID="20"> 45 50 54 49 </Q> + <Q ID="21"> 46 51 55 50 </Q> + <Q ID="22"> 47 52 56 51 </Q> + <Q ID="23"> 48 53 57 52 </Q> + <Q ID="24"> 54 59 63 58 </Q> + <Q ID="25"> 55 60 64 59 </Q> + <Q ID="26"> 56 61 65 60 </Q> + <Q ID="27"> 57 62 66 61 </Q> + <Q ID="28"> 63 68 72 67 </Q> + <Q ID="29"> 64 69 73 68 </Q> + <Q ID="30"> 65 70 74 69 </Q> + <Q ID="31"> 66 71 75 70 </Q> + </ELEMENT> + + <COMPOSITE> + <C ID="0"> Q[0-31] </C> + <C ID="1"> E[0,1,2,3] </C> // south border + <C ID="2"> E[4,13,22,31,40,49,58,67] </C> // west border + <C ID="3"> E[72,73,74,75] </C> // north border + <C ID="4"> E[8,17,26,35,44,53,62,71] </C> // East border + </COMPOSITE> + <DOMAIN> C[0] </DOMAIN> + </GEOMETRY> + + <EXPANSIONS> + <E COMPOSITE="C[0]" NUMMODES="11" FIELDS="u,v,w" TYPE="MODIFIED" /> + </EXPANSIONS> + + <CONDITIONS> + <SOLVERINFO> + <I PROPERTY="SolverType" VALUE="CoupledLinearisedNS" /> + <I PROPERTY="EQTYPE" VALUE="SteadyLinearisedNS" /> + <I PROPERTY="EvolutionOperator" VALUE="Direct" /> + <I PROPERTY="HOMOGENEOUS" VALUE="1D"/> + <I PROPERTY="ModeType" VALUE="SingleMode"/> + <I PROPERTY="Projection" VALUE="Galerkin" /> + <I PROPERTY="Driver" VALUE="ModifiedArnoldi" /> + <I PROPERTY="BetaZero" VALUE="True" /> + </SOLVERINFO> + + <PARAMETERS> + <P> IO_CheckSteps = 1000 </P> + <P> IO_InfoSteps = 20 </P> + <P> Re = 10000 </P> + <P> Kinvis = 1.0/Re </P> + <P> kdim = 64 </P> + <P> realShift = 0.003 </P> + <P> imagShift = 0.2 </P> + <P> HomModesZ = 2 </P> + <P> evtol = 1e-6 </P> + <P> nvec = 2 </P> + <P> LZ = 1 </P> + </PARAMETERS> + + <VARIABLES> + <V ID="0"> u </V> + <V ID="1"> v </V> + <V ID="2"> w </V> + </VARIABLES> + + <BOUNDARYREGIONS> + <B ID="0"> C[1] </B> + <B ID="1"> C[2] </B> + <B ID="2"> C[3] </B> + <B ID="3"> C[4] </B> + </BOUNDARYREGIONS> + + <BOUNDARYCONDITIONS> + <REGION REF="0"> + <D VAR="u" VALUE="0" /> + <D VAR="v" VALUE="0" /> + <D VAR="w" VALUE="0" /> + </REGION> + <REGION REF="1"> + <P VAR="u" VALUE="[3]" /> + <P VAR="v" VALUE="[3]" /> + <P VAR="w" VALUE="[3]" /> + </REGION> + <REGION REF="2"> + <D VAR="u" VALUE="0" /> + <D VAR="v" VALUE="0" /> + <D VAR="w" VALUE="0" /> + </REGION> + <REGION REF="3"> + <P VAR="u" VALUE="[1]" /> + <P VAR="v" VALUE="[1]" /> + <P VAR="w" VALUE="[1]" /> + </REGION> + </BOUNDARYCONDITIONS> + + <FUNCTION NAME="AdvectionVelocity"> + <E VAR="u" VALUE="1-y*y" /> + <E VAR="v" VALUE="0" /> + <E VAR="w" VALUE="0" /> + </FUNCTION> + </CONDITIONS> + + <FORCING> + <FORCE TYPE="StabilityCoupledLNS"> + </FORCE> + </FORCING> + +</NEKTAR> diff --git a/solvers/IncNavierStokesSolver/Tests/PPF_R10000_Arpack_LM.tst b/solvers/IncNavierStokesSolver/Tests/PPF_R10000_Arpack_LM.tst new file mode 100644 index 0000000000000000000000000000000000000000..ce6b2202bb91a4697625b107eae15a8e743c375c --- /dev/null +++ b/solvers/IncNavierStokesSolver/Tests/PPF_R10000_Arpack_LM.tst @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> +<test> + <description>Linear stability with coupled solver (LM with Arpack): ChannelMax Ev = (0.0037303,+/-0.237523i) </description> + <executable>IncNavierStokesSolver</executable> + <parameters>PPF_R10000.xml</parameters> + <files> + <file description="Session File">PPF_R10000.xml</file> + </files> + <metrics> + <metric type="Eigenvalue" id="0"> + <value index="0" tolerance="0.001">-0.00024674,0</value> + <value index="1" tolerance="0.001">-0.00098696,0</value> + </metric> + </metrics> +</test> + + diff --git a/solvers/IncNavierStokesSolver/Tests/PPF_R10000_ModifiedArnoldi_Shift.tst b/solvers/IncNavierStokesSolver/Tests/PPF_R10000_ModifiedArnoldi_Shift.tst new file mode 100644 index 0000000000000000000000000000000000000000..eeaa747a0b5346a6b89956261a269f75c0256629 --- /dev/null +++ b/solvers/IncNavierStokesSolver/Tests/PPF_R10000_ModifiedArnoldi_Shift.tst @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> +<test> + <description>Linear stability with coupled solver (Modified Arnoldi with shift): ChannelMax Ev = (3.7302e-03+2.3752e-01i) </description> + <executable>IncNavierStokesSolver</executable> + <parameters>PPF_R10000_3D.xml</parameters> + <files> + <file description="Session File">PPF_R10000_3D.xml</file> + </files> + <metrics> + <metric type="Eigenvalue" id="0"> + <value tolerance="0.001">0.518448,-26.6405</value> + <value tolerance="0.001">0.518448,26.6405</value> + </metric> + </metrics> +</test> + + diff --git a/solvers/IncNavierStokesSolver/Tests/PPF_R15000_3D.xml b/solvers/IncNavierStokesSolver/Tests/PPF_R15000_3D.xml new file mode 100644 index 0000000000000000000000000000000000000000..3707ce3ffc7f98e618198fbda8fb9ec0297d40a0 --- /dev/null +++ b/solvers/IncNavierStokesSolver/Tests/PPF_R15000_3D.xml @@ -0,0 +1,257 @@ +<?xml version="1.0" encoding="utf-8" ?> +<NEKTAR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="http://www.nektar.info/schema/nektar.xsd"> + + <GEOMETRY DIM="2" SPACE="2"> + <VERTEX XSCALE="3.0*PI"> + <V ID="0"> 0 -1 0.0 </V> + <V ID="1"> 0.25 -1 0.0 </V> + <V ID="2"> 0.5 -1 0.0 </V> + <V ID="3"> 0.75 -1 0.0 </V> + <V ID="4"> 1 -1 0.0 </V> + <V ID="5"> 0 -0.95 0.0 </V> + <V ID="6"> 0.25 -0.95 0.0 </V> + <V ID="7"> 0.5 -0.95 0.0 </V> + <V ID="8"> 0.75 -0.95 0.0 </V> + <V ID="9"> 1 -0.95 0.0 </V> + <V ID="10"> 0 -0.9 0.0 </V> + <V ID="11"> 0.25 -0.9 0.0 </V> + <V ID="12"> 0.5 -0.9 0.0 </V> + <V ID="13"> 0.75 -0.9 0.0 </V> + <V ID="14"> 1 -0.9 0.0 </V> + <V ID="15"> 0 -0.5 0.0 </V> + <V ID="16"> 0.25 -0.5 0.0 </V> + <V ID="17"> 0.5 -0.5 0.0 </V> + <V ID="18"> 0.75 -0.5 0.0 </V> + <V ID="19"> 1 -0.5 0.0 </V> + <V ID="20"> 0 0 0.0 </V> + <V ID="21"> 0.25 0 0.0 </V> + <V ID="22"> 0.5 0 0.0 </V> + <V ID="23"> 0.75 0 0.0 </V> + <V ID="24"> 1 0 0.0 </V> + <V ID="25"> 0 0.5 0.0 </V> + <V ID="26"> 0.25 0.5 0.0 </V> + <V ID="27"> 0.5 0.5 0.0 </V> + <V ID="28"> 0.75 0.5 0.0 </V> + <V ID="29"> 1 0.5 0.0 </V> + <V ID="30"> 0 0.9 0.0 </V> + <V ID="31"> 0.25 0.9 0.0 </V> + <V ID="32"> 0.5 0.9 0.0 </V> + <V ID="33"> 0.75 0.9 0.0 </V> + <V ID="34"> 1 0.9 0.0 </V> + <V ID="35"> 0 0.95 0.0 </V> + <V ID="36"> 0.25 0.95 0.0 </V> + <V ID="37"> 0.5 0.95 0.0 </V> + <V ID="38"> 0.75 0.95 0.0 </V> + <V ID="39"> 1 0.95 0.0 </V> + <V ID="40"> 0 1 0.0 </V> + <V ID="41"> 0.25 1 0.0 </V> + <V ID="42"> 0.5 1 0.0 </V> + <V ID="43"> 0.75 1 0.0 </V> + <V ID="44"> 1 1 0.0 </V> + </VERTEX> + + <EDGE> + <E ID="0"> 0 1 </E> + <E ID="1"> 1 2 </E> + <E ID="2"> 2 3 </E> + <E ID="3"> 3 4 </E> + <E ID="4"> 0 5 </E> + <E ID="5"> 1 6 </E> + <E ID="6"> 2 7 </E> + <E ID="7"> 3 8 </E> + <E ID="8"> 4 9 </E> + <E ID="9"> 5 6 </E> + <E ID="10"> 6 7 </E> + <E ID="11"> 7 8 </E> + <E ID="12"> 8 9 </E> + <E ID="13"> 5 10 </E> + <E ID="14"> 6 11 </E> + <E ID="15"> 7 12 </E> + <E ID="16"> 8 13 </E> + <E ID="17"> 9 14 </E> + <E ID="18"> 10 11 </E> + <E ID="19"> 11 12 </E> + <E ID="20"> 12 13 </E> + <E ID="21"> 13 14 </E> + <E ID="22"> 10 15 </E> + <E ID="23"> 11 16 </E> + <E ID="24"> 12 17 </E> + <E ID="25"> 13 18 </E> + <E ID="26"> 14 19 </E> + <E ID="27"> 15 16 </E> + <E ID="28"> 16 17 </E> + <E ID="29"> 17 18 </E> + <E ID="30"> 18 19 </E> + <E ID="31"> 15 20 </E> + <E ID="32"> 16 21 </E> + <E ID="33"> 17 22 </E> + <E ID="34"> 18 23 </E> + <E ID="35"> 19 24 </E> + <E ID="36"> 20 21 </E> + <E ID="37"> 21 22 </E> + <E ID="38"> 22 23 </E> + <E ID="39"> 23 24 </E> + <E ID="40"> 20 25 </E> + <E ID="41"> 21 26 </E> + <E ID="42"> 22 27 </E> + <E ID="43"> 23 28 </E> + <E ID="44"> 24 29 </E> + <E ID="45"> 25 26 </E> + <E ID="46"> 26 27 </E> + <E ID="47"> 27 28 </E> + <E ID="48"> 28 29 </E> + <E ID="49"> 25 30 </E> + <E ID="50"> 26 31 </E> + <E ID="51"> 27 32 </E> + <E ID="52"> 28 33 </E> + <E ID="53"> 29 34 </E> + <E ID="54"> 30 31 </E> + <E ID="55"> 31 32 </E> + <E ID="56"> 32 33 </E> + <E ID="57"> 33 34 </E> + <E ID="58"> 30 35 </E> + <E ID="59"> 31 36 </E> + <E ID="60"> 32 37 </E> + <E ID="61"> 33 38 </E> + <E ID="62"> 34 39 </E> + <E ID="63"> 35 36 </E> + <E ID="64"> 36 37 </E> + <E ID="65"> 37 38 </E> + <E ID="66"> 38 39 </E> + <E ID="67"> 35 40 </E> + <E ID="68"> 36 41 </E> + <E ID="69"> 37 42 </E> + <E ID="70"> 38 43 </E> + <E ID="71"> 39 44 </E> + <E ID="72"> 40 41 </E> + <E ID="73"> 41 42 </E> + <E ID="74"> 42 43 </E> + <E ID="75"> 43 44 </E> + </EDGE> + + <ELEMENT> + <Q ID="0"> 0 5 9 4 </Q> + <Q ID="1"> 1 6 10 5 </Q> + <Q ID="2"> 2 7 11 6 </Q> + <Q ID="3"> 3 8 12 7 </Q> + <Q ID="4"> 9 14 18 13 </Q> + <Q ID="5"> 10 15 19 14 </Q> + <Q ID="6"> 11 16 20 15 </Q> + <Q ID="7"> 12 17 21 16 </Q> + <Q ID="8"> 18 23 27 22 </Q> + <Q ID="9"> 19 24 28 23 </Q> + <Q ID="10"> 20 25 29 24 </Q> + <Q ID="11"> 21 26 30 25 </Q> + <Q ID="12"> 27 32 36 31 </Q> + <Q ID="13"> 28 33 37 32 </Q> + <Q ID="14"> 29 34 38 33 </Q> + <Q ID="15"> 30 35 39 34 </Q> + <Q ID="16"> 36 41 45 40 </Q> + <Q ID="17"> 37 42 46 41 </Q> + <Q ID="18"> 38 43 47 42 </Q> + <Q ID="19"> 39 44 48 43 </Q> + <Q ID="20"> 45 50 54 49 </Q> + <Q ID="21"> 46 51 55 50 </Q> + <Q ID="22"> 47 52 56 51 </Q> + <Q ID="23"> 48 53 57 52 </Q> + <Q ID="24"> 54 59 63 58 </Q> + <Q ID="25"> 55 60 64 59 </Q> + <Q ID="26"> 56 61 65 60 </Q> + <Q ID="27"> 57 62 66 61 </Q> + <Q ID="28"> 63 68 72 67 </Q> + <Q ID="29"> 64 69 73 68 </Q> + <Q ID="30"> 65 70 74 69 </Q> + <Q ID="31"> 66 71 75 70 </Q> + </ELEMENT> + + <COMPOSITE> + <C ID="0"> Q[0-31] </C> + <C ID="1"> E[0,1,2,3] </C> // south border + <C ID="2"> E[4,13,22,31,40,49,58,67] </C> // west border + <C ID="3"> E[72,73,74,75] </C> // north border + <C ID="4"> E[8,17,26,35,44,53,62,71] </C> // East border + </COMPOSITE> + <DOMAIN> C[0] </DOMAIN> + </GEOMETRY> + + <EXPANSIONS> + <E COMPOSITE="C[0]" NUMMODES="11" FIELDS="u,v,w" TYPE="MODIFIED" /> + </EXPANSIONS> + + <CONDITIONS> + <SOLVERINFO> + <I PROPERTY="SolverType" VALUE="CoupledLinearisedNS" /> + <I PROPERTY="EQTYPE" VALUE="SteadyLinearisedNS" /> + <I PROPERTY="EvolutionOperator" VALUE="Direct" /> + <I PROPERTY="HOMOGENEOUS" VALUE="1D"/> + <I PROPERTY="ModeType" VALUE="SingleMode"/> + <I PROPERTY="Projection" VALUE="Galerkin" /> + <I PROPERTY="Driver" VALUE="Arpack" /> + <I PROPERTY="ArpackProblemType" VALUE="LargestMag" /> + </SOLVERINFO> + + <PARAMETERS> + <P> IO_CheckSteps = 1000 </P> + <P> IO_InfoSteps = 20 </P> + <P> Re = 15000 </P> + <P> Kinvis = 1.0/Re </P> + <P> kdim = 64 </P> + <P> realShift = 0.003 </P> + <P> realShift = 0.002 </P> + <P> imagShift = 0.2 </P> + <P> HomModesZ = 2 </P> + <P> evtol = 1e-6 </P> + <P> nvec = 4 </P> + <P> LZ = 6*PI/sqrt(5) </P> + </PARAMETERS> + + <VARIABLES> + <V ID="0"> u </V> + <V ID="1"> v </V> + <V ID="2"> w </V> + </VARIABLES> + + <BOUNDARYREGIONS> + <B ID="0"> C[1] </B> + <B ID="1"> C[2] </B> + <B ID="2"> C[3] </B> + <B ID="3"> C[4] </B> + </BOUNDARYREGIONS> + + <BOUNDARYCONDITIONS> + <REGION REF="0"> + <D VAR="u" VALUE="0" /> + <D VAR="v" VALUE="0" /> + <D VAR="w" VALUE="0" /> + </REGION> + <REGION REF="1"> + <P VAR="u" VALUE="[3]" /> + <P VAR="v" VALUE="[3]" /> + <P VAR="w" VALUE="[3]" /> + </REGION> + <REGION REF="2"> + <D VAR="u" VALUE="0" /> + <D VAR="v" VALUE="0" /> + <D VAR="w" VALUE="0" /> + </REGION> + <REGION REF="3"> + <P VAR="u" VALUE="[1]" /> + <P VAR="v" VALUE="[1]" /> + <P VAR="w" VALUE="[1]" /> + </REGION> + </BOUNDARYCONDITIONS> + + <FUNCTION NAME="AdvectionVelocity"> + <E VAR="u" VALUE="1-y*y" /> + <E VAR="v" VALUE="0" /> + <E VAR="w" VALUE="0" /> + </FUNCTION> + </CONDITIONS> + + <FORCING> + <FORCE TYPE="StabilityCoupledLNS"> + </FORCE> + </FORCING> + +</NEKTAR> diff --git a/solvers/IncNavierStokesSolver/Tests/PPF_R15000_Arpack_NoImagShift.tst b/solvers/IncNavierStokesSolver/Tests/PPF_R15000_Arpack_NoImagShift.tst new file mode 100644 index 0000000000000000000000000000000000000000..4628eb603a1d255bf2706ec6b4abdd6b9763e63f --- /dev/null +++ b/solvers/IncNavierStokesSolver/Tests/PPF_R15000_Arpack_NoImagShift.tst @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<test> + <description>Linear stability with coupled solver (LI with Arpack and Real Shift): ChannelMax Ev = (0.00248682 -0.158348i) </description> + <executable>IncNavierStokesSolver</executable> + <parameters> -P nvec=20 -P kdim=256 -P imagShift=0.0 -I ArpackProblemType=LargestImag PPF_R15000_3D.xml</parameters> + <files> + <file description="Session File">PPF_R15000_3D.xml</file> + </files> + <metrics> + <metric type="Eigenvalue" id="0"> + <value index="0" tolerance="0.001">-0.016749,0</value> + </metric> + </metrics> +</test> + + diff --git a/solvers/IncNavierStokesSolver/Tests/PPF_R15000_Arpack_NoImagShift_LM.tst b/solvers/IncNavierStokesSolver/Tests/PPF_R15000_Arpack_NoImagShift_LM.tst new file mode 100644 index 0000000000000000000000000000000000000000..0edc43d0164d8f0556a11ccaaafb1eb6ef8bd75e --- /dev/null +++ b/solvers/IncNavierStokesSolver/Tests/PPF_R15000_Arpack_NoImagShift_LM.tst @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<test> + <description>Linear stability with coupled solver (LM with Arpack and Real Shift): ChannelMax Ev = (0.00248682 -0.158348i) </description> + <executable>IncNavierStokesSolver</executable> + <parameters> -P nvec=196 -P kdim=384 -P imagShift=0.0 -I ArpackProblemType=LargestMag PPF_R15000_3D.xml</parameters> + <files> + <file description="Session File">PPF_R15000_3D.xml</file> + </files> + <metrics> + <metric type="Eigenvalue" id="0"> + <value tolerance="0.001">-0.000201531,0</value> + </metric> + </metrics> +</test> + + diff --git a/solvers/IncNavierStokesSolver/Tests/PPF_R15000_Arpack_Shift.tst b/solvers/IncNavierStokesSolver/Tests/PPF_R15000_Arpack_Shift.tst new file mode 100644 index 0000000000000000000000000000000000000000..cf879792d92154bfdebde946011786ff5b440017 --- /dev/null +++ b/solvers/IncNavierStokesSolver/Tests/PPF_R15000_Arpack_Shift.tst @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> +<test> + <description>Linear stability with coupled solver (LM with Arpack and Complex Shift): ChannelMax Ev = (0.00248682 -0.158348i) </description> + <executable>IncNavierStokesSolver</executable> + <parameters>PPF_R15000_3D.xml</parameters> + <files> + <file description="Session File">PPF_R15000_3D.xml</file> + </files> + <metrics> + <metric type="Eigenvalue" id="0"> + <value index="0" tolerance="0.001">-0.0339756,-0.184554</value> + <value index="1" tolerance="0.001">-0.0339756,-0.215446</value> + </metric> + </metrics> +</test> + + diff --git a/solvers/IncNavierStokesSolver/Tests/PPF_R15000_ModifiedArnoldi_Shift.tst b/solvers/IncNavierStokesSolver/Tests/PPF_R15000_ModifiedArnoldi_Shift.tst new file mode 100644 index 0000000000000000000000000000000000000000..1069e1ee565fc1a7931bf939413c11be13c50a88 --- /dev/null +++ b/solvers/IncNavierStokesSolver/Tests/PPF_R15000_ModifiedArnoldi_Shift.tst @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> +<test> + <description>Linear stability with coupled solver (LM with Modified Arnoldiand Complex Shift): ChannelMax Ev = (2.4868e-03,1.5835e-01i) </description> + <executable>IncNavierStokesSolver</executable> + <parameters> -I Driver=ModifiedArnoldi PPF_R15000_3D.xml</parameters> + <files> + <file description="Session File">PPF_R15000_3D.xml</file> + </files> + <metrics> + <metric type="Eigenvalue" id="0"> + <value index="0" tolerance="0.001">2.8057e-01,-2.4005e+01</value> + <value index="1" tolerance="0.001">2.8057e-01,2.4005e+01</value> + </metric> + </metrics> +</test> + + diff --git a/solvers/IncNavierStokesSolver/Tests/SinCos_LinNS_3DHom1D.xml b/solvers/IncNavierStokesSolver/Tests/SinCos_LinNS_3DHom1D.xml index 466532ee022514a9199ec04b07a71bc944e74471..71abe1676a93b55f87f4a2e0261ac8957f4e895c 100644 --- a/solvers/IncNavierStokesSolver/Tests/SinCos_LinNS_3DHom1D.xml +++ b/solvers/IncNavierStokesSolver/Tests/SinCos_LinNS_3DHom1D.xml @@ -22,7 +22,6 @@ <P> IO_InfoSteps = 1000 </P> <P> Kinvis = 1 </P> <P> HomModesZ = 4 </P> - <P> imagShift = 0 </P> <P> LZ = 2 </P> <P> Uvel = 1 </P> <P> Vvel = 2 </P> diff --git a/solvers/IncNavierStokesSolver/Tests/bfs_tg-AR.tst b/solvers/IncNavierStokesSolver/Tests/bfs_tg-AR.tst index 25d0948f9fe2d2adfcffab75911678479d7f93ae..bbfae34bc8cd463148e0ba8d0619bbc13cf33ba4 100644 --- a/solvers/IncNavierStokesSolver/Tests/bfs_tg-AR.tst +++ b/solvers/IncNavierStokesSolver/Tests/bfs_tg-AR.tst @@ -9,15 +9,8 @@ <file description="Session File">bfs_tg-AR.rst</file> </files> <metrics> - <metric type="L2" id="1"> - <value variable="u" tolerance="1e-12">0.0091919</value> - <value variable="v" tolerance="1e-12">0.00706682</value> - <value variable="p" tolerance="1e-12">0.191912</value> - </metric> - <metric type="Linf" id="2"> - <value variable="u" tolerance="1e-12">0</value> - <value variable="v" tolerance="1e-12">0</value> - <value variable="p" tolerance="1e-12">0</value> + <metric type="Eigenvalue" id="0"> + <value tolerance="0.001">0.0477584,0</value> </metric> </metrics> </test> diff --git a/solvers/IncNavierStokesSolver/Tests/bfs_tg.tst b/solvers/IncNavierStokesSolver/Tests/bfs_tg.tst index a6a4ec38fa8aafc75f6a4300f6255a066ecba3cb..3dc20ac721e28eee889de647b5e7298b39f72172 100644 --- a/solvers/IncNavierStokesSolver/Tests/bfs_tg.tst +++ b/solvers/IncNavierStokesSolver/Tests/bfs_tg.tst @@ -9,15 +9,8 @@ <file description="Session File">bfs_tg.rst</file> </files> <metrics> - <metric type="L2" id="1"> - <value variable="u" tolerance="1e-12">0.0187703</value> - <value variable="v" tolerance="1e-12">0.019542</value> - <value variable="p" tolerance="1e-12">0.0292666</value> - </metric> - <metric type="Linf" id="2"> - <value variable="u" tolerance="1e-12">0.0434972</value> - <value variable="v" tolerance="1e-12">0.0468062</value> - <value variable="p" tolerance="1e-12">0.0247981</value> + <metric type="Eigenvalue" id="0"> + <value tolerance="0.001">1.1398,0</value> </metric> </metrics> </test> diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index b66f0519102b0d9ddc3fe4638fa446a188b38a71..7026899d22a0467efa481ee3abcaf570b63b45e3 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -3,6 +3,7 @@ CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/tests/Tester.cpp.in @ONLY) SET(TESTER_SOURCES Metric.cpp + MetricEigenvalue.cpp MetricFile.cpp MetricL2.cpp MetricLInf.cpp @@ -15,6 +16,7 @@ SET(TESTER_SOURCES SET(TESTER_HEADERS Metric.h + MetricEigenvalue.h MetricFile.h MetricL2.h MetricLInf.h diff --git a/tests/MetricEigenvalue.cpp b/tests/MetricEigenvalue.cpp new file mode 100644 index 0000000000000000000000000000000000000000..77f0bf323ea0aa39b70605f4ca27ea8044a8075e --- /dev/null +++ b/tests/MetricEigenvalue.cpp @@ -0,0 +1,136 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// File: MetricEigenvalue.cpp +// +// For more information, please see: http://www.nektar.info +// +// The MIT License +// +// Copyright (c) 2006 Division of Applied Mathematics, Brown University (USA), +// Department of Aeronautics, Imperial College London (UK), and Scientific +// Computing and Imaging Institute, University of Utah (USA). +// +// License for the specific language governing rights and limitations under +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. +// +// Description: Implementation of the eigenvalue metric. +// +/////////////////////////////////////////////////////////////////////////////// + +#include <boost/algorithm/string.hpp> + +#include <MetricEigenvalue.h> + +namespace Nektar +{ + std::string MetricEigenvalue::type = GetMetricFactory(). + RegisterCreatorFunction("EIGENVALUE", MetricEigenvalue::create); + + // Guess default tolerance for generation routine. + std::string MetricEigenvalue::defaultTolerance = "1e-03"; + + MetricEigenvalue::MetricEigenvalue(TiXmlElement *metric, bool generate) : + MetricRegex(metric, generate) + { + // We do not mind which order the converged eigenvalues are listed. + m_unordered = true; + + // Regex for FP numbers of forms: 120, -23, 4.345, 2.4563e-01, -nan + std::string fp = "-?\\d+\\.?\\d*(?:e[+-]\\d+)?|-?nan"; + + // Set up the regular expression. This matches lines beginning with EV: + // followed by an eigenvalue index and then at least 2 floating-point + // values comprising real and imaginary components of complex evals. + // Comparison is made only on the captured eigenvalue components. + m_regex = "^EV:\\s+\\d+\\s+(" + fp + ")\\s+(" + fp + ").*"; + + // Find the number of iterations to match against. + TiXmlElement *value = metric->FirstChildElement("value"); + ASSERTL0(value || m_generate, "Missing value tag for eigenvalue metric!"); + + while (value) + { + ASSERTL0(value->Attribute("tolerance"), + "Missing tolerance in eigenvalue metric"); + ASSERTL0(value->GetText() || value->GetText() == "", + "Missing value in preconditioner metric."); + + MetricRegexFieldValue mag, angle; + + // Read valute as comma-separate mag,angle parts + std::string cmplx = value->GetText(); + std::vector<std::string> cmpts; + boost::split(cmpts, cmplx, boost::is_any_of(",")); + ASSERTL0(cmpts.size() == 2, + "Value should be magnitude and angle, separated by comma"); + + mag.m_value = cmpts[0]; + mag.m_useTolerance = true; + mag.m_tolerance = atof(value->Attribute("tolerance")); + + angle.m_value = cmpts[1]; + angle.m_useTolerance = true; + angle.m_tolerance = atof(value->Attribute("tolerance")); + + if (!m_generate) + { + std::vector<MetricRegexFieldValue> tmp(2); + tmp[0] = mag; + tmp[1] = angle; + m_matches.push_back(tmp); + } + else + { + m_varTolerance = value->Attribute("tolerance"); + } + + value = value->NextSiblingElement("value"); + } + } + + void MetricEigenvalue::v_Generate(std::istream& pStdout, std::istream& pStderr) + { + // Run MetricRegex to generate matches. + MetricRegex::v_Generate(pStdout, pStderr); + + // First remove all existing values. + m_metric->Clear(); + + // Now create new values. + for (int i = 0; i < m_matches.size(); ++i) + { + ASSERTL0(m_matches[i].size() == 3, + "Wrong number of matches for regular expression."); + + std::string tol = MetricEigenvalue::defaultTolerance; + TiXmlElement *value = new TiXmlElement("value"); + + if (m_varTolerance != "") + { + tol = m_varTolerance; + } + + value->SetAttribute("index", m_matches[i][0].m_value); + value->SetAttribute("tolerance", tol); + value->LinkEndChild(new TiXmlText(m_matches[i][1].m_value + "," + + m_matches[i][2].m_value)); + m_metric->LinkEndChild(value); + } + } +} diff --git a/tests/MetricEigenvalue.h b/tests/MetricEigenvalue.h new file mode 100644 index 0000000000000000000000000000000000000000..261ad0c342bb4c9e06fafaa2b797fffd850472ce --- /dev/null +++ b/tests/MetricEigenvalue.h @@ -0,0 +1,64 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// File: MetricPrecon.h +// +// For more information, please see: http://www.nektar.info +// +// The MIT License +// +// Copyright (c) 2006 Division of Applied Mathematics, Brown University (USA), +// Department of Aeronautics, Imperial College London (UK), and Scientific +// Computing and Imaging Institute, University of Utah (USA). +// +// License for the specific language governing rights and limitations under +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. +// +// Description: Definition of the preconditioner metric. +// +/////////////////////////////////////////////////////////////////////////////// + +#ifndef NEKTAR_TESTS_METRICEIGENVALUE_H +#define NEKTAR_TESTS_METRICEIGENVALUE_H + +#include <map> +#include <MetricRegex.h> + +namespace Nektar +{ + class MetricEigenvalue : public MetricRegex + { + public: + static MetricSharedPtr create(TiXmlElement *metric, bool generate) + { + return MetricSharedPtr(new MetricEigenvalue(metric, generate)); + } + + static std::string type; + static std::string defaultTolerance; + + protected: + MetricEigenvalue(TiXmlElement *metric, bool generate); + + std::string m_varTolerance; + + virtual void v_Generate(std::istream& pStdout, std::istream& pStderr); + }; +} + +#endif diff --git a/tests/MetricRegex.cpp b/tests/MetricRegex.cpp index f55a1b3010762bdcbc2480cc9a42bc96d0a06989..129f830de17dafb386bd5041f7ccf6530424733f 100644 --- a/tests/MetricRegex.cpp +++ b/tests/MetricRegex.cpp @@ -47,9 +47,13 @@ namespace Nektar /** * @brief Constructor. */ - MetricRegex::MetricRegex(TiXmlElement *metric, bool generate) : + MetricRegex::MetricRegex(TiXmlElement *metric, bool generate) : Metric(metric, generate) { + // Default behaviour is that the regexes listed in the input file must + // be matched in order. + m_unordered = false; + // If we are a derived class, do nothing if (m_type != "REGEX") { @@ -67,7 +71,7 @@ namespace Nektar { return; } - + TiXmlElement *matches = metric->FirstChildElement("matches"); ASSERTL0(matches, "No matches defined."); TiXmlElement *match = matches->FirstChildElement("match"); @@ -118,12 +122,15 @@ namespace Nektar std::vector<MetricRegexFieldValue> &okValues = m_matches[0]; int nMatch = m_matches.size(); bool success = true; + bool matchedTol = false; boost::cmatch matches; // Process output file line by line searching for regex matches std::string line; while (getline(pStdout, line) && m_matches.size() > 0) { + matchedTol = true; + // Test to see if we have a match on this line. if (boost::regex_match(line.c_str(), matches, m_regex)) { @@ -134,11 +141,12 @@ namespace Nektar return false; } - // Check each field in turn + // Check each regex capture group in turn for (int i = 1; i < matches.size(); ++i) { + // extract the captured string std::string match(matches[i].first, matches[i].second); - + if (okValues[i-1].m_useTolerance) { double val; @@ -162,12 +170,19 @@ namespace Nektar // test. if (val > okValues[i-1].m_tolerance) { - cerr << "Failed tolerance match." << endl; - cerr << " Expected: " << okValues[i-1].m_value - << " +/- " << okValues[i-1].m_tolerance - << endl; - cerr << " Result: " << match << endl; - success = false; + if (m_unordered) + { + matchedTol = false; + } + else + { + cerr << "Failed tolerance match." << endl; + cerr << " Expected: " << okValues[i-1].m_value + << " +/- " << okValues[i-1].m_tolerance + << endl; + cerr << " Result: " << match << endl; + success = false; + } } } else if (okValues[i-1].m_useIntTolerance) @@ -192,12 +207,19 @@ namespace Nektar // test. if (val > okValues[i-1].m_intTolerance) { - cerr << "Failed tolerance match." << endl; - cerr << " Expected: " << okValues[i-1].m_value - << " +/- " << okValues[i-1].m_intTolerance - << endl; - cerr << " Result: " << match << endl; - success = false; + if (m_unordered) + { + matchedTol = false; + } + else + { + cerr << "Failed tolerance match." << endl; + cerr << " Expected: " << okValues[i-1].m_value + << " +/- " << okValues[i-1].m_intTolerance + << endl; + cerr << " Result: " << match << endl; + success = false; + } } } else @@ -205,17 +227,27 @@ namespace Nektar // Case insensitive match. if (!boost::iequals(match, okValues[i-1].m_value)) { - cerr << "Failed case-insensitive match." << endl; - cerr << " Expected: " << okValues[i-1].m_value - << endl; - cerr << " Result: " << match << endl; - success = false; + if (m_unordered) + { + matchedTol = false; + } + else + { + cerr << "Failed case-insensitive match." << endl; + cerr << " Expected: " << okValues[i-1].m_value + << endl; + cerr << " Result: " << match << endl; + success = false; + } } } } // Remove this match from the list of matches. - m_matches.erase(m_matches.begin()); + if (matchedTol) + { + m_matches.erase(m_matches.begin()); + } } } @@ -245,7 +277,7 @@ namespace Nektar { // Error if no fields in regex then throw an error. ASSERTL0(matches.size() != 1, "No test sections in regex!"); - + vector<MetricRegexFieldValue> okValues; for (int i = 1; i < matches.size(); ++i) @@ -253,11 +285,11 @@ namespace Nektar // Create new field. MetricRegexFieldValue okValue; okValue.m_useTolerance = false; - okValue.m_value = std::string(matches[i].first, + okValue.m_value = std::string(matches[i].first, matches[i].second); okValues.push_back(okValue); } - + m_matches.push_back(okValues); } } @@ -269,34 +301,34 @@ namespace Nektar TiXmlElement *matches = m_metric->FirstChildElement("matches"); if (matches) { - ASSERTL0(m_metric->RemoveChild(matches), + ASSERTL0(m_metric->RemoveChild(matches), "Couldn't remove matches from metric!"); } // Create new matches element. matches = new TiXmlElement("matches"); m_metric->LinkEndChild(matches); - + for (int i = 0; i < m_matches.size(); ++i) { TiXmlElement *match = new TiXmlElement("match"); matches->LinkEndChild(match); - + for (int j = 0; j < m_matches[i].size(); ++j) { TiXmlElement *field = new TiXmlElement("field"); match->LinkEndChild(field); - + field->SetAttribute( "id", boost::lexical_cast<std::string>(j)); - + if (m_matches[i][j].m_useTolerance) { field->SetAttribute( "tolerance", boost::lexical_cast< std::string>(m_matches[i][j].m_tolerance)); } - + field->LinkEndChild(new TiXmlText(m_matches[i][j].m_value)); } } diff --git a/tests/MetricRegex.h b/tests/MetricRegex.h index 28e7c125e6b437793e493eecaf423015483e5c9e..867e9957651094cc2245b661d84e68d4ae0974eb 100644 --- a/tests/MetricRegex.h +++ b/tests/MetricRegex.h @@ -70,12 +70,14 @@ namespace Nektar } static std::string type; - + protected: /// Storage for the boost regex. boost::regex m_regex; /// Stores the multiple matches defined in each <MATCH> tag. std::vector<std::vector<MetricRegexFieldValue> > m_matches; + /// If true, regex matches may be in any order in output + bool m_unordered; MetricRegex(TiXmlElement *metric, bool generate); diff --git a/utilities/FieldConvert/InputModules/InputFld.cpp b/utilities/FieldConvert/InputModules/InputFld.cpp index ba73e299e8a234cb79735bb7162928704eb5fb50..bb3f08314a30d8da6337dc8ab2eed56ebf26a128 100644 --- a/utilities/FieldConvert/InputModules/InputFld.cpp +++ b/utilities/FieldConvert/InputModules/InputFld.cpp @@ -48,16 +48,19 @@ namespace Nektar namespace Utilities { -ModuleKey InputFld::m_className[3] = { +ModuleKey InputFld::m_className[4] = { GetModuleFactory().RegisterCreatorFunction( ModuleKey(eInputModule, "fld"), InputFld::create, "Reads Fld file."), GetModuleFactory().RegisterCreatorFunction( ModuleKey(eInputModule, "chk"), InputFld::create, - "Reads Fld file."), + "Reads checkpoint file."), GetModuleFactory().RegisterCreatorFunction( ModuleKey(eInputModule, "rst"), InputFld::create, - "Reads Fld file."), + "Reads restart file."), + GetModuleFactory().RegisterCreatorFunction( + ModuleKey(eInputModule, "bse"), InputFld::create, + "Reads stability base-flow file.") }; @@ -70,6 +73,7 @@ InputFld::InputFld(FieldSharedPtr f) : InputModule(f) m_allowedFiles.insert("fld"); m_allowedFiles.insert("chk"); m_allowedFiles.insert("rst"); + m_allowedFiles.insert("bse"); } @@ -106,6 +110,10 @@ void InputFld::Process(po::variables_map &vm) { fldending = "rst"; } + else if (m_f->m_inputfiles.count("bse") != 0) + { + fldending = "bse"; + } else { ASSERTL0(false,"no input file found"); diff --git a/utilities/SimpleMeshGen/RectangularMesh.cpp b/utilities/SimpleMeshGen/RectangularMesh.cpp index 949627e34a995fcde9fe275855b971c302de648c..599a2d12987c4f96ce181c82e46cffd04ba6016a 100644 --- a/utilities/SimpleMeshGen/RectangularMesh.cpp +++ b/utilities/SimpleMeshGen/RectangularMesh.cpp @@ -169,8 +169,6 @@ int main(int argc, char *argv[]) } cout << " </EDGE>\n" << endl; - - cout << " <ELEMENT>" << endl; cnt = 0; for(j = 0; j < ny-1; ++j)