Changeset 16951
- Timestamp:
- 11/26/13 11:31:24 (11 years ago)
- Location:
- issm/trunk-jpl/src/c/analyses
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
r16950 r16951 3086 3086 3087 3087 return NULL; 3088 /*Initialize Element matrix and return if necessary*/ 3089 if(element->IsFloating() || !element->IsOnBed()) return NULL; 3090 3091 /*Build a tria element using the 3 nodes of the base of the penta. Then use 3092 * the tria functionality to build a friction stiffness matrix on these 3 3093 * nodes: */ 3094 Element* basalelement = element->SpawnBasalElement(); 3095 ElementMatrix* Ke=CreateKMatrixSSAFriction(element); 3096 basalelement->DeleteMaterials(); delete basalelement; 3097 3098 /*clean-up and return*/ 3099 return Ke; 3088 3100 }/*}}}*/ 3089 3101 ElementMatrix* StressbalanceAnalysis::CreateKMatrixSSA3dViscous(Element* element){/*{{{*/ … … 3476 3488 }/*}}}*/ 3477 3489 ElementMatrix* StressbalanceAnalysis::CreateKMatrixCouplingSSAFSFriction(Element* element){/*{{{*/ 3478 return NULL; 3479 3490 3491 /*Constants*/ 3492 const int numdofs = (6+1)*3 + 6*1; 3493 const int numdofm = 6 *2; 3494 const int numdof2d = 3 *3; 3495 const int numdof2dm = 3 *2; 3496 const int numdoftot = 6*2 + (6+1)*3 +6; // HO + FS vel + FS Pressure 3497 3498 /*Intermediaries */ 3499 int i,j,approximation; 3500 int dim=3; 3501 IssmDouble FSreconditioning,viscosity,alpha2_gauss,Jdet2d; 3502 IssmDouble bed_normal[3]; 3503 IssmDouble LSSAFS[8][numdof2dm]; 3504 IssmDouble LprimeSSAFS[8][numdofs]; 3505 IssmDouble DLSSAFS[8][8]={0.0}; 3506 IssmDouble LFSSSA[4][numdof2d]; 3507 IssmDouble LprimeFSSSA[4][numdof2dm]; 3508 IssmDouble DLFSSSA[4][4]={0.0}; 3509 IssmDouble Ke_drag_gaussian[numdof2dm][numdofs]; 3510 IssmDouble Ke_drag_gaussian2[numdof2d][numdof2dm]; 3511 IssmDouble *xyz_list = NULL; 3512 IssmDouble *xyz_list_tria = NULL; 3513 3514 /*If on water or not FS, skip stiffness: */ 3515 element->GetInputValue(&approximation,ApproximationEnum); 3516 if(element->IsFloating() || !element->IsOnBed()) return NULL; 3517 3518 int vnumnodes = element->GetNumberOfNodesVelocity(); 3519 int pnumnodes = element->GetNumberOfNodesPressure(); 3520 int numnodes = 2*vnumnodes-1+pnumnodes; 3521 3522 /*Prepare node list*/ 3523 int* cs_list = xNew<int>(2*vnumnodes+pnumnodes); 3524 Node **node_list = xNew<Node*>(2*vnumnodes+pnumnodes); 3525 for(i=0;i<vnumnodes-1;i++){ 3526 node_list[i] = element->GetNode(i); 3527 cs_list[i] = XYEnum; 3528 } 3529 for(i=0;i<vnumnodes;i++){ 3530 node_list[i+vnumnodes-1] = element->GetNode(i); 3531 cs_list[i+vnumnodes-1] = XYZEnum; 3532 } 3533 for(i=0;i<pnumnodes;i++){ 3534 node_list[2*vnumnodes-1+i] = element->GetNode(vnumnodes+i); 3535 cs_list[2*vnumnodes-1+i] = PressureEnum; 3536 } 3537 3538 ElementMatrix* Ke1=element->NewElementMatrix(SSAApproximationEnum); 3539 ElementMatrix* Ke2=element->NewElementMatrix(FSvelocityEnum); 3540 ElementMatrix* Ke=new ElementMatrix(Ke1,Ke2); 3541 delete Ke1; delete Ke2; 3542 3543 /*Retrieve all inputs and parameters*/ 3544 element->GetVerticesCoordinates(&xyz_list); 3545 element->GetVerticesCoordinatesBase(&xyz_list_tria); 3546 element->FindParam(&FSreconditioning,StressbalanceFSreconditioningEnum); 3547 Input* vx_input=element->GetInput(VxEnum); _assert_(vx_input); 3548 Input* vy_input=element->GetInput(VyEnum); _assert_(vy_input); 3549 Input* vz_input=element->GetInput(VzEnum); _assert_(vz_input); 3550 3551 /*build friction object, used later on: */ 3552 Friction* friction=new Friction(element,3); 3553 3554 /* Start looping on the number of gaussian points: */ 3555 Gauss* gauss=element->NewGaussBase(2); 3556 for(int ig=gauss->begin();ig<gauss->end();ig++){ 3557 3558 gauss->GaussPoint(ig); 3559 3560 element->JacobianDeterminantBase(&Jdet2d,xyz_list_tria,gauss); 3561 this->GetLSSAFS(&LSSAFS[0][0], element,gauss); 3562 this->GetLprimeSSAFS(&LprimeSSAFS[0][0], element,xyz_list, gauss); 3563 this->GetLFSSSA(&LFSSSA[0][0],element, gauss); 3564 this->GetLprimeFSSSA(&LprimeFSSSA[0][0], element,xyz_list, gauss); 3565 3566 element->ViscosityFS(&viscosity,dim,xyz_list,gauss,vx_input,vy_input,vz_input); 3567 3568 element->NormalBase(&bed_normal[0],xyz_list_tria); 3569 friction->GetAlpha2(&alpha2_gauss, gauss,vx_input,vy_input,vz_input); 3570 3571 DLSSAFS[0][0]=alpha2_gauss*gauss->weight*Jdet2d; 3572 DLSSAFS[1][1]=alpha2_gauss*gauss->weight*Jdet2d; 3573 DLSSAFS[2][2]=-alpha2_gauss*gauss->weight*Jdet2d*bed_normal[0]*bed_normal[2]; 3574 DLSSAFS[3][3]=-alpha2_gauss*gauss->weight*Jdet2d*bed_normal[1]*bed_normal[2]; 3575 DLSSAFS[4][4]=-2*viscosity*gauss->weight*Jdet2d*bed_normal[0]; 3576 DLSSAFS[5][5]=-2*viscosity*gauss->weight*Jdet2d*bed_normal[1]; 3577 DLSSAFS[6][6]=FSreconditioning*gauss->weight*Jdet2d*bed_normal[0]; 3578 DLSSAFS[7][7]=FSreconditioning*gauss->weight*Jdet2d*bed_normal[1]; 3579 3580 DLFSSSA[0][0]=alpha2_gauss*gauss->weight*Jdet2d; 3581 DLFSSSA[1][1]=alpha2_gauss*gauss->weight*Jdet2d; 3582 DLFSSSA[2][2]=-alpha2_gauss*gauss->weight*Jdet2d*bed_normal[0]*bed_normal[2]; 3583 DLFSSSA[3][3]=-alpha2_gauss*gauss->weight*Jdet2d*bed_normal[1]*bed_normal[2]; 3584 3585 TripleMultiply( &LSSAFS[0][0],8,numdof2dm,1, 3586 &DLSSAFS[0][0],8,8,0, 3587 &LprimeSSAFS[0][0],8,numdofs,0, 3588 &Ke_drag_gaussian[0][0],0); 3589 3590 TripleMultiply( &LFSSSA[0][0],4,numdof2d,1, 3591 &DLFSSSA[0][0],4,4,0, 3592 &LprimeFSSSA[0][0],4,numdof2dm,0, 3593 &Ke_drag_gaussian2[0][0],0); 3594 for(i=0;i<numdof2dm;i++) for(j=0;j<numdofs;j++) Ke->values[i*numdoftot+j+numdofm]+=Ke_drag_gaussian[i][j]; 3595 for(i=0;i<numdof2d;i++) for(j=0;j<numdof2dm;j++) Ke->values[(i+numdofm)*numdoftot+j]+=Ke_drag_gaussian2[i][j]; 3596 } 3597 3598 /*Transform Coordinate System*/ 3599 element->TransformStiffnessMatrixCoord(Ke,node_list,numnodes,cs_list); 3600 3601 /*Clean up and return*/ 3602 xDelete<int>(cs_list); 3603 xDelete<Node*>(node_list); 3604 xDelete<IssmDouble>(xyz_list); 3605 xDelete<IssmDouble>(xyz_list_tria); 3606 delete gauss; 3607 delete friction; 3608 return Ke; 3480 3609 }/*}}}*/ 3481 3610 ElementMatrix* StressbalanceAnalysis::CreateKMatrixCouplingSSAFSViscous(Element* element){/*{{{*/ 3482 3611 3612 printf("CouplingSSAFSviscous\n"); 3483 3613 /*Constants*/ 3484 3614 const int numdofm = 2 *3; … … 4168 4298 xDelete<IssmDouble>(dbasis); 4169 4299 }/*}}}*/ 4300 void StressbalanceAnalysis::GetLSSAFS(IssmDouble* LFS,Element* element,Gauss* gauss_in){/*{{{*/ 4301 /* 4302 * Compute L matrix. L=[L1 L2 L3] where Li is square and of size numdof. 4303 * For node i, Li can be expressed in the actual coordinate system 4304 * by: 4305 * Li=[ h 0 ] 4306 * [ 0 h ] 4307 * [ h 0 ] 4308 * [ 0 h ] 4309 * [ h 0 ] 4310 * [ 0 h ] 4311 * [ h 0 ] 4312 * [ 0 h ] 4313 * where h is the interpolation function for node i. 4314 */ 4315 4316 int num_dof=2; 4317 IssmDouble L1L2l3[3]; 4318 4319 /*Cast gauss to GaussPenta*/ 4320 _assert_(gauss_in->Enum()==GaussPentaEnum); 4321 GaussPenta* gauss = dynamic_cast<GaussPenta*>(gauss_in); 4322 4323 /*Get L1L2l3 in actual coordinate system: */ 4324 L1L2l3[0]=gauss->coord1*(1-gauss->coord4)/2.0; 4325 L1L2l3[1]=gauss->coord2*(1-gauss->coord4)/2.0; 4326 L1L2l3[2]=gauss->coord3*(1-gauss->coord4)/2.0; 4327 4328 /*Build LFS: */ 4329 for(int i=0;i<3;i++){ 4330 LFS[num_dof*3*0+num_dof*i+0] = L1L2l3[i]; 4331 LFS[num_dof*3*0+num_dof*i+1] = 0; 4332 LFS[num_dof*3*1+num_dof*i+0] = 0; 4333 LFS[num_dof*3*1+num_dof*i+1] = L1L2l3[i]; 4334 LFS[num_dof*3*2+num_dof*i+0] = L1L2l3[i]; 4335 LFS[num_dof*3*2+num_dof*i+1] = 0; 4336 LFS[num_dof*3*3+num_dof*i+0] = 0; 4337 LFS[num_dof*3*3+num_dof*i+1] = L1L2l3[i]; 4338 LFS[num_dof*3*4+num_dof*i+0] = L1L2l3[i]; 4339 LFS[num_dof*3*4+num_dof*i+1] = 0; 4340 LFS[num_dof*3*5+num_dof*i+0] = 0; 4341 LFS[num_dof*3*5+num_dof*i+1] = L1L2l3[i]; 4342 LFS[num_dof*3*6+num_dof*i+0] = L1L2l3[i]; 4343 LFS[num_dof*3*6+num_dof*i+1] = 0; 4344 LFS[num_dof*3*7+num_dof*i+0] = 0; 4345 LFS[num_dof*3*7+num_dof*i+1] = L1L2l3[i]; 4346 } 4347 }/*}}}*/ 4348 void StressbalanceAnalysis::GetLprimeSSAFS(IssmDouble* LprimeFS,Element* element,IssmDouble* xyz_list,Gauss* gauss_in){/*{{{*/ 4349 /* Compute Lprime matrix. Lprime=[Lp1 Lp2 Lp3] where Lpi is square and of size numdof. 4350 * For node i, Lpi can be expressed in the actual coordinate system 4351 * by: 4352 * Lpi=[ h 0 0 0] 4353 * [ 0 h 0 0] 4354 * [ 0 0 h 0] 4355 * [ 0 0 h 0] 4356 * [ 0 0 dh/dz 0] 4357 * [ 0 0 dh/dz 0] 4358 * [ 0 0 0 h] 4359 * [ 0 0 0 h] 4360 * where h is the interpolation function for node i. 4361 */ 4362 int num_dof=3; 4363 int num_dof_vel=3*7; 4364 int num_dof_total=3*7+1*6; 4365 IssmDouble L1L2l3[3]; 4366 IssmDouble dbasis[3][6]; 4367 4368 /*Cast gauss to GaussPenta*/ 4369 _assert_(gauss_in->Enum()==GaussPentaEnum); 4370 GaussPenta* gauss = dynamic_cast<GaussPenta*>(gauss_in); 4371 4372 /*Get L1L2l3 in actual coordinate system: */ 4373 L1L2l3[0]=gauss->coord1*(1-gauss->coord4)/2.0; 4374 L1L2l3[1]=gauss->coord2*(1-gauss->coord4)/2.0; 4375 L1L2l3[2]=gauss->coord3*(1-gauss->coord4)/2.0; 4376 4377 element->NodalFunctionsP1Derivatives(&dbasis[0][0],xyz_list,gauss); 4378 4379 /*Build LprimeFS: */ 4380 for(int i=0;i<3;i++){ 4381 LprimeFS[num_dof_total*0+num_dof*i+0] = L1L2l3[i]; 4382 LprimeFS[num_dof_total*0+num_dof*i+1] = 0.; 4383 LprimeFS[num_dof_total*0+num_dof*i+2] = 0.; 4384 LprimeFS[num_dof_total*1+num_dof*i+0] = 0.; 4385 LprimeFS[num_dof_total*1+num_dof*i+1] = L1L2l3[i]; 4386 LprimeFS[num_dof_total*1+num_dof*i+2] = 0.; 4387 LprimeFS[num_dof_total*2+num_dof*i+0] = 0.; 4388 LprimeFS[num_dof_total*2+num_dof*i+1] = 0.; 4389 LprimeFS[num_dof_total*2+num_dof*i+2] = L1L2l3[i]; 4390 LprimeFS[num_dof_total*3+num_dof*i+0] = 0.; 4391 LprimeFS[num_dof_total*3+num_dof*i+1] = 0.; 4392 LprimeFS[num_dof_total*3+num_dof*i+2] = L1L2l3[i]; 4393 LprimeFS[num_dof_total*4+num_dof*i+0] = 0.; 4394 LprimeFS[num_dof_total*4+num_dof*i+1] = 0.; 4395 LprimeFS[num_dof_total*4+num_dof*i+2] = dbasis[2][i]; 4396 LprimeFS[num_dof_total*5+num_dof*i+0] = 0.; 4397 LprimeFS[num_dof_total*5+num_dof*i+1] = 0.; 4398 LprimeFS[num_dof_total*5+num_dof*i+2] = dbasis[2][i]; 4399 LprimeFS[num_dof_total*6+num_dof*i+0] = 0.; 4400 LprimeFS[num_dof_total*6+num_dof*i+1] = 0.; 4401 LprimeFS[num_dof_total*6+num_dof*i+2] = 0.; 4402 LprimeFS[num_dof_total*7+num_dof*i+0] = 0.; 4403 LprimeFS[num_dof_total*7+num_dof*i+1] = 0.; 4404 LprimeFS[num_dof_total*7+num_dof*i+2] = 0.; 4405 } 4406 for(int i=3;i<7;i++){ 4407 LprimeFS[num_dof_total*0+num_dof*i+0] = 0.; 4408 LprimeFS[num_dof_total*0+num_dof*i+1] = 0.; 4409 LprimeFS[num_dof_total*0+num_dof*i+2] = 0.; 4410 LprimeFS[num_dof_total*1+num_dof*i+0] = 0.; 4411 LprimeFS[num_dof_total*1+num_dof*i+1] = 0.; 4412 LprimeFS[num_dof_total*1+num_dof*i+2] = 0.; 4413 LprimeFS[num_dof_total*2+num_dof*i+0] = 0.; 4414 LprimeFS[num_dof_total*2+num_dof*i+1] = 0.; 4415 LprimeFS[num_dof_total*2+num_dof*i+2] = 0.; 4416 LprimeFS[num_dof_total*3+num_dof*i+0] = 0.; 4417 LprimeFS[num_dof_total*3+num_dof*i+1] = 0.; 4418 LprimeFS[num_dof_total*3+num_dof*i+2] = 0.; 4419 LprimeFS[num_dof_total*4+num_dof*i+0] = 0.; 4420 LprimeFS[num_dof_total*4+num_dof*i+1] = 0.; 4421 LprimeFS[num_dof_total*4+num_dof*i+2] = 0.; 4422 LprimeFS[num_dof_total*5+num_dof*i+0] = 0.; 4423 LprimeFS[num_dof_total*5+num_dof*i+1] = 0.; 4424 LprimeFS[num_dof_total*5+num_dof*i+2] = 0.; 4425 LprimeFS[num_dof_total*6+num_dof*i+0] = 0.; 4426 LprimeFS[num_dof_total*6+num_dof*i+1] = 0.; 4427 LprimeFS[num_dof_total*6+num_dof*i+2] = 0.; 4428 LprimeFS[num_dof_total*7+num_dof*i+0] = 0.; 4429 LprimeFS[num_dof_total*7+num_dof*i+1] = 0.; 4430 LprimeFS[num_dof_total*7+num_dof*i+2] = 0.; 4431 } 4432 for(int i=0;i<3;i++){ 4433 LprimeFS[num_dof_total*0+num_dof_vel+i] = 0.; 4434 LprimeFS[num_dof_total*1+num_dof_vel+i] = 0.; 4435 LprimeFS[num_dof_total*2+num_dof_vel+i] = 0.; 4436 LprimeFS[num_dof_total*3+num_dof_vel+i] = 0.; 4437 LprimeFS[num_dof_total*4+num_dof_vel+i] = 0.; 4438 LprimeFS[num_dof_total*5+num_dof_vel+i] = 0.; 4439 LprimeFS[num_dof_total*6+num_dof_vel+i] = L1L2l3[i]; 4440 LprimeFS[num_dof_total*7+num_dof_vel+i] = L1L2l3[i]; 4441 } 4442 for(int i=3;i<6;i++){ 4443 LprimeFS[num_dof_total*0+num_dof_vel+i] = 0.; 4444 LprimeFS[num_dof_total*1+num_dof_vel+i] = 0.; 4445 LprimeFS[num_dof_total*2+num_dof_vel+i] = 0.; 4446 LprimeFS[num_dof_total*3+num_dof_vel+i] = 0.; 4447 LprimeFS[num_dof_total*4+num_dof_vel+i] = 0.; 4448 LprimeFS[num_dof_total*5+num_dof_vel+i] = 0.; 4449 LprimeFS[num_dof_total*6+num_dof_vel+i] = 0.; 4450 LprimeFS[num_dof_total*7+num_dof_vel+i] = 0.; 4451 } 4452 }/*}}}*/ 4453 void StressbalanceAnalysis::GetLFSSSA(IssmDouble* LFS,Element* element,Gauss* gauss_in){/*{{{*/ 4454 /* Compute L matrix. L=[L1 L2 L3] where Li is square and of size numdof. 4455 * For node i, Li can be expressed in the actual coordinate system 4456 * by: 4457 * Li=[ h 0 0 ] 4458 * [ 0 h 0 ] 4459 * [ 0 0 h ] 4460 * [ 0 0 h ] 4461 * where h is the interpolation function for node i. 4462 */ 4463 4464 int num_dof=3; 4465 IssmDouble L1L2l3[3]; 4466 4467 /*Cast gauss to GaussPenta*/ 4468 _assert_(gauss_in->Enum()==GaussPentaEnum); 4469 GaussPenta* gauss = dynamic_cast<GaussPenta*>(gauss_in); 4470 4471 /*Get L1L2l3 in actual coordinate system: */ 4472 L1L2l3[0]=gauss->coord1*(1-gauss->coord4)/2.0; 4473 L1L2l3[1]=gauss->coord2*(1-gauss->coord4)/2.0; 4474 L1L2l3[2]=gauss->coord3*(1-gauss->coord4)/2.0; 4475 4476 /*Build LFS: */ 4477 for(int i=0;i<3;i++){ 4478 LFS[num_dof*3*0+num_dof*i+0] = L1L2l3[i]; 4479 LFS[num_dof*3*0+num_dof*i+1] = 0.; 4480 LFS[num_dof*3*0+num_dof*i+2] = 0.; 4481 LFS[num_dof*3*1+num_dof*i+0] = 0.; 4482 LFS[num_dof*3*1+num_dof*i+1] = L1L2l3[i]; 4483 LFS[num_dof*3*1+num_dof*i+2] = 0.; 4484 LFS[num_dof*3*2+num_dof*i+0] = 0.; 4485 LFS[num_dof*3*2+num_dof*i+1] = 0.; 4486 LFS[num_dof*3*2+num_dof*i+2] = L1L2l3[i]; 4487 LFS[num_dof*3*3+num_dof*i+0] = 0.; 4488 LFS[num_dof*3*3+num_dof*i+1] = 0.; 4489 LFS[num_dof*3*3+num_dof*i+2] = L1L2l3[i]; 4490 } 4491 }/*}}}*/ 4492 void StressbalanceAnalysis::GetLprimeFSSSA(IssmDouble* LprimeFS,Element* element,IssmDouble* xyz_list,Gauss* gauss_in){/*{{{*/ 4493 /* Compute Lprime matrix. Lprime=[Lp1 Lp2 Lp3] where Lpi is square and of size numdof. 4494 * For node i, Lpi can be expressed in the actual coordinate system 4495 * by: 4496 * Lpi=[ h 0 ] 4497 * [ 0 h ] 4498 * [ h 0 ] 4499 * [ 0 h ] 4500 * where h is the interpolation function for node i. 4501 */ 4502 int num_dof=2; 4503 IssmDouble L1L2l3[3]; 4504 4505 /*Cast gauss to GaussPenta*/ 4506 _assert_(gauss_in->Enum()==GaussPentaEnum); 4507 GaussPenta* gauss = dynamic_cast<GaussPenta*>(gauss_in); 4508 4509 /*Get L1L2l3 in actual coordinate system: */ 4510 L1L2l3[0]=gauss->coord1*(1-gauss->coord4)/2.0; 4511 L1L2l3[1]=gauss->coord2*(1-gauss->coord4)/2.0; 4512 L1L2l3[2]=gauss->coord3*(1-gauss->coord4)/2.0; 4513 4514 /*Build LprimeFS: */ 4515 for(int i=0;i<3;i++){ 4516 LprimeFS[num_dof*3*0+num_dof*i+0] = L1L2l3[i]; 4517 LprimeFS[num_dof*3*0+num_dof*i+1] = 0.; 4518 LprimeFS[num_dof*3*1+num_dof*i+0] = 0.; 4519 LprimeFS[num_dof*3*1+num_dof*i+1] = L1L2l3[i]; 4520 LprimeFS[num_dof*3*2+num_dof*i+0] = L1L2l3[i]; 4521 LprimeFS[num_dof*3*2+num_dof*i+1] = 0.; 4522 LprimeFS[num_dof*3*3+num_dof*i+0] = 0.; 4523 LprimeFS[num_dof*3*3+num_dof*i+1] = L1L2l3[i]; 4524 } 4525 }/*}}}*/ 4170 4526 void StressbalanceAnalysis::InputUpdateFromSolutionHOFS(IssmDouble* solution,Element* element){/*{{{*/ 4171 4527 -
issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.h
r16949 r16951 98 98 void GetBSSAFSTria(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss); 99 99 void GetBprimeSSAFSTria(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss); 100 void GetLFSSSA(IssmDouble* L,Element* element,Gauss* gauss); 101 void GetLSSAFS(IssmDouble* L,Element* element,Gauss* gauss); 102 void GetLprimeFSSSA(IssmDouble* Lprime,Element* element,IssmDouble* xyz_list,Gauss* gauss); 103 void GetLprimeSSAFS(IssmDouble* Lprime,Element* element,IssmDouble* xyz_list,Gauss* gauss); 100 104 void InputUpdateFromSolutionHOFS(IssmDouble* solution,Element* element); 101 105 void InputUpdateFromSolutionSSAFS(IssmDouble* solution,Element* element);
Note:
See TracChangeset
for help on using the changeset viewer.