source:
issm/oecreview/Archive/16554-17801/ISSM-16858-16859.diff@
17802
Last change on this file since 17802 was 17802, checked in by , 11 years ago | |
---|---|
File size: 6.6 KB |
-
../trunk-jpl/src/c/analyses/StressbalanceAnalysis.h
37 37 void GetBSSAprime(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss); 38 38 void InputUpdateFromSolutionSSA(IssmDouble* solution,Element* element); 39 39 /*L1L2*/ 40 ElementVector* CreatePVectorL1L2(Element* element); 41 ElementVector* CreatePVectorL1L2DrivingStress(Element* element); 42 ElementVector* CreatePVectorL1L2Front(Element* element); 40 43 void InputUpdateFromSolutionL1L2(IssmDouble* solution,Element* element); 41 44 /*HO*/ 42 45 ElementMatrix* CreateKMatrixHO(Element* element); -
../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
838 838 return NULL; 839 839 case SSAApproximationEnum: 840 840 return CreatePVectorSSA(element); 841 case L1L2ApproximationEnum: 842 return CreatePVectorL1L2(element); 841 843 case HOApproximationEnum: 842 844 return CreatePVectorHO(element); 843 845 case FSApproximationEnum: … … 1338 1340 }/*}}}*/ 1339 1341 1340 1342 /*L1L2*/ 1343 ElementVector* 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 }/*}}}*/ 1373 ElementVector* 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 }/*}}}*/ 1419 ElementVector* 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 }/*}}}*/ 1341 1481 void StressbalanceAnalysis::InputUpdateFromSolutionL1L2(IssmDouble* solution,Element* element){/*{{{*/ 1342 1482 1343 1483 int i,meshtype;
Note:
See TracBrowser
for help on using the repository browser.