Changeset 15060 for issm/trunk-jpl/src
- Timestamp:
- 05/21/13 15:11:26 (12 years ago)
- Location:
- issm/trunk-jpl/src/c/classes/Elements
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/Elements/Element.h
r15015 r15060 41 41 virtual void CreatePVector(Vector<IssmDouble>* pf)=0; 42 42 virtual void CreateJacobianMatrix(Matrix<IssmDouble>* Jff)=0; 43 virtual void BasisIntegral(Vector<IssmDouble>* basisg)=0; 43 44 virtual void GetSolutionFromInputs(Vector<IssmDouble>* solution)=0; 44 45 virtual int GetNodeIndex(Node* node)=0; … … 135 136 #ifdef _HAVE_HYDROLOGY_ 136 137 virtual void GetHydrologyDCInefficientHmax(IssmDouble* ph_max, Node* innode)=0; 137 virtual void BasisIntegral(Vector<IssmDouble>* basisg)=0;138 138 virtual void GetHydrologyTransfer(Vector<IssmDouble>* transfer)=0; 139 139 #endif -
issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
r15042 r15060 802 802 /*return output*/ 803 803 return penta; 804 } 805 /*}}}*/ 806 /*FUNCTION Penta::BasisIntegral {{{*/ 807 void Penta::BasisIntegral(Vector<IssmDouble>* basisg){ 808 809 /*Constants*/ 810 const int numdof=NDOF1*NUMVERTICES; 811 812 /*Intermediaries */ 813 IssmDouble Jdet; 814 IssmDouble xyz_list[NUMVERTICES][3]; 815 IssmDouble basis[numdof]; 816 IssmDouble basisint[numdof]={0.}; 817 int *doflist=NULL; 818 GaussPenta* gauss=NULL; 819 820 GetDofList(&doflist,NoneApproximationEnum,GsetEnum); 821 GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES); 822 823 /* Start looping on the number of gaussian points: */ 824 gauss=new GaussPenta(2,2); 825 for(int ig=gauss->begin();ig<gauss->end();ig++){ 826 827 gauss->GaussPoint(ig); 828 829 GetJacobianDeterminant(&Jdet, &xyz_list[0][0],gauss); 830 GetNodalFunctionsP1(&basis[0], gauss); 831 832 for(int i=0;i<numdof;i++) basisint[i]+=Jdet*gauss->weight*basis[i]; 833 } 834 835 basisg->SetValues(numdof,doflist,&basisint[0],ADD_VAL); 836 837 /*Clean up and return*/ 838 delete gauss; 839 xDelete<int>(doflist); 804 840 } 805 841 /*}}}*/ … … 2073 2109 void Penta::InputUpdateFromVector(IssmDouble* vector, int name, int type){ 2074 2110 2111 const int numdof = NDOF1 *NUMVERTICES; 2112 int *doflist = NULL; 2113 IssmDouble values[numdof]; 2114 2075 2115 /*Check that name is an element input*/ 2076 2116 if (!IsInput(name)) return; 2077 2117 2078 /*Penta update B in InputUpdateFromSolutionThermal, so don't look for B update here.*/2079 2080 2118 switch(type){ 2081 2082 case VertexEnum: 2083 { 2084 2085 /*New PentaVertexInpu*/ 2086 IssmDouble values[6]; 2087 2088 /*Get values on the 6 vertices*/ 2089 for (int i=0;i<6;i++){ 2090 values[i]=vector[this->vertices[i]->Pid()]; 2091 } 2092 2093 /*update input*/ 2094 if (name==MaterialsRheologyZEnum || name==MaterialsRheologyZbarEnum){ 2095 material->inputs->AddInput(new PentaP1Input(name,values)); 2096 } 2097 else{ 2098 this->inputs->AddInput(new PentaP1Input(name,values)); 2099 } 2100 return; 2101 break; 2119 case VertexPIdEnum: 2120 for (int i=0;i<NUMVERTICES;i++){ 2121 values[i]=vector[this->vertices[i]->Pid()]; 2102 2122 } 2123 /*update input*/ 2124 if (name==MaterialsRheologyZEnum || name==MaterialsRheologyZbarEnum){ 2125 material->inputs->AddInput(new PentaP1Input(name,values)); 2126 } 2127 else{ 2128 this->inputs->AddInput(new PentaP1Input(name,values)); 2129 } 2130 return; 2131 2132 case VertexSIdEnum: 2133 for (int i=0;i<NUMVERTICES;i++){ 2134 values[i]=vector[this->vertices[i]->Sid()]; 2135 } 2136 /*update input*/ 2137 if (name==MaterialsRheologyZEnum || name==MaterialsRheologyZbarEnum){ 2138 material->inputs->AddInput(new PentaP1Input(name,values)); 2139 } 2140 else{ 2141 this->inputs->AddInput(new PentaP1Input(name,values)); 2142 } 2143 return; 2144 2145 case NodesEnum: 2146 /*Get dof list: */ 2147 GetDofList(&doflist,NoneApproximationEnum,GsetEnum); 2148 2149 /*Use the dof list to index into the vector: */ 2150 for(int i=0;i<numdof;i++){ 2151 values[i]=vector[doflist[i]]; 2152 if(xIsNan<IssmDouble>(values[i])) _error_("NaN found in solution vector"); 2153 } 2154 /*Add input to the element: */ 2155 this->inputs->AddInput(new PentaP1Input(name,values)); 2156 2157 /*Free ressources:*/ 2158 xDelete<int>(doflist); 2159 return; 2103 2160 2104 2161 default: 2105 2106 2162 _error_("type " << type << " (" << EnumToStringx(type) << ") not implemented yet"); 2107 2163 } … … 2148 2204 name==InversionVyObsEnum || 2149 2205 name==InversionVzObsEnum || 2206 name==BasisIntegralEnum || 2150 2207 name==TemperatureEnum || 2151 2208 name==EnthalpyEnum || … … 4514 4571 const int numdof=NDOF1*NUMVERTICES; 4515 4572 4516 bool converged;4517 int i,rheology_law;4518 IssmDouble xyz_list[NUMVERTICES][3];4519 IssmDouble values[numdof];4520 IssmDouble B[numdof];4521 IssmDouble B_average,s_average;4522 int * doflist=NULL;4523 //IssmDoublepressure[numdof];4573 bool converged; 4574 int i,rheology_law; 4575 IssmDouble xyz_list[NUMVERTICES][3]; 4576 IssmDouble values[numdof]; 4577 IssmDouble B[numdof]; 4578 IssmDouble B_average,s_average; 4579 int *doflist = NULL; 4580 IssmDouble pressure[numdof]; 4524 4581 4525 4582 /*Get dof list: */ … … 9318 9375 } 9319 9376 /*}}}*/ 9320 /*FUNCTION Penta::BasisIntegral {{{*/9321 void Penta::BasisIntegral(Vector<IssmDouble>* basisg){9322 _error_("Hydrological stuff not suported in Penta");9323 }9324 /*}}}*/9325 9326 /*}}}*/9327 9377 /*FUNCTION Penta::GetHydrologyTransfer{{{*/ 9328 9378 void Penta::GetHydrologyTransfer(Vector<IssmDouble>* transfer){ … … 9330 9380 } 9331 9381 /*}}}*/ 9332 9333 9382 #endif -
issm/trunk-jpl/src/c/classes/Elements/Penta.h
r15049 r15060 265 265 void InputUpdateFromSolutionDiagnosticVert( IssmDouble* solutiong); 266 266 void InputUpdateFromSolutionDiagnosticStokes( IssmDouble* solutiong); 267 void BasisIntegral(Vector<IssmDouble>* gbasis); 267 268 void GetSolutionFromInputsDiagnosticHoriz(Vector<IssmDouble>* solutiong); 268 269 void GetSolutionFromInputsDiagnosticHutter(Vector<IssmDouble>* solutiong); … … 307 308 void CreateHydrologyWaterVelocityInput(void); 308 309 void GetHydrologyDCInefficientHmax(IssmDouble* ph_max, Node* innode); 309 void BasisIntegral(Vector<IssmDouble>* gbasis);310 310 void GetHydrologyTransfer(Vector<IssmDouble>* transfer); 311 311 #endif -
issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
r15054 r15060 1099 1099 _assert_(x2*y3 - y2*x3 + x1*y2 - y1*x2 + x3*y1 - y3*x1>0); 1100 1100 return (x2*y3 - y2*x3 + x1*y2 - y1*x2 + x3*y1 - y3*x1)/2; 1101 } 1102 /*}}}*/ 1103 /*FUNCTION Tria::BasisIntegral {{{*/ 1104 void Tria::BasisIntegral(Vector<IssmDouble>* basisg){ 1105 1106 /*Constants*/ 1107 const int numdof=NDOF1*NUMVERTICES; 1108 1109 /*Intermediaries */ 1110 IssmDouble Jdet; 1111 IssmDouble xyz_list[NUMVERTICES][3]; 1112 IssmDouble basis[numdof]; 1113 IssmDouble basisint[numdof]={0.}; 1114 int *doflist=NULL; 1115 GaussTria* gauss=NULL; 1116 1117 GetDofList(&doflist,NoneApproximationEnum,GsetEnum); 1118 GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES); 1119 1120 /* Start looping on the number of gaussian points: */ 1121 gauss=new GaussTria(2); 1122 for(int ig=gauss->begin();ig<gauss->end();ig++){ 1123 1124 gauss->GaussPoint(ig); 1125 1126 GetJacobianDeterminant(&Jdet, &xyz_list[0][0],gauss); 1127 GetNodalFunctions(&basis[0], gauss); 1128 1129 for(int i=0;i<numdof;i++) basisint[i]+=Jdet*gauss->weight*basis[i]; 1130 } 1131 1132 basisg->SetValues(numdof,doflist,&basisint[0],ADD_VAL); 1133 1134 /*Clean up and return*/ 1135 delete gauss; 1136 xDelete<int>(doflist); 1101 1137 } 1102 1138 /*}}}*/ … … 1938 1974 switch(type){ 1939 1975 case VertexPIdEnum: 1940 /*Get values on the 3 vertices*/ 1941 for (int i=0;i<3;i++){ 1976 for (int i=0;i<NUMVERTICES;i++){ 1942 1977 values[i]=vector[this->vertices[i]->Pid()]; 1943 1978 } … … 1952 1987 1953 1988 case VertexSIdEnum: 1954 /*Get values on the 3 vertices*/ 1955 for (int i=0;i<3;i++){ 1989 for (int i=0;i<NUMVERTICES;i++){ 1956 1990 values[i]=vector[this->vertices[i]->Sid()]; 1957 1991 } … … 6487 6521 } 6488 6522 /*}}}*/ 6489 /*FUNCTION Tria::BasisIntegral {{{*/6490 void Tria::BasisIntegral(Vector<IssmDouble>* basisg){6491 6492 /*Constants*/6493 const int numdof=NDOF1*NUMVERTICES;6494 6495 /*Intermediaries */6496 IssmDouble Jdet;6497 IssmDouble xyz_list[NUMVERTICES][3];6498 IssmDouble basis[numdof];6499 IssmDouble basisint[numdof]={0.};6500 int *doflist=NULL;6501 GaussTria* gauss=NULL;6502 6503 GetDofList(&doflist,NoneApproximationEnum,GsetEnum);6504 GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);6505 6506 /* Start looping on the number of gaussian points: */6507 gauss=new GaussTria(2);6508 for(int ig=gauss->begin();ig<gauss->end();ig++){6509 6510 gauss->GaussPoint(ig);6511 6512 GetJacobianDeterminant(&Jdet, &xyz_list[0][0],gauss);6513 GetNodalFunctions(&basis[0], gauss);6514 6515 for(int i=0;i<numdof;i++) basisint[i]+=Jdet*gauss->weight*basis[i];6516 }6517 6518 basisg->SetValues(numdof,doflist,&basisint[0],ADD_VAL);6519 6520 /*Clean up and return*/6521 delete gauss;6522 xDelete<int>(doflist);6523 }6524 /*}}}*/6525 6523 /*FUNCTION Tria::GetHydrologyTransfer{{{*/ 6526 6524 void Tria::GetHydrologyTransfer(Vector<IssmDouble>* transfer){ … … 6582 6580 6583 6581 /*}}}*/ 6584 6585 6582 #endif 6586 6583 -
issm/trunk-jpl/src/c/classes/Elements/Tria.h
r15054 r15060 198 198 ElementVector* CreatePVectorSlope(void); 199 199 IssmDouble GetArea(void); 200 void BasisIntegral(Vector<IssmDouble>* gbasis); 200 201 int GetElementType(void); 201 202 void GetDofList(int** pdoflist,int approximation_enum,int setenum); … … 255 256 void InputUpdateFromSolutionHydrologyDCEfficient(IssmDouble* solution); 256 257 void GetHydrologyDCInefficientHmax(IssmDouble* ph_max, Node* innode); 257 void BasisIntegral(Vector<IssmDouble>* gbasis);258 258 void GetHydrologyTransfer(Vector<IssmDouble>* transfer); 259 259 #endif
Note:
See TracChangeset
for help on using the changeset viewer.