Changeset 24130
- Timestamp:
- 08/30/19 11:51:24 (6 years ago)
- Location:
- issm/trunk-jpl/src/c/classes/Loads
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/Loads/Numericalflux.cpp
r24091 r24130 351 351 _error_("Numericalflux type " << EnumToStringx(this->flux_type) << " not supported yet"); 352 352 } 353 } 354 else{ 355 _error_("Numericalflux " << EnumToStringx(this->flux_degree) << " not supported yet"); 356 } 357 358 } 359 /*}}}*/ 360 int Numericalflux::GetNumberOfNodesOneSide(void){/*{{{*/ 361 362 if(this->flux_degree==P0DGEnum){ 363 return 1; 364 } 365 else if(this->flux_degree==P1DGEnum){ 366 return 2; 353 367 } 354 368 else{ … … 695 709 696 710 /* Intermediaries*/ 697 IssmDouble DL1,DL2,Jdet,vx,vy,UdotN;711 IssmDouble A1,A2,Jdet,vx,vy,UdotN; 698 712 IssmDouble xyz_list[NUMVERTICES][3]; 699 713 IssmDouble normal[2]; 700 714 701 715 /*Fetch number of nodes for this flux*/ 702 int numnodes = this->GetNumberOfNodes(); 716 int numnodes = this->GetNumberOfNodes(); 717 int numnodes_plus = this->GetNumberOfNodesOneSide(); 718 int numnodes_minus = numnodes_plus; /*For now we are not doing p-adaptive DG*/ 719 _assert_(numnodes==numnodes_plus+numnodes_minus); 703 720 704 721 /*Initialize variables*/ 705 ElementMatrix *Ke 706 IssmDouble * B = xNew<IssmDouble>(numnodes);707 IssmDouble * Bprime = xNew<IssmDouble>(numnodes);722 ElementMatrix *Ke = new ElementMatrix(nodes,numnodes,this->parameters); 723 IssmDouble *basis_plus = xNew<IssmDouble>(numnodes_plus); 724 IssmDouble *basis_minus = xNew<IssmDouble>(numnodes_minus); 708 725 709 726 /*Retrieve all inputs and parameters*/ … … 722 739 gauss->GaussPoint(ig); 723 740 724 tria->GetSegment BFlux(&B[0],gauss,index1,index2,tria->FiniteElement());725 tria->GetSegment BprimeFlux(&Bprime[0],gauss,index1,index2,tria->FiniteElement());741 tria->GetSegmentNodalFunctions(&basis_plus[0] ,gauss,index1,index2,tria->FiniteElement()); 742 tria->GetSegmentNodalFunctions(&basis_minus[0],gauss,index1,index2,tria->FiniteElement()); 726 743 727 744 vxaverage_input->GetInputValue(&vx,gauss); … … 729 746 UdotN=vx*normal[0]+vy*normal[1]; 730 747 tria->GetSegmentJacobianDeterminant(&Jdet,&xyz_list[0][0],gauss); 731 DL1=gauss->weight*Jdet*dt*UdotN/2; 732 DL2=gauss->weight*Jdet*dt*fabs(UdotN)/2; 733 734 for(int i=0;i<numnodes;i++){ 735 for(int j=0;j<numnodes;j++){ 736 Ke->values[i*numnodes+j]+=DL1*B[i]*Bprime[j]; 737 Ke->values[i*numnodes+j]+=DL2*B[i]*B[j]; 748 A1=gauss->weight*Jdet*dt*UdotN/2; 749 A2=gauss->weight*Jdet*dt*fabs(UdotN)/2; 750 751 /*Term 1 (numerical flux): {Hv}.[[phi]] = 0.5(H+v+ + H-v-)(phi+n+ + phi-n-) 752 * = v.n/2 (H+phi+ + H-phi+ -H+phi- -H-phi-) 753 * = v.n/2 (H+phi+ + H-phi+ -H+phi- -H-phi-) 754 * 755 *Term 2 (stabilization) |v.n|/2 [[H]].[[phi]] = |v.n|/2 (H+n+ + H-n-)(phi+n+ + phi-n-) 756 * = |v.n|/2 (H+phi+ -H-phi+ -H+phi- +H-phi-) 757 * | A++ | A+- | 758 * K = |-----------| 759 * | A-+ | A-- | 760 * 761 *These 4 terms for each expressions are added independently*/ 762 763 /*First term A++*/ 764 for(int i=0;i<numnodes_plus;i++){ 765 for(int j=0;j<numnodes_plus;j++){ 766 Ke->values[i*numnodes+j] += A1*(basis_plus[j]*basis_plus[i]); 767 Ke->values[i*numnodes+j] += A2*(basis_plus[j]*basis_plus[i]); 738 768 } 739 769 } 770 /*Second term A+-*/ 771 for(int i=0;i<numnodes_plus;i++){ 772 for(int j=0;j<numnodes_minus;j++){ 773 Ke->values[i*numnodes+numnodes_plus+j] += A1*(basis_minus[j]*basis_plus[i]); 774 Ke->values[i*numnodes+numnodes_plus+j] += -A2*(basis_minus[j]*basis_plus[i]); 775 } 776 } 777 /*Third term A-+*/ 778 for(int i=0;i<numnodes_minus;i++){ 779 for(int j=0;j<numnodes_plus;j++){ 780 Ke->values[(numnodes_plus+i)*numnodes+j] += -A1*(basis_plus[j]*basis_minus[i]); 781 Ke->values[(numnodes_plus+i)*numnodes+j] += -A2*(basis_plus[j]*basis_minus[i]); 782 } 783 } 784 /*Fourth term A-+*/ 785 for(int i=0;i<numnodes_minus;i++){ 786 for(int j=0;j<numnodes_minus;j++){ 787 Ke->values[(numnodes_plus+i)*numnodes+numnodes_plus+j] += -A1*(basis_minus[j]*basis_minus[i]); 788 Ke->values[(numnodes_plus+i)*numnodes+numnodes_plus+j] += A2*(basis_minus[j]*basis_minus[i]); 789 } 790 } 740 791 } 741 792 742 793 /*Clean up and return*/ 743 xDelete<IssmDouble>( B);744 xDelete<IssmDouble>( Bprime);794 xDelete<IssmDouble>(basis_plus); 795 xDelete<IssmDouble>(basis_minus); 745 796 delete gauss; 746 797 return Ke; -
issm/trunk-jpl/src/c/classes/Loads/Numericalflux.h
r24088 r24130 64 64 void GetNodesSidList(int* sidlist); 65 65 int GetNumberOfNodes(void); 66 int GetNumberOfNodesOneSide(void); 66 67 bool IsPenalty(void); 67 68 void PenaltyCreateJacobianMatrix(Matrix<IssmDouble>* Jff,IssmDouble kmax){_error_("Not implemented yet");};
Note:
See TracChangeset
for help on using the changeset viewer.