227doInit(
bool rst, std::size_t numGridDof,
228 std::size_t gasPhaseIdx, std::size_t oilPhaseIdx, std::size_t waterPhaseIdx)
230 const auto& tracers = eclState_.tracer();
232 if (tracers.size() == 0) {
237 const std::size_t numTracers = tracers.size();
238 enableSolTracers_.resize(numTracers);
239 tracerConcentration_.resize(numTracers);
240 freeTracerConcentration_.resize(numTracers);
241 solTracerConcentration_.resize(numTracers);
244 tracerPhaseIdx_.resize(numTracers);
245 for (std::size_t tracerIdx = 0; tracerIdx < numTracers; tracerIdx++) {
246 const auto& tracer = tracers[tracerIdx];
248 if (tracer.phase == Phase::WATER)
249 tracerPhaseIdx_[tracerIdx] = waterPhaseIdx;
250 else if (tracer.phase == Phase::OIL)
251 tracerPhaseIdx_[tracerIdx] = oilPhaseIdx;
252 else if (tracer.phase == Phase::GAS)
253 tracerPhaseIdx_[tracerIdx] = gasPhaseIdx;
255 tracerConcentration_[tracerIdx].resize(numGridDof);
256 freeTracerConcentration_[tracerIdx].resize(numGridDof);
257 solTracerConcentration_[tracerIdx].resize(numGridDof);
264 if (tracer.free_concentration.has_value()){
265 const auto& free_concentration = tracer.free_concentration.value();
266 int tblkDatasize = free_concentration.size();
267 if (tblkDatasize < cartMapper_.cartesianSize()){
268 throw std::runtime_error(
"Wrong size of TBLKF for" + tracer.name);
270 for (std::size_t globalDofIdx = 0; globalDofIdx < numGridDof; ++globalDofIdx) {
271 int cartDofIdx = cartMapper_.cartesianIndex(globalDofIdx);
272 tracerConcentration_[tracerIdx][globalDofIdx][0] = free_concentration[cartDofIdx];
273 freeTracerConcentration_[tracerIdx][globalDofIdx] = free_concentration[cartDofIdx];
277 else if (tracer.free_tvdp.has_value()) {
278 const auto& free_tvdp = tracer.free_tvdp.value();
279 for (std::size_t globalDofIdx = 0; globalDofIdx < numGridDof; ++globalDofIdx) {
280 tracerConcentration_[tracerIdx][globalDofIdx][0] =
281 free_tvdp.evaluate(
"TRACER_CONCENTRATION",
282 centroids_(globalDofIdx)[2]);
283 freeTracerConcentration_[tracerIdx][globalDofIdx] =
284 free_tvdp.evaluate(
"TRACER_CONCENTRATION",
285 centroids_(globalDofIdx)[2]);
289 OpmLog::warning(fmt::format(
"No TBLKF or TVDPF given for free tracer {}. "
290 "Initial values set to zero. ", tracer.name));
291 for (std::size_t globalDofIdx = 0; globalDofIdx < numGridDof; ++globalDofIdx) {
292 tracerConcentration_[tracerIdx][globalDofIdx][0] = 0.0;
293 freeTracerConcentration_[tracerIdx][globalDofIdx] = 0.0;
298 if (tracer.phase != Phase::WATER &&
299 ((tracer.phase == Phase::GAS && FluidSystem::enableDissolvedGas()) ||
300 (tracer.phase == Phase::OIL && FluidSystem::enableVaporizedOil()))) {
302 if (tracer.solution_concentration.has_value()){
303 enableSolTracers_[tracerIdx] =
true;
304 const auto& solution_concentration = tracer.solution_concentration.value();
305 int tblkDatasize = solution_concentration.size();
306 if (tblkDatasize < cartMapper_.cartesianSize()){
307 throw std::runtime_error(
"Wrong size of TBLKS for" + tracer.name);
309 for (std::size_t globalDofIdx = 0; globalDofIdx < numGridDof; ++globalDofIdx) {
310 int cartDofIdx = cartMapper_.cartesianIndex(globalDofIdx);
311 tracerConcentration_[tracerIdx][globalDofIdx][1] = solution_concentration[cartDofIdx];
312 solTracerConcentration_[tracerIdx][globalDofIdx] = solution_concentration[cartDofIdx];
316 else if (tracer.solution_tvdp.has_value()) {
317 enableSolTracers_[tracerIdx] =
true;
318 const auto& solution_tvdp = tracer.solution_tvdp.value();
319 for (std::size_t globalDofIdx = 0; globalDofIdx < numGridDof; ++globalDofIdx) {
320 tracerConcentration_[tracerIdx][globalDofIdx][1] =
321 solution_tvdp.evaluate(
"TRACER_CONCENTRATION",
322 centroids_(globalDofIdx)[2]);
323 solTracerConcentration_[tracerIdx][globalDofIdx] =
324 solution_tvdp.evaluate(
"TRACER_CONCENTRATION",
325 centroids_(globalDofIdx)[2]);
330 enableSolTracers_[tracerIdx] =
false;
331 OpmLog::warning(fmt::format(
"No TBLKS or TVDPS given for solution tracer {}. "
332 "Initial values set to zero. ", tracer.name));
333 for (std::size_t globalDofIdx = 0; globalDofIdx < numGridDof; ++globalDofIdx) {
334 tracerConcentration_[tracerIdx][globalDofIdx][1] = 0.0;
335 solTracerConcentration_[tracerIdx][globalDofIdx] = 0.0;
341 enableSolTracers_[tracerIdx] =
false;
342 for (std::size_t globalDofIdx = 0; globalDofIdx < numGridDof; ++globalDofIdx) {
343 tracerConcentration_[tracerIdx][globalDofIdx][1] = 0.0;
344 solTracerConcentration_[tracerIdx][globalDofIdx] = 0.0;
350 tracerMatrix_ = std::make_unique<TracerMatrix>(numGridDof, numGridDof, TracerMatrix::random);
353 using NeighborSet = std::set<unsigned>;
354 std::vector<NeighborSet> neighbors(numGridDof);
356 Stencil stencil(gridView_, dofMapper_);
357 for (
const auto& elem : elements(gridView_)) {
358 stencil.update(elem);
360 for (
unsigned primaryDofIdx = 0; primaryDofIdx < stencil.numPrimaryDof(); ++primaryDofIdx) {
361 unsigned myIdx = stencil.globalSpaceIndex(primaryDofIdx);
363 for (
unsigned dofIdx = 0; dofIdx < stencil.numDof(); ++dofIdx) {
364 unsigned neighborIdx = stencil.globalSpaceIndex(dofIdx);
365 neighbors[myIdx].insert(neighborIdx);
371 for (
unsigned dofIdx = 0; dofIdx < numGridDof; ++ dofIdx) {
372 tracerMatrix_->setrowsize(dofIdx, neighbors[dofIdx].size());
374 tracerMatrix_->endrowsizes();
379 for (
unsigned dofIdx = 0; dofIdx < numGridDof; ++ dofIdx) {
380 for (
const auto& index : neighbors[dofIdx]) {
381 tracerMatrix_->addindex(dofIdx, index);
384 tracerMatrix_->endindices();