Changeset 22977
- Timestamp:
- 07/19/18 14:59:24 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/GLheightadvectionAnalysis.cpp
r22974 r22977 62 62 int domaintype,dim; 63 63 IssmDouble Jdet,D_scalar; 64 IssmDouble vel,vx,vy,dvxdx,dvydy; 65 IssmDouble dvx[2],dvy[2]; 64 IssmDouble vel,vx,vy; 66 65 IssmDouble* xyz_list = NULL; 67 66 … … 80 79 ElementMatrix* Ke = element->NewElementMatrix(); 81 80 IssmDouble* basis = xNew<IssmDouble>(numnodes); 82 IssmDouble* B= xNew<IssmDouble>(dim*numnodes);81 IssmDouble* dbasis = xNew<IssmDouble>(dim*numnodes); 83 82 IssmDouble* Bprime = xNew<IssmDouble>(dim*numnodes); 84 IssmDouble D[2][2] = {0.};83 IssmDouble D[2][2] = {0.}; 85 84 86 85 /*Retrieve all inputs and parameters*/ 87 86 element->GetVerticesCoordinates(&xyz_list); 88 Input* vx_input=element->GetInput(BaseSlopeXEnum); _assert_(vx_input); 89 Input* vy_input=element->GetInput(BaseSlopeYEnum); _assert_(vy_input); 87 //Input* vx_input=element->GetInput(BaseSlopeXEnum); _assert_(vx_input); 88 //Input* vy_input=element->GetInput(BaseSlopeYEnum); _assert_(vy_input); 89 Input* vx_input=element->GetInput(VxEnum); _assert_(vx_input); 90 Input* vy_input=element->GetInput(VyEnum); _assert_(vy_input); 90 91 91 92 IssmDouble h = element->CharacteristicLength(); 92 93 93 94 /* Start looping on the number of gaussian points: */ 94 Gauss* gauss=element->NewGauss( 2);95 Gauss* gauss=element->NewGauss(4); 95 96 for(int ig=gauss->begin();ig<gauss->end();ig++){ 96 97 gauss->GaussPoint(ig); 97 98 98 99 element->JacobianDeterminant(&Jdet,xyz_list,gauss); 99 GetB(B,element,dim,xyz_list,gauss); 100 element->NodalFunctions(basis,gauss); 101 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss); 100 102 GetBprime(Bprime,element,dim,xyz_list,gauss); 101 103 104 D_scalar=gauss->weight*Jdet; 105 106 /*Diffusion */ 107 if(sqrt(vx*vx+vy*vy)<10./31536000.){ 108 IssmPDouble kappa = 1.e-4; 109 for(int i=0;i<numnodes;i++){ 110 for(int j=0;j<numnodes;j++){ 111 Ke->values[i*numnodes+j] += D_scalar*kappa*(dbasis[0*numnodes+j]*dbasis[0*numnodes+i] + dbasis[1*numnodes+j]*dbasis[1*numnodes+i]); 112 } 113 } 114 } 115 116 /*Advection: */ 102 117 vx_input->GetInputValue(&vx,gauss); 103 118 vy_input->GetInputValue(&vy,gauss); 104 vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss); 105 vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss); 106 dvxdx=dvx[0]; 107 dvydy=dvy[1]; 108 D_scalar=gauss->weight*Jdet; 109 110 /*Advection*/ 111 //D[0][0]=D_scalar*dvxdx; 112 //D[0][1]=0.; 113 //D[1][0]=0.; 114 //D[1][1]=D_scalar*dvydy; 115 //TripleMultiply(B,2,numnodes,1, 116 // &D[0][0],2,2,0, 117 // B,2,numnodes,0, 118 // &Ke->values[0],1); 119 120 //vx = 0.; 121 //vy = -.1; 122 if(sqrt(vx*vx+vy*vy)>0.28){ 123 /*Advection*/ 124 D[0][0]=D_scalar*vx; 125 D[1][1]=D_scalar*vy; 126 TripleMultiply(B,2,numnodes,1, 127 &D[0][0],2,2,0, 128 Bprime,2,numnodes,0, 129 &Ke->values[0],1); 130 } 131 else{ 132 /*Diffusion*/ 133 D[0][0]=1e5*h/2.0; 134 D[1][1]=1e5*h/2.0; 135 TripleMultiply(Bprime,2,numnodes,1, 136 &D[0][0],2,2,0, 137 Bprime,2,numnodes,0, 138 &Ke->values[0],1); 139 } 140 141 /*Stabilization*/ 142 D[0][0]=h/2.0*fabs(vx); 143 D[0][1]=0.; 144 D[1][0]=0.; 145 D[1][1]=h/2.0*fabs(vy); 146 TripleMultiply(Bprime,2,numnodes,1, 119 for(int i=0;i<numnodes;i++){ 120 for(int j=0;j<numnodes;j++){ 121 Ke->values[i*numnodes+j] += D_scalar*(vx*dbasis[0*numnodes+j]*basis[i] + vy*dbasis[1*numnodes+j]*basis[i]); 122 } 123 } 124 125 /*Artifficial diffusivity*/ 126 vel=sqrt(vx*vx + vy*vy)+1.e-14; 127 D[0][0]=D_scalar*h/(2.*vel)*fabs(vx*vx); D[0][1]=D_scalar*h/(2.*vel)*fabs(vx*vy); 128 D[1][0]=D_scalar*h/(2.*vel)*fabs(vy*vx); D[1][1]=D_scalar*h/(2.*vel)*fabs(vy*vy); 129 TripleMultiply(Bprime,dim,numnodes,1, 147 130 &D[0][0],2,2,0, 148 Bprime, 2,numnodes,0,131 Bprime,dim,numnodes,0, 149 132 &Ke->values[0],1); 150 133 } … … 152 135 /*Clean up and return*/ 153 136 xDelete<IssmDouble>(xyz_list); 154 xDelete<IssmDouble>(B); 137 xDelete<IssmDouble>(basis); 138 xDelete<IssmDouble>(dbasis); 155 139 xDelete<IssmDouble>(Bprime); 156 140 delete gauss;
Note:
See TracChangeset
for help on using the changeset viewer.