Changeset 328
- Timestamp:
- 05/11/09 09:24:05 (16 years ago)
- Location:
- issm/trunk/src/m/classes/@pentaelem
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk/src/m/classes/@pentaelem/CreateKMatrix.m
r120 r328 19 19 Ke=CreateKMatrixVert(pentaelem,grids,materials,inputs); 20 20 21 elseif strcmpi(analysis_type,'diagnostic_basevert'),22 23 Ke=CreateKMatrixBaseVert(pentaelem,grids,materials,inputs);24 25 21 elseif strcmpi(analysis_type,'prognostic'), 26 22 … … 456 452 end 457 453 end%ends friction 458 459 end %end function460 461 function Ke=CreateKMatrixBaseVert(pentaelem,grids,materials,inputs)462 463 %We are dealing with a collapsed formulation on the lower triangle of the penta,464 %only on the bedrock.465 if pentaelem.onbed~=1,466 Ke=elemmatrix(0);467 return;468 end469 470 %some variables471 numgrids=3;472 DOFPERGRID=1;473 numdof=numgrids*DOFPERGRID; %number of dof for element pentaelem.474 475 %Create elementary stiffness matrix476 Ke=elemmatrix(numdof);477 478 %Get all element grid data:479 xyz_list=getgriddata(pentaelem,grids);480 481 %Just keep the first 3 grids482 xyz_list=xyz_list(1:3,:);483 484 %Build linear indices for elementary stiffness matrix.485 for i=1:numgrids,486 doflist=grids(pentaelem.g(i)).grid.doflist; %list of dofs in the g-set487 dof=doflist(3); %z degree of freedom488 Ke.row_indices(i)=dof;489 end490 491 % Get gaussian points and weights.492 [num_gauss2D,first_area_gauss_coord,second_area_gauss_coord,third_area_gauss_coord,gauss_weights]=GaussTria(2);493 494 for ig=1:num_gauss2D,495 496 %Pick up the gaussian point and its weight:497 gauss_weight=gauss_weights(ig);498 gauss_coord=[first_area_gauss_coord(ig) second_area_gauss_coord(ig) third_area_gauss_coord(ig)];499 500 %Get the Jacobian determinant501 Jdettria=GetJacobianDeterminant(triaelem,xyz_list,gauss_coord);502 503 %Get L matrix if viscous basal drag present:504 L=GetL(triaelem,gauss_coord,DOFPERGRID);505 506 DL_scalar=gauss_weight*Jdettria;507 508 %Do the triple product tL*D*L.509 Ke_gg_vert_gaussian=L'*DL_scalar*L;510 511 %Add Ke_gg_drag_gaussian to Ke512 Ke.terms=Ke.terms+Ke_gg_vert_gaussian;513 end514 454 515 455 end %end function -
issm/trunk/src/m/classes/@pentaelem/CreatePVector.m
r155 r328 17 17 18 18 pe=CreatePVectorVert(pentaelem,grids,materials,inputs); 19 20 elseif strcmpi(analysis_type,'diagnostic_basevert'),21 22 pe=CreatePVectorBaseVert(pentaelem,grids,materials,inputs);23 19 24 20 elseif strcmpi(analysis_type,'prognostic'), … … 390 386 391 387 392 function pe=CreatePVectorBaseVert(pentaelem,grids,materials,inputs);393 394 %We are dealing with a collapsed formulation on the lower triangle of the penta,395 %only on the bedrock.396 if pentaelem.onbed~=1,397 pe=elemvector(0);398 return;399 end400 401 %some variables402 numgrids=3;403 DOFPERGRID=1;404 numdof=numgrids*DOFPERGRID; %number of dof for element pentaelem.405 406 %recover material parameters407 matice=materials(pentaelem.matid).material;408 matpar=materials(end).constants;409 rho_ice=matpar.rho_ice;410 rho_water=matpar.rho_water;411 di=rho_ice/rho_water;412 413 %Create elementary stiffness matrix414 pe=elemvector(numdof);415 416 %Get all element grid data:417 xyz_list=getgriddata(pentaelem,grids);418 419 %Just keep the first 3 grids420 xyz_list=xyz_list(1:3,:);421 422 %recover extra inputs423 [bed_param bed_is_present]=recover_input(inputs,'bed');424 [melting_param melting_is_present]=recover_input(inputs,'melting');425 [accumulation_param accumulation_is_present]=recover_input(inputs,'accumulation');426 [velocity_param velocity_is_present]=recover_input(inputs,'velocity');427 [velocity_average_param velocity_average_is_present]=recover_input(inputs,'velocity_average');428 [thickness_param thickness_is_present]=recover_input(inputs,'thickness');429 if (~velocity_is_present | ~velocity_average_is_present),430 error('CreatePVector error message: no input velocity!');431 end432 433 %initialize velocity array434 vxvy_list=zeros(numgrids,2);435 vxvy_average_list=zeros(numgrids,2);436 bed_list=zeros(numgrids,1);437 melting_list=zeros(numgrids,1);438 accumulation_list=zeros(numgrids,1);439 thickness_list=zeros(numgrids,1);440 441 %Build linear indices for elementary stiffness matrix.442 for i=1:numgrids,443 doflist=grids(pentaelem.g(i)).grid.doflist; %list of dofs in the g-set444 for j=1:2,445 dof=doflist(j);446 vxvy_list(i,j)=velocity_param(dof);447 vxvy_average_list(i,j)=velocity_average_param(dof);448 end449 if(bed_is_present) bed_list(i)=bed_param(doflist(1));end;450 if(melting_is_present) melting_list(i)=melting_param(doflist(1));end;451 if(accumulation_is_present) accumulation_list(i)=accumulation_param(doflist(1));end;452 if(thickness_is_present) thickness_list(i)=thickness_param(doflist(1));end;453 dof=doflist(3); %z degree of freedom454 pe.row_indices(i)=dof;455 end456 457 if bed_is_present, bed=bed_list(1:3); else bed=pentaelem.b(1:3); end458 if thickness_is_present, thickness=thickness_list(1:3); else thickness=pentaelem.h(1:3); end459 if melting_is_present, melting=melting_list(1:3); else melting=pentaelem.melting(1:3); end460 if accumulation_is_present, accumulation=accumulation_list(1:3); else accumulation=pentaelem.accumulation(1:3); end461 462 % Get gaussian points and weights.463 [num_gauss2D,first_area_gauss_coord,second_area_gauss_coord,third_area_gauss_coord,gauss_weights]=GaussTria(2);464 465 %for icesheets466 for ig=1:num_gauss2D,467 468 %Pick up the gaussian point and its weight:469 gauss_weight=gauss_weights(ig);470 gauss_coord=[first_area_gauss_coord(ig) second_area_gauss_coord(ig) third_area_gauss_coord(ig)];471 472 %Get melting at gaussian point.473 melting_gauss=GetParameterValue(triaelem,melting,gauss_coord);474 475 %Get velocity at gaussian point.476 vx=GetParameterValue(triaelem,vxvy_list(:,1),gauss_coord);477 vy=GetParameterValue(triaelem,vxvy_list(:,2),gauss_coord);478 479 %Get bed slope480 db=GetParameterDerivativeValue(triaelem,bed,xyz_list,gauss_coord);481 dbdx=db(1);482 dbdy=db(2);483 484 %Get the Jacobian determinant485 Jdettria=GetJacobianDeterminant(triaelem,xyz_list,gauss_coord);486 487 %Get L:488 L=GetL(triaelem,gauss_coord,DOFPERGRID);489 490 %Build gaussian vector491 pe_g_basevert_gaussian=Jdettria*gauss_weight*(vx*dbdx+vy*dbdy-melting_gauss)*L';492 493 %Add Ke_gg_drag_gaussian to Ke494 pe.terms=pe.terms+pe_g_basevert_gaussian;495 end496 497 %for iceshelves, vertical velocity at the base is determined using the hydrostatic equilibrium -> we add a corrective term498 %to the icesheet term.499 if pentaelem.shelf,500 501 %build the vector thickness*velocity_average502 HU=thickness.*vxvy_average_list(:,1);503 HV=thickness.*vxvy_average_list(:,2);504 505 for ig=1:num_gauss2D,506 507 %Pick up the gaussian point and its weight:508 gauss_weight=gauss_weights(ig);509 gauss_coord=[first_area_gauss_coord(ig) second_area_gauss_coord(ig) third_area_gauss_coord(ig)];510 511 %get div(H*Vel)512 dHU=GetParameterDerivativeValue(triaelem,HU,xyz_list,gauss_coord);513 dHV=GetParameterDerivativeValue(triaelem,HV,xyz_list,gauss_coord);514 divHVel=dHU(1)+dHV(2);515 516 %Get melting and accumulation at gaussian point.517 melting_gauss=GetParameterValue(triaelem,melting,gauss_coord);518 accumulation_gauss=GetParameterValue(triaelem,accumulation,gauss_coord);519 520 %Get L:521 L=GetL(triaelem,gauss_coord,DOFPERGRID);522 523 %Get the Jacobian determinant524 Jdettria=GetJacobianDeterminant(triaelem,xyz_list,gauss_coord);525 526 %Build gaussian vector527 pe_g_basevert_iceshelf_gaussian=Jdettria*gauss_weight*(-di*(-divHVel+accumulation_gauss-melting_gauss))*L';528 529 %Add Ke_gg_drag_gaussian to Ke530 pe.terms=pe.terms+pe_g_basevert_iceshelf_gaussian;531 end532 end533 end %end function534 535 388 function pe=CreatePVectorVert(pentaelem,grids,materials,inputs); 536 389 … … 593 446 end %for ig=1:num_area_gauss, 594 447 end %for ig=1:num_vert_gauss, 448 449 if pentaelem.onbed, 450 451 numgrids2=3; 452 453 %Just keep the first 3 grids 454 xyz_list=xyz_list(1:3,:); 455 456 %recover extra inputs 457 [bed_param bed_is_present]=recover_input(inputs,'bed'); 458 [melting_param melting_is_present]=recover_input(inputs,'melting'); 459 [accumulation_param accumulation_is_present]=recover_input(inputs,'accumulation'); 460 [velocity_param velocity_is_present]=recover_input(inputs,'velocity'); 461 [velocity_average_param velocity_average_is_present]=recover_input(inputs,'velocity_average'); 462 [thickness_param thickness_is_present]=recover_input(inputs,'thickness'); 463 if (~velocity_is_present | ~velocity_average_is_present), 464 error('CreatePVector error message: no input velocity!'); 465 end 466 467 %initialize velocity array 468 vxvy_list=zeros(numgrids2,2); 469 vxvy_average_list=zeros(numgrids2,2); 470 bed_list=zeros(numgrids2,1); 471 melting_list=zeros(numgrids2,1); 472 accumulation_list=zeros(numgrids2,1); 473 thickness_list=zeros(numgrids2,1); 474 475 %Build linear indices for elementary stiffness matrix. 476 for i=1:numgrids2, 477 doflist=grids(pentaelem.g(i)).grid.doflist; %list of dofs in the g-set 478 for j=1:2, 479 dof=doflist(j); 480 vxvy_list(i,j)=velocity_param(dof); 481 vxvy_average_list(i,j)=velocity_average_param(dof); 482 end 483 if(bed_is_present) bed_list(i)=bed_param(doflist(1));end; 484 if(melting_is_present) melting_list(i)=melting_param(doflist(1));end; 485 if(accumulation_is_present) accumulation_list(i)=accumulation_param(doflist(1));end; 486 if(thickness_is_present) thickness_list(i)=thickness_param(doflist(1));end; 487 end 488 489 if bed_is_present, bed=bed_list(1:3); else bed=pentaelem.b(1:3); end 490 if thickness_is_present, thickness=thickness_list(1:3); else thickness=pentaelem.h(1:3); end 491 if melting_is_present, melting=melting_list(1:3); else melting=pentaelem.melting(1:3); end 492 if accumulation_is_present, accumulation=accumulation_list(1:3); else accumulation=pentaelem.accumulation(1:3); end 493 494 % Get gaussian points and weights. 495 [num_gauss2D,first_area_gauss_coord,second_area_gauss_coord,third_area_gauss_coord,gauss_weights]=GaussTria(2); 496 497 %for icesheets 498 for ig=1:num_gauss2D, 499 500 %Pick up the gaussian point and its weight: 501 gauss_weight=gauss_weights(ig); 502 gauss_coord=[first_area_gauss_coord(ig) second_area_gauss_coord(ig) third_area_gauss_coord(ig)]; 503 504 %Get melting at gaussian point. 505 melting_gauss=GetParameterValue(triaelem,melting,gauss_coord); 506 507 %Get velocity at gaussian point. 508 vx=GetParameterValue(triaelem,vxvy_list(:,1),gauss_coord); 509 vy=GetParameterValue(triaelem,vxvy_list(:,2),gauss_coord); 510 511 %Get bed slope 512 db=GetParameterDerivativeValue(triaelem,bed,xyz_list,gauss_coord); 513 dbdx=db(1); 514 dbdy=db(2); 515 516 %Get the Jacobian determinant 517 Jdettria=GetJacobianDeterminant(triaelem,xyz_list,gauss_coord); 518 519 %Get L: 520 L=GetL(triaelem,gauss_coord,NDOF1); 521 522 %Build gaussian vector 523 pe_g_basevert_gaussian=-Jdettria*gauss_weight*(vx*dbdx+vy*dbdy-melting_gauss)*L'; 524 525 %Add Ke_gg_drag_gaussian to Ke 526 pe.terms(1:3)=pe.terms(1:3)+pe_g_basevert_gaussian; 527 end 528 529 %for iceshelves, vertical velocity at the base is determined using the hydrostatic equilibrium -> we add a corrective term 530 %to the icesheet term. 531 if pentaelem.shelf, 532 533 %recover material parameters 534 matice=materials(pentaelem.matid).material; 535 matpar=materials(end).constants; 536 rho_ice=matpar.rho_ice; 537 rho_water=matpar.rho_water; 538 di=rho_ice/rho_water; 539 540 %build the vector thickness*velocity_average 541 HU=thickness.*vxvy_average_list(:,1); 542 HV=thickness.*vxvy_average_list(:,2); 543 544 for ig=1:num_gauss2D, 545 546 %Pick up the gaussian point and its weight: 547 gauss_weight=gauss_weights(ig); 548 gauss_coord=[first_area_gauss_coord(ig) second_area_gauss_coord(ig) third_area_gauss_coord(ig)]; 549 550 %get div(H*Vel) 551 dHU=GetParameterDerivativeValue(triaelem,HU,xyz_list,gauss_coord); 552 dHV=GetParameterDerivativeValue(triaelem,HV,xyz_list,gauss_coord); 553 divHVel=dHU(1)+dHV(2); 554 555 %Get melting and accumulation at gaussian point. 556 melting_gauss=GetParameterValue(triaelem,melting,gauss_coord); 557 accumulation_gauss=GetParameterValue(triaelem,accumulation,gauss_coord); 558 559 %Get L: 560 L=GetL(triaelem,gauss_coord,NDOF1); 561 562 %Get the Jacobian determinant 563 Jdettria=GetJacobianDeterminant(triaelem,xyz_list,gauss_coord); 564 565 %Build gaussian vector 566 pe_g_basevert_iceshelf_gaussian=-Jdettria*gauss_weight*(-di*(-divHVel+accumulation_gauss-melting_gauss))*L'; 567 568 %Add Ke_gg_drag_gaussian to Ke 569 pe.terms(1:3)=pe.terms(1:3)+pe_g_basevert_iceshelf_gaussian; 570 end 571 end 572 573 574 end 595 575 596 576 end %end function
Note:
See TracChangeset
for help on using the changeset viewer.