From 56e1a05287c34188eca387dfee62b935434096fd Mon Sep 17 00:00:00 2001 From: julient31 Date: Mon, 23 Sep 2019 11:12:31 -0600 Subject: [PATCH] Commit JT 092319 - modified norm input in min_modify - corrected doc/src/min_modify.txt - added expression of the norms - added a min max method in src/min.h --- doc/src/Eqs/norm_max.jpg | Bin 0 -> 9471 bytes doc/src/Eqs/norm_max.tex | 15 ++++++++++ doc/src/Eqs/norm_two.jpg | Bin 0 -> 6048 bytes doc/src/Eqs/norm_two.tex | 15 ++++++++++ doc/src/min_modify.txt | 18 ++++++++---- src/MAKE/Makefile.serial | 2 +- src/min.cpp | 59 +++++++++++++++++++++++++++++++-------- src/min.h | 4 ++- src/min_cg.cpp | 12 ++++---- src/min_fire.cpp | 11 ++------ src/min_hftn.cpp | 2 +- src/min_quickmin.cpp | 11 ++------ src/min_sd.cpp | 6 ++-- 13 files changed, 109 insertions(+), 46 deletions(-) create mode 100644 doc/src/Eqs/norm_max.jpg create mode 100644 doc/src/Eqs/norm_max.tex create mode 100644 doc/src/Eqs/norm_two.jpg create mode 100644 doc/src/Eqs/norm_two.tex diff --git a/doc/src/Eqs/norm_max.jpg b/doc/src/Eqs/norm_max.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c10db9a53144cb3e889eb3c4315352d2ef0c85e8 GIT binary patch literal 9471 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 literal 0 HcmV?d00001 diff --git a/doc/src/Eqs/norm_max.tex b/doc/src/Eqs/norm_max.tex new file mode 100644 index 0000000000..3b2198bdf0 --- /dev/null +++ b/doc/src/Eqs/norm_max.tex @@ -0,0 +1,15 @@ +\documentclass[preview]{standalone} +\usepackage{varwidth} +\usepackage[utf8x]{inputenc} +\usepackage{amsmath, amssymb, graphics, setspace} + +\begin{document} +\begin{varwidth}{50in} + \begin{equation} + % \left| \left| \vec{F} \right| \right|_2 + || \vec{F} ||_{max} + = {\rm max}\left(||\vec{F}_1||, \cdots, ||\vec{F}_N||\right) + \nonumber + \end{equation} +\end{varwidth} +\end{document} diff --git a/doc/src/Eqs/norm_two.jpg b/doc/src/Eqs/norm_two.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5554de32f96a3a16f855b7e5011aa999d3c2819c GIT binary patch literal 6048 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 Wbg?+l1j#1hE)v|+w|Del^uGZ4YjxcK literal 0 HcmV?d00001 diff --git a/doc/src/Eqs/norm_two.tex b/doc/src/Eqs/norm_two.tex new file mode 100644 index 0000000000..d428081a49 --- /dev/null +++ b/doc/src/Eqs/norm_two.tex @@ -0,0 +1,15 @@ +\documentclass[preview]{standalone} +\usepackage{varwidth} +\usepackage[utf8x]{inputenc} +\usepackage{amsmath, amssymb, graphics, setspace} + +\begin{document} +\begin{varwidth}{50in} + \begin{equation} + % \left| \left| \vec{F} \right| \right|_2 + || \vec{F} ||_{2} + = \sqrt{\vec{F}_1+ \cdots + \vec{F}_N} + \nonumber + \end{equation} +\end{varwidth} +\end{document} diff --git a/doc/src/min_modify.txt b/doc/src/min_modify.txt index 06c1f7514f..b941a33559 100644 --- a/doc/src/min_modify.txt +++ b/doc/src/min_modify.txt @@ -18,8 +18,9 @@ keyword = {dmax} or {line} or {norm} or {alpha_damp} or {discrete_factor} max = maximum distance for line search to move (distance units) {line} value = {backtrack} or {quadratic} or {forcezero} or {spin_cubic} or {spin_none} backtrack,quadratic,forcezero,spin_cubic,spin_none = style of linesearch to use - {norm} value = {euclidean} or {max} - euclidean,max = style of norm to use + {norm} value = {two} or {max} + two = Euclidean two-norm (length of 3N vector) + max = max value of across all 3-vectors {alpha_damp} value = damping damping = fictitious Gilbert damping for spin minimization (adim) {discrete_factor} value = factor @@ -74,9 +75,16 @@ could move in the gradient direction to reduce forces further. The choice of a norm can be modified for the min styles {cg}, {sd}, {quickmin}, {fire}, {spin}, {spin/cg} and {spin/lbfgs} using the {norm} keyword. -The default {euclidean} norm computes the 2-norm (length) of the -global force vector. The {max} norm computes the maximum value -of the 2-norms across all forces in the system. +The default {two} norm computes the 2-norm (Euclidean length) of the +global force vector: + +:c,image(Eqs/norm_two.jpg) + +The {max} norm computes the length of the 3-vector force +for each atom (2-norm), and takes the maximum value of those accross +all atoms + +:c,image(Eqs/norm_max.jpg) Keywords {alpha_damp} and {discrete_factor} only make sense when a "min_spin"_min_spin.html command is declared. diff --git a/src/MAKE/Makefile.serial b/src/MAKE/Makefile.serial index 8628d2bb73..5954d97761 100644 --- a/src/MAKE/Makefile.serial +++ b/src/MAKE/Makefile.serial @@ -7,7 +7,7 @@ SHELL = /bin/sh # specify flags and libraries needed for your compiler CC = g++ -CCFLAGS = -g -O3 -Wall +CCFLAGS = -g -O3 SHFLAGS = -fPIC DEPFLAGS = -M diff --git a/src/min.cpp b/src/min.cpp index 31adf58525..33643d4837 100644 --- a/src/min.cpp +++ b/src/min.cpp @@ -49,6 +49,8 @@ using namespace LAMMPS_NS; using namespace MathConst; +enum{TWO,MAX} + /* ---------------------------------------------------------------------- */ Min::Min(LAMMPS *lmp) : Pointers(lmp) @@ -56,7 +58,7 @@ Min::Min(LAMMPS *lmp) : Pointers(lmp) dmax = 0.1; searchflag = 0; linestyle = 1; - normstyle = 0; + normstyle = TWO; elist_global = elist_atom = NULL; vlist_global = vlist_atom = NULL; @@ -662,8 +664,8 @@ void Min::modify_params(int narg, char **arg) iarg += 2; } else if (strcmp(arg[iarg],"norm") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal min_modify command"); - if (strcmp(arg[iarg+1],"euclidean") == 0) normstyle = 0; - else if (strcmp(arg[iarg+1],"max") == 0) normstyle = 1; + if (strcmp(arg[iarg+1],"two") == 0) normstyle = TWO; + else if (strcmp(arg[iarg+1],"max") == 0) normstyle = MAX; else error->all(FLERR,"Illegal min_modify command"); iarg += 2; } else { @@ -827,6 +829,41 @@ double Min::fnorm_inf() return norm_inf; } +/* ---------------------------------------------------------------------- + compute and return ||force||_max (inf norm per-vector) +------------------------------------------------------------------------- */ + +double Min::fnorm_max() +{ + int i,n; + double fdotf,*fatom; + + double local_norm_max = 0.0; + for (i = 0; i < nvec; i+=3) { + fdotf = fvec[i]*fvec[i]+fvec[i+1]*fvec[i+1]+fvec[i+2]*fvec[i+2]; + local_norm_max = MAX(fdotf,local_norm_max); + } + if (nextra_atom) { + for (int m = 0; m < nextra_atom; m++) { + fatom = fextra_atom[m]; + n = extra_nlen[m]; + for (i = 0; i < n; i+=3) + fdotf = fvec[i]*fvec[i]+fvec[i+1]*fvec[i+1]+fvec[i+2]*fvec[i+2]; + local_norm_max = MAX(fdotf,local_norm_max); + } + } + + double norm_max = 0.0; + MPI_Allreduce(&local_norm_max,&norm_max,1,MPI_DOUBLE,MPI_MAX,world); + + if (nextra_global) + for (i = 0; i < n; i+=3) + fdotf = fvec[i]*fvec[i]+fvec[i+1]*fvec[i+1]+fvec[i+2]*fvec[i+2]; + norm_max = MAX(fdotf,norm_max); + + return norm_max; +} + /* ---------------------------------------------------------------------- compute and return sum_i||mag. torque_i||_2 (in eV) ------------------------------------------------------------------------- */ @@ -842,10 +879,10 @@ double Min::total_torque() fmsq = ftotsqone = ftotsqall = 0.0; for (int i = 0; i < nlocal; i++) { - tx = fm[i][1] * sp[i][2] - fm[i][2] * sp[i][1]; - ty = fm[i][2] * sp[i][0] - fm[i][0] * sp[i][2]; - tz = fm[i][0] * sp[i][1] - fm[i][1] * sp[i][0]; - fmsq = tx * tx + ty * ty + tz * tz; + tx = fm[i][1]*sp[i][2] - fm[i][2]*sp[i][1]; + ty = fm[i][2]*sp[i][0] - fm[i][0]*sp[i][2]; + tz = fm[i][0]*sp[i][1] - fm[i][1]*sp[i][0]; + fmsq = tx*tx + ty*ty + tz*tz; ftotsqone += fmsq; } @@ -873,10 +910,10 @@ double Min::max_torque() fmsq = fmaxsqone = fmaxsqall = 0.0; for (int i = 0; i < nlocal; i++) { - tx = fm[i][1] * sp[i][2] - fm[i][2] * sp[i][1]; - ty = fm[i][2] * sp[i][0] - fm[i][0] * sp[i][2]; - tz = fm[i][0] * sp[i][1] - fm[i][1] * sp[i][0]; - fmsq = tx * tx + ty * ty + tz * tz; + tx = fm[i][1]*sp[i][2] - fm[i][2]*sp[i][1]; + ty = fm[i][2]*sp[i][0] - fm[i][0]*sp[i][2]; + tz = fm[i][0]*sp[i][1] - fm[i][1]*sp[i][0]; + fmsq = tx*tx + ty*ty + tz*tz; fmaxsqone = MAX(fmaxsqone,fmsq); } diff --git a/src/min.h b/src/min.h index e18d0dd677..ac7a3c1e9b 100644 --- a/src/min.h +++ b/src/min.h @@ -41,6 +41,7 @@ class Min : protected Pointers { virtual int modify_param(int, char **) {return 0;} double fnorm_sqr(); double fnorm_inf(); + double fnorm_max(); // methods for spin minimizers double max_torque(); @@ -64,7 +65,8 @@ class Min : protected Pointers { int linestyle; // 0 = backtrack, 1 = quadratic, 2 = forcezero // 3 = spin_cubic, 4 = spin_none - int normstyle; // 0 = Euclidean norm, 1 = inf. norm + int normstyle; // TWO or MAX flag for force norm evaluation + // int normstyle; // 0 = Euclidean norm, 1 = inf. norm int nelist_global,nelist_atom; // # of PE,virial computes to check int nvlist_global,nvlist_atom; diff --git a/src/min_cg.cpp b/src/min_cg.cpp index 2267a1ebb6..d98ec0ef97 100644 --- a/src/min_cg.cpp +++ b/src/min_cg.cpp @@ -35,7 +35,7 @@ MinCG::MinCG(LAMMPS *lmp) : MinLineSearch(lmp) {} int MinCG::iterate(int maxiter) { int i,m,n,fail,ntimestep; - double beta,gg,dot[2],dotall[2],fmax,fmaxall; + double beta,gg,dot[2],dotall[2],fmax; double *fatom,*gatom,*hatom; // nlimit = max # of CG iterations before restarting @@ -85,13 +85,12 @@ int MinCG::iterate(int maxiter) // force tolerance criterion - fmax = fmaxall = 0.0; dot[0] = dot[1] = 0.0; for (i = 0; i < nvec; i++) { dot[0] += fvec[i]*fvec[i]; dot[1] += fvec[i]*g[i]; - fmax = MAX(fmax,fvec[i]*fvec[i]); } + if (nextra_atom) for (m = 0; m < nextra_atom; m++) { fatom = fextra_atom[m]; @@ -104,16 +103,17 @@ int MinCG::iterate(int maxiter) } } MPI_Allreduce(dot,dotall,2,MPI_DOUBLE,MPI_SUM,world); - MPI_Allreduce(&fmax,&fmaxall,2,MPI_DOUBLE,MPI_MAX,world); if (nextra_global) for (i = 0; i < nextra_global; i++) { dotall[0] += fextra[i]*fextra[i]; dotall[1] += fextra[i]*gextra[i]; } - if (normstyle == 1) { // max force norm + fmax = 0.0; + if (normstyle == MAX) { // max force norm + fmax = fnorm_max(); if (fmax < update->ftol*update->ftol) return FTOL; - } else { // Euclidean force norm + } else { // Euclidean force 2-norm if (dotall[0] < update->ftol*update->ftol) return FTOL; } diff --git a/src/min_fire.cpp b/src/min_fire.cpp index 5b047ccd0e..dbb7f36148 100644 --- a/src/min_fire.cpp +++ b/src/min_fire.cpp @@ -250,15 +250,8 @@ int MinFire::iterate(int maxiter) // sync across replicas if running multi-replica minimization if (update->ftol > 0.0) { - if (normstyle == 1) { // max force norm - fdotf = fnorm_inf(); - fdotfloc = fdotf; - MPI_Allreduce(&fdotfloc,&fdotf,1,MPI_INT,MPI_MAX,universe->uworld); - } else { // Euclidean force norm - fdotf = fnorm_sqr(); - fdotfloc = fdotf; - MPI_Allreduce(&fdotfloc,&fdotf,1,MPI_INT,MPI_SUM,universe->uworld); - } + if (normstyle == MAX) fdotf = fnorm_inf(); // max force norm + else fdotf = fnorm_sqr(); // Euclidean force 2-norm if (update->multireplica == 0) { if (fdotf < update->ftol*update->ftol) return FTOL; } else { diff --git a/src/min_hftn.cpp b/src/min_hftn.cpp index 3c2cff9205..63432aab63 100644 --- a/src/min_hftn.cpp +++ b/src/min_hftn.cpp @@ -113,7 +113,7 @@ void MinHFTN::init() { Min::init(); - if (normstyle == 1) + if (normstyle == MAX) error->all(FLERR,"Incorrect min_modify option"); for (int i = 1; i < NUM_HFTN_ATOM_BASED_VECTORS; i++) { diff --git a/src/min_quickmin.cpp b/src/min_quickmin.cpp index 3450f7785e..6846aaba0a 100644 --- a/src/min_quickmin.cpp +++ b/src/min_quickmin.cpp @@ -215,15 +215,8 @@ int MinQuickMin::iterate(int maxiter) // sync across replicas if running multi-replica minimization if (update->ftol > 0.0) { - if (normstyle == 1) { // max force norm - fdotf = fnorm_inf(); - fdotfloc = fdotf; - MPI_Allreduce(&fdotfloc,&fdotf,1,MPI_INT,MPI_MAX,universe->uworld); - } else { // Euclidean force norm - fdotf = fnorm_sqr(); - fdotfloc = fdotf; - MPI_Allreduce(&fdotfloc,&fdotf,1,MPI_INT,MPI_SUM,universe->uworld); - } + if (normstyle == MAX) fdotfloc = fnorm_max(); // max force norm + else fdotf = fnorm_sqr(); // Euclidean force 2-norm if (update->multireplica == 0) { if (fdotf < update->ftol*update->ftol) return FTOL; } else { diff --git a/src/min_sd.cpp b/src/min_sd.cpp index dd59c9d2d6..3ded85990d 100644 --- a/src/min_sd.cpp +++ b/src/min_sd.cpp @@ -34,7 +34,7 @@ MinSD::MinSD(LAMMPS *lmp) : MinLineSearch(lmp) {} int MinSD::iterate(int maxiter) { int i,m,n,fail,ntimestep; - double fdotf; + double fdotf,fdotfloc; double *fatom,*hatom; // initialize working vectors @@ -77,8 +77,8 @@ int MinSD::iterate(int maxiter) // force tolerance criterion - if (normstyle == 1) fdotf = fnorm_inf(); // max force norm - else fdotf = fnorm_sqr(); // Euclidean force norm + if (normstyle == MAX) fdotf = fnorm_max(); // max force norm + else fdotf = fnorm_sqr(); // Euclidean force 2-norm if (fdotf < update->ftol*update->ftol) return FTOL; // set new search direction h to f = -Grad(x)