- Timestamp:
- Apr 21, 2008, 2:19:24 PM (17 years ago)
- 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)
- Location:
- pcp/src
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
pcp/src/init.c
rb74e5e r774ae8 1782 1782 } 1783 1783 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 */ 1788 void 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 1784 1918 /** Main Initialization. 1785 1919 * Massive calling of initializing super-functions init...(): -
pcp/src/init.h
rb74e5e r774ae8 31 31 int 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); 32 32 void ReadParameters(struct Problem *const P, const char *const filename); 33 void WriteParameters(struct Problem *const P, const char *const filename); 33 34 34 35 void Init(struct Problem *const P); -
pcp/src/ions.c
rb74e5e r774ae8 959 959 /** Print coordinates of all ions to stdout. 960 960 * \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 */ 963 void 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); 968 973 for (is=0; is < I->Max_Types; is++) 969 974 for (ia=0; ia < I->I[is].Max_IonsOfType; ia++) 970 975 //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]); 972 977 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 } 973 994 } 974 995 } -
pcp/src/ions.h
rb74e5e r774ae8 128 128 void OutputIonForce(struct Problem *P); 129 129 void ParseIonForce(struct Problem *P); 130 void OutputIonCoordinates(struct Problem *P );130 void OutputIonCoordinates(struct Problem *P, int actual); 131 131 void UpdateIons(struct Problem *P); 132 132 void UpdateIonsR(struct Problem *P); -
pcp/src/run.c
rb74e5e r774ae8 1429 1429 //gsl_vector_fprintf(stderr, s->dx, "%lg"); 1430 1430 OutputVis(P, P->R.Lev0->Dens->DensityArray[TotalDensity]); 1431 //OutputIonCoordinates(P, 0);1431 OutputIonCoordinates(P, 0); 1432 1432 P->R.StructOptStep++; 1433 1433 } while ((status == GSL_CONTINUE) && (P->R.StructOptStep < P->R.MaxStructOptStep)); … … 1499 1499 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); 1500 1500 OutputVis(P, P->R.Lev0->Dens->DensityArray[TotalDensity]); 1501 //OutputIonCoordinates(P, 0);1501 OutputIonCoordinates(P, 0); 1502 1502 P->R.StructOptStep++; 1503 1503 } while ((status == GSL_CONTINUE) && (Run->OuterStep < Run->MaxOuterStep)); … … 1742 1742 SpeedMeasure(P, InitSimTime, StopTimeDo); 1743 1743 1744 //OutputIonCoordinates(P, 1);1744 OutputIonCoordinates(P, 1); 1745 1745 OutputVis(P, P->R.Lev0->Dens->DensityArray[TotalDensity]); 1746 1746 OutputIonForce(P); … … 1755 1755 while ((R->MeanForce[0] > 1e-4) && (R->StructOptStep < R->MaxStructOptStep)) { 1756 1756 R->StructOptStep++; 1757 //OutputIonCoordinates(P, 1);1757 OutputIonCoordinates(P, 1); 1758 1758 UpdateIons(P); 1759 1759 UpdateWaveAfterIonMove(P); … … 1773 1773 if (P->Par.me == 0) fprintf(stderr,"(%i) Mean force is %lg\n", P->Par.me, R->MeanForce[0]); 1774 1774 } 1775 //OutputIonCoordinates(P, 1);1775 OutputIonCoordinates(P, 1); 1776 1776 } 1777 1777 if (I->StructOpt && !OuterStop) { … … 1799 1799 1800 1800 UpdateIonsR(P); 1801 //OutputIonCoordinates(P, 1);1801 OutputIonCoordinates(P, 1); 1802 1802 1803 1803 UpdateWaveAfterIonMove(P);
Note:
See TracChangeset
for help on using the changeset viewer.