 |
Ice Sheet System Model
4.18
Code documentation
|
#include <HydrologyShaktiAnalysis.h>
|
void | CreateConstraints (Constraints *constraints, IoModel *iomodel) |
|
void | CreateLoads (Loads *loads, IoModel *iomodel) |
|
void | CreateNodes (Nodes *nodes, IoModel *iomodel, bool isamr=false) |
|
int | DofsPerNode (int **doflist, int domaintype, int approximation) |
|
void | UpdateElements (Elements *elements, Inputs2 *inputs2, IoModel *iomodel, int analysis_counter, int analysis_type) |
|
void | UpdateParameters (Parameters *parameters, IoModel *iomodel, int solution_enum, int analysis_enum) |
|
void | Core (FemModel *femmodel) |
|
ElementVector * | CreateDVector (Element *element) |
|
ElementMatrix * | CreateJacobianMatrix (Element *element) |
|
ElementMatrix * | CreateKMatrix (Element *element) |
|
ElementVector * | CreatePVector (Element *element) |
|
void | GetSolutionFromInputs (Vector< IssmDouble > *solution, Element *element) |
|
void | GradientJ (Vector< IssmDouble > *gradient, Element *element, int control_type, int control_index) |
|
void | InputUpdateFromSolution (IssmDouble *solution, Element *element) |
|
void | UpdateConstraints (FemModel *femmodel) |
|
IssmDouble | GetConductivity (Element *element) |
|
void | UpdateGapHeight (FemModel *femmodel) |
|
void | UpdateGapHeight (Element *element) |
|
virtual | ~Analysis () |
|
Definition at line 11 of file HydrologyShaktiAnalysis.h.
◆ CreateConstraints()
void HydrologyShaktiAnalysis::CreateConstraints |
( |
Constraints * |
constraints, |
|
|
IoModel * |
iomodel |
|
) |
| |
|
virtual |
◆ CreateLoads()
void HydrologyShaktiAnalysis::CreateLoads |
( |
Loads * |
loads, |
|
|
IoModel * |
iomodel |
|
) |
| |
|
virtual |
◆ CreateNodes()
void HydrologyShaktiAnalysis::CreateNodes |
( |
Nodes * |
nodes, |
|
|
IoModel * |
iomodel, |
|
|
bool |
isamr = false |
|
) |
| |
|
virtual |
◆ DofsPerNode()
int HydrologyShaktiAnalysis::DofsPerNode |
( |
int ** |
doflist, |
|
|
int |
domaintype, |
|
|
int |
approximation |
|
) |
| |
|
virtual |
◆ UpdateElements()
void HydrologyShaktiAnalysis::UpdateElements |
( |
Elements * |
elements, |
|
|
Inputs2 * |
inputs2, |
|
|
IoModel * |
iomodel, |
|
|
int |
analysis_counter, |
|
|
int |
analysis_type |
|
) |
| |
|
virtual |
◆ UpdateParameters()
void HydrologyShaktiAnalysis::UpdateParameters |
( |
Parameters * |
parameters, |
|
|
IoModel * |
iomodel, |
|
|
int |
solution_enum, |
|
|
int |
analysis_enum |
|
) |
| |
|
virtual |
Implements Analysis.
Definition at line 137 of file HydrologyShaktiAnalysis.cpp.
142 char** requestedoutputs = NULL;
143 iomodel->
FindConstant(&hydrology_model,
"md.hydrology.model");
154 iomodel->
FindConstant(&requestedoutputs,&numoutputs,
"md.hydrology.requested_outputs");
157 iomodel->
DeleteData(&requestedoutputs,numoutputs,
"md.hydrology.requested_outputs");
◆ Core()
void HydrologyShaktiAnalysis::Core |
( |
FemModel * |
femmodel | ) |
|
|
virtual |
◆ CreateDVector()
◆ CreateJacobianMatrix()
◆ CreateKMatrix()
Implements Analysis.
Definition at line 171 of file HydrologyShaktiAnalysis.cpp.
182 IssmDouble* dbasis = xNew<IssmDouble>(2*numnodes);
183 IssmDouble* basis = xNew<IssmDouble>(numnodes);
198 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
205 for(
int i=0;i<numnodes;i++){
206 for(
int j=0;j<numnodes;j++){
207 Ke->
values[i*numnodes+j] += conductivity*gauss->
weight*Jdet*(dbasis[0*numnodes+i]*dbasis[0*numnodes+j] + dbasis[1*numnodes+i]*dbasis[1*numnodes+j])
208 + gauss->
weight*Jdet*storage/dt*basis[i]*basis[j];
214 xDelete<IssmDouble>(xyz_list);
215 xDelete<IssmDouble>(basis);
216 xDelete<IssmDouble>(dbasis);
◆ CreatePVector()
Implements Analysis.
Definition at line 220 of file HydrologyShaktiAnalysis.cpp.
227 IssmDouble gap,bed,thickness,head,ieb,head_old;
230 IssmDouble PMPheat,dpressure_water[2],dbed[2];
238 IssmDouble* basis = xNew<IssmDouble>(numnodes);
273 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
307 frictionheat=alpha2*(vx*vx+vy*vy);
311 IssmDouble pressure_water = rho_water*g*(head-bed);
312 if(pressure_water>pressure_ice) pressure_water = pressure_ice;
315 IssmDouble pressure_water_old = rho_water*g*(head_old-bed);
316 if(pressure_water_old>pressure_ice) pressure_water_old = pressure_ice;
319 dpressure_water[0] = rho_water*g*(dh[0] - dbed[0]);
320 dpressure_water[1] = rho_water*g*(dh[1] - dbed[1]);
321 PMPheat=-
CT*
CW*conductivity*(dh[0]*dpressure_water[0]+dh[1]*dpressure_water[1]);
323 meltrate = 1/latentheat*(G+frictionheat+rho_water*g*conductivity*(dh[0]*dh[0]+dh[1]*dh[1])-PMPheat);
326 for(
int i=0;i<numnodes;i++) pe->
values[i]+=Jdet*gauss->
weight*
328 meltrate*(1/rho_water-1/rho_ice)
329 +A*pow(fabs(pressure_ice - pressure_water),n-1)*(pressure_ice - pressure_water)*gap
330 -beta*sqrt(vx*vx+vy*vy)
336 xDelete<IssmDouble>(xyz_list);
337 xDelete<IssmDouble>(basis);
◆ GetSolutionFromInputs()
◆ GradientJ()
void HydrologyShaktiAnalysis::GradientJ |
( |
Vector< IssmDouble > * |
gradient, |
|
|
Element * |
element, |
|
|
int |
control_type, |
|
|
int |
control_index |
|
) |
| |
|
virtual |
◆ InputUpdateFromSolution()
void HydrologyShaktiAnalysis::InputUpdateFromSolution |
( |
IssmDouble * |
solution, |
|
|
Element * |
element |
|
) |
| |
|
virtual |
Implements Analysis.
Definition at line 348 of file HydrologyShaktiAnalysis.cpp.
363 IssmDouble* values = xNew<IssmDouble>(numnodes);
366 IssmDouble* eff_pressure = xNew<IssmDouble>(numnodes);
367 IssmDouble* thickness = xNew<IssmDouble>(numnodes);
375 IssmDouble* head_old = xNew<IssmDouble>(numnodes);
381 for(
int i=0;i<numnodes;i++){
382 values[i]=solution[doflist[i]];
385 if(values[i]>rho_ice*thickness[i]/rho_water+bed[i]){
386 values[i] = rho_ice*thickness[i]/rho_water+bed[i];
395 values[i] = head_old[i] - relaxation*(head_old[i]-values[i]);
398 eff_pressure[i] = rho_ice*g*thickness[i] - rho_water*g*(values[i]-bed[i]);
400 if(xIsNan<IssmDouble>(values[i]))
_error_(
"NaN found in solution vector");
401 if(xIsInf<IssmDouble>(values[i]))
_error_(
"Inf found in solution vector");
418 IssmDouble reynolds = conductivity*sqrt(dh[0]*dh[0]+dh[1]*dh[1])/
NU;
422 xDelete<IssmDouble>(values);
423 xDelete<IssmDouble>(thickness);
424 xDelete<IssmDouble>(bed);
425 xDelete<IssmDouble>(xyz_list);
426 xDelete<int>(doflist);
427 xDelete<IssmDouble>(eff_pressure);
428 xDelete<IssmDouble>(head_old);
◆ UpdateConstraints()
void HydrologyShaktiAnalysis::UpdateConstraints |
( |
FemModel * |
femmodel | ) |
|
|
virtual |
◆ GetConductivity()
◆ UpdateGapHeight() [1/2]
void HydrologyShaktiAnalysis::UpdateGapHeight |
( |
FemModel * |
femmodel | ) |
|
◆ UpdateGapHeight() [2/2]
void HydrologyShaktiAnalysis::UpdateGapHeight |
( |
Element * |
element | ) |
|
Definition at line 465 of file HydrologyShaktiAnalysis.cpp.
477 IssmDouble dpressure_water[2],dbed[2],PMPheat;
512 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
545 frictionheat=alpha2*(vx*vx+vy*vy);
549 IssmDouble pressure_water = rho_water*g*(head-bed);
550 if(pressure_water>pressure_ice) pressure_water = pressure_ice;
553 dpressure_water[0] = rho_water*g*(dh[0] - dbed[0]);
554 dpressure_water[1] = rho_water*g*(dh[1] - dbed[1]);
555 PMPheat=-
CT*
CW*conductivity*(dh[0]*dpressure_water[0]+dh[1]*dpressure_water[1]);
557 meltrate = 1/latentheat*(G+frictionheat+rho_water*g*conductivity*(dh[0]*dh[0]+dh[1]*dh[1])-PMPheat);
560 newgap += gauss->
weight*Jdet*(gap+dt*(
562 -A*pow(fabs(pressure_ice-pressure_water),n-1)*(pressure_ice-pressure_water)*gap
563 +beta*sqrt(vx*vx+vy*vy)
565 totalweights +=gauss->
weight*Jdet;
568 q += gauss->
weight*Jdet*(conductivity*sqrt(dh[0]*dh[0]+dh[1]*dh[1]));
571 channelization += gauss->
weight*Jdet*(meltrate/rho_ice/(meltrate/rho_ice+beta*sqrt(vx*vx+vy*vy)));
575 newgap = newgap/totalweights;
577 if(newgap<mingap) newgap=mingap;
591 channelization = channelization/totalweights;
595 xDelete<IssmDouble>(xyz_list);
The documentation for this class was generated from the following files:
@ FrictionCoefficientEnum
virtual int GetElementType(void)=0
void UpdateGapHeight(FemModel *femmodel)
void GetInputListOnNodes(IssmDouble *pvalue, int enumtype)
virtual int GetNumberOfNodes(void)=0
@ HydrologyBumpSpacingEnum
void FindParam(bool *pvalue, int paramenum)
@ HydrologyRequestedOutputsEnum
int AddObject(Object *object)
@ MaterialsRhoFreshwaterEnum
@ TimesteppingTimeStepEnum
@ MaterialsLatentheatEnum
@ HydrologyRelaxationEnum
@ HydrologyShaktiAnalysisEnum
void AddObject(Param *newparam)
@ HydrologyNeumannfluxEnum
virtual Input2 * GetInput2(int inputenum)=0
virtual void NodalFunctions(IssmDouble *basis, Gauss *gauss)=0
@ HydrologyMoulinInputEnum
ElementVector * NewElementVector(int approximation_enum=NoneApproximationEnum)
void DeleteData(int num,...)
Param * CopyConstantObject(const char *constant_name, int param_enum)
@ BasalforcingsGroundediceMeltingRateEnum
virtual void AddInput2(int input_enum, IssmDouble *values, int interpolation_enum)
virtual Gauss * NewGauss(void)=0
@ HydrologyEnglacialInputEnum
@ HydrologyBumpHeightEnum
void FindConstant(bool *pvalue, const char *constant_name)
void GetVerticesCoordinates(IssmDouble **xyz_list)
IssmDouble GetConductivity(Element *element)
void FetchData(bool *pboolean, const char *data_name)
@ HydrologyNumRequestedOutputsEnum
void CreateSingleNodeToElementConnectivity(IoModel *iomodel)
@ DegreeOfChannelizationEnum
void GetDofListLocal(int **pdoflist, int approximation_enum, int setenum)
IssmDouble * Data(const char *data_name)
void GetSolutionFromInputsOneDof(Vector< IssmDouble > *solution, int solutionenum)
#define _error_(StreamArgs)
virtual int begin(void)=0
Object * GetObjectByOffset(int offset)
@ MeshVertexonsurfaceEnum
virtual void JacobianDeterminant(IssmDouble *Jdet, IssmDouble *xyz_list, Gauss *gauss)=0
virtual void GaussPoint(int ig)=0
virtual void Update(Inputs2 *inputs2, int index, IoModel *iomodel, int analysis_counter, int analysis_type, int finite_element)=0
void GetAlpha2(IssmDouble *palpha2, Gauss *gauss)
void FetchDataToInput(Inputs2 *inputs2, Elements *elements, const char *vector_name, int input_enum)
void IoModelToConstraintsx(Constraints *constraints, IoModel *iomodel, const char *spc_name, int analysis_type, int finite_element, int dof)
@ BasalforcingsGeothermalfluxEnum
void CreateNodes(Nodes *nodes, IoModel *iomodel, bool isamr=false)
virtual void NodalFunctionsDerivatives(IssmDouble *dbasis, IssmDouble *xyz_list, Gauss *gauss)=0
ElementMatrix * NewElementMatrix(int approximation_enum=NoneApproximationEnum)