Changeset 328


Ignore:
Timestamp:
05/11/09 09:24:05 (16 years ago)
Author:
seroussi
Message:

no more basevert

Location:
issm/trunk/src/m/classes/@pentaelem
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk/src/m/classes/@pentaelem/CreateKMatrix.m

    r120 r328  
    1919        Ke=CreateKMatrixVert(pentaelem,grids,materials,inputs);
    2020
    21 elseif strcmpi(analysis_type,'diagnostic_basevert'),
    22 
    23         Ke=CreateKMatrixBaseVert(pentaelem,grids,materials,inputs);
    24 
    2521elseif strcmpi(analysis_type,'prognostic'),
    2622
     
    456452                end
    457453        end%ends friction
    458 
    459 end %end function
    460 
    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         end
    469 
    470         %some variables
    471         numgrids=3;
    472         DOFPERGRID=1;
    473         numdof=numgrids*DOFPERGRID; %number of dof for element pentaelem.
    474 
    475         %Create elementary stiffness matrix
    476         Ke=elemmatrix(numdof);
    477 
    478         %Get all element grid data:
    479         xyz_list=getgriddata(pentaelem,grids);
    480 
    481         %Just keep the first 3 grids
    482         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-set
    487                 dof=doflist(3); %z degree of freedom
    488                 Ke.row_indices(i)=dof;
    489         end
    490 
    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 determinant
    501                 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 Ke
    512                 Ke.terms=Ke.terms+Ke_gg_vert_gaussian;
    513         end
    514454
    515455end %end function
  • issm/trunk/src/m/classes/@pentaelem/CreatePVector.m

    r155 r328  
    1717
    1818        pe=CreatePVectorVert(pentaelem,grids,materials,inputs);
    19 
    20 elseif strcmpi(analysis_type,'diagnostic_basevert'),
    21 
    22         pe=CreatePVectorBaseVert(pentaelem,grids,materials,inputs);
    2319
    2420elseif strcmpi(analysis_type,'prognostic'),
     
    390386
    391387
    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         end
    400 
    401         %some variables
    402         numgrids=3;
    403         DOFPERGRID=1;
    404         numdof=numgrids*DOFPERGRID; %number of dof for element pentaelem.
    405 
    406         %recover material parameters
    407         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 matrix
    414         pe=elemvector(numdof);
    415 
    416         %Get all element grid data:
    417         xyz_list=getgriddata(pentaelem,grids);
    418 
    419         %Just keep the first 3 grids
    420         xyz_list=xyz_list(1:3,:);
    421 
    422         %recover extra inputs
    423         [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         end
    432 
    433         %initialize velocity array
    434         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-set
    444                 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                 end
    449                 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 freedom
    454                 pe.row_indices(i)=dof;
    455         end
    456 
    457         if bed_is_present, bed=bed_list(1:3); else bed=pentaelem.b(1:3); end
    458         if thickness_is_present, thickness=thickness_list(1:3); else thickness=pentaelem.h(1:3); end
    459         if melting_is_present, melting=melting_list(1:3); else melting=pentaelem.melting(1:3); end
    460         if accumulation_is_present, accumulation=accumulation_list(1:3); else accumulation=pentaelem.accumulation(1:3); end
    461 
    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 icesheets
    466         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 slope
    480                 db=GetParameterDerivativeValue(triaelem,bed,xyz_list,gauss_coord);
    481                 dbdx=db(1);
    482                 dbdy=db(2);
    483 
    484                 %Get the Jacobian determinant
    485                 Jdettria=GetJacobianDeterminant(triaelem,xyz_list,gauss_coord);
    486 
    487                 %Get L:
    488                 L=GetL(triaelem,gauss_coord,DOFPERGRID);
    489 
    490                 %Build gaussian vector
    491                 pe_g_basevert_gaussian=Jdettria*gauss_weight*(vx*dbdx+vy*dbdy-melting_gauss)*L';
    492 
    493                 %Add Ke_gg_drag_gaussian to Ke
    494                 pe.terms=pe.terms+pe_g_basevert_gaussian;
    495         end
    496 
    497         %for iceshelves, vertical velocity at the base is determined using the hydrostatic equilibrium -> we add a corrective term
    498         %to the icesheet term.
    499         if pentaelem.shelf,
    500 
    501                 %build the vector thickness*velocity_average
    502                 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 determinant
    524                         Jdettria=GetJacobianDeterminant(triaelem,xyz_list,gauss_coord);
    525 
    526                         %Build gaussian vector
    527                         pe_g_basevert_iceshelf_gaussian=Jdettria*gauss_weight*(-di*(-divHVel+accumulation_gauss-melting_gauss))*L';
    528                        
    529                         %Add Ke_gg_drag_gaussian to Ke
    530                         pe.terms=pe.terms+pe_g_basevert_iceshelf_gaussian;
    531                 end
    532         end
    533 end %end function
    534 
    535388function pe=CreatePVectorVert(pentaelem,grids,materials,inputs);
    536389
     
    593446            end %for ig=1:num_area_gauss,
    594447        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
    595575
    596576end %end function
Note: See TracChangeset for help on using the changeset viewer.