source:
issm/oecreview/Archive/17984-18295/ISSM-18283-18284.diff@
18296
Last change on this file since 18296 was 18296, checked in by , 11 years ago | |
---|---|
File size: 13.0 KB |
-
../trunk-jpl/src/c/analyses/StressbalanceAnalysis.h
78 78 ElementVector* CreatePVectorFSViscousXTH(Element* element); 79 79 ElementVector* CreatePVectorFSShelf(Element* element); 80 80 ElementVector* CreatePVectorFSFront(Element* element); 81 ElementVector* CreatePVectorFSFriction(Element* element); 82 ElementVector* CreatePVectorFSStress(Element* element); 81 83 void GetBFS(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss); 82 84 void GetBFSprime(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss); 83 85 void GetBFSvel(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss); -
../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
244 244 iomodel->Constant(&fe_FS,FlowequationFeFSEnum); 245 245 if(fe_FS==LATaylorHoodEnum){ 246 246 iomodel->FetchDataToInput(elements,PressureEnum); 247 InputUpdateFromConstantx(elements,0.,SigmaNNEnum); 247 248 } 248 249 249 250 /*Friction law variables*/ … … 2895 2896 2896 2897 /*Fetch number of nodes and dof for this finite element*/ 2897 2898 int vnumnodes = element->NumberofNodesVelocity(); 2898 int pnumnodes; 2899 if(dim==2) pnumnodes=3; 2900 else pnumnodes=6; 2901 int lnumnodes; 2902 if(dim==2) lnumnodes=2; 2903 else lnumnodes=3; 2904 //int pnumnodes = element->NumberofNodes(P1Enum); 2899 int pnumnodes = element->GetNumberOfNodes(P1Enum); 2900 int lnumnodes = element->GetNumberOfNodes(P2Enum); 2905 2901 int numdof = vnumnodes*dim; 2906 2902 int pnumdof = pnumnodes; 2907 2903 int lnumdof = lnumnodes; … … 2919 2915 IssmDouble* BU = xNew<IssmDouble>(pnumdof); 2920 2916 IssmDouble* BprimeU = xNew<IssmDouble>(numdof); 2921 2917 IssmDouble* D = xNewZeroInit<IssmDouble>(epssize*epssize); 2922 IssmDouble* CtCUzawa = xNewZeroInit<IssmDouble>(numdof*pnumdof);2923 IssmDouble* C = xNew<IssmDouble>(lnumdof);2924 IssmDouble* Cprime = xNew<IssmDouble>(numdof);2925 2918 2926 2919 /*Retrieve all inputs and parameters*/ 2927 2920 element->GetVerticesCoordinates(&xyz_list); 2928 Input* vx_input =element->GetInput(VxEnum); _assert_(vx_input);2929 Input* vy_input =element->GetInput(VyEnum); _assert_(vy_input);2930 Input* vz_input ;2931 if(dim==3){vz_input =element->GetInput(VzEnum); _assert_(vz_input);}2921 Input* vx_input = element->GetInput(VxEnum); _assert_(vx_input); 2922 Input* vy_input = element->GetInput(VyEnum); _assert_(vy_input); 2923 Input* vz_input = NULL; 2924 if(dim==3){vz_input = element->GetInput(VzEnum); _assert_(vz_input);} 2932 2925 2933 2926 /* Start looping on the number of gaussian points: */ 2934 2927 Gauss* gauss = element->NewGauss(5); … … 2956 2949 &DU,1,1,0, 2957 2950 BprimeU,1,numdof,0, 2958 2951 BtBUzawa,1); 2959 2960 2952 } 2961 2953 2962 2954 if(element->IsOnBase()){ … … 2964 2956 element->GetVerticesCoordinatesBase(&xyz_list_base); 2965 2957 element->NormalBase(&normal[0],xyz_list_base); 2966 2958 2967 int lsize;2968 IssmDouble* Dlambda = xNewZeroInit<IssmDouble>(dim*dim);2969 IssmDouble* C = xNewZeroInit<IssmDouble>(dim*lnumdof);2970 IssmDouble* C prime = xNewZeroInit<IssmDouble>(dim*numdof);2959 IssmDouble* Dlambda = xNewZeroInit<IssmDouble>(dim*dim); 2960 IssmDouble* C = xNewZeroInit<IssmDouble>(dim*lnumdof); 2961 IssmDouble* Cprime = xNewZeroInit<IssmDouble>(dim*numdof); 2962 IssmDouble* CtCUzawa = xNewZeroInit<IssmDouble>(numdof*lnumdof); 2971 2963 2972 2964 delete gauss; 2973 Gauss* gauss=element->NewGaussBase(5);2965 gauss = element->NewGaussBase(5); 2974 2966 for(int ig=gauss->begin();ig<gauss->end();ig++){ 2975 2967 gauss->GaussPoint(ig); 2976 2968 2977 2969 element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss); 2978 2970 this->GetCFS(C,element,dim,xyz_list,gauss); 2979 2971 this->GetCFSprime(Cprime,element,dim,xyz_list,gauss); 2980 for(i=0;i<dim;i++) Dlambda[i*epssize+i] = gauss->weight*Jdet*sqrt(normal[i]*normal[i])*sqrt(rl);2972 for(i=0;i<dim;i++) Dlambda[i*dim+i] = gauss->weight*Jdet*sqrt(normal[i]*normal[i])*sqrt(rl); 2981 2973 TripleMultiply(C,dim,lnumdof,1, 2982 2974 Dlambda,dim,dim,0, 2983 2975 Cprime,dim,numdof,0, 2984 2976 CtCUzawa,1); 2985 2977 } 2978 2979 /*The sigma naugmentation should not be transformed*/ 2980 MatrixMultiply(CtCUzawa,lnumdof,numdof,1, 2981 CtCUzawa,lnumdof,numdof,0, 2982 &Ke->values[0],1); 2983 2986 2984 /*Delete base part*/ 2987 xDelete<IssmDouble>(xyz_list_base);2988 2985 xDelete<IssmDouble>(Dlambda); 2989 2986 xDelete<IssmDouble>(C); 2990 2987 xDelete<IssmDouble>(Cprime); 2988 xDelete<IssmDouble>(CtCUzawa); 2989 xDelete<IssmDouble>(xyz_list_base); 2991 2990 } 2992 2991 2993 2992 /*Transform Coordinate System*/ … … 2998 2997 BtBUzawa,pnumdof,numdof,0, 2999 2998 &Ke->values[0],1); 3000 2999 3001 /*The sigma naugmentation should not be transformed*/3002 MatrixMultiply(CtCUzawa,lnumdof,numdof,1,3003 CtCUzawa,lnumdof,numdof,0,3004 &Ke->values[0],1);3005 3006 3000 /*Clean up and return*/ 3007 3001 delete gauss; 3008 3002 xDelete<IssmDouble>(xyz_list); … … 3012 3006 xDelete<IssmDouble>(BprimeU); 3013 3007 xDelete<IssmDouble>(BU); 3014 3008 xDelete<IssmDouble>(BtBUzawa); 3015 xDelete<IssmDouble>(Cprime);3016 xDelete<IssmDouble>(C);3017 xDelete<IssmDouble>(CtCUzawa);3018 3009 xDelete<int>(cs_list); 3019 3010 return Ke; 3020 3011 }/*}}}*/ … … 3297 3288 }/*}}}*/ 3298 3289 ElementVector* StressbalanceAnalysis::CreatePVectorFS(Element* element){/*{{{*/ 3299 3290 3291 ElementVector* pe = NULL; 3292 3293 ElementVector* pe1=CreatePVectorFSViscous(element); 3294 ElementVector* pe2=CreatePVectorFSFriction(element); 3295 ElementVector* pe3=CreatePVectorFSStress(element); 3296 pe =new ElementVector(pe1,pe2,pe3); 3297 delete pe1; 3298 delete pe2; 3299 delete pe3; 3300 3301 /*clean-up and return*/ 3302 return pe; 3303 }/*}}}*/ 3304 ElementVector* StressbalanceAnalysis::CreatePVectorFSViscous(Element* element){/*{{{*/ 3305 3300 3306 int i,dim,fe_FS; 3301 3307 IssmDouble x_coord,y_coord,z_coord; 3302 3308 IssmDouble Jdet,forcex,forcey,forcez; … … 3370 3376 } 3371 3377 return pe; 3372 3378 }/*}}}*/ 3379 ElementVector* StressbalanceAnalysis::CreatePVectorFSFriction(Element* element){/*{{{*/ 3380 3381 if(!element->IsOnBase()) return NULL; 3382 3383 /*Intermediaries*/ 3384 int dim; 3385 IssmDouble alpha2,Jdet; 3386 IssmDouble bed_normal[3]; 3387 IssmDouble *xyz_list_base = NULL; 3388 Gauss* gauss = NULL; 3389 3390 /*Get problem dimension*/ 3391 element->FindParam(&dim,DomainDimensionEnum); 3392 3393 /*Fetch number of nodes and dof for this finite element*/ 3394 int vnumnodes = element->NumberofNodesVelocity(); 3395 3396 /*Initialize Element matrix and vectors*/ 3397 ElementVector* pe = element->NewElementVector(FSvelocityEnum); 3398 IssmDouble* vbasis = xNew<IssmDouble>(vnumnodes); 3399 3400 /*Retrieve all inputs and parameters*/ 3401 element->GetVerticesCoordinatesBase(&xyz_list_base); 3402 Input* alpha2_input=element->GetInput(FrictionCoefficientEnum); _assert_(alpha2_input); 3403 3404 /* Start looping on the number of gaussian points: */ 3405 gauss=element->NewGaussBase(3); 3406 for(int ig=gauss->begin();ig<gauss->end();ig++){ 3407 gauss->GaussPoint(ig); 3408 3409 alpha2_input->GetInputValue(&alpha2, gauss); 3410 element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss); 3411 element->NodalFunctionsVelocity(vbasis,gauss); 3412 element->NormalBase(&bed_normal[0],xyz_list_base); 3413 3414 for(int i=0;i<vnumnodes;i++){ 3415 pe->values[i*dim+0] += - alpha2*gauss->weight*Jdet*vbasis[i]*bed_normal[1]; 3416 pe->values[i*dim+1] += alpha2*gauss->weight*Jdet*vbasis[i]*bed_normal[0]; 3417 if(dim==3){ 3418 pe->values[i*dim+2]+= alpha2*gauss->weight*Jdet*vbasis[i]; 3419 } 3420 } 3421 3422 } 3423 3424 /*DO NOT Transform Coordinate System: this stiffness matrix is already expressed in tangential coordinates*/ 3425 3426 /*Clean up and return*/ 3427 delete gauss; 3428 xDelete<IssmDouble>(xyz_list_base); 3429 xDelete<IssmDouble>(vbasis); 3430 return pe; 3431 }/*}}}*/ 3432 ElementVector* StressbalanceAnalysis::CreatePVectorFSStress(Element* element){/*{{{*/ 3433 3434 if(!element->IsOnBase()) return NULL; 3435 3436 /*Intermediaries*/ 3437 int dim; 3438 IssmDouble sigmann,sigmant,Jdet,bedslope,beta; 3439 IssmDouble *xyz_list_base = NULL; 3440 Gauss* gauss = NULL; 3441 3442 /*Get problem dimension*/ 3443 element->FindParam(&dim,DomainDimensionEnum); 3444 3445 /*Fetch number of nodes and dof for this finite element*/ 3446 int vnumnodes = element->NumberofNodesVelocity(); 3447 3448 /*Initialize Element matrix and vectors*/ 3449 ElementVector* pe = element->NewElementVector(FSvelocityEnum); 3450 IssmDouble* vbasis = xNew<IssmDouble>(vnumnodes); 3451 3452 /*Retrieve all inputs and parameters*/ 3453 element->GetVerticesCoordinatesBase(&xyz_list_base); 3454 Input* sigmann_input=element->GetInput(VzEnum); _assert_(sigmann_input); 3455 Input* sigmant_input=element->GetInput(TemperatureEnum); _assert_(sigmant_input); 3456 Input* bedslope_input=element->GetInput(BedSlopeXEnum); _assert_(bedslope_input); 3457 3458 /* Start looping on the number of gaussian points: */ 3459 gauss=element->NewGaussBase(3); 3460 for(int ig=gauss->begin();ig<gauss->end();ig++){ 3461 gauss->GaussPoint(ig); 3462 3463 sigmann_input->GetInputValue(&sigmann, gauss); 3464 sigmant_input->GetInputValue(&sigmant, gauss); 3465 bedslope_input->GetInputValue(&bedslope, gauss); 3466 element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss); 3467 element->NodalFunctionsVelocity(vbasis,gauss); 3468 3469 beta=sqrt(1+bedslope*bedslope); 3470 for(int i=0;i<vnumnodes;i++){ 3471 pe->values[i*dim+0] += - (1./beta)*(-bedslope*sigmann + sigmant)*gauss->weight*Jdet*vbasis[i]; 3472 pe->values[i*dim+1] += - (1./beta)*(sigmann + bedslope*sigmant)*gauss->weight*Jdet*vbasis[i]; 3473 if(dim==3){ 3474 //pe->values[i*dim+2]+= alpha2*gauss->weight*Jdet*vbasis[i]; 3475 _error_("3d not supported yet"); 3476 } 3477 } 3478 3479 } 3480 3481 /*DO NOT Transform Coordinate System: this stiffness matrix is already expressed in tangential coordinates*/ 3482 3483 /*Clean up and return*/ 3484 delete gauss; 3485 xDelete<IssmDouble>(xyz_list_base); 3486 xDelete<IssmDouble>(vbasis); 3487 return pe; 3488 }/*}}}*/ 3373 3489 #else 3374 3490 ElementMatrix* StressbalanceAnalysis::CreateKMatrixFSFriction(Element* element){/*{{{*/ 3375 3491 … … 3501 3617 /*clean-up and return*/ 3502 3618 return pe; 3503 3619 }/*}}}*/ 3504 #endif3505 3620 ElementVector* StressbalanceAnalysis::CreatePVectorFSViscous(Element* element){/*{{{*/ 3506 3621 3507 3622 int i,dim; … … 3571 3686 xDelete<IssmDouble>(xyz_list); 3572 3687 return pe; 3573 3688 }/*}}}*/ 3689 #endif 3574 3690 ElementVector* StressbalanceAnalysis::CreatePVectorFSViscousXTH(Element* element){/*{{{*/ 3575 3691 3576 3692 int i,tausize,dim; … … 3771 3887 element->FindParam(&r,AugmentedLagrangianREnum); 3772 3888 element->GetVerticesCoordinates(&xyz_list); 3773 3889 3774 /*Get d and tau*/3890 /*Get pressure and sigmann*/ 3775 3891 Input* pressure_input=element->GetInput(PressureEnum); _assert_(pressure_input); 3776 3892 Input* sigmann_input =element->GetInput(SigmaNNEnum); _assert_(sigmann_input); 3777 3893 … … 3786 3902 for(i=0;i<numnodes;i++){ 3787 3903 pe->values[i*dim+0] += pressure*gauss->weight*Jdet*dbasis[0*numnodes+i]; 3788 3904 pe->values[i*dim+1] += pressure*gauss->weight*Jdet*dbasis[1*numnodes+i]; 3789 if(dim==3){ 3790 pe->values[i*dim+2]+= pressure*gauss->weight*Jdet*dbasis[2*numnodes+i]; 3791 } 3905 if(dim==3) pe->values[i*dim+2]+= pressure*gauss->weight*Jdet*dbasis[2*numnodes+i]; 3792 3906 } 3793 3907 } 3794 3908 3795 3909 if(element->IsOnBase()){ 3796 3797 3910 IssmDouble sigmann; 3798 3911 IssmDouble* vbasis = xNew<IssmDouble>(numnodes); 3799 3912 … … 3801 3914 element->NormalBase(&bed_normal[0],xyz_list_base); 3802 3915 3803 3916 delete gauss; 3804 Gauss*gauss=element->NewGaussBase(5);3917 gauss=element->NewGaussBase(5); 3805 3918 for(int ig=gauss->begin();ig<gauss->end();ig++){ 3806 3919 gauss->GaussPoint(ig); 3807 3920 … … 3810 3923 sigmann_input->GetInputValue(&sigmann, gauss); 3811 3924 3812 3925 for(i=0;i<numnodes;i++){ 3813 pe->values[i*dim+0] += - sigmann*bed_normal[0]*gauss->weight*Jdet*vbasis[i]; 3814 pe->values[i*dim+1] += - sigmann*bed_normal[1]*gauss->weight*Jdet*vbasis[i]; 3815 if(dim==3){ 3816 pe->values[i*dim+2]+= - sigmann*bed_normal[2]*gauss->weight*Jdet*vbasis[i]; 3817 } 3926 pe->values[i*dim+0] += + sigmann*bed_normal[0]*gauss->weight*Jdet*vbasis[i]; 3927 pe->values[i*dim+1] += + sigmann*bed_normal[1]*gauss->weight*Jdet*vbasis[i]; 3928 if(dim==3) pe->values[i*dim+2] += + sigmann*bed_normal[2]*gauss->weight*Jdet*vbasis[i]; 3818 3929 } 3819 3930 } 3820 3931 xDelete<IssmDouble>(xyz_list_base); … … 3822 3933 } 3823 3934 3824 3935 /*Transform coordinate system*/ 3825 //element->TransformLoadVectorCoord(pe,cs_list); Do not transform pressureaugmentation3936 //element->TransformLoadVectorCoord(pe,cs_list); Do not transform augmentation 3826 3937 3827 3938 /*Clean up and return*/ 3828 3939 delete gauss; … … 4470 4581 */ 4471 4582 4472 4583 /*Fetch number of nodes for this finite element*/ 4473 int lnumnodes; 4474 if(dim==2) lnumnodes=3; 4475 else lnumnodes=6; 4476 //int pnumnodes = element->NumberofNodes(P1Enum); 4584 int lnumnodes = element->GetNumberOfNodes(P2Enum); 4477 4585 4478 4586 /*Get nodal functions derivatives*/ 4479 4587 IssmDouble* basis =xNew<IssmDouble>(lnumnodes); 4480 element->NodalFunctions (basis,gauss);4588 element->NodalFunctionsP2(basis,gauss); 4481 4589 4482 4590 /*Build B: */ 4483 4591 for(int i=0;i<lnumnodes;i++){ 4484 C[ i*lnumnodes+0] = basis[i];4485 C[ i*lnumnodes+1] = basis[i];4592 C[lnumnodes*0+i] = basis[i]; 4593 C[lnumnodes*1+i] = basis[i]; 4486 4594 } 4487 4595 4488 4596 /*Clean up*/ … … 4501 4609 */ 4502 4610 4503 4611 /*Fetch number of nodes for this finite element*/ 4504 int vnumnodes = element-> GetNumberOfNodes();4612 int vnumnodes = element->NumberofNodesVelocity(); 4505 4613 int vnumdof = vnumnodes*dim; 4506 4614 4507 4615 IssmDouble* vbasis=xNew<IssmDouble>(vnumnodes);
Note:
See TracBrowser
for help on using the repository browser.