Changeset 24959
- Timestamp:
- 06/03/20 14:59:24 (5 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/EsaAnalysis.cpp
r24950 r24959 47 47 int M,m,lower_row,upper_row; 48 48 IssmDouble degacc=.01; 49 IssmDouble planetradius=0; 50 IssmDouble planetarea=0; 49 51 50 52 int numoutputs; … … 59 61 /*some constant parameters: */ 60 62 parameters->AddObject(iomodel->CopyConstantObject("md.esa.hemisphere",EsaHemisphereEnum)); 61 parameters->AddObject(iomodel->CopyConstantObject("md.slr.eartharea",SealevelEarthAreaEnum));62 63 parameters->AddObject(iomodel->CopyConstantObject("md.slr.rigid",SealevelriseRigidEnum)); 63 64 parameters->AddObject(iomodel->CopyConstantObject("md.slr.horiz",SealevelriseHorizEnum)); 64 65 parameters->AddObject(iomodel->CopyConstantObject("md.slr.elastic",SealevelriseElasticEnum)); 65 66 parameters->AddObject(iomodel->CopyConstantObject("md.slr.rotation",SealevelriseRotationEnum)); 66 67 68 /*deal with planet radius and area: */ 69 parameters->AddObject(iomodel->CopyConstantObject("md.slr.planetradius",SealevelPlanetRadiusEnum)); 70 iomodel->FetchData(&planetradius,"md.slr.planetradius"); 71 planetarea=4*PI*planetradius*planetradius; 72 parameters->AddObject(new DoubleParam(SealevelPlanetAreaEnum,planetarea)); 73 67 74 /*love numbers: */ 68 75 iomodel->FetchData(&love_h,&nl,NULL,"md.esa.love_h"); -
issm/trunk-jpl/src/c/analyses/SealevelriseAnalysis.cpp
r24947 r24959 1 1 #include "./SealevelriseAnalysis.h" 2 #include <math.h> 2 3 #include "../toolkits/toolkits.h" 3 4 #include "../classes/classes.h" … … 292 293 int M,m,lower_row,upper_row; 293 294 IssmDouble degacc=.01; 295 IssmDouble planetradius=0; 296 IssmDouble planetarea=0; 294 297 295 298 int numoutputs; … … 320 323 parameters->AddObject(iomodel->CopyConstantObject("md.slr.ocean_area_scaling",SealevelriseOceanAreaScalingEnum)); 321 324 parameters->AddObject(iomodel->CopyConstantObject("md.slr.geodetic",SealevelriseGeodeticEnum)); 322 parameters->AddObject(iomodel->CopyConstantObject("md.slr.eartharea",SealevelEarthAreaEnum)); 325 parameters->AddObject(iomodel->CopyConstantObject("md.slr.planetradius",SealevelPlanetRadiusEnum)); 326 327 /*compute planet area and plug into parameters:*/ 328 iomodel->FetchData(&planetradius,"md.slr.planetradius"); 329 planetarea=4*PI*planetradius*planetradius; 330 parameters->AddObject(new DoubleParam(SealevelPlanetAreaEnum,planetarea)); 323 331 324 332 /*Deal with dsl multi-model ensembles: {{{*/ -
issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
r24951 r24959 5297 5297 IssmDouble llr_list[NUMVERTICES][3]; 5298 5298 IssmDouble xyz_list[NUMVERTICES][3]; 5299 IssmDouble area, eartharea;5299 IssmDouble area,planetarea; 5300 5300 IssmDouble I; //ice/water loading 5301 5301 IssmDouble late,longe,re; … … 5331 5331 5332 5332 /*recover earth area: */ 5333 this->parameters->FindParam(& eartharea,SealevelEarthAreaEnum);5333 this->parameters->FindParam(&planetarea,SealevelPlanetAreaEnum); 5334 5334 5335 5335 /*how many dofs are we working with here? */ … … 5356 5356 } 5357 5357 5358 // correction at the north pole 5358 // correction at the north pole: given longitude of the North pole a definition 5359 // closer to the other two vertices. 5359 5360 if(llr_list[0][0]==0)llr_list[0][1]=(llr_list[1][1]+llr_list[2][1])/2.0; 5360 5361 if(llr_list[1][0]==0)llr_list[1][1]=(llr_list[0][1]+llr_list[2][1])/2.0; 5361 5362 if(llr_list[2][0]==0)llr_list[2][1]=(llr_list[0][1]+llr_list[1][1])/2.0; 5362 5363 5363 //correction at the south pole 5364 // correction at the north pole: given longitude of the North pole a definition 5365 // closer to the other two vertices. 5364 5366 if(llr_list[0][0]==180)llr_list[0][1]=(llr_list[1][1]+llr_list[2][1])/2.0; 5365 5367 if(llr_list[1][0]==180)llr_list[1][1]=(llr_list[0][1]+llr_list[2][1])/2.0; … … 5370 5372 5371 5373 late=90-late; 5372 if(longe>180)longe= (longe-180)-180;5374 if(longe>180)longe=longe-360; 5373 5375 5374 5376 late=late/180*PI; … … 5432 5434 5433 5435 /*Add all components to the pUp solution vectors:*/ 5434 U_values[i]+=3*rho_ice/rho_earth*area/ eartharea*I*U_elastic[i];5435 N_values[i]+=3*rho_ice/rho_earth*area/ eartharea*I*N_elastic[i];5436 E_values[i]+=3*rho_ice/rho_earth*area/ eartharea*I*E_elastic[i];5436 U_values[i]+=3*rho_ice/rho_earth*area/planetarea*I*U_elastic[i]; 5437 N_values[i]+=3*rho_ice/rho_earth*area/planetarea*I*N_elastic[i]; 5438 E_values[i]+=3*rho_ice/rho_earth*area/planetarea*I*E_elastic[i]; 5437 5439 } 5438 5440 pUp->SetValues(gsize,indices,U_values,ADD_VAL); … … 5479 5481 5480 5482 /*Compute area of element:*/ 5481 IssmDouble area, eartharea;5483 IssmDouble area,planetarea; 5482 5484 this->GetInput2Value(&area,AreaEnum); 5483 5485 5484 5486 /*recover earth area: */ 5485 this->parameters->FindParam(& eartharea,SealevelEarthAreaEnum);5487 this->parameters->FindParam(&planetarea,SealevelPlanetAreaEnum); 5486 5488 5487 5489 /*Compute lat,long,radius of elemental centroid: */ … … 5541 5543 * ALL in geographic coordinates 5542 5544 * */ 5543 dI_list[0] = -4*PI*(rho_water*S*area)*pow(re,4)*(sin(late)*cos(late)*cos(longe))/ eartharea;5544 dI_list[1] = -4*PI*(rho_water*S*area)*pow(re,4)*(sin(late)*cos(late)*sin(longe))/ eartharea;5545 dI_list[2] = +4*PI*(rho_water*S*area)*pow(re,4)*(1-pow(sin(late),2))/ eartharea;5545 dI_list[0] = -4*PI*(rho_water*S*area)*pow(re,4)*(sin(late)*cos(late)*cos(longe))/planetarea; 5546 dI_list[1] = -4*PI*(rho_water*S*area)*pow(re,4)*(sin(late)*cos(late)*sin(longe))/planetarea; 5547 dI_list[2] = +4*PI*(rho_water*S*area)*pow(re,4)*(1-pow(sin(late),2))/planetarea; 5546 5548 } 5547 5549 else if(masks->isiceonly[this->lid]){ … … 5556 5558 deltathickness_input->GetInputAverage(&I); 5557 5559 5558 dI_list[0] = -4*PI*(rho_ice*I*area)*pow(re,4)*(sin(late)*cos(late)*cos(longe))/ eartharea;5559 dI_list[1] = -4*PI*(rho_ice*I*area)*pow(re,4)*(sin(late)*cos(late)*sin(longe))/ eartharea;5560 dI_list[2] = +4*PI*(rho_ice*I*area)*pow(re,4)*(1-pow(sin(late),2))/ eartharea;5560 dI_list[0] = -4*PI*(rho_ice*I*area)*pow(re,4)*(sin(late)*cos(late)*cos(longe))/planetarea; 5561 dI_list[1] = -4*PI*(rho_ice*I*area)*pow(re,4)*(sin(late)*cos(late)*sin(longe))/planetarea; 5562 dI_list[2] = +4*PI*(rho_ice*I*area)*pow(re,4)*(1-pow(sin(late),2))/planetarea; 5561 5563 } 5562 5564 … … 5585 5587 IssmDouble llr_list[NUMVERTICES][3]; 5586 5588 IssmDouble xyz_list[NUMVERTICES][3]; 5587 IssmDouble area, eartharea;5589 IssmDouble area,planetarea,planetradius; 5588 5590 IssmDouble I; //change in ice thickness or water level(Farrel and Clarke, Equ. 4) 5589 5591 IssmDouble rho_earth; … … 5617 5619 this->parameters->FindParam(&computeelastic,SealevelriseElasticEnum); 5618 5620 this->parameters->FindParam(&gsize,MeshNumberofverticesEnum); 5619 this->parameters->FindParam(&eartharea,SealevelEarthAreaEnum); 5621 this->parameters->FindParam(&planetarea,SealevelPlanetAreaEnum); 5622 this->parameters->FindParam(&planetradius,SealevelPlanetRadiusEnum); 5620 5623 this->parameters->FindParam(&horiz,SealevelriseHorizEnum); 5621 5624 … … 5645 5648 area=GetAreaSpherical(); 5646 5649 5650 5651 /* Where is the centroid of this element:*/ 5652 5653 /*retrieve coordinates: */ 5654 ::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES); 5655 5647 5656 /*figure out gravity center of our element (Cartesian): */ 5648 ::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);5649 5657 x_element=(xyz_list[0][0]+xyz_list[1][0]+xyz_list[2][0])/3.0; 5650 5658 y_element=(xyz_list[0][1]+xyz_list[1][1]+xyz_list[2][1])/3.0; 5651 5659 z_element=(xyz_list[0][2]+xyz_list[1][2]+xyz_list[2][2])/3.0; 5652 5660 5653 /* Where is the centroid of this element?:{{{*/ 5654 5655 /*retrieve coordinates: */ 5656 ::GetVerticesCoordinates(&llr_list[0][0],this->vertices,NUMVERTICES,spherical); 5657 5658 IssmDouble minlong=400; 5659 IssmDouble maxlong=-20; 5660 for (int i=0;i<NUMVERTICES;i++){ 5661 llr_list[i][0]=(90-llr_list[i][0]); 5662 if(llr_list[i][1]<0)llr_list[i][1]=180+(180+llr_list[i][1]); 5663 if(llr_list[i][1]>maxlong)maxlong=llr_list[i][1]; 5664 if(llr_list[i][1]<minlong)minlong=llr_list[i][1]; 5665 } 5666 if(minlong==0 && maxlong>180){ 5667 if (llr_list[0][1]==0)llr_list[0][1]=360; 5668 if (llr_list[1][1]==0)llr_list[1][1]=360; 5669 if (llr_list[2][1]==0)llr_list[2][1]=360; 5670 } 5671 5672 // correction at the north pole 5673 if(llr_list[0][0]==0)llr_list[0][1]=(llr_list[1][1]+llr_list[2][1])/2.0; 5674 if(llr_list[1][0]==0)llr_list[1][1]=(llr_list[0][1]+llr_list[2][1])/2.0; 5675 if(llr_list[2][0]==0)llr_list[2][1]=(llr_list[0][1]+llr_list[1][1])/2.0; 5676 5677 //correction at the south pole 5678 if(llr_list[0][0]==180)llr_list[0][1]=(llr_list[1][1]+llr_list[2][1])/2.0; 5679 if(llr_list[1][0]==180)llr_list[1][1]=(llr_list[0][1]+llr_list[2][1])/2.0; 5680 if(llr_list[2][0]==180)llr_list[2][1]=(llr_list[0][1]+llr_list[1][1])/2.0; 5681 5682 late=(llr_list[0][0]+llr_list[1][0]+llr_list[2][0])/3.0; 5683 longe=(llr_list[0][1]+llr_list[1][1]+llr_list[2][1])/3.0; 5684 5685 late=90-late; 5686 if(longe>180)longe=(longe-180)-180; 5687 5688 late=late/180*PI; 5689 longe=longe/180*PI; 5690 /*}}}*/ 5691 5692 constant=3/rho_earth*area/eartharea; 5661 /*compute gravity center in lat,long: */ 5662 late= asin(z_element/planetradius); 5663 longe = atan2(y_element,x_element); 5664 5665 constant=3/rho_earth*area/planetarea; 5693 5666 5694 5667 for(int i=0;i<gsize;i++){ … … 5698 5671 /*Compute alpha angle between centroid and current vertex and index into precomputed tables: */ 5699 5672 lati=latitude[i]/180*PI; longi=longitude[i]/180*PI; 5700 delPhi=fabs(lati-late); delLambda=fabs(longi-longe); 5673 delPhi=fabs(lati-late); delLambda=fabs(longi-longe); if (delLambda>PI)delLambda=2*PI-delLambda; 5701 5674 alpha=2.*asin(sqrt(pow(sin(delPhi/2),2)+cos(lati)*cos(late)*pow(sin(delLambda/2),2))); 5702 5675 indices[i]=alpha/PI*reCast<IssmDouble,int>(M-1); … … 5904 5877 bool spherical=true; 5905 5878 IssmDouble llr_list[NUMVERTICES][3]; 5906 IssmDouble area, eartharea;5879 IssmDouble area,planetarea; 5907 5880 IssmDouble I; //change in ice thickness or water level(Farrel and Clarke, Equ. 4) 5908 5881 IssmDouble rho; … … 5939 5912 5940 5913 /*recover earth area: */ 5941 this->parameters->FindParam(& eartharea,SealevelEarthAreaEnum);5914 this->parameters->FindParam(&planetarea,SealevelPlanetAreaEnum); 5942 5915 5943 5916 /*recover love numbers and computational flags: */ … … 6038 6011 6039 6012 /*Add all components to the pSgi or pSgo solution vectors:*/ 6040 Sgi[i]+=3*rho_water/rho_earth*area/ eartharea*I*(G_rigid+G_elastic);6013 Sgi[i]+=3*rho_water/rho_earth*area/planetarea*I*(G_rigid+G_elastic); 6041 6014 } 6042 6015 } -
issm/trunk-jpl/src/c/shared/Enum/Enum.vim
r24947 r24959 302 302 syn keyword cConstant RootPathEnum 303 303 syn keyword cConstant SaveResultsEnum 304 syn keyword cConstant SealevelEarthAreaEnum 304 syn keyword cConstant SealevelPlanetRadiusEnum 305 syn keyword cConstant SealevelPlanetAreaEnum 305 306 syn keyword cConstant SealevelEustaticEnum 306 307 syn keyword cConstant SealevelriseAbstolEnum -
issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
r24947 r24959 296 296 RootPathEnum, 297 297 SaveResultsEnum, 298 SealevelEarthAreaEnum, 298 SealevelPlanetRadiusEnum, 299 SealevelPlanetAreaEnum, 299 300 SealevelEustaticEnum, 300 301 SealevelriseAbstolEnum, -
issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
r24947 r24959 304 304 case RootPathEnum : return "RootPath"; 305 305 case SaveResultsEnum : return "SaveResults"; 306 case SealevelEarthAreaEnum : return "SealevelEarthArea"; 306 case SealevelPlanetRadiusEnum : return "SealevelPlanetRadius"; 307 case SealevelPlanetAreaEnum : return "SealevelPlanetArea"; 307 308 case SealevelEustaticEnum : return "SealevelEustatic"; 308 309 case SealevelriseAbstolEnum : return "SealevelriseAbstol"; -
issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
r24947 r24959 310 310 else if (strcmp(name,"RootPath")==0) return RootPathEnum; 311 311 else if (strcmp(name,"SaveResults")==0) return SaveResultsEnum; 312 else if (strcmp(name,"SealevelEarthArea")==0) return SealevelEarthAreaEnum; 312 else if (strcmp(name,"SealevelPlanetRadius")==0) return SealevelPlanetRadiusEnum; 313 else if (strcmp(name,"SealevelPlanetArea")==0) return SealevelPlanetAreaEnum; 313 314 else if (strcmp(name,"SealevelEustatic")==0) return SealevelEustaticEnum; 314 315 else if (strcmp(name,"SealevelriseAbstol")==0) return SealevelriseAbstolEnum; … … 382 383 else if (strcmp(name,"SmbNumRequestedOutputs")==0) return SmbNumRequestedOutputsEnum; 383 384 else if (strcmp(name,"SmbPfac")==0) return SmbPfacEnum; 384 else if (strcmp(name,"SmbRdl")==0) return SmbRdlEnum;385 385 else stage=4; 386 386 } 387 387 if(stage==4){ 388 if (strcmp(name,"SmbRequestedOutputs")==0) return SmbRequestedOutputsEnum; 388 if (strcmp(name,"SmbRdl")==0) return SmbRdlEnum; 389 else if (strcmp(name,"SmbRequestedOutputs")==0) return SmbRequestedOutputsEnum; 389 390 else if (strcmp(name,"SmbRlaps")==0) return SmbRlapsEnum; 390 391 else if (strcmp(name,"SmbRlapslgm")==0) return SmbRlapslgmEnum; … … 505 506 else if (strcmp(name,"BedSlopeY")==0) return BedSlopeYEnum; 506 507 else if (strcmp(name,"CalvingCalvingrate")==0) return CalvingCalvingrateEnum; 507 else if (strcmp(name,"CalvingHabFraction")==0) return CalvingHabFractionEnum;508 508 else stage=5; 509 509 } 510 510 if(stage==5){ 511 if (strcmp(name,"CalvingMeltingrate")==0) return CalvingMeltingrateEnum; 511 if (strcmp(name,"CalvingHabFraction")==0) return CalvingHabFractionEnum; 512 else if (strcmp(name,"CalvingMeltingrate")==0) return CalvingMeltingrateEnum; 512 513 else if (strcmp(name,"CalvingStressThresholdFloatingice")==0) return CalvingStressThresholdFloatingiceEnum; 513 514 else if (strcmp(name,"CalvingStressThresholdGroundedice")==0) return CalvingStressThresholdGroundediceEnum; … … 628 629 else if (strcmp(name,"Ice")==0) return IceEnum; 629 630 else if (strcmp(name,"IceMaskNodeActivation")==0) return IceMaskNodeActivationEnum; 630 else if (strcmp(name,"Input")==0) return InputEnum;631 631 else stage=6; 632 632 } 633 633 if(stage==6){ 634 if (strcmp(name,"InversionCostFunctionsCoefficients")==0) return InversionCostFunctionsCoefficientsEnum; 634 if (strcmp(name,"Input")==0) return InputEnum; 635 else if (strcmp(name,"InversionCostFunctionsCoefficients")==0) return InversionCostFunctionsCoefficientsEnum; 635 636 else if (strcmp(name,"InversionSurfaceObs")==0) return InversionSurfaceObsEnum; 636 637 else if (strcmp(name,"InversionThicknessObs")==0) return InversionThicknessObsEnum; … … 751 752 else if (strcmp(name,"SmbGsp")==0) return SmbGspEnum; 752 753 else if (strcmp(name,"SmbGspini")==0) return SmbGspiniEnum; 753 else if (strcmp(name,"SmbHref")==0) return SmbHrefEnum;754 754 else stage=7; 755 755 } 756 756 if(stage==7){ 757 if (strcmp(name,"SmbIsInitialized")==0) return SmbIsInitializedEnum; 757 if (strcmp(name,"SmbHref")==0) return SmbHrefEnum; 758 else if (strcmp(name,"SmbIsInitialized")==0) return SmbIsInitializedEnum; 758 759 else if (strcmp(name,"SmbMAdd")==0) return SmbMAddEnum; 759 760 else if (strcmp(name,"SmbMassBalanceClimate")==0) return SmbMassBalanceClimateEnum; … … 874 875 else if (strcmp(name,"Waterheight")==0) return WaterheightEnum; 875 876 else if (strcmp(name,"WeightsSurfaceObservation")==0) return WeightsSurfaceObservationEnum; 876 else if (strcmp(name,"Outputdefinition1")==0) return Outputdefinition1Enum;877 877 else stage=8; 878 878 } 879 879 if(stage==8){ 880 if (strcmp(name,"Outputdefinition10")==0) return Outputdefinition10Enum; 880 if (strcmp(name,"Outputdefinition1")==0) return Outputdefinition1Enum; 881 else if (strcmp(name,"Outputdefinition10")==0) return Outputdefinition10Enum; 881 882 else if (strcmp(name,"Outputdefinition11")==0) return Outputdefinition11Enum; 882 883 else if (strcmp(name,"Outputdefinition12")==0) return Outputdefinition12Enum; … … 997 998 else if (strcmp(name,"BalancethicknessSolution")==0) return BalancethicknessSolutionEnum; 998 999 else if (strcmp(name,"BalancethicknessSpcthickness")==0) return BalancethicknessSpcthicknessEnum; 999 else if (strcmp(name,"BalancevelocityAnalysis")==0) return BalancevelocityAnalysisEnum;1000 1000 else stage=9; 1001 1001 } 1002 1002 if(stage==9){ 1003 if (strcmp(name,"BalancevelocitySolution")==0) return BalancevelocitySolutionEnum; 1003 if (strcmp(name,"BalancevelocityAnalysis")==0) return BalancevelocityAnalysisEnum; 1004 else if (strcmp(name,"BalancevelocitySolution")==0) return BalancevelocitySolutionEnum; 1004 1005 else if (strcmp(name,"BasalforcingsIsmip6")==0) return BasalforcingsIsmip6Enum; 1005 1006 else if (strcmp(name,"BasalforcingsPico")==0) return BasalforcingsPicoEnum; … … 1120 1121 else if (strcmp(name,"HydrologySolution")==0) return HydrologySolutionEnum; 1121 1122 else if (strcmp(name,"Hydrologydc")==0) return HydrologydcEnum; 1122 else if (strcmp(name,"Hydrologypism")==0) return HydrologypismEnum;1123 1123 else stage=10; 1124 1124 } 1125 1125 if(stage==10){ 1126 if (strcmp(name,"Hydrologyshakti")==0) return HydrologyshaktiEnum; 1126 if (strcmp(name,"Hydrologypism")==0) return HydrologypismEnum; 1127 else if (strcmp(name,"Hydrologyshakti")==0) return HydrologyshaktiEnum; 1127 1128 else if (strcmp(name,"Hydrologyshreve")==0) return HydrologyshreveEnum; 1128 1129 else if (strcmp(name,"IceMass")==0) return IceMassEnum; … … 1243 1244 else if (strcmp(name,"P2bubblecondensed")==0) return P2bubblecondensedEnum; 1244 1245 else if (strcmp(name,"P2xP1")==0) return P2xP1Enum; 1245 else if (strcmp(name,"P2xP4")==0) return P2xP4Enum;1246 1246 else stage=11; 1247 1247 } 1248 1248 if(stage==11){ 1249 if (strcmp(name,"Paterson")==0) return PatersonEnum; 1249 if (strcmp(name,"P2xP4")==0) return P2xP4Enum; 1250 else if (strcmp(name,"Paterson")==0) return PatersonEnum; 1250 1251 else if (strcmp(name,"Pengrid")==0) return PengridEnum; 1251 1252 else if (strcmp(name,"Penpair")==0) return PenpairEnum; … … 1366 1367 else if (strcmp(name,"StressbalanceViscosityOvershoot")==0) return StressbalanceViscosityOvershootEnum; 1367 1368 else if (strcmp(name,"SubelementMigration4")==0) return SubelementMigration4Enum; 1368 else if (strcmp(name,"TimesteppingTimeAdapt")==0) return TimesteppingTimeAdaptEnum;1369 1369 else stage=12; 1370 1370 } 1371 1371 if(stage==12){ 1372 if (strcmp(name,"TriangleInterp")==0) return TriangleInterpEnum; 1372 if (strcmp(name,"TimesteppingTimeAdapt")==0) return TimesteppingTimeAdaptEnum; 1373 else if (strcmp(name,"TriangleInterp")==0) return TriangleInterpEnum; 1373 1374 else if (strcmp(name,"MaximumNumberOfDefinitions")==0) return MaximumNumberOfDefinitionsEnum; 1374 1375 else stage=13;
Note:
See TracChangeset
for help on using the changeset viewer.