Changeset 24431
- Timestamp:
- 12/04/19 21:11:16 (5 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/ExtrapolationAnalysis.cpp
r24429 r24431 207 207 ElementVector* ExtrapolationAnalysis::CreatePVector(Element* element){/*{{{*/ 208 208 return NULL; 209 210 }/*}}}*/211 void ExtrapolationAnalysis::GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss, int dim){/*{{{*/212 /*Compute B matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2.213 * For node i, Bi can be expressed in the actual coordinate system214 * by:215 * Bi=[ N ]216 * [ N ]217 * where N is the finiteelement function for node i.218 *219 * We assume B_prog has been allocated already, of size: 2x(NDOF1*numnodes)220 */221 222 /*Fetch number of nodes for this finite element*/223 int numnodes = element->GetNumberOfNodes();224 225 /*Get nodal functions*/226 IssmDouble* basis=xNew<IssmDouble>(numnodes);227 element->NodalFunctions(basis,gauss);228 229 /*Build B: */230 for(int i=0;i<numnodes;i++)231 for(int d=0;d<dim;d++)232 B[numnodes*d+i] = basis[i];233 234 /*Clean-up*/235 xDelete<IssmDouble>(basis);236 }/*}}}*/237 void ExtrapolationAnalysis::GetBprime(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss, int dim){/*{{{*/238 /*Compute B' matrix. B'=[B1' B2' B3'] where Bi' is of size 3*NDOF2.239 * For node i, Bi' can be expressed in the actual coordinate system240 * by:241 * Bi_prime=[ dN/dx ]242 * [ dN/dy ]243 * where N is the finiteelement function for node i.244 *245 * We assume B' has been allocated already, of size: 3x(NDOF2*numnodes)246 */247 248 /*Fetch number of nodes for this finite element*/249 int numnodes = element->GetNumberOfNodes();250 251 /*Get nodal functions derivatives*/252 IssmDouble* dbasis=xNew<IssmDouble>(dim*numnodes);253 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);254 255 /*Build B': */256 for(int i=0;i<numnodes;i++)257 for(int d=0;d<dim;d++)258 Bprime[numnodes*d+i] = dbasis[d*numnodes+i];259 260 /*Clean-up*/261 xDelete<IssmDouble>(dbasis);262 263 209 }/*}}}*/ 264 210 void ExtrapolationAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/ … … 288 234 } 289 235 }/*}}}*/ 290 int 236 int ExtrapolationAnalysis::GetExtrapolationCase(Element* element){/*{{{*/ 291 237 292 238 /* Get case of extrapolation, depending on domain quality, and extrapolation variable */ -
issm/trunk-jpl/src/c/analyses/ExtrapolationAnalysis.h
r24335 r24431 26 26 ElementMatrix* CreateKMatrix(Element* element); 27 27 ElementVector* CreatePVector(Element* element); 28 void GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss, int dim);29 void GetBprime(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss, int dim);30 28 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 31 29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index); -
issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp
r24429 r24431 291 291 IssmDouble xi,tau; 292 292 IssmDouble dvx[2],dvy[2]; 293 IssmDouble D[4]; 293 294 IssmDouble* xyz_list = NULL; 294 295 … … 309 310 IssmDouble* basis = xNew<IssmDouble>(numnodes); 310 311 IssmDouble* dbasis = xNew<IssmDouble>(dim*numnodes); 311 IssmDouble* B = xNew<IssmDouble>(dim*numnodes);312 IssmDouble* Bprime = xNew<IssmDouble>(dim*numnodes);313 IssmDouble* D = xNewZeroInit<IssmDouble>(dim*dim);314 312 315 313 /*Retrieve all inputs and parameters*/ … … 333 331 element->JacobianDeterminant(&Jdet,xyz_list,gauss); 334 332 element->NodalFunctions(basis,gauss); 335 333 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss); 334 335 /*Transient term*/ 336 D_scalar=gauss->weight*Jdet; 337 for(int i=0;i<numnodes;i++){ 338 for(int j=0;j<numnodes;j++){ 339 Ke->values[i*numnodes+j] += D_scalar*basis[i]*basis[j]; 340 } 341 } 342 343 /*Advection terms*/ 336 344 vxaverage_input->GetInputValue(&vx,gauss); 337 345 vxaverage_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss); 346 D_scalar=dt*gauss->weight*Jdet; 338 347 if(dim==2){ 339 348 vyaverage_input->GetInputValue(&vy,gauss); 340 349 vyaverage_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss); 341 } 342 343 D_scalar=gauss->weight*Jdet; 344 TripleMultiply(basis,1,numnodes,1, 345 &D_scalar,1,1,0, 346 basis,1,numnodes,0, 347 &Ke->values[0],1); 348 349 GetB(B,element,dim,xyz_list,gauss); 350 GetBprime(Bprime,element,dim,xyz_list,gauss); 351 352 dvxdx=dvx[0]; 353 if(dim==2) dvydy=dvy[1]; 354 D_scalar=dt*gauss->weight*Jdet; 355 356 D[0*dim+0]=D_scalar*dvxdx; 357 if(dim==2) D[1*dim+1]=D_scalar*dvydy; 358 359 TripleMultiply(B,dim,numnodes,1, 360 D,dim,dim,0, 361 B,dim,numnodes,0, 362 &Ke->values[0],1); 363 364 D[0*dim+0]=D_scalar*vx; 365 if(dim==2) D[1*dim+1]=D_scalar*vy; 366 367 TripleMultiply(B,dim,numnodes,1, 368 D,dim,dim,0, 369 Bprime,dim,numnodes,0, 370 &Ke->values[0],1); 371 350 dvxdx=dvx[0]; 351 dvydy=dvy[1]; 352 for(int i=0;i<numnodes;i++){ 353 for(int j=0;j<numnodes;j++){ 354 /*\phi_i \phi_j \nabla\cdot v*/ 355 Ke->values[i*numnodes+j] += D_scalar*basis[i]*basis[j]*(dvxdx+dvydy); 356 /*\phi_i v\cdot\nabla\phi_j*/ 357 Ke->values[i*numnodes+j] += D_scalar*basis[i]*(vx*dbasis[0*numnodes+j] + vy*dbasis[1*numnodes+j]); 358 } 359 } 360 } 361 else{ 362 dvxdx=dvx[0]; 363 for(int i=0;i<numnodes;i++){ 364 for(int j=0;j<numnodes;j++){ 365 Ke->values[i*numnodes+j] += D_scalar*dvxdx*dbasis[0*numnodes+i]*dbasis[0*numnodes+j]; 366 Ke->values[i*numnodes+j] += D_scalar*vx*dbasis[0*numnodes+j]*basis[i]; 367 } 368 } 369 } 370 371 for(int i=0;i<4;i++) D[i]=0.; 372 372 switch(stabilization){ 373 373 case 0: … … 383 383 case 2: 384 384 /*Streamline upwinding*/ 385 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);386 385 vxaverage_input->GetInputAverage(&vx); 387 386 if(dim==1){ … … 397 396 /*SUPG*/ 398 397 if(dim!=2) _error_("Stabilization "<<stabilization<<" not supported yet for dim != 2"); 399 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);400 398 vxaverage_input->GetInputAverage(&vx); 401 399 vyaverage_input->GetInputAverage(&vy); … … 418 416 } 419 417 420 TripleMultiply(Bprime,dim,numnodes,1, 421 D,dim,dim,0, 422 Bprime,dim,numnodes,0, 423 &Ke->values[0],1); 418 if(dim==2){ 419 for(int i=0;i<numnodes;i++){ 420 for(int j=0;j<numnodes;j++){ 421 Ke->values[i*numnodes+j] += ( 422 dbasis[0*numnodes+i] *(D[0*dim+0]*dbasis[0*numnodes+j] + D[0*dim+1]*dbasis[1*numnodes+j]) + 423 dbasis[1*numnodes+i] *(D[1*dim+0]*dbasis[0*numnodes+j] + D[1*dim+1]*dbasis[1*numnodes+j]) 424 ); 425 } 426 } 427 } 428 else{ 429 for(int i=0;i<numnodes;i++){ 430 for(int j=0;j<numnodes;j++){ 431 Ke->values[i*numnodes+j] += D_scalar*h/(2.*vel)*dbasis[0*numnodes+i] *D[0]*dbasis[0*numnodes+j]; 432 } 433 } 434 } 424 435 } 425 436 if(stabilization==2){ … … 478 489 xDelete<IssmDouble>(basis); 479 490 xDelete<IssmDouble>(dbasis); 480 xDelete<IssmDouble>(B);481 xDelete<IssmDouble>(Bprime);482 xDelete<IssmDouble>(D);483 491 delete gauss; 484 492 return Ke; -
issm/trunk-jpl/src/c/classes/Elements/Element.cpp
r24404 r24431 47 47 48 48 /*Other*/ 49 bool Element::AnyFSet(){/*{{{*/ 50 51 /*Fetch number of nodes and dof for this finite element*/ 52 int numnodes = this->GetNumberOfNodes(); 53 54 for(int i=0;i<numnodes;i++){ 55 if(nodes[i]->fsize) return true; 56 } 57 return false; 58 }/*}}}*/ 49 59 void Element::ComputeLambdaS(){/*{{{*/ 50 60 -
issm/trunk-jpl/src/c/classes/Elements/Element.h
r24378 r24431 63 63 /*bool AllActive(void);*/ 64 64 /*bool AnyActive(void);*/ 65 bool AnyFSet(void); 65 66 void ComputeLambdaS(void); 66 67 void ComputeNewDamage(); -
issm/trunk-jpl/src/c/modules/SystemMatricesx/SystemMatricesx.cpp
r24109 r24431 43 43 for (i=0;i<femmodel->elements->Size();i++){ 44 44 element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i)); 45 if(!element->AnyFSet()) continue; 45 46 ElementMatrix* Ke = analysis->CreateKMatrix(element); 46 47 ElementVector* pe = analysis->CreatePVector(element); … … 76 77 for (i=0;i<femmodel->elements->Size();i++){ 77 78 element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i)); 79 if(!element->AnyFSet()) continue; 78 80 ElementMatrix* Ke = analysis->CreateKMatrix(element); 79 81 ElementVector* pe = analysis->CreatePVector(element);
Note:
See TracChangeset
for help on using the changeset viewer.