Changeset 15417
- Timestamp:
- 07/03/13 15:43:42 (12 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 14 edited
- 2 moved
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/Makefile.am
r15372 r15417 533 533 ./classes/ElementResults/PentaP1ElementResult.h\ 534 534 ./classes/ElementResults/PentaP1ElementResult.cpp\ 535 ./classes/Inputs/Penta P1Input.h\536 ./classes/Inputs/Penta P1Input.cpp\535 ./classes/Inputs/PentaInput.h\ 536 ./classes/Inputs/PentaInput.cpp\ 537 537 ./classes/Elements/Penta.h\ 538 538 ./classes/Elements/Penta.cpp\ -
issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
r15407 r15417 182 182 if (!IsOnBed() || IsFloating()){ 183 183 //empty friction: 184 this->inputs->AddInput(new Penta P1Input(BasalFrictionEnum,&basalfriction[0]));184 this->inputs->AddInput(new PentaInput(BasalFrictionEnum,&basalfriction[0],P1Enum)); 185 185 return; 186 186 } … … 209 209 210 210 /*Create PentaVertex input, which will hold the basal friction:*/ 211 this->inputs->AddInput(new Penta P1Input(BasalFrictionEnum,&basalfriction[0]));211 this->inputs->AddInput(new PentaInput(BasalFrictionEnum,&basalfriction[0],P1Enum)); 212 212 213 213 /*Clean up and return*/ … … 354 354 355 355 /*Add Stress tensor components into inputs*/ 356 this->inputs->AddInput(new Penta P1Input(StressTensorxxEnum,&sigma_xx[0]));357 this->inputs->AddInput(new Penta P1Input(StressTensorxyEnum,&sigma_xy[0]));358 this->inputs->AddInput(new Penta P1Input(StressTensorxzEnum,&sigma_xz[0]));359 this->inputs->AddInput(new Penta P1Input(StressTensoryyEnum,&sigma_yy[0]));360 this->inputs->AddInput(new Penta P1Input(StressTensoryzEnum,&sigma_yz[0]));361 this->inputs->AddInput(new Penta P1Input(StressTensorzzEnum,&sigma_zz[0]));356 this->inputs->AddInput(new PentaInput(StressTensorxxEnum,&sigma_xx[0],P1Enum)); 357 this->inputs->AddInput(new PentaInput(StressTensorxyEnum,&sigma_xy[0],P1Enum)); 358 this->inputs->AddInput(new PentaInput(StressTensorxzEnum,&sigma_xz[0],P1Enum)); 359 this->inputs->AddInput(new PentaInput(StressTensoryyEnum,&sigma_yy[0],P1Enum)); 360 this->inputs->AddInput(new PentaInput(StressTensoryzEnum,&sigma_yz[0],P1Enum)); 361 this->inputs->AddInput(new PentaInput(StressTensorzzEnum,&sigma_zz[0],P1Enum)); 362 362 363 363 /*Clean up and return*/ … … 763 763 for (int imonth=0;imonth<12;imonth++) { 764 764 for(i=0;i<NUMVERTICES;i++) tmp[i]=monthlytemperatures[i][imonth]; 765 Penta P1Input* newmonthinput1 = new PentaP1Input(SurfaceforcingsMonthlytemperaturesEnum,&tmp[0]);765 PentaInput* newmonthinput1 = new PentaInput(SurfaceforcingsMonthlytemperaturesEnum,&tmp[0],P1Enum); 766 766 NewTemperatureInput->AddTimeInput(newmonthinput1,time+imonth/12.*yts); 767 767 768 768 for(i=0;i<NUMVERTICES;i++) tmp[i]=monthlyprec[i][imonth]; 769 Penta P1Input* newmonthinput2 = new PentaP1Input(SurfaceforcingsPrecipitationEnum,&tmp[0]);769 PentaInput* newmonthinput2 = new PentaInput(SurfaceforcingsPrecipitationEnum,&tmp[0],P1Enum); 770 770 NewPrecipitationInput->AddTimeInput(newmonthinput2,time+imonth/12.*yts); 771 771 } … … 1420 1420 1421 1421 /*create static input: */ 1422 this->inputs->AddInput(new Penta P1Input(vector_enum,nodeinputs));1422 this->inputs->AddInput(new PentaInput(vector_enum,nodeinputs,P1Enum)); 1423 1423 } 1424 1424 else if(M==numberofvertices+1){ … … 1436 1436 1437 1437 if(t==0)transientinput=new TransientInput(vector_enum); 1438 transientinput->AddTimeInput(new Penta P1Input(vector_enum,nodeinputs),time);1438 transientinput->AddTimeInput(new PentaInput(vector_enum,nodeinputs,P1Enum),time); 1439 1439 } 1440 1440 this->inputs->AddInput(transientinput); … … 1490 1490 1491 1491 /*OK, we are on bed. Initialize global inputs as 0*/ 1492 total_thickness_input =new Penta P1Input(ThicknessEnum,zeros_list);1492 total_thickness_input =new PentaInput(ThicknessEnum,zeros_list,P1Enum); 1493 1493 1494 1494 /*Now follow all the upper element from the base to the surface to integrate the input*/ … … 1508 1508 /*If first time, initialize total_integrated_input*/ 1509 1509 if (step==0){ 1510 if (original_input->ObjectEnum()==Penta P1InputEnum)1511 total_integrated_input=new Penta P1Input(average_enum_type,zeros_list);1510 if (original_input->ObjectEnum()==PentaInputEnum) 1511 total_integrated_input=new PentaInput(average_enum_type,zeros_list,P1Enum); 1512 1512 else if (original_input->ObjectEnum()==ControlInputEnum) 1513 total_integrated_input=new Penta P1Input(average_enum_type,zeros_list);1513 total_integrated_input=new PentaInput(average_enum_type,zeros_list,P1Enum); 1514 1514 else if (original_input->ObjectEnum()==DoubleInputEnum) 1515 1515 total_integrated_input=new DoubleInput(average_enum_type,0.0); … … 1524 1524 Helem_list[i+3]=Helem_list[i]; 1525 1525 } 1526 element_thickness_input=new Penta P1Input(ThicknessEnum,Helem_list);1526 element_thickness_input=new PentaInput(ThicknessEnum,Helem_list,P1Enum); 1527 1527 1528 1528 /*Step3: Vertically integrate A COPY of the original*/ … … 1752 1752 for(j=0;j<6;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[(penta_vertex_ids[j]-1)*num_control_type+i]/yts; 1753 1753 for(j=0;j<6;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[(penta_vertex_ids[j]-1)*num_control_type+i]/yts; 1754 this->inputs->AddInput(new ControlInput(BalancethicknessThickeningRateEnum,Penta P1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1));1754 this->inputs->AddInput(new ControlInput(BalancethicknessThickeningRateEnum,PentaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1)); 1755 1755 } 1756 1756 break; … … 1760 1760 for(j=0;j<6;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[(penta_vertex_ids[j]-1)*num_control_type+i]/yts; 1761 1761 for(j=0;j<6;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[(penta_vertex_ids[j]-1)*num_control_type+i]/yts; 1762 this->inputs->AddInput(new ControlInput(VxEnum,Penta P1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1));1762 this->inputs->AddInput(new ControlInput(VxEnum,PentaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1)); 1763 1763 } 1764 1764 break; … … 1768 1768 for(j=0;j<6;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[(penta_vertex_ids[j]-1)*num_control_type+i]/yts; 1769 1769 for(j=0;j<6;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[(penta_vertex_ids[j]-1)*num_control_type+i]/yts; 1770 this->inputs->AddInput(new ControlInput(VyEnum,Penta P1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1));1770 this->inputs->AddInput(new ControlInput(VyEnum,PentaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1)); 1771 1771 } 1772 1772 break; … … 1776 1776 for(j=0;j<6;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[(penta_vertex_ids[j]-1)*num_control_type+i]; 1777 1777 for(j=0;j<6;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[(penta_vertex_ids[j]-1)*num_control_type+i]; 1778 this->inputs->AddInput(new ControlInput(FrictionCoefficientEnum,Penta P1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1));1778 this->inputs->AddInput(new ControlInput(FrictionCoefficientEnum,PentaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1)); 1779 1779 } 1780 1780 break; … … 1830 1830 for(i=0;i<num_cm_responses;i++){ 1831 1831 for(j=0;j<6;j++)nodeinputs[j]=iomodel->Data(InversionCostFunctionsCoefficientsEnum)[(penta_vertex_ids[j]-1)*num_cm_responses+i]; 1832 datasetinput->inputs->AddObject(new Penta P1Input(InversionCostFunctionsCoefficientsEnum,nodeinputs));1832 datasetinput->inputs->AddObject(new PentaInput(InversionCostFunctionsCoefficientsEnum,nodeinputs,P1Enum)); 1833 1833 } 1834 1834 … … 1983 1983 for(;;){ 1984 1984 /*Add input to the element: */ 1985 penta->inputs->AddInput(new Penta P1Input(ThicknessEnum,newthickness));1986 penta->inputs->AddInput(new Penta P1Input(SurfaceEnum,newsurface));1987 penta->inputs->AddInput(new Penta P1Input(BedEnum,newbed));1985 penta->inputs->AddInput(new PentaInput(ThicknessEnum,newthickness,P1Enum)); 1986 penta->inputs->AddInput(new PentaInput(SurfaceEnum,newsurface,P1Enum)); 1987 penta->inputs->AddInput(new PentaInput(BedEnum,newbed,P1Enum)); 1988 1988 1989 1989 /*Stop if we have reached the surface*/ … … 2016 2016 2017 2017 /*Add input to the element: */ 2018 this->inputs->AddInput(new Penta P1Input(enum_type,values));2018 this->inputs->AddInput(new PentaInput(enum_type,values,P1Enum)); 2019 2019 2020 2020 /*Free ressources:*/ … … 2049 2049 for(;;){ 2050 2050 /*Add input to the element: */ 2051 penta->inputs->AddInput(new Penta P1Input(enum_type,values));2051 penta->inputs->AddInput(new PentaInput(enum_type,values,P1Enum)); 2052 2052 2053 2053 /*Stop if we have reached the surface*/ … … 2079 2079 /*update input*/ 2080 2080 if (name==MaterialsRheologyZEnum || name==MaterialsRheologyZbarEnum){ 2081 material->inputs->AddInput(new Penta P1Input(name,values));2081 material->inputs->AddInput(new PentaInput(name,values,P1Enum)); 2082 2082 } 2083 2083 else{ 2084 this->inputs->AddInput(new Penta P1Input(name,values));2084 this->inputs->AddInput(new PentaInput(name,values,P1Enum)); 2085 2085 } 2086 2086 return; … … 2092 2092 /*update input*/ 2093 2093 if (name==MaterialsRheologyZEnum || name==MaterialsRheologyZbarEnum){ 2094 material->inputs->AddInput(new Penta P1Input(name,values));2094 material->inputs->AddInput(new PentaInput(name,values,P1Enum)); 2095 2095 } 2096 2096 else{ 2097 this->inputs->AddInput(new Penta P1Input(name,values));2097 this->inputs->AddInput(new PentaInput(name,values,P1Enum)); 2098 2098 } 2099 2099 return; … … 2109 2109 } 2110 2110 /*Add input to the element: */ 2111 this->inputs->AddInput(new Penta P1Input(name,values));2111 this->inputs->AddInput(new PentaInput(name,values,P1Enum)); 2112 2112 2113 2113 /*Free ressources:*/ … … 2121 2121 } 2122 2122 /*Add input to the element: */ 2123 this->inputs->AddInput(new Penta P1Input(name,values));2123 this->inputs->AddInput(new PentaInput(name,values,P1Enum)); 2124 2124 2125 2125 /*Free ressources:*/ … … 2464 2464 2465 2465 /*Update inputs*/ 2466 this->inputs->AddInput(new Penta P1Input(SurfaceforcingsMassBalanceEnum,&agd[0]));2466 this->inputs->AddInput(new PentaInput(SurfaceforcingsMassBalanceEnum,&agd[0],P1Enum)); 2467 2467 //this->inputs->AddInput(new PentaVertexInput(ThermalSpcTemperatureEnum,&Tsurf[0])); 2468 2468 this->InputExtrude(SurfaceforcingsMassBalanceEnum,ElementEnum); … … 2800 2800 } //end of the loop over the vertices 2801 2801 /*Update inputs*/ 2802 this->inputs->AddInput(new Penta P1Input(SurfaceforcingsMassBalanceEnum,&smb[0]));2802 this->inputs->AddInput(new PentaInput(SurfaceforcingsMassBalanceEnum,&smb[0],P1Enum)); 2803 2803 } 2804 2804 /*}}}*/ … … 2974 2974 if(!iomodel->Data(VxEnum)){ 2975 2975 for(i=0;i<6;i++)nodeinputs[i]=0; 2976 this->inputs->AddInput(new Penta P1Input(VxEnum,nodeinputs));2977 if(dakota_analysis) this->inputs->AddInput(new Penta P1Input(QmuVxEnum,nodeinputs));2976 this->inputs->AddInput(new PentaInput(VxEnum,nodeinputs,P1Enum)); 2977 if(dakota_analysis) this->inputs->AddInput(new PentaInput(QmuVxEnum,nodeinputs,P1Enum)); 2978 2978 } 2979 2979 if(!iomodel->Data(VyEnum)){ 2980 2980 for(i=0;i<6;i++)nodeinputs[i]=0; 2981 this->inputs->AddInput(new Penta P1Input(VyEnum,nodeinputs));2982 if(dakota_analysis) this->inputs->AddInput(new Penta P1Input(QmuVyEnum,nodeinputs));2981 this->inputs->AddInput(new PentaInput(VyEnum,nodeinputs,P1Enum)); 2982 if(dakota_analysis) this->inputs->AddInput(new PentaInput(QmuVyEnum,nodeinputs,P1Enum)); 2983 2983 } 2984 2984 if(!iomodel->Data(VzEnum)){ 2985 2985 for(i=0;i<6;i++)nodeinputs[i]=0; 2986 this->inputs->AddInput(new Penta P1Input(VzEnum,nodeinputs));2987 if(dakota_analysis) this->inputs->AddInput(new Penta P1Input(QmuVzEnum,nodeinputs));2986 this->inputs->AddInput(new PentaInput(VzEnum,nodeinputs,P1Enum)); 2987 if(dakota_analysis) this->inputs->AddInput(new PentaInput(QmuVzEnum,nodeinputs,P1Enum)); 2988 2988 } 2989 2989 if(!iomodel->Data(PressureEnum)){ 2990 2990 for(i=0;i<6;i++)nodeinputs[i]=0; 2991 2991 if(dakota_analysis){ 2992 this->inputs->AddInput(new Penta P1Input(PressureEnum,nodeinputs));2993 this->inputs->AddInput(new Penta P1Input(QmuPressureEnum,nodeinputs));2992 this->inputs->AddInput(new PentaInput(PressureEnum,nodeinputs,P1Enum)); 2993 this->inputs->AddInput(new PentaInput(QmuPressureEnum,nodeinputs,P1Enum)); 2994 2994 } 2995 2995 if(isstokes){ 2996 this->inputs->AddInput(new Penta P1Input(PressureEnum,nodeinputs));2997 this->inputs->AddInput(new Penta P1Input(PressurePicardEnum,nodeinputs));2996 this->inputs->AddInput(new PentaInput(PressureEnum,nodeinputs,P1Enum)); 2997 this->inputs->AddInput(new PentaInput(PressurePicardEnum,nodeinputs,P1Enum)); 2998 2998 } 2999 2999 } … … 3002 3002 if(iomodel->Data(VzEnum) && iomodel->Data(FlowequationBorderstokesEnum)){ 3003 3003 for(i=0;i<6;i++) nodeinputs[i]=iomodel->Data(VzEnum)[penta_vertex_ids[i]-1]*iomodel->Data(FlowequationBorderstokesEnum)[penta_vertex_ids[i]-1]; 3004 this->inputs->AddInput(new Penta P1Input(VzStokesEnum,nodeinputs));3004 this->inputs->AddInput(new PentaInput(VzStokesEnum,nodeinputs,P1Enum)); 3005 3005 for(i=0;i<6;i++) nodeinputs[i]=iomodel->Data(VzEnum)[penta_vertex_ids[i]-1]*(1-iomodel->Data(FlowequationBorderstokesEnum)[penta_vertex_ids[i]-1]); 3006 this->inputs->AddInput(new Penta P1Input(VzPattynEnum,nodeinputs));3006 this->inputs->AddInput(new PentaInput(VzPattynEnum,nodeinputs,P1Enum)); 3007 3007 } 3008 3008 else{ 3009 3009 for(i=0;i<6;i++)nodeinputs[i]=0; 3010 this->inputs->AddInput(new Penta P1Input(VzStokesEnum,nodeinputs));3011 this->inputs->AddInput(new Penta P1Input(VzPattynEnum,nodeinputs));3010 this->inputs->AddInput(new PentaInput(VzStokesEnum,nodeinputs,P1Enum)); 3011 this->inputs->AddInput(new PentaInput(VzPattynEnum,nodeinputs,P1Enum)); 3012 3012 } 3013 3013 } … … 3016 3016 if(iomodel->Data(VzEnum) && iomodel->Data(FlowequationBorderstokesEnum)){ 3017 3017 for(i=0;i<6;i++) nodeinputs[i]=iomodel->Data(VzEnum)[penta_vertex_ids[i]-1]*iomodel->Data(FlowequationBorderstokesEnum)[penta_vertex_ids[i]-1]; 3018 this->inputs->AddInput(new Penta P1Input(VzStokesEnum,nodeinputs));3018 this->inputs->AddInput(new PentaInput(VzStokesEnum,nodeinputs,P1Enum)); 3019 3019 for(i=0;i<6;i++) nodeinputs[i]=iomodel->Data(VzEnum)[penta_vertex_ids[i]-1]*(1-iomodel->Data(FlowequationBorderstokesEnum)[penta_vertex_ids[i]-1]); 3020 this->inputs->AddInput(new Penta P1Input(VzMacAyealEnum,nodeinputs));3020 this->inputs->AddInput(new PentaInput(VzMacAyealEnum,nodeinputs,P1Enum)); 3021 3021 } 3022 3022 else{ 3023 3023 for(i=0;i<6;i++)nodeinputs[i]=0; 3024 this->inputs->AddInput(new Penta P1Input(VzStokesEnum,nodeinputs));3025 this->inputs->AddInput(new Penta P1Input(VzMacAyealEnum,nodeinputs));3024 this->inputs->AddInput(new PentaInput(VzStokesEnum,nodeinputs,P1Enum)); 3025 this->inputs->AddInput(new PentaInput(VzMacAyealEnum,nodeinputs,P1Enum)); 3026 3026 } 3027 3027 } … … 3031 3031 /*Initialize mesh velocity*/ 3032 3032 for(i=0;i<6;i++)nodeinputs[i]=0; 3033 this->inputs->AddInput(new Penta P1Input(VxMeshEnum,nodeinputs));3034 this->inputs->AddInput(new Penta P1Input(VyMeshEnum,nodeinputs));3035 this->inputs->AddInput(new Penta P1Input(VzMeshEnum,nodeinputs));3033 this->inputs->AddInput(new PentaInput(VxMeshEnum,nodeinputs,P1Enum)); 3034 this->inputs->AddInput(new PentaInput(VyMeshEnum,nodeinputs,P1Enum)); 3035 this->inputs->AddInput(new PentaInput(VzMeshEnum,nodeinputs,P1Enum)); 3036 3036 if(dakota_analysis){ 3037 this->inputs->AddInput(new Penta P1Input(QmuVxMeshEnum,nodeinputs));3038 this->inputs->AddInput(new Penta P1Input(QmuVyMeshEnum,nodeinputs));3039 this->inputs->AddInput(new Penta P1Input(QmuVzMeshEnum,nodeinputs));3037 this->inputs->AddInput(new PentaInput(QmuVxMeshEnum,nodeinputs,P1Enum)); 3038 this->inputs->AddInput(new PentaInput(QmuVyMeshEnum,nodeinputs,P1Enum)); 3039 this->inputs->AddInput(new PentaInput(QmuVzMeshEnum,nodeinputs,P1Enum)); 3040 3040 } 3041 3041 break; … … 3044 3044 /*Initialize mesh velocity*/ 3045 3045 for(i=0;i<6;i++)nodeinputs[i]=0; 3046 this->inputs->AddInput(new Penta P1Input(VxMeshEnum,nodeinputs));3047 this->inputs->AddInput(new Penta P1Input(VyMeshEnum,nodeinputs));3048 this->inputs->AddInput(new Penta P1Input(VzMeshEnum,nodeinputs));3046 this->inputs->AddInput(new PentaInput(VxMeshEnum,nodeinputs,P1Enum)); 3047 this->inputs->AddInput(new PentaInput(VyMeshEnum,nodeinputs,P1Enum)); 3048 this->inputs->AddInput(new PentaInput(VzMeshEnum,nodeinputs,P1Enum)); 3049 3049 if (iomodel->Data(TemperatureEnum) && iomodel->Data(WaterfractionEnum) && iomodel->Data(PressureEnum)) { 3050 3050 for(i=0;i<6;i++){ … … 3056 3056 +latentheat*iomodel->Data(WaterfractionEnum)[penta_vertex_ids[i]-1]; 3057 3057 } 3058 this->inputs->AddInput(new Penta P1Input(EnthalpyEnum,nodeinputs));3058 this->inputs->AddInput(new PentaInput(EnthalpyEnum,nodeinputs,P1Enum)); 3059 3059 } 3060 3060 else _error_("temperature and waterfraction required for the enthalpy solution"); … … 3114 3114 3115 3115 /*Create PentaVertex input, which will hold the basal friction:*/ 3116 this->inputs->AddInput(new Penta P1Input(ViscousHeatingEnum,&viscousheating[0]));3116 this->inputs->AddInput(new PentaInput(ViscousHeatingEnum,&viscousheating[0],P1Enum)); 3117 3117 3118 3118 /*Clean up and return*/ … … 4399 4399 this->inputs->GetInputValue(&converged,ConvergedEnum); 4400 4400 if(converged){ 4401 this->inputs->AddInput(new Penta P1Input(TemperatureEnum,values));4401 this->inputs->AddInput(new PentaInput(TemperatureEnum,values,P1Enum)); 4402 4402 4403 4403 /*Update Rheology only if converged (we must make sure that the temperature is below melting point … … 4411 4411 B_average=Paterson((values[0]+values[1]+values[2]+values[3]+values[4]+values[5])/6.0); 4412 4412 for(i=0;i<numdof;i++) B[i]=B_average; 4413 this->material->inputs->AddInput(new Penta P1Input(MaterialsRheologyBEnum,B));4413 this->material->inputs->AddInput(new PentaInput(MaterialsRheologyBEnum,B,P1Enum)); 4414 4414 break; 4415 4415 case ArrheniusEnum: … … 4419 4419 material->GetN()); 4420 4420 for(i=0;i<numdof;i++) B[i]=B_average; 4421 this->material->inputs->AddInput(new Penta P1Input(MaterialsRheologyBEnum,B));4421 this->material->inputs->AddInput(new PentaInput(MaterialsRheologyBEnum,B,P1Enum)); 4422 4422 break; 4423 4423 default: … … 4427 4427 } 4428 4428 else{ 4429 this->inputs->AddInput(new Penta P1Input(TemperaturePicardEnum,values));4429 this->inputs->AddInput(new PentaInput(TemperaturePicardEnum,values,P1Enum)); 4430 4430 } 4431 4431 … … 4475 4475 } 4476 4476 4477 this->inputs->AddInput(new Penta P1Input(EnthalpyEnum,values));4478 this->inputs->AddInput(new Penta P1Input(WaterfractionEnum,waterfraction));4479 this->inputs->AddInput(new Penta P1Input(TemperatureEnum,temperatures));4477 this->inputs->AddInput(new PentaInput(EnthalpyEnum,values,P1Enum)); 4478 this->inputs->AddInput(new PentaInput(WaterfractionEnum,waterfraction,P1Enum)); 4479 this->inputs->AddInput(new PentaInput(TemperatureEnum,temperatures,P1Enum)); 4480 4480 4481 4481 /*Update Rheology only if converged (we must make sure that the temperature is below melting point … … 4489 4489 B_average=Paterson((temperatures[0]+temperatures[1]+temperatures[2]+temperatures[3]+temperatures[4]+temperatures[5])/6.0); 4490 4490 for(i=0;i<numdof;i++) B[i]=B_average; 4491 this->material->inputs->AddInput(new Penta P1Input(MaterialsRheologyBEnum,B));4491 this->material->inputs->AddInput(new PentaInput(MaterialsRheologyBEnum,B,P1Enum)); 4492 4492 break; 4493 4493 case ArrheniusEnum: … … 4497 4497 material->GetN()); 4498 4498 for(i=0;i<numdof;i++) B[i]=B_average; 4499 this->material->inputs->AddInput(new Penta P1Input(MaterialsRheologyBEnum,B));4499 this->material->inputs->AddInput(new PentaInput(MaterialsRheologyBEnum,B,P1Enum)); 4500 4500 break; 4501 4501 default: … … 4505 4505 } 4506 4506 else{ 4507 this->inputs->AddInput(new Penta P1Input(EnthalpyPicardEnum,values));4507 this->inputs->AddInput(new PentaInput(EnthalpyPicardEnum,values,P1Enum)); 4508 4508 } 4509 4509 … … 4581 4581 GradientIndexing(&vertexpidlist[0],control_index); 4582 4582 for(int i=0;i<NUMVERTICES;i++) grad_list[i]=gradient[vertexpidlist[i]]; 4583 grad_input=new Penta P1Input(GradientEnum,grad_list);4583 grad_input=new PentaInput(GradientEnum,grad_list,P1Enum); 4584 4584 ((ControlInput*)input)->SetGradient(grad_input); 4585 4585 … … 5255 5255 5256 5256 /*Add vx and vy as inputs to the tria element: */ 5257 this->inputs->AddInput(new Penta P1Input(AdjointxEnum,lambdax));5258 this->inputs->AddInput(new Penta P1Input(AdjointyEnum,lambday));5259 this->inputs->AddInput(new Penta P1Input(AdjointzEnum,lambdaz));5260 this->inputs->AddInput(new Penta P1Input(AdjointpEnum,lambdap));5257 this->inputs->AddInput(new PentaInput(AdjointxEnum,lambdax,P1Enum)); 5258 this->inputs->AddInput(new PentaInput(AdjointyEnum,lambday,P1Enum)); 5259 this->inputs->AddInput(new PentaInput(AdjointzEnum,lambdaz,P1Enum)); 5260 this->inputs->AddInput(new PentaInput(AdjointpEnum,lambdap,P1Enum)); 5261 5261 5262 5262 /*Free ressources:*/ … … 5292 5292 5293 5293 /*Add vx and vy as inputs to the tria element: */ 5294 this->inputs->AddInput(new Penta P1Input(AdjointxEnum,lambdax));5295 this->inputs->AddInput(new Penta P1Input(AdjointyEnum,lambday));5294 this->inputs->AddInput(new PentaInput(AdjointxEnum,lambdax,P1Enum)); 5295 this->inputs->AddInput(new PentaInput(AdjointyEnum,lambday,P1Enum)); 5296 5296 5297 5297 /*Free ressources:*/ … … 5583 5583 values[i]=vector[vertexpidlist[i]]; 5584 5584 } 5585 new_input = new Penta P1Input(control_enum,values);5585 new_input = new PentaInput(control_enum,values,P1Enum); 5586 5586 5587 5587 if(control_enum==MaterialsRheologyBbarEnum){ … … 5614 5614 case VertexEnum: 5615 5615 5616 /*New Penta P1Input*/5616 /*New PentaInput*/ 5617 5617 IssmDouble values[6]; 5618 5618 … … 5687 5687 5688 5688 /*Add new inputs: */ 5689 this->inputs->AddInput(new Penta P1Input(ThicknessEnum,thickness));5690 this->inputs->AddInput(new Penta P1Input(BedEnum,bed));5691 this->inputs->AddInput(new Penta P1Input(SurfaceEnum,surface));5689 this->inputs->AddInput(new PentaInput(ThicknessEnum,thickness,P1Enum)); 5690 this->inputs->AddInput(new PentaInput(BedEnum,bed,P1Enum)); 5691 this->inputs->AddInput(new PentaInput(SurfaceEnum,surface,P1Enum)); 5692 5692 5693 5693 /*}}}*/ 5694 5694 break; 5695 5695 default: 5696 this->inputs->AddInput(new Penta P1Input(name,values));5696 this->inputs->AddInput(new PentaInput(name,values,P1Enum)); 5697 5697 } 5698 5698 break; … … 5747 5747 5748 5748 if(t==0) transientinput=new TransientInput(name); 5749 transientinput->AddTimeInput(new Penta P1Input(name,values),time);5749 transientinput->AddTimeInput(new PentaInput(name,values,P1Enum),time); 5750 5750 transientinput->Configure(parameters); 5751 5751 } … … 8439 8439 8440 8440 /*Add vx and vy as inputs to the tria element: */ 8441 penta->inputs->AddInput(new Penta P1Input(VxEnum,vx));8442 penta->inputs->AddInput(new Penta P1Input(VyEnum,vy));8443 penta->inputs->AddInput(new Penta P1Input(VelEnum,vel));8444 penta->inputs->AddInput(new Penta P1Input(PressureEnum,pressure));8441 penta->inputs->AddInput(new PentaInput(VxEnum,vx,P1Enum)); 8442 penta->inputs->AddInput(new PentaInput(VyEnum,vy,P1Enum)); 8443 penta->inputs->AddInput(new PentaInput(VelEnum,vel,P1Enum)); 8444 penta->inputs->AddInput(new PentaInput(PressureEnum,pressure,P1Enum)); 8445 8445 8446 8446 /*Stop if we have reached the surface*/ … … 8529 8529 8530 8530 /*Add vx and vy as inputs to the tria element: */ 8531 this->inputs->AddInput(new Penta P1Input(VxEnum,vx));8532 this->inputs->AddInput(new Penta P1Input(VyEnum,vy));8533 this->inputs->AddInput(new Penta P1Input(VelEnum,vel));8534 this->inputs->AddInput(new Penta P1Input(PressureEnum,pressure));8531 this->inputs->AddInput(new PentaInput(VxEnum,vx,P1Enum)); 8532 this->inputs->AddInput(new PentaInput(VyEnum,vy,P1Enum)); 8533 this->inputs->AddInput(new PentaInput(VelEnum,vel,P1Enum)); 8534 this->inputs->AddInput(new PentaInput(PressureEnum,pressure,P1Enum)); 8535 8535 8536 8536 /*Free ressources:*/ … … 8604 8604 Input* vzmacayeal_input=inputs->GetInput(VzMacAyealEnum); 8605 8605 if (vzmacayeal_input){ 8606 if (vzmacayeal_input->ObjectEnum()!=Penta P1InputEnum){8606 if (vzmacayeal_input->ObjectEnum()!=PentaInputEnum){ 8607 8607 _error_("Cannot compute Vel as VzMacAyeal is of type " << EnumToStringx(vzmacayeal_input->ObjectEnum())); 8608 8608 } … … 8627 8627 8628 8628 /*Add vx and vy as inputs to the tria element: */ 8629 this->inputs->AddInput(new Penta P1Input(VxEnum,vx));8630 this->inputs->AddInput(new Penta P1Input(VyEnum,vy));8631 this->inputs->AddInput(new Penta P1Input(VzEnum,vz));8632 this->inputs->AddInput(new Penta P1Input(VzStokesEnum,vzstokes));8633 this->inputs->AddInput(new Penta P1Input(VelEnum,vel));8634 this->inputs->AddInput(new Penta P1Input(PressureEnum,pressure));8629 this->inputs->AddInput(new PentaInput(VxEnum,vx,P1Enum)); 8630 this->inputs->AddInput(new PentaInput(VyEnum,vy,P1Enum)); 8631 this->inputs->AddInput(new PentaInput(VzEnum,vz,P1Enum)); 8632 this->inputs->AddInput(new PentaInput(VzStokesEnum,vzstokes,P1Enum)); 8633 this->inputs->AddInput(new PentaInput(VelEnum,vel,P1Enum)); 8634 this->inputs->AddInput(new PentaInput(PressureEnum,pressure,P1Enum)); 8635 8635 8636 8636 /*Free ressources:*/ … … 8704 8704 8705 8705 /*Add vx and vy as inputs to the tria element: */ 8706 penta->inputs->AddInput(new Penta P1Input(VxEnum,vx));8707 penta->inputs->AddInput(new Penta P1Input(VyEnum,vy));8708 penta->inputs->AddInput(new Penta P1Input(VelEnum,vel));8709 penta->inputs->AddInput(new Penta P1Input(PressureEnum,pressure));8706 penta->inputs->AddInput(new PentaInput(VxEnum,vx,P1Enum)); 8707 penta->inputs->AddInput(new PentaInput(VyEnum,vy,P1Enum)); 8708 penta->inputs->AddInput(new PentaInput(VelEnum,vel,P1Enum)); 8709 penta->inputs->AddInput(new PentaInput(PressureEnum,pressure,P1Enum)); 8710 8710 8711 8711 /*Stop if we have reached the surface*/ … … 8785 8785 8786 8786 /*Add vx and vy as inputs to the tria element: */ 8787 this->inputs->AddInput(new Penta P1Input(VxEnum,vx));8788 this->inputs->AddInput(new Penta P1Input(VyEnum,vy));8789 this->inputs->AddInput(new Penta P1Input(VelEnum,vel));8790 this->inputs->AddInput(new Penta P1Input(PressureEnum,pressure));8787 this->inputs->AddInput(new PentaInput(VxEnum,vx,P1Enum)); 8788 this->inputs->AddInput(new PentaInput(VyEnum,vy,P1Enum)); 8789 this->inputs->AddInput(new PentaInput(VelEnum,vel,P1Enum)); 8790 this->inputs->AddInput(new PentaInput(PressureEnum,pressure,P1Enum)); 8791 8791 8792 8792 /*Free ressources:*/ … … 8853 8853 Input* vzpattyn_input=inputs->GetInput(VzPattynEnum); 8854 8854 if (vzpattyn_input){ 8855 if (vzpattyn_input->ObjectEnum()!=Penta P1InputEnum){8855 if (vzpattyn_input->ObjectEnum()!=PentaInputEnum){ 8856 8856 _error_("Cannot compute Vel as VzPattyn is of type " << EnumToStringx(vzpattyn_input->ObjectEnum())); 8857 8857 } … … 8876 8876 8877 8877 /*Add vx and vy as inputs to the tria element: */ 8878 this->inputs->AddInput(new Penta P1Input(VxEnum,vx));8879 this->inputs->AddInput(new Penta P1Input(VyEnum,vy));8880 this->inputs->AddInput(new Penta P1Input(VzEnum,vz));8881 this->inputs->AddInput(new Penta P1Input(VzStokesEnum,vzstokes));8882 this->inputs->AddInput(new Penta P1Input(VelEnum,vel));8883 this->inputs->AddInput(new Penta P1Input(PressureEnum,pressure));8878 this->inputs->AddInput(new PentaInput(VxEnum,vx,P1Enum)); 8879 this->inputs->AddInput(new PentaInput(VyEnum,vy,P1Enum)); 8880 this->inputs->AddInput(new PentaInput(VzEnum,vz,P1Enum)); 8881 this->inputs->AddInput(new PentaInput(VzStokesEnum,vzstokes,P1Enum)); 8882 this->inputs->AddInput(new PentaInput(VelEnum,vel,P1Enum)); 8883 this->inputs->AddInput(new PentaInput(PressureEnum,pressure,P1Enum)); 8884 8884 8885 8885 /*Free ressources:*/ … … 8942 8942 8943 8943 /*Add vx and vy as inputs to the tria element: */ 8944 this->inputs->AddInput(new Penta P1Input(VxEnum,vx));8945 this->inputs->AddInput(new Penta P1Input(VyEnum,vy));8946 this->inputs->AddInput(new Penta P1Input(VelEnum,vel));8947 this->inputs->AddInput(new Penta P1Input(PressureEnum,pressure));8944 this->inputs->AddInput(new PentaInput(VxEnum,vx,P1Enum)); 8945 this->inputs->AddInput(new PentaInput(VyEnum,vy,P1Enum)); 8946 this->inputs->AddInput(new PentaInput(VelEnum,vel,P1Enum)); 8947 this->inputs->AddInput(new PentaInput(PressureEnum,pressure,P1Enum)); 8948 8948 8949 8949 /*Free ressources:*/ … … 8999 8999 Input* vzstokes_input=inputs->GetInput(VzStokesEnum); 9000 9000 if (vzstokes_input){ 9001 if (vzstokes_input->ObjectEnum()!=Penta P1InputEnum) _error_("Cannot compute Vel as VzStokes is of type " << EnumToStringx(vzstokes_input->ObjectEnum()));9001 if (vzstokes_input->ObjectEnum()!=PentaInputEnum) _error_("Cannot compute Vel as VzStokes is of type " << EnumToStringx(vzstokes_input->ObjectEnum())); 9002 9002 GetInputListOnVertices(&vzstokes[0],VzStokesEnum); 9003 9003 } … … 9011 9011 Input* vzstokes_input=inputs->GetInput(VzStokesEnum); 9012 9012 if (vzstokes_input){ 9013 if (vzstokes_input->ObjectEnum()!=Penta P1InputEnum) _error_("Cannot compute Vel as VzStokes is of type " << EnumToStringx(vzstokes_input->ObjectEnum()));9013 if (vzstokes_input->ObjectEnum()!=PentaInputEnum) _error_("Cannot compute Vel as VzStokes is of type " << EnumToStringx(vzstokes_input->ObjectEnum())); 9014 9014 GetInputListOnVertices(&vzstokes[0],VzStokesEnum); 9015 9015 } … … 9039 9039 if(approximation!=PattynStokesApproximationEnum && approximation!=MacAyealStokesApproximationEnum){ 9040 9040 this->inputs->ChangeEnum(PressureEnum,PressurePicardEnum); 9041 this->inputs->AddInput(new Penta P1Input(PressureEnum,pressure));9041 this->inputs->AddInput(new PentaInput(PressureEnum,pressure,P1Enum)); 9042 9042 } 9043 9043 else if(approximation==PattynStokesApproximationEnum){ 9044 this->inputs->AddInput(new Penta P1Input(VzPattynEnum,vzpattyn));9044 this->inputs->AddInput(new PentaInput(VzPattynEnum,vzpattyn,P1Enum)); 9045 9045 } 9046 9046 else if(approximation==MacAyealStokesApproximationEnum){ 9047 this->inputs->AddInput(new Penta P1Input(VzMacAyealEnum,vzmacayeal));9048 } 9049 this->inputs->AddInput(new Penta P1Input(VzEnum,vz));9050 this->inputs->AddInput(new Penta P1Input(VelEnum,vel));9047 this->inputs->AddInput(new PentaInput(VzMacAyealEnum,vzmacayeal,P1Enum)); 9048 } 9049 this->inputs->AddInput(new PentaInput(VzEnum,vz,P1Enum)); 9050 this->inputs->AddInput(new PentaInput(VelEnum,vel,P1Enum)); 9051 9051 9052 9052 /*Free ressources:*/ … … 9105 9105 9106 9106 /*Add vx and vy as inputs to the tria element: */ 9107 this->inputs->AddInput(new Penta P1Input(VxEnum,vx));9108 this->inputs->AddInput(new Penta P1Input(VyEnum,vy));9109 this->inputs->AddInput(new Penta P1Input(VzEnum,vz));9110 this->inputs->AddInput(new Penta P1Input(VelEnum,vel));9111 this->inputs->AddInput(new Penta P1Input(PressureEnum,pressure));9107 this->inputs->AddInput(new PentaInput(VxEnum,vx,P1Enum)); 9108 this->inputs->AddInput(new PentaInput(VyEnum,vy,P1Enum)); 9109 this->inputs->AddInput(new PentaInput(VzEnum,vz,P1Enum)); 9110 this->inputs->AddInput(new PentaInput(VelEnum,vel,P1Enum)); 9111 this->inputs->AddInput(new PentaInput(PressureEnum,pressure,P1Enum)); 9112 9112 9113 9113 /*Free ressources:*/ … … 9350 9350 for(;;){ 9351 9351 /*Add input to the element: */ 9352 penta->inputs->AddInput(new Penta P1Input(SedimentHeadEnum,values));9353 penta->inputs->AddInput(new Penta P1Input(SedimentHeadResidualEnum,residual));9352 penta->inputs->AddInput(new PentaInput(SedimentHeadEnum,values,P1Enum)); 9353 penta->inputs->AddInput(new PentaInput(SedimentHeadResidualEnum,residual,P1Enum)); 9354 9354 9355 9355 /*Stop if we have reached the surface*/ … … 9451 9451 if(!this->IsFloating() && floatingelement==true){ 9452 9452 for(i=0;i<NUMVERTICES;i++)melting[i]=gl_melting_rate/yts; 9453 this->inputs->AddInput(new Penta P1Input(BasalforcingsMeltingRateEnum,&melting[0]));9453 this->inputs->AddInput(new PentaInput(BasalforcingsMeltingRateEnum,&melting[0],P1Enum)); 9454 9454 } 9455 9455 9456 9456 /*Update inputs*/ 9457 this->inputs->AddInput(new Penta P1Input(SurfaceEnum,&s[0]));9458 this->inputs->AddInput(new Penta P1Input(BedEnum,&b[0]));9457 this->inputs->AddInput(new PentaInput(SurfaceEnum,&s[0],P1Enum)); 9458 this->inputs->AddInput(new PentaInput(BedEnum,&b[0],P1Enum)); 9459 9459 this->inputs->AddInput(new BoolInput(MaskElementonfloatingiceEnum,floatingelement)); 9460 9460 … … 9462 9462 if(migration_style==SubelementMigrationEnum){ 9463 9463 for(i=0;i<NUMVERTICES;i++) phi[i]=h[i]+ba[i]/density; 9464 this->inputs->AddInput(new Penta P1Input(GLlevelsetEnum,&phi[0]));9464 this->inputs->AddInput(new PentaInput(GLlevelsetEnum,&phi[0],P1Enum)); 9465 9465 this->InputExtrude(GLlevelsetEnum,ElementEnum); 9466 9466 } -
issm/trunk-jpl/src/c/classes/Inputs/CMakeLists.txt
r14284 r15417 13 13 # }}} 14 14 # THREED_SOURCES {{{ 15 set(THREED_SOURCES $ENV{ISSM_DIR}/src/c/classes/objects/Inputs/Penta P1Input.cpp PARENT_SCOPE)15 set(THREED_SOURCES $ENV{ISSM_DIR}/src/c/classes/objects/Inputs/PentaInput.cpp PARENT_SCOPE) 16 16 # }}} -
issm/trunk-jpl/src/c/classes/Inputs/ControlInput.cpp
r15300 r15417 36 36 maxvalues =new TriaInput(enum_type,pmax,P1Enum); 37 37 break; 38 case Penta P1InputEnum:39 values =new Penta P1Input(enum_type,pvalues);40 savedvalues=new Penta P1Input(enum_type,pvalues);41 minvalues =new Penta P1Input(enum_type,pmin);42 maxvalues =new Penta P1Input(enum_type,pmax);38 case PentaInputEnum: 39 values =new PentaInput(enum_type,pvalues,P1Enum); 40 savedvalues=new PentaInput(enum_type,pvalues,P1Enum); 41 minvalues =new PentaInput(enum_type,pmin,P1Enum); 42 maxvalues =new PentaInput(enum_type,pmax,P1Enum); 43 43 break; 44 44 default: … … 115 115 116 116 /*Object functions*/ 117 /*FUNCTION ControlInput::AXPY(){{{*/ 118 void ControlInput::AXPY(Input* xinput,IssmDouble scalar){ 119 values->AXPY(xinput,scalar); 120 }/*}}}*/ 117 121 /*FUNCTION ControlInput::Constrain(){{{*/ 118 122 void ControlInput::Constrain(void){ -
issm/trunk-jpl/src/c/classes/Inputs/ControlInput.h
r15130 r15417 74 74 void Scale(IssmDouble scale_factor){_error_("not implemented yet");}; 75 75 void ArtificialNoise(IssmDouble min,IssmDouble max){_error_("not implemented yet");}; 76 void AXPY(Input* xinput,IssmDouble scalar) {_error_("not implemented yet");};76 void AXPY(Input* xinput,IssmDouble scalar); 77 77 void Constrain(void); 78 78 void Constrain(IssmDouble min,IssmDouble max); -
issm/trunk-jpl/src/c/classes/Inputs/DoubleInput.cpp
r15130 r15417 263 263 switch(thickness_input->ObjectEnum()){ 264 264 265 case Penta P1InputEnum:265 case PentaInputEnum: 266 266 thickness_input->GetInputAverage(&thickness_value); 267 267 this->value=this->value*thickness_value; -
issm/trunk-jpl/src/c/classes/Inputs/PentaInput.cpp
r15409 r15417 1 /*!\file Penta P1Input.c2 * \brief: implementation of the Penta P1Input object1 /*!\file PentaInput.c 2 * \brief: implementation of the PentaInput object 3 3 */ 4 4 … … 12 12 #include "../../shared/shared.h" 13 13 14 /*Penta P1Input constructors and destructor*/15 /*FUNCTION Penta P1Input::PentaP1Input(){{{*/16 Penta P1Input::PentaP1Input(){17 return;18 } 19 /*}}}*/ 20 /*FUNCTION Penta P1Input::PentaP1Input(int in_enum_type,IssmDouble* values){{{*/21 Penta P1Input::PentaP1Input(int in_enum_type,IssmDouble* in_values)14 /*PentaInput constructors and destructor*/ 15 /*FUNCTION PentaInput::PentaInput(){{{*/ 16 PentaInput::PentaInput(){ 17 values = NULL; 18 } 19 /*}}}*/ 20 /*FUNCTION PentaInput::PentaInput(int in_enum_type,IssmDouble* values,int element_type){{{*/ 21 PentaInput::PentaInput(int in_enum_type,IssmDouble* in_values,int element_type_in) 22 22 :PentaRef(1) 23 23 { 24 24 25 25 /*Set PentaRef*/ 26 this->SetElementType(P1Enum,0); 27 this->element_type=P1Enum; 28 26 this->SetElementType(element_type_in,0); 27 this->element_type=element_type_in; 28 29 /*Set Enum*/ 29 30 enum_type=in_enum_type; 30 values[0]=in_values[0]; 31 values[1]=in_values[1]; 32 values[2]=in_values[2]; 33 values[3]=in_values[3]; 34 values[4]=in_values[4]; 35 values[5]=in_values[5]; 36 } 37 /*}}}*/ 38 /*FUNCTION PentaP1Input::~PentaP1Input(){{{*/ 39 PentaP1Input::~PentaP1Input(){ 40 return; 31 32 /*Set values*/ 33 this->values=xNew<IssmDouble>(this->NumberofNodes()); 34 for(int i=0;i<this->NumberofNodes();i++) values[i]=in_values[i]; 35 } 36 /*}}}*/ 37 /*FUNCTION PentaInput::~PentaInput(){{{*/ 38 PentaInput::~PentaInput(){ 39 xDelete<IssmDouble>(this->values); 41 40 } 42 41 /*}}}*/ 43 42 44 43 /*Object virtual functions definitions:*/ 45 /*FUNCTION Penta P1Input::Echo {{{*/46 void Penta P1Input::Echo(void){44 /*FUNCTION PentaInput::Echo {{{*/ 45 void PentaInput::Echo(void){ 47 46 this->DeepEcho(); 48 47 } 49 48 /*}}}*/ 50 /*FUNCTION Penta P1Input::DeepEcho{{{*/51 void Penta P1Input::DeepEcho(void){52 53 _printf_("Penta P1Input:\n");49 /*FUNCTION PentaInput::DeepEcho{{{*/ 50 void PentaInput::DeepEcho(void){ 51 52 _printf_("PentaInput:\n"); 54 53 _printf_(" enum: " << this->enum_type << " (" << EnumToStringx(this->enum_type) << ")\n"); 55 _printf_(" values: [" << this->values[0] << " " << this->values[1] << " " << this->values[2] << " " << this->values[3] << " " << this->values[4] << " " << this->values[5] << "]\n"); 56 } 57 /*}}}*/ 58 /*FUNCTION PentaP1Input::Id{{{*/ 59 int PentaP1Input::Id(void){ return -1; } 60 /*}}}*/ 61 /*FUNCTION PentaP1Input::ObjectEnum{{{*/ 62 int PentaP1Input::ObjectEnum(void){ 63 64 return PentaP1InputEnum; 65 66 } 67 /*}}}*/ 68 69 /*PentaP1Input management*/ 70 /*FUNCTION PentaP1Input::copy{{{*/ 71 Object* PentaP1Input::copy() { 72 73 return new PentaP1Input(this->enum_type,this->values); 74 75 } 76 /*}}}*/ 77 /*FUNCTION PentaP1Input::InstanceEnum{{{*/ 78 int PentaP1Input::InstanceEnum(void){ 54 _printf_(" values: ["); 55 for(int i=0;i<this->NumberofNodes();i++) _printf_(" "<<this->values[i]); 56 _printf_("]\n"); 57 } 58 /*}}}*/ 59 /*FUNCTION PentaInput::Id{{{*/ 60 int PentaInput::Id(void){ return -1; } 61 /*}}}*/ 62 /*FUNCTION PentaInput::ObjectEnum{{{*/ 63 int PentaInput::ObjectEnum(void){ 64 65 return PentaInputEnum; 66 67 } 68 /*}}}*/ 69 /*FUNCTION PentaInput::copy{{{*/ 70 Object* PentaInput::copy() { 71 72 return new PentaInput(this->enum_type,this->values,this->element_type); 73 74 } 75 /*}}}*/ 76 77 /*PentaInput management*/ 78 /*FUNCTION PentaInput::InstanceEnum{{{*/ 79 int PentaInput::InstanceEnum(void){ 79 80 80 81 return this->enum_type; … … 82 83 } 83 84 /*}}}*/ 84 /*FUNCTION Penta P1Input::SpawnTriaInput{{{*/85 Input* Penta P1Input::SpawnTriaInput(int* indices){85 /*FUNCTION PentaInput::SpawnTriaInput{{{*/ 86 Input* PentaInput::SpawnTriaInput(int* indices){ 86 87 87 88 /*output*/ 88 89 TriaInput* outinput=NULL; 89 IssmDouble newvalues[3]; 90 IssmDouble newvalues[3]; //Assume P1 interpolation only for now 90 91 91 92 /*Loop over the new indices*/ … … 107 108 } 108 109 /*}}}*/ 109 /*FUNCTION Penta P1Input::SpawnResult{{{*/110 ElementResult* Penta P1Input::SpawnResult(int step, IssmDouble time){110 /*FUNCTION PentaInput::SpawnResult{{{*/ 111 ElementResult* PentaInput::SpawnResult(int step, IssmDouble time){ 111 112 112 113 return new PentaP1ElementResult(this->enum_type,this->values,step,time); … … 116 117 117 118 /*Object functions*/ 118 /*FUNCTION Penta P1Input::GetInputValue(IssmDouble* pvalue,GaussPenta* gauss){{{*/119 void Penta P1Input::GetInputValue(IssmDouble* pvalue,GaussPenta* gauss){119 /*FUNCTION PentaInput::GetInputValue(IssmDouble* pvalue,GaussPenta* gauss){{{*/ 120 void PentaInput::GetInputValue(IssmDouble* pvalue,GaussPenta* gauss){ 120 121 121 122 /*Call PentaRef function*/ … … 124 125 } 125 126 /*}}}*/ 126 /*FUNCTION Penta P1Input::GetInputDerivativeValue(IssmDouble* p, IssmDouble* xyz_list, GaussPenta* gauss){{{*/127 void Penta P1Input::GetInputDerivativeValue(IssmDouble* p, IssmDouble* xyz_list, GaussPenta* gauss){127 /*FUNCTION PentaInput::GetInputDerivativeValue(IssmDouble* p, IssmDouble* xyz_list, GaussPenta* gauss){{{*/ 128 void PentaInput::GetInputDerivativeValue(IssmDouble* p, IssmDouble* xyz_list, GaussPenta* gauss){ 128 129 129 130 /*Call PentaRef function*/ … … 131 132 } 132 133 /*}}}*/ 133 /*FUNCTION Penta P1Input::GetVxStrainRate3d{{{*/134 void Penta P1Input::GetVxStrainRate3d(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussPenta* gauss){134 /*FUNCTION PentaInput::GetVxStrainRate3d{{{*/ 135 void PentaInput::GetVxStrainRate3d(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussPenta* gauss){ 135 136 int i,j; 136 137 … … 140 141 IssmDouble B_reduced[6][DOFVELOCITY*numnodes]; 141 142 IssmDouble velocity[numnodes][DOFVELOCITY]; 143 144 _assert_(this->NumberofNodes()==6); //Check Tria too 145 146 /*Get B matrix: */ 147 GetBStokes(&B[0][0], xyz_list, gauss); 148 149 /*Create a reduced matrix of B to get rid of pressure */ 150 for (i=0;i<6;i++){ 151 for (j=0;j<3;j++){ 152 B_reduced[i][j]=B[i][j]; 153 } 154 for (j=4;j<7;j++){ 155 B_reduced[i][j-1]=B[i][j]; 156 } 157 for (j=8;j<11;j++){ 158 B_reduced[i][j-2]=B[i][j]; 159 } 160 for (j=12;j<15;j++){ 161 B_reduced[i][j-3]=B[i][j]; 162 } 163 for (j=16;j<19;j++){ 164 B_reduced[i][j-4]=B[i][j]; 165 } 166 for (j=20;j<23;j++){ 167 B_reduced[i][j-5]=B[i][j]; 168 } 169 } 170 171 /*Here, we are computing the strain rate of (vx,0,0)*/ 172 for(i=0;i<numnodes;i++){ 173 velocity[i][0]=this->values[i]; 174 velocity[i][1]=0.0; 175 velocity[i][2]=0.0; 176 } 177 /*Multiply B by velocity, to get strain rate: */ 178 MatrixMultiply(&B_reduced[0][0],6,DOFVELOCITY*numnodes,0,&velocity[0][0],DOFVELOCITY*numnodes,1,0,epsilonvx,0); 179 180 } 181 /*}}}*/ 182 /*FUNCTION PentaInput::GetVyStrainRate3d{{{*/ 183 void PentaInput::GetVyStrainRate3d(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussPenta* gauss){ 184 int i,j; 185 186 const int numnodes=6; 187 const int DOFVELOCITY=3; 188 IssmDouble B[8][27]; 189 IssmDouble B_reduced[6][DOFVELOCITY*numnodes]; 190 IssmDouble velocity[numnodes][DOFVELOCITY]; 191 192 _assert_(this->NumberofNodes()==6); //Check Tria too 142 193 143 194 /*Get B matrix: */ … … 165 216 } 166 217 167 /*Here, we are computing the strain rate of ( vx,0,0)*/218 /*Here, we are computing the strain rate of (0,vy,0)*/ 168 219 for(i=0;i<numnodes;i++){ 169 velocity[i][0]= this->values[i];170 velocity[i][1]= 0.0;220 velocity[i][0]=0.0; 221 velocity[i][1]=this->values[i]; 171 222 velocity[i][2]=0.0; 172 223 } 173 224 /*Multiply B by velocity, to get strain rate: */ 174 MatrixMultiply(&B_reduced[0][0],6,DOFVELOCITY*numnodes,0,&velocity[0][0],DOFVELOCITY*numnodes,1,0,epsilonv x,0);175 176 } 177 /*}}}*/ 178 /*FUNCTION Penta P1Input::GetVyStrainRate3d{{{*/179 void Penta P1Input::GetVyStrainRate3d(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussPenta* gauss){225 MatrixMultiply(&B_reduced[0][0],6,DOFVELOCITY*numnodes,0,&velocity[0][0],DOFVELOCITY*numnodes,1,0,epsilonvy,0); 226 227 } 228 /*}}}*/ 229 /*FUNCTION PentaInput::GetVzStrainRate3d{{{*/ 230 void PentaInput::GetVzStrainRate3d(IssmDouble* epsilonvz,IssmDouble* xyz_list, GaussPenta* gauss){ 180 231 int i,j; 181 232 … … 188 239 /*Get B matrix: */ 189 240 GetBStokes(&B[0][0], xyz_list, gauss); 190 /*Create a reduced matrix of B to get rid of pressure */ 191 for (i=0;i<6;i++){ 192 for (j=0;j<3;j++){ 193 B_reduced[i][j]=B[i][j]; 194 } 195 for (j=4;j<7;j++){ 196 B_reduced[i][j-1]=B[i][j]; 197 } 198 for (j=8;j<11;j++){ 199 B_reduced[i][j-2]=B[i][j]; 200 } 201 for (j=12;j<15;j++){ 202 B_reduced[i][j-3]=B[i][j]; 203 } 204 for (j=16;j<19;j++){ 205 B_reduced[i][j-4]=B[i][j]; 206 } 207 for (j=20;j<23;j++){ 208 B_reduced[i][j-5]=B[i][j]; 209 } 210 } 211 212 /*Here, we are computing the strain rate of (0,vy,0)*/ 213 for(i=0;i<numnodes;i++){ 214 velocity[i][0]=0.0; 215 velocity[i][1]=this->values[i]; 216 velocity[i][2]=0.0; 217 } 218 /*Multiply B by velocity, to get strain rate: */ 219 MatrixMultiply(&B_reduced[0][0],6,DOFVELOCITY*numnodes,0,&velocity[0][0],DOFVELOCITY*numnodes,1,0,epsilonvy,0); 220 221 } 222 /*}}}*/ 223 /*FUNCTION PentaP1Input::GetVzStrainRate3d{{{*/ 224 void PentaP1Input::GetVzStrainRate3d(IssmDouble* epsilonvz,IssmDouble* xyz_list, GaussPenta* gauss){ 225 int i,j; 226 227 const int numnodes=6; 228 const int DOFVELOCITY=3; 229 IssmDouble B[8][27]; 230 IssmDouble B_reduced[6][DOFVELOCITY*numnodes]; 231 IssmDouble velocity[numnodes][DOFVELOCITY]; 232 233 /*Get B matrix: */ 234 GetBStokes(&B[0][0], xyz_list, gauss); 241 242 _assert_(this->NumberofNodes()==6); //Check Tria too 243 235 244 /*Create a reduced matrix of B to get rid of pressure */ 236 245 for (i=0;i<6;i++){ … … 267 276 } 268 277 /*}}}*/ 269 /*FUNCTION Penta P1Input::GetVxStrainRate3dPattyn{{{*/270 void Penta P1Input::GetVxStrainRate3dPattyn(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussPenta* gauss){278 /*FUNCTION PentaInput::GetVxStrainRate3dPattyn{{{*/ 279 void PentaInput::GetVxStrainRate3dPattyn(IssmDouble* epsilonvx,IssmDouble* xyz_list, GaussPenta* gauss){ 271 280 272 281 int i; … … 278 287 GetBPattyn(&B[0][0], xyz_list, gauss); 279 288 289 _assert_(this->NumberofNodes()==6); //Check Tria too 290 291 280 292 /*Here, we are computing the strain rate of (vx,0)*/ 281 293 for(i=0;i<numnodes;i++){ … … 291 303 } 292 304 /*}}}*/ 293 /*FUNCTION Penta P1Input::GetVyStrainRate3dPattyn{{{*/294 void Penta P1Input::GetVyStrainRate3dPattyn(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussPenta* gauss){305 /*FUNCTION PentaInput::GetVyStrainRate3dPattyn{{{*/ 306 void PentaInput::GetVyStrainRate3dPattyn(IssmDouble* epsilonvy,IssmDouble* xyz_list, GaussPenta* gauss){ 295 307 296 308 int i; … … 302 314 GetBPattyn(&B[0][0], xyz_list, gauss); 303 315 316 _assert_(this->NumberofNodes()==6); //Check Tria too 317 318 304 319 /*Here, we are computing the strain rate of (0,vy)*/ 305 320 for(i=0;i<numnodes;i++){ … … 315 330 } 316 331 /*}}}*/ 317 /*FUNCTION Penta P1Input::ChangeEnum{{{*/318 void Penta P1Input::ChangeEnum(int newenumtype){332 /*FUNCTION PentaInput::ChangeEnum{{{*/ 333 void PentaInput::ChangeEnum(int newenumtype){ 319 334 this->enum_type=newenumtype; 320 335 } 321 336 /*}}}*/ 322 /*FUNCTION PentaP1Input::GetInputAverage{{{*/ 323 void PentaP1Input::GetInputAverage(IssmDouble* pvalue){ 324 *pvalue=1./6.*(values[0]+values[1]+values[2]+values[3]+values[4]+values[5]); 337 /*FUNCTION PentaInput::GetInputAverage{{{*/ 338 void PentaInput::GetInputAverage(IssmDouble* pvalue){ 339 340 int numnodes = this->NumberofNodes(); 341 IssmDouble numnodesd = reCast<int,IssmDouble>(numnodes); 342 IssmDouble value = 0.; 343 344 for(int i=0;i<numnodes;i++) value+=values[i]; 345 value = value/numnodesd; 346 347 *pvalue=value; 325 348 } 326 349 /*}}}*/ 327 350 328 351 /*Intermediary*/ 329 /*FUNCTION PentaP1Input::SquareMin{{{*/ 330 void PentaP1Input::SquareMin(IssmDouble* psquaremin,Parameters* parameters){ 331 332 int i; 333 const int numnodes=6; 334 IssmDouble valuescopy[numnodes]; 352 /*FUNCTION PentaInput::SquareMin{{{*/ 353 void PentaInput::SquareMin(IssmDouble* psquaremin,Parameters* parameters){ 354 355 int numnodes=this->NumberofNodes(); 335 356 IssmDouble squaremin; 336 357 337 /*First, copy values, to process units if requested: */338 for(i=0;i<numnodes;i++)valuescopy[i]=this->values[i];339 340 358 /*Now, figure out minimum of valuescopy: */ 341 squaremin=pow( valuescopy[0],2);342 for(i =1;i<numnodes;i++){343 if(pow( valuescopy[i],2)<squaremin)squaremin=pow(valuescopy[i],2);359 squaremin=pow(this->values[0],2); 360 for(int i=1;i<numnodes;i++){ 361 if(pow(this->values[i],2)<squaremin)squaremin=pow(this->values[i],2); 344 362 } 345 363 /*Assign output pointers:*/ … … 347 365 } 348 366 /*}}}*/ 349 /*FUNCTION PentaP1Input::ConstrainMin{{{*/ 350 void PentaP1Input::ConstrainMin(IssmDouble minimum){ 351 352 int i; 353 const int numnodes=6; 354 355 for(i=0;i<numnodes;i++) if (values[i]<minimum) values[i]=minimum; 356 } 357 /*}}}*/ 358 /*FUNCTION PentaP1Input::InfinityNorm{{{*/ 359 IssmDouble PentaP1Input::InfinityNorm(void){ 367 /*FUNCTION PentaInput::ConstrainMin{{{*/ 368 void PentaInput::ConstrainMin(IssmDouble minimum){ 369 370 int numnodes = this->NumberofNodes(); 371 for(int i=0;i<numnodes;i++) if (values[i]<minimum) values[i]=minimum; 372 } 373 /*}}}*/ 374 /*FUNCTION PentaInput::InfinityNorm{{{*/ 375 IssmDouble PentaInput::InfinityNorm(void){ 360 376 361 377 /*Output*/ 362 const int numnodes=6;363 IssmDouble norm=0;378 IssmDouble norm=0.; 379 int numnodes=this->NumberofNodes(); 364 380 365 381 for(int i=0;i<numnodes;i++) if(fabs(values[i])>norm) norm=fabs(values[i]); … … 367 383 } 368 384 /*}}}*/ 369 /*FUNCTION Penta P1Input::Max{{{*/370 IssmDouble Penta P1Input::Max(void){371 372 const int numnodes=6;373 IssmDouble 385 /*FUNCTION PentaInput::Max{{{*/ 386 IssmDouble PentaInput::Max(void){ 387 388 int numnodes=this->NumberofNodes(); 389 IssmDouble max=values[0]; 374 390 375 391 for(int i=1;i<numnodes;i++){ … … 379 395 } 380 396 /*}}}*/ 381 /*FUNCTION Penta P1Input::MaxAbs{{{*/382 IssmDouble Penta P1Input::MaxAbs(void){383 384 const int numnodes=6;385 IssmDouble 397 /*FUNCTION PentaInput::MaxAbs{{{*/ 398 IssmDouble PentaInput::MaxAbs(void){ 399 400 int numnodes=this->NumberofNodes(); 401 IssmDouble max=fabs(values[0]); 386 402 387 403 for(int i=1;i<numnodes;i++){ … … 391 407 } 392 408 /*}}}*/ 393 /*FUNCTION Penta P1Input::Min{{{*/394 IssmDouble Penta P1Input::Min(void){395 396 const int numnodes=6;397 IssmDouble 409 /*FUNCTION PentaInput::Min{{{*/ 410 IssmDouble PentaInput::Min(void){ 411 412 const int numnodes=this->NumberofNodes(); 413 IssmDouble min=values[0]; 398 414 399 415 for(int i=1;i<numnodes;i++){ … … 403 419 } 404 420 /*}}}*/ 405 /*FUNCTION Penta P1Input::MinAbs{{{*/406 IssmDouble Penta P1Input::MinAbs(void){407 408 const int numnodes=6;409 IssmDouble 421 /*FUNCTION PentaInput::MinAbs{{{*/ 422 IssmDouble PentaInput::MinAbs(void){ 423 424 const int numnodes=this->NumberofNodes(); 425 IssmDouble min=fabs(values[0]); 410 426 411 427 for(int i=1;i<numnodes;i++){ … … 415 431 } 416 432 /*}}}*/ 417 /*FUNCTION PentaP1Input::Scale{{{*/ 418 void PentaP1Input::Scale(IssmDouble scale_factor){ 433 /*FUNCTION PentaInput::Scale{{{*/ 434 void PentaInput::Scale(IssmDouble scale_factor){ 435 436 const int numnodes=this->NumberofNodes(); 437 for(int i=0;i<numnodes;i++)values[i]=values[i]*scale_factor; 438 } 439 /*}}}*/ 440 /*FUNCTION PentaInput::AXPY{{{*/ 441 void PentaInput::AXPY(Input* xinput,IssmDouble scalar){ 442 443 const int numnodes=this->NumberofNodes(); 444 PentaInput* xpentainput=NULL; 445 446 /*If xinput is a ControlInput, take its values directly*/ 447 if(xinput->ObjectEnum()==ControlInputEnum){ 448 xinput=((ControlInput*)xinput)->values; 449 } 450 451 /*xinput is of the same type, so cast it: */ 452 if(xinput->ObjectEnum()!=PentaInputEnum) 453 _error_("Operation not permitted because xinput is of type " << EnumToStringx(xinput->ObjectEnum())); 454 xpentainput=(PentaInput*)xinput; 455 if(xpentainput->element_type!=this->element_type) _error_("Operation not permitted because xinput is of type " << EnumToStringx(xpentainput->element_type)); 456 457 /*Carry out the AXPY operation depending on type:*/ 458 for(int i=0;i<numnodes;i++)this->values[i]=this->values[i]+scalar*xpentainput->values[i]; 459 460 } 461 /*}}}*/ 462 /*FUNCTION PentaInput::Constrain{{{*/ 463 void PentaInput::Constrain(IssmDouble cm_min, IssmDouble cm_max){ 419 464 420 465 int i; 421 const int numnodes=6; 422 423 for(i=0;i<numnodes;i++)values[i]=values[i]*scale_factor; 424 } 425 /*}}}*/ 426 /*FUNCTION PentaP1Input::AXPY{{{*/ 427 void PentaP1Input::AXPY(Input* xinput,IssmDouble scalar){ 428 429 int i; 430 const int numnodes=6; 431 432 /*xinput is of the same type, so cast it: */ 433 434 /*Carry out the AXPY operation depending on type:*/ 435 switch(xinput->ObjectEnum()){ 436 437 case PentaP1InputEnum:{ 438 PentaP1Input* cast_input=(PentaP1Input*)xinput; 439 for(i=0;i<numnodes;i++)this->values[i]=this->values[i]+scalar*(cast_input->values[i]);} 440 return; 441 case ControlInputEnum:{ 442 ControlInput* cont_input=(ControlInput*)xinput; 443 if(cont_input->values->ObjectEnum()!=PentaP1InputEnum) _error_("not supported yet"); 444 PentaP1Input* cast_input=(PentaP1Input*)cont_input->values; 445 for(i=0;i<numnodes;i++)this->values[i]=this->values[i]+scalar*(cast_input->values[i]);} 446 return; 447 default: 448 _error_("not implemented yet"); 449 } 450 451 } 452 /*}}}*/ 453 /*FUNCTION PentaP1Input::Constrain{{{*/ 454 void PentaP1Input::Constrain(IssmDouble cm_min, IssmDouble cm_max){ 455 456 int i; 457 const int numnodes=6; 466 const int numnodes=this->NumberofNodes(); 458 467 459 468 if(!xIsNan<IssmDouble>(cm_min)) for(i=0;i<numnodes;i++)if (this->values[i]<cm_min)this->values[i]=cm_min; … … 462 471 } 463 472 /*}}}*/ 464 /*FUNCTION PentaP1Input::Extrude{{{*/ 465 void PentaP1Input::Extrude(void){ 466 467 int i; 468 469 /*First 3 values copied on 3 last values*/ 470 for(i=0;i<3;i++) this->values[3+i]=this->values[i]; 471 } 472 /*}}}*/ 473 /*FUNCTION PentaP1Input::VerticallyIntegrate{{{*/ 474 void PentaP1Input::VerticallyIntegrate(Input* thickness_input){ 473 /*FUNCTION PentaInput::Extrude{{{*/ 474 void PentaInput::Extrude(void){ 475 476 switch(this->element_type){ 477 case P1Enum: 478 for(int i=0;i<3;i++) this->values[3+i]=this->values[i]; 479 break; 480 default: 481 _error_("not supported yet for type "<<EnumToStringx(this->element_type)); 482 } 483 } 484 /*}}}*/ 485 /*FUNCTION PentaInput::VerticallyIntegrate{{{*/ 486 void PentaInput::VerticallyIntegrate(Input* thickness_input){ 475 487 476 488 IssmDouble thickness; … … 480 492 481 493 /*vertically integrate depending on type:*/ 482 switch(thickness_input->ObjectEnum()){ 483 484 case PentaP1InputEnum:{ 494 switch(this->element_type){ 495 case P1Enum:{ 485 496 GaussPenta *gauss=new GaussPenta(); 486 497 for(int iv=0;iv<3;iv++){ … … 492 503 delete gauss; 493 504 return; } 494 495 505 default: 496 _error_("not implemented yet");497 } 498 } 499 /*}}}*/ 500 /*FUNCTION Penta P1Input::PointwiseDivide{{{*/501 Input* Penta P1Input::PointwiseDivide(Input* inputB){506 _error_("not supported yet for type "<<EnumToStringx(this->element_type)); 507 } 508 } 509 /*}}}*/ 510 /*FUNCTION PentaInput::PointwiseDivide{{{*/ 511 Input* PentaInput::PointwiseDivide(Input* inputB){ 502 512 503 513 /*Ouput*/ 504 Penta P1Input* outinput=NULL;514 PentaInput* outinput=NULL; 505 515 506 516 /*Intermediaries*/ 507 PentaP1Input *xinputB = NULL; 508 const int numnodes = 6; 509 IssmDouble AdotBvalues[numnodes]; 517 PentaInput *xinputB = NULL; 518 const int numnodes = this->NumberofNodes(); 510 519 511 520 /*Check that inputB is of the same type*/ 512 if (inputB->ObjectEnum()!=PentaP1InputEnum) _error_("Operation not permitted because inputB is of type " << EnumToStringx(inputB->ObjectEnum())); 513 xinputB=(PentaP1Input*)inputB; 521 if(inputB->ObjectEnum()!=PentaInputEnum) _error_("Operation not permitted because inputB is of type " << EnumToStringx(inputB->ObjectEnum())); 522 xinputB=(PentaInput*)inputB; 523 if(xinputB->element_type!=this->element_type) _error_("Operation not permitted because inputB is of type " << EnumToStringx(xinputB->element_type)); 524 525 /*Allocate intermediary*/ 526 IssmDouble* AdotBvalues=xNew<IssmDouble>(numnodes); 514 527 515 528 /*Create point wise sum*/ … … 520 533 521 534 /*Create new Penta vertex input (copy of current input)*/ 522 outinput=new Penta P1Input(this->enum_type,&AdotBvalues[0]);535 outinput=new PentaInput(this->enum_type,AdotBvalues,this->element_type); 523 536 524 537 /*Return output pointer*/ 538 xDelete<IssmDouble>(AdotBvalues); 525 539 return outinput; 526 540 527 541 } 528 542 /*}}}*/ 529 /*FUNCTION Penta P1Input::PointwiseMin{{{*/530 Input* Penta P1Input::PointwiseMin(Input* inputB){543 /*FUNCTION PentaInput::PointwiseMin{{{*/ 544 Input* PentaInput::PointwiseMin(Input* inputB){ 531 545 532 546 /*Ouput*/ 533 Penta P1Input* outinput=NULL;547 PentaInput* outinput=NULL; 534 548 535 549 /*Intermediaries*/ 536 int 537 Penta P1Input *xinputB= NULL;538 const int numnodes = 6;539 IssmDouble minvalues[numnodes];550 int i; 551 PentaInput *xinputB = NULL; 552 const int numnodes = this->NumberofNodes(); 553 IssmDouble *minvalues = xNew<IssmDouble>(numnodes); 540 554 541 555 /*Check that inputB is of the same type*/ 542 if (inputB->ObjectEnum()!=PentaP1InputEnum) _error_("Operation not permitted because inputB is of type " << EnumToStringx(inputB->ObjectEnum())); 543 xinputB=(PentaP1Input*)inputB; 556 if(inputB->ObjectEnum()!=PentaInputEnum) _error_("Operation not permitted because inputB is of type " << EnumToStringx(inputB->ObjectEnum())); 557 xinputB=(PentaInput*)inputB; 558 if(xinputB->element_type!=this->element_type) _error_("Operation not permitted because inputB is of type " << EnumToStringx(xinputB->element_type)); 544 559 545 560 /*Create point wise min*/ … … 550 565 551 566 /*Create new Penta vertex input (copy of current input)*/ 552 outinput=new Penta P1Input(this->enum_type,&minvalues[0]);567 outinput=new PentaInput(this->enum_type,&minvalues[0],this->element_type); 553 568 554 569 /*Return output pointer*/ 570 xDelete<IssmDouble>(minvalues); 555 571 return outinput; 556 557 } 558 /*}}}*/ 559 /*FUNCTION PentaP1Input::PointwiseMax{{{*/ 560 Input* PentaP1Input::PointwiseMax(Input* inputB){ 572 } 573 /*}}}*/ 574 /*FUNCTION PentaInput::PointwiseMax{{{*/ 575 Input* PentaInput::PointwiseMax(Input* inputB){ 561 576 562 577 /*Ouput*/ 563 Penta P1Input* outinput=NULL;578 PentaInput* outinput=NULL; 564 579 565 580 /*Intermediaries*/ 566 int 567 Penta P1Input *xinputB= NULL;568 const int numnodes = 6;569 IssmDouble maxvalues[numnodes];581 int i; 582 PentaInput *xinputB = NULL; 583 const int numnodes = this->NumberofNodes(); 584 IssmDouble *maxvalues = xNew<IssmDouble>(numnodes); 570 585 571 586 /*Check that inputB is of the same type*/ 572 if (inputB->ObjectEnum()!=PentaP1InputEnum) _error_("Operation not permitted because inputB is of type " << EnumToStringx(inputB->ObjectEnum())); 573 xinputB=(PentaP1Input*)inputB; 587 if(inputB->ObjectEnum()!=PentaInputEnum) _error_("Operation not permitted because inputB is of type " << EnumToStringx(inputB->ObjectEnum())); 588 xinputB=(PentaInput*)inputB; 589 if(xinputB->element_type!=this->element_type) _error_("Operation not permitted because inputB is of type " << EnumToStringx(xinputB->element_type)); 574 590 575 591 /*Create point wise max*/ … … 580 596 581 597 /*Create new Penta vertex input (copy of current input)*/ 582 outinput=new Penta P1Input(this->enum_type,&maxvalues[0]);598 outinput=new PentaInput(this->enum_type,&maxvalues[0],this->element_type); 583 599 584 600 /*Return output pointer*/ 601 xDelete<IssmDouble>(maxvalues); 585 602 return outinput; 586 587 } 588 /*}}}*/ 589 /*FUNCTION PentaP1Input::GetVectorFromInputs{{{*/ 590 void PentaP1Input::GetVectorFromInputs(Vector<IssmDouble>* vector,int* doflist){ 591 592 const int numvertices=6; 593 vector->SetValues(numvertices,doflist,this->values,INS_VAL); 603 } 604 /*}}}*/ 605 /*FUNCTION PentaInput::GetVectorFromInputs{{{*/ 606 void PentaInput::GetVectorFromInputs(Vector<IssmDouble>* vector,int* doflist){ 607 608 const int numnodes=this->NumberofNodes(); 609 vector->SetValues(numnodes,doflist,this->values,INS_VAL); 594 610 595 611 } /*}}}*/ 596 /*FUNCTION Penta P1Input::Configure{{{*/597 void Penta P1Input::Configure(Parameters* parameters){612 /*FUNCTION PentaInput::Configure{{{*/ 613 void PentaInput::Configure(Parameters* parameters){ 598 614 /*do nothing: */ 599 615 } -
issm/trunk-jpl/src/c/classes/Inputs/PentaInput.h
r15409 r15417 1 /*! \file Penta P1Input.h2 * \brief: header file for Penta P1Input object1 /*! \file PentaInput.h 2 * \brief: header file for PentaInput object 3 3 */ 4 4 5 #ifndef _PENTA P1INPUT_H_6 #define _PENTA P1INPUT_H_5 #ifndef _PENTAINPUT_H_ 6 #define _PENTAINPUT_H_ 7 7 8 8 /*Headers:*/ … … 14 14 /*}}}*/ 15 15 16 class Penta P1Input: public Input, public PentaRef{16 class PentaInput: public Input, public PentaRef{ 17 17 18 18 public: 19 /*just hold 6 values for 6 vertices: */20 19 int enum_type; 21 IssmDouble values[6];20 IssmDouble* values; 22 21 23 /*Penta P1Input constructors, destructors: {{{*/24 Penta P1Input();25 Penta P1Input(int enum_type,IssmDouble* values);26 ~Penta P1Input();27 /*}}}*/ 28 /*Object virtual functions definitions :{{{*/22 /*PentaInput constructors, destructors*/ 23 PentaInput(); 24 PentaInput(int enum_type,IssmDouble* values,int element_type_in); 25 ~PentaInput(); 26 27 /*Object virtual functions definitions */ 29 28 void Echo(); 30 29 void DeepEcho(); … … 32 31 int ObjectEnum(); 33 32 Object *copy(); 34 /*}}}*/ 35 /*Penta P1Input management: {{{*/33 34 /*PentaInput management*/ 36 35 int InstanceEnum(); 37 36 Input* SpawnTriaInput(int* indices); … … 42 41 void AddTimeValues(IssmDouble* values,int step,IssmDouble time){_error_("not supported yet");}; 43 42 void Configure(Parameters* parameters); 44 /*}}}*/ 45 /*numerics: {{{*/ 43 /*numerics*/ 46 44 void GetInputValue(bool* pvalue){_error_("not implemented yet");}; 47 45 void GetInputValue(int* pvalue){_error_("not implemented yet");}; … … 82 80 void VerticallyIntegrate(Input* thickness_input); 83 81 void GetVectorFromInputs(Vector<IssmDouble>* vector,int* doflist); 84 /*}}}*/85 82 86 83 }; 87 #endif /* _PENTA P1INPUT_H */84 #endif /* _PENTAINPUT_H */ -
issm/trunk-jpl/src/c/classes/Inputs/TriaInput.cpp
r15298 r15417 38 38 TriaInput::~TriaInput(){ 39 39 xDelete<IssmDouble>(this->values); 40 return;41 40 } 42 41 /*}}}*/ … … 252 251 void TriaInput::ConstrainMin(IssmDouble minimum){ 253 252 254 constint numnodes = this->NumberofNodes();253 int numnodes = this->NumberofNodes(); 255 254 for(int i=0;i<numnodes;i++) if (values[i]<minimum) values[i]=minimum; 256 255 } … … 260 259 261 260 /*Output*/ 262 IssmDouble norm=0 ;263 constint numnodes=this->NumberofNodes();261 IssmDouble norm=0.; 262 int numnodes=this->NumberofNodes(); 264 263 265 264 for(int i=0;i<numnodes;i++) if(fabs(values[i])>norm) norm=fabs(values[i]); … … 270 269 IssmDouble TriaInput::Max(void){ 271 270 272 constint numnodes=this->NumberofNodes();271 int numnodes=this->NumberofNodes(); 273 272 IssmDouble max=values[0]; 274 273 … … 282 281 IssmDouble TriaInput::MaxAbs(void){ 283 282 284 constint numnodes=this->NumberofNodes();283 int numnodes=this->NumberofNodes(); 285 284 IssmDouble max=fabs(values[0]); 286 285 … … 319 318 320 319 const int numnodes=this->NumberofNodes(); 321 322 320 for(int i=0;i<numnodes;i++)values[i]=values[i]*scale_factor; 323 321 } … … 342 340 void TriaInput::AXPY(Input* xinput,IssmDouble scalar){ 343 341 344 int i;345 342 const int numnodes=this->NumberofNodes(); 346 TriaInput* xtria vertexinput=NULL;343 TriaInput* xtriainput=NULL; 347 344 348 345 /*xinput is of the same type, so cast it: */ 349 346 if(xinput->ObjectEnum()!=TriaInputEnum) _error_("Operation not permitted because xinput is of type " << EnumToStringx(xinput->ObjectEnum())); 350 xtria vertexinput=(TriaInput*)xinput;351 if(xtria vertexinput->element_type!=this->element_type) _error_("Operation not permitted because xinput is of type " << EnumToStringx(xinput->ObjectEnum()));347 xtriainput=(TriaInput*)xinput; 348 if(xtriainput->element_type!=this->element_type) _error_("Operation not permitted because xinput is of type " << EnumToStringx(xinput->ObjectEnum())); 352 349 353 350 /*Carry out the AXPY operation depending on type:*/ 354 for(i =0;i<numnodes;i++)this->values[i]=this->values[i]+scalar*xtriavertexinput->values[i];351 for(int i=0;i<numnodes;i++)this->values[i]=this->values[i]+scalar*xtriainput->values[i]; 355 352 356 353 } … … 387 384 388 385 /*Check that inputB is of the same type*/ 389 if(inputB->ObjectEnum()!=TriaInputEnum) _error_("Operation not permitted because inputB is of type " << EnumToStringx(inputB->ObjectEnum()));386 if(inputB->ObjectEnum()!=TriaInputEnum) _error_("Operation not permitted because inputB is of type " << EnumToStringx(inputB->ObjectEnum())); 390 387 xinputB=(TriaInput*)inputB; 391 if(xinputB->element_type!=this->element_type) _error_("Operation not permitted because inputB is of type " << EnumToStringx( inputB->ObjectEnum()));388 if(xinputB->element_type!=this->element_type) _error_("Operation not permitted because inputB is of type " << EnumToStringx(xinputB->element_type)); 392 389 393 390 /*Create point wise min*/ … … 421 418 if(inputB->ObjectEnum()!=TriaInputEnum) _error_("Operation not permitted because inputB is of type " << EnumToStringx(inputB->ObjectEnum())); 422 419 xinputB=(TriaInput*)inputB; 423 if(xinputB->element_type!=this->element_type) _error_("Operation not permitted because inputB is of type " << EnumToStringx( inputB->ObjectEnum()));420 if(xinputB->element_type!=this->element_type) _error_("Operation not permitted because inputB is of type " << EnumToStringx(xinputB->element_type)); 424 421 425 422 /*Create point wise max*/ -
issm/trunk-jpl/src/c/classes/Inputs/TriaInput.h
r15300 r15417 80 80 void VerticallyIntegrate(Input* thickness_input){_error_("not supported yet");}; 81 81 void GetVectorFromInputs(Vector<IssmDouble>* vector,int* doflist); 82 /*}}}*/83 82 84 83 }; -
issm/trunk-jpl/src/c/classes/Materials/Matdamageice.cpp
r15300 r15417 817 817 if (iomodel->Data(MaterialsRheologyBEnum)) { 818 818 for(i=0;i<num_vertices;i++) nodeinputs[i]=iomodel->Data(MaterialsRheologyBEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+i]-1)]; 819 this->inputs->AddInput(new Penta P1Input(MaterialsRheologyBEnum,nodeinputs));819 this->inputs->AddInput(new PentaInput(MaterialsRheologyBEnum,nodeinputs,P1Enum)); 820 820 } 821 821 … … 823 823 if (iomodel->Data(MaterialsRheologyNEnum)) { 824 824 for(i=0;i<num_vertices;i++) nodeinputs[i]=iomodel->Data(MaterialsRheologyNEnum)[index]; 825 this->inputs->AddInput(new Penta P1Input(MaterialsRheologyNEnum,nodeinputs));825 this->inputs->AddInput(new PentaInput(MaterialsRheologyNEnum,nodeinputs,P1Enum)); 826 826 } 827 827 … … 829 829 if (iomodel->Data(MaterialsRheologyZEnum)) { 830 830 for(i=0;i<num_vertices;i++) nodeinputs[i]=iomodel->Data(MaterialsRheologyZEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+i]-1)]; 831 this->inputs->AddInput(new Penta P1Input(MaterialsRheologyZEnum,nodeinputs));831 this->inputs->AddInput(new PentaInput(MaterialsRheologyZEnum,nodeinputs,P1Enum)); 832 832 } 833 833 … … 843 843 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]; 844 844 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]; 845 this->inputs->AddInput(new ControlInput(MaterialsRheologyBEnum,Penta P1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1));845 this->inputs->AddInput(new ControlInput(MaterialsRheologyBEnum,PentaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1)); 846 846 } 847 847 break; … … 852 852 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]; 853 853 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]; 854 this->inputs->AddInput(new ControlInput(MaterialsRheologyZEnum,Penta P1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1));854 this->inputs->AddInput(new ControlInput(MaterialsRheologyZEnum,PentaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1)); 855 855 } 856 856 break; -
issm/trunk-jpl/src/c/classes/Materials/Matice.cpp
r15384 r15417 14 14 #include "../Inputs/Inputs.h" 15 15 #include "../Inputs/TriaInput.h" 16 #include "../Inputs/Penta P1Input.h"16 #include "../Inputs/PentaInput.h" 17 17 #include "../Inputs/ControlInput.h" 18 18 #include "../Elements/Element.h" … … 571 571 IssmDouble valuesp[6]; 572 572 for (int i=0;i<6;i++) valuesp[i]=vector[((Penta*)element)->vertices[i]->Sid()]; //use sid list, to index into serial oriented vector 573 this->inputs->AddInput(new Penta P1Input(name,valuesp));573 this->inputs->AddInput(new PentaInput(name,valuesp,P1Enum)); 574 574 return; 575 575 } … … 637 637 IssmDouble valuesp[6]; 638 638 for (int i=0;i<6;i++) valuesp[i]=vector[((Penta*)element)->vertices[i]->Sid()]; //use sid list, to index into serial oriented vector 639 this->inputs->AddInput(new Penta P1Input(name,valuesp));639 this->inputs->AddInput(new PentaInput(name,valuesp,P1Enum)); 640 640 return; 641 641 } … … 751 751 if (iomodel->Data(MaterialsRheologyBEnum)) { 752 752 for(i=0;i<num_vertices;i++) nodeinputs[i]=iomodel->Data(MaterialsRheologyBEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+i]-1)]; 753 this->inputs->AddInput(new Penta P1Input(MaterialsRheologyBEnum,nodeinputs));753 this->inputs->AddInput(new PentaInput(MaterialsRheologyBEnum,nodeinputs,P1Enum)); 754 754 } 755 755 … … 757 757 if (iomodel->Data(MaterialsRheologyNEnum)) { 758 758 for(i=0;i<num_vertices;i++) nodeinputs[i]=iomodel->Data(MaterialsRheologyNEnum)[index]; 759 this->inputs->AddInput(new Penta P1Input(MaterialsRheologyNEnum,nodeinputs));759 this->inputs->AddInput(new PentaInput(MaterialsRheologyNEnum,nodeinputs,P1Enum)); 760 760 } 761 761 … … 771 771 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]; 772 772 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]; 773 this->inputs->AddInput(new ControlInput(MaterialsRheologyBEnum,Penta P1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1));773 this->inputs->AddInput(new ControlInput(MaterialsRheologyBEnum,PentaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1)); 774 774 } 775 775 break; -
issm/trunk-jpl/src/c/classes/classes.h
r15372 r15417 56 56 #include "./Inputs/DoubleInput.h" 57 57 #include "./Inputs/IntInput.h" 58 #include "./Inputs/Penta P1Input.h"58 #include "./Inputs/PentaInput.h" 59 59 #include "./Inputs/TriaInput.h" 60 60 #include "./Inputs/ControlInput.h" -
issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
r15401 r15417 370 370 PenpairEnum, 371 371 PentaEnum, 372 Penta P1InputEnum,372 PentaInputEnum, 373 373 ProfilerEnum, 374 374 MatrixParamEnum, -
issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
r15401 r15417 370 370 case PenpairEnum : return "Penpair"; 371 371 case PentaEnum : return "Penta"; 372 case Penta P1InputEnum : return "PentaP1Input";372 case PentaInputEnum : return "PentaInput"; 373 373 case ProfilerEnum : return "Profiler"; 374 374 case MatrixParamEnum : return "MatrixParam"; -
issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
r15401 r15417 376 376 else if (strcmp(name,"Penpair")==0) return PenpairEnum; 377 377 else if (strcmp(name,"Penta")==0) return PentaEnum; 378 else if (strcmp(name,"Penta P1Input")==0) return PentaP1InputEnum;378 else if (strcmp(name,"PentaInput")==0) return PentaInputEnum; 379 379 else if (strcmp(name,"Profiler")==0) return ProfilerEnum; 380 380 else if (strcmp(name,"MatrixParam")==0) return MatrixParamEnum;
Note:
See TracChangeset
for help on using the changeset viewer.