Commit 9609c750 authored by alxvov's avatar alxvov
Browse files

Use descent condition, and no line search as a default option for

all oso
parent 7df2ae38
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -51,4 +51,4 @@ dump 1 all custom 50 dump.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3

min_style	spin_oso_cg
# min_modify 	line spin_none discrete_factor 10.0
minimize        1.0e-10 1.0e-7 1000 1000
minimize        1.0e-10 1.0e-10 10000 10000
+2 −2
Original line number Diff line number Diff line
@@ -50,5 +50,5 @@ compute outsp all property/atom spx spy spz sp fmx fmy fmz
dump 		1 all custom 50 dump.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] c_outsp[4] c_outsp[5] c_outsp[6] c_outsp[7]

min_style	spin_oso_lbfgs
min_modify 	line spin_cubic discrete_factor 10.0
minimize        1.0e-15 1.0e-7 10000 1000
# min_modify 	line spin_cubic discrete_factor 10.0
minimize        1.0e-15 1.0e-10 10000 1000
+4 −10
Original line number Diff line number Diff line
@@ -561,7 +561,7 @@ int MinSpinOSO_CG::calc_and_make_step(double a, double b, int index)
  der_e_cur = e_and_d[1];
  index++;

  if (awc(der_e_pr,eprevious,e_and_d[1],e_and_d[0]) || index == 10){
  if (adescent(eprevious,e_and_d[0]) || index == 5){
    MPI_Bcast(&b,1,MPI_DOUBLE,0,world);
    for (int i = 0; i < 3 * nlocal; i++) {
      p_s[i] = b * p_s[i];
@@ -598,20 +598,14 @@ int MinSpinOSO_CG::calc_and_make_step(double a, double b, int index)
}

/* ----------------------------------------------------------------------
  Approximate Wolfe conditions:
  William W. Hager and Hongchao Zhang
  SIAM J. optim., 16(1), 170-192. (23 pages)
  Approximate descent
------------------------------------------------------------------------- */

int MinSpinOSO_CG::awc(double der_phi_0, double phi_0, double der_phi_j, double phi_j){
int MinSpinOSO_CG::adescent(double phi_0, double phi_j){

  double eps = 1.0e-6;
  double delta = 0.1;
  double sigma = 0.9;

  if ((phi_j<=phi_0+eps*fabs(phi_0)) &&
      ((2.0*delta-1.0) * der_phi_0>=der_phi_j) &&
      (der_phi_j>=sigma*der_phi_0))
  if (phi_j<=phi_0+eps*fabs(phi_0))
    return 1;
  else
    return 0;
+1 −1
Original line number Diff line number Diff line
@@ -58,7 +58,7 @@ class MinSpinOSO_CG: public Min {
  void rodrigues_rotation(const double *, double *);
  void make_step(double, double *);
  int calc_and_make_step(double, double, int);
  int awc(double, double, double, double);
  int adescent(double, double);
  double evaluate_dt();
  double maximum_rotation(double *);

+6 −15
Original line number Diff line number Diff line
@@ -73,10 +73,7 @@ MinSpinOSO_LBFGS::MinSpinOSO_LBFGS(LAMMPS *lmp) :

  nreplica = universe->nworlds;
  ireplica = universe->iworld;
  if (nreplica > 1)
    use_line_search = 0;  // no line search for NEB
  else
    use_line_search = 1;
  use_line_search = 0;  // no line search as default option for LBFGS

  maxepsrot = MY_2PI / (100.0);

@@ -114,7 +111,7 @@ void MinSpinOSO_LBFGS::init()

  // set back use_line_search to 0 if more than one replica

  if (linestyle != 4 && nreplica == 1){
  if (linestyle == 3 && nreplica == 1){
    use_line_search = 1;
  }
  else{
@@ -694,7 +691,7 @@ int MinSpinOSO_LBFGS::calc_and_make_step(double a, double b, int index)
  der_e_cur = e_and_d[1];
  index++;

  if (awc(der_e_pr,eprevious,e_and_d[1],e_and_d[0]) || index == 5){
  if (adescent(eprevious,e_and_d[0]) || index == 5){
    MPI_Bcast(&b,1,MPI_DOUBLE,0,world);
    for (int i = 0; i < 3 * nlocal; i++) {
      p_s[i] = b * p_s[i];
@@ -731,20 +728,14 @@ int MinSpinOSO_LBFGS::calc_and_make_step(double a, double b, int index)
}

/* ----------------------------------------------------------------------
  Approximate Wolfe conditions:
  William W. Hager and Hongchao Zhang
  SIAM J. optim., 16(1), 170-192. (23 pages)
  Approximate descent
------------------------------------------------------------------------- */

int MinSpinOSO_LBFGS::awc(double der_phi_0, double phi_0, double der_phi_j, double phi_j){
int MinSpinOSO_LBFGS::adescent(double phi_0, double phi_j){

  double eps = 1.0e-6;
  double delta = 0.1;
  double sigma = 0.9;

  if ((phi_j<=phi_0+eps*fabs(phi_0)) &&
     ((2.0*delta-1.0) * der_phi_0>=der_phi_j) &&
     (der_phi_j>=sigma*der_phi_0))
  if (phi_j<=phi_0+eps*fabs(phi_0))
    return 1;
  else
    return 0;
Loading