Changeset 15298 for issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
- Timestamp:
- 06/21/13 08:41:36 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
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 }
Note:
See TracChangeset
for help on using the changeset viewer.