Example #1
0
void CodClassInstCanvas::save(QTextStream & st, bool ref, QString & warning) const {
  if (ref)
    st << "classinstance_ref " << get_ident() << " // "
      << full_name();
  else if (browser_node->get_type() == UmlClass) {
    nl_indent(st);
    st << "classinstance " << get_ident() << ' ';
    browser_node->save(st, TRUE, warning);
    nl_indent(st);
    ClassInstCanvas::save(st);
    st << " name ";
    save_string(iname, st);
    st << ' ';
    save_xyz(st, this, " xyz");
  }
  else {
    nl_indent(st);
    st << "classinstancecanvas " << get_ident() << ' ';
    browser_node->save(st, TRUE, warning);

    indent(+1);
    nl_indent(st);
    save_xyz(st, this, "xyz");
    ClassInstCanvas::save(st);
    save_stereotype_property(st, warning);    
    indent(-1);
    
    nl_indent(st);
    st << "end";
  }
}
Example #2
0
void CodDirsCanvas::save(QTextStream & st, bool ref, QString & warning) const
{
    if (ref)
        st << "dirscanvas_ref " << get_ident();
    else {
        nl_indent(st);
        st << "dirscanvas " << get_ident() << " z " << zValue() << " ";
        link->save(st, TRUE, warning);

        indent(+1);

        settings.save_msg(st);

        if (label != 0) {
            nl_indent(st);
            st << "forward_label ";
            save_string(label->get_name().toLatin1().constData(), st);
            save_xyz(st, label, " xyz");
        }

        if (backward_label != 0) {
            nl_indent(st);
            st << "backward_label ";
            save_string(backward_label->get_name().toLatin1().constData(), st);
            save_xyz(st, backward_label, " xyz");
        }

        indent(-1);
    }
}
Example #3
0
void IconCanvas::save(Q3TextStream & st, bool, QString & warning) const {
  nl_indent(st);
  st << "iconcanvas " << get_ident() << ' ';
  browser_node->save(st, TRUE, warning);
  nl_indent(st);
  save_xyz(st, this, "  xyz");
}
Example #4
0
void PseudoStateCanvas::save(QTextStream & st, bool ref, QString & warning) const {
  if (ref) {
    st << "pseudostatecanvas_ref " << get_ident() << " // "
      << browser_node->full_name();
  }
  else {
    nl_indent(st);
    st << "pseudostatecanvas " << get_ident() << ' ';
    browser_node->save(st, TRUE, warning);
    indent(+1);
    nl_indent(st);
    if (horiz)
      st << "horizontal ";
    if (manual_size)
      save_xyzwh(st, this, " xyzwh");
    else
      save_xyz(st, this, " xyz");
    if (label != 0)
      save_xy(st, label, " label_xy");
    save_stereotype_property(st, warning);
    indent(-1);
    nl_indent(st);
    st << "end";
  }
}
Example #5
0
void SdObjCanvas::save(QTextStream & st) const {
  if (mortal)
    st << "  mortal";
  save_xyz(st, this, "  xyz");
  if (life_line->is_masked())
    st << " life_line_masked";
  st << " life_line_z " << life_line->z();
}
Example #6
0
void ArrowJunctionCanvas::save(Q3TextStream & st, bool, QString & warning) const {
  nl_indent(st);
  st << "arrowjunctioncanvas " << get_ident() << ' ';
  interface->save(st, TRUE, warning);
  nl_indent(st);
  save_xyz(st, this, "  xyz");
  save_xy(st, label, " label_xy");
}
Example #7
0
void save_output()
{
    if( xyz_file && (step % save_xyz_freq) == 0 ) save_xyz();
    if( dcd_file && (step % save_dcd_freq) == 0 ) save_dcd();
    if( enr_file && (step % save_enr_freq) == 0  ) save_energy();

    if( (step % save_rst_freq) == 0  ) restart_write( rst_filename );/* must be last */
}
Example #8
0
void SdLostFoundMsgSupportCanvas::save(QTextStream & st, bool ref, QString &) const {
    if (ref)
        st << "lostfoundmsgsupport_ref " << get_ident();
    else {
        nl_indent(st);
        st << "lostfoundmsgsupport " << get_ident();
        save_xyz(st, this, " xyz");
    }
}
Example #9
0
void HubCanvas::save(QTextStream & st, bool ref, QString &) const
{
    if (ref)
        st << "hubcanvas_ref " << get_ident();
    else {
        nl_indent(st);
        st << "hubcanvas " << get_ident();
        save_xyz(st, this, " xyz");
    }
}
Example #10
0
void ImageCanvas::save(QTextStream & st, bool ref, QString &) const {
    if (ref) {
        st << "image_ref " << get_ident();
    }
    else {
        nl_indent(st);

        st << "image " << get_ident() << ' ';
        save_string(fromUnicode(path), st);
        save_xyz(st, this, " xyz");
        st << " end";
    }
}
Example #11
0
void LabelCanvas::save(QTextStream  & st, bool, QString &) const
{
    st << "label ";
    save_string(text().toLatin1().constData(), st);

    if (font().bold())
        st << " bold";

    if (font().italic())
        st << " italic";

    if (font().underline())
        st << " underlined";

    save_xyz(st, this, " xyz");
}
Example #12
0
void ParameterSetCanvas::save(QTextStream & st, bool ref, QString & warning) const {
    if (ref) {
        st << "parametersetcanvas_ref " << get_ident() << " // "
           << browser_node->full_name();
    }
    else {
        nl_indent(st);
        st << "parametersetcanvas " << get_ident() << ' ';
        browser_node->save(st, TRUE, warning);
        nl_indent(st);
        if (itscolor != UmlDefaultColor)
            st << "  color " << stringify(itscolor);
        save_xyz(st, this, "  xyz");
        save_stereotype_property(st, warning);
        nl_indent(st);
        st << "end";
    }
}
Example #13
0
void UcClassCanvas::save(Q3TextStream & st, bool ref, QString & warning) const {
  if (ref)
    st << "classcanvas_ref " << get_ident() << " // " << browser_node->get_name();
  else {
    nl_indent(st);
    st << "classcanvas " << get_ident() << ' ';
    browser_node->save(st, TRUE, warning);
    indent(+1);
    settings.save(st);
    nl_indent(st);
    if (itscolor != UmlDefaultColor)
      st << "color " << stringify(itscolor) << ' ';
    save_xyz(st, this, "xyz");
    save_stereotype_property(st, warning);
    indent(-1);
    nl_indent(st);
    st << "end";
  }
}
Example #14
0
void SdMsgBaseCanvas::save(QTextStream & st, QString & warning) const {
  nl_indent(st);
  st << "to ";
  dest->save(st, TRUE, warning);
  nl_indent(st);
#ifdef FORCE_INT_COORD
  // note : << float bugged in Qt 3.3.3
  st << "yz " << (int) y() << ' ' << (int) z();
#else
  QString sy, sz;
  
  st << "yz " << sy.setNum(y()) << ' ' << sz.setNum(z());
#endif
  if (msg != 0) {
    // not a lost, dest is duration
    if (msg->deletedp()) {
      warning += QString("<b>") + the_canvas()->browser_diagram()->full_name() +
	"</b> reference the class <b>" +
	  ((SdDurationCanvas *) dest)->get_line()->get_obj()->get_class()->full_name() +
	    "</b> deleted operation <b>" + msg->definition(TRUE, FALSE) + "</b><br>\n<br>\n";
      if (warning[0] == '!') {
	st << " msg ";
	msg->save(st, TRUE, warning);
      }
      else {
	st << " explicitmsg ";
	save_string(msg->get_browser_node()->get_name(), st);
      }
    }
    else {
      st << " msg ";
      msg->save(st, TRUE, warning);
    }
  }
  else if (! explicit_msg.isEmpty()) {
    st << " explicitmsg ";
    save_string(explicit_msg, st);
  }
  else
    st << " unspecifiedmsg";
  
  if (stereotype != 0) {
    nl_indent(st);
    st << "stereotype ";
    save_string(stereotype->get_name(), st);
    save_xyz(st, stereotype, " xyz");
  }
  
  nl_indent(st);
  st << "show_full_operations_definition " << stringify(show_full_oper)
    << " drawing_language " << stringify(drawing_language)
      << " show_context_mode " << stringify(show_context_mode);
  
  if (label != 0) {
    if (! args.isEmpty()) {
      nl_indent(st);
      st << "args ";
      save_string(args, st);
    }
    nl_indent(st);
    save_xy(st, label, "label_xy");
  }
}
Example #15
0
int main(int argc, char **argv) {

#ifdef _OPENMP
  printf("ERKALE - Geometry optimization from Hel, OpenMP version, running on %i cores.\n",omp_get_max_threads());
#else
  printf("ERKALE - Geometry optimization from Hel, serial version.\n");
#endif
  print_copyright();
  print_license();
#ifdef SVNRELEASE
  printf("At svn revision %s.\n\n",SVNREVISION);
#endif
  print_hostname();

  if(argc!=2) {
    printf("Usage: $ %s runfile\n",argv[0]);
    return 0;
  }

  // Initialize libint
  init_libint_base();
  // Initialize libderiv
  init_libderiv_base();

  Timer tprog;
  tprog.print_time();

  // Parse settings
  Settings set;
  set.add_scf_settings();
  set.add_string("SaveChk","File to use as checkpoint","erkale.chk");
  set.add_string("LoadChk","File to load old results from","");
  set.add_bool("ForcePol","Force polarized calculation",false);
  set.add_bool("FreezeCore","Freeze the atomic cores?",false);
  set.add_string("Optimizer","Optimizer to use: CGFR, CGPR, BFGS, BFGS2 (default), SD","BFGS2");
  set.add_int("MaxSteps","Maximum amount of geometry steps",256);
  set.add_string("Criterion","Convergence criterion to use: LOOSE, NORMAL, TIGHT, VERYTIGHT","NORMAL");
  set.add_string("OptMovie","xyz movie to store progress in","optimize.xyz");
  set.add_string("Result","File to save optimized geometry in","optimized.xyz");
  set.set_string("Logfile","erkale_geom.log");
  set.parse(std::string(argv[1]),true);
  set.print();

  bool verbose=set.get_bool("Verbose");
  int maxiter=set.get_int("MaxSteps");
  std::string optmovie=set.get_string("OptMovie");
  std::string result=set.get_string("Result");

  // Interpret optimizer
  enum minimizer alg;
  std::string method=set.get_string("Optimizer");
  if(stricmp(method,"CGFR")==0)
    alg=gCGFR;
  else if(stricmp(method,"CGPR")==0)
    alg=gCGPR;
  else if(stricmp(method,"BFGS")==0)
    alg=gBFGS;
  else if(stricmp(method,"BFGS2")==0)
    alg=gBFGS2;
  else if(stricmp(method,"SD")==0)
    alg=gSD;
  else {
    ERROR_INFO();
    throw std::runtime_error("Unknown optimization method.\n");
  }

  // Interpret optimizer
  enum convergence crit;
  method=set.get_string("Criterion");
  if(stricmp(method,"LOOSE")==0)
    crit=LOOSE;
  else if(stricmp(method,"NORMAL")==0)
    crit=NORMAL;
  else if(stricmp(method,"TIGHT")==0)
    crit=TIGHT;
  else if(stricmp(method,"VERYTIGHT")==0)
    crit=VERYTIGHT;
  else {
    ERROR_INFO();
    throw std::runtime_error("Unknown optimization method.\n");
  }

  // Redirect output?
  std::string logfile=set.get_string("Logfile");
  if(stricmp(logfile,"stdout")!=0) {
    // Redirect stdout to file
    FILE *outstream=freopen(logfile.c_str(),"w",stdout);
    if(outstream==NULL) {
      ERROR_INFO();
      throw std::runtime_error("Unable to redirect output!\n");
    } else
      fprintf(stderr,"\n");
  }

  // Read in atoms.
  std::string atomfile=set.get_string("System");
  const std::vector<atom_t> origgeom=load_xyz(atomfile);
  std::vector<atom_t> atoms(origgeom);

  // Are any atoms fixed?
  std::vector<size_t> dofidx;
  for(size_t i=0;i<atoms.size();i++) {
    bool fixed=false;

    if(atoms[i].el.size()>3)
      if(stricmp(atoms[i].el.substr(atoms[i].el.size()-3),"-Fx")==0) {
	fixed=true;
	atoms[i].el=atoms[i].el.substr(0,atoms[i].el.size()-3);
      }

    // Add to degrees of freedom
    if(!fixed)
      dofidx.push_back(i);
  }

  // Read in basis set
  BasisSetLibrary baslib;
  std::string basfile=set.get_string("Basis");
  baslib.load_gaussian94(basfile);
  printf("\n");

  // Save to output
  save_xyz(atoms,"Initial configuration",optmovie,false);

  // Minimizer options
  opthelper_t pars;
  pars.atoms=atoms;
  pars.baslib=baslib;
  pars.set=set;
  pars.dofidx=dofidx;

  /* Starting point */
  gsl_vector *x = gsl_vector_alloc (3*dofidx.size());
  for(size_t i=0;i<dofidx.size();i++) {
    gsl_vector_set(x,3*i,atoms[dofidx[i]].x);
    gsl_vector_set(x,3*i+1,atoms[dofidx[i]].y);
    gsl_vector_set(x,3*i+2,atoms[dofidx[i]].z);
  }

  // GSL status
  int status;

  const gsl_multimin_fdfminimizer_type *T;
  gsl_multimin_fdfminimizer *s;

  gsl_multimin_function_fdf minimizer;

  minimizer.n = x->size;
  minimizer.f = calc_E;
  minimizer.df = calc_f;
  minimizer.fdf = calc_Ef;
  minimizer.params = (void *) &pars;

  if(alg==gCGFR) {
    T = gsl_multimin_fdfminimizer_conjugate_fr;
    if(verbose) printf("Using Fletcher-Reeves conjugate gradients.\n");
  } else if(alg==gCGPR) {
    T = gsl_multimin_fdfminimizer_conjugate_pr;
    if(verbose) printf("Using Polak-Ribière conjugate gradients.\n");
  } else if(alg==gBFGS) {
    T = gsl_multimin_fdfminimizer_vector_bfgs;
    if(verbose) printf("Using the BFGS minimizer.\n");
  } else if(alg==gBFGS2) {
    T = gsl_multimin_fdfminimizer_vector_bfgs2;
    if(verbose) printf("Using the BFGS2 minimizer.\n");
  } else if(alg==gSD) {
    T = gsl_multimin_fdfminimizer_steepest_descent;
    if(verbose) printf("Using the steepest descent minimizer.\n");
  } else {
    ERROR_INFO();
    throw std::runtime_error("Unsupported minimizer\n");
  }

  // Run an initial calculation
  double oldE=calc_E(x,minimizer.params);

  // Turn off verbose setting
  pars.set.set_bool("Verbose",false);
  // and load from old checkpoint
  pars.set.set_string("LoadChk",pars.set.get_string("SaveChk"));

  // Initialize minimizer
  s = gsl_multimin_fdfminimizer_alloc (T, minimizer.n);

  // Use initial step length of 0.02 bohr, and a line search accuracy
  // 1e-1 (recommended in the GSL manual for BFGS)
  gsl_multimin_fdfminimizer_set (s, &minimizer, x, 0.02, 1e-1);

  // Store old force
  arma::mat oldf=interpret_force(s->gradient);

  fprintf(stderr,"Geometry optimizer initialized in %s.\n",tprog.elapsed().c_str());
  fprintf(stderr,"Entering minimization loop with %s optimizer.\n",set.get_string("Optimizer").c_str());

  fprintf(stderr,"%4s %16s %10s %10s %9s %9s %9s %9s %s\n","iter","E","dE","dE/dEproj","disp max","disp rms","f max","f rms", "titer");

  std::vector<atom_t> oldgeom(atoms);

  bool convd=false;
  int iter;

  for(iter=1;iter<=maxiter;iter++) {
    printf("\nGeometry iteration %i\n",(int) iter);
    fflush(stdout);

    Timer titer;

    status = gsl_multimin_fdfminimizer_iterate (s);

    if (status) {
      fprintf(stderr,"GSL encountered error: \"%s\".\n",gsl_strerror(status));
      break;
    }

    // New geometry is
    std::vector<atom_t> geom=get_atoms(s->x,pars);

    // Calculate displacements
    double dmax, drms;
    get_displacement(geom, oldgeom, dmax, drms);

    // Calculate projected change of energy
    double dEproj=calculate_projection(geom,oldgeom,oldf,pars.dofidx);
    // Actual change of energy is
    double dE=s->f - oldE;

    // Switch geometries
    oldgeom=geom;
    // Save old force

    // Get forces
    double fmax, frms;
    get_forces(s->gradient, fmax, frms);

    // Save geometry step
    char comment[80];
    sprintf(comment,"Step %i",(int) iter);
    save_xyz(get_atoms(s->x,pars),comment,optmovie,true);

    // Check convergence
    bool fmaxconv=false, frmsconv=false;
    bool dmaxconv=false, drmsconv=false;

    switch(crit) {

    case(LOOSE):
      if(fmax < 2.5e-3)
	fmaxconv=true;
      if(frms < 1.7e-3)
	frmsconv=true;
      if(dmax < 1.0e-2)
	dmaxconv=true;
      if(drms < 6.7e-3)
	drmsconv=true;
      break;

    case(NORMAL):
      if(fmax < 4.5e-4)
	fmaxconv=true;
      if(frms < 3.0e-4)
	frmsconv=true;
      if(dmax < 1.8e-3)
	dmaxconv=true;
      if(drms < 1.2e-3)
	drmsconv=true;
      break;

    case(TIGHT):
      if(fmax < 1.5e-5)
	fmaxconv=true;
      if(frms < 1.0e-5)
	frmsconv=true;
      if(dmax < 6.0e-5)
	dmaxconv=true;
      if(drms < 4.0e-5)
	drmsconv=true;
      break;

    case(VERYTIGHT):
      if(fmax < 2.0e-6)
	fmaxconv=true;
      if(frms < 1.0e-6)
	frmsconv=true;
      if(dmax < 6.0e-6)
	dmaxconv=true;
      if(drms < 4.0e-6)
	drmsconv=true;
      break;

    default:
      ERROR_INFO();
      throw std::runtime_error("Not implemented!\n");
    }

    // Converged?
    const static char cconv[]=" *";

    double dEfrac;
    if(dEproj!=0.0)
      dEfrac=dE/dEproj;
    else
      dEfrac=0.0;

    fprintf(stderr,"%4d % 16.8f % .3e % .3e %.3e%c %.3e%c %.3e%c %.3e%c %s\n", (int) iter, s->f, dE, dEfrac, dmax, cconv[dmaxconv], drms, cconv[drmsconv], fmax, cconv[fmaxconv], frms, cconv[frmsconv], titer.elapsed().c_str());
    fflush(stderr);

    convd=dmaxconv && drmsconv && fmaxconv && frmsconv;

    if(convd) {
      fprintf(stderr,"Converged.\n");
      break;
    }

    // Store old energy
    oldE=s->f;
    // Store old force
    oldf=interpret_force(s->gradient);
  }

  if(convd)
    save_xyz(get_atoms(s->x,pars),"Optimized geometry",result);

  gsl_multimin_fdfminimizer_free (s);

  gsl_vector_free (x);

  if(iter==maxiter && !convd) {
    printf("Geometry convergence was not achieved!\n");
  }


  printf("Running program took %s.\n",tprog.elapsed().c_str());

  return 0;
}