double MinimizeResidual(double[] outX, double[] Sol0, double[] Res0, double[] outRes, bool diagnosis = false) { using (new FuncTrace()) { Debug.Assert(SolHistory.Count == MxxHistory.Count); Debug.Assert(outX.Length == m_MgOperator.Mapping.LocalLength); Debug.Assert(Sol0.Length == m_MgOperator.Mapping.LocalLength); Debug.Assert(Res0.Length == m_MgOperator.Mapping.LocalLength); Debug.Assert(outRes.Length == m_MgOperator.Mapping.LocalLength); int KrylovDim = SolHistory.Count; int L = outX.Length; double[] alpha = new double[KrylovDim]; for (int i = 0; i < KrylovDim; i++) { //alpha[i] = GenericBlas.InnerProd(MxxHistory[i], Res0).MPISum(); alpha[i] = BLAS.ddot(L, MxxHistory[i], 1, Res0, 1); } alpha = alpha.MPISum(); Array.Copy(Sol0, outX, L); Array.Copy(Res0, outRes, L); for (int i = 0; i < KrylovDim; i++) { //outX.AccV(alpha[i], SolHistory[i]); //outRes.AccV(-alpha[i], MxxHistory[i]); BLAS.daxpy(L, alpha[i], SolHistory[i], 1, outX, 1); BLAS.daxpy(L, -alpha[i], MxxHistory[i], 1, outRes, 1); } double ResNorm = BLAS.dnrm2(L, outRes, 1).Pow2().MPISum().Sqrt(); //Console.WriteLine("OrthonormalizationMultigrid: minimizing ofer " + KrylovDim + " vectors"); return(ResNorm); /* we cannot do the following * // since the 'MxxHistory' vectors form an orthonormal system, * // the L2-norm is the L2-Norm of the 'alpha'-coordinates (Parceval's equality) * return alpha.L2Norm(); */ } }
double MinimizeResidual(double[] outX, double[] Sol0, double[] Res0, double[] outRes, bool diagnosis = false) { using (new FuncTrace()) { Debug.Assert(SolHistory.Count == MxxHistory.Count); Debug.Assert(outX.Length == m_MgOperator.Mapping.LocalLength); Debug.Assert(Sol0.Length == m_MgOperator.Mapping.LocalLength); Debug.Assert(Res0.Length == m_MgOperator.Mapping.LocalLength); Debug.Assert(outRes.Length == m_MgOperator.Mapping.LocalLength); int KrylovDim = SolHistory.Count; int L = outX.Length; double[] alpha = new double[KrylovDim]; for (int i = 0; i < KrylovDim; i++) { //alpha[i] = GenericBlas.InnerProd(MxxHistory[i], Res0).MPISum(); alpha[i] = BLAS.ddot(L, MxxHistory[i], 1, Res0, 1); } alpha = alpha.MPISum(); //outX.SetV(Sol0); //outRes.SetV(Res0); Array.Copy(Sol0, outX, L); Array.Copy(Res0, outRes, L); for (int i = 0; i < KrylovDim; i++) { //outX.AccV(alpha[i], SolHistory[i]); //outRes.AccV(-alpha[i], MxxHistory[i]); BLAS.daxpy(L, alpha[i], SolHistory[i], 1, outX, 1); BLAS.daxpy(L, -alpha[i], MxxHistory[i], 1, outRes, 1); } double ResNorm = BLAS.dnrm2(L, outRes, 1).Pow2().MPISum().Sqrt(); /* * if(ResNorm < Tolerance) { * alpha.SaveToStream(Console.Out, m_MgOperator.BaseGridProblemMapping.MPI_Comm); * * alpha.SaveToTextFile("ConvScheisse.txt", m_MgOperator.BaseGridProblemMapping.MPI_Comm); * } */ /* * if (diagnosis) { * for (int i = 0; i < KrylovDim; i++) { * Console.WriteLine(" s " + alpha[KrylovDim - i - 1]); * * } * } */ return(ResNorm); /* we cannot do the following * // since the 'MxxHistory' vectors form an orthonormal system, * // the L2-norm is the L2-Norm of the 'alpha'-coordinates (Parceval's equality) * return alpha.L2Norm(); */ } }