Changeset 22573


Ignore:
Timestamp:
03/20/18 10:38:42 (7 years ago)
Author:
Mathieu Morlighem
Message:

CHG: removing overshoot from stress balance (makes models crash and is not faster)

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

Legend:

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

    r22534 r22573  
    873873        parameters->AddObject(iomodel->CopyConstantObject("md.stressbalance.FSreconditioning",StressbalanceFSreconditioningEnum));
    874874        parameters->AddObject(iomodel->CopyConstantObject("md.stressbalance.shelf_dampening",StressbalanceShelfDampeningEnum));
    875         parameters->AddObject(iomodel->CopyConstantObject("md.stressbalance.viscosity_overshoot",StressbalanceViscosityOvershootEnum));
    876875        parameters->AddObject(iomodel->CopyConstantObject("md.friction.law",FrictionLawEnum));
    877876
     
    14431442        /*Intermediaries*/
    14441443        int         dim,domaintype;
    1445         IssmDouble  viscosity,newviscosity,oldviscosity;
    1446         IssmDouble  viscosity_overshoot,thickness,Jdet;
     1444        IssmDouble  viscosity,thickness,Jdet;
    14471445        IssmDouble *xyz_list = NULL;
    14481446
     
    14681466        Input* thickness_input=element->GetInput(ThicknessEnum); _assert_(thickness_input);
    14691467        Input* vx_input=element->GetInput(VxEnum);               _assert_(vx_input);
    1470         Input* vxold_input=element->GetInput(VxPicardEnum);      _assert_(vxold_input);
    14711468        Input* vy_input    = NULL;
    1472         Input* vyold_input = NULL;
    14731469        if(dim==2){
    14741470                vy_input    = element->GetInput(VyEnum);       _assert_(vy_input);
    1475                 vyold_input = element->GetInput(VyPicardEnum); _assert_(vyold_input);
    1476         }
    1477         element->FindParam(&viscosity_overshoot,StressbalanceViscosityOvershootEnum);
     1471        }
    14781472
    14791473        /* Start  looping on the number of gaussian points: */
     
    14871481                thickness_input->GetInputValue(&thickness, gauss);
    14881482                element->material->ViscositySSA(&viscosity,dim,xyz_list,gauss,vx_input,vy_input);
    1489                 element->material->ViscositySSA(&oldviscosity,dim,xyz_list,gauss,vxold_input,vyold_input);
    1490                 newviscosity=viscosity+viscosity_overshoot*(viscosity-oldviscosity);
    14911483
    14921484                if(dim==2){
    14931485                        for(int i=0;i<numnodes;i++){
    14941486                                for(int j=0;j<numnodes;j++){
    1495                                         Ke->values[2*i*2*numnodes+2*j] += gauss->weight*Jdet*newviscosity*thickness*(
     1487                                        Ke->values[2*i*2*numnodes+2*j] += gauss->weight*Jdet*viscosity*thickness*(
    14961488                                                                4.*dbasis[0*numnodes+j]*dbasis[0*numnodes+i] + dbasis[1*numnodes+j]*dbasis[1*numnodes+i]
    14971489                                                                );
    1498                                         Ke->values[2*i*2*numnodes+2*j+1] += gauss->weight*Jdet*newviscosity*thickness*(
     1490                                        Ke->values[2*i*2*numnodes+2*j+1] += gauss->weight*Jdet*viscosity*thickness*(
    14991491                                                                2.*dbasis[1*numnodes+j]*dbasis[0*numnodes+i] + dbasis[0*numnodes+j]*dbasis[1*numnodes+i]
    15001492                                                                );
    1501                                         Ke->values[(2*i+1)*2*numnodes+2*j] += gauss->weight*Jdet*newviscosity*thickness*(
     1493                                        Ke->values[(2*i+1)*2*numnodes+2*j] += gauss->weight*Jdet*viscosity*thickness*(
    15021494                                                                2.*dbasis[0*numnodes+j]*dbasis[1*numnodes+i] + dbasis[1*numnodes+j]*dbasis[0*numnodes+i]
    15031495                                                                );
    1504                                         Ke->values[(2*i+1)*2*numnodes+2*j+1] += gauss->weight*Jdet*newviscosity*thickness*(
     1496                                        Ke->values[(2*i+1)*2*numnodes+2*j+1] += gauss->weight*Jdet*viscosity*thickness*(
    15051497                                                                dbasis[0*numnodes+j]*dbasis[0*numnodes+i] + 4.*dbasis[1*numnodes+j]*dbasis[1*numnodes+i]
    15061498                                                                );
     
    15111503                        for(int i=0;i<numnodes;i++){
    15121504                                for(int j=0;j<numnodes;j++){
    1513                                         Ke->values[i*numnodes+j] += gauss->weight*Jdet*newviscosity*thickness*(
     1505                                        Ke->values[i*numnodes+j] += gauss->weight*Jdet*viscosity*thickness*(
    15141506                                                                4.*dbasis[0*numnodes+j]*dbasis[0*numnodes+i]
    15151507                                                                );
     
    19081900        }
    19091901
    1910         /*Now, we have to move the previous Vx and Vy inputs  to old
    1911          * status, otherwise, we'll wipe them off: */
    1912         element->InputChangeName(VxEnum,VxPicardEnum);
    1913         if(dim==2)element->InputChangeName(VyEnum,VyPicardEnum);
    1914 
    19151902        /*Add vx and vy as inputs to the tria element: */
    19161903        element->AddBasalInput(VxEnum,vx,element->GetElementType());
     
    22362223        for(i=0;i<numnodes;i++) vel[i]=sqrt(vx[i]*vx[i] + vy[i]*vy[i] + vz[i]*vz[i]);
    22372224
    2238         /*Now, we have to move the previous Vx and Vy inputs  to old
    2239          * status, otherwise, we'll wipe them off: */
    2240         element->InputChangeName(VxEnum,VxPicardEnum);
    2241         element->InputChangeName(VyEnum,VyPicardEnum);
    2242 
    22432225        /*Add vx and vy as inputs to the tria element: */
    22442226        element->AddBasalInput(VxEnum,vx,element->GetElementType());
     
    24282410        /*Intermediaries*/
    24292411        int         dim,bsize;
    2430         IssmDouble  viscosity,newviscosity,oldviscosity;
    2431         IssmDouble  viscosity_overshoot,thickness,Jdet;
     2412        IssmDouble  viscosity,thickness,Jdet;
    24322413        IssmDouble *xyz_list = NULL;
    24332414
     
    24462427        element->GetVerticesCoordinates(&xyz_list);
    24472428        Input* vx_input    = element->GetInput(VxEnum);       _assert_(vx_input);
    2448         Input* vxold_input = element->GetInput(VxPicardEnum); _assert_(vxold_input);
    24492429        Input* vy_input    = NULL;
    2450         Input* vyold_input = NULL;
    24512430        if(dim==3){
    24522431                vy_input=element->GetInput(VyEnum);          _assert_(vy_input);
    2453                 vyold_input=element->GetInput(VyPicardEnum); _assert_(vyold_input);
    2454         }
    2455         element->FindParam(&viscosity_overshoot,StressbalanceViscosityOvershootEnum);
     2432        }
    24562433
    24572434        /* Start  looping on the number of gaussian points: */
     
    24632440                element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
    24642441                element->material->ViscosityHO(&viscosity,dim,xyz_list,gauss,vx_input,vy_input);
    2465                 element->material->ViscosityHO(&oldviscosity,dim,xyz_list,gauss,vxold_input,vyold_input);
    2466 
    2467                 newviscosity=viscosity+viscosity_overshoot*(viscosity-oldviscosity);
    24682442
    24692443                if(dim==3){
    24702444                        for(int i=0;i<numnodes;i++){
    24712445                                for(int j=0;j<numnodes;j++){
    2472                                         Ke->values[2*i*2*numnodes+2*j] += gauss->weight*Jdet*newviscosity*(
     2446                                        Ke->values[2*i*2*numnodes+2*j] += gauss->weight*Jdet*viscosity*(
    24732447                                                                4.*dbasis[0*numnodes+j]*dbasis[0*numnodes+i] + dbasis[1*numnodes+j]*dbasis[1*numnodes+i] + dbasis[2*numnodes+j]*dbasis[2*numnodes+i]
    24742448                                                                );
    2475                                         Ke->values[2*i*2*numnodes+2*j+1] += gauss->weight*Jdet*newviscosity*(
     2449                                        Ke->values[2*i*2*numnodes+2*j+1] += gauss->weight*Jdet*viscosity*(
    24762450                                                                2.*dbasis[1*numnodes+j]*dbasis[0*numnodes+i] + dbasis[0*numnodes+j]*dbasis[1*numnodes+i]
    24772451                                                                );
    2478                                         Ke->values[(2*i+1)*2*numnodes+2*j] += gauss->weight*Jdet*newviscosity*(
     2452                                        Ke->values[(2*i+1)*2*numnodes+2*j] += gauss->weight*Jdet*viscosity*(
    24792453                                                                2.*dbasis[0*numnodes+j]*dbasis[1*numnodes+i] + dbasis[1*numnodes+j]*dbasis[0*numnodes+i]
    24802454                                                                );
    2481                                         Ke->values[(2*i+1)*2*numnodes+2*j+1] += gauss->weight*Jdet*newviscosity*(
     2455                                        Ke->values[(2*i+1)*2*numnodes+2*j+1] += gauss->weight*Jdet*viscosity*(
    24822456                                                                dbasis[0*numnodes+j]*dbasis[0*numnodes+i] + 4.*dbasis[1*numnodes+j]*dbasis[1*numnodes+i] + dbasis[2*numnodes+j]*dbasis[2*numnodes+i]
    24832457                                                                );
     
    24882462                        for(int i=0;i<numnodes;i++){
    24892463                                for(int j=0;j<numnodes;j++){
    2490                                         Ke->values[i*numnodes+j] += gauss->weight*Jdet*newviscosity*(
     2464                                        Ke->values[i*numnodes+j] += gauss->weight*Jdet*viscosity*(
    24912465                                                                4.*dbasis[0*numnodes+j]*dbasis[0*numnodes+i] + dbasis[1*numnodes+j]*dbasis[1*numnodes+i]
    24922466                                                                );
     
    29052879                for(i=0;i<numnodes;i++) vel[i]=sqrt(vx[i]*vx[i] + vy[i]*vy[i]);
    29062880        }
    2907 
    2908         /*Now, we have to move the previous Vx and Vy inputs  to old
    2909          * status, otherwise, we'll wipe them off: */
    2910         element->InputChangeName(VxEnum,VxPicardEnum);
    2911         if(dim==3)element->InputChangeName(VyEnum,VyPicardEnum);
    29122881
    29132882        /*Add vx and vy as inputs to the element: */
     
    50855054        else       for(i=0;i<vnumnodes;i++) vel[i] = sqrt(vx[i]*vx[i] + vy[i]*vy[i]);
    50865055
    5087         /*Now, we have to move the previous inputs  to old
    5088          * status, otherwise, we'll wipe them off: */
    5089         element->InputChangeName(VxEnum,VxPicardEnum);
    5090         element->InputChangeName(VyEnum,VyPicardEnum);
    5091         if(pnumdof>0) element->InputChangeName(PressureEnum,PressurePicardEnum);
    5092         if(dim==3) element->InputChangeName(VzEnum,VzPicardEnum);
    5093 
    50945056        /*Add vx and vy as inputs to the tria element: */
    5095         element->AddInput(VxEnum,      vx,      element->VelocityInterpolation());
    5096         element->AddInput(VyEnum,      vy,      element->VelocityInterpolation());
    5097         element->AddInput(VelEnum,     vel,     element->VelocityInterpolation());
     5057        element->AddInput(VxEnum, vx, element->VelocityInterpolation());
     5058        element->AddInput(VyEnum, vy, element->VelocityInterpolation());
     5059        element->AddInput(VelEnum,vel,element->VelocityInterpolation());
    50985060        if(pnumdof>0) element->AddInput(PressureEnum,pressure,element->PressureInterpolation());
    50995061        if(dim==3) element->AddInput(VzEnum,vz, element->VelocityInterpolation());
     
    58795841        /*Intermediaries */
    58805842        int         i,j;
    5881         IssmDouble  Jdet,viscosity,oldviscosity,newviscosity,viscosity_overshoot; //viscosity
     5843        IssmDouble  Jdet,viscosity;
    58825844        IssmDouble  *xyz_list      = NULL;
    58835845        IssmDouble* B              = xNew<IssmDouble>(3*numdofp);
     
    59095871        /* Get node coordinates and dof list: */
    59105872        element->GetVerticesCoordinates(&xyz_list);
    5911         element->FindParam(&viscosity_overshoot,StressbalanceViscosityOvershootEnum);
    59125873        Input* vx_input   =element->GetInput(VxEnum);       _assert_(vx_input);
    59135874        Input* vy_input   =element->GetInput(VyEnum);       _assert_(vy_input);
    5914         Input* vxold_input=element->GetInput(VxPicardEnum); _assert_(vxold_input);
    5915         Input* vyold_input=element->GetInput(VyPicardEnum); _assert_(vyold_input);
    59165875
    59175876        /* Start  looping on the number of gaussian points: */
     
    59275886                this->GetBSSAprime(Bprime,basaltria,2,xyz_list, gauss_tria);
    59285887                element->material->ViscosityHO(&viscosity,3,xyz_list,gauss,vx_input,vy_input);
    5929                 element->material->ViscosityHO(&oldviscosity,3,xyz_list,gauss,vxold_input,vyold_input);
    5930 
    5931                 newviscosity=viscosity+viscosity_overshoot*(viscosity-oldviscosity);
    5932                 D_scalar=2*newviscosity*gauss->weight*Jdet;
     5888
     5889                D_scalar=2*viscosity*gauss->weight*Jdet;
    59335890                for (i=0;i<3;i++) D[i][i]=D_scalar;
    59345891
     
    60516008        int         i,j,approximation;
    60526009        int         dim=3;
    6053         IssmDouble  Jdet,viscosity,oldviscosity,newviscosity,viscosity_overshoot;
     6010        IssmDouble  Jdet,viscosity;
    60546011        IssmDouble  epsilon[5],oldepsilon[5];       /* epsilon=[exx,eyy,exy,exz,eyz];*/
    60556012        IssmDouble  epsilons[6];                    //6 for FS
     
    60716028        /*Retrieve all inputs and parameters*/
    60726029        element->GetVerticesCoordinates(&xyz_list);
    6073         element->FindParam(&viscosity_overshoot,StressbalanceViscosityOvershootEnum);
    60746030        Input* vx_input   =element->GetInput(VxEnum);       _assert_(vx_input);
    60756031        Input* vy_input   =element->GetInput(VyEnum);       _assert_(vy_input);
    6076         Input* vxold_input=element->GetInput(VxPicardEnum); _assert_(vxold_input);
    6077         Input* vyold_input=element->GetInput(VyPicardEnum); _assert_(vyold_input);
    60786032        Input* vz_input   =element->GetInput(VzEnum);       _assert_(vz_input);
    60796033
     
    60926046                if(approximation==SSAHOApproximationEnum){
    60936047                        element->material->ViscosityHO(&viscosity,dim,xyz_list,gauss,vx_input,vy_input);
    6094                         element->material->ViscosityHO(&oldviscosity,dim,xyz_list,gauss,vxold_input,vyold_input);
    6095                         newviscosity=viscosity+viscosity_overshoot*(viscosity-oldviscosity);
    60966048                }
    60976049                else if (approximation==SSAFSApproximationEnum){
    6098                         element->material->ViscosityFS(&newviscosity,dim,xyz_list,gauss,vx_input,vy_input,vz_input);
     6050                        element->material->ViscosityFS(&viscosity,dim,xyz_list,gauss,vx_input,vy_input,vz_input);
    60996051                }
    61006052                else _error_("approximation " << approximation << " (" << EnumToStringx(approximation) << ") not supported yet");
    61016053
    6102                 D_scalar=2*newviscosity*gauss->weight*Jdet;
     6054                D_scalar=2*viscosity*gauss->weight*Jdet;
    61036055                for (i=0;i<3;i++) D[i][i]=D_scalar;
    61046056
     
    70186970        }
    70196971
    7020         /*Now, we have to move the previous Vx and Vy inputs  to old
    7021          * status, otherwise, we'll wipe them off: */
    7022         element->InputChangeName(VxEnum,VxPicardEnum);
    7023         element->InputChangeName(VyEnum,VyPicardEnum);
    7024         element->InputChangeName(VzEnum,VzPicardEnum);
    7025         element->InputChangeName(PressureEnum,PressurePicardEnum);
    7026 
    70276972        /*Add vx and vy as inputs to element: */
    70286973        element->AddInput(VxEnum,vx,P1Enum);
     
    71287073        }
    71297074
    7130         /*Now, we have to move the previous Vx and Vy inputs  to old
    7131          * status, otherwise, we'll wipe them off: */
    7132         element->InputChangeName(VxEnum,VxPicardEnum);
    7133         element->InputChangeName(VyEnum,VyPicardEnum);
    7134         element->InputChangeName(VzEnum,VzPicardEnum);
    7135         element->InputChangeName(PressureEnum,PressurePicardEnum);
    7136 
    71377075        /*Add vx and vy as inputs to element: */
    71387076        element->AddInput(VxEnum,vx,P1Enum);
     
    72287166        for(i=0;i<numnodes;i++) pressure[i]=rho_ice*g*(surface[i]-xyz_list[i*3+2]);
    72297167
    7230         /*Now, we have to move the previous Vx and Vy inputs  to old
    7231          * status, otherwise, we'll wipe them off: */
    7232         element->InputChangeName(VxEnum,VxPicardEnum);
    7233         element->InputChangeName(VyEnum,VyPicardEnum);
    7234         element->InputChangeName(PressureEnum,PressurePicardEnum);
    7235 
    72367168        /*Add vx and vy as inputs to element: */
    72377169        element->AddInput(VxEnum,vx,P1Enum);
  • issm/trunk-jpl/src/c/classes/FemModel.cpp

    r22553 r22573  
    545545        int found=-1;
    546546        for(int i=0;i<nummodels;i++){
    547        
    548547                if (analysis_type_list[i]==configuration_type){
    549548                        found=i;
     
    566565        if(this->parameters->Exist(ToolkitsOptionsStringsEnum)){
    567566                ToolkitsOptionsFromAnalysis(this->parameters,analysis_type);
    568                 if(VerboseSolver()) _printf0_("      toolkits Options set for analysis type: " << EnumToStringx(analysis_type) << "\n");
    569         }
    570 
    571 }
    572 /*}}}*/
     567                if(VerboseSolver()) _printf0_("      toolkits Options set for analysis: " << EnumToStringx(analysis_type) << "\n");
     568        }
     569
     570}/*}}}*/
    573571void FemModel::SetCurrentConfiguration(int configuration_type){/*{{{*/
    574572        this->SetCurrentConfiguration(configuration_type,configuration_type);
Note: See TracChangeset for help on using the changeset viewer.