Skip to content

AMIInterpolation::append has many list resizing

In AMIInterpolation::append the updated maps are constructed by append/resizing two labelList entries.

This initial bookkeeping could be easily handled as a set of labelRanges. For example,

    labelList mapMap, newMapMap;

    {
        List<labelRange> mapMapRanges(srcSubMap.size());
        List<labelRange> newMapMapRanges(srcSubMap.size());

        label total = 0;
        label total1 = 0;
        label total2 = 0;

        forAll(srcSubMap, proci)
        {
            const label len1 = srcConstructMap[proci].size();
            const label len2 = newSrcConstructMap[proci].size();

            mapMapRanges[proci] = labelRange(total, len1);
            total += len1;
            total1 += len1;
            newMapMapRanges[proci] = labelRange(total, len2);
            total += len2;
            total2 += len2;
        }

        mapMap.resize(total1);
        newMapMap.resize(total2);

        total = 0;
        for (const labelRange& range : mapMapRanges)
        {
            const label beg = range.start();
            const label len = range.size();

            labelList::subList slice(mapMap.slice(total, len);
            ListOps::identity(slice, beg);
            total += len;
        }

        total = 0;
        for (const labelRange& range : newMapMapRanges)
        {
            const label beg = range.start();
            const label len = range.size();

            labelList::subList slice(newMapMap.slice(total, len);
            ListOps::identity(slice, beg);
            total += len;
        }
    }