Changeset 16805
- Timestamp:
- 11/16/13 14:27:12 (11 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/L2ProjectionBaseAnalysis.cpp
r16782 r16805 59 59 }/*}}}*/ 60 60 ElementVector* L2ProjectionBaseAnalysis::CreatePVector(Element* element){/*{{{*/ 61 _error_("not implemented yet"); 61 62 /*Intermediaries*/ 63 int meshtype; 64 Element* basalelement; 65 66 /*Get basal element*/ 67 element->FindParam(&meshtype,MeshTypeEnum); 68 switch(meshtype){ 69 case Mesh2DhorizontalEnum: 70 basalelement = element; 71 break; 72 case Mesh3DEnum: 73 if(!element->IsOnBed()) return NULL; 74 basalelement = element->SpawnBasalElement(); 75 break; 76 default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet"); 77 } 78 79 /*Intermediaries */ 80 int input_enum; 81 IssmDouble Jdet,value,slopes[2]; 82 Input *input = NULL; 83 Input *input2 = NULL; 84 IssmDouble *xyz_list = NULL; 85 86 /*Fetch number of nodes and dof for this finite element*/ 87 int numnodes = basalelement->GetNumberOfNodes(); 88 89 /*Initialize Element vector*/ 90 ElementVector* pe = basalelement->NewElementVector(); 91 IssmDouble* basis = xNew<IssmDouble>(numnodes); 92 93 /*Retrieve all inputs and parameters*/ 94 basalelement->GetVerticesCoordinates(&xyz_list); 95 basalelement->FindParam(&input_enum,InputToL2ProjectEnum); 96 switch(input_enum){ 97 case SurfaceSlopeXEnum: input2 = basalelement->GetInput(SurfaceEnum); _assert_(input2); break; 98 case SurfaceSlopeYEnum: input2 = basalelement->GetInput(SurfaceEnum); _assert_(input2); break; 99 case BedSlopeXEnum: input2 = basalelement->GetInput(BedEnum); _assert_(input2); break; 100 case BedSlopeYEnum: input2 = basalelement->GetInput(BedEnum); _assert_(input2); break; 101 default: input = element->GetInput(input_enum); 102 } 103 104 /* Start looping on the number of gaussian points: */ 105 Gauss* gauss=basalelement->NewGauss(2); 106 for(int ig=gauss->begin();ig<gauss->end();ig++){ 107 gauss->GaussPoint(ig); 108 109 basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss); 110 basalelement->NodalFunctions(basis,gauss); 111 112 if(input2) input2->GetInputDerivativeValue(&slopes[0],xyz_list,gauss); 113 switch(input_enum){ 114 case SurfaceSlopeXEnum: case BedSlopeXEnum: value = slopes[0]; break; 115 case SurfaceSlopeYEnum: case BedSlopeYEnum: value = slopes[1]; break; 116 default: input->GetInputValue(&value,gauss); 117 } 118 119 for(int i=0;i<numnodes;i++) pe->values[i]+=Jdet*gauss->weight*value*basis[i]; 120 } 121 122 /*Clean up and return*/ 123 xDelete<IssmDouble>(xyz_list); 124 xDelete<IssmDouble>(basis); 125 delete gauss; 126 if(meshtype!=Mesh2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;}; 127 return pe; 62 128 }/*}}}*/ 63 129 void L2ProjectionBaseAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/ -
issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
r16804 r16805 814 814 case HOApproximationEnum: 815 815 return CreatePVectorHO(element); 816 case FSApproximationEnum: 817 return CreatePVectorFS(element); 818 case NoneApproximationEnum: 819 return NULL; 816 820 default: 817 821 _error_("Approximation "<<EnumToStringx(approximation)<<" not supported"); 818 822 } 823 }/*}}}*/ 824 ElementVector* StressbalanceAnalysis::CreatePVectorFS(Element* element){/*{{{*/ 825 826 /*compute all load vectors for this element*/ 827 ElementVector* pe1=CreatePVectorFSViscous(element); 828 ElementVector* pe2=CreatePVectorFSShelf(element); 829 ElementVector* pe3=CreatePVectorFSFront(element); 830 ElementVector* pe =new ElementVector(pe1,pe2,pe3); 831 832 /*clean-up and return*/ 833 delete pe1; 834 delete pe2; 835 delete pe3; 836 return pe; 837 }/*}}}*/ 838 ElementVector* StressbalanceAnalysis::CreatePVectorFSViscous(Element* element){/*{{{*/ 839 840 int i,meshtype,dim; 841 IssmDouble Jdet,forcex,forcey,forcez; 842 IssmDouble *xyz_list = NULL; 843 844 /*Get problem dimension*/ 845 element->FindParam(&meshtype,MeshTypeEnum); 846 switch(meshtype){ 847 case Mesh2DverticalEnum: dim = 2; break; 848 case Mesh3DEnum: dim = 3; break; 849 default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet"); 850 } 851 852 /*Fetch number of nodes and dof for this finite element*/ 853 int vnumnodes = element->GetNumberOfNodesVelocity(); 854 int pnumnodes = element->GetNumberOfNodesPressure(); 855 856 /*Prepare coordinate system list*/ 857 int* cs_list = xNew<int>(vnumnodes+pnumnodes); 858 if(dim==2) for(i=0;i<vnumnodes;i++) cs_list[i] = XYEnum; 859 else for(i=0;i<vnumnodes;i++) cs_list[i] = XYZEnum; 860 for(i=0;i<pnumnodes;i++) cs_list[vnumnodes+i] = PressureEnum; 861 862 /*Initialize vectors*/ 863 ElementVector* pe = element->NewElementVector(FSvelocityEnum); 864 IssmDouble* vbasis = xNew<IssmDouble>(vnumnodes); 865 866 /*Retrieve all inputs and parameters*/ 867 element->GetVerticesCoordinates(&xyz_list); 868 Input* loadingforcex_input=element->GetInput(LoadingforceXEnum); _assert_(loadingforcex_input); 869 Input* loadingforcey_input=element->GetInput(LoadingforceYEnum); _assert_(loadingforcey_input); 870 Input* loadingforcez_input=element->GetInput(LoadingforceZEnum); _assert_(loadingforcez_input); 871 IssmDouble rho_ice =element->GetMaterialParameter(MaterialsRhoIceEnum); 872 IssmDouble gravity =element->GetMaterialParameter(ConstantsGEnum); 873 874 /* Start looping on the number of gaussian points: */ 875 Gauss* gauss=element->NewGauss(5); 876 for(int ig=gauss->begin();ig<gauss->end();ig++){ 877 gauss->GaussPoint(ig); 878 879 element->JacobianDeterminant(&Jdet,xyz_list,gauss); 880 element->NodalFunctionsVelocity(vbasis,gauss); 881 882 loadingforcex_input->GetInputValue(&forcex,gauss); 883 loadingforcey_input->GetInputValue(&forcey,gauss); 884 if(dim==3) loadingforcez_input->GetInputValue(&forcez,gauss); 885 886 for(i=0;i<vnumnodes;i++){ 887 pe->values[i*dim+0] += +rho_ice*forcex *Jdet*gauss->weight*vbasis[i]; 888 pe->values[i*dim+1] += +rho_ice*forcey *Jdet*gauss->weight*vbasis[i]; 889 if(dim==3){ 890 pe->values[i*dim+2] += +rho_ice*forcez*Jdet*gauss->weight*vbasis[i]; 891 pe->values[i*dim+2] += -rho_ice*gravity*Jdet*gauss->weight*vbasis[i]; 892 } 893 else{ 894 pe->values[i*dim+1] += -rho_ice*gravity*Jdet*gauss->weight*vbasis[i]; 895 } 896 } 897 } 898 899 /*Transform coordinate system*/ 900 element->TransformLoadVectorCoord(pe,cs_list); 901 902 /*Clean up and return*/ 903 delete gauss; 904 xDelete<int>(cs_list); 905 xDelete<IssmDouble>(vbasis); 906 xDelete<IssmDouble>(xyz_list); 907 return pe; 908 }/*}}}*/ 909 ElementVector* StressbalanceAnalysis::CreatePVectorFSShelf(Element* element){/*{{{*/ 910 911 return NULL; 912 }/*}}}*/ 913 ElementVector* StressbalanceAnalysis::CreatePVectorFSFront(Element* element){/*{{{*/ 914 915 return NULL; 819 916 }/*}}}*/ 820 917 ElementVector* StressbalanceAnalysis::CreatePVectorHO(Element* element){/*{{{*/ … … 916 1013 917 1014 /*Initialize Element vector and vectors*/ 918 ElementVector* pe =element->NewElementVector(SSAApproximationEnum);1015 ElementVector* pe = element->NewElementVector(SSAApproximationEnum); 919 1016 IssmDouble* basis = xNew<IssmDouble>(numnodes); 920 1017 … … 1146 1243 /*Prepare coordinate system list*/ 1147 1244 int* cs_list = xNew<int>(vnumnodes+pnumnodes); 1148 if(dim==2){ 1149 for(i=0;i<vnumnodes;i++) cs_list[i] = XYEnum; 1150 } 1151 else{ 1152 for(i=0;i<vnumnodes;i++) cs_list[i] = XYZEnum; 1153 } 1245 if(dim==2) for(i=0;i<vnumnodes;i++) cs_list[i] = XYEnum; 1246 else for(i=0;i<vnumnodes;i++) cs_list[i] = XYZEnum; 1154 1247 for(i=0;i<pnumnodes;i++) cs_list[vnumnodes+i] = PressureEnum; 1155 1248 -
issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.h
r16804 r16805 23 23 ElementMatrix* CreateKMatrix(Element* element); 24 24 ElementVector* CreatePVector(Element* element); 25 ElementVector* CreatePVectorFS(Element* element); 26 ElementVector* CreatePVectorFSViscous(Element* element); 27 ElementVector* CreatePVectorFSShelf(Element* element); 28 ElementVector* CreatePVectorFSFront(Element* element); 25 29 ElementVector* CreatePVectorHO(Element* element); 26 30 ElementVector* CreatePVectorHODrivingStress(Element* element); -
issm/trunk-jpl/src/c/classes/Elements/Element.h
r16803 r16805 54 54 virtual IssmDouble GetMaterialParameter(int enum_in)=0; 55 55 virtual void NodalFunctions(IssmDouble* basis,Gauss* gauss)=0; 56 virtual void NodalFunctionsVelocity(IssmDouble* basis,Gauss* gauss)=0; 57 virtual void NodalFunctionsPressure(IssmDouble* basis,Gauss* gauss)=0; 56 58 virtual void TransformLoadVectorCoord(ElementVector* pe,int transformenum)=0; 57 59 virtual void TransformLoadVectorCoord(ElementVector* pe,int* transformenum_list)=0; -
issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
r16803 r16805 2543 2543 _assert_(gauss->Enum()==GaussPentaEnum); 2544 2544 this->GetNodalFunctions(basis,(GaussPenta*)gauss); 2545 2546 } 2547 /*}}}*/ 2548 /*FUNCTION Penta::NodalFunctionsVelocity{{{*/ 2549 void Penta::NodalFunctionsVelocity(IssmDouble* basis, Gauss* gauss){ 2550 2551 _assert_(gauss->Enum()==GaussPentaEnum); 2552 this->GetNodalFunctionsVelocity(basis,(GaussPenta*)gauss); 2553 2554 } 2555 /*}}}*/ 2556 /*FUNCTION Penta::NodalFunctionsPressure{{{*/ 2557 void Penta::NodalFunctionsPressure(IssmDouble* basis, Gauss* gauss){ 2558 2559 _assert_(gauss->Enum()==GaussPentaEnum); 2560 this->GetNodalFunctionsPressure(basis,(GaussPenta*)gauss); 2545 2561 2546 2562 } -
issm/trunk-jpl/src/c/classes/Elements/Penta.h
r16803 r16805 247 247 ElementVector* NewElementVector(int approximation_enum); 248 248 void NodalFunctions(IssmDouble* basis,Gauss* gauss); 249 void NodalFunctionsVelocity(IssmDouble* basis,Gauss* gauss); 250 void NodalFunctionsPressure(IssmDouble* basis,Gauss* gauss); 249 251 IssmDouble MinEdgeLength(IssmDouble xyz_list[6][3]); 250 252 void SetClone(int* minranks); -
issm/trunk-jpl/src/c/classes/Elements/Seg.h
r16803 r16805 111 111 void JacobianDeterminantBase(IssmDouble* pJdet,IssmDouble* xyz_list_base,Gauss* gauss){_error_("not implemented yet");}; 112 112 void NodalFunctions(IssmDouble* basis,Gauss* gauss){_error_("not implemented yet");}; 113 void NodalFunctionsVelocity(IssmDouble* basis,Gauss* gauss){_error_("not implemented yet");}; 114 void NodalFunctionsPressure(IssmDouble* basis,Gauss* gauss){_error_("not implemented yet");}; 113 115 bool NoIceInElement(){_error_("not implemented yet");}; 114 116 int NumberofNodesVelocity(void){_error_("not implemented yet");}; -
issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
r16801 r16805 2207 2207 _assert_(gauss->Enum()==GaussTriaEnum); 2208 2208 this->GetNodalFunctions(basis,(GaussTria*)gauss); 2209 2210 } 2211 /*}}}*/ 2212 /*FUNCTION Tria::NodalFunctionsVelocity{{{*/ 2213 void Tria::NodalFunctionsVelocity(IssmDouble* basis, Gauss* gauss){ 2214 2215 _assert_(gauss->Enum()==GaussTriaEnum); 2216 this->GetNodalFunctionsVelocity(basis,(GaussTria*)gauss); 2217 2218 } 2219 /*}}}*/ 2220 /*FUNCTION Tria::NodalFunctionsPressure{{{*/ 2221 void Tria::NodalFunctionsPressure(IssmDouble* basis, Gauss* gauss){ 2222 2223 _assert_(gauss->Enum()==GaussTriaEnum); 2224 this->GetNodalFunctionsPressure(basis,(GaussTria*)gauss); 2209 2225 2210 2226 } -
issm/trunk-jpl/src/c/classes/Elements/Tria.h
r16803 r16805 274 274 ElementVector* NewElementVector(int approximation_enum); 275 275 void NodalFunctions(IssmDouble* basis,Gauss* gauss); 276 void NodalFunctionsVelocity(IssmDouble* basis,Gauss* gauss); 277 void NodalFunctionsPressure(IssmDouble* basis,Gauss* gauss); 276 278 void SetClone(int* minranks); 277 279 Seg* SpawnSeg(int index1,int index2); -
issm/trunk-jpl/src/c/modules/SystemMatricesx/SystemMatricesx.cpp
r16789 r16805 41 41 for (i=0;i<femmodel->elements->Size();i++){ 42 42 element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i)); 43 element->CreateKMatrix(Kff_temp,NULL); 43 ElementMatrix* Ke = element->CreateKMatrix(); 44 ElementVector* pe = element->CreatePVector(); 45 element->ReduceMatrices(Ke,pe); 46 if(Ke) Ke->AddToGlobal(Kff_temp,NULL); 47 delete Ke; 48 delete pe; 44 49 } 45 50 … … 68 73 element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i)); 69 74 element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i)); 70 //ElementVector* pe = analysis->CreatePVector(element);75 ElementVector* pe = analysis->CreatePVector(element); 71 76 //ElementMatrix* Ke = analysis->CreateKMatrix(element); 72 ElementVector* pe = element->CreatePVector();77 //ElementVector* pe = element->CreatePVector(); 73 78 ElementMatrix* Ke = element->CreateKMatrix(); 74 79 element->ReduceMatrices(Ke,pe);
Note:
See TracChangeset
for help on using the changeset viewer.