Commit 677f5cc9 authored by julient31's avatar julient31
Browse files

C3 JT 041420

parent da36b252
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@
#include "timer.h"
#include "atom_kokkos.h"
#include "atom_masks.h"
#include "error.h"
#include "fix_minimize_kokkos.h"

using namespace LAMMPS_NS;
@@ -42,7 +43,7 @@ MinCGKokkos::MinCGKokkos(LAMMPS *lmp) : MinLineSearchKokkos(lmp)
int MinCGKokkos::iterate(int maxiter)
{
  int fail,ntimestep;
  double beta,gg,dot[2],dotall[2];
  double beta,gg,dot[2],dotall[2],fdotf;

  fix_minimize_kk->k_vectors.sync<LMPDeviceType>();
  fix_minimize_kk->k_vectors.modify<LMPDeviceType>();
@@ -111,7 +112,14 @@ int MinCGKokkos::iterate(int maxiter)
    dot[1] = sdot.d1;
    MPI_Allreduce(dot,dotall,2,MPI_DOUBLE,MPI_SUM,world);

    if (dotall[0] < update->ftol*update->ftol) return FTOL;
    fdotf = 0.0;
    if (update->ftol > 0.0) {
      if (normstyle == MAX) fdotf = fnorm_max();        // max force norm
      else if (normstyle == INF) fdotf = fnorm_inf();   // infinite force norm
      else if (normstyle == TWO) fdotf = dotall[0];     // same as fnorm_sqr(), Euclidean force 2-norm
      else error->all(FLERR,"Illegal min_modify command");
      if (fdotf < update->ftol*update->ftol) return FTOL;
    }

    // update new search direction h from new f = -Grad(x) and old g
    // this is Polak-Ribieri formulation
+28 −3
Original line number Diff line number Diff line
@@ -236,7 +236,7 @@ void MinKokkos::setup(int flag)

  einitial = ecurrent;
  fnorm2_init = sqrt(fnorm_sqr());
  fnorminf_init = fnorm_inf();
  fnorminf_init = sqrt(fnorm_inf());
}

/* ----------------------------------------------------------------------
@@ -345,7 +345,7 @@ void MinKokkos::setup_minimal(int flag)

  einitial = ecurrent;
  fnorm2_init = sqrt(fnorm_sqr());
  fnorminf_init = fnorm_inf();
  fnorminf_init = sqrt(fnorm_inf());
}

/* ----------------------------------------------------------------------
@@ -620,7 +620,7 @@ double MinKokkos::fnorm_inf()
    auto l_fvec = fvec;

    Kokkos::parallel_reduce(nvec, LAMMPS_LAMBDA(int i, double& local_norm_inf) {
      local_norm_inf = MAX(fabs(l_fvec[i]),local_norm_inf);
      local_norm_inf = MAX(l_fvec[i]*l_fvec[i],local_norm_inf);
    },Kokkos::Max<double>(local_norm_inf));
  }

@@ -629,3 +629,28 @@ double MinKokkos::fnorm_inf()

  return norm_inf;
}

/* ----------------------------------------------------------------------
   compute and return ||force||_max (inf norm per-vector)
------------------------------------------------------------------------- */

double MinKokkos::fnorm_max()
{
  
  double local_norm_max = 0.0;
  {
    // local variables for lambda capture

    auto l_fvec = fvec;

    Kokkos::parallel_reduce(nvec, LAMMPS_LAMBDA(int i, double& local_norm_max) {
      double fdotf = l_fvec[i]*l_fvec[i]+l_fvec[i+1]*l_fvec[i+1]+l_fvec[i+2]*l_fvec[i+2];
      local_norm_max = MAX(fdotf,local_norm_max);
    },Kokkos::Max<double>(local_norm_max));
  }

  double norm_max = 0.0;
  MPI_Allreduce(&local_norm_max,&norm_max,1,MPI_DOUBLE,MPI_MAX,world);

  return norm_max;
}
+1 −0
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ class MinKokkos : public Min {
  void run(int);
  double fnorm_sqr();
  double fnorm_inf();
  double fnorm_max();

  virtual void init_style() {}
  virtual void setup_style() = 0;