Changeset 26487
- Timestamp:
- 10/19/21 06:50:29 (3 years ago)
- Location:
- issm/trunk-jpl
- Files:
-
- 4 added
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
r26468 r26487 93 93 break; 94 94 case FrontalForcingsRignotEnum: 95 iomodel->FetchDataToInput(inputs,elements,"md.frontalforcings.basin ",FrontalForcingsBasinIdEnum);95 iomodel->FetchDataToInput(inputs,elements,"md.frontalforcings.basin_id",FrontalForcingsBasinIdEnum); 96 96 iomodel->FetchDataToInput(inputs,elements,"md.frontalforcings.subglacial_discharge",FrontalForcingsSubglacialDischargeEnum); 97 97 iomodel->FetchDataToInput(inputs,elements,"md.frontalforcings.thermalforcing",FrontalForcingsThermalForcingEnum); … … 141 141 break; 142 142 case FrontalForcingsRignotEnum: 143 parameters->AddObject(iomodel->CopyConstantObject("md.frontalforcings.num berofbasins",FrontalForcingsNumberofBasinsEnum));143 parameters->AddObject(iomodel->CopyConstantObject("md.frontalforcings.num_basins",FrontalForcingsNumberofBasinsEnum)); 144 144 break; 145 145 default: -
issm/trunk-jpl/src/c/classes/Elements/Element.cpp
r26483 r26487 3378 3378 3379 3379 } /*}}}*/ 3380 void Element::RignotMeltParameterization(){/*{{{*/ 3381 3382 const int numvertices = this->GetNumberOfVertices(); 3383 IssmDouble A, B, alpha, beta; 3384 IssmDouble bed,qsg,qsg_basin,TF,yts; 3385 int numbasins,basinid; 3386 IssmDouble* basin_icefront_area=NULL; 3387 3388 /* Coefficients */ 3389 A = 3e-4; 3390 B = 0.15; 3391 alpha = 0.39; 3392 beta = 1.18; 3393 3394 /*Get inputs*/ 3395 this->GetInputValue(&basinid,FrontalForcingsBasinIdEnum); 3396 Input* bed_input = this->GetInput(BedEnum); _assert_(bed_input); 3397 Input* qsg_input = this->GetInput(FrontalForcingsSubglacialDischargeEnum); _assert_(qsg_input); 3398 Input* TF_input = this->GetInput(FrontalForcingsThermalForcingEnum); _assert_(TF_input); 3399 3400 this->FindParam(&yts, ConstantsYtsEnum); 3401 this->parameters->FindParam(&numbasins,FrontalForcingsNumberofBasinsEnum); 3402 this->parameters->FindParam(&basin_icefront_area,&numbasins,FrontalForcingsBasinIcefrontAreaEnum); 3403 IssmDouble meltrates[numvertices]; 3404 3405 /* Start looping on the number of vertices: */ 3406 GaussTria gauss; 3407 for(int iv=0;iv<numvertices;iv++){ 3408 gauss.GaussVertex(iv); 3409 3410 /* Get variables */ 3411 bed_input->GetInputValue(&bed,&gauss); 3412 qsg_input->GetInputValue(&qsg,&gauss); 3413 TF_input->GetInputValue(&TF,&gauss); 3414 3415 if(basin_icefront_area[basinid]==0.) meltrates[iv]=0.; 3416 else{ 3417 /* change the unit of qsg (m^3/d -> m/d) with ice front area */ 3418 qsg_basin=qsg/basin_icefront_area[basinid]; 3419 3420 /* calculate melt rates */ 3421 meltrates[iv]=((A*max(-bed,0.)*pow(max(qsg_basin,0.),alpha)+B)*pow(max(TF,0.),beta))/86400; //[m/s] 3422 } 3423 3424 if(xIsNan<IssmDouble>(meltrates[iv])) _error_("NaN found in vector"); 3425 if(xIsInf<IssmDouble>(meltrates[iv])) _error_("Inf found in vector"); 3426 } 3427 3428 /*Add input*/ 3429 this->AddInput(CalvingMeltingrateEnum,&meltrates[0],P1Enum); 3430 3431 /*Cleanup and return*/ 3432 xDelete<IssmDouble>(basin_icefront_area); 3433 } 3434 /*}}}*/ 3380 3435 void Element::SetBoolInput(Inputs* inputs,int enum_in,bool value){/*{{{*/ 3381 3436 -
issm/trunk-jpl/src/c/classes/Elements/Element.h
r26478 r26487 167 167 void PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm,bool ismungsm,bool issetpddfac); 168 168 void PositiveDegreeDaySicopolis(bool isfirnwarming); 169 void RignotMeltParameterization(); 169 170 void ResultInterpolation(int* pinterpolation,int*nodesperelement,int* parray_size, int output_enum); 170 171 void ResultToPatch(IssmDouble* values,int nodesperelement,int output_enum); … … 345 346 virtual void ResetFSBasalBoundaryCondition()=0; 346 347 virtual void ResetHooks()=0; 347 virtual void RignotMeltParameterization(void){_error_("not implemented yet");};348 348 virtual void SetElementInput(int enum_in,IssmDouble value){_error_("not implemented yet");}; 349 349 virtual void SetElementInput(int enum_in,IssmDouble value, int type)=0; -
issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
r26468 r26487 3402 3402 if(this->hneighbors) this->hneighbors->reset(); 3403 3403 3404 }3405 /*}}}*/3406 void Penta::RignotMeltParameterization(){/*{{{*/3407 3408 if(!this->IsOnBase()) return;3409 3410 IssmDouble A, B, alpha, beta;3411 IssmDouble bed,qsg,qsg_basin,TF,yts;3412 int numbasins;3413 IssmDouble basinid[NUMVERTICES];3414 IssmDouble* basin_icefront_area=NULL;3415 3416 /* Coefficients */3417 A = 3e-4;3418 B = 0.15;3419 alpha = 0.39;3420 beta = 1.18;3421 3422 /*Get inputs*/3423 Input* bed_input = this->GetInput(BedEnum); _assert_(bed_input);3424 Input* qsg_input = this->GetInput(FrontalForcingsSubglacialDischargeEnum); _assert_(qsg_input);3425 Input* TF_input = this->GetInput(FrontalForcingsThermalForcingEnum); _assert_(TF_input);3426 Element::GetInputListOnVertices(&basinid[0],FrontalForcingsBasinIdEnum);3427 3428 this->FindParam(&yts, ConstantsYtsEnum);3429 this->parameters->FindParam(&numbasins,FrontalForcingsNumberofBasinsEnum);3430 this->parameters->FindParam(&basin_icefront_area,&numbasins,FrontalForcingsBasinIcefrontAreaEnum);3431 3432 IssmDouble meltrates[NUMVERTICES2D]; //frontal melt-rate3433 3434 /* Start looping on the number of vertices: */3435 GaussPenta gauss;3436 for(int iv=0;iv<NUMVERTICES2D;iv++){3437 gauss.GaussVertex(iv);3438 3439 /* Get variables */3440 bed_input->GetInputValue(&bed,&gauss);3441 qsg_input->GetInputValue(&qsg,&gauss);3442 TF_input->GetInputValue(&TF,&gauss);3443 3444 if(basinid[iv]==0 || basin_icefront_area[reCast<int>(basinid[iv])-1]==0.) meltrates[iv]=0.;3445 else{3446 /* change the unit of qsg (m^3/d -> m/d) with ice front area */3447 qsg_basin=qsg/basin_icefront_area[reCast<int>(basinid[iv])-1];3448 3449 /* calculate melt rates */3450 meltrates[iv]=((A*max(-bed,0.)*pow(max(qsg_basin,0.),alpha)+B)*pow(max(TF,0.),beta))/86400; //[m/s]3451 }3452 3453 if(xIsNan<IssmDouble>(meltrates[iv])) _error_("NaN found in vector");3454 if(xIsInf<IssmDouble>(meltrates[iv])) _error_("Inf found in vector");3455 }3456 3457 /*Add input*/3458 this->AddInput(CalvingMeltingrateEnum,&meltrates[0],P1Enum);3459 3460 this->InputExtrude(CalvingMeltingrateEnum,-1);3461 3462 /*Cleanup and return*/3463 xDelete<IssmDouble>(basin_icefront_area);3464 3404 } 3465 3405 /*}}}*/ -
issm/trunk-jpl/src/c/classes/Elements/Penta.h
r26296 r26487 171 171 void ResetFSBasalBoundaryCondition(void); 172 172 void ResetHooks(); 173 void RignotMeltParameterization();174 173 void SetElementInput(int enum_in,IssmDouble value); 175 174 void SetElementInput(int enum_in,IssmDouble value,int type){_error_("not implemented yet");}; -
issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
r26468 r26487 4717 4717 if(this->hneighbors) this->hneighbors->reset(); 4718 4718 4719 }4720 /*}}}*/4721 void Tria::RignotMeltParameterization(){/*{{{*/4722 4723 IssmDouble A, B, alpha, beta;4724 IssmDouble bed,qsg,qsg_basin,TF,yts;4725 int numbasins;4726 IssmDouble basinid[NUMVERTICES];4727 IssmDouble* basin_icefront_area=NULL;4728 4729 /* Coefficients */4730 A = 3e-4;4731 B = 0.15;4732 alpha = 0.39;4733 beta = 1.18;4734 4735 /*Get inputs*/4736 Input* bed_input = this->GetInput(BedEnum); _assert_(bed_input);4737 Input* qsg_input = this->GetInput(FrontalForcingsSubglacialDischargeEnum); _assert_(qsg_input);4738 Input* TF_input = this->GetInput(FrontalForcingsThermalForcingEnum); _assert_(TF_input);4739 Element::GetInputListOnVertices(&basinid[0],FrontalForcingsBasinIdEnum);4740 4741 this->FindParam(&yts, ConstantsYtsEnum);4742 this->parameters->FindParam(&numbasins,FrontalForcingsNumberofBasinsEnum);4743 this->parameters->FindParam(&basin_icefront_area,&numbasins,FrontalForcingsBasinIcefrontAreaEnum);4744 4745 IssmDouble meltrates[NUMVERTICES]; //frontal melt-rate4746 4747 /* Start looping on the number of vertices: */4748 GaussTria gauss;4749 for(int iv=0;iv<NUMVERTICES;iv++){4750 gauss.GaussVertex(iv);4751 4752 /* Get variables */4753 bed_input->GetInputValue(&bed,&gauss);4754 qsg_input->GetInputValue(&qsg,&gauss);4755 TF_input->GetInputValue(&TF,&gauss);4756 4757 if(basin_icefront_area[reCast<int>(basinid[iv])-1]==0.) meltrates[iv]=0.;4758 else{4759 /* change the unit of qsg (m^3/d -> m/d) with ice front area */4760 qsg_basin=qsg/basin_icefront_area[reCast<int>(basinid[iv])-1];4761 4762 /* calculate melt rates */4763 meltrates[iv]=((A*max(-bed,0.)*pow(max(qsg_basin,0.),alpha)+B)*pow(max(TF,0.),beta))/86400; //[m/s]4764 }4765 4766 if(xIsNan<IssmDouble>(meltrates[iv])) _error_("NaN found in vector");4767 if(xIsInf<IssmDouble>(meltrates[iv])) _error_("Inf found in vector");4768 }4769 4770 /*Add input*/4771 this->AddInput(CalvingMeltingrateEnum,&meltrates[0],P1Enum);4772 4773 /*Cleanup and return*/4774 xDelete<IssmDouble>(basin_icefront_area);4775 4719 } 4776 4720 /*}}}*/ -
issm/trunk-jpl/src/c/classes/Elements/Tria.h
r26296 r26487 132 132 void ResetHooks(); 133 133 void ResetLevelsetFromSegmentlist(IssmDouble* segments,int numsegments); 134 void RignotMeltParameterization();135 134 void SetElementInput(int enum_in,IssmDouble value); 136 135 void SetElementInput(int enum_in,IssmDouble value,int type); -
issm/trunk-jpl/src/c/classes/FemModel.cpp
r26468 r26487 1602 1602 void FemModel::IcefrontAreax(){/*{{{*/ 1603 1603 1604 int numvertices = 6; 1605 int numbasins; 1606 IssmDouble* BasinId = xNew<IssmDouble>(numvertices); 1604 int numbasins,BasinId; 1607 1605 this->parameters->FindParam(&numbasins,FrontalForcingsNumberofBasinsEnum); 1608 IssmDouble* basin_icefront_area 1609 1610 for(int basin= 1;basin<numbasins+1;basin++){1606 IssmDouble* basin_icefront_area = xNewZeroInit<IssmDouble>(numbasins); 1607 1608 for(int basin=0;basin<numbasins;basin++){ 1611 1609 IssmDouble local_icefront_area = 0; 1612 1610 IssmDouble total_icefront_area; 1613 1611 1612 /*Add contribution of each element to icefront area of the basin*/ 1614 1613 for(Object* & object : this->elements->objects){ 1615 1614 Element* element= xDynamicCast<Element*>(object); 1616 element->GetInputListOnVertices(BasinId,FrontalForcingsBasinIdEnum); 1617 for(int j=0;j<numvertices;j++){ 1618 if(BasinId[j]==basin){ 1619 local_icefront_area+=element->GetIcefrontArea(); 1620 break; 1621 } 1622 } 1615 element->GetInputValue(&BasinId,FrontalForcingsBasinIdEnum); 1616 if(BasinId==basin) local_icefront_area+=element->GetIcefrontArea(); 1623 1617 } 1624 1618 ISSM_MPI_Reduce(&local_icefront_area,&total_icefront_area,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm()); 1625 1619 ISSM_MPI_Bcast(&total_icefront_area,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm()); 1626 1620 1627 basin_icefront_area[basin -1]=total_icefront_area;1628 } 1629 1621 basin_icefront_area[basin]=total_icefront_area; 1622 } 1623 1630 1624 this->parameters->AddObject(new DoubleVecParam(FrontalForcingsBasinIcefrontAreaEnum,basin_icefront_area,numbasins)); 1631 1625 1632 1626 xDelete<IssmDouble>(basin_icefront_area); 1633 xDelete<IssmDouble>(BasinId);1634 1627 }/*}}}*/ 1635 1628 void FemModel::IcefrontMassFluxx(IssmDouble* pM, bool scaled){/*{{{*/ -
issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp
r26485 r26487 243 243 bool randomflag{}; 244 244 femmodel->parameters->FindParam(&randomflag,SmbRandomflagEnum); 245 _printf_("randomflag: "<<randomflag<<'\n');246 245 /*Determine whether random seed is fixed to time step (randomflag==false) or random seed truly random (randomflag==true)*/ 247 246 int fixedseed; -
issm/trunk-jpl/src/m/classes/frontalforcingsrignot.m
r23673 r26487 6 6 classdef frontalforcingsrignot 7 7 properties (SetAccess=public) 8 basin = NaN;9 num berofbasins=0;10 subglacial_discharge = NaN;11 thermalforcing =NaN;8 basin_id = NaN; 9 num_basins = 0; 10 subglacial_discharge = NaN; 11 thermalforcing = NaN; 12 12 end 13 13 methods … … 35 35 function self = setdefaultparameters(self) % {{{ 36 36 37 basin =NaN;38 num berofbasins=0;39 subglacial_discharge =NaN;40 thermalforcing =NaN;37 basin_id = NaN; 38 num_basins = 0; 39 subglacial_discharge = NaN; 40 thermalforcing = NaN; 41 41 end % }}} 42 42 function md = checkconsistency(self,md,solution,analyses) % {{{ … … 44 44 if (~strcmp(solution,'TransientSolution') | md.transient.ismovingfront==0), return; end 45 45 46 md = checkfield(md,'fieldname','frontalforcings. basin','>',0,'nan',1,'Inf',1);47 md = checkfield(md,'fieldname','frontalforcings. numberofbasins','numel',[1]);46 md = checkfield(md,'fieldname','frontalforcings.num_basins','numel',1,'NaN',1,'Inf',1,'>',0); 47 md = checkfield(md,'fieldname','frontalforcings.basin_id','Inf',1,'>=',0,'<=',md.frontalforcings.num_basins,'size',[md.mesh.numberofelements 1]); 48 48 md = checkfield(md,'fieldname','frontalforcings.subglacial_discharge','>=',0,'nan',1,'Inf',1,'timeseries',1); 49 49 md = checkfield(md,'fieldname','frontalforcings.thermalforcing','nan',1,'Inf',1,'timeseries',1); … … 52 52 function disp(self) % {{{ 53 53 disp(sprintf(' Frontalforcings parameters:')); 54 fielddisplay(self,'basin ','basin ID for vertices');55 fielddisplay(self,'num berofbasins', 'number of basins');54 fielddisplay(self,'basin_id','basin ID for elements'); 55 fielddisplay(self,'num_basins', 'number of basins'); 56 56 fielddisplay(self,'subglacial_discharge','sum of subglacial discharge for each basin [m/d]'); 57 57 fielddisplay(self,'thermalforcing','thermal forcing [∘C]'); … … 59 59 function marshall(self,prefix,md,fid) % {{{ 60 60 WriteData(fid,prefix,'name','md.frontalforcings.parameterization','data',2,'format','Integer'); 61 WriteData(fid,prefix,'object',self,'fieldname','basin ','format','DoubleMat','mattype',1);62 WriteData(fid,prefix,'object',self,'fieldname','num berofbasins','format','Integer');61 WriteData(fid,prefix,'object',self,'fieldname','basin_id','data',self.basin_id-1,'name','md.frontalforcings.basin_id','format','IntMat','mattype',2); %0-indexed 62 WriteData(fid,prefix,'object',self,'fieldname','num_basins','format','Integer'); 63 63 WriteData(fid,prefix,'object',self,'fieldname','subglacial_discharge','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts); 64 64 WriteData(fid,prefix,'object',self,'fieldname','thermalforcing','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts);
Note:
See TracChangeset
for help on using the changeset viewer.