Changeset 23524
- Timestamp:
- 12/09/18 19:45:10 (6 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 1 deleted
- 27 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/Elements/Element.h
r23366 r23524 3 3 * This class is a place holder for the Tria and the Penta elements. 4 4 * It is derived from Element, so DataSets can contain them. 5 5 */ 6 6 7 7 #ifndef _ELEMENT_H_ … … 12 12 #include "../../datastructures/datastructures.h" 13 13 #include "../../toolkits/toolkits.h" 14 #include "../Update.h"15 14 class DataSet; 16 15 class Parameters; … … 27 26 class Inputs; 28 27 class Input; 28 class IoModel; 29 29 class Gauss; 30 30 class ElementVector; … … 35 35 /*}}}*/ 36 36 37 class Element: public Object ,public Update{37 class Element: public Object{ 38 38 39 39 public: … … 131 131 void InputUpdateFromConstant(int constant, int name); 132 132 void InputUpdateFromConstant(bool constant, int name); 133 133 134 bool IsFloating(); 134 135 bool IsIceInElement(); … … 189 190 void ViscousHeatingCreateInput(void); 190 191 192 191 193 /*Virtual functions*/ 192 194 virtual void AddBasalInput(int input_enum, IssmDouble* values, int interpolation_enum)=0; … … 240 242 virtual void InputUpdateFromSolutionOneDofCollapsed(IssmDouble* solution,int inputenum)=0; 241 243 virtual void InputUpdateFromSolutionOneDof(IssmDouble* solution,int inputenum)=0; 244 #ifdef _HAVE_DAKOTA_ 245 virtual void InputUpdateFromMatrixDakota(IssmDouble* matrix, int rows, int ncols, int name, int type)=0; 246 virtual void InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type)=0; 247 #endif 248 virtual void InputUpdateFromIoModel(int index, IoModel* iomodel)=0; 249 virtual void InputUpdateFromVector(IssmDouble* vector, int name, int type)=0; 242 250 virtual bool IsFaceOnBoundary(void)=0; 243 251 virtual bool IsIcefront(void)=0; -
issm/trunk-jpl/src/c/classes/Loads/Load.h
r18926 r23524 19 19 class Parameters; 20 20 #include "../../datastructures/datastructures.h" 21 #include "../Update.h"22 21 23 class Load: public Object ,public Update{22 class Load: public Object{ 24 23 25 24 public: -
issm/trunk-jpl/src/c/classes/Loads/Loads.cpp
r23490 r23524 16 16 17 17 #include "../../shared/io/Comm/IssmComm.h" 18 #include "../../shared/Numerics/recast.h" 19 #include "../../shared/Enum/EnumDefinitions.h" 20 #include "../../shared/Exceptions/exceptions.h" 18 21 #include "./Loads.h" 19 22 #include "./Load.h" -
issm/trunk-jpl/src/c/classes/Loads/Pengrid.cpp
r22856 r23524 355 355 /*}}}*/ 356 356 357 /*Update virtual functions definitions:*/358 void Pengrid::InputUpdateFromConstant(IssmDouble constant, int name){/*{{{*/359 /*Nothing*/360 }361 /*}}}*/362 void Pengrid::InputUpdateFromConstant(int constant, int name){/*{{{*/363 /*Nothing updated yet*/364 }365 /*}}}*/366 void Pengrid::InputUpdateFromConstant(bool constant, int name){/*{{{*/367 368 switch(name){369 370 case ResetPenaltiesEnum:371 if (constant) zigzag_counter=0;372 return;373 374 }375 }376 /*}}}*/377 void Pengrid::InputUpdateFromMatrixDakota(IssmDouble* matrix, int nrows, int ncols, int name, int type){/*{{{*/378 /*Nothing updated yet*/379 }380 /*}}}*/381 void Pengrid::InputUpdateFromVector(IssmDouble* vector, int name, int type){/*{{{*/382 /*Nothing updated yet*/383 }384 /*}}}*/385 void Pengrid::InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type){/*{{{*/386 /*Nothing updated yet*/387 }388 /*}}}*/389 390 357 /*Pengrid management:*/ 391 358 void Pengrid::ConstraintActivate(int* punstable){/*{{{*/ … … 693 660 } 694 661 /*}}}*/ 662 void Pengrid::ResetZigzagCounter(){/*{{{*/ 663 664 zigzag_counter=0; 665 } 666 /*}}}*/ -
issm/trunk-jpl/src/c/classes/Loads/Pengrid.h
r21915 r23524 57 57 int ObjectEnum(); 58 58 /*}}}*/ 59 /*Update virtual functions resolution: {{{*/60 void InputUpdateFromConstant(IssmDouble constant, int name);61 void InputUpdateFromConstant(int constant, int name);62 void InputUpdateFromConstant(bool constant, int name);63 void InputUpdateFromIoModel(int index, IoModel* iomodel){_error_("not implemented yet");};64 void InputUpdateFromMatrixDakota(IssmDouble* matrix ,int nrows, int ncols, int name, int type);65 void InputUpdateFromVector(IssmDouble* vector, int name, int type);66 void InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type);67 /*}}}*/68 59 /*Load virtual functions definitions: {{{*/ 69 60 void Configure(Elements* elements,Loads* loads,Nodes* nodes,Vertices* vertices,Materials* materials,Parameters* parameters); … … 94 85 ElementVector* PenaltyCreatePVectorThermal(IssmDouble kmax); 95 86 void ResetConstraint(void); 87 void ResetZigzagCounter(void); 96 88 /*}}}*/ 97 89 -
issm/trunk-jpl/src/c/classes/Materials/Material.h
r22105 r23524 11 11 template <class doubletype> class Vector; 12 12 #include "../../datastructures/datastructures.h" 13 #include "../ Update.h"13 #include "../../toolkits/toolkits.h" 14 14 class Element; 15 15 class Elements; … … 18 18 /*}}}*/ 19 19 20 class Material: public Object ,public Update{20 class Material: public Object{ 21 21 22 22 public: 23 23 virtual ~Material(){}; 24 /*WARNING: input should not be public but it is an easy way to update B from T (using UpdateFromSolution) from Pentas*/25 24 26 25 /*Numerics*/ -
issm/trunk-jpl/src/c/classes/Materials/Matestar.cpp
r23066 r23524 370 370 } 371 371 /*}}}*/ 372 void Matestar::InputUpdateFromConstant(IssmDouble constant, int name){/*{{{*/373 /*Nothing updated yet*/374 }375 /*}}}*/376 void Matestar::InputUpdateFromConstant(int constant, int name){/*{{{*/377 /*Nothing updated yet*/378 }379 /*}}}*/380 void Matestar::InputUpdateFromConstant(bool constant, int name){/*{{{*/381 /*Nothing updated yet*/382 }383 /*}}}*/384 void Matestar::InputUpdateFromMatrixDakota(IssmDouble* matrix, int nrows, int ncols,int name, int type){/*{{{*/385 /*Nothing updated yet*/386 }387 /*}}}*/388 void Matestar::InputUpdateFromVector(IssmDouble* vector, int name, int type){/*{{{*/389 390 }391 /*}}}*/392 void Matestar::InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type){/*{{{*/393 394 }395 /*}}}*/396 372 bool Matestar::IsDamage(){/*{{{*/ 397 373 -
issm/trunk-jpl/src/c/classes/Materials/Matestar.h
r22105 r23524 44 44 int ObjectEnum(); 45 45 /*}}}*/ 46 /*Update virtual funictions definitions: {{{*/47 void InputUpdateFromConstant(IssmDouble constant, int name);48 void InputUpdateFromConstant(int constant, int name);49 void InputUpdateFromConstant(bool constant, int name);50 void InputUpdateFromIoModel(int index, IoModel* iomodel){_error_("not implemented");};51 void InputUpdateFromMatrixDakota(IssmDouble* matrix, int nrow, int ncols, int name, int type);52 void InputUpdateFromVector(IssmDouble* vector, int name, int type);53 void InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type);54 /*}}}*/55 46 /*Material virtual functions resolution: {{{*/ 56 47 void Configure(Elements* elements); -
issm/trunk-jpl/src/c/classes/Materials/Matice.cpp
r23066 r23524 654 654 } 655 655 /*}}}*/ 656 void Matice::InputUpdateFromConstant(IssmDouble constant, int name){/*{{{*/657 /*Nothing updated yet*/658 }659 /*}}}*/660 void Matice::InputUpdateFromConstant(int constant, int name){/*{{{*/661 /*Nothing updated yet*/662 }663 /*}}}*/664 void Matice::InputUpdateFromConstant(bool constant, int name){/*{{{*/665 /*Nothing updated yet*/666 }667 /*}}}*/668 void Matice::InputUpdateFromMatrixDakota(IssmDouble* matrix, int nrows, int ncols,int name, int type){/*{{{*/669 /*Nothing updated yet*/670 }671 /*}}}*/672 void Matice::InputUpdateFromVector(IssmDouble* vector, int name, int type){/*{{{*/673 674 }675 /*}}}*/676 void Matice::InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type){/*{{{*/677 678 }679 /*}}}*/680 656 void Matice::ResetHooks(){/*{{{*/ 681 657 -
issm/trunk-jpl/src/c/classes/Materials/Matice.h
r22105 r23524 48 48 int ObjectEnum(); 49 49 /*}}}*/ 50 /*Update virtual funictions definitions: {{{*/51 void InputUpdateFromConstant(IssmDouble constant, int name);52 void InputUpdateFromConstant(int constant, int name);53 void InputUpdateFromConstant(bool constant, int name);54 void InputUpdateFromIoModel(int index, IoModel* iomodel){_error_("not implemented");};55 void InputUpdateFromMatrixDakota(IssmDouble* matrix, int nrow, int ncols, int name, int type);56 void InputUpdateFromVector(IssmDouble* vector, int name, int type);57 void InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type);58 /*}}}*/59 50 /*Material virtual functions resolution: {{{*/ 60 51 void Configure(Elements* elements); -
issm/trunk-jpl/src/c/classes/Materials/Matlitho.cpp
r23066 r23524 182 182 /*}}}*/ 183 183 184 /*Update virtual functions definitions:*/185 186 184 /*Matlitho management: */ 187 185 void Matlitho::Configure(Elements* elementsin){/*{{{*/ -
issm/trunk-jpl/src/c/classes/Materials/Matlitho.h
r22105 r23524 39 39 void Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction); 40 40 int ObjectEnum(); 41 /*}}}*/42 /*Update virtual functions resolution: {{{*/43 void InputUpdateFromConstant(IssmDouble constant, int name){_error_("not implemented");};44 void InputUpdateFromConstant(int constant, int name){_error_("not implemented");};45 void InputUpdateFromConstant(bool constant, int name){_error_("not implemented");};46 void InputUpdateFromIoModel(int index, IoModel* iomodel){_error_("not implemented");};47 void InputUpdateFromMatrixDakota(IssmDouble* matrix,int nrows,int ncols, int name, int type){_error_("not implemented");};48 void InputUpdateFromVector(IssmDouble* vector, int name, int type){_error_("not implemented");};49 void InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type){_error_("not implemented");};50 41 /*}}}*/ 51 42 /*Material virtual functions resolution: {{{*/ -
issm/trunk-jpl/src/c/classes/Materials/Matpar.cpp
r23366 r23524 529 529 } 530 530 /*}}}*/ 531 void Matpar::InputUpdateFromConstant(int constant, int name){/*{{{*/532 /*Nothing updated yet*/533 }534 /*}}}*/535 void Matpar::InputUpdateFromConstant(bool constant, int name){/*{{{*/536 /*Nothing updated yet*/537 }538 /*}}}*/539 void Matpar::InputUpdateFromMatrixDakota(IssmDouble* matrix, int nrows, int ncols,int name, int type){/*{{{*/540 /*Nothing updated yet*/541 }542 /*}}}*/543 void Matpar::InputUpdateFromVector(IssmDouble* vector, int name, int type){/*{{{*/544 /*Nothing updated yet*/545 }546 /*}}}*/547 void Matpar::InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type){/*{{{*/548 /*Nothing updated yet*/549 }550 /*}}}*/551 531 552 532 /*Matpar management: */ -
issm/trunk-jpl/src/c/classes/Materials/Matpar.h
r22955 r23524 77 77 int ObjectEnum(); 78 78 /*}}}*/ 79 /*Update virtual functions resolution: {{{*/80 void InputUpdateFromConstant(IssmDouble constant, int name);81 void InputUpdateFromConstant(int constant, int name);82 void InputUpdateFromConstant(bool constant, int name);83 void InputUpdateFromIoModel(int index, IoModel* iomodel){_error_("not implemented");};84 void InputUpdateFromMatrixDakota(IssmDouble* matrix,int nrows,int ncols, int name, int type);85 void InputUpdateFromVector(IssmDouble* vector, int name, int type);86 void InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type);87 /*}}}*/88 79 /*Material virtual functions resolution: {{{*/ 89 80 Material* copy2(Element* element){_error_("not implemented");}; … … 131 122 void ThermalToEnthalpy(IssmDouble* penthalpy,IssmDouble temperature,IssmDouble waterfraction,IssmDouble pressure); 132 123 IssmDouble TMeltingPoint(IssmDouble pressure); 124 void InputUpdateFromConstant(IssmDouble constant, int name); 133 125 /*}}}*/ 134 126 -
issm/trunk-jpl/src/c/classes/Node.h
r21484 r23524 11 11 #include "../shared/shared.h" 12 12 #include "./DofIndexing.h" 13 #include "./Update.h"14 13 class Inputs; 15 14 class Hook; -
issm/trunk-jpl/src/c/classes/classes.h
r22612 r23524 131 131 #include "./DofIndexing.h" 132 132 #include "./IoModel.h" 133 #include "./Update.h"134 133 #include "./FemModel.h" 135 134 #include "./GiaDeflectionCoreArgs.h" -
issm/trunk-jpl/src/c/modules/InputUpdateFromConstantx/InputUpdateFromConstantx.cpp
r18521 r23524 18 18 } 19 19 20 for(i=0;i<femmodel->loads->Size();i++){21 Load* load=(Load*)femmodel->loads->GetObjectByOffset(i);22 load->InputUpdateFromConstant(constant,name);23 }24 25 20 for(i=0;i<femmodel->materials->Size();i++){ 26 21 Material* material=(Material*)femmodel->materials->GetObjectByOffset(i); 27 material->InputUpdateFromConstant(constant,name); 22 if(material->ObjectEnum()==MatparEnum){ 23 ((Matpar*)material)->InputUpdateFromConstant(constant,name); 24 } 28 25 } 29 26 } … … 38 35 element->InputUpdateFromConstant(constant,name); 39 36 } 40 41 for(i=0;i<femmodel->loads->Size();i++){42 Load* load=(Load*)femmodel->loads->GetObjectByOffset(i);43 load->InputUpdateFromConstant(constant,name);44 }45 46 37 for(i=0;i<femmodel->materials->Size();i++){ 47 38 Material* material=(Material*)femmodel->materials->GetObjectByOffset(i); 48 material->InputUpdateFromConstant(constant,name); 39 if(material->ObjectEnum()==MatparEnum){ 40 ((Matpar*)material)->InputUpdateFromConstant(constant,name); 41 } 49 42 } 50 43 } … … 59 52 element->InputUpdateFromConstant(constant,name); 60 53 } 61 62 for(i=0;i<femmodel->loads->Size();i++){63 Load* load=(Load*)femmodel->loads->GetObjectByOffset(i);64 load->InputUpdateFromConstant(constant,name);65 }66 67 54 for(i=0;i<femmodel->materials->Size();i++){ 68 55 Material* material=(Material*)femmodel->materials->GetObjectByOffset(i); 69 material->InputUpdateFromConstant(constant,name); 56 if(material->ObjectEnum()==MatparEnum){ 57 ((Matpar*)material)->InputUpdateFromConstant(constant,name); 58 } 70 59 } 71 60 … … 73 62 void InputUpdateFromConstantx(Elements* elements,IssmDouble constant, int name){ 74 63 75 int i;76 64 if(VerboseModule()) _printf0_(" Input updates from constant\n"); 77 65 78 66 /*Elements and loads drive the update: */ 79 for(i =0;i<elements->Size();i++){67 for(int i=0;i<elements->Size();i++){ 80 68 Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i)); 81 69 element->InputUpdateFromConstant(constant,name); -
issm/trunk-jpl/src/c/modules/InputUpdateFromVectorDakotax/InputUpdateFromVectorDakotax.cpp
r22200 r23524 23 23 element->InputUpdateFromVectorDakota(vector,name,type); 24 24 } 25 for(int i=0;i<femmodel->loads->Size();i++){26 Load* load=(Load*)femmodel->loads->GetObjectByOffset(i);27 load->InputUpdateFromVectorDakota(vector,name,type);28 }29 for(int i=0;i<femmodel->materials->Size();i++){30 Material* material=(Material*)femmodel->materials->GetObjectByOffset(i);31 material->InputUpdateFromVectorDakota(vector,name,type);32 }33 for(int i=0;i<femmodel->constraints->Size();i++){34 Constraint* constraint=(Constraint*)femmodel->constraints->GetObjectByOffset(i);35 constraint->InputUpdateFromVectorDakota(vector,femmodel->nodes,name,type);36 }37 25 } -
issm/trunk-jpl/src/c/modules/InputUpdateFromVectorx/InputUpdateFromVectorx.cpp
r18521 r23524 16 16 void InputUpdateFromVectorx(FemModel* femmodel,IssmDouble* vector, int name, int type){ 17 17 18 int i;19 20 18 /*Update elements, nodes, loads and materials from inputs: */ 21 for(i =0;i<femmodel->elements->Size();i++){19 for(int i=0;i<femmodel->elements->Size();i++){ 22 20 Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i)); 23 21 element->InputUpdateFromVector(vector,name,type); 24 22 } 25 for(i=0;i<femmodel->loads->Size();i++){26 Load* load=(Load*)femmodel->loads->GetObjectByOffset(i);27 load->InputUpdateFromVector(vector,name,type);28 }29 for(i=0;i<femmodel->materials->Size();i++){30 Material* material=(Material*)femmodel->materials->GetObjectByOffset(i);31 material->InputUpdateFromVector(vector,name,type);32 }33 23 } -
issm/trunk-jpl/src/c/modules/ResetConstraintsx/ResetConstraintsx.cpp
r23490 r23524 38 38 } 39 39 } 40 void ResetZigzagCounterx(FemModel* femmodel){ 41 42 /*Display message*/ 43 if(VerboseModule()) _printf0_(" Resetting penalties\n"); 44 45 /*Deal with rift first*/ 46 if(RiftIsPresent(femmodel->loads,femmodel->analysis_type_list[femmodel->analysis_counter])){ 47 _error_("rift constraints reset not supported yet!"); 48 } 49 50 /*Reset pengrid to inactive mode*/ 51 for(int i=0;i<femmodel->loads->Size();i++){ 52 Load* load=(Load*)femmodel->loads->GetObjectByOffset(i); 53 if(load->ObjectEnum()==PengridEnum){ 54 Pengrid* pengrid=(Pengrid*)load; 55 pengrid->ResetZigzagCounter(); 56 } 57 } 58 } -
issm/trunk-jpl/src/c/modules/ResetConstraintsx/ResetConstraintsx.h
r16206 r23524 10 10 /* local prototypes: */ 11 11 void ResetConstraintsx(FemModel* femmodel); 12 void ResetZigzagCounterx(FemModel* femmodel); 12 13 13 14 #endif /* _RESETCONSTRAINTSX_H */ -
issm/trunk-jpl/src/c/modules/SetActiveNodesLSMx/SetActiveNodesLSMx.cpp
r23173 r23524 77 77 /*Assemble vector and serialize */ 78 78 vec_mask_ice->Assemble(); 79 IssmDouble* mask_ice=vec_mask_ice->ToMPISerial(); 80 InputUpdateFromVectorx(femmodel,mask_ice,IceMaskNodeActivationEnum,VertexSIdEnum); 81 82 /*Clean up and return*/ 79 InputUpdateFromVectorx(femmodel,vec_mask_ice,IceMaskNodeActivationEnum,VertexSIdEnum); 83 80 delete vec_mask_ice; 84 xDelete<IssmDouble>(mask_ice);85 81 }/*}}}*/ 86 82 void GetMaskOfIceVerticesLSMx(FemModel* femmodel){/*{{{*/ -
issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
r23474 r23524 1070 1070 RegionaloutputEnum, 1071 1071 RegularEnum, 1072 ResetPenaltiesEnum,1073 1072 RiftfrontEnum, 1074 1073 ScaledEnum, -
issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
r23474 r23524 1074 1074 case RegionaloutputEnum : return "Regionaloutput"; 1075 1075 case RegularEnum : return "Regular"; 1076 case ResetPenaltiesEnum : return "ResetPenalties";1077 1076 case RiftfrontEnum : return "Riftfront"; 1078 1077 case ScaledEnum : return "Scaled"; -
issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
r23474 r23524 1098 1098 else if (strcmp(name,"Regionaloutput")==0) return RegionaloutputEnum; 1099 1099 else if (strcmp(name,"Regular")==0) return RegularEnum; 1100 else if (strcmp(name,"ResetPenalties")==0) return ResetPenaltiesEnum;1101 1100 else if (strcmp(name,"Riftfront")==0) return RiftfrontEnum; 1102 1101 else if (strcmp(name,"Scaled")==0) return ScaledEnum; … … 1121 1120 else if (strcmp(name,"SIAApproximation")==0) return SIAApproximationEnum; 1122 1121 else if (strcmp(name,"SigmaVM")==0) return SigmaVMEnum; 1122 else if (strcmp(name,"SmbAnalysis")==0) return SmbAnalysisEnum; 1123 1123 else stage=10; 1124 1124 } 1125 1125 if(stage==10){ 1126 if (strcmp(name,"SmbAnalysis")==0) return SmbAnalysisEnum; 1127 else if (strcmp(name,"SMBcomponents")==0) return SMBcomponentsEnum; 1126 if (strcmp(name,"SMBcomponents")==0) return SMBcomponentsEnum; 1128 1127 else if (strcmp(name,"SMBd18opdd")==0) return SMBd18opddEnum; 1129 1128 else if (strcmp(name,"SmbDesfac")==0) return SmbDesfacEnum; -
issm/trunk-jpl/src/c/solutionsequences/solutionsequence_hydro_nonlinear.cpp
r23387 r23524 84 84 /*Loop on sediment layer to deal with transfer and head value*/ 85 85 femmodel->SetCurrentConfiguration(HydrologyDCInefficientAnalysisEnum); 86 InputUpdateFromConstantx(femmodel,true,ResetPenaltiesEnum);86 ResetZigzagCounterx(femmodel); 87 87 InputUpdateFromConstantx(femmodel,false,ConvergedEnum); 88 88 femmodel->UpdateConstraintsx(); … … 161 161 femmodel->HydrologyEPLupdateDomainx(&ThickCount); 162 162 inefanalysis->ElementizeEplMask(femmodel); 163 InputUpdateFromConstantx(femmodel,true,ResetPenaltiesEnum);163 ResetZigzagCounterx(femmodel); 164 164 InputUpdateFromConstantx(femmodel,false,ConvergedEnum); 165 165 -
issm/trunk-jpl/src/c/solutionsequences/solutionsequence_thermal_nonlinear.cpp
r23066 r23524 56 56 else{ 57 57 femmodel->parameters->FindParam(&thermal_penalty_threshold,ThermalPenaltyThresholdEnum); 58 InputUpdateFromConstantx(femmodel,true,ResetPenaltiesEnum);58 ResetZigzagCounterx(femmodel); 59 59 femmodel->UpdateConstraintsx(); 60 60 }
Note:
See TracChangeset
for help on using the changeset viewer.