Changeset 774ae8 for pcp


Ignore:
Timestamp:
Apr 21, 2008, 2:19:24 PM (17 years ago)
Author:
Frederik Heber <heber@…>
Children:
36f85c
Parents:
b74e5e
git-author:
Frederik Heber <heber@…> (04/18/08 15:21:30)
git-committer:
Frederik Heber <heber@…> (04/21/08 14:19:24)
Message:

WriteParameters() added
OutputIonCoordinates() uses WriteParameters() and additional parameter whether its MD or StructOpt

Location:
pcp/src
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • pcp/src/init.c

    rb74e5e r774ae8  
    17821782}
    17831783
     1784/** Writes parameters as a parsable config file to \a filename.
     1785 * \param *P Problem at hand
     1786 * \param filename name of config file to be written
     1787 */
     1788void WriteParameters(struct Problem *const  P, const char *const filename) {
     1789  struct Lattice *Lat = &P->Lat;
     1790  struct RunStruct *R = &P->R;
     1791  struct FileData *F = &P->Files;
     1792  struct Ions *I = &P->Ion;
     1793  FILE *output;
     1794  double BorAng = (I->IsAngstroem) ? 1./ANGSTROEMINBOHRRADIUS : 1.;
     1795  int i, it, nr = 0;
     1796  if ((P->Par.me == 0) && (output = fopen(filename,"w"))) {
     1797    //fprintf(stderr, "(%i) Writing config file %s\n",P->Par.me, filename);
     1798   
     1799    fprintf(output,"# ParallelCarParinello - main configuration file - optimized geometry\n");
     1800    fprintf(output,"\n");
     1801    fprintf(output,"mainname\t%s\t# programm name (for runtime files)\n", F->mainname);
     1802    fprintf(output,"defaultpath\t%s\t# where to put files during runtime\n", F->default_path);
     1803    fprintf(output,"pseudopotpath\t%s\t# where to find pseudopotentials\n", F->pseudopot_path);
     1804    fprintf(output,"\n");
     1805    fprintf(output,"ProcPEGamma\t%i\t# for parallel computing: share constants\n", P->Par.proc[PEGamma]);
     1806    fprintf(output,"ProcPEPsi\t%i\t# for parallel computing: share wave functions\n", P->Par.proc[PEPsi]);
     1807    fprintf(output,"DoOutVis\t%i\t# Output data for OpenDX\n", F->DoOutVis);
     1808    fprintf(output,"DoOutMes\t%i\t# Output data for measurements\n", F->DoOutMes);
     1809    fprintf(output,"DoOutCurr\t%i\t# Ouput current density for OpenDx\n", F->DoOutCurr);
     1810    fprintf(output,"DoPerturbation\t%i\t# Do perturbation calculate and determine susceptibility and shielding\n", R->DoPerturbation);
     1811    fprintf(output,"DoFullCurrent\t%i\t# Do full perturbation\n", R->DoFullCurrent);
     1812    fprintf(output,"DoOutOrbitals\t%i\t# Output all orbitals on end\n", F->DoOutOrbitals);
     1813    fprintf(output,"CommonWannier\t%i\t# Put virtual centers at indivual orbits, all common, merged by variance, to grid point, to cell center\n", R->CommonWannier);
     1814    fprintf(output,"SawtoothStart\t%lg\t# Absolute value for smooth transition at cell border \n", Lat->SawtoothStart);
     1815    fprintf(output,"VectorPlane\t%i\t# Cut plane axis (x, y or z: 0,1,2) for two-dim current vector plot\n", R->VectorPlane);
     1816    fprintf(output,"VectorCut\t%lg\t# Cut plane axis value\n", R->VectorCut);
     1817    fprintf(output,"AddGramSch\t%i\t# Additional GramSchmidtOrtogonalization to be safe (1 - per MinStep, 2 - per PsiStep)\n", R->UseAddGramSch);
     1818    fprintf(output,"Seed\t\t%i\t# initial value for random seed for Psi coefficients\n", R->Seed);
     1819    fprintf(output,"DoBrent\t%i\t# Brent line search instead of CG with second taylor approximation\n", R->DoBrent);
     1820    fprintf(output,"\n");
     1821    fprintf(output,"MaxOuterStep\t%i\t# number of MolecularDynamics/Structure optimization steps\n", R->MaxOuterStep);
     1822    fprintf(output,"Deltat\t%lg\t# time in atomic time per MD step\n", R->delta_t);
     1823    fprintf(output,"OutVisStep\t%i\t#  Output visual data every ...th step\n", R->OutVisStep);
     1824    fprintf(output,"OutSrcStep\t%i\t# Output \"restart\" data every ..th step\n", R->OutSrcStep);
     1825    fprintf(output,"TargetTemp\t%lg\t# Target temperature in Hartree\n", R->TargetTemp);
     1826    fprintf(output,"Thermostat\t%s", I->ThermostatNames[I->Thermostat]);
     1827    switch(I->Thermostat) {
     1828      default:
     1829      case 0: // None
     1830        break;
     1831      case 1: // Woodcock
     1832        fprintf(output,"\t%i", R->ScaleTempStep);
     1833        break;
     1834      case 2: // Gaussian
     1835        fprintf(output,"\t%i", R->ScaleTempStep);
     1836        break;
     1837      case 3: // Langevin
     1838        fprintf(output,"\t%lg\t%lg", R->TempFrequency, R->alpha);
     1839        break;
     1840      case 4: // Berendsen
     1841        fprintf(output,"\t%lg", R->TempFrequency);
     1842        break;
     1843      case 5: // NoseHoover
     1844        fprintf(output,"\t%lg", R->HooverMass);
     1845        break;
     1846    }
     1847    fprintf(output,"\t# Thermostat to be used with parameters\n");
     1848    fprintf(output,"MaxPsiStep\t%i\t# number of Minimisation steps per state (0 - default)\n", R->MaxPsiStep);
     1849    fprintf(output,"EpsWannier\t%lg\t# tolerance value for spread minimisation of orbitals\n", R->EpsWannier);
     1850    fprintf(output,"\n");
     1851    fprintf(output,"# Values specifying when to stop\n");
     1852    fprintf(output,"MaxMinStep\t%i\t# Maximum number of steps\n", R->MaxMinStep);
     1853    fprintf(output,"RelEpsTotalE\t%lg\t# relative change in total energy\n", R->RelEpsTotalEnergy);
     1854    fprintf(output,"RelEpsKineticE\t%lg\t# relative change in kinetic energy\n", R->RelEpsKineticEnergy);
     1855    fprintf(output,"MaxMinStopStep\t%i\t# check every ..th steps\n", R->MaxMinStopStep);
     1856    fprintf(output,"MaxMinGapStopStep\t%i\t# check every ..th steps\n", R->MaxMinGapStopStep);
     1857    fprintf(output,"\n");
     1858    fprintf(output,"# Values specifying when to stop for INIT, otherwise same as above\n");
     1859    fprintf(output,"MaxInitMinStep\t%i\t# Maximum number of steps\n", R->MaxInitMinStep);
     1860    fprintf(output,"InitRelEpsTotalE\t%lg\t# relative change in total energy\n", R->InitRelEpsTotalEnergy);
     1861    fprintf(output,"InitRelEpsKineticE\t%lg\t# relative change in kinetic energy\n", R->InitRelEpsKineticEnergy);
     1862    fprintf(output,"InitMaxMinStopStep\t%i\t# check every ..th steps\n", R->InitMaxMinStopStep);
     1863    fprintf(output,"InitMaxMinGapStopStep\t%i\t# check every ..th steps\n", R->InitMaxMinGapStopStep);
     1864    fprintf(output,"\n");
     1865    fprintf(output,"BoxLength\t\t\t# (Length of a unit cell)\n");
     1866    fprintf(output,"%lg\t\n", Lat->RealBasis[0]*BorAng);
     1867    fprintf(output,"%lg\t%lg\t\n", Lat->RealBasis[3]*BorAng, Lat->RealBasis[4]*BorAng);
     1868    fprintf(output,"%lg\t%lg\t%lg\t\n", Lat->RealBasis[6]*BorAng, Lat->RealBasis[7]*BorAng, Lat->RealBasis[8]*BorAng);
     1869    // FIXME
     1870    fprintf(output,"\n");
     1871    fprintf(output,"ECut\t\t%lg\t# energy cutoff for discretization in Hartrees\n", Lat->ECut/(Lat->LevelSizes[0]*Lat->LevelSizes[0]));
     1872    fprintf(output,"MaxLevel\t%i\t# number of different levels in the code, >=2\n", P->Lat.MaxLevel);
     1873    fprintf(output,"Level0Factor\t%i\t# factor by which node number increases from S to 0 level\n", P->Lat.Lev0Factor);
     1874    fprintf(output,"RiemannTensor\t%i\t# (Use metric)\n", P->Lat.RT.Use);
     1875    switch (P->Lat.RT.Use) {
     1876      case 0: //UseNoRT
     1877        break;
     1878      case 1: // UseRT
     1879        fprintf(output,"RiemannLevel\t%i\t# Number of Riemann Levels\n", P->Lat.RT.RiemannLevel);
     1880        fprintf(output,"LevRFactor\t%i\t# factor by which node number increases from 0 to R level from\n", P->Lat.LevRFactor);
     1881        break;
     1882    }
     1883    fprintf(output,"PsiType\t\t%i\t# 0 - doubly occupied, 1 - SpinUp,SpinDown\n", P->Lat.Psi.Use);
     1884    // write out both types for easier changing afterwards
     1885  //  switch (PsiType) {
     1886  //    case 0:
     1887        fprintf(output,"MaxPsiDouble\t%i\t# here: specifying both maximum number of SpinUp- and -Down-states\n", P->Lat.Psi.GlobalNo[PsiMaxNoDouble]);
     1888  //      break;
     1889  //    case 1:
     1890        fprintf(output,"PsiMaxNoUp\t%i\t# here: specifying maximum number of SpinUp-states\n", P->Lat.Psi.GlobalNo[PsiMaxNoUp]);
     1891        fprintf(output,"PsiMaxNoDown\t%i\t# here: specifying maximum number of SpinDown-states\n", P->Lat.Psi.GlobalNo[PsiMaxNoDown]);
     1892  //      break;
     1893  //  }
     1894    fprintf(output,"AddPsis\t\t%i\t# Additional unoccupied Psis for bandgap determination\n", P->Lat.Psi.GlobalNo[PsiMaxAdd]);
     1895    fprintf(output,"\n");
     1896    fprintf(output,"RCut\t\t%lg\t# R-cut for the ewald summation\n", I->R_cut);
     1897    fprintf(output,"StructOpt\t%i\t# Do structure optimization beforehand\n", I->StructOpt);
     1898    fprintf(output,"IsAngstroem\t%i\t# 0 - Bohr, 1 - Angstroem\n", I->IsAngstroem);
     1899    fprintf(output,"RelativeCoord\t0\t# whether ion coordinates are relative (1) or absolute (0)\n");
     1900    fprintf(output,"MaxTypes\t%i\t# maximum number of different ion types\n", I->Max_Types);
     1901    fprintf(output,"\n");
     1902    // now elements ...
     1903    fprintf(output,"# Ion type data (PP = PseudoPotential, Z = atomic number)\n");
     1904    fprintf(output,"#Ion_TypeNr.\tAmount\tZ\tRGauss\tL_Max(PP)L_Loc(PP)IonMass\tName\tSymbol\n");
     1905    for (i=0; i < I->Max_Types; i++)
     1906      fprintf(output,"Ion_Type%i\t%i\t%i\t%lg\t%i\t%i\t%lg\t%s\t%s\n", i+1, I->I[i].Max_IonsOfType, I->I[i].Z, I->I[i].rgauss, I->I[i].l_max, I->I[i].l_loc, I->I[i].IonMass/Units2Electronmass, &I->I[i].Name[0], &I->I[i].Symbol[0]);
     1907    // ... and each ion coordination
     1908    fprintf(output,"#Ion_TypeNr._Nr.R[0]\tR[1]\tR[2]\tMoveType (0 MoveIon, 1 FixedIon) U[0]\tU[1]\tU[2] (velocities in %s)\n", (I->IsAngstroem) ? "Angstroem" : "atomic units");
     1909    for (i=0; i < I->Max_Types; i++)
     1910      for (it=0;it<I->I[i].Max_IonsOfType;it++) {
     1911        fprintf(output,"Ion_Type%i_%i\t%2.9f\t%2.9f\t%2.9f\t%i\t%2.9f\t%2.9f\t%2.9f\t# Number in molecule %i\n", i+1, it+1, I->I[i].R[0+NDIM*it]*BorAng, I->I[i].R[1+NDIM*it]*BorAng, I->I[i].R[2+NDIM*it]*BorAng, I->I[i].IMT[it], I->I[i].U[0+NDIM*it]*BorAng, I->I[i].U[1+NDIM*it]*BorAng, I->I[i].U[2+NDIM*it]*BorAng, ++nr);
     1912      }
     1913    fflush(output);
     1914    fclose(output);
     1915  }
     1916}
     1917
    17841918/** Main Initialization.
    17851919 * Massive calling of initializing super-functions init...():
  • pcp/src/init.h

    rb74e5e r774ae8  
    3131int ParseForParameter(int verbose, FILE *file, const char *const name, int sequential, int const xth, int const yth, enum value_type type, void *value, int repetition, enum necessity critical);
    3232void ReadParameters(struct Problem *const  P, const char *const filename);
     33void WriteParameters(struct Problem *const  P, const char *const filename);
    3334
    3435void Init(struct Problem *const P);
  • pcp/src/ions.c

    rb74e5e r774ae8  
    959959/** Print coordinates of all ions to stdout.
    960960 * \param *P Problem at hand
    961  */
    962 void OutputIonCoordinates(struct Problem *P)
    963 {
    964   struct Ions *I = &P->Ion;
    965   int is, ia;
    966   if (P->Par.me == 0) {
    967     fprintf(stderr, "(%i) ======= Updated Ion Coordinates =========\n",P->Par.me);
     961 * \param actual (1 - don't at current RunStruct#OuterStep, 0 - do)
     962 */
     963void OutputIonCoordinates(struct Problem *P, int actual)
     964{
     965  //struct RunStruct *R = &P->R;
     966  struct Ions *I = &P->Ion;
     967  char filename[255];
     968  FILE *output;
     969  int is, ia, nr = 0;
     970  double Bohr = (I->IsAngstroem) ? 1./ANGSTROEMINBOHRRADIUS : 1.;
     971/*  if (P->Par.me == 0 && P->Call.out[ReadOut]) {
     972    fprintf(stderr, "(%i) ======= Differential Ion Coordinates =========\n",P->Par.me);
    968973    for (is=0; is < I->Max_Types; is++)
    969974      for (ia=0; ia < I->I[is].Max_IonsOfType; ia++)
    970975        //fprintf(stderr, "(%i) R[%i/%i][%i/%i] = (%e,%e,%e)\n", P->Par.me, is, I->Max_Types, ia, I->I[is].Max_IonsOfType, I->I[is].R[NDIM*ia+0],I->I[is].R[NDIM*ia+1],I->I[is].R[NDIM*ia+2]); 
    971         fprintf(stderr, "Ion_Type%i_%i\t%.6f\t%.6f\t%.6f\t0\t# Atom from StructOpt\n", is+1, ia+1, I->I[is].R[NDIM*ia+0],I->I[is].R[NDIM*ia+1],I->I[is].R[NDIM*ia+2]);
     976        fprintf(stderr, "Ion_Type%i_%i\t%.6f\t%.6f\t%.6f\t0\t# Atom from StructOpt\n", is+1, ia+1, I->I[is].R[NDIM*ia+0]-I->I[is].R_old[NDIM*ia+0],I->I[is].R[NDIM*ia+1]-I->I[is].R_old[NDIM*ia+1],I->I[is].R[NDIM*ia+2]-I->I[is].R_old[NDIM*ia+2]);
    972977    fprintf(stderr, "(%i) =========================================\n",P->Par.me);
     978  }*/
     979  if (actual)
     980    sprintf(filename, "%s.MD", P->Call.MainParameterFile);
     981  else
     982    sprintf(filename, "%s.opt", P->Call.MainParameterFile);
     983  if (((actual) && (P->R.OuterStep <= 0)) || ((!actual) && (P->R.StructOptStep == 1))) { // on first step write complete config file
     984    WriteParameters(P, filename);
     985  } else { // afterwards simply add the current ion coordinates as constrained steps
     986    if ((P->Par.me == 0) && (output = fopen(filename,"a"))) {
     987      fprintf(output,"# ====== MD step %d ========= \n", (actual) ? P->R.OuterStep : P->R.StructOptStep);
     988      for (is=0; is < I->Max_Types; is++)
     989        for (ia=0;ia<I->I[is].Max_IonsOfType;ia++) {
     990          fprintf(output,"Ion_Type%i_%i\t%2.9f\t%2.9f\t%2.9f\t%i\t%2.9f\t%2.9f\t%2.9f\t# Number in molecule %i\n", is+1, ia+1, I->I[is].R[0+NDIM*ia]*Bohr, I->I[is].R[1+NDIM*ia]*Bohr, I->I[is].R[2+NDIM*ia]*Bohr, I->I[is].IMT[ia], I->I[is].U[0+NDIM*ia]*Bohr, I->I[is].U[1+NDIM*ia]*Bohr, I->I[is].U[2+NDIM*ia]*Bohr, ++nr);
     991        }
     992      fflush(output);
     993    }
    973994  }
    974995}
  • pcp/src/ions.h

    rb74e5e r774ae8  
    128128void OutputIonForce(struct Problem *P);
    129129void ParseIonForce(struct Problem *P);
    130 void OutputIonCoordinates(struct Problem *P);
     130void OutputIonCoordinates(struct Problem *P, int actual);
    131131void UpdateIons(struct Problem *P);
    132132void UpdateIonsR(struct Problem *P);
  • pcp/src/run.c

    rb74e5e r774ae8  
    14291429    //gsl_vector_fprintf(stderr, s->dx, "%lg");
    14301430    OutputVis(P, P->R.Lev0->Dens->DensityArray[TotalDensity]);
    1431     //OutputIonCoordinates(P, 0);
     1431    OutputIonCoordinates(P, 0);
    14321432    P->R.StructOptStep++;
    14331433  } while ((status == GSL_CONTINUE) && (P->R.StructOptStep < P->R.MaxStructOptStep));
     
    14991499    if ((P->Call.out[MinOut]) && (P->Par.me == 0)) fprintf (stderr, "(%i) %5d %10.5f %10.5f\n", P->Par.me, (int)iter, s->fval, size);
    15001500    OutputVis(P, P->R.Lev0->Dens->DensityArray[TotalDensity]);
    1501     //OutputIonCoordinates(P, 0);
     1501    OutputIonCoordinates(P, 0);
    15021502    P->R.StructOptStep++;
    15031503  } while ((status == GSL_CONTINUE) && (Run->OuterStep < Run->MaxOuterStep));
     
    17421742  SpeedMeasure(P, InitSimTime, StopTimeDo);
    17431743
    1744   //OutputIonCoordinates(P, 1);
     1744  OutputIonCoordinates(P, 1);
    17451745  OutputVis(P, P->R.Lev0->Dens->DensityArray[TotalDensity]);
    17461746  OutputIonForce(P);
     
    17551755    while ((R->MeanForce[0] > 1e-4) && (R->StructOptStep < R->MaxStructOptStep)) {
    17561756      R->StructOptStep++;
    1757       //OutputIonCoordinates(P, 1);
     1757      OutputIonCoordinates(P, 1);
    17581758      UpdateIons(P);
    17591759      UpdateWaveAfterIonMove(P);
     
    17731773      if (P->Par.me == 0) fprintf(stderr,"(%i) Mean force is %lg\n", P->Par.me, R->MeanForce[0]);
    17741774    }
    1775     //OutputIonCoordinates(P, 1);
     1775    OutputIonCoordinates(P, 1);
    17761776  }
    17771777  if (I->StructOpt && !OuterStop) {
     
    17991799
    18001800    UpdateIonsR(P);
    1801     //OutputIonCoordinates(P, 1);
     1801    OutputIonCoordinates(P, 1);
    18021802
    18031803    UpdateWaveAfterIonMove(P);
Note: See TracChangeset for help on using the changeset viewer.