Changeset 14591
- Timestamp:
- 04/15/13 16:54:51 (12 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/objects/Elements/Penta.cpp
r14589 r14591 3487 3487 GetNodalFunctionsP1(&L[0], gauss); 3488 3488 D_scalar_trans=gauss->weight*Jdet; 3489 D_scalar_trans=D_scalar_trans;3490 3489 3491 3490 TripleMultiply(&L[0],numdof,1,0, … … 3717 3716 GetNodalFunctionsP1(&L[0], gauss); 3718 3717 D_scalar_trans=gauss->weight*Jdet; 3719 D_scalar_trans=D_scalar_trans;3720 3718 3721 3719 TripleMultiply(&L[0],numdof,1,0, -
issm/trunk-jpl/src/c/classes/objects/Elements/Tria.cpp
r14589 r14591 533 533 IssmDouble D,Jdet; 534 534 IssmDouble xyz_list[NUMVERTICES][3]; 535 IssmDouble L[1][ 3];535 IssmDouble L[1][numdof]; 536 536 GaussTria *gauss = NULL; 537 537 … … 5677 5677 ElementMatrix* Tria::CreateKMatrixHydrology(void){ 5678 5678 5679 int hydrology_model; 5680 parameters->FindParam(&hydrology_model,HydrologyEnum); 5681 5682 switch(hydrology_model){ 5683 case HydrologyshreveEnum: 5684 return CreateKMatrixHydrologyShreve(); 5685 case HydrologydcEnum: 5686 return CreateKMatrixHydrologyDC(); 5687 default: 5688 _error_("Approximation " << EnumToStringx(hydrology_model) << " not supported yet"); 5689 } 5690 5691 } 5692 /*}}}*/ 5693 /*FUNCTION Tria::CreateKMatrixHydrologyShreve{{{*/ 5694 ElementMatrix* Tria::CreateKMatrixHydrologyShreve(void){ 5695 5679 5696 /*Constants*/ 5680 5697 const int numdof=NDOF1*NUMVERTICES; … … 5778 5795 } 5779 5796 /*}}}*/ 5780 /*FUNCTION Tria::CreatePVectorHydrology {{{*/ 5797 /*FUNCTION Tria::CreateKMatrixHydrologyDC{{{*/ 5798 ElementMatrix* Tria::CreateKMatrixHydrologyDC(void){ 5799 5800 /*constants: */ 5801 const int numdof=NDOF1*NUMVERTICES; 5802 5803 /* Intermediaries */ 5804 IssmDouble D_scalar,Jdet; 5805 IssmDouble sediment_porosity,dt; 5806 IssmDouble xyz_list[NUMVERTICES][3]; 5807 IssmDouble B[2][numdof]; 5808 IssmDouble L[NUMVERTICES]; 5809 IssmDouble D[2][2]; 5810 GaussTria *gauss = NULL; 5811 5812 /*Initialize Element matrix*/ 5813 ElementMatrix* Ke=new ElementMatrix(nodes,NUMVERTICES,this->parameters,NoneApproximationEnum); 5814 5815 /*Retrieve all inputs and parameters*/ 5816 GetVerticesCoordinates(&xyz_list[0][0],nodes,NUMVERTICES); 5817 sediment_porosity = matpar->GetSedimentPorosity(); 5818 this->parameters->FindParam(&dt,TimesteppingTimeStepEnum); 5819 5820 /* Start looping on the number of gaussian points: */ 5821 gauss=new GaussTria(2); 5822 for(int ig=gauss->begin();ig<gauss->end();ig++){ 5823 5824 gauss->GaussPoint(ig); 5825 5826 GetJacobianDeterminant(&Jdet, &xyz_list[0][0],gauss); 5827 5828 /*Diffusivity*/ 5829 D_scalar=sediment_porosity*gauss->weight*Jdet; 5830 if(reCast<bool,IssmDouble>(dt)) D_scalar=D_scalar*dt; 5831 D[0][0]=D_scalar; D[0][1]=0.; 5832 D[1][0]=0.; D[1][1]=D_scalar; 5833 GetBHydro(&B[0][0],&xyz_list[0][0],gauss); 5834 TripleMultiply(&B[0][0],2,numdof,1, 5835 &D[0][0],2,2,0, 5836 &B[0][0],2,numdof,0, 5837 &Ke->values[0],1); 5838 5839 /*Transient*/ 5840 if(reCast<bool,IssmDouble>(dt)){ 5841 GetL(&L[0], &xyz_list[0][0], gauss,NDOF1); 5842 D_scalar=gauss->weight*Jdet; 5843 5844 TripleMultiply(&L[0],numdof,1,0, 5845 &D_scalar,1,1,0, 5846 &L[0],1,numdof,0, 5847 &Ke->values[0],1); 5848 } 5849 } 5850 5851 /*Clean up and return*/ 5852 delete gauss; 5853 return Ke; 5854 } 5855 /*}}}*/ 5856 /*FUNCTION Tria::CreatePVectorHydrology{{{*/ 5781 5857 ElementVector* Tria::CreatePVectorHydrology(void){ 5858 5859 int hydrology_model; 5860 parameters->FindParam(&hydrology_model,HydrologyEnum); 5861 5862 switch(hydrology_model){ 5863 case HydrologyshreveEnum: 5864 return CreatePVectorHydrologyShreve(); 5865 case HydrologydcEnum: 5866 return CreatePVectorHydrologyDC(); 5867 default: 5868 _error_("Approximation " << EnumToStringx(hydrology_model) << " not supported yet"); 5869 } 5870 5871 } 5872 /*}}}*/ 5873 /*FUNCTION Tria::CreatePVectorHydrologyShreve {{{*/ 5874 ElementVector* Tria::CreatePVectorHydrologyShreve(void){ 5782 5875 5783 5876 /*Constants*/ … … 5820 5913 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]; 5821 5914 else for(i=0;i<numdof;i++) pe->values[i]+=Jdettria*gauss->weight*basal_melting_g*basis[i]; 5915 } 5916 5917 /*Clean up and return*/ 5918 delete gauss; 5919 return pe; 5920 } 5921 /*}}}*/ 5922 /*FUNCTION Tria::CreatePVectorHydrologyDC {{{*/ 5923 ElementVector* Tria::CreatePVectorHydrologyDC(void){ 5924 5925 /*Constants*/ 5926 const int numdof=NDOF1*NUMVERTICES; 5927 5928 /*Intermediaries */ 5929 IssmDouble Jdet; 5930 IssmDouble xyz_list[NUMVERTICES][3]; 5931 IssmDouble dt,gravity,scalar,water_head; 5932 IssmDouble basis[numdof]; 5933 GaussTria* gauss=NULL; 5934 5935 /*Initialize Element vector*/ 5936 ElementVector* pe=new ElementVector(nodes,NUMVERTICES,this->parameters); 5937 5938 /*Retrieve all inputs and parameters*/ 5939 GetVerticesCoordinates(&xyz_list[0][0], nodes, NUMVERTICES); 5940 gravity = matpar->GetG(); 5941 Input* old_wh_input=NULL; 5942 if(reCast<bool,IssmDouble>(dt)){ 5943 old_wh_input=inputs->GetInput(SedimentHeadEnum); _assert_(old_wh_input); 5944 } 5945 5946 /* Start looping on the number of gaussian points: */ 5947 gauss=new GaussTria(2); 5948 for(int ig=gauss->begin();ig<gauss->end();ig++){ 5949 5950 gauss->GaussPoint(ig); 5951 5952 GetJacobianDeterminant(&Jdet, &xyz_list[0][0],gauss); 5953 GetNodalFunctions(basis, gauss); 5954 5955 /*Gravity term*/ 5956 scalar = Jdet*gauss->weight*gravity; 5957 if(reCast<bool,IssmDouble>(dt)) scalar = scalar*dt; 5958 for(int i=0;i<numdof;i++) pe->values[i]+=scalar*basis[i]; 5959 5960 /*Transient term*/ 5961 if(reCast<bool,IssmDouble>(dt)){ 5962 old_wh_input->GetInputValue(&water_head,gauss); 5963 scalar = Jdet*gauss->weight*water_head; 5964 for(int i=0;i<numdof;i++) pe->values[i]+=scalar*basis[i]; 5965 } 5822 5966 } 5823 5967 -
issm/trunk-jpl/src/c/classes/objects/Elements/Tria.h
r14589 r14591 239 239 #ifdef _HAVE_HYDROLOGY_ 240 240 ElementMatrix* CreateKMatrixHydrology(void); 241 ElementMatrix* CreateKMatrixHydrologyShreve(void); 242 ElementMatrix* CreateKMatrixHydrologyDC(void); 241 243 ElementVector* CreatePVectorHydrology(void); 244 ElementVector* CreatePVectorHydrologyShreve(void); 245 ElementVector* CreatePVectorHydrologyDC(void); 242 246 void CreateHydrologyWaterVelocityInput(void); 243 247 void GetSolutionFromInputsHydrology(Vector<IssmDouble>* solution); -
issm/trunk-jpl/src/c/classes/objects/Elements/TriaRef.cpp
r14384 r14591 56 56 57 57 /*Reference Element numerics*/ 58 /*FUNCTION TriaRef::GetBHydro {{{*/ 59 void TriaRef::GetBHydro(IssmDouble* B, IssmDouble* xyz_list, GaussTria* gauss){ 60 /*Compute B matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2. 61 * For node i, Bi can be expressed in the actual coordinate system 62 * by: 63 * Bi=[ dh/dx ] 64 * [ dh/dy ] 65 * where h is the interpolation function for node i. 66 * 67 * We assume B has been allocated already, of size: 3x(NDOF2*NUMNODES) 68 */ 69 70 int i; 71 IssmDouble dbasis[NDOF2][NUMNODES]; 72 73 /*Get dh1dh2dh3 in actual coordinate system: */ 74 GetNodalFunctionsDerivatives(&dbasis[0][0],xyz_list,gauss); 75 76 /*Build B: */ 77 for (i=0;i<NUMNODES;i++){ 78 B[NDOF1*NUMNODES*0+NDOF1*i]=dbasis[0][i]; 79 B[NDOF1*NUMNODES*1+NDOF1*i]=dbasis[1][i]; 80 } 81 } 82 /*}}}*/ 58 83 /*FUNCTION TriaRef::GetBMacAyeal {{{*/ 59 84 void TriaRef::GetBMacAyeal(IssmDouble* B, IssmDouble* xyz_list, GaussTria* gauss){ -
issm/trunk-jpl/src/c/classes/objects/Elements/TriaRef.h
r14384 r14591 29 29 void GetBprimePrognostic(IssmDouble* Bprime_prog, IssmDouble* xyz_list, GaussTria* gauss); 30 30 void GetBPrognostic(IssmDouble* B_prog, IssmDouble* xyz_list, GaussTria* gauss); 31 void GetBHydro(IssmDouble* B, IssmDouble* xyz_list, GaussTria* gauss); 31 32 void GetL(IssmDouble* L, IssmDouble* xyz_list,GaussTria* gauss,int numdof); 32 33 void GetJacobian(IssmDouble* J, IssmDouble* xyz_list,GaussTria* gauss); -
issm/trunk-jpl/src/c/solutions/hydrology_core.cpp
r14577 r14591 60 60 61 61 if (hydrology_model==HydrologyshreveEnum){ 62 /*Compute hydrology solution: */63 62 if(VerboseSolution()) _pprintLine_(" computing water column"); 64 63 femmodel->SetCurrentConfiguration(HydrologyAnalysisEnum); … … 80 79 } 81 80 else if (hydrology_model==HydrologydcEnum){ 82 //solver_linear(femmodel,modify_loads); 83 _error_("not implemented yet"); 81 if(VerboseSolution()) _pprintLine_(" computing water head"); 82 femmodel->SetCurrentConfiguration(HydrologyAnalysisEnum); 83 solver_linear(femmodel); 84 84 if(save_results && ((i+1)%output_frequency==0 || (i+1)==nsteps)){ 85 85 if(VerboseSolution()) _pprintLine_(" saving results ");
Note:
See TracChangeset
for help on using the changeset viewer.