diff --git a/src/nub.ts b/src/nub.ts index 783a199fcab8ecdc3833d8849fc6f5981da631b8..64e31c46d91211303adee731364c877dcbe67499 100644 --- a/src/nub.ts +++ b/src/nub.ts @@ -1660,6 +1660,29 @@ export abstract class Nub extends ComputeNode implements IProperties { return true; } + /** + * @returns true if all messages in nub hierarchy have the same code + */ + public hasOnlyMessage(code: MessageCode): boolean { + for (const n of this.allChildNubIterator) { + if (!n.result.hasOnlyMessage(code)) { + return false; + } + } + return true; + } + + public get uniqueMessageCodes(): MessageCode[] { + let res: MessageCode[] = []; + for (const n of this.allChildNubIterator) { + if (n.uid === "MDZ3aH") { + debugger + } + res = res.concat(n.result.uniqueMessageCodes); + } + return res; + } + // interface IObservable /** diff --git a/src/prebarrage/pre_barrage.ts b/src/prebarrage/pre_barrage.ts index 5ae7adecc78d79baed041ff50a6134231629ad84..82c9e16431f67fd3e442df3abb262796822c393b 100644 --- a/src/prebarrage/pre_barrage.ts +++ b/src/prebarrage/pre_barrage.ts @@ -381,7 +381,9 @@ export class PreBarrage extends Nub { } // if an error occurred in any nub, remove all results - if (!this.allResultsOk) { + // except if it's a dichotomy convergence error (and only this error) + + if (!this.allResultsOk && !this.hasOnlyMessage(MessageCode.ERROR_DICHO_CONVERGE)) { for (const c of this.allChildNubIterator) { c.result.resultElement.removeValues(); } diff --git a/src/util/log.ts b/src/util/log.ts index 3ef3719689dd4e4f9610ecfd2d0d491665763118..d78c7d924738979c84b433498859f1370e382f35 100644 --- a/src/util/log.ts +++ b/src/util/log.ts @@ -103,6 +103,28 @@ export class cLog { return undefined; } + /** + * @returns true if all messages have the same code + */ + public hasOnlyMessage(code: MessageCode): boolean { + for (const m of this.messages) { + if (m.code !== code) { + return false; + } + } + return true; + } + + public get uniqueMessageCodes(): MessageCode[] { + const res: MessageCode[] = []; + for (const m of this.messages) { + if (res.indexOf(m.code) === -1) { + res.push(m.code); + } + } + return res; + } + /** * compute error, warning, info count in a message list */ diff --git a/src/util/result.ts b/src/util/result.ts index a396c11a35685dbdabb43f8c0644a637fb1d9364..cba512d9e577696839624e314d4317fd690cbf7d 100644 --- a/src/util/result.ts +++ b/src/util/result.ts @@ -299,6 +299,29 @@ export class Result extends JalhydObject { return false; } + /** + * determine if all messages have the same code + * @param code message code to find + */ + public hasOnlyMessage(code: MessageCode): boolean { + if (!this._globalLog.hasOnlyMessage(code)) { + return false; + } + + if (!this.resultElement.log.hasOnlyMessage(code)) { + return false; + } + + return true; + } + + public get uniqueMessageCodes(): MessageCode[] { + let res: MessageCode[] = []; + res = res.concat(this._globalLog.uniqueMessageCodes); + res = res.concat(this.resultElement.log.uniqueMessageCodes); + return res; + } + /** * compute log stats (# of error, warning, info) on all result element */