source: issm/oecreview/Archive/16554-17801/ISSM-16775-16776.diff@ 17802

Last change on this file since 17802 was 17802, checked in by Mathieu Morlighem, 11 years ago

Added archives

File size: 5.6 KB
  • ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.h

     
    2626                void InputUpdateFromSolutionHOFS(IssmDouble* solution,Element* element);
    2727                void InputUpdateFromSolutionL1L2(IssmDouble* solution,Element* element);
    2828                void InputUpdateFromSolutionSSA(IssmDouble* solution,Element* element);
     29                void InputUpdateFromSolutionSSAFS(IssmDouble* solution,Element* element);
    2930                void InputUpdateFromSolutionSSAHO(IssmDouble* solution,Element* element);
    3031};
    3132#endif
  • ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp

     
    952952                        InputUpdateFromSolutionHOFS(solution,element);
    953953                        return;
    954954                case SSAFSApproximationEnum:
    955                         _error_("not implemented yet");
     955                        InputUpdateFromSolutionSSAFS(solution,element);
    956956                        return;
    957957                default:
    958958                        _error_("Approximation "<<EnumToStringx(approximation)<<" not supported");
     
    14231423        xDelete<int>(doflist);
    14241424        if(meshtype!=Mesh2DhorizontalEnum) delete basalelement;
    14251425}/*}}}*/
     1426void StressbalanceAnalysis::InputUpdateFromSolutionSSAFS(IssmDouble* solution,Element* element){/*{{{*/
     1427
     1428        int         i;
     1429        IssmDouble  rho_ice,g,FSreconditioning;
     1430        int*        doflistSSA  = NULL;
     1431        int*        doflistFSv = NULL;
     1432        int*        doflistFSp = NULL;
     1433
     1434        /*we have to add results of this element for FS and results from the element
     1435         * at base for SSA, so we need to have the pointer toward the basal element*/
     1436        Element* basalelement=element->GetBasalElement();
     1437        if(basalelement->ObjectEnum()!=PentaEnum){
     1438                _error_("Coupling not supported for "<<EnumToStringx(basalelement->ObjectEnum()));
     1439        }
     1440
     1441        /*Fetch number of nodes and dof for this finite element*/
     1442        int numnodes  = 6;
     1443        int numdof2d  = numnodes;
     1444        int numdofSSA = 6*2;
     1445        int numdofFSv = 6*3;
     1446        int numdofFSp = 6;
     1447
     1448        /*Fetch dof list and allocate solution vectors*/
     1449        element->GetDofList(&doflistFSv,FSvelocityEnum,GsetEnum);
     1450        element->GetDofListPressure(&doflistFSp,GsetEnum);
     1451        basalelement->GetDofList(&doflistSSA, SSAApproximationEnum, GsetEnum);
     1452        IssmDouble* SSAvalues  = xNew<IssmDouble>(numdofSSA);
     1453        IssmDouble* FSvalues  = xNew<IssmDouble>(numdofFSv+numdofFSp);
     1454        IssmDouble* vx        = xNew<IssmDouble>(numnodes);
     1455        IssmDouble* vy        = xNew<IssmDouble>(numnodes);
     1456        IssmDouble* vz        = xNew<IssmDouble>(numnodes);
     1457        IssmDouble* vzSSA      = xNew<IssmDouble>(numnodes);
     1458        IssmDouble* vzFS      = xNew<IssmDouble>(numnodes);
     1459        IssmDouble* vel       = xNew<IssmDouble>(numnodes);
     1460        IssmDouble* pressure  = xNew<IssmDouble>(numnodes);
     1461
     1462        /*Prepare coordinate system list*/
     1463        int* cs_list = xNew<int>(2*numnodes);
     1464        for(i=0;i<numnodes;i++) cs_list[i]          = XYZEnum;
     1465        for(i=0;i<numnodes;i++) cs_list[numnodes+i] = PressureEnum;
     1466
     1467        /*Use the dof list to index into the solution vector: */
     1468        element->FindParam(&FSreconditioning,StressbalanceFSreconditioningEnum);
     1469        for(i=0;i<numdof2d;i++){
     1470                SSAvalues[i]          = solution[doflistSSA[i]];
     1471                SSAvalues[i+numdof2d] = solution[doflistSSA[i]];
     1472        }
     1473        for(i=0;i<numdofFSv;i++) FSvalues[i]=solution[doflistFSv[i]];
     1474        for(i=0;i<numdofFSp;i++) FSvalues[numdofFSv+i]=solution[doflistFSp[i]];
     1475
     1476        /*Transform solution in Cartesian Space*/
     1477        element->TransformSolutionCoord(FSvalues,2*numnodes,cs_list);
     1478        element->TransformSolutionCoord(SSAvalues,numnodes,XYEnum);
     1479
     1480        /*Ok, we have vx and vy in values, fill in vx and vy arrays: */
     1481
     1482        for(i=0;i<numnodes;i++){
     1483                vx[i]       = FSvalues[i*3+0]+SSAvalues[i*2+0];
     1484                vy[i]       = FSvalues[i*3+1]+SSAvalues[i*2+1];
     1485                vzFS[i]     = FSvalues[i*3+2];
     1486                pressure[i] = FSvalues[numnodes*3+i]*FSreconditioning;
     1487
     1488                /*Check solution*/
     1489                if(xIsNan<IssmDouble>(vx[i]))       _error_("NaN found in solution vector");
     1490                if(xIsNan<IssmDouble>(vy[i]))       _error_("NaN found in solution vector");
     1491                if(xIsNan<IssmDouble>(vzFS[i]))     _error_("NaN found in solution vector");
     1492                if(xIsNan<IssmDouble>(pressure[i])) _error_("NaN found in solution vector");
     1493        }
     1494
     1495        /*Get Vz and compute vel*/
     1496        element->GetInputListOnVertices(vzSSA,VzSSAEnum);
     1497        for(i=0;i<numnodes;i++){
     1498                vz[i] = vzSSA[i]+vzFS[i];
     1499                vel[i]= sqrt(vx[i]*vx[i] + vy[i]*vy[i] + vz[i]*vz[i]);
     1500        }
     1501
     1502        /*Now, we have to move the previous Vx and Vy inputs  to old
     1503         * status, otherwise, we'll wipe them off: */
     1504        element->InputChangeName(VxEnum,VxPicardEnum);
     1505        element->InputChangeName(VyEnum,VyPicardEnum);
     1506        element->InputChangeName(VzEnum,VzPicardEnum);
     1507        element->InputChangeName(PressureEnum,PressurePicardEnum);
     1508
     1509        /*Add vx and vy as inputs to element: */
     1510        element->AddInput(VxEnum,vx,P1Enum);
     1511        element->AddInput(VyEnum,vy,P1Enum);
     1512        element->AddInput(VzEnum,vz,P1Enum);
     1513        element->AddInput(VzFSEnum,vzFS,P1Enum);
     1514        element->AddInput(VelEnum,vel,P1Enum);
     1515        element->AddInput(PressureEnum,pressure,P1Enum);
     1516
     1517        /*Free ressources:*/
     1518        xDelete<IssmDouble>(pressure);
     1519        xDelete<IssmDouble>(vel);
     1520        xDelete<IssmDouble>(vz);
     1521        xDelete<IssmDouble>(vzSSA);
     1522        xDelete<IssmDouble>(vzFS);
     1523        xDelete<IssmDouble>(vy);
     1524        xDelete<IssmDouble>(vx);
     1525        xDelete<IssmDouble>(FSvalues);
     1526        xDelete<IssmDouble>(SSAvalues);
     1527        xDelete<int>(doflistFSp);
     1528        xDelete<int>(doflistFSv);
     1529        xDelete<int>(doflistSSA);
     1530        xDelete<int>(cs_list);
     1531}/*}}}*/
    14261532void StressbalanceAnalysis::InputUpdateFromSolutionSSAHO(IssmDouble* solution,Element* element){/*{{{*/
    14271533
    14281534        int         i,meshtype;
Note: See TracBrowser for help on using the repository browser.