source:
issm/oecreview/Archive/24684-25833/ISSM-25262-25263.diff
Last change on this file was 25834, checked in by , 4 years ago | |
---|---|
File size: 10.7 KB |
-
../trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.h
29 29 ElementMatrix* CreateJacobianMatrix(Element* element); 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); 36 34 void InputUpdateFromSolution(IssmDouble* solution,Element* element); -
../trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.cpp
453 453 /*Initialize Element vector*/ 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 460 459 /*Retrieve all inputs and parameters*/ 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); 466 464 Input2* vy_input = element->GetInput2(VyEnum); _assert_(vy_input); … … 478 476 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); 483 482 vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss); … … 489 488 vz_input->GetInputDerivativeValue(&dvz[0],xyz_list,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); 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]; 497 494 498 GetB(B,element,dim,xyz_list,gauss);499 GetBprime(Bprime,element,dim,xyz_list,gauss);500 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; 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 } 505 520 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);523 524 521 if(stabilization==2){ 525 522 if(dim==3){ 526 523 vel=sqrt(vx*vx+vy*vy+vz*vz)+1.e-8; … … 565 562 D[1*dim+0]=D_scalar*D[1*dim+0]; 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){ 570 575 D[0*dim+0]=D_scalar*D[0*dim+0]; … … 576 581 D[0*dim+2]=D_scalar*D[0*dim+2]; 577 582 D[1*dim+2]=D_scalar*D[1*dim+2]; 578 583 D[2*dim+2]=D_scalar*D[2*dim+2]; 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 } 579 593 } 580 TripleMultiply(Bprime,dim,numnodes,1,581 D,dim,dim,0,582 Bprime,dim,numnodes,0,583 &Ke->values[0],1);584 594 } 585 586 595 } 587 596 588 597 /*Clean up and return*/ 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; 595 603 return Ke; … … 665 673 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); 727 678 }/*}}}*/ … … 787 738 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*/ 795 745 element->GetVerticesCoordinates(&xyz_list); … … 802 752 gauss->GaussPoint(ig); 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; 827 775 }/*}}}*/ … … 853 801 element->NodalFunctions(basis,gauss); 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 862 807 /*Clean up and return*/ -
../trunk-jpl/src/c/analyses/L2ProjectionBaseAnalysis.cpp
107 107 basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss); 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 117 113 /*Clean up and return*/ -
../trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp
336 336 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*/ 346 342 vxaverage_input->GetInputValue(&vx,gauss);
Note:
See TracBrowser
for help on using the repository browser.