Changeset 16803
- Timestamp:
- 11/16/13 13:36:32 (11 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
r16801 r16803 818 818 ElementVector* StressbalanceAnalysis::CreatePVectorSSA(Element* element){/*{{{*/ 819 819 820 /*Intermediaries*/ 821 int meshtype; 822 Element* basalelement; 823 824 /*Get basal element*/ 825 element->FindParam(&meshtype,MeshTypeEnum); 826 switch(meshtype){ 827 case Mesh2DhorizontalEnum: 828 basalelement = element; 829 break; 830 case Mesh3DEnum: 831 if(!element->IsOnBed()) return NULL; 832 basalelement = element->SpawnBasalElement(); 833 break; 834 default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet"); 835 } 836 820 837 /*compute all load vectors for this element*/ 821 ElementVector* pe1=CreatePVectorSSADrivingStress( element);822 ElementVector* pe2=CreatePVectorSSAFront( element);838 ElementVector* pe1=CreatePVectorSSADrivingStress(basalelement); 839 ElementVector* pe2=CreatePVectorSSAFront(basalelement); 823 840 ElementVector* pe =new ElementVector(pe1,pe2); 824 841 825 842 /*clean-up and return*/ 843 if(meshtype!=Mesh2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;}; 826 844 delete pe1; 827 845 delete pe2; … … 834 852 IssmDouble driving_stress_baseline,thickness; 835 853 IssmDouble Jdet; 836 IssmDouble* xyz_list=NULL;837 854 IssmDouble slope[2]; 855 IssmDouble* xyz_list = NULL; 838 856 839 857 /*Fetch number of nodes and dof for this finite element*/ … … 881 899 }/*}}}*/ 882 900 ElementVector* StressbalanceAnalysis::CreatePVectorSSAFront(Element* element){/*{{{*/ 901 883 902 return NULL; 884 903 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/StressbalanceVerticalAnalysis.cpp
r16782 r16803 100 100 }/*}}}*/ 101 101 ElementVector* StressbalanceVerticalAnalysis::CreatePVector(Element* element){/*{{{*/ 102 _error_("not implemented yet"); 102 103 /*compute all load vectors for this element*/ 104 ElementVector* pe1=CreatePVectorVolume(element); 105 ElementVector* pe2=CreatePVectorBase(element); 106 ElementVector* pe =new ElementVector(pe1,pe2); 107 108 /*clean-up and return*/ 109 delete pe1; 110 delete pe2; 111 return pe; 112 }/*}}}*/ 113 ElementVector* StressbalanceVerticalAnalysis::CreatePVectorVolume(Element* element){/*{{{*/ 114 115 /*Intermediaries*/ 116 int approximation; 117 IssmDouble Jdet; 118 IssmDouble dudx,dvdy,dwdz; 119 IssmDouble du[3],dv[3],dw[3]; 120 IssmDouble* xyz_list = NULL; 121 122 /*Fetch number of nodes for this finite element*/ 123 int numnodes = element->GetNumberOfNodes(); 124 125 /*Initialize Element vector and basis functions*/ 126 ElementVector* pe = element->NewElementVector(); 127 IssmDouble* basis = xNew<IssmDouble>(numnodes); 128 129 /*Retrieve all inputs and parameters*/ 130 element->GetVerticesCoordinates(&xyz_list); 131 element->GetInputValue(&approximation,ApproximationEnum); 132 Input* vx_input=element->GetInput(VxEnum); _assert_(vx_input); 133 Input* vy_input=element->GetInput(VyEnum); _assert_(vy_input); 134 Input* vzFS_input=NULL; 135 if(approximation==HOFSApproximationEnum || approximation==SSAFSApproximationEnum){ 136 vzFS_input=element->GetInput(VzFSEnum); _assert_(vzFS_input); 137 } 138 139 /* Start looping on the number of gaussian points: */ 140 Gauss* gauss=element->NewGauss(2); 141 for(int ig=gauss->begin();ig<gauss->end();ig++){ 142 gauss->GaussPoint(ig); 143 144 element->JacobianDeterminant(&Jdet,xyz_list,gauss); 145 element->NodalFunctions(basis,gauss); 146 147 vx_input->GetInputDerivativeValue(&du[0],xyz_list,gauss); 148 vy_input->GetInputDerivativeValue(&dv[0],xyz_list,gauss); 149 if(approximation==HOFSApproximationEnum || approximation==SSAFSApproximationEnum){ 150 vzFS_input->GetInputDerivativeValue(&dw[0],xyz_list,gauss); 151 dwdz=dw[2]; 152 } 153 else dwdz=0; 154 dudx=du[0]; 155 dvdy=dv[1]; 156 157 for(int i=0;i<numnodes;i++) pe->values[i] += (dudx+dvdy+dwdz)*Jdet*gauss->weight*basis[i]; 158 } 159 160 /*Clean up and return*/ 161 delete gauss; 162 xDelete<IssmDouble>(basis); 163 xDelete<IssmDouble>(xyz_list); 164 return pe; 165 }/*}}}*/ 166 ElementVector* StressbalanceVerticalAnalysis::CreatePVectorBase(Element* element){/*{{{*/ 167 168 /*Intermediaries */ 169 int i,j,approximation; 170 IssmDouble *xyz_list = NULL; 171 IssmDouble *xyz_list_base = NULL; 172 IssmDouble Jdet; 173 IssmDouble vx,vy,vz,dbdx,dbdy,basalmeltingvalue; 174 IssmDouble slope[3]; 175 176 if(!element->IsOnBed()) return NULL; 177 178 /*Fetch number of nodes for this finite element*/ 179 int numnodes = element->GetNumberOfNodes(); 180 181 /*Initialize Element vector*/ 182 ElementVector* pe = element->NewElementVector(); 183 IssmDouble* basis = xNew<IssmDouble>(numnodes); 184 185 /*Retrieve all inputs and parameters*/ 186 element->GetVerticesCoordinates(&xyz_list); 187 element->GetVerticesCoordinatesBase(&xyz_list_base); 188 element->GetInputValue(&approximation,ApproximationEnum); 189 Input* bed_input=element->GetInput(BedEnum); _assert_(bed_input); 190 Input* basal_melting_input=element->GetInput(BasalforcingsMeltingRateEnum); _assert_(basal_melting_input); 191 Input* vx_input=element->GetInput(VxEnum); _assert_(vx_input); 192 Input* vy_input=element->GetInput(VyEnum); _assert_(vy_input); 193 Input* vzFS_input=NULL; 194 if(approximation==HOFSApproximationEnum || approximation==SSAFSApproximationEnum){ 195 vzFS_input=element->GetInput(VzFSEnum); _assert_(vzFS_input); 196 } 197 198 /* Start looping on the number of gaussian points: */ 199 Gauss* gauss=element->NewGaussBase(2); 200 for(int ig=gauss->begin();ig<gauss->end();ig++){ 201 gauss->GaussPoint(ig); 202 203 basal_melting_input->GetInputValue(&basalmeltingvalue,gauss); 204 bed_input->GetInputDerivativeValue(&slope[0],xyz_list,gauss); 205 vx_input->GetInputValue(&vx,gauss); 206 vy_input->GetInputValue(&vy,gauss); 207 if(approximation==HOFSApproximationEnum || approximation==SSAFSApproximationEnum){ 208 vzFS_input->GetInputValue(&vz,gauss); 209 } 210 else vz=0.; 211 212 dbdx=slope[0]; 213 dbdy=slope[1]; 214 215 element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss); 216 element->NodalFunctions(basis,gauss); 217 218 for(i=0;i<numnodes;i++) pe->values[i]+=-Jdet*gauss->weight*(vx*dbdx+vy*dbdy-vz-basalmeltingvalue)*basis[i]; 219 } 220 221 /*Clean up and return*/ 222 delete gauss; 223 xDelete<IssmDouble>(basis); 224 xDelete<IssmDouble>(xyz_list); 225 xDelete<IssmDouble>(xyz_list_base); 226 return pe; 227 103 228 }/*}}}*/ 104 229 void StressbalanceVerticalAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/ -
issm/trunk-jpl/src/c/analyses/StressbalanceVerticalAnalysis.h
r16782 r16803 23 23 ElementMatrix* CreateKMatrix(Element* element); 24 24 ElementVector* CreatePVector(Element* element); 25 ElementVector* CreatePVectorVolume(Element* element); 26 ElementVector* CreatePVectorBase(Element* element); 25 27 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 26 28 void InputUpdateFromSolution(IssmDouble* solution,Element* element); -
issm/trunk-jpl/src/c/classes/Elements/Element.h
r16800 r16803 67 67 virtual void GetDofListPressure(int** pdoflist,int setenum)=0; 68 68 virtual void JacobianDeterminant(IssmDouble* Jdet, IssmDouble* xyz_list,Gauss* gauss)=0; 69 virtual void JacobianDeterminantBase(IssmDouble* Jdet,IssmDouble* xyz_list_base,Gauss* gauss)=0; 69 70 virtual void GetSolutionFromInputsOneDof(Vector<IssmDouble>* solution,int solutionenum)=0; 70 71 virtual int GetNodeIndex(Node* node)=0; … … 90 91 virtual void GetInputValue(IssmDouble* pvalue,int enum_type)=0; 91 92 virtual void GetVerticesCoordinates(IssmDouble** xyz_list)=0; 93 virtual void GetVerticesCoordinatesBase(IssmDouble** xyz_list)=0; 92 94 virtual void GetMaterialInputValue(IssmDouble* pvalue,Node* node,int enumtype)=0; 93 95 … … 110 112 virtual Gauss* NewGauss(void)=0; 111 113 virtual Gauss* NewGauss(int order)=0; 112 virtual ElementVector* NewElementVector(int approximation_enum)=0; 114 virtual Gauss* NewGaussBase(int order)=0; 115 virtual ElementVector* NewElementVector(int approximation_enum=NoneApproximationEnum)=0; 113 116 virtual void InputScale(int enum_type,IssmDouble scale_factor)=0; 114 117 virtual void GetVectorFromInputs(Vector<IssmDouble>* vector, int name_enum)=0; -
issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
r16802 r16803 1446 1446 1447 1447 }/*}}}*/ 1448 /*FUNCTION Penta::GetVerticesCoordinatesBase(IssmDouble** pxyz_list){{{*/ 1449 void Penta::GetVerticesCoordinatesBase(IssmDouble** pxyz_list){ 1450 1451 IssmDouble* xyz_list = xNew<IssmDouble>(NUMVERTICES2D*3); 1452 ::GetVerticesCoordinates(xyz_list,this->vertices,NUMVERTICES2D); 1453 1454 /*Assign output pointer*/ 1455 *pxyz_list = xyz_list; 1456 1457 }/*}}}*/ 1448 1458 /*FUNCTION Penta::GetMaterialInputValue(IssmDouble* pvalue,Node* node,int enumtype) {{{*/ 1449 1459 void Penta::GetMaterialInputValue(IssmDouble* pvalue,Node* node,int enumtype){ … … 2432 2442 } 2433 2443 /*}}}*/ 2444 /*FUNCTION Penta::JacobianDeterminantBase{{{*/ 2445 void Penta::JacobianDeterminantBase(IssmDouble* pJdet,IssmDouble* xyz_list_base,Gauss* gauss){ 2446 2447 _assert_(gauss->Enum()==GaussPentaEnum); 2448 this->GetTriaJacobianDeterminant(pJdet,xyz_list_base,(GaussPenta*)gauss); 2449 2450 } 2451 /*}}}*/ 2434 2452 /*FUNCTION Penta::NoIceInElement {{{*/ 2435 2453 bool Penta::NoIceInElement(){ … … 2508 2526 Gauss* Penta::NewGauss(int order){ 2509 2527 return new GaussPenta(order,order); 2528 } 2529 /*}}}*/ 2530 /*FUNCTION Penta::NewGaussBase(int order){{{*/ 2531 Gauss* Penta::NewGaussBase(int order){ 2532 return new GaussPenta(0,1,2,order); 2510 2533 } 2511 2534 /*}}}*/ -
issm/trunk-jpl/src/c/classes/Elements/Penta.h
r16802 r16803 99 99 void GetVectorFromInputs(Vector<IssmDouble>* vector,int name_enum); 100 100 void GetVerticesCoordinates(IssmDouble** pxyz_list); 101 void GetVerticesCoordinatesBase(IssmDouble** pxyz_list); 101 102 102 103 int Sid(); … … 239 240 bool IsNodeOnShelfFromFlags(IssmDouble* flags); 240 241 void JacobianDeterminant(IssmDouble* Jdet, IssmDouble* xyz_list,Gauss* gauss); 242 void JacobianDeterminantBase(IssmDouble* pJdet,IssmDouble* xyz_list_base,Gauss* gauss); 241 243 bool NoIceInElement(void); 242 244 Gauss* NewGauss(void); 243 245 Gauss* NewGauss(int order); 246 Gauss* NewGaussBase(int order); 244 247 ElementVector* NewElementVector(int approximation_enum); 245 248 void NodalFunctions(IssmDouble* basis,Gauss* gauss); -
issm/trunk-jpl/src/c/classes/Elements/Seg.h
r16800 r16803 102 102 int GetNumberOfVertices(void){_error_("not implemented yet");}; 103 103 void GetVerticesCoordinates(IssmDouble** pxyz_list){_error_("not implemented yet");}; 104 void GetVerticesCoordinatesBase(IssmDouble** pxyz_list){_error_("not implemented yet");}; 104 105 int Sid(){_error_("not implemented yet");}; 105 106 void InputChangeName(int input_enum, int enum_type_old){_error_("not implemented yet");}; … … 108 109 bool IsNodeOnShelfFromFlags(IssmDouble* flags){_error_("not implemented yet");}; 109 110 void JacobianDeterminant(IssmDouble* Jdet, IssmDouble* xyz_list,Gauss* gauss){_error_("not implemented yet");}; 111 void JacobianDeterminantBase(IssmDouble* pJdet,IssmDouble* xyz_list_base,Gauss* gauss){_error_("not implemented yet");}; 110 112 void NodalFunctions(IssmDouble* basis,Gauss* gauss){_error_("not implemented yet");}; 111 113 bool NoIceInElement(){_error_("not implemented yet");}; … … 125 127 Gauss* NewGauss(void){_error_("not implemented yet");}; 126 128 Gauss* NewGauss(int order){_error_("not implemented yet");}; 129 Gauss* NewGaussBase(int order){_error_("not implemented yet");}; 127 130 ElementVector* NewElementVector(int approximation_enum){_error_("not implemented yet");}; 128 131 #ifdef _HAVE_THERMAL_ -
issm/trunk-jpl/src/c/classes/Elements/Tria.h
r16800 r16803 110 110 void GetVectorFromInputs(Vector<IssmDouble>* vector, int name_enum); 111 111 void GetVerticesCoordinates(IssmDouble** pxyz_list); 112 void GetVerticesCoordinatesBase(IssmDouble** pxyz_list){_error_("not implemented yet");}; 112 113 void InputCreate(IssmDouble* vector,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code); 113 114 void InputDepthAverageAtBase(int enum_type,int average_enum_type,int object_enum=MeshElementsEnum); … … 267 268 bool IsInput(int name); 268 269 void JacobianDeterminant(IssmDouble* pJdet, IssmDouble* xyz_list,Gauss* gauss); 270 void JacobianDeterminantBase(IssmDouble* pJdet,IssmDouble* xyz_list_base,Gauss* gauss){_error_("not implemented yet");}; 269 271 Gauss* NewGauss(void); 270 272 Gauss* NewGauss(int order); 273 Gauss* NewGaussBase(int order){_error_("not implemented yet");}; 271 274 ElementVector* NewElementVector(int approximation_enum); 272 275 void NodalFunctions(IssmDouble* basis,Gauss* gauss);
Note:
See TracChangeset
for help on using the changeset viewer.