Changeset 19094
- Timestamp:
- 02/06/15 16:44:07 (10 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp
r19092 r19094 672 672 int eplflip_lock; 673 673 int numnodes =basalelement->GetNumberOfNodes(); 674 IssmDouble new_active;675 IssmDouble recurent;676 674 IssmDouble* epl_thickness =xNew<IssmDouble>(numnodes); 677 675 IssmDouble* old_active =xNew<IssmDouble>(numnodes); … … 700 698 for(i=0;i<numnodes;i++){ 701 699 702 /*Dealing with the initial value to define zigzaging, preceding iteration the first time we see the node and current evolving vector after*/ 703 recurence->GetValue(&recurent,basalelement->nodes[i]->Sid()); 704 if (recurent>0)vec_mask->GetValue(&old_active[i],basalelement->nodes[i]->Sid()); 705 new_active=old_active[i]; 706 recurence->SetValue(basalelement->nodes[i]->Sid(),1.,ADD_VAL); 700 /*If node is now closed bring its thickness back to initial*/ 701 if (old_active[i]==0.){ 702 epl_thickness[i]=init_thick; 703 } 707 704 708 705 /*Now starting to look at the activations*/ 709 706 if(residual[i]>0.){ 710 707 vec_mask->SetValue(basalelement->nodes[i]->Sid(),1.,INS_VAL); 711 new_active=1.0;708 if(old_active[i]==0.) recurence->SetValue(basalelement->nodes[i]->Sid(),1.,INS_VAL); 712 709 } 713 710 /*If mask was already one, keep one or colapse*/ 714 711 else if(old_active[i]>0.){ 715 712 vec_mask->SetValue(basalelement->nodes[i]->Sid(),1.,INS_VAL); 716 new_active=1.0;717 713 /*If epl thickness gets under colapse thickness, close the layer*/ 718 714 if(epl_thickness[i]<colapse_thick){ 719 715 vec_mask->SetValue(basalelement->nodes[i]->Sid(),0.,INS_VAL); 720 new_active=0.0;716 recurence->SetValue(basalelement->nodes[i]->Sid(),1.,INS_VAL); 721 717 } 722 718 } … … 728 724 if(sedhead[j] == sedheadmin){ 729 725 vec_mask->SetValue(basalelement->nodes[j]->Sid(),1.,INS_VAL); 726 if(old_active[i]==0.) recurence->SetValue(basalelement->nodes[i]->Sid(),1.,INS_VAL); 730 727 } 731 728 } 732 }733 /*Now checking for nodes zigzaging between open and close*/734 if (old_active[i] != new_active){735 eplzigzag_counter[basalelement->nodes[i]->Lid()] ++;736 /*If node changed too much of state, fix it to it's last known state*/737 if(eplzigzag_counter[basalelement->nodes[i]->Lid()]>eplflip_lock & eplflip_lock!=0){738 vec_mask->SetValue(basalelement->nodes[i]->Sid(),old_active[i],INS_VAL);739 new_active=old_active[i];740 }741 }742 /*If node is now closed bring its thickness back to initial*/743 if (new_active==0.){744 epl_thickness[i]=init_thick;745 729 } 746 730 } -
issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
r19033 r19094 556 556 557 557 Vector<IssmDouble>* vec_dist_zerolevelset = NULL; 558 GetVectorFromInputsx(&vec_dist_zerolevelset, femmodel, MaskIceLevelsetEnum, Vertex Enum);558 GetVectorFromInputsx(&vec_dist_zerolevelset, femmodel, MaskIceLevelsetEnum, VertexPIdEnum); 559 559 560 560 /* set NaN on elements intersected by zero levelset */ -
issm/trunk-jpl/src/c/analyses/LsfReinitializationAnalysis.cpp
r18930 r19094 417 417 418 418 Vector<IssmDouble>* vec_dist_zerolevelset = NULL; 419 GetVectorFromInputsx(&vec_dist_zerolevelset, femmodel, MaskIceLevelsetEnum, Vertex Enum);419 GetVectorFromInputsx(&vec_dist_zerolevelset, femmodel, MaskIceLevelsetEnum, VertexPIdEnum); 420 420 421 421 /* set distance on elements intersected by zero levelset */ -
issm/trunk-jpl/src/c/classes/Elements/Element.cpp
r19019 r19094 862 862 } 863 863 /*}}}*/ 864 void Element::GetVectorFromInputs(Vector<IssmDouble>* vector,int input_enum){/*{{{*/ 864 /* void Element::GetVectorFromInputs(Vector<IssmDouble>* vector,int input_enum){/\*{{{*\/ */ 865 866 /* /\*Fetch number vertices for this element and allocate arrays*\/ */ 867 /* int numvertices = this->GetNumberOfVertices(); */ 868 /* int* vertexpidlist = xNew<int>(numvertices); */ 869 /* IssmDouble* values = xNew<IssmDouble>(numvertices); */ 870 871 /* /\*Fill in values*\/ */ 872 /* this->GetVertexPidList(vertexpidlist); */ 873 /* this->GetInputListOnVertices(values,input_enum); */ 874 /* vector->SetValues(numvertices,vertexpidlist,values,INS_VAL); */ 875 876 /* /\*Clean up*\/ */ 877 /* xDelete<int>(vertexpidlist); */ 878 /* xDelete<IssmDouble>(values); */ 879 880 /* } */ 881 /* /\*}}}*\/ */ 882 void Element::GetVectorFromInputs(Vector<IssmDouble>* vector,int input_enum,int type){/*{{{*/ 865 883 866 884 /*Fetch number vertices for this element and allocate arrays*/ 867 int numvertices = this->GetNumberOfVertices(); 868 int* vertexpidlist = xNew<int>(numvertices); 869 IssmDouble* values = xNew<IssmDouble>(numvertices); 870 871 /*Fill in values*/ 872 this->GetVertexPidList(vertexpidlist); 873 this->GetInputListOnVertices(values,input_enum); 874 vector->SetValues(numvertices,vertexpidlist,values,INS_VAL); 875 885 int numvertices = this->GetNumberOfVertices(); 886 int numnodes = this->GetNumberOfNodes(); 887 int* doflist = NULL; 888 IssmDouble* values = NULL; 889 890 switch(type){ 891 case VertexPIdEnum: 892 doflist = xNew<int>(numvertices); 893 values = xNew<IssmDouble>(numvertices); 894 /*Fill in values*/ 895 this->GetVertexPidList(doflist); 896 this->GetInputListOnVertices(values,input_enum); 897 vector->SetValues(numvertices,doflist,values,INS_VAL); 898 break; 899 case VertexSIdEnum: 900 doflist = xNew<int>(numvertices); 901 values = xNew<IssmDouble>(numvertices); 902 /*Fill in values*/ 903 this->GetVerticesSidList(doflist); 904 this->GetInputListOnVertices(values,input_enum); 905 vector->SetValues(numvertices,doflist,values,INS_VAL); 906 break; 907 case NodesEnum: 908 doflist = xNew<int>(numnodes); 909 values = xNew<IssmDouble>(numnodes); 910 /*Fill in values*/ 911 this->GetInputListOnNodes(values,input_enum); 912 this->GetDofList(&doflist,NoneApproximationEnum,GsetEnum); 913 vector->SetValues(numnodes,doflist,values,INS_VAL); 914 break; 915 case NodeSIdEnum: 916 doflist = xNew<int>(numnodes); 917 values = xNew<IssmDouble>(numnodes); 918 /*Fill in values*/ 919 this->GetNodesSidList(doflist); 920 this->GetInputListOnNodes(values,input_enum); 921 vector->SetValues(numnodes,doflist,values,INS_VAL); 922 break; 923 default: 924 _error_("type " << type << " (" << EnumToStringx(type) << ") not implemented yet"); 925 } 926 876 927 /*Clean up*/ 877 xDelete<int>( vertexpidlist);928 xDelete<int>(doflist); 878 929 xDelete<IssmDouble>(values); 879 930 -
issm/trunk-jpl/src/c/classes/Elements/Element.h
r19061 r19094 96 96 void GetNodesSidList(int* sidlist); 97 97 void GetPhi(IssmDouble* phi, IssmDouble* epsilon, IssmDouble viscosity); 98 void GetVectorFromInputs(Vector<IssmDouble>* vector, int name_enum );98 void GetVectorFromInputs(Vector<IssmDouble>* vector, int name_enum, int type); 99 99 void GetVertexPidList(int* pidlist); 100 100 void GetVerticesConnectivityList(int* connectivitylist); -
issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
r19085 r19094 1943 1943 1944 1944 case NodesEnum: 1945 1946 1945 /*Get number of nodes and dof list: */ 1947 1946 numnodes = this->NumberofNodes(this->element_type); … … 1957 1956 1958 1957 case NodeSIdEnum: 1959 1960 1958 /*Get number of nodes and dof list: */ 1961 1959 numnodes = this->NumberofNodes(this->element_type); -
issm/trunk-jpl/src/c/classes/FemModel.cpp
r19091 r19094 611 611 612 612 /*get vertex vectors for bed and thickness: */ 613 GetVectorFromInputsx(&surface ,this, SurfaceEnum,Vertex Enum);614 GetVectorFromInputsx(&bed ,this, BaseEnum, VertexEnum);613 GetVectorFromInputsx(&surface ,this, SurfaceEnum,VertexPIdEnum); 614 GetVectorFromInputsx(&bed ,this, BaseEnum, VertexPIdEnum); 615 615 616 616 /*Allocate vector*/ … … 1831 1831 1832 1832 /*this response was scaled. pick up the response from the inputs: */ 1833 GetVectorFromInputsx(&vertex_response,this, StringToEnumx(root),Vertex Enum);1833 GetVectorFromInputsx(&vertex_response,this, StringToEnumx(root),VertexPIdEnum); 1834 1834 1835 1835 /*Now, average it onto the partition nodes: */ … … 1914 1914 Vector<IssmDouble>* mask = NULL; 1915 1915 Vector<IssmDouble>* recurence = NULL; 1916 Vector<IssmDouble>* active = NULL; 1916 1917 IssmDouble* serial_mask = NULL; 1917 Vector<IssmDouble>* active= NULL;1918 IssmDouble* serial_rec = NULL; 1918 1919 IssmDouble* serial_active = NULL; 1920 IssmDouble* old_active = NULL; 1919 1921 int* eplzigzag_counter = NULL; 1920 1922 int eplflip_lock; 1923 1921 1924 HydrologyDCEfficientAnalysis* effanalysis = new HydrologyDCEfficientAnalysis(); 1922 1925 HydrologyDCInefficientAnalysis* inefanalysis = new HydrologyDCInefficientAnalysis(); 1926 1923 1927 /*Step 1: update mask, the mask might be extended by residual and/or using downstream sediment head*/ 1924 1928 mask=new Vector<IssmDouble>(this->nodes->NumberOfNodes(HydrologyDCEfficientAnalysisEnum)); 1925 1929 recurence=new Vector<IssmDouble>(this->nodes->NumberOfNodes(HydrologyDCEfficientAnalysisEnum)); 1926 1930 this->parameters->FindParam(&eplzigzag_counter,NULL,EplZigZagCounterEnum); 1931 this->parameters->FindParam(&eplflip_lock,HydrologydcEplflipLockEnum); 1932 GetVectorFromInputsx(&old_active,this,HydrologydcMaskEplactiveNodeEnum,NodeSIdEnum); 1933 1927 1934 for (int i=0;i<elements->Size();i++){ 1928 1935 Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i)); 1929 1936 effanalysis->HydrologyEPLGetMask(mask,recurence,eplzigzag_counter,element); 1930 1937 } 1938 /*check for changes and increment zigzag counter, change the mask if necessary*/ 1939 recurence->Assemble(); 1940 serial_rec=recurence->ToMPISerial(); 1941 for (int i=0;i<nodes->Size();i++){ 1942 Node* node=xDynamicCast<Node*>(nodes->GetObjectByOffset(i)); 1943 if(serial_rec[node->Sid()]==1.)eplzigzag_counter[node->Lid()] ++; 1944 if(eplzigzag_counter[node->Lid()]>eplflip_lock & eplflip_lock!=0){ 1945 mask->SetValue(node->Sid(),old_active[node->Sid()],INS_VAL); 1946 } 1947 } 1948 1949 1931 1950 this->parameters->SetParam(eplzigzag_counter,this->nodes->Size(),EplZigZagCounterEnum); 1932 1951 /*Assemble and serialize*/ 1933 1952 mask->Assemble(); 1934 serial_mask=mask->ToMPISerial(); 1953 serial_mask=mask->ToMPISerial(); 1954 1935 1955 xDelete<int>(eplzigzag_counter); 1936 1956 delete mask; -
issm/trunk-jpl/src/c/modules/GetVectorFromInputsx/GetVectorFromInputsx.cpp
r18521 r19094 7 7 #include "../../toolkits/toolkits.h" 8 8 9 void GetVectorFromInputsx( 9 void GetVectorFromInputsx(Vector<IssmDouble>** pvector,FemModel* femmodel,int name,int type){ 10 10 11 11 int i; 12 12 Vector<IssmDouble>* vector=NULL; 13 13 14 if(type==VertexEnum){ 15 16 /*Allocate vector*/ 14 switch(type){ 15 case VertexPIdEnum: case VertexSIdEnum: 17 16 vector=new Vector<IssmDouble>(femmodel->vertices->NumberOfVertices()); 18 19 /*Look up in elements*/20 for(i=0;i<femmodel->elements->Size();i++){21 Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));22 element->GetVectorFromInputs(vector,name);23 }17 break; 18 case NodesEnum:case NodeSIdEnum: 19 vector=new Vector<IssmDouble>(femmodel->nodes->NumberOfNodes()); 20 break; 21 default: 22 _error_("vector type: " << EnumToStringx(type) << " not supported yet!"); 24 23 } 25 else{ 26 _error_("vector type: " << EnumToStringx(type) << " not supported yet!"); 24 /*Look up in elements*/ 25 for(i=0;i<femmodel->elements->Size();i++){ 26 Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i)); 27 element->GetVectorFromInputs(vector,name,type); 27 28 } 28 29 -
issm/trunk-jpl/src/c/modules/GroundinglineMigrationx/GroundinglineMigrationx.cpp
r18909 r19094 142 142 for(i=0;i<elements->Size();i++){ 143 143 Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i)); 144 element->GetVectorFromInputs(vec_phi,MaskGroundediceLevelsetEnum );144 element->GetVectorFromInputs(vec_phi,MaskGroundediceLevelsetEnum,VertexPIdEnum); 145 145 } 146 146 vec_phi->Assemble(); -
issm/trunk-jpl/src/c/solutionsequences/solutionsequence_la.cpp
r18654 r19094 44 44 Vector<IssmDouble>* vel_old = NULL; 45 45 Vector<IssmDouble>* vel_old_local = NULL; 46 GetVectorFromInputsx(&vel,femmodel,VxEnum,Vertex Enum);47 GetVectorFromInputsx(&pug,femmodel,PressureEnum,Vertex Enum);46 GetVectorFromInputsx(&vel,femmodel,VxEnum,VertexPIdEnum); 47 GetVectorFromInputsx(&pug,femmodel,PressureEnum,VertexPIdEnum); 48 48 49 49 while(true){ … … 70 70 /*Update solution*/ 71 71 InputUpdateFromSolutionx(femmodel,ug); delete ug; 72 GetVectorFromInputsx(&vel,femmodel,VxEnum,Vertex Enum);72 GetVectorFromInputsx(&vel,femmodel,VxEnum,VertexPIdEnum); 73 73 /*Check for convergence*/ 74 74 Vector<IssmDouble>* dvel_local=vel_old_local->Duplicate(); vel_old_local->Copy(dvel_local); dvel_local->AYPX(vel,-1.0); … … 101 101 /*Update solution*/ 102 102 InputUpdateFromSolutionx(femmodel,pug); delete pug; 103 GetVectorFromInputsx(&pug,femmodel,PressureEnum,Vertex Enum);103 GetVectorFromInputsx(&pug,femmodel,PressureEnum,VertexPIdEnum); 104 104 105 105 /*Check for convergence*/ -
issm/trunk-jpl/src/c/solutionsequences/solutionsequence_la_theta.cpp
r17678 r19094 41 41 Vector<IssmDouble>* vx = NULL; 42 42 Vector<IssmDouble>* vx_old = NULL; 43 GetVectorFromInputsx(&vx,femmodel,VxEnum,Vertex Enum);43 GetVectorFromInputsx(&vx,femmodel,VxEnum,VertexPIdEnum); 44 44 45 45 while(true){ … … 69 69 analysis->InputUpdateFromSolutionFSXTH_d( femmodel->elements,femmodel->parameters); 70 70 analysis->InputUpdateFromSolutionFSXTH_tau(femmodel->elements,femmodel->parameters); 71 GetVectorFromInputsx(&vx,femmodel,VxEnum,Vertex Enum);71 GetVectorFromInputsx(&vx,femmodel,VxEnum,VertexPIdEnum); 72 72 73 73 /*Check for convergence*/
Note:
See TracChangeset
for help on using the changeset viewer.