-
Notifications
You must be signed in to change notification settings - Fork 78
Fixed Out of Bounds NNCs #894
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -123,7 +123,7 @@ MinpvProcessor::process(const std::vector<double>& thickness, | |
bool c_active = actnum.empty() || actnum[c]; | ||
bool c_thin = (thickness[c] <= z_tolerance); | ||
bool c_thin_inactive = !c_active && c_thin; | ||
bool c_low_pv_active = pv[c] < minpvv[c] && c_active; | ||
bool c_low_pv_active = (pv[c] < minpvv[c] && c_active) || (c_thin && c_active); | ||
|
||
if (c_low_pv_active || c_thin_inactive) { | ||
std::array<double, 8> cz = getCellZcorn(ii, jj, kk, zcorn); | ||
|
@@ -166,7 +166,7 @@ MinpvProcessor::process(const std::vector<double>& thickness, | |
bool active = actnum.empty() || actnum[c_below]; | ||
bool thin = (thickness[c_below] <= z_tolerance); | ||
bool thin_inactive = !active && thin; | ||
bool low_pv_active = pv[c_below] < minpvv[c_below] && active; | ||
bool low_pv_active = ((pv[c_below] < minpvv[c_below]) && active) || (thin && active); | ||
|
||
|
||
while ( (thin_inactive || low_pv_active) && kk_iter < dims_[2] ) | ||
|
@@ -223,13 +223,26 @@ MinpvProcessor::process(const std::vector<double>& thickness, | |
active = actnum.empty() || actnum[c_below]; | ||
thin = (thickness[c_below] <= z_tolerance); | ||
thin_inactive = (!actnum.empty() && !actnum[c_below]) && thin; | ||
low_pv_active = pv[c_below] < minpvv[c_below] && active; | ||
low_pv_active = ((pv[c_below] < minpvv[c_below]) && active) || (thin && active); | ||
} | ||
|
||
// create nnc if false or merge the cells if true | ||
if (mergeMinPVCells && c_low_pv_active) { | ||
if (mergeMinPVCells){// && c_low_pv_active) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Please remove commented code., |
||
// try to make a topological connected grid | ||
// in Flow this is currently called only for edge_conformal grids | ||
// however zcorn inbetween is not modified to make zcorn sorted | ||
// Set lower k coordinates of cell below to upper cells's coordinates. | ||
// i.e fill the void using the cell below | ||
if (kk==0 || kk_iter == dims_[2]) { | ||
kk = kk_iter; | ||
continue; | ||
} | ||
//bottom cell not active, hence no nnc is created | ||
if (!actnum.empty() && !actnum[c_below]) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This seems to be missing the pore volume check that was commented out above. |
||
kk = kk_iter; | ||
continue; | ||
} | ||
Comment on lines
+236
to
+244
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I guess this the first part of the bug fix? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It make do the same in this branch as in the other so one do not iterate for ever. |
||
|
||
std::array<double, 8> cz_below = getCellZcorn(ii, jj, kk_iter, zcorn); | ||
for (int count = 0; count < 4; ++count) { | ||
cz_below[count] = cz[count]; | ||
|
@@ -258,15 +271,15 @@ MinpvProcessor::process(const std::vector<double>& thickness, | |
auto above_active = actnum.empty() || actnum[c_above]; | ||
auto above_inactive = !actnum.empty() && !actnum[c_above]; | ||
auto above_thin = thickness[c_above] < z_tolerance; | ||
auto above_small_pv = pv[c_above] < minpvv[c_above]; | ||
auto above_small_pv = (pv[c_above] < minpvv[c_above]) || above_thin; | ||
|
||
if ((above_inactive && above_thin) || (above_active && above_small_pv | ||
&& (!pinchNOGAP || above_thin) ) ) { | ||
for (k_above = kk - 2; k_above > 0; --k_above) { | ||
c_above = ii + dims_[0] * (jj + dims_[1] * (k_above)); | ||
above_active = actnum.empty() || actnum[c_above]; | ||
above_inactive = !actnum.empty() && !actnum[c_above]; | ||
auto above_significant_pv = pv[c_above] > minpvv[c_above]; | ||
auto above_significant_pv = !((pv[c_above] < minpvv[c_above]) || (thickness[c_above] < z_tolerance)); | ||
auto above_broad = thickness[c_above] > z_tolerance; | ||
|
||
// \todo if condition seems wrong and should be the negation of above? | ||
|
@@ -291,25 +304,30 @@ MinpvProcessor::process(const std::vector<double>& thickness, | |
option4ALLZero = option4ALLZero || (!permz.empty() && permz[c_above] == 0.0) || multz(c_above) == 0.0; | ||
nnc_allowed = nnc_allowed && (computeGap(cz_above, cz_below) < max_gap) && (!pinchOption4ALL || !option4ALLZero) ; | ||
|
||
//bool | ||
above_small_pv = (pv[c_above] < minpvv[c_above]) || (thickness[c_above] < z_tolerance); | ||
bool below_small_pv = (pv[c_below] < minpvv[c_below]) || (thickness[c_below] < z_tolerance); | ||
if ( nnc_allowed && | ||
(actnum.empty() || (actnum[c_above] && actnum[c_below])) && | ||
pv[c_above] > minpvv[c_above] && pv[c_below] > minpvv[c_below]) { | ||
!(above_small_pv) && !(below_small_pv) ){ | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I guess, this is the second part of the bug fix if we would skip the thickness check above? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is to be conistent. |
||
result.add_nnc(c_above, c_below); | ||
} | ||
kk = kk_iter; | ||
} | ||
} | ||
else | ||
{ | ||
if (kk < dims_[2] - 1 && (actnum.empty() || actnum[c]) && pv[c] > minpvv[c] && | ||
if (kk < dims_[2] - 1 && (actnum.empty() || actnum[c]) && !((pv[c] < minpvv[c]) || (thickness[c] < z_tolerance)) && | ||
multz(c) != 0.0) | ||
{ | ||
// Check whether there is a gap to the neighbor below whose thickness is less | ||
// than MAX_GAP. In that case we need to create an NNC if there is a gap between the two cells. | ||
int kk_below = kk + 1; | ||
int c_below = ii + dims_[0] * (jj + dims_[1] * kk_below); | ||
|
||
if ((actnum.empty() || actnum[c_below]) && pv[c_below] > minpvv[c_below]) | ||
if ( (actnum.empty() || actnum[c_below]) | ||
&& | ||
!((pv[c_below] < minpvv[c_below]) || (thickness[c_below] < z_tolerance) ) ) | ||
{ | ||
// Check MAX_GAP threshold | ||
std::array<double, 8> cz = getCellZcorn(ii, jj, kk, zcorn); | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -576,7 +576,7 @@ int addOverlapLayer([[maybe_unused]] const CpGrid& grid, | |
int index = ix.index(*it); | ||
auto owner = cell_part[index]; | ||
exportProcs.insert(std::make_pair(owner, 0)); | ||
if ( trans ) { | ||
if ( trans && false) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You have a draft pullrequest on the same. It include communication even if trans=0 in case one have other effects like thermal or mechanics over this. |
||
addOverlapLayerNoZeroTrans(grid, index, *it, owner, cell_part, exportList, addCornerCells, layers-1, trans, level); | ||
} | ||
else { | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This (and all the changes below checking the thickness of active cells) seem suspicious as we should never create NNCs over active cells. Aren't these changes allowing this?
If you change the meaning of a variable then you should probably also change the name to reflect this.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The case this fixed was when all cells where pinched but pv>0 i.e. pv \approx 1e-14. It should not be any difference between c_thin && active and (pv < minpvv[c]) && active treatment.