LCOV - code coverage report
Current view: top level - src/materials - ConcreteThermalMoisture.C (source / functions) Hit Total Coverage
Test: idaholab/blackbear: 75f23c Lines: 327 368 88.9 %
Date: 2025-07-17 04:05:57 Functions: 4 4 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /****************************************************************/
       2             : /*               DO NOT MODIFY THIS HEADER                      */
       3             : /*                       BlackBear                              */
       4             : /*                                                              */
       5             : /*           (c) 2017 Battelle Energy Alliance, LLC             */
       6             : /*                   ALL RIGHTS RESERVED                        */
       7             : /*                                                              */
       8             : /*          Prepared by Battelle Energy Alliance, LLC           */
       9             : /*            Under Contract No. DE-AC07-05ID14517              */
      10             : /*            With the U. S. Department of Energy               */
      11             : /*                                                              */
      12             : /*            See COPYRIGHT for full restrictions               */
      13             : /****************************************************************/
      14             : 
      15             : #include "ConcreteThermalMoisture.h"
      16             : #include "MooseObjectName.h"
      17             : 
      18             : // libMesh includes
      19             : #include "libmesh/quadrature.h"
      20             : 
      21             : registerMooseObject("BlackBearApp", ConcreteThermalMoisture);
      22             : 
      23             : InputParameters
      24        2095 : ConcreteThermalMoisture::validParams()
      25             : {
      26        2095 :   InputParameters params = Material::validParams();
      27        4190 :   params.addRequiredParam<std::string>(
      28             :       "type", "A string representing the Moose Object that is used to call this class");
      29             : 
      30             :   // // parameters which will be deprecated soon
      31        4190 :   MooseEnum thermal_capacity_model("CONSTANT ASCE-1992 KODUR-2004 EUROCODE-2004");
      32        4190 :   MooseEnum thermal_conductivity_model("CONSTANT ASCE-1992 KODUR-2004 EUROCODE-2004 KIM-2003");
      33        4190 :   params.addDeprecatedParam<MooseEnum>("thermal_capacity_model",
      34             :                                        thermal_capacity_model,
      35             :                                        "thermal capacity models",
      36             :                                        "Use thermal_model instead");
      37        4190 :   params.addDeprecatedParam<MooseEnum>("thermal_conductivity_model",
      38             :                                        thermal_conductivity_model,
      39             :                                        "thermal conductivity models",
      40             :                                        "Use thermal_model instead");
      41        4190 :   MooseEnum moisture_diffusivity_model("Bazant Xi Mensi");
      42        4190 :   params.addDeprecatedParam<MooseEnum>("moisture_diffusivity_model",
      43             :                                        moisture_diffusivity_model,
      44             :                                        "moisture diffusivity models",
      45             :                                        "Use moisture_model instead");
      46        4190 :   params.addDeprecatedParam<Real>("ref_density_of_concrete",
      47             :                                   "refernece density of porous media Kg/m^3",
      48             :                                   "Use ref_density instead");
      49        4190 :   params.addDeprecatedParam<Real>("ref_specific_heat_of_concrete",
      50             :                                   "reference specific heat of concrete J/Kg/0C",
      51             :                                   "Use ref_specific_heat instead");
      52        4190 :   params.addDeprecatedParam<Real>("ref_thermal_conductivity_of_concrete",
      53             :                                   "reference thermal conductivity of concrete  W/m/0C",
      54             :                                   "Use ref_thermal_conductivity instead");
      55             : 
      56             :   // available model for thermal and moisture transport
      57        4190 :   MooseEnum thermal_model("CONSTANT ASCE-1992 KODUR-2004 EUROCODE-2004");
      58        4190 :   params.addParam<MooseEnum>(
      59             :       "thermal_model", thermal_model, "Model for properties used in thermal");
      60        4190 :   MooseEnum moisture_model("Bazant Mensi Xi");
      61        4190 :   params.addParam<MooseEnum>(
      62             :       "moisture_model", moisture_model, "Model for properties used in moisture transport");
      63             : 
      64             :   // concrete properties
      65        4190 :   MooseEnum cement_type("1 2 3 4");
      66        4190 :   MooseEnum aggregate_type("Siliceous Carbonate");
      67        4190 :   MooseEnum aggregate_pore_type("dense porous");
      68        4190 :   params.addParam<MooseEnum>(
      69             :       "cement_type", cement_type, "cement type input for moisture capacity calculations");
      70        4190 :   params.addParam<MooseEnum>("aggregate_type", aggregate_type, "Type of aggregate");
      71        4190 :   params.addParam<MooseEnum>(
      72             :       "aggregate_pore_type", aggregate_pore_type, "aggregate pore structure");
      73             : 
      74        4190 :   params.addParam<Real>("cement_mass", "cement mass (kg) per m^3");
      75        4190 :   params.addParam<Real>("aggregate_mass", "aggregate mass (kg) per m^3");
      76        4190 :   params.addParam<Real>("water_to_cement_ratio", "water to cement ratio");
      77        4190 :   params.addParam<Real>("aggregate_vol_fraction", "volumetric fraction of aggregates");
      78        4190 :   params.addParam<Real>("concrete_cure_time", "concrete curing time in days");
      79        4190 :   params.addParam<Real>("ref_density", "refernece density of porous media Kg/m^3");
      80        4190 :   params.addParam<Real>("ref_specific_heat", "reference specific heat of concrete J/Kg/0C");
      81        4190 :   params.addParam<Real>("ref_thermal_conductivity",
      82             :                         "concrete reference thermal conductivity (W/m/C)");
      83             : 
      84             :   // parameters for Bazant mositure transport model
      85        4190 :   params.addParam<Real>("D1", "empirical constants (m2/s)");
      86        4190 :   params.addParam<Real>("n", "empirical constants");
      87        4190 :   params.addParam<Real>("critical_relative_humidity", "empirical constants");
      88        4190 :   params.addParam<Real>("coupled_moisture_diffusivity_factor",
      89             :                         "coupling coefficient mositure transfer due to heat");
      90             : 
      91             :   // parameters for Mensi's moisture model
      92        4190 :   params.addParam<Real>("A", "empirical constants (m2/s)");
      93        4190 :   params.addParam<Real>("B", "empirical constants");
      94             : 
      95        4190 :   params.addCoupledVar("relative_humidity", "nonlinear variable name for rel. humidity");
      96        4190 :   params.addCoupledVar("temperature",
      97             :                        "nonlinear variable name for temperature in unit of Celscius");
      98        2095 :   params.addClassDescription("Material parameters for thermal and moisture transport in concrete.");
      99             : 
     100        2095 :   return params;
     101        2095 : }
     102             : 
     103        1623 : ConcreteThermalMoisture::ConcreteThermalMoisture(const InputParameters & parameters)
     104             :   : Material(parameters),
     105        1623 :     _thermal_model(getParam<MooseEnum>("thermal_model")),
     106        3246 :     _moisture_model(getParam<MooseEnum>("moisture_model")),
     107             : 
     108             :     // concrete mix proportion paramters
     109        5790 :     _cement_mass(isParamValid("cement_mass") ? getParam<Real>("cement_mass") : 0),
     110        5280 :     _aggregate_mass(isParamValid("aggregate_mass") ? getParam<Real>("aggregate_mass") : 0),
     111        5790 :     _water_to_cement(isParamValid("water_to_cement_ratio") ? getParam<Real>("water_to_cement_ratio")
     112             :                                                            : 0),
     113             : 
     114             :     // CONSTANT thermal trasport model parameters
     115        4788 :     _input_density(isParamValid("ref_density") ? getParam<Real>("ref_density") : 0),
     116        4788 :     _input_specific_heat(isParamValid("ref_specific_heat") ? getParam<Real>("ref_specific_heat")
     117             :                                                            : 0),
     118        1623 :     _input_thermal_conductivity(
     119        3690 :         isParamValid("ref_thermal_conductivity") ? getParam<Real>("ref_thermal_conductivity") : 0),
     120             : 
     121             :     // asce_1992 and kodur_2004 thermal model parameters
     122        3246 :     _aggregate_type(getParam<MooseEnum>("aggregate_type")),
     123             : 
     124             :     // Bazant moisture model parameters
     125        5082 :     _D1(isParamValid("D1") ? getParam<Real>("D1") : 0),
     126        3930 :     _n_power(isParamValid("n") ? getParam<Real>("n") : 0),
     127        3930 :     _Hc(isParamValid("critical_relative_humidity") ? getParam<Real>("critical_relative_humidity")
     128             :                                                    : 0),
     129        1623 :     _alfa_Dht(isParamValid("coupled_moisture_diffusivity_factor")
     130        3291 :                   ? getParam<Real>("coupled_moisture_diffusivity_factor")
     131             :                   : 0),
     132             : 
     133             :     // Mensi moisture model parameters
     134        4092 :     _A(isParamValid("A") ? getParam<Real>("A") : 0),
     135        4092 :     _B(isParamValid("B") ? getParam<Real>("B") : 0),
     136             : 
     137             :     // Xi moisture model parameters
     138        3246 :     _cement_type(getParam<MooseEnum>("cement_type")),
     139        3246 :     _aggregate_pore_type(getParam<MooseEnum>("aggregate_pore_type")),
     140        1623 :     _agg_vol_fraction(
     141        5112 :         isParamValid("aggregate_vol_fraction") ? getParam<Real>("aggregate_vol_fraction") : 0),
     142        5112 :     _cure_time(isParamValid("concrete_cure_time") ? getParam<Real>("concrete_cure_time") : 0),
     143             : 
     144             :     // material properties asscociated with coupled mositure/thermal transfer through concrete
     145        1623 :     _thermal_capacity(declareProperty<Real>("thermal_capacity")),
     146        1623 :     _thermal_conductivity(declareProperty<Real>("thermal_conductivity")),
     147        1623 :     _ca(declareProperty<Real>("heat_absorption_of_water")),
     148        1623 :     _cw(declareProperty<Real>("thermal_capacity_of_water")),
     149        1623 :     _moisture_capacity((_moisture_model == "Xi") ? &declareProperty<Real>("moisture_capacity")
     150             :                                                  : nullptr),
     151             : 
     152        1623 :     _Dh(declareProperty<Real>("humidity_diffusivity")),
     153        1623 :     _Dht(declareProperty<Real>("humidity_diffusivity_thermal")),
     154        1623 :     _eqv_age(declareProperty<Real>("eqv_age")),
     155        3246 :     _eqv_age_old(getMaterialPropertyOld<Real>("eqv_age")),
     156             : 
     157        1623 :     _has_rh(isCoupled("relative_humidity")),
     158        1623 :     _rh(_has_rh ? coupledValue("relative_humidity") : _zero),
     159             : 
     160        1623 :     _has_temperature(isCoupled("temperature")),
     161        3246 :     _temp(_has_temperature ? coupledValue("temperature") : _zero)
     162             : {
     163             :   Real parameter_error_check = true;
     164        3246 :   if (parameters.isParamSetByUser("thermal_capacity_model"))
     165             :   {
     166           0 :     _thermal_model = getParam<MooseEnum>("thermal_capacity_model");
     167           0 :     _input_density = isParamValid("ref_density_of_concrete")
     168           0 :                          ? getParam<Real>("ref_density_of_concrete")
     169             :                          : 2231.0;
     170           0 :     _input_specific_heat = isParamValid("ref_specific_heat_of_concrete")
     171           0 :                                ? getParam<Real>("ref_specific_heat_of_concrete")
     172             :                                : 1100.0;
     173           0 :     _input_thermal_conductivity = isParamValid("ref_thermal_conductivity_of_concrete")
     174           0 :                                       ? getParam<Real>("ref_thermal_conductivity_of_concrete")
     175             :                                       : 3.0;
     176           0 :     _aggregate_type = isParamValid("aggregate_type") ? getParam<MooseEnum>("aggregate_type") : 0;
     177             :     parameter_error_check = false;
     178             :   }
     179        1623 :   if (parameter_error_check)
     180             :   {
     181        1623 :     if (_thermal_model == "CONSTANT")
     182             :     {
     183         450 :       if (!parameters.isParamSetByUser("ref_density"))
     184           3 :         mooseError("For CONSTANT thermal_model, ref_density must be defined.");
     185         444 :       if (!parameters.isParamSetByUser("ref_specific_heat"))
     186           3 :         mooseError("For constant thermal transport model, ref_specific_heat must be defined.");
     187         438 :       if (!parameters.isParamSetByUser("ref_thermal_conductivity"))
     188           3 :         mooseError(
     189             :             "For constant thermal transport model, ref_thermal_conductivity must be defined.");
     190             :     }
     191        1398 :     else if (_thermal_model == "ASCE-1992")
     192             :     {
     193         174 :       if (!parameters.isParamSetByUser("aggregate_type"))
     194           3 :         mooseError("For ASCE-1992 thermal model, aggregate_type must be defined.");
     195             :     }
     196        1311 :     else if (_thermal_model == "KODUR-2004")
     197             :     {
     198        1518 :       if (!parameters.isParamSetByUser("aggregate_type"))
     199           3 :         mooseError("For KODUR-2004 thermal model, aggregate_type must be defined.");
     200             :     }
     201         552 :     else if (_thermal_model == "EUROCODE-2004")
     202             :     {
     203        1104 :       if (!parameters.isParamSetByUser("ref_density"))
     204           3 :         mooseError("For EUROCODE-2004 thermal model, ref_density must be defined.");
     205        1098 :       if (!parameters.isParamSetByUser("ref_specific_heat"))
     206           3 :         mooseError("For EUROCODE-2004 thermal model, ref_specific_heat must be defined.");
     207             :     }
     208             :   }
     209             : 
     210             :   parameter_error_check = true;
     211             : 
     212        3204 :   if (parameters.isParamSetByUser("moisture_diffusivity_model"))
     213             :   {
     214           0 :     _moisture_model = getParam<MooseEnum>("moisture_diffusivity_model");
     215           0 :     _cement_mass = isParamValid("cement_mass") ? getParam<Real>("cement_mass") : 354.0;
     216           0 :     _water_to_cement =
     217           0 :         isParamValid("water_to_cement_ratio") ? getParam<Real>("water_to_cement_ratio") : 0.43;
     218           0 :     _cement_type = isParamValid("cement_type") ? getParam<MooseEnum>("cement_type") : 0;
     219             :     _aggregate_pore_type =
     220           0 :         isParamValid("aggregate_pore_type") ? getParam<MooseEnum>("aggregate_pore_type") : 0;
     221           0 :     _cure_time = isParamValid("concrete_cure_time") ? getParam<Real>("concrete_cure_time") : 23.0;
     222           0 :     _aggregate_mass = isParamValid("aggregate_mass") ? getParam<Real>("aggregate_mass") : 1877;
     223           0 :     _agg_vol_fraction =
     224           0 :         isParamValid("aggregate_vol_fraction") ? getParam<Real>("aggregate_vol_fraction") : 0.7;
     225           0 :     _D1 = isParamValid("D1") ? getParam<Real>("D1") : 3.0e-10;
     226           0 :     _Hc = isParamValid("critical_relative_humidity") ? getParam<Real>("critical_relative_humidity")
     227             :                                                      : 0.75;
     228           0 :     _n_power = isParamValid("n") ? getParam<Real>("n") : 6.0;
     229           0 :     _alfa_Dht = isParamValid("coupled_moisture_diffusivity_factor")
     230           0 :                     ? getParam<Real>("coupled_moisture_diffusivity_factor")
     231             :                     : 1.0e-5;
     232           0 :     _A = isParamValid("A") ? getParam<Real>("A") : 3.8e-13;
     233           0 :     _B = isParamValid("B") ? getParam<Real>("B") : 0.05;
     234             :     parameter_error_check = false;
     235             :   }
     236             : 
     237        1602 :   if (parameter_error_check)
     238             :   {
     239        1602 :     if (_moisture_model == "Bazant")
     240             :     {
     241         648 :       if (!parameters.isParamSetByUser("D1"))
     242           3 :         mooseError("For Bazant moisture model, empirical constant D1 must be defined.");
     243         642 :       if (!parameters.isParamSetByUser("n"))
     244           3 :         mooseError("For Bazant moisture model, empirical constant n must be defined.");
     245         636 :       if (!parameters.isParamSetByUser("critical_relative_humidity"))
     246           3 :         mooseError("For Bazant moisture model, critical_relative_humidity must be defined.");
     247         630 :       if (!parameters.isParamSetByUser("coupled_moisture_diffusivity_factor"))
     248           3 :         mooseError(
     249             :             "For Bazant moisture model, coupled_moisture_diffusivity_factor must be defined.");
     250             :     }
     251        1278 :     else if (_moisture_model == "Mensi")
     252             :     {
     253         684 :       if (!parameters.isParamSetByUser("A"))
     254           3 :         mooseError("For Mensi moisture model, empirical constant A must be defined.");
     255         678 :       if (!parameters.isParamSetByUser("B"))
     256           3 :         mooseError("For Mensi moisture model, empirical constant B must be defined.");
     257         672 :       if (!parameters.isParamValid("cement_mass"))
     258           3 :         mooseError("For Mensi moisture model, cement_mass must be defined.");
     259         666 :       if (!parameters.isParamSetByUser("water_to_cement_ratio"))
     260           3 :         mooseError("For Mensi moisture model, water_to_cement_ratio must be defined.");
     261             :     }
     262         936 :     else if (_moisture_model == "Xi")
     263             :     {
     264        1872 :       if (!parameters.isParamSetByUser("cement_type"))
     265           3 :         mooseError("For Xi moisture model, cement_type must be defined.");
     266        1866 :       if (!parameters.isParamSetByUser("aggregate_pore_type"))
     267           3 :         mooseError("For Xi moisture model, aggregate_pore_type must be defined.");
     268        1860 :       if (!parameters.isParamSetByUser("aggregate_vol_fraction"))
     269           3 :         mooseError("For Xi moisture model, aggregate_vol_fraction must be defined.");
     270        1854 :       if (!parameters.isParamSetByUser("concrete_cure_time"))
     271           3 :         mooseError("For Xi moisture model, concrete_cure_time must be defined.");
     272        1848 :       if (!parameters.isParamValid("cement_mass"))
     273           3 :         mooseError("For Xi moisture model, cement_mass must be defined.");
     274        1842 :       if (!parameters.isParamSetByUser("aggregate_mass"))
     275           3 :         mooseError("For Xi moisture model, aggregate_mass must be defined.");
     276        1836 :       if (!parameters.isParamSetByUser("water_to_cement_ratio"))
     277           3 :         mooseError("For Xi moisture model, water_to_cement_ratio must be defined.");
     278         915 :       if (_water_to_cement < 0.5)
     279           3 :         mooseError("For Xi's moisture model water_to_cement_ratio must be >= 0.5 to use Xi's model "
     280             :                    "for moisture diffusivity");
     281             :     }
     282             :   }
     283        1554 : }
     284             : 
     285             : void
     286       11717 : ConcreteThermalMoisture::initQpStatefulProperties()
     287             : {
     288       11717 :   _eqv_age[_qp] = _cure_time;
     289       11717 : }
     290             : 
     291             : void
     292     1206229 : ConcreteThermalMoisture::computeProperties()
     293             : {
     294     3554244 :   for (unsigned int qp = 0; qp < _qrule->n_points(); ++qp)
     295             :   {
     296     2348027 :     Real T = _temp[qp];
     297     2348027 :     Real H = _rh[qp];
     298     2348027 :     if (H < 0.0)
     299             :       H = 0.0;
     300             : 
     301     2348027 :     Real ro = _input_density;
     302     2348027 :     Real Cv = _input_specific_heat;
     303             : 
     304             :     // compute concrete thermal capacity
     305     2348027 :     switch (_thermal_model)
     306             :     {
     307      501050 :       case 0: // CONSTANT
     308      501050 :         _thermal_capacity[qp] = ro * Cv;
     309      501050 :         _thermal_conductivity[qp] = _input_thermal_conductivity;
     310      501050 :         break;
     311       25564 :       case 1: // ASCE-1992 for normal strength concrete
     312             :         switch (_aggregate_type)
     313             :         {
     314       12782 :           case 0: // siliceous aggreagte
     315       12782 :             if (T < 20.0)
     316         161 :               _thermal_capacity[qp] = 1.8 * 1e6;
     317       12621 :             else if (T >= 20.0 && T < 200.0)
     318        2905 :               _thermal_capacity[qp] = (0.005 * T + 1.7) * 1.0e6;
     319        9716 :             else if (T >= 200.0 && T < 400.0)
     320        3234 :               _thermal_capacity[qp] = 2.7 * 1.0e6;
     321        6482 :             else if (T >= 400.0 && T < 500.0)
     322        1617 :               _thermal_capacity[qp] = (0.013 * T - 2.5) * 1.0e6;
     323        4865 :             else if (T >= 500.0 && T < 600.0)
     324        1617 :               _thermal_capacity[qp] = (10.5 - 0.013 * T) * 1.0e6;
     325        3248 :             else if (T >= 600.0)
     326        3248 :               _thermal_capacity[qp] = 2.7 * 1.0e6;
     327             : 
     328       12782 :             if (T < 20.0)
     329         161 :               _thermal_conductivity[qp] = 1.4875;
     330       12621 :             else if (T >= 20.0 && T < 800.0)
     331       12586 :               _thermal_conductivity[qp] = -0.000625 * T + 1.5;
     332          35 :             else if (T >= 800.0)
     333          35 :               _thermal_conductivity[qp] = 1.0;
     334             :             break;
     335             : 
     336       12782 :           case 1: // carbonate aggregate
     337       12782 :             if (T < 400.0)
     338        6153 :               _thermal_capacity[qp] = 2.566 * 1.0e6;
     339        6629 :             else if (T >= 400.0 && T < 410.0)
     340         168 :               _thermal_capacity[qp] = (0.1765 * T - 68.034) * 1.0e6;
     341        6461 :             else if (T >= 410.0 && T < 445.0)
     342         567 :               _thermal_capacity[qp] = (25.00671 - 0.05043 * T) * 1.0e6;
     343        5894 :             else if (T >= 445.0 && T < 500.0)
     344         924 :               _thermal_capacity[qp] = 2.566 * 1.0e6;
     345        4970 :             else if (T >= 500.0 && T < 635.0)
     346        2226 :               _thermal_capacity[qp] = (0.01603 * T - 5.44881) * 1.0e6;
     347        2744 :             else if (T >= 635.0 && T < 715.0)
     348        1323 :               _thermal_capacity[qp] = (0.16635 * T - 100.90225) * 1.0e6;
     349        1421 :             else if (T >= 715.0 && T < 785.0)
     350        1155 :               _thermal_capacity[qp] = (176.07343 - 0.22103 * T) * 1.0e6;
     351         266 :             else if (T >= 785.0)
     352         266 :               _thermal_capacity[qp] = 2.566 * 1.0e6;
     353             : 
     354       12782 :             if (T < 293.0)
     355        4389 :               _thermal_conductivity[qp] = 1.355;
     356             :             else
     357        8393 :               _thermal_conductivity[qp] = -0.001241 * T + 1.7162;
     358             :             break;
     359             : 
     360           0 :           default:
     361           0 :             mooseError("Unknown aggregate types");
     362             :             break;
     363             :         }
     364             :         break;
     365             : 
     366     1807620 :       case 2: // KODUR-2004  for high strength concrere
     367             :         switch (_aggregate_type)
     368             :         {
     369     1793836 :           case 0: // siliceous aggreagte
     370     1793836 :             if (T < 20.0)
     371        3636 :               _thermal_capacity[qp] = 1.8 * 1.0e6;
     372     1790200 :             else if (T >= 20.0 && T < 200.0)
     373     1688835 :               _thermal_capacity[qp] = (0.005 * T + 1.7) * 1.0e6;
     374      101365 :             else if (T >= 200.0 && T < 400.0)
     375       46425 :               _thermal_capacity[qp] = 2.7 * 1.0e6;
     376       54940 :             else if (T >= 400.0 && T < 500.0)
     377       23217 :               _thermal_capacity[qp] = (0.013 * T - 2.5) * 1.0e6;
     378       31723 :             else if (T >= 500.0 && T < 600.0)
     379       23229 :               _thermal_capacity[qp] = (10.5 - 0.013 * T) * 1.0e6;
     380        8494 :             else if (T >= 600.0 && T < 635.0)
     381        8106 :               _thermal_capacity[qp] = 2.7 * 1.0e6;
     382         388 :             else if (T > 635.0)
     383           3 :               mooseError("Temperature outside of the range for the KODUR-2004 thermal model");
     384             : 
     385     1793833 :             if (T < 20.0)
     386        3636 :               _thermal_conductivity[qp] = 1.4875;
     387     1790197 :             else if (T >= 20.0)
     388     1790197 :               _thermal_conductivity[qp] = -0.000625 * T + 1.5;
     389             :             break;
     390             : 
     391       13784 :           case 1: // carbonate aggregate
     392       13784 :             if (T < 400.0)
     393        5280 :               _thermal_capacity[qp] = 2.45 * 1.0e6;
     394        8504 :             else if (T >= 400.0 && T < 475.0)
     395        1059 :               _thermal_capacity[qp] = (0.026 * T - 12.85) * 1.0e6;
     396        7445 :             else if (T >= 475.0 && T < 650.0)
     397        2469 :               _thermal_capacity[qp] = (0.0143 * T - 6.295) * 1.0e6;
     398        4976 :             else if (T >= 650.0 && T < 735.0)
     399        1203 :               _thermal_capacity[qp] = (0.1894 * T - 120.11) * 1.0e6;
     400        3773 :             else if (T >= 735.0 && T < 800.0)
     401         924 :               _thermal_capacity[qp] = (-0.263 * T + 212.4) * 1.0e6;
     402        2849 :             else if (T >= 800.0 && T <= 1000.0)
     403        2846 :               _thermal_capacity[qp] = 2.00 * 1.0e6;
     404           3 :             else if (T > 1000.0)
     405           3 :               mooseError("Temperature outside of the range for the KODUR-2004 thermal model");
     406             : 
     407       13781 :             if (T < 293.0)
     408        3765 :               _thermal_conductivity[qp] = 1.355;
     409             :             else
     410       10016 :               _thermal_conductivity[qp] = -0.001241 * T + 1.7162;
     411             :             break;
     412             : 
     413           0 :           default:
     414           0 :             mooseError("Unknown aggregate types");
     415             :             break;
     416             :         }
     417             :         break;
     418             : 
     419       13793 :       case 3: // EUROCODE-2004 for both normal ans high strength concrete
     420             :         // compute density of concrete
     421       13793 :         if (T < 115.0)
     422             :           ro = _input_density;
     423       12737 :         else if (T >= 115.0 && T < 200.0)
     424         996 :           ro = _input_density * (1.0 - 0.02 * (T - 115.0) / 85.0);
     425       11741 :         else if (T >= 200.0 && T < 400.0)
     426        2334 :           ro = _input_density * (0.98 - 0.03 * (T - 200.0) / 200.0);
     427        9407 :         else if (T >= 400.0 && T < 1200.0)
     428        9404 :           ro = _input_density * (0.95 - 0.07 * (T - 400.0) / 800.0);
     429           3 :         else if (T >= 1200.0)
     430           3 :           mooseError("Temperature outside of the range for the EUROCODE-2004 thermal model");
     431             : 
     432       13790 :         if (T < 100.0)
     433             :           Cv = 900.0;
     434       12911 :         else if (T >= 100.0 && T < 200.0)
     435        1173 :           Cv = 900.0 + (T - 100.0);
     436       11738 :         else if (T >= 200.0 && T < 400.0)
     437        2334 :           Cv = 1000.0 + (T - 200.0) / 2.0;
     438        9404 :         else if (T >= 400.0 && T < 1200.0)
     439             :           Cv = 1100.0;
     440             : 
     441       13790 :         _thermal_capacity[qp] = ro * Cv;
     442             : 
     443       13790 :         if (T < 20.0)
     444           6 :           _thermal_conductivity[qp] = 1.642218;
     445       13784 :         else if (T >= 20.0 && T <= 1200.0)
     446             :         {
     447       13784 :           const Real k_up = 2.0 - 0.2451 * (T / 100.0) + 0.0107 * std::pow(T / 100.0, 2.0);
     448       13784 :           const Real k_low = 1.36 - 0.136 * (T / 100.0) + 0.0057 * std::pow(T / 100.0, 2.0);
     449       13784 :           _thermal_conductivity[qp] = (k_up + k_low) / 2.0; // average bewteen upper and lower
     450             :                                                             // bounds
     451             :         }
     452             :         break;
     453             : 
     454           0 :       default:
     455           0 :         mooseError("Unknown thermal model");
     456             :         break;
     457             :     }
     458             : 
     459             :     // compute moisture diffusivity
     460     2348018 :     switch (_moisture_model)
     461             :     {
     462      526620 :       case 0: // Bazant
     463             :       {
     464     1053240 :         if (_pars.isParamSetByUser("moisture_model") && T < 25.0)
     465           3 :           mooseError("Temperature outside of the range for the Bazant moisture model");
     466             :         // adsorption heat of water vapor
     467             :         Real adsorption_heat_water =
     468             :             60 * 1000 / 0.018; // an average value (60 kJ/mol) estimated for different cement paste
     469             :                                // by Poyet and Charles (2009)
     470             :         Real density_water = 1000;       // kg/m3
     471             :         Real heat_capacity_water = 4180; // J/(kg-C)
     472      526617 :         _ca[qp] = adsorption_heat_water;
     473      526617 :         _cw[qp] = density_water * heat_capacity_water;
     474             : 
     475      526617 :         if (T <= 95.0)
     476             :         {
     477      365014 :           Real alfa_T = 0.05 + 0.95 / 70 * (T - 25); // Bazant and Thonguthai 1979
     478             :           Real f1_h =
     479      365014 :               alfa_T + (1 - alfa_T) / (1.0 + std::pow(((1.0 - H) / (1 - _Hc)),
     480      365014 :                                                       _n_power)); // Bazant and Thonguthai 1979
     481      365014 :           Real f2_T = std::exp(
     482      365014 :               2700.0 * (1.0 / (25.0 + 273.15) - 1.0 / (T + 273.15))); // Bazant and Thonguthai 1979
     483      365014 :           _Dh[qp] = _D1 * f1_h * f2_T;
     484             :         }
     485             :         else
     486             :         {
     487             :           Real f2_95 = std::exp(
     488             :               2700.0 * (1.0 / (25.0 + 273.15) - 1.0 / (95 + 273.15))); // Bazant and Thonguthai 1979
     489             :           Real f3_T =
     490      161603 :               std::exp((T - 95.0) / (0.881 + 0.214 * (T - 95.0))); // Bazant and Thonguthai 1979
     491      161603 :           _Dh[qp] = _D1 * f2_95 * f3_T;                            // Bazant and Thonguthai 1979
     492             :         }
     493             :         // compute the coupled mositure diffusivity due to thermal gradient
     494      526617 :         _Dht[qp] = _alfa_Dht * _Dh[qp];
     495      526617 :         break;
     496             :       }
     497             : 
     498      867130 :       case 1: // Mensi
     499             :       {
     500      867130 :         Real initial_water_content = _water_to_cement * _cement_mass; // kg/m3
     501      867130 :         _Dh[qp] = _A * std::exp(_B * initial_water_content);
     502      867130 :         _ca[qp] = 0.;
     503      867130 :         _cw[qp] = 0.;
     504      867130 :         _Dht[qp] = 0.;
     505      867130 :         break;
     506             :       }
     507             : 
     508      954268 :       case 2: // Xi
     509             :       {
     510             :         // compute equivalent concrete age
     511      954268 :         _eqv_age[qp] =
     512      954268 :             _eqv_age_old[qp] + _dt / 86400.0 * 1.0 / (1.0 + std::pow((7.5 - 7.5 * H), 4.0));
     513             : 
     514      954268 :         Real C = std::exp(855.0 / (T + 273.15));
     515             :         Real N_ct = 1.1;
     516             :         switch (_cement_type)
     517             :         {
     518             :           case 0: // cement_type = 1
     519             :             N_ct = 1.1;
     520             :             break;
     521             :           case 1: // cement_type = 2
     522             :             N_ct = 1.0;
     523             :             break;
     524             :           case 2: // cement_type = 3
     525             :             N_ct = 1.15;
     526             :             break;
     527             :           case 3: // cement_type = 4
     528             :             N_ct = 1.5;
     529             :             break;
     530           0 :           default: // cement_type = Unknown
     531           0 :             mooseError("Unknown cement type in mositure capacity calculations");
     532             :             break;
     533             :         }
     534             : 
     535             :         Real N_wc = 0.9;
     536      954268 :         if (_water_to_cement < 0.3)
     537             :           N_wc = 0.99;
     538      954268 :         else if (_water_to_cement >= 0.3 && _water_to_cement <= 0.7)
     539      954268 :           N_wc = 0.33 + 2.2 * _water_to_cement;
     540             :         else
     541             :           N_wc = 1.87;
     542             : 
     543             :         Real N_te = 5.5;
     544      954268 :         if (_eqv_age[qp] >= 5)
     545      954268 :           N_te = 2.5 + 15.0 / _eqv_age[qp];
     546             : 
     547      954268 :         Real n = N_te * N_wc * N_ct * 1.0;
     548             : 
     549      954268 :         Real k = ((1.0 - 1.0 / n) * C - 1.0) / (C - 1.0);
     550      954268 :         if (k < 0.0)
     551             :           k = 0.0;
     552      954268 :         else if (k > 1.0)
     553             :           k = 1.0;
     554             : 
     555             :         Real V_ct = 0.9;
     556             :         switch (_cement_type)
     557             :         {
     558             :           case 0: // cement_type = 1
     559             :             V_ct = 0.9;
     560             :             break;
     561             :           case 1: // cement_type = 2
     562             :             V_ct = 1.0;
     563             :             break;
     564             :           case 2: // cement_type = 3
     565             :             V_ct = 0.85;
     566             :             break;
     567             :           case 3: // cement_type = 4
     568             :             V_ct = 0.6;
     569             :             break;
     570           0 :           default: // cement_type = Unknown
     571           0 :             mooseError("Unknown cement type in mositure capacity calculations");
     572             :             break;
     573             :         }
     574             : 
     575             :         Real V_wc = 0.985;
     576      954268 :         if (_water_to_cement < 0.3)
     577             :           V_wc = 0.985;
     578      954268 :         else if (_water_to_cement >= 0.3 && _water_to_cement <= 0.7)
     579      954268 :           V_wc = 0.85 + 0.45 * _water_to_cement;
     580             :         else
     581             :           V_wc = 1.165;
     582             : 
     583             :         Real V_te = 0.024;
     584      954268 :         if (_eqv_age[qp] >= 5)
     585      954268 :           V_te = 0.068 - 0.22 / _eqv_age[qp];
     586             : 
     587             :         Real monolayer_factor = 1.0;
     588      954268 :         Real Vm = V_te * V_wc * V_ct *
     589             :                   monolayer_factor; // here 1.0 is a factor is to account for the influence of
     590             :                                     // temperature in the calculation of monolayer capacity.
     591             : 
     592      954268 :         Real W_cement = C * k * Vm * H / (1.0 - k * H) / (1.0 + (C - 1.0) * k * H);
     593             : 
     594      954268 :         Real dWdH_cement = (C * k * Vm + W_cement * k * (1.0 + (C - 1.0) * k * H) -
     595      954268 :                             W_cement * k * (1.0 - k * H) * (C - 1.0)) /
     596             :                            (1.0 - k * H) / (1.0 + (C - 1.0) * k * H);
     597             : 
     598             :         // compute mositure capacity dw/dH for aggregates
     599             :         Real n_agg = 1.5;
     600             :         switch (_aggregate_pore_type)
     601             :         {
     602             :           case 0: // aggregate_pore_type = dense
     603             :             n_agg = 1.5;
     604             :             break;
     605       51128 :           case 1: // aggregate_pore_type = porous
     606             :             n_agg = 2.0;
     607       51128 :             break;
     608           0 :           default:
     609           0 :             mooseError("Unknown aggregate pore structure");
     610             :             break;
     611             :         }
     612             : 
     613      954268 :         n = 4.063 * n_agg;
     614      954268 :         k = ((1.0 - 1.0 / n) * C - 1.0) / (C - 1.0);
     615      954268 :         if (k < 0.0)
     616             :           k = 0.0;
     617      954268 :         else if (k > 1.0)
     618             :           k = 1.0;
     619             : 
     620             :         Real V_agg = 0.05;
     621             :         switch (_aggregate_pore_type)
     622             :         {
     623             :           case 0: // aggregate_pore_type = dense
     624             :             V_agg = 0.05;
     625             :             break;
     626       51128 :           case 1: // aggregate_pore_type = porous
     627             :             V_agg = 0.10;
     628       51128 :             break;
     629           0 :           default:
     630           0 :             mooseError("Unknown aggregate pore structure");
     631             :             break;
     632             :         }
     633             : 
     634      954268 :         Vm = 0.0647 * V_agg;
     635             : 
     636      954268 :         Real W_agg = C * k * Vm * H / (1.0 - k * H) / (1.0 + (C - 1.0) * k * H);
     637      954268 :         Real dWdH_agg = (C * k * Vm + W_agg * k * (1.0 + (C - 1.0) * k * H) -
     638      954268 :                          W_agg * k * (1.0 - k * H) * (C - 1.0)) /
     639             :                         (1.0 - k * H) / (1.0 + (C - 1.0) * k * H);
     640             : 
     641             :         // compute weight percentages of agrregates and cement paste
     642      954268 :         Real _f_agg = _aggregate_mass / (_aggregate_mass + _cement_mass);
     643      954268 :         Real _f_cp = _cement_mass / (_aggregate_mass + _cement_mass);
     644             : 
     645             :         // compute combined dW/dH of concrete
     646      954268 :         (*_moisture_capacity)[qp] = (_f_agg * dWdH_agg + _f_cp * dWdH_cement);
     647             : 
     648             :         // moisture diffusivity calculations
     649      954268 :         Real gi = _agg_vol_fraction;
     650      954268 :         Real wc = _water_to_cement;
     651      954268 :         Real alfa_h = 1.05 - 3.8 * wc + 3.56 * std::pow(wc, 2.0);    // cm2/day
     652      954268 :         Real betta_h = -14.4 + 50.4 * wc - 41.8 * std::pow(wc, 2.0); // cm2/day
     653      954268 :         Real gamma_h = 31.3 - 136.0 * wc + 162.0 * std::pow(wc, 2.0);
     654      954268 :         Real power1 = std::pow(10.0, gamma_h * (H - 1));
     655      954268 :         Real power2 = std::pow(2.0, -1.0 * power1);
     656             : 
     657      954268 :         Real Dhcp = alfa_h + betta_h * (1.0 - power2);  // cm2/day
     658      954268 :         _Dh[qp] = Dhcp * (1 + gi / ((1 - gi) / 3 - 1)); // cm2/day
     659      954268 :         _Dh[qp] = _Dh[qp] * 1e-4 / 86400;               // m2/s
     660             : 
     661      954268 :         _ca[qp] = 0.;
     662      954268 :         _cw[qp] = 0.;
     663      954268 :         _Dht[qp] = 0.;
     664      954268 :         break;
     665             :       }
     666             : 
     667           0 :       default:
     668             :       {
     669           0 :         mooseError("Unknown moisture diffusivity model");
     670             :         break;
     671             :       }
     672             :     }
     673             :   }
     674     1206217 : }

Generated by: LCOV version 1.14