00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef MOLECULE_H
00017
00018 #define MOLECULE_H
00019
00020 #include "parm.h"
00021
00022 #include "common.h"
00023 #include "NamdTypes.h"
00024 #include "structures.h"
00025 #include "ConfigList.h"
00026 #include "Vector.h"
00027 #include "UniqueSet.h"
00028 #include "Hydrogen.h"
00029 #include "GromacsTopFile.h"
00030
00031 #include "GridForceGrid.h"
00032 #include "Tensor.h"
00033
00034
00035 #include <vector>
00036 using namespace std;
00037
00038 class SimParameters;
00039 class Parameters;
00040 class ConfigList;
00041 class PDB;
00042 class MIStream;
00043 class MOStream;
00044
00045 class BondElem;
00046 class AngleElem;
00047 class DihedralElem;
00048 class ImproperElem;
00049 class CrosstermElem;
00050 class ResidueLookupElem;
00051 template<class Type> class ObjectArena;
00052
00053 class ExclusionCheck {
00054 public:
00055 int32 min,max;
00056 char *flags;
00057
00058 ExclusionCheck(){
00059 min=0;
00060 max=-1;
00061 flags = NULL;
00062 }
00063 ExclusionCheck(const ExclusionCheck& chk){
00064 min = chk.min;
00065 max = chk.max;
00066 if(max>min){
00067 flags = new char[max-min+1];
00068 memcpy(flags, chk.flags, sizeof(char)*(max-min+1));
00069 }
00070 }
00071 ExclusionCheck &operator=(const ExclusionCheck& chk){
00072 min = chk.min;
00073 max = chk.max;
00074 if(flags) delete [] flags;
00075 flags = NULL;
00076 if(max>min){
00077 flags = new char[max-min+1];
00078 memcpy(flags, chk.flags, sizeof(char)*(max-min+1));
00079 }
00080 return *this;
00081 }
00082 ~ExclusionCheck(){
00083 if(flags) delete [] flags;
00084 }
00085 };
00086 #define EXCHCK_FULL 1
00087 #define EXCHCK_MOD 2
00088
00089
00090 class Molecule
00091 {
00092 typedef struct constraint_params
00093 {
00094 Real k;
00095 Vector refPos;
00096 } ConstraintParams;
00097
00098
00099
00100
00101 typedef struct gridfrc_params
00102 {
00103 Real k;
00104 Charge q;
00105 } GridforceParams;
00106
00107
00108
00109 typedef struct stir_params
00110 {
00111 Real startTheta;
00112 Vector refPos;
00113 } StirParams;
00114
00115 typedef struct movdrag_params
00116 {
00117 Vector v;
00118 } MovDragParams;
00119
00120
00121 typedef struct rotdrag_params
00122 {
00123 Real v;
00124 Vector a;
00125 Vector p;
00126 } RotDragParams;
00127
00128 typedef struct constorque_params
00129 {
00130 Real v;
00131 Vector a;
00132 Vector p;
00133 } ConsTorqueParams;
00134
00135 friend class BondElem;
00136 friend class AngleElem;
00137 friend class DihedralElem;
00138 friend class ImproperElem;
00139 friend class CrosstermElem;
00140
00141 private:
00142 void initialize(SimParameters *, Parameters *param);
00143
00144
00145 #ifdef MEM_OPT_VERSION
00146
00147 AtomCstInfo *atoms;
00148 Index *eachAtomMass;
00149 Index *eachAtomCharge;
00150 AtomNameIdx *atomNames;
00151 ObjectArena<char> *nameArena;
00152 #else
00153 Atom *atoms;
00154 ObjectArena<char> *nameArena;
00155 AtomNameInfo *atomNames;
00156 #endif
00157
00158 ResidueLookupElem *resLookup;
00159
00160 #ifndef MEM_OPT_VERSION
00161
00162 Bond *bonds;
00163 Angle *angles;
00164 Dihedral *dihedrals;
00165 Improper *impropers;
00166 Crossterm *crossterms;
00167 #endif
00168
00169 Bond *donors;
00170 Bond *acceptors;
00171
00172 #ifndef MEM_OPT_VERSION
00173
00174 Exclusion *exclusions;
00175 UniqueSet<Exclusion> exclusionSet;
00176 #endif
00177
00178 int32 *consIndexes;
00179 ConstraintParams *consParams;
00180
00181
00182 int32 *gridfrcIndexes;
00183 GridforceParams *gridfrcParams;
00184 GridforceGrid *gridfrcGrid;
00185
00186
00187
00188 int32 *stirIndexes;
00189 StirParams *stirParams;
00190
00191 int32 *movDragIndexes;
00192 MovDragParams *movDragParams;
00193
00194 int32 *rotDragIndexes;
00195 RotDragParams *rotDragParams;
00196
00197
00198 Real *langevinParams;
00199 int32 *fixedAtomFlags;
00200 int32 *exPressureAtomFlags;
00201
00202 #ifdef MEM_OPT_VERSION
00203
00204
00205
00206
00207 int32 *clusterSigs;
00208 #else
00209 int32 *cluster;
00210 int32 *clusterSize;
00211 #endif
00212
00213 Real *rigidBondLengths;
00214
00215
00216 unsigned char *fepAtomFlags;
00217
00218
00219 #ifndef MEM_OPT_VERSION
00220 ObjectArena<int32> *tmpArena;
00221 int32 **bondsWithAtom;
00222 ObjectArena<int32> *arena;
00223 #endif
00224
00225 #ifdef MEM_OPT_VERSION
00226 Index *eachAtomSig;
00227 Index *eachAtomExclSig;
00228 #else
00229
00230 int32 **bondsByAtom;
00231 int32 **anglesByAtom;
00232 int32 **dihedralsByAtom;
00233 int32 **impropersByAtom;
00234 int32 **crosstermsByAtom;
00235
00236 int32 **exclusionsByAtom;
00237 int32 **fullExclusionsByAtom;
00238 int32 **modExclusionsByAtom;
00239 ObjectArena<char> *exclArena;
00240 ExclusionCheck *all_exclusions;
00241 #endif
00242
00243
00244
00245
00246
00247 void build_lists_by_atom();
00248
00249
00250
00251 void read_atoms(FILE *, Parameters *);
00252
00253 void read_bonds(FILE *, Parameters *);
00254
00255 void read_angles(FILE *, Parameters *);
00256
00257 void read_dihedrals(FILE *, Parameters *);
00258
00259 void read_impropers(FILE *, Parameters *);
00260
00261 void read_crossterms(FILE *, Parameters *);
00262
00263 void read_donors(FILE *);
00264
00265 void read_acceptors(FILE *);
00266
00267 void read_exclusions(FILE *);
00268
00269
00270 void build12excl(void);
00271 void build13excl(void);
00272 void build14excl(int);
00273 void stripHGroupExcl(void);
00274 #ifdef MEM_OPT_VERSION
00275 void stripFepFixedExcl(void);
00276 #else
00277 void stripFepExcl(void);
00278 #endif
00279
00280 void build_exclusions();
00281
00282
00283
00284 void build_atom_status(void);
00285
00286
00287 SimParameters *simParams;
00288 Parameters *params;
00289
00290 void read_parm(const GromacsTopFile *);
00291
00292 public:
00293
00294 Real r_om;
00295 Real r_ohc;
00296
00297
00298
00299 #ifndef MEM_OPT_VERSION
00300 Atom *getAtoms () const { return atoms; }
00301 #endif
00302
00303
00304 int num_fixed_atoms() const {
00305
00306 int s_NumFixedAtoms = (simParams->fixedAtomsOn ? numFixedAtoms : 0);
00307 return s_NumFixedAtoms;
00308 }
00309
00310 int num_fixed_groups() const {
00311
00312 int s_NumFixedAtoms = num_fixed_atoms();
00313 int s_NumFixedGroups = (s_NumFixedAtoms ? numFixedGroups : 0);
00314 return s_NumFixedGroups;
00315 }
00316
00317 int num_group_deg_freedom() const {
00318
00319 int s_NumGroupDegFreedom = 3 * numHydrogenGroups;
00320 int s_NumFixedAtoms = num_fixed_atoms();
00321 int s_NumFixedGroups = num_fixed_groups();
00322 if (s_NumFixedGroups) s_NumGroupDegFreedom -= 3 * s_NumFixedGroups;
00323 if ( ! (s_NumFixedAtoms || numConstraints
00324 || simParams->comMove || simParams->langevinOn) ) {
00325 s_NumGroupDegFreedom -= 3;
00326 }
00327 return s_NumGroupDegFreedom;
00328 }
00329
00330 int num_deg_freedom(int isInitialReport = 0) const {
00331
00332 int s_NumDegFreedom = 3 * numAtoms;
00333 int s_NumFixedAtoms = num_fixed_atoms();
00334 if (s_NumFixedAtoms) s_NumDegFreedom -= 3 * s_NumFixedAtoms;
00335 if (numLonepairs) s_NumDegFreedom -= 3 * numLonepairs;
00336 if ( ! (s_NumFixedAtoms || numConstraints
00337 || simParams->comMove || simParams->langevinOn) ) {
00338 s_NumDegFreedom -= 3;
00339 }
00340 if ( ! isInitialReport && simParams->pairInteractionOn) {
00341
00342
00343
00344
00345 s_NumDegFreedom = 3 * numFepInitial;
00346 }
00347 int s_NumFixedRigidBonds =
00348 (simParams->fixedAtomsOn ? numFixedRigidBonds : 0);
00349
00350
00351 s_NumDegFreedom -= (numRigidBonds - s_NumFixedRigidBonds - numLonepairs);
00352 return s_NumDegFreedom;
00353 }
00354
00355 int numAtoms;
00356
00357 int numRealBonds;
00358 int numBonds;
00359 int numAngles;
00360 int numDihedrals;
00361 int numImpropers;
00362 int numCrossterms;
00363 int numDonors;
00364 int numAcceptors;
00365 int numExclusions;
00366 int numTotalExclusions;
00367 int numLonepairs;
00368 int numDrudeAtoms;
00369
00370 int numConstraints;
00371
00372 int numGridforces;
00373
00374 int numMovDrag;
00375 int numRotDrag;
00376 int numConsTorque;
00377 int numFixedAtoms;
00378 int numStirredAtoms;
00379 int numExPressureAtoms;
00380 int numHydrogenGroups;
00381 int numFixedGroups;
00382 int numRigidBonds;
00383 int numFixedRigidBonds;
00384
00385 int numFepInitial;
00386 int numFepFinal;
00387
00388
00389 int numConsForce;
00390 int32 *consForceIndexes;
00391 Vector *consForce;
00392
00393 int32 *consTorqueIndexes;
00394 ConsTorqueParams *consTorqueParams;
00395
00396
00397
00398
00399 int numCalcBonds;
00400 int numCalcAngles;
00401 int numCalcDihedrals;
00402 int numCalcImpropers;
00403 int numCalcCrossterms;
00404 int numCalcExclusions;
00405
00406
00407 int numMultipleDihedrals;
00408
00409 int numMultipleImpropers;
00410
00411 HydrogenGroup hydrogenGroup;
00412 int waterIndex;
00413
00414 Molecule(SimParameters *, Parameters *param);
00415 Molecule(SimParameters *, Parameters *param, char *filename, ConfigList *cfgList=NULL);
00416
00417 Molecule(SimParameters *, Parameters *, Ambertoppar *);
00418 void read_parm(Ambertoppar *);
00419
00420 Molecule(SimParameters *, Parameters *, const GromacsTopFile *);
00421
00422 ~Molecule();
00423
00424 void read_psf_file(char *, Parameters *);
00425
00426
00427
00428
00429 void send_Molecule(Communicate *);
00430
00431
00432 void receive_Molecule(MIStream *);
00433
00434
00435
00436 void build_constraint_params(StringList *, StringList *, StringList *,
00437 PDB *, char *);
00438
00439
00440
00441
00442 void build_gridforce_params(StringList *, StringList *, StringList *, StringList *, PDB *, char *);
00443
00444
00445
00446 void build_movdrag_params(StringList *, StringList *, StringList *,
00447 PDB *, char *);
00448
00449
00450 void build_rotdrag_params(StringList *, StringList *, StringList *,
00451 StringList *, StringList *, StringList *,
00452 PDB *, char *);
00453
00454
00455 void build_constorque_params(StringList *, StringList *, StringList *,
00456 StringList *, StringList *, StringList *,
00457 PDB *, char *);
00458
00459
00460
00461 void build_constant_forces(char *);
00462
00463
00464 void build_langevin_params(BigReal coupling, Bool doHydrogen);
00465 void build_langevin_params(StringList *, StringList *, PDB *, char *);
00466
00467
00468 void build_fixed_atoms(StringList *, StringList *, PDB *, char *);
00469
00470
00471 void build_stirred_atoms(StringList *, StringList *, PDB *, char *);
00472
00473
00474 void build_extra_bonds(Parameters *parameters, StringList *file);
00475
00476
00477 void build_fep_flags(StringList *, StringList *, PDB *, char *);
00478
00479
00480
00481 void build_exPressure_atoms(StringList *, StringList *, PDB *, char *);
00482
00483
00484
00485 void reloadCharges(float charge[], int n);
00486
00487 Bool is_lp(int);
00488 Bool is_drude(int);
00489 Bool is_hydrogen(int);
00490 Bool is_oxygen(int);
00491 Bool is_hydrogenGroupParent(int);
00492 Bool is_water(int);
00493 int get_groupSize(int);
00494 int get_mother_atom(int);
00495
00496 #ifdef MEM_OPT_VERSION
00497 int get_cluster_size(int idx) const { return clusterSigs[idx]; }
00498 #else
00499 int get_cluster(int anum) const { return cluster[anum]; }
00500 int get_clusterSize(int anum) const { return clusterSize[anum]; }
00501 #endif
00502
00503 #ifdef CHARMIZE_NAMD
00504 Atom *getAllAtoms() {
00505 return atoms;
00506 }
00507 #endif
00508
00509
00510 Real atommass(int anum) const
00511 {
00512 #ifdef MEM_OPT_VERSION
00513 return atomMassPool[eachAtomMass[anum]];
00514 #else
00515 return(atoms[anum].mass);
00516 #endif
00517 }
00518
00519
00520 Real atomcharge(int anum) const
00521 {
00522 #ifdef MEM_OPT_VERSION
00523 return atomChargePool[eachAtomCharge[anum]];
00524 #else
00525 return(atoms[anum].charge);
00526 #endif
00527 }
00528
00529
00530 Index atomvdwtype(int anum) const
00531 {
00532 return(atoms[anum].vdw_type);
00533 }
00534
00535 #ifndef MEM_OPT_VERSION
00536
00537 Bond *get_bond(int bnum) const {return (&(bonds[bnum]));}
00538
00539
00540 Angle *get_angle(int anum) const {return (&(angles[anum]));}
00541
00542
00543 Improper *get_improper(int inum) const {return (&(impropers[inum]));}
00544
00545
00546 Dihedral *get_dihedral(int dnum) const {return (&(dihedrals[dnum]));}
00547
00548
00549 Crossterm *get_crossterm(int inum) const {return (&(crossterms[inum]));}
00550 #endif
00551
00552
00553 Bond *get_donor(int dnum) const {return (&(donors[dnum]));}
00554
00555
00556 Bond *get_acceptor(int dnum) const {return (&(acceptors[dnum]));}
00557
00558
00559 #ifndef MEM_OPT_VERSION
00560 Exclusion *get_exclusion(int ex) const {return (&(exclusions[ex]));}
00561 #endif
00562
00563
00564 const char *get_atomtype(int anum) const
00565 {
00566 if (atomNames == NULL)
00567 {
00568 NAMD_die("Tried to find atom type on node other than node 0");
00569 }
00570
00571 #ifdef MEM_OPT_VERSION
00572 return atomTypePool[atomNames[anum].atomtypeIdx];
00573 #else
00574 return(atomNames[anum].atomtype);
00575 #endif
00576 }
00577
00578
00579 int get_atom_from_name(const char *segid, int resid, const char *aname) const;
00580
00581
00582 int get_residue_size(const char *segid, int resid) const;
00583
00584
00585 int get_atom_from_index_in_residue(const char *segid, int resid, int index) const;
00586
00587
00588
00589
00590
00591
00592 #ifndef MEM_OPT_VERSION
00593 int32 *get_bonds_for_atom(int anum)
00594 { return bondsByAtom[anum]; }
00595 int32 *get_angles_for_atom(int anum)
00596 { return anglesByAtom[anum]; }
00597 int32 *get_dihedrals_for_atom(int anum)
00598 { return dihedralsByAtom[anum]; }
00599 int32 *get_impropers_for_atom(int anum)
00600 { return impropersByAtom[anum]; }
00601 int32 *get_crossterms_for_atom(int anum)
00602 { return crosstermsByAtom[anum]; }
00603 int32 *get_exclusions_for_atom(int anum)
00604 { return exclusionsByAtom[anum]; }
00605 const int32 *get_full_exclusions_for_atom(int anum) const
00606 { return fullExclusionsByAtom[anum]; }
00607 const int32 *get_mod_exclusions_for_atom(int anum) const
00608 { return modExclusionsByAtom[anum]; }
00609 #endif
00610
00611
00612
00613 #ifdef MEM_OPT_VERSION
00614 int checkExclByIdx(int idx1, int atom1, int atom2) const;
00615 const ExclusionCheck *get_excl_check_for_idx(int idx) const{
00616 return &exclChkSigPool[idx];
00617 }
00618 #else
00619 int checkexcl(int atom1, int atom2) const;
00620
00621 const ExclusionCheck *get_excl_check_for_atom(int anum) const{
00622 return &all_exclusions[anum];
00623 }
00624 #endif
00625
00626
00627
00628
00629 Bool is_atom_gridforced(int atomnum) const
00630 {
00631 if (numGridforces)
00632 {
00633 return(gridfrcIndexes[atomnum] != -1);
00634 }
00635 else
00636 {
00637 return(FALSE);
00638 }
00639 }
00640
00641
00642
00643
00644 Bool is_atom_constrained(int atomnum) const
00645 {
00646 if (numConstraints)
00647 {
00648
00649 return(consIndexes[atomnum] != -1);
00650 }
00651 else
00652 {
00653
00654 return(FALSE);
00655 }
00656 }
00657
00658
00659
00660 Bool is_atom_movdragged(int atomnum) const
00661 {
00662 if (numMovDrag)
00663 {
00664
00665 return(movDragIndexes[atomnum] != -1);
00666 }
00667 else
00668 {
00669
00670 return(FALSE);
00671 }
00672 }
00673
00674
00675
00676 Bool is_atom_rotdragged(int atomnum) const
00677 {
00678 if (numRotDrag)
00679 {
00680
00681 return(rotDragIndexes[atomnum] != -1);
00682 }
00683 else
00684 {
00685
00686 return(FALSE);
00687 }
00688 }
00689
00690
00691
00692 Bool is_atom_constorqued(int atomnum) const
00693 {
00694 if (numConsTorque)
00695 {
00696
00697 return(consTorqueIndexes[atomnum] != -1);
00698 }
00699 else
00700 {
00701
00702 return(FALSE);
00703 }
00704 }
00705
00706
00707 void get_cons_params(Real &k, Vector &refPos, int atomnum) const
00708 {
00709 k = consParams[consIndexes[atomnum]].k;
00710 refPos = consParams[consIndexes[atomnum]].refPos;
00711 }
00712
00713
00714 void get_gridfrc_params(Real &k, Charge &q, int atomnum) const
00715 {
00716 k = gridfrcParams[gridfrcIndexes[atomnum]].k;
00717 q = gridfrcParams[gridfrcIndexes[atomnum]].q;
00718 }
00719
00720 const GridforceGrid* get_gridfrc_grid(void) const
00721 {
00722 return gridfrcGrid;
00723 }
00724
00725
00726 Real langevin_param(int atomnum) const
00727 {
00728 return(langevinParams[atomnum]);
00729 }
00730
00731
00732 void get_stir_refPos(Vector &refPos, int atomnum) const
00733 {
00734 refPos = stirParams[stirIndexes[atomnum]].refPos;
00735 }
00736
00737
00738 void put_stir_startTheta(Real theta, int atomnum) const
00739 {
00740 stirParams[stirIndexes[atomnum]].startTheta = theta;
00741 }
00742
00743
00744 Real get_stir_startTheta(int atomnum) const
00745 {
00746 return stirParams[stirIndexes[atomnum]].startTheta;
00747 }
00748
00749
00750
00751 void get_movdrag_params(Vector &v, int atomnum) const
00752 {
00753 v = movDragParams[movDragIndexes[atomnum]].v;
00754 }
00755
00756
00757 void get_rotdrag_params(BigReal &v, Vector &a, Vector &p,
00758 int atomnum) const
00759 {
00760 v = rotDragParams[rotDragIndexes[atomnum]].v;
00761 a = rotDragParams[rotDragIndexes[atomnum]].a;
00762 p = rotDragParams[rotDragIndexes[atomnum]].p;
00763 }
00764
00765
00766 void get_constorque_params(BigReal &v, Vector &a, Vector &p,
00767 int atomnum) const
00768 {
00769 v = consTorqueParams[consTorqueIndexes[atomnum]].v;
00770 a = consTorqueParams[consTorqueIndexes[atomnum]].a;
00771 p = consTorqueParams[consTorqueIndexes[atomnum]].p;
00772 }
00773
00774
00775 unsigned char get_fep_type(int anum) const
00776 {
00777 return(fepAtomFlags[anum]);
00778 }
00779
00780
00781 Bool is_atom_fixed(int atomnum) const
00782 {
00783 return (numFixedAtoms && fixedAtomFlags[atomnum]);
00784 }
00785
00786
00787 Bool is_atom_stirred(int atomnum) const
00788 {
00789 if (numStirredAtoms)
00790 {
00791
00792 return(stirIndexes[atomnum] != -1);
00793 }
00794 else
00795 {
00796
00797 return(FALSE);
00798 }
00799 }
00800
00801
00802 Bool is_group_fixed(int atomnum) const
00803 {
00804 return (numFixedAtoms && (fixedAtomFlags[atomnum] == -1));
00805 }
00806 Bool is_atom_exPressure(int atomnum) const
00807 {
00808 return (numExPressureAtoms && exPressureAtomFlags[atomnum]);
00809 }
00810
00811
00812 Real rigid_bond_length(int atomnum) const
00813 {
00814 return(rigidBondLengths[atomnum]);
00815 }
00816
00817 void print_atoms(Parameters *);
00818
00819 void print_bonds(Parameters *);
00820
00821 void print_exclusions();
00822
00823 private:
00824
00825
00826 void read_compressed_psf_file(char *, Parameters *);
00827
00828 #ifdef MEM_OPT_VERSION
00829 public:
00830 int atomSigPoolSize;
00831 AtomSignature *atomSigPool;
00832
00833
00834
00835 int segNamePoolSize;
00836 char **segNamePool;
00837
00838 int resNamePoolSize;
00839 char **resNamePool;
00840
00841 int atomNamePoolSize;
00842 char **atomNamePool;
00843
00844 int atomTypePoolSize;
00845 char **atomTypePool;
00846
00847 int chargePoolSize;
00848 Real *atomChargePool;
00849
00850 int massPoolSize;
00851 Real *atomMassPool;
00852
00853 AtomSigID getAtomSigId(int aid) {
00854 return eachAtomSig[aid];
00855 }
00856 ExclSigID getAtomExclSigId(int aid) const {
00857 return eachAtomExclSig[aid];
00858 }
00859
00860
00861 int exclSigPoolSize;
00862
00863 ExclusionSignature *exclSigPool;
00864
00865 ExclusionCheck *exclChkSigPool;
00866
00867 void addNewExclSigPool(const vector<ExclusionSignature>&);
00868
00869 void build_excl_check_signatures();
00870
00871 void delEachAtomSigs(){
00872
00873
00874
00875
00876
00877 if(CmiMyRank()) return;
00878
00879 delete [] eachAtomSig;
00880 delete [] eachAtomExclSig;
00881 eachAtomSig = NULL;
00882 eachAtomExclSig = NULL;
00883 }
00884
00885 void delChargeSpace(){
00886 if(CmiMyRank()) return;
00887
00888 delete [] atomChargePool;
00889 delete [] eachAtomCharge;
00890 atomChargePool = NULL;
00891 eachAtomCharge = NULL;
00892 }
00893
00894 void delMassSpace(){
00895 if(CmiMyRank()) return;
00896
00897 delete [] atomMassPool;
00898 delete [] eachAtomMass;
00899 atomMassPool = NULL;
00900 eachAtomMass = NULL;
00901 }
00902
00903 void delClusterSigs() {
00904 if(CmiMyRank()) return;
00905
00906 delete [] clusterSigs;
00907 clusterSigs = NULL;
00908 }
00909
00910 void delOtherEachAtomStructs();
00911
00912
00913 private:
00914 Index insert_new_mass(Real newMass);
00915
00916
00917
00918
00919
00920
00921
00922
00923 int exclStrippedByFepOrFixedAtoms(int atom1, int atom2);
00924 #endif
00925
00926 };
00927
00928 #endif
00929