Changeset 22143
- Timestamp:
- 10/05/17 16:48:16 (8 years ago)
- Location:
- issm/branches/trunk-larour-NatGeoScience2016/src
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/branches/trunk-larour-NatGeoScience2016/src/c/analyses/MasstransportAnalysis.cpp
r21759 r22143 157 157 iomodel->FetchDataToInput(elements,"md.initialization.vx",VxEnum); 158 158 iomodel->FetchDataToInput(elements,"md.initialization.vy",VyEnum); 159 160 /*Initialize cumdeltalthickness input: unfortunately, we don't have femmodel, so we need to iterate on 161 *elements, otherwise we would have used InputUpdateFromConstantx: */ 162 counter=0; 163 for(int i=0;i<iomodel->numberofelements;i++){ 164 if(iomodel->my_elements[i]){ 165 Element* element=(Element*)elements->GetObjectByOffset(counter); 166 element->InputUpdateFromConstant(0.0,SealevelriseCumDeltathicknessEnum); 167 counter++; 168 } 169 } 159 170 160 171 if(!issmb){ … … 650 661 basalelement->GetDofList(&doflist,NoneApproximationEnum,GsetEnum); 651 662 IssmDouble* newthickness = xNew<IssmDouble>(numnodes); 652 IssmDouble* deltathickness = xNew<IssmDouble>(numnodes); 663 IssmDouble* cumdeltathickness = xNew<IssmDouble>(numnodes); 664 IssmDouble* deltathickness = xNew<IssmDouble>(numnodes); 653 665 IssmDouble* newbase = xNew<IssmDouble>(numnodes); 654 666 IssmDouble* newsurface = xNew<IssmDouble>(numnodes); … … 675 687 basalelement->GetInputListOnNodes(&phi[0],MaskGroundediceLevelsetEnum); 676 688 basalelement->GetInputListOnNodes(&sealevel[0],SealevelEnum); 677 678 /*What is the delta thickness forcing the sea-level rise core: */ 679 for(i=0;i<numnodes;i++) deltathickness[i]=newthickness[i]-oldthickness[i]; 689 basalelement->GetInputListOnNodes(&cumdeltathickness[0],SealevelriseCumDeltathicknessEnum); 690 691 /*What is the delta thickness forcing the sea-level rise core: cumulated over time, hence the +=:*/ 692 for(i=0;i<numnodes;i++){ 693 cumdeltathickness[i]+=newthickness[i]-oldthickness[i]; 694 deltathickness[i]=newthickness[i]-oldthickness[i]; 695 } 680 696 681 697 /*Find MasstransportHydrostaticAdjustment to figure out how to update the geometry:*/ … … 702 718 } 703 719 720 704 721 /*Add input to the element: */ 705 722 element->AddBasalInput(ThicknessEnum,newthickness,P1Enum); 706 element->AddBasalInput(SealevelriseDeltathicknessEnum,deltathickness,P1Enum);707 723 element->AddBasalInput(SurfaceEnum,newsurface,P1Enum); 708 724 element->AddBasalInput(BaseEnum,newbase,P1Enum); 725 element->AddBasalInput(SealevelriseCumDeltathicknessEnum,cumdeltathickness,P1Enum); 726 element->AddBasalInput(SealevelriseDeltathicknessEnum,deltathickness,P1Enum); 709 727 710 728 /*Free ressources:*/ -
issm/branches/trunk-larour-NatGeoScience2016/src/c/analyses/SealevelriseAnalysis.cpp
r22114 r22143 39 39 iomodel->FetchDataToInput(elements,"md.slr.spcthickness",SealevelriseSpcthicknessEnum); 40 40 iomodel->FetchDataToInput(elements,"md.slr.sealevel",SealevelEnum,0); 41 41 42 42 /*Initialize cumdeltalthickness input: unfortunately, we don't have femmodel, so we need to iterate on 43 43 *elements, otherwise we would have used InputUpdateFromConstantx: */ … … 88 88 parameters->AddObject(iomodel->CopyConstantObject("md.slr.horiz",SealevelriseHorizEnum)); 89 89 parameters->AddObject(iomodel->CopyConstantObject("md.slr.elastic",SealevelriseElasticEnum)); 90 parameters->AddObject(iomodel->CopyConstantObject("md.slr.run_frequency",SealevelriseRunFrequencyEnum));91 90 parameters->AddObject(iomodel->CopyConstantObject("md.slr.rotation",SealevelriseRotationEnum)); 92 91 parameters->AddObject(iomodel->CopyConstantObject("md.slr.tide_love_h",SealevelriseTidalLoveHEnum)); … … 97 96 parameters->AddObject(iomodel->CopyConstantObject("md.slr.angular_velocity",SealevelriseAngularVelocityEnum)); 98 97 parameters->AddObject(iomodel->CopyConstantObject("md.slr.ocean_area_scaling",SealevelriseOceanAreaScalingEnum)); 99 parameters->SetParam(1,SealevelriseRunCountEnum);100 98 101 99 iomodel->FetchData(&elastic,"md.slr.elastic"); -
issm/branches/trunk-larour-NatGeoScience2016/src/c/cores/cores.h
r21759 r22143 66 66 void TransferSealevel(FemModel* femmodel,int forcingenum); 67 67 void EarthMassTransport(FemModel* femmodel); 68 bool SlrAccumulateDeltaThickness(FemModel* femmodel);69 68 70 69 //solution configuration -
issm/branches/trunk-larour-NatGeoScience2016/src/c/cores/sealevelrise_core.cpp
r22118 r22143 19 19 Vector<IssmDouble> *U_north = NULL; 20 20 Vector<IssmDouble> *U_east = NULL; 21 Vector<IssmDouble>* cumdeltathickness=NULL; 21 22 bool save_results,isslr,iscoupler; 22 23 int configuration_type; … … 35 36 IssmDouble *zz = NULL; 36 37 IssmDouble dt,steric_rate; 37 int frequency ;38 int frequency,count; 38 39 int loop; 39 40 int horiz; … … 45 46 femmodel->parameters->FindParam(&isslr,TransientIsslrEnum); 46 47 femmodel->parameters->FindParam(&iscoupler,TransientIscouplerEnum); 48 femmodel->parameters->FindParam(&frequency,SealevelriseRunFrequencyEnum); 49 femmodel->parameters->FindParam(&count,SealevelriseRunCountEnum); 50 47 51 48 52 /*first, recover lat,long and radius vectors from vertices: */ … … 77 81 if(isslr)femmodel->SetCurrentConfiguration(SealevelriseAnalysisEnum); 78 82 79 /*figure out whether deltathickness was computed on the earth (mass tra snport module should83 /*figure out whether deltathickness was computed on the earth (mass transport module should 80 84 * have taken care of it for ice caps: */ 81 85 if(iscoupler){ … … 88 92 } 89 93 90 /*transfer deltathickness forcing from ice caps to earth model: */91 if(iscoupler ) TransferForcing(femmodel,SealevelriseDeltathicknessEnum);94 /*transfer cum deltathickness forcing from ice caps to earth model: */ 95 if(iscoupler & (count==frequency)) TransferForcing(femmodel,SealevelriseCumDeltathicknessEnum); 92 96 93 97 /*call sea-level rise sub cores:*/ 94 if(isslr && !SlrAccumulateDeltaThickness(femmodel)){ 98 if(isslr & (count==frequency)){ 99 100 if(VerboseSolution()) _printf0_(" computing SLR core\n"); 101 102 if(iscoupler){ 103 /*we have accumulated thicknesses, dump them in deltathcikness: */ 104 GetVectorFromInputsx(&cumdeltathickness,femmodel,SealevelriseCumDeltathicknessEnum,VertexSIdEnum); 105 InputUpdateFromVectorx(femmodel,cumdeltathickness,SealevelriseDeltathicknessEnum,VertexSIdEnum); 106 delete cumdeltathickness; 107 } 95 108 96 109 femmodel->parameters->FindParam(&loop,SealevelriseLoopIncrementEnum); … … 154 167 155 168 } 156 169 170 /*transfer sea-level back to ice caps, reset cum thicknesses to 0 and reset counter: */ 171 if(iscoupler){ 172 if (count==frequency) { 173 //transfer sea level back to ice caps: 174 TransferSealevel(femmodel,SealevelEnum); 175 176 //reset cumdeltathickness to 0: 177 GetVectorFromInputsx(&cumdeltathickness,femmodel,SealevelriseCumDeltathicknessEnum,VertexSIdEnum); 178 cumdeltathickness->Set(0); 179 InputUpdateFromVectorx(femmodel,cumdeltathickness,SealevelriseCumDeltathicknessEnum,VertexSIdEnum); 180 delete cumdeltathickness; 181 182 //reset counter to 1: 183 femmodel->parameters->SetParam(1,SealevelriseRunCountEnum); //reset counter. 184 } 185 else{ 186 //increment counter: 187 count++; 188 femmodel->parameters->SetParam(count,SealevelriseRunCountEnum); 189 } 190 } 191 157 192 /*Free ressources: */ 158 193 delete longitude; … … 163 198 delete zz; 164 199 165 /*transfer sea-level back to ice caps: */166 if(iscoupler)TransferSealevel(femmodel,SealevelEnum);167 200 } 168 201 /*}}}*/ … … 260 293 /*We are going to plug this vector into the earth model, at the right vertices corresponding to this particular 261 294 * ice cap: */ 262 forcingglobal->SetValues(M,index,forcingfromcap, INS_VAL);295 forcingglobal->SetValues(M,index,forcingfromcap,ADD_VAL); 263 296 xDelete<int>(index); 264 297 } … … 406 439 Vector<IssmDouble> *newthickness = NULL; 407 440 Vector<IssmDouble> *deltathickness = NULL; 441 Vector<IssmDouble> *cumdeltathickness = NULL; 408 442 int nv; 409 443 … … 430 464 InputUpdateFromVectorx(femmodel,deltathickness,SealevelriseDeltathicknessEnum,VertexSIdEnum); 431 465 466 /*add to cumulated delta thickness: */ 467 GetVectorFromInputsx(&cumdeltathickness,femmodel,SealevelriseCumDeltathicknessEnum,VertexSIdEnum); 468 cumdeltathickness->AXPY(deltathickness,1); 469 InputUpdateFromVectorx(femmodel,cumdeltathickness,SealevelriseCumDeltathicknessEnum,VertexSIdEnum); 470 432 471 /*free ressources:*/ 433 472 delete oldthickness; 434 473 delete newthickness; 435 474 delete deltathickness; 475 delete cumdeltathickness; 436 476 437 477 } /*}}}*/ 438 bool SlrAccumulateDeltaThickness(FemModel* femmodel){ /*{{{*/439 440 Vector<IssmDouble>* deltathickness=NULL;441 Vector<IssmDouble>* cumdeltathickness=NULL;442 int frequency=1;443 int count;444 int solution_type;445 446 femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum);447 if(solution_type==SealevelriseSolutionEnum)return false ; //we don't accumulate when we run this solution type!448 449 femmodel->parameters->FindParam(&frequency,SealevelriseRunFrequencyEnum);450 femmodel->parameters->FindParam(&count,SealevelriseRunCountEnum);451 452 if (count==frequency){453 femmodel->parameters->SetParam(1,SealevelriseRunCountEnum); //reset counter.454 455 /*increment delta thickness load: */456 GetVectorFromInputsx(&cumdeltathickness,femmodel,SealevelriseCumDeltathicknessEnum,VertexSIdEnum);457 GetVectorFromInputsx(&deltathickness,femmodel,SealevelriseDeltathicknessEnum,VertexSIdEnum);458 459 cumdeltathickness->AXPY(deltathickness,1);460 461 /*update deltathickness with the final cumulated thickness: */462 InputUpdateFromVectorx(femmodel,cumdeltathickness,SealevelriseDeltathicknessEnum,VertexSIdEnum);463 464 /*reset cumulative thickness to 0: */465 cumdeltathickness->Set(0);466 InputUpdateFromVectorx(femmodel,cumdeltathickness,SealevelriseCumDeltathicknessEnum,VertexSIdEnum);467 468 delete deltathickness;469 delete cumdeltathickness;470 471 return false;472 }473 else{474 count++;475 femmodel->parameters->SetParam(count,SealevelriseRunCountEnum); //increment counter476 477 /*increment cumulative delta thickness load: */478 GetVectorFromInputsx(&cumdeltathickness,femmodel,SealevelriseCumDeltathicknessEnum,VertexSIdEnum);479 GetVectorFromInputsx(&deltathickness,femmodel,SealevelriseDeltathicknessEnum,VertexSIdEnum);480 481 cumdeltathickness->AXPY(deltathickness,1);482 InputUpdateFromVectorx(femmodel,cumdeltathickness,SealevelriseCumDeltathicknessEnum,VertexSIdEnum);483 484 delete deltathickness;485 delete cumdeltathickness;486 487 return true;488 }489 490 } /*}}}*/ -
issm/branches/trunk-larour-NatGeoScience2016/src/c/modules/ModelProcessorx/CreateParameters.cpp
r21759 r22143 66 66 parameters->AddObject(iomodel->CopyConstantObject("md.inversion.type",InversionTypeEnum)); 67 67 parameters->AddObject(iomodel->CopyConstantObject("md.calving.law",CalvingLawEnum)); 68 parameters->AddObject(iomodel->CopyConstantObject("md.slr.run_frequency",SealevelriseRunFrequencyEnum)); 69 parameters->AddObject(new IntParam(SealevelriseRunCountEnum,1)); 68 70 {/*This is specific to ice...*/ 69 71 parameters->AddObject(iomodel->CopyConstantObject("md.mesh.elementtype",MeshElementtypeEnum)); -
issm/branches/trunk-larour-NatGeoScience2016/src/m/classes/sealevelmodel.m
r22139 r22143 58 58 end 59 59 end 60 61 %check that run_frequency is the same everywhere: 62 for i=1:length(slm.icecaps), 63 if slm.icecaps{i}.slr.run_frequency~=slm.earth.slr.run_frequency, 64 error(sprintf('sealevelmodel checkconsistenty error: icecap model %s should have the same run frequency as earth!',slm.icecaps{i}.miscellaneous.name)); 65 end 66 end 67 68 60 69 61 70
Note:
See TracChangeset
for help on using the changeset viewer.