/* Example programs from the book Scientific and Engineering Programming in C++: An Introduction with Advanced Techniques and Examples, Addison-Wesley, 1994. (c) COPYRIGHT INTERNATIONAL BUSINESS MACHINES CORPORATION 1994. ALL RIGHTS RESERVED. See README file for further details. */ #include "Array/ConcreteFortranArray1d.h" #include "Array/ConcreteFortranArray2d.h" #include "Array/ConcreteFortranSymmetricPackedArray2d.h" template class LapackRect; template class FactoredLapackRect; template class LapackSymPosDefPacked; template class FactoredLapackSymPosDefPacked; template class LapackRect : public ConcreteFortranArray2d { // LAPACK A, M, and N public: LapackRect(Subscript nrows, Subscript ncols); FactoredLapackRect factor(); // ... }; template class LapackSymPosDefPacked : public ConcreteFortranSymmetricPackedArray2d { public: LapackSymPosDefPacked(Subscript size); FactoredLapackSymPosDefPacked factor(); }; template class FactoredLapackRect { public: LapackRect& solve(LapackRect&); private: friend FactoredLapackRect LapackRect::factor(); FactoredLapackRect(Subscript nrows, Subscript ncols); ConcreteFortranArray2d fmat; // LAPACK "A" ConcreteFortranArray1d pivots; // LAPACK "IPIV" }; template class FactoredLapackSymPosDefPacked { public: LapackRect& solve(LapackRect&); private: friend FactoredLapackSymPosDefPacked LapackSymPosDefPacked::factor(); FactoredLapackSymPosDefPacked(Subscript size); ConcreteFortranArray2d fmat; // LAPACK "A" }; void solve1() { LapackRect a1(10,10); // ... fill a1 ... FactoredLapackRect factored_a1 = a1.factor(); LapackRect b1(10, 1); // ... fill b1 with right hand side ... factored_a1.solve(b1); // Solution is in b1 LapackSymPosDefPacked a2(10); // ... fill a2 ... FactoredLapackSymPosDefPacked factored_a2 = a2.factor(); LapackRect b2(10, 1); // ... fill b2 with right hand side ... factored_a2.solve(b2); // Solution is in b2 }