Changeset 23189 for issm/trunk/src/c/analyses/LevelsetAnalysis.cpp
- Timestamp:
- 08/28/18 09:45:51 (7 years ago)
- Location:
- issm/trunk
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk
- Property svn:mergeinfo changed
/issm/trunk-jpl merged: 22823-22871,22873-22887,22894-22903,22905-23090,23092-23185,23187
- Property svn:mergeinfo changed
-
issm/trunk/src
- Property svn:mergeinfo changed
-
issm/trunk/src/c/analyses/LevelsetAnalysis.cpp
r22758 r23189 12 12 13 13 void LevelsetAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/ 14 IoModelToConstraintsx(constraints,iomodel,"md.levelset.spclevelset",LevelsetAnalysisEnum,P1Enum); 14 int finiteelement; 15 iomodel->FindConstant(&finiteelement,"md.levelset.fe"); 16 IoModelToConstraintsx(constraints,iomodel,"md.levelset.spclevelset",LevelsetAnalysisEnum,finiteelement); 15 17 } 16 18 /*}}}*/ … … 19 21 }/*}}}*/ 20 22 void LevelsetAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/ 21 int finiteelement=P1Enum; 23 int finiteelement; 24 iomodel->FindConstant(&finiteelement,"md.levelset.fe"); 22 25 if(iomodel->domaintype!=Domain2DhorizontalEnum) iomodel->FetchData(2,"md.mesh.vertexonbase","md.mesh.vertexonsurface"); 23 26 ::CreateNodes(nodes,iomodel,LevelsetAnalysisEnum,finiteelement); … … 32 35 33 36 /*Finite element type*/ 34 int finiteelement = P1Enum; 37 int finiteelement; 38 iomodel->FindConstant(&finiteelement,"md.levelset.fe"); 35 39 36 40 /*Update elements: */ … … 43 47 } 44 48 } 45 49 46 50 iomodel->FetchDataToInput(elements,"md.mask.ice_levelset",MaskIceLevelsetEnum); 47 51 iomodel->FetchDataToInput(elements,"md.initialization.vx",VxEnum); … … 177 181 178 182 /*Calving threshold*/ 179 183 180 184 /*Fetch number of nodes and dof for this finite element*/ 181 185 int numnodes = basalelement->GetNumberOfNodes(); … … 326 330 } 327 331 break; 328 332 329 333 case CalvingLevermannEnum: 330 334 calvingratex_input->GetInputValue(&c[0],gauss); … … 357 361 } 358 362 break; 359 363 360 364 case CalvingHabEnum: 361 365 lsf_slopex_input->GetInputValue(&dlsf[0],gauss); … … 378 382 } 379 383 break; 380 384 381 385 case CalvingCrevasseDepthEnum: 382 386 lsf_slopex_input->GetInputValue(&dlsf[0],gauss); … … 385 389 386 390 if(groundedice<0) meltingrate = 0.; 387 391 388 392 norm_dlsf=0.; 389 393 for(i=0;i<dim;i++) norm_dlsf+=pow(dlsf[i],2); … … 516 520 }/*}}}*/ 517 521 ElementVector* LevelsetAnalysis::CreatePVector(Element* element){/*{{{*/ 518 522 519 523 if(!element->IsOnBase()) return NULL; 520 524 Element* basalelement = element->SpawnBasalElement(); … … 525 529 IssmDouble lsf; 526 530 IssmDouble* xyz_list = NULL; 527 531 528 532 /*Fetch number of nodes and dof for this finite element*/ 529 533 int numnodes = basalelement->GetNumberOfNodes(); … … 532 536 ElementVector* pe = basalelement->NewElementVector(); 533 537 basalelement->FindParam(&dt,TimesteppingTimeStepEnum); 534 538 535 539 if(dt!=0.){ 536 540 /*Initialize basis vector*/ … … 623 627 // d=|a x b|/|b| 624 628 // with a=q-s0, b=s1-s0 625 629 626 630 /* Intermediaries */ 627 631 const int dim=2; … … 634 638 b[i]=s1[i]-s0[i]; 635 639 } 636 640 637 641 norm_b=0.; 638 642 for(i=0;i<dim;i++) … … 662 666 default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet"); 663 667 } 664 }/*}}}*/665 void LevelsetAnalysis::SetDistanceToZeroLevelsetElement(Vector<IssmDouble>* vec_signed_dist, Element* element){/*{{{*/666 667 if(!element->IsZeroLevelset(MaskIceLevelsetEnum))668 return;669 670 /* Intermediaries */671 const int dim=3;672 int i,d;673 int numvertices=element->GetNumberOfVertices();674 IssmDouble s0[dim], s1[dim], v[dim];675 IssmDouble dist,lsf_old;676 677 IssmDouble* lsf = xNew<IssmDouble>(numvertices);678 IssmDouble* sign_lsf = xNew<IssmDouble>(numvertices);679 IssmDouble* signed_dist = xNew<IssmDouble>(numvertices);680 IssmDouble* xyz_list = NULL;681 IssmDouble* xyz_list_zero = NULL;682 683 /* retrieve inputs and parameters */684 element->GetVerticesCoordinates(&xyz_list);685 element->GetInputListOnVertices(lsf,MaskIceLevelsetEnum);686 687 /* get sign of levelset function */688 for(i=0;i<numvertices;i++)689 sign_lsf[i]=(lsf[i]>=0.?1.:-1.);690 691 element->ZeroLevelsetCoordinates(&xyz_list_zero, xyz_list, MaskIceLevelsetEnum);692 for(d=0;d<dim;d++){693 s0[d]=xyz_list_zero[0+d];694 s1[d]=xyz_list_zero[3+d];695 }696 697 /* get signed_distance of vertices to zero levelset straight */698 for(i=0;i<numvertices;i++){699 for(d=0;d<dim;d++)700 v[d]=xyz_list[3*i+d];701 dist=GetDistanceToStraight(&v[0],&s0[0],&s1[0]);702 signed_dist[i]=sign_lsf[i]*dist;703 }704 705 /* insert signed_distance into vec_signed_dist, if computed distance is smaller */706 for(i=0;i<numvertices;i++){707 vec_signed_dist->GetValue(&lsf_old, element->vertices[i]->Sid());708 if(xIsNan<IssmDouble>(lsf_old) || fabs(signed_dist[i])<fabs(lsf_old))709 vec_signed_dist->SetValue(element->vertices[i]->Sid(),signed_dist[i],INS_VAL);710 }711 712 xDelete<IssmDouble>(lsf);713 xDelete<IssmDouble>(sign_lsf);714 xDelete<IssmDouble>(signed_dist);715 xDelete<IssmDouble>(xyz_list);716 xDelete<IssmDouble>(xyz_list_zero);717 668 }/*}}}*/ 718 669 void LevelsetAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/ … … 724 675 IssmDouble bed,water_depth; 725 676 IssmDouble levelset; 726 677 727 678 femmodel->parameters->FindParam(&calvinglaw,CalvingLawEnum); 728 679 … … 756 707 } 757 708 } 758 709 759 710 if(calvinglaw==CalvingHabEnum){ 760 711 … … 762 713 femmodel->elements->InputDuplicate(MaskIceLevelsetEnum, DistanceToCalvingfrontEnum); 763 714 femmodel->DistanceToFieldValue(MaskIceLevelsetEnum,0,DistanceToCalvingfrontEnum); 764 715 765 716 /*Loop over all elements of this partition*/ 766 717 for(int i=0;i<femmodel->elements->Size();i++){ 767 718 Element* element = xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i)); 768 719 769 720 rho_ice = element->GetMaterialParameter(MaterialsRhoIceEnum); 770 721 rho_water = element->GetMaterialParameter(MaterialsRhoSeawaterEnum); … … 797 748 } 798 749 } 799 750 800 751 if(calvinglaw==CalvingCrevasseDepthEnum){ 801 752 802 753 int nflipped,local_nflipped; 803 754 Vector<IssmDouble>* vec_constraint_nodes = NULL; 804 755 IssmDouble* constraint_nodes = NULL; 805 756 806 757 /*Get the DistanceToCalvingfront*/ 807 758 femmodel->elements->InputDuplicate(MaskIceLevelsetEnum,DistanceToCalvingfrontEnum); … … 895 846 gauss->GaussNode(element->GetElementType(),in); 896 847 Node* node=element->GetNode(in); 897 848 898 849 if(constraint_nodes[node->Sid()]>0.){ 899 850 node->ApplyConstraint(0,+1.);
Note:
See TracChangeset
for help on using the changeset viewer.