2a3
> #include <vector>
4d4
< #include <cstdlib> /* exit() */
8a9
> #include <cassert>
11a13,15
> #include "FileException.h"
> #include "OpenException.h"
> 
21,23d24
<         ZONE *zone;
<         GROUP *group;
< 
25,27c26,28
<         pApp->m_zoneList = (LIST_PTR *)List::reset(pApp->m_zoneList);
<         zone = (ZONE *)List::next( pApp->m_zoneList );
<         while ( 0 != zone )
---
> 
>         typedef vector<ZoneStruct*>::iterator ZI;
>         for (ZI zoneIter = pApp->m_zoneList.begin(); zoneIter != pApp->m_zoneList.end(); ++zoneIter)
29c30,32
<             if ( zone->reportFlags == 0 )
---
>             ZoneStruct* pCurrentZone = (*zoneIter);
> 
>             if ( pCurrentZone->reportFlags == 0 )
31c34
<                 fprintf( stdout, "\nZone(%s)->reportFlags: 0", zone->label );
---
>                 fprintf( stdout, "\nZone(%s)->reportFlags: 0", pCurrentZone->label );
34,50c37,53
<                     zone->label,
<                     zone->reportFlags->inv_start,
<                     zone->reportFlags->inv_end,
<                     zone->reportFlags->inv_ha_rep_start,
<                     zone->reportFlags->inv_ha_rep_end,
<                     zone->reportFlags->inv_m3_rep_start,
<                     zone->reportFlags->inv_m3_rep_end,
<                     zone->reportFlags->inv_ha_sum_start,
<                     zone->reportFlags->inv_ha_sum_end,
<                     zone->reportFlags->inv_m3_sum_start,
<                     zone->reportFlags->inv_m3_sum_end,
<                     zone->reportFlags->axs_rep_start,
<                     zone->reportFlags->axs_rep_end,
<                     zone->reportFlags->levels_rep_start,
<                     zone->reportFlags->levels_rep_end,
<                     zone->reportFlags->hage_rep_start,
<                     zone->reportFlags->hage_rep_end );
---
>                     pCurrentZone->label,
>                     pCurrentZone->reportFlags->inv_start,
>                     pCurrentZone->reportFlags->inv_end,
>                     pCurrentZone->reportFlags->inv_ha_rep_start,
>                     pCurrentZone->reportFlags->inv_ha_rep_end,
>                     pCurrentZone->reportFlags->inv_m3_rep_start,
>                     pCurrentZone->reportFlags->inv_m3_rep_end,
>                     pCurrentZone->reportFlags->inv_ha_sum_start,
>                     pCurrentZone->reportFlags->inv_ha_sum_end,
>                     pCurrentZone->reportFlags->inv_m3_sum_start,
>                     pCurrentZone->reportFlags->inv_m3_sum_end,
>                     pCurrentZone->reportFlags->axs_rep_start,
>                     pCurrentZone->reportFlags->axs_rep_end,
>                     pCurrentZone->reportFlags->levels_rep_start,
>                     pCurrentZone->reportFlags->levels_rep_end,
>                     pCurrentZone->reportFlags->hage_rep_start,
>                     pCurrentZone->reportFlags->hage_rep_end );
52c55
<             zone = (ZONE *)List::next( pApp->m_zoneList );
---
> 
54,56c57,59
<         pApp->m_groupList = (LIST_PTR *)List::reset(pApp->m_groupList);
<         group = (GROUP *)List::next( pApp->m_groupList );
<         while ( 0 != group )
---
>         typedef vector<GroupStruct*>::iterator GI;
>         for (GI groupIter = pApp->m_groupList.begin(); //!pApp->m_groupList.empty() &&
>                 groupIter != pApp->m_groupList.end(); ++groupIter)
58c61,63
<             if ( group->reportFlags == 0 )
---
>             GroupStruct* pCurrentGroup = (*groupIter);
> 
>             if ( pCurrentGroup->reportFlags == 0 )
60,61c65,68
<                 fprintf( stdout, "\nGroup(%s)->reportFlags: 0", group->label );
<             } else {
---
>                 fprintf( stdout, "\nGroup(%s)->reportFlags: 0", pCurrentGroup->label );
>             }
>             else
>             {
63,79c70,86
<                     group->label,
<                     group->reportFlags->inv_start,
<                     group->reportFlags->inv_end,
<                     group->reportFlags->inv_ha_rep_start,
<                     group->reportFlags->inv_ha_rep_end,
<                     group->reportFlags->inv_m3_rep_start,
<                     group->reportFlags->inv_m3_rep_end,
<                     group->reportFlags->inv_ha_sum_start,
<                     group->reportFlags->inv_ha_sum_end,
<                     group->reportFlags->inv_m3_sum_start,
<                     group->reportFlags->inv_m3_sum_end,
<                     group->reportFlags->axs_rep_start,
<                     group->reportFlags->axs_rep_end,
<                     group->reportFlags->levels_rep_start,
<                     group->reportFlags->levels_rep_end,
<                     group->reportFlags->hage_rep_start,
<                     group->reportFlags->hage_rep_end );
---
>                     pCurrentGroup->label,
>                     pCurrentGroup->reportFlags->inv_start,
>                     pCurrentGroup->reportFlags->inv_end,
>                     pCurrentGroup->reportFlags->inv_ha_rep_start,
>                     pCurrentGroup->reportFlags->inv_ha_rep_end,
>                     pCurrentGroup->reportFlags->inv_m3_rep_start,
>                     pCurrentGroup->reportFlags->inv_m3_rep_end,
>                     pCurrentGroup->reportFlags->inv_ha_sum_start,
>                     pCurrentGroup->reportFlags->inv_ha_sum_end,
>                     pCurrentGroup->reportFlags->inv_m3_sum_start,
>                     pCurrentGroup->reportFlags->inv_m3_sum_end,
>                     pCurrentGroup->reportFlags->axs_rep_start,
>                     pCurrentGroup->reportFlags->axs_rep_end,
>                     pCurrentGroup->reportFlags->levels_rep_start,
>                     pCurrentGroup->reportFlags->levels_rep_end,
>                     pCurrentGroup->reportFlags->hage_rep_start,
>                     pCurrentGroup->reportFlags->hage_rep_end );
81c88
<             group = (GROUP *)List::next( pApp->m_groupList );
---
> 
87,90d93
<         ZONE *zone;
<         AU *au;
<         TIMBER_CLASS *timber_class;
<         GROUP *group;
94c97
<         printf("\n    Zone      AU  Type   AgeRange     Area    Groups");
---
>         printf("\n    Zone      AUStruct  Type   AgeRange     Area    Groups");
97,99c100,102
<         pApp->m_zoneList = (LIST_PTR *)List::reset(pApp->m_zoneList);
<         zone = (ZONE *)List::next(pApp->m_zoneList);
<         while ( 0 != zone )
---
> 
>         typedef vector<ZoneStruct*>::iterator ZI;
>         for (ZI zoneIter = pApp->m_zoneList.begin(); zoneIter != pApp->m_zoneList.end(); ++zoneIter)
101,103c104,105
<             zone->aulist = (LIST_PTR *)List::reset(zone->aulist);
<             au = static_cast<AU*>(List::next(zone->aulist));
<             while ( 0 != au )
---
>             typedef vector<AUStruct*>::iterator AI;
>             for (AI auIter = (*zoneIter)->aulist.begin(); auIter != (*zoneIter)->aulist.end(); ++auIter)
105,107c107,108
<                 au->classlist = (LIST_PTR *)List::reset(au->classlist);
<                 timber_class = (TIMBER_CLASS *)List::next(au->classlist);
<                 while ( 0 != timber_class )
---
>                 typedef multimap<int, TimberClassStruct*>::iterator CI;
>                 for (CI classIter = (*auIter)->classlist.begin(); classIter != (*auIter)->classlist.end(); ++classIter)
108a110,116
>                     TimberClassStruct* pCurrentTimberClass = classIter->second;
> 
> #ifdef _TSB_AGE_DEBUG
>                     cout << endl << "debug_display_classes: age: " << pCurrentTimberClass->age << endl;
> #endif
>                     assert(pCurrentTimberClass->parent_au != 0);
> 
110,112c118,120
<                     timber_class->static_group_list = (LIST_PTR *)List::reset(timber_class->static_group_list);
<                     group = (GROUP *)List::next(timber_class->static_group_list);
<                     while ( 0 != group )
---
>                     /* not sure why this was here, but it doesn't do anything but waste time! K.B.
>                     vector<GroupStruct*>::iterator groupIter = pCurrentTimberClass->static_group_list.begin();
>                     while (groupIter != pCurrentTimberClass->static_group_list.end())
114c122
<                         group = (GROUP *)List::next(timber_class->static_group_list);
---
> 
116,118c124,128
<                     timber_class->float_group_list = (LIST_PTR *)List::reset(timber_class->float_group_list);
<                     group = (GROUP *)List::next(timber_class->float_group_list);
<                     while ( 0 != group )
---
>                     */
>                     typedef list<GroupStruct*>::iterator GI;
>                     for (GI groupIter = pCurrentTimberClass->float_group_list.begin();
>                             //!pCurrentTimberClass->float_group_list.empty() &&
>                             groupIter != pCurrentTimberClass->float_group_list.end(); ++groupIter)
120,121c130,131
<                         if ( ( strcmp(group->label, "MissedThinning") == 0 ) ||
<                             ( strcmp(group->label, "CommThin") == 0 ) )
---
>                         if ( ( strcmp((*groupIter)->label, "MissedThinning") == 0 ) ||
>                             ( strcmp((*groupIter)->label, "CommThin") == 0 ) )
125c135
<                         group = (GROUP *)List::next(timber_class->float_group_list);
---
> 
130,138c140,150
<                             timber_class->parent_zone->label,
<                             timber_class->parent_au->label,
<                             timber_class->class_type,
<                             timber_class->age - timber_class->width+1,
<                             timber_class->age,
<                             timber_class->area);
<                         timber_class->static_group_list = (LIST_PTR *)List::reset(timber_class->static_group_list);
<                         group = (GROUP *)List::next(timber_class->static_group_list);
<                         while ( 0 != group )
---
>                             pCurrentTimberClass->parent_zone->label,
>                             pCurrentTimberClass->parent_au->label,
>                             pCurrentTimberClass->class_type,
>                             pCurrentTimberClass->age - pCurrentTimberClass->width+1,
>                             pCurrentTimberClass->age,
>                             pCurrentTimberClass->area);
> 
>                         typedef list<GroupStruct*>::iterator GI;
>                         for (GI staticGroupIter = pCurrentTimberClass->static_group_list.begin();
>                                 //!pCurrentTimberClass->static_group_list.empty() &&
>                                 staticGroupIter != pCurrentTimberClass->static_group_list.end(); ++staticGroupIter)
140,141c152,153
<                             if ( ( strcmp(group->label, "MissedThinning") == 0 ) ||
<                                 ( strcmp(group->label, "CommThin") == 0 ) )
---
>                             if ( ( strcmp((*staticGroupIter)->label, "MissedThinning") == 0 ) ||
>                                 ( strcmp((*staticGroupIter)->label, "CommThin") == 0 ) )
143c155
<                                 printf(" S(%s) ", group->label);
---
>                                 printf(" S(%s) ", (*staticGroupIter)->label);
145c157
<                             group = (GROUP *)List::next(timber_class->static_group_list);
---
> 
147,149c159,161
<                         timber_class->float_group_list = (LIST_PTR *)List::reset(timber_class->float_group_list);
<                         group = (GROUP *)List::next(timber_class->float_group_list);
<                         while ( 0 != group )
---
>                         for (GI floatGroupIter = pCurrentTimberClass->float_group_list.begin();
>                                 //!pCurrentTimberClass->float_group_list.empty() &&
>                                 floatGroupIter != pCurrentTimberClass->float_group_list.end(); ++floatGroupIter)
151,152c163,164
<                             if ( ( strcmp(group->label, "MissedThinning") == 0 ) ||
<                                 ( strcmp(group->label, "CommThin") == 0 ) )
---
>                             if ( ( strcmp((*floatGroupIter)->label, "MissedThinning") == 0 ) ||
>                                 ( strcmp((*floatGroupIter)->label, "CommThin") == 0 ) )
154c166
<                                 printf(" F(%s) ", group->label);
---
>                                 printf(" F(%s) ", (*floatGroupIter)->label);
156c168
<                             group = (GROUP *)List::next(timber_class->float_group_list);
---
> 
159c171
<                     timber_class = (TIMBER_CLASS *)List::next(au->classlist);
---
> 
161c173
<                 au = static_cast<AU*>(List::next(zone->aulist));
---
> 
163c175
<             zone = (ZONE *)List::next(pApp->m_zoneList);
---
> 
169c181
<     void report_graphs(const char *datadir)
---
>     void report_graphs(const string& datadir)
171,175d182
<         GROUP *group;
<         FILE *fp;
<         char	dirname[255], filename[255];
<         int i;
< 
177c184,185
<         sprintf(dirname, "%s/%s", datadir, pApp->m_outputDirectory.c_str());
---
>         string dirname = datadir + "/";
>         dirname += pApp->m_outputDirectory;
179,182c187,190
<         fp= 0;
<         sprintf(filename, "%s/graph.dat", dirname);
<         fp=(FILE *)fopen(filename, "w");
<         if (fp== 0)
---
>         string filename = dirname + "/graph.dat";
>         FILE* fp = fopen(filename.c_str(), "w");
> 
>         if (fp == 0)
184,185c192
<             printf("\n\nERROR: report_open_files(): Could not open %s\n\n", filename);
<             exit(1);
---
>             throw OpenException();
189c196
<         for ( i=0; i<=pApp->m_planHorizon; ++i )
---
>         for ( int i = 0; i <= pApp->m_planHorizon; ++i )
194,196c201,203
<         pApp->m_groupList = (LIST_PTR *)List::reset(pApp->m_groupList);
<         group = (GROUP *)List::next(pApp->m_groupList);
<         while ( 0 != group )
---
>         typedef vector<GroupStruct*>::iterator GI;
>         for (GI groupIter = pApp->m_groupList.begin(); //!pApp->m_groupList.empty() &&
>                 groupIter != pApp->m_groupList.end(); ++groupIter)
198,199c205,206
<             fprintf(fp, "\n%s", group->label);
<             group = (GROUP *)List::next(pApp->m_groupList);
---
>             fprintf(fp, "\n%s", (*groupIter)->label);
> 
206c213
<     void report_open_files(const char *datadir)
---
>     void report_open_files(const string& datadir)
208,209d214
<         char	dirname[255], filename[255];
< 
211d215
<         sprintf(dirname, "%s/%s", datadir, pApp->m_outputDirectory.c_str());
213,216c217,227
<         pApp->m_pFileTrace= 0;
<         sprintf(filename, "%s/trace.rep", dirname);
<         pApp->m_pFileTrace=(FILE *)fopen(filename, "w");
<         if (pApp->m_pFileTrace== 0)
---
>         string dirname = datadir + "/";
>         dirname += pApp->m_outputDirectory;
>         string filename;
> #ifdef _TSB_REPORT_OPEN_FILES
>         cout << endl << "datadir: " << datadir << " dirname: " << dirname << endl;
> #endif
> 
>         // open trace.rep
>         filename = dirname + "/trace.rep";
>         pApp->m_pFileTrace = fopen(filename.c_str(), "w");
>         if (pApp->m_pFileTrace == 0)
218,219c229,231
<             printf("\n\nERROR: report_open_files(): Could not open %s\n\n", filename);
<             exit(1);
---
>             string message("ERROR: report_open_files(): Could not open ");
>             message += filename;
>             throw FileException(message);
221c233
<         if (pApp->m_enableTrace==false)
---
>         if (pApp->m_enableTrace == false)
223c235
<             fprintf(pApp->m_pFileTrace, "\n\n%s: Trace disabled\n\n", filename);
---
>             fprintf(pApp->m_pFileTrace, "\n\n%s: Trace disabled\n\n", filename.c_str());
226,233c238,240
<         // if block reporting flag is enabled
<         pApp->m_pFileBlockReport = 0;
<         sprintf(filename, "%s/levels.blk", dirname);
<         pApp->m_pFileBlockReport = (FILE *)fopen(filename, "w");
<         if ( 0 == pApp->m_pFileBlockReport ) {
<                 printf("\n\nERROR: report_open_files(): Could not open %s\n\n", filename);
<                 exit(-2);
<         }
---
>         // open levels.blk
>         filename = dirname + "/levels.blk";
>         pApp->m_pFileBlockReport = fopen(filename.c_str(), "w");
235c242
<         if (pApp->m_enableBlockReport==false)
---
>         if ( 0 == pApp->m_pFileBlockReport )
237c244,246
<                 fprintf(pApp->m_pFileBlockReport, "\n\n Block Reporting Disabled \n\n");
---
>             string message("ERROR: report_open_files(): Could not open ");
>             message += filename;
>             throw FileException(message);
239c248
<         else
---
>         if (pApp->m_enableBlockReport == false)
241c250
<                 fprintf(pApp->m_pFileBlockReport, "\nPeriod         Zone       AU      Block    HArea");
---
>             fprintf(pApp->m_pFileBlockReport, "\n\n Block Reporting Disabled \n\n");
242a252,255
>         else // if block reporting flag is enabled
>         {
>             fprintf(pApp->m_pFileBlockReport, "\nPeriod         Zone       AUStruct      Block    HArea");
>         }
244,247c257,260
<         pApp->m_pFileLevels = 0;
<         sprintf(filename, "%s/levels.rep", dirname);
<         pApp->m_pFileLevels=(FILE *)fopen(filename, "w");
<         if (pApp->m_pFileLevels== 0)
---
>         // open levels.rep
>         filename = dirname + "/levels.rep";
>         pApp->m_pFileLevels=fopen(filename.c_str(), "w");
>         if (pApp->m_pFileLevels == 0)
249,250c262,264
<             printf("\n\nERROR: report_open_files(): Could not open %s\n\n", filename);
<             exit(1);
---
>             string message("ERROR: report_open_files(): Could not open ");
>             message += filename;
>             throw FileException(message);
252c266
<         if (pApp->m_enableReportHeaders==true)
---
>         if (pApp->m_enableReportHeaders == true)
260,261c274,275
<         sprintf(filename, "%s/hage.rep", dirname);
<         pApp->m_pFileAgeDistribution = (FILE *)fopen(filename, "w");
---
>         filename = dirname + "/hage.rep";
>         pApp->m_pFileAgeDistribution = fopen(filename.c_str(), "w");
264,265c278,280
<             printf("\n\nERROR: report_open_files(): Could not open %s\n\n", filename);
<             exit(1);
---
>             string message("ERROR: report_open_files(): Could not open ");
>             message += filename;
>             throw FileException(message);
267c282
<         if (pApp->m_enableReports==false)
---
>         if (pApp->m_enableReports == false)
269c284
<             fprintf(pApp->m_pFileAgeDistribution, "\n\n%s: Reporting OFF\n\n", filename);
---
>             fprintf(pApp->m_pFileAgeDistribution, "\n\n%s: Reporting OFF\n\n", filename.c_str());
273,274c288,289
<         sprintf(filename, "%s/transfers.rep", dirname);
<         pApp->m_pFileTransfer = (FILE *)fopen(filename, "w");
---
>         filename = dirname + "/transfers.rep";
>         pApp->m_pFileTransfer = fopen(filename.c_str(), "w");
277,278c292,294
<             printf("\n\nERROR: report_open_files(): Could not open %s\n\n", filename);
<             exit(1);
---
>             string message("ERROR: report_open_files(): Could not open ");
>             message += filename;
>             throw FileException(message);
280c296
<         if (pApp->m_enableReports==false)
---
>         if (pApp->m_enableReports == false)
282,283c298,300
<             fprintf(pApp->m_pFileTransfer, "\n\n%s: Reporting OFF\n\n", filename);
<         } else if (pApp->m_transfersSpecified==false)
---
>             fprintf(pApp->m_pFileTransfer, "\n\n%s: Reporting OFF\n\n", filename.c_str());
>         }
>         else if (pApp->m_transfersSpecified == false)
285,286c302,304
<             fprintf(pApp->m_pFileTransfer, "\n\n%s: No transfers specified", filename);
<         } else if (pApp->m_enableReportHeaders==true)
---
>             fprintf(pApp->m_pFileTransfer, "\n\n%s: No transfers specified", filename.c_str());
>         }
>         else if (pApp->m_enableReportHeaders == true)
288c306
<             fprintf(pApp->m_pFileTransfer, "\nPeriod  Zone    AU  Age     Area   Type   RAge   ->    Zone    AU  Age     Area   Type   RAge");
---
>             fprintf(pApp->m_pFileTransfer, "\nPeriod  Zone    AUStruct  Age     Area   Type   RAge   ->    Zone    AUStruct  Age     Area   Type   RAge");
292,293c310,311
<         sprintf(filename, "%s/constraints.rep", dirname);
<         pApp->m_pFileConst = (FILE *)fopen(filename, "w");
---
>         filename = dirname + "/constraints.rep";
>         pApp->m_pFileConst = fopen(filename.c_str(), "w");
296,297c314,316
<             printf("\n\nERROR: report_open_files(): Could not open %s\n\n", filename);
<             exit(1);
---
>             string message("ERROR: report_open_files(): Could not open ");
>             message += filename;
>             throw FileException(message);
299c318
<         if (pApp->m_enableReports==false)
---
>         if (pApp->m_enableReports == false)
301c320
<             fprintf(pApp->m_pFileConst, "\n\n%s: Reporting OFF\n\n", filename);
---
>             fprintf(pApp->m_pFileConst, "\n\n%s: Reporting OFF\n\n", filename.c_str());
305,308c324,327
<         pApp->m_pFileVolumeInventorysum= 0;
<         sprintf(filename, "%s/inv_m3.sum", dirname);
<         pApp->m_pFileVolumeInventorysum = (FILE *)fopen(filename, "w");
<         if (pApp->m_pFileVolumeInventorysum== 0)
---
>         pApp->m_pFileVolumeInventorySum = 0;
>         filename = dirname + "/inv_m3.sum";
>         pApp->m_pFileVolumeInventorySum = fopen(filename.c_str(), "w");
>         if (pApp->m_pFileVolumeInventorySum== 0)
310,311c329,331
<             printf("\n\nERROR: report_open_files(): Could not open %s\n\n", filename);
<             exit(1);
---
>             string message("ERROR: report_open_files(): Could not open ");
>             message += filename;
>             throw FileException(message);
315,316c335,337
<             fprintf(pApp->m_pFileVolumeInventorysum, "\n\n%s: Reporting OFF\n\n", filename);
<         } else if (pApp->m_enableReportHeaders==true)
---
>             fprintf(pApp->m_pFileVolumeInventorySum, "\n\n%s: Reporting OFF\n\n", filename.c_str());
>         }
>         else if (pApp->m_enableReportHeaders == true)
318c339
<             fprintf(pApp->m_pFileVolumeInventorysum, "\n\n\nPeriod        Group     Total        Merch     Operable   Inoperable     Deferred   Noncontrib");
---
>             fprintf(pApp->m_pFileVolumeInventorySum, "\n\n\nPeriod        Group     Total        Merch     Operable   Inoperable     Deferred   Noncontrib");
322,323c343,344
<         sprintf(filename, "%s/inv_ha.sum", dirname);
<         pApp->m_pFileAreaInventorysum = (FILE *)fopen(filename, "w");
---
>         filename = dirname + "/inv_ha.sum";
>         pApp->m_pFileAreaInventorysum = fopen(filename.c_str(), "w");
326,327c347,349
<             printf("\n\nERROR: report_open_files(): Could not open %s\n\n", filename);
<             exit(1);
---
>             string message("ERROR: report_open_files(): Could not open ");
>             message += filename;
>             throw FileException(message);
331c353
<             fprintf(pApp->m_pFileAreaInventorysum, "\n\n%s: Reporting OFF\n\n", filename);
---
>             fprintf(pApp->m_pFileAreaInventorysum, "\n\n%s: Reporting OFF\n\n", filename.c_str());
337,338c359,360
<         sprintf(filename, "%s/inv_m3.rep", dirname);
<         pApp->m_pFileVolumeInventory = (FILE *)fopen(filename, "w");
---
>         filename = dirname + "/inv_m3.rep";
>         pApp->m_pFileVolumeInventory = fopen(filename.c_str(), "w");
341,342c363,365
<             printf("\n\nERROR: report_open_files(): Could not open %s\n\n", filename);
<             exit(1);
---
>             string message("ERROR: report_open_files(): Could not open ");
>             message += filename;
>             throw FileException(message);
346c369
<             fprintf(pApp->m_pFileVolumeInventory, "\n\n%s: Reporting OFF\n\n", filename);
---
>             fprintf(pApp->m_pFileVolumeInventory, "\n\n%s: Reporting OFF\n\n", filename.c_str());
349,350c372,373
<         sprintf(filename, "%s/inv_ha.rep", dirname);
<         pApp->m_pFileAreaInventory = (FILE *)fopen(filename, "w");
---
>         filename = dirname + "/inv_ha.rep";
>         pApp->m_pFileAreaInventory = fopen(filename.c_str(), "w");
353,354c376,378
<             printf("\n\nERROR: report_open_files(): Could not open %s\n\n", filename);
<             exit(1);
---
>             string message("ERROR: report_open_files(): Could not open ");
>             message += filename;
>             throw FileException(message);
356c380
<         if (pApp->m_enableReports==false)
---
>         if (pApp->m_enableReports == false)
358c382
<             fprintf(pApp->m_pFileAreaInventory, "\n\n%s: Reporting OFF\n\n", filename);
---
>             fprintf(pApp->m_pFileAreaInventory, "\n\n%s: Reporting OFF\n\n", filename.c_str());
408c432
<         if (pApp->m_pFileVolumeInventorysum!= 0)
---
>         if (pApp->m_pFileVolumeInventorySum!= 0)
410,411c434,435
<             fprintf(pApp->m_pFileVolumeInventorysum, "\n\n\n");
<             fclose(pApp->m_pFileVolumeInventorysum);
---
>             fprintf(pApp->m_pFileVolumeInventorySum, "\n\n\n");
>             fclose(pApp->m_pFileVolumeInventorySum);
420a445
>     /* inline
423,427c448,458
<         int r;
<         r = age+FssimApp::AGEAREA_OFFSET;
<         if ( r<0) r = 0;
<         if ( r>=FssimApp::NUM_AGEAREA_ELEMENTS) r = FssimApp::NUM_AGEAREA_ELEMENTS-1;
<         return(r);
---
>         int r = age + FssimApp::AGEAREA_OFFSET;
>         if ( r < 0)
>         {
>             r = 0;
>         }
>         else if ( r >= FssimUtil::NUM_AGEAREA_ELEMENTS)
>         {
>             r = FssimUtil::NUM_AGEAREA_ELEMENTS - 1;
>         }
> 
>         return r;
430c461
<     int age_from_index( int indx )
---
>     int age_from_index( int index )
432c463
<         return(indx - FssimApp::AGEAREA_OFFSET);
---
>         return (index - FssimApp::AGEAREA_OFFSET);
433a465
>     */
435c467
<     void report_inventory(int period, int when)
---
>     void set_inventory_report_arrays(TimberClassStruct* pCurrentTimberClass, int offset, float area, float volume)
437,451c469,501
<         ZONE *zone;
<         AU *au;
<         TIMBER_CLASS *timber_class;
<         GROUP *group;
<         int offset, age, indx, i;
<         float t_area, t_vol, vph;
<         char whenstr[20];
<         float SumTotalHa, SumTotalM3, SumMerchHa, SumMerchM3, SumOperableHa, SumOperableM3,
<             SumInoperableHa, SumInoperableM3, SumDeferredHa, SumDeferredM3, SumNoncontribHa, SumNoncontribM3;
<         int HaveShownIHRHeader = false;
<         int HaveShownIMRHeader = false;
<         //int HaveShownIHSHeader = false;
<         //int HaveShownIMSHeader = false;
<         int HaveIHRReports = false;
<         int HaveIMRReports = false;
---
> #ifdef _TSB_MEMORY_DEBUG
>         cout << "set_inventory_report_arrays: address of pCurrentTimberClass: " << pCurrentTimberClass << endl;
> #endif
>         list<GroupStruct*>* pGroupList = 0;
>         for (int i = 0; i < 2; ++i)
>         {
>             switch (i)
>             {
>                 case 0 : // do float_group_list first
>                     pGroupList = &(pCurrentTimberClass->float_group_list);
>                     break;
>                 case 1 : // do static_group_list second
>                     pGroupList = &(pCurrentTimberClass->static_group_list);
>                     break;
>                 default : // for loop should never get here
>                     break;
>             }
> #ifdef _TSB_MEMORY_DEBUG
>             cout << "set_inventory_report_arrays: address of pGroupList: " << pGroupList << endl;
> #endif
> #ifdef _TSB_AGE_DEBUG
>             cout << "set_inventory_report_arrays: size of timber class's float/static_group_list = "
>                  << pGroupList->size() << endl;
> #endif
>             typedef list<GroupStruct*>::iterator GI;
>             for (GI groupIter = pGroupList->begin(); //!pGroupList->empty() &&
>                     groupIter != pGroupList->end(); ++groupIter)
>             {
>                 GroupStruct* pCurrentGroup = (*groupIter);
> #ifdef _TSB_AGE_DEBUG
>                 cout << "set_inventory_report_arrays: groupIter->first = " << groupIter->first << endl;
> #endif
>                 assert(0 != pCurrentGroup);
452a503,551
>                 if (0 != pCurrentGroup->inventoryReport)
>                 {
>                     // Note: could agearea indexing be modified to permit vectorization with valarrays ???
>                     // perhaps using valarray slices ???
>                     for ( int age = pCurrentTimberClass->age - pCurrentTimberClass->width + 1; age <= pCurrentTimberClass->age; ++age )
>                     {
>                         int index = index_from_age( age );
> 
>                         pCurrentGroup->inventoryReport->TotalHa[index] += area;
>                         pCurrentGroup->inventoryReport->TotalM3[index] += volume;
> 
>                         if ( age + offset >= pCurrentTimberClass->parent_au->table->mha)
>                         {
>                             pCurrentGroup->inventoryReport->MerchHa[index] += area;
>                             pCurrentGroup->inventoryReport->MerchM3[index] += volume;
>                         }
> 
>                         switch (pCurrentTimberClass->class_type)
>                         {
>                         case GroupDefStruct::OPERABLE :
>                             pCurrentGroup->inventoryReport->OperableHa[index] += area;
>                             pCurrentGroup->inventoryReport->OperableM3[index] += volume;
>                             break;
>                         case GroupDefStruct::INOPERABLE :
>                             pCurrentGroup->inventoryReport->InoperableHa[index] += area;
>                             pCurrentGroup->inventoryReport->InoperableM3[index] += volume;
>                             break;
>                         case GroupDefStruct::DEFERRED :
>                             pCurrentGroup->inventoryReport->DeferredHa[index] += area;
>                             pCurrentGroup->inventoryReport->DeferredM3[index] += volume;
>                             break;
>                         case GroupDefStruct::NONCONTRIBUTING :
>                             pCurrentGroup->inventoryReport->NoncontribHa[index] += area;
>                             pCurrentGroup->inventoryReport->NoncontribM3[index] += volume;
>                             break;
>                         default:
>                             break;
>                         }
>                     }
>                 }
>             }
>         }
>     }
> 
>     void report_inventory()
>     {
>         char whenstr[FssimUtil::MAX_LABEL_LENGTH];
> 
>         int offset = 0;
454c553,556
<         if (when==FssimApp::BEFORE)
---
> 
>         int period = pApp->m_currentPeriod;
> 
>         if (pApp->m_doneHarvest == FssimApp::BEFORE)
458c560,562
<         } else {
---
>         }
>         else
>         {
463,465c567,574
<         pApp->m_groupList = (LIST_PTR *)List::reset(pApp->m_groupList);
<         group = (GROUP *)List::next(pApp->m_groupList);
<         while ( 0 != group )
---
>         cout << "Period : " << period << " - Reporting" << endl;
> 
>         bool haveIHRReports = false;
>         bool haveIMRReports = false;
> 
>         typedef vector<GroupStruct*>::iterator GI;
>         for (GI groupIter = pApp->m_groupList.begin(); //!pApp->m_groupList.empty() &&
>                 groupIter != pApp->m_groupList.end(); ++groupIter)
467,469c576,580
<             if ( ( group->reportFlags != 0 ) &&
<                 ( period >= group->reportFlags->inv_start ) &&
<                 ( period <= group->reportFlags->inv_end ) )
---
>             GroupStruct* pCurrentGroup = (*groupIter);
> 
>             if ( ( pCurrentGroup->reportFlags != 0 ) &&
>                 ( period >= pCurrentGroup->reportFlags->inv_start ) &&
>                 ( period <= pCurrentGroup->reportFlags->inv_end ) )
471c582
<                 if ( ( period >= group->reportFlags->inv_ha_rep_start ) && ( period <= group->reportFlags->inv_ha_rep_end ) )
---
>                 if ( ( period >= pCurrentGroup->reportFlags->inv_ha_rep_start ) && ( period <= pCurrentGroup->reportFlags->inv_ha_rep_end ) )
473c584
<                     HaveIHRReports = true;
---
>                     haveIHRReports = true;
475c586
<                 if ( ( period >= group->reportFlags->inv_m3_rep_start ) && ( period <= group->reportFlags->inv_m3_rep_end ) )
---
>                 if ( ( period >= pCurrentGroup->reportFlags->inv_m3_rep_start ) && ( period <= pCurrentGroup->reportFlags->inv_m3_rep_end ) )
477c588
<                     HaveIMRReports = true;
---
>                     haveIMRReports = true;
479c590
<                 if ( 0 != group->inventoryReport )
---
>                 if ( 0 != pCurrentGroup->inventoryReport )
481c592
<                     delete group->inventoryReport;
---
>                     delete pCurrentGroup->inventoryReport;
483c594
<             cout << "deleting group->inventoryReport at address: " << hex << (group->inventoryReport) << endl;
---
>             cout << "deleting pCurrentGroup->inventoryReport at address: " << hex << (pCurrentGroup->inventoryReport) << dec << endl;
485c596
<                     group->inventoryReport = 0;
---
>                     pCurrentGroup->inventoryReport = 0;
487,488c598,599
<                 group->inventoryReport = new INV_REPORT;
<                 if ( 0 == group->inventoryReport )
---
>                 pCurrentGroup->inventoryReport = new InventoryReportStruct;
>                 if ( 0 == pCurrentGroup->inventoryReport )
490,491c601,602
<                     printf("\n\nERROR: report_inventory(): std::malloc() failed\n\n");
<                     exit(1);
---
>                     cerr << endl << endl << "ERROR: report_inventory(): Could not allocate new InventoryReportStruct structure" << endl << endl;
>                     throw bad_alloc();
493c604,605
<                 for ( i=0; i<FssimApp::NUM_AGEAREA_ELEMENTS; ++i )
---
> #ifdef _TSB_INVENTORY_REPORT_DEBUG
>                 for ( int i = 0; i < FssimUtil::NUM_AGEAREA_ELEMENTS; ++i )
495,506c607,618
<                     group->inventoryReport->TotalHa[i] = 0.0f;
<                     group->inventoryReport->TotalM3[i] = 0.0f;
<                     group->inventoryReport->MerchHa[i] = 0.0f;
<                     group->inventoryReport->MerchM3[i] = 0.0f;
<                     group->inventoryReport->OperableHa[i] = 0.0f;
<                     group->inventoryReport->OperableM3[i] = 0.0f;
<                     group->inventoryReport->InoperableHa[i] = 0.0f;
<                     group->inventoryReport->InoperableM3[i] = 0.0f;
<                     group->inventoryReport->DeferredHa[i] = 0.0f;
<                     group->inventoryReport->DeferredM3[i] = 0.0f;
<                     group->inventoryReport->NoncontribHa[i] = 0.0f;
<                     group->inventoryReport->NoncontribM3[i] = 0.0f;
---
>                     cout << "inv_report: " << pCurrentGroup->inventoryReport->TotalHa[i] << endl;
>                     cout << "inv_report: " << pCurrentGroup->inventoryReport->TotalM3[i] << endl;
>                     cout << "inv_report: " << pCurrentGroup->inventoryReport->MerchHa[i] << endl;
>                     cout << "inv_report: " << pCurrentGroup->inventoryReport->MerchM3[i] << endl;
>                     cout << "inv_report: " << pCurrentGroup->inventoryReport->OperableHa[i] << endl;
>                     cout << "inv_report: " << pCurrentGroup->inventoryReport->OperableM3[i] << endl;
>                     cout << "inv_report: " << pCurrentGroup->inventoryReport->InoperableHa[i] << endl;
>                     cout << "inv_report: " << pCurrentGroup->inventoryReport->InoperableM3[i] << endl;
>                     cout << "inv_report: " << pCurrentGroup->inventoryReport->DeferredHa[i] << endl;
>                     cout << "inv_report: " << pCurrentGroup->inventoryReport->DeferredM3[i] << endl;
>                     cout << "inv_report: " << pCurrentGroup->inventoryReport->NoncontribHa[i] << endl;
>                     cout << "inv_report: " << pCurrentGroup->inventoryReport->NoncontribM3[i] << endl;
507a620
> #endif
509d621
<             group = (GROUP *)List::next(pApp->m_groupList);
512,515c624,629
< 
<         pApp->m_zoneList = (LIST_PTR *)List::reset(pApp->m_zoneList);
<         zone = (ZONE *)List::next(pApp->m_zoneList);
<         while ( 0 != zone )
---
>         typedef vector<ZoneStruct*>::iterator ZI;
> #ifdef _TSB_AGE_DEBUG
>         int zoneCounter = 0;
>         cout << "report_inventory: size of zone list = " << pApp->m_zoneList.size() << endl;
> #endif
>         for (ZI zoneIter = pApp->m_zoneList.begin(); zoneIter != pApp->m_zoneList.end(); ++zoneIter)
517,519c631,638
<             zone->aulist = (LIST_PTR *)List::reset(zone->aulist);
<             au = static_cast<AU*>(List::next(zone->aulist));
<             while ( 0 != au )
---
>             vector<AUStruct*>& auList = (*zoneIter)->aulist;
>             typedef vector<AUStruct*>::iterator AI;
> #ifdef _TSB_AGE_DEBUG
>             int auCounter = 0;
>             cout << endl << "processing zone # " << ++zoneCounter << endl;
>             cout << "report_inventory: size of au list = " << auList.size() << endl;
> #endif
>             for (AI auIter = auList.begin(); auIter != auList.end(); ++auIter)
521,523c640,647
<                 au->classlist = (LIST_PTR *)List::reset(au->classlist);
<                 timber_class = (TIMBER_CLASS *)List::next(au->classlist);
<                 while ( 0 != timber_class )
---
>                 multimap<int, TimberClassStruct*>& timberClassList = (*auIter)->classlist;
> #ifdef _TSB_AGE_DEBUG
>                 int classCounter = 0;
>                 cout << endl << "processing au # " << ++auCounter << endl;
>                 cout << "report_inventory: size of class list = " << timberClassList.size() << endl;
> #endif
>                 typedef multimap<int, TimberClassStruct*>::iterator CI;
>                 for (CI classIter = timberClassList.begin(); classIter != timberClassList.end(); ++classIter)
524a649
>                     TimberClassStruct* pCurrentTimberClass = classIter->second;
526c651,663
<                     if ( FssimApp::INACTIVE != timber_class->class_type )
---
> #ifdef _TSB_AGE_DEBUG
>                     ++classCounter;
>                     cout << "processing class # " << classCounter << endl;
>                     cout << endl << "debug_display_classes: age: " << pCurrentTimberClass->age << endl;
> #endif
> #ifdef _TSB_MEMORY_DEBUG
>                     cout << "report_inventory: address of pCurrentTimberClass: " << pCurrentTimberClass << endl;
>                     cout << "report_inventory: address of pCurrentTimberClass: " << pCurrentTimberClass->parent_au << endl;
> #endif
>                     //assert(pCurrentTimberClass != 0);
>                     assert(pCurrentTimberClass->parent_au != 0);
>                     //assert(pCurrentTimberClass->parent_au->table != 0);
>                     if ( GroupDefStruct::INACTIVE != pCurrentTimberClass->class_type )
528,531c665
<                         vph = static_cast<float>(func_vph(timber_class->parent_au->table,
<                             timber_class->age));
<                         t_area = static_cast<float>(timber_class->area/timber_class->width);
<                         t_vol = t_area*vph;
---
>                         float vph = static_cast<float>(pCurrentTimberClass->parent_au->table->getVph(pCurrentTimberClass->age));
533,540c667,668
<                         timber_class->float_group_list = (LIST_PTR *)List::reset(timber_class->float_group_list);
<                         group = (GROUP *)List::next(timber_class->float_group_list);
<                         while ( 0 != group )
<                         {
<                             if ( 0 != group->inventoryReport )
<                             {
<                                 for ( age=timber_class->age-timber_class->width+1; age<=timber_class->age; ++age )
<                                 {
---
>                         float t_area = static_cast<float>(pCurrentTimberClass->area / pCurrentTimberClass->width);
>                         float t_volume = t_area * vph;
542,625c670
<                                     indx = index_from_age( age );
< 
<                                     group->inventoryReport->TotalHa[indx] += t_area;
<                                     group->inventoryReport->TotalM3[indx] += t_vol;
< 
<                                     if ( age+offset>=timber_class->parent_au->table->mha)
<                                     {
<                                         group->inventoryReport->MerchHa[indx] += t_area;
<                                         group->inventoryReport->MerchM3[indx] += t_vol;
<                                     }
< 
<                                     switch (timber_class->class_type)
<                                     {
<                                     case FssimApp::OPERABLE:
<                                         group->inventoryReport->OperableHa[indx] += t_area;
<                                         group->inventoryReport->OperableM3[indx] += t_vol;
<                                         break;
<                                     case FssimApp::INOPERABLE:
<                                         group->inventoryReport->InoperableHa[indx] += t_area;
<                                         group->inventoryReport->InoperableM3[indx] += t_vol;
<                                         break;
<                                     case FssimApp::DEFERRED:
<                                         group->inventoryReport->DeferredHa[indx] += t_area;
<                                         group->inventoryReport->DeferredM3[indx] += t_vol;
<                                         break;
<                                     case FssimApp::NONCONTRIBUTING:
<                                         group->inventoryReport->NoncontribHa[indx] += t_area;
<                                         group->inventoryReport->NoncontribM3[indx] += t_vol;
<                                         break;
<                                     default:
<                                         break;
<                                     }
<                                 }
<                             }
<                             group = (GROUP *)List::next(timber_class->float_group_list);
<                         }
< 
<                         timber_class->static_group_list = (LIST_PTR *)List::reset(timber_class->static_group_list);
<                         group = (GROUP *)List::next(timber_class->static_group_list);
<                         while ( 0 != group )
<                         {
<                             if ( 0 != group->inventoryReport )
<                             {
<                                 for ( age=timber_class->age-timber_class->width+1; age<=timber_class->age; ++age )
<                                 {
< 
<                                     indx = index_from_age( age );
< 
<                                     group->inventoryReport->TotalHa[indx] += t_area;
<                                     group->inventoryReport->TotalM3[indx] += t_vol;
< 
<                                     if ( age+offset>=timber_class->parent_au->table->mha)
<                                     {
<                                         group->inventoryReport->MerchHa[indx] += t_area;
<                                         group->inventoryReport->MerchM3[indx] += t_vol;
<                                     }
< 
<                                     switch (timber_class->class_type)
<                                     {
<                                     case FssimApp::OPERABLE:
<                                         group->inventoryReport->OperableHa[indx] += t_area;
<                                         group->inventoryReport->OperableM3[indx] += t_vol;
<                                         break;
<                                     case FssimApp::INOPERABLE:
<                                         group->inventoryReport->InoperableHa[indx] += t_area;
<                                         group->inventoryReport->InoperableM3[indx] += t_vol;
<                                         break;
<                                     case FssimApp::DEFERRED:
<                                         group->inventoryReport->DeferredHa[indx] += t_area;
<                                         group->inventoryReport->DeferredM3[indx] += t_vol;
<                                         break;
<                                     case FssimApp::NONCONTRIBUTING:
<                                         group->inventoryReport->NoncontribHa[indx] += t_area;
<                                         group->inventoryReport->NoncontribM3[indx] += t_vol;
<                                         break;
<                                     default:
<                                         break;
<                                     }
<                                 }
<                             }
<                             group = (GROUP *)List::next(timber_class->static_group_list);
<                         }
< 
< 
---
>                         set_inventory_report_arrays(pCurrentTimberClass, offset, t_area, t_volume);
627,632c672,674
<                     timber_class = (TIMBER_CLASS *)List::next(au->classlist);
<                 }
<                 au = static_cast<AU*>(List::next(zone->aulist));
<             }
<             zone = (ZONE *)List::next(pApp->m_zoneList);
<         }
---
>                 } // for timber class
>             } // for au
>         } // for zone
633a676,677
>         bool haveShownIHRHeader = false;
>         bool haveShownIMRHeader = false;
635c679
<         if ( (HaveIHRReports==true) && (pApp->m_enableReportHeaders==true) && (HaveShownIHRHeader==false) )
---
>         if ( haveIHRReports && pApp->m_enableReportHeaders && haveShownIHRHeader )
639c683
<             HaveShownIHRHeader = true;
---
>             haveShownIHRHeader = true;
641c685,686
<         if ( (HaveIMRReports==true) && (pApp->m_enableReportHeaders==true) && (HaveShownIMRHeader==false) )
---
> 
>         if ( haveIMRReports && (pApp->m_enableReportHeaders) && (haveShownIMRHeader) )
645c690
<             HaveShownIMRHeader = true;
---
>             haveShownIMRHeader = true;
648,650c693,695
<         pApp->m_groupList = (LIST_PTR *)List::reset(pApp->m_groupList);
<         group = (GROUP *)List::next(pApp->m_groupList);
<         while ( 0 != group )
---
>         typedef vector<GroupStruct*>::iterator GI;
>         for (GI groupIter = pApp->m_groupList.begin(); //!pApp->m_groupList.empty() &&
>                 groupIter != pApp->m_groupList.end(); ++groupIter)
652c697,699
<             if ( 0 != group->inventoryReport )
---
>             GroupStruct* pCurrentGroup = (*groupIter);
> 
>             if ( 0 != pCurrentGroup->inventoryReport )
653a701,712
>                 float SumTotalHa = 0.0f;
>                 float SumTotalM3 = 0.0f;
>                 float SumMerchHa = 0.0f;
>                 float SumMerchM3 = 0.0f;
>                 float SumOperableHa = 0.0f;
>                 float SumOperableM3 = 0.0f;
>                 float SumInoperableHa = 0.0f;
>                 float SumInoperableM3 = 0.0f;
>                 float SumDeferredHa = 0.0f;
>                 float SumDeferredM3 = 0.0f;
>                 float SumNoncontribHa = 0.0f;
>                 float SumNoncontribM3 = 0.0f;
655,662c714
<                 SumTotalHa = 0.0f; SumTotalM3 = 0.0f;
<                 SumMerchHa = 0.0f; SumMerchM3 = 0.0f;
<                 SumOperableHa = 0.0f; SumOperableM3 = 0.0f;
<                 SumInoperableHa = 0.0f; SumInoperableM3 = 0.0f;
<                 SumDeferredHa = 0.0f; SumDeferredM3 = 0.0f;
<                 SumNoncontribHa = 0.0f; SumNoncontribM3 = 0.0f;
< 
<                 for ( i=0; i<FssimApp::NUM_AGEAREA_ELEMENTS; ++i )
---
>                 for ( int i = 0; i < FssimUtil::NUM_AGEAREA_ELEMENTS; ++i )
664,670c716,719
< 
<                     age = age_from_index( i );
< 
<                     if ( ( group->inventoryReport->TotalHa[i] > 0.0f ) &&
<                         ( group->reportFlags != 0 ) &&
<                         ( period >= group->reportFlags->inv_ha_rep_start ) &&
<                         ( period <= group->reportFlags->inv_ha_rep_end ) )
---
>                     if ( ( pCurrentGroup->inventoryReport->TotalHa[i] > 0.0 ) &&
>                         ( pCurrentGroup->reportFlags != 0 ) &&
>                         ( period >= pCurrentGroup->reportFlags->inv_ha_rep_start ) &&
>                         ( period <= pCurrentGroup->reportFlags->inv_ha_rep_end ) )
672c721,724
< 
---
>                         int age = age_from_index( i );
> #ifdef _TSB_AGE_DEBUG
>                         cout << endl << "calculated age from index: " << age << endl;
> #endif
676c728
<                             group->label,
---
>                             pCurrentGroup->label,
679,684c731,736
<                             group->inventoryReport->TotalHa[i],
<                             group->inventoryReport->MerchHa[i],
<                             group->inventoryReport->OperableHa[i],
<                             group->inventoryReport->InoperableHa[i],
<                             group->inventoryReport->DeferredHa[i],
<                             group->inventoryReport->NoncontribHa[i]);
---
>                             pCurrentGroup->inventoryReport->TotalHa[i],
>                             pCurrentGroup->inventoryReport->MerchHa[i],
>                             pCurrentGroup->inventoryReport->OperableHa[i],
>                             pCurrentGroup->inventoryReport->InoperableHa[i],
>                             pCurrentGroup->inventoryReport->DeferredHa[i],
>                             pCurrentGroup->inventoryReport->NoncontribHa[i]);
687,690c739,742
<                     if ( ( group->inventoryReport->TotalHa[i] > 0.0f ) &&
<                         ( group->reportFlags != 0 ) &&
<                         ( period >= group->reportFlags->inv_m3_rep_start ) &&
<                         ( period <= group->reportFlags->inv_m3_rep_end ) )
---
>                     if ( ( pCurrentGroup->inventoryReport->TotalHa[i] > 0.0 ) &&
>                         ( pCurrentGroup->reportFlags != 0 ) &&
>                         ( period >= pCurrentGroup->reportFlags->inv_m3_rep_start ) &&
>                         ( period <= pCurrentGroup->reportFlags->inv_m3_rep_end ) )
692c744,747
< 
---
>                         int age = age_from_index( i );
> #ifdef _TSB_AGE_DEBUG
>                         cout << endl << "calculated age from index: " << age << endl;
> #endif
696c751
<                             group->label,
---
>                             pCurrentGroup->label,
699,704c754,759
<                             group->inventoryReport->TotalM3[i],
<                             group->inventoryReport->MerchM3[i],
<                             group->inventoryReport->OperableM3[i],
<                             group->inventoryReport->InoperableM3[i],
<                             group->inventoryReport->DeferredM3[i],
<                             group->inventoryReport->NoncontribM3[i]);
---
>                             pCurrentGroup->inventoryReport->TotalM3[i],
>                             pCurrentGroup->inventoryReport->MerchM3[i],
>                             pCurrentGroup->inventoryReport->OperableM3[i],
>                             pCurrentGroup->inventoryReport->InoperableM3[i],
>                             pCurrentGroup->inventoryReport->DeferredM3[i],
>                             pCurrentGroup->inventoryReport->NoncontribM3[i]);
706,719c761,774
< 
<                     SumTotalHa += group->inventoryReport->TotalHa[i];
<                     SumTotalM3 += group->inventoryReport->TotalM3[i];
<                     SumMerchHa += group->inventoryReport->MerchHa[i];
<                     SumMerchM3 += group->inventoryReport->MerchM3[i];
<                     SumOperableHa += group->inventoryReport->OperableHa[i];
<                     SumOperableM3 += group->inventoryReport->OperableM3[i];
<                     SumInoperableHa += group->inventoryReport->InoperableHa[i];
<                     SumInoperableM3 += group->inventoryReport->InoperableM3[i];
<                     SumDeferredHa += group->inventoryReport->DeferredHa[i];
<                     SumDeferredM3 += group->inventoryReport->DeferredM3[i];
<                     SumNoncontribHa += group->inventoryReport->NoncontribHa[i];
<                     SumNoncontribM3 += group->inventoryReport->NoncontribM3[i];
< 
---
>                     /*
>                     SumTotalHa += pCurrentGroup->inventoryReport->TotalHa[i];
>                     SumTotalM3 += pCurrentGroup->inventoryReport->TotalM3[i];
>                     SumMerchHa += pCurrentGroup->inventoryReport->MerchHa[i];
>                     SumMerchM3 += pCurrentGroup->inventoryReport->MerchM3[i];
>                     SumOperableHa += pCurrentGroup->inventoryReport->OperableHa[i];
>                     SumOperableM3 += pCurrentGroup->inventoryReport->OperableM3[i];
>                     SumInoperableHa += pCurrentGroup->inventoryReport->InoperableHa[i];
>                     SumInoperableM3 += pCurrentGroup->inventoryReport->InoperableM3[i];
>                     SumDeferredHa += pCurrentGroup->inventoryReport->DeferredHa[i];
>                     SumDeferredM3 += pCurrentGroup->inventoryReport->DeferredM3[i];
>                     SumNoncontribHa += pCurrentGroup->inventoryReport->NoncontribHa[i];
>                     SumNoncontribM3 += pCurrentGroup->inventoryReport->NoncontribM3[i];
>                     */
721a777,790
>                 // move outside for loop to do vectorized valarray summation
>                 SumTotalHa += pCurrentGroup->inventoryReport->TotalHa.sum();
>                 SumTotalM3 += pCurrentGroup->inventoryReport->TotalM3.sum();
>                 SumMerchHa += pCurrentGroup->inventoryReport->MerchHa.sum();
>                 SumMerchM3 += pCurrentGroup->inventoryReport->MerchM3.sum();
>                 SumOperableHa += pCurrentGroup->inventoryReport->OperableHa.sum();
>                 SumOperableM3 += pCurrentGroup->inventoryReport->OperableM3.sum();
>                 SumInoperableHa += pCurrentGroup->inventoryReport->InoperableHa.sum();
>                 SumInoperableM3 += pCurrentGroup->inventoryReport->InoperableM3.sum();
>                 SumDeferredHa += pCurrentGroup->inventoryReport->DeferredHa.sum();
>                 SumDeferredM3 += pCurrentGroup->inventoryReport->DeferredM3.sum();
>                 SumNoncontribHa += pCurrentGroup->inventoryReport->NoncontribHa.sum();
>                 SumNoncontribM3 += pCurrentGroup->inventoryReport->NoncontribM3.sum();
> 
724,726c793,795
<                     if ( ( group->reportFlags != 0 ) &&
<                         ( period>=group->reportFlags->inv_ha_rep_start ) &&
<                         ( period<=group->reportFlags->inv_ha_rep_end ) )
---
>                     if ( ( pCurrentGroup->reportFlags != 0 ) &&
>                         ( period>=pCurrentGroup->reportFlags->inv_ha_rep_start ) &&
>                         ( period<=pCurrentGroup->reportFlags->inv_ha_rep_end ) )
731,733c800,802
<                     if ( ( group->reportFlags != 0 ) &&
<                         ( period>=group->reportFlags->inv_m3_rep_start ) &&
<                         ( period<=group->reportFlags->inv_m3_rep_end ) )
---
>                     if ( ( pCurrentGroup->reportFlags != 0 ) &&
>                         ( period>=pCurrentGroup->reportFlags->inv_m3_rep_start ) &&
>                         ( period<=pCurrentGroup->reportFlags->inv_m3_rep_end ) )
739c808
<                 if ( FssimApp::BEFORE == when )
---
>                 if (pApp->m_doneHarvest == FssimApp::BEFORE)
741,743c810,812
<                     if ( ( group->reportFlags != 0 ) &&
<                         ( period>=group->reportFlags->inv_ha_sum_start ) &&
<                         ( period<=group->reportFlags->inv_ha_sum_end ) )
---
>                     if ( ( pCurrentGroup->reportFlags != 0 ) &&
>                         ( period>=pCurrentGroup->reportFlags->inv_ha_sum_start ) &&
>                         ( period<=pCurrentGroup->reportFlags->inv_ha_sum_end ) )
746c815
<                             period, group->label, SumTotalHa, SumMerchHa, SumOperableHa, SumInoperableHa, SumDeferredHa, SumNoncontribHa);
---
>                             period, pCurrentGroup->label, SumTotalHa, SumMerchHa, SumOperableHa, SumInoperableHa, SumDeferredHa, SumNoncontribHa);
748,750c817,819
<                     if ( ( group->reportFlags != 0 ) &&
<                         ( period>=group->reportFlags->inv_m3_sum_start ) &&
<                         ( period<=group->reportFlags->inv_m3_sum_end ) )
---
>                     if ( ( pCurrentGroup->reportFlags != 0 ) &&
>                         ( period>=pCurrentGroup->reportFlags->inv_m3_sum_start ) &&
>                         ( period<=pCurrentGroup->reportFlags->inv_m3_sum_end ) )
752,753c821,822
<                         fprintf(pApp->m_pFileVolumeInventorysum, "\n%6d %12s %12.2f %12.2f %12.2f %12.2f %12.2f %12.2f",
<                             period, group->label, SumTotalM3, SumMerchM3, SumOperableM3, SumInoperableM3, SumDeferredM3, SumNoncontribM3);
---
>                         fprintf(pApp->m_pFileVolumeInventorySum, "\n%6d %12s %12.2f %12.2f %12.2f %12.2f %12.2f %12.2f",
>                             period, pCurrentGroup->label, SumTotalM3, SumMerchM3, SumOperableM3, SumInoperableM3, SumDeferredM3, SumNoncontribM3);
757c826
<                 delete group->inventoryReport;
---
>                 delete pCurrentGroup->inventoryReport;
759c828
<             cout << "deleting group->inventoryReport at address: " << hex << (group->inventoryReport) << endl;
---
>             cout << "deleting pCurrentGroup->inventoryReport at address: " << hex << (pCurrentGroup->inventoryReport) << dec << endl;
761c830
<                 group->inventoryReport = 0;
---
>                 pCurrentGroup->inventoryReport = 0;
763c832
<             group = (GROUP *)List::next(pApp->m_groupList);
---
> 
767,769c836
< 
< 
<     void report_harvest_agedist(int period)
---
>     void report_harvest_agedist()
771,774c838,840
<         GROUP	*group;
<         AGEDIST	*ad;
<         double	TotalArea, TotalVolume;
<         int HaveShownHeader = false;
---
>         double TotalArea = 0.0;
>         double TotalVolume = 0.0;
>         int haveShownHeader = false;
777,779c843,848
<         pApp->m_groupList=(LIST_PTR *)List::reset(pApp->m_groupList);
<         group=(GROUP *)List::next(pApp->m_groupList);
<         while (group!= 0)
---
> 
>         int period = pApp->m_currentPeriod;
> 
>         typedef vector<GroupStruct*>::iterator GI;
>         for (GI groupIter = pApp->m_groupList.begin(); //!pApp->m_groupList.empty() &&
>                 groupIter != pApp->m_groupList.end(); ++groupIter)
781,783c850,854
<             if ( ( group->reportFlags!= 0 ) &&
<                 ( period >= group->reportFlags->hage_rep_start ) &&
<                 ( period <= group->reportFlags->hage_rep_end ) )
---
>             GroupStruct* pCurrentGroup = (*groupIter);
> 
>             if ( ( pCurrentGroup->reportFlags!= 0 ) &&
>                 ( period >= pCurrentGroup->reportFlags->hage_rep_start ) &&
>                 ( period <= pCurrentGroup->reportFlags->hage_rep_end ) )
785c856
<                 if ( (pApp->m_enableReportHeaders==true) && (HaveShownHeader==false) )
---
>                 if ( (pApp->m_enableReportHeaders==true) && (haveShownHeader==false) )
788c859
<                     HaveShownHeader = true;
---
>                     haveShownHeader = true;
790,793c861,864
<                 TotalArea=0.0; TotalVolume=0.0;
<                 group->achieved->AgeDist = (LIST_PTR *)List::reset(group->achieved->AgeDist);
<                 ad = (AGEDIST *)List::next(group->achieved->AgeDist);
<                 while (ad!= 0)
---
>                 TotalArea=0; TotalVolume=0;
>                 typedef map<int, AGEDIST*>::iterator ADI;
>                 for (ADI ageDistIter = pCurrentGroup->achieved->AgeDist.begin();
>                          ageDistIter != pCurrentGroup->achieved->AgeDist.end(); ++ageDistIter)
796,799c867,870
<                         period, group->label, ad->age-ad->width+1, ad->age, ad->area, ad->volume);
<                     TotalArea+=ad->area;
<                     TotalVolume+=ad->volume;
<                     ad = (AGEDIST *)List::next(group->achieved->AgeDist);
---
>                                  period, pCurrentGroup->label, ageDistIter->second->age - ageDistIter->second->width + 1,
>                                  ageDistIter->second->age, ageDistIter->second->area, ageDistIter->second->volume);
>                     TotalArea+=ageDistIter->second->area;
>                     TotalVolume+=ageDistIter->second->volume;
801c872
<                 if ((pApp->m_enableReportHeaders==true)&&(TotalArea>FssimApp::m_kRoundError))
---
>                 if ((pApp->m_enableReportHeaders==true)&&(TotalArea>FssimUtil::m_kRoundError))
806c877
<             group=(GROUP *)List::next(pApp->m_groupList);
---
> 
810,811c881
<     void
<     report_harvest_levels(int period)
---
>     void report_harvest_levels()
813d882
<         GROUP	*group;
816a886,888
> 
>         int period = pApp->m_currentPeriod;
> 
818c890
<         if (pApp->m_zone0->target->max_area[period]>0.0)
---
>         if (pApp->m_zone0->target->max_area[period]>0)
820,824c892,894
<             printf("\nPeriod : %3d - %dha were harvested of the target of %dha",
<                 period, (int)pApp->m_zone0->achieved->area, (int)pApp->m_zone0->target->max_area[period]);
<         } else {
<             printf("\nPeriod : %3d - %dha were harvested of the target of (NO TARGET)ha",
<                 period, (int)pApp->m_zone0->achieved->area);
---
>             cout << endl << "Period : " << period << " - "
>                  << static_cast<int>(pApp->m_zone0->achieved->area) << "ha were harvested of the target of "
>                  << static_cast<int>(pApp->m_zone0->target->max_area[period]) << "ha" << endl;
826c896
<         if (pApp->m_zone0->target->max_volume[period]>0.0)
---
>         else
828,832c898,899
<             printf("\nPeriod : %3d - %dm3 were harvested of the target of %dm3",
<                 period, (int)pApp->m_zone0->achieved->volume, (int)pApp->m_zone0->target->max_volume[period]);
<         } else {
<             printf("\nPeriod : %3d - %dm3 were harvested of the target of (NO TARGET)m3",
<                 period, (int)pApp->m_zone0->achieved->volume);
---
>             cout << endl << "Period : " << period << " - " << static_cast<int>(pApp->m_zone0->achieved->area)
>                  << "ha were harvested of the target of (NO TARGET)ha" << endl;
833a901,911
>         if (pApp->m_zone0->target->max_volume[period]>0)
>         {
>             cout << endl << "Period : " << period << " - "
>                  << static_cast<int>(pApp->m_zone0->achieved->volume) << "m3 were harvested of the target of "
>                  << static_cast<int>(pApp->m_zone0->target->max_volume[period]) << "m3" << endl;
>         }
>         else
>         {
>             cout << endl << "Period : " << period << " - " << static_cast<int>(pApp->m_zone0->achieved->volume)
>                  << "m3 were harvested of the target of (NO TARGET)m3" << endl;
>         }
836,838c914,916
<         pApp->m_groupList = (LIST_PTR *)List::reset(pApp->m_groupList);
<         group=(GROUP *)List::next(pApp->m_groupList);
<         while (group!= 0)
---
>         typedef vector<GroupStruct*>::iterator GI;
>         for (GI groupIter = pApp->m_groupList.begin(); //!pApp->m_groupList.empty() &&
>                 groupIter != pApp->m_groupList.end(); ++groupIter)
840,842c918,922
<             if ( ( group->reportFlags != 0 ) &&
<                 ( period >= group->reportFlags->levels_rep_start ) &&
<                 ( period <= group->reportFlags->levels_rep_end ) )
---
>             GroupStruct* pCurrentGroup = (*groupIter);
> 
>             if ( ( pCurrentGroup->reportFlags != 0 ) &&
>                 ( period >= pCurrentGroup->reportFlags->levels_rep_start ) &&
>                 ( period <= pCurrentGroup->reportFlags->levels_rep_end ) )
844c924
<                 if (group->target!= 0)
---
>                 if (pCurrentGroup->target!= 0)
846c926
<                     if (group->target->max_area[period]!=FssimApp::DUMMYINPUT)
---
>                     if (pCurrentGroup->target->max_area[period]!=FssimUtil::DUMMY_INPUT)
848,849c928,929
<                         sprintf(targ_area_period, "%10.2lf", group->target->max_area[period]);
<                         sprintf(targ_area_year, "%10.2lf", group->target->max_area[period]/pApp->m_periodLength[period]);
---
>                         sprintf(targ_area_period, "%10.2lf", pCurrentGroup->target->max_area[period]);
>                         sprintf(targ_area_year, "%10.2lf", pCurrentGroup->target->max_area[period]/pApp->m_periodLength[period]);
858c938
<                 if (group->target!= 0)
---
>                 if (pCurrentGroup->target!= 0)
860c940
<                     if (group->target->max_volume[period]!=FssimApp::DUMMYINPUT)
---
>                     if (pCurrentGroup->target->max_volume[period]!=FssimUtil::DUMMY_INPUT)
862,863c942,943
<                         sprintf(targ_vol_period, "%10.2lf", group->target->max_volume[period]);
<                         sprintf(targ_vol_year, "%10.2lf", group->target->max_volume[period]/pApp->m_periodLength[period]);
---
>                         sprintf(targ_vol_period, "%10.2lf", pCurrentGroup->target->max_volume[period]);
>                         sprintf(targ_vol_year, "%10.2lf", pCurrentGroup->target->max_volume[period]/pApp->m_periodLength[period]);
873,876c953,956
<                     period, group->label, group->achieved->area, targ_area_period,
<                     group->achieved->volume, targ_vol_period,
<                     group->achieved->area/pApp->m_periodLength[period], targ_area_year,
<                     group->achieved->volume/pApp->m_periodLength[period], targ_vol_year);
---
>                     period, pCurrentGroup->label, pCurrentGroup->achieved->area, targ_area_period,
>                     pCurrentGroup->achieved->volume, targ_vol_period,
>                     pCurrentGroup->achieved->area/pApp->m_periodLength[period], targ_area_year,
>                     pCurrentGroup->achieved->volume/pApp->m_periodLength[period], targ_vol_year);
878c958
<             group=(GROUP *)List::next(pApp->m_groupList);
---
> 
882c962
<     void calculate_axs_values(int period)
---
>     void calculate_axs_values()
884,890d963
<         printf("\nPeriod : %3d - Calculating Axs Values\n", period);
< 
<         ZONE	*zone;
<         AU	*au;
<         TIMBER_CLASS	*timber_class;
<         GROUP	*group;
<         AXSDEF	*axs;
893a967,971
> 
>         int period = pApp->m_currentPeriod;
> 
>         cout << "Period : " << period << " - Calculating Axs Values" << endl;
> 
895,897c973,979
<         pApp->m_zoneList = (LIST_PTR *)List::reset(pApp->m_zoneList);
<         zone = (ZONE *)List::next(pApp->m_zoneList);
<         while (zone!= 0)
---
> 
>         typedef vector<ZoneStruct*>::iterator ZI;
> #ifdef _TSB_AGE_DEBUG
>         int zoneCounter = 0;
>         cout << "report_inventory: size of zone list = " << pApp->m_zoneList.size() << endl;
> #endif
>         for (ZI zoneIter = pApp->m_zoneList.begin(); zoneIter != pApp->m_zoneList.end(); ++zoneIter)
899,901c981,988
<             zone->aulist = (LIST_PTR *)List::reset(zone->aulist);
<             au = static_cast<AU*>(List::next(zone->aulist));
<             while (au!= 0)
---
>             ZoneStruct* pCurrentZone = (*zoneIter);
>             typedef vector<AUStruct*>::iterator AI;
> #ifdef _TSB_AGE_DEBUG
>             int auCounter = 0;
>             cout << endl << "processing zone # " << ++zoneCounter << endl;
>             cout << "calculate_axs_values: size of au list = " << pCurrentZone->aulist.size() << endl;
> #endif
>             for (AI auIter = pCurrentZone->aulist.begin(); auIter != pCurrentZone->aulist.end(); ++auIter)
903c990,992
< #ifdef _TSB_AXS_DEBUG
---
>                 typedef multimap<int, TimberClassStruct*>::iterator CI;
>                 multimap<int, TimberClassStruct*>& timberClassList = (*auIter)->classlist;
> #ifdef _TSB_AGE_DEBUG
904a994,995
>                 //cout << endl << "processing au # " << ++auCounter << endl;
>                 //cout << "calculate_axs_values: size of class list = " << timberClassList.size() << endl;
906,908c997
<                 au->classlist = (LIST_PTR *)List::reset(au->classlist);
<                 timber_class = (TIMBER_CLASS *)List::next(au->classlist);
<                 while (timber_class != 0)
---
>                 for (CI classIter = timberClassList.begin(); classIter != timberClassList.end(); ++classIter)
910c999,1001
< #ifdef _TSB_AXS_DEBUG
---
>                     TimberClassStruct* pCurrentTimberClass = classIter->second;
> 
> #ifdef _TSB_AGE_DEBUG
912a1004
>                     //cout << endl << "calculate_axs_values: age: " << pCurrentTimberClass->age << endl;
913a1006
>                     assert(pCurrentTimberClass->parent_au != 0);
915,917c1008,1009
<                     timber_class->parent_zone->axslist = (LIST_PTR *)List::reset(timber_class->parent_zone->axslist);
<                     axs = (AXSDEF *)List::next(timber_class->parent_zone->axslist);
<                     while (axs!= 0)
---
>                     vector<AxsDefStruct*>::iterator axsIter = pCurrentTimberClass->parent_zone->axslist.begin();
>                     while (axsIter != pCurrentTimberClass->parent_zone->axslist.end())
919,920c1011,1013
<                         axs->AreaAch = (double)0.0;
<                         if ((period>=axs->start_period)&&(period<=axs->end_period))
---
>                         AxsDefStruct* pAxs = (*axsIter);
>                         pAxs->AreaAch = 0.0;
>                         if ( period >= pAxs->start_period && period <= pAxs->end_period )
922c1015
<                             if (axs->Sign==FssimApp::AXS_LT)
---
>                             if (pAxs->Sign == AxsDefStruct::AXS_LT)
924c1017
<                                 axs->AreaAch = func_area_lt(axs->AgeArea, /*axs->NumAgeAreaElements,*/ axs->Age-offset, period);
---
>                                 pAxs->AreaAch = func_area_lt(pAxs->pAgeArea, /*pAxs->NumAgeAreaElements,*/ pAxs->Age-offset);
931,932c1024,1025
<                                     cout << endl << setw(43) << "zone AreaAch(axs->Age-offset): age "
<                                          << setprecision(2) << axs->Age
---
>                                     cout << endl << setw(43) << "zone AreaAch(pAxs->Age - offset): age "
>                                          << setprecision(2) << pAxs->Age
937,938c1030,1031
<                                 axs->AreaAch = func_area_ge(axs->AgeArea, axs->NumAgeAreaElements,
<                                                             axs->Age-offset, period/*, timber_class->width*/);
---
>                                 pAxs->AreaAch = func_area_ge(pAxs->pAgeArea, pAxs->NumAgeAreaElements,
>                                                                    pAxs->Age - offset);
941c1034
<                         axs = (AXSDEF *)List::next(timber_class->parent_zone->axslist);
---
>                         axsIter++;
943,945c1036,1038
<                     timber_class->float_group_list = (LIST_PTR *)List::reset(timber_class->float_group_list);
<                     group = (GROUP *)List::next(timber_class->float_group_list);
<                     while (group != 0)
---
> 
>                     list<GroupStruct*>* pGroupList = 0;
>                     for (int i = 0; i < 2; ++i)
947,949c1040
<                         group->axslist = (LIST_PTR *)List::reset(group->axslist);
<                         axs = (AXSDEF *)List::next(group->axslist);
<                         while (axs!= 0)
---
>                         switch (i)
951,974c1042,1049
<                             axs->AreaAch = (double)0.0;
<                             if ((period>=axs->start_period)&&(period<=axs->end_period))
<                             {
<                                 if (axs->Sign==FssimApp::AXS_LT)
<                                 {
<                                     axs->AreaAch = func_area_lt(axs->AgeArea, /*axs->NumAgeAreaElements,*/ axs->Age-offset, period);
<                                 }
<                                 else
<                                 {
< #ifdef _TSB_AREAACH_DEBUG
<                                     if (classCounter < 10)
<                                     {
<                                         cout << endl << setw(43) << "float_group AreaAch(axs->Age-offset): age "
<                                              << setprecision(2) << axs->Age
<                                              << setw(20) << "offset = " << setw(3) << offset << endl;
<                                     }
< #endif
<                                     // width added in v4.0.1 to account for width = 1 at time zero
< 
<                                     axs->AreaAch = func_area_ge(axs->AgeArea, axs->NumAgeAreaElements,
<                                                                 axs->Age-offset, period/*, timber_class->width*/);
<                                 }
<                             }
<                             axs = (AXSDEF *)List::next(group->axslist);
---
>                             case 0 : // do float_group_list first
>                                 pGroupList = &(pCurrentTimberClass->float_group_list);
>                                 break;
>                             case 1 : // do static_group_list second
>                                 pGroupList = &(pCurrentTimberClass->static_group_list);
>                                 break;
>                             default : // for loop should never get here
>                                 break;
976,984c1051,1052
<                         group = (GROUP *)List::next(timber_class->float_group_list);
<                     }
<                     timber_class->static_group_list = (LIST_PTR *)List::reset(timber_class->static_group_list);
<                     group = (GROUP *)List::next(timber_class->static_group_list);
<                     while (group != 0)
<                     {
<                         group->axslist = (LIST_PTR *)List::reset(group->axslist);
<                         axs = (AXSDEF *)List::next(group->axslist);
<                         while (axs!= 0)
---
>                         typedef list<GroupStruct*>::iterator GI;
>                         for (GI groupIter = pGroupList->begin(); !pGroupList->empty() && groupIter != pGroupList->end(); ++groupIter)
986,987c1054,1055
<                             axs->AreaAch = (double)0.0;
<                             if ((period>=axs->start_period)&&(period<=axs->end_period))
---
>                             vector<AxsDefStruct*>::iterator axsIter = (*groupIter)->axslist.begin();
>                             while (axsIter != (*groupIter)->axslist.end())
989c1057,1059
<                                 if (axs->Sign==FssimApp::AXS_LT)
---
>                                 AxsDefStruct* pAxs = (*axsIter);
>                                 pAxs->AreaAch = 0.0;
>                                 if ( period >= pAxs->start_period && period <= pAxs->end_period )
991,994c1061,1066
<                                     axs->AreaAch = func_area_lt(axs->AgeArea, /*axs->NumAgeAreaElements,*/ axs->Age - offset, period);
<                                 }
<                                 else
<                                 {
---
>                                     if (pAxs->Sign == AxsDefStruct::AXS_LT)
>                                     {
>                                         pAxs->AreaAch = func_area_lt(pAxs->pAgeArea, pAxs->Age - offset);
>                                     }
>                                     else
>                                     {
998,1000c1070,1072
<                                         cout << endl << setw(43) << "static_group AreaAch(axs->Age-offset): age "
<                                              << setprecision(2) << axs->Age
<                                              << setw(20) << "offset = " << setw(3) << offset << endl;
---
>                                             cout << endl << setw(43) << "group AreaAch(axs->Age - offset): age "
>                                                  << setprecision(2) << pAxs->Age
>                                                  << setw(20) << "offset = " << setw(3) << offset << endl;
1003,1005c1075,1077
<                                     // width added in v4.0.1 to account for width = 1 at time zero
<                                     axs->AreaAch = func_area_ge(axs->AgeArea, axs->NumAgeAreaElements,
<                                                                 axs->Age - offset, period/*, timber_class->width*/);
---
>                                         pAxs->AreaAch = func_area_ge(pAxs->pAgeArea, pAxs->NumAgeAreaElements,
>                                                                            pAxs->Age - offset);
>                                     }
1006a1079
>                                 axsIter++;
1008d1080
<                             axs = (AXSDEF *)List::next(group->axslist);
1010d1081
<                         group = (GROUP *)List::next(timber_class->static_group_list);
1012d1082
<                     timber_class = (TIMBER_CLASS *)List::next(au->classlist);
1014d1083
<                 au = static_cast<AU*>(List::next(zone->aulist));
1016d1084
<             zone = (ZONE *)List::next(pApp->m_zoneList);
1020c1088
<     void report_constraints(int period, int when)
---
>     void report_constraints()
1022,1028c1090,1097
<         ZONE	*zone;
<         GROUP	*group;
<         AXSDEF	*axs;
<         char	whenstr[20],AgeStr[20],PCStr[20],SignStr[20],BaseAreaStr[20];
<         char	UnitIDStr[50],AreaAchStr[20],AchStr[20],ViolStr[20];
<         double	AchPC;
<         int	HaveShownHeader = false;
---
>         char whenstr[FssimUtil::MAX_LABEL_LENGTH];
>         char AgeStr[FssimUtil::MAX_LABEL_LENGTH];
>         char PCStr[FssimUtil::MAX_LABEL_LENGTH];
>         char SignStr[FssimUtil::MAX_LABEL_LENGTH];
>         char BaseAreaStr[FssimUtil::MAX_LABEL_LENGTH];
>         char AreaAchStr[FssimUtil::MAX_LABEL_LENGTH];
>         char AchStr[FssimUtil::MAX_LABEL_LENGTH];
>         char ViolStr[FssimUtil::MAX_LABEL_LENGTH];
1030c1099,1108
<         if (when==FssimApp::BEFORE)
---
>         char UnitIDStr[FssimApp::DEFAULT_PRIORITY];
> 
>         double AchPC = 0.0;
>         bool haveShownHeader = false;
> 
>         FssimApp* pApp = FssimApp::getApp();
> 
>         int period = pApp->m_currentPeriod;
> 
>         if (pApp->m_doneHarvest == FssimApp::BEFORE)
1033c1111,1113
<         } else {
---
>         }
>         else
>         {
1037c1117
<         calculate_axs_values(period);
---
>         calculate_axs_values();
1039,1042c1119,1120
<         FssimApp* pApp = FssimApp::getApp();
<         pApp->m_zoneList = (LIST_PTR *)List::reset(pApp->m_zoneList);
<         zone = (ZONE *)List::next(pApp->m_zoneList);
<         while (zone!= 0)
---
>         typedef vector<ZoneStruct*>::iterator ZI;
>         for (ZI zoneIter = pApp->m_zoneList.begin(); zoneIter != pApp->m_zoneList.end(); ++zoneIter)
1044,1046c1122,1126
<             if ( ( zone->reportFlags != 0 ) &&
<                 ( period >= zone->reportFlags->axs_rep_start ) &&
<                 ( period <= zone->reportFlags->axs_rep_end ) )
---
>             ZoneStruct* pCurrentZone = (*zoneIter);
> 
>             if ( ( pCurrentZone->reportFlags != 0 ) &&
>                 ( period >= pCurrentZone->reportFlags->axs_rep_start ) &&
>                 ( period <= pCurrentZone->reportFlags->axs_rep_end ) )
1048c1128
<                 if ( (pApp->m_enableReportHeaders==true) && (HaveShownHeader==false) )
---
>                 if ( (pApp->m_enableReportHeaders==true) && (haveShownHeader==false) )
1051c1131
<                     HaveShownHeader = true;
---
>                     haveShownHeader = true;
1053,1055c1133,1134
<                 zone->axslist = (LIST_PTR *)List::reset(zone->axslist);
<                 axs = (AXSDEF *)List::next(zone->axslist);
<                 while (axs!= 0)
---
>                 vector<AxsDefStruct*>::iterator axsIter = pCurrentZone->axslist.begin();
>                 while (axsIter != pCurrentZone->axslist.end())
1057c1136,1137
<                     if ((period>=axs->start_period)&&(period<=axs->end_period))
---
>                     AxsDefStruct* pAxs = (*axsIter);
>                     if ( period >= pAxs->start_period && period <= pAxs->end_period )
1059c1139
<                         if (axs->Age!=FssimApp::DUMMYINPUT)
---
>                         if (pAxs->Age!=FssimUtil::DUMMY_INPUT)
1061,1065c1141,1145
<                             sprintf(UnitIDStr, " ZONE %s", zone->label);
<                             sprintf(BaseAreaStr, "%10.2lf", axs->BaseArea);
<                             sprintf(PCStr, "%5.2lf", axs->Percent);
<                             sprintf(AreaAchStr, "%10.2lf", axs->AreaAch);
<                             AchPC = (double)((axs->AreaAch*(double)100.0)/axs->BaseArea);
---
>                             sprintf(UnitIDStr, " ZoneStruct %s", pCurrentZone->label);
>                             sprintf(BaseAreaStr, "%10.2lf", pAxs->BaseArea);
>                             sprintf(PCStr, "%5.2lf", pAxs->Percent);
>                             sprintf(AreaAchStr, "%10.2lf", pAxs->AreaAch);
>                             AchPC = pAxs->AreaAch * 100 / pAxs->BaseArea;
1067c1147
<                             if (axs->Sign==FssimApp::AXS_LT)
---
>                             if (pAxs->Sign==AxsDefStruct::AXS_LT)
1069,1070c1149,1150
<                                 sprintf(SignStr, "< ");
<                                 if (AchPC>(axs->Percent+FssimApp::m_kRoundError))
---
>                                 strcpy(SignStr, "< ");
>                                 if (AchPC>(pAxs->Percent+FssimUtil::m_kRoundError))
1072,1073c1152,1154
<                                     sprintf(ViolStr, " VIOLATED");
<                                 } else if (((AchPC-FssimApp::m_kRoundError)<=axs->Percent)&&((AchPC+FssimApp::m_kRoundError)>=axs->Percent))
---
>                                     strcpy(ViolStr, " VIOLATED");
>                                 }
>                                 else if (((AchPC-FssimUtil::m_kRoundError)<=pAxs->Percent)&&((AchPC+FssimUtil::m_kRoundError)>=pAxs->Percent))
1075,1077c1156
<                                     sprintf(ViolStr, "   MET   ");
<                                 } else {
<                                     sprintf(ViolStr, "    -    ");
---
>                                     strcpy(ViolStr, "   MET   ");
1078a1158,1161
>                                 else
>                                 {
>                                     strcpy(ViolStr, "    -    ");
>                                 }
1080,1081c1163,1164
<                                 sprintf(SignStr, ">=");
<                                 if ((AchPC+FssimApp::m_kRoundError)<axs->Percent)
---
>                                 strcpy(SignStr, ">=");
>                                 if ((AchPC+FssimUtil::m_kRoundError)<pAxs->Percent)
1083,1084c1166,1168
<                                     sprintf(ViolStr, " VIOLATED");
<                                 } else if (((AchPC-FssimApp::m_kRoundError)<=axs->Percent)&&((AchPC+FssimApp::m_kRoundError)>=axs->Percent))
---
>                                     strcpy(ViolStr, " VIOLATED");
>                                 }
>                                 else if (((AchPC-FssimUtil::m_kRoundError)<=pAxs->Percent)&&((AchPC+FssimUtil::m_kRoundError)>=pAxs->Percent))
1086,1088c1170
<                                     sprintf(ViolStr, "   MET   ");
<                                 } else {
<                                     sprintf(ViolStr, "    -    ");
---
>                                     strcpy(ViolStr, "   MET   ");
1089a1172,1175
>                                 else
>                                 {
>                                     strcpy(ViolStr, "    -    ");
>                                 }
1091c1177
<                             sprintf(AgeStr, "%3dy", axs->Age);
---
>                             sprintf(AgeStr, "%3dy", pAxs->Age);
1105c1191
<                     axs = (AXSDEF *)List::next(zone->axslist);
---
>                     axsIter++;
1108c1194
<             zone = (ZONE *)List::next(pApp->m_zoneList);
---
> 
1111,1113c1197,1199
<         pApp->m_groupList = (LIST_PTR *)List::reset(pApp->m_groupList);
<         group = (GROUP *)List::next(pApp->m_groupList);
<         while (group!= 0)
---
>         typedef vector<GroupStruct*>::iterator GI;
>         for (GI groupIter = pApp->m_groupList.begin(); //!pApp->m_groupList.empty() &&
>                 groupIter != pApp->m_groupList.end(); ++groupIter)
1115,1117c1201,1205
<             if ( ( group->reportFlags != 0 ) &&
<                 ( period >= group->reportFlags->axs_rep_start ) &&
<                 ( period <= group->reportFlags->axs_rep_end ) )
---
>             GroupStruct* pCurrentGroup = (*groupIter);
> 
>             if ( ( pCurrentGroup->reportFlags != 0 ) &&
>                 ( period >= pCurrentGroup->reportFlags->axs_rep_start ) &&
>                 ( period <= pCurrentGroup->reportFlags->axs_rep_end ) )
1119c1207
<                 if ( (pApp->m_enableReportHeaders==true) && (HaveShownHeader==false) )
---
>                 if ( (pApp->m_enableReportHeaders==true) && (haveShownHeader==false) )
1122c1210
<                     HaveShownHeader = true;
---
>                     haveShownHeader = true;
1124,1126c1212,1213
<                 group->axslist = (LIST_PTR *)List::reset(group->axslist);
<                 axs = (AXSDEF *)List::next(group->axslist);
<                 while (axs!= 0)
---
>                 vector<AxsDefStruct*>::iterator axsIter = pCurrentGroup->axslist.begin();
>                 while (axsIter != pCurrentGroup->axslist.end())
1128c1215,1216
<                     if ((period>=axs->start_period)&&(period<=axs->end_period))
---
>                     AxsDefStruct* pAxs = (*axsIter);
>                     if ( period >= pAxs->start_period && period <= pAxs->end_period )
1130c1218
<                         if (axs->Age!=FssimApp::DUMMYINPUT)
---
>                         if (pAxs->Age!=FssimUtil::DUMMY_INPUT)
1132,1136c1220,1224
<                             sprintf(UnitIDStr, "GROUP %s", group->label);
<                             sprintf(BaseAreaStr, "%10.2lf", axs->BaseArea);
<                             sprintf(PCStr, "%5.2lf", axs->Percent);
<                             sprintf(AreaAchStr, "%10.2lf", axs->AreaAch);
<                             AchPC = (double)((axs->AreaAch*(double)100.0)/axs->BaseArea);
---
>                             sprintf(UnitIDStr, "GroupStruct %s", pCurrentGroup->label);
>                             sprintf(BaseAreaStr, "%10.2lf", pAxs->BaseArea);
>                             sprintf(PCStr, "%5.2lf", pAxs->Percent);
>                             sprintf(AreaAchStr, "%10.2lf", pAxs->AreaAch);
>                             AchPC = pAxs->AreaAch * 100 / pAxs->BaseArea;
1138c1226
<                             if (axs->Sign==FssimApp::AXS_LT)
---
>                             if (pAxs->Sign==AxsDefStruct::AXS_LT)
1140,1141c1228,1229
<                                 sprintf(SignStr, "< ");
<                                 if (AchPC>(axs->Percent+FssimApp::m_kRoundError))
---
>                                 strcpy(SignStr, "< ");
>                                 if (AchPC>(pAxs->Percent+FssimUtil::m_kRoundError))
1143,1144c1231,1233
<                                     sprintf(ViolStr, " VIOLATED");
<                                 } else if (((AchPC-FssimApp::m_kRoundError)<=axs->Percent)&&((AchPC+FssimApp::m_kRoundError)>=axs->Percent))
---
>                                     strcpy(ViolStr, " VIOLATED");
>                                 }
>                                 else if (((AchPC-FssimUtil::m_kRoundError)<=pAxs->Percent)&&((AchPC+FssimUtil::m_kRoundError)>=pAxs->Percent))
1146,1148c1235
<                                     sprintf(ViolStr, "   MET   ");
<                                 } else {
<                                     sprintf(ViolStr, "    -    ");
---
>                                     strcpy(ViolStr, "   MET   ");
1149a1237,1240
>                                 else
>                                 {
>                                     strcpy(ViolStr, "    -    ");
>                                 }
1151,1152c1242,1243
<                                 sprintf(SignStr, ">=");
<                                 if ((AchPC+FssimApp::m_kRoundError)<axs->Percent)
---
>                                 strcpy(SignStr, ">=");
>                                 if ((AchPC+FssimUtil::m_kRoundError)<pAxs->Percent)
1154,1155c1245,1247
<                                     sprintf(ViolStr, " VIOLATED");
<                                 } else if (((AchPC-FssimApp::m_kRoundError)<=axs->Percent)&&((AchPC+FssimApp::m_kRoundError)>=axs->Percent))
---
>                                     strcpy(ViolStr, " VIOLATED");
>                                 }
>                                 else if (((AchPC-FssimUtil::m_kRoundError)<=pAxs->Percent)&&((AchPC+FssimUtil::m_kRoundError)>=pAxs->Percent))
1157,1159c1249
<                                     sprintf(ViolStr, "   MET   ");
<                                 } else {
<                                     sprintf(ViolStr, "    -    ");
---
>                                     strcpy(ViolStr, "   MET   ");
1160a1251,1254
>                                 else
>                                 {
>                                     strcpy(ViolStr, "    -    ");
>                                 }
1162c1256
<                             sprintf(AgeStr, "%3dy", axs->Age);
---
>                             sprintf(AgeStr, "%3dy", pAxs->Age);
1176c1270
<                     axs = (AXSDEF *)List::next(group->axslist);
---
>                     axsIter++;
1179c1273
<             group = (GROUP *)List::next(pApp->m_groupList);
---
> 
1201a1296,1298
> #ifdef _TSB_REPORT_OPEN_FILES
>         cout << "removing using command: " << command << endl;
> #endif
