source:
issm/oecreview/Archive/16554-17801/ISSM-16775-16776.diff@
17802
Last change on this file since 17802 was 17802, checked in by , 11 years ago | |
---|---|
File size: 5.6 KB |
-
../trunk-jpl/src/c/analyses/StressbalanceAnalysis.h
26 26 void InputUpdateFromSolutionHOFS(IssmDouble* solution,Element* element); 27 27 void InputUpdateFromSolutionL1L2(IssmDouble* solution,Element* element); 28 28 void InputUpdateFromSolutionSSA(IssmDouble* solution,Element* element); 29 void InputUpdateFromSolutionSSAFS(IssmDouble* solution,Element* element); 29 30 void InputUpdateFromSolutionSSAHO(IssmDouble* solution,Element* element); 30 31 }; 31 32 #endif -
../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
952 952 InputUpdateFromSolutionHOFS(solution,element); 953 953 return; 954 954 case SSAFSApproximationEnum: 955 _error_("not implemented yet");955 InputUpdateFromSolutionSSAFS(solution,element); 956 956 return; 957 957 default: 958 958 _error_("Approximation "<<EnumToStringx(approximation)<<" not supported"); … … 1423 1423 xDelete<int>(doflist); 1424 1424 if(meshtype!=Mesh2DhorizontalEnum) delete basalelement; 1425 1425 }/*}}}*/ 1426 void 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 }/*}}}*/ 1426 1532 void StressbalanceAnalysis::InputUpdateFromSolutionSSAHO(IssmDouble* solution,Element* element){/*{{{*/ 1427 1533 1428 1534 int i,meshtype;
Note:
See TracBrowser
for help on using the repository browser.