Revision aad7e13965046c110440d237cf5fbaaadae27c19 authored by Dmitri Naumov on 28 April 2021, 20:11:52 UTC, committed by Dmitry Yu. Naumov on 02 June 2021, 12:47:02 UTC
Plural is incorrect, just a model.
1 parent 07e920f
Raw File
TestFluidProperties.cpp
/**
 *  \brief Test the creator of FluidProperties
 *
 *  \copyright
 *   Copyright (c) 2012-2021, OpenGeoSys Community (http://www.opengeosys.org)
 *              Distributed under a Modified BSD License.
 *              See accompanying file LICENSE.txt or
 *              http://www.opengeosys.org/project/license
 *
 *  \file
 *
 */

#include <gtest/gtest.h>

#include <cmath>
#include <memory>

#include "BaseLib/ConfigTree.h"
#include "MaterialLib/Fluid/FluidProperties/CreateFluidProperties.h"
#include "MaterialLib/Fluid/FluidProperties/FluidProperties.h"
#include "Tests/TestTools.h"

using namespace MaterialLib;
using namespace MaterialLib::Fluid;

using ArrayType = MaterialLib::Fluid::FluidProperty::ArrayType;

std::unique_ptr<FluidProperties> createTestFluidProperties(const char xml[])
{
    auto const ptree = Tests::readXml(xml);
    BaseLib::ConfigTree conf(ptree, "", BaseLib::ConfigTree::onerror,
                             BaseLib::ConfigTree::onwarning);
    auto const& sub_config = conf.getConfigSubtree("fluid");
    return createFluidProperties(sub_config);
}

TEST(MaterialFluidProperties, checkPrimaryVariableDependentFluidProperties)
{
    const char xml[] =
        "<fluid>"
        "    <density>"
        "       <type>TemperatureDependent</type>"
        "       <temperature0> 293.0 </temperature0> "
        "       <beta> 4.3e-4 </beta> "
        "       <rho0>1000.</rho0>"
        "    </density>"
        "    <viscosity>"
        "       <type>TemperatureDependent</type>"
        "       <mu0>1.e-3 </mu0>"
        "       <tc>293.</tc>"
        "       <tv>368.</tv>"
        "    </viscosity>"
        "</fluid>";

    auto const fluid_model = createTestFluidProperties(xml);

    ArrayType vars;
    vars[0] = 350.0;
    const double mu_expected = 1.e-3 * std::exp(-(vars[0] - 293) / 368);
    ASSERT_NEAR(mu_expected,
                fluid_model->getValue(FluidPropertyType::Viscosity, vars),
                1.e-10);
    const double dmu_dT_expected =
        -1.e-3 / 368 * std::exp(-(vars[0] - 293) / 368);
    ASSERT_NEAR(
        dmu_dT_expected,
        fluid_model->getdValue(FluidPropertyType::Viscosity, vars,
                               MaterialLib::Fluid::PropertyVariableType::T),
        1.e-10);

    vars[0] = 273.1;
    ASSERT_NEAR(1000.0 * (1 - 4.3e-4 * (vars[0] - 293.0)),
                fluid_model->getValue(FluidPropertyType::Density, vars),
                1.e-10);
    ASSERT_NEAR(-1000.0 * 4.3e-4,
                fluid_model->getdValue(FluidPropertyType::Density, vars,
                                       Fluid::PropertyVariableType::T),
                1.e-10);
}

TEST(MaterialFluidProperties, checkFluidPropertiesWithDensityDependentModels_T)
{
    const char xml[] =
        "<fluid>"
        "    <density>"
        "        <type>TemperatureDependent</type>"
        "        <temperature0> 293.0 </temperature0> "
        "        <beta> -2.5003219164466073e-05 </beta> "
        "        <rho0> 998.</rho0>"
        "    </density>"
        "    <viscosity>"
        "       <type>WaterViscosityIAPWS</type>"
        "    </viscosity>"
        "</fluid>";

    auto const fluid_model = createTestFluidProperties(xml);

    ArrayType vars;
    vars[0] = 373.15;

    const double rho = fluid_model->getValue(FluidPropertyType::Density, vars);
    ASSERT_NEAR(1000.0, rho, 1.e-10);

    const double mu = fluid_model->getValue(FluidPropertyType::Viscosity, vars);
    ASSERT_NEAR(0.307883622e-3, mu, 1.e-10);

    const double drho_dT =
        fluid_model->getdValue(FluidPropertyType::Density, vars,
                               MaterialLib::Fluid::PropertyVariableType::T);
    const double dmu_dT =
        fluid_model->getdValue(FluidPropertyType::Viscosity, vars,
                               MaterialLib::Fluid::PropertyVariableType::T);

    const double perturbation = 1.e-6;
    vars[0] += perturbation;
    const double rho1 = fluid_model->getValue(FluidPropertyType::Density, vars);
    const double mu1 =
        fluid_model->getValue(FluidPropertyType::Viscosity, vars);

    ASSERT_NEAR((rho1 - rho) / perturbation, drho_dT, 1.e-7);
    ASSERT_NEAR((mu1 - mu) / perturbation, dmu_dT, 1.e-10);
}

TEST(MaterialFluidProperties, checkFluidPropertiesWithDensityDependentModels_dp)
{
    const char xml[] =
        "<fluid>"
        "   <density>"
        "       <type>LiquidDensity</type>"
        "       <temperature0> 273.15 </temperature0> "
        "       <p0> 1.e+5 </p0> "
        "       <bulk_modulus> 2.15e+9 </bulk_modulus> "
        "       <beta> 2.0e-4 </beta> "
        "       <rho0>999.8</rho0>"
        "    </density>"
        "    <viscosity>"
        "       <type>WaterViscosityIAPWS</type>"
        "    </viscosity>"
        "</fluid>";

    auto const fluid_model = createTestFluidProperties(xml);

    ArrayType vars = {{273.15 + 60.0, 1.e+6}};

    const double rho = fluid_model->getValue(FluidPropertyType::Density, vars);
    const double mu = fluid_model->getValue(FluidPropertyType::Viscosity, vars);
    const double drho_dp =
        fluid_model->getdValue(FluidPropertyType::Density, vars,
                               MaterialLib::Fluid::PropertyVariableType::p);
    const double dmu_dp =
        fluid_model->getdValue(FluidPropertyType::Viscosity, vars,
                               MaterialLib::Fluid::PropertyVariableType::p);

    const double perturbation = 1.e-6;
    vars[1] += perturbation;
    const double rho1 = fluid_model->getValue(FluidPropertyType::Density, vars);
    const double mu1 =
        fluid_model->getValue(FluidPropertyType::Viscosity, vars);

    // Only check d()/drho * drho/dp (FluidPropertiesWithDensityDependentModels)
    // The other functionalities of fluid property models are checked in other
    // tests in TestFluid*.cpp files.
    ASSERT_NEAR((rho1 - rho) / perturbation, drho_dp, 1.e-7);
    ASSERT_NEAR((mu1 - mu) / perturbation, dmu_dp, 1.e-10);
}
back to top