Index: ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.h =================================================================== --- ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.h (revision 16775) +++ ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.h (revision 16776) @@ -26,6 +26,7 @@ void InputUpdateFromSolutionHOFS(IssmDouble* solution,Element* element); void InputUpdateFromSolutionL1L2(IssmDouble* solution,Element* element); void InputUpdateFromSolutionSSA(IssmDouble* solution,Element* element); + void InputUpdateFromSolutionSSAFS(IssmDouble* solution,Element* element); void InputUpdateFromSolutionSSAHO(IssmDouble* solution,Element* element); }; #endif Index: ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp =================================================================== --- ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp (revision 16775) +++ ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp (revision 16776) @@ -952,7 +952,7 @@ InputUpdateFromSolutionHOFS(solution,element); return; case SSAFSApproximationEnum: - _error_("not implemented yet"); + InputUpdateFromSolutionSSAFS(solution,element); return; default: _error_("Approximation "<(doflist); if(meshtype!=Mesh2DhorizontalEnum) delete basalelement; }/*}}}*/ +void StressbalanceAnalysis::InputUpdateFromSolutionSSAFS(IssmDouble* solution,Element* element){/*{{{*/ + + int i; + IssmDouble rho_ice,g,FSreconditioning; + int* doflistSSA = NULL; + int* doflistFSv = NULL; + int* doflistFSp = NULL; + + /*we have to add results of this element for FS and results from the element + * at base for SSA, so we need to have the pointer toward the basal element*/ + Element* basalelement=element->GetBasalElement(); + if(basalelement->ObjectEnum()!=PentaEnum){ + _error_("Coupling not supported for "<ObjectEnum())); + } + + /*Fetch number of nodes and dof for this finite element*/ + int numnodes = 6; + int numdof2d = numnodes; + int numdofSSA = 6*2; + int numdofFSv = 6*3; + int numdofFSp = 6; + + /*Fetch dof list and allocate solution vectors*/ + element->GetDofList(&doflistFSv,FSvelocityEnum,GsetEnum); + element->GetDofListPressure(&doflistFSp,GsetEnum); + basalelement->GetDofList(&doflistSSA, SSAApproximationEnum, GsetEnum); + IssmDouble* SSAvalues = xNew(numdofSSA); + IssmDouble* FSvalues = xNew(numdofFSv+numdofFSp); + IssmDouble* vx = xNew(numnodes); + IssmDouble* vy = xNew(numnodes); + IssmDouble* vz = xNew(numnodes); + IssmDouble* vzSSA = xNew(numnodes); + IssmDouble* vzFS = xNew(numnodes); + IssmDouble* vel = xNew(numnodes); + IssmDouble* pressure = xNew(numnodes); + + /*Prepare coordinate system list*/ + int* cs_list = xNew(2*numnodes); + for(i=0;iFindParam(&FSreconditioning,StressbalanceFSreconditioningEnum); + for(i=0;iTransformSolutionCoord(FSvalues,2*numnodes,cs_list); + element->TransformSolutionCoord(SSAvalues,numnodes,XYEnum); + + /*Ok, we have vx and vy in values, fill in vx and vy arrays: */ + + for(i=0;i(vx[i])) _error_("NaN found in solution vector"); + if(xIsNan(vy[i])) _error_("NaN found in solution vector"); + if(xIsNan(vzFS[i])) _error_("NaN found in solution vector"); + if(xIsNan(pressure[i])) _error_("NaN found in solution vector"); + } + + /*Get Vz and compute vel*/ + element->GetInputListOnVertices(vzSSA,VzSSAEnum); + for(i=0;iInputChangeName(VxEnum,VxPicardEnum); + element->InputChangeName(VyEnum,VyPicardEnum); + element->InputChangeName(VzEnum,VzPicardEnum); + element->InputChangeName(PressureEnum,PressurePicardEnum); + + /*Add vx and vy as inputs to element: */ + element->AddInput(VxEnum,vx,P1Enum); + element->AddInput(VyEnum,vy,P1Enum); + element->AddInput(VzEnum,vz,P1Enum); + element->AddInput(VzFSEnum,vzFS,P1Enum); + element->AddInput(VelEnum,vel,P1Enum); + element->AddInput(PressureEnum,pressure,P1Enum); + + /*Free ressources:*/ + xDelete(pressure); + xDelete(vel); + xDelete(vz); + xDelete(vzSSA); + xDelete(vzFS); + xDelete(vy); + xDelete(vx); + xDelete(FSvalues); + xDelete(SSAvalues); + xDelete(doflistFSp); + xDelete(doflistFSv); + xDelete(doflistSSA); + xDelete(cs_list); +}/*}}}*/ void StressbalanceAnalysis::InputUpdateFromSolutionSSAHO(IssmDouble* solution,Element* element){/*{{{*/ int i,meshtype;