- Timestamp:
- 07/10/20 21:33:01 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/HydrologyShreveAnalysis.cpp
r25118 r25266 161 161 ElementMatrix* Ke = element->NewElementMatrix(); 162 162 IssmDouble* basis = xNew<IssmDouble>(numnodes); 163 IssmDouble* B = xNew<IssmDouble>(2*numnodes); 164 IssmDouble* Bprime = xNew<IssmDouble>(2*numnodes); 163 IssmDouble* dbasis = xNew<IssmDouble>(2*numnodes); 165 164 IssmDouble D[2][2]={0.}; 166 165 … … 183 182 element->JacobianDeterminant(&Jdet,xyz_list,gauss); 184 183 element->NodalFunctions(basis,gauss); 184 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss); 185 185 186 186 vx_input->GetInputValue(&vx,gauss); … … 189 189 vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss); 190 190 191 /*Transient term*/ 191 192 D_scalar=gauss->weight*Jdet; 192 193 TripleMultiply(basis,1,numnodes,1, 194 &D_scalar,1,1,0, 195 basis,1,numnodes,0, 196 Ke->values,1); 197 198 GetB(B,element,xyz_list,gauss); 199 GetBprime(Bprime,element,xyz_list,gauss); 200 193 for(int i=0;i<numnodes;i++) for(int j=0;j<numnodes;j++) Ke->values[i*numnodes+j] += D_scalar*basis[i]*basis[j]; 194 195 /*Advection terms*/ 201 196 dvxdx=dvx[0]; 202 197 dvydy=dvy[1]; 203 198 D_scalar=dt*gauss->weight*Jdet; 204 205 D[0][0]=D_scalar*dvxdx; 206 D[1][1]=D_scalar*dvydy; 207 TripleMultiply(B,2,numnodes,1, 208 &D[0][0],2,2,0, 209 B,2,numnodes,0, 210 &Ke->values[0],1); 211 212 D[0][0]=D_scalar*vx; 213 D[1][1]=D_scalar*vy; 214 TripleMultiply(B,2,numnodes,1, 215 &D[0][0],2,2,0, 216 Bprime,2,numnodes,0, 217 &Ke->values[0],1); 199 for(int i=0;i<numnodes;i++){ 200 for(int j=0;j<numnodes;j++){ 201 /*\phi_i \phi_j \nabla\cdot v*/ 202 Ke->values[i*numnodes+j] += D_scalar*basis[i]*basis[j]*(dvxdx+dvydy); 203 /*\phi_i v\cdot\nabla\phi_j*/ 204 Ke->values[i*numnodes+j] += D_scalar*basis[i]*(vx*dbasis[0*numnodes+j] + vy*dbasis[1*numnodes+j]); 205 } 206 } 218 207 219 208 /*Artificial diffusivity*/ … … 223 212 D[0][1]=D_scalar*diffusivity*h/(2*vel)*vx*vy; 224 213 D[1][1]=D_scalar*diffusivity*h/(2*vel)*vy*vy; 225 TripleMultiply(Bprime,2,numnodes,1, 226 &D[0][0],2,2,0, 227 Bprime,2,numnodes,0, 228 &Ke->values[0],1); 214 for(int i=0;i<numnodes;i++){ 215 for(int j=0;j<numnodes;j++){ 216 Ke->values[i*numnodes+j] += ( 217 dbasis[0*numnodes+i] *(D[0][0]*dbasis[0*numnodes+j] + D[0][1]*dbasis[1*numnodes+j]) + 218 dbasis[1*numnodes+i] *(D[1][0]*dbasis[0*numnodes+j] + D[1][1]*dbasis[1*numnodes+j]) 219 ); 220 } 221 } 229 222 } 230 223 … … 232 225 xDelete<IssmDouble>(xyz_list); 233 226 xDelete<IssmDouble>(basis); 234 xDelete<IssmDouble>(B); 235 xDelete<IssmDouble>(Bprime); 227 xDelete<IssmDouble>(dbasis); 236 228 delete gauss; 237 229 return Ke; … … 285 277 delete gauss; 286 278 return pe; 287 }/*}}}*/288 void HydrologyShreveAnalysis::GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/289 /*Compute B matrix. B=[B1 B2 B3] where Bi is of size 3*2.290 * For node i, Bi can be expressed in the actual coordinate system291 * by:292 * Bi=[ N ]293 * [ N ]294 * where N is the finiteelement function for node i.295 *296 * We assume B_prog has been allocated already, of size: 2x(1*numnodes)297 */298 299 /*Fetch number of nodes for this finite element*/300 int numnodes = element->GetNumberOfNodes();301 302 /*Get nodal functions*/303 IssmDouble* basis=xNew<IssmDouble>(numnodes);304 element->NodalFunctions(basis,gauss);305 306 /*Build B: */307 for(int i=0;i<numnodes;i++){308 B[numnodes*0+i] = basis[i];309 B[numnodes*1+i] = basis[i];310 }311 312 /*Clean-up*/313 xDelete<IssmDouble>(basis);314 }/*}}}*/315 void HydrologyShreveAnalysis::GetBprime(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/316 /*Compute B' matrix. B'=[B1' B2' B3'] where Bi' is of size 3*2.317 * For node i, Bi' can be expressed in the actual coordinate system318 * by:319 * Bi_prime=[ dN/dx ]320 * [ dN/dy ]321 * where N is the finiteelement function for node i.322 *323 * We assume B' has been allocated already, of size: 3x(2*numnodes)324 */325 326 /*Fetch number of nodes for this finite element*/327 int numnodes = element->GetNumberOfNodes();328 329 /*Get nodal functions derivatives*/330 IssmDouble* dbasis=xNew<IssmDouble>(2*numnodes);331 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);332 333 /*Build B': */334 for(int i=0;i<numnodes;i++){335 Bprime[numnodes*0+i] = dbasis[0*numnodes+i];336 Bprime[numnodes*1+i] = dbasis[1*numnodes+i];337 }338 339 /*Clean-up*/340 xDelete<IssmDouble>(dbasis);341 342 279 }/*}}}*/ 343 280 void HydrologyShreveAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
Note:
See TracChangeset
for help on using the changeset viewer.