Changeset 17525
- Timestamp:
- 03/24/14 11:39:40 (11 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 1 added
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified issm/trunk-jpl/src/c/Makefile.am ¶
r17517 r17525 355 355 ./solutionsequences/solutionsequence_nonlinear.cpp\ 356 356 ./solutionsequences/solutionsequence_newton.cpp\ 357 ./solutionsequences/solutionsequence_la_theta.cpp\ 357 358 ./solutionsequences/convergence.cpp\ 358 359 ./classes/Options/Options.h\ -
TabularUnified issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp ¶
r17516 r17525 407 407 case MINIEnum : finiteelement = P1bubbleEnum; break; 408 408 case TaylorHoodEnum : finiteelement = P2Enum; break; 409 case XTaylorHoodEnum : finiteelement = P2Enum; break; 409 410 case OneLayerP4zEnum : finiteelement = P2xP4Enum; break; 410 default: _error_("finite element "<< finiteelement<<" not supported");411 default: _error_("finite element "<<EnumToStringx(finiteelement)<<" not supported"); 411 412 } 412 413 } … … 826 827 bool isSSA,isL1L2,isHO,isFS; 827 828 bool conserve_loads = true; 828 int newton,meshtype ;829 int newton,meshtype,fe_FS; 829 830 830 831 /* recover parameters:*/ … … 833 834 femmodel->parameters->FindParam(&isHO,FlowequationIsHOEnum); 834 835 femmodel->parameters->FindParam(&isFS,FlowequationIsFSEnum); 836 femmodel->parameters->FindParam(&fe_FS,FlowequationFeFSEnum); 835 837 femmodel->parameters->FindParam(&meshtype,MeshTypeEnum); 836 838 femmodel->parameters->FindParam(&newton,StressbalanceIsnewtonEnum); 837 839 838 if((isSSA || isHO || isL1L2) ^ isFS){ // ^ = xor 840 if(isFS){ 841 if(VerboseSolution()) _printf0_(" computing velocities\n"); 842 843 femmodel->SetCurrentConfiguration(StressbalanceAnalysisEnum); 844 if (fe_FS==XTaylorHoodEnum) 845 solutionsequence_la_theta(femmodel); 846 else if(newton>0) 847 solutionsequence_newton(femmodel); 848 else 849 solutionsequence_nonlinear(femmodel,conserve_loads); 850 } 851 else if(isSSA || isHO || isL1L2){ 839 852 if(VerboseSolution()) _printf0_(" computing velocities\n"); 840 853 … … 851 864 extrudefrombase_core(femmodel); 852 865 } 866 } 867 else{ 868 _error_("not supported"); 853 869 } 854 870 … … 2857 2873 ElementMatrix* StressbalanceAnalysis::CreateKMatrixFS(Element* element){/*{{{*/ 2858 2874 2875 /*Get type of algorithm*/ 2876 int fe_FS; 2877 element->FindParam(&fe_FS,FlowequationFeFSEnum); 2878 2859 2879 /*compute all stiffness matrices for this element*/ 2860 ElementMatrix* Ke1=CreateKMatrixFSViscous(element); 2880 ElementMatrix* Ke1=NULL; 2881 if(fe_FS==XTaylorHoodEnum) 2882 Ke1=CreateKMatrixFSViscousXTH(element); 2883 else 2884 Ke1=CreateKMatrixFSViscous(element); 2885 2861 2886 ElementMatrix* Ke2=CreateKMatrixFSFriction(element); 2862 2887 ElementMatrix* Ke3=CreateKMatrixFSShelf(element); … … 2867 2892 delete Ke2; 2868 2893 delete Ke3; 2894 return Ke; 2895 }/*}}}*/ 2896 ElementMatrix* StressbalanceAnalysis::CreateKMatrixFSViscousXTH(Element* element){/*{{{*/ 2897 2898 /*Intermediaries*/ 2899 int i,meshtype,dim,epssize; 2900 IssmDouble r,FSreconditioning,Jdet; 2901 IssmDouble *xyz_list = NULL; 2902 2903 /*FIXME this should change*/ 2904 r = 1.; 2905 2906 /*Get problem dimension*/ 2907 element->FindParam(&meshtype,MeshTypeEnum); 2908 switch(meshtype){ 2909 case Mesh2DverticalEnum: dim = 2; epssize = 3; break; 2910 case Mesh3DEnum: dim = 3; epssize = 6; break; 2911 case Mesh3DtetrasEnum: dim = 3; epssize = 6; break; 2912 default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet"); 2913 } 2914 2915 /*Fetch number of nodes and dof for this finite element*/ 2916 int vnumnodes = element->NumberofNodesVelocity(); 2917 int pnumnodes = element->NumberofNodesPressure(); 2918 int numdof = vnumnodes*dim + pnumnodes; 2919 int bsize = epssize + 2; 2920 2921 /*Prepare coordinate system list*/ 2922 int* cs_list = xNew<int>(vnumnodes+pnumnodes); 2923 if(dim==2) for(i=0;i<vnumnodes;i++) cs_list[i] = XYEnum; 2924 else for(i=0;i<vnumnodes;i++) cs_list[i] = XYZEnum; 2925 for(i=0;i<pnumnodes;i++) cs_list[vnumnodes+i] = PressureEnum; 2926 2927 /*Initialize Element matrix and vectors*/ 2928 ElementMatrix* Ke = element->NewElementMatrix(FSvelocityEnum); 2929 IssmDouble* B = xNew<IssmDouble>(bsize*numdof); 2930 IssmDouble* Bprime = xNew<IssmDouble>(bsize*numdof); 2931 IssmDouble* D = xNewZeroInit<IssmDouble>(bsize*bsize); 2932 2933 /*Retrieve all inputs and parameters*/ 2934 element->GetVerticesCoordinates(&xyz_list); 2935 element->FindParam(&FSreconditioning,StressbalanceFSreconditioningEnum); 2936 Input* vx_input=element->GetInput(VxEnum); _assert_(vx_input); 2937 Input* vy_input=element->GetInput(VyEnum); _assert_(vy_input); 2938 Input* vz_input; 2939 if(dim==3){vz_input=element->GetInput(VzEnum); _assert_(vz_input);} 2940 2941 /* Start looping on the number of gaussian points: */ 2942 Gauss* gauss = element->NewGauss(5); 2943 for(int ig=gauss->begin();ig<gauss->end();ig++){ 2944 gauss->GaussPoint(ig); 2945 2946 element->JacobianDeterminant(&Jdet,xyz_list,gauss); 2947 this->GetBFS(B,element,dim,xyz_list,gauss); 2948 this->GetBFSprime(Bprime,element,dim,xyz_list,gauss); 2949 2950 for(i=0;i<epssize;i++) D[i*bsize+i] = + r*gauss->weight*Jdet; 2951 for(i=epssize;i<bsize;i++) D[i*bsize+i] = - FSreconditioning*gauss->weight*Jdet; 2952 2953 TripleMultiply(B,bsize,numdof,1, 2954 D,bsize,bsize,0, 2955 Bprime,bsize,numdof,0, 2956 &Ke->values[0],1); 2957 } 2958 2959 /*Transform Coordinate System*/ 2960 element->TransformStiffnessMatrixCoord(Ke,cs_list); 2961 2962 /*Clean up and return*/ 2963 delete gauss; 2964 xDelete<IssmDouble>(xyz_list); 2965 xDelete<IssmDouble>(D); 2966 xDelete<IssmDouble>(Bprime); 2967 xDelete<IssmDouble>(B); 2968 xDelete<int>(cs_list); 2869 2969 return Ke; 2870 2970 }/*}}}*/ … … 3179 3279 ElementVector* StressbalanceAnalysis::CreatePVectorFS(Element* element){/*{{{*/ 3180 3280 3181 /*compute all load vectors for this element*/ 3182 ElementVector* pe1=CreatePVectorFSViscous(element); 3183 ElementVector* pe2=CreatePVectorFSShelf(element); 3184 ElementVector* pe3=CreatePVectorFSFront(element); 3185 ElementVector* pe =new ElementVector(pe1,pe2,pe3); 3281 ElementVector* pe = NULL; 3282 3283 int fe_FS; 3284 element->FindParam(&fe_FS,FlowequationFeFSEnum); 3285 3286 if(fe_FS==XTaylorHoodEnum){ 3287 ElementVector* pe1=CreatePVectorFSViscous(element); 3288 ElementVector* pe2=CreatePVectorFSShelf(element); 3289 ElementVector* pe3=CreatePVectorFSFront(element); 3290 ElementVector* petemp =new ElementVector(pe1,pe2,pe3); 3291 ElementVector* pe4=CreatePVectorFSViscousXTH(element); 3292 ElementVector* pe = new ElementVector(petemp,pe4); 3293 delete pe1; 3294 delete pe2; 3295 delete pe3; 3296 delete petemp; 3297 delete pe4; 3298 } 3299 else{ 3300 ElementVector* pe1=CreatePVectorFSViscous(element); 3301 ElementVector* pe2=CreatePVectorFSShelf(element); 3302 ElementVector* pe3=CreatePVectorFSFront(element); 3303 pe =new ElementVector(pe1,pe2,pe3); 3304 delete pe1; 3305 delete pe2; 3306 delete pe3; 3307 } 3186 3308 3187 3309 /*clean-up and return*/ 3188 delete pe1;3189 delete pe2;3190 delete pe3;3191 3192 3310 return pe; 3193 3311 }/*}}}*/ 3194 3312 #endif 3195 3313 ElementVector* StressbalanceAnalysis::CreatePVectorFSViscous(Element* element){/*{{{*/ 3314 3315 int i,meshtype,dim; 3316 IssmDouble Jdet,forcex,forcey,forcez; 3317 IssmDouble *xyz_list = NULL; 3318 3319 /*Get problem dimension*/ 3320 element->FindParam(&meshtype,MeshTypeEnum); 3321 switch(meshtype){ 3322 case Mesh2DverticalEnum: dim = 2; break; 3323 case Mesh3DEnum: dim = 3; break; 3324 case Mesh3DtetrasEnum: dim = 3; break; 3325 default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet"); 3326 } 3327 3328 /*Fetch number of nodes and dof for this finite element*/ 3329 int vnumnodes = element->NumberofNodesVelocity(); 3330 int pnumnodes = element->NumberofNodesPressure(); 3331 3332 /*Prepare coordinate system list*/ 3333 int* cs_list = xNew<int>(vnumnodes+pnumnodes); 3334 if(dim==2) for(i=0;i<vnumnodes;i++) cs_list[i] = XYEnum; 3335 else for(i=0;i<vnumnodes;i++) cs_list[i] = XYZEnum; 3336 for(i=0;i<pnumnodes;i++) cs_list[vnumnodes+i] = PressureEnum; 3337 3338 /*Initialize vectors*/ 3339 ElementVector* pe = element->NewElementVector(FSvelocityEnum); 3340 IssmDouble* vbasis = xNew<IssmDouble>(vnumnodes); 3341 3342 /*Retrieve all inputs and parameters*/ 3343 element->GetVerticesCoordinates(&xyz_list); 3344 IssmDouble rho_ice =element->GetMaterialParameter(MaterialsRhoIceEnum); 3345 IssmDouble gravity =element->GetMaterialParameter(ConstantsGEnum); 3346 Input* loadingforcex_input=element->GetInput(LoadingforceXEnum); _assert_(loadingforcex_input); 3347 Input* loadingforcey_input=element->GetInput(LoadingforceYEnum); _assert_(loadingforcey_input); 3348 Input* loadingforcez_input=NULL; 3349 if(dim==3){ 3350 loadingforcez_input=element->GetInput(LoadingforceZEnum); _assert_(loadingforcez_input); 3351 } 3352 3353 /* Start looping on the number of gaussian points: */ 3354 Gauss* gauss=element->NewGauss(5); 3355 for(int ig=gauss->begin();ig<gauss->end();ig++){ 3356 gauss->GaussPoint(ig); 3357 3358 element->JacobianDeterminant(&Jdet,xyz_list,gauss); 3359 element->NodalFunctionsVelocity(vbasis,gauss); 3360 3361 loadingforcex_input->GetInputValue(&forcex,gauss); 3362 loadingforcey_input->GetInputValue(&forcey,gauss); 3363 if(dim==3) loadingforcez_input->GetInputValue(&forcez,gauss); 3364 3365 for(i=0;i<vnumnodes;i++){ 3366 pe->values[i*dim+0] += +rho_ice*forcex *Jdet*gauss->weight*vbasis[i]; 3367 pe->values[i*dim+1] += +rho_ice*forcey *Jdet*gauss->weight*vbasis[i]; 3368 if(dim==3){ 3369 pe->values[i*dim+2] += +rho_ice*forcez*Jdet*gauss->weight*vbasis[i]; 3370 pe->values[i*dim+2] += -rho_ice*gravity*Jdet*gauss->weight*vbasis[i]; 3371 } 3372 else{ 3373 pe->values[i*dim+1] += -rho_ice*gravity*Jdet*gauss->weight*vbasis[i]; 3374 } 3375 } 3376 } 3377 3378 /*Transform coordinate system*/ 3379 element->TransformLoadVectorCoord(pe,cs_list); 3380 3381 /*Clean up and return*/ 3382 delete gauss; 3383 xDelete<int>(cs_list); 3384 xDelete<IssmDouble>(vbasis); 3385 xDelete<IssmDouble>(xyz_list); 3386 return pe; 3387 }/*}}}*/ 3388 ElementVector* StressbalanceAnalysis::CreatePVectorFSViscousXTH(Element* element){/*{{{*/ 3389 _error_("STOP"); 3196 3390 3197 3391 int i,meshtype,dim; -
TabularUnified issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.h ¶
r17411 r17525 67 67 ElementMatrix* CreateJacobianMatrixFS(Element* element); 68 68 ElementMatrix* CreateKMatrixFS(Element* element); 69 ElementMatrix* CreateKMatrixFSViscousXTH(Element* element); 69 70 ElementMatrix* CreateKMatrixFSViscous(Element* element); 70 71 ElementMatrix* CreateKMatrixFSFriction(Element* element); … … 72 73 ElementVector* CreatePVectorFS(Element* element); 73 74 ElementVector* CreatePVectorFSViscous(Element* element); 75 ElementVector* CreatePVectorFSViscousXTH(Element* element); 74 76 ElementVector* CreatePVectorFSShelf(Element* element); 75 77 ElementVector* CreatePVectorFSFront(Element* element); -
TabularUnified issm/trunk-jpl/src/c/classes/Elements/Tria.cpp ¶
r17516 r17525 1596 1596 void Tria::ResetFSBasalBoundaryCondition(void){ 1597 1597 1598 int numnodes = this-> GetNumberOfNodes();1598 int numnodes = this->NumberofNodesVelocity(); 1599 1599 1600 1600 int approximation; … … 1919 1919 break; 1920 1920 case TaylorHoodEnum: 1921 case XTaylorHoodEnum: 1921 1922 numnodes = 9; 1922 1923 tria_node_ids = xNew<int>(numnodes); -
TabularUnified issm/trunk-jpl/src/c/classes/Elements/TriaRef.cpp ¶
r17242 r17525 421 421 return; 422 422 case TaylorHoodEnum: 423 case XTaylorHoodEnum: 423 424 this->element_type = P2Enum; 424 425 this->GetNodalFunctionsDerivatives(dbasis,xyz_list,gauss); … … 588 589 case MINIEnum: return NUMNODESP1b+NUMNODESP1; 589 590 case TaylorHoodEnum: return NUMNODESP2+NUMNODESP1; 591 case XTaylorHoodEnum: return NUMNODESP2+NUMNODESP1; 590 592 default: _error_("Element type "<<EnumToStringx(this->element_type)<<" not supported yet"); 591 593 } … … 603 605 case MINIEnum: return NUMNODESP1; 604 606 case TaylorHoodEnum: return NUMNODESP1; 607 case XTaylorHoodEnum: return NUMNODESP1; 605 608 default: _error_("Element type "<<EnumToStringx(this->element_type)<<" not supported yet"); 606 609 } … … 618 621 case MINIEnum: return NUMNODESP1b; 619 622 case TaylorHoodEnum: return NUMNODESP2; 623 case XTaylorHoodEnum: return NUMNODESP2; 620 624 default: _error_("Element type "<<EnumToStringx(this->element_type)<<" not supported yet"); 621 625 } … … 633 637 case MINIEnum: return P1bubbleEnum; 634 638 case TaylorHoodEnum: return P2Enum; 639 case XTaylorHoodEnum: return P2Enum; 635 640 default: _error_("Element type "<<EnumToStringx(this->element_type)<<" not supported yet"); 636 641 } -
TabularUnified issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateNodes.cpp ¶
r17419 r17525 294 294 break; 295 295 case TaylorHoodEnum: 296 case XTaylorHoodEnum: 296 297 _assert_(approximation==FSApproximationEnum); 297 298 /*P2 velocity*/ -
TabularUnified issm/trunk-jpl/src/c/solutionsequences/solutionsequences.h ¶
r17516 r17525 18 18 void solutionsequence_FScoupling_nonlinear(FemModel* femmodel,bool conserve_loads); 19 19 void solutionsequence_linear(FemModel* femmodel); 20 void solutionsequence_la_theta(FemModel* femmodel); 20 21 void solutionsequence_adjoint_linear(FemModel* femmodel); 21 22
Note:
See TracChangeset
for help on using the changeset viewer.