Changeset 15712
- Timestamp:
- 08/05/13 15:56:17 (12 years ago)
- Location:
- issm/trunk-jpl/src/c/classes/Elements
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
r15711 r15712 8441 8441 8442 8442 /*Clean up and return*/ 8443 xDelete<IssmDouble>(basis); 8443 8444 delete gauss; 8444 xDelete<IssmDouble>(basis);8445 8445 return pe; 8446 8446 } -
issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
r15711 r15712 3144 3144 3145 3145 /*Intermediaries */ 3146 int i,j;3147 IssmDouble 3148 IssmDouble 3149 IssmDouble 3150 IssmDouble 3151 IssmDouble 3146 int i; 3147 IssmDouble driving_stress_baseline,thickness; 3148 IssmDouble Jdet; 3149 IssmDouble xyz_list[NUMVERTICES][3]; 3150 IssmDouble slope[2]; 3151 IssmDouble icefrontlevel[3]; 3152 3152 3153 3153 /*Fetch number of nodes and dof for this finite element*/ … … 5008 5008 5009 5009 /*Intermediaries */ 5010 int i,resp;5011 int *responses=NULL;5012 int num_responses;5013 IssmDouble 5014 IssmDouble 5015 IssmDouble 5016 IssmDouble 5017 IssmDouble 5018 IssmDouble 5019 IssmDouble 5020 IssmDouble 5021 IssmDouble 5010 int i,resp; 5011 int *responses=NULL; 5012 int num_responses; 5013 IssmDouble Jdet; 5014 IssmDouble obs_velocity_mag,velocity_mag; 5015 IssmDouble dux,duy; 5016 IssmDouble epsvel=2.220446049250313e-16; 5017 IssmDouble meanvel=3.170979198376458e-05; /*1000 m/yr*/ 5018 IssmDouble scalex=0,scaley=0,scale=0,S=0; 5019 IssmDouble vx,vy,vxobs,vyobs,weight; 5020 IssmDouble xyz_list[NUMVERTICES][3]; 5021 IssmDouble basis[3]; 5022 5022 GaussTria* gauss=NULL; 5023 5023 … … 5639 5639 ElementMatrix* Tria::CreateKMatrixMelting(void){ 5640 5640 5641 /*Constants*/5642 const int numdof=NUMVERTICES*NDOF1;5643 5644 5641 /*Intermediaries */ 5645 5642 IssmDouble heatcapacity,latentheat; 5646 5643 IssmDouble Jdet,D_scalar; 5647 5644 IssmDouble xyz_list[NUMVERTICES][3]; 5648 IssmDouble basis[3]; 5649 GaussTria *gauss=NULL; 5645 5646 /*Fetch number of nodes and dof for this finite element*/ 5647 int numnodes = this->NumberofNodes(); 5648 int numdof = numnodes*NDOF1; 5649 5650 /*Initialize Element vector and vectors*/ 5651 ElementMatrix* Ke=new ElementMatrix(nodes,numnodes,this->parameters,NoneApproximationEnum); 5652 IssmDouble* basis = xNew<IssmDouble>(numnodes); 5650 5653 5651 5654 /*Initialize Element matrix*/ 5652 ElementMatrix* Ke=new ElementMatrix(nodes,NUMVERTICES,this->parameters,NoneApproximationEnum);5653 5655 5654 5656 /*Retrieve all inputs and parameters*/ 5655 5657 GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES); 5656 latentheat =matpar->GetLatentHeat();5657 heatcapacity =matpar->GetHeatCapacity();5658 latentheat = matpar->GetLatentHeat(); 5659 heatcapacity = matpar->GetHeatCapacity(); 5658 5660 5659 5661 /* Start looping on the number of gauss (nodes on the bedrock) */ 5660 gauss=new GaussTria(2);5662 GaussTria* gauss=new GaussTria(2); 5661 5663 for(int ig=gauss->begin();ig<gauss->end();ig++){ 5662 5664 … … 5668 5670 D_scalar=latentheat/heatcapacity*gauss->weight*Jdet; 5669 5671 5670 TripleMultiply( &basis[0],numdof,1,0,5672 TripleMultiply(basis,numdof,1,0, 5671 5673 &D_scalar,1,1,0, 5672 &basis[0],1,numdof,0,5674 basis,1,numdof,0, 5673 5675 &Ke->values[0],1); 5674 5676 } 5675 5677 5676 5678 /*Clean up and return*/ 5679 xDelete<IssmDouble>(basis); 5677 5680 delete gauss; 5678 5681 return Ke; … … 5764 5767 ElementMatrix* Tria::CreateKMatrixHydrologyShreve(void){ 5765 5768 5766 /*Constants*/ 5767 const int numdof=NDOF1*NUMVERTICES; 5768 5769 /*Intermediaries */ 5769 /*Intermediaries */ 5770 5770 IssmDouble diffusivity; 5771 IssmDouble Jdettria,D L_scalar,dt,h;5771 IssmDouble Jdettria,D_scalar,dt,h; 5772 5772 IssmDouble vx,vy,vel,dvxdx,dvydy; 5773 5773 IssmDouble dvx[2],dvy[2]; 5774 IssmDouble v_gauss[2]={0.0};5775 5774 IssmDouble xyz_list[NUMVERTICES][3]; 5776 IssmDouble basis[NUMVERTICES]; 5777 IssmDouble B[2][NUMVERTICES]; 5778 IssmDouble Bprime[2][NUMVERTICES]; 5779 IssmDouble K[2][2] ={0.0}; 5780 IssmDouble KDL[2][2] ={0.0}; 5781 IssmDouble DL[2][2] ={0.0}; 5782 IssmDouble DLprime[2][2] ={0.0}; 5783 GaussTria *gauss=NULL; 5784 5785 /*Skip if water or ice shelf element*/ 5775 5776 /*Skip if water or ice shelf element*/ 5786 5777 if(IsOnWater() | IsFloating()) return NULL; 5787 5778 5788 /*Initialize Element matrix*/ 5789 ElementMatrix* Ke=new ElementMatrix(nodes,NUMVERTICES,this->parameters,NoneApproximationEnum); 5790 5791 /*Create water velocity vx and vy from current inputs*/ 5779 /*Fetch number of nodes and dof for this finite element*/ 5780 int numnodes = this->NumberofNodes(); 5781 int numdof = numnodes*NDOF1; 5782 5783 /*Initialize Element matrix and vectors*/ 5784 ElementMatrix* Ke = new ElementMatrix(nodes,numnodes,this->parameters,NoneApproximationEnum); 5785 IssmDouble* basis = xNew<IssmDouble>(numnodes); 5786 IssmDouble* B = xNew<IssmDouble>(2*numdof); 5787 IssmDouble* Bprime = xNew<IssmDouble>(2*numdof); 5788 IssmDouble D[2][2]; 5789 5790 /*Create water velocity vx and vy from current inputs*/ 5792 5791 CreateHydrologyWaterVelocityInput(); 5793 5792 … … 5800 5799 h=sqrt(2*this->GetArea()); 5801 5800 5802 /* Start looping on the number of gaussian points: */5803 gauss=new GaussTria(2);5801 /* Start looping on the number of gaussian points: */ 5802 GaussTria* gauss=new GaussTria(2); 5804 5803 for(int ig=gauss->begin();ig<gauss->end();ig++){ 5805 5804 … … 5807 5806 5808 5807 GetJacobianDeterminant(&Jdettria, &xyz_list[0][0],gauss); 5809 GetNodalFunctions( &basis[0],gauss);5808 GetNodalFunctions(basis,gauss); 5810 5809 5811 5810 vx_input->GetInputValue(&vx,gauss); … … 5814 5813 vy_input->GetInputDerivativeValue(&dvy[0],&xyz_list[0][0],gauss); 5815 5814 5816 D L_scalar=gauss->weight*Jdettria;5817 5818 TripleMultiply( &basis[0],1,numdof,1,5819 &D L_scalar,1,1,0,5820 &basis[0],1,numdof,0,5821 &Ke->values[0],1);5822 5823 GetBPrognostic( &B[0][0],&xyz_list[0][0], gauss);5824 GetBprimePrognostic( &Bprime[0][0],&xyz_list[0][0], gauss);5815 D_scalar=gauss->weight*Jdettria; 5816 5817 TripleMultiply(basis,1,numdof,1, 5818 &D_scalar,1,1,0, 5819 basis,1,numdof,0, 5820 Ke->values,1); 5821 5822 GetBPrognostic(B,&xyz_list[0][0], gauss); 5823 GetBprimePrognostic(Bprime,&xyz_list[0][0], gauss); 5825 5824 5826 5825 dvxdx=dvx[0]; 5827 5826 dvydy=dvy[1]; 5828 DL_scalar=dt*gauss->weight*Jdettria; 5829 5830 DL[0][0]=DL_scalar*dvxdx; 5831 DL[1][1]=DL_scalar*dvydy; 5832 DLprime[0][0]=DL_scalar*vx; 5833 DLprime[1][1]=DL_scalar*vy; 5834 5835 TripleMultiply( &B[0][0],2,numdof,1, 5836 &DL[0][0],2,2,0, 5837 &B[0][0],2,numdof,0, 5838 &Ke->values[0],1); 5839 5840 TripleMultiply( &B[0][0],2,numdof,1, 5841 &DLprime[0][0],2,2,0, 5842 &Bprime[0][0],2,numdof,0, 5843 &Ke->values[0],1); 5827 D_scalar=dt*gauss->weight*Jdettria; 5828 5829 D[0][0]=D_scalar*dvxdx; 5830 D[0][1]=0.; 5831 D[1][1]=D_scalar*dvydy; 5832 D[1][1]=0.; 5833 TripleMultiply(B,2,numdof,1, 5834 &D[0][0],2,2,0, 5835 B,2,numdof,0, 5836 &Ke->values[0],1); 5837 5838 D[0][0]=D_scalar*vx; 5839 D[1][1]=D_scalar*vy; 5840 TripleMultiply(B,2,numdof,1, 5841 &D[0][0],2,2,0, 5842 Bprime,2,numdof,0, 5843 &Ke->values[0],1); 5844 5844 5845 5845 /*Artificial diffusivity*/ 5846 5846 vel=sqrt(vx*vx+vy*vy); 5847 K[0][0]=diffusivity*h/(2*vel)*vx*vx; 5848 K[1][0]=diffusivity*h/(2*vel)*vy*vx; 5849 K[0][1]=diffusivity*h/(2*vel)*vx*vy; 5850 K[1][1]=diffusivity*h/(2*vel)*vy*vy; 5851 KDL[0][0]=DL_scalar*K[0][0]; 5852 KDL[1][0]=DL_scalar*K[1][0]; 5853 KDL[0][1]=DL_scalar*K[0][1]; 5854 KDL[1][1]=DL_scalar*K[1][1]; 5855 5856 TripleMultiply( &Bprime[0][0],2,numdof,1, 5857 &KDL[0][0],2,2,0, 5858 &Bprime[0][0],2,numdof,0, 5859 &Ke->values[0],1); 5860 } 5861 5862 /*Clean up and return*/ 5847 D[0][0]=D_scalar*diffusivity*h/(2*vel)*vx*vx; 5848 D[1][0]=D_scalar*diffusivity*h/(2*vel)*vy*vx; 5849 D[0][1]=D_scalar*diffusivity*h/(2*vel)*vx*vy; 5850 D[1][1]=D_scalar*diffusivity*h/(2*vel)*vy*vy; 5851 TripleMultiply(Bprime,2,numdof,1, 5852 &D[0][0],2,2,0, 5853 Bprime,2,numdof,0, 5854 &Ke->values[0],1); 5855 } 5856 5857 /*Clean up and return*/ 5858 xDelete<IssmDouble>(basis); 5859 xDelete<IssmDouble>(B); 5860 xDelete<IssmDouble>(Bprime); 5863 5861 delete gauss; 5864 5862 return Ke; … … 5867 5865 /*FUNCTION Tria::CreateKMatrixHydrologyDCInefficient{{{*/ 5868 5866 ElementMatrix* Tria::CreateKMatrixHydrologyDCInefficient(void){ 5869 5870 /*constants: */5871 const int numdof=NDOF1*NUMVERTICES;5872 5867 5873 5868 /* Intermediaries */ … … 5876 5871 IssmDouble sediment_storing; 5877 5872 IssmDouble xyz_list[NUMVERTICES][3]; 5878 IssmDouble B[2][numdof]; 5879 IssmDouble basis[NUMVERTICES]; 5880 IssmDouble D[2][2]; 5881 GaussTria *gauss = NULL; 5882 5883 /*Initialize Element matrix*/ 5884 ElementMatrix* Ke=new ElementMatrix(nodes,NUMVERTICES,this->parameters,NoneApproximationEnum); 5873 5874 /*Fetch number of nodes and dof for this finite element*/ 5875 int numnodes = this->NumberofNodes(); 5876 int numdof = numnodes*NDOF2; 5877 5878 /*Initialize Element matrix and vectors*/ 5879 ElementMatrix* Ke = new ElementMatrix(nodes,numnodes,this->parameters); 5880 IssmDouble* B = xNew<IssmDouble>(5*numdof); 5881 IssmDouble* basis = xNew<IssmDouble>(numnodes); 5882 IssmDouble D[2][2]; 5885 5883 5886 5884 /*Retrieve all inputs and parameters*/ … … 5891 5889 5892 5890 /* Start looping on the number of gaussian points: */ 5893 gauss=new GaussTria(2);5891 GaussTria* gauss=new GaussTria(2); 5894 5892 for(int ig=gauss->begin();ig<gauss->end();ig++){ 5895 5893 … … 5903 5901 D[0][0]=D_scalar; D[0][1]=0.; 5904 5902 D[1][0]=0.; D[1][1]=D_scalar; 5905 GetBHydro( &B[0][0],&xyz_list[0][0],gauss);5906 TripleMultiply( &B[0][0],2,numdof,1,5903 GetBHydro(B,&xyz_list[0][0],gauss); 5904 TripleMultiply(B,2,numdof,1, 5907 5905 &D[0][0],2,2,0, 5908 &B[0][0],2,numdof,0,5906 B,2,numdof,0, 5909 5907 &Ke->values[0],1); 5910 5908 … … 5914 5912 D_scalar=sediment_storing*gauss->weight*Jdet; 5915 5913 5916 TripleMultiply( &basis[0],numdof,1,0,5914 TripleMultiply(basis,numdof,1,0, 5917 5915 &D_scalar,1,1,0, 5918 &basis[0],1,numdof,0,5916 basis,1,numdof,0, 5919 5917 &Ke->values[0],1); 5920 5918 } 5921 5919 } 5922 5920 /*Clean up and return*/ 5921 xDelete<IssmDouble>(basis); 5922 xDelete<IssmDouble>(B); 5923 5923 delete gauss; 5924 5924 return Ke; … … 5969 5969 GetBHydro(&B[0][0],&xyz_list[0][0],gauss); 5970 5970 TripleMultiply(&B[0][0],2,numdof,1, 5971 5972 5973 5971 &D[0][0],2,2,0, 5972 &B[0][0],2,numdof,0, 5973 &Ke->values[0],1); 5974 5974 5975 5975 /*Transient*/ … … 5992 5992 ElementVector* Tria::CreatePVectorHydrologyShreve(void){ 5993 5993 5994 /*Constants*/5995 const int numdof=NDOF1*NUMVERTICES;5996 5997 5994 /*Intermediaries */ 5998 int i ,j;5995 int i; 5999 5996 IssmDouble Jdettria,dt; 6000 5997 IssmDouble basal_melting_g; 6001 5998 IssmDouble old_watercolumn_g; 6002 5999 IssmDouble xyz_list[NUMVERTICES][3]; 6003 IssmDouble basis[numdof];6004 GaussTria* gauss=NULL;6005 6000 6006 6001 /*Skip if water or ice shelf element*/ 6007 6002 if(IsOnWater() | IsFloating()) return NULL; 6008 6003 6004 /*Fetch number of nodes and dof for this finite element*/ 6005 int numnodes = this->NumberofNodes(); 6006 int numdof = numnodes*NDOF1; 6007 6009 6008 /*Initialize Element vector*/ 6010 ElementVector* pe=new ElementVector(nodes,NUMVERTICES,this->parameters); 6009 ElementVector* pe=new ElementVector(nodes,numnodes,this->parameters); 6010 IssmDouble* basis = xNewZeroInit<IssmDouble>(numnodes); 6011 6011 6012 6012 /*Retrieve all inputs and parameters*/ … … 6018 6018 /*Initialize basal_melting_correction_g to 0, do not forget!:*/ 6019 6019 /* Start looping on the number of gaussian points: */ 6020 gauss=new GaussTria(2);6020 GaussTria* gauss=new GaussTria(2); 6021 6021 for(int ig=gauss->begin();ig<gauss->end();ig++){ 6022 6022 … … 6029 6029 old_watercolumn_input->GetInputValue(&old_watercolumn_g,gauss); 6030 6030 6031 if(reCast<int,IssmDouble>(dt))for(i=0;i<numdof;i++) pe->values[i]+=Jdettria*gauss->weight*(old_watercolumn_g+dt*basal_melting_g)*basis[i]; 6032 else for(i=0;i<numdof;i++) pe->values[i]+=Jdettria*gauss->weight*basal_melting_g*basis[i]; 6031 if(reCast<int,IssmDouble>(dt)){ 6032 for(i=0;i<numdof;i++) pe->values[i]+=Jdettria*gauss->weight*(old_watercolumn_g+dt*basal_melting_g)*basis[i]; 6033 } 6034 else{ 6035 for(i=0;i<numdof;i++) pe->values[i]+=Jdettria*gauss->weight*basal_melting_g*basis[i]; 6036 } 6033 6037 } 6034 6038 6035 6039 /*Clean up and return*/ 6040 xDelete<IssmDouble>(basis); 6036 6041 delete gauss; 6037 6042 return pe; … … 6484 6489 IssmDouble vel,vx,vy,dvxdx,dvydy; 6485 6490 IssmDouble dvx[2],dvy[2]; 6486 IssmDouble v_gauss[2]={0.0};6487 6491 IssmDouble xyz_list[NUMVERTICES][3]; 6488 6492 … … 6589 6593 6590 6594 /*Clean up and return*/ 6591 delete gauss;6592 6595 xDelete<IssmDouble>(basis); 6593 6596 xDelete<IssmDouble>(B); 6594 6597 xDelete<IssmDouble>(Bprime); 6598 delete gauss; 6595 6599 return Ke; 6596 6600 }
Note:
See TracChangeset
for help on using the changeset viewer.