- Timestamp:
- 11/16/13 13:36:32 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
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){/*{{{*/
Note:
See TracChangeset
for help on using the changeset viewer.