Changeset 16903


Ignore:
Timestamp:
11/23/13 08:47:33 (11 years ago)
Author:
Mathieu Morlighem
Message:

NEW: done with hydrology Shreve

Location:
issm/trunk-jpl/src/c
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified issm/trunk-jpl/src/c/analyses/HydrologyShreveAnalysis.cpp

    r16853 r16903  
    8383/*Finite Element Analysis*/
    8484ElementMatrix* HydrologyShreveAnalysis::CreateKMatrix(Element* element){/*{{{*/
    85         _error_("not implemented yet");
     85
     86        /*Intermediaries */
     87        IssmDouble diffusivity;
     88        IssmDouble Jdet,D_scalar,dt,h;
     89        IssmDouble vx,vy,vel,dvxdx,dvydy;
     90        IssmDouble dvx[2],dvy[2];
     91        IssmDouble* xyz_list = NULL;
     92
     93        /*Fetch number of nodes and dof for this finite element*/
     94        int numnodes = element->GetNumberOfNodes();
     95
     96        /*Initialize Element vector and other vectors*/
     97        ElementMatrix* Ke     = element->NewElementMatrix();
     98        IssmDouble*    basis  = xNew<IssmDouble>(numnodes);
     99        IssmDouble*    B      = xNew<IssmDouble>(2*numnodes);
     100        IssmDouble*    Bprime = xNew<IssmDouble>(2*numnodes);
     101        IssmDouble     D[2][2]={0.};
     102
     103        /*Create water velocity vx and vy from current inputs*/
     104        CreateHydrologyWaterVelocityInput(element);
     105
     106        /*Retrieve all inputs and parameters*/
     107        element->GetVerticesCoordinates(&xyz_list);
     108        element->FindParam(&dt,TimesteppingTimeStepEnum);
     109        Input* vx_input=element->GetInput(HydrologyWaterVxEnum); _assert_(vx_input);
     110        Input* vy_input=element->GetInput(HydrologyWaterVyEnum); _assert_(vy_input);
     111        h = element->CharacteristicLength();
     112
     113        /* Start  looping on the number of gaussian points: */
     114        Gauss* gauss=element->NewGauss(2);
     115        for(int ig=gauss->begin();ig<gauss->end();ig++){
     116                gauss->GaussPoint(ig);
     117
     118                element->JacobianDeterminant(&Jdet,xyz_list,gauss);
     119                element->NodalFunctions(basis,gauss);
     120
     121                vx_input->GetInputValue(&vx,gauss);
     122                vy_input->GetInputValue(&vy,gauss);
     123                vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
     124                vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
     125
     126                D_scalar=gauss->weight*Jdet;
     127
     128                TripleMultiply(basis,1,numnodes,1,
     129                                        &D_scalar,1,1,0,
     130                                        basis,1,numnodes,0,
     131                                        Ke->values,1);
     132
     133                GetB(B,element,xyz_list,gauss);
     134                GetBprime(Bprime,element,xyz_list,gauss);
     135
     136                dvxdx=dvx[0];
     137                dvydy=dvy[1];
     138                D_scalar=dt*gauss->weight*Jdet;
     139
     140                D[0][0]=D_scalar*dvxdx;
     141                D[1][1]=D_scalar*dvydy;
     142                TripleMultiply(B,2,numnodes,1,
     143                                        &D[0][0],2,2,0,
     144                                        B,2,numnodes,0,
     145                                        &Ke->values[0],1);
     146
     147                D[0][0]=D_scalar*vx;
     148                D[1][1]=D_scalar*vy;
     149                TripleMultiply(B,2,numnodes,1,
     150                                        &D[0][0],2,2,0,
     151                                        Bprime,2,numnodes,0,
     152                                        &Ke->values[0],1);
     153
     154                /*Artificial diffusivity*/
     155                vel=sqrt(vx*vx+vy*vy);
     156                D[0][0]=D_scalar*diffusivity*h/(2*vel)*vx*vx;
     157                D[1][0]=D_scalar*diffusivity*h/(2*vel)*vy*vx;
     158                D[0][1]=D_scalar*diffusivity*h/(2*vel)*vx*vy;
     159                D[1][1]=D_scalar*diffusivity*h/(2*vel)*vy*vy;
     160                TripleMultiply(Bprime,2,numnodes,1,
     161                                        &D[0][0],2,2,0,
     162                                        Bprime,2,numnodes,0,
     163                                        &Ke->values[0],1);
     164        }
     165
     166        /*Clean up and return*/
     167        xDelete<IssmDouble>(xyz_list);
     168        xDelete<IssmDouble>(basis);
     169        xDelete<IssmDouble>(B);
     170        xDelete<IssmDouble>(Bprime);
     171        delete gauss;
     172        return Ke;
    86173}/*}}}*/
    87174ElementVector* HydrologyShreveAnalysis::CreatePVector(Element* element){/*{{{*/
     
    134221        return pe;
    135222}/*}}}*/
     223void HydrologyShreveAnalysis::GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
     224        /*Compute B  matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2.
     225         * For node i, Bi can be expressed in the actual coordinate system
     226         * by:
     227         *       Bi=[ N ]
     228         *          [ N ]
     229         * where N is the finiteelement function for node i.
     230         *
     231         * We assume B_prog has been allocated already, of size: 2x(NDOF1*numnodes)
     232         */
     233
     234        /*Fetch number of nodes for this finite element*/
     235        int numnodes = element->GetNumberOfNodes();
     236
     237        /*Get nodal functions*/
     238        IssmDouble* basis=xNew<IssmDouble>(numnodes);
     239        element->NodalFunctions(basis,gauss);
     240
     241        /*Build B: */
     242        for(int i=0;i<numnodes;i++){
     243                B[numnodes*0+i] = basis[i];
     244                B[numnodes*1+i] = basis[i];
     245        }
     246
     247        /*Clean-up*/
     248        xDelete<IssmDouble>(basis);
     249}/*}}}*/
     250void HydrologyShreveAnalysis::GetBprime(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
     251        /*Compute B'  matrix. B'=[B1' B2' B3'] where Bi' is of size 3*NDOF2.
     252         * For node i, Bi' can be expressed in the actual coordinate system
     253         * by:
     254         *       Bi_prime=[ dN/dx ]
     255         *                [ dN/dy ]
     256         * where N is the finiteelement function for node i.
     257         *
     258         * We assume B' has been allocated already, of size: 3x(NDOF2*numnodes)
     259         */
     260
     261        /*Fetch number of nodes for this finite element*/
     262        int numnodes = element->GetNumberOfNodes();
     263
     264        /*Get nodal functions derivatives*/
     265        IssmDouble* dbasis=xNew<IssmDouble>(2*numnodes);
     266        element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
     267
     268        /*Build B': */
     269        for(int i=0;i<numnodes;i++){
     270                Bprime[numnodes*0+i] = dbasis[0*numnodes+i];
     271                Bprime[numnodes*1+i] = dbasis[1*numnodes+i];
     272        }
     273
     274        /*Clean-up*/
     275        xDelete<IssmDouble>(dbasis);
     276
     277}/*}}}*/
    136278void HydrologyShreveAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
    137279        element->GetSolutionFromInputsOneDof(solution,WatercolumnEnum);
     
    163305        xDelete<int>(doflist);
    164306}/*}}}*/
     307
     308/*Intermediaries*/
     309void HydrologyShreveAnalysis::CreateHydrologyWaterVelocityInput(Element* element){/*{{{*/
     310
     311        /*Intermediaries*/
     312        IssmDouble dsdx,dsdy,dbdx,dbdy,w;
     313
     314        /*Retrieve all inputs and parameters*/
     315        IssmDouble  rho_ice   = element->GetMaterialParameter(MaterialsRhoIceEnum);
     316        IssmDouble  rho_water = element->GetMaterialParameter(MaterialsRhoWaterEnum);
     317        IssmDouble  g         = element->GetMaterialParameter(ConstantsGEnum);
     318        IssmDouble  CR        = element->GetMaterialParameter(HydrologyshreveCREnum);
     319        IssmDouble  n_man     = element->GetMaterialParameter(HydrologyshreveNEnum);
     320        IssmDouble  mu_water  = element->GetMaterialParameter(MaterialsMuWaterEnum);
     321        Input* surfaceslopex_input = element->GetInput(SurfaceSlopeXEnum); _assert_(surfaceslopex_input);
     322        Input* surfaceslopey_input = element->GetInput(SurfaceSlopeYEnum); _assert_(surfaceslopey_input);
     323        Input* bedslopex_input     = element->GetInput(BedSlopeXEnum);     _assert_(bedslopex_input);
     324        Input* bedslopey_input     = element->GetInput(BedSlopeYEnum);     _assert_(bedslopey_input);
     325        Input* watercolumn_input   = element->GetInput(WatercolumnEnum);   _assert_(watercolumn_input);
     326
     327        /* compute VelocityFactor */
     328        IssmDouble VelocityFactor = n_man*CR*CR*rho_water*g/mu_water;
     329
     330        /*Fetch number of vertices and allocate output*/
     331        int numvertices = element->GetNumberOfVertices();
     332        IssmDouble* vx  = xNew<IssmDouble>(numvertices);
     333        IssmDouble* vy  = xNew<IssmDouble>(numvertices);
     334
     335        Gauss* gauss=element->NewGauss();
     336        for(int iv=0;iv<numvertices;iv++){
     337                gauss->GaussVertex(iv);
     338                surfaceslopex_input->GetInputValue(&dsdx,gauss);
     339                surfaceslopey_input->GetInputValue(&dsdy,gauss);
     340                bedslopex_input->GetInputValue(&dbdx,gauss);
     341                bedslopey_input->GetInputValue(&dbdy,gauss);
     342                watercolumn_input->GetInputValue(&w,gauss);
     343
     344                /* Water velocity x and y components */
     345        //      vx[iv]= - w*w/(12 * mu_water)*(rho_ice*g*dsdx+(rho_water-rho_ice)*g*dbdx);
     346        //      vy[iv]= - w*w/(12 * mu_water)*(rho_ice*g*dsdy+(rho_water-rho_ice)*g*dbdy);
     347                vx[iv]= - w*w/(VelocityFactor* mu_water)*(rho_ice*g*dsdx+(rho_water-rho_ice)*g*dbdx);
     348                vy[iv]= - w*w/(VelocityFactor* mu_water)*(rho_ice*g*dsdy+(rho_water-rho_ice)*g*dbdy);
     349        }
     350
     351        /*clean-up*/
     352        delete gauss;
     353
     354        /*Add to inputs*/
     355        element->AddInput(HydrologyWaterVxEnum,vx,P1Enum);
     356        element->AddInput(HydrologyWaterVyEnum,vy,P1Enum);
     357        xDelete<IssmDouble>(vx);
     358        xDelete<IssmDouble>(vy);
     359}/*}}}*/
  • TabularUnified issm/trunk-jpl/src/c/analyses/HydrologyShreveAnalysis.h

    r16782 r16903  
    2525                void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
    2626                void InputUpdateFromSolution(IssmDouble* solution,Element* element);
     27
     28                /*Intermediaries*/
     29                void GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
     30                void GetBprime(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss);
     31                void CreateHydrologyWaterVelocityInput(Element* element);
    2732};
    2833#endif
  • TabularUnified issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp

    r16863 r16903  
    252252        IssmDouble*    B      = xNew<IssmDouble>(2*numnodes);
    253253        IssmDouble*    Bprime = xNew<IssmDouble>(2*numnodes);
    254         IssmDouble     D[2][2];
     254        IssmDouble     D[2][2]={0.};
    255255
    256256        /*Retrieve all inputs and parameters*/
     
    298298
    299299                D[0][0]=D_scalar*dvxdx;
    300                 D[0][1]=0.;
    301                 D[1][0]=0.;
    302300                D[1][1]=D_scalar*dvydy;
    303301                TripleMultiply(B,2,numnodes,1,
     
    326324                        vyaverage_input->GetInputAverage(&vy);
    327325                        D[0][0]=h/2.0*fabs(vx);
    328                         D[0][1]=0.;
    329                         D[1][0]=0.;
    330326                        D[1][1]=h/2.0*fabs(vy);
    331327                }
  • TabularUnified issm/trunk-jpl/src/c/classes/Materials/Matpar.cpp

    r16899 r16903  
    241241
    242242        switch(enum_in){
    243                 case MaterialsRhoIceEnum:                   return this->rho_ice;
    244                 case MaterialsRhoWaterEnum:                 return this->rho_water;
    245                 case MaterialsRhoFreshwaterEnum:            return this->rho_freshwater;
    246                 case MaterialsMuWaterEnum:                  return this->mu_water;
    247                 case MaterialsHeatcapacityEnum:             return this->heatcapacity;
    248                 case MaterialsThermalconductivityEnum:      return this->thermalconductivity;
    249                 case MaterialsTemperateiceconductivityEnum: return this->temperateiceconductivity;
    250                 case MaterialsLatentheatEnum:               return this->latentheat;
    251                 case MaterialsBetaEnum:                     return this->beta;
    252                 case MaterialsMeltingpointEnum:             return this->meltingpoint;
    253                 case ConstantsReferencetemperatureEnum:     return this->referencetemperature;
    254                 case MaterialsMixedLayerCapacityEnum:       return this->mixed_layer_capacity;
    255                 case MaterialsThermalExchangeVelocityEnum:  return this->thermal_exchange_velocity;
    256                 case HydrologydcSedimentPorosityEnum:       return this->sediment_porosity;
    257                 case HydrologydcSedimentThicknessEnum:      return this->sediment_thickness;
    258                 case HydrologydcSedimentCompressibilityEnum:return this->sediment_compressibility;
    259                 case HydrologydcEplPorosityEnum:            return this->epl_porosity;
    260                 case HydrologydcEplCompressibilityEnum:     return this->epl_compressibility;
    261                 case HydrologydcWaterCompressibilityEnum:   return this->water_compressibility;
    262                 case HydrologydcSedimentTransmitivityEnum:  return this->sediment_transmitivity;
    263                 case ConstantsGEnum:                        return this->g;
     243                case MaterialsRhoIceEnum:                    return this->rho_ice;
     244                case MaterialsRhoWaterEnum:                  return this->rho_water;
     245                case MaterialsRhoFreshwaterEnum:             return this->rho_freshwater;
     246                case MaterialsMuWaterEnum:                   return this->mu_water;
     247                case MaterialsHeatcapacityEnum:              return this->heatcapacity;
     248                case MaterialsThermalconductivityEnum:       return this->thermalconductivity;
     249                case MaterialsTemperateiceconductivityEnum:  return this->temperateiceconductivity;
     250                case MaterialsLatentheatEnum:                return this->latentheat;
     251                case MaterialsBetaEnum:                      return this->beta;
     252                case MaterialsMeltingpointEnum:              return this->meltingpoint;
     253                case ConstantsReferencetemperatureEnum:      return this->referencetemperature;
     254                case MaterialsMixedLayerCapacityEnum:        return this->mixed_layer_capacity;
     255                case MaterialsThermalExchangeVelocityEnum:   return this->thermal_exchange_velocity;
     256                case HydrologydcSedimentPorosityEnum:        return this->sediment_porosity;
     257                case HydrologydcSedimentThicknessEnum:       return this->sediment_thickness;
     258                case HydrologydcSedimentCompressibilityEnum: return this->sediment_compressibility;
     259                case HydrologydcEplPorosityEnum:             return this->epl_porosity;
     260                case HydrologydcEplCompressibilityEnum:      return this->epl_compressibility;
     261                case HydrologydcWaterCompressibilityEnum:    return this->water_compressibility;
     262                case HydrologydcSedimentTransmitivityEnum:   return this->sediment_transmitivity;
     263                case HydrologyshreveCREnum:                  return this->hydro_CR;
     264                case HydrologyshreveKnEnum:                  return this->hydro_kn;
     265                case HydrologyshreveNEnum:                   return this->hydro_n;
     266                case HydrologyshrevePEnum:                   return this->hydro_p;
     267                case HydrologyshreveQEnum:                   return this->hydro_q;
     268                case ConstantsGEnum:                         return this->g;
    264269                default: _error_("Enum "<<EnumToStringx(enum_in)<<" not supported yet");
    265270        }
Note: See TracChangeset for help on using the changeset viewer.