[17802] | 1 | Index: ../trunk-jpl/src/c/analyses/HydrologyShreveAnalysis.cpp
|
---|
| 2 | ===================================================================
|
---|
| 3 | --- ../trunk-jpl/src/c/analyses/HydrologyShreveAnalysis.cpp (revision 16760)
|
---|
| 4 | +++ ../trunk-jpl/src/c/analyses/HydrologyShreveAnalysis.cpp (revision 16761)
|
---|
| 5 | @@ -85,5 +85,28 @@
|
---|
| 6 | element->GetSolutionFromInputsOneDof(solution,WatercolumnEnum);
|
---|
| 7 | }/*}}}*/
|
---|
| 8 | void HydrologyShreveAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
|
---|
| 9 | - _error_("not implemented yet");
|
---|
| 10 | +
|
---|
| 11 | + /*Intermediary*/
|
---|
| 12 | + int* doflist = NULL;
|
---|
| 13 | +
|
---|
| 14 | + /*Fetch number of nodes for this finite element*/
|
---|
| 15 | + int numnodes = element->GetNumberOfNodes();
|
---|
| 16 | +
|
---|
| 17 | + /*Fetch dof list and allocate solution vector*/
|
---|
| 18 | + element->GetDofList(&doflist,NoneApproximationEnum,GsetEnum);
|
---|
| 19 | + IssmDouble* values = xNew<IssmDouble>(numnodes);
|
---|
| 20 | +
|
---|
| 21 | + /*Use the dof list to index into the solution vector: */
|
---|
| 22 | + for(int i=0;i<numnodes;i++){
|
---|
| 23 | + values[i]=solution[doflist[i]];
|
---|
| 24 | + if(xIsNan<IssmDouble>(values[i])) _error_("NaN found in solution vector");
|
---|
| 25 | + if (values[i]<10e-10) values[i]=10e-10; //correcting the water column to positive values
|
---|
| 26 | + }
|
---|
| 27 | +
|
---|
| 28 | + /*Add input to the element: */
|
---|
| 29 | + element->AddInput(WatercolumnEnum,values,P1Enum);
|
---|
| 30 | +
|
---|
| 31 | + /*Free ressources:*/
|
---|
| 32 | + xDelete<IssmDouble>(values);
|
---|
| 33 | + xDelete<int>(doflist);
|
---|
| 34 | }/*}}}*/
|
---|
| 35 | Index: ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp
|
---|
| 36 | ===================================================================
|
---|
| 37 | --- ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp (revision 16760)
|
---|
| 38 | +++ ../trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp (revision 16761)
|
---|
| 39 | @@ -99,5 +99,15 @@
|
---|
| 40 | element->GetSolutionFromInputsOneDof(solution,EplHeadEnum);
|
---|
| 41 | }/*}}}*/
|
---|
| 42 | void HydrologyDCEfficientAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
|
---|
| 43 | - _error_("not implemented yet");
|
---|
| 44 | + int meshtype;
|
---|
| 45 | + element->FindParam(&meshtype,MeshTypeEnum);
|
---|
| 46 | + switch(meshtype){
|
---|
| 47 | + case Mesh2DhorizontalEnum:
|
---|
| 48 | + element->InputUpdateFromSolutionOneDof(solution,EplHeadEnum);
|
---|
| 49 | + break;
|
---|
| 50 | + case Mesh3DEnum:
|
---|
| 51 | + element->InputUpdateFromSolutionOneDofCollapsed(solution,EplHeadEnum);
|
---|
| 52 | + break;
|
---|
| 53 | + default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet");
|
---|
| 54 | + }
|
---|
| 55 | }/*}}}*/
|
---|
| 56 | Index: ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp
|
---|
| 57 | ===================================================================
|
---|
| 58 | --- ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp (revision 16760)
|
---|
| 59 | +++ ../trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp (revision 16761)
|
---|
| 60 | @@ -140,5 +140,60 @@
|
---|
| 61 | element->GetSolutionFromInputsOneDof(solution,SedimentHeadEnum);
|
---|
| 62 | }/*}}}*/
|
---|
| 63 | void HydrologyDCInefficientAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
|
---|
| 64 | - _error_("not implemented yet");
|
---|
| 65 | +
|
---|
| 66 | + int meshtype;
|
---|
| 67 | + bool converged;
|
---|
| 68 | + int* doflist=NULL;
|
---|
| 69 | + Element* basalelement=NULL;
|
---|
| 70 | +
|
---|
| 71 | + element->FindParam(&meshtype,MeshTypeEnum);
|
---|
| 72 | + if(meshtype!=Mesh2DhorizontalEnum){
|
---|
| 73 | + if(!element->IsOnBed()) return;
|
---|
| 74 | + basalelement=element->SpawnBasalElement();
|
---|
| 75 | + }
|
---|
| 76 | + else{
|
---|
| 77 | + basalelement = element;
|
---|
| 78 | + }
|
---|
| 79 | +
|
---|
| 80 | + /*Fetch number of nodes for this finite element*/
|
---|
| 81 | + int numnodes = basalelement->GetNumberOfNodes();
|
---|
| 82 | +
|
---|
| 83 | + /*Fetch dof list and allocate solution vector*/
|
---|
| 84 | + basalelement->GetDofList(&doflist,NoneApproximationEnum,GsetEnum);
|
---|
| 85 | + IssmDouble* values = xNew<IssmDouble>(numnodes);
|
---|
| 86 | + IssmDouble* residual = xNew<IssmDouble>(numnodes);
|
---|
| 87 | +
|
---|
| 88 | + /*Use the dof list to index into the solution vector: */
|
---|
| 89 | + for(int i=0;i<numnodes;i++){
|
---|
| 90 | + values[i] =solution[doflist[i]];
|
---|
| 91 | + if(xIsNan<IssmDouble>(values[i])) _error_("NaN found in solution vector");
|
---|
| 92 | + }
|
---|
| 93 | +
|
---|
| 94 | + /*If converged keep the residual in mind*/
|
---|
| 95 | + element->GetInputValue(&converged,ConvergedEnum);
|
---|
| 96 | +
|
---|
| 97 | + /*Get inputs*/
|
---|
| 98 | + if(converged){
|
---|
| 99 | + IssmDouble penalty_factor,kmax,kappa,h_max;
|
---|
| 100 | + element->FindParam(&kmax,HydrologySedimentKmaxEnum);
|
---|
| 101 | + element->FindParam(&penalty_factor,HydrologydcPenaltyFactorEnum);
|
---|
| 102 | +
|
---|
| 103 | + kappa=kmax*pow(10.,penalty_factor);
|
---|
| 104 | +
|
---|
| 105 | + for(int i=0;i<numnodes;i++){
|
---|
| 106 | + basalelement->GetHydrologyDCInefficientHmax(&h_max,i);
|
---|
| 107 | + if(values[i]>h_max) residual[i] = kappa*(values[i]-h_max);
|
---|
| 108 | + else residual[i] = 0.;
|
---|
| 109 | + }
|
---|
| 110 | + }
|
---|
| 111 | +
|
---|
| 112 | + /*Add input to the element: */
|
---|
| 113 | + element->AddBasalInput(SedimentHeadEnum,values,P1Enum);
|
---|
| 114 | + element->AddBasalInput(SedimentHeadResidualEnum,residual,P1Enum);
|
---|
| 115 | +
|
---|
| 116 | + /*Free ressources:*/
|
---|
| 117 | + xDelete<IssmDouble>(values);
|
---|
| 118 | + xDelete<IssmDouble>(residual);
|
---|
| 119 | + xDelete<int>(doflist);
|
---|
| 120 | + if(meshtype!=Mesh2DhorizontalEnum) delete basalelement;
|
---|
| 121 | }/*}}}*/
|
---|
| 122 | Index: ../trunk-jpl/src/c/analyses/L2ProjectionEPLAnalysis.cpp
|
---|
| 123 | ===================================================================
|
---|
| 124 | --- ../trunk-jpl/src/c/analyses/L2ProjectionEPLAnalysis.cpp (revision 16760)
|
---|
| 125 | +++ ../trunk-jpl/src/c/analyses/L2ProjectionEPLAnalysis.cpp (revision 16761)
|
---|
| 126 | @@ -73,6 +73,21 @@
|
---|
| 127 | _error_("not implemented yet");
|
---|
| 128 | }/*}}}*/
|
---|
| 129 | void L2ProjectionEPLAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
|
---|
| 130 | - _error_("not implemented yet");
|
---|
| 131 | + int inputenum,meshtype;
|
---|
| 132 | +
|
---|
| 133 | + element->FindParam(&inputenum,InputToL2ProjectEnum);
|
---|
| 134 | + element->FindParam(&meshtype,MeshTypeEnum);
|
---|
| 135 | + switch(meshtype){
|
---|
| 136 | + case Mesh2DhorizontalEnum:
|
---|
| 137 | + element->InputUpdateFromSolutionOneDof(solution,inputenum);
|
---|
| 138 | + break;
|
---|
| 139 | + case Mesh2DverticalEnum:
|
---|
| 140 | + element->InputUpdateFromSolutionOneDof(solution,inputenum);
|
---|
| 141 | + break;
|
---|
| 142 | + case Mesh3DEnum:
|
---|
| 143 | + element->InputUpdateFromSolutionOneDofCollapsed(solution,inputenum);
|
---|
| 144 | + break;
|
---|
| 145 | + default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet");
|
---|
| 146 | + }
|
---|
| 147 | }/*}}}*/
|
---|
| 148 |
|
---|
| 149 | Index: ../trunk-jpl/src/c/classes/Elements/Element.h
|
---|
| 150 | ===================================================================
|
---|
| 151 | --- ../trunk-jpl/src/c/classes/Elements/Element.h (revision 16760)
|
---|
| 152 | +++ ../trunk-jpl/src/c/classes/Elements/Element.h (revision 16761)
|
---|
| 153 | @@ -168,6 +168,7 @@
|
---|
| 154 |
|
---|
| 155 | #ifdef _HAVE_HYDROLOGY_
|
---|
| 156 | virtual void GetHydrologyDCInefficientHmax(IssmDouble* ph_max, Node* innode)=0;
|
---|
| 157 | + virtual void GetHydrologyDCInefficientHmax(IssmDouble* ph_max, int index)=0;
|
---|
| 158 | virtual void GetHydrologyTransfer(Vector<IssmDouble>* transfer)=0;
|
---|
| 159 | virtual void HydrologyEPLGetMask(Vector<IssmDouble>* mask)=0;
|
---|
| 160 | virtual void HydrologyEPLGetActive(Vector<IssmDouble>* active)=0;
|
---|
| 161 | Index: ../trunk-jpl/src/c/classes/Elements/Tria.cpp
|
---|
| 162 | ===================================================================
|
---|
| 163 | --- ../trunk-jpl/src/c/classes/Elements/Tria.cpp (revision 16760)
|
---|
| 164 | +++ ../trunk-jpl/src/c/classes/Elements/Tria.cpp (revision 16761)
|
---|
| 165 | @@ -7226,6 +7226,41 @@
|
---|
| 166 | *ph_max=h_max;
|
---|
| 167 | }
|
---|
| 168 | /*}}}*/
|
---|
| 169 | +/*FUNCTION Tria::GetHydrologyDCInefficientHmax{{{*/
|
---|
| 170 | +void Tria::GetHydrologyDCInefficientHmax(IssmDouble* ph_max,int index){
|
---|
| 171 | +
|
---|
| 172 | + int hmax_flag;
|
---|
| 173 | + IssmDouble h_max;
|
---|
| 174 | + IssmDouble rho_ice,rho_water;
|
---|
| 175 | + IssmDouble thickness,bed;
|
---|
| 176 | + /*Get the flag to the limitation method*/
|
---|
| 177 | + this->parameters->FindParam(&hmax_flag,HydrologydcSedimentlimitFlagEnum);
|
---|
| 178 | +
|
---|
| 179 | + /*Switch between the different cases*/
|
---|
| 180 | + switch(hmax_flag){
|
---|
| 181 | + case 0:
|
---|
| 182 | + h_max=1.0e+10;
|
---|
| 183 | + break;
|
---|
| 184 | + case 1:
|
---|
| 185 | + parameters->FindParam(&h_max,HydrologydcSedimentlimitEnum);
|
---|
| 186 | + break;
|
---|
| 187 | + case 2:
|
---|
| 188 | + rho_ice=matpar->GetRhoIce();
|
---|
| 189 | + rho_water=matpar->GetRhoFreshwater();
|
---|
| 190 | + this->GetInputValue(&thickness,this->nodes[index],ThicknessEnum);
|
---|
| 191 | + this->GetInputValue(&bed,this->nodes[index],BedEnum);
|
---|
| 192 | + h_max=((rho_ice*thickness)/rho_water)+bed;
|
---|
| 193 | + break;
|
---|
| 194 | + case 3:
|
---|
| 195 | + _error_("Using normal stress not supported yet");
|
---|
| 196 | + break;
|
---|
| 197 | + default:
|
---|
| 198 | + _error_("no case higher than 3 for SedimentlimitFlag");
|
---|
| 199 | + }
|
---|
| 200 | + /*Assign output pointer*/
|
---|
| 201 | + *ph_max=h_max;
|
---|
| 202 | +}
|
---|
| 203 | +/*}}}*/
|
---|
| 204 | /*FUNCTION Tria::GetHydrologyTransfer{{{*/
|
---|
| 205 | void Tria::GetHydrologyTransfer(Vector<IssmDouble>* transfer){
|
---|
| 206 |
|
---|
| 207 | Index: ../trunk-jpl/src/c/classes/Elements/Tria.h
|
---|
| 208 | ===================================================================
|
---|
| 209 | --- ../trunk-jpl/src/c/classes/Elements/Tria.h (revision 16760)
|
---|
| 210 | +++ ../trunk-jpl/src/c/classes/Elements/Tria.h (revision 16761)
|
---|
| 211 | @@ -327,6 +327,7 @@
|
---|
| 212 | void InputUpdateFromSolutionHydrologyDCInefficient(IssmDouble* solution);
|
---|
| 213 | void InputUpdateFromSolutionHydrologyDCEfficient(IssmDouble* solution);
|
---|
| 214 | void GetHydrologyDCInefficientHmax(IssmDouble* ph_max, Node* innode);
|
---|
| 215 | + void GetHydrologyDCInefficientHmax(IssmDouble* ph_max,int index);
|
---|
| 216 | void GetHydrologyTransfer(Vector<IssmDouble>* transfer);
|
---|
| 217 | void HydrologyEPLGetActive(Vector<IssmDouble>* active_vec);
|
---|
| 218 | void HydrologyEPLGetMask(Vector<IssmDouble>* vec_mask);
|
---|
| 219 | Index: ../trunk-jpl/src/c/classes/Elements/Penta.h
|
---|
| 220 | ===================================================================
|
---|
| 221 | --- ../trunk-jpl/src/c/classes/Elements/Penta.h (revision 16760)
|
---|
| 222 | +++ ../trunk-jpl/src/c/classes/Elements/Penta.h (revision 16761)
|
---|
| 223 | @@ -343,6 +343,7 @@
|
---|
| 224 | ElementVector* CreatePVectorHydrologyDCEfficient(void);
|
---|
| 225 | ElementVector* CreatePVectorL2ProjectionEPL(void);
|
---|
| 226 | void GetHydrologyDCInefficientHmax(IssmDouble* ph_max, Node* innode);
|
---|
| 227 | + void GetHydrologyDCInefficientHmax(IssmDouble* ph_max,int index){_error_("not implemented yet");};
|
---|
| 228 | void GetHydrologyTransfer(Vector<IssmDouble>* transfer);
|
---|
| 229 | void HydrologyEPLGetActive(Vector<IssmDouble>* active_vec);
|
---|
| 230 | void HydrologyEPLGetMask(Vector<IssmDouble>* vec_mask);
|
---|
| 231 | Index: ../trunk-jpl/src/c/classes/Elements/Seg.h
|
---|
| 232 | ===================================================================
|
---|
| 233 | --- ../trunk-jpl/src/c/classes/Elements/Seg.h (revision 16760)
|
---|
| 234 | +++ ../trunk-jpl/src/c/classes/Elements/Seg.h (revision 16761)
|
---|
| 235 | @@ -127,6 +127,7 @@
|
---|
| 236 | #endif
|
---|
| 237 | #ifdef _HAVE_HYDROLOGY_
|
---|
| 238 | void GetHydrologyDCInefficientHmax(IssmDouble* ph_max, Node* innode){_error_("not implemented yet");};
|
---|
| 239 | + void GetHydrologyDCInefficientHmax(IssmDouble* ph_max,int index){_error_("not implemented yet");};
|
---|
| 240 | void GetHydrologyTransfer(Vector<IssmDouble>* transfer){_error_("not implemented yet");};
|
---|
| 241 | void HydrologyEPLGetActive(Vector<IssmDouble>* active_vec){_error_("not implemented yet");};
|
---|
| 242 | void HydrologyEPLGetMask(Vector<IssmDouble>* vec_mask){_error_("not implemented yet");};
|
---|