Ignore:
Timestamp:
Apr 27, 2010, 2:25:42 PM (16 years ago)
Author:
Frederik Heber <heber@…>
Children:
90c4460
Parents:
1561e2 (diff), 2bc713 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'Analysis_PairCorrelation' into StructureRefactoring

Conflicts:

molecuilder/src/Makefile.am
molecuilder/src/World.cpp
molecuilder/src/World.hpp
molecuilder/src/boundary.cpp
molecuilder/src/builder.cpp
molecuilder/src/log.cpp
molecuilder/src/moleculelist.cpp
molecuilder/src/periodentafel.cpp
molecuilder/src/tesselation.cpp
molecuilder/src/unittests/AnalysisCorrelationToSurfaceUnitTest.cpp
molecuilder/src/unittests/Makefile.am
molecuilder/src/unittests/bondgraphunittest.cpp
molecuilder/src/unittests/gslvectorunittest.cpp
molecuilder/src/unittests/logunittest.cpp
molecuilder/src/unittests/tesselation_boundarytriangleunittest.hpp
molecuilder/src/vector.cpp
molecuilder/tests/Tesselations/defs.in

Conflicts have been many and too numerous to listen here, just the few general cases

  • new molecule() replaced by World::getInstance().createMolecule()
  • new atom() replaced by World::getInstance().createAtom() where appropriate.
  • Some DoLog()s added interfered with changes to the message produced by Log() << Verbose(.) << ...
  • DoLog() has been erroneously added to TestRunner.cpp as well, there cout is appropriate
  • ...

Additionally, there was a bug in atom::clone(), sort was set to atom::nr of the atom to clone not of the clone itself. This caused a failure of the fragmentation.

This merge has been fully checked from a clean build directory with subsequent configure,make all install and make check.
It configures, compiles and runs all test cases and the test suite without errors.

Signed-off-by: Frederik Heber <heber@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • molecuilder/src/moleculelist.cpp

    r1561e2 r075729  
    2020#include "memoryallocator.hpp"
    2121#include "periodentafel.hpp"
     22#include "World.hpp"
    2223
    2324/*********************************** Functions for class MoleculeListClass *************************/
     
    3738MoleculeListClass::~MoleculeListClass()
    3839{
    39   Log() << Verbose(3) << this << ": Freeing ListOfMolcules." << endl;
     40  DoLog(3) && (Log() << Verbose(3) << this << ": Freeing ListOfMolcules." << endl);
    4041  for (MoleculeList::iterator ListRunner = ListOfMolecules.begin(); ListRunner != ListOfMolecules.end(); ListRunner++) {
    41     Log() << Verbose(4) << "ListOfMolecules: Freeing " << *ListRunner << "." << endl;
     42    DoLog(4) && (Log() << Verbose(4) << "ListOfMolecules: Freeing " << *ListRunner << "." << endl);
    4243    world->destroyMolecule(*ListRunner);
    4344  }
    44   Log() << Verbose(4) << "Freeing ListOfMolecules." << endl;
     45  DoLog(4) && (Log() << Verbose(4) << "Freeing ListOfMolecules." << endl);
    4546  ListOfMolecules.clear(); // empty list
    4647};
     
    314315  Tesselation *TesselStruct = NULL;
    315316  if ((srcmol == NULL) || (mol == NULL)) {
    316     eLog() << Verbose(1) << "Either fixed or variable molecule is given as NULL." << endl;
     317    DoeLog(1) && (eLog()<< Verbose(1) << "Either fixed or variable molecule is given as NULL." << endl);
    317318    return false;
    318319  }
     
    322323  FindNonConvexBorder(mol, TesselStruct, (const LinkedCell *&)LCList, 4., NULL);
    323324  if (TesselStruct == NULL) {
    324     eLog() << Verbose(1) << "Could not tesselate the fixed molecule." << endl;
     325    DoeLog(1) && (eLog()<< Verbose(1) << "Could not tesselate the fixed molecule." << endl);
    325326    return false;
    326327  }
     
    339340  while (Walker->next != srcmol->end) {
    340341    Walker = Walker->next;
    341     Log() << Verbose(2) << "INFO: Current Walker is " << *Walker << "." << endl;
     342    DoLog(2) && (Log() << Verbose(2) << "INFO: Current Walker is " << *Walker << "." << endl);
    342343    if (!TesselStruct->IsInnerPoint(Walker->x, LCList)) {
    343344      CopyAtoms[Walker->nr] = Walker->clone();
     
    348349    }
    349350  }
    350   Log() << Verbose(1) << nr << " of " << srcmol->AtomCount << " atoms have been merged.";
     351  DoLog(1) && (Log() << Verbose(1) << nr << " of " << srcmol->AtomCount << " atoms have been merged.");
    351352
    352353  // go through all bonds and add as well
     
    354355  while(Binder->next != srcmol->last) {
    355356    Binder = Binder->next;
    356     Log() << Verbose(3) << "Adding Bond between " << *CopyAtoms[Binder->leftatom->nr] << " and " << *CopyAtoms[Binder->rightatom->nr]<< "." << endl;
     357    DoLog(3) && (Log() << Verbose(3) << "Adding Bond between " << *CopyAtoms[Binder->leftatom->nr] << " and " << *CopyAtoms[Binder->rightatom->nr]<< "." << endl);
    357358    mol->AddBond(CopyAtoms[Binder->leftatom->nr], CopyAtoms[Binder->rightatom->nr], Binder->BondDegree);
    358359  }
     
    366367void MoleculeListClass::Output(ofstream *out)
    367368{
    368   Log() << Verbose(1) << "MoleculeList: ";
     369  DoLog(1) && (Log() << Verbose(1) << "MoleculeList: ");
    369370  for (MoleculeList::iterator ListRunner = ListOfMolecules.begin(); ListRunner != ListOfMolecules.end(); ListRunner++)
    370     Log() << Verbose(0) << *ListRunner << "\t";
    371   Log() << Verbose(0) << endl;
     371    DoLog(0) && (Log() << Verbose(0) << *ListRunner << "\t");
     372  DoLog(0) && (Log() << Verbose(0) << endl);
    372373};
    373374
     
    395396  char *FragmentNumber = NULL;
    396397
    397   Log() << Verbose(1) << "Saving hydrogen saturation correction ... ";
     398  DoLog(1) && (Log() << Verbose(1) << "Saving hydrogen saturation correction ... ");
    398399  // 0. parse in fit constant files that should have the same dimension as the final energy files
    399400  // 0a. find dimension of matrices with constants
     
    405406  input.open(line.c_str());
    406407  if (input == NULL) {
    407     Log() << Verbose(1) << endl << "Unable to open " << line << ", is the directory correct?" << endl;
     408    DoLog(1) && (Log() << Verbose(1) << endl << "Unable to open " << line << ", is the directory correct?" << endl);
    408409    return false;
    409410  }
     
    422423    b++;
    423424  }
    424   Log() << Verbose(0) << "I recognized " << a << " columns and " << b << " rows, ";
     425  DoLog(0) && (Log() << Verbose(0) << "I recognized " << a << " columns and " << b << " rows, ");
    425426  input.close();
    426427
     
    443444    input.open(line.c_str());
    444445    if (input == NULL) {
    445       eLog() << Verbose(0) << endl << "Unable to open " << line << ", is the directory correct?" << endl;
     446      DoeLog(0) && (eLog()<< Verbose(0) << endl << "Unable to open " << line << ", is the directory correct?" << endl);
    446447      performCriticalExit();
    447448      return false;
     
    465466  }
    466467  for (int k = 0; k < 3; k++) {
    467     Log() << Verbose(0) << "Constants " << k << ":" << endl;
     468    DoLog(0) && (Log() << Verbose(0) << "Constants " << k << ":" << endl);
    468469    for (int j = 0; j < b; j++) {
    469470      for (int i = 0; i < a; i++) {
    470         Log() << Verbose(0) << FitConstant[k][i][j] << "\t";
     471        DoLog(0) && (Log() << Verbose(0) << FitConstant[k][i][j] << "\t");
    471472      }
    472       Log() << Verbose(0) << endl;
    473     }
    474     Log() << Verbose(0) << endl;
     473      DoLog(0) && (Log() << Verbose(0) << endl);
     474    }
     475    DoLog(0) && (Log() << Verbose(0) << endl);
    475476  }
    476477
     
    560561  }
    561562  Free(&FitConstant);
    562   Log() << Verbose(0) << "done." << endl;
     563  DoLog(0) && (Log() << Verbose(0) << "done." << endl);
    563564  return true;
    564565};
     
    580581
    581582  // open file for the force factors
    582   Log() << Verbose(1) << "Saving  force factors ... ";
     583  DoLog(1) && (Log() << Verbose(1) << "Saving  force factors ... ");
    583584  line << path << "/" << FRAGMENTPREFIX << FORCESFILE;
    584585  ForcesFile.open(line.str().c_str(), ios::out);
     
    607608    }
    608609    ForcesFile.close();
    609     Log() << Verbose(1) << "done." << endl;
     610    DoLog(1) && (Log() << Verbose(1) << "done." << endl);
    610611  } else {
    611612    status = false;
    612     Log() << Verbose(1) << "failed to open file " << line.str() << "." << endl;
     613    DoLog(1) && (Log() << Verbose(1) << "failed to open file " << line.str() << "." << endl);
    613614  }
    614615  ForcesFile.close();
     
    638639  int FragmentCounter = 0;
    639640  ofstream output;
    640 
     641  double cell_size_backup[6];
     642  double * const cell_size = World::getInstance().getDomain();
     643
     644  // backup cell_size
     645  for (int i=0;i<6;i++)
     646    cell_size_backup[i] = cell_size[i];
    641647  // store the fragments as config and as xyz
    642648  for (MoleculeList::iterator ListRunner = ListOfMolecules.begin(); ListRunner != ListOfMolecules.end(); ListRunner++) {
     
    646652      strcpy(PathBackup, path);
    647653    else {
    648       eLog() << Verbose(0) << "OutputConfigForListOfFragments: NULL default path obtained from config!" << endl;
     654      DoeLog(0) && (eLog()<< Verbose(0) << "OutputConfigForListOfFragments: NULL default path obtained from config!" << endl);
    649655      performCriticalExit();
    650656    }
     
    657663    sprintf(FragmentName, "%s/%s%s.conf.xyz", configuration->configpath, FRAGMENTPREFIX, FragmentNumber);
    658664    outputFragment.open(FragmentName, ios::out);
    659     Log() << Verbose(2) << "Saving bond fragment No. " << FragmentNumber << "/" << FragmentCounter - 1 << " as XYZ ...";
     665    DoLog(2) && (Log() << Verbose(2) << "Saving bond fragment No. " << FragmentNumber << "/" << FragmentCounter - 1 << " as XYZ ...");
    660666    if ((intermediateResult = (*ListRunner)->OutputXYZ(&outputFragment)))
    661       Log() << Verbose(0) << " done." << endl;
     667      DoLog(0) && (Log() << Verbose(0) << " done." << endl);
    662668    else
    663       Log() << Verbose(0) << " failed." << endl;
     669      DoLog(0) && (Log() << Verbose(0) << " failed." << endl);
    664670    result = result && intermediateResult;
    665671    outputFragment.close();
     
    667673
    668674    // list atoms in fragment for debugging
    669     Log() << Verbose(2) << "Contained atoms: ";
     675    DoLog(2) && (Log() << Verbose(2) << "Contained atoms: ");
    670676    Walker = (*ListRunner)->start;
    671677    while (Walker->next != (*ListRunner)->end) {
    672678      Walker = Walker->next;
    673       Log() << Verbose(0) << Walker->Name << " ";
    674     }
    675     Log() << Verbose(0) << endl;
     679      DoLog(0) && (Log() << Verbose(0) << Walker->Name << " ");
     680    }
     681    DoLog(0) && (Log() << Verbose(0) << endl);
    676682
    677683    // center on edge
     
    682688      j += k + 1;
    683689      BoxDimension.x[k] = 2.5 * (configuration->GetIsAngstroem() ? 1. : 1. / AtomicLengthToAngstroem);
    684       (*ListRunner)->cell_size[j] += BoxDimension.x[k] * 2.;
     690      cell_size[j] = BoxDimension.x[k] * 2.;
    685691    }
    686692    (*ListRunner)->Translate(&BoxDimension);
     
    697703    // and save as config
    698704    sprintf(FragmentName, "%s/%s%s.conf", configuration->configpath, FRAGMENTPREFIX, FragmentNumber);
    699     Log() << Verbose(2) << "Saving bond fragment No. " << FragmentNumber << "/" << FragmentCounter - 1 << " as config ...";
     705    DoLog(2) && (Log() << Verbose(2) << "Saving bond fragment No. " << FragmentNumber << "/" << FragmentCounter - 1 << " as config ...");
    700706    if ((intermediateResult = configuration->Save(FragmentName, (*ListRunner)->elemente, (*ListRunner))))
    701       Log() << Verbose(0) << " done." << endl;
     707      DoLog(0) && (Log() << Verbose(0) << " done." << endl);
    702708    else
    703       Log() << Verbose(0) << " failed." << endl;
     709      DoLog(0) && (Log() << Verbose(0) << " failed." << endl);
    704710    result = result && intermediateResult;
    705711
     
    709715    // and save as mpqc input file
    710716    sprintf(FragmentName, "%s/%s%s.conf", configuration->configpath, FRAGMENTPREFIX, FragmentNumber);
    711     Log() << Verbose(2) << "Saving bond fragment No. " << FragmentNumber << "/" << FragmentCounter - 1 << " as mpqc input ...";
     717    DoLog(2) && (Log() << Verbose(2) << "Saving bond fragment No. " << FragmentNumber << "/" << FragmentCounter - 1 << " as mpqc input ...");
    712718    if ((intermediateResult = configuration->SaveMPQC(FragmentName, (*ListRunner))))
    713       Log() << Verbose(2) << " done." << endl;
     719      DoLog(2) && (Log() << Verbose(2) << " done." << endl);
    714720    else
    715       Log() << Verbose(0) << " failed." << endl;
     721      DoLog(0) && (Log() << Verbose(0) << " failed." << endl);
    716722
    717723    result = result && intermediateResult;
     
    720726    Free(&FragmentNumber);
    721727  }
    722   Log() << Verbose(0) << " done." << endl;
     728  DoLog(0) && (Log() << Verbose(0) << " done." << endl);
    723729
    724730  // printing final number
    725   Log() << Verbose(2) << "Final number of fragments: " << FragmentCounter << "." << endl;
     731  DoLog(2) && (Log() << Verbose(2) << "Final number of fragments: " << FragmentCounter << "." << endl);
     732
     733  // restore cell_size
     734  for (int i=0;i<6;i++)
     735    cell_size[i] = cell_size_backup[i];
    726736
    727737  return result;
     
    758768      Walker = Advancer;
    759769      Advancer = Advancer->next;
    760       Log() << Verbose(3) << "Re-linking " << *Walker << "..." << endl;
     770      DoLog(3) && (Log() << Verbose(3) << "Re-linking " << *Walker << "..." << endl);
    761771      unlink(Walker);
    762772      Walker->father = Walker;
     
    776786
    777787  // 1. dissect the molecule into connected subgraphs
    778   configuration->BG->ConstructBondGraph(mol);
     788  if (!configuration->BG->ConstructBondGraph(mol)) {
     789    World::getInstance().destroyMolecule(mol);
     790    DoeLog(1) && (eLog()<< Verbose(1) << "There are no bonds." << endl);
     791    return;
     792  }
    779793
    780794  // 2. scan for connected subgraphs
     
    783797  Subgraphs = mol->DepthFirstSearchAnalysis(BackEdgeStack);
    784798  delete(BackEdgeStack);
     799  if ((Subgraphs == NULL) || (Subgraphs->next == NULL)) {
     800    World::getInstance().destroyMolecule(mol);
     801    DoeLog(1) && (eLog()<< Verbose(1) << "There are no atoms." << endl);
     802    return;
     803  }
    785804
    786805  // 3. dissect (the following construct is needed to have the atoms not in the order of the DFS, but in
     
    800819      strncat(molecules[i]->name, number, MAXSTRINGSIZE - strlen(mol->name) - 1);
    801820    }
    802     cout << "MolName is " << molecules[i]->name << endl;
     821    DoLog(1) && (Log() << Verbose(1) << "MolName is " << molecules[i]->name << endl);
    803822    insert(molecules[i]);
    804823  }
     
    824843    Walker = mol->start->next;
    825844    if ((Walker->nr <0) || (Walker->nr >= mol->AtomCount)) {
    826       eLog() << Verbose(0) << "Index of atom " << *Walker << " is invalid!" << endl;
     845      DoeLog(0) && (eLog()<< Verbose(0) << "Index of atom " << *Walker << " is invalid!" << endl);
    827846      performCriticalExit();
    828847    }
    829848    FragmentCounter = MolMap[Walker->nr];
    830849    if (FragmentCounter != 0) {
    831       Log() << Verbose(3) << "Re-linking " << *Walker << "..." << endl;
     850      DoLog(3) && (Log() << Verbose(3) << "Re-linking " << *Walker << "..." << endl);
    832851      unlink(Walker);
    833852      molecules[FragmentCounter-1]->AddAtom(Walker);    // counting starts at 1
    834853    } else {
    835       eLog() << Verbose(0) << "Atom " << *Walker << " not associated to molecule!" << endl;
     854      DoeLog(0) && (eLog()<< Verbose(0) << "Atom " << *Walker << " not associated to molecule!" << endl);
    836855      performCriticalExit();
    837856    }
     
    854873  Free(&MolMap);
    855874  Free(&molecules);
    856   Log() << Verbose(1) << "I scanned " << FragmentCounter << " molecules." << endl;
     875  DoLog(1) && (Log() << Verbose(1) << "I scanned " << FragmentCounter << " molecules." << endl);
    857876};
    858877
     
    908927  // center at set box dimensions
    909928  mol->CenterEdge(&center);
    910   mol->cell_size[0] = center.x[0];
    911   mol->cell_size[1] = 0;
    912   mol->cell_size[2] = center.x[1];
    913   mol->cell_size[3] = 0;
    914   mol->cell_size[4] = 0;
    915   mol->cell_size[5] = center.x[2];
     929  World::getInstance().getDomain()[0] = center.x[0];
     930  World::getInstance().getDomain()[1] = 0;
     931  World::getInstance().getDomain()[2] = center.x[1];
     932  World::getInstance().getDomain()[3] = 0;
     933  World::getInstance().getDomain()[4] = 0;
     934  World::getInstance().getDomain()[5] = center.x[2];
    916935  insert(mol);
    917936}
     
    10511070  int AtomNo;
    10521071
    1053   Log() << Verbose(1) << "Begin of FillBondStructureFromReference." << endl;
     1072  DoLog(1) && (Log() << Verbose(1) << "Begin of FillBondStructureFromReference." << endl);
    10541073  // fill ListOfLocalAtoms if NULL was given
    10551074  if (!FillListOfLocalAtoms(ListOfLocalAtoms, FragmentCounter, reference->AtomCount, FreeList)) {
    1056     Log() << Verbose(1) << "Filling of ListOfLocalAtoms failed." << endl;
     1075    DoLog(1) && (Log() << Verbose(1) << "Filling of ListOfLocalAtoms failed." << endl);
    10571076    return false;
    10581077  }
    10591078
    10601079  if (status) {
    1061     Log() << Verbose(1) << "Creating adjacency list for subgraph " << Leaf << "." << endl;
     1080    DoLog(1) && (Log() << Verbose(1) << "Creating adjacency list for subgraph " << Leaf << "." << endl);
    10621081    // remove every bond from the list
    10631082    bond *Binder = NULL;
     
    10801099            Leaf->AddBond(Walker, OtherWalker, (*Runner)->BondDegree);
    10811100        } else {
    1082           Log() << Verbose(1) << "OtherWalker = ListOfLocalAtoms[" << FragmentCounter << "][" << (*Runner)->GetOtherAtom(Walker->GetTrueFather())->nr << "] is NULL!" << endl;
     1101          DoLog(1) && (Log() << Verbose(1) << "OtherWalker = ListOfLocalAtoms[" << FragmentCounter << "][" << (*Runner)->GetOtherAtom(Walker->GetTrueFather())->nr << "] is NULL!" << endl);
    10831102          status = false;
    10841103        }
     
    10931112      Free(&ListOfLocalAtoms);
    10941113  }
    1095   Log() << Verbose(1) << "End of FillBondStructureFromReference." << endl;
     1114  DoLog(1) && (Log() << Verbose(1) << "End of FillBondStructureFromReference." << endl);
    10961115  return status;
    10971116};
     
    11261145        next->FillRootStackForSubgraphs(RootStack, AtomMask, ++FragmentCounter);
    11271146    } else {
    1128       Log() << Verbose(1) << "Rootstack[" << FragmentCounter << "] is NULL." << endl;
     1147      DoLog(1) && (Log() << Verbose(1) << "Rootstack[" << FragmentCounter << "] is NULL." << endl);
    11291148      return false;
    11301149    }
     
    11321151    return true;
    11331152  } else {
    1134     Log() << Verbose(1) << "Rootstack is NULL." << endl;
     1153    DoLog(1) && (Log() << Verbose(1) << "Rootstack is NULL." << endl);
    11351154    return false;
    11361155  }
     
    11821201  int KeySetCounter = 0;
    11831202
    1184   Log() << Verbose(1) << "Begin of AssignKeySetsToFragment." << endl;
     1203  DoLog(1) && (Log() << Verbose(1) << "Begin of AssignKeySetsToFragment." << endl);
    11851204  // fill ListOfLocalAtoms if NULL was given
    11861205  if (!FillListOfLocalAtoms(ListOfLocalAtoms, FragmentCounter, reference->AtomCount, FreeList)) {
    1187     Log() << Verbose(1) << "Filling of ListOfLocalAtoms failed." << endl;
     1206    DoLog(1) && (Log() << Verbose(1) << "Filling of ListOfLocalAtoms failed." << endl);
    11881207    return false;
    11891208  }
     
    12131232    delete (TempSet);
    12141233    if (KeySetCounter == 0) {// if there are no keysets, delete the list
    1215       Log() << Verbose(1) << "KeySetCounter is zero, deleting FragmentList." << endl;
     1234      DoLog(1) && (Log() << Verbose(1) << "KeySetCounter is zero, deleting FragmentList." << endl);
    12161235      delete (FragmentList[FragmentCounter]);
    12171236    } else
    1218       Log() << Verbose(1) << KeySetCounter << " keysets were assigned to subgraph " << FragmentCounter << "." << endl;
     1237      DoLog(1) && (Log() << Verbose(1) << KeySetCounter << " keysets were assigned to subgraph " << FragmentCounter << "." << endl);
    12191238    FragmentCounter++;
    12201239    if (next != NULL)
     
    12221241    FragmentCounter--;
    12231242  } else
    1224     Log() << Verbose(1) << "KeySetList is NULL or empty." << endl;
     1243    DoLog(1) && (Log() << Verbose(1) << "KeySetList is NULL or empty." << endl);
    12251244
    12261245  if ((FreeList) && (ListOfLocalAtoms != NULL)) {
     
    12301249      Free(&ListOfLocalAtoms);
    12311250  }
    1232   Log() << Verbose(1) << "End of AssignKeySetsToFragment." << endl;
     1251  DoLog(1) && (Log() << Verbose(1) << "End of AssignKeySetsToFragment." << endl);
    12331252  return status;
    12341253};
     
    12431262void MoleculeLeafClass::TranslateIndicesToGlobalIDs(Graph **FragmentList, int &FragmentCounter, int &TotalNumberOfKeySets, Graph &TotalGraph)
    12441263{
    1245   Log() << Verbose(1) << "Begin of TranslateIndicesToGlobalIDs." << endl;
     1264  DoLog(1) && (Log() << Verbose(1) << "Begin of TranslateIndicesToGlobalIDs." << endl);
    12461265  KeySet *TempSet = new KeySet;
    12471266  if (FragmentList[FragmentCounter] != NULL) {
     
    12541273    delete (TempSet);
    12551274  } else {
    1256     Log() << Verbose(1) << "FragmentList is NULL." << endl;
     1275    DoLog(1) && (Log() << Verbose(1) << "FragmentList is NULL." << endl);
    12571276  }
    12581277  if (next != NULL)
    12591278    next->TranslateIndicesToGlobalIDs(FragmentList, ++FragmentCounter, TotalNumberOfKeySets, TotalGraph);
    12601279  FragmentCounter--;
    1261   Log() << Verbose(1) << "End of TranslateIndicesToGlobalIDs." << endl;
     1280  DoLog(1) && (Log() << Verbose(1) << "End of TranslateIndicesToGlobalIDs." << endl);
    12621281};
    12631282
Note: See TracChangeset for help on using the changeset viewer.