Changeset 22181
- Timestamp:
- 10/20/17 16:28:00 (7 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
r22044 r22181 68 68 iomodel->FetchDataToInput(elements,"md.calving.meltingrate",CalvingMeltingrateEnum); 69 69 break; 70 case CalvingHabEnum: 71 iomodel->FetchDataToInput(elements,"md.calving.meltingrate",CalvingMeltingrateEnum); 72 break; 73 case CalvingCrevasseDepthEnum: 74 iomodel->FetchDataToInput(elements,"md.calving.meltingrate",CalvingMeltingrateEnum); 75 iomodel->FetchDataToInput(elements,"md.calving.water_height",WaterheightEnum); 76 break; 70 77 default: 71 78 _error_("Calving law "<<EnumToStringx(calvinglaw)<<" not supported yet"); … … 86 93 case CalvingMinthicknessEnum: 87 94 parameters->AddObject(iomodel->CopyConstantObject("md.calving.min_thickness",CalvingMinthicknessEnum)); 95 break; 96 case CalvingHabEnum: 97 parameters->AddObject(iomodel->CopyConstantObject("md.calving.flotation_fraction",CalvingHabEnum)); 98 break; 99 case CalvingCrevasseDepthEnum: 100 parameters->AddObject(iomodel->CopyConstantObject("md.calving.critical_fraction",CalvingCrevasseDepthEnum)); 88 101 break; 89 102 default: … … 235 248 meltingrate_input = basalelement->GetInput(CalvingMeltingrateEnum); _assert_(meltingrate_input); 236 249 break; 250 case CalvingHabEnum: 251 lsf_slopex_input = basalelement->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input); 252 if(dim==2) lsf_slopey_input = basalelement->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input); 253 meltingrate_input = basalelement->GetInput(CalvingMeltingrateEnum); _assert_(meltingrate_input); 254 break; 255 case CalvingCrevasseDepthEnum: 256 lsf_slopex_input = basalelement->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input); 257 if(dim==2) lsf_slopey_input = basalelement->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input); 258 calvingrate_input = basalelement->GetInput(CalvingCalvingrateEnum); _assert_(calvingrate_input); 259 meltingrate_input = basalelement->GetInput(CalvingMeltingrateEnum); _assert_(meltingrate_input); 260 break; 237 261 default: 238 262 _error_("Calving law "<<EnumToStringx(calvinglaw)<<" not supported yet"); … … 314 338 for(i=0;i<dim;i++){ 315 339 c[i]=0.; 340 m[i]=meltingrate*dlsf[i]/norm_dlsf; 341 } 342 else 343 for(i=0;i<dim;i++){ 344 c[i]=0.; 345 m[i]=0.; 346 } 347 break; 348 349 case CalvingHabEnum: 350 lsf_slopex_input->GetInputValue(&dlsf[0],gauss); 351 if(dim==2) lsf_slopey_input->GetInputValue(&dlsf[1],gauss); 352 meltingrate_input->GetInputValue(&meltingrate,gauss); 353 354 norm_dlsf=0.; 355 for(i=0;i<dim;i++) norm_dlsf+=pow(dlsf[i],2); 356 norm_dlsf=sqrt(norm_dlsf); 357 358 if(norm_dlsf>1.e-10) 359 for(i=0;i<dim;i++){ 360 c[i]=0.; 361 m[i]=meltingrate*dlsf[i]/norm_dlsf; 362 } 363 else 364 for(i=0;i<dim;i++){ 365 c[i]=0.; 366 m[i]=0.; 367 } 368 break; 369 370 case CalvingCrevasseDepthEnum: 371 lsf_slopex_input->GetInputValue(&dlsf[0],gauss); 372 if(dim==2) lsf_slopey_input->GetInputValue(&dlsf[1],gauss); 373 calvingrate_input->GetInputValue(&calvingrate,gauss); 374 meltingrate_input->GetInputValue(&meltingrate,gauss); 375 376 /*Limit calving rate to c <= v + 3 km/yr */ 377 vel=sqrt(v[0]*v[0] + v[1]*v[1]); 378 if(calvingrate>calvingmax+vel) calvingrate = vel+calvingmax; 379 if(groundedice<0) meltingrate = 0.; 380 381 norm_dlsf=0.; 382 for(i=0;i<dim;i++) norm_dlsf+=pow(dlsf[i],2); 383 norm_dlsf=sqrt(norm_dlsf); 384 385 if(norm_dlsf>1.e-10) 386 for(i=0;i<dim;i++){ 387 c[i]=calvingrate*dlsf[i]/norm_dlsf; 316 388 m[i]=meltingrate*dlsf[i]/norm_dlsf; 317 389 } … … 608 680 /*Intermediaries*/ 609 681 int calvinglaw; 610 IssmDouble min_thickness,thickness; 682 IssmDouble min_thickness,thickness,flotation_fraction; 683 IssmDouble rho_ice,rho_water,constant_g,rheology_B,rheology_n; 684 IssmDouble bed,water_depth; 685 611 686 femmodel->parameters->FindParam(&calvinglaw,CalvingLawEnum); 612 687 … … 640 715 } 641 716 } 717 718 if(calvinglaw==CalvingHabEnum){ 719 720 /*Get the fraction of the flotation thickness at the terminus*/ 721 femmodel->parameters->FindParam(&flotation_fraction,CalvingHabEnum); 722 723 /*Loop over all elements of this partition*/ 724 for(int i=0;i<femmodel->elements->Size();i++){ 725 Element* element = xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i)); 726 727 rho_ice = element->GetMaterialParameter(MaterialsRhoIceEnum); 728 rho_water = element->GetMaterialParameter(MaterialsRhoSeawaterEnum); 729 730 int numnodes = element->GetNumberOfNodes(); 731 Gauss* gauss = element->NewGauss(); 732 Input* H_input = element->GetInput(ThicknessEnum); _assert_(H_input); 733 Input* bed = element->GetInput(BedEnum); _assert_(bed); 734 735 /*Potentially constrain nodes of this element*/ 736 for(int in=0;in<numnodes;in++){ 737 gauss->GaussNode(element->GetElementType(),in); 738 Node* node=element->GetNode(in); 739 H_input->GetInputValue(&thickness,gauss); 740 bed->GetInputValue(&water_depth,gauss); 741 if(thickness<((rho_water/rho_ice)*(1+flotation_fraction)*-water_depth)){ 742 node->ApplyConstraint(0,+1.); 743 } 744 else { 745 /* no ice, set no spc */ 746 node->DofInFSet(0); 747 } 748 } 749 delete gauss; 750 } 751 } 752 642 753 /*Default, do nothing*/ 643 754 return; -
issm/trunk-jpl/src/c/classes/Elements/Element.cpp
r22136 r22181 2356 2356 this->CalvingRateDev(); 2357 2357 break; 2358 case CalvingCrevasseDepthEnum: 2359 this->CalvingCrevasseDepth(); 2360 break; 2358 2361 default: 2359 2362 _error_("Calving law "<<EnumToStringx(calvinglaw)<<" not supported yet"); … … 2362 2365 case StrainRateparallelEnum: this->StrainRateparallel(); break; 2363 2366 case StrainRateperpendicularEnum: this->StrainRateperpendicular(); break; 2367 case SurfaceCrevasseEnum: this->CalvingCrevasseDepth(); break; 2368 case SigmaVMEnum: this->CalvingRateDev(); break; 2364 2369 } 2365 2370 -
issm/trunk-jpl/src/c/classes/Elements/Element.h
r22012 r22181 189 189 virtual void BasalNodeIndices(int* pnumindices,int** pindices,int finiteelement){_error_("not implemented yet");}; 190 190 virtual void CalvingRateDev(void){_error_("not implemented yet");}; 191 virtual void CalvingCrevasseDepth(void){_error_("not implemented yet");}; 191 192 virtual void CalvingRateLevermann(void)=0; 192 193 virtual IssmDouble CharacteristicLength(void)=0; -
issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
r22178 r22181 216 216 IssmDouble calvingrate[NUMVERTICES]; 217 217 IssmDouble lambda1,lambda2,ex,ey,vx,vy,vel; 218 IssmDouble sigma_vm,sigma_max,sigma_max_floating,sigma_max_grounded; 218 IssmDouble sigma_vm[NUMVERTICES]; 219 IssmDouble sigma_max,sigma_max_floating,sigma_max_grounded; 219 220 IssmDouble epse_2,groundedice,bed; 220 221 … … 260 261 /*Calculate sigma_vm*/ 261 262 epse_2 = 1./2. *(lambda1*lambda1 + lambda2*lambda2); 262 sigma_vm = sqrt(3.) * B * pow(epse_2,1./(2.*n));263 sigma_vm[iv] = sqrt(3.) * B * pow(epse_2,1./(2.*n)); 263 264 264 265 /*OLD (keep for a little bit)*/ … … 279 280 } 280 281 else{ 281 calvingratex[iv]=vx*sigma_vm /sigma_max;282 calvingratey[iv]=vy*sigma_vm /sigma_max;282 calvingratex[iv]=vx*sigma_vm[iv]/sigma_max; 283 calvingratey[iv]=vy*sigma_vm[iv]/sigma_max; 283 284 } 284 285 calvingrate[iv] =sqrt(calvingratex[iv]*calvingratex[iv] + calvingratey[iv]*calvingratey[iv]); … … 289 290 this->inputs->AddInput(new TriaInput(CalvingrateyEnum,&calvingratey[0],P1Enum)); 290 291 this->inputs->AddInput(new TriaInput(CalvingCalvingrateEnum,&calvingrate[0],P1Enum)); 292 this->inputs->AddInput(new TriaInput(SigmaVMEnum,&sigma_vm[0],P1Enum)); 291 293 292 294 /*Clean up and return*/ 295 delete gauss; 296 } 297 /*}}}*/ 298 void Tria::CalvingCrevasseDepth(){/*{{{*/ 299 300 IssmDouble xyz_list[NUMVERTICES][3]; 301 IssmDouble calvingrate[NUMVERTICES]; 302 IssmDouble vx,vy,vel; 303 IssmDouble critical_fraction,water_height; 304 IssmDouble bathymetry,Ho,thickness,float_depth,groundedice; 305 IssmDouble surface_crevasse[NUMVERTICES], basal_crevasse[NUMVERTICES], crevasse_depth[NUMVERTICES], H_surf, H_surfbasal; 306 IssmDouble strainparallel, straineffective; 307 IssmDouble yts; 308 309 /* Get node coordinates and dof list: */ 310 ::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES); 311 312 /*Get the critical fraction of thickness surface and basal crevasses penetrate for calving onset*/ 313 this->parameters->FindParam(&critical_fraction,CalvingCrevasseDepthEnum); 314 this->parameters->FindParam(&yts,ConstantsYtsEnum); 315 316 IssmDouble rho_ice = this->GetMaterialParameter(MaterialsRhoIceEnum); 317 IssmDouble rho_seawater = this->GetMaterialParameter(MaterialsRhoSeawaterEnum); 318 IssmDouble rho_freshwater = this->GetMaterialParameter(MaterialsRhoFreshwaterEnum); 319 IssmDouble constant_g = this->GetMaterialParameter(ConstantsGEnum); 320 IssmDouble rheology_B = this->GetMaterialParameter(MaterialsRheologyBbarEnum); 321 IssmDouble rheology_n = this->GetMaterialParameter(MaterialsRheologyNEnum); 322 323 Input* H_input = inputs->GetInput(ThicknessEnum); _assert_(H_input); 324 Input* bed = inputs->GetInput(BedEnum); _assert_(bed); 325 Input* surface = inputs->GetInput(SurfaceEnum); _assert_(surface); 326 Input* strainrateparallel = inputs->GetInput(StrainRateparallelEnum); _assert_(strainrateparallel); 327 Input* strainrateeffective = inputs->GetInput(StrainRateeffectiveEnum); _assert_(strainrateeffective); 328 Input* vx_input = inputs->GetInput(VxEnum); _assert_(vx_input); 329 Input* vy_input = inputs->GetInput(VxEnum); _assert_(vy_input); 330 Input* gr_input = inputs->GetInput(MaskGroundediceLevelsetEnum); _assert_(gr_input); 331 Input* waterheight_input = inputs->GetInput(WaterheightEnum); _assert_(waterheight_input); 332 333 /*Loop over all elements of this partition*/ 334 GaussTria* gauss=new GaussTria(); 335 for (int iv=0;iv<NUMVERTICES;iv++){ 336 gauss->GaussVertex(iv); 337 338 H_input->GetInputValue(&thickness,gauss); 339 bed->GetInputValue(&bathymetry,gauss); 340 surface->GetInputValue(&float_depth,gauss); 341 strainrateparallel->GetInputValue(&strainparallel,gauss); 342 strainrateeffective->GetInputValue(&straineffective,gauss); 343 vx_input->GetInputValue(&vx,gauss); 344 vy_input->GetInputValue(&vy,gauss); 345 gr_input->GetInputValue(&groundedice,gauss); 346 waterheight_input->GetInputValue(&water_height,gauss); 347 vel=sqrt(vx*vx+vy*vy)+1.e-14; 348 349 Ho = thickness - (rho_seawater/rho_ice) * (-bathymetry); 350 if(Ho<0.) Ho=0.; 351 352 /*Otero2010: balance between the tensile deviatoric stress and ice overburden pressure*/ 353 /*surface crevasse*/ 354 //surface_crevasse[iv] = rheology_B * strainparallel * pow(straineffective, ((1 / rheology_n)-1)) / (rho_ice * constant_g); 355 surface_crevasse[iv] = 2 * rheology_B * pow(max(strainparallel,0.),(1/rheology_n)) / (rho_ice * constant_g); 356 if (surface_crevasse[iv]<0.) { 357 surface_crevasse[iv]=0.; 358 water_height = 0.; 359 } 360 if (surface_crevasse[iv]<water_height){ 361 water_height = surface_crevasse[iv]; 362 } 363 364 /*basal crevasse*/ 365 //basal_crevasse[iv] = (rho_ice/(rho_seawater-rho_ice)) * (rheology_B * strainparallel * pow(straineffective,((1/rheology_n)-1)) / (rho_ice*constant_g) - Ho); 366 basal_crevasse[iv] = (rho_ice/(rho_seawater-rho_ice)) * (2 * rheology_B * pow(max(strainparallel,0.),(1/rheology_n)) / (rho_ice*constant_g) - Ho); 367 if (basal_crevasse[iv]<0.) basal_crevasse[iv]=0.; 368 if (bathymetry>0.) basal_crevasse[iv] = 0.; 369 370 H_surf = surface_crevasse[iv] + (rho_freshwater/rho_ice)*water_height - critical_fraction*float_depth; 371 H_surfbasal = (surface_crevasse[iv] + (rho_freshwater/rho_ice)*water_height + basal_crevasse[iv])-(critical_fraction*thickness); 372 373 crevasse_depth[iv] = max(H_surf,H_surfbasal); 374 375 /*Assign values */ 376 if(crevasse_depth[iv]>=0. && bathymetry<=0.){ 377 calvingrate[iv] = vel+3000./yts; 378 } 379 else 380 calvingrate[iv]=0.; 381 } 382 383 this->inputs->AddInput(new TriaInput(SurfaceCrevasseEnum,&surface_crevasse[0],P1Enum)); 384 this->inputs->AddInput(new TriaInput(BasalCrevasseEnum,&basal_crevasse[0],P1Enum)); 385 this->inputs->AddInput(new TriaInput(CrevasseDepthEnum,&crevasse_depth[0],P1Enum)); 386 this->inputs->AddInput(new TriaInput(CalvingCalvingrateEnum,&calvingrate[0],P1Enum)); 387 293 388 delete gauss; 294 389 } … … 331 426 332 427 /*Calving rate proportionnal to the positive product of the strain rate along the ice flow direction and the strain rate perpendicular to the ice flow */ 333 calvingrate[iv]=propcoeff*strainparallel*strainperpendicular; 334 if(calvingrate[iv]<0. || bed>0.){ 428 if(strainparallel>0. && strainperpendicular>0. && bed<=0.){ 429 calvingrate[iv]=propcoeff*strainparallel*strainperpendicular; 430 } 431 else 335 432 calvingrate[iv]=0.; 336 }433 337 434 calvingratex[iv]=calvingrate[iv]*vx/(sqrt(vel)+1.e-14); 338 435 calvingratey[iv]=calvingrate[iv]*vy/(sqrt(vel)+1.e-14); -
issm/trunk-jpl/src/c/classes/Elements/Tria.h
r21931 r22181 53 53 void AverageOntoPartition(Vector<IssmDouble>* partition_contributions,Vector<IssmDouble>* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part); 54 54 void CalvingRateDev(); 55 void CalvingCrevasseDepth(); 55 56 void CalvingRateLevermann(); 56 57 IssmDouble CharacteristicLength(void); -
issm/trunk-jpl/src/c/classes/FemModel.cpp
r22116 r22181 1940 1940 } 1941 1941 /*}}}*/ 1942 void FemModel::StrainRateeffectivex(){/*{{{*/ 1943 1944 for(int i=0;i<elements->Size();i++){ 1945 Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i)); 1946 element->ComputeStrainRate(); 1947 } 1948 } 1949 /*}}}*/ 1942 1950 void FemModel::StressIntensityFactorx(){/*{{{*/ 1943 1951 -
issm/trunk-jpl/src/c/classes/FemModel.h
r22100 r22181 110 110 void StrainRateparallelx(); 111 111 void StrainRateperpendicularx(); 112 void StrainRateeffectivex(); 112 113 void StressIntensityFactorx(); 113 114 void TotalFloatingBmbx(IssmDouble* pFbmb); -
issm/trunk-jpl/src/c/modules/Calvingx/Calvingx.cpp
r20723 r22181 18 18 case CalvingMinthicknessEnum: 19 19 break; 20 case CalvingHabEnum: 21 break; 22 case CalvingCrevasseDepthEnum: 23 femmodel->StrainRateparallelx(); 24 femmodel->StrainRateeffectivex(); 25 femmodel->ElementOperationx(&Element::CalvingCrevasseDepth); 26 break; 20 27 case CalvingLevermannEnum: 21 28 if(VerboseModule()) _printf0_(" computing Levermann's calving rate\n"); -
issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
r22100 r22181 258 258 CalvingDevEnum, 259 259 CalvingMinthicknessEnum, 260 CalvingHabEnum, 261 CalvingCrevasseDepthEnum, 262 SurfaceCrevasseEnum, 263 BasalCrevasseEnum, 264 CrevasseDepthEnum, 265 WaterheightEnum, 260 266 DefaultCalvingEnum, 261 267 CalvinglevermannCoeffEnum, … … 269 275 CalvingStressThresholdFloatingiceEnum, 270 276 CalvingMaxEnum, 277 SigmaVMEnum, 271 278 StrainRateparallelEnum, 272 279 StrainRateperpendicularEnum, -
issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
r22100 r22181 264 264 case CalvingDevEnum : return "CalvingDev"; 265 265 case CalvingMinthicknessEnum : return "CalvingMinthickness"; 266 case CalvingHabEnum : return "CalvingHab"; 267 case CalvingCrevasseDepthEnum : return "CalvingCrevasseDepth"; 268 case SurfaceCrevasseEnum : return "SurfaceCrevasse"; 269 case BasalCrevasseEnum : return "BasalCrevasse"; 270 case CrevasseDepthEnum : return "CrevasseDepth"; 271 case WaterheightEnum : return "Waterheight"; 266 272 case DefaultCalvingEnum : return "DefaultCalving"; 267 273 case CalvinglevermannCoeffEnum : return "CalvinglevermannCoeff"; … … 275 281 case CalvingStressThresholdFloatingiceEnum : return "CalvingStressThresholdFloatingice"; 276 282 case CalvingMaxEnum : return "CalvingMax"; 283 case SigmaVMEnum : return "SigmaVM"; 277 284 case StrainRateparallelEnum : return "StrainRateparallel"; 278 285 case StrainRateperpendicularEnum : return "StrainRateperpendicular"; -
issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
r22100 r22181 270 270 else if (strcmp(name,"CalvingDev")==0) return CalvingDevEnum; 271 271 else if (strcmp(name,"CalvingMinthickness")==0) return CalvingMinthicknessEnum; 272 else stage=3; 273 } 274 if(stage==3){ 275 if (strcmp(name,"CalvingHab")==0) return CalvingHabEnum; 276 else if (strcmp(name,"CalvingCrevasseDepth")==0) return CalvingCrevasseDepthEnum; 277 else if (strcmp(name,"SurfaceCrevasse")==0) return SurfaceCrevasseEnum; 278 else if (strcmp(name,"BasalCrevasse")==0) return BasalCrevasseEnum; 279 else if (strcmp(name,"CrevasseDepth")==0) return CrevasseDepthEnum; 280 else if (strcmp(name,"Waterheight")==0) return WaterheightEnum; 272 281 else if (strcmp(name,"DefaultCalving")==0) return DefaultCalvingEnum; 273 282 else if (strcmp(name,"CalvinglevermannCoeff")==0) return CalvinglevermannCoeffEnum; … … 281 290 else if (strcmp(name,"CalvingStressThresholdFloatingice")==0) return CalvingStressThresholdFloatingiceEnum; 282 291 else if (strcmp(name,"CalvingMax")==0) return CalvingMaxEnum; 292 else if (strcmp(name,"SigmaVM")==0) return SigmaVMEnum; 283 293 else if (strcmp(name,"StrainRateparallel")==0) return StrainRateparallelEnum; 284 294 else if (strcmp(name,"StrainRateperpendicular")==0) return StrainRateperpendicularEnum; … … 757 767 if (strcmp(name,"RootPath")==0) return RootPathEnum; 758 768 else if (strcmp(name,"OutputFileName")==0) return OutputFileNameEnum; 759 else if (strcmp(name,"InputFileName")==0) return InputFileNameEnum; 769 else stage=7; 770 } 771 if(stage==7){ 772 if (strcmp(name,"InputFileName")==0) return InputFileNameEnum; 760 773 else if (strcmp(name,"LockFileName")==0) return LockFileNameEnum; 761 774 else if (strcmp(name,"RestartFileName")==0) return RestartFileNameEnum; … … 919 932 else if (strcmp(name,"NodeSId")==0) return NodeSIdEnum; 920 933 else if (strcmp(name,"ElementSId")==0) return ElementSIdEnum; 921 else if (strcmp(name,"VectorParam")==0) return VectorParamEnum; 934 else stage=8; 935 } 936 if(stage==8){ 937 if (strcmp(name,"VectorParam")==0) return VectorParamEnum; 922 938 else if (strcmp(name,"Riftfront")==0) return RiftfrontEnum; 923 939 else if (strcmp(name,"Segment")==0) return SegmentEnum; … … 1041 1057 else if (strcmp(name,"P1bubblecondensed")==0) return P1bubblecondensedEnum; 1042 1058 else if (strcmp(name,"P2")==0) return P2Enum; 1043 else if (strcmp(name,"P2bubble")==0) return P2bubbleEnum; 1059 else stage=9; 1060 } 1061 if(stage==9){ 1062 if (strcmp(name,"P2bubble")==0) return P2bubbleEnum; 1044 1063 else if (strcmp(name,"P2bubblecondensed")==0) return P2bubblecondensedEnum; 1045 1064 else if (strcmp(name,"P2xP1")==0) return P2xP1Enum; -
issm/trunk-jpl/src/c/shared/io/Marshalling/IoCodeConversions.cpp
r22066 r22181 151 151 case 3: return CalvingLevermannEnum; 152 152 case 4: return CalvingMinthicknessEnum; 153 case 5: return CalvingHabEnum; 154 case 6: return CalvingCrevasseDepthEnum; 153 155 default: _error_("Marshalled Calving law code \""<<enum_in<<"\" not supported yet"); 154 156 }
Note:
See TracChangeset
for help on using the changeset viewer.