Changeset 16895


Ignore:
Timestamp:
11/22/13 13:58:57 (11 years ago)
Author:
Mathieu Morlighem
Message:

CHG: fixed Enthalpy

Location:
issm/trunk-jpl/src/c/analyses
Files:
2 edited

Legend:

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

    r16894 r16895  
    236236
    237237        /*Enthalpy diffusion parameter*/
    238         IssmDouble kappa=this->EnthalpyDiffusionParameterVolume(element); _assert_(kappa>0.);
     238        IssmDouble kappa=this->EnthalpyDiffusionParameterVolume(element,EnthalpyEnum); _assert_(kappa>0.);
    239239
    240240        /* Start  looping on the number of gaussian points: */
     
    304304                                for(int j=0;j<numnodes;j++){
    305305                                        Ke->values[i*numnodes+j]+=tau_parameter*D_scalar*
    306                                           ((u-um)*dbasis[0*3+i]+(v-vm)*dbasis[1*3+i]+(w-wm)*dbasis[2*3+i])*((u-um)*dbasis[0*3+j]+(v-vm)*dbasis[1*3+j]+(w-wm)*dbasis[2*3+j]);
     306                                          ((u-um)*dbasis[0*numnodes+i]+(v-vm)*dbasis[1*numnodes+i]+(w-wm)*dbasis[2*numnodes+i])*((u-um)*dbasis[0*numnodes+j]+(v-vm)*dbasis[1*numnodes+j]+(w-wm)*dbasis[2*numnodes+j]);
    307307                                }
    308308                        }
     
    310310                                for(int i=0;i<numnodes;i++){
    311311                                        for(int j=0;j<numnodes;j++){
    312                                                 Ke->values[i*numnodes+j]+=tau_parameter*D_scalar*basis[j]*((u-um)*dbasis[0*3+i]+(v-vm)*dbasis[1*3+i]+(w-wm)*dbasis[2*3+i]);
     312                                                Ke->values[i*numnodes+j]+=tau_parameter*D_scalar*basis[j]*((u-um)*dbasis[0*numnodes+i]+(v-vm)*dbasis[1*numnodes+i]+(w-wm)*dbasis[2*numnodes+i]);
    313313                                        }
    314314                                }
     
    410410        IssmDouble*    basis          = xNew<IssmDouble>(numnodes);
    411411        IssmDouble*    dbasis         = xNew<IssmDouble>(3*numnodes);
    412         IssmDouble*    pressure       = xNew<IssmDouble>(numvertices);
    413         IssmDouble*    enthalpypicard = xNew<IssmDouble>(numvertices);
    414412
    415413        /*Retrieve all inputs and parameters*/
     
    425423        if(reCast<bool,IssmDouble>(dt)){enthalpy_input = element->GetInput(EnthalpyEnum); _assert_(enthalpy_input);}
    426424        if(stabilization==2){
    427                 element->GetInputListOnVertices(enthalpypicard,EnthalpyPicardEnum);
    428                 element->GetInputListOnVertices(pressure,PressureEnum);
    429425                diameter=element->MinEdgeLength(xyz_list);
     426                kappa=this->EnthalpyDiffusionParameterVolume(element,EnthalpyPicardEnum); _assert_(kappa>0.);
    430427        }
    431428
    432429        /* Start  looping on the number of gaussian points: */
    433         Gauss* gauss=element->NewGauss(3);
     430        Gauss* gauss=element->NewGauss(2);
    434431        for(int ig=gauss->begin();ig<gauss->end();ig++){
    435432                gauss->GaussPoint(ig);
     
    440437
    441438                scalar_def=phi/rho_ice*Jdet*gauss->weight;
    442                 if(reCast<bool,IssmDouble>(dt)) scalar_def=scalar_def*dt;
     439                if(dt!=0.) scalar_def=scalar_def*dt;
    443440
    444441                /*TODO: add -beta*laplace T_m(p)*/
     
    458455                        vy_input->GetInputValue(&v,gauss);
    459456                        vz_input->GetInputValue(&w,gauss);
    460                         kappa          = element->EnthalpyDiffusionParameterVolume(numvertices,enthalpypicard,pressure) / rho_ice;
    461                         tau_parameter  = element->StabilizationParameter(u,v,w,diameter,kappa);
    462 
    463                         for(int i=0;i<numnodes;i++) pe->values[i]+=tau_parameter*scalar_def*(u*dbasis[0*3+i]+v*dbasis[1*3+i]+w*dbasis[2*3+i]);
    464                         if(reCast<bool,IssmDouble>(dt)){
    465                                 for(int i=0;i<numnodes;i++) pe->values[i]+=tau_parameter*scalar_transient*(u*dbasis[0*3+i]+v*dbasis[1*3+i]+w*dbasis[2*3+i]);
     457                        tau_parameter=element->StabilizationParameter(u,v,w,diameter,kappa/rho_ice);
     458
     459                        for(int i=0;i<numnodes;i++) pe->values[i]+=tau_parameter*scalar_def*(u*dbasis[0*numnodes+i]+v*dbasis[1*numnodes+i]+w*dbasis[2*numnodes+i]);
     460
     461                        if(dt!=0.){
     462                                for(int i=0;i<numnodes;i++) pe->values[i]+=tau_parameter*scalar_transient*(u*dbasis[0*numnodes+i]+v*dbasis[1*numnodes+i]+w*dbasis[2*numnodes+i]);
    466463                        }
    467464                }
     
    471468        xDelete<IssmDouble>(basis);
    472469        xDelete<IssmDouble>(dbasis);
    473         xDelete<IssmDouble>(pressure);
    474         xDelete<IssmDouble>(enthalpypicard);
    475470        xDelete<IssmDouble>(xyz_list);
    476471        delete gauss;
     
    798793        }
    799794}/*}}}*/
    800 IssmDouble EnthalpyAnalysis::EnthalpyDiffusionParameterVolume(Element* element){/*{{{*/
     795IssmDouble EnthalpyAnalysis::EnthalpyDiffusionParameterVolume(Element* element,int enthalpy_enum){/*{{{*/
    801796
    802797        int         iv;
     
    813808        IssmDouble* dHpmp       = xNew<IssmDouble>(numvertices);
    814809        element->GetInputListOnVertices(pressures,PressureEnum);
    815         element->GetInputListOnVertices(enthalpies,EnthalpyEnum);
     810        element->GetInputListOnVertices(enthalpies,enthalpy_enum);
    816811        for(iv=0;iv<numvertices;iv++){
    817812                PIE[iv]   = PureIceEnthalpy(element,pressures[iv]);
  • issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.h

    r16888 r16895  
    3636                /*Intermediaries*/
    3737                IssmDouble EnthalpyDiffusionParameter(Element* element,IssmDouble enthalpy,IssmDouble pressure);
    38                 IssmDouble EnthalpyDiffusionParameterVolume(Element* element);
     38                IssmDouble EnthalpyDiffusionParameterVolume(Element* element,int enthalpy_enum);
    3939                IssmDouble PureIceEnthalpy(Element* element,IssmDouble pressure);
    4040                IssmDouble TMeltingPoint(Element* element,IssmDouble pressure);
Note: See TracChangeset for help on using the changeset viewer.