Changeset 25227
- Timestamp:
- 07/07/20 21:37:04 (5 years ago)
- Location:
- issm/trunk-jpl/src/c/analyses
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp
r25024 r25227 206 206 /*Initialize Element vector*/ 207 207 ElementMatrix* Ke = basalelement->NewElementMatrix(); 208 IssmDouble* B = xNew<IssmDouble>(2*numnodes);209 208 IssmDouble* basis = xNew<IssmDouble>(numnodes); 210 IssmDouble D[2][2]={0.};209 IssmDouble* dbasis = xNew<IssmDouble>(2*numnodes); 211 210 212 211 /*Retrieve all inputs and parameters*/ … … 222 221 gauss ->GaussPoint(ig); 223 222 basalelement ->JacobianDeterminant(&Jdet,xyz_list,gauss); 223 basalelement->NodalFunctionsDerivatives(dbasis,xyz_list,gauss); 224 basalelement->NodalFunctions(basis,gauss); 224 225 225 226 epl_transmitivity = EplTransmitivity(basalelement,gauss,epl_thick_input,epl_head_input,base_input); … … 230 231 //D_scalar=gauss->weight*Jdet; 231 232 if(dt!=0.) D_scalar=D_scalar*dt; 232 D[0][0]=D_scalar; 233 D[1][1]=D_scalar; 234 GetB(B,basalelement,xyz_list,gauss); 235 TripleMultiply(B,2,numnodes,1, 236 &D[0][0],2,2,0, 237 B,2,numnodes,0, 238 &Ke->values[0],1); 233 for(int i=0;i<numnodes;i++){ 234 for(int j=0;j<numnodes;j++){ 235 Ke->values[i*numnodes+j] += D_scalar*(dbasis[0*numnodes+j]*dbasis[0*numnodes+i] + dbasis[1*numnodes+j]*dbasis[1*numnodes+i]); 236 } 237 } 239 238 240 239 /*Transient*/ … … 243 242 D_scalar=epl_storing*gauss->weight*Jdet; 244 243 //D_scalar=(epl_storing/epl_transmitivity)*gauss->weight*Jdet; 245 TripleMultiply(basis,numnodes,1,0, 246 &D_scalar,1,1,0, 247 basis,1,numnodes,0, 248 &Ke->values[0],1); 244 for(int i=0;i<numnodes;i++) for(int j=0;j<numnodes;j++) Ke->values[i*numnodes+j] += D_scalar*basis[j]*basis[i]; 249 245 250 246 /*Transfer EPL part*/ … … 252 248 D_scalar=dt*transfer*gauss->weight*Jdet; 253 249 //D_scalar=dt*(transfer/epl_transmitivity)*gauss->weight*Jdet; 254 TripleMultiply(basis,numnodes,1,0, 255 &D_scalar,1,1,0, 256 basis,1,numnodes,0, 257 &Ke->values[0],1); 250 for(int i=0;i<numnodes;i++) for(int j=0;j<numnodes;j++) Ke->values[i*numnodes+j] += D_scalar*basis[j]*basis[i]; 258 251 } 259 252 } … … 262 255 xDelete<IssmDouble>(xyz_list); 263 256 xDelete<IssmDouble>(basis); 264 xDelete<IssmDouble>( B);257 xDelete<IssmDouble>(dbasis); 265 258 delete gauss; 266 259 if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;}; … … 405 398 if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;}; 406 399 return pe; 407 }/*}}}*/408 void HydrologyDCEfficientAnalysis::GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/409 /*Compute B matrix. B=[B1 B2 B3] where Bi is of size 3*2.410 * For node i, Bi can be expressed in the actual coordinate system411 * by:412 * Bi=[ dN/dx ]413 * [ dN/dy ]414 * where N is the finiteelement function for node i.415 *416 * We assume B has been allocated already, of size: 3x(2*numnodes)417 */418 419 /*Fetch number of nodes for this finite element*/420 int numnodes = element->GetNumberOfNodes();421 422 /*Get nodal functions derivatives*/423 IssmDouble* dbasis=xNew<IssmDouble>(2*numnodes);424 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);425 426 /*Build B: */427 for(int i=0;i<numnodes;i++){428 B[numnodes*0+i] = dbasis[0*numnodes+i];429 B[numnodes*1+i] = dbasis[1*numnodes+i];430 }431 432 /*Clean-up*/433 xDelete<IssmDouble>(dbasis);434 400 }/*}}}*/ 435 401 void HydrologyDCEfficientAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/ -
issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.h
r24385 r25227 29 29 ElementMatrix* CreateKMatrix(Element* element); 30 30 ElementVector* CreatePVector(Element* element); 31 void GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);32 31 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 33 32 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index); -
issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.cpp
r25024 r25227 228 228 /*Initialize Element vector*/ 229 229 ElementMatrix* Ke = basalelement->NewElementMatrix(); 230 IssmDouble* B = xNew<IssmDouble>(2*numnodes);231 230 IssmDouble* basis = xNew<IssmDouble>(numnodes); 232 IssmDouble D[2][2]= {0.};231 IssmDouble* dbasis = xNew<IssmDouble>(2*numnodes); 233 232 234 233 /*Retrieve all inputs and parameters*/ … … 252 251 gauss -> GaussPoint(ig); 253 252 basalelement -> JacobianDeterminant(&Jdet,xyz_list,gauss); 253 basalelement->NodalFunctionsDerivatives(dbasis,xyz_list,gauss); 254 basalelement->NodalFunctions(basis,gauss); 254 255 255 256 sediment_transmitivity = SedimentTransmitivity(basalelement,gauss,sed_head_input,base_input,SedTrans_input); … … 260 261 //D_scalar=gauss->weight*Jdet; 261 262 if(dt!=0.) D_scalar=D_scalar*dt; 262 D[0][0]=D_scalar; 263 D[1][1]=D_scalar; 264 GetB(B,basalelement,xyz_list,gauss); 265 TripleMultiply(B,2,numnodes,1, 266 &D[0][0],2,2,0, 267 B,2,numnodes,0, 268 &Ke->values[0],1); 263 for(int i=0;i<numnodes;i++){ 264 for(int j=0;j<numnodes;j++){ 265 Ke->values[i*numnodes+j] += D_scalar*(dbasis[0*numnodes+j]*dbasis[0*numnodes+i] + dbasis[1*numnodes+j]*dbasis[1*numnodes+i]); 266 } 267 } 269 268 270 269 /*Transient*/ 271 270 if(dt!=0.){ 272 basalelement->NodalFunctions(&basis[0],gauss);273 271 D_scalar=sediment_storing*gauss->weight*Jdet; 274 272 //D_scalar=(sediment_storing/sediment_transmitivity)*gauss->weight*Jdet; 275 TripleMultiply(basis,numnodes,1,0, 276 &D_scalar,1,1,0, 277 basis,1,numnodes,0, 278 &Ke->values[0],1); 273 for(int i=0;i<numnodes;i++) for(int j=0;j<numnodes;j++) Ke->values[i*numnodes+j] += D_scalar*basis[j]*basis[i]; 279 274 280 275 /*Transfer EPL part*/ … … 282 277 if(active_element){ 283 278 transfer=GetHydrologyKMatrixTransfer(basalelement); 284 basalelement->NodalFunctions(&basis[0],gauss);285 279 D_scalar=dt*transfer*gauss->weight*Jdet; 286 280 //D_scalar=dt*(transfer/sediment_transmitivity)*gauss->weight*Jdet; 287 TripleMultiply(basis,numnodes,1,0, 288 &D_scalar,1,1,0, 289 basis,1,numnodes,0, 290 &Ke->values[0],1); 281 for(int i=0;i<numnodes;i++) for(int j=0;j<numnodes;j++) Ke->values[i*numnodes+j] += D_scalar*basis[j]*basis[i]; 291 282 } 292 283 } … … 295 286 /*Clean up and return*/ 296 287 xDelete<IssmDouble>(xyz_list); 297 xDelete<IssmDouble>(B);298 288 xDelete<IssmDouble>(basis); 289 xDelete<IssmDouble>(dbasis); 299 290 delete gauss; 300 291 if(domaintype!=Domain2DhorizontalEnum){ … … 473 464 } 474 465 return pe; 475 }/*}}}*/476 void HydrologyDCInefficientAnalysis::GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/477 /*Compute B matrix. B=[B1 B2 B3] where Bi is of size 3*2.478 * For node i, Bi can be expressed in the actual coordinate system479 * by:480 * Bi=[ dN/dx ]481 * [ dN/dy ]482 * where N is the finiteelement function for node i.483 *484 * We assume B has been allocated already, of size: 3x(2*numnodes)485 */486 487 /*Fetch number of nodes for this finite element*/488 int numnodes = element->GetNumberOfNodes();489 490 /*Get nodal functions derivatives*/491 IssmDouble* dbasis=xNew<IssmDouble>(2*numnodes);492 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);493 494 /*Build B: */495 for(int i=0;i<numnodes;i++){496 B[numnodes*0+i] = dbasis[0*numnodes+i];497 B[numnodes*1+i] = dbasis[1*numnodes+i];498 }499 500 /*Clean-up*/501 xDelete<IssmDouble>(dbasis);502 466 }/*}}}*/ 503 467 void HydrologyDCInefficientAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/ -
issm/trunk-jpl/src/c/analyses/HydrologyDCInefficientAnalysis.h
r24335 r25227 33 33 34 34 /*Intermediaries*/ 35 void GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);36 35 IssmDouble SedimentStoring(Element* element, Gauss* gauss, Input2* sed_head_input, Input2* base_input); 37 36 IssmDouble SedimentTransmitivity(Element* element,Gauss* gauss,Input2* sed_head_input, Input2* base_input,Input2* SedTrans_input);
Note:
See TracChangeset
for help on using the changeset viewer.