From e10e16762655fdf06e939baa5e0ad868536a04a0 Mon Sep 17 00:00:00 2001 From: Rick-Methot-NOAA Date: Thu, 11 Sep 2025 16:52:37 -0700 Subject: [PATCH 1/5] adjust the Lmin test for t0 users; more comments in code --- SS_readcontrol_330.tpl | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/SS_readcontrol_330.tpl b/SS_readcontrol_330.tpl index ac7ecde3..a5d2fb10 100644 --- a/SS_readcontrol_330.tpl +++ b/SS_readcontrol_330.tpl @@ -1614,10 +1614,13 @@ Ip += N_natMparms; mgp_type(Ip, Ip + N_growparms - 1) = 2; // growth parms - // check on out of bound Lmin values. Only check females because males can be offset from females - // allow for AFIX < 0 because those models are inputting the age at L=0, which must be negative + // check on out of bound Lmin values. Only check females because male parameter can be offset from females + // bypass for AFIX <= 0 because those models are inputting the age at L=0, commonly termed t0 + // note that AFIX is age post-settlement + // if AFIX is > 0, then fish settle at age 0.0 at length = len_bins(1), then grow linearly until reaching Lmin at age (post-settlement) = AFIX + // keeping LMIN >= len_bins(1) prevents shrinkage during that linear growth stanza - if ( gp == 1 && WTage_rd == 0 && AFIX >= 0.0) + if ( gp == 1 && WTage_rd == 0 && AFIX > 0.0) // apply test { if (MGparm_1(Ip,1) < len_bins(1)) { From 2d6552beb4078881f279eb84a97ee24c7696ca51 Mon Sep 17 00:00:00 2001 From: Rick-Methot-NOAA Date: Fri, 12 Sep 2025 17:02:47 -0700 Subject: [PATCH 2/5] revised Lmin tests --- SS_prelim.tpl | 22 ++++++++++++++++------ SS_readcontrol_330.tpl | 8 ++++---- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/SS_prelim.tpl b/SS_prelim.tpl index 736a698c..426f8a9f 100644 --- a/SS_prelim.tpl +++ b/SS_prelim.tpl @@ -1285,6 +1285,7 @@ // SS_Label_Info_6.8.3 #Call fxn get_growth2() to calculate size-at-age get_growth2(styr); // in preliminary calcs + get_growth3(styr, t_base + 1, 1, 1); // this will apply linear below AFIX gp = 0; for (gg = 1; gg <= gender; gg++) for (int GPat = 1; GPat <= N_GP; GPat++) @@ -1295,18 +1296,27 @@ { g += N_platoon; echoinput << "sex: " << gg << "; Gpat: " << GPat << " settle: " << settle << "; L-at-Amin: " << Lmin(gp) << "; L at max age: " << Ave_Size(styr, 1, g, nages) << endl; - if (len_bins(1) > Lmin(gp)) - { - warnstream << "Minimum pop size bin:_" << len_bins(1) << "; is > L at Amin for sex: " << gg - << "; Gpat: " << GPat << "; L= " << Lmin(gp); - write_message (WARN, 0); - } if (Ave_Size(styr, 1, g, nages) > 0.95 * len_bins(nlength)) { warnstream << "Maximum pop size bin:_" << len_bins(nlength) << "; is within 5% of L at maxage for sex: " << gg << "; Gpat: " << GPat << " settle: " << settle << "; L= " << Ave_Size(styr, 1, g, nages); write_message (WARN, 0); } + for (a = 0; a <= nages; a++) + { + if (Ave_Size(styr, 1, g, a) < 0.0 && a > AFIX) + { + warnstream << "Negative Length calculated for: " << "sex: " << gg << "; Gpat: " << GPat << " settle: " << settle + << " age: " << a << " Len@age = " << Ave_Size(styr, 1, g, a); + write_message (FATAL, 0); + } + if (a > 0 && Ave_Size(styr, 1, g, a) < Ave_Size(styr, 1, g, a-1)) + { + warnstream << "Decreasing Len@age calculated for sex: " << gg << "; Gpat: " << GPat << " settle: " << settle + << " at age: " << a << " Len@age = " << Ave_Size(styr, 1, g, a) << " < " << Ave_Size(styr, 1, g, a - 1); + write_message (WARN, 0); + } + } } } diff --git a/SS_readcontrol_330.tpl b/SS_readcontrol_330.tpl index a5d2fb10..08ccaadf 100644 --- a/SS_readcontrol_330.tpl +++ b/SS_readcontrol_330.tpl @@ -1624,13 +1624,13 @@ { if (MGparm_1(Ip,1) < len_bins(1)) { - warnstream << "parm min for Lmin: " << MGparm_1(Ip,1) << " cannot be less than population min length bin " << len_bins(1); - write_message (FATAL, 0); // EXIT! + warnstream << "parm min for Lmin: " << MGparm_1(Ip,1) << " should not be less than population min length bin " << len_bins(1); + write_message (WARN, 0); // EXIT! } if (MGparm_1(Ip,3) < len_bins(1)) { - warnstream << "parm init value for Lmin: " << MGparm_1(Ip,3) << " cannot be less than population min length bin " << len_bins(1); - write_message (FATAL, 0); // EXIT! + warnstream << "parm init value for Lmin: " << MGparm_1(Ip,3) << " should not be less than population min length bin " << len_bins(1); + write_message (WARN, 0); // EXIT! } } // check on estimation of variance parameters for CV_young and CV_old From 9b3fcf98f14769c3893c2696ecc73e4d3ba1c99c Mon Sep 17 00:00:00 2001 From: Rick Methot Date: Mon, 15 Sep 2025 15:32:53 -0700 Subject: [PATCH 3/5] add neg. length test to report --- SS_prelim.tpl | 2 +- SS_readcontrol_330.tpl | 9 +++++---- SS_write_report.tpl | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 5 deletions(-) diff --git a/SS_prelim.tpl b/SS_prelim.tpl index 426f8a9f..02b2cdec 100644 --- a/SS_prelim.tpl +++ b/SS_prelim.tpl @@ -1304,7 +1304,7 @@ } for (a = 0; a <= nages; a++) { - if (Ave_Size(styr, 1, g, a) < 0.0 && a > AFIX) + if (Ave_Size(styr, 1, g, a) < 0.0) { warnstream << "Negative Length calculated for: " << "sex: " << gg << "; Gpat: " << GPat << " settle: " << settle << " age: " << a << " Len@age = " << Ave_Size(styr, 1, g, a); diff --git a/SS_readcontrol_330.tpl b/SS_readcontrol_330.tpl index 08ccaadf..e9aa93e6 100644 --- a/SS_readcontrol_330.tpl +++ b/SS_readcontrol_330.tpl @@ -1618,18 +1618,19 @@ // bypass for AFIX <= 0 because those models are inputting the age at L=0, commonly termed t0 // note that AFIX is age post-settlement // if AFIX is > 0, then fish settle at age 0.0 at length = len_bins(1), then grow linearly until reaching Lmin at age (post-settlement) = AFIX - // keeping LMIN >= len_bins(1) prevents shrinkage during that linear growth stanza + // keeping Lmin >= len_bins(1) prevents shrinkage during that linear growth stanza + // additional checks occur in preliminary calcs regarding generating L@age < 0, or generating a decreasing trend in L@age due to linear growth below AFIX - if ( gp == 1 && WTage_rd == 0 && AFIX > 0.0) // apply test + if ( gp == 1 && WTage_rd == 0 && AFIX >= 0.0) // apply test { if (MGparm_1(Ip,1) < len_bins(1)) { warnstream << "parm min for Lmin: " << MGparm_1(Ip,1) << " should not be less than population min length bin " << len_bins(1); write_message (WARN, 0); // EXIT! } - if (MGparm_1(Ip,3) < len_bins(1)) + if (MGparm_1(Ip,3) < len_bins(1) && MGparm_1(Ip,7) >= 0) { - warnstream << "parm init value for Lmin: " << MGparm_1(Ip,3) << " should not be less than population min length bin " << len_bins(1); + warnstream << "parm init value for Lmin: " << MGparm_1(Ip,3) << " should not be less than population min length bin if Lmin estimated" << len_bins(1); write_message (WARN, 0); // EXIT! } } diff --git a/SS_write_report.tpl b/SS_write_report.tpl index f9855ffc..0346fa82 100644 --- a/SS_write_report.tpl +++ b/SS_write_report.tpl @@ -3682,6 +3682,40 @@ FUNCTION void write_bigoutput() SS2out << save_G_parm(g)(1, 2) << " " << sx(save_G_parm(g, 3)) << " " << save_G_parm(g)(3, 22) << endl; } } + + gp = 0; + for (gg = 1; gg <= gender; gg++) + for (int GPat = 1; GPat <= N_GP; GPat++) + { + gp++; + g = g_Start(gp); // base platoon + for (settle = 1; settle <= N_settle_timings; settle++) + { + g += N_platoon; + if (Ave_Size(styr, 1, g, nages) > 0.95 * len_bins(nlength)) + { + warnstream << "Maximum pop size bin:_" << len_bins(nlength) << "; is within 5% of L at maxage for sex: " << gg + << "; Gpat: " << GPat << " settle: " << settle << "; L= " << Ave_Size(styr, 1, g, nages); + write_message (WARN, 0); + } + for (a = 0; a <= nages; a++) + { + if (Ave_Size(styr, 1, g, a) < 0.0) + { + warnstream << "Negative Length calculated for: " << "sex: " << gg << "; Gpat: " << GPat << " settle: " << settle + << " age: " << a << " Len@age = " << Ave_Size(styr, 1, g, a); + write_message (WARN, 0); + } + if (a > 0 && Ave_Size(styr, 1, g, a) < Ave_Size(styr, 1, g, a-1)) + { + warnstream << "Decreasing Len@age calculated for sex: " << gg << "; Gpat: " << GPat << " settle: " << settle + << " at age: " << a << " Len@age = " << Ave_Size(styr, 1, g, a) << " < " << Ave_Size(styr, 1, g, a - 1); + write_message (WARN, 0); + } + } + } + } + // REPORT_KEYWORD 46 SEASONAL_BIOLOGY if (pick_report_use(46) == "Y" && MGparm_doseas > 0) { From 0552924be9a778ec3ba297b0d70cb3e40d2fe897 Mon Sep 17 00:00:00 2001 From: Rick Methot Date: Tue, 16 Sep 2025 14:01:12 -0700 Subject: [PATCH 4/5] convert lbin_lo to real for compare to len_bins --- SS_readdata_330.tpl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SS_readdata_330.tpl b/SS_readdata_330.tpl index bb681676..89b9f783 100644 --- a/SS_readdata_330.tpl +++ b/SS_readdata_330.tpl @@ -2445,8 +2445,8 @@ imatrix mkt_a(1,Nfleet,1,Nobs_a); 3darray Lbin_filter(1,Nfleet,1,Nobs_a,1,nlength2); imatrix use_Lbin_filter(1,Nfleet,1,Nobs_a); - imatrix Lbin_lo(1,Nfleet,1,Nobs_a); - imatrix Lbin_hi(1,Nfleet,1,Nobs_a); + matrix Lbin_lo(1,Nfleet,1,Nobs_a); + matrix Lbin_hi(1,Nfleet,1,Nobs_a); 3darray tails_a(1,Nfleet,1,Nobs_a,1,4); // min-max bin for females; min-max bin for males 3darray header_a(1,Nfleet,1,Nobs_a,1,9); 3darray header_a_rd(1,Nfleet,1,Nobs_a,2,3); From 7d3a86d8a7abf7a9fa5c023728dcdfb262be1de7 Mon Sep 17 00:00:00 2001 From: Rick Methot Date: Wed, 17 Sep 2025 15:24:48 -0700 Subject: [PATCH 5/5] add use_morph(g) to the test --- SS_prelim.tpl | 3 +++ SS_write_report.tpl | 3 +++ 2 files changed, 6 insertions(+) diff --git a/SS_prelim.tpl b/SS_prelim.tpl index 02b2cdec..f02b9636 100644 --- a/SS_prelim.tpl +++ b/SS_prelim.tpl @@ -1295,6 +1295,8 @@ for (settle = 1; settle <= N_settle_timings; settle++) { g += N_platoon; + if (use_morph(g) > 0) + { echoinput << "sex: " << gg << "; Gpat: " << GPat << " settle: " << settle << "; L-at-Amin: " << Lmin(gp) << "; L at max age: " << Ave_Size(styr, 1, g, nages) << endl; if (Ave_Size(styr, 1, g, nages) > 0.95 * len_bins(nlength)) { @@ -1318,6 +1320,7 @@ } } } + } } for (s = 1; s <= nseas; s++) // get growth here in case needed for Lorenzen diff --git a/SS_write_report.tpl b/SS_write_report.tpl index 0346fa82..c2242670 100644 --- a/SS_write_report.tpl +++ b/SS_write_report.tpl @@ -3692,6 +3692,8 @@ FUNCTION void write_bigoutput() for (settle = 1; settle <= N_settle_timings; settle++) { g += N_platoon; + if (use_morph(g) > 0) + { if (Ave_Size(styr, 1, g, nages) > 0.95 * len_bins(nlength)) { warnstream << "Maximum pop size bin:_" << len_bins(nlength) << "; is within 5% of L at maxage for sex: " << gg @@ -3714,6 +3716,7 @@ FUNCTION void write_bigoutput() } } } + } } // REPORT_KEYWORD 46 SEASONAL_BIOLOGY