Changeset 15298
- Timestamp:
- 06/21/13 08:41:36 (12 years ago)
- Location:
- issm/trunk-jpl/src
- Files:
-
- 3 added
- 2 deleted
- 20 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified issm/trunk-jpl/src/c/Makefile.am ¶
r15174 r15298 87 87 ./classes/Inputs/Input.h\ 88 88 ./classes/Inputs/InputLocal.h\ 89 ./classes/Inputs/Tria P1Input.h\90 ./classes/Inputs/Tria P1Input.cpp\89 ./classes/Inputs/TriaInput.h\ 90 ./classes/Inputs/TriaInput.cpp\ 91 91 ./classes/Inputs/BoolInput.h\ 92 92 ./classes/Inputs/BoolInput.cpp\ -
TabularUnified issm/trunk-jpl/src/c/classes/Elements/PentaRef.cpp ¶
r15012 r15298 1257 1257 } 1258 1258 /*}}}*/ 1259 /*FUNCTION PentaRef::NumberofNodes{{{*/ 1260 int PentaRef::NumberofNodes(void){ 1261 1262 switch(this->element_type){ 1263 case P1Enum: return NUMNODESP1; 1264 default: _error_("Element type "<<EnumToStringx(this->element_type)<<" not supported yet"); 1265 } 1266 1267 return -1; 1268 } 1269 /*}}}*/ -
TabularUnified issm/trunk-jpl/src/c/classes/Elements/PentaRef.h ¶
r14951 r15298 59 59 void GetInputDerivativeValue(IssmDouble* pvalues, IssmDouble* plist,IssmDouble* xyz_list, GaussTria* gauss){_error_("only PentaGauss are supported");}; 60 60 61 int NumberofNodes(void); 61 62 }; 62 63 #endif -
TabularUnified issm/trunk-jpl/src/c/classes/Elements/Tria.cpp ¶
r15286 r15298 887 887 888 888 /*Add Stress tensor components into inputs*/ 889 this->inputs->AddInput(new Tria P1Input(StressTensorxxEnum,&sigma_xx[0]));890 this->inputs->AddInput(new Tria P1Input(StressTensorxyEnum,&sigma_xy[0]));891 this->inputs->AddInput(new Tria P1Input(StressTensorxzEnum,&sigma_xz[0]));892 this->inputs->AddInput(new Tria P1Input(StressTensoryyEnum,&sigma_yy[0]));893 this->inputs->AddInput(new Tria P1Input(StressTensoryzEnum,&sigma_yz[0]));894 this->inputs->AddInput(new Tria P1Input(StressTensorzzEnum,&sigma_zz[0]));889 this->inputs->AddInput(new TriaInput(StressTensorxxEnum,&sigma_xx[0])); 890 this->inputs->AddInput(new TriaInput(StressTensorxyEnum,&sigma_xy[0])); 891 this->inputs->AddInput(new TriaInput(StressTensorxzEnum,&sigma_xz[0])); 892 this->inputs->AddInput(new TriaInput(StressTensoryyEnum,&sigma_yy[0])); 893 this->inputs->AddInput(new TriaInput(StressTensoryzEnum,&sigma_yz[0])); 894 this->inputs->AddInput(new TriaInput(StressTensorzzEnum,&sigma_zz[0])); 895 895 896 896 /*Clean up and return*/ … … 1028 1028 for (int imonth=0;imonth<12;imonth++) { 1029 1029 for(i=0;i<NUMVERTICES;i++) tmp[i]=monthlytemperatures[i][imonth]; 1030 Tria P1Input* newmonthinput1 = new TriaP1Input(SurfaceforcingsMonthlytemperaturesEnum,&tmp[0]);1030 TriaInput* newmonthinput1 = new TriaInput(SurfaceforcingsMonthlytemperaturesEnum,&tmp[0]); 1031 1031 NewTemperatureInput->AddTimeInput(newmonthinput1,time+imonth/12.*yts); 1032 1032 1033 1033 for(i=0;i<NUMVERTICES;i++) tmp[i]=monthlyprec[i][imonth]; 1034 Tria P1Input* newmonthinput2 = new TriaP1Input(SurfaceforcingsPrecipitationEnum,&tmp[0]);1034 TriaInput* newmonthinput2 = new TriaInput(SurfaceforcingsPrecipitationEnum,&tmp[0]); 1035 1035 NewPrecipitationInput->AddTimeInput(newmonthinput2,time+imonth/12.*yts); 1036 1036 } … … 1394 1394 for (int iv=0;iv<NUMVERTICES;iv++) pvalue[iv]=defaultvalue; 1395 1395 } 1396 } 1397 /*}}}*/ 1398 /*FUNCTION Tria::GetInputListOnNodes(IssmDouble* pvalue,int enumtype,IssmDouble defaultvalue) {{{*/ 1399 void Tria::GetInputListOnNodes(IssmDouble* pvalue,int enumtype,IssmDouble defaultvalue){ 1400 1401 _assert_(pvalue); 1402 1403 Input *input = inputs->GetInput(enumtype); 1404 int numnodes = this->NumberofNodes(); 1405 1406 /* Start looping on the number of vertices: */ 1407 if (input){ 1408 GaussTria* gauss=new GaussTria(); 1409 for (int iv=0;iv<this->NumberofNodes();iv++){ 1410 gauss->GaussNode(numnodes,iv); 1411 input->GetInputValue(&pvalue[iv],gauss); 1412 } 1413 delete gauss; 1414 } 1415 else{ 1416 for (int iv=0;iv<numnodes;iv++) pvalue[iv]=defaultvalue; 1417 } 1418 } 1419 /*}}}*/ 1420 /*FUNCTION Tria::GetInputListOnNodes(IssmDouble* pvalue,int enumtype) {{{*/ 1421 void Tria::GetInputListOnNodes(IssmDouble* pvalue,int enumtype){ 1422 1423 _assert_(pvalue); 1424 1425 /*Recover input*/ 1426 Input* input=inputs->GetInput(enumtype); 1427 if (!input) _error_("Input " << EnumToStringx(enumtype) << " not found in element"); 1428 int numnodes = this->NumberofNodes(); 1429 1430 /* Start looping on the number of vertices: */ 1431 GaussTria* gauss=new GaussTria(); 1432 for (int iv=0;iv<this->NumberofNodes();iv++){ 1433 gauss->GaussNode(numnodes,iv); 1434 input->GetInputValue(&pvalue[iv],gauss); 1435 } 1436 delete gauss; 1396 1437 } 1397 1438 /*}}}*/ … … 1687 1728 for(j=0;j<3;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[(tria_vertex_ids[j]-1)*num_control_type+i]/yts; 1688 1729 for(j=0;j<3;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[(tria_vertex_ids[j]-1)*num_control_type+i]/yts; 1689 this->inputs->AddInput(new ControlInput(BalancethicknessThickeningRateEnum,Tria P1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1));1730 this->inputs->AddInput(new ControlInput(BalancethicknessThickeningRateEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1)); 1690 1731 } 1691 1732 break; … … 1695 1736 for(j=0;j<3;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[(tria_vertex_ids[j]-1)*num_control_type+i]/yts; 1696 1737 for(j=0;j<3;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[(tria_vertex_ids[j]-1)*num_control_type+i]/yts; 1697 this->inputs->AddInput(new ControlInput(VxEnum,Tria P1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1));1738 this->inputs->AddInput(new ControlInput(VxEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1)); 1698 1739 } 1699 1740 break; … … 1703 1744 for(j=0;j<3;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[(tria_vertex_ids[j]-1)*num_control_type+i]/yts; 1704 1745 for(j=0;j<3;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[(tria_vertex_ids[j]-1)*num_control_type+i]/yts; 1705 this->inputs->AddInput(new ControlInput(VyEnum,Tria P1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1));1746 this->inputs->AddInput(new ControlInput(VyEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1)); 1706 1747 } 1707 1748 break; … … 1711 1752 for(j=0;j<3;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[(tria_vertex_ids[j]-1)*num_control_type+i]; 1712 1753 for(j=0;j<3;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[(tria_vertex_ids[j]-1)*num_control_type+i]; 1713 this->inputs->AddInput(new ControlInput(ThicknessEnum,Tria P1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1));1754 this->inputs->AddInput(new ControlInput(ThicknessEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1)); 1714 1755 } 1715 1756 break; … … 1719 1760 for(j=0;j<3;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[(tria_vertex_ids[j]-1)*num_control_type+i]; 1720 1761 for(j=0;j<3;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[(tria_vertex_ids[j]-1)*num_control_type+i]; 1721 this->inputs->AddInput(new ControlInput(FrictionCoefficientEnum,Tria P1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1));1762 this->inputs->AddInput(new ControlInput(FrictionCoefficientEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1)); 1722 1763 } 1723 1764 break; … … 1739 1780 for(i=0;i<num_cm_responses;i++){ 1740 1781 for(j=0;j<3;j++)nodeinputs[j]=iomodel->Data(InversionCostFunctionsCoefficientsEnum)[(tria_vertex_ids[j]-1)*num_cm_responses+i]; 1741 datasetinput->inputs->AddObject(new Tria P1Input(InversionCostFunctionsCoefficientsEnum,nodeinputs));1782 datasetinput->inputs->AddObject(new TriaInput(InversionCostFunctionsCoefficientsEnum,nodeinputs)); 1742 1783 } 1743 1784 … … 1825 1866 1826 1867 /*Add input to the element: */ 1827 this->inputs->AddInput(new Tria P1Input(enum_type,values));1868 this->inputs->AddInput(new TriaInput(enum_type,values)); 1828 1869 1829 1870 /*Free ressources:*/ … … 1890 1931 1891 1932 /*Add input to the element: */ 1892 this->inputs->AddInput(new Tria P1Input(ThicknessEnum,newthickness));1893 this->inputs->AddInput(new Tria P1Input(SurfaceEnum,newsurface));1894 this->inputs->AddInput(new Tria P1Input(BedEnum,newbed));1933 this->inputs->AddInput(new TriaInput(ThicknessEnum,newthickness)); 1934 this->inputs->AddInput(new TriaInput(SurfaceEnum,newsurface)); 1935 this->inputs->AddInput(new TriaInput(BedEnum,newbed)); 1895 1936 1896 1937 /*Free ressources:*/ … … 1915 1956 /*update input*/ 1916 1957 if (name==MaterialsRheologyBbarEnum || name==MaterialsRheologyBEnum || name==MaterialsRheologyZEnum || name==MaterialsRheologyZbarEnum){ 1917 material->inputs->AddInput(new Tria P1Input(name,values));1958 material->inputs->AddInput(new TriaInput(name,values)); 1918 1959 } 1919 1960 else{ 1920 this->inputs->AddInput(new Tria P1Input(name,values));1961 this->inputs->AddInput(new TriaInput(name,values)); 1921 1962 } 1922 1963 return; … … 1928 1969 /*update input*/ 1929 1970 if (name==MaterialsRheologyBbarEnum || name==MaterialsRheologyBEnum || name==MaterialsRheologyZEnum || name==MaterialsRheologyZbarEnum){ 1930 material->inputs->AddInput(new Tria P1Input(name,values));1971 material->inputs->AddInput(new TriaInput(name,values)); 1931 1972 } 1932 1973 else{ 1933 this->inputs->AddInput(new Tria P1Input(name,values));1974 this->inputs->AddInput(new TriaInput(name,values)); 1934 1975 } 1935 1976 return; … … 1945 1986 } 1946 1987 /*Add input to the element: */ 1947 this->inputs->AddInput(new Tria P1Input(name,values));1988 this->inputs->AddInput(new TriaInput(name,values)); 1948 1989 1949 1990 /*Free ressources:*/ … … 1957 1998 } 1958 1999 /*Add input to the element: */ 1959 this->inputs->AddInput(new Tria P1Input(name,values));2000 this->inputs->AddInput(new TriaInput(name,values)); 1960 2001 1961 2002 /*Free ressources:*/ … … 2033 2074 2034 2075 /*create static input: */ 2035 this->inputs->AddInput(new Tria P1Input(vector_enum,nodeinputs));2076 this->inputs->AddInput(new TriaInput(vector_enum,nodeinputs)); 2036 2077 } 2037 2078 else if(M==numberofvertices+1){ … … 2049 2090 2050 2091 if(t==0) transientinput=new TransientInput(vector_enum); 2051 transientinput->AddTimeInput(new Tria P1Input(vector_enum,nodeinputs),time);2092 transientinput->AddTimeInput(new TriaInput(vector_enum,nodeinputs),time); 2052 2093 } 2053 2094 this->inputs->AddInput(transientinput); … … 2316 2357 if(!this->IsFloating() && floatingelement==true){ 2317 2358 for(i=0;i<NUMVERTICES;i++)melting[i]=gl_melting_rate/yts; 2318 this->inputs->AddInput(new Tria P1Input(BasalforcingsMeltingRateEnum,&melting[0]));2359 this->inputs->AddInput(new TriaInput(BasalforcingsMeltingRateEnum,&melting[0])); 2319 2360 } 2320 2361 2321 2362 /*Update inputs*/ 2322 2363 this->inputs->AddInput(new BoolInput(MaskElementonfloatingiceEnum,floatingelement)); 2323 this->inputs->AddInput(new Tria P1Input(SurfaceEnum,&s[0]));2324 this->inputs->AddInput(new Tria P1Input(BedEnum,&b[0]));2364 this->inputs->AddInput(new TriaInput(SurfaceEnum,&s[0])); 2365 this->inputs->AddInput(new TriaInput(BedEnum,&b[0])); 2325 2366 2326 2367 /*Recalculate phi*/ 2327 2368 if(migration_style==SubelementMigrationEnum || migration_style==SubelementMigration2Enum){ 2328 2369 for(i=0;i<NUMVERTICES;i++) phi[i]=h[i]+ba[i]/density; 2329 this->inputs->AddInput(new Tria P1Input(GLlevelsetEnum,&phi[0]));2370 this->inputs->AddInput(new TriaInput(GLlevelsetEnum,&phi[0])); 2330 2371 } 2331 2372 } … … 2486 2527 2487 2528 /*Update inputs*/ 2488 this->inputs->AddInput(new Tria P1Input(SurfaceforcingsMassBalanceEnum,&agd[0]));2529 this->inputs->AddInput(new TriaInput(SurfaceforcingsMassBalanceEnum,&agd[0])); 2489 2530 // this->inputs->AddInput(new TriaVertexInput(ThermalSpcTemperatureEnum,&Tsurf[0])); 2490 2531 … … 2576 2617 } //end of the loop over the vertices 2577 2618 /*Update inputs*/ 2578 this->inputs->AddInput(new Tria P1Input(SurfaceforcingsMassBalanceEnum,&smb[0]));2619 this->inputs->AddInput(new TriaInput(SurfaceforcingsMassBalanceEnum,&smb[0])); 2579 2620 } 2580 2621 /*}}}*/ … … 2760 2801 if(!iomodel->Data(VxEnum)){ 2761 2802 for(i=0;i<3;i++)nodeinputs[i]=0; 2762 this->inputs->AddInput(new Tria P1Input(VxEnum,nodeinputs));2763 if(dakota_analysis) this->inputs->AddInput(new Tria P1Input(QmuVxEnum,nodeinputs));2803 this->inputs->AddInput(new TriaInput(VxEnum,nodeinputs)); 2804 if(dakota_analysis) this->inputs->AddInput(new TriaInput(QmuVxEnum,nodeinputs)); 2764 2805 } 2765 2806 if(!iomodel->Data(VyEnum)){ 2766 2807 for(i=0;i<3;i++)nodeinputs[i]=0; 2767 this->inputs->AddInput(new Tria P1Input(VyEnum,nodeinputs));2768 if(dakota_analysis) this->inputs->AddInput(new Tria P1Input(QmuVyEnum,nodeinputs));2808 this->inputs->AddInput(new TriaInput(VyEnum,nodeinputs)); 2809 if(dakota_analysis) this->inputs->AddInput(new TriaInput(QmuVyEnum,nodeinputs)); 2769 2810 } 2770 2811 if(!iomodel->Data(VzEnum)){ 2771 2812 for(i=0;i<3;i++)nodeinputs[i]=0; 2772 this->inputs->AddInput(new Tria P1Input(VzEnum,nodeinputs));2773 if(dakota_analysis) this->inputs->AddInput(new Tria P1Input(QmuVzEnum,nodeinputs));2813 this->inputs->AddInput(new TriaInput(VzEnum,nodeinputs)); 2814 if(dakota_analysis) this->inputs->AddInput(new TriaInput(QmuVzEnum,nodeinputs)); 2774 2815 } 2775 2816 if(!iomodel->Data(PressureEnum)){ 2776 2817 for(i=0;i<3;i++)nodeinputs[i]=0; 2777 2818 if(dakota_analysis){ 2778 this->inputs->AddInput(new Tria P1Input(PressureEnum,nodeinputs));2779 this->inputs->AddInput(new Tria P1Input(QmuPressureEnum,nodeinputs));2819 this->inputs->AddInput(new TriaInput(PressureEnum,nodeinputs)); 2820 this->inputs->AddInput(new TriaInput(QmuPressureEnum,nodeinputs)); 2780 2821 } 2781 2822 } … … 3236 3277 ElementMatrix* Tria::CreateKMatrixDiagnosticMacAyealViscous(void){ 3237 3278 3238 /*Constants*/3239 const int numdof=NDOF2*NUMVERTICES;3240 3241 3279 /*Intermediaries*/ 3242 3280 int i,j; … … 3245 3283 IssmDouble viscosity_overshoot,thickness,Jdet; 3246 3284 IssmDouble epsilon[3],oldepsilon[3]; /* epsilon=[exx,eyy,exy]; */ 3247 IssmDouble B[3][numdof];3248 IssmDouble Bprime[3][numdof];3249 IssmDouble D[3][3] = {0.0};3250 3285 IssmDouble D_scalar; 3251 GaussTria *gauss = NULL; 3252 3253 /*Initialize Element matrix*/ 3254 ElementMatrix* Ke=new ElementMatrix(nodes,NUMVERTICES,this->parameters,MacAyealApproximationEnum); 3286 3287 /*Fetch number of nodes and dof for this finite element*/ 3288 int numnodes = this->NumberofNodes(); 3289 int numdof = numnodes*NDOF2; 3290 3291 /*Initialize Element matrix, vectors and Gaussian points*/ 3292 ElementMatrix* Ke = new ElementMatrix(nodes,numnodes,this->parameters,MacAyealApproximationEnum); 3293 IssmDouble* B = xNew<IssmDouble>(3*numdof); 3294 IssmDouble* Bprime = xNew<IssmDouble>(3*numdof); 3295 IssmDouble* D = xNewZeroInit<IssmDouble>(3*3); 3255 3296 3256 3297 /*Retrieve all inputs and parameters*/ … … 3264 3305 3265 3306 /* Start looping on the number of gaussian points: */ 3266 gauss=new GaussTria(2);3307 GaussTria* gauss = new GaussTria(2); 3267 3308 for(int ig=gauss->begin();ig<gauss->end();ig++){ 3268 3309 … … 3270 3311 3271 3312 GetJacobianDeterminant(&Jdet, &xyz_list[0][0],gauss); 3272 GetBMacAyeal(&B[0] [0], &xyz_list[0][0], gauss);3273 GetBprimeMacAyeal(&Bprime[0] [0], &xyz_list[0][0], gauss);3313 GetBMacAyeal(&B[0], &xyz_list[0][0], gauss); 3314 GetBprimeMacAyeal(&Bprime[0], &xyz_list[0][0], gauss); 3274 3315 3275 3316 this->GetStrainRate2d(&epsilon[0],&xyz_list[0][0],gauss,vx_input,vy_input); … … 3280 3321 3281 3322 newviscosity=viscosity+viscosity_overshoot*(viscosity-oldviscosity); 3282 D_scalar=2 *newviscosity*thickness*gauss->weight*Jdet;3283 for (i=0;i<3;i++) D[i][i]=D_scalar;3284 3285 TripleMultiply( &B[0][0],3,numdof,1,3286 &D[0][0],3,3,0,3287 &Bprime[0][0],3,numdof,0,3323 D_scalar=2.*newviscosity*thickness*gauss->weight*Jdet; 3324 for(i=0;i<3;i++) D[i*3+i]=D_scalar; 3325 3326 TripleMultiply(B,3,numdof,1, 3327 D,3,3,0, 3328 Bprime,3,numdof,0, 3288 3329 &Ke->values[0],1); 3289 3330 } … … 3294 3335 /*Clean up and return*/ 3295 3336 delete gauss; 3337 xDelete<IssmDouble>(B); 3338 xDelete<IssmDouble>(D); 3339 xDelete<IssmDouble>(Bprime); 3296 3340 return Ke; 3297 3341 } … … 3299 3343 /*FUNCTION Tria::CreateKMatrixDiagnosticMacAyealFriction {{{*/ 3300 3344 ElementMatrix* Tria::CreateKMatrixDiagnosticMacAyealFriction(void){ 3301 3302 /*Constants*/3303 const int numdof=NDOF2*NUMVERTICES;3304 3345 3305 3346 /*Intermediaries*/ … … 3312 3353 IssmDouble fraction1,fraction2; 3313 3354 IssmDouble phi=1.0; 3314 IssmDouble L[2][numdof]; 3315 IssmDouble DL[2][2] = {{ 0,0 },{0,0}}; 3316 IssmDouble DL_scalar; 3317 IssmDouble slope[2] = {0.0,0.0}; 3355 IssmDouble D_scalar; 3318 3356 IssmDouble gllevelset; 3319 3357 IssmDouble xyz_list[NUMVERTICES][3]; … … 3321 3359 GaussTria *gauss = NULL; 3322 3360 3323 /* Initialize Element matrix and return if necessary*/3361 /*Return if element is inactive*/ 3324 3362 if(IsFloating()) return NULL; 3325 ElementMatrix* Ke=new ElementMatrix(nodes,NUMVERTICES,this->parameters,MacAyealApproximationEnum); 3363 3364 /*Fetch number of nodes and dof for this finite element*/ 3365 int numnodes = this->NumberofNodes(); 3366 int numdof = numnodes*NDOF2; 3367 3368 /*Initialize Element matrix and vectors*/ 3369 ElementMatrix* Ke = new ElementMatrix(nodes,numnodes,this->parameters,MacAyealApproximationEnum); 3370 IssmDouble* B = xNew<IssmDouble>(2*numdof); 3371 IssmDouble* D = xNewZeroInit<IssmDouble>(2*2); 3326 3372 3327 3373 /*Retrieve all inputs and parameters*/ … … 3361 3407 } 3362 3408 3363 GetL(& L[0][0], &xyz_list[0][0], gauss,NDOF2);3409 GetL(&B[0], &xyz_list[0][0], gauss,NDOF2); 3364 3410 GetJacobianDeterminant(&Jdet, &xyz_list[0][0],gauss); 3365 D L_scalar=alpha2*gauss->weight*Jdet;3366 for (i=0;i<2;i++) DL[i][i]=DL_scalar;3367 3368 TripleMultiply( &L[0][0],2,numdof,1,3369 &DL[0][0],2,2,0,3370 &L[0][0],2,numdof,0,3411 D_scalar=alpha2*gauss->weight*Jdet; 3412 for(i=0;i<2;i++) D[i*2+i]=D_scalar; 3413 3414 TripleMultiply(B,2,numdof,1, 3415 D,2,2,0, 3416 B,2,numdof,0, 3371 3417 &Ke->values[0],1); 3372 3418 } … … 3378 3424 delete gauss; 3379 3425 delete friction; 3426 xDelete<IssmDouble>(B); 3427 xDelete<IssmDouble>(D); 3380 3428 return Ke; 3381 3429 } … … 3404 3452 /*FUNCTION Tria::CreatePVectorDiagnosticMacAyeal {{{*/ 3405 3453 ElementVector* Tria::CreatePVectorDiagnosticMacAyeal(){ 3406 3407 /*Constants*/3408 const int numdof=NDOF2*NUMVERTICES;3409 3454 3410 3455 /*Intermediaries */ … … 3414 3459 IssmDouble xyz_list[NUMVERTICES][3]; 3415 3460 IssmDouble slope[2]; 3416 IssmDouble basis[3]; 3417 IssmDouble pe_g_gaussian[numdof]; 3418 GaussTria* gauss=NULL; 3419 3420 /*Initialize Element vector*/ 3461 3462 /*Fetch number of nodes and dof for this finite element*/ 3463 int numnodes = this->NumberofNodes(); 3464 int numdof = numnodes*NDOF2; 3465 3466 /*Initialize Element vector and vectors*/ 3421 3467 ElementVector* pe=new ElementVector(nodes,NUMVERTICES,this->parameters,MacAyealApproximationEnum); 3468 GaussTria* gauss = new GaussTria(2); 3469 IssmDouble* basis = xNew<IssmDouble>(numnodes); 3422 3470 3423 3471 /*Retrieve all inputs and parameters*/ … … 3428 3476 3429 3477 /* Start looping on the number of gaussian points: */ 3430 gauss=new GaussTria(2);3431 3478 for(int ig=gauss->begin();ig<gauss->end();ig++){ 3432 3479 … … 3440 3487 driving_stress_baseline=matpar->GetRhoIce()*matpar->GetG()*thickness; 3441 3488 3442 /*Build pe_g_gaussianvector: */3443 for (i=0;i< NUMVERTICES;i++){3489 /*Build load vector: */ 3490 for (i=0;i<numnodes;i++){ 3444 3491 for (j=0;j<NDOF2;j++){ 3445 3492 pe->values[i*NDOF2+j]+=-driving_stress_baseline*slope[j]*Jdet*gauss->weight*basis[i]; … … 3453 3500 /*Clean up and return*/ 3454 3501 delete gauss; 3502 xDelete<IssmDouble>(basis); 3455 3503 return pe; 3456 3504 } … … 3508 3556 /*FUNCTION Tria::CreateJacobianDiagnosticMacayeal{{{*/ 3509 3557 ElementMatrix* Tria::CreateJacobianDiagnosticMacayeal(void){ 3510 3511 /*Constants*/3512 const int numdof=NDOF2*NUMVERTICES;3513 3558 3514 3559 /*Intermediaries */ … … 3521 3566 IssmDouble epsilon[3];/* epsilon=[exx,eyy,exy];*/ 3522 3567 IssmDouble eps1[2],eps2[2]; 3523 IssmDouble phi[NUMVERTICES]; 3524 IssmDouble dphi[2][NUMVERTICES]; 3525 GaussTria *gauss=NULL; 3526 3527 /*Initialize Jacobian with regular MacAyeal (first part of the Gateau derivative)*/ 3528 ElementMatrix* Ke=CreateKMatrixDiagnosticMacAyeal(); 3568 GaussTria* gauss = NULL; 3569 3570 /*Fetch number of nodes and dof for this finite element*/ 3571 int numnodes = this->NumberofNodes(); 3572 int numdof = numnodes*NDOF2; 3573 3574 /*Initialize Element matrix, vectors and Gaussian points*/ 3575 ElementMatrix* Ke=CreateKMatrixDiagnosticMacAyeal(); //Initialize Jacobian with regular MacAyeal (first part of the Gateau derivative) 3576 IssmDouble* dphi = xNew<IssmDouble>(2*numnodes); 3529 3577 3530 3578 /*Retrieve all inputs and parameters*/ … … 3541 3589 3542 3590 GetJacobianDeterminant(&Jdet, &xyz_list[0][0],gauss); 3543 GetNodalFunctionsDerivatives( &dphi[0][0],&xyz_list[0][0],gauss);3591 GetNodalFunctionsDerivatives(dphi,&xyz_list[0][0],gauss); 3544 3592 3545 3593 thickness_input->GetInputValue(&thickness, gauss); … … 3549 3597 eps1[1]=epsilon[2]; eps2[1]=epsilon[0]+2*epsilon[1]; 3550 3598 3551 for(i=0;i< 3;i++){3552 for(j=0;j< 3;j++){3553 eps1dotdphii=eps1[0]*dphi[ 0][i]+eps1[1]*dphi[1][i];3554 eps1dotdphij=eps1[0]*dphi[ 0][j]+eps1[1]*dphi[1][j];3555 eps2dotdphii=eps2[0]*dphi[ 0][i]+eps2[1]*dphi[1][i];3556 eps2dotdphij=eps2[0]*dphi[ 0][j]+eps2[1]*dphi[1][j];3557 3558 Ke->values[ 6*(2*i+0)+2*j+0]+=gauss->weight*Jdet*2*mu_prime*thickness*eps1dotdphij*eps1dotdphii;3559 Ke->values[ 6*(2*i+0)+2*j+1]+=gauss->weight*Jdet*2*mu_prime*thickness*eps2dotdphij*eps1dotdphii;3560 Ke->values[ 6*(2*i+1)+2*j+0]+=gauss->weight*Jdet*2*mu_prime*thickness*eps1dotdphij*eps2dotdphii;3561 Ke->values[ 6*(2*i+1)+2*j+1]+=gauss->weight*Jdet*2*mu_prime*thickness*eps2dotdphij*eps2dotdphii;3599 for(i=0;i<numnodes;i++){ 3600 for(j=0;j<numnodes;j++){ 3601 eps1dotdphii=eps1[0]*dphi[2*i+0]+eps1[1]*dphi[2*i+1]; 3602 eps1dotdphij=eps1[0]*dphi[2*j+0]+eps1[1]*dphi[2*j+1]; 3603 eps2dotdphii=eps2[0]*dphi[2*i+0]+eps2[1]*dphi[2*i+1]; 3604 eps2dotdphij=eps2[0]*dphi[2*j+0]+eps2[1]*dphi[2*j+1]; 3605 3606 Ke->values[2*numnodes*(2*i+0)+2*j+0]+=gauss->weight*Jdet*2*mu_prime*thickness*eps1dotdphij*eps1dotdphii; 3607 Ke->values[2*numnodes*(2*i+0)+2*j+1]+=gauss->weight*Jdet*2*mu_prime*thickness*eps2dotdphij*eps1dotdphii; 3608 Ke->values[2*numnodes*(2*i+1)+2*j+0]+=gauss->weight*Jdet*2*mu_prime*thickness*eps1dotdphij*eps2dotdphii; 3609 Ke->values[2*numnodes*(2*i+1)+2*j+1]+=gauss->weight*Jdet*2*mu_prime*thickness*eps2dotdphij*eps2dotdphii; 3562 3610 } 3563 3611 } … … 3568 3616 3569 3617 /*Clean up and return*/ 3618 xDelete<IssmDouble>(dphi); 3570 3619 delete gauss; 3571 3620 return Ke; … … 3575 3624 void Tria::GetSolutionFromInputsDiagnosticHoriz(Vector<IssmDouble>* solution){ 3576 3625 3577 const int numdof=NDOF2*NUMVERTICES;3578 3579 int i;3580 int* doflist=NULL; 3581 IssmDouble vx,vy;3582 IssmDouble values[numdof];3583 GaussTria* gauss=NULL;3584 3585 /* Get dof list:*/3626 IssmDouble vx,vy; 3627 int* doflist = NULL; 3628 GaussTria* gauss = NULL; 3629 3630 /*Fetch number of nodes and dof for this finite element*/ 3631 int numnodes = this->NumberofNodes(); 3632 int numdof = numnodes*NDOF2; 3633 3634 /*Fetch dof list and allocate solution vector*/ 3586 3635 GetDofList(&doflist,NoneApproximationEnum,GsetEnum); 3636 IssmDouble* values = xNew<IssmDouble>(numdof); 3587 3637 3588 3638 /*Get inputs*/ … … 3593 3643 /*P1 element only for now*/ 3594 3644 gauss=new GaussTria(); 3595 for(i =0;i<NUMVERTICES;i++){3596 3597 gauss->Gauss Vertex(i);3645 for(int i=0;i<numnodes;i++){ 3646 3647 gauss->GaussNode(numnodes,i); 3598 3648 3599 3649 /*Recover vx and vy*/ … … 3609 3659 delete gauss; 3610 3660 xDelete<int>(doflist); 3661 xDelete<IssmDouble>(values); 3611 3662 } 3612 3663 /*}}}*/ … … 3653 3704 void Tria::InputUpdateFromSolutionDiagnosticHoriz(IssmDouble* solution){ 3654 3705 3655 const int numdof=NDOF2*NUMVERTICES; 3656 3657 int i; 3658 int* doflist=NULL; 3659 IssmDouble rho_ice,g; 3660 IssmDouble values[numdof]; 3661 IssmDouble vx[NUMVERTICES]; 3662 IssmDouble vy[NUMVERTICES]; 3663 IssmDouble vz[NUMVERTICES]; 3664 IssmDouble vel[NUMVERTICES]; 3665 IssmDouble pressure[NUMVERTICES]; 3666 IssmDouble thickness[NUMVERTICES]; 3667 3668 /*Get dof list: */ 3706 int i; 3707 IssmDouble rho_ice,g; 3708 int* doflist=NULL; 3709 3710 /*Fetch number of nodes and dof for this finite element*/ 3711 int numnodes = this->NumberofNodes(); 3712 int numdof = numnodes*NDOF2; 3713 3714 /*Fetch dof list and allocate solution vectors*/ 3669 3715 GetDofList(&doflist,NoneApproximationEnum,GsetEnum); 3716 IssmDouble* values = xNew<IssmDouble>(numdof); 3717 IssmDouble* vx = xNew<IssmDouble>(numdof); 3718 IssmDouble* vy = xNew<IssmDouble>(numdof); 3719 IssmDouble* vz = xNew<IssmDouble>(numdof); 3720 IssmDouble* vel = xNew<IssmDouble>(numdof); 3721 IssmDouble* pressure = xNew<IssmDouble>(numdof); 3722 IssmDouble* thickness = xNew<IssmDouble>(numdof); 3670 3723 3671 3724 /*Use the dof list to index into the solution vector: */ … … 3673 3726 3674 3727 /*Transform solution in Cartesian Space*/ 3675 TransformSolutionCoord(&values[0],nodes, NUMVERTICES,XYEnum);3728 TransformSolutionCoord(&values[0],nodes,numnodes,XYEnum); 3676 3729 3677 3730 /*Ok, we have vx and vy in values, fill in vx and vy arrays: */ 3678 for(i=0;i< NUMVERTICES;i++){3731 for(i=0;i<numnodes;i++){ 3679 3732 vx[i]=values[i*NDOF2+0]; 3680 3733 vy[i]=values[i*NDOF2+1]; … … 3686 3739 3687 3740 /*Get Vz and compute vel*/ 3688 GetInputListOn Vertices(&vz[0],VzEnum,0);3689 for(i=0;i< NUMVERTICES;i++) vel[i]=sqrt(vx[i]*vx[i] + vy[i]*vy[i] + vz[i]*vz[i]);3741 GetInputListOnNodes(&vz[0],VzEnum,0.); 3742 for(i=0;i<numnodes;i++) vel[i]=sqrt(vx[i]*vx[i] + vy[i]*vy[i] + vz[i]*vz[i]); 3690 3743 3691 3744 /*For pressure: we have not computed pressure in this analysis, for this element. We are in 2D, … … 3693 3746 rho_ice=matpar->GetRhoIce(); 3694 3747 g=matpar->GetG(); 3695 GetInputListOn Vertices(&thickness[0],ThicknessEnum);3696 for(i=0;i< NUMVERTICES;i++) pressure[i]=rho_ice*g*thickness[i];3748 GetInputListOnNodes(&thickness[0],ThicknessEnum); 3749 for(i=0;i<numnodes;i++) pressure[i]=rho_ice*g*thickness[i]; 3697 3750 3698 3751 /*Now, we have to move the previous Vx and Vy inputs to old … … 3703 3756 3704 3757 /*Add vx and vy as inputs to the tria element: */ 3705 this->inputs->AddInput(new Tria P1Input(VxEnum,vx));3706 this->inputs->AddInput(new Tria P1Input(VyEnum,vy));3707 this->inputs->AddInput(new Tria P1Input(VelEnum,vel));3708 this->inputs->AddInput(new Tria P1Input(PressureEnum,pressure));3758 this->inputs->AddInput(new TriaInput(VxEnum,vx)); 3759 this->inputs->AddInput(new TriaInput(VyEnum,vy)); 3760 this->inputs->AddInput(new TriaInput(VelEnum,vel)); 3761 this->inputs->AddInput(new TriaInput(PressureEnum,pressure)); 3709 3762 3710 3763 /*Free ressources:*/ 3711 3764 xDelete<int>(doflist); 3712 3765 xDelete<IssmDouble>(values); 3766 xDelete<IssmDouble>(vx); 3767 xDelete<IssmDouble>(vy); 3768 xDelete<IssmDouble>(vz); 3769 xDelete<IssmDouble>(vel); 3770 xDelete<IssmDouble>(pressure); 3771 xDelete<IssmDouble>(thickness); 3713 3772 } 3714 3773 /*}}}*/ … … 3716 3775 void Tria::InputUpdateFromSolutionDiagnosticHutter(IssmDouble* solution){ 3717 3776 3718 const int numdof=NDOF2*NUMVERTICES; 3719 3720 int i; 3721 int* doflist=NULL; 3722 IssmDouble rho_ice,g; 3723 IssmDouble values[numdof]; 3724 IssmDouble vx[NUMVERTICES]; 3725 IssmDouble vy[NUMVERTICES]; 3726 IssmDouble vz[NUMVERTICES]; 3727 IssmDouble vel[NUMVERTICES]; 3728 IssmDouble pressure[NUMVERTICES]; 3729 IssmDouble thickness[NUMVERTICES]; 3730 3731 /*Get dof list: */ 3777 int i; 3778 IssmDouble rho_ice,g; 3779 int* doflist=NULL; 3780 3781 /*Fetch number of nodes and dof for this finite element*/ 3782 int numnodes = this->NumberofNodes(); 3783 int numdof = numnodes*NDOF2; 3784 3785 /*Fetch dof list and allocate solution vectors*/ 3732 3786 GetDofList(&doflist,NoneApproximationEnum,GsetEnum); 3787 IssmDouble* values = xNew<IssmDouble>(numdof); 3788 IssmDouble* vx = xNew<IssmDouble>(numdof); 3789 IssmDouble* vy = xNew<IssmDouble>(numdof); 3790 IssmDouble* vz = xNew<IssmDouble>(numdof); 3791 IssmDouble* vel = xNew<IssmDouble>(numdof); 3792 IssmDouble* pressure = xNew<IssmDouble>(numdof); 3793 IssmDouble* thickness = xNew<IssmDouble>(numdof); 3733 3794 3734 3795 /*Use the dof list to index into the solution vector: */ 3735 3796 for(i=0;i<numdof;i++) values[i]=solution[doflist[i]]; 3736 3797 3798 /*Transform solution in Cartesian Space*/ 3799 TransformSolutionCoord(&values[0],nodes,numnodes,XYEnum); 3800 3737 3801 /*Ok, we have vx and vy in values, fill in vx and vy arrays: */ 3738 for(i=0;i< NUMVERTICES;i++){3802 for(i=0;i<numnodes;i++){ 3739 3803 vx[i]=values[i*NDOF2+0]; 3740 3804 vy[i]=values[i*NDOF2+1]; … … 3745 3809 } 3746 3810 3747 /* Now Compute vel*/3748 GetInputListOn Vertices(&vz[0],VzEnum,0.0); //default is 03749 for(i=0;i< NUMVERTICES;i++) vel[i]=sqrt(vx[i]*vx[i] + vy[i]*vy[i] + vz[i]*vz[i]);3811 /*Get Vz and compute vel*/ 3812 GetInputListOnNodes(&vz[0],VzEnum,0.); 3813 for(i=0;i<numnodes;i++) vel[i]=sqrt(vx[i]*vx[i] + vy[i]*vy[i] + vz[i]*vz[i]); 3750 3814 3751 3815 /*For pressure: we have not computed pressure in this analysis, for this element. We are in 2D, … … 3753 3817 rho_ice=matpar->GetRhoIce(); 3754 3818 g=matpar->GetG(); 3755 GetInputListOn Vertices(&thickness[0],ThicknessEnum);3756 for(i=0;i< NUMVERTICES;i++) pressure[i]=rho_ice*g*thickness[i];3819 GetInputListOnNodes(&thickness[0],ThicknessEnum); 3820 for(i=0;i<numnodes;i++) pressure[i]=rho_ice*g*thickness[i]; 3757 3821 3758 3822 /*Now, we have to move the previous Vx and Vy inputs to old … … 3763 3827 3764 3828 /*Add vx and vy as inputs to the tria element: */ 3765 this->inputs->AddInput(new Tria P1Input(VxEnum,vx));3766 this->inputs->AddInput(new Tria P1Input(VyEnum,vy));3767 this->inputs->AddInput(new Tria P1Input(VelEnum,vel));3768 this->inputs->AddInput(new Tria P1Input(PressureEnum,pressure));3829 this->inputs->AddInput(new TriaInput(VxEnum,vx)); 3830 this->inputs->AddInput(new TriaInput(VyEnum,vy)); 3831 this->inputs->AddInput(new TriaInput(VelEnum,vel)); 3832 this->inputs->AddInput(new TriaInput(PressureEnum,pressure)); 3769 3833 3770 3834 /*Free ressources:*/ 3771 3835 xDelete<int>(doflist); 3836 xDelete<IssmDouble>(values); 3837 xDelete<IssmDouble>(vx); 3838 xDelete<IssmDouble>(vy); 3839 xDelete<IssmDouble>(vz); 3840 xDelete<IssmDouble>(vel); 3841 xDelete<IssmDouble>(pressure); 3842 xDelete<IssmDouble>(thickness); 3772 3843 } 3773 3844 /*}}}*/ … … 3922 3993 GradientIndexing(&vertexpidlist[0],control_index); 3923 3994 for(int i=0;i<NUMVERTICES;i++) grad_list[i]=gradient[vertexpidlist[i]]; 3924 grad_input=new Tria P1Input(GradientEnum,grad_list);3995 grad_input=new TriaInput(GradientEnum,grad_list); 3925 3996 3926 3997 ((ControlInput*)input)->SetGradient(grad_input); … … 5689 5760 5690 5761 /*Add vx and vy as inputs to the tria element: */ 5691 this->inputs->AddInput(new Tria P1Input(AdjointxEnum,lambdax));5692 this->inputs->AddInput(new Tria P1Input(AdjointyEnum,lambday));5762 this->inputs->AddInput(new TriaInput(AdjointxEnum,lambdax)); 5763 this->inputs->AddInput(new TriaInput(AdjointyEnum,lambday)); 5693 5764 5694 5765 /*Free ressources:*/ … … 5719 5790 5720 5791 /*Add vx and vy as inputs to the tria element: */ 5721 this->inputs->AddInput(new Tria P1Input(AdjointEnum,lambda));5792 this->inputs->AddInput(new TriaInput(AdjointEnum,lambda)); 5722 5793 5723 5794 /*Free ressources:*/ … … 5771 5842 values[i]=vector[vertexpidlist[i]]; 5772 5843 } 5773 new_input = new Tria P1Input(control_enum,values);5844 new_input = new TriaInput(control_enum,values); 5774 5845 5775 5846 if(control_enum==MaterialsRheologyBbarEnum || control_enum==MaterialsRheologyZbarEnum){ … … 5865 5936 5866 5937 /*Add to inputs*/ 5867 this->inputs->AddInput(new Tria P1Input(HydrologyWaterVxEnum,vx));5868 this->inputs->AddInput(new Tria P1Input(HydrologyWaterVyEnum,vy));5938 this->inputs->AddInput(new TriaInput(HydrologyWaterVxEnum,vx)); 5939 this->inputs->AddInput(new TriaInput(HydrologyWaterVyEnum,vy)); 5869 5940 } 5870 5941 /*}}}*/ … … 6399 6470 6400 6471 /*Add input to the element: */ 6401 this->inputs->AddInput(new Tria P1Input(WatercolumnEnum,values));6472 this->inputs->AddInput(new TriaInput(WatercolumnEnum,values)); 6402 6473 6403 6474 /*Free ressources:*/ … … 6453 6524 6454 6525 /*Add input to the element: */ 6455 this->inputs->AddInput(new Tria P1Input(SedimentHeadEnum,values));6456 this->inputs->AddInput(new Tria P1Input(SedimentHeadResidualEnum,residual));6526 this->inputs->AddInput(new TriaInput(SedimentHeadEnum,values)); 6527 this->inputs->AddInput(new TriaInput(SedimentHeadResidualEnum,residual)); 6457 6528 6458 6529 /*Free ressources:*/ … … 6657 6728 case VertexEnum: 6658 6729 6659 /*New Tria P1Input*/6730 /*New TriaInput*/ 6660 6731 IssmDouble values[3]; 6661 6732 … … 6718 6789 6719 6790 /*Add new inputs: */ 6720 this->inputs->AddInput(new Tria P1Input(ThicknessEnum,thickness));6721 this->inputs->AddInput(new Tria P1Input(BedEnum,bed));6722 this->inputs->AddInput(new Tria P1Input(SurfaceEnum,surface));6791 this->inputs->AddInput(new TriaInput(ThicknessEnum,thickness)); 6792 this->inputs->AddInput(new TriaInput(BedEnum,bed)); 6793 this->inputs->AddInput(new TriaInput(SurfaceEnum,surface)); 6723 6794 6724 6795 break; 6725 6796 default: 6726 this->inputs->AddInput(new Tria P1Input(name,values));6797 this->inputs->AddInput(new TriaInput(name,values)); 6727 6798 } 6728 6799 break; … … 6776 6847 6777 6848 if(t==0) transientinput=new TransientInput(name); 6778 transientinput->AddTimeInput(new Tria P1Input(name,values),time);6849 transientinput->AddTimeInput(new TriaInput(name,values),time); 6779 6850 transientinput->Configure(parameters); 6780 6851 } -
TabularUnified issm/trunk-jpl/src/c/classes/Elements/Tria.h ¶
r15249 r15298 206 206 void GetInputListOnVertices(IssmDouble* pvalue,int enumtype,IssmDouble defaultvalue); 207 207 void GetInputListOnVertices(IssmDouble* pvalue,int enumtype,IssmDouble defaultvalue,int index); //TO BE REMOVED 208 void GetInputListOnNodes(IssmDouble* pvalue,int enumtype); 209 void GetInputListOnNodes(IssmDouble* pvalue,int enumtype,IssmDouble defaultvalue); 208 210 void GetInputValue(IssmDouble* pvalue,Node* node,int enumtype); 209 211 void GetStrainRate2d(IssmDouble* epsilon,IssmDouble* xyz_list, GaussTria* gauss, Input* vx_input, Input* vy_input); -
TabularUnified issm/trunk-jpl/src/c/classes/Elements/TriaRef.cpp ¶
r15282 r15298 26 26 /*}}}*/ 27 27 /*FUNCTION TriaRef::TriaRef(int* types,int nummodels){{{*/ 28 29 28 TriaRef::TriaRef(const int nummodels){ 30 29 … … 222 221 /*Build B': */ 223 222 for (int i=0;i<NUMNODESP1;i++){ 224 *(Bprime+NDOF2*NUMNODESP1*0+NDOF2*i) =2*dbasis[0][i];225 *(Bprime+NDOF2*NUMNODESP1*0+NDOF2*i+1) =dbasis[1][i];226 *(Bprime+NDOF2*NUMNODESP1*1+NDOF2*i) =dbasis[0][i];227 *(Bprime+NDOF2*NUMNODESP1*1+NDOF2*i+1) =2*dbasis[1][i];228 *(Bprime+NDOF2*NUMNODESP1*2+NDOF2*i) =dbasis[1][i];229 *(Bprime+NDOF2*NUMNODESP1*2+NDOF2*i+1) =dbasis[0][i];223 *(Bprime+NDOF2*NUMNODESP1*0+NDOF2*i) = 2.*dbasis[0][i]; 224 *(Bprime+NDOF2*NUMNODESP1*0+NDOF2*i+1) = dbasis[1][i]; 225 *(Bprime+NDOF2*NUMNODESP1*1+NDOF2*i) = dbasis[0][i]; 226 *(Bprime+NDOF2*NUMNODESP1*1+NDOF2*i+1) = 2.*dbasis[1][i]; 227 *(Bprime+NDOF2*NUMNODESP1*2+NDOF2*i) = dbasis[1][i]; 228 *(Bprime+NDOF2*NUMNODESP1*2+NDOF2*i+1) = dbasis[0][i]; 230 229 } 231 230 } … … 395 394 /*This routine returns the values of the nodal functions at the gaussian point.*/ 396 395 397 basis[0]=gauss->coord1; 398 basis[1]=gauss->coord2; 399 basis[2]=gauss->coord3; 400 401 } 402 /*}}}*/ 403 /*FUNCTION TriaRef::GetNodalFunctionsP2{{{*/ 404 void TriaRef::GetNodalFunctionsP2(IssmDouble** pbasis,GaussTria* gauss){ 405 /*This routine returns the values of the nodal functions at the gaussian point.*/ 406 407 /*Allocate*/ 408 IssmDouble* basis =xNew<IssmDouble>(NUMNODESP2); 409 410 basis[0]=gauss->coord1*(2.*gauss->coord1-1.); 411 basis[1]=gauss->coord2*(2.*gauss->coord2-1.); 412 basis[2]=gauss->coord3*(2.*gauss->coord3-1.); 413 basis[3]=4.*gauss->coord3*gauss->coord2; 414 basis[4]=4.*gauss->coord3*gauss->coord1; 415 basis[5]=4.*gauss->coord1*gauss->coord2; 416 417 /*Assign output pointer*/ 418 *pbasis = basis; 419 396 switch(this->element_type){ 397 case P1Enum: 398 case P1DGEnum: 399 basis[0]=gauss->coord1; 400 basis[1]=gauss->coord2; 401 basis[2]=gauss->coord3; 402 return; 403 case P2Enum: 404 basis[0]=gauss->coord1*(2.*gauss->coord1-1.); 405 basis[1]=gauss->coord2*(2.*gauss->coord2-1.); 406 basis[2]=gauss->coord3*(2.*gauss->coord3-1.); 407 basis[3]=4.*gauss->coord3*gauss->coord2; 408 basis[4]=4.*gauss->coord3*gauss->coord1; 409 basis[5]=4.*gauss->coord1*gauss->coord2; 410 return; 411 default: 412 _error_("Element type "<<EnumToStringx(this->element_type)<<" not supported yet"); 413 } 420 414 } 421 415 /*}}}*/ … … 424 418 /*This routine returns the values of the nodal functions at the gaussian point.*/ 425 419 426 IssmDouble BasisFunctions[3];427 428 GetNodalFunctions(&BasisFunctions[0],gauss);429 430 420 _assert_(index1>=0 && index1<3); 431 421 _assert_(index2>=0 && index2<3); 432 basis[0]=BasisFunctions[index1]; 433 basis[1]=BasisFunctions[index2]; 422 423 /*Fetch number of nodes for this finite element*/ 424 int numnodes = this->NumberofNodes(); 425 426 /*Get nodal functions*/ 427 IssmDouble* BasisFunctions=xNew<IssmDouble>(numnodes); 428 GetNodalFunctions(BasisFunctions,gauss); 429 430 switch(this->element_type){ 431 case P1Enum: 432 case P1DGEnum: 433 basis[0]=BasisFunctions[index1]; 434 basis[1]=BasisFunctions[index2]; 435 return; 436 case P2Enum: 437 _assert_(index2<index1); 438 basis[0]=BasisFunctions[index1]; 439 basis[1]=BasisFunctions[index2]; 440 basis[2]=BasisFunctions[3+index2-1]; 441 return; 442 default: 443 _error_("Element type "<<EnumToStringx(this->element_type)<<" not supported yet"); 444 } 445 446 xDelete<IssmDouble>(BasisFunctions); 434 447 } 435 448 /*}}}*/ … … 439 452 /*This routine returns the values of the nodal functions derivatives (with respect to the 440 453 * actual coordinate system): */ 441 int i;442 IssmDouble dbasis_ref[NDOF2][NUMNODESP1];443 454 IssmDouble Jinv[NDOF2][NDOF2]; 444 455 445 /*Get derivative values with respect to parametric coordinate system: */ 446 GetNodalFunctionsDerivativesReference(&dbasis_ref[0][0], gauss); 456 /*Fetch number of nodes for this finite element*/ 457 int numnodes = this->NumberofNodes(); 458 459 /*Get nodal functions derivatives in reference triangle*/ 460 IssmDouble* dbasis_ref=xNew<IssmDouble>(2*numnodes); 461 GetNodalFunctionsDerivativesReference(dbasis_ref,gauss); 447 462 448 463 /*Get Jacobian invert: */ … … 450 465 451 466 /*Build dbasis: 452 *453 467 * [dhi/dx]= Jinv*[dhi/dr] 454 468 * [dhi/dy] [dhi/ds] 455 469 */ 456 for (i=0;i<NUMNODESP1;i++){457 dbasis[ NUMNODESP1*0+i]=Jinv[0][0]*dbasis_ref[0][i]+Jinv[0][1]*dbasis_ref[1][i];458 dbasis[ NUMNODESP1*1+i]=Jinv[1][0]*dbasis_ref[0][i]+Jinv[1][1]*dbasis_ref[1][i];470 for(int i=0;i<numnodes;i++){ 471 dbasis[numnodes*0+i]=Jinv[0][0]*dbasis_ref[0*numnodes+i]+Jinv[0][1]*dbasis_ref[1*numnodes+i]; 472 dbasis[numnodes*1+i]=Jinv[1][0]*dbasis_ref[0*numnodes+i]+Jinv[1][1]*dbasis_ref[1*numnodes+i]; 459 473 } 460 474 … … 462 476 /*}}}*/ 463 477 /*FUNCTION TriaRef::GetNodalFunctionsDerivativesReference{{{*/ 464 void TriaRef::GetNodalFunctionsDerivativesReference(IssmDouble* d l1dl3,GaussTria* gauss){478 void TriaRef::GetNodalFunctionsDerivativesReference(IssmDouble* dbasis,GaussTria* gauss){ 465 479 /*This routine returns the values of the nodal functions derivatives (with respect to the 466 480 * natural coordinate system) at the gaussian point. */ 467 481 468 /*First nodal function: */ 469 *(dl1dl3+NUMNODESP1*0+0)=-0.5; 470 *(dl1dl3+NUMNODESP1*1+0)=-1.0/(2.0*SQRT3); 471 472 /*Second nodal function: */ 473 *(dl1dl3+NUMNODESP1*0+1)=0.5; 474 *(dl1dl3+NUMNODESP1*1+1)=-1.0/(2.0*SQRT3); 475 476 /*Third nodal function: */ 477 *(dl1dl3+NUMNODESP1*0+2)=0; 478 *(dl1dl3+NUMNODESP1*1+2)=1.0/SQRT3; 479 480 } 481 /*}}}*/ 482 /*FUNCTION TriaRef::GetNodalFunctionsDerivativesP2Reference{{{*/ 483 void TriaRef::GetNodalFunctionsDerivativesP2Reference(IssmDouble** pdbasis,GaussTria* gauss){ 484 /*This routine returns the values of the nodal functions derivatives (with respect to the 485 * natural coordinate system) at the gaussian point. */ 486 487 /*Allocate*/ 488 IssmDouble* dbasis =xNew<IssmDouble>(NUMNODESP2*2); 489 490 /*Nodal function 1*/ 491 dbasis[NUMNODESP2*0+0]=-2.*gauss->coord1 + 0.5; 492 dbasis[NUMNODESP2*0+1]=-2.*SQRT3/3.*gauss->coord1 + SQRT3/6.; 493 /*Nodal function 2*/ 494 dbasis[NUMNODESP2*0+0]=+2.*gauss->coord2 + 0.5; 495 dbasis[NUMNODESP2*0+1]=-2.*SQRT3/3.*gauss->coord2 + SQRT3/6.; 496 /*Nodal function 3*/ 497 dbasis[NUMNODESP2*0+0]=0.; 498 dbasis[NUMNODESP2*0+1]=+4.*SQRT3/3.*gauss->coord3 - SQRT3/3.; 499 /*Nodal function 4*/ 500 dbasis[NUMNODESP2*0+0]=+2.*gauss->coord3; 501 dbasis[NUMNODESP2*0+1]=+4.*SQRT3/3.*gauss->coord2 - 2.*SQRT3/3.*gauss->coord3; 502 /*Nodal function 5*/ 503 dbasis[NUMNODESP2*0+0]=-2.*gauss->coord3; 504 dbasis[NUMNODESP2*0+1]=+4.*SQRT3/3.*gauss->coord1 - 2.*SQRT3/3.*gauss->coord3; 505 /*Nodal function 6*/ 506 dbasis[NUMNODESP2*0+0]=2.*(gauss->coord1-gauss->coord2); 507 dbasis[NUMNODESP2*0+1]=-2.*SQRT3/3.*(gauss->coord1+gauss->coord2); 508 509 /*Assign output pointer*/ 510 *pdbasis = dbasis; 482 switch(this->element_type){ 483 case P1Enum: case P1DGEnum: 484 /*Nodal function 1*/ 485 dbasis[NUMNODESP1*0+0]=-0.5; 486 dbasis[NUMNODESP1*1+0]=-1.0/(2.0*SQRT3); 487 /*Nodal function 2*/ 488 dbasis[NUMNODESP1*0+1]=0.5; 489 dbasis[NUMNODESP1*1+1]=-1.0/(2.0*SQRT3); 490 /*Nodal function 3*/ 491 dbasis[NUMNODESP1*0+2]=0; 492 dbasis[NUMNODESP1*1+2]=1.0/SQRT3; 493 return; 494 case P2Enum: 495 /*Nodal function 1*/ 496 dbasis[NUMNODESP2*0+0]=-2.*gauss->coord1 + 0.5; 497 dbasis[NUMNODESP2*1+0]=-2.*SQRT3/3.*gauss->coord1 + SQRT3/6.; 498 /*Nodal function 2*/ 499 dbasis[NUMNODESP2*0+1]=+2.*gauss->coord2 + 0.5; 500 dbasis[NUMNODESP2*1+1]=-2.*SQRT3/3.*gauss->coord2 + SQRT3/6.; 501 /*Nodal function 3*/ 502 dbasis[NUMNODESP2*0+2]=0.; 503 dbasis[NUMNODESP2*1+2]=+4.*SQRT3/3.*gauss->coord3 - SQRT3/3.; 504 /*Nodal function 4*/ 505 dbasis[NUMNODESP2*0+3]=+2.*gauss->coord3; 506 dbasis[NUMNODESP2*1+3]=+4.*SQRT3/3.*gauss->coord2 - 2.*SQRT3/3.*gauss->coord3; 507 /*Nodal function 5*/ 508 dbasis[NUMNODESP2*0+4]=-2.*gauss->coord3; 509 dbasis[NUMNODESP2*1+4]=+4.*SQRT3/3.*gauss->coord1 - 2.*SQRT3/3.*gauss->coord3; 510 /*Nodal function 6*/ 511 dbasis[NUMNODESP2*0+5]=2.*(gauss->coord1-gauss->coord2); 512 dbasis[NUMNODESP2*1+5]=-2.*SQRT3/3.*(gauss->coord1+gauss->coord2); 513 return; 514 default: 515 _error_("Element type "<<EnumToStringx(this->element_type)<<" not supported yet"); 516 } 517 511 518 } 512 519 /*}}}*/ … … 519 526 * dp/dx=plist[0]*dh1/dx+plist[1]*dh2/dx+plist[2]*dh3/dx 520 527 * 521 * p is a vector of size 2x1 already allocated. 522 */ 523 524 /*Nodal Derivatives*/ 525 IssmDouble dbasis[2][3]; //nodal derivative functions in actual coordinate system. 526 527 /*Get dh1dh2dh3 in actual coordinate system: */ 528 GetNodalFunctionsDerivatives(&dbasis[0][0],xyz_list, gauss); 528 * p is a vector already allocated. 529 */ 530 531 /*Output*/ 532 IssmDouble dpx=0.; 533 IssmDouble dpy=0.; 534 535 /*Fetch number of nodes for this finite element*/ 536 int numnodes = this->NumberofNodes(); 537 538 /*Get nodal functions derivatives*/ 539 IssmDouble* dbasis=xNew<IssmDouble>(2*numnodes); 540 GetNodalFunctionsDerivatives(dbasis,xyz_list,gauss); 541 542 /*Calculate parameter for this Gauss point*/ 543 for(int i=0;i<numnodes;i++) dpx += dbasis[0*numnodes+i]*plist[i]; 544 for(int i=0;i<numnodes;i++) dpy += dbasis[1*numnodes+i]*plist[i]; 529 545 530 546 /*Assign values*/ 531 *(p+0)= plist[0]*dbasis[0][0]+plist[1]*dbasis[0][1]+plist[2]*dbasis[0][2];532 *(p+1)= plist[0]*dbasis[1][0]+plist[1]*dbasis[1][1]+plist[2]*dbasis[1][2];547 *(p+0)=dpx; 548 *(p+1)=dpy; 533 549 534 550 } … … 537 553 void TriaRef::GetInputValue(IssmDouble* p, IssmDouble* plist, GaussTria* gauss){ 538 554 539 /* From node values of parameter p (plist[0],plist[1],plist[2]), return parameter value at gaussian540 * point specifie by gauss: */541 542 /* nodal functions annd output:*/543 IssmDouble basis[3];555 /*Output*/ 556 IssmDouble value =0.; 557 558 /*Fetch number of nodes for this finite element*/ 559 int numnodes = this->NumberofNodes(); 544 560 545 561 /*Get nodal functions*/ 562 IssmDouble* basis=xNew<IssmDouble>(numnodes); 546 563 GetNodalFunctions(basis, gauss); 547 564 548 /*Get parameter*/ 549 *p=basis[0]*plist[0]+basis[1]*plist[1]+basis[2]*plist[2]; 565 /*Calculate parameter for this Gauss point*/ 566 for(int i=0;i<numnodes;i++) value += basis[i]*plist[i]; 567 568 /*Assign output pointer*/ 569 *p = value; 550 570 } 551 571 /*}}}*/ … … 557 577 case P1DGEnum: return NUMNODESP1; 558 578 case P2Enum: return NUMNODESP2; 559 default: 579 default: _error_("Element type "<<EnumToStringx(this->element_type)<<" not supported yet"); 560 580 } 561 581 -
TabularUnified issm/trunk-jpl/src/c/classes/Elements/TriaRef.h ¶
r15282 r15298 36 36 void GetJacobianInvert(IssmDouble* Jinv, IssmDouble* xyz_list,GaussTria* gauss); 37 37 void GetNodalFunctions(IssmDouble* basis,GaussTria* gauss); 38 void GetNodalFunctionsP2(IssmDouble** pbasis,GaussTria* gauss);39 38 void GetSegmentNodalFunctions(IssmDouble* basis,GaussTria* gauss, int index1,int index2); 40 39 void GetSegmentBFlux(IssmDouble* B,GaussTria* gauss, int index1,int index2); … … 42 41 void GetNodalFunctionsDerivatives(IssmDouble* basis,IssmDouble* xyz_list, GaussTria* gauss); 43 42 void GetNodalFunctionsDerivativesReference(IssmDouble* dl1dl3,GaussTria* gauss); 44 void GetNodalFunctionsDerivativesP2Reference(IssmDouble** pdbasis,GaussTria* gauss);45 43 void GetInputValue(IssmDouble* pp, IssmDouble* plist, GaussTria* gauss); 46 44 void GetInputDerivativeValue(IssmDouble* pp, IssmDouble* plist,IssmDouble* xyz_list, GaussTria* gauss); 47 45 48 46 int NumberofNodes(void); 49 50 47 }; 51 48 #endif -
TabularUnified issm/trunk-jpl/src/c/classes/Inputs/ControlInput.cpp ¶
r15104 r15298 30 30 31 31 switch(enum_input){ 32 case Tria P1InputEnum:33 values =new Tria P1Input(enum_type,pvalues);34 savedvalues=new Tria P1Input(enum_type,pvalues);35 minvalues =new Tria P1Input(enum_type,pmin);36 maxvalues =new Tria P1Input(enum_type,pmax);32 case TriaInputEnum: 33 values =new TriaInput(enum_type,pvalues); 34 savedvalues=new TriaInput(enum_type,pvalues); 35 minvalues =new TriaInput(enum_type,pmin); 36 maxvalues =new TriaInput(enum_type,pmax); 37 37 break; 38 38 case PentaP1InputEnum: -
TabularUnified issm/trunk-jpl/src/c/classes/Inputs/PentaP1Input.cpp ¶
r15130 r15298 86 86 87 87 /*output*/ 88 Tria P1Input* outinput=NULL;88 TriaInput* outinput=NULL; 89 89 IssmDouble newvalues[3]; 90 90 … … 100 100 101 101 /*Create new Tria input*/ 102 outinput=new Tria P1Input(this->enum_type,&newvalues[0]);102 outinput=new TriaInput(this->enum_type,&newvalues[0]); 103 103 104 104 /*Assign output*/ -
TabularUnified issm/trunk-jpl/src/c/classes/Loads/Icefront.cpp ¶
r15104 r15298 41 41 int segment_width; 42 42 int element; 43 int num_nodes; 43 int numnodes; 44 int numvertices; 44 45 int dim; 45 46 int numberofelements; … … 88 89 else _error_("in_icefront_type " << EnumToStringx(in_icefront_type) << " not supported yet!"); 89 90 90 if (in_icefront_type==PattynIceFrontEnum || in_icefront_type==StokesIceFrontEnum) 91 num_nodes=4; 92 else 93 num_nodes=2; 91 if (in_icefront_type==PattynIceFrontEnum || in_icefront_type==StokesIceFrontEnum){ 92 numnodes=4; 93 numvertices=4; 94 } 95 else{ 96 numnodes=2; 97 numvertices=2; 98 } 94 99 95 100 /*Fill*/ … … 101 106 102 107 /*Hooks: */ 103 this->hnodes=new Hook(icefront_node_ids,num _nodes);104 this->hvertices=new Hook(icefront_vertex_ids,num _nodes);108 this->hnodes=new Hook(icefront_node_ids,numnodes); 109 this->hvertices=new Hook(icefront_vertex_ids,numvertices); 105 110 this->helement=new Hook(&icefront_eid,1); 106 111 this->hmatpar=new Hook(&icefront_mparid,1); … … 246 251 247 252 /*Checks in debugging mode*/ 248 /*{{{*/249 253 _assert_(nodes); 250 254 _assert_(element); 251 255 _assert_(matpar); 252 /*}}}*/253 256 254 257 /*Retrieve parameters: */ … … 496 499 ElementVector* Icefront::CreatePVectorDiagnosticMacAyeal2d(void){ 497 500 498 /*Constants*/499 const int numnodes= NUMVERTICESSEG;500 const int numdofs = numnodes *NDOF2;501 502 501 /*Intermediary*/ 503 int ig,index1,index2,fill; 504 IssmDouble Jdet; 505 IssmDouble thickness,bed,pressure,ice_pressure,rho_water,rho_ice,gravity; 506 IssmDouble water_pressure,air_pressure,surface_under_water,base_under_water; 507 IssmDouble xyz_list[numnodes][3]; 508 IssmDouble normal[2]; 509 IssmDouble L[2]; 502 int ig,index1,index2,fill; 503 IssmDouble Jdet; 504 IssmDouble thickness,bed,pressure,ice_pressure,rho_water,rho_ice,gravity; 505 IssmDouble water_pressure,air_pressure,surface_under_water,base_under_water; 506 IssmDouble xyz_list[NUMVERTICESSEG][3]; 507 IssmDouble normal[2]; 510 508 GaussTria *gauss; 511 509 510 /*return of element is on water*/ 512 511 Tria* tria=((Tria*)element); 513 514 /*Initialize Element vector and return if necessary*/515 512 if(tria->IsOnWater()) return NULL; 513 514 /*Fetch number of nodes and dof for this finite element*/ 515 //int numnodes = this->NumberofNodes(); 516 int numnodes = 2; 517 int numdof = numnodes*NDOF2; 518 519 /*Initialize Element vector and vectors*/ 516 520 ElementVector* pe=new ElementVector(nodes,NUMVERTICESSEG,this->parameters,MacAyealApproximationEnum); 521 IssmDouble* basis = xNew<IssmDouble>(numnodes); 517 522 518 523 /*Retrieve all inputs and parameters*/ … … 558 563 559 564 tria->GetSegmentJacobianDeterminant(&Jdet,&xyz_list[0][0],gauss); 560 tria->GetSegmentNodalFunctions(& L[0],gauss,index1,index2);565 tria->GetSegmentNodalFunctions(&basis[0],gauss,index1,index2); 561 566 562 567 for (int i=0;i<numnodes;i++){ 563 pe->values[2*i+0]+= pressure*Jdet*gauss->weight*normal[0]* L[i];564 pe->values[2*i+1]+= pressure*Jdet*gauss->weight*normal[1]* L[i];568 pe->values[2*i+0]+= pressure*Jdet*gauss->weight*normal[0]*basis[i]; 569 pe->values[2*i+1]+= pressure*Jdet*gauss->weight*normal[1]*basis[i]; 565 570 } 566 571 } … … 570 575 571 576 /*Clean up and return*/ 577 xDelete<IssmDouble>(basis); 572 578 delete gauss; 573 579 return pe; -
TabularUnified issm/trunk-jpl/src/c/classes/Materials/Matdamageice.cpp ¶
r15104 r15298 630 630 IssmDouble values[3]; 631 631 for (int i=0;i<3;i++) values[i]=vector[((Tria*)element)->vertices[i]->Pid()]; 632 this->inputs->AddInput(new Tria P1Input(name,values));632 this->inputs->AddInput(new TriaInput(name,values)); 633 633 return; 634 634 } … … 672 672 IssmDouble values[3]; 673 673 for (int i=0;i<3;i++) values[i]=vector[((Tria*)element)->vertices[i]->Sid()]; //use sid list, to index into serial oriented vector 674 this->inputs->AddInput(new Tria P1Input(name,values));674 this->inputs->AddInput(new TriaInput(name,values)); 675 675 /*Special case for rheology B in 2D: Pourave land for this solution{{{*/ 676 676 if(name==MaterialsRheologyBEnum){ … … 685 685 if(dim==2){ 686 686 /*Dupliacte rheology input: */ 687 this->inputs->AddInput(new Tria P1Input(MaterialsRheologyBbarEnum,values));687 this->inputs->AddInput(new TriaInput(MaterialsRheologyBbarEnum,values)); 688 688 } 689 689 } … … 759 759 if (iomodel->Data(MaterialsRheologyBEnum)) { 760 760 for(i=0;i<num_vertices;i++) nodeinputs[i]=iomodel->Data(MaterialsRheologyBEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+i]-1)]; 761 this->inputs->AddInput(new Tria P1Input(MaterialsRheologyBbarEnum,nodeinputs));761 this->inputs->AddInput(new TriaInput(MaterialsRheologyBbarEnum,nodeinputs)); 762 762 } 763 763 … … 765 765 if (iomodel->Data(MaterialsRheologyNEnum)) { 766 766 for(i=0;i<num_vertices;i++) nodeinputs[i]=iomodel->Data(MaterialsRheologyNEnum)[index]; 767 this->inputs->AddInput(new Tria P1Input(MaterialsRheologyNEnum,nodeinputs));767 this->inputs->AddInput(new TriaInput(MaterialsRheologyNEnum,nodeinputs)); 768 768 } 769 769 … … 771 771 if (iomodel->Data(MaterialsRheologyZEnum)) { 772 772 for(i=0;i<num_vertices;i++) nodeinputs[i]=iomodel->Data(MaterialsRheologyZEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+i]-1)]; 773 this->inputs->AddInput(new Tria P1Input(MaterialsRheologyZbarEnum,nodeinputs));773 this->inputs->AddInput(new TriaInput(MaterialsRheologyZbarEnum,nodeinputs)); 774 774 } 775 775 … … 785 785 for(j=0;j<num_vertices;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)*num_control_type+i]; 786 786 for(j=0;j<num_vertices;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)*num_control_type+i]; 787 this->inputs->AddInput(new ControlInput(MaterialsRheologyBbarEnum,Tria P1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1));787 this->inputs->AddInput(new ControlInput(MaterialsRheologyBbarEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1)); 788 788 } 789 789 break; … … 794 794 for(j=0;j<num_vertices;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)*num_control_type+i]; 795 795 for(j=0;j<num_vertices;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)*num_control_type+i]; 796 this->inputs->AddInput(new ControlInput(MaterialsRheologyZbarEnum,Tria P1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1));796 this->inputs->AddInput(new ControlInput(MaterialsRheologyZbarEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1)); 797 797 } 798 798 break; -
TabularUnified issm/trunk-jpl/src/c/classes/Materials/Matice.cpp ¶
r15293 r15298 13 13 #include "../Inputs/Input.h" 14 14 #include "../Inputs/Inputs.h" 15 #include "../Inputs/Tria P1Input.h"15 #include "../Inputs/TriaInput.h" 16 16 #include "../Inputs/PentaP1Input.h" 17 17 #include "../Inputs/ControlInput.h" … … 564 564 IssmDouble values[3]; 565 565 for (int i=0;i<3;i++) values[i]=vector[((Tria*)element)->vertices[i]->Pid()]; 566 this->inputs->AddInput(new Tria P1Input(name,values));566 this->inputs->AddInput(new TriaInput(name,values)); 567 567 return; 568 568 } … … 606 606 IssmDouble values[3]; 607 607 for (int i=0;i<3;i++) values[i]=vector[((Tria*)element)->vertices[i]->Sid()]; //index into serial oriented vector 608 this->inputs->AddInput(new Tria P1Input(name,values));608 this->inputs->AddInput(new TriaInput(name,values)); 609 609 /*Special case for rheology B in 2D: Pourave land for this solution{{{*/ 610 610 if(name==MaterialsRheologyBEnum){ … … 619 619 if(dim==2){ 620 620 /*Dupliacte rheology input: */ 621 this->inputs->AddInput(new Tria P1Input(MaterialsRheologyBbarEnum,values));621 this->inputs->AddInput(new TriaInput(MaterialsRheologyBbarEnum,values)); 622 622 } 623 623 } … … 699 699 if (iomodel->Data(MaterialsRheologyBEnum)) { 700 700 for(i=0;i<num_vertices;i++) nodeinputs[i]=iomodel->Data(MaterialsRheologyBEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+i]-1)]; 701 this->inputs->AddInput(new Tria P1Input(MaterialsRheologyBbarEnum,nodeinputs));701 this->inputs->AddInput(new TriaInput(MaterialsRheologyBbarEnum,nodeinputs)); 702 702 } 703 703 … … 705 705 if (iomodel->Data(MaterialsRheologyNEnum)) { 706 706 for(i=0;i<num_vertices;i++) nodeinputs[i]=iomodel->Data(MaterialsRheologyNEnum)[index]; 707 this->inputs->AddInput(new Tria P1Input(MaterialsRheologyNEnum,nodeinputs));707 this->inputs->AddInput(new TriaInput(MaterialsRheologyNEnum,nodeinputs)); 708 708 } 709 709 … … 719 719 for(j=0;j<num_vertices;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)*num_control_type+i]; 720 720 for(j=0;j<num_vertices;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)*num_control_type+i]; 721 this->inputs->AddInput(new ControlInput(MaterialsRheologyBbarEnum,Tria P1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1));721 this->inputs->AddInput(new ControlInput(MaterialsRheologyBbarEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1)); 722 722 } 723 723 break; -
TabularUnified issm/trunk-jpl/src/c/classes/classes.h ¶
r15106 r15298 58 58 #include "./Inputs/IntInput.h" 59 59 #include "./Inputs/PentaP1Input.h" 60 #include "./Inputs/Tria P1Input.h"60 #include "./Inputs/TriaInput.h" 61 61 #include "./Inputs/ControlInput.h" 62 62 #include "./Inputs/DatasetInput.h" -
TabularUnified issm/trunk-jpl/src/c/classes/gauss/GaussTria.cpp ¶
r15104 r15298 388 388 /*update static arrays*/ 389 389 switch(iv){ 390 case 0: 391 coord1=1; coord2=0; coord3=0; 390 case 0: coord1=1.; coord2=0.; coord3=0.; break; 391 case 1: coord1=0.; coord2=1.; coord3=0.; break; 392 case 2: coord1=0.; coord2=0.; coord3=1.; break; 393 default: _error_("vertex index should be in [0 2]"); 394 } 395 396 } 397 /*}}}*/ 398 /*FUNCTION GaussTria::GaussNode{{{*/ 399 void GaussTria::GaussNode(int numnodes,int iv){ 400 401 /*in debugging mode: check that the default constructor has been called*/ 402 _assert_(numgauss==-1); 403 404 /*update static arrays*/ 405 switch(numnodes){ 406 case 3: //P1 Lagrange element 407 switch(iv){ 408 case 0: coord1=1.; coord2=0.; coord3=0.; break; 409 case 1: coord1=0.; coord2=1.; coord3=0.; break; 410 case 2: coord1=0.; coord2=0.; coord3=1.; break; 411 default: _error_("node index should be in [0 2]"); 412 } 392 413 break; 393 case 1: 394 coord1=0; coord2=1; coord3=0; 414 case 6: //P2 Lagrange element 415 switch(iv){ 416 case 0: coord1=1.; coord2=0.; coord3=0.; break; 417 case 1: coord1=0.; coord2=1.; coord3=0.; break; 418 case 2: coord1=0.; coord2=0.; coord3=1.; break; 419 case 3: coord1=0.; coord2=.5; coord3=.5; break; 420 case 4: coord1=.5; coord2=0.; coord3=.5; break; 421 case 5: coord1=.5; coord2=.5; coord3=0.; break; 422 default: _error_("node index should be in [0 5]"); 423 } 395 424 break; 396 case 2: 397 coord1=0; coord2=0; coord3=1; 398 break; 399 default: 400 _error_("vertex index should be in [0 2]"); 401 425 default: _error_("supported number of nodes are 3 and 6"); 402 426 } 403 427 -
TabularUnified issm/trunk-jpl/src/c/classes/gauss/GaussTria.h ¶
r15071 r15298 40 40 void GaussPoint(int ig); 41 41 void GaussVertex(int iv); 42 void GaussNode(int numnodes,int iv); 42 43 void GaussCenter(void); 43 44 void GaussEdgeCenter(int index1,int index2); -
TabularUnified issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateNodesDiagnosticHoriz.cpp ¶
r15000 r15298 51 51 } 52 52 53 if(false){ 54 /*Quadratic element*/ 55 int numberofedges; 56 int element1,element2; 57 bool my_edge; 58 59 iomodel->Constant(&numberofedges,MeshNumberofedgesEnum); 60 61 for (i=0;i<numberofedges;i++){ 62 63 /*Get left and right elements*/ 64 element1=reCast<int>(iomodel->Data(MeshEdgesEnum)[4*i+2])-1; //edges are [node1 node2 elem1 elem2] 65 element2=reCast<int>(iomodel->Data(MeshEdgesEnum)[4*i+3])-1; //edges are [node1 node2 elem1 elem2] 66 67 /*Check whether we should include this edge (element2 is -2 for boundary edges)*/ 68 my_edge = iomodel->my_elements[element1]; 69 if(!my_edge && element2>=0){ 70 my_edge = iomodel->my_elements[element2]; 71 } 72 73 /*Add node on edge*/ 74 if(my_edge){ 75 nodes->AddObject(new Node(iomodel->nodecounter+numberofvertices+i+1,numberofvertices+i,numberofvertices+i+1,i,iomodel,DiagnosticHorizAnalysisEnum)); 76 } 77 } 78 } 79 53 80 /*Clean fetched data: */ 54 81 iomodel->DeleteData(9,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,FlowequationBordermacayealEnum,FlowequationBorderstokesEnum, -
TabularUnified issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h ¶
r15282 r15298 384 384 StringParamEnum, 385 385 TriaEnum, 386 Tria P1InputEnum,386 TriaInputEnum, 387 387 VertexEnum, 388 388 VertexPIdEnum, -
TabularUnified issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp ¶
r15282 r15298 384 384 case StringParamEnum : return "StringParam"; 385 385 case TriaEnum : return "Tria"; 386 case Tria P1InputEnum : return "TriaP1Input";386 case TriaInputEnum : return "TriaInput"; 387 387 case VertexEnum : return "Vertex"; 388 388 case VertexPIdEnum : return "VertexPId"; -
TabularUnified issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp ¶
r15282 r15298 393 393 else if (strcmp(name,"StringParam")==0) return StringParamEnum; 394 394 else if (strcmp(name,"Tria")==0) return TriaEnum; 395 else if (strcmp(name,"Tria P1Input")==0) return TriaP1InputEnum;395 else if (strcmp(name,"TriaInput")==0) return TriaInputEnum; 396 396 else if (strcmp(name,"Vertex")==0) return VertexEnum; 397 397 else if (strcmp(name,"VertexPId")==0) return VertexPIdEnum; -
TabularUnified issm/trunk-jpl/src/m/enum/EnumDefinitions.py ¶
r15282 r15298 5147 5147 return StringToEnum('Tria')[0] 5148 5148 5149 def Tria P1InputEnum():5150 """ 5151 TRIA P1INPUTENUM - Enum of TriaP1Input5152 5153 WARNING: DO NOT MODIFY THIS FILE 5154 this file has been automatically generated by src/c/shared/Enum/Synchronize.sh 5155 Please read src/c/shared/Enum/README for more information 5156 5157 Usage: 5158 macro=Tria P1InputEnum()5159 """ 5160 5161 return StringToEnum('Tria P1Input')[0]5149 def TriaInputEnum(): 5150 """ 5151 TRIAINPUTENUM - Enum of TriaInput 5152 5153 WARNING: DO NOT MODIFY THIS FILE 5154 this file has been automatically generated by src/c/shared/Enum/Synchronize.sh 5155 Please read src/c/shared/Enum/README for more information 5156 5157 Usage: 5158 macro=TriaInputEnum() 5159 """ 5160 5161 return StringToEnum('TriaInput')[0] 5162 5162 5163 5163 def VertexEnum():
Note:
See TracChangeset
for help on using the changeset viewer.