Dear Dumuxers,
I'm simulating a single phase geothermal doublet (a production and an
injection well in a geothermal aquifer where a low temperature is
imposed for the injected water = 293 degree kelvin). The boundary
conditions are the same as initial conditions and they are all Dirichlet
with a geothermal gradient (0.03 Kelvin/m) and a hydrostatic pressure
gradient where they have values of 358 Kelvin and 1.1e6 Pa respectively
at the top of the upper boundary layer (top of domain). The domain is
2500 m x 2500 m x 50 m (30 m aquifer and 10 m upper layer and 10 m lower
layer) with 3 refinement zones (coarser outside to refined inside). The
upper and lower layers are represented by 3 numerical layers each to
ensure undisturbed boundaries. I'm representing the aquifer by 2
numerical layers and each of the injection & production wells by 2 point
sources in the 2 layers (fully penetrating wells) with 100 m distance
between the 2 wells and with a rate of 100 m^3/day for each well. I'm
using the OnePNI model and the horizontal permeability of the aquifer is
250 mD and the vertical one is 100 mD. The permeability of the boundary
layers is negligible (1e-9 mD).
When I set the simulation time for 1 month, at around 14 days, the time
step size kept decreasing from 50000 s till it reached 44 s ! so it
became impractical to proceed and I stopped the simulation. When I
displayed the results on Paraview, I could see what looks like a
numerical error above and below and point sources of the injection well
in the most 2 inner layers for pressure and and the most inner layer for
temperature (pictures attached). I tried the decreasing the vertical
permeability of the aquifer to 1e-9 mD but the error persisted. I also
tried deceasing the convergence criterion from 1e-3 to 1e-7 while
keeping the new low vertical permeability but again the error persisted.
Only when I removed the imposed temperature of 293 Kelvin and I used the
current temperature of the control volume (volVars.temperature()) to
decouple the thermal problem from the flow problem, the simulation
proceeded successfully till tEnd = 20 days with easy convergence and the
code seemed really stable !!
I tried today re-imposing the 293 kelvin for the injected water but with
changing the thickness of the most inner boundary layers to 10 m instead
of 3.33 m and the simulation proceeded successfully (tEnd = 20 days) but
I could still see the numerical error. Also I tried representing each of
the boundaries with just 1 numerical layer of 10 m and again the
simulation proceeded successfully (tEnd = 20 days) but I could still
observe the numerical error above and below the injection well inside
the boundaries.
I'm really confused at this point. Why is the imposed temperature
causing this numerical anomaly ? Does the point source nature have
anything to do with that ? Is it because of the heat transfer by
conduction at the boundary coupled with the low permeability? I
appreciate your thoughts and guidance on the issue.
here are my point source functions and my grid
void addPointSources(std::vector<PointSource>& pointSources) const
{
// The injection well (source term)
pointSources.push_back(PointSource({1205, 1245, 17.5}));
pointSources.push_back(PointSource({1205, 1245, 32.5}));
// The production well (sink term)
pointSources.push_back(PointSource({1305, 1245, 17.5}));
pointSources.push_back(PointSource({1305, 1245, 32.5}));
}
// Using solution-dependent point sources
template<class ElementVolumeVariables>
void pointSource(PointSource& source,
const Element &element,
const FVElementGeometry& fvGeometry,
const ElementVolumeVariables& elemVolVars,
const SubControlVolume &scv) const
{
const auto& pos = source.position();
const auto& volVars = elemVolVars[scv];
if (pos[0] < 1250.0) // injection
{
const Scalar volumeSource = 5.787e-4; // injectionRate is
positive and m^3/s
const Scalar massSource =
volumeSource*IapwsH2O::liquidDensity(293, volVars.pressure(0));
const Scalar energySource =
massSource*IapwsH2O::liquidEnthalpy(293, volVars.pressure(0));
source = NumEqVector({ massSource, energySource });
}
else // production
{
const Scalar volumeSource = -5.787e-4; // productionRate is
negative and m^3/s
const Scalar massSource = volumeSource*volVars.density(0); //
using current control volume's water density
const Scalar energySource = massSource*volVars.enthalpy(0);
// using current control volume's water enthalpy
source = NumEqVector({ massSource, energySource });
}
}
---------------------------------------------------------------------------------------------
[Grid]
Positions0 = 0 400 1100 1400 2100 2500
Positions1 = 0 400 1100 1400 2100 2500
Positions2 = 0 10 40 50
Cells0 = 2 35 30 35 2
Cells1 = 2 35 30 35 2
Cells2 = 3 2 3
---------------------------------------------------------------------------------------------
Best Regards,
Mahmoud Atef
_______________________________________________
DuMux mailing list
[email protected]
https://listserv.uni-stuttgart.de/mailman/listinfo/dumux