Changeset 26249


Ignore:
Timestamp:
05/06/21 20:44:39 (4 years ago)
Author:
caronlam
Message:

BUG: in love_core: dydx was not reinitialized at each call of yi_derivatives; la, mu not properly handled in all cases in GetEarthRheology

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/cores/love_core.cpp

    r26245 r26249  
    164164
    165165        if (vi!=0 && omega!=0.0){ //take into account viscosity in the rigidity if the material isn't a perfect fluid
    166                 //Otherwise return the elastic value
    167166                IssmDouble ka=la0 + 2.0/3.0*mu0; //Bulk modulus
    168167                if (rheo==2){//EBM
     
    203202
    204203                        mu=mu0*omega*(omega+mu2/vi2)/((omega+mu2/vi2)*(omega+mu0/vi)+mu0/vi2*omega);
    205                         la=ka-2.0/3.0*mu0;
     204                        la=ka-2.0/3.0*mu;
    206205                }
    207206                else{//Maxwell
     
    210209                }
    211210        }
    212 
     211        else{//Otherwise return the elastic value
     212        la=la0;
     213        mu=mu0;
     214        }
    213215        *pla=la;
    214216        *pmu=mu;
     
    444446                           dy[1*6+1]= -2.0/x-fgr/rg0;
    445447                           }
    446                            */ /*}}}*/
     448        */ /*}}}*/
    447449
    448450        if(issolid==1){
     
    453455
    454456        for (id=0;id<ny;id++){
     457                dydx[id]=0.0;
    455458                for (iy=0;iy<ny;iy++){
    456459                        nindex=layer_index*nstep*36+n*36;
    457                         dydx[id]=dydx[id]+yi_prefactor[nindex+id*6+iy]*y[iy];
     460                        dydx[id]+=yi_prefactor[nindex+id*6+iy]*y[iy];
    458461                }
    459462        }
    460463        return;
    461464}/*}}}*/
    462 template <typename doubletype> void        propagate_yi_euler(IssmDouble* y, IssmDouble xmin, IssmDouble xmax, int layer_index, IssmDouble* yi_prefactor, FemModel* femmodel, Matlitho* matlitho){ /*{{{*/
     465template <typename doubletype> void        propagate_yi_euler(doubletype* y, IssmDouble xmin, IssmDouble xmax, int layer_index, doubletype* yi_prefactor, FemModel* femmodel, Matlitho* matlitho){ /*{{{*/
    463466        //yields this: if we have y[j]=1.0 and y[!j]=0.0 at the bottom of the layer, what is y at the top of the layer?
    464467        //euler method
     
    466469        femmodel->parameters->FindParam(&nstep,LoveIntStepsPerLayerEnum);
    467470
    468         IssmDouble* dydx=xNewZeroInit<IssmDouble>(6);
     471        doubletype* dydx=xNewZeroInit<doubletype>(6);
    469472        IssmDouble dr = (xmax -xmin)/nstep;
    470473        IssmDouble x=xmin;
     
    476479                x = x + dr;
    477480        }
    478         xDelete<IssmDouble>(dydx);
     481        xDelete<doubletype>(dydx);
    479482}/*}}}*/
    480483template <typename doubletype> void        propagate_yi_RK2(doubletype* y, IssmDouble xmin, IssmDouble xmax, int layer_index, doubletype* yi_prefactor, FemModel* femmodel, Matlitho* matlitho){ /*{{{*/
     
    681684                if (matlitho->issolid[i]){
    682685                        one = -1.0;
    683                         if (i>0 && !matlitho->issolid[i-1]) one = 1.0;
     686                        if (i>0) if (!matlitho->issolid[i-1]) one = 1.0;
    684687                        for (int j=0;j<6;j++){
    685688                                yi[(j+6*ici)+ nyi*(j+6*ici+3)] = one;
     
    891894                if (loveratio<=underflow_tol || xIsNan(loveratio) || xIsInf(loveratio)){//We need to delete a layer and try again if the ratio between deepest love number to surface love number is too low (risk of underflow) or garbage
    892895                        if(VerboseSolution()){
    893                                 printf("\n   Degree: %i, surface/Depth Love number ratio small: %e\n",deg, loveratio);
    894                                 printf("    Changing the interface where the integration starts\n");
    895                                 printf("    New start interface: r=%gm\n\n", matlitho->radius[starting_layer+1]);
     896                                _printf_("\n   Degree: " << deg <<", surface/Depth Love number ratio small: "<<loveratio<<"\n");
     897                                _printf_("    Changing the interface where the integration starts\n");
     898                                _printf_("    New start interface: r="<< matlitho->radius[starting_layer+1] <<"m\n\n");
    896899                        }
    897900                        nyi-=6;
     
    10051008        bool        allow_layer_deletion,love_kernels, istemporal;
    10061009        bool        verbosemod = (int)VerboseModule();
    1007         IssmDouble  g0,r0,mu0, underflow_tol;
     1010        IssmDouble  mu0, underflow_tol;
    10081011        IssmDouble *frequencies = NULL;
    10091012        bool        save_results;
     
    10401043        femmodel->parameters->FindParam(&sh_nmax,LoveShNmaxEnum);
    10411044        femmodel->parameters->FindParam(&sh_nmin,LoveShNminEnum);
    1042         femmodel->parameters->FindParam(&g0,LoveG0Enum);
    1043         femmodel->parameters->FindParam(&r0,LoveR0Enum);
    10441045        femmodel->parameters->FindParam(&mu0,LoveMu0Enum);
    10451046        femmodel->parameters->FindParam(&allow_layer_deletion,LoveAllowLayerDeletionEnum);
     
    11261127        femmodel->results->AddObject(new GenericExternalResult<doubletype*>(femmodel->results->Size()+1,LoveLiEnum,LoveLf,sh_nmax+1,nfreq,0,0));
    11271128
     1129        /*Only when love_kernels is on*/
     1130        if (love_kernels==1) {
     1131                femmodel->results->AddObject(new GenericExternalResult<doubletype*>(femmodel->results->Size()+1,LoveKernelsEnum,LoveKernels,(sh_nmax+1)*(matlitho->numlayers+1)*6,nfreq,0,0));
     1132        }
     1133
     1134        /*Free resources:*/
     1135        xDelete<IssmDouble>(frequencies);
     1136        xDelete<doubletype>(LoveKf);
     1137        xDelete<doubletype>(LoveHf);
     1138        xDelete<doubletype>(LoveLf);
     1139        xDelete<doubletype>(LoveKernels);
     1140
     1141        /* Legacy for fortran core, to be removed after complete validation */
     1142
     1143        //IssmDouble g0,r0;
     1144        //femmodel->parameters->FindParam(&g0,LoveG0Enum);
     1145        //femmodel->parameters->FindParam(&r0,LoveR0Enum);
     1146        //IssmDouble* LoveKr = xNewZeroInit<IssmDouble>(nfreq*(sh_nmax+1));
     1147        //IssmDouble* LoveHr = xNewZeroInit<IssmDouble>(nfreq*(sh_nmax+1));
     1148        //IssmDouble* LoveLr = xNewZeroInit<IssmDouble>(nfreq*(sh_nmax+1));
     1149        //IssmDouble* LoveKi = xNewZeroInit<IssmDouble>(nfreq*(sh_nmax+1));
     1150        //IssmDouble* LoveHi = xNewZeroInit<IssmDouble>(nfreq*(sh_nmax+1));
     1151        //IssmDouble* LoveLi = xNewZeroInit<IssmDouble>(nfreq*(sh_nmax+1));
     1152
     1153        /*Initialize love kernels (real and imaginary parts): */
     1154        //IssmDouble* LoveKernelsr= xNewZeroInit<IssmDouble>(nfreq*(sh_nmax+1)*(matlitho->numlayers+1)*6);
     1155        //IssmDouble* LoveKernelsi= xNewZeroInit<IssmDouble>(nfreq*(sh_nmax+1)*(matlitho->numlayers+1)*6);
    11281156
    11291157        /*call the main module: */
    11301158        //if (false){
    1131         //FourierLoveCorex(LoveKr,LoveKi,LoveHr,LoveHi,LoveLr,LoveLi,LoveKernelsReal,LoveKernelsImag,  //output
     1159        //FourierLoveCorex(LoveKr,LoveKi,LoveHr,LoveHr,LoveLr,LoveLi,LoveKernelsr,LoveKernelsi,  //output
    11321160        //              nfreq,frequencies,sh_nmax,sh_nmin,g0,r0,mu0,allow_layer_deletion,forcing_type,verbosemod, //parameter inputs
    11331161        //              matlitho->numlayers, matlitho->radius, matlitho->viscosity, matlitho->lame_lambda, matlitho->lame_mu,
    11341162        //              matlitho->burgers_viscosity, matlitho->burgers_mu, matlitho->density, matlitho->rheologymodel, matlitho->issolid //matlitho inputs
    11351163        //              );
     1164
     1165
     1166        /*Only when love_kernels is on*/
     1167        //if (love_kernels==1) {
     1168                //femmodel->results->AddObject(new GenericExternalResult<IssmDouble*>(femmodel->results->Size()+1,LoveKernelsEnum,LoveKernelsr,(sh_nmax+1)*(matlitho->numlayers+1)*6,nfreq,0,0));
     1169                //femmodel->results->AddObject(new GenericExternalResult<IssmDouble*>(femmodel->results->Size()+1,LoveKernelsImagEnum,LoveKernelsImag,(sh_nmax+1)*(matlitho->numlayers+1)*6,nfreq,0,0));
    11361170        //}
     1171
    11371172
    11381173        /*Add love matrices to results:*/
     
    11441179        //femmodel->results->AddObject(new GenericExternalResult<IssmDouble*>(femmodel->results->Size()+1,LoveLiEnum,LoveLi,sh_nmax+1,nfreq,0,0));
    11451180
    1146         /*Only when love_kernels is on*/
    1147         if (love_kernels==1) {
    1148                 femmodel->results->AddObject(new GenericExternalResult<doubletype*>(femmodel->results->Size()+1,LoveKernelsEnum,LoveKernels,(sh_nmax+1)*(matlitho->numlayers+1)*6,nfreq,0,0));
    1149                 //femmodel->results->AddObject(new GenericExternalResult<IssmDouble*>(femmodel->results->Size()+1,LoveKernelsImagEnum,LoveKernelsImag,(sh_nmax+1)*(matlitho->numlayers+1)*6,nfreq,0,0));
    1150         }
    1151 
    1152         /*Free resources:*/
    1153         xDelete<IssmDouble>(frequencies);
    1154         xDelete<doubletype>(LoveKf);
    1155         xDelete<doubletype>(LoveHf);
    1156         xDelete<doubletype>(LoveLf);
     1181
     1182
     1183        //xDelete<IssmDouble>(LoveKr);
     1184        //xDelete<IssmDouble>(LoveHr);
     1185        //xDelete<IssmDouble>(LoveLr);
     1186        //xDelete<IssmDouble>(LoveKernelsr);
     1187        //xDelete<IssmDouble>(LoveKi);
     1188        //xDelete<IssmDouble>(LoveHi);
    11571189        //xDelete<IssmDouble>(LoveLi);
    1158         xDelete<doubletype>(LoveKernels);
     1190        //xDelete<IssmDouble>(LoveKernelsi);
     1191
    11591192} /*}}}*/
    11601193
     
    11731206template void        propagate_yi_RK2<IssmDouble>(IssmDouble* y, IssmDouble xmin, IssmDouble xmax, int layer_index, IssmDouble* yi_prefactor, FemModel* femmodel, Matlitho* matlitho);
    11741207template void        propagate_yi_RK2<IssmComplex>(IssmComplex* y, IssmDouble xmin, IssmDouble xmax, int layer_index, IssmComplex* yi_prefactor, FemModel* femmodel, Matlitho* matlitho);
     1208template void        propagate_yi_euler<IssmDouble>(IssmDouble* y, IssmDouble xmin, IssmDouble xmax, int layer_index, IssmDouble* yi_prefactor, FemModel* femmodel, Matlitho* matlitho);
     1209template void        propagate_yi_euler<IssmComplex>(IssmComplex* y, IssmDouble xmin, IssmDouble xmax, int layer_index, IssmComplex* yi_prefactor, FemModel* femmodel, Matlitho* matlitho);
    11751210template void        Innersphere_boundaryconditions<IssmDouble>(IssmDouble* yi, int layer_index, int deg, IssmDouble omega, FemModel* femmodel, Matlitho* matlitho, LoveVariables* vars);
    11761211template void        Innersphere_boundaryconditions<IssmComplex>(IssmComplex* yi, int layer_index, int deg, IssmComplex omega, FemModel* femmodel, Matlitho* matlitho, LoveVariables* vars);
Note: See TracChangeset for help on using the changeset viewer.