void PorousFlow2PhasePS::initQpStatefulProperties() { PorousFlowVariableBase::initQpStatefulProperties(); buildQpPPSS(); }
void PorousFlow1PhaseP::computeQpProperties() { // size stuff correctly and prepare the derivative matrices with zeroes PorousFlowVariableBase::computeQpProperties(); buildQpPPSS(); const Real dseff = dEffectiveSaturation_dP(_porepressure_var[_qp]); if (!_nodal_material) { (*_gradp_qp)[_qp][0] = _gradp_qp_var[_qp]; (*_grads_qp)[_qp][0] = dseff * _gradp_qp_var[_qp]; } // _porepressure is only dependent on _porepressure, and its derivative is 1 if (_dictator.isPorousFlowVariable(_porepressure_varnum)) { // _porepressure is a PorousFlow variable _dporepressure_dvar[_qp][0][_p_var_num] = 1.0; _dsaturation_dvar[_qp][0][_p_var_num] = dseff; if (!_nodal_material) { (*_dgradp_qp_dgradv)[_qp][0][_p_var_num] = 1.0; (*_dgrads_qp_dgradv)[_qp][0][_p_var_num] = dseff; (*_dgrads_qp_dv)[_qp][0][_p_var_num] = d2EffectiveSaturation_dP2(_porepressure_var[_qp]) * _gradp_qp_var[_qp]; } } }
void PorousFlow2PhasePS::computeQpProperties() { PorousFlowVariableBase::computeQpProperties(); buildQpPPSS(); // _porepressure depends on _phase0_porepressure, and its derivative is 1 if (_dictator.isPorousFlowVariable(_phase0_porepressure_varnum)) { // _phase0_porepressure is a PorousFlow variable for (unsigned phase = 0; phase < _num_phases; ++phase) { _dporepressure_nodal_dvar[_qp][phase][_pvar] = 1.0; _dporepressure_qp_dvar[_qp][phase][_pvar] = 1.0; _dgradp_qp_dgradv[_qp][phase][_pvar] = 1.0; } } /// Calculate the capillary pressure and derivatives wrt saturation const Real dpc_nodal = dCapillaryPressure_dS(_phase1_saturation_nodal[_qp]); const Real dpc_qp = dCapillaryPressure_dS(_phase1_saturation_qp[_qp]); const Real d2pc_qp = d2CapillaryPressure_dS2(_phase1_saturation_qp[_qp]); // _saturation is only dependent on _phase1_saturation, and its derivative is +/- 1 if (_dictator.isPorousFlowVariable(_phase1_saturation_varnum)) { // _phase1_saturation is a porflow variable _dsaturation_nodal_dvar[_qp][0][_svar] = -1.0; _dsaturation_nodal_dvar[_qp][1][_svar] = 1.0; _dsaturation_qp_dvar[_qp][0][_svar] = -1.0; _dsaturation_qp_dvar[_qp][1][_svar] = 1.0; _dgrads_qp_dgradv[_qp][0][_svar] = -1.0; _dgrads_qp_dgradv[_qp][1][_svar] = 1.0; /// _phase1_porepressure depends on saturation through the capillary pressure function _dporepressure_nodal_dvar[_qp][1][_svar] = - dpc_nodal; _dporepressure_qp_dvar[_qp][1][_svar] = - dpc_qp; _dgradp_qp_dv[_qp][1][_svar] = - d2pc_qp * _grads_qp[_qp][1]; _dgradp_qp_dgradv[_qp][1][_svar] = - dpc_qp; } // _temperature is only dependent on temperature, and its derivative is = 1 if (_dictator.isPorousFlowVariable(_temperature_varnum)) { // _phase0_temperature is a PorousFlow variable for (unsigned int phase = 0; phase < _num_phases; ++phase) { _dtemperature_nodal_dvar[_qp][phase][_tvar] = 1.0; _dtemperature_qp_dvar[_qp][phase][_tvar] = 1.0; } } }
void PorousFlow2PhasePP::initQpStatefulProperties() { PorousFlowVariableBase::initQpStatefulProperties(); buildQpPPSS(); /* * the derivatives of porepressure with respect to porepressure * remain fixed (at unity) throughout the simulation */ // prepare the derivative matrix with zeroes for (unsigned phase = 0; phase < _num_phases; ++phase) { _dporepressure_nodal_dvar[_qp][phase].assign(_num_pf_vars, 0.0); _dporepressure_qp_dvar[_qp][phase].assign(_num_pf_vars, 0.0); _dgradp_qp_dgradv[_qp][phase].assign(_num_pf_vars, 0.0); _dgradp_qp_dv[_qp][phase].assign(_num_pf_vars, RealGradient()); } if (_dictator_UO.isPorousFlowVariable(_phase0_porepressure_varnum)) { // _phase0_porepressure is a PorousFlow variable _dporepressure_nodal_dvar[_qp][0][_p0var] = 1.0; _dporepressure_qp_dvar[_qp][0][_p0var] = 1.0; _dgradp_qp_dgradv[_qp][0][_p0var] = 1.0; } if (_dictator_UO.isPorousFlowVariable(_phase1_porepressure_varnum)) { // _phase1_porepressure is a PorousFlow variable _dporepressure_nodal_dvar[_qp][1][_p1var] = 1.0; _dporepressure_qp_dvar[_qp][1][_p1var] = 1.0; _dgradp_qp_dgradv[_qp][1][_p1var] = 1.0; } // prepare the derivative matrix with zeroes for (unsigned phase = 0; phase < _num_phases; ++phase) { _dtemperature_nodal_dvar[_qp][phase].assign(_num_pf_vars, 0.0); _dtemperature_qp_dvar[_qp][phase].assign(_num_pf_vars, 0.0); } // _temperature is only dependent on _temperature, and its derivative is = 1 if (_dictator_UO.isPorousFlowVariable(_temperature_varnum)) { // _phase0_temperature is a porflow variable _dtemperature_nodal_dvar[_qp][0][_tvar] = 1.0; _dtemperature_nodal_dvar[_qp][1][_tvar] = 1.0; _dtemperature_qp_dvar[_qp][0][_tvar] = 1.0; _dtemperature_qp_dvar[_qp][1][_tvar] = 1.0; } }
void PorousFlow2PhasePS::computeQpProperties() { // size stuff correctly and prepare the derivative matrices with zeroes PorousFlowVariableBase::computeQpProperties(); const Real seff = buildQpPPSS(); const Real dpc = dCapillaryPressure_dS(seff) * _dseff_ds; if (!_nodal_material) { (*_grads_qp)[_qp][0] = -_phase1_grads_qp[_qp]; (*_grads_qp)[_qp][1] = _phase1_grads_qp[_qp]; (*_gradp_qp)[_qp][0] = _phase0_gradp_qp[_qp]; (*_gradp_qp)[_qp][1] = _phase0_gradp_qp[_qp] + dpc * (*_grads_qp)[_qp][1]; } // _porepressure depends on _phase0_porepressure, and its derivative is 1 if (_dictator.isPorousFlowVariable(_phase0_porepressure_varnum)) { // _phase0_porepressure is a PorousFlow variable for (unsigned phase = 0; phase < _num_phases; ++phase) { _dporepressure_dvar[_qp][phase][_pvar] = 1.0; if (!_nodal_material) (*_dgradp_qp_dgradv)[_qp][phase][_pvar] = 1.0; } } // _saturation is only dependent on _phase1_saturation, and its derivative is +/- 1 if (_dictator.isPorousFlowVariable(_phase1_saturation_varnum)) { // _phase1_saturation is a porflow variable // _phase1_porepressure depends on saturation through the capillary pressure function _dsaturation_dvar[_qp][0][_svar] = -1.0; _dsaturation_dvar[_qp][1][_svar] = 1.0; _dporepressure_dvar[_qp][1][_svar] = dpc; if (!_nodal_material) { (*_dgrads_qp_dgradv)[_qp][0][_svar] = -1.0; (*_dgrads_qp_dgradv)[_qp][1][_svar] = 1.0; const Real d2pc_qp = d2CapillaryPressure_dS2(seff) * _dseff_ds * _dseff_ds; (*_dgradp_qp_dv)[_qp][1][_svar] = d2pc_qp * (*_grads_qp)[_qp][1]; (*_dgradp_qp_dgradv)[_qp][1][_svar] = dpc; } } }
void PorousFlow2PhasePP::computeQpProperties() { buildQpPPSS(); // prepare the derivative matrix with zeroes for (unsigned phase = 0; phase < _num_phases; ++phase) { _dsaturation_nodal_dvar[_qp][phase].assign(_num_pf_vars, 0.0); _dsaturation_qp_dvar[_qp][phase].assign(_num_pf_vars, 0.0); _dgrads_qp_dgradv[_qp][phase].assign(_num_pf_vars, 0.0); _dgrads_qp_dv[_qp][phase].assign(_num_pf_vars, RealGradient()); } const Real pc_nodal = _phase0_porepressure_nodal[_qp] - _phase1_porepressure_nodal[_qp]; // this is <= 0 const Real dseff_nodal = dEffectiveSaturation_dP(pc_nodal); // d(seff)/d(pc) const Real pc_qp = _phase0_porepressure_qp[_qp] - _phase1_porepressure_qp[_qp]; // this is <= 0 const Real dseff_qp = dEffectiveSaturation_dP(pc_qp); // d(seff_qp)/d(pc_qp) const Real d2seff_qp = d2EffectiveSaturation_dP2(pc_qp); // d^2(seff_qp)/d(pc_qp)^2 if (_dictator_UO.isPorousFlowVariable(_phase0_porepressure_varnum)) { _dsaturation_nodal_dvar[_qp][0][_p0var] = dseff_nodal; _dsaturation_qp_dvar[_qp][0][_p0var] = dseff_qp; _dgrads_qp_dgradv[_qp][0][_p0var] = dseff_qp; _dgrads_qp_dv[_qp][0][_p0var] = d2seff_qp * (_phase0_gradp_qp[_qp] - _phase1_gradp_qp[_qp]); _dsaturation_nodal_dvar[_qp][1][_p0var] = - dseff_nodal; _dsaturation_qp_dvar[_qp][1][_p0var] = - dseff_qp; _dgrads_qp_dgradv[_qp][1][_p0var] = - dseff_qp; _dgrads_qp_dv[_qp][1][_p0var] = - d2seff_qp * (_phase0_gradp_qp[_qp] - _phase1_gradp_qp[_qp]); } if (_dictator_UO.isPorousFlowVariable(_phase1_porepressure_varnum)) { _dsaturation_nodal_dvar[_qp][0][_p1var] = - dseff_nodal; _dsaturation_qp_dvar[_qp][0][_p1var] = - dseff_qp; _dgrads_qp_dgradv[_qp][0][_p1var] = - dseff_qp; _dgrads_qp_dv[_qp][0][_p1var] = - d2seff_qp * (_phase0_gradp_qp[_qp] - _phase1_gradp_qp[_qp]); _dsaturation_nodal_dvar[_qp][1][_p1var] = dseff_nodal; _dsaturation_qp_dvar[_qp][1][_p1var] = dseff_qp; _dgrads_qp_dgradv[_qp][1][_p1var] = dseff_qp; _dgrads_qp_dv[_qp][1][_p1var] = d2seff_qp * (_phase0_gradp_qp[_qp] - _phase1_gradp_qp[_qp]); } }
void PorousFlow1PhaseFullySaturated::computeQpProperties() { // Size vectors correctly and prepare the derivative matrices with zeroes PorousFlowVariableBase::computeQpProperties(); buildQpPPSS(); if (!_nodal_material) (*_gradp_qp)[_qp][0] = _gradp_qp_var[_qp]; // _porepressure is only dependent on _porepressure, and its derivative is 1 if (_dictator.isPorousFlowVariable(_porepressure_varnum)) { // _porepressure is a PorousFlow variable _dporepressure_dvar[_qp][0][_p_var_num] = 1.0; if (!_nodal_material) (*_dgradp_qp_dgradv)[_qp][0][_p_var_num] = 1.0; } }
void PorousFlow2PhasePP::computeQpProperties() { // size stuff correctly and prepare the derivative matrices with zeroes PorousFlowVariableBase::computeQpProperties(); const Real pc = buildQpPPSS(); const Real dseff = dEffectiveSaturation_dP(pc); // d(seff)/d(pc) if (!_nodal_material) { (*_gradp_qp)[_qp][0] = _phase0_gradp_qp[_qp]; (*_gradp_qp)[_qp][1] = _phase1_gradp_qp[_qp]; (*_grads_qp)[_qp][0] = dseff * ((*_gradp_qp)[_qp][0] - (*_gradp_qp)[_qp][1]); (*_grads_qp)[_qp][1] = -(*_grads_qp)[_qp][0]; } // the derivatives of porepressure with respect to porepressure // remain fixed (at unity) throughout the simulation if (_dictator.isPorousFlowVariable(_phase0_porepressure_varnum)) { _dporepressure_dvar[_qp][0][_p0var] = 1.0; if (!_nodal_material) (*_dgradp_qp_dgradv)[_qp][0][_p0var] = 1.0; } if (_dictator.isPorousFlowVariable(_phase1_porepressure_varnum)) { _dporepressure_dvar[_qp][1][_p1var] = 1.0; if (!_nodal_material) (*_dgradp_qp_dgradv)[_qp][1][_p1var] = 1.0; } if (_dictator.isPorousFlowVariable(_phase0_porepressure_varnum)) { _dsaturation_dvar[_qp][0][_p0var] = dseff; _dsaturation_dvar[_qp][1][_p0var] = -dseff; } if (_dictator.isPorousFlowVariable(_phase1_porepressure_varnum)) { _dsaturation_dvar[_qp][0][_p1var] = -dseff; _dsaturation_dvar[_qp][1][_p1var] = dseff; } if (!_nodal_material) { const Real d2seff_qp = d2EffectiveSaturation_dP2(pc); // d^2(seff_qp)/d(pc_qp)^2 if (_dictator.isPorousFlowVariable(_phase0_porepressure_varnum)) { (*_dgrads_qp_dgradv)[_qp][0][_p0var] = dseff; (*_dgrads_qp_dv)[_qp][0][_p0var] = d2seff_qp * (_phase0_gradp_qp[_qp] - _phase1_gradp_qp[_qp]); (*_dgrads_qp_dgradv)[_qp][1][_p0var] = -dseff; (*_dgrads_qp_dv)[_qp][1][_p0var] = -d2seff_qp * (_phase0_gradp_qp[_qp] - _phase1_gradp_qp[_qp]); } if (_dictator.isPorousFlowVariable(_phase1_porepressure_varnum)) { (*_dgrads_qp_dgradv)[_qp][0][_p1var] = -dseff; (*_dgrads_qp_dv)[_qp][0][_p1var] = -d2seff_qp * (_phase0_gradp_qp[_qp] - _phase1_gradp_qp[_qp]); (*_dgrads_qp_dgradv)[_qp][1][_p1var] = dseff; (*_dgrads_qp_dv)[_qp][1][_p1var] = d2seff_qp * (_phase0_gradp_qp[_qp] - _phase1_gradp_qp[_qp]); } } }
void PorousFlow1PhaseFullySaturated::initQpStatefulProperties() { PorousFlowVariableBase::initQpStatefulProperties(); buildQpPPSS(); }