Changeset 246 for issm/trunk/src/c/objects/Tria.cpp
- Timestamp:
- 05/05/09 14:11:46 (17 years ago)
- File:
-
- 1 edited
-
issm/trunk/src/c/objects/Tria.cpp (modified) (40 diffs)
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk/src/c/objects/Tria.cpp
r241 r246 266 266 #define __FUNCT__ "Tria::CreateKMatrix" 267 267 268 void Tria::CreateKMatrix(Mat Kgg, ParameterInputs* inputs,int analysis_type){268 void Tria::CreateKMatrix(Mat Kgg,void* inputs,int analysis_type){ 269 269 270 270 /*Just branch to the correct element stiffness matrix generator, according to the type of analysis we are carrying out: */ … … 284 284 #define __FUNCT__ "Tria::CreateKMatrixDiagnosticHoriz" 285 285 286 void Tria::CreateKMatrixDiagnosticHoriz(Mat Kgg, ParameterInputs*inputs,int analysis_type){286 void Tria::CreateKMatrixDiagnosticHoriz(Mat Kgg,void* vinputs,int analysis_type){ 287 287 288 288 … … 328 328 329 329 /*input parameters for structural analysis (diagnostic): */ 330 double* velocity_param=NULL; 331 double* oldvelocity_param=NULL; 332 double vxvy_list[numgrids][2]; 333 double oldvxvy_list[numgrids][2]; 330 double vxvy_list[numgrids][2]={{0,0},{0,0},{0,0}}; 331 double oldvxvy_list[numgrids][2]={{0,0},{0,0},{0,0}}; 334 332 double thickness; 333 int dofs[2]={0,1}; 334 335 ParameterInputs* inputs=NULL; 336 337 /*recover pointers: */ 338 inputs=(ParameterInputs*)vinputs; 335 339 336 340 /*recover extra inputs from users, at current convergence iteration: */ 337 velocity_param=ParameterInputsRecover(inputs,"velocity");338 oldvelocity_param=ParameterInputsRecover(inputs,"old_velocity");341 inputs->Recover("velocity",&vxvy_list[0][0],2,dofs,numgrids,(void**)nodes); 342 inputs->Recover("old_velocity",&oldvxvy_list[0][0],2,dofs,numgrids,(void**)nodes); 339 343 340 344 /* Get node coordinates and dof list: */ … … 344 348 /* Set Ke_gg to 0: */ 345 349 for(i=0;i<numdofs;i++) for(j=0;j<numdofs;j++) Ke_gg[i][j]=0.0; 346 347 /*Initialize vxvy_list: */348 for(i=0;i<numgrids;i++){349 if(velocity_param){350 vxvy_list[i][0]=velocity_param[doflist[i*numberofdofspernode+0]];351 vxvy_list[i][1]=velocity_param[doflist[i*numberofdofspernode+1]];352 }353 else{354 vxvy_list[i][0]=0;355 vxvy_list[i][1]=0;356 }357 358 if(oldvelocity_param){359 oldvxvy_list[i][0]=oldvelocity_param[doflist[i*numberofdofspernode+0]];360 oldvxvy_list[i][1]=oldvelocity_param[doflist[i*numberofdofspernode+1]];361 }362 else{363 oldvxvy_list[i][0]=0;364 oldvxvy_list[i][1]=0;365 }366 }367 350 368 351 #ifdef _DEBUGELEMENTS_ … … 516 499 #undef __FUNCT__ 517 500 #define __FUNCT__ "Tria::CreateKMatrixDiagnosticHorizFriction" 518 void Tria::CreateKMatrixDiagnosticHorizFriction(Mat Kgg, ParameterInputs*inputs,int analysis_type){501 void Tria::CreateKMatrixDiagnosticHorizFriction(Mat Kgg,void* vinputs,int analysis_type){ 519 502 520 503 … … 554 537 555 538 /*input parameters for structural analysis (diagnostic): */ 556 double * velocity_param=NULL;557 double vxvy_list[numgrids][2];539 double vxvy_list[numgrids][2]={{0,0},{0,0},{0,0}}; 540 int dofs[2]={0,1}; 558 541 559 542 /*friction: */ … … 564 547 double MOUNTAINKEXPONENT=10; 565 548 566 /*recover extra inputs from users, at current convergence iteration: */ 567 velocity_param=ParameterInputsRecover(inputs,"velocity"); 568 549 ParameterInputs* inputs=NULL; 550 551 /*recover pointers: */ 552 inputs=(ParameterInputs*)vinputs; 553 569 554 /* Get node coordinates and dof list: */ 570 555 GetElementNodeData( &xyz_list[0][0], nodes, numgrids); … … 581 566 if (friction_type!=2)throw ErrorException(__FUNCT__," non-viscous friction not supported yet!"); 582 567 583 /*Initialize vxvy_list: */ 584 for(i=0;i<numgrids;i++){ 585 if(velocity_param){ 586 vxvy_list[i][0]=velocity_param[doflist[i*numberofdofspernode+0]]; 587 vxvy_list[i][1]=velocity_param[doflist[i*numberofdofspernode+1]]; 588 } 589 else{ 590 vxvy_list[i][0]=0; 591 vxvy_list[i][1]=0; 592 } 593 } 568 /*recover extra inputs from users, at current convergence iteration: */ 569 inputs->Recover("velocity",&vxvy_list[0][0],2,dofs,numgrids,(void**)nodes); 594 570 595 571 /*Build alpha2_list used by drag stiffness matrix*/ … … 691 667 #undef __FUNCT__ 692 668 #define __FUNCT__ "Tria::CreatePVector" 693 void Tria::CreatePVector(Vec pg, ParameterInputs* inputs,int analysis_type){669 void Tria::CreatePVector(Vec pg,void* inputs,int analysis_type){ 694 670 695 671 /*Just branch to the correct load generator, according to the type of analysis we are carrying out: */ … … 708 684 #define __FUNCT__ "Tria::CreatePVectorDiagnosticHoriz" 709 685 710 void Tria::CreatePVectorDiagnosticHoriz( Vec pg, ParameterInputs*inputs, int analysis_type){686 void Tria::CreatePVectorDiagnosticHoriz( Vec pg, void* vinputs, int analysis_type){ 711 687 712 688 int i,j; … … 746 722 /*input parameters for structural analysis (diagnostic): */ 747 723 double thickness; 724 725 ParameterInputs* inputs=NULL; 726 727 /*recover pointers: */ 728 inputs=(ParameterInputs*)vinputs; 748 729 749 730 /* Get node coordinates and dof list: */ … … 871 852 #undef __FUNCT__ 872 853 #define __FUNCT__ "Tria::UpdateFromInputs" 873 void Tria::UpdateFromInputs(ParameterInputs* inputs){ 874 875 int i; 876 int doflist[MAXDOFSPERNODE*3]; 877 int numberofdofspernode; 878 879 /*element: */ 880 double* h_param=NULL; 881 double* s_param=NULL; 882 double* b_param=NULL; 883 double* k_param=NULL; 884 double* melting_param=NULL; 885 double* accumulation_param=NULL; 886 887 /*material: */ 888 double* temperature_average_param=NULL; 854 void Tria::UpdateFromInputs(void* vinputs){ 855 856 int dofs[1]={0}; 857 double temperature_list[3]; 889 858 double temperature_average; 890 double * B_param=NULL;859 double B_list[3]; 891 860 double B_average; 892 861 893 894 /*Get dof list: */ 895 GetDofList(&doflist[0],&numberofdofspernode); 862 ParameterInputs* inputs=NULL; 863 864 /*recover pointers: */ 865 inputs=(ParameterInputs*)vinputs; 896 866 897 867 /*Update internal data if inputs holds new values: */ 898 h_param=ParameterInputsRecover(inputs,"thickness"); 899 s_param=ParameterInputsRecover(inputs,"surface"); 900 b_param=ParameterInputsRecover(inputs,"bed"); 901 k_param=ParameterInputsRecover(inputs,"drag"); 902 melting_param=ParameterInputsRecover(inputs,"melting"); 903 accumulation_param=ParameterInputsRecover(inputs,"accumulation"); 904 905 for(i=0;i<3;i++){ 906 if(h_param)h[i]=h_param[doflist[i*numberofdofspernode+0]]; 907 if(s_param)s[i]=s_param[doflist[i*numberofdofspernode+0]]; 908 if(b_param)b[i]=b_param[doflist[i*numberofdofspernode+0]]; 909 if(k_param)k[i]=k_param[doflist[i*numberofdofspernode+0]]; 910 if(melting_param)melting[i]=melting_param[doflist[i*numberofdofspernode+0]]; 911 if(accumulation_param)accumulation[i]=accumulation_param[doflist[i*numberofdofspernode+0]]; 912 } 913 868 inputs->Recover("thickness",&h[0],1,dofs,3,(void**)nodes); 869 inputs->Recover("surface",&s[0],1,dofs,3,(void**)nodes); 870 inputs->Recover("bed",&b[0],1,dofs,3,(void**)nodes); 871 inputs->Recover("drag",&k[0],1,dofs,3,(void**)nodes); 872 inputs->Recover("melting",&melting[0],1,dofs,3,(void**)nodes); 873 inputs->Recover("accumulation_param",&accumulation[0],1,dofs,3,(void**)nodes); 874 914 875 //Update material if necessary 915 temperature_average_param=ParameterInputsRecover(inputs,"temperature_average"); 916 B_param=ParameterInputsRecover(inputs,"B"); 917 if(temperature_average_param){ 918 temperature_average-0; 919 for(i=0;i<3;i++) temperature_average+=temperature_average_param[doflist[i*numberofdofspernode+0]]; 920 temperature_average=temperature_average/3.0; 876 if(inputs->Recover("temperature_average",&temperature_list[0],1,dofs,3,(void**)nodes)){ 877 temperature_average=(temperature_list[0]+temperature_list[1]+temperature_list[2])/3.0; 921 878 B_average=Paterson(temperature_average); 922 879 matice->SetB(B_average); 923 880 } 924 925 if(B_param){ 926 B_average=0; 927 for(i=0;i<3;i++) B_average+=B_param[doflist[i*numberofdofspernode+0]]; 928 B_average=B_average/3.0; 881 882 if(inputs->Recover("B",&B_list[0],1,dofs,3,(void**)nodes)){ 883 B_average=(B_list[0]+B_list[1]+B_list[2])/3.0; 929 884 matice->SetB(B_average); 930 885 } … … 1311 1266 } 1312 1267 1313 Matpar* Tria::GetMatPar(){1268 void* Tria::GetMatPar(){ 1314 1269 return matpar; 1315 1270 } … … 1320 1275 1321 1276 1322 void Tria::GetNodes( Node**pnodes){1277 void Tria::GetNodes(void** vpnodes){ 1323 1278 int i; 1279 Node** pnodes=(Node**)vpnodes; 1280 1324 1281 for(i=0;i<3;i++){ 1325 1282 pnodes[i]=nodes[i]; … … 1346 1303 1347 1304 Object* Tria::copy() { 1305 1348 1306 return new Tria(*this); 1307 1349 1308 } 1350 1309 … … 1352 1311 #undef __FUNCT__ 1353 1312 #define __FUNCT__ "Tria::Du" 1354 void Tria::Du(Vec du_g,double* velocity,double* obs_velocity, ParameterInputs*inputs,int analysis_type){1313 void Tria::Du(Vec du_g,double* velocity,double* obs_velocity,void* vinputs,int analysis_type){ 1355 1314 1356 1315 int i; … … 1404 1363 double scaley=0; 1405 1364 double scale=0; 1406 double* fit_param=NULL;1407 1365 double fit=-1; 1366 1367 ParameterInputs* inputs=NULL; 1368 1369 /*recover pointers: */ 1370 inputs=(ParameterInputs*)vinputs; 1408 1371 1409 1372 /* Get node coordinates and dof list: */ … … 1415 1378 1416 1379 /* Recover input data: */ 1417 fit_param=ParameterInputsRecover(inputs,"fit"); 1418 if(fit_param){ 1419 fit=*fit_param; 1420 } 1421 else throw ErrorException(__FUNCT__," missing fit input parameter"); 1380 if(!inputs->Recover("fit",&fit)) throw ErrorException(__FUNCT__," missing fit input parameter"); 1422 1381 1423 1382 /*Initialize velocities: */ … … 1570 1529 #undef __FUNCT__ 1571 1530 #define __FUNCT__ "Tria::Gradj" 1572 void Tria::Gradj(Vec grad_g,double* velocity,double* adjoint, ParameterInputs* inputs,int analysis_type,char* control_type){1531 void Tria::Gradj(Vec grad_g,double* velocity,double* adjoint,void* inputs,int analysis_type,char* control_type){ 1573 1532 1574 1533 if (strcmp(control_type,"drag")==0){ … … 1583 1542 #undef __FUNCT__ 1584 1543 #define __FUNCT__ "Tria::GradjDrag" 1585 void Tria::GradjDrag(Vec grad_g,double* velocity,double* adjoint, ParameterInputs*inputs,int analysis_type){1544 void Tria::GradjDrag(Vec grad_g,double* velocity,double* adjoint,void* vinputs,int analysis_type){ 1586 1545 1587 1546 … … 1603 1562 double adjy_list[numgrids]; 1604 1563 1605 double* basal_drag_param=NULL;1606 double K_list[numgrids];1607 1564 double drag; 1608 1609 double* bed_param=NULL; 1610 double bed_list[numgrids]; 1611 double* thickness_param=NULL; 1612 double thickness_list[numgrids]; 1565 int dofs[1]={0}; 1613 1566 1614 1567 /* gaussian points: */ … … 1650 1603 double epsilon[3]; /* epsilon=[exx,eyy,exy];*/ 1651 1604 1605 ParameterInputs* inputs=NULL; 1606 1607 /*recover pointers: */ 1608 inputs=(ParameterInputs*)vinputs; 1609 1652 1610 /* Get node coordinates and dof list: */ 1653 1611 GetElementNodeData( &xyz_list[0][0], nodes, numgrids); … … 1658 1616 1659 1617 /* recover input parameters: */ 1660 basal_drag_param=ParameterInputsRecover(inputs,"drag");1661 bed_param=ParameterInputsRecover(inputs,"bed");1662 thickness_param=ParameterInputsRecover(inputs,"thickness");1618 inputs->Recover("drag",&k[0],1,dofs,numgrids,(void**)nodes); 1619 inputs->Recover("bed",&b[0],1,dofs,numgrids,(void**)nodes); 1620 inputs->Recover("thickness",&h[0],1,dofs,numgrids,(void**)nodes); 1663 1621 1664 1622 /*Initialize parameter lists: */ … … 1670 1628 adjx_list[i]=adjoint[doflist[i*numberofdofspernode+0]]; 1671 1629 adjy_list[i]=adjoint[doflist[i*numberofdofspernode+1]]; 1672 if(basal_drag_param){1673 K_list[i]=basal_drag_param[doflist[i*numberofdofspernode+0]];1674 }1675 else{1676 K_list[i]=k[i];1677 }1678 if(bed_param){1679 bed_list[i]=bed_param[doflist[i*numberofdofspernode+0]];1680 }1681 else{1682 bed_list[i]=b[i];1683 }1684 if(thickness_param){1685 thickness_list[i]=thickness_param[doflist[i*numberofdofspernode+0]];1686 }1687 else{1688 thickness_list[i]=h[i];1689 }1690 1630 } 1691 1631 … … 1723 1663 friction->rho_ice=matpar->GetRhoIce(); 1724 1664 friction->rho_water=matpar->GetRhoWater(); 1725 friction->K=& K_list[0];1726 friction->bed=&b ed_list[0];1727 friction->thickness=& thickness_list[0];1665 friction->K=&k[0]; 1666 friction->bed=&b[0]; 1667 friction->thickness=&h[0]; 1728 1668 friction->velocities=&vxvy_list[0][0]; 1729 1669 friction->p=p; … … 1746 1686 /*Recover alpha_complement and k: */ 1747 1687 GetParameterValue(&alpha_complement, &alpha_complement_list[0],gauss_l1l2l3); 1748 GetParameterValue(&drag, & K_list[0],gauss_l1l2l3);1688 GetParameterValue(&drag, &k[0],gauss_l1l2l3); 1749 1689 #ifdef _DEBUG_ 1750 1690 printf("Drag complement: %20.20lf Drag: %20.20lf\n",alpha_complement,drag); … … 1796 1736 #undef __FUNCT__ 1797 1737 #define __FUNCT__ "Tria::GradjB" 1798 void Tria::GradjB(Vec grad_g,double* velocity,double* adjoint, ParameterInputs*inputs,int analysis_type){1738 void Tria::GradjB(Vec grad_g,double* velocity,double* adjoint,void* vinputs,int analysis_type){ 1799 1739 1800 1740 int i; … … 1802 1742 /* node data: */ 1803 1743 const int numgrids=3; 1804 const int numdofs=2*numgrids; 1805 const int NDOF2=2; 1744 const int NDOF1=1; 1745 const int NDOF2=1; 1746 const int numdofs=NDOF1*numgrids; 1806 1747 double xyz_list[numgrids][3]; 1807 1748 int doflist[numdofs]; … … 1814 1755 double adjx_list[numgrids]; 1815 1756 double adjy_list[numgrids]; 1816 1817 double* thickness_param=NULL;1818 double thickness_list[numgrids];1819 1757 1820 1758 /* gaussian points: */ … … 1850 1788 double lambda,mu; 1851 1789 double thickness; 1852 1790 int dofs[1]={0}; 1791 1792 ParameterInputs* inputs=NULL; 1793 1794 /*recover pointers: */ 1795 inputs=(ParameterInputs*)vinputs; 1853 1796 1854 1797 /* Get node coordinates and dof list: */ … … 1860 1803 1861 1804 /* recover input parameters: */ 1862 thickness_param=ParameterInputsRecover(inputs,"thickness");1805 inputs->Recover("thickness",&h[0],1,dofs,numgrids,(void**)nodes); 1863 1806 1864 1807 /*Initialize parameter lists: */ … … 1870 1813 adjx_list[i]=adjoint[doflist[i*numberofdofspernode+0]]; 1871 1814 adjy_list[i]=adjoint[doflist[i*numberofdofspernode+1]]; 1872 if(thickness_param){1873 thickness_list[i]=thickness_param[doflist[i*numberofdofspernode+0]];1874 }1875 else{1876 thickness_list[i]=h[i];1877 }1878 1815 } 1879 1816 … … 1940 1877 #undef __FUNCT__ 1941 1878 #define __FUNCT__ "Tria::Misfit" 1942 double Tria::Misfit(double* velocity,double* obs_velocity, ParameterInputs*inputs,int analysis_type){1879 double Tria::Misfit(double* velocity,double* obs_velocity,void* vinputs,int analysis_type){ 1943 1880 int i; 1944 1881 … … 1979 1916 double scalex=1; 1980 1917 double scaley=1; 1981 double* fit_param=NULL;1982 1918 double fit=-1; 1919 1920 ParameterInputs* inputs=NULL; 1921 1922 /*recover pointers: */ 1923 inputs=(ParameterInputs*)vinputs; 1983 1924 1984 1925 /* Get node coordinates and dof list: */ … … 1987 1928 1988 1929 /* Recover input data: */ 1989 fit_param=ParameterInputsRecover(inputs,"fit"); 1990 if(fit_param){ 1991 fit=*fit_param; 1992 } 1993 else ErrorException(__FUNCT__," missing fit input parameter"); 1930 if(!inputs->Recover("fit",&fit)) throw ErrorException(__FUNCT__," missing fit input parameter"); 1994 1931 1995 1932 /*Initialize velocities: */ … … 2102 2039 2103 2040 2041 2042 #undef __FUNCT__ 2043 #define __FUNCT__ "Tria::CreateKMatrixDiagnosticBaseVert" 2044 void Tria::CreateKMatrixDiagnosticBaseVert(Mat Kgg,void* vinputs,int analysis_type){ 2045 2046 int i,j; 2047 2048 /* node data: */ 2049 const int numgrids=3; 2050 const int NDOF1=1; 2051 const int numdofs=NDOF1*numgrids; 2052 double xyz_list[numgrids][3]; 2053 int doflist[numdofs]; 2054 int numberofdofspernode; 2055 2056 /* gaussian points: */ 2057 int num_gauss,ig; 2058 double* first_gauss_area_coord = NULL; 2059 double* second_gauss_area_coord = NULL; 2060 double* third_gauss_area_coord = NULL; 2061 double* gauss_weights = NULL; 2062 double gauss_weight; 2063 double gauss_l1l2l3[3]; 2064 2065 2066 /* matrices: */ 2067 double L[1][3]; 2068 double DL_scalar; 2069 2070 double Ke_gg[3][3]; //stiffness matrix 2071 double Ke_gg_gaussian[3][3]; //stiffness matrix evaluated at the gaussian point. 2072 double Jdet; 2073 2074 ParameterInputs* inputs=NULL; 2075 2076 /*recover pointers: */ 2077 inputs=(ParameterInputs*)vinputs; 2078 2079 /* Get node coordinates and dof list: */ 2080 GetElementNodeData( &xyz_list[0][0], nodes, numgrids); 2081 GetDofList(&doflist[0],&numberofdofspernode); 2082 2083 /* Set Ke_gg to 0: */ 2084 for(i=0;i<numdofs;i++) for(j=0;j<numdofs;j++) Ke_gg[i][j]=0.0; 2085 2086 /* Get gaussian points and weights (make this a statically initialized list of points? fstd): */ 2087 GaussTria( &num_gauss, &first_gauss_area_coord, &second_gauss_area_coord, &third_gauss_area_coord, &gauss_weights, 2); 2088 2089 /* Start looping on the number of gaussian points: */ 2090 for (ig=0; ig<num_gauss; ig++){ 2091 /*Pick up the gaussian point: */ 2092 gauss_weight=*(gauss_weights+ig); 2093 gauss_l1l2l3[0]=*(first_gauss_area_coord+ig); 2094 gauss_l1l2l3[1]=*(second_gauss_area_coord+ig); 2095 gauss_l1l2l3[2]=*(third_gauss_area_coord+ig); 2096 2097 /* Get Jacobian determinant: */ 2098 GetJacobianDeterminant(&Jdet, &xyz_list[0][0],gauss_l1l2l3); 2099 2100 //Get L matrix if viscous basal drag present: 2101 GetL(&L[0][0], &xyz_list[0][0], gauss_l1l2l3,NDOF1); 2102 2103 DL_scalar=gauss_weight*Jdet; 2104 2105 /* Do the triple producte tL*D*L: */ 2106 TripleMultiply( &L[0][0],1,3,1, 2107 &DL_scalar,1,1,0, 2108 &L[0][0],1,3,0, 2109 &Ke_gg_gaussian[0][0],0); 2110 2111 2112 /* Add the Ke_gg_gaussian, and optionally Ke_gg_drag_gaussian onto Ke_gg: */ 2113 for( i=0; i<numdofs; i++) for(j=0;j<numdofs;j++) Ke_gg[i][j]+=Ke_gg_gaussian[i][j]; 2114 } //for (ig=0; ig<num_gauss; ig++ 2115 2116 /*Add Ke_gg to global matrix Kgg: */ 2117 MatSetValues(Kgg,numdofs,doflist,numdofs,doflist,(const double*)Ke_gg,ADD_VALUES); 2118 2119 cleanup_and_return: 2120 xfree((void**)&first_gauss_area_coord); 2121 xfree((void**)&second_gauss_area_coord); 2122 xfree((void**)&third_gauss_area_coord); 2123 xfree((void**)&gauss_weights); 2124 } 2125 2104 2126 #undef __FUNCT__ 2105 2127 #define __FUNCT__ "Tria::CreateKMatrixDiagnosticSurfaceVert" 2106 void Tria::CreateKMatrixDiagnosticSurfaceVert(Mat Kgg, ParameterInputs*inputs,int analysis_type){2128 void Tria::CreateKMatrixDiagnosticSurfaceVert(Mat Kgg,void* vinputs,int analysis_type){ 2107 2129 2108 2130 int i,j; … … 2144 2166 double Ke_gg[numdofs][numdofs]; //local element stiffness matrix 2145 2167 double Ke_gg_gaussian[numdofs][numdofs]; //stiffness matrix evaluated at the gaussian point. 2168 2169 ParameterInputs* inputs=NULL; 2170 2171 /*recover pointers: */ 2172 inputs=(ParameterInputs*)vinputs; 2146 2173 2147 2174 /* Get node coordinates and dof list: */ … … 2227 2254 #undef __FUNCT__ 2228 2255 #define __FUNCT__ "Tria::CreatePVectorDiagnosticBaseVert" 2229 void Tria::CreatePVectorDiagnosticBaseVert(Vec pg, ParameterInputs*inputs,int analysis_type){2256 void Tria::CreatePVectorDiagnosticBaseVert(Vec pg,void* vinputs,int analysis_type){ 2230 2257 2231 2258 int i,j; … … 2263 2290 /*input parameters for structural analysis (diagnostic): */ 2264 2291 double* velocity_param=NULL; 2265 double vx_list[numgrids] ;2266 double vy_list[numgrids] ;2292 double vx_list[numgrids]={0,0,0}; 2293 double vy_list[numgrids]={0,0,0}; 2267 2294 double vx,vy; 2268 2295 double meltingvalue; 2269 2296 double slope[2]; 2270 2297 double dbdx,dbdy; 2298 int dofs1[1]={0}; 2299 int dofs2[1]={1}; 2300 2301 ParameterInputs* inputs=NULL; 2302 2303 /*recover pointers: */ 2304 inputs=(ParameterInputs*)vinputs; 2271 2305 2272 2306 /* recover input parameters: */ 2273 velocity_param=ParameterInputsRecover(inputs,"velocity");2274 if(!velocity_param)throw ErrorException(__FUNCT__," cannot compute vertical velocity without horizontal velocity");2307 if(!inputs->Recover("velocity",&vx_list[0],1,dofs1,numgrids,(void**)nodes))throw ErrorException(__FUNCT__," cannot compute vertical velocity without horizontal velocity"); 2308 inputs->Recover("velocity",&vy_list[0],1,dofs2,numgrids,(void**)nodes); 2275 2309 2276 2310 /* Get node coordinates and dof list: */ … … 2281 2315 for(i=0;i<numdofs;i++) pe_g[i]=0.0; 2282 2316 2283 /*Initialize vx_list and vy_list: */2284 for(i=0;i<numgrids;i++){2285 if(velocity_param){2286 /*doflist is a list of dofs for the node. We have 1 dof per node for the vertical analysis. But the horizontal velocity2287 *runs with 2 dofs per node! Therefore, we multiply by 2 the dof count, to extract the velocity from the inputs: */2288 vx_list[i]=velocity_param[2*doflist[i*numberofdofspernode+0]+0];2289 vy_list[i]=velocity_param[2*doflist[i*numberofdofspernode+0]+1];2290 }2291 else{2292 vx_list[i]=0;2293 vy_list[i]=0;2294 }2295 }2296 2297 2317 /* Get gaussian points and weights (make this a statically initialized list of points? fstd): */ 2298 2318 GaussTria( &num_gauss, &first_gauss_area_coord, &second_gauss_area_coord, &third_gauss_area_coord, &gauss_weights, 2);
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/trac/issm/chrome/common/trac_banner.png)