source:
issm/oecreview/Archive/14312-15392/ISSM-15222-15223.diff@
15393
Last change on this file since 15393 was 15393, checked in by , 12 years ago | |
---|---|
File size: 17.2 KB |
-
../trunk-jpl/src/c/solutionsequences/solutionsequence_hydro_nonlinear.cpp
10 10 void solutionsequence_hydro_nonlinear(FemModel* femmodel){ 11 11 12 12 /*solution : */ 13 Vector<IssmDouble>* ug =NULL;14 Vector<IssmDouble>* u f_sed=NULL;15 Vector<IssmDouble>* uf _epl=NULL;13 Vector<IssmDouble>* ug_sed=NULL; 14 Vector<IssmDouble>* ug_epl=NULL; 15 Vector<IssmDouble>* uf=NULL; 16 16 Vector<IssmDouble>* old_uf=NULL; 17 Vector<IssmDouble>* aged_u f_sed=NULL;18 Vector<IssmDouble>* aged_u f_epl=NULL;17 Vector<IssmDouble>* aged_ug_sed=NULL; 18 Vector<IssmDouble>* aged_ug_epl=NULL; 19 19 Vector<IssmDouble>* ys=NULL; 20 Vector<IssmDouble>* du f=NULL;20 Vector<IssmDouble>* dug=NULL; 21 21 22 22 Matrix<IssmDouble>* Kff=NULL; 23 23 Matrix<IssmDouble>* Kfs=NULL; … … 49 49 50 50 /*Iteration on the two layers + transfer*/ 51 51 femmodel->SetCurrentConfiguration(HydrologyDCInefficientAnalysisEnum); 52 GetSolutionFromInputsx(&ug, femmodel->elements, femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials, femmodel->parameters); 53 Reducevectorgtofx(&uf_sed, ug, femmodel->nodes,femmodel->parameters); _assert_(uf_sed); 52 GetSolutionFromInputsx(&ug_sed, femmodel->elements, femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials, femmodel->parameters); 54 53 if(isefficientlayer) { 55 54 femmodel->SetCurrentConfiguration(HydrologyDCEfficientAnalysisEnum); 56 GetSolutionFromInputsx(&ug, femmodel->elements, femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials, femmodel->parameters); 57 Reducevectorgtofx(&uf_epl, ug, femmodel->nodes,femmodel->parameters); 58 } 55 GetSolutionFromInputsx(&ug_epl, femmodel->elements, femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials, femmodel->parameters); 56 } 59 57 60 58 for(;;){ 61 59 sedcount=1; 62 60 eplcount=1; 63 61 //save pointer to old velocity 64 delete aged_uf_sed;aged_uf_sed=uf_sed; 62 delete aged_ug_sed; 63 aged_ug_sed=ug_sed; 65 64 if(isefficientlayer){ 66 delete aged_u f_epl;67 aged_u f_epl=uf_epl;65 delete aged_ug_epl; 66 aged_ug_epl=ug_epl; 68 67 } 69 68 70 69 femmodel->SetCurrentConfiguration(HydrologyDCInefficientAnalysisEnum); … … 72 71 InputUpdateFromConstantx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,false,ConvergedEnum); 73 72 femmodel->UpdateConstraintsx(); 74 73 femmodel->parameters->SetParam(HydrologySedimentEnum,HydrologyLayerEnum); 75 /* femmodel->HydrologyTransferx(); 76 */ 74 77 75 /*Iteration on the sediment layer*/ 78 76 for(;;){ 79 77 femmodel->HydrologyTransferx(); 80 78 femmodel->SystemMatricesx(&Kff, &Kfs, &pf,&df, &sediment_kmax); 81 79 CreateNodalConstraintsx(&ys,femmodel->nodes,HydrologyDCInefficientAnalysisEnum); 82 80 Reduceloadx(pf,Kfs,ys); delete Kfs; 83 if(sedcount>1)delete uf_sed; 84 Solverx(&uf_sed, Kff, pf,old_uf, df, femmodel->parameters); 85 delete old_uf; old_uf=uf_sed->Duplicate(); 86 delete Kff; delete pf; delete ug; delete df; 81 delete uf; 82 Solverx(&uf, Kff, pf,old_uf, df, femmodel->parameters); 83 delete old_uf; old_uf=uf->Duplicate(); 84 if(sedcount>1)delete ug_sed; /*Not on first time to avoid deleting aged_ug_sed*/ 85 delete Kff; delete pf; delete df; 87 86 88 Mergesolutionfromftogx(&ug ,uf_sed,ys,femmodel->nodes,femmodel->parameters); delete ys;89 InputUpdateFromSolutionx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,ug );87 Mergesolutionfromftogx(&ug_sed,uf,ys,femmodel->nodes,femmodel->parameters); delete ys; 88 InputUpdateFromSolutionx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,ug_sed); 90 89 ConstraintsStatex(&constraints_converged,&num_unstable_constraints, femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters); 91 90 92 91 if (!sedconverged){ … … 101 100 if(sedconverged){ 102 101 femmodel->parameters->SetParam(sediment_kmax,HydrologySedimentKmaxEnum); 103 102 InputUpdateFromConstantx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,sedconverged,ConvergedEnum); 104 InputUpdateFromSolutionx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,ug );103 InputUpdateFromSolutionx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,ug_sed); 105 104 InputUpdateFromConstantx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,sediment_kmax,HydrologySedimentKmaxEnum); 106 105 break; 107 106 } … … 121 120 femmodel->SystemMatricesx(&Kff, &Kfs, &pf,&df,NULL); 122 121 CreateNodalConstraintsx(&ys,femmodel->nodes,HydrologyDCEfficientAnalysisEnum); 123 122 Reduceloadx(pf,Kfs,ys); delete Kfs; 124 if(eplcount>1) delete uf_epl; 125 Solverx(&uf_epl, Kff, pf,old_uf, df, femmodel->parameters); 126 delete old_uf; old_uf=uf_epl->Duplicate(); 127 delete Kff;delete pf; delete ug; delete df; 128 Mergesolutionfromftogx(&ug,uf_epl,ys,femmodel->nodes,femmodel->parameters); delete ys; 129 InputUpdateFromSolutionx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,ug); 130 123 delete uf; 124 Solverx(&uf, Kff, pf,old_uf, df, femmodel->parameters); 125 delete old_uf; old_uf=uf->Duplicate(); 126 if(eplcount>1) delete ug_epl; 127 delete Kff;delete pf; 128 delete df; 129 Mergesolutionfromftogx(&ug_epl,uf,ys,femmodel->nodes,femmodel->parameters); delete ys; 130 InputUpdateFromSolutionx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,ug_epl); 131 131 ConstraintsStatex(&constraints_converged,&num_unstable_constraints, femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters); 132 132 133 133 if (!eplconverged){ … … 142 142 if(eplconverged){ 143 143 InputUpdateFromConstantx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,eplconverged,ConvergedEnum); 144 144 InputUpdateFromConstantx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,sediment_kmax,MeltingOffsetEnum); 145 InputUpdateFromSolutionx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,ug );145 InputUpdateFromSolutionx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,ug_epl); 146 146 break; 147 147 } 148 148 } … … 150 150 /*System convergence check*/ 151 151 if(!hydroconverged){ 152 152 //compute norm(du)/norm(u) 153 _assert_(aged_uf_sed); _assert_(uf_sed); 154 duf=uf_sed->Duplicate(); _assert_(duf); 155 aged_uf_sed->Copy(duf); 156 duf->AYPX(uf_sed,-1.0); 157 ndu_sed=duf->Norm(NORM_TWO); nu_sed=aged_uf_sed->Norm(NORM_TWO); 153 dug=ug_sed->Duplicate(); _assert_(dug); 154 aged_ug_sed->Copy(dug); 155 dug->AYPX(ug_sed,-1.0); 156 ndu_sed=dug->Norm(NORM_TWO); nu_sed=aged_ug_sed->Norm(NORM_TWO); 158 157 if (xIsNan<IssmDouble>(ndu_sed) || xIsNan<IssmDouble>(nu_sed)) _error_("Sed convergence criterion is NaN!"); 159 158 if (!xIsNan<IssmDouble>(eps_hyd)){ 160 159 if (!isefficientlayer){ … … 168 167 } 169 168 } 170 169 else{ 171 duf=aged_uf_epl->Duplicate(); aged_uf_epl->Copy(duf); duf->AYPX(uf_epl,-1.0); 172 ndu_epl=duf->Norm(NORM_TWO); nu_epl=aged_uf_epl->Norm(NORM_TWO); 170 dug=ug_epl->Duplicate();_assert_(dug); 171 aged_ug_epl->Copy(dug);_assert_(aged_ug_epl); 172 dug->AYPX(ug_epl,-1.0); 173 ndu_epl=dug->Norm(NORM_TWO); 174 nu_epl=aged_ug_epl->Norm(NORM_TWO); 175 173 176 if (xIsNan<IssmDouble>(ndu_epl) || xIsNan<IssmDouble>(nu_epl)) _error_("EPL convergence criterion is NaN!"); 174 177 if (ndu_epl==0.0 && nu_epl==0.0) nu_epl=1.0e-6; /*Hacking the case where the EPL is used but empty*/ 175 178 if ((ndu_epl/nu_epl)<eps_hyd && (ndu_sed/nu_sed)<eps_hyd){ … … 192 195 if(hydroconverged)break; 193 196 } 194 197 195 InputUpdateFromSolutionx(femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,ug); 198 InputUpdateFromSolutionx(femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,ug_sed); 199 InputUpdateFromSolutionx(femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,ug_epl); 196 200 197 201 /*Free ressources: */ 198 delete ug ;199 delete u f_sed;200 delete uf _epl;202 delete ug_epl; 203 delete ug_sed; 204 delete uf; 201 205 delete old_uf; 202 delete aged_u f_sed;203 delete aged_u f_epl;204 delete du f;206 delete aged_ug_sed; 207 delete aged_ug_epl; 208 delete dug; 205 209 206 210 } -
../trunk-jpl/src/c/classes/DofIndexing.cpp
159 159 else _error_("set of enum type " << EnumToStringx(setenum) << " not supported yet!"); 160 160 } 161 161 /*}}}*/ 162 /*FUNCTION DofIndexing::Deactivate{{{*/163 void DofIndexing::Deactivate(void){164 this->active = false;165 162 166 /*Constrain to 0. at this point*/167 for(int i=0;i<this->gsize;i++){168 this->f_set[i] = false;169 this->s_set[i] = true;170 this->svalues[i] = 0.;171 }172 return;173 }174 /*}}}*/175 176 163 /*Some of the Object functionality: */ 177 164 /*FUNCTION DofIndexing::Echo{{{*/ 178 165 void DofIndexing::Echo(void){ … … 234 221 _printf_("\n"); 235 222 } 236 223 /*}}}*/ 224 /*FUNCTION DofIndexing::Deactivate{{{*/ 225 void DofIndexing::Deactivate(void){ 226 this->active = false; 227 228 /*Constrain to 0. at this point*/ 229 for(int i=0;i<this->gsize;i++){ 230 this->f_set[i] = false; 231 this->s_set[i] = true; 232 this->svalues[i] = 0.; 233 } 234 return; 235 } 236 /*}}}*/ 237 /*FUNCTION DofIndexing::Activate{{{*/ 238 void DofIndexing::Activate(void){ 239 this->active = true; 240 241 /*Constrain to 0. at this point*/ 242 for(int i=0;i<this->gsize;i++){ 243 this->f_set[i] = true; 244 this->s_set[i] = false; 245 this->svalues[i] = 0.; 246 } 247 return; 248 } 249 /*}}}*/ -
../trunk-jpl/src/c/classes/FemModel.cpp
667 667 /*}}}*/ 668 668 void FemModel::UpdateConstraintsx(void){ /*{{{*/ 669 669 670 Element *element = NULL; 670 671 IssmDouble time; 671 int analysis_type;672 int analysis_type; 672 673 673 674 /*retrieve parameters: */ 674 675 parameters->FindParam(&analysis_type,AnalysisTypeEnum); … … 677 678 /*start module: */ 678 679 if(VerboseModule()) _printf0_(" Updating constraints for time: " << time << "\n"); 679 680 680 /*First, update dof constraints in nodes, using constraints: */ 681 /*First, Nodes might be activated/deactivated by element*/ 682 for(int i=0;i<elements->Size();i++){ 683 element=dynamic_cast<Element*>(elements->GetObjectByOffset(i)); 684 element->UpdateConstraints(); 685 } 686 687 /*Second, constraints might be time dependent: */ 681 688 SpcNodesx(nodes,constraints,parameters,analysis_type); 682 689 683 690 /*Now, update degrees of freedoms: */ -
../trunk-jpl/src/c/classes/Node.h
86 86 void GetDofList(int* poutdoflist,int approximation_enum,int setenum); 87 87 void GetLocalDofList(int* poutdoflist,int approximation_enum,int setenum); 88 88 void FreezeDof(int dof); 89 void Activate(void); 89 90 void Deactivate(void); 90 91 int IsFloating(); 91 92 int IsGrounded(); -
../trunk-jpl/src/c/classes/Elements/Element.h
134 134 #ifdef _HAVE_HYDROLOGY_ 135 135 virtual void GetHydrologyDCInefficientHmax(IssmDouble* ph_max, Node* innode)=0; 136 136 virtual void GetHydrologyTransfer(Vector<IssmDouble>* transfer)=0; 137 virtual void UpdateConstraints(void)=0; 137 138 #endif 138 139 }; 139 140 #endif -
../trunk-jpl/src/c/classes/Elements/Tria.cpp
2819 2819 this->parameters=NULL; 2820 2820 } 2821 2821 /*}}}*/ 2822 /*FUNCTION Tria::UpdateConstraints{{{*/ 2823 void Tria::UpdateConstraints(void){ 2824 2825 int analysis_type; 2826 parameters->FindParam(&analysis_type,AnalysisTypeEnum); 2827 2828 /*Skip if water element*/ 2829 if(IsOnWater()) return; 2830 2831 /*Just branch to the correct element stiffness matrix generator, according to the type of analysis we are carrying out: */ 2832 switch(analysis_type){ 2833 #ifdef _HAVE_HYDROLOGY_ 2834 case HydrologyDCEfficientAnalysisEnum: 2835 this->HydrologyUpdateEplDomain(); 2836 break; 2837 #endif 2838 } 2839 2840 } 2841 /*}}}*/ 2822 2842 /*FUNCTION Tria::UpdatePotentialUngrounding{{{*/ 2823 2843 int Tria::UpdatePotentialUngrounding(IssmDouble* vertices_potentially_ungrounding,Vector<IssmDouble>* vec_nodes_on_iceshelf,IssmDouble* nodes_on_iceshelf){ 2824 2844 … … 6406 6426 GetDofList(&doflist,NoneApproximationEnum,GsetEnum); 6407 6427 6408 6428 /*Get the flag to know if the efficient layer is present*/ 6409 6429 this->parameters->FindParam(&isefficientlayer,HydrologydcIsefficientlayerEnum); 6410 6430 6411 6431 /*Use the dof list to index into the solution vector: */ 6412 6432 for(int i=0;i<numdof;i++){ … … 6590 6610 } 6591 6611 6592 6612 /*}}}*/ 6613 /*FUNCTION Tria::HydrologyUpdateEplDomain{{{*/ 6614 void Tria::HydrologyUpdateEplDomain(void){ 6615 6616 /*Intermediaries*/ 6617 const int numdof = NDOF1 *NUMVERTICES; 6618 bool isefficientlayer; 6619 IssmDouble activeEpl[numdof]; 6620 6621 /*Get parameter and Inout list*/ 6622 this->parameters->FindParam(&isefficientlayer,HydrologydcIsefficientlayerEnum); 6623 GetInputListOnVertices(&activeEpl[0],HydrologydcMaskEplactiveEnum); 6624 6625 if(isefficientlayer){ 6626 for(int i=0;i<numdof;i++){ 6627 if(activeEpl[i]==1.0) 6628 nodes[i]->Activate(); 6629 else if (activeEpl[i]==0.0) 6630 nodes[i]->Deactivate(); 6631 else 6632 _error_("activation value "<< activeEpl[i] <<" not supported"); 6633 } 6634 } 6635 } 6636 /*}}}*/ 6593 6637 #endif 6594 6638 6595 6639 #ifdef _HAVE_DAKOTA_ -
../trunk-jpl/src/c/classes/Elements/Tria.h
249 249 void GetSolutionFromInputsHydrologyDCInefficient(Vector<IssmDouble>* solution); 250 250 void GetSolutionFromInputsHydrologyDCEfficient(Vector<IssmDouble>* solution); 251 251 void CreateHydrologyWaterVelocityInput(void); 252 void HydrologyUpdateEplDomain(void); 253 void UpdateConstraints(void); 252 254 void InputUpdateFromSolutionHydrology(IssmDouble* solution); 253 255 void InputUpdateFromSolutionHydrologyShreve(IssmDouble* solution); 254 256 void InputUpdateFromSolutionHydrologyDC(IssmDouble* solution); -
../trunk-jpl/src/c/classes/Elements/Penta.cpp
3188 3188 return nflipped; 3189 3189 } 3190 3190 /*}}}*/ 3191 /*FUNCTION Penta::UpdateConstraints{{{*/ 3192 void Penta::UpdateConstraints(void){ 3193 3194 /*Do nothing for now*/ 3195 3196 } 3197 /*}}}*/ 3191 3198 /*FUNCTION Penta::ViscousHeatingCreateInput {{{*/ 3192 3199 void Penta::ViscousHeatingCreateInput(void){ 3193 3200 … … 9230 9237 } 9231 9238 /*}}}*/ 9232 9239 #endif 9233 9234 9240 #ifdef _HAVE_BALANCED_ 9235 9241 /*FUNCTION Penta::CreateKMatrixBalancethickness {{{*/ 9236 9242 ElementMatrix* Penta::CreateKMatrixBalancethickness(void){ -
../trunk-jpl/src/c/classes/Elements/Penta.h
303 303 #endif 304 304 305 305 #ifdef _HAVE_HYDROLOGY_ 306 void CreateHydrologyWaterVelocityInput(void);306 void UpdateConstraints(void); 307 307 void GetHydrologyDCInefficientHmax(IssmDouble* ph_max, Node* innode); 308 308 void GetHydrologyTransfer(Vector<IssmDouble>* transfer); 309 309 #endif -
../trunk-jpl/src/c/classes/DofIndexing.h
48 48 /*}}}*/ 49 49 /*DofIndexing management: {{{*/ 50 50 DofIndexing* Spawn(int* indices, int numindices); 51 void Activate(void); 51 52 void Deactivate(void); 52 53 /*}}}*/ 53 54 -
../trunk-jpl/src/c/classes/Node.cpp
498 498 499 499 } 500 500 /*}}}*/ 501 /*FUNCTION Node::Activate{{{*/ 502 void Node::Activate(void){ 503 504 indexing.Activate(); 505 506 } 507 /*}}}*/ 501 508 /*FUNCTION Node::GetApproximation {{{*/ 502 509 int Node::GetApproximation(){ 503 510
Note:
See TracBrowser
for help on using the repository browser.