Changeset 25263
- Timestamp:
- 07/10/20 21:10:34 (5 years ago)
- Location:
- issm/trunk-jpl/src/c/analyses
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.cpp
r24933 r25263 454 454 ElementMatrix* Ke = element->NewElementMatrix(); 455 455 IssmDouble* basis = xNew<IssmDouble>(numnodes); 456 IssmDouble* B = xNew<IssmDouble>(dim*numnodes); 457 IssmDouble* Bprime = xNew<IssmDouble>(dim*numnodes); 456 IssmDouble* dbasis = xNew<IssmDouble>(dim*numnodes); 458 457 IssmDouble* D = xNewZeroInit<IssmDouble>(dim*dim); 459 458 … … 461 460 element->GetVerticesCoordinates(&xyz_list); 462 461 element->FindParam(&dt,TimesteppingTimeStepEnum); 463 //printf("dt %f\n", dt);464 462 element->FindParam(&stabilization,DamageStabilizationEnum); 465 463 Input2* vx_input = element->GetInput2(VxEnum); _assert_(vx_input); … … 479 477 element->JacobianDeterminant(&Jdet,xyz_list,gauss); 480 478 element->NodalFunctions(basis,gauss); 479 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss); 481 480 482 481 vx_input->GetInputValue(&vx,gauss); … … 490 489 } 491 490 491 /*Transient term*/ 492 492 D_scalar=gauss->weight*Jdet; 493 TripleMultiply(basis,1,numnodes,1, 494 &D_scalar,1,1,0, 495 basis,1,numnodes,0, 496 &Ke->values[0],1); 497 498 GetB(B,element,dim,xyz_list,gauss); 499 GetBprime(Bprime,element,dim,xyz_list,gauss); 493 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]; 500 494 501 495 dvxdx=dvx[0]; 502 496 dvydy=dvy[1]; 503 if(dim==3) dvzdz=dvz[2];504 497 D_scalar=dt*gauss->weight*Jdet; 505 506 D[0*dim+0]=D_scalar*dvxdx; 507 D[1*dim+1]=D_scalar*dvydy; 508 if(dim==3) D[2*dim+2]=D_scalar*dvzdz; 509 510 TripleMultiply(B,dim,numnodes,1, 511 D,dim,dim,0, 512 B,dim,numnodes,0, 513 &Ke->values[0],1); 514 515 D[0*dim+0]=D_scalar*vx; 516 D[1*dim+1]=D_scalar*vy; 517 if(dim==3) D[2*dim+2]=D_scalar*vz; 518 519 TripleMultiply(B,dim,numnodes,1, 520 D,dim,dim,0, 521 Bprime,dim,numnodes,0, 522 &Ke->values[0],1); 498 if(dim==2){ 499 for(int i=0;i<numnodes;i++){ 500 for(int j=0;j<numnodes;j++){ 501 /*\phi_i \phi_j \nabla\cdot v*/ 502 Ke->values[i*numnodes+j] += D_scalar*basis[i]*basis[j]*(dvxdx+dvydy); 503 /*\phi_i v\cdot\nabla\phi_j*/ 504 Ke->values[i*numnodes+j] += D_scalar*basis[i]*(vx*dbasis[0*numnodes+j] + vy*dbasis[1*numnodes+j]); 505 } 506 } 507 } 508 else{/*3D*/ 509 _assert_(dim==3); 510 dvzdz=dvz[2]; 511 for(int i=0;i<numnodes;i++){ 512 for(int j=0;j<numnodes;j++){ 513 /*\phi_i \phi_j \nabla\cdot v*/ 514 Ke->values[i*numnodes+j] += D_scalar*basis[i]*basis[j]*(dvxdx+dvydy+dvzdz); 515 /*\phi_i v\cdot\nabla\phi_j*/ 516 Ke->values[i*numnodes+j] += D_scalar*basis[i]*(vx*dbasis[0*numnodes+j] + vy*dbasis[1*numnodes+j] + vz*dbasis[2*numnodes+j]); 517 } 518 } 519 } 523 520 524 521 if(stabilization==2){ … … 566 563 D[0*dim+1]=D_scalar*D[0*dim+1]; 567 564 D[1*dim+1]=D_scalar*D[1*dim+1]; 565 for(int i=0;i<numnodes;i++){ 566 for(int j=0;j<numnodes;j++){ 567 Ke->values[i*numnodes+j] += ( 568 dbasis[0*numnodes+i] *(D[0*dim+0]*dbasis[0*numnodes+j] + D[0*dim+1]*dbasis[1*numnodes+j]) + 569 dbasis[1*numnodes+i] *(D[1*dim+0]*dbasis[0*numnodes+j] + D[1*dim+1]*dbasis[1*numnodes+j]) 570 ); 571 } 572 } 568 573 } 569 574 else if(dim==3){ … … 577 582 D[1*dim+2]=D_scalar*D[1*dim+2]; 578 583 D[2*dim+2]=D_scalar*D[2*dim+2]; 579 } 580 TripleMultiply(Bprime,dim,numnodes,1, 581 D,dim,dim,0, 582 Bprime,dim,numnodes,0, 583 &Ke->values[0],1); 584 } 585 584 for(int i=0;i<numnodes;i++){ 585 for(int j=0;j<numnodes;j++){ 586 Ke->values[i*numnodes+j] += ( 587 dbasis[0*numnodes+i] *(D[0*dim+0]*dbasis[0*numnodes+j] + D[0*dim+1]*dbasis[1*numnodes+j] + D[0*dim+2]*dbasis[2*numnodes+j]) + 588 dbasis[1*numnodes+i] *(D[1*dim+0]*dbasis[0*numnodes+j] + D[1*dim+1]*dbasis[1*numnodes+j] + D[1*dim+2]*dbasis[2*numnodes+j]) + 589 dbasis[2*numnodes+i] *(D[2*dim+0]*dbasis[0*numnodes+j] + D[2*dim+1]*dbasis[1*numnodes+j] + D[2*dim+2]*dbasis[2*numnodes+j]) 590 ); 591 } 592 } 593 } 594 } 586 595 } 587 596 … … 589 598 xDelete<IssmDouble>(xyz_list); 590 599 xDelete<IssmDouble>(basis); 591 xDelete<IssmDouble>(B); 592 xDelete<IssmDouble>(Bprime); 600 xDelete<IssmDouble>(dbasis); 593 601 xDelete<IssmDouble>(D); 594 602 delete gauss; … … 666 674 return pe; 667 675 }/*}}}*/ 668 void DamageEvolutionAnalysis::GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/669 /*Compute B matrix. B=[B1 B2 B3] where Bi is of size 3*2.670 * For node i, Bi can be expressed in the actual coordinate system671 * by:672 * Bi=[ N ]673 * [ N ]674 * where N is the finiteelement function for node i.675 *676 * We assume B_prog has been allocated already, of size: 2x(1*numnodes)677 */678 679 /*Fetch number of nodes for this finite element*/680 int numnodes = element->GetNumberOfNodes();681 682 /*Get nodal functions*/683 IssmDouble* basis=xNew<IssmDouble>(numnodes);684 element->NodalFunctions(basis,gauss);685 686 /*Build B: */687 for(int i=0;i<numnodes;i++){688 for(int j=0;j<dim;j++){689 B[numnodes*j+i] = basis[i];690 }691 }692 693 /*Clean-up*/694 xDelete<IssmDouble>(basis);695 }/*}}}*/696 void DamageEvolutionAnalysis::GetBprime(IssmDouble* Bprime,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/697 /*Compute B' matrix. B'=[B1' B2' B3'] where Bi' is of size 3*2.698 * For node i, Bi' can be expressed in the actual coordinate system699 * by:700 * Bi_prime=[ dN/dx ]701 * [ dN/dy ]702 * where N is the finiteelement function for node i.703 *704 * We assume B' has been allocated already, of size: 3x(2*numnodes)705 */706 707 /*Fetch number of nodes for this finite element*/708 int numnodes = element->GetNumberOfNodes();709 710 /*Get nodal functions derivatives*/711 IssmDouble* dbasis=xNew<IssmDouble>(dim*numnodes);712 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);713 714 /*Build B': */715 for(int i=0;i<numnodes;i++){716 for(int j=0;j<dim;j++){717 Bprime[numnodes*j+i] = dbasis[j*numnodes+i];718 }719 }720 721 /*Clean-up*/722 xDelete<IssmDouble>(dbasis);723 724 }/*}}}*/725 676 void DamageEvolutionAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/ 726 677 element->GetSolutionFromInputsOneDof(solution,DamageDbarEnum); … … 788 739 /*Initialize Element vector and other vectors*/ 789 740 ElementMatrix* Ke = element->NewElementMatrix(); 790 IssmDouble* B = xNew<IssmDouble>(dim*numnodes); 791 IssmDouble* Bprime = xNew<IssmDouble>(dim*numnodes); 792 IssmDouble* D = xNewZeroInit<IssmDouble>(dim*dim); 741 IssmDouble* basis = xNew<IssmDouble>(numnodes); 742 IssmDouble* dbasis = xNew<IssmDouble>(dim*numnodes); 793 743 794 744 /*Retrieve all inputs and parameters*/ … … 803 753 804 754 element->JacobianDeterminant(&Jdet,xyz_list,gauss); 805 GetB(B,element,dim,xyz_list,gauss); 806 GetBprime(Bprime,element,dim,xyz_list,gauss); 755 element->NodalFunctions(basis,gauss); 756 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss); 757 807 758 vxaverage_input->GetInputValue(&vx,gauss); 808 759 vyaverage_input->GetInputValue(&vy,gauss); 809 760 810 D[0*dim+0] = -gauss->weight*vx*Jdet; 811 D[1*dim+1] = -gauss->weight*vy*Jdet; 812 813 TripleMultiply(B,dim,numnodes,1, 814 D,dim,dim,0, 815 Bprime,dim,numnodes,0, 816 &Ke->values[0],1); 817 761 for(int i=0;i<numnodes;i++){ 762 for(int j=0;j<numnodes;j++){ 763 /*\phi_i v\cdot\nabla\phi_j*/ 764 Ke->values[i*numnodes+j] += -gauss->weight*Jdet*basis[i]*(vx*dbasis[0*numnodes+j] + vy*dbasis[1*numnodes+j]); 765 } 766 } 818 767 } 819 768 820 769 /*Clean up and return*/ 821 770 xDelete<IssmDouble>(xyz_list); 822 xDelete<IssmDouble>(B); 823 xDelete<IssmDouble>(Bprime); 824 xDelete<IssmDouble>(D); 771 xDelete<IssmDouble>(basis); 772 xDelete<IssmDouble>(dbasis); 825 773 delete gauss; 826 774 return Ke; … … 854 802 855 803 D=gauss->weight*Jdet; 856 TripleMultiply(basis,1,numnodes,1, 857 &D,1,1,0, 858 basis,1,numnodes,0, 859 &Me->values[0],1); 804 for(int i=0;i<numnodes;i++) for(int j=0;j<numnodes;j++) Me->values[i*numnodes+j] += D*basis[i]*basis[j]; 860 805 } 861 806 -
issm/trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.h
r24713 r25263 30 30 ElementMatrix* CreateKMatrix(Element* element); 31 31 ElementVector* CreatePVector(Element* element); 32 void GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);33 void GetBprime(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);34 32 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 35 33 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index); -
issm/trunk-jpl/src/c/analyses/L2ProjectionBaseAnalysis.cpp
r25118 r25263 108 108 basalelement->NodalFunctions(basis,gauss); 109 109 D=gauss->weight*Jdet; 110 111 TripleMultiply(basis,1,numnodes,1, 112 &D,1,1,0, 113 basis,1,numnodes,0, 114 &Ke->values[0],1); 110 for(int i=0;i<numnodes;i++) for(int j=0;j<numnodes;j++) Ke->values[i*numnodes+j] += D*basis[i]*basis[j]; 115 111 } 116 112 -
issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp
r25211 r25263 337 337 /*Transient term*/ 338 338 D_scalar=gauss->weight*Jdet; 339 for(int i=0;i<numnodes;i++){ 340 for(int j=0;j<numnodes;j++){ 341 Ke->values[i*numnodes+j] += D_scalar*basis[i]*basis[j]; 342 } 343 } 339 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]; 344 340 345 341 /*Advection terms*/
Note:
See TracChangeset
for help on using the changeset viewer.