Changeset 17208
- Timestamp:
- 02/04/14 14:16:16 (11 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
r17159 r17208 67 67 bool save_results; 68 68 69 /* extrapolate */70 Analysis* analysis = new ExtrapolationAnalysis();71 femmodel->parameters->SetParam(VxEnum,ExtrapolationVariableEnum);72 analysis->Core(femmodel);73 delete analysis;74 75 69 /*activate formulation: */ 76 70 femmodel->SetCurrentConfiguration(LevelsetAnalysisEnum); 77 71 72 if(VerboseSolution()) _printf0_("call computational core:\n"); 73 solutionsequence_linear(femmodel); 74 78 75 /*recover parameters: */ 79 76 femmodel->parameters->FindParam(&save_results,SaveResultsEnum); 80 81 if(VerboseSolution()) _printf0_("call computational core:\n");82 solutionsequence_linear(femmodel);83 84 77 if(save_results){ 85 78 if(VerboseSolution()) _printf0_(" saving results\n"); … … 324 317 }/*}}}*/ 325 318 319 /* Update of constraints */ 320 void LevelsetAnalysis::UpdateNoIceConstraints(FemModel* femmodel){/*{{{*/ 321 322 IssmDouble* mask_ice = GetMaskOfIce(femmodel->elements, femmodel->nodes); 323 324 for (int i=0;i<femmodel->nodes->Size();i++){ 325 Node* node=dynamic_cast<Node*>(femmodel->nodes->GetObjectByOffset(i)); 326 if(node->InAnalysis(LevelsetAnalysisEnum)){ 327 if(mask_ice[node->Sid()]==1.){//FIXME: what should be done with actual spcs to ice model? 328 // node->DofInFSet(0); /*remove spc*/ 329 } 330 else{ 331 IssmDouble defval=0.; 332 node->ApplyConstraint(1,defval); /*apply spc*/ 333 } 334 } 335 } 336 }/*}}}*/ 337 IssmDouble* LevelsetAnalysis::GetMaskOfIce(Elements* elements, Nodes* nodes){/*{{{*/ 338 339 int i; 340 IssmDouble* mask_ice = NULL; 341 Vector<IssmDouble>* vec_mask_ice = NULL; 342 Element* element = NULL; 343 344 /*Initialize vector with number of vertices*/ 345 IssmDouble numnodes=nodes->NumberOfNodes(LevelsetAnalysisEnum); 346 vec_mask_ice=new Vector<IssmDouble>(numnodes); //nodes at ice front that have ice at next time step 347 for(i=0;i<numnodes;i++) 348 vec_mask_ice[i]=0.; 349 /*Fill vector vertices that have no contact to ice: */ 350 for(i=0;i<elements->Size();i++){ 351 element=dynamic_cast<Element*>(elements->GetObjectByOffset(i)); 352 SetMaskOfIceElement(vec_mask_ice, element); 353 } 354 355 /*Assemble vector and serialize */ 356 vec_mask_ice->Assemble(); 357 mask_ice=vec_mask_ice->ToMPISerial(); 358 delete vec_mask_ice; 359 return mask_ice; 360 361 }/*}}}*/ 362 void LevelsetAnalysis::SetMaskOfIceElement(Vector<IssmDouble>* vec_mask_ice, Element* element){/*{{{*/ 363 364 /* Intermediaries */ 365 int numnodes = element->GetNumberOfNodes(); 366 367 if(element->IsIceInElement()){ 368 for(int i = 0;i<numnodes;i++){ 369 vec_mask_ice->SetValue(element->nodes[i]->Sid(),1.,INS_VAL); 370 } 371 } 372 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.h
r17098 r17208 31 31 void GetBprime(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss); 32 32 33 /* Updating constraints */ 34 void UpdateNoIceConstraints(FemModel* femmodel); 35 IssmDouble* GetMaskOfIce(Elements* elements, Nodes* nodes); 36 void SetMaskOfIceElement(Vector<IssmDouble>* vec_mask_ice, Element* element); 33 37 }; 34 38 #endif -
issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
r17193 r17208 1368 1368 1369 1369 /*If no front, return NULL*/ 1370 if(!element->Is ZeroLevelset(MaskIceLevelsetEnum)) return NULL;1370 if(!element->IsIcefront()) return NULL; 1371 1371 1372 1372 /*Intermediaries*/ … … 1391 1391 IssmDouble gravity = element->GetMaterialParameter(ConstantsGEnum); 1392 1392 element->GetVerticesCoordinates(&xyz_list); 1393 element->ZeroLevelsetCoordinates(&xyz_list_front,xyz_list,MaskIceLevelsetEnum); 1393 1394 // element->ZeroLevelsetCoordinates(&xyz_list_front,xyz_list,MaskIceLevelsetEnum); 1395 element->GetIcefrontCoordinates(&xyz_list_front,xyz_list,MaskIceLevelsetEnum); 1396 1394 1397 element->NormalSection(&normal[0],xyz_list_front); 1398 // element->GetNormalFromLSF(&normal[0]); 1395 1399 1396 1400 /*Start looping on Gaussian points*/ … … 1781 1785 1782 1786 /*If no front, return NULL*/ 1783 if(!element->Is ZeroLevelset(MaskIceLevelsetEnum)) return NULL;1787 if(!element->IsIcefront()) return NULL; 1784 1788 1785 1789 /*Intermediaries*/ … … 2204 2208 2205 2209 /*If no front, return NULL*/ 2206 if(!element->Is ZeroLevelset(MaskIceLevelsetEnum)) return NULL;2210 if(!element->IsIcefront()) return NULL; 2207 2211 2208 2212 /*Intermediaries*/ … … 2970 2974 2971 2975 /*If no front, return NULL*/ 2972 if(!element->Is ZeroLevelset(MaskIceLevelsetEnum)) return NULL;2976 if(!element->IsIcefront()) return NULL; 2973 2977 2974 2978 /*Intermediaries*/ -
issm/trunk-jpl/src/c/classes/Elements/Element.h
r17194 r17208 220 220 virtual int PressureInterpolation()=0; 221 221 virtual bool IsZeroLevelset(int levelset_enum)=0; 222 virtual bool IsIcefront(void)=0; 222 223 virtual void ZeroLevelsetCoordinates(IssmDouble** pxyz_zero,IssmDouble* xyz_list,int levelsetenum)=0; 223 224 virtual void GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum)=0; -
issm/trunk-jpl/src/c/classes/Elements/Penta.h
r17194 r17208 114 114 int PressureInterpolation(); 115 115 bool IsZeroLevelset(int levelset_enum); 116 bool IsIcefront(void){_error_("not implemented yet");}; 116 117 void ZeroLevelsetCoordinates(IssmDouble** pxyz_zero,IssmDouble* xyz_list,int levelsetenum); 117 118 void GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum){_error_("not implemented yet");}; -
issm/trunk-jpl/src/c/classes/Elements/Seg.h
r17194 r17208 159 159 void ViscousHeating(IssmDouble* pphi,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input){_error_("not implemented yet");}; 160 160 bool IsZeroLevelset(int levelset_enum){_error_("not implemented");}; 161 bool IsIcefront(void){_error_("not implemented yet");}; 161 162 void ZeroLevelsetCoordinates(IssmDouble** pxyz_zero,IssmDouble* xyz_list,int levelsetenum){_error_("not implemented");}; 162 163 void GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum){_error_("not implemented yet");}; -
issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
r17199 r17208 909 909 } 910 910 } 911 911 _assert_(nrfrontnodes==2); 912 913 /* arrange order of frontnodes such that they are oriented counterclockwise */ 914 if((NUMVERTICES+indicesfront[0]-indicesfront[1])%NUMVERTICES!=2){ 915 int index=indicesfront[0]; 916 indicesfront[0]=indicesfront[1]; 917 indicesfront[1]=index; 918 } 912 919 IssmDouble* xyz_front = xNew<IssmDouble>(3*nrfrontnodes); 913 920 /* Return nodes */ 914 921 for(i=0;i<nrfrontnodes;i++){ 915 922 for(dir=0;dir<3;dir++){ 916 xyz_front[3*i+dir]=xyz_list[indicesfront[i]+dir]; 917 } 918 } 923 xyz_front[3*i+dir]=xyz_list[3*indicesfront[i]+dir]; 924 } 925 } 926 927 // for(i=0;i<nrfrontnodes;i++){ 928 // _printf0_("coords frontnode " << i << " :["); 929 // for(dir=0;dir<3;dir++){ 930 // xyz_front[3*i+dir]=xyz_list[indicesfront[i]+dir]; 931 // _printf0_(xyz_front[3*i+dir] << "; "); 932 // } 933 // _printf0_("]\n"); 934 // } 919 935 920 936 *pxyz_front=xyz_front; … … 922 938 xDelete<int>(indicesfront); 923 939 }/*}}}*/ 924 void Tria::GetNormalFromLSF(IssmDouble * pnormal){/*{{{*/940 void Tria::GetNormalFromLSF(IssmDouble *normal){/*{{{*/ 925 941 926 942 /* Intermediaries */ … … 929 945 IssmDouble* xyz_list = NULL; 930 946 IssmDouble dlevelset[dim], norm_dlevelset; 931 IssmDouble normal[dim]={0.};932 947 933 948 /*Retrieve all inputs and parameters*/ … … 936 951 937 952 counter=0; 953 for(i=0;i<dim;i++) normal[i]=0.; 954 938 955 Gauss* gauss = this->NewGauss(2); 939 956 for(int ig=gauss->begin();ig<gauss->end();ig++){ … … 947 964 } 948 965 _assert_(counter>0); 949 for(i=0;i<dim;i++) normal[i]/counter; 950 951 pnormal=&normal[0]; 966 for(i=0;i<dim;i++) normal[i]/=IssmDouble(counter); 952 967 953 968 delete gauss; … … 2586 2601 GetInputListOnVertices(&ls[0],levelset_enum); 2587 2602 2588 /* If the level set is awlays <0, there is no ice front here*/2603 /* If levelset function changes sign, or is zero on at least two vertices, there is a zero level set here */ 2589 2604 iszerols= false; 2590 2605 if(IsIceInElement()){ … … 2597 2612 } 2598 2613 /*}}}*/ 2614 /*FUNCTION Tria::IsIcefront{{{*/ 2615 bool Tria::IsIcefront(void){ 2616 2617 bool isicefront; 2618 int i,nrice; 2619 IssmDouble ls[NUMVERTICES]; 2620 2621 /*Retrieve all inputs and parameters*/ 2622 GetInputListOnVertices(&ls[0],MaskIceLevelsetEnum); 2623 2624 /* If only one vertex has ice, there is an ice front here */ 2625 isicefront= false; 2626 if(IsIceInElement()){ 2627 nrice=0; 2628 for(i=0;i<NUMVERTICES;i++) 2629 if(ls[i]<0.) nrice++; 2630 if(nrice==1) isicefront= true; 2631 } 2632 return isicefront; 2633 } 2634 /*}}}*/ 2635 2599 2636 2600 2637 #ifdef _HAVE_RESPONSES_ -
issm/trunk-jpl/src/c/classes/Elements/Tria.h
r17194 r17208 132 132 void ZeroLevelsetCoordinates(IssmDouble** pxyz_zero,IssmDouble* xyz_list,int levelsetenum); 133 133 void GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum); 134 void GetNormalFromLSF(IssmDouble *pnormal);134 void GetNormalFromLSF(IssmDouble *normal); 135 135 bool IsZeroLevelset(int levelset_enum); 136 bool IsIcefront(void); 136 137 137 138 #ifdef _HAVE_RESPONSES_ -
issm/trunk-jpl/src/c/cores/transient_core.cpp
r17139 r17208 162 162 if(islevelset){ 163 163 if(VerboseSolution()) _printf0_(" computing movement of ice boundaries\n"); 164 analysis = new LevelsetAnalysis(); 165 analysis->Core(femmodel); 166 delete analysis; 164 165 /* extrapolate */ 166 Analysis* extanalysis = new ExtrapolationAnalysis(); 167 int vars[2] = {VxEnum, VyEnum}; 168 for(int iv=0; i<2;i++){ 169 femmodel->parameters->SetParam(vars[i],ExtrapolationVariableEnum); 170 extanalysis->Core(femmodel); 171 } 172 delete extanalysis; 173 174 LevelsetAnalysis* lsanalysis = new LevelsetAnalysis(); 175 /* solve level-set equation */ 176 lsanalysis->Core(femmodel); 177 /* update spc boundary conditions for ice model */ 178 // lsanalysis->UpdateNoIceConstraints(femmodel); 179 delete lsanalysis; 167 180 } 168 181
Note:
See TracChangeset
for help on using the changeset viewer.