Hi, sorry about the slow reply! This is a good question: so nmultMPO expects additional named arguments saying what truncation parameters to use. Without them it was keeping exponentially many states as it went from left to right "compressing" the two MPOs.
I just pushed a fix for this in the latest version of ITensor. Now if you don't state any truncation parameters it defaults to a small cutoff of 1E-14.
But the best way to call this algorithm is as:
nmultMPO(A,B,C,{"Cutoff",1E-12});
where you may want to use a larger or smaller cutoff than 1E-12; it depends on the operators and what you need them for.
By the way, I would strongly recommend against using the float type in C++; use double instead or Real which is defined in ITensor to be double.
Also you don't need to write MPOt. The type MPO is an alias for this. Even better you can write auto H = MPO(H_ampo); and the compiler will deduce that the object on the left has the same type as on the right. Similarly you don't need to provide template parameters to call nmultMPO; the compiler will deduce the template parameters of functions for you whenever they are unambiguous.
Please let me know if you have additional questions -
Miles