Changeset 21341 for issm/trunk/src/c/classes/Elements/Penta.cpp
- Timestamp:
- 11/04/16 13:48:43 (8 years ago)
- Location:
- issm/trunk
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk
-
issm/trunk/src
- Property svn:mergeinfo changed
-
issm/trunk/src/c
- Property svn:ignore
-
issm/trunk/src/c/classes/Elements/Penta.cpp
r20500 r21341 30 30 31 31 /*Checks in debugging mode*/ 32 _assert_(iomodel->Data( MeshUpperelementsEnum));33 _assert_(iomodel->Data( MeshLowerelementsEnum));32 _assert_(iomodel->Data("md.mesh.upperelements")); 33 _assert_(iomodel->Data("md.mesh.lowerelements")); 34 34 35 35 /*id: */ … … 38 38 39 39 /*Build neighbors list*/ 40 if (xIsNan<IssmDouble>(iomodel->Data( MeshUpperelementsEnum)[index]) || iomodel->Data(MeshUpperelementsEnum)[index]==-1.) penta_elements_ids[1]=this->id; //upper penta is the same penta41 else penta_elements_ids[1]=reCast<int,IssmDouble>((iomodel->Data( MeshUpperelementsEnum)[index]));42 if (xIsNan<IssmDouble>(iomodel->Data( MeshLowerelementsEnum)[index]) || iomodel->Data(MeshLowerelementsEnum)[index]==-1.) penta_elements_ids[0]=this->id; //lower penta is the same penta43 else penta_elements_ids[0]=reCast<int,IssmDouble>((iomodel->Data( MeshLowerelementsEnum)[index]));40 if (xIsNan<IssmDouble>(iomodel->Data("md.mesh.upperelements")[index]) || iomodel->Data("md.mesh.upperelements")[index]==-1.) penta_elements_ids[1]=this->id; //upper penta is the same penta 41 else penta_elements_ids[1]=reCast<int,IssmDouble>((iomodel->Data("md.mesh.upperelements")[index])); 42 if (xIsNan<IssmDouble>(iomodel->Data("md.mesh.lowerelements")[index]) || iomodel->Data("md.mesh.lowerelements")[index]==-1.) penta_elements_ids[0]=this->id; //lower penta is the same penta 43 else penta_elements_ids[0]=reCast<int,IssmDouble>((iomodel->Data("md.mesh.lowerelements")[index])); 44 44 this->InitHookNeighbors(penta_elements_ids); 45 45 … … 289 289 /*Compute strain rate viscosity and pressure: */ 290 290 this->StrainRateFS(&epsilon[0],&xyz_list[0][0],gauss,vx_input,vy_input,vz_input); 291 this-> ViscosityFS(&viscosity,3,&xyz_list[0][0],gauss,vx_input,vy_input,vz_input);291 this->material->ViscosityFS(&viscosity,3,&xyz_list[0][0],gauss,vx_input,vy_input,vz_input); 292 292 pressure_input->GetInputValue(&pressure,gauss); 293 293 … … 329 329 IssmDouble tau_xz[NUMVERTICES]; 330 330 IssmDouble tau_yz[NUMVERTICES]; 331 IssmDouble tau_eff[NUMVERTICES]; 331 332 GaussPenta* gauss=NULL; 332 333 … … 346 347 /*Compute strain rate viscosity and pressure: */ 347 348 this->StrainRateFS(&epsilon[0],&xyz_list[0][0],gauss,vx_input,vy_input,vz_input); 348 this-> ViscosityFS(&viscosity,3,&xyz_list[0][0],gauss,vx_input,vy_input,vz_input);349 this->material->ViscosityFS(&viscosity,3,&xyz_list[0][0],gauss,vx_input,vy_input,vz_input); 349 350 350 351 /*Compute Stress*/ … … 355 356 tau_xz[iv]=2*viscosity*epsilon[4]; 356 357 tau_yz[iv]=2*viscosity*epsilon[5]; 358 359 tau_eff[iv] = tau_xx[iv]*tau_xx[iv] + tau_yy[iv]*tau_yy[iv] + tau_zz[iv]*tau_zz[iv] + 360 2*tau_xy[iv]*tau_xy[iv] + 2*tau_xz[iv]*tau_xz[iv] + 2*tau_yz[iv]*tau_yz[iv]; 361 362 tau_eff[iv] = sqrt(tau_eff[iv]/2.); 357 363 } 358 364 … … 364 370 this->inputs->AddInput(new PentaInput(DeviatoricStressyzEnum,&tau_yz[0],P1Enum)); 365 371 this->inputs->AddInput(new PentaInput(DeviatoricStresszzEnum,&tau_zz[0],P1Enum)); 372 this->inputs->AddInput(new PentaInput(DeviatoricStresseffectiveEnum,&tau_eff[0],P1Enum)); 366 373 367 374 /*Clean up and return*/ … … 398 405 /*Compute strain rate viscosity and pressure: */ 399 406 this->StrainRateFS(&epsilon[0],&xyz_list[0][0],gauss,vx_input,vy_input,vz_input); 400 this-> ViscosityFS(&viscosity,3,&xyz_list[0][0],gauss,vx_input,vy_input,vz_input);407 this->material->ViscosityFS(&viscosity,3,&xyz_list[0][0],gauss,vx_input,vy_input,vz_input); 401 408 pressure_input->GetInputValue(&pressure,gauss); 402 409 … … 640 647 /*Check for basal force only if grounded and touching GL*/ 641 648 this->StrainRateFS(&epsilon[0],xyz_list,gauss,vx_input,vy_input,vz_input); 642 this-> ViscosityFS(&viscosity,3,xyz_list,gauss,vx_input,vy_input,vz_input);649 this->material->ViscosityFS(&viscosity,3,xyz_list,gauss,vx_input,vy_input,vz_input); 643 650 pressure_input->GetInputValue(&pressure, gauss); 644 651 base_input->GetInputValue(&base, gauss); _assert_(base<0.); … … 1073 1080 1074 1081 /*Get out if this is not an element input*/ 1075 if(!IsInput(control_enum)) return;1082 if(!IsInput(control_enum)) _error_("Enum "<<EnumToStringx(control_enum)<<" is not in IsInput"); 1076 1083 1077 1084 /*Prepare index list*/ … … 1396 1403 IssmDouble yts; 1397 1404 bool control_analysis; 1405 char** controls = NULL; 1398 1406 int num_control_type,num_responses; 1399 1407 1400 1408 /*Fetch parameters: */ 1401 iomodel-> Constant(&yts,ConstantsYtsEnum);1402 iomodel-> Constant(&control_analysis,InversionIscontrolEnum);1403 if(control_analysis) iomodel-> Constant(&num_control_type,InversionNumControlParametersEnum);1404 if(control_analysis) iomodel-> Constant(&num_responses,InversionNumCostFunctionsEnum);1409 iomodel->FindConstant(&yts,"md.constants.yts"); 1410 iomodel->FindConstant(&control_analysis,"md.inversion.iscontrol"); 1411 if(control_analysis) iomodel->FindConstant(&num_control_type,"md.inversion.num_control_parameters"); 1412 if(control_analysis) iomodel->FindConstant(&num_responses,"md.inversion.num_cost_functions"); 1405 1413 1406 1414 /*Recover vertices ids needed to initialize inputs*/ … … 1411 1419 1412 1420 /*Control Inputs*/ 1413 if (control_analysis && iomodel->Data(InversionControlParametersEnum)){ 1421 if (control_analysis){ 1422 iomodel->FindConstant(&controls,NULL,"md.inversion.control_parameters"); 1414 1423 for(i=0;i<num_control_type;i++){ 1415 int control = reCast<int>(iomodel->Data(InversionControlParametersEnum)[i]); 1424 _assert_(controls[i]); 1425 int control = StringToEnumx(controls[i]); 1416 1426 switch(control){ 1417 /*yts conversion*/1418 1427 case BalancethicknessThickeningRateEnum: 1419 case VxEnum: 1420 case VyEnum: 1421 if(iomodel->Data(control)){ 1422 for(j=0;j<NUMVERTICES;j++)nodeinputs[j]=iomodel->Data(control)[penta_vertex_ids[j]-1]; 1423 for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[(penta_vertex_ids[j]-1)*num_control_type+i]/yts; 1424 for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[(penta_vertex_ids[j]-1)*num_control_type+i]/yts; 1425 this->inputs->AddInput(new ControlInput(control,PentaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1)); 1428 if (iomodel->Data("md.balancethickness.thickening_rate")){ 1429 for(j=0;j<NUMVERTICES;j++)nodeinputs[j]=iomodel->Data("md.balancethickness.thickening_rate")[penta_vertex_ids[j]-1]; 1430 for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(penta_vertex_ids[j]-1)*num_control_type+i]/yts; 1431 for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(penta_vertex_ids[j]-1)*num_control_type+i]/yts; 1432 this->inputs->AddInput(new ControlInput(BalancethicknessThickeningRateEnum,PentaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1)); 1426 1433 } 1427 1434 break; 1428 1429 /*No yts conversion*/ 1430 case ThicknessEnum: 1431 case FrictionCoefficientEnum: 1432 case FrictionAsEnum: 1433 case MaterialsRheologyBEnum: 1434 if(iomodel->Data(control)){ 1435 for(j=0;j<NUMVERTICES;j++)nodeinputs[j]=iomodel->Data(control)[penta_vertex_ids[j]-1]; 1436 for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[(penta_vertex_ids[j]-1)*num_control_type+i]; 1437 for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[(penta_vertex_ids[j]-1)*num_control_type+i]; 1438 this->inputs->AddInput(new ControlInput(control,PentaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1)); 1435 case VxEnum: 1436 if (iomodel->Data("md.initialization.vx")){ 1437 for(j=0;j<NUMVERTICES;j++)nodeinputs[j]=iomodel->Data("md.initialization.vx")[penta_vertex_ids[j]-1]; 1438 for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(penta_vertex_ids[j]-1)*num_control_type+i]/yts; 1439 for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(penta_vertex_ids[j]-1)*num_control_type+i]/yts; 1440 this->inputs->AddInput(new ControlInput(VxEnum,PentaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1)); 1439 1441 } 1440 1442 break; 1441 1442 /*Special cases (depth averaged quantities)*/ 1443 case VyEnum: 1444 if (iomodel->Data("md.initialization.vy")){ 1445 for(j=0;j<NUMVERTICES;j++)nodeinputs[j]=iomodel->Data("md.initialization.vy")[penta_vertex_ids[j]-1]; 1446 for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(penta_vertex_ids[j]-1)*num_control_type+i]/yts; 1447 for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(penta_vertex_ids[j]-1)*num_control_type+i]/yts; 1448 this->inputs->AddInput(new ControlInput(VyEnum,PentaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1)); 1449 } 1450 break; 1451 case FrictionCoefficientEnum: 1452 if (iomodel->Data("md.friction.coefficient")){ 1453 for(j=0;j<NUMVERTICES;j++)nodeinputs[j]=iomodel->Data("md.friction.coefficient")[penta_vertex_ids[j]-1]; 1454 for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(penta_vertex_ids[j]-1)*num_control_type+i]; 1455 for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(penta_vertex_ids[j]-1)*num_control_type+i]; 1456 this->inputs->AddInput(new ControlInput(FrictionCoefficientEnum,PentaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1)); 1457 } 1458 break; 1443 1459 case MaterialsRheologyBbarEnum: 1444 if(iomodel->Data( MaterialsRheologyBEnum)){1445 for(j=0;j<NUMVERTICES;j++) nodeinputs[j]=iomodel->Data( MaterialsRheologyBEnum)[penta_vertex_ids[j]-1];1446 for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data( InversionMinParametersEnum)[(penta_vertex_ids[j]-1)*num_control_type+i];1447 for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data( InversionMaxParametersEnum)[(penta_vertex_ids[j]-1)*num_control_type+i];1460 if(iomodel->Data("md.materials.rheology_B")){ 1461 for(j=0;j<NUMVERTICES;j++) nodeinputs[j]=iomodel->Data("md.materials.rheology_B")[penta_vertex_ids[j]-1]; 1462 for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(penta_vertex_ids[j]-1)*num_control_type+i]; 1463 for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(penta_vertex_ids[j]-1)*num_control_type+i]; 1448 1464 this->inputs->AddInput(new ControlInput(MaterialsRheologyBEnum,PentaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1)); 1449 1465 } 1450 1466 break; 1451 1467 case DamageDbarEnum: 1452 if(iomodel->Data( DamageDEnum)){1453 for(j=0;j<NUMVERTICES;j++) nodeinputs[j]=iomodel->Data( DamageDEnum)[penta_vertex_ids[j]-1];1454 for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data( InversionMinParametersEnum)[(penta_vertex_ids[j]-1)*num_control_type+i];1455 for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data( InversionMaxParametersEnum)[(penta_vertex_ids[j]-1)*num_control_type+i];1468 if(iomodel->Data("md.damage.D")){ 1469 for(j=0;j<NUMVERTICES;j++) nodeinputs[j]=iomodel->Data("md.damage.D")[penta_vertex_ids[j]-1]; 1470 for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(penta_vertex_ids[j]-1)*num_control_type+i]; 1471 for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(penta_vertex_ids[j]-1)*num_control_type+i]; 1456 1472 this->inputs->AddInput(new ControlInput(DamageDEnum,PentaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1)); 1457 1473 } … … 1461 1477 } 1462 1478 } 1479 for(i=0;i<num_control_type;i++) xDelete<char>(controls[i]); 1480 xDelete<char*>(controls); 1463 1481 } 1464 1482 1465 1483 /*Need to know the type of approximation for this element*/ 1466 if(iomodel->Data( FlowequationElementEquationEnum)){1467 this->inputs->AddInput(new IntInput(ApproximationEnum, reCast<int>(iomodel->Data(FlowequationElementEquationEnum)[index])));1484 if(iomodel->Data("md.flowequation.element_equation")){ 1485 this->inputs->AddInput(new IntInput(ApproximationEnum,IoCodeToEnumElementEquation(reCast<int>(iomodel->Data("md.flowequation.element_equation")[index])))); 1468 1486 } 1469 1487 1470 1488 /*DatasetInputs*/ 1471 if (control_analysis && iomodel->Data(InversionCostFunctionsCoefficientsEnum)) { 1489 if(control_analysis && iomodel->Data("md.inversion.cost_functions_coefficients")) { 1490 1491 /*Generate cost functions associated with the iomodel*/ 1492 char** cost_functions = NULL; 1493 int* cost_functions_enums = NULL; 1494 int num_cost_functions; 1495 1496 iomodel->FindConstant(&num_cost_functions,"md.inversion.num_cost_functions"); 1497 iomodel->FindConstant(&cost_functions,&num_cost_functions,"md.inversion.cost_functions"); 1498 if(num_cost_functions<1) _error_("No cost functions found"); 1499 cost_functions_enums=xNew<int>(num_cost_functions); 1500 for(j=0;j<num_cost_functions;j++){ cost_functions_enums[j]=StringToEnumx(cost_functions[j]); } 1472 1501 1473 1502 /*Create inputs and add to DataSetInput*/ 1474 1503 DatasetInput* datasetinput=new DatasetInput(InversionCostFunctionsCoefficientsEnum); 1475 1504 for(i=0;i<num_responses;i++){ 1476 for(j=0;j<NUMVERTICES;j++)nodeinputs[j]=iomodel->Data( InversionCostFunctionsCoefficientsEnum)[(penta_vertex_ids[j]-1)*num_responses+i];1477 datasetinput->AddInput(new PentaInput(InversionCostFunctionsCoefficientsEnum,nodeinputs,P1Enum), reCast<int>(iomodel->Data(InversionCostFunctionsEnum)[i]));1505 for(j=0;j<NUMVERTICES;j++)nodeinputs[j]=iomodel->Data("md.inversion.cost_functions_coefficients")[(penta_vertex_ids[j]-1)*num_responses+i]; 1506 datasetinput->AddInput(new PentaInput(InversionCostFunctionsCoefficientsEnum,nodeinputs,P1Enum),cost_functions_enums[i]); 1478 1507 } 1479 1508 1480 1509 /*Add datasetinput to element inputs*/ 1481 1510 this->inputs->AddInput(datasetinput); 1511 1512 /*Free resources*/ 1513 for(int j=0;j<num_cost_functions;j++) xDelete<char>(cost_functions[j]); 1514 xDelete<char*>(cost_functions); 1515 xDelete<int>(cost_functions_enums); 1482 1516 } 1483 1517 } … … 1499 1533 values[i]=solution[doflist[i]]; 1500 1534 if(xIsNan<IssmDouble>(values[i])) _error_("NaN found in solution vector"); 1535 if(xIsInf<IssmDouble>(values[i])) _error_("Inf found in solution vector"); 1501 1536 } 1502 1537 … … 1529 1564 values[i+numdof2d]=values[i]; 1530 1565 if(xIsNan<IssmDouble>(values[i])) _error_("NaN found in solution vector"); 1566 if(xIsInf<IssmDouble>(values[i])) _error_("Inf found in solution vector"); 1531 1567 } 1532 1568 … … 1555 1591 1556 1592 /*Check that name is an element input*/ 1557 if (!IsInput(name)) return;1593 if(!IsInput(name)) _error_("Enum "<<EnumToStringx(name)<<" is not in IsInput"); 1558 1594 1559 1595 switch(type){ … … 1582 1618 values[i]=vector[doflist[i]]; 1583 1619 if(xIsNan<IssmDouble>(values[i])) _error_("NaN found in solution vector"); 1620 if(xIsInf<IssmDouble>(values[i])) _error_("Inf found in solution vector"); 1584 1621 } 1585 1622 /*Add input to the element: */ … … 1594 1631 values[i]=vector[nodes[i]->Sid()]; 1595 1632 if(xIsNan<IssmDouble>(values[i])) _error_("NaN found in solution vector"); 1633 if(xIsInf<IssmDouble>(values[i])) _error_("Inf found in solution vector"); 1596 1634 } 1597 1635 /*Add input to the element: */ … … 2245 2283 _assert_(this->IsOnBase()); 2246 2284 2247 this->InputDepthAverageAtBase(MaterialsRheologyBEnum,MaterialsRheologyBbarEnum); 2248 if(this->material->IsDamage())this->InputDepthAverageAtBase(DamageDEnum,DamageDbarEnum); 2285 switch(this->material->ObjectEnum()){ 2286 case MaticeEnum: 2287 this->InputDepthAverageAtBase(MaterialsRheologyBEnum,MaterialsRheologyBbarEnum); 2288 if(this->material->IsDamage())this->InputDepthAverageAtBase(DamageDEnum,DamageDbarEnum); 2289 break; 2290 case MatestarEnum: 2291 this->InputDepthAverageAtBase(MaterialsRheologyKoEnum,MaterialsRheologyKobarEnum); 2292 this->InputDepthAverageAtBase(MaterialsRheologyEcEnum,MaterialsRheologyEcbarEnum); 2293 this->InputDepthAverageAtBase(MaterialsRheologyEsEnum,MaterialsRheologyEsbarEnum); 2294 break; 2295 default: 2296 _error_("not supported yet"); 2297 } 2249 2298 if(this->inputs->GetInput(VxEnum)) this->InputDepthAverageAtBase(VxEnum,VxAverageEnum); 2250 2299 if(this->inputs->GetInput(VyEnum)) this->InputDepthAverageAtBase(VyEnum,VyAverageEnum); … … 2252 2301 if(this->inputs->GetInput(CalvingrateyEnum)) this->InputDepthAverageAtBase(CalvingrateyEnum,CalvingrateyAverageEnum); 2253 2302 Tria* tria=(Tria*)SpawnTria(0,1,2); 2254 this->inputs->DeleteInput(MaterialsRheologyBbarEnum); 2255 this->inputs->DeleteInput(DamageDbarEnum); 2303 switch(this->material->ObjectEnum()){ 2304 case MaticeEnum: 2305 this->inputs->DeleteInput(MaterialsRheologyBbarEnum); 2306 this->inputs->DeleteInput(DamageDbarEnum); 2307 break; 2308 case MatestarEnum: 2309 break; 2310 default: 2311 _error_("not supported yet"); 2312 } 2256 2313 this->inputs->DeleteInput(VxAverageEnum); 2257 2314 this->inputs->DeleteInput(VyAverageEnum); … … 2680 2737 2681 2738 /*Fetch parameters: */ 2682 iomodel-> Constant(&yts,ConstantsYtsEnum);2683 iomodel-> Constant(&dakota_analysis,QmuIsdakotaEnum);2739 iomodel->FindConstant(&yts,"md.constants.yts"); 2740 iomodel->FindConstant(&dakota_analysis,"md.qmu.isdakota"); 2684 2741 2685 2742 /*Checks if debuging*/ … … 3034 3091 3035 3092 case StressbalanceAnalysisEnum: 3036 _assert_(iomodel->Data( FlowequationElementEquationEnum));3037 3038 if( *(iomodel->Data(FlowequationElementEquationEnum)+index)==HOFSApproximationEnum){3093 _assert_(iomodel->Data("md.flowequation.element_equation")); 3094 3095 if((IoCodeToEnumElementEquation(reCast<int>(iomodel->Data("md.flowequation.element_equation")[index])))==HOFSApproximationEnum){ 3039 3096 /*Create VzHO and VzFS Enums*/ 3040 if(iomodel->Data( VzEnum) && iomodel->Data(FlowequationBorderFSEnum)){3041 for(i=0;i<6;i++) nodeinputs[i]=iomodel->Data( VzEnum)[penta_vertex_ids[i]-1]*iomodel->Data(FlowequationBorderFSEnum)[penta_vertex_ids[i]-1];3097 if(iomodel->Data("md.initialization.vz") && iomodel->Data("md.flowequation.borderFS")){ 3098 for(i=0;i<6;i++) nodeinputs[i]=iomodel->Data("md.initialization.vz")[penta_vertex_ids[i]-1]*iomodel->Data("md.flowequation.borderFS")[penta_vertex_ids[i]-1]; 3042 3099 this->inputs->AddInput(new PentaInput(VzFSEnum,nodeinputs,P1Enum)); 3043 for(i=0;i<6;i++) nodeinputs[i]=iomodel->Data( VzEnum)[penta_vertex_ids[i]-1]*(1-iomodel->Data(FlowequationBorderFSEnum)[penta_vertex_ids[i]-1]);3100 for(i=0;i<6;i++) nodeinputs[i]=iomodel->Data("md.initialization.vz")[penta_vertex_ids[i]-1]*(1-iomodel->Data("md.flowequation.borderFS")[penta_vertex_ids[i]-1]); 3044 3101 this->inputs->AddInput(new PentaInput(VzHOEnum,nodeinputs,P1Enum)); 3045 3102 } … … 3050 3107 } 3051 3108 } 3052 if( *(iomodel->Data(FlowequationElementEquationEnum)+index)==SSAFSApproximationEnum){3109 if((IoCodeToEnumElementEquation(reCast<int>(iomodel->Data("md.flowequation.element_equation")[index])))==SSAFSApproximationEnum){ 3053 3110 /*Create VzSSA and VzFS Enums*/ 3054 if(iomodel->Data( VzEnum) && iomodel->Data(FlowequationBorderFSEnum)){3055 for(i=0;i<6;i++) nodeinputs[i]=iomodel->Data( VzEnum)[penta_vertex_ids[i]-1]*iomodel->Data(FlowequationBorderFSEnum)[penta_vertex_ids[i]-1];3111 if(iomodel->Data("md.initialization.vz") && iomodel->Data("md.flowequation.borderFS")){ 3112 for(i=0;i<6;i++) nodeinputs[i]=iomodel->Data("md.initialization.vz")[penta_vertex_ids[i]-1]*iomodel->Data("md.flowequation.borderFS")[penta_vertex_ids[i]-1]; 3056 3113 this->inputs->AddInput(new PentaInput(VzFSEnum,nodeinputs,P1Enum)); 3057 for(i=0;i<6;i++) nodeinputs[i]=iomodel->Data( VzEnum)[penta_vertex_ids[i]-1]*(1-iomodel->Data(FlowequationBorderFSEnum)[penta_vertex_ids[i]-1]);3114 for(i=0;i<6;i++) nodeinputs[i]=iomodel->Data("md.initialization.vz")[penta_vertex_ids[i]-1]*(1-iomodel->Data("md.flowequation.borderFS")[penta_vertex_ids[i]-1]); 3058 3115 this->inputs->AddInput(new PentaInput(VzSSAEnum,nodeinputs,P1Enum)); 3059 3116 } … … 3174 3231 _assert_(gauss->Enum()==GaussPentaEnum); 3175 3232 this->StrainRateFS(&epsilon[0],xyz_list,(GaussPenta*)gauss,vx_input,vy_input,vz_input); 3176 this-> ViscosityFS(&viscosity,3,xyz_list,(GaussPenta*)gauss,vx_input,vy_input,vz_input);3233 this->material->ViscosityFS(&viscosity,3,xyz_list,(GaussPenta*)gauss,vx_input,vy_input,vz_input); 3177 3234 GetPhi(&phi,&epsilon[0],viscosity); 3178 3235 … … 3345 3402 3346 3403 #ifdef _HAVE_DAKOTA_ 3404 void Penta::InputUpdateFromMatrixDakota(IssmDouble* matrix, int nrows, int ncols, int name, int type){/*{{{*/ 3405 3406 int i,t,row; 3407 IssmDouble time; 3408 TransientInput *transientinput = NULL; 3409 IssmDouble values[6]; 3410 3411 /*Check that name is an element input*/ 3412 if(!IsInput(name)) _error_("Enum "<<EnumToStringx(name)<<" is not in IsInput"); 3413 3414 switch(type){ 3415 3416 case VertexEnum: 3417 /*Create transient input: */ 3418 for(t=0;t<ncols;t++){ //ncols is the number of times 3419 3420 /*create input values: */ 3421 for(i=0;i<6;i++){ 3422 row=this->vertices[i]->Sid(); 3423 values[i]=matrix[ncols*row+t]; 3424 } 3425 3426 /*time:*/ 3427 time=matrix[(nrows-1)*ncols+t]; 3428 3429 if(t==0) transientinput=new TransientInput(name); 3430 transientinput->AddTimeInput(new PentaInput(name,values,P1Enum),time); 3431 transientinput->Configure(parameters); 3432 } 3433 this->inputs->AddInput(transientinput); 3434 break; 3435 3436 default: 3437 _error_("type " << type << " (" << EnumToStringx(type) << ") not implemented yet"); 3438 } 3439 3440 } 3441 /*}}}*/ 3347 3442 void Penta::InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type){/*{{{*/ 3348 3443 … … 3350 3445 3351 3446 /*Check that name is an element input*/ 3352 if (!IsInput(name)) return;3447 if(!IsInput(name)) _error_("Enum "<<EnumToStringx(name)<<" is not in IsInput"); 3353 3448 3354 3449 switch(type){ … … 3445 3540 } 3446 3541 /*}}}*/ 3447 void Penta::InputUpdateFromMatrixDakota(IssmDouble* matrix, int nrows, int ncols, int name, int type){/*{{{*/3448 3449 int i,t,row;3450 IssmDouble time;3451 TransientInput *transientinput = NULL;3452 IssmDouble values[6];3453 3454 /*Check that name is an element input*/3455 if (!IsInput(name)) return;3456 3457 switch(type){3458 3459 case VertexEnum:3460 /*Create transient input: */3461 for(t=0;t<ncols;t++){ //ncols is the number of times3462 3463 /*create input values: */3464 for(i=0;i<6;i++){3465 row=this->vertices[i]->Sid();3466 values[i]=matrix[ncols*row+t];3467 }3468 3469 /*time:*/3470 time=matrix[(nrows-1)*ncols+t];3471 3472 if(t==0) transientinput=new TransientInput(name);3473 transientinput->AddTimeInput(new PentaInput(name,values,P1Enum),time);3474 transientinput->Configure(parameters);3475 }3476 this->inputs->AddInput(transientinput);3477 break;3478 3479 default:3480 _error_("type " << type << " (" << EnumToStringx(type) << ") not implemented yet");3481 }3482 3483 }3484 /*}}}*/3485 3542 #endif
Note:
See TracChangeset
for help on using the changeset viewer.