[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Getfem-commits] [getfem-commits] branch master updated: Remove leftover
From: |
Konstantinos Poulios |
Subject: |
[Getfem-commits] [getfem-commits] branch master updated: Remove leftovers and redundant includes, fix whitespace and other minor changes |
Date: |
Tue, 26 Dec 2023 12:35:41 -0500 |
This is an automated email from the git hooks/post-receive script.
logari81 pushed a commit to branch master
in repository getfem.
The following commit(s) were added to refs/heads/master by this push:
new 956a40ef Remove leftovers and redundant includes, fix whitespace and
other minor changes
956a40ef is described below
commit 956a40eff0cb8a34dba51cce483ccd5d6f27e4c7
Author: Konstantinos Poulios <logari81@gmail.com>
AuthorDate: Tue Dec 26 18:35:16 2023 +0100
Remove leftovers and redundant includes, fix whitespace and other minor
changes
---
configure.ac | 8 +-
contrib/continuum_mechanics/Makefile.am | 2 -
interface/src/gf_spmat_get.cc | 2 +-
src/Makefile.am | 2 +-
src/dal_singleton.cc | 6 +-
src/getfem_superlu.cc | 2 +-
src/gmm/gmm_MUMPS_interface.h | 2 +-
src/gmm/gmm_dense_qr.h | 11 +-
src/gmm/gmm_solver_Schwarz_additive.h | 457 ++++++++++++++++----------------
9 files changed, 244 insertions(+), 248 deletions(-)
diff --git a/configure.ac b/configure.ac
index 018bfd86..4fcf6c1f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -58,7 +58,7 @@ dnl set the optimization level
dnl --------------------------
AC_ARG_WITH(optimization,
- AC_HELP_STRING([--with-optimization=FLAG],[Set the optimization
level (-O3 by default)]),
+ AS_HELP_STRING([--with-optimization=FLAG],[Set the optimization
level (-O3 by default)]),
[with_optimization=$withval],
[with_optimization='-O3']
)
@@ -647,12 +647,12 @@ LIBS="$acx_blas_save_LIBS"
# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
if test x"$acx_blas_ok" = xyes; then
- echo "OK, You have working BLAS libs ! Using $BLAS_LIBS" ;
HAVE_VENDOR_BLAS=1
+ echo "OK, You have working BLAS libs ! Using $BLAS_LIBS" ; HAVE_VENDOR_BLAS=1
else
- echo " *** YOU DONT HAVE BLAS! *** Using a cheap replacement" ;
HAVE_VENDOR_BLAS=0
+ echo " *** YOU DONT HAVE BLAS! *** Using a cheap replacement" ;
HAVE_VENDOR_BLAS=0
fi
-dnl ACX_BLAS([ echo "OK, You have working BLAS libs !"; HAVE_VENDOR_BLAS=1 ],
[echo "YOU DONT HAVE BLAS! Using a cheap replacement" ; HAVE_VENDOR_BLAS=0])
+dnl ACX_BLAS([ echo "OK, You have working BLAS libs !"; HAVE_VENDOR_BLAS=1
],[echo "YOU DONT HAVE BLAS! Using a cheap replacement" ; HAVE_VENDOR_BLAS=0])
LIBS="$LIBS $BLAS_LIBS"
CPPFLAGS="$CPPFLAGS -DGMM_USES_BLAS"
diff --git a/contrib/continuum_mechanics/Makefile.am
b/contrib/continuum_mechanics/Makefile.am
index dc5d9fc1..879ec8a9 100644
--- a/contrib/continuum_mechanics/Makefile.am
+++ b/contrib/continuum_mechanics/Makefile.am
@@ -22,8 +22,6 @@ EXTRA_DIST = \
check_PROGRAMS =
-CLEANFILES =
-
if BUILDPYTHON
TESTS = plasticity_fin_strain_lin_hardening_plane_strain.py
diff --git a/interface/src/gf_spmat_get.cc b/interface/src/gf_spmat_get.cc
index ad59332a..44d75228 100644
--- a/interface/src/gf_spmat_get.cc
+++ b/interface/src/gf_spmat_get.cc
@@ -403,7 +403,7 @@ void gf_spmat_get(getfemint::mexargs_in& m_in,
);
-#if defined(GMM_USES_MUMPS) || defined(HAVE_DMUMPS_C_H)
+#if defined(GMM_USES_MUMPS)
/*@GET @CELL{mantissa_r, mantissa_i, exponent} = ('determinant')
returns the matrix determinant calculated using MUMPS.@*/
sub_command
diff --git a/src/Makefile.am b/src/Makefile.am
index 16d06fcc..f90d9dbc 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -256,6 +256,6 @@ libgetfem_la_LDFLAGS = ${LIBTOOL_VERSION_INFO}
libgetfem_la_LIBADD = @SUPERLU_LIBS@ @MUMPS_LIBS@
AM_CPPFLAGS = -I$(top_srcdir)/src -I../src -I$(top_srcdir)
-CLEANFILES = ii_files/* *.o.d getfem/getfem_im_list.h
+CLEANFILES = ii_files/* *.o.d getfem/getfem_im_list.h
DISTCLEANFILES = getfem/getfem_arch_config.h gmm/gmm_arch_config.h
diff --git a/src/dal_singleton.cc b/src/dal_singleton.cc
index 183f093c..91a87825 100644
--- a/src/dal_singleton.cc
+++ b/src/dal_singleton.cc
@@ -20,10 +20,6 @@
===========================================================================*/
#include "getfem/dal_singleton.h"
-#include <algorithm>
-#include "gmm/gmm.h"
-#include "getfem/getfem_omp.h"
-
namespace dal {
@@ -64,4 +60,4 @@ namespace dal {
}
}
-}/* end of namespace dal
*/
\ No newline at end of file
+}/* end of namespace dal
*/
diff --git a/src/getfem_superlu.cc b/src/getfem_superlu.cc
index 4e7c3538..fe7d2803 100644
--- a/src/getfem_superlu.cc
+++ b/src/getfem_superlu.cc
@@ -23,7 +23,7 @@
typedef int int_t;
-/* because SRC/util.h defines TRUE and FALSE ... */
+/* because slu_util.h defines TRUE and FALSE ... */
#ifdef TRUE
# undef TRUE
#endif
diff --git a/src/gmm/gmm_MUMPS_interface.h b/src/gmm/gmm_MUMPS_interface.h
index 968f18d2..f912c145 100644
--- a/src/gmm/gmm_MUMPS_interface.h
+++ b/src/gmm/gmm_MUMPS_interface.h
@@ -35,7 +35,7 @@
@date December 8, 2005.
@brief Interface with MUMPS (LU direct solver for sparse matrices).
*/
-#if defined(GMM_USES_MUMPS) || defined(HAVE_DMUMPS_C_H)
+#if defined(GMM_USES_MUMPS)
#ifndef GMM_MUMPS_INTERFACE_H
#define GMM_MUMPS_INTERFACE_H
diff --git a/src/gmm/gmm_dense_qr.h b/src/gmm/gmm_dense_qr.h
index 4bdde208..e046a155 100644
--- a/src/gmm/gmm_dense_qr.h
+++ b/src/gmm/gmm_dense_qr.h
@@ -573,14 +573,15 @@ namespace gmm {
typedef typename linalg_traits<MAT1>::value_type T;
typedef typename number_traits<T>::magnitude_type R;
- size_type n(mat_nrows(A)), q(0), q_old, p(0), ite(0), its(0);
+ size_type n(mat_nrows(A)), q(0), p(0);
dense_matrix<T> H(n,n);
- sub_interval SUBK(0,0);
-
gmm::copy(A, H);
+
Hessenberg_reduction(H, Q, compvect);
qr_stop_criterion(H, p, q, tol);
+ size_type ite(0), its(0);
+ sub_interval SUBK(0,0);
while (q < n) {
sub_interval SUBI(p, n-p-q), SUBJ(0, mat_ncols(Q));
if (compvect) SUBK = SUBI;
@@ -589,7 +590,7 @@ namespace gmm {
Wilkinson_double_shift_qr_step(sub_matrix(H, SUBI),
sub_matrix(Q, SUBJ, SUBK),
tol, (its == 10 || its == 20), compvect);
- q_old = q;
+ size_type q_old(q);
qr_stop_criterion(H, p, q, tol*R(2));
if (q != q_old) its = 0;
++its; ++ite;
@@ -723,7 +724,7 @@ namespace gmm {
typedef typename linalg_traits<MAT1>::value_type T;
typedef typename number_traits<T>::magnitude_type R;
- size_type n = mat_nrows(A), q = 0, p, ite = 0;
+ size_type n(mat_nrows(A)), q(0), p(0), ite(0);
dense_matrix<T> Tri(n, n);
gmm::copy(A, Tri);
diff --git a/src/gmm/gmm_solver_Schwarz_additive.h
b/src/gmm/gmm_solver_Schwarz_additive.h
index 5585e027..a37bbef4 100644
--- a/src/gmm/gmm_solver_Schwarz_additive.h
+++ b/src/gmm/gmm_solver_Schwarz_additive.h
@@ -36,7 +36,7 @@
*/
#ifndef GMM_SOLVERS_SCHWARZ_ADDITIVE_H__
-#define GMM_SOLVERS_SCHWARZ_ADDITIVE_H__
+#define GMM_SOLVERS_SCHWARZ_ADDITIVE_H__
#include "gmm_kernel.h"
#include "gmm_superlu_interface.h"
@@ -46,9 +46,9 @@
#include "gmm_solver_qmr.h"
namespace gmm {
-
+
/* ******************************************************************** */
- /* Additive Schwarz interfaced local solvers */
+ /* Additive Schwarz interfaced local solvers */
/* ******************************************************************** */
struct using_cg {};
@@ -62,24 +62,24 @@ namespace gmm {
static const APrecond &transform(const P &PP) { return PP; }
};
- template <typename Matrix1, typename Precond, typename Vector>
+ template <typename Matrix1, typename Precond, typename Vector>
void AS_local_solve(using_cg, const Matrix1 &A, Vector &x, const Vector &b,
- const Precond &P, iteration &iter)
+ const Precond &P, iteration &iter)
{ cg(A, x, b, P, iter); }
- template <typename Matrix1, typename Precond, typename Vector>
+ template <typename Matrix1, typename Precond, typename Vector>
void AS_local_solve(using_gmres, const Matrix1 &A, Vector &x,
- const Vector &b, const Precond &P, iteration &iter)
+ const Vector &b, const Precond &P, iteration &iter)
{ gmres(A, x, b, P, 100, iter); }
-
- template <typename Matrix1, typename Precond, typename Vector>
+
+ template <typename Matrix1, typename Precond, typename Vector>
void AS_local_solve(using_bicgstab, const Matrix1 &A, Vector &x,
- const Vector &b, const Precond &P, iteration &iter)
+ const Vector &b, const Precond &P, iteration &iter)
{ bicgstab(A, x, b, P, iter); }
- template <typename Matrix1, typename Precond, typename Vector>
+ template <typename Matrix1, typename Precond, typename Vector>
void AS_local_solve(using_qmr, const Matrix1 &A, Vector &x,
- const Vector &b, const Precond &P, iteration &iter)
+ const Vector &b, const Precond &P, iteration &iter)
{ qmr(A, x, b, P, iter); }
#if defined(GMM_USES_SUPERLU)
@@ -94,18 +94,18 @@ namespace gmm {
static const APrecond &transform(const APrecond &PP) { return PP; }
};
- template <typename Matrix1, typename Precond, typename Vector>
+ template <typename Matrix1, typename Precond, typename Vector>
void AS_local_solve(using_superlu, const Matrix1 &, Vector &x,
- const Vector &b, const Precond &P, iteration &iter)
+ const Vector &b, const Precond &P, iteration &iter)
{ P.solve(x, b); iter.set_iteration(1); }
#endif
/* ******************************************************************** */
- /* Additive Schwarz Linear system */
+ /* Additive Schwarz Linear system */
/* ******************************************************************** */
template <typename Matrix1, typename Matrix2, typename Precond,
- typename local_solver>
+ typename local_solver>
struct add_schwarz_mat{
typedef typename linalg_traits<Matrix1>::value_type value_type;
@@ -117,34 +117,34 @@ namespace gmm {
mutable size_type itebilan;
mutable std::vector<std::vector<value_type> > gi, fi;
std::vector<typename actual_precond<Precond, local_solver,
- Matrix1>::APrecond> precond1;
+ Matrix1>::APrecond> precond1;
void init(const Matrix1 &A_, const std::vector<Matrix2> &vB_,
- iteration iter_, const Precond &P, double residual_);
+ iteration iter_, const Precond &P, double residual_);
- add_schwarz_mat(void) {}
+ add_schwarz_mat() {}
add_schwarz_mat(const Matrix1 &A_, const std::vector<Matrix2> &vB_,
- iteration iter_, const Precond &P, double residual_)
+ iteration iter_, const Precond &P, double residual_)
{ init(A_, vB_, iter_, P, residual_); }
};
template <typename Matrix1, typename Matrix2, typename Precond,
- typename local_solver>
+ typename local_solver>
void add_schwarz_mat<Matrix1, Matrix2, Precond, local_solver>::init(
const Matrix1 &A_, const std::vector<Matrix2> &vB_,
iteration iter_, const Precond &P, double residual_) {
vB = &vB_; A = &A_; iter = iter_;
residual = residual_;
-
+
size_type nb_sub = vB->size();
vAloc.resize(nb_sub);
gi.resize(nb_sub); fi.resize(nb_sub);
precond1.resize(nb_sub);
std::fill(precond1.begin(), precond1.end(),
- actual_precond<Precond, local_solver, Matrix1>::transform(P));
+ actual_precond<Precond, local_solver, Matrix1>::transform(P));
itebilan = 0;
-
+
if (iter.get_noisy()) cout << "Init pour sub dom ";
#ifdef GMM_USES_MPI
int size,tranche,borne_sup,borne_inf,rank,tag1=11,tag2=12,tag3=13,sizepr =
0;
@@ -167,47 +167,47 @@ namespace gmm {
int next = (rank + 1) % size;
int previous = (rank + size - 1) % size;
//communication of local information on ring pattern
- //Each process receive Nproc-1 contributions
+ //Each process receive Nproc-1 contributions
for (int nproc = 0; nproc < size; ++nproc) {
- for (size_type i = size_type(borne_inf); i < size_type(borne_sup); ++i)
{
-// for (size_type i = 0; i < nb_sub/size; ++i) {
-// for (size_type i = 0; i < nb_sub; ++i) {
- // size_type i=(rank+size*(j-1)+nb_sub)%nb_sub;
+ for (size_type i = size_type(borne_inf); i < size_type(borne_sup); ++i) {
+// for (size_type i = 0; i < nb_sub/size; ++i) {
+// for (size_type i = 0; i < nb_sub; ++i) {
+ // size_type i=(rank+size*(j-1)+nb_sub)%nb_sub;
- cout << "Sous domaines " << i << " : " << mat_ncols((*vB)[i]) << endl;
+ cout << "Sous domaines " << i << " : " << mat_ncols((*vB)[i]) << endl;
#else
- for (size_type i = 0; i < nb_sub; ++i) {
+ for (size_type i = 0; i < nb_sub; ++i) {
#endif
-
- if (iter.get_noisy()) cout << i << " " << std::flush;
- Matrix2 Maux(mat_ncols((*vB)[i]), mat_nrows((*vB)[i]));
-
+ if (iter.get_noisy())
+ cout << i << " " << std::flush;
+ Matrix2 Maux(mat_ncols((*vB)[i]), mat_nrows((*vB)[i]));
+
#ifdef GMM_USES_MPI
- Matrix2 Maux2(mat_ncols((*vB)[i]), mat_ncols((*vB)[i]));
- if (nproc == 0) {
- gmm::resize(vAloc[i], mat_ncols((*vB)[i]), mat_ncols((*vB)[i]));
- gmm::clear(vAloc[i]);
- }
- gmm::mult(gmm::transposed((*vB)[i]), Acsr, Maux);
- gmm::mult(Maux, (*vB)[i], Maux2);
- gmm::add(Maux2, vAloc[i]);
+ Matrix2 Maux2(mat_ncols((*vB)[i]), mat_ncols((*vB)[i]));
+ if (nproc == 0) {
+ gmm::resize(vAloc[i], mat_ncols((*vB)[i]), mat_ncols((*vB)[i]));
+ gmm::clear(vAloc[i]);
+ }
+ gmm::mult(gmm::transposed((*vB)[i]), Acsr, Maux);
+ gmm::mult(Maux, (*vB)[i], Maux2);
+ gmm::add(Maux2, vAloc[i]);
#else
- gmm::resize(vAloc[i], mat_ncols((*vB)[i]), mat_ncols((*vB)[i]));
- gmm::mult(gmm::transposed((*vB)[i]), *A, Maux);
- gmm::mult(Maux, (*vB)[i], vAloc[i]);
+ gmm::resize(vAloc[i], mat_ncols((*vB)[i]), mat_ncols((*vB)[i]));
+ gmm::mult(gmm::transposed((*vB)[i]), *A, Maux);
+ gmm::mult(Maux, (*vB)[i], vAloc[i]);
#endif
#ifdef GMM_USES_MPI
- if (nproc == size - 1 ) {
+ if (nproc == size - 1 ) {
#endif
- precond1[i].build_with(vAloc[i]);
- gmm::resize(fi[i], mat_ncols((*vB)[i]));
- gmm::resize(gi[i], mat_ncols((*vB)[i]));
+ precond1[i].build_with(vAloc[i]);
+ gmm::resize(fi[i], mat_ncols((*vB)[i]));
+ gmm::resize(gi[i], mat_ncols((*vB)[i]));
#ifdef GMM_USES_MPI
- }
+ }
#else
- }
+ }
#endif
#ifdef GMM_USES_MPI
}
@@ -223,8 +223,8 @@ namespace gmm {
MPI_Sendrecv(&(Acsr.ir[0]), Acsr.jc[sizeA], MPI_INT, next, tag1,
&(Acsrtemp.ir[0]), Acsrtemp.jc[sizeA], MPI_INT, previous,
tag1,
MPI_COMM_WORLD, &status);
-
- MPI_Sendrecv(&(Acsr.pr[0]), Acsr.jc[sizeA], mpi_type(value_type()),
next, tag3,
+
+ MPI_Sendrecv(&(Acsr.pr[0]), Acsr.jc[sizeA], mpi_type(value_type()),
next, tag3,
&(Acsrtemp.pr[0]), Acsrtemp.jc[sizeA],
mpi_type(value_type()), previous, tag3,
MPI_COMM_WORLD, &status);
gmm::copy(Acsrtemp, Acsr);
@@ -235,11 +235,11 @@ namespace gmm {
#endif
if (iter.get_noisy()) cout << "\n";
}
-
+
template <typename Matrix1, typename Matrix2, typename Precond,
- typename Vector2, typename Vector3, typename local_solver>
+ typename Vector2, typename Vector3, typename local_solver>
void mult(const add_schwarz_mat<Matrix1, Matrix2, Precond, local_solver> &M,
- const Vector2 &p, Vector3 &q) {
+ const Vector2 &p, Vector3 &q) {
size_type itebilan = 0;
#ifdef GMM_USES_MPI
static double tmult_tot = 0.0;
@@ -276,12 +276,12 @@ namespace gmm {
#endif
{
#ifdef GMM_USES_MPI
- // size_type i=j; // (rank+size*(j-1)+nb_sub)%nb_sub;
+ // size_type i=j; // (rank+size*(j-1)+nb_sub)%nb_sub;
#endif
- gmm::mult(gmm::transposed((*(M.vB))[i]), q, M.fi[i]);
+ gmm::mult(gmm::transposed((*(M.vB))[i]), q, M.fi[i]);
M.iter.init();
AS_local_solve(local_solver(), (M.vAloc)[i], (M.gi)[i],
- (M.fi)[i],(M.precond1)[i],M.iter);
+ (M.fi)[i],(M.precond1)[i],M.iter);
itebilan = std::max(itebilan, M.iter.get_iteration());
}
@@ -298,17 +298,17 @@ namespace gmm {
#else
for (size_type i = 0; i < M.gi.size(); ++i)
#endif
- {
+ {
#ifdef GMM_USES_MPI
- // size_type i=j; // (rank+size*(j-1)+nb_sub)%nb_sub;
-// gmm::mult((*(M.vB))[i], M.gi[i], qbis,qbis);
- gmm::mult((*(M.vB))[i], M.gi[i], qter);
- add(qter,qbis,qbis);
+ // size_type i=j; // (rank+size*(j-1)+nb_sub)%nb_sub;
+// gmm::mult((*(M.vB))[i], M.gi[i], qbis,qbis);
+ gmm::mult((*(M.vB))[i], M.gi[i], qter);
+ add(qter,qbis,qbis);
#else
- gmm::mult((*(M.vB))[i], M.gi[i], q, q);
+ gmm::mult((*(M.vB))[i], M.gi[i], q, q);
#endif
- }
+ }
#ifdef GMM_USES_MPI
//WARNING this add only if you use the ring pattern below
// need to do this below if using a n explicit ring pattern communication
@@ -326,25 +326,25 @@ namespace gmm {
// int next = (rank + 1) % size;
// int previous = (rank + size - 1) % size;
//communication of local information on ring pattern
- //Each process receive Nproc-1 contributions
+ //Each process receive Nproc-1 contributions
// if (size > 1) {
-// for (int nproc = 0; nproc < size-1; ++nproc)
+// for (int nproc = 0; nproc < size-1; ++nproc)
// {
-// MPI_Sendrecv(&(qbis[0]), gmm::vect_size(q), MPI_DOUBLE, next, tag1,
-// &(qter[0]), gmm::vect_size(q),MPI_DOUBLE,previous,tag1,
-// MPI_COMM_WORLD,&status);
-// gmm::copy(qter, qbis);
-// add(qbis,q,q);
+// MPI_Sendrecv(&(qbis[0]), gmm::vect_size(q), MPI_DOUBLE, next, tag1,
+// &(qter[0]), gmm::vect_size(q),MPI_DOUBLE,previous,tag1,
+// MPI_COMM_WORLD,&status);
+// gmm::copy(qter, qbis);
+// add(qbis,q,q);
// }
// }
MPI_Allreduce(&(qbis[0]), &(q[0]),gmm::vect_size(q), MPI_DOUBLE,
- MPI_SUM,MPI_COMM_WORLD);
+ MPI_SUM,MPI_COMM_WORLD);
t_final=MPI_Wtime();
t_tot += t_final-t_ref;
cout<<"["<< rank<<"] temps reduce Resol "<< t_final-t_ref << " t_tot = "
<< t_tot << endl;
-#endif
+#endif
if (M.iter.get_noisy() > 0) cout << "itebloc = " << itebilan << endl;
M.itebilan += itebilan;
@@ -352,61 +352,61 @@ namespace gmm {
}
template <typename Matrix1, typename Matrix2, typename Precond,
- typename Vector2, typename Vector3, typename local_solver>
+ typename Vector2, typename Vector3, typename local_solver>
void mult(const add_schwarz_mat<Matrix1, Matrix2, Precond, local_solver> &M,
- const Vector2 &p, const Vector3 &q) {
+ const Vector2 &p, const Vector3 &q) {
mult(M, p, const_cast<Vector3 &>(q));
}
template <typename Matrix1, typename Matrix2, typename Precond,
- typename Vector2, typename Vector3, typename Vector4,
- typename local_solver>
+ typename Vector2, typename Vector3, typename Vector4,
+ typename local_solver>
void mult(const add_schwarz_mat<Matrix1, Matrix2, Precond, local_solver> &M,
- const Vector2 &p, const Vector3 &p2, Vector4 &q)
+ const Vector2 &p, const Vector3 &p2, Vector4 &q)
{ mult(M, p, q); add(p2, q); }
template <typename Matrix1, typename Matrix2, typename Precond,
- typename Vector2, typename Vector3, typename Vector4,
- typename local_solver>
+ typename Vector2, typename Vector3, typename Vector4,
+ typename local_solver>
void mult(const add_schwarz_mat<Matrix1, Matrix2, Precond, local_solver> &M,
- const Vector2 &p, const Vector3 &p2, const Vector4 &q)
+ const Vector2 &p, const Vector3 &p2, const Vector4 &q)
{ mult(M, p, const_cast<Vector4 &>(q)); add(p2, q); }
/* ******************************************************************** */
- /* Additive Schwarz interfaced global solvers */
+ /* Additive Schwarz interfaced global solvers */
/* ******************************************************************** */
template <typename ASM_type, typename Vect>
void AS_global_solve(using_cg, const ASM_type &ASM, Vect &x,
- const Vect &b, iteration &iter)
+ const Vect &b, iteration &iter)
{ cg(ASM, x, b, *(ASM.A), identity_matrix(), iter); }
template <typename ASM_type, typename Vect>
void AS_global_solve(using_gmres, const ASM_type &ASM, Vect &x,
- const Vect &b, iteration &iter)
+ const Vect &b, iteration &iter)
{ gmres(ASM, x, b, identity_matrix(), 100, iter); }
template <typename ASM_type, typename Vect>
void AS_global_solve(using_bicgstab, const ASM_type &ASM, Vect &x,
- const Vect &b, iteration &iter)
+ const Vect &b, iteration &iter)
{ bicgstab(ASM, x, b, identity_matrix(), iter); }
template <typename ASM_type, typename Vect>
void AS_global_solve(using_qmr,const ASM_type &ASM, Vect &x,
- const Vect &b, iteration &iter)
+ const Vect &b, iteration &iter)
{ qmr(ASM, x, b, identity_matrix(), iter); }
#if defined(GMM_USES_SUPERLU)
template <typename ASM_type, typename Vect>
void AS_global_solve(using_superlu, const ASM_type &, Vect &,
- const Vect &, iteration &) {
+ const Vect &, iteration &) {
GMM_ASSERT1(false, "You cannot use SuperLU as "
- "global solver in additive Schwarz meethod");
+ "global solver in additive Schwarz meethod");
}
#endif
-
+
/* ******************************************************************** */
- /* Linear Additive Schwarz method */
+ /* Linear Additive Schwarz method */
/* ******************************************************************** */
/* ref : Domain decomposition algorithms for the p-version finite */
/* element method for elliptic problems, Luca F. Pavarino, */
@@ -417,8 +417,8 @@ namespace gmm {
* with the same system.
*/
template <typename Matrix1, typename Matrix2,
- typename Vector2, typename Vector3, typename Precond,
- typename local_solver, typename global_solver>
+ typename Vector2, typename Vector3, typename Precond,
+ typename local_solver, typename global_solver>
void additive_schwarz(
add_schwarz_mat<Matrix1, Matrix2, Precond, local_solver> &ASM, Vector3 &u,
const Vector2 &f, iteration &iter, const global_solver&) {
@@ -453,11 +453,11 @@ namespace gmm {
gmm::mult(gmm::transposed((*(ASM.vB))[i]), f, ASM.fi[i]);
ASM.iter.init();
AS_local_solve(local_solver(), ASM.vAloc[i], ASM.gi[i], ASM.fi[i],
- ASM.precond1[i], ASM.iter);
+ ASM.precond1[i], ASM.iter);
ASM.itebilan = std::max(ASM.itebilan, ASM.iter.get_iteration());
#ifdef GMM_USES_MPI
gmm::mult((*(ASM.vB))[i], ASM.gi[i], gbis,gbis);
-#else
+#else
gmm::mult((*(ASM.vB))[i], ASM.gi[i], g, g);
#endif
}
@@ -466,7 +466,7 @@ namespace gmm {
double t_ref,t_final;
t_ref=MPI_Wtime();
MPI_Allreduce(&(gbis[0]), &(g[0]),gmm::vect_size(g), MPI_DOUBLE,
- MPI_SUM,MPI_COMM_WORLD);
+ MPI_SUM,MPI_COMM_WORLD);
t_final=MPI_Wtime();
cout<<"temps reduce init "<< t_final-t_ref<<endl;
#endif
@@ -487,13 +487,13 @@ namespace gmm {
* The ASM matrix represent the preconditionned linear system.
*/
template <typename Matrix1, typename Matrix2,
- typename Vector2, typename Vector3, typename Precond,
- typename local_solver, typename global_solver>
+ typename Vector2, typename Vector3, typename Precond,
+ typename local_solver, typename global_solver>
void additive_schwarz(const Matrix1 &A, Vector3 &u,
- const Vector2 &f, const Precond &P,
- const std::vector<Matrix2> &vB,
- iteration &iter, local_solver,
- global_solver) {
+ const Vector2 &f, const Precond &P,
+ const std::vector<Matrix2> &vB,
+ iteration &iter,
+ local_solver, global_solver) {
iter.set_rhsnorm(vect_norm2(f));
if (iter.get_rhsnorm() == 0.0) { gmm::clear(u); return; }
iteration iter2 = iter; iter2.reduce_noisy();
@@ -504,62 +504,62 @@ namespace gmm {
}
/* ******************************************************************** */
- /* Sequential Non-Linear Additive Schwarz method */
+ /* Sequential Non-Linear Additive Schwarz method */
/* ******************************************************************** */
/* ref : Nonlinearly Preconditionned Inexact Newton Algorithms, */
/* Xiao-Chuan Cai, David E. Keyes, */
- /* SIAM J. Sci. Comp. 24: p183-200. l */
+ /* SIAM J. Sci. Comp. 24: p183-200. l */
/* ******************************************************************** */
- template <typename Matrixt, typename MatrixBi>
+ template <typename Matrixt, typename MatrixBi>
class NewtonAS_struct {
-
+
public :
typedef Matrixt tangent_matrix_type;
typedef MatrixBi B_matrix_type;
typedef typename linalg_traits<Matrixt>::value_type value_type;
typedef std::vector<value_type> Vector;
-
- virtual size_type size(void) = 0;
+
+ virtual size_type size() = 0;
virtual const std::vector<MatrixBi> &get_vB() = 0;
-
+
virtual void compute_F(Vector &f, Vector &x) = 0;
virtual void compute_tangent_matrix(Matrixt &M, Vector &x) = 0;
// compute Bi^T grad(F(X)) Bi
virtual void compute_sub_tangent_matrix(Matrixt &Mloc, Vector &x,
- size_type i) = 0;
+ size_type i) = 0;
// compute Bi^T F(X)
virtual void compute_sub_F(Vector &fi, Vector &x, size_type i) = 0;
virtual ~NewtonAS_struct() {}
};
- template <typename Matrixt, typename MatrixBi>
+ template <typename Matrixt, typename MatrixBi>
struct AS_exact_gradient {
const std::vector<MatrixBi> &vB;
std::vector<Matrixt> vM;
std::vector<Matrixt> vMloc;
- void init(void) {
+ void init() {
for (size_type i = 0; i < vB.size(); ++i) {
- Matrixt aux(gmm::mat_ncols(vB[i]), gmm::mat_ncols(vM[i]));
- gmm::resize(vMloc[i], gmm::mat_ncols(vB[i]), gmm::mat_ncols(vB[i]));
- gmm::mult(gmm::transposed(vB[i]), vM[i], aux);
- gmm::mult(aux, vB[i], vMloc[i]);
+ Matrixt aux(gmm::mat_ncols(vB[i]), gmm::mat_ncols(vM[i]));
+ gmm::resize(vMloc[i], gmm::mat_ncols(vB[i]), gmm::mat_ncols(vB[i]));
+ gmm::mult(gmm::transposed(vB[i]), vM[i], aux);
+ gmm::mult(aux, vB[i], vMloc[i]);
}
}
AS_exact_gradient(const std::vector<MatrixBi> &vB_) : vB(vB_) {
vM.resize(vB.size()); vMloc.resize(vB.size());
for (size_type i = 0; i < vB.size(); ++i) {
- gmm::resize(vM[i], gmm::mat_nrows(vB[i]), gmm::mat_nrows(vB[i]));
+ gmm::resize(vM[i], gmm::mat_nrows(vB[i]), gmm::mat_nrows(vB[i]));
}
}
};
template <typename Matrixt, typename MatrixBi,
- typename Vector2, typename Vector3>
+ typename Vector2, typename Vector3>
void mult(const AS_exact_gradient<Matrixt, MatrixBi> &M,
- const Vector2 &p, Vector3 &q) {
+ const Vector2 &p, Vector3 &q) {
gmm::clear(q);
typedef typename gmm::linalg_traits<Vector3>::value_type T;
std::vector<T> v(gmm::vect_size(p)), w, x;
@@ -577,26 +577,26 @@ namespace gmm {
}
template <typename Matrixt, typename MatrixBi,
- typename Vector2, typename Vector3>
+ typename Vector2, typename Vector3>
void mult(const AS_exact_gradient<Matrixt, MatrixBi> &M,
- const Vector2 &p, const Vector3 &q) {
+ const Vector2 &p, const Vector3 &q) {
mult(M, p, const_cast<Vector3 &>(q));
}
template <typename Matrixt, typename MatrixBi,
- typename Vector2, typename Vector3, typename Vector4>
+ typename Vector2, typename Vector3, typename Vector4>
void mult(const AS_exact_gradient<Matrixt, MatrixBi> &M,
- const Vector2 &p, const Vector3 &p2, Vector4 &q)
+ const Vector2 &p, const Vector3 &p2, Vector4 &q)
{ mult(M, p, q); add(p2, q); }
template <typename Matrixt, typename MatrixBi,
- typename Vector2, typename Vector3, typename Vector4>
+ typename Vector2, typename Vector3, typename Vector4>
void mult(const AS_exact_gradient<Matrixt, MatrixBi> &M,
- const Vector2 &p, const Vector3 &p2, const Vector4 &q)
+ const Vector2 &p, const Vector3 &p2, const Vector4 &q)
{ mult(M, p, const_cast<Vector4 &>(q)); add(p2, q); }
struct S_default_newton_line_search {
-
+
double conv_alpha, conv_r;
size_t it, itmax, glob_it;
@@ -607,9 +607,9 @@ namespace gmm {
double alpha_max_ratio_reached, r_max_ratio_reached;
size_type it_max_ratio_reached;
-
- double converged_value(void) { return conv_alpha; };
- double converged_residual(void) { return conv_r; };
+
+ double converged_value() { return conv_alpha; };
+ double converged_residual() { return conv_r; };
virtual void init_search(double r, size_t git, double = 0.0) {
alpha_min_ratio = 0.9;
@@ -623,7 +623,7 @@ namespace gmm {
count = 0;
max_ratio_reached = false;
}
- virtual double next_try(void) {
+ virtual double next_try() {
alpha_old = alpha;
if (alpha >= 0.4) alpha *= 0.5; else alpha *= alpha_mult; ++it;
return alpha_old;
@@ -631,45 +631,45 @@ namespace gmm {
virtual bool is_converged(double r, double = 0.0) {
// cout << "r = " << r << " alpha = " << alpha / alpha_mult << "
count_pat = " << count_pat << endl;
if (!max_ratio_reached && r < first_res * alpha_max_ratio) {
- alpha_max_ratio_reached = alpha_old; r_max_ratio_reached = r;
- it_max_ratio_reached = it; max_ratio_reached = true;
+ alpha_max_ratio_reached = alpha_old; r_max_ratio_reached = r;
+ it_max_ratio_reached = it; max_ratio_reached = true;
}
if (max_ratio_reached && r < r_max_ratio_reached * 0.5
- && r > first_res * 1.1 && it <= it_max_ratio_reached+1) {
- alpha_max_ratio_reached = alpha_old; r_max_ratio_reached = r;
- it_max_ratio_reached = it;
+ && r > first_res * 1.1 && it <= it_max_ratio_reached+1) {
+ alpha_max_ratio_reached = alpha_old; r_max_ratio_reached = r;
+ it_max_ratio_reached = it;
}
if (count == 0 || r < conv_r)
- { conv_r = r; conv_alpha = alpha_old; count = 1; }
+ { conv_r = r; conv_alpha = alpha_old; count = 1; }
if (conv_r < first_res) ++count;
if (r < first_res * alpha_min_ratio)
- { count_pat = 0; return true; }
+ { count_pat = 0; return true; }
if (count >= 5 || (alpha < alpha_min && max_ratio_reached)) {
- if (conv_r < first_res * 0.99) count_pat = 0;
- if (/*gmm::random() * 50. < -log(conv_alpha)-4.0 ||*/ count_pat >= 3)
- { conv_r=r_max_ratio_reached; conv_alpha=alpha_max_ratio_reached; }
- if (conv_r >= first_res * 0.9999) count_pat++;
- return true;
+ if (conv_r < first_res * 0.99) count_pat = 0;
+ if (/*gmm::random() * 50. < -log(conv_alpha)-4.0 ||*/ count_pat >= 3)
+ { conv_r=r_max_ratio_reached; conv_alpha=alpha_max_ratio_reached; }
+ if (conv_r >= first_res * 0.9999) count_pat++;
+ return true;
}
return false;
}
- S_default_newton_line_search(void) { count_pat = 0; }
+ S_default_newton_line_search() { count_pat = 0; }
};
-
+
template <typename Matrixt, typename MatrixBi, typename Vector,
- typename Precond, typename local_solver, typename global_solver>
+ typename Precond, typename local_solver, typename global_solver>
void Newton_additive_Schwarz(NewtonAS_struct<Matrixt, MatrixBi> &NS,
- const Vector &u_,
- iteration &iter, const Precond &P,
- local_solver, global_solver) {
+ const Vector &u_,
+ iteration &iter, const Precond &P,
+ local_solver, global_solver) {
Vector &u = const_cast<Vector &>(u_);
typedef typename linalg_traits<Vector>::value_type value_type;
typedef typename number_traits<value_type>::magnitude_type mtype;
typedef actual_precond<Precond, local_solver, Matrixt> chgt_precond;
-
+
double residual = iter.get_resmax();
S_default_newton_line_search internal_ls;
@@ -699,102 +699,103 @@ namespace gmm {
NS.compute_F(rhs, u);
mtype act_res=gmm::vect_norm2(rhs), act_res_new(0), precond_res = act_res;
mtype alpha;
-
+
while(!iter.finished(std::min(act_res, precond_res))) {
for (int SOR_step = 0; SOR_step >= 0; --SOR_step) {
- gmm::clear(rhs);
- for (size_type isd = 0; isd < NS.get_vB().size(); ++isd) {
- const MatrixBi &Bi = (NS.get_vB())[isd];
- size_type si = mat_ncols(Bi);
- gmm::resize(Mloc, si, si);
- xi.resize(si); xii.resize(si); fi.resize(si); di.resize(si);
-
- iternc.init();
- iternc.set_maxiter(30); // ?
- if (iternc.get_noisy())
- cout << "Non-linear local problem " << isd << endl;
- gmm::clear(xi);
- gmm::copy(u, x);
- NS.compute_sub_F(fi, x, isd); gmm::scale(fi, value_type(-1));
- mtype r = gmm::vect_norm2(fi), r_t(r);
- if (r > value_type(0)) {
- iternc.set_rhsnorm(std::max(r, mtype(1)));
- while(!iternc.finished(r)) {
- NS.compute_sub_tangent_matrix(Mloc, x, isd);
-
- PP.build_with(Mloc);
- iter3.init();
- AS_local_solve(local_solver(), Mloc, di, fi, PP, iter3);
-
- internal_ls.init_search(r, iternc.get_iteration());
- do {
- alpha = internal_ls.next_try();
- gmm::add(xi, gmm::scaled(di, -alpha), xii);
- gmm::mult(Bi, gmm::scaled(xii, -1.0), u, x);
- NS.compute_sub_F(fi, x, isd); gmm::scale(fi, value_type(-1));
- r_t = gmm::vect_norm2(fi);
- } while (!internal_ls.is_converged(r_t));
-
- if (alpha != internal_ls.converged_value()) {
- alpha = internal_ls.converged_value();
- gmm::add(xi, gmm::scaled(di, -alpha), xii);
- gmm::mult(Bi, gmm::scaled(xii, -1.0), u, x);
- NS.compute_sub_F(fi, x, isd); gmm::scale(fi, value_type(-1));
- r_t = gmm::vect_norm2(fi);
- }
- gmm::copy(x, vx[isd]); // for exact gradient
-
- if (iternc.get_noisy()) cout << "(step=" << alpha << ")\t";
- ++iternc; r = r_t; gmm::copy(xii, xi);
- }
- if (SOR_step) gmm::mult(Bi, gmm::scaled(xii, -1.0), u, u);
- gmm::mult(Bi, gmm::scaled(xii, -1.0), rhs, rhs);
- }
- }
- precond_res = gmm::vect_norm2(rhs);
- if (SOR_step) cout << "SOR step residual = " << precond_res << endl;
- if (precond_res < residual) break;
- cout << "Precond residual = " << precond_res << endl;
+ gmm::clear(rhs);
+ for (size_type isd = 0; isd < NS.get_vB().size(); ++isd) {
+ const MatrixBi &Bi = (NS.get_vB())[isd];
+ size_type si = mat_ncols(Bi);
+ gmm::resize(Mloc, si, si);
+ xi.resize(si); xii.resize(si); fi.resize(si); di.resize(si);
+
+ iternc.init();
+ iternc.set_maxiter(30); // ?
+ if (iternc.get_noisy())
+ cout << "Non-linear local problem " << isd << endl;
+ gmm::clear(xi);
+ gmm::copy(u, x);
+ NS.compute_sub_F(fi, x, isd); gmm::scale(fi, value_type(-1));
+ mtype r = gmm::vect_norm2(fi), r_t(r);
+ if (r > value_type(0)) {
+ iternc.set_rhsnorm(std::max(r, mtype(1)));
+ while(!iternc.finished(r)) {
+ NS.compute_sub_tangent_matrix(Mloc, x, isd);
+
+ PP.build_with(Mloc);
+ iter3.init();
+ AS_local_solve(local_solver(), Mloc, di, fi, PP, iter3);
+
+ internal_ls.init_search(r, iternc.get_iteration());
+ do {
+ alpha = internal_ls.next_try();
+ gmm::add(xi, gmm::scaled(di, -alpha), xii);
+ gmm::mult(Bi, gmm::scaled(xii, -1.0), u, x);
+ NS.compute_sub_F(fi, x, isd); gmm::scale(fi, value_type(-1));
+ r_t = gmm::vect_norm2(fi);
+ } while (!internal_ls.is_converged(r_t));
+
+ if (alpha != internal_ls.converged_value()) {
+ alpha = internal_ls.converged_value();
+ gmm::add(xi, gmm::scaled(di, -alpha), xii);
+ gmm::mult(Bi, gmm::scaled(xii, -1.0), u, x);
+ NS.compute_sub_F(fi, x, isd); gmm::scale(fi, value_type(-1));
+ r_t = gmm::vect_norm2(fi);
+ }
+ gmm::copy(x, vx[isd]); // for exact gradient
+
+ if (iternc.get_noisy()) cout << "(step=" << alpha << ")\t";
+ ++iternc; r = r_t; gmm::copy(xii, xi);
+ }
+ if (SOR_step) gmm::mult(Bi, gmm::scaled(xii, -1.0), u, u);
+ gmm::mult(Bi, gmm::scaled(xii, -1.0), rhs, rhs);
+ }
+ }
+ precond_res = gmm::vect_norm2(rhs);
+ if (SOR_step) cout << "SOR step residual = " << precond_res << endl;
+ if (precond_res < residual) break;
+ cout << "Precond residual = " << precond_res << endl;
}
iter2.init();
// solving linear system for the global Newton method
if (0) {
- NS.compute_tangent_matrix(M, u);
- add_schwarz_mat<Matrixt, MatrixBi, Precond, local_solver>
- ASM(M, NS.get_vB(), iter4, P, iter.get_resmax());
- AS_global_solve(global_solver(), ASM, d, rhs, iter2);
+ NS.compute_tangent_matrix(M, u);
+ add_schwarz_mat<Matrixt, MatrixBi, Precond, local_solver>
+ ASM(M, NS.get_vB(), iter4, P, iter.get_resmax());
+ AS_global_solve(global_solver(), ASM, d, rhs, iter2);
}
else { // for exact gradient
- AS_exact_gradient<Matrixt, MatrixBi> eg(NS.get_vB());
- for (size_type i = 0; i < NS.get_vB().size(); ++i) {
- NS.compute_tangent_matrix(eg.vM[i], vx[i]);
- }
- eg.init();
- gmres(eg, d, rhs, gmm::identity_matrix(), 50, iter2);
+ AS_exact_gradient<Matrixt, MatrixBi> eg(NS.get_vB());
+ for (size_type i = 0; i < NS.get_vB().size(); ++i) {
+ NS.compute_tangent_matrix(eg.vM[i], vx[i]);
+ }
+ eg.init();
+ gmres(eg, d, rhs, gmm::identity_matrix(), 50, iter2);
}
// gmm::add(gmm::scaled(rhs, 0.1), u); ++iter;
external_ls.init_search(act_res, iter.get_iteration());
do {
- alpha = external_ls.next_try();
- gmm::add(gmm::scaled(d, alpha), u, x);
- NS.compute_F(rhs, x);
- act_res_new = gmm::vect_norm2(rhs);
+ alpha = external_ls.next_try();
+ gmm::add(gmm::scaled(d, alpha), u, x);
+ NS.compute_F(rhs, x);
+ act_res_new = gmm::vect_norm2(rhs);
} while (!external_ls.is_converged(act_res_new));
-
+
if (alpha != external_ls.converged_value()) {
- alpha = external_ls.converged_value();
- gmm::add(gmm::scaled(d, alpha), u, x);
- NS.compute_F(rhs, x);
- act_res_new = gmm::vect_norm2(rhs);
+ alpha = external_ls.converged_value();
+ gmm::add(gmm::scaled(d, alpha), u, x);
+ NS.compute_F(rhs, x);
+ act_res_new = gmm::vect_norm2(rhs);
}
if (iter.get_noisy() > 1) cout << endl;
- act_res = act_res_new;
- if (iter.get_noisy()) cout << "(step=" << alpha << ")\t unprecond res =
" << act_res << " ";
-
-
+ act_res = act_res_new;
+ if (iter.get_noisy())
+ cout << "(step=" << alpha
+ << ")\t unprecond res = " << act_res << " ";
+
++iter; gmm::copy(x, u);
}
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Getfem-commits] [getfem-commits] branch master updated: Remove leftovers and redundant includes, fix whitespace and other minor changes,
Konstantinos Poulios <=