323 m_spFractManager->get_layer_sides
325 m_numFractCo, m_innerFractSide, m_innerFractSideIdx, m_innerSideCo,
326 m_outerFractSide, m_outerFractSideIdx, m_outerSideCo,
329 UG_CATCH_THROW(
"FractTHF_FV1: Cannot find orientation of a fracture element.");
335 for (
size_t co = 0; co < m_numFractCo; co++)
336 vSideCornerCoords [co] = vCornerCoords [m_innerSideCo [co]];
337 m_pFractGeo->update (m_innerFractSide, vSideCornerCoords, &(this->
subset_handler()));
339 UG_CATCH_THROW(
"FractTHF_FV1: Cannot update the Finite Volume Geometry for a fracture element.");
340 size_t numSCVFip = m_pFractGeo->num_scvf_ips ();
347 = ReferenceMappingProvider::get<low_dim, dim> (m_innerFractSide->reference_object_id ());
348 for (
size_t co = 0; co < m_numFractCo; co++)
349 vSideLocCornerCoords [co] = rRefElem.corner (m_innerSideCo [co]);
350 rMapping.
update (vSideLocCornerCoords);
352 rMapping.
local_to_global (m_elem_loc_coe, *(m_pFractGeo->coe_local ()));
353 rMapping.
local_to_global (m_elem_loc_scvf, m_pFractGeo->scvf_local_ips (), numSCVFip);
355 UG_CATCH_THROW(
"FractTHF_FV1: Cannot transform local side coordinates to local element coordinates in a fracture element.");
358 m_imDensityIP.template set_local_ips<dim> (m_elem_loc_scvf, numSCVFip);
359 m_imViscosityIP.template set_local_ips<dim> (m_elem_loc_scvf, numSCVFip);
361 m_imAperture.template set_local_ips<dim> (&m_elem_loc_coe, 1);
362 m_imPorosity.template set_local_ips<dim> (&m_elem_loc_coe, 1);
363 m_imFractPermeability.template set_local_ips<dim> (&m_elem_loc_coe, 1);
364 m_imOrthoPermeability.template set_local_ips<dim> (&m_elem_loc_coe, 1);
365 m_imFractDiffusion.template set_local_ips<dim> (&m_elem_loc_coe, 1);
366 m_imOrthoDiffusion.template set_local_ips<dim> (&m_elem_loc_coe, 1);
367 m_imFractThermCond.template set_local_ips<dim> (&m_elem_loc_coe, 1);
368 m_imOrthoThermCond.template set_local_ips<dim> (&m_elem_loc_coe, 1);
372 m_imDensityIP.set_global_ips (vSCVFip, numSCVFip);
373 m_imViscosityIP.set_global_ips (vSCVFip, numSCVFip);
376 m_imAperture.set_global_ips (coe_global, 1);
377 m_imPorosity.set_global_ips (coe_global, 1);
378 m_imFractPermeability.set_global_ips (coe_global, 1);
379 m_imOrthoPermeability.set_global_ips (coe_global, 1);
380 m_imFractDiffusion.set_global_ips (coe_global, 1);
381 m_imOrthoDiffusion.set_global_ips (coe_global, 1);
382 m_imFractThermCond.set_global_ips (coe_global, 1);
383 m_imOrthoThermCond.set_global_ips (coe_global, 1);
389 m_imDensityCo.set_global_ips (vCornerCoords, ref_elem_type::numCorners);
390 m_imViscosityCo.set_global_ips (vCornerCoords, ref_elem_type::numCorners);
391 if(m_spVolStabData.valid())
392 m_imOldDensityCo.set_global_ips (vCornerCoords, ref_elem_type::numCorners);
395 m_imFractDarcyVelIP.template set_local_ips<dim> (m_elem_loc_scvf, numSCVFip);
396 m_imFractDarcyVelIP.set_global_ips(vSCVFip, numSCVFip);
401 SideNormal<ref_elem_type, dim> (outerNormal, m_outerFractSideIdx, vCornerCoords);
402 if ((outerNormalNorm =
VecLength (outerNormal)) < 1e-32)
403 UG_THROW (
"FractTHF_FV1: Cannot get the normal to a fracture.")
404 m_orthGravity =
VecDot (m_Gravity, outerNormal) / outerNormalNorm;
407 if(! m_spUpwind->template set_geometry_type<TFractFVGeom>(*m_pFractGeo))
408 UG_THROW(
"FractTHF_FV1: Cannot init upwind for the transport for fracture element type.");
410 if(! m_spUpwindEnergy->template set_geometry_type<TFractFVGeom>(*m_pFractGeo))
411 UG_THROW(
"FractTHF_FV1: Cannot init upwind for the energy for fracture element type.");
486 MathVector<dim> Vel[TBulkFVGeom::numSCVF], DarcyVel[TBulkFVGeom::numSCVF];
491 const size_t numSh = bulk_geo.num_sh();
492 const size_t numScvf = bulk_geo.num_scvf();
495 TConsGravity ConsGravityMethod;
501 ConsGravityMethod.template prepare<dim>
502 (vConsGravity, numSh, vCornerCoords, m_imDensityCo.values(), m_Gravity);
504 UG_CATCH_THROW (
"FractTHF_FV1::bulk_ass_dA_elem: Cannot prepare Consistent Gravity.");
507 number vPressure [ref_elem_type::numCorners];
508 for (
size_t sh = 0; sh < numSh; sh++)
509 vPressure[sh] = u(_P_, sh);
512 MatScale(Diffusion[0], m_imPorosity[0], m_imDiffusion[0]);
513 for (
size_t ip = 1; ip < numScvf; ip++)
514 Diffusion[ip] = Diffusion[0];
518 ThermCond[0] = m_imThermalConductivity[0];
519 for (
size_t ip = 1; ip < numScvf; ip++)
520 ThermCond[ip] = ThermCond[0];
523 for (
size_t ip = 0; ip < numScvf; ip++)
525 this->
template compute_ip_Darcy_velocity<TBulkFVGeom, TConsGravity>
526 (Vel[ip], ip, bulk_geo, ConsGravityMethod, vConsGravity, vPressure,
527 m_imViscosityIP[ip]);
528 MatVecMult (DarcyVel[ip], m_imPermeability[0], Vel[ip]);
532 if(!m_spUpwind->update(&bulk_geo, DarcyVel, Diffusion,
false))
533 UG_THROW(
"FractTHF_FV1::bulk_ass_dA_elem: Cannot compute convection shapes for the transport equation.");
536 if(!m_spUpwindEnergy->update(&bulk_geo, DarcyVel, ThermCond,
false))
537 UG_THROW(
"FractTHF_FV1::bulk_ass_dA_elem: Cannot compute convection shapes for the energy equation.");
547 for (
size_t ip = 0; ip < numScvf; ip++)
550 const typename TBulkFVGeom::SCVF& scvf = bulk_geo.scvf(ip);
554 for (
size_t sh = 0; sh < scvf.num_sh(); sh++)
567 for(
size_t sh = 0; sh < scvf.num_sh(); ++sh)
568 flux += convShape(ip, sh) * u(_C_, sh);
571 MatVecMult(Dgrad_c_ip, Diffusion[ip], grad_c_ip);
572 const number diffFlux =
VecDot(Dgrad_c_ip, scvf.normal());
576 if(!m_BoussinesqTransport) flux *= m_imDensityIP[ip];
579 d(_C_,scvf.from()) += flux;
580 d(_C_,scvf.to()) -= flux;
587 flux =
VecDot(DarcyVel[ip], scvf.normal());
588 if(!m_BoussinesqFlow) flux *= m_imDensityIP[ip];
591 d(_P_,scvf.from()) += flux;
592 d(_P_,scvf.to()) -= flux;
595 if(m_bVolStabDataActive)
597 m_spVolStabData->stiff(pElem->vertex(scvf.from())) -= flux;
598 m_spVolStabData->stiff(pElem->vertex(scvf.to())) += flux;
607 for(
size_t sh = 0; sh < scvf.num_sh(); ++sh)
608 flux += convShapeT(ip, sh) * u(_T_, sh);
609 flux *= m_imHeatCapacityFluid;
611 if(m_BoussinesqEnergy) flux *= m_BoussinesqDensity;
612 else flux *= m_imDensityIP[ip];
615 MatVecMult(Dgrad_T_ip, ThermCond[ip], grad_T_ip);
616 const number thermDiffFlux =
VecDot(Dgrad_T_ip, scvf.normal());
619 flux -= thermDiffFlux;
622 d(_T_,scvf.from()) += flux;
623 d(_T_,scvf.to()) -= flux;
627 if (m_sss_mngr.valid () && (m_sss_mngr->num_points () != 0 || m_sss_mngr->num_lines () != 0))
629 typedef typename domain_type::position_accessor_type t_pos_accessor;
631 point_iterator<TElem,t_pos_accessor,TBulkFVGeom> t_pnt_sss_iter;
633 line_iterator<TElem,t_pos_accessor,TBulkFVGeom> t_lin_sss_iter;
635 t_pos_accessor& aaPos = this->domain()->position_accessor ();
638 for(
size_t ip = 0; ip < bulk_geo.num_scv(); ip++)
640 size_t co = bulk_geo.scv(ip).node_id ();
643 for (t_pnt_sss_iter pnt (m_sss_mngr.get (), pElem,
grid, aaPos, bulk_geo, co);
644 ! pnt.is_over (); ++pnt)
647 if (! pnt_sss->marked_for (pElem, co))
649 pnt_sss->compute (pnt_sss->
position (), this->time (), -1);
650 ass_sss_dA_elem (d, u, pElem, co, pnt_sss->intensity (), pnt_sss->concentration (), pnt_sss->temperature ());
654 for (t_lin_sss_iter line (m_sss_mngr.get (), pElem,
grid, aaPos, bulk_geo, co);
655 ! line.is_over (); ++line)
659 line_sss->compute (line.seg_start (), this->time (), -1);
660 ass_sss_dA_elem (d, u, pElem, co, line_sss->intensity (), line_sss->concentration (), line_sss->temperature (), len);
677 const number half_fr_width = m_imAperture[0] / 2;
684 const size_t numSh = m_pFractGeo->num_sh();
685 const size_t numScvf = m_pFractGeo->num_scvf();
688 number vConcentration [maxFractSideCorners];
689 number vTemperature [maxFractSideCorners];
690 for (
size_t sh = 0; sh < numSh; sh++)
692 size_t co = m_innerSideCo[sh];
693 vConcentration[sh] = u(_C_, co);
694 vTemperature[sh] = u(_T_, co);
699 MatDiagSet (Diffusion[0], m_imPorosity[0] * m_imFractDiffusion[0]);
700 for (
size_t ip = 1; ip < numScvf; ip++)
701 Diffusion[ip] = Diffusion[0];
706 MatDiagSet (ThermCond[0], m_imFractThermCond[0]);
707 for (
size_t ip = 1; ip < numScvf; ip++)
708 ThermCond[ip] = ThermCond[0];
711 if(!m_spUpwind->update(m_pFractGeo, m_imFractDarcyVelIP.values(), Diffusion,
false))
712 UG_THROW(
"FractTHF_FV1::fract_ass_dA_elem: Cannot compute convection shapes for the transport equation.");
718 if(!m_spUpwindEnergy->update(m_pFractGeo, m_imFractDarcyVelIP.values(), ThermCond,
false))
719 UG_THROW(
"FractTHF_FV1::fract_ass_dA_elem: Cannot compute convection shapes for the energy equation.");
725 for (
size_t ip = 0; ip < numScvf; ip++)
728 const typename TFractFVGeom::SCVF& scvf = m_pFractGeo->scvf(ip);
732 for (
size_t sh = 0; sh < scvf.num_sh(); sh++)
734 VecScaleAppend (grad_c_ip, vConcentration[sh], scvf.global_grad(sh));
735 VecScaleAppend (grad_T_ip, vTemperature[sh], scvf.global_grad(sh));
745 for(
size_t sh = 0; sh < scvf.num_sh(); ++sh)
746 flux += convShape(ip, sh) * vConcentration[sh];
749 MatVecMult(Dgrad_c_ip, Diffusion[ip], grad_c_ip);
750 const number diffFlux =
VecDot(Dgrad_c_ip, scvf.normal());
753 flux = (flux - diffFlux) * half_fr_width;
754 if(!m_BoussinesqTransport) flux *= m_imDensityIP[ip];
757 d(_C_, m_innerSideCo[scvf.from()]) += flux;
758 d(_C_, m_innerSideCo[scvf.to()]) -= flux;
765 flux =
VecDot(m_imFractDarcyVelIP[ip], scvf.normal()) * half_fr_width;
767 if(!m_BoussinesqFlow) flux *= m_imDensityIP[ip];
770 d(_P_, m_innerSideCo[scvf.from()]) += flux;
771 d(_P_, m_innerSideCo[scvf.to()]) -= flux;
774 if(m_bVolStabDataActive)
776 m_spVolStabData->stiff(pElem->vertex(m_innerSideCo[scvf.from()])) -= flux;
777 m_spVolStabData->stiff(pElem->vertex(m_innerSideCo[scvf.to()])) += flux;
786 for(
size_t sh = 0; sh < scvf.num_sh(); ++sh)
787 flux += convShapeT(ip, sh) * vTemperature[sh];
788 flux *= m_imHeatCapacityFluid;
790 if(m_BoussinesqEnergy) flux *= m_BoussinesqDensity;
791 else flux *= m_imDensityIP[ip];
794 MatVecMult(Dgrad_T_ip, ThermCond[ip], grad_T_ip);
795 const number thermDiffFlux =
VecDot(Dgrad_T_ip, scvf.normal());
798 flux = (flux - thermDiffFlux) * half_fr_width;
801 d(_T_, m_innerSideCo[scvf.from()]) += flux;
802 d(_T_, m_innerSideCo[scvf.to()]) -= flux;
806 if (m_sss_mngr.valid () && m_sss_mngr->num_lines () != 0)
808 typedef typename domain_type::position_accessor_type t_pos_accessor;
810 line_iterator<side_type,t_pos_accessor,TFractFVGeom> t_lin_sss_iter;
812 t_pos_accessor& aaPos = this->domain()->position_accessor ();
815 for(
size_t ip = 0; ip < m_pFractGeo->num_scv(); ip++)
818 size_t side_co = m_pFractGeo->scv(ip).node_id ();
820 size_t co = m_innerSideCo [m_pFractGeo->scv(ip).node_id ()];
823 for (t_lin_sss_iter line (m_sss_mngr.get (), m_innerFractSide,
grid, aaPos, *m_pFractGeo, side_co);
824 ! line.is_over (); ++line)
827 if (! line_sss->marked_for (m_innerFractSide, side_co))
829 line_sss->compute (line.seg_start (), this->time (), -1);
830 ass_sss_dA_elem (d, u, pElem, co, line_sss->intensity (), line_sss->concentration (), line_sss->temperature (), 0.5);
1011 static const size_t numCorners = ref_elem_type::numCorners;
1016 const size_t numSh = bulk_geo.num_sh();
1017 const size_t numScvf = bulk_geo.num_scvf();
1022 MathVector<dim> Vel[TBulkFVGeom::numSCVF], DarcyVel[TBulkFVGeom::numSCVF];
1023 MathVector<dim> Vel_c[numCorners], Vel_p[numCorners], Vel_T[numCorners];
1024 MathVector<dim> vDDarcyVel_c[numCorners], vDDarcyVel_p[numCorners], vDDarcyVel_T[numCorners];
1026 number vDFlux_c [numCorners], vDFlux_p [numCorners], vDFlux_T [numCorners];
1027 number vViscosity_c [numCorners], * pViscosity_c;
1028 number vViscosity_T [numCorners], * pViscosity_T;
1031 TConsGravity ConsGravityMethod;
1039 ConsGravityMethod.template prepare<dim>
1040 (vConsGravity, numSh, vCornerCoords, m_imDensityCo.values(), m_Gravity);
1042 number co_density [numCorners];
1043 memset (co_density, 0, ref_elem_type::numCorners *
sizeof (
number));
1044 for (
size_t sh = 0; sh < numSh; sh++)
1046 co_density[sh] = m_imDensityCo.deriv (sh, _C_, sh);
1047 ConsGravityMethod.template prepare<dim>
1048 (vConsGravity_c[sh], numSh, vCornerCoords, co_density, m_Gravity);
1049 co_density[sh] = 0.0;
1051 for (
size_t sh = 0; sh < numSh; sh++)
1053 co_density[sh] = m_imDensityCo.deriv (sh, _T_, sh);
1054 ConsGravityMethod.template prepare<dim>
1055 (vConsGravity_T[sh], numSh, vCornerCoords, co_density, m_Gravity);
1056 co_density[sh] = 0.0;
1059 UG_CATCH_THROW (
"FractTHF_FV1::bulk_ass_JA_elem: Cannot prepare Consistent Gravity or its derivatives.");
1062 number vPressure [numCorners];
1063 for (
size_t sh = 0; sh < numSh; sh++)
1064 vPressure[sh] = u(_P_, sh);
1067 MatScale(Diffusion[0], m_imPorosity[0], m_imDiffusion[0]);
1068 for (
size_t ip = 1; ip < numScvf; ip++)
1069 Diffusion[ip] = Diffusion[0];
1073 ThermCond[0] = m_imThermalConductivity[0];
1074 for (
size_t ip = 1; ip < numScvf; ip++)
1075 ThermCond[ip] = ThermCond[0];
1078 for (
size_t ip = 0; ip < numScvf; ip++)
1080 this->
template compute_ip_Darcy_velocity<TBulkFVGeom, TConsGravity>
1081 (Vel[ip], ip, bulk_geo, ConsGravityMethod, vConsGravity, vPressure,
1082 m_imViscosityIP[ip]);
1083 MatVecMult (DarcyVel[ip], m_imPermeability[0], Vel[ip]);
1087 if(!m_spUpwind->update(&bulk_geo, DarcyVel, Diffusion,
true))
1088 UG_THROW(
"FractTHF_FV1::bulk_ass_dA_elem: Cannot compute convection shapes for the transport equation.");
1091 if(!m_spUpwindEnergy->update(&bulk_geo, DarcyVel, ThermCond,
true))
1092 UG_THROW(
"FractTHF_FV1::bulk_ass_dA_elem: Cannot compute convection shapes for the energy equation.");
1103 for (
size_t ip = 0; ip < numScvf; ip++)
1106 const typename TBulkFVGeom::SCVF& scvf = bulk_geo.scvf(ip);
1110 for (
size_t sh = 0; sh < scvf.num_sh(); sh++)
1117 if (m_imViscosityIP.constant ())
1119 pViscosity_c = NULL;
1120 pViscosity_T = NULL;
1124 for (
size_t sh = 0; sh < numSh; sh++)
1126 vViscosity_c[sh] = m_imViscosityIP.deriv(ip, _C_, sh);
1127 vViscosity_T[sh] = m_imViscosityIP.deriv(ip, _T_, sh);
1129 pViscosity_c = vViscosity_c;
1130 pViscosity_T = vViscosity_T;
1134 this->
template compute_J_ip_Darcy_velocity <TBulkFVGeom, TConsGravity, numCorners>
1135 (Vel[ip], Vel_c, Vel_p, Vel_T, ip, bulk_geo, ConsGravityMethod,
1136 vConsGravity_c, vConsGravity_T, vPressure,
1137 m_imViscosityIP[ip], pViscosity_c, pViscosity_T);
1138 for (
size_t sh = 0; sh < numSh; sh++)
1140 MatVecMult (vDDarcyVel_c[sh], m_imPermeability[0], Vel_c[sh]);
1141 MatVecMult (vDDarcyVel_p[sh], m_imPermeability[0], Vel_p[sh]);
1142 MatVecMult (vDDarcyVel_T[sh], m_imPermeability[0], Vel_T[sh]);
1150 for(
size_t sh = 0; sh < scvf.num_sh(); ++sh)
1153 vDFlux_c[sh] = convShape(ip, sh);
1158 for(
size_t sh1 = 0; sh1 < scvf.num_sh(); ++sh1)
1160 vDFlux_c[sh] += u(_C_, sh1) *
VecDot(convShape.
D_vel(ip, sh1), vDDarcyVel_c[sh]);
1161 vDFlux_p[sh] += u(_C_, sh1) *
VecDot(convShape.
D_vel(ip, sh1), vDDarcyVel_p[sh]);
1162 vDFlux_T[sh] += u(_C_, sh1) *
VecDot(convShape.
D_vel(ip, sh1), vDDarcyVel_T[sh]);
1168 MatVecMult(Dgrad, Diffusion[ip], scvf.global_grad(sh));
1169 vDFlux_c[sh] -=
VecDot(Dgrad, scvf.normal());
1173 if(!m_BoussinesqTransport)
1177 for(
size_t sh = 0; sh < scvf.num_sh(); ++sh)
1178 flux += convShape(ip, sh) * u(_C_, sh);
1182 flux -=
VecDot(Dgrad, scvf.normal());
1185 for(
size_t sh = 0; sh < scvf.num_sh(); ++sh)
1187 vDFlux_c[sh] = m_imDensityIP[ip] * vDFlux_c[sh] +
1188 m_imDensityIP.deriv(ip, _C_, sh) * flux;
1189 vDFlux_p[sh] *= m_imDensityIP[ip];
1190 vDFlux_T[sh] = m_imDensityIP[ip] * vDFlux_T[sh] +
1191 m_imDensityIP.deriv(ip, _T_, sh) * flux;
1196 for(
size_t sh = 0; sh < scvf.num_sh(); ++sh)
1198 J(_C_, scvf.from(), _C_, sh) += vDFlux_c[sh];
1199 J(_C_, scvf.to(), _C_, sh) -= vDFlux_c[sh];
1200 J(_C_, scvf.from(), _P_, sh) += vDFlux_p[sh];
1201 J(_C_, scvf.to(), _P_, sh) -= vDFlux_p[sh];
1202 J(_C_, scvf.from(), _T_, sh) += vDFlux_T[sh];
1203 J(_C_, scvf.to(), _T_, sh) -= vDFlux_T[sh];
1211 for(
size_t sh = 0; sh < scvf.num_sh(); ++sh)
1213 vDFlux_c[sh] =
VecDot(vDDarcyVel_c[sh], scvf.normal());
1214 vDFlux_p[sh] =
VecDot(vDDarcyVel_p[sh], scvf.normal());
1215 vDFlux_T[sh] =
VecDot(vDDarcyVel_T[sh], scvf.normal());
1220 if(!m_BoussinesqFlow)
1222 for(
size_t sh = 0; sh < scvf.num_sh(); ++sh)
1224 vDFlux_c[sh] = m_imDensityIP[ip] * vDFlux_c[sh] +
1225 m_imDensityIP.deriv(ip, _C_, sh) * flux;
1226 vDFlux_p[sh] *= m_imDensityIP[ip];
1227 vDFlux_T[sh] = m_imDensityIP[ip] * vDFlux_T[sh] +
1228 m_imDensityIP.deriv(ip, _T_, sh) * flux;
1231 flux *= m_imDensityIP[ip];
1235 for(
size_t sh = 0; sh < scvf.num_sh(); ++sh)
1237 J(_P_, scvf.from(), _C_, sh) += vDFlux_c[sh];
1238 J(_P_, scvf.to(), _C_, sh) -= vDFlux_c[sh];
1239 J(_P_, scvf.from(), _P_, sh) += vDFlux_p[sh];
1240 J(_P_, scvf.to(), _P_, sh) -= vDFlux_p[sh];
1241 J(_P_, scvf.from(), _T_, sh) += vDFlux_T[sh];
1242 J(_P_, scvf.to(), _T_, sh) -= vDFlux_T[sh];
1247 if(m_bVolStabDataActive)
1249 m_spVolStabData->stiff(pElem->vertex(scvf.from())) -= flux;
1250 m_spVolStabData->stiff(pElem->vertex(scvf.to())) += flux;
1259 for(
size_t sh = 0; sh < scvf.num_sh(); ++sh)
1264 vDFlux_T[sh] = convShape(ip, sh);
1267 for(
size_t sh1 = 0; sh1 < scvf.num_sh(); ++sh1)
1269 vDFlux_c[sh] += u(_T_, sh1) *
VecDot(convShapeT.
D_vel(ip, sh1), vDDarcyVel_c[sh]);
1270 vDFlux_p[sh] += u(_T_, sh1) *
VecDot(convShapeT.
D_vel(ip, sh1), vDDarcyVel_p[sh]);
1271 vDFlux_T[sh] += u(_T_, sh1) *
VecDot(convShapeT.
D_vel(ip, sh1), vDDarcyVel_T[sh]);
1274 vDFlux_c[sh] *= m_imHeatCapacityFluid;
1275 vDFlux_p[sh] *= m_imHeatCapacityFluid;
1276 vDFlux_T[sh] *= m_imHeatCapacityFluid;
1280 if(!m_BoussinesqEnergy)
1284 for(
size_t sh = 0; sh < scvf.num_sh(); ++sh)
1285 flux += convShapeT(ip, sh) * u(_T_, sh);
1286 flux *= m_imHeatCapacityFluid;
1289 for(
size_t sh = 0; sh < scvf.num_sh(); ++sh)
1291 vDFlux_c[sh] = m_imDensityIP[ip] * vDFlux_c[sh] +
1292 m_imDensityIP.deriv(ip, _C_, sh) * flux;
1293 vDFlux_p[sh] *= m_imDensityIP[ip];
1294 vDFlux_T[sh] = m_imDensityIP[ip] * vDFlux_T[sh] +
1295 m_imDensityIP.deriv(ip, _T_, sh) * flux;
1300 for(
size_t sh = 0; sh < scvf.num_sh(); ++sh)
1302 vDFlux_c[sh] *= m_BoussinesqDensity;
1303 vDFlux_p[sh] *= m_BoussinesqDensity;
1304 vDFlux_T[sh] *= m_BoussinesqDensity;
1309 for(
size_t sh = 0; sh < scvf.num_sh(); ++sh)
1312 MatVecMult(Dgrad, ThermCond[ip], scvf.global_grad(sh));
1313 vDFlux_T[sh] -=
VecDot(Dgrad, scvf.normal());
1317 for(
size_t sh = 0; sh < scvf.num_sh(); ++sh)
1319 J(_T_, scvf.from(), _C_, sh) += vDFlux_c[sh];
1320 J(_T_, scvf.to(), _C_, sh) -= vDFlux_c[sh];
1321 J(_T_, scvf.from(), _P_, sh) += vDFlux_p[sh];
1322 J(_T_, scvf.to(), _P_, sh) -= vDFlux_p[sh];
1323 J(_T_, scvf.from(), _T_, sh) += vDFlux_T[sh];
1324 J(_T_, scvf.to(), _T_, sh) -= vDFlux_T[sh];
1329 if (m_sss_mngr.valid () && (m_sss_mngr->num_points () != 0 || m_sss_mngr->num_lines () != 0))
1331 typedef typename domain_type::position_accessor_type t_pos_accessor;
1333 point_iterator<TElem,t_pos_accessor,TBulkFVGeom> t_pnt_sss_iter;
1335 line_iterator<TElem,t_pos_accessor,TBulkFVGeom> t_lin_sss_iter;
1337 t_pos_accessor& aaPos = this->domain()->position_accessor ();
1340 for(
size_t ip = 0; ip < bulk_geo.num_scv(); ip++)
1342 size_t co = bulk_geo.scv(ip).node_id ();
1345 for (t_pnt_sss_iter pnt (m_sss_mngr.get (), pElem,
grid, aaPos, bulk_geo, co);
1346 ! pnt.is_over (); ++pnt)
1349 if (! pnt_sss->marked_for (pElem, co))
1351 pnt_sss->compute (pnt_sss->
position (), this->time (), -1);
1352 ass_sss_JA_elem (J, u, pElem, co, pnt_sss->intensity (), pnt_sss->concentration (), pnt_sss->temperature ());
1356 for (t_lin_sss_iter line (m_sss_mngr.get (), pElem,
grid, aaPos, bulk_geo, co);
1357 ! line.is_over (); ++line)
1361 line_sss->compute (line.seg_start (), this->time (), -1);
1362 ass_sss_JA_elem (J, u, pElem, co, line_sss->intensity (), line_sss->concentration (), line_sss->temperature (), len);
1379 number half_fr_width = m_imAperture[0] / 2;
1381 const size_t numSh = m_pFractGeo->num_sh();
1382 const size_t numScvf = m_pFractGeo->num_scvf();
1388 number vDFlux_c [maxFractSideCorners], vDFlux_p [maxFractSideCorners], vDFlux_T [maxFractSideCorners];
1391 number vConcentration [maxFractSideCorners];
1392 number vTemperature [maxFractSideCorners];
1393 for (
size_t sh = 0; sh < numSh; sh++)
1395 size_t co = m_innerSideCo[sh];
1396 vConcentration[sh] = u(_C_, co);
1397 vTemperature[sh] = u(_T_, co);
1401 MatSet (Diffusion[0], 0);
1402 MatDiagSet (Diffusion[0], m_imPorosity[0] * m_imFractDiffusion[0]);
1403 for (
size_t ip = 1; ip < numScvf; ip++)
1404 Diffusion[ip] = Diffusion[0];
1408 MatSet (ThermCond[0], 0);
1409 MatDiagSet (ThermCond[0], m_imFractThermCond[0]);
1410 for (
size_t ip = 1; ip < numScvf; ip++)
1411 ThermCond[ip] = ThermCond[0];
1414 if(!m_spUpwind->update(m_pFractGeo, m_imFractDarcyVelIP.values(), Diffusion,
true))
1415 UG_THROW(
"FractTHF_FV1::fract_ass_dA_elem: Cannot compute convection shapes for the transport equation.");
1418 if(!m_spUpwindEnergy->update(m_pFractGeo, m_imFractDarcyVelIP.values(), ThermCond,
true))
1419 UG_THROW(
"FractTHF_FV1::fract_ass_dA_elem: Cannot compute convection shapes for the energy equation.");
1430 for (
size_t ip = 0; ip < numScvf; ip++)
1433 const typename TFractFVGeom::SCVF& scvf = m_pFractGeo->scvf(ip);
1437 for (
size_t sh = 0; sh < scvf.num_sh(); sh++)
1439 VecScaleAppend (grad_c_ip, vConcentration[sh], scvf.global_grad(sh));
1440 VecScaleAppend (grad_T_ip, vTemperature[sh], scvf.global_grad(sh));
1443 const MathVector<dim>* vDDarcyVel_c = m_imFractDarcyVelIP.deriv(ip, _C_);
1444 const MathVector<dim>* vDDarcyVel_p = m_imFractDarcyVelIP.deriv(ip, _P_);
1445 const MathVector<dim>* vDDarcyVel_T = m_imFractDarcyVelIP.deriv(ip, _T_);
1452 for(
size_t sh = 0; sh < scvf.num_sh(); ++sh)
1454 size_t co = m_innerSideCo[sh];
1457 vDFlux_c[sh] = convShape(ip, sh);
1462 for(
size_t sh1 = 0; sh1 < scvf.num_sh(); ++sh1)
1464 vDFlux_c[sh] += vConcentration[sh1] *
VecDot(convShape.
D_vel(ip, sh1), vDDarcyVel_c[co]);
1465 vDFlux_p[sh] += vConcentration[sh1] *
VecDot(convShape.
D_vel(ip, sh1), vDDarcyVel_p[co]);
1466 vDFlux_T[sh] += vConcentration[sh1] *
VecDot(convShape.
D_vel(ip, sh1), vDDarcyVel_T[co]);
1471 MatVecMult(Dgrad, Diffusion[ip], scvf.global_grad(sh));
1472 vDFlux_c[sh] -=
VecDot(Dgrad, scvf.normal());
1476 if(!m_BoussinesqTransport)
1480 for(
size_t sh = 0; sh < scvf.num_sh(); ++sh)
1481 flux += convShape(ip, sh) * vConcentration[sh];
1485 flux -=
VecDot(Dgrad, scvf.normal());
1488 for(
size_t sh = 0; sh < scvf.num_sh(); ++sh)
1490 vDFlux_c[sh] = m_imDensityIP[ip] * vDFlux_c[sh] +
1491 (m_imDensityIP.constant() ? 0.0 : m_imDensityIP.deriv(ip, _C_, m_innerSideCo[sh])) * flux;
1492 vDFlux_p[sh] *= m_imDensityIP[ip];
1493 vDFlux_T[sh] = m_imDensityIP[ip] * vDFlux_T[sh] +
1494 (m_imDensityIP.constant() ? 0.0 : m_imDensityIP.deriv(ip, _T_, m_innerSideCo[sh])) * flux;
1499 for(
size_t sh = 0; sh < scvf.num_sh(); ++sh)
1501 vDFlux_c[sh] *= half_fr_width; vDFlux_p[sh] *= half_fr_width; vDFlux_T[sh] *= half_fr_width;
1505 for(
size_t sh = 0; sh < scvf.num_sh(); ++sh)
1507 size_t co = m_innerSideCo[sh];
1508 size_t co_from = m_innerSideCo[scvf.from()];
1509 size_t co_to = m_innerSideCo[scvf.to()];
1511 J(_C_, co_from, _C_, co) += vDFlux_c[sh];
1512 J(_C_, co_to, _C_, co) -= vDFlux_c[sh];
1513 J(_C_, co_from, _P_, co) += vDFlux_p[sh];
1514 J(_C_, co_to, _P_, co) -= vDFlux_p[sh];
1515 J(_C_, co_from, _T_, co) += vDFlux_T[sh];
1516 J(_C_, co_to, _T_, co) -= vDFlux_T[sh];
1523 for(
size_t sh = 0; sh < scvf.num_sh(); ++sh)
1525 size_t co = m_innerSideCo[sh];
1526 vDFlux_c[sh] =
VecDot(vDDarcyVel_c[co], scvf.normal());
1527 vDFlux_p[sh] =
VecDot(vDDarcyVel_p[co], scvf.normal());
1528 vDFlux_T[sh] =
VecDot(vDDarcyVel_T[co], scvf.normal());
1531 number flux =
VecDot(m_imFractDarcyVelIP[ip], scvf.normal());
1533 if(!m_BoussinesqFlow)
1535 for(
size_t sh = 0; sh < scvf.num_sh(); ++sh)
1537 vDFlux_c[sh] = m_imDensityIP[ip] * vDFlux_c[sh] +
1538 (m_imDensityIP.constant() ? 0.0 : m_imDensityIP.deriv(ip, _C_, m_innerSideCo[sh])) * flux;
1539 vDFlux_p[sh] *= m_imDensityIP[ip];
1540 vDFlux_T[sh] = m_imDensityIP[ip] * vDFlux_T[sh] +
1541 (m_imDensityIP.constant() ? 0.0 : m_imDensityIP.deriv(ip, _T_, m_innerSideCo[sh])) * flux;
1544 flux *= m_imDensityIP[ip];
1548 for(
size_t sh = 0; sh < scvf.num_sh(); ++sh)
1550 vDFlux_c[sh] *= half_fr_width; vDFlux_p[sh] *= half_fr_width; vDFlux_T[sh] *= half_fr_width;
1554 for(
size_t sh = 0; sh < scvf.num_sh(); ++sh)
1556 size_t co = m_innerSideCo[sh];
1557 size_t co_from = m_innerSideCo[scvf.from()];
1558 size_t co_to = m_innerSideCo[scvf.to()];
1560 J(_P_, co_from, _C_, co) += vDFlux_c[sh];
1561 J(_P_, co_to, _C_, co) -= vDFlux_c[sh];
1562 J(_P_, co_from, _P_, co) += vDFlux_p[sh];
1563 J(_P_, co_to, _P_, co) -= vDFlux_p[sh];
1564 J(_P_, co_from, _T_, co) += vDFlux_T[sh];
1565 J(_P_, co_to, _T_, co) -= vDFlux_T[sh];
1570 if(m_bVolStabDataActive)
1572 flux *= half_fr_width;
1573 m_spVolStabData->stiff(pElem->vertex(m_innerSideCo[scvf.from()])) -= flux;
1574 m_spVolStabData->stiff(pElem->vertex(m_innerSideCo[scvf.to()])) += flux;
1583 for(
size_t sh = 0; sh < scvf.num_sh(); ++sh)
1585 size_t co = m_innerSideCo[sh];
1590 vDFlux_T[sh] = convShape(ip, sh);
1593 for(
size_t sh1 = 0; sh1 < scvf.num_sh(); ++sh1)
1595 vDFlux_c[sh] += vTemperature[sh1] *
VecDot(convShapeT.
D_vel(ip, sh1), vDDarcyVel_c[co]);
1596 vDFlux_p[sh] += vTemperature[sh1] *
VecDot(convShapeT.
D_vel(ip, sh1), vDDarcyVel_p[co]);
1597 vDFlux_T[sh] += vTemperature[sh1] *
VecDot(convShapeT.
D_vel(ip, sh1), vDDarcyVel_T[co]);
1600 vDFlux_c[sh] *= m_imHeatCapacityFluid;
1601 vDFlux_p[sh] *= m_imHeatCapacityFluid;
1602 vDFlux_T[sh] *= m_imHeatCapacityFluid;
1606 if(!m_BoussinesqEnergy)
1610 for(
size_t sh = 0; sh < scvf.num_sh(); ++sh)
1611 flux += convShapeT(ip, sh) * vTemperature[sh];
1612 flux *= m_imHeatCapacityFluid;
1615 for(
size_t sh = 0; sh < scvf.num_sh(); ++sh)
1617 vDFlux_c[sh] = m_imDensityIP[ip] * vDFlux_c[sh] +
1618 (m_imDensityIP.constant() ? 0.0 : m_imDensityIP.deriv(ip, _C_, m_innerSideCo[sh])) * flux;
1619 vDFlux_p[sh] *= m_imDensityIP[ip];
1620 vDFlux_T[sh] = m_imDensityIP[ip] * vDFlux_T[sh] +
1621 (m_imDensityIP.constant() ? 0.0 : m_imDensityIP.deriv(ip, _T_, m_innerSideCo[sh])) * flux;
1626 for(
size_t sh = 0; sh < scvf.num_sh(); ++sh)
1628 vDFlux_c[sh] *= m_BoussinesqDensity;
1629 vDFlux_p[sh] *= m_BoussinesqDensity;
1630 vDFlux_T[sh] *= m_BoussinesqDensity;
1635 for(
size_t sh = 0; sh < scvf.num_sh(); ++sh)
1638 MatVecMult(Dgrad, ThermCond[ip], scvf.global_grad(sh));
1639 vDFlux_T[sh] -=
VecDot(Dgrad, scvf.normal());
1643 for(
size_t sh = 0; sh < scvf.num_sh(); ++sh)
1645 vDFlux_c[sh] *= half_fr_width; vDFlux_p[sh] *= half_fr_width; vDFlux_T[sh] *= half_fr_width;
1649 for(
size_t sh = 0; sh < scvf.num_sh(); ++sh)
1651 size_t co = m_innerSideCo[sh];
1652 size_t co_from = m_innerSideCo[scvf.from()];
1653 size_t co_to = m_innerSideCo[scvf.to()];
1655 J(_T_, co_from, _C_, co) += vDFlux_c[sh];
1656 J(_T_, co_to, _C_, co) -= vDFlux_c[sh];
1657 J(_T_, co_from, _P_, co) += vDFlux_p[sh];
1658 J(_T_, co_to, _P_, co) -= vDFlux_p[sh];
1659 J(_T_, co_from, _T_, co) += vDFlux_T[sh];
1660 J(_T_, co_to, _T_, co) -= vDFlux_T[sh];
1665 if (m_sss_mngr.valid () && m_sss_mngr->num_lines () != 0)
1667 typedef typename domain_type::position_accessor_type t_pos_accessor;
1669 line_iterator<side_type,t_pos_accessor,TFractFVGeom> t_lin_sss_iter;
1671 t_pos_accessor& aaPos = this->domain()->position_accessor ();
1674 for(
size_t ip = 0; ip < m_pFractGeo->num_scv(); ip++)
1677 size_t side_co = m_pFractGeo->scv(ip).node_id ();
1679 size_t co = m_innerSideCo [m_pFractGeo->scv(ip).node_id ()];
1682 for (t_lin_sss_iter line (m_sss_mngr.get (), m_innerFractSide,
grid, aaPos, *m_pFractGeo, side_co);
1683 ! line.is_over (); ++line)
1686 if (! line_sss->marked_for (m_innerFractSide, side_co))
1688 line_sss->compute (line.seg_start (), this->time (), -1);
1689 ass_sss_JA_elem (J, u, pElem, co, line_sss->intensity () / 2, line_sss->concentration (), line_sss->temperature (), 0.5);
1707 const number orthDiffusion = m_imPorosity[0] * m_imOrthoDiffusion[0];
1709 const number half_fr_width = m_imAperture[0] / 2;
1712 for (
size_t ip = 0; ip < m_pFractGeo->num_scv(); ip++)
1715 const typename TFractFVGeom::SCV& scv = m_pFractGeo->scv(ip);
1719 const int co = m_innerSideCo [scv.node_id()];
1722 const number orthC_f = u(_C_, co);
1723 const number orthC_m = u(_C_, m_assCo[co]);
1724 const number orthP_f = u(_P_, co);
1725 const number orthP_m = u(_P_, m_assCo[co]);
1726 const number orthT_f = u(_T_, co);
1727 const number orthT_m = u(_T_, m_assCo[co]);
1729 const number fractDensity = m_imDensityCo[co];
1730 const number orthDensity = m_imDensityCo [m_assCo[co]];
1731 number D_fractDensity_c, D_orthDensity_c, D_fractDensity_T, D_orthDensity_T;
1732 if (! m_imDensityCo.constant())
1734 D_fractDensity_c = m_imDensityCo.deriv (co, _C_, co);
1735 D_fractDensity_T = m_imDensityCo.deriv (co, _T_, co);
1736 D_orthDensity_c = m_imDensityCo.deriv (m_assCo[co], _C_, m_assCo[co]);
1737 D_orthDensity_T = m_imDensityCo.deriv (m_assCo[co], _T_, m_assCo[co]);
1740 D_fractDensity_c = D_fractDensity_T = D_orthDensity_c = D_orthDensity_T = 0;
1742 const number orthViscosity = m_imViscosityCo [m_assCo[co]];
1743 number D_orthViscosity_c, D_orthViscosity_T;
1744 if (! m_imViscosityCo.constant())
1746 D_orthViscosity_c = m_imViscosityCo.deriv (m_assCo[co], _C_, m_assCo[co]);
1747 D_orthViscosity_T = m_imViscosityCo.deriv (m_assCo[co], _T_, m_assCo[co]);
1750 D_orthViscosity_c = D_orthViscosity_T = 0;
1754 number orthVelocity = (m_orthGravity * (orthDensity - fractDensity)
1755 - (orthP_m - orthP_f) / half_fr_width)
1756 * m_imOrthoPermeability[0];
1758 number D_orthVelocity [3], D_orthVelocity_fr [3];
1760 D_orthVelocity [_C_] = (m_orthGravity * D_orthDensity_c
1761 * m_imOrthoPermeability[0] * orthViscosity
1762 - orthVelocity * D_orthViscosity_c) / orthViscosity / orthViscosity;
1764 D_orthVelocity_fr [_C_] = - m_orthGravity * D_fractDensity_c
1765 * m_imOrthoPermeability[0] / orthViscosity;
1767 D_orthVelocity [_P_] = - m_imOrthoPermeability[0]
1768 / half_fr_width / orthViscosity;
1770 D_orthVelocity_fr [_P_] = - D_orthVelocity [_P_];
1772 D_orthVelocity [_T_] = (m_orthGravity * D_orthDensity_T
1773 * m_imOrthoPermeability[0] * orthViscosity
1774 - orthVelocity * D_orthViscosity_T) / orthViscosity / orthViscosity;
1776 D_orthVelocity_fr [_T_] = - m_orthGravity * D_fractDensity_T
1777 * m_imOrthoPermeability[0] / orthViscosity;
1779 orthVelocity /= orthViscosity;
1782 number flux, D_flux [3], D_flux_fr [3];
1788 D_flux [_C_] = orthDiffusion / half_fr_width;
1789 D_flux_fr [_C_] = - D_flux [_C_];
1790 D_flux [_T_] = D_flux_fr [_T_] = 0;
1792 if (orthVelocity >= 0)
1794 D_flux [_C_] -= D_orthVelocity [_C_] * orthC_f;
1795 D_flux_fr [_C_] -= orthVelocity + D_orthVelocity_fr [_C_] * orthC_f;
1796 D_flux [_P_] = - D_orthVelocity [_P_] * orthC_f;
1797 D_flux_fr [_P_] = - D_orthVelocity_fr [_P_] * orthC_f;
1798 D_flux [_T_] = - D_orthVelocity [_T_] * orthC_f;
1799 D_flux_fr [_T_] = - D_orthVelocity_fr [_T_] * orthC_f;
1803 D_flux [_C_] -= orthVelocity + D_orthVelocity [_C_] * orthC_m;
1804 D_flux_fr [_C_] -= D_orthVelocity_fr [_C_] * orthC_m;
1805 D_flux [_P_] = - D_orthVelocity [_P_] * orthC_m;
1806 D_flux_fr [_P_] = - D_orthVelocity_fr [_P_] * orthC_m;
1807 D_flux [_T_] = - D_orthVelocity [_T_] * orthC_m;
1808 D_flux_fr [_T_] = - D_orthVelocity_fr [_T_] * orthC_m;
1811 if (! m_BoussinesqTransport)
1813 flux = orthDiffusion * (orthC_m - orthC_f) / half_fr_width;
1815 flux -= orthVelocity * ((orthVelocity >= 0)? orthC_f : orthC_m);
1817 D_flux [_C_] = D_flux [_C_] * orthDensity + flux * D_orthDensity_c;
1818 D_flux_fr [_C_] *= orthDensity;
1819 D_flux [_P_] *= orthDensity;
1820 D_flux_fr [_P_] *= orthDensity;
1821 D_flux [_T_] = D_flux [_T_] * orthDensity + flux * D_orthDensity_T;
1822 D_flux_fr [_T_] *= orthDensity;
1825 J(_C_, m_assCo [co], _C_, m_assCo [co]) += D_flux [_C_] *
s;
1826 J(_C_, m_assCo [co], _P_, m_assCo [co]) += D_flux [_P_] *
s;
1827 J(_C_, m_assCo [co], _T_, m_assCo [co]) += D_flux [_T_] *
s;
1828 J(_C_, m_assCo [co], _C_, co) += D_flux_fr [_C_] *
s;
1829 J(_C_, m_assCo [co], _P_, co) += D_flux_fr [_P_] *
s;
1830 J(_C_, m_assCo [co], _T_, co) += D_flux_fr [_T_] *
s;
1832 J(_C_, co, _C_, m_assCo [co]) -= D_flux [_C_] *
s;
1833 J(_C_, co, _P_, m_assCo [co]) -= D_flux [_P_] *
s;
1834 J(_C_, co, _T_, m_assCo [co]) -= D_flux [_T_] *
s;
1835 J(_C_, co, _C_, co) -= D_flux_fr [_C_] *
s;
1836 J(_C_, co, _P_, co) -= D_flux_fr [_P_] *
s;
1837 J(_C_, co, _T_, co) -= D_flux_fr [_T_] *
s;
1843 if (! m_BoussinesqFlow)
1845 D_flux [_C_] = (D_orthVelocity [_C_] * orthDensity
1846 + orthVelocity * D_orthDensity_c) *
s;
1847 D_flux_fr [_C_] = D_orthVelocity_fr [_C_] * orthDensity *
s;
1851 D_flux [_C_] = D_orthVelocity [_C_] *
s;
1852 D_flux_fr [_C_] = D_orthVelocity_fr [_C_] *
s;
1854 J(_P_, m_assCo [co], _C_, m_assCo [co]) -= D_flux [_C_];
1855 J(_P_, co, _C_, m_assCo [co]) += D_flux [_C_];
1856 J(_P_, m_assCo [co], _C_, co) -= D_flux_fr [_C_];
1857 J(_P_, co, _C_, co) += D_flux_fr [_C_];
1860 if (! m_BoussinesqFlow) rho_x_s *= orthDensity;
1862 flux = D_orthVelocity [_P_] * rho_x_s;
1863 J(_P_, m_assCo [co], _P_, m_assCo [co]) -= flux;
1864 J(_P_, co, _P_, m_assCo [co]) += flux;
1866 flux = D_orthVelocity_fr [_P_] * rho_x_s;
1867 J(_P_, m_assCo [co], _P_, co) -= flux;
1868 J(_P_, co, _P_, co) += flux;
1870 if (! m_BoussinesqFlow)
1872 D_flux [_T_] = (D_orthVelocity [_T_] * orthDensity
1873 + orthVelocity * D_orthDensity_T) *
s;
1874 D_flux_fr [_T_] = D_orthVelocity_fr [_T_] * orthDensity *
s;
1878 D_flux [_T_] = D_orthVelocity [_T_] *
s;
1879 D_flux_fr [_T_] = D_orthVelocity_fr [_T_] *
s;
1881 J(_P_, m_assCo [co], _T_, m_assCo [co]) -= D_flux [_T_];
1882 J(_P_, co, _T_, m_assCo [co]) += D_flux [_T_];
1883 J(_P_, m_assCo [co], _T_, co) -= D_flux_fr [_T_];
1884 J(_P_, co, _T_, co) += D_flux_fr [_T_];
1888 if(m_bVolStabDataActive)
1890 flux = orthVelocity * rho_x_s;
1891 m_spVolStabData->stiff(pElem->vertex(m_assCo[co])) += flux;
1892 m_spVolStabData->stiff(pElem->vertex(co)) -= flux;
1900 if (orthVelocity >= 0)
1902 D_flux [_C_] = - D_orthVelocity [_C_] * orthT_f * m_imHeatCapacityFluid;
1903 D_flux_fr [_C_] = - D_orthVelocity_fr [_C_] * orthT_f * m_imHeatCapacityFluid;
1904 D_flux [_P_] = - D_orthVelocity [_P_] * orthT_f * m_imHeatCapacityFluid;
1905 D_flux_fr [_P_] = - D_orthVelocity_fr [_P_] * orthT_f * m_imHeatCapacityFluid;
1906 D_flux [_T_] = D_orthVelocity [_T_] * orthT_f * m_imHeatCapacityFluid;
1907 D_flux_fr [_T_] = orthVelocity + D_orthVelocity_fr [_T_] * orthT_f * m_imHeatCapacityFluid;
1911 D_flux [_C_] = - D_orthVelocity [_C_] * orthT_m * m_imHeatCapacityFluid;
1912 D_flux_fr [_C_] = - D_orthVelocity_fr [_C_] * orthT_m * m_imHeatCapacityFluid;
1913 D_flux [_P_] = - D_orthVelocity [_P_] * orthT_m * m_imHeatCapacityFluid;
1914 D_flux_fr [_P_] = - D_orthVelocity_fr [_P_] * orthT_m * m_imHeatCapacityFluid;
1915 D_flux [_T_] = orthVelocity + D_orthVelocity [_T_] * orthT_m * m_imHeatCapacityFluid;
1916 D_flux_fr [_T_] = D_orthVelocity_fr [_T_] * orthT_m * m_imHeatCapacityFluid;
1919 if (! m_BoussinesqEnergy)
1922 flux = - orthVelocity * ((orthVelocity >= 0)? orthT_f : orthT_m)
1923 * m_imHeatCapacityFluid * orthDensity;
1925 D_flux [_C_] = D_flux [_C_] * orthDensity + flux * D_orthDensity_c;
1926 D_flux_fr [_C_] *= orthDensity;
1927 D_flux [_P_] *= orthDensity;
1928 D_flux_fr [_P_] *= orthDensity;
1929 D_flux [_T_] = D_flux [_T_] * orthDensity + flux * D_orthDensity_T;
1930 D_flux_fr [_T_] *= orthDensity;
1934 D_flux [_C_] *= m_BoussinesqDensity;
1935 D_flux_fr [_C_] *= m_BoussinesqDensity;
1936 D_flux [_P_] *= m_BoussinesqDensity;
1937 D_flux_fr [_P_] *= m_BoussinesqDensity;
1938 D_flux [_T_] *= m_BoussinesqDensity;
1939 D_flux_fr [_T_] *= m_BoussinesqDensity;
1942 D_flux [_T_] += m_imOrthoThermCond[0] / half_fr_width;
1943 D_flux_fr [_T_] -= m_imOrthoThermCond[0] / half_fr_width;
1945 J(_T_, m_assCo [co], _C_, m_assCo [co]) += D_flux [_C_] *
s;
1946 J(_T_, m_assCo [co], _P_, m_assCo [co]) += D_flux [_P_] *
s;
1947 J(_T_, m_assCo [co], _T_, m_assCo [co]) += D_flux [_T_] *
s;
1948 J(_T_, m_assCo [co], _C_, co) += D_flux_fr [_C_] *
s;
1949 J(_T_, m_assCo [co], _P_, co) += D_flux_fr [_P_] *
s;
1950 J(_T_, m_assCo [co], _T_, co) += D_flux_fr [_T_] *
s;
1952 J(_T_, co, _C_, m_assCo [co]) -= D_flux [_C_] *
s;
1953 J(_T_, co, _P_, m_assCo [co]) -= D_flux [_P_] *
s;
1954 J(_T_, co, _T_, m_assCo [co]) -= D_flux [_T_] *
s;
1955 J(_T_, co, _C_, co) -= D_flux_fr [_C_] *
s;
1956 J(_T_, co, _P_, co) -= D_flux_fr [_P_] *
s;
1957 J(_T_, co, _T_, co) -= D_flux_fr [_T_] *
s;
2612 if (nip != m_pFractGeo->num_scvf())
2613 UG_THROW (
"FractTHF_FV1: The Darcy velocity export parameter is only implemented for the standard set of IPs.");
2616 const size_t numSh = m_pFractGeo->num_sh();
2619 MathVector<dim> Vel_c[maxFractSideCorners], Vel_p[maxFractSideCorners], Vel_T[maxFractSideCorners];
2620 number vViscosity_c [maxFractSideCorners], * pViscosity_c;
2621 number vViscosity_T [maxFractSideCorners], * pViscosity_T;
2624 number vDensity [maxFractSideCorners];
2625 number vPressure [maxFractSideCorners];
2626 for (
size_t sh = 0; sh < numSh; sh++)
2628 size_t co = m_innerSideCo[sh];
2629 vDensity[sh] = m_imDensityCo[co];
2630 vPressure[sh] = u(_P_, co);
2634 TConsGravity ConsGravityMethod;
2642 ConsGravityMethod.template prepare<dim>
2643 (vConsGravity, numSh, m_pFractGeo->corners(), vDensity, m_Gravity);
2647 number co_density [maxFractSideCorners];
2648 memset (co_density, 0, numSh *
sizeof (
number));
2649 for (
size_t sh = 0; sh < numSh; sh++)
2651 size_t co = m_innerSideCo[sh];
2652 if(!m_imDensityCo.constant())
2653 co_density[sh] = m_imDensityCo.deriv (co, _C_, co);
2654 ConsGravityMethod.template prepare<dim>
2655 (vConsGravity_c[sh], numSh, m_pFractGeo->corners(), co_density, m_Gravity);
2656 co_density[sh] = 0.0;
2658 for (
size_t sh = 0; sh < numSh; sh++)
2660 size_t co = m_innerSideCo[sh];
2661 if(!m_imDensityCo.constant())
2662 co_density[sh] = m_imDensityCo.deriv (co, _T_, co);
2663 ConsGravityMethod.template prepare<dim>
2664 (vConsGravity_T[sh], numSh, m_pFractGeo->corners(), co_density, m_Gravity);
2665 co_density[sh] = 0.0;
2669 UG_CATCH_THROW (
"FractTHF_FV1::fract_ass_dA_elem: Cannot prepare Consistent Gravity.");
2672 for (
size_t ip = 0; ip < nip; ip++)
2678 this->
template compute_ip_Darcy_velocity<TFractFVGeom, TConsGravity>
2679 (Vel, ip, *m_pFractGeo, ConsGravityMethod, vConsGravity, vPressure,
2680 m_imViscosityIP[ip]);
2681 VecScale (DarcyVel, Vel, m_imFractPermeability[0]);
2692 for (
size_t co = 0; co < vvvDeriv[ip][_C_].size(); co++)
2693 DarcyVel_c[co] = 0.0;
2694 for (
size_t co = 0; co < vvvDeriv[ip][_P_].size(); co++)
2695 DarcyVel_p[co] = 0.0;
2696 for (
size_t co = 0; co < vvvDeriv[ip][_T_].size(); co++)
2697 DarcyVel_T[co] = 0.0;
2700 if (m_imViscosityIP.constant ())
2702 pViscosity_c = NULL;
2703 pViscosity_T = NULL;
2707 for (
size_t sh = 0; sh < numSh; sh++)
2709 size_t co = m_innerSideCo[sh];
2710 vViscosity_c[sh] = m_imViscosityIP.deriv(ip, _C_, co);
2711 vViscosity_T[sh] = m_imViscosityIP.deriv(ip, _T_, co);
2713 pViscosity_c = vViscosity_c;
2714 pViscosity_T = vViscosity_T;
2718 this->
template compute_J_ip_Darcy_velocity <TFractFVGeom, TConsGravity, maxFractSideCorners>
2719 (Vel, Vel_c, Vel_p, Vel_T, ip, *m_pFractGeo, ConsGravityMethod,
2720 vConsGravity_c, vConsGravity_T, vPressure,
2721 m_imViscosityIP[ip], pViscosity_c, pViscosity_T);
2722 for (
size_t sh = 0; sh < numSh; sh++)
2724 size_t co = m_innerSideCo[sh];
2725 VecScale (DarcyVel_c[co], Vel_c[sh], m_imFractPermeability[0]);
2726 VecScale (DarcyVel_p[co], Vel_p[sh], m_imFractPermeability[0]);
2727 VecScale (DarcyVel_T[co], Vel_T[sh], m_imFractPermeability[0]);
2733 UG_THROW (
"FractTHF_FV1: The Darcy velocity export parameter is currently implemented only for fractures.");
2752 std::vector<std::vector<number> > vvvDeriv[]
2758 if (nip != m_pFractGeo->num_scv())
2759 UG_THROW (
"FractDDF_FV1: The Darcy velocity export parameter is only implemented for the standard set of IPs.");
2761 const number half_fr_width = m_imAperture[0] / 2;
2764 for (
size_t ip = 0; ip < nip; ip++)
2767 const typename TFractFVGeom::SCV& scv = m_pFractGeo->scv(ip);
2768 number& orthVelocity = vValue[ip];
2771 const int co = m_innerSideCo [scv.node_id()];
2774 const number orthP_f = u(_P_, co);
2775 const number orthP_m = u(_P_, m_assCo[co]);
2776 const number fractDensity = m_imDensityCo[co];
2777 const number orthDensity = m_imDensityCo [m_assCo[co]];
2778 const number orthViscosity = m_imViscosityCo [m_assCo[co]];
2781 orthVelocity = (m_orthGravity * (orthDensity - fractDensity)
2782 - (orthP_m - orthP_f) / half_fr_width)
2783 * m_imOrthoPermeability[0];
2789 number* DarcyVel_c = &vvvDeriv[ip][_C_][0];
2790 number* DarcyVel_p = &vvvDeriv[ip][_P_][0];
2791 number* DarcyVel_T = &vvvDeriv[ip][_T_][0];
2794 for (
size_t i = 0; i < vvvDeriv[ip][_C_].size(); i++) DarcyVel_c[i] = 0;
2795 for (
size_t i = 0; i < vvvDeriv[ip][_P_].size(); i++) DarcyVel_p[i] = 0;
2796 for (
size_t i = 0; i < vvvDeriv[ip][_T_].size(); i++) DarcyVel_p[i] = 0;
2799 number D_fractDensity_c, D_orthDensity_c, D_fractDensity_T, D_orthDensity_T;
2800 if (! m_imDensityCo.constant())
2802 D_fractDensity_c = m_imDensityCo.deriv (co, _C_, co);
2803 D_fractDensity_T = m_imDensityCo.deriv (co, _T_, co);
2804 D_orthDensity_c = m_imDensityCo.deriv (m_assCo[co], _C_, m_assCo[co]);
2805 D_orthDensity_T = m_imDensityCo.deriv (m_assCo[co], _T_, m_assCo[co]);
2808 D_fractDensity_c = D_fractDensity_T = D_orthDensity_c = D_orthDensity_T = 0;
2810 const number orthViscosity = m_imViscosityCo [m_assCo[co]];
2811 number D_orthViscosity_c, D_orthViscosity_T;
2812 if (! m_imViscosityCo.constant())
2814 D_orthViscosity_c = m_imViscosityCo.deriv (m_assCo[co], _C_, m_assCo[co]);
2815 D_orthViscosity_T = m_imViscosityCo.deriv (m_assCo[co], _T_, m_assCo[co]);
2818 D_orthViscosity_c = D_orthViscosity_T = 0;
2820 number D_orthVelocity [3], D_orthVelocity_fr [3];
2822 D_orthVelocity [_C_] = (m_orthGravity * D_orthDensity_c
2823 * m_imOrthoPermeability[0] * orthViscosity
2824 - orthVelocity * D_orthViscosity_c) / orthViscosity / orthViscosity;
2826 D_orthVelocity_fr [_C_] = - m_orthGravity * D_fractDensity_c
2827 * m_imOrthoPermeability[0] / orthViscosity;
2829 D_orthVelocity [_P_] = - m_imOrthoPermeability[0]
2830 / half_fr_width / orthViscosity;
2832 D_orthVelocity_fr [_P_] = - D_orthVelocity [_P_];
2834 D_orthVelocity [_T_] = (m_orthGravity * D_orthDensity_T
2835 * m_imOrthoPermeability[0] * orthViscosity
2836 - orthVelocity * D_orthViscosity_T) / orthViscosity / orthViscosity;
2838 D_orthVelocity_fr [_T_] = - m_orthGravity * D_fractDensity_T
2839 * m_imOrthoPermeability[0] / orthViscosity;
2841 DarcyVel_c[co] = D_orthVelocity_fr[_C_];
2842 DarcyVel_p[co] = D_orthVelocity_fr[_P_];
2843 DarcyVel_T[co] = D_orthVelocity_fr[_T_];
2845 DarcyVel_c[m_assCo[co]] = D_orthVelocity[_C_];
2846 DarcyVel_p[m_assCo[co]] = D_orthVelocity[_P_];
2847 DarcyVel_T[m_assCo[co]] = D_orthVelocity[_T_];
2851 orthVelocity /= orthViscosity;
2855 UG_THROW (
"FractTHF_FV1: The orthogonal Darcy velocity export parameter is implemented only for fractures.");