[17802] | 1 | Index: ../trunk-jpl/src/c/analyses/L2ProjectionBaseAnalysis.cpp
|
---|
| 2 | ===================================================================
|
---|
| 3 | --- ../trunk-jpl/src/c/analyses/L2ProjectionBaseAnalysis.cpp (revision 16716)
|
---|
| 4 | +++ ../trunk-jpl/src/c/analyses/L2ProjectionBaseAnalysis.cpp (revision 16717)
|
---|
| 5 | @@ -59,8 +59,17 @@
|
---|
| 6 | }/*}}}*/
|
---|
| 7 | void L2ProjectionBaseAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
|
---|
| 8 |
|
---|
| 9 | - int inputenum;
|
---|
| 10 | + int inputenum,meshtype;
|
---|
| 11 |
|
---|
| 12 | element->FindParam(&inputenum,InputToL2ProjectEnum);
|
---|
| 13 | - element->InputUpdateFromSolutionOneDofCollapsed(solution,inputenum);
|
---|
| 14 | + element->FindParam(&meshtype,MeshTypeEnum);
|
---|
| 15 | + switch(meshtype){
|
---|
| 16 | + case Mesh2DhorizontalEnum:
|
---|
| 17 | + element->InputUpdateFromSolutionOneDof(solution,inputenum);
|
---|
| 18 | + break;
|
---|
| 19 | + case Mesh3DEnum:
|
---|
| 20 | + element->InputUpdateFromSolutionOneDofCollapsed(solution,inputenum);
|
---|
| 21 | + break;
|
---|
| 22 | + default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet");
|
---|
| 23 | + }
|
---|
| 24 | }/*}}}*/
|
---|
| 25 | Index: ../trunk-jpl/src/c/analyses/StressbalanceSIAAnalysis.cpp
|
---|
| 26 | ===================================================================
|
---|
| 27 | --- ../trunk-jpl/src/c/analyses/StressbalanceSIAAnalysis.cpp (revision 16716)
|
---|
| 28 | +++ ../trunk-jpl/src/c/analyses/StressbalanceSIAAnalysis.cpp (revision 16717)
|
---|
| 29 | @@ -167,5 +167,84 @@
|
---|
| 30 | xDelete<IssmDouble>(values);
|
---|
| 31 | }/*}}}*/
|
---|
| 32 | void StressbalanceSIAAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
|
---|
| 33 | - _error_("not implemented yet");
|
---|
| 34 | +
|
---|
| 35 | + int i,meshtype;
|
---|
| 36 | + IssmDouble rho_ice,g;
|
---|
| 37 | + int* doflist=NULL;
|
---|
| 38 | + IssmDouble* xyz_list=NULL;
|
---|
| 39 | +
|
---|
| 40 | + /*Fetch number of nodes and dof for this finite element*/
|
---|
| 41 | + int numnodes = element->GetNumberOfNodes();
|
---|
| 42 | + int numdof = numnodes*2;
|
---|
| 43 | +
|
---|
| 44 | + /*Fetch dof list and allocate solution vectors*/
|
---|
| 45 | + element->GetDofList(&doflist,NoneApproximationEnum,GsetEnum);
|
---|
| 46 | + IssmDouble* values = xNew<IssmDouble>(numdof);
|
---|
| 47 | + IssmDouble* vx = xNew<IssmDouble>(numdof);
|
---|
| 48 | + IssmDouble* vy = xNew<IssmDouble>(numdof);
|
---|
| 49 | + IssmDouble* vz = xNew<IssmDouble>(numdof);
|
---|
| 50 | + IssmDouble* vel = xNew<IssmDouble>(numdof);
|
---|
| 51 | + IssmDouble* pressure = xNew<IssmDouble>(numdof);
|
---|
| 52 | + IssmDouble* thickness = xNew<IssmDouble>(numdof);
|
---|
| 53 | + IssmDouble* surface = xNew<IssmDouble>(numnodes);
|
---|
| 54 | +
|
---|
| 55 | + /*Use the dof list to index into the solution vector: */
|
---|
| 56 | + for(i=0;i<numdof;i++) values[i]=solution[doflist[i]];
|
---|
| 57 | +
|
---|
| 58 | + /*Transform solution in Cartesian Space*/
|
---|
| 59 | + element->TransformSolutionCoord(&values[0],XYEnum);
|
---|
| 60 | +
|
---|
| 61 | + /*Ok, we have vx and vy in values, fill in vx and vy arrays: */
|
---|
| 62 | + for(i=0;i<numnodes;i++){
|
---|
| 63 | + vx[i]=values[i*NDOF2+0];
|
---|
| 64 | + vy[i]=values[i*NDOF2+1];
|
---|
| 65 | +
|
---|
| 66 | + /*Check solution*/
|
---|
| 67 | + if(xIsNan<IssmDouble>(vx[i])) _error_("NaN found in solution vector");
|
---|
| 68 | + if(xIsNan<IssmDouble>(vy[i])) _error_("NaN found in solution vector");
|
---|
| 69 | + }
|
---|
| 70 | +
|
---|
| 71 | + /*Get Vz and compute vel*/
|
---|
| 72 | + element->GetInputListOnNodes(&vz[0],VzEnum,0.);
|
---|
| 73 | + for(i=0;i<numnodes;i++) vel[i]=sqrt(vx[i]*vx[i] + vy[i]*vy[i] + vz[i]*vz[i]);
|
---|
| 74 | +
|
---|
| 75 | + /*For pressure: we have not computed pressure in this analysis, for this element. We are in 2D,
|
---|
| 76 | + *so the pressure is just the pressure at the bedrock: */
|
---|
| 77 | + rho_ice = element->GetMaterialParameter(MaterialsRhoIceEnum);
|
---|
| 78 | + g = element->GetMaterialParameter(ConstantsGEnum);
|
---|
| 79 | + switch(meshtype){
|
---|
| 80 | + case Mesh2DhorizontalEnum:
|
---|
| 81 | + element->GetInputListOnNodes(&thickness[0],ThicknessEnum);
|
---|
| 82 | + for(i=0;i<numnodes;i++) pressure[i]=rho_ice*g*thickness[i];
|
---|
| 83 | + break;
|
---|
| 84 | + case Mesh3DEnum:
|
---|
| 85 | + element->GetVerticesCoordinates(&xyz_list);
|
---|
| 86 | + element->GetInputListOnNodes(&surface[0],SurfaceEnum);
|
---|
| 87 | + for(i=0;i<numnodes;i++) pressure[i]=rho_ice*g*(surface[i]-xyz_list[i*3+2]);
|
---|
| 88 | + break;
|
---|
| 89 | + default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet");
|
---|
| 90 | + }
|
---|
| 91 | +
|
---|
| 92 | + /*Now, we have to move the previous Vx and Vy inputs to old
|
---|
| 93 | + * status, otherwise, we'll wipe them off: */
|
---|
| 94 | + element->InputChangeName(VxEnum,VxPicardEnum);
|
---|
| 95 | + element->InputChangeName(VyEnum,VyPicardEnum);
|
---|
| 96 | + element->InputChangeName(PressureEnum,PressurePicardEnum);
|
---|
| 97 | +
|
---|
| 98 | + /*Add vx and vy as inputs to the tria element: */
|
---|
| 99 | + element->AddInput(VxEnum,vx,P1Enum);
|
---|
| 100 | + element->AddInput(VyEnum,vy,P1Enum);
|
---|
| 101 | + element->AddInput(VelEnum,vel,P1Enum);
|
---|
| 102 | + element->AddInput(PressureEnum,pressure,P1Enum);
|
---|
| 103 | +
|
---|
| 104 | + /*Free ressources:*/
|
---|
| 105 | + xDelete<IssmDouble>(thickness);
|
---|
| 106 | + xDelete<IssmDouble>(surface);
|
---|
| 107 | + xDelete<IssmDouble>(pressure);
|
---|
| 108 | + xDelete<IssmDouble>(vel);
|
---|
| 109 | + xDelete<IssmDouble>(vz);
|
---|
| 110 | + xDelete<IssmDouble>(vy);
|
---|
| 111 | + xDelete<IssmDouble>(vx);
|
---|
| 112 | + xDelete<IssmDouble>(values);
|
---|
| 113 | + xDelete<int>(doflist);
|
---|
| 114 | }/*}}}*/
|
---|
| 115 | Index: ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
|
---|
| 116 | ===================================================================
|
---|
| 117 | --- ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp (revision 16716)
|
---|
| 118 | +++ ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp (revision 16717)
|
---|
| 119 | @@ -940,7 +940,7 @@
|
---|
| 120 | InputUpdateFromSolutionHoriz(solution,element);
|
---|
| 121 | return;
|
---|
| 122 | case L1L2ApproximationEnum:
|
---|
| 123 | - //InputUpdateFromSolutionHoriz(solution,element);
|
---|
| 124 | + InputUpdateFromSolutionHoriz(solution,element);
|
---|
| 125 | return;
|
---|
| 126 | case SSAHOApproximationEnum: case HOFSApproximationEnum: case SSAFSApproximationEnum:
|
---|
| 127 | /*the elements around will create the solution*/
|
---|
| 128 | Index: ../trunk-jpl/src/c/classes/Elements/Element.h
|
---|
| 129 | ===================================================================
|
---|
| 130 | --- ../trunk-jpl/src/c/classes/Elements/Element.h (revision 16716)
|
---|
| 131 | +++ ../trunk-jpl/src/c/classes/Elements/Element.h (revision 16717)
|
---|
| 132 | @@ -88,6 +88,7 @@
|
---|
| 133 | virtual void InputDuplicate(int original_enum,int new_enum)=0;
|
---|
| 134 | virtual void InputCreate(IssmDouble* vector,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code)=0;
|
---|
| 135 | virtual void InputUpdateFromSolutionOneDofCollapsed(IssmDouble* solution,int inputenum)=0;
|
---|
| 136 | + virtual void InputUpdateFromSolutionOneDof(IssmDouble* solution,int inputenum)=0;
|
---|
| 137 |
|
---|
| 138 | virtual int NodalValue(IssmDouble* pvalue, int index, int natureofdataenum)=0;
|
---|
| 139 | virtual int NumberofNodesVelocity(void)=0;
|
---|
| 140 | Index: ../trunk-jpl/src/c/classes/Elements/Seg.h
|
---|
| 141 | ===================================================================
|
---|
| 142 | --- ../trunk-jpl/src/c/classes/Elements/Seg.h (revision 16716)
|
---|
| 143 | +++ ../trunk-jpl/src/c/classes/Elements/Seg.h (revision 16717)
|
---|
| 144 | @@ -55,6 +55,7 @@
|
---|
| 145 | /*Update virtual functions resolution: {{{*/
|
---|
| 146 | void InputUpdateFromSolution(IssmDouble* solution){_error_("not implemented yet");};
|
---|
| 147 | void InputUpdateFromSolutionOneDofCollapsed(IssmDouble* solution,int inputenum){_error_("not implemented yet");};
|
---|
| 148 | + void InputUpdateFromSolutionOneDof(IssmDouble* solution,int inputenum){_error_("not implemented yet");};
|
---|
| 149 | void InputUpdateFromVector(IssmDouble* vector, int name, int type){_error_("not implemented yet");};
|
---|
| 150 | #ifdef _HAVE_DAKOTA_
|
---|
| 151 | void InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type){_error_("not implemented yet");};
|
---|