Changeset 25514
- Timestamp:
- 09/02/20 12:00:13 (5 years ago)
- Location:
- issm/trunk-jpl/src
- Files:
-
- 16 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
r25451 r25514 929 929 parameters->AddObject(iomodel->CopyConstantObject("md.flowequation.isFS",FlowequationIsFSEnum)); 930 930 parameters->AddObject(iomodel->CopyConstantObject("md.flowequation.fe_FS",FlowequationFeFSEnum)); 931 parameters->AddObject(iomodel->CopyConstantObject("md.flowequation.isNitscheBC",FlowequationIsNitscheEnum)); 932 parameters->AddObject(iomodel->CopyConstantObject("md.flowequation.FSNitscheGamma",FeFSNitscheGammaEnum)); 931 933 parameters->AddObject(iomodel->CopyConstantObject("md.stressbalance.restol",StressbalanceRestolEnum)); 932 934 parameters->AddObject(iomodel->CopyConstantObject("md.stressbalance.reltol",StressbalanceReltolEnum)); … … 3433 3435 /*Get type of algorithm*/ 3434 3436 int fe_FS; 3437 bool isNitsche; 3438 3435 3439 element->FindParam(&fe_FS,FlowequationFeFSEnum); 3440 element->FindParam(&isNitsche,FlowequationIsNitscheEnum); 3436 3441 3437 3442 /*compute all stiffness matrices for this element*/ … … 3441 3446 else if(fe_FS==LATaylorHoodEnum || fe_FS==LACrouzeixRaviartEnum) 3442 3447 Ke1=CreateKMatrixFSViscousLA(element); 3448 else if(fe_FS==P1P1GLSEnum) 3449 Ke1=CreateKMatrixFSViscousGLS(element); 3443 3450 else 3444 3451 Ke1=CreateKMatrixFSViscous(element); 3445 3452 3446 ElementMatrix* Ke2=CreateKMatrixFSFriction(element); 3453 ElementMatrix* Ke2; 3454 if (isNitsche) { 3455 Ke2 = CreateKMatrixFSFrictionNitsche(element); 3456 } 3457 else { 3458 Ke2 = CreateKMatrixFSFriction(element); 3459 } 3447 3460 ElementMatrix* Ke3=CreateKMatrixFSShelf(element); 3448 3461 ElementMatrix* Ke =new ElementMatrix(Ke1,Ke2,Ke3); … … 3564 3577 element->material->ViscosityFS(&viscosity,dim,xyz_list,gauss,vx_input,vy_input,vz_input); 3565 3578 3566 if(dim== 3){3579 if(dim==2 || dim==3){ 3567 3580 /*Stress balance*/ 3568 3581 for(int i=0;i<vnumnodes;i++){ 3569 3582 for(int j=0;j<vnumnodes;j++){ 3570 Ke->values[(3*i+0)*numdof+3*j+0] += gauss->weight*Jdet*viscosity*(2.*vdbasis[0*vnumnodes+j]*vdbasis[0*vnumnodes+i] + vdbasis[1*vnumnodes+j]*vdbasis[1*vnumnodes+i] + vdbasis[2*vnumnodes+j]*vdbasis[2*vnumnodes+i]); 3571 Ke->values[(3*i+0)*numdof+3*j+1] += gauss->weight*Jdet*viscosity*(vdbasis[0*vnumnodes+j]*vdbasis[1*vnumnodes+i]); 3572 Ke->values[(3*i+0)*numdof+3*j+2] += gauss->weight*Jdet*viscosity*(vdbasis[0*vnumnodes+j]*vdbasis[2*vnumnodes+i]); 3573 Ke->values[(3*i+1)*numdof+3*j+0] += gauss->weight*Jdet*viscosity*(vdbasis[1*vnumnodes+j]*vdbasis[0*vnumnodes+i]); 3574 Ke->values[(3*i+1)*numdof+3*j+1] += gauss->weight*Jdet*viscosity*(vdbasis[0*vnumnodes+j]*vdbasis[0*vnumnodes+i] + 2.*vdbasis[1*vnumnodes+j]*vdbasis[1*vnumnodes+i] + vdbasis[2*vnumnodes+j]*vdbasis[2*vnumnodes+i]); 3575 Ke->values[(3*i+1)*numdof+3*j+2] += gauss->weight*Jdet*viscosity*(vdbasis[1*vnumnodes+j]*vdbasis[2*vnumnodes+i]); 3576 Ke->values[(3*i+2)*numdof+3*j+0] += gauss->weight*Jdet*viscosity*(vdbasis[2*vnumnodes+j]*vdbasis[0*vnumnodes+i]); 3577 Ke->values[(3*i+2)*numdof+3*j+1] += gauss->weight*Jdet*viscosity*(vdbasis[2*vnumnodes+j]*vdbasis[1*vnumnodes+i]); 3578 Ke->values[(3*i+2)*numdof+3*j+2] += gauss->weight*Jdet*viscosity*(vdbasis[0*vnumnodes+j]*vdbasis[0*vnumnodes+i] + vdbasis[1*vnumnodes+j]*vdbasis[1*vnumnodes+i] + 2.*vdbasis[2*vnumnodes+j]*vdbasis[2*vnumnodes+i]); 3583 for (int p=0;p<dim;p++){ 3584 for (int q=0;q<dim;q++){ 3585 /* diagonal only */ 3586 Ke->values[(dim*i+p)*numdof+dim*j+p] += gauss->weight*Jdet*viscosity*(vdbasis[q*vnumnodes+j]*vdbasis[q*vnumnodes+i]); 3587 /* All the entries */ 3588 Ke->values[(dim*i+p)*numdof+dim*j+q] += gauss->weight*Jdet*viscosity*(vdbasis[p*vnumnodes+j]*vdbasis[q*vnumnodes+i]); 3589 } 3590 } 3579 3591 } 3580 3592 for(int k=0;k<pnumnodes;k++){ 3581 Ke->values[(3*i+0)*numdof+3*vnumnodes+k] += gauss->weight*Jdet*FSreconditioning*(-pbasis[k]*vdbasis[0*vnumnodes+i]);3582 Ke->values[(3*i+1)*numdof+3*vnumnodes+k] += gauss->weight*Jdet*FSreconditioning*(-pbasis[k]*vdbasis[1*vnumnodes+i]);3583 Ke->values[(3*i+2)*numdof+3*vnumnodes+k] += gauss->weight*Jdet*FSreconditioning*(-pbasis[k]*vdbasis[2*vnumnodes+i]);3593 for (int p=0;p<dim;p++){ 3594 Ke->values[(dim*i+p)*numdof+dim*vnumnodes+k] += gauss->weight*Jdet*FSreconditioning*(-pbasis[k]*vdbasis[p*vnumnodes+i]); 3595 } 3584 3596 } 3585 3597 } … … 3587 3599 for(int k=0;k<pnumnodes;k++){ 3588 3600 for(int j=0;j<vnumnodes;j++){ 3589 Ke->values[(3*vnumnodes+k)*numdof+3*j+0] += gauss->weight*Jdet*(-FSreconditioning*vdbasis[0*vnumnodes+j]*pbasis[k]); 3590 Ke->values[(3*vnumnodes+k)*numdof+3*j+1] += gauss->weight*Jdet*(-FSreconditioning*vdbasis[1*vnumnodes+j]*pbasis[k]); 3591 Ke->values[(3*vnumnodes+k)*numdof+3*j+2] += gauss->weight*Jdet*(-FSreconditioning*vdbasis[2*vnumnodes+j]*pbasis[k]); 3592 } 3593 } 3594 } 3595 else{ 3596 /*Stress balance*/ 3597 for(int i=0;i<vnumnodes;i++){ 3598 for(int j=0;j<vnumnodes;j++){ 3599 Ke->values[(2*i+0)*numdof+2*j+0] += gauss->weight*Jdet*viscosity*(2.*vdbasis[0*vnumnodes+j]*vdbasis[0*vnumnodes+i] + vdbasis[1*vnumnodes+j]*vdbasis[1*vnumnodes+i]); 3600 Ke->values[(2*i+0)*numdof+2*j+1] += gauss->weight*Jdet*viscosity*(vdbasis[0*vnumnodes+j]*vdbasis[1*vnumnodes+i]); 3601 Ke->values[(2*i+1)*numdof+2*j+0] += gauss->weight*Jdet*viscosity*(vdbasis[1*vnumnodes+j]*vdbasis[0*vnumnodes+i]); 3602 Ke->values[(2*i+1)*numdof+2*j+1] += gauss->weight*Jdet*viscosity*(vdbasis[0*vnumnodes+j]*vdbasis[0*vnumnodes+i] + 2.*vdbasis[1*vnumnodes+j]*vdbasis[1*vnumnodes+i]); 3603 } 3604 for(int k=0;k<pnumnodes;k++){ 3605 Ke->values[(2*i+0)*numdof+2*vnumnodes+k] += gauss->weight*Jdet*FSreconditioning*(-pbasis[k]*vdbasis[0*vnumnodes+i]); 3606 Ke->values[(2*i+1)*numdof+2*vnumnodes+k] += gauss->weight*Jdet*FSreconditioning*(-pbasis[k]*vdbasis[1*vnumnodes+i]); 3607 } 3608 } 3609 /*Incompressibility*/ 3610 for(int k=0;k<pnumnodes;k++){ 3611 for(int j=0;j<vnumnodes;j++){ 3612 Ke->values[(2*vnumnodes+k)*numdof+2*j+0] += gauss->weight*Jdet*(-FSreconditioning*vdbasis[0*vnumnodes+j]*pbasis[k]); 3613 Ke->values[(2*vnumnodes+k)*numdof+2*j+1] += gauss->weight*Jdet*(-FSreconditioning*vdbasis[1*vnumnodes+j]*pbasis[k]); 3601 for (int p=0;p<dim;p++){ 3602 Ke->values[(dim*vnumnodes+k)*numdof+dim*j+p] += gauss->weight*Jdet*(-FSreconditioning*vdbasis[p*vnumnodes+j]*pbasis[k]); 3603 } 3614 3604 } 3615 3605 } … … 3730 3720 xDelete<IssmDouble>(pbasis); 3731 3721 return Ke; 3722 }/*}}}*/ 3723 3724 ElementMatrix* StressbalanceAnalysis::CreateKMatrixFSViscousGLS(Element* element){/*{{{*/ 3725 3726 /*Intermediaries*/ 3727 int i,dim; 3728 IssmDouble viscosity,FSreconditioning,Jdet; 3729 IssmDouble *xyz_list = NULL; 3730 3731 /*Get problem dimension*/ 3732 element->FindParam(&dim,DomainDimensionEnum); 3733 3734 /*Fetch number of nodes and dof for this finite element*/ 3735 int vnumnodes = element->NumberofNodesVelocity(); 3736 int pnumnodes = element->NumberofNodesPressure(); 3737 int numdof = vnumnodes*dim + pnumnodes; 3738 3739 /* only work for P1 elements */ 3740 if (dim == 2) {_assert_(vnumnodes==3);} 3741 else if (dim == 3) {_assert_(vnumnodes==6);} 3742 else {_error_("GLS is not implemented except for 2D and 3D problems.");} 3743 3744 /*Prepare coordinate system list*/ 3745 int* cs_list = xNew<int>(vnumnodes+pnumnodes); 3746 if(dim==2) for(i=0;i<vnumnodes;i++) cs_list[i] = XYEnum; 3747 else for(i=0;i<vnumnodes;i++) cs_list[i] = XYZEnum; 3748 for(i=0;i<pnumnodes;i++) cs_list[vnumnodes+i] = PressureEnum; 3749 3750 /*Initialize Element matrix and vectors*/ 3751 ElementMatrix* Ke = element->NewElementMatrix(FSvelocityEnum); 3752 IssmDouble* vdbasis = xNew<IssmDouble>(dim*vnumnodes); 3753 IssmDouble* pbasis = xNew<IssmDouble>(pnumnodes); 3754 3755 /*Retrieve all inputs and parameters*/ 3756 element->GetVerticesCoordinates(&xyz_list); 3757 element->FindParam(&FSreconditioning,StressbalanceFSreconditioningEnum); 3758 Input* vx_input=element->GetInput(VxEnum); _assert_(vx_input); 3759 Input* vy_input=element->GetInput(VyEnum); _assert_(vy_input); 3760 Input* vz_input = NULL; 3761 if(dim==3){vz_input=element->GetInput(VzEnum); _assert_(vz_input);} 3762 3763 /* prepare viscosity gradient for GLS */ 3764 IssmDouble NodalViscosity[6]; 3765 IssmDouble gradViscos[3]; 3766 IssmDouble etapq, s, Tau, mk, hk; 3767 IssmDouble hx, hy, hz; 3768 IssmDouble SU[3*(3+1)*6]; 3769 Gauss* vert = element->NewGauss(); 3770 /* Compute the nodal values of the viscosity */ 3771 for(int i=0;i<vnumnodes;i++){ 3772 vert->GaussNode(element->element_type, i); 3773 element->material->ViscosityFS(&NodalViscosity[i],dim,xyz_list,vert,vx_input,vy_input,vz_input); 3774 } 3775 delete vert; 3776 3777 /* Start looping on the number of gaussian points: */ 3778 Gauss* gauss = element->NewGauss(5); 3779 while(gauss->next()){ 3780 element->JacobianDeterminant(&Jdet,xyz_list,gauss); 3781 element->NodalFunctionsDerivativesVelocity(vdbasis,xyz_list,gauss); 3782 element->NodalFunctionsPressure(pbasis,gauss); 3783 element->material->ViscosityFS(&viscosity,dim,xyz_list,gauss,vx_input,vy_input,vz_input); 3784 3785 /* compute viscosity gradient at the gaussian point */ 3786 element->ValueP1DerivativesOnGauss(&gradViscos[0],NodalViscosity,xyz_list,gauss); 3787 3788 /* weight*detJ */ 3789 s = gauss->weight*Jdet; 3790 3791 /* GLS Stabilization */ 3792 mk = 1.0 /3.0; 3793 element->ElementSizes(&hx,&hy,&hz); 3794 hk = max(max(hx, hy), hz); 3795 // if(!element->IsOnDirichletBoundary()) { 3796 Tau = - mk * hk * hk * 0.125 / viscosity; 3797 3798 3799 for (int q=0;q<dim;q++){ 3800 /* column 1-3 for the velocities */ 3801 for (int p=0;p<dim;p++){ 3802 for(int i=0;i<vnumnodes;i++){ 3803 SU[q*vnumnodes*(dim+1)+i*dim+p] = (-gradViscos[p])*vdbasis[q*vnumnodes+i]; 3804 } 3805 } 3806 /* add the diagnal components */ 3807 for(int i=0;i<vnumnodes;i++){ 3808 for (int p=0;p<dim;p++){ 3809 SU[q*vnumnodes*(dim+1)+i*dim+q] += (-gradViscos[p])*vdbasis[p*vnumnodes+i]; 3810 } 3811 } 3812 /* column 4 for the pressure */ 3813 for(int i=0;i<vnumnodes;i++){ 3814 SU[q*vnumnodes*(dim+1)+dim*vnumnodes+i] = FSreconditioning*vdbasis[q*vnumnodes+i]; 3815 } 3816 } 3817 3818 if(dim==2 || dim==3){ 3819 /*Stress balance*/ 3820 for(int i=0;i<vnumnodes;i++){ 3821 for(int j=0;j<vnumnodes;j++){ 3822 for (int p=0;p<dim;p++){ 3823 for (int q=0;q<dim;q++){ 3824 /* diagonal only */ 3825 Ke->values[(dim*i+p)*numdof+dim*j+p] += s*viscosity*(vdbasis[q*vnumnodes+j]*vdbasis[q*vnumnodes+i]); 3826 /* All the entries */ 3827 Ke->values[(dim*i+p)*numdof+dim*j+q] += s*viscosity*(vdbasis[p*vnumnodes+j]*vdbasis[q*vnumnodes+i]); 3828 } 3829 } 3830 } 3831 for(int k=0;k<pnumnodes;k++){ 3832 for (int p=0;p<dim;p++){ 3833 Ke->values[(dim*i+p)*numdof+dim*vnumnodes+k] += s*FSreconditioning*(-pbasis[k]*vdbasis[p*vnumnodes+i]); 3834 } 3835 } 3836 } 3837 /*Incompressibility*/ 3838 for(int k=0;k<pnumnodes;k++){ 3839 for(int j=0;j<vnumnodes;j++){ 3840 for (int p=0;p<dim;p++){ 3841 Ke->values[(dim*vnumnodes+k)*numdof+dim*j+p] += s*(-FSreconditioning*vdbasis[p*vnumnodes+j]*pbasis[k]); 3842 } 3843 } 3844 } 3845 3846 /* GLS */ 3847 for(int i=0;i<numdof;i++){ 3848 for(int j=0;j<numdof;j++){ 3849 for (int p=0;p<dim;p++){ 3850 Ke->values[i*numdof+j] += Tau * s * SU[p*numdof+i]*SU[p*numdof+j]; 3851 } 3852 } 3853 } 3854 } 3855 } 3856 3857 /*Transform Coordinate System*/ 3858 element->TransformStiffnessMatrixCoord(Ke,cs_list); 3859 3860 /*Clean up and return*/ 3861 delete gauss; 3862 xDelete<IssmDouble>(xyz_list); 3863 xDelete<IssmDouble>(pbasis); 3864 xDelete<IssmDouble>(vdbasis); 3865 xDelete<int>(cs_list); 3866 return Ke; 3867 }/*}}}*/ 3868 ElementVector* StressbalanceAnalysis::CreatePVectorFSViscousGLS(Element* element){/*{{{*/ 3869 3870 int i,dim; 3871 IssmDouble Jdet,forcex,forcey,forcez; 3872 IssmDouble *xyz_list = NULL; 3873 3874 /*Get problem dimension*/ 3875 element->FindParam(&dim,DomainDimensionEnum); 3876 3877 /*Fetch number of nodes and dof for this finite element*/ 3878 int vnumnodes = element->NumberofNodesVelocity(); 3879 int pnumnodes = element->NumberofNodesPressure(); 3880 3881 /*Prepare coordinate system list*/ 3882 int* cs_list = xNew<int>(vnumnodes+pnumnodes); 3883 if(dim==2) for(i=0;i<vnumnodes;i++) cs_list[i] = XYEnum; 3884 else for(i=0;i<vnumnodes;i++) cs_list[i] = XYZEnum; 3885 for(i=0;i<pnumnodes;i++) cs_list[vnumnodes+i] = PressureEnum; 3886 3887 /*Initialize vectors*/ 3888 ElementVector* pe = element->NewElementVector(FSvelocityEnum); 3889 IssmDouble* vbasis = xNew<IssmDouble>(vnumnodes); 3890 IssmDouble* vdbasis = xNew<IssmDouble>(dim*vnumnodes); 3891 3892 /*Retrieve all inputs and parameters*/ 3893 element->GetVerticesCoordinates(&xyz_list); 3894 IssmDouble rho_ice =element->FindParam(MaterialsRhoIceEnum); 3895 IssmDouble gravity =element->FindParam(ConstantsGEnum); 3896 Input* loadingforcex_input=element->GetInput(LoadingforceXEnum); _assert_(loadingforcex_input); 3897 Input* loadingforcey_input=element->GetInput(LoadingforceYEnum); _assert_(loadingforcey_input); 3898 Input* loadingforcez_input=NULL; 3899 if(dim==3){ 3900 loadingforcez_input=element->GetInput(LoadingforceZEnum); _assert_(loadingforcez_input); 3901 } 3902 3903 /* prepare viscosity gradient for GLS */ 3904 Input* vx_input=element->GetInput(VxEnum); _assert_(vx_input); 3905 Input* vy_input=element->GetInput(VyEnum); _assert_(vy_input); 3906 Input* vz_input = NULL; 3907 if(dim==3){vz_input=element->GetInput(VzEnum); _assert_(vz_input);} 3908 3909 IssmDouble viscosity,FSreconditioning; 3910 IssmDouble NodalViscosity[6]; 3911 IssmDouble gradViscos[3]; 3912 IssmDouble etapq, s, Tau, mk, hk; 3913 IssmDouble hx, hy, hz; 3914 IssmDouble SU[3*(3+1)*6]; 3915 Gauss* vert = element->NewGauss(); 3916 3917 element->FindParam(&FSreconditioning,StressbalanceFSreconditioningEnum); 3918 /* Compute the nodal values of the viscosity */ 3919 for(int i=0;i<vnumnodes;i++){ 3920 vert->GaussNode(element->element_type, i); 3921 element->material->ViscosityFS(&NodalViscosity[i],dim,xyz_list,vert,vx_input,vy_input,vz_input); 3922 } 3923 delete vert; 3924 3925 /* Start looping on the number of gaussian points: */ 3926 Gauss* gauss=element->NewGauss(5); 3927 while(gauss->next()){ 3928 3929 element->JacobianDeterminant(&Jdet,xyz_list,gauss); 3930 element->NodalFunctionsVelocity(vbasis,gauss); 3931 element->NodalFunctionsDerivativesVelocity(vdbasis,xyz_list,gauss); 3932 3933 loadingforcex_input->GetInputValue(&forcex,gauss); 3934 loadingforcey_input->GetInputValue(&forcey,gauss); 3935 if(dim==3) loadingforcez_input->GetInputValue(&forcez,gauss); 3936 3937 /* compute viscosity gradient at the gaussian point */ 3938 element->ValueP1DerivativesOnGauss(&gradViscos[0],NodalViscosity,xyz_list,gauss); 3939 /* weight*detJ */ 3940 s = gauss->weight*Jdet; 3941 /* GLS Stabilization */ 3942 element->material->ViscosityFS(&viscosity,dim,xyz_list,gauss,vx_input,vy_input,vz_input); 3943 mk = 1.0 /3.0; 3944 element->ElementSizes(&hx,&hy,&hz); 3945 hk = max(max(hx, hy), hz); 3946 // if(!element->IsOnDirichletBoundary()) { 3947 Tau = - mk * hk * hk * 0.125 / viscosity; 3948 // } 3949 // else { 3950 // Tau = 0.0; 3951 // } 3952 3953 for (int q=0;q<dim;q++){ 3954 /* column 1-3 for the velocities */ 3955 for (int p=0;p<dim;p++){ 3956 for(int i=0;i<vnumnodes;i++){ 3957 SU[q*vnumnodes*(dim+1)+i*dim+p] = (-gradViscos[p])*vdbasis[q*vnumnodes+i]; 3958 } 3959 } 3960 /* add the diagnal components */ 3961 for(int i=0;i<vnumnodes;i++){ 3962 for (int p=0;p<dim;p++){ 3963 SU[q*vnumnodes*(dim+1)+i*dim+q] += (-gradViscos[p])*vdbasis[p*vnumnodes+i]; 3964 } 3965 } 3966 /* column 4 for the pressure */ 3967 for(int i=0;i<vnumnodes;i++){ 3968 SU[q*vnumnodes*(dim+1)+dim*vnumnodes+i] = FSreconditioning*vdbasis[q*vnumnodes+i]; 3969 } 3970 } 3971 3972 for(i=0;i<vnumnodes;i++){ 3973 pe->values[i*dim+0] += +rho_ice*forcex *Jdet*gauss->weight*vbasis[i]; 3974 pe->values[i*dim+1] += +rho_ice*forcey *Jdet*gauss->weight*vbasis[i]; 3975 if(dim==3) pe->values[i*dim+2] += +rho_ice*forcez*Jdet*gauss->weight*vbasis[i]; 3976 3977 pe->values[i*dim+dim-1] += -rho_ice*gravity*Jdet*gauss->weight*vbasis[i]; 3978 } 3979 3980 for(int i=0;i<vnumnodes*(dim+1);i++){ 3981 pe->values[i] += Tau*Jdet*gauss->weight*rho_ice*(-gravity)*SU[(dim-1)*(dim+1)*vnumnodes+i]; 3982 } 3983 } 3984 3985 /*Transform coordinate system*/ 3986 element->TransformLoadVectorCoord(pe,cs_list); 3987 3988 /*Clean up and return*/ 3989 delete gauss; 3990 xDelete<int>(cs_list); 3991 xDelete<IssmDouble>(vbasis); 3992 xDelete<IssmDouble>(vdbasis); 3993 xDelete<IssmDouble>(xyz_list); 3994 return pe; 3732 3995 }/*}}}*/ 3733 3996 … … 4335 4598 delete pe4; 4336 4599 } 4600 else if(fe_FS==P1P1GLSEnum) { 4601 ElementVector* pe1=CreatePVectorFSViscousGLS(element); 4602 ElementVector* pe2=CreatePVectorFSShelf(element); 4603 ElementVector* pe3=CreatePVectorFSFront(element); 4604 pe =new ElementVector(pe1,pe2,pe3); 4605 delete pe1; 4606 delete pe2; 4607 delete pe3; 4608 } 4337 4609 else{ 4338 4610 ElementVector* pe1=CreatePVectorFSViscous(element); … … 4396 4668 pe->values[i*dim+0] += +rho_ice*forcex *Jdet*gauss->weight*vbasis[i]; 4397 4669 pe->values[i*dim+1] += +rho_ice*forcey *Jdet*gauss->weight*vbasis[i]; 4398 if(dim==3){ 4399 pe->values[i*dim+2] += +rho_ice*forcez*Jdet*gauss->weight*vbasis[i]; 4400 pe->values[i*dim+2] += -rho_ice*gravity*Jdet*gauss->weight*vbasis[i]; 4401 } 4402 else{ 4403 pe->values[i*dim+1] += -rho_ice*gravity*Jdet*gauss->weight*vbasis[i]; 4404 } 4670 if(dim==3) pe->values[i*dim+2] += +rho_ice*forcez*Jdet*gauss->weight*vbasis[i]; 4671 4672 pe->values[i*dim+dim-1] += -rho_ice*gravity*Jdet*gauss->weight*vbasis[i]; 4405 4673 } 4406 4674 } … … 4415 4683 xDelete<IssmDouble>(xyz_list); 4416 4684 return pe; 4685 }/*}}}*/ 4686 ElementMatrix* StressbalanceAnalysis::CreateKMatrixFSFrictionNitsche(Element* element){/*{{{*/ 4687 4688 if(element->IsFloating() || !element->IsOnBase()) return NULL; 4689 4690 /*If on water or not FS, skip stiffness: */ 4691 int approximation; 4692 element->GetInputValue(&approximation,ApproximationEnum); 4693 if(approximation!=FSApproximationEnum && approximation!=SSAFSApproximationEnum && approximation!=HOFSApproximationEnum) return NULL; 4694 4695 /*Intermediaries*/ 4696 bool mainlyfloating; 4697 int dim,domaintype; 4698 int friction_style,point1; 4699 IssmDouble alpha2,Jdet,fraction1,fraction2; 4700 IssmDouble viscosity, FSreconditioning; 4701 IssmDouble gllevelset,phi=1.; 4702 IssmDouble *xyz_list_base = NULL; 4703 IssmDouble *xyz_list = NULL; 4704 Gauss* gauss = NULL; 4705 /*coefficient of Nitsche's method*/ 4706 IssmDouble gamma, hx, hy, hz; 4707 IssmDouble pnu, qnv; 4708 4709 /*Get problem dimension*/ 4710 element->FindParam(&dim,DomainDimensionEnum); 4711 element->FindParam(&domaintype,DomainTypeEnum); 4712 element->FindParam(&FSreconditioning,StressbalanceFSreconditioningEnum); 4713 4714 /*Fetch number of nodes and dof for this finite element*/ 4715 int vnumnodes = element->NumberofNodesVelocity(); 4716 int pnumnodes = element->NumberofNodesPressure(); 4717 int numdof = vnumnodes*dim + pnumnodes; 4718 4719 /*Initialize Element matrix and vectors*/ 4720 ElementMatrix* Ke = element->NewElementMatrix(FSvelocityEnum); 4721 IssmDouble* vbasis = xNew<IssmDouble>(vnumnodes); 4722 IssmDouble* vdbasis = xNew<IssmDouble>(dim*vnumnodes); 4723 IssmDouble* pbasis = xNew<IssmDouble>(pnumnodes); 4724 IssmDouble* vdbasisn = xNew<IssmDouble>(vnumnodes); 4725 IssmDouble* nsigma = xNew<IssmDouble>(numdof); 4726 IssmDouble bed_normal[3], bed_tangent[6]; 4727 4728 /*Prepare coordinate system list*/ 4729 int* cs_list = xNew<int>(vnumnodes+pnumnodes); 4730 if(dim==2) for(int i=0;i<vnumnodes;i++) cs_list[i] = XYEnum; 4731 else for(int i=0;i<vnumnodes;i++) cs_list[i] = XYZEnum; 4732 for(int i=0;i<pnumnodes;i++) cs_list[vnumnodes+i] = PressureEnum; 4733 4734 /*Retrieve all inputs and parameters*/ 4735 element->GetVerticesCoordinatesBase(&xyz_list_base); 4736 element->GetVerticesCoordinates(&xyz_list); 4737 element->FindParam(&friction_style,GroundinglineFrictionInterpolationEnum); 4738 Input* gllevelset_input = NULL; 4739 Input* vx_input=element->GetInput(VxEnum); _assert_(vx_input); 4740 Input* vy_input=element->GetInput(VyEnum); _assert_(vy_input); 4741 Input* vz_input = NULL; 4742 if(dim==3){vz_input=element->GetInput(VzEnum); _assert_(vz_input);} 4743 4744 /*build friction object, used later on: */ 4745 Friction* friction=new Friction(element,dim==3?3:1); 4746 4747 /*Recover portion of element that is grounded*/ 4748 if(!(friction_style==SubelementFriction2Enum)) phi=element->GetGroundedPortion(xyz_list_base); 4749 if(friction_style==SubelementFriction2Enum){ 4750 if(domaintype==Domain2DverticalEnum) _error_("Subelement Friction 2 not implemented yet for Flowline"); 4751 gllevelset_input=element->GetInput(MaskOceanLevelsetEnum); _assert_(gllevelset_input); 4752 element->GetGroundedPart(&point1,&fraction1,&fraction2,&mainlyfloating); 4753 gauss=element->NewGaussBase(3); 4754 } 4755 else{ 4756 gauss=element->NewGaussBase(3); 4757 } 4758 4759 element->NormalBase(&bed_normal[0],xyz_list_base); 4760 element->TangentBase(&bed_tangent[0], &bed_normal[0]); 4761 element->ElementSizes(&hx,&hy,&hz); 4762 element->FindParam(&gamma,FeFSNitscheGammaEnum); 4763 4764 gamma = gamma / sqrt(hx*hx+hy*hy+hz*hz); 4765 4766 /* Start looping on the number of gaussian points: */ 4767 while(gauss->next()){ 4768 friction->GetAlpha2(&alpha2,gauss); 4769 if(friction_style==SubelementFriction1Enum) alpha2=phi*alpha2; 4770 else if(friction_style==SubelementFriction2Enum){ 4771 gllevelset_input->GetInputValue(&gllevelset, gauss); 4772 if(gllevelset<0.) alpha2=0.; 4773 } 4774 else if(friction_style==NoFrictionOnPartiallyFloatingEnum){ 4775 if (phi<0.99999999) alpha2=0.; 4776 } 4777 else _error_("friction interpolation "<<EnumToStringx(friction_style)<<" not implemented yet"); 4778 4779 element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss); 4780 element->NodalFunctionsVelocity(vbasis,gauss); 4781 /* The full element is needed for calculating derivative of the basis functions */ 4782 element->NodalFunctionsDerivativesVelocity(vdbasis,xyz_list,gauss); 4783 element->NodalFunctionsPressure(pbasis,gauss); 4784 element->material->ViscosityFS(&viscosity,dim,xyz_list,gauss,vx_input,vy_input,vz_input); 4785 4786 /*Frictions*/ 4787 for(int i=0;i<vnumnodes;i++){ 4788 for(int j=0;j<vnumnodes;j++){ 4789 for (int d=0; d<2; d++) { 4790 for (int p=0; p<dim; p++) { 4791 for (int q=0; q<dim; q++) { 4792 Ke->values[(dim*i+p)*numdof+dim*j+q] += alpha2*gauss->weight*Jdet*vbasis[i]*vbasis[j]*bed_tangent[d*3+p]*bed_tangent[d*3+q]; 4793 } 4794 } 4795 } 4796 } 4797 } 4798 /* -------- Nitsche terms -------- */ 4799 /* n\cdot\nabla\phi*/ 4800 for(int i=0;i<vnumnodes;i++){ 4801 vdbasisn[i] = 0.0; 4802 for (int d=0; d<dim; d++) { 4803 vdbasisn[i] += bed_normal[d]*vdbasis[d*vnumnodes+i]; 4804 } 4805 } 4806 /* Boundary terms for integration by parts. 4807 The coefficient matrix of n*sigma*n-gamma*n*u is stored in the following order: 4808 rows--dimensions, columns--number of nodes. 4809 If we consider nsigma as a 1d vector, it has exactly the same order as the unknown vector. 4810 */ 4811 for(int i=0;i<vnumnodes;i++){ 4812 for(int d=0;d<dim;d++){ 4813 nsigma[d*vnumnodes+i] = 2.0 * viscosity * bed_normal[d]*vdbasisn[i]; 4814 } 4815 } 4816 for(int i=0;i<pnumnodes;i++){ 4817 nsigma[dim*vnumnodes+i] = -FSreconditioning*pbasis[i]; 4818 } 4819 4820 /*velocity components A11 */ 4821 for(int i=0;i<vnumnodes;i++){ 4822 for (int p=0; p<dim; p++) { 4823 for(int j=0;j<vnumnodes;j++){ 4824 for (int q=0; q<dim; q++) { 4825 /* gamma*(n*u)*(n*v) */ 4826 Ke->values[(dim*i+p)*numdof+dim*j+q] += gauss->weight*Jdet * (-gamma) * bed_normal[q] * vbasis[j]*bed_normal[p] * vbasis[i]; 4827 /* sigma(u)*(n*v) */ 4828 Ke->values[(dim*i+p)*numdof+dim*j+q] += (- gauss->weight*Jdet)* nsigma[p*vnumnodes+i] * bed_normal[q] * vbasis[j]; 4829 /* sigma(v)*(n*u) */ 4830 Ke->values[(dim*i+p)*numdof+dim*j+q] += (- gauss->weight*Jdet)* bed_normal[p] * vbasis[i] * nsigma[q*vnumnodes+j]; 4831 } 4832 } 4833 } 4834 } 4835 4836 /* pressure x velocity component A12 */ 4837 for(int k=0;k<pnumnodes;k++){ 4838 pnu = nsigma[dim*vnumnodes+k]; 4839 for(int i=0;i<vnumnodes;i++){ 4840 for (int p=0;p<dim;p++) { 4841 Ke->values[(dim*i+p)*numdof+dim*vnumnodes+k] += gauss->weight*Jdet * pnu * (- bed_normal[p] * vbasis[i]); 4842 } 4843 } 4844 } 4845 /* velocity x pressure component A21 */ 4846 for(int k=0;k<pnumnodes;k++){ 4847 qnv = nsigma[dim*vnumnodes+k]; 4848 for(int j=0;j<vnumnodes;j++){ 4849 for (int q=0;q<dim;q++) { 4850 Ke->values[(dim*vnumnodes+k)*numdof+dim*j+q] += gauss->weight*Jdet * ( - bed_normal[q] * vbasis[j]) * qnv; 4851 } 4852 } 4853 } 4854 } 4855 4856 /*Transform Coordinate System*/ 4857 element->TransformStiffnessMatrixCoord(Ke,cs_list); 4858 4859 /*Clean up and return*/ 4860 delete gauss; 4861 delete friction; 4862 xDelete<IssmDouble>(xyz_list_base); 4863 xDelete<IssmDouble>(xyz_list); 4864 xDelete<IssmDouble>(vbasis); 4865 xDelete<IssmDouble>(vdbasis); 4866 xDelete<IssmDouble>(pbasis); 4867 xDelete<IssmDouble>(vdbasisn); 4868 xDelete<IssmDouble>(nsigma); 4869 xDelete<int>(cs_list); 4870 return Ke; 4417 4871 }/*}}}*/ 4418 4872 #endif -
issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.h
r25451 r25514 73 73 ElementMatrix* CreateKMatrixFS(Element* element); 74 74 ElementMatrix* CreateKMatrixFSFriction(Element* element); 75 ElementMatrix* CreateKMatrixFSFrictionNitsche(Element* element); 75 76 ElementMatrix* CreateKMatrixFSShelf(Element* element); 76 77 ElementMatrix* CreateKMatrixFSViscous(Element* element); 78 ElementMatrix* CreateKMatrixFSViscousGLS(Element* element); 77 79 ElementMatrix* CreateKMatrixFSViscousLA(Element* element); 78 80 ElementMatrix* CreateKMatrixFSViscousXTH(Element* element); … … 85 87 ElementVector* CreatePVectorFSStress(Element* element); 86 88 ElementVector* CreatePVectorFSViscous(Element* element); 89 ElementVector* CreatePVectorFSViscousGLS(Element* element); 87 90 ElementVector* CreatePVectorFSViscousLA(Element* element); 88 91 ElementVector* CreatePVectorFSViscousXTH(Element* element); -
issm/trunk-jpl/src/c/classes/Elements/Element.h
r25508 r25514 343 343 virtual void StressIntensityFactor(void)=0; 344 344 virtual IssmDouble SurfaceArea(void)=0; 345 virtual void TangentBase(IssmDouble* bed_tangent,IssmDouble* bed_normal){_error_("not implemented yet");}; 345 346 virtual int TensorInterpolation()=0; 346 347 virtual IssmDouble TimeAdapt()=0; -
issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
r25508 r25514 3679 3679 return S; 3680 3680 } 3681 } 3682 /*}}}*/ 3683 void Penta::TangentBase(IssmDouble* bed_tangent,IssmDouble* bed_normal){/*{{{*/ 3684 /* 3685 To compute the two tangent bed_tangent[0:2] and bed_tangent[3:5] from the given normal vecotr. 3686 */ 3687 IssmDouble n1, n2, n3; 3688 IssmDouble tangent_norm; 3689 3690 n1 = fabs(bed_normal[0]); 3691 n2 = fabs(bed_normal[1]); 3692 n3 = fabs(bed_normal[2]); 3693 3694 /* For the first tangent, on x-y plane in most cases*/ 3695 if ((n1<=n3) && (n2<=n3)) { 3696 bed_tangent[0] = 0.0; 3697 bed_tangent[1] = -bed_normal[2]; 3698 bed_tangent[2] = bed_normal[1]; 3699 } 3700 else { 3701 bed_tangent[0] = -bed_normal[1]; 3702 bed_tangent[1] = bed_normal[0]; 3703 bed_tangent[2] = 0.0; 3704 } 3705 tangent_norm = sqrt(bed_tangent[0]*bed_tangent[0]+bed_tangent[1]*bed_tangent[1]+bed_tangent[2]*bed_tangent[2]); 3706 for(int i=0;i<3;i++) bed_tangent[i] = bed_tangent[i]/tangent_norm; 3707 /* The second tangent*/ 3708 bed_tangent[3] = bed_normal[1]*bed_tangent[2] - bed_normal[2]*bed_tangent[1]; 3709 bed_tangent[4] = bed_normal[2]*bed_tangent[0] - bed_normal[0]*bed_tangent[2]; 3710 bed_tangent[5] = bed_normal[0]*bed_tangent[1] - bed_normal[1]*bed_tangent[0]; 3711 tangent_norm = sqrt(bed_tangent[3]*bed_tangent[3]+bed_tangent[4]*bed_tangent[4]+bed_tangent[5]*bed_tangent[5]); 3712 for(int i=3;i<6;i++) bed_tangent[i] = bed_tangent[i]/tangent_norm; 3713 3714 IssmDouble checksum = 0.0; 3715 for (int i=0;i<3;i++) { 3716 checksum += bed_normal[i]*bed_tangent[i]; 3717 checksum += bed_normal[i]*bed_tangent[i+3]; 3718 checksum += bed_tangent[i]*bed_tangent[i+3]; 3719 } 3720 _assert_(fabs(checksum)<1e-10); 3681 3721 } 3682 3722 /*}}}*/ -
issm/trunk-jpl/src/c/classes/Elements/Penta.h
r25508 r25514 178 178 void StrainRateperpendicular(); 179 179 IssmDouble SurfaceArea(void); 180 void TangentBase(IssmDouble* bed_tangent,IssmDouble* bed_normal); 180 181 int TensorInterpolation(){_error_("not implemented yet");}; 181 182 IssmDouble TimeAdapt(); -
issm/trunk-jpl/src/c/classes/gauss/GaussPenta.cpp
r25446 r25514 571 571 switch(finiteelement){ 572 572 case P1Enum: case P1DGEnum: 573 case P1P1GLSEnum: case P1P1Enum: /* added to allow P1-P1 GLS */ 573 574 switch(iv){ 574 575 case 0: coord1=1.; coord2=0.; coord3=0.; coord4=-1.; break; -
issm/trunk-jpl/src/c/classes/gauss/GaussTria.cpp
r25451 r25514 567 567 break; 568 568 case P1Enum: case P1DGEnum: 569 case P1P1GLSEnum: case P1P1Enum:/* added to allow P1-P1 GLS */ 569 570 switch(iv){ 570 571 case 0: coord1=1.; coord2=0.; coord3=0.; break; -
issm/trunk-jpl/src/c/cores/stressbalance_core.cpp
r24240 r25514 19 19 bool dakota_analysis,control_analysis; 20 20 int domaintype; 21 bool isSIA,isSSA,isL1L2,isHO,isFS ;21 bool isSIA,isSSA,isL1L2,isHO,isFS,isNitsche; 22 22 bool save_results; 23 23 int solution_type; … … 33 33 femmodel->parameters->FindParam(&isHO,FlowequationIsHOEnum); 34 34 femmodel->parameters->FindParam(&isFS,FlowequationIsFSEnum); 35 femmodel->parameters->FindParam(&isNitsche,FlowequationIsNitscheEnum); 35 36 femmodel->parameters->FindParam(&save_results,SaveResultsEnum); 36 37 femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum); … … 46 47 bedslope_core(femmodel); 47 48 femmodel->SetCurrentConfiguration(StressbalanceAnalysisEnum); 48 ResetFSBasalBoundaryConditionx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters); 49 if (!isNitsche) { 50 ResetFSBasalBoundaryConditionx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters); 51 } 49 52 50 53 /*We need basal melt rates for the shelf dampening*/ -
issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateNodes.cpp
r24098 r25514 66 66 numnodes = iomodel->numberofvertices+iomodel->numberofedges; 67 67 break; 68 case P1P1Enum: case P1P1GLSEnum: 69 /*P1 velocity + P1 pressure element with GLS stabilization*/ 70 numnodes = (iomodel->numberofvertices) + iomodel->numberofvertices; 71 break; 68 72 case MINIEnum: case MINIcondensedEnum: 69 73 /*P1+ velocity (bubble statically condensed), P1 pressure*/ … … 127 131 FacesPartitioning(iomodel); 128 132 numnodes = iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->numberofverticalfaces; 133 break; 134 case P1P1Enum: case P1P1GLSEnum: 135 /*P1 velocity + P1 pressure element with GLS stabilization*/ 136 numnodes = (iomodel->numberofvertices) + iomodel->numberofvertices; 129 137 break; 130 138 case MINIEnum: case MINIcondensedEnum: … … 207 215 element_node_ids[4]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[3*i+1]; 208 216 element_node_ids[5]=iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[3*i+2]; 217 break; 218 case P1P1Enum: case P1P1GLSEnum: 219 element_numnodes = 3+3; 220 element_node_ids[0]=iomodel->elements[3*i+0]-1; 221 element_node_ids[1]=iomodel->elements[3*i+1]-1; 222 element_node_ids[2]=iomodel->elements[3*i+2]-1; 223 for(int n=0;n<3;n++) nodes_approx[element_node_ids[n]] = FSvelocityEnum; 224 element_node_ids[3]=iomodel->numberofvertices+iomodel->elements[3*i+0]-1; 225 element_node_ids[4]=iomodel->numberofvertices+iomodel->elements[3*i+1]-1; 226 element_node_ids[5]=iomodel->numberofvertices+iomodel->elements[3*i+2]-1; 227 for(int n=3;n<6;n++) nodes_approx[element_node_ids[n]] = FSpressureEnum; 209 228 break; 210 229 case MINIEnum: case MINIcondensedEnum: … … 408 427 element_node_ids[28]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*i+1]+2; /* 3/4 vertical face 2*/ 409 428 element_node_ids[29]=iomodel->numberofvertices+iomodel->numberofedges+2*iomodel->numberofverticaledges+3*iomodel->elementtoverticalfaceconnectivity[3*i+2]+2; /* 3/4 vertical face 3*/ 429 break; 430 case P1P1Enum: case P1P1GLSEnum: 431 /*P1-P1 very similar to MINI, but no DOF on the element 432 TODO: add if(!approximations) or not?*/ 433 element_numnodes = 6+6; 434 element_node_ids[ 0]=iomodel->elements[6*i+0]-1; 435 element_node_ids[ 1]=iomodel->elements[6*i+1]-1; 436 element_node_ids[ 2]=iomodel->elements[6*i+2]-1; 437 element_node_ids[ 3]=iomodel->elements[6*i+3]-1; 438 element_node_ids[ 4]=iomodel->elements[6*i+4]-1; 439 element_node_ids[ 5]=iomodel->elements[6*i+5]-1; 440 if(!approximations) for(int n=0;n<6;n ++) nodes_approx[element_node_ids[n]] = FSvelocityEnum; 441 element_node_ids[ 6]=iomodel->numberofvertices+iomodel->elements[6*i+0]-1; 442 element_node_ids[ 7]=iomodel->numberofvertices+iomodel->elements[6*i+1]-1; 443 element_node_ids[ 8]=iomodel->numberofvertices+iomodel->elements[6*i+2]-1; 444 element_node_ids[ 9]=iomodel->numberofvertices+iomodel->elements[6*i+3]-1; 445 element_node_ids[10]=iomodel->numberofvertices+iomodel->elements[6*i+4]-1; 446 element_node_ids[11]=iomodel->numberofvertices+iomodel->elements[6*i+5]-1; 447 if(!approximations) for(int n=6;n<12;n++) nodes_approx[element_node_ids[n]] = FSpressureEnum; 410 448 break; 411 449 case MINIEnum: case MINIcondensedEnum: -
issm/trunk-jpl/src/c/modules/SetActiveNodesLSMx/SetActiveNodesLSMx.cpp
r25379 r25514 24 24 /*include switch for elements with multiple different sets of nodes*/ 25 25 switch(element->GetElementType()){ 26 case P1P1GLSEnum: case P1P1Enum:/* added to allow P1-P1 GLS */ 26 27 case MINIEnum:case MINIcondensedEnum: 27 28 case TaylorHoodEnum:case XTaylorHoodEnum:case LATaylorHoodEnum: -
issm/trunk-jpl/src/c/shared/Enum/Enum.vim
r25467 r25514 148 148 syn keyword cConstant FlowequationIsSIAEnum 149 149 syn keyword cConstant FlowequationIsSSAEnum 150 syn keyword cConstant FlowequationIsNitscheEnum 151 syn keyword cConstant FeFSNitscheGammaEnum 150 152 syn keyword cConstant FrictionCouplingEnum 151 153 syn keyword cConstant FrictionDeltaEnum -
issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
r25467 r25514 142 142 FlowequationIsSIAEnum, 143 143 FlowequationIsSSAEnum, 144 FlowequationIsNitscheEnum, 145 FeFSNitscheGammaEnum, 144 146 FrictionCouplingEnum, 145 147 FrictionDeltaEnum, -
issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
r25467 r25514 150 150 case FlowequationIsSIAEnum : return "FlowequationIsSIA"; 151 151 case FlowequationIsSSAEnum : return "FlowequationIsSSA"; 152 case FlowequationIsNitscheEnum : return "FlowequationIsNitsche"; 153 case FeFSNitscheGammaEnum : return "FeFSNitscheGamma"; 152 154 case FrictionCouplingEnum : return "FrictionCoupling"; 153 155 case FrictionDeltaEnum : return "FrictionDelta"; -
issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
r25467 r25514 153 153 else if (strcmp(name,"FlowequationIsSIA")==0) return FlowequationIsSIAEnum; 154 154 else if (strcmp(name,"FlowequationIsSSA")==0) return FlowequationIsSSAEnum; 155 else if (strcmp(name,"FlowequationIsNitsche")==0) return FlowequationIsNitscheEnum; 156 else if (strcmp(name,"FeFSNitscheGamma")==0) return FeFSNitscheGammaEnum; 155 157 else if (strcmp(name,"FrictionCoupling")==0) return FrictionCouplingEnum; 156 158 else if (strcmp(name,"FrictionDelta")==0) return FrictionDeltaEnum; … … 258 260 else if (strcmp(name,"MasstransportNumRequestedOutputs")==0) return MasstransportNumRequestedOutputsEnum; 259 261 else if (strcmp(name,"MasstransportPenaltyFactor")==0) return MasstransportPenaltyFactorEnum; 260 else if (strcmp(name,"MasstransportRequestedOutputs")==0) return MasstransportRequestedOutputsEnum;261 else if (strcmp(name,"MasstransportStabilization")==0) return MasstransportStabilizationEnum;262 262 else stage=3; 263 263 } 264 264 if(stage==3){ 265 if (strcmp(name,"MaterialsBeta")==0) return MaterialsBetaEnum; 265 if (strcmp(name,"MasstransportRequestedOutputs")==0) return MasstransportRequestedOutputsEnum; 266 else if (strcmp(name,"MasstransportStabilization")==0) return MasstransportStabilizationEnum; 267 else if (strcmp(name,"MaterialsBeta")==0) return MaterialsBetaEnum; 266 268 else if (strcmp(name,"MaterialsEarthDensity")==0) return MaterialsEarthDensityEnum; 267 269 else if (strcmp(name,"MaterialsEffectiveconductivityAveraging")==0) return MaterialsEffectiveconductivityAveragingEnum; … … 381 383 else if (strcmp(name,"SmbIsdelta18o")==0) return SmbIsdelta18oEnum; 382 384 else if (strcmp(name,"SmbIsdensification")==0) return SmbIsdensificationEnum; 383 else if (strcmp(name,"SmbIsfirnwarming")==0) return SmbIsfirnwarmingEnum;384 else if (strcmp(name,"SmbIsgraingrowth")==0) return SmbIsgraingrowthEnum;385 385 else stage=4; 386 386 } 387 387 if(stage==4){ 388 if (strcmp(name,"SmbIsmelt")==0) return SmbIsmeltEnum; 388 if (strcmp(name,"SmbIsfirnwarming")==0) return SmbIsfirnwarmingEnum; 389 else if (strcmp(name,"SmbIsgraingrowth")==0) return SmbIsgraingrowthEnum; 390 else if (strcmp(name,"SmbIsmelt")==0) return SmbIsmeltEnum; 389 391 else if (strcmp(name,"SmbIsmungsm")==0) return SmbIsmungsmEnum; 390 392 else if (strcmp(name,"SmbIsprecipscaled")==0) return SmbIsprecipscaledEnum; … … 504 506 else if (strcmp(name,"BasalforcingsPicoBoxId")==0) return BasalforcingsPicoBoxIdEnum; 505 507 else if (strcmp(name,"BasalforcingsPicoOverturningCoeff")==0) return BasalforcingsPicoOverturningCoeffEnum; 506 else if (strcmp(name,"BasalforcingsPicoSubShelfOceanOverturning")==0) return BasalforcingsPicoSubShelfOceanOverturningEnum;507 else if (strcmp(name,"BasalforcingsPicoSubShelfOceanSalinity")==0) return BasalforcingsPicoSubShelfOceanSalinityEnum;508 508 else stage=5; 509 509 } 510 510 if(stage==5){ 511 if (strcmp(name,"BasalforcingsPicoSubShelfOceanTemp")==0) return BasalforcingsPicoSubShelfOceanTempEnum; 511 if (strcmp(name,"BasalforcingsPicoSubShelfOceanOverturning")==0) return BasalforcingsPicoSubShelfOceanOverturningEnum; 512 else if (strcmp(name,"BasalforcingsPicoSubShelfOceanSalinity")==0) return BasalforcingsPicoSubShelfOceanSalinityEnum; 513 else if (strcmp(name,"BasalforcingsPicoSubShelfOceanTemp")==0) return BasalforcingsPicoSubShelfOceanTempEnum; 512 514 else if (strcmp(name,"BasalStressx")==0) return BasalStressxEnum; 513 515 else if (strcmp(name,"BasalStressy")==0) return BasalStressyEnum; … … 627 629 else if (strcmp(name,"HydrologydcMaskEplactiveElt")==0) return HydrologydcMaskEplactiveEltEnum; 628 630 else if (strcmp(name,"HydrologydcMaskEplactiveNode")==0) return HydrologydcMaskEplactiveNodeEnum; 629 else if (strcmp(name,"HydrologydcMaskThawedElt")==0) return HydrologydcMaskThawedEltEnum;630 else if (strcmp(name,"HydrologydcMaskThawedNode")==0) return HydrologydcMaskThawedNodeEnum;631 631 else stage=6; 632 632 } 633 633 if(stage==6){ 634 if (strcmp(name,"HydrologydcSedimentTransmitivity")==0) return HydrologydcSedimentTransmitivityEnum; 634 if (strcmp(name,"HydrologydcMaskThawedElt")==0) return HydrologydcMaskThawedEltEnum; 635 else if (strcmp(name,"HydrologydcMaskThawedNode")==0) return HydrologydcMaskThawedNodeEnum; 636 else if (strcmp(name,"HydrologydcSedimentTransmitivity")==0) return HydrologydcSedimentTransmitivityEnum; 635 637 else if (strcmp(name,"HydrologyDrainageRate")==0) return HydrologyDrainageRateEnum; 636 638 else if (strcmp(name,"HydrologyEnglacialInput")==0) return HydrologyEnglacialInputEnum; … … 750 752 else if (strcmp(name,"SmbDswrf")==0) return SmbDswrfEnum; 751 753 else if (strcmp(name,"SmbDzAdd")==0) return SmbDzAddEnum; 752 else if (strcmp(name,"SmbDz")==0) return SmbDzEnum;753 else if (strcmp(name,"SmbDzMin")==0) return SmbDzMinEnum;754 754 else stage=7; 755 755 } 756 756 if(stage==7){ 757 if (strcmp(name,"SmbDzTop")==0) return SmbDzTopEnum; 757 if (strcmp(name,"SmbDz")==0) return SmbDzEnum; 758 else if (strcmp(name,"SmbDzMin")==0) return SmbDzMinEnum; 759 else if (strcmp(name,"SmbDzTop")==0) return SmbDzTopEnum; 758 760 else if (strcmp(name,"SmbDzini")==0) return SmbDziniEnum; 759 761 else if (strcmp(name,"SmbEAir")==0) return SmbEAirEnum; … … 873 875 else if (strcmp(name,"VxMesh")==0) return VxMeshEnum; 874 876 else if (strcmp(name,"VxObs")==0) return VxObsEnum; 875 else if (strcmp(name,"VyAverage")==0) return VyAverageEnum;876 else if (strcmp(name,"Vy")==0) return VyEnum;877 877 else stage=8; 878 878 } 879 879 if(stage==8){ 880 if (strcmp(name,"VyMesh")==0) return VyMeshEnum; 880 if (strcmp(name,"VyAverage")==0) return VyAverageEnum; 881 else if (strcmp(name,"Vy")==0) return VyEnum; 882 else if (strcmp(name,"VyMesh")==0) return VyMeshEnum; 881 883 else if (strcmp(name,"VyObs")==0) return VyObsEnum; 882 884 else if (strcmp(name,"Vz")==0) return VzEnum; … … 996 998 else if (strcmp(name,"AdaptiveTimestepping")==0) return AdaptiveTimesteppingEnum; 997 999 else if (strcmp(name,"AdjointBalancethickness2Analysis")==0) return AdjointBalancethickness2AnalysisEnum; 998 else if (strcmp(name,"AdjointBalancethicknessAnalysis")==0) return AdjointBalancethicknessAnalysisEnum;999 else if (strcmp(name,"AdjointHorizAnalysis")==0) return AdjointHorizAnalysisEnum;1000 1000 else stage=9; 1001 1001 } 1002 1002 if(stage==9){ 1003 if (strcmp(name,"AggressiveMigration")==0) return AggressiveMigrationEnum; 1003 if (strcmp(name,"AdjointBalancethicknessAnalysis")==0) return AdjointBalancethicknessAnalysisEnum; 1004 else if (strcmp(name,"AdjointHorizAnalysis")==0) return AdjointHorizAnalysisEnum; 1005 else if (strcmp(name,"AggressiveMigration")==0) return AggressiveMigrationEnum; 1004 1006 else if (strcmp(name,"AmrBamg")==0) return AmrBamgEnum; 1005 1007 else if (strcmp(name,"AmrNeopz")==0) return AmrNeopzEnum; … … 1119 1121 else if (strcmp(name,"Gset")==0) return GsetEnum; 1120 1122 else if (strcmp(name,"Gsl")==0) return GslEnum; 1121 else if (strcmp(name,"HOApproximation")==0) return HOApproximationEnum;1122 else if (strcmp(name,"HOFSApproximation")==0) return HOFSApproximationEnum;1123 1123 else stage=10; 1124 1124 } 1125 1125 if(stage==10){ 1126 if (strcmp(name,"Hook")==0) return HookEnum; 1126 if (strcmp(name,"HOApproximation")==0) return HOApproximationEnum; 1127 else if (strcmp(name,"HOFSApproximation")==0) return HOFSApproximationEnum; 1128 else if (strcmp(name,"Hook")==0) return HookEnum; 1127 1129 else if (strcmp(name,"HydrologyDCEfficientAnalysis")==0) return HydrologyDCEfficientAnalysisEnum; 1128 1130 else if (strcmp(name,"HydrologyDCInefficientAnalysis")==0) return HydrologyDCInefficientAnalysisEnum; … … 1242 1244 else if (strcmp(name,"P1P1GLS")==0) return P1P1GLSEnum; 1243 1245 else if (strcmp(name,"P1bubble")==0) return P1bubbleEnum; 1244 else if (strcmp(name,"P1bubblecondensed")==0) return P1bubblecondensedEnum;1245 else if (strcmp(name,"P1xP2")==0) return P1xP2Enum;1246 1246 else stage=11; 1247 1247 } 1248 1248 if(stage==11){ 1249 if (strcmp(name,"P1xP3")==0) return P1xP3Enum; 1249 if (strcmp(name,"P1bubblecondensed")==0) return P1bubblecondensedEnum; 1250 else if (strcmp(name,"P1xP2")==0) return P1xP2Enum; 1251 else if (strcmp(name,"P1xP3")==0) return P1xP3Enum; 1250 1252 else if (strcmp(name,"P1xP4")==0) return P1xP4Enum; 1251 1253 else if (strcmp(name,"P2")==0) return P2Enum; … … 1365 1367 else if (strcmp(name,"MeshZ")==0) return MeshZEnum; 1366 1368 else if (strcmp(name,"NearestInterp")==0) return NearestInterpEnum; 1367 else if (strcmp(name,"OutputdefinitionList")==0) return OutputdefinitionListEnum;1368 else if (strcmp(name,"SealevelObs")==0) return SealevelObsEnum;1369 1369 else stage=12; 1370 1370 } 1371 1371 if(stage==12){ 1372 if (strcmp(name,"SealevelWeights")==0) return SealevelWeightsEnum; 1372 if (strcmp(name,"OutputdefinitionList")==0) return OutputdefinitionListEnum; 1373 else if (strcmp(name,"SealevelObs")==0) return SealevelObsEnum; 1374 else if (strcmp(name,"SealevelWeights")==0) return SealevelWeightsEnum; 1373 1375 else if (strcmp(name,"StrainRate")==0) return StrainRateEnum; 1374 1376 else if (strcmp(name,"StressTensor")==0) return StressTensorEnum; -
issm/trunk-jpl/src/m/classes/flowequation.m
r24861 r25514 11 11 isHO = 0; 12 12 isFS = 0; 13 isNitscheBC = 0; 14 FSNitscheGamma = 1e6; 13 15 fe_SSA = ''; 14 16 fe_HO = ''; … … 98 100 md = checkfield(md,'fieldname','flowequation.isHO','numel',[1],'values',[0 1]); 99 101 md = checkfield(md,'fieldname','flowequation.isFS','numel',[1],'values',[0 1]); 102 md = checkfield(md,'fieldname','flowequation.isNitscheBC','numel',[1],'values',[0 1]); 103 md = checkfield(md,'fieldname','flowequation.FSNitscheGamma','numel',[1], '>=', 0.); 100 104 md = checkfield(md,'fieldname','flowequation.fe_SSA','values',{'P1','P1bubble','P1bubblecondensed','P2','P2bubble'}); 101 105 md = checkfield(md,'fieldname','flowequation.fe_HO' ,'values',{'P1','P1bubble','P1bubblecondensed','P1xP2','P2xP1','P2','P2bubble','P1xP3','P1xP4','P2xP4'}); … … 144 148 fielddisplay(self,'isHO','is the Higher-Order (HO) approximation used ?'); 145 149 fielddisplay(self,'isFS','are the Full-FS (FS) equations used ?'); 150 fielddisplay(self,'isNitscheBC','is weakly imposed condition used?'); 151 fielddisplay(self,'FSNitscheGamma','Gamma value for the Nitsche term, by default gamma=1e6?'); 146 152 fielddisplay(self,'fe_SSA','Finite Element for SSA ''P1'', ''P1bubble'' ''P1bubblecondensed'' ''P2'''); 147 153 fielddisplay(self,'fe_HO', 'Finite Element for HO ''P1'' ''P1bubble'' ''P1bubblecondensed'' ''P1xP2'' ''P2xP1'' ''P2'''); … … 160 166 WriteData(fid,prefix,'object',self,'fieldname','isHO','format','Boolean'); 161 167 WriteData(fid,prefix,'object',self,'fieldname','isFS','format','Boolean'); 168 WriteData(fid,prefix,'object',self,'fieldname','isNitscheBC','format','Boolean'); 169 WriteData(fid,prefix,'object',self,'fieldname','FSNitscheGamma','format','Double'); 162 170 WriteData(fid,prefix,'object',self,'fieldname','fe_SSA','data',self.fe_SSA,'format','String'); 163 171 WriteData(fid,prefix,'object',self,'fieldname','fe_HO' ,'data',self.fe_HO,'format','String'); … … 182 190 writejsdouble(fid,[modelname '.flowequation.isHO'],self.isHO); 183 191 writejsdouble(fid,[modelname '.flowequation.isFS'],self.isFS); 184 writejsstring(fid,[modelname '.flowequation.fe_SSA'],self.fe_SSA); 192 writejsstring(fid,[modelname '.flowequation.isNitscheBC'],self.isNitscheBC); 193 writejsstring(fid,[modelname '.flowequation.FSNitscheGamma'],self.FSNitscheGamma); 194 writejsstring(fid,[modelname '.flowequation.fe_SSA'],self.fe_SSA); 185 195 writejsstring(fid,[modelname '.flowequation.fe_HO'],self.fe_HO); 186 196 writejsstring(fid,[modelname '.flowequation.fe_FS'],self.fe_FS); -
issm/trunk-jpl/src/m/classes/frictionschoof.m
r24666 r25514 45 45 disp('Schoof sliding law parameters:'); 46 46 disp(' Schoof''s sliding law reads:'); 47 disp(' C |u_b|^(m-1) ');47 disp(' C^2 |u_b|^(m-1) '); 48 48 disp(' tau_b = - _____________________________ u_b '); 49 disp(' (1+(C /(Cmax N))^1/m |u_b| )^m ');49 disp(' (1+(C^2/(Cmax N))^1/m |u_b| )^m '); 50 50 disp(' '); 51 51 fielddisplay(self,'C','friction coefficient [SI]');
Note:
See TracChangeset
for help on using the changeset viewer.