Changeset 17407
- Timestamp:
- 03/11/14 07:22:01 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/ExtrapolationAnalysis.cpp
r17363 r17407 57 57 if(VerboseSolution()) _printf0_("extrapolation of " << EnumToStringx(extvar_enum) << ": call computational core:\n"); 58 58 solutionsequence_linear(femmodel); 59 60 save_results= true;59 60 save_results=false; 61 61 if(save_results){ 62 62 if(VerboseSolution()) _printf0_(" saving results\n"); … … 79 79 const int dim = 2; 80 80 int i,row,col,stabilization; 81 bool extrapolatebydiffusion = true; 81 82 IssmDouble Jdet,D_scalar,h; 82 83 IssmDouble dlsf[dim],normal[dim]; … … 90 91 /*Initialize Element vector and other vectors*/ 91 92 ElementMatrix* Ke = element->NewElementMatrix(); 93 IssmDouble* B = xNew<IssmDouble>(dim*numnodes); 92 94 IssmDouble* Bprime = xNew<IssmDouble>(dim*numnodes); 93 95 IssmDouble D[dim][dim]; 94 96 95 97 /*Retrieve all inputs and parameters*/ 98 Input* lsf_slopex_input=element->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input); 99 Input* lsf_slopey_input=element->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input); 96 100 element->GetVerticesCoordinates(&xyz_list); 101 h = element->CharacteristicLength(); 97 102 98 103 /* Start looping on the number of gaussian points: */ … … 102 107 103 108 element->JacobianDeterminant(&Jdet,xyz_list,gauss); 109 GetB(B,element,xyz_list,gauss); 104 110 GetBprime(Bprime,element,xyz_list,gauss); 105 111 106 112 D_scalar=gauss->weight*Jdet; 107 113 108 for(row=0;row<dim;row++) 109 for(col=0;col<dim;col++) 110 D[row][col]=((row==col)?D_scalar:0.); 111 112 TripleMultiply(Bprime,dim,numnodes,1, 114 if(extrapolatebydiffusion){ 115 /* diffuse values outward */ 116 for(row=0;row<dim;row++) 117 for(col=0;col<dim;col++) 118 if(row==col) 119 D[row][col] = D_scalar; 120 else 121 D[row][col] = 0.; 122 123 TripleMultiply(Bprime,dim,numnodes,1, 113 124 &D[0][0],dim,dim,0, 114 125 Bprime,dim,numnodes,0, 115 126 &Ke->values[0],1); 127 } 128 else{ 129 /* extrapolate values along normal */ 130 /* Get normal on ice boundary */ 131 lsf_slopex_input->GetInputValue(&dlsf[0],gauss); 132 lsf_slopey_input->GetInputValue(&dlsf[1],gauss); 133 norm_dlsf=0.; 134 for(i=0;i<dim;i++) norm_dlsf+=dlsf[i]*dlsf[i]; 135 norm_dlsf=sqrt(norm_dlsf); _assert_(norm_dlsf>0.); 136 137 if(norm_dlsf>0.) 138 for(i=0;i<dim;i++) normal[i]=dlsf[i]/norm_dlsf; 139 else 140 for(i=0;i<dim;i++) normal[i]=0.; 141 142 for(row=0;row<dim;row++) 143 for(col=0;col<dim;col++) 144 if(row==col) 145 D[row][col]=D_scalar*normal[row]; 146 else 147 D[row][col]=0.; 148 TripleMultiply(B,dim,numnodes,1, 149 &D[0][0],dim,dim,0, 150 Bprime,dim,numnodes,0, 151 &Ke->values[0],1); 152 153 /* Stabilization *//*{{{*/ 154 stabilization=1; 155 if (stabilization==0){/* no stabilization, do nothing*/} 156 else if(stabilization==1){ 157 /* Artificial Diffusion */ 158 element->ElementSizes(&hx,&hy,&hz); 159 h=sqrt( pow(hx*normal[0],2) + pow(hy*normal[1],2)); 160 kappa=h/2.+1.e-14; 161 D[0][0]=D_scalar*kappa; 162 D[0][1]=0.; 163 D[1][0]=0.; 164 D[1][1]=D_scalar*kappa; 165 TripleMultiply(Bprime,dim,numnodes,1, 166 &D[0][0],dim,dim,0, 167 Bprime,dim,numnodes,0, 168 &Ke->values[0],1); 169 } 170 else if(stabilization==2){ 171 /*Streamline upwinding - do not use this for extrapolation: yields oscillating results due to smoothing along normal, not across */ 172 for(row=0;row<dim;row++) 173 for(col=0;col<dim;col++) 174 D[row][col]=h/(2.*1.)*normal[row]*normal[col]; 175 176 TripleMultiply(Bprime,dim,numnodes,1, 177 &D[0][0],dim,dim,0, 178 Bprime,dim,numnodes,0, 179 &Ke->values[0],1); 180 }/*}}}*/ 181 } 116 182 }/*}}}*/ 117 183 118 184 /*Clean up and return*/ 119 185 xDelete<IssmDouble>(xyz_list); 186 xDelete<IssmDouble>(B); 120 187 xDelete<IssmDouble>(Bprime); 121 188 delete gauss;
Note:
See TracChangeset
for help on using the changeset viewer.