Changeset 23966
- Timestamp:
- 05/31/19 08:58:09 (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/GLheightadvectionAnalysis.cpp
r23585 r23966 61 61 62 62 /*Intermediaries */ 63 const IssmPDouble yts = 365*24*3600.; 63 64 int domaintype,dim; 64 65 IssmDouble Jdet,D_scalar,onboundary; … … 104 105 GetBprime(Bprime,element,dim,xyz_list,gauss); 105 106 106 D_scalar=gauss->weight*Jdet;107 108 107 /*Get velocity*/ 109 108 vx_input->GetInputValue(&vx,gauss); 110 109 vy_input->GetInputValue(&vy,gauss); 111 bc_input->GetInputValue(&onboundary,gauss); 112 if( onboundary>0.){113 /* We do not want to advect garbage, make sure only diffusion is applied on boundary*/114 v x = 0.; vy = 0.;115 }116 117 /*Diffusion */118 if(sqrt(vx*vx+vy*vy)<1000./31536000.){119 IssmPDouble kappa = -10.; 110 111 if(false){ 112 /*Streamline diffusion*/ 113 vel = sqrt(vx*vx+vy*vy); 114 if(vel<10./yts){ 115 vx = 0.; vy = 0.; 116 vel = 30./yts*500000.; 117 } 118 120 119 for(int i=0;i<numnodes;i++){ 121 120 for(int j=0;j<numnodes;j++){ 122 Ke->values[i*numnodes+j] += D_scalar*kappa*(dbasis[0*numnodes+j]*dbasis[0*numnodes+i] + dbasis[1*numnodes+j]*dbasis[1*numnodes+i]); 121 Ke->values[i*numnodes+j] += gauss->weight*Jdet*( 122 (vx*dbasis[0*numnodes+i] + vy*dbasis[1*numnodes+i])*(vx*dbasis[0*numnodes+j] + vy*dbasis[1*numnodes+j]) 123 + vel/500000.*(dbasis[0*numnodes+i]*dbasis[0*numnodes+j] + dbasis[1*numnodes+i]*dbasis[1*numnodes+j])); 123 124 } 124 125 } 125 126 } 126 127 /*Advection: */ 128 for(int i=0;i<numnodes;i++){ 129 for(int j=0;j<numnodes;j++){ 130 Ke->values[i*numnodes+j] += (D_scalar*(vx*dbasis[0*numnodes+j]*basis[i] + vy*dbasis[1*numnodes+j]*basis[i]))*1e-2; 131 } 132 } 133 134 /*Artificial diffusivity*/ 135 vel=sqrt(vx*vx + vy*vy)+1.e-14; 136 D[0][0]=D_scalar*h/(2.*vel)*fabs(vx*vx); D[0][1]=D_scalar*h/(2.*vel)*fabs(vx*vy); 137 D[1][0]=D_scalar*h/(2.*vel)*fabs(vy*vx); D[1][1]=D_scalar*h/(2.*vel)*fabs(vy*vy); 138 TripleMultiply(Bprime,dim,numnodes,1, 139 &D[0][0],2,2,0, 140 Bprime,dim,numnodes,0, 141 &Ke->values[0],1); 127 else{ 128 D_scalar=gauss->weight*Jdet; 129 130 bc_input->GetInputValue(&onboundary,gauss); 131 if(onboundary>0.){ 132 /*We do not want to advect garbage, make sure only diffusion is applied on boundary*/ 133 vx = 0.; vy = 0.; 134 } 135 136 /*Diffusion */ 137 if(sqrt(vx*vx+vy*vy)<1000./31536000.){ 138 IssmPDouble kappa = -10.; 139 for(int i=0;i<numnodes;i++){ 140 for(int j=0;j<numnodes;j++){ 141 Ke->values[i*numnodes+j] += D_scalar*kappa*(dbasis[0*numnodes+j]*dbasis[0*numnodes+i] + dbasis[1*numnodes+j]*dbasis[1*numnodes+i]); 142 } 143 } 144 } 145 146 /*Advection: */ 147 for(int i=0;i<numnodes;i++){ 148 for(int j=0;j<numnodes;j++){ 149 Ke->values[i*numnodes+j] += (D_scalar*(vx*dbasis[0*numnodes+j]*basis[i] + vy*dbasis[1*numnodes+j]*basis[i]))*1e-2; 150 } 151 } 152 153 /*Artificial diffusivity*/ 154 vel=sqrt(vx*vx + vy*vy)+1.e-14; 155 D[0][0]=D_scalar*h/(2.*vel)*fabs(vx*vx); D[0][1]=D_scalar*h/(2.*vel)*fabs(vx*vy); 156 D[1][0]=D_scalar*h/(2.*vel)*fabs(vy*vx); D[1][1]=D_scalar*h/(2.*vel)*fabs(vy*vy); 157 TripleMultiply(Bprime,dim,numnodes,1, 158 &D[0][0],2,2,0, 159 Bprime,dim,numnodes,0, 160 &Ke->values[0],1); 161 } 142 162 } 143 163
Note:
See TracChangeset
for help on using the changeset viewer.