source: issm/oecreview/Archive/16554-17801/ISSM-16858-16859.diff@ 17802

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

Added archives

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

     
    3737                void GetBSSAprime(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
    3838                void InputUpdateFromSolutionSSA(IssmDouble* solution,Element* element);
    3939                /*L1L2*/
     40                ElementVector* CreatePVectorL1L2(Element* element);
     41                ElementVector* CreatePVectorL1L2DrivingStress(Element* element);
     42                ElementVector* CreatePVectorL1L2Front(Element* element);
    4043                void InputUpdateFromSolutionL1L2(IssmDouble* solution,Element* element);
    4144                /*HO*/
    4245                ElementMatrix* CreateKMatrixHO(Element* element);
  • ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp

     
    838838                        return NULL;
    839839                case SSAApproximationEnum:
    840840                        return CreatePVectorSSA(element);
     841                case L1L2ApproximationEnum:
     842                        return CreatePVectorL1L2(element);
    841843                case HOApproximationEnum:
    842844                        return CreatePVectorHO(element);
    843845                case FSApproximationEnum:
     
    13381340}/*}}}*/
    13391341
    13401342/*L1L2*/
     1343ElementVector* StressbalanceAnalysis::CreatePVectorL1L2(Element* element){/*{{{*/
     1344
     1345        /*Intermediaries*/
     1346        int      meshtype;
     1347        Element* basalelement;
     1348
     1349        /*Get basal element*/
     1350        element->FindParam(&meshtype,MeshTypeEnum);
     1351        switch(meshtype){
     1352                case Mesh2DhorizontalEnum:
     1353                        basalelement = element;
     1354                        break;
     1355                case Mesh3DEnum:
     1356                        if(!element->IsOnBed()) return NULL;
     1357                        basalelement = element->SpawnBasalElement();
     1358                        break;
     1359                default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet");
     1360        }
     1361
     1362        /*compute all load vectors for this element*/
     1363        ElementVector* pe1=CreatePVectorL1L2DrivingStress(basalelement);
     1364        ElementVector* pe2=CreatePVectorL1L2Front(basalelement);
     1365        ElementVector* pe =new ElementVector(pe1,pe2);
     1366
     1367        /*clean-up and return*/
     1368        if(meshtype!=Mesh2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
     1369        delete pe1;
     1370        delete pe2;
     1371        return pe;
     1372}/*}}}*/
     1373ElementVector* StressbalanceAnalysis::CreatePVectorL1L2DrivingStress(Element* element){/*{{{*/
     1374
     1375        /*Intermediaries */
     1376        IssmDouble  thickness,Jdet,slope[2];
     1377        IssmDouble* xyz_list = NULL;
     1378
     1379        /*Fetch number of nodes and dof for this finite element*/
     1380        int numnodes = element->GetNumberOfNodes();
     1381
     1382        /*Initialize Element vector and vectors*/
     1383        ElementVector* pe    = element->NewElementVector(L1L2ApproximationEnum);
     1384        IssmDouble*    basis = xNew<IssmDouble>(numnodes);
     1385
     1386        /*Retrieve all inputs and parameters*/
     1387        element->GetVerticesCoordinates(&xyz_list);
     1388        Input*     thickness_input=element->GetInput(ThicknessEnum); _assert_(thickness_input);
     1389        Input*     surface_input  =element->GetInput(SurfaceEnum);   _assert_(surface_input);
     1390        IssmDouble rhog = element->GetMaterialParameter(MaterialsRhoIceEnum)*element->GetMaterialParameter(ConstantsGEnum);
     1391
     1392        /* Start  looping on the number of gaussian points: */
     1393        Gauss* gauss=element->NewGauss(2);
     1394        for(int ig=gauss->begin();ig<gauss->end();ig++){
     1395
     1396                gauss->GaussPoint(ig);
     1397
     1398                element->JacobianDeterminant(&Jdet,xyz_list,gauss);
     1399                element->NodalFunctions(basis, gauss);
     1400
     1401                thickness_input->GetInputValue(&thickness,gauss);
     1402                surface_input->GetInputDerivativeValue(&slope[0],xyz_list,gauss);
     1403
     1404                for(int i=0;i<numnodes;i++){
     1405                        pe->values[i*2+0]+=-rhog*thickness*slope[0]*Jdet*gauss->weight*basis[i];
     1406                        pe->values[i*2+1]+=-rhog*thickness*slope[1]*Jdet*gauss->weight*basis[i];
     1407                }
     1408        }
     1409
     1410        /*Transform coordinate system*/
     1411        element->TransformLoadVectorCoord(pe,XYEnum);
     1412
     1413        /*Clean up and return*/
     1414        xDelete<IssmDouble>(xyz_list);
     1415        xDelete<IssmDouble>(basis);
     1416        delete gauss;
     1417        return pe;
     1418}/*}}}*/
     1419ElementVector* StressbalanceAnalysis::CreatePVectorL1L2Front(Element* element){/*{{{*/
     1420
     1421        /*If no front, return NULL*/
     1422        if(!element->IsZeroLevelset(MaskIceLevelsetEnum)) return NULL;
     1423
     1424        /*Intermediaries*/
     1425        IssmDouble  Jdet,thickness,bed,water_pressure,ice_pressure;
     1426        IssmDouble  surface_under_water,base_under_water,pressure;
     1427        IssmDouble *xyz_list = NULL;
     1428        IssmDouble *xyz_list_front = NULL;
     1429        IssmDouble  normal[2];
     1430
     1431        /*Fetch number of nodes for this finite element*/
     1432        int numnodes = element->GetNumberOfNodes();
     1433
     1434        /*Initialize Element vector and other vectors*/
     1435        ElementVector* pe    = element->NewElementVector(L1L2ApproximationEnum);
     1436        IssmDouble*    basis = xNew<IssmDouble>(numnodes);
     1437
     1438        /*Retrieve all inputs and parameters*/
     1439        Input* thickness_input = element->GetInput(ThicknessEnum); _assert_(thickness_input);
     1440        Input* bed_input       = element->GetInput(BedEnum);       _assert_(bed_input);
     1441        IssmDouble rho_water   = element->GetMaterialParameter(MaterialsRhoWaterEnum);
     1442        IssmDouble rho_ice     = element->GetMaterialParameter(MaterialsRhoIceEnum);
     1443        IssmDouble gravity     = element->GetMaterialParameter(ConstantsGEnum);
     1444        element->GetVerticesCoordinates(&xyz_list);
     1445        element->ZeroLevelsetCoordinates(&xyz_list_front,xyz_list,MaskIceLevelsetEnum);
     1446        element->NormalSection(&normal[0],xyz_list_front);
     1447
     1448        /*Start looping on Gaussian points*/
     1449        Gauss* gauss=element->NewGauss(xyz_list,xyz_list_front,3);
     1450        for(int ig=gauss->begin();ig<gauss->end();ig++){
     1451
     1452                gauss->GaussPoint(ig);
     1453                thickness_input->GetInputValue(&thickness,gauss);
     1454                bed_input->GetInputValue(&bed,gauss);
     1455                element->JacobianDeterminantSurface(&Jdet,xyz_list_front,gauss);
     1456                element->NodalFunctions(basis,gauss);
     1457
     1458                surface_under_water = min(0.,thickness+bed); // 0 if the top of the glacier is above water level
     1459                base_under_water    = min(0.,bed);           // 0 if the bottom of the glacier is above water level
     1460                water_pressure = 1.0/2.0*gravity*rho_water*(surface_under_water*surface_under_water - base_under_water*base_under_water);
     1461                ice_pressure   = 1.0/2.0*gravity*rho_ice*thickness*thickness;
     1462                pressure = ice_pressure + water_pressure;
     1463
     1464                for (int i=0;i<numnodes;i++){
     1465                        pe->values[2*i+0]+= pressure*Jdet*gauss->weight*normal[0]*basis[i];
     1466                        pe->values[2*i+1]+= pressure*Jdet*gauss->weight*normal[1]*basis[i];
     1467                }
     1468        }
     1469
     1470        /*Transform coordinate system*/
     1471        element->TransformLoadVectorCoord(pe,XYEnum);
     1472
     1473        /*Clean up and return*/
     1474        xDelete<IssmDouble>(xyz_list);
     1475        xDelete<IssmDouble>(xyz_list_front);
     1476        xDelete<IssmDouble>(basis);
     1477        delete gauss;
     1478        return pe;
     1479        return NULL;
     1480}/*}}}*/
    13411481void StressbalanceAnalysis::InputUpdateFromSolutionL1L2(IssmDouble* solution,Element* element){/*{{{*/
    13421482
    13431483        int         i,meshtype;
Note: See TracBrowser for help on using the repository browser.