⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 volume.cc

📁 大型并行量子化学软件;支持密度泛函(DFT)。可以进行各种量子化学计算。支持CHARMM并行计算。非常具有应用价值。
💻 CC
字号:
//// volume.cc//// Copyright (C) 1996 Limit Point Systems, Inc.//// Author: Curtis Janssen <cljanss@limitpt.com>// Maintainer: LPS//// This file is part of the SC Toolkit.//// The SC Toolkit is free software; you can redistribute it and/or modify// it under the terms of the GNU Library General Public License as published by// the Free Software Foundation; either version 2, or (at your option)// any later version.//// The SC Toolkit is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the// GNU Library General Public License for more details.//// You should have received a copy of the GNU Library General Public License// along with the SC Toolkit; see the file COPYING.LIB.  If not, write to// the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.//// The U.S. Government is granted a limited license as per AL 91-7.//#ifdef __GNUC__#pragma implementation#endif#include <math.h>#include <util/misc/formio.h>#include <util/keyval/keyval.h>#include <math/scmat/vector3.h>#include <math/scmat/local.h>#include <math/isosurf/volume.h>using namespace std;using namespace sc;static ClassDesc Volume_cd(  typeid(Volume),"Volume",1,"public Function",  0, 0, 0);Volume::Volume():  _interp_acc(1.0e-6){  set_dimension(new SCDimension(3));}Volume::Volume(const Ref<KeyVal>&keyval):  Function(keyval){  set_dimension(new SCDimension(3));  _interp_acc = keyval->doublevalue("interpolation_accuracy");  if (keyval->error() != KeyVal::OK) _interp_acc = 1.0e-6;}Volume::~Volume(){}// interpolate using the bisection algorithmvoidVolume::interpolate(const SCVector3& A,                    const SCVector3& B,                    double val,                    SCVector3& result){  set_x(A);  double value0 = value() - val;  set_x(B);  double value1 = value() - val;  if (value0*value1 > 0.0) {      failure("interpolate(): values at endpoints don't bracket val");    }  else if (value0 == 0.0) {      result = A;      return;    }  else if (value1 == 0.0) {      result = B;      return;    }  SCVector3 BA = B - A;  double length = sqrt(BA.dot(BA));  int niter = (int) (log(length/_interp_acc)/M_LN2);  double f0 = 0.0;  double f1 = 1.0;  double fnext = 0.5;  for (int i=0; i<niter; i++) {      SCVector3 X = A + fnext*BA;      set_x(X);      double valuenext = value() - val;      if (valuenext*value0 <= 0.0) {          value1 = valuenext;          f1 = fnext;          fnext = (f0 + fnext)*0.5;        }      else {          value0 = valuenext;          f0 = fnext;          fnext = (fnext + f1)*0.5;        }    }  result = A + fnext*BA;}voidVolume::solve(const SCVector3& start,              const SCVector3& grad,              double val,              SCVector3& result){  double direction;  set_x(start);  double startvalue = value();  if (startvalue == val) {      result = start;      return;    }  else if (startvalue < val) direction = 1.0;  else direction = -1.0;  int i=0;  SCVector3 next;  double trialvalue;  do {      if (i>10) {          ExEnv::errn() << "Volume::solve: couldn't find end points" << endl;          abort();        }      i++;      next = start + (direction*i)*grad;      set_x(next);      trialvalue = value();    } while ((startvalue-val)*(trialvalue-val)>0.0);  interpolate(start,next,val,result);}voidVolume::failure(const char * msg){  ExEnv::errn() << scprintf("Volume::failure: \"%s\"\n",msg);  abort();}voidVolume::set_gradient(const SCVector3& g){  RefSCVector grad(dimension(), matrixkit());  grad.set_element(0, g[0]);  grad.set_element(1, g[1]);  grad.set_element(2, g[2]);  set_gradient(grad);}voidVolume::set_gradient(RefSCVector& g){  Function::set_gradient(g);}voidVolume::get_gradient(SCVector3& g){  const RefSCVector v = gradient();  g[0] = v.get_element(0);  g[1] = v.get_element(1);  g[2] = v.get_element(2);}voidVolume::set_x(const SCVector3& x){  RefSCVector xx(dimension(), matrixkit());  xx.set_element(0, x[0]);  xx.set_element(1, x[1]);  xx.set_element(2, x[2]);  set_x(xx);}voidVolume::set_x(const RefSCVector& x){  Function::set_x(x);}voidVolume::get_x(SCVector3& x){  const RefSCVector& v = get_x_no_copy();  x[0] = v.get_element(0);  x[1] = v.get_element(1);  x[2] = v.get_element(2);}/////////////////////////////////////////////////////////////////////////////// Local Variables:// mode: c++// c-file-style: "CLJ"// End:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -