Changeset 7154 for anuga_core/source/anuga/abstract_2d_finite_volumes
- Timestamp:
- Jun 3, 2009, 1:16:10 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
anuga_core/source/anuga/abstract_2d_finite_volumes/quantity_ext.c
r6654 r7154 30 30 double* b){ 31 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 32 int i, k, k0, k1, k2, index3; 33 double x0, x1, x2, y0, y1, y2, q0, q1, q2; //, det; 34 35 36 for (k=0; k<N; k++) { 37 index3 = 3*k; 38 39 if (number_of_boundaries[k] < 2) { 40 // Two or three true neighbours 41 42 // Get indices of neighbours (or self when used as surrogate) 43 // k0, k1, k2 = surrogate_neighbours[k,:] 44 45 k0 = surrogate_neighbours[index3 + 0]; 46 k1 = surrogate_neighbours[index3 + 1]; 47 k2 = surrogate_neighbours[index3 + 2]; 48 49 50 if (k0 == k1 || k1 == k2) return -1; 51 52 // Get data 53 q0 = centroid_values[k0]; 54 q1 = centroid_values[k1]; 55 q2 = centroid_values[k2]; 56 57 x0 = centroids[k0*2]; y0 = centroids[k0*2+1]; 58 x1 = centroids[k1*2]; y1 = centroids[k1*2+1]; 59 x2 = centroids[k2*2]; y2 = centroids[k2*2+1]; 60 61 // Gradient 62 _gradient(x0, y0, x1, y1, x2, y2, q0, q1, q2, &a[k], &b[k]); 63 64 } else if (number_of_boundaries[k] == 2) { 65 // One true neighbour 66 67 // Get index of the one neighbour 68 i=0; k0 = k; 69 while (i<3 && k0==k) { 70 k0 = surrogate_neighbours[index3 + i]; 71 i++; 72 } 73 if (k0 == k) return -1; 74 75 k1 = k; //self 76 77 // Get data 78 q0 = centroid_values[k0]; 79 q1 = centroid_values[k1]; 80 81 x0 = centroids[k0*2]; y0 = centroids[k0*2+1]; 82 x1 = centroids[k1*2]; y1 = centroids[k1*2+1]; 83 84 // Two point gradient 85 _gradient2(x0, y0, x1, y1, q0, q1, &a[k], &b[k]); 86 87 } 88 // else: 89 // #No true neighbours - 90 // #Fall back to first order scheme 91 } 92 return 0; 93 93 } 94 94 95 95 96 96 int _extrapolate_from_gradient(int N, 97 double* centroids,98 double* centroid_values,99 double* vertex_coordinates,100 double* vertex_values,101 double* edge_values,102 double* a,103 double* b) {104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 97 double* centroids, 98 double* centroid_values, 99 double* vertex_coordinates, 100 double* vertex_values, 101 double* edge_values, 102 double* a, 103 double* b) { 104 105 int k, k2, k3, k6; 106 double x, y, x0, y0, x1, y1, x2, y2; 107 108 for (k=0; k<N; k++){ 109 k6 = 6*k; 110 k3 = 3*k; 111 k2 = 2*k; 112 113 // Centroid coordinates 114 x = centroids[k2]; y = centroids[k2+1]; 115 116 // vertex coordinates 117 // x0, y0, x1, y1, x2, y2 = X[k,:] 118 x0 = vertex_coordinates[k6 + 0]; 119 y0 = vertex_coordinates[k6 + 1]; 120 x1 = vertex_coordinates[k6 + 2]; 121 y1 = vertex_coordinates[k6 + 3]; 122 x2 = vertex_coordinates[k6 + 4]; 123 y2 = vertex_coordinates[k6 + 5]; 124 125 // Extrapolate to Vertices 126 vertex_values[k3+0] = centroid_values[k] + a[k]*(x0-x) + b[k]*(y0-y); 127 vertex_values[k3+1] = centroid_values[k] + a[k]*(x1-x) + b[k]*(y1-y); 128 vertex_values[k3+2] = centroid_values[k] + a[k]*(x2-x) + b[k]*(y2-y); 129 130 // Extrapolate to Edges (midpoints) 131 edge_values[k3+0] = 0.5*(vertex_values[k3 + 1]+vertex_values[k3 + 2]); 132 edge_values[k3+1] = 0.5*(vertex_values[k3 + 2]+vertex_values[k3 + 0]); 133 edge_values[k3+2] = 0.5*(vertex_values[k3 + 0]+vertex_values[k3 + 1]); 134 135 } 136 return 0; 137 137 } 138 138 … … 149 149 double* y_gradient) { 150 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 /* for (i=0; i<3; i++) { */216 /* n = neighbours[k3+i]; */217 /* if (n < 0) { */218 /* qn[i] = qc; */219 /* qmin[i] = qtmin; */220 /* qmax[i] = qtmax; */221 /* } */222 /* } */223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 151 int i, k, k2, k3, k6; 152 double x, y, x0, y0, x1, y1, x2, y2; 153 long n; 154 double qmin, qmax, qc; 155 double qn[3]; 156 double dq, dqa[3], r; 157 158 for (k=0; k<N; k++){ 159 k6 = 6*k; 160 k3 = 3*k; 161 k2 = 2*k; 162 163 // Centroid coordinates 164 x = centroids[k2+0]; 165 y = centroids[k2+1]; 166 167 // vertex coordinates 168 // x0, y0, x1, y1, x2, y2 = X[k,:] 169 x0 = vertex_coordinates[k6 + 0]; 170 y0 = vertex_coordinates[k6 + 1]; 171 x1 = vertex_coordinates[k6 + 2]; 172 y1 = vertex_coordinates[k6 + 3]; 173 x2 = vertex_coordinates[k6 + 4]; 174 y2 = vertex_coordinates[k6 + 5]; 175 176 // Extrapolate to Vertices 177 vertex_values[k3+0] = centroid_values[k] + x_gradient[k]*(x0-x) + y_gradient[k]*(y0-y); 178 vertex_values[k3+1] = centroid_values[k] + x_gradient[k]*(x1-x) + y_gradient[k]*(y1-y); 179 vertex_values[k3+2] = centroid_values[k] + x_gradient[k]*(x2-x) + y_gradient[k]*(y2-y); 180 181 // Extrapolate to Edges (midpoints) 182 edge_values[k3+0] = 0.5*(vertex_values[k3 + 1]+vertex_values[k3 + 2]); 183 edge_values[k3+1] = 0.5*(vertex_values[k3 + 2]+vertex_values[k3 + 0]); 184 edge_values[k3+2] = 0.5*(vertex_values[k3 + 0]+vertex_values[k3 + 1]); 185 } 186 187 188 189 for (k=0; k<N; k++){ 190 k6 = 6*k; 191 k3 = 3*k; 192 k2 = 2*k; 193 194 195 qc = centroid_values[k]; 196 197 qmin = qc; 198 qmax = qc; 199 200 for (i=0; i<3; i++) { 201 n = neighbours[k3+i]; 202 if (n < 0) { 203 qn[i] = qc; 204 } else { 205 qn[i] = centroid_values[n]; 206 } 207 208 qmin = min(qmin, qn[i]); 209 qmax = max(qmax, qn[i]); 210 } 211 212 //qtmin = min(min(min(qn[0],qn[1]),qn[2]),qc); 213 //qtmax = max(max(max(qn[0],qn[1]),qn[2]),qc); 214 215 /* for (i=0; i<3; i++) { */ 216 /* n = neighbours[k3+i]; */ 217 /* if (n < 0) { */ 218 /* qn[i] = qc; */ 219 /* qmin[i] = qtmin; */ 220 /* qmax[i] = qtmax; */ 221 /* } */ 222 /* } */ 223 224 phi[k] = 1.0; 225 226 for (i=0; i<3; i++) { 227 dq = edge_values[k3+i] - qc; //Delta between edge and centroid values 228 dqa[i] = dq; //Save dq for use in updating vertex values 229 230 r = 1.0; 231 232 if (dq > 0.0) r = (qmax - qc)/dq; 233 if (dq < 0.0) r = (qmin - qc)/dq; 234 235 phi[k] = min( min(r*beta, 1.0), phi[k]); 236 237 } 238 239 240 241 //Update gradient, edge and vertex values using phi limiter 242 x_gradient[k] = x_gradient[k]*phi[k]; 243 y_gradient[k] = y_gradient[k]*phi[k]; 244 245 edge_values[k3+0] = qc + phi[k]*dqa[0]; 246 edge_values[k3+1] = qc + phi[k]*dqa[1]; 247 edge_values[k3+2] = qc + phi[k]*dqa[2]; 248 249 250 vertex_values[k3+0] = edge_values[k3+1] + edge_values[k3+2] - edge_values[k3+0]; 251 vertex_values[k3+1] = edge_values[k3+2] + edge_values[k3+0] - edge_values[k3+1]; 252 vertex_values[k3+2] = edge_values[k3+0] + edge_values[k3+1] - edge_values[k3+2]; 253 254 255 } 256 257 return 0; 258 259 259 } 260 260 … … 263 263 264 264 int _limit_vertices_by_all_neighbours(int N, double beta, 265 double* centroid_values, 266 double* vertex_values, 267 double* edge_values, 268 long* neighbours, 269 double* x_gradient, 270 double* y_gradient) { 271 272 273 int i, k, k2, k3, k6; 274 long n; 275 double qmin, qmax, qn, qc; 276 double dq, dqa[3], phi, r; 277 278 for (k=0; k<N; k++){ 279 k6 = 6*k; 280 k3 = 3*k; 281 k2 = 2*k; 282 283 qc = centroid_values[k]; 284 qmin = qc; 285 qmax = qc; 286 287 for (i=0; i<3; i++) { 288 n = neighbours[k3+i]; 289 if (n >= 0) { 290 qn = centroid_values[n]; //Neighbour's centroid value 291 292 qmin = min(qmin, qn); 293 qmax = max(qmax, qn); 294 } 295 } 296 297 phi = 1.0; 298 for (i=0; i<3; i++) { 299 r = 1.0; 300 301 dq = vertex_values[k3+i] - qc; //Delta between vertex and centroid values 302 dqa[i] = dq; //Save dq for use in updating vertex values 303 304 if (dq > 0.0) r = (qmax - qc)/dq; 305 if (dq < 0.0) r = (qmin - qc)/dq; 265 double* centroid_values, 266 double* vertex_values, 267 double* edge_values, 268 long* neighbours, 269 double* x_gradient, 270 double* y_gradient) { 306 271 307 308 phi = min( min(r*beta, 1.0), phi); 309 } 310 311 //Update gradient, vertex and edge values using phi limiter 312 x_gradient[k] = x_gradient[k]*phi; 313 y_gradient[k] = y_gradient[k]*phi; 314 315 vertex_values[k3+0] = qc + phi*dqa[0]; 316 vertex_values[k3+1] = qc + phi*dqa[1]; 317 vertex_values[k3+2] = qc + phi*dqa[2]; 318 319 edge_values[k3+0] = 0.5*(vertex_values[k3+1] + vertex_values[k3+2]); 320 edge_values[k3+1] = 0.5*(vertex_values[k3+2] + vertex_values[k3+0]); 321 edge_values[k3+2] = 0.5*(vertex_values[k3+0] + vertex_values[k3+1]); 322 323 } 324 325 return 0; 272 273 int i, k, k2, k3, k6; 274 long n; 275 double qmin, qmax, qn, qc; 276 double dq, dqa[3], phi, r; 277 278 for (k=0; k<N; k++){ 279 k6 = 6*k; 280 k3 = 3*k; 281 k2 = 2*k; 282 283 qc = centroid_values[k]; 284 qmin = qc; 285 qmax = qc; 286 287 for (i=0; i<3; i++) { 288 n = neighbours[k3+i]; 289 if (n >= 0) { 290 qn = centroid_values[n]; //Neighbour's centroid value 291 292 qmin = min(qmin, qn); 293 qmax = max(qmax, qn); 294 } 295 } 296 297 phi = 1.0; 298 for (i=0; i<3; i++) { 299 r = 1.0; 300 301 dq = vertex_values[k3+i] - qc; //Delta between vertex and centroid values 302 dqa[i] = dq; //Save dq for use in updating vertex values 303 304 if (dq > 0.0) r = (qmax - qc)/dq; 305 if (dq < 0.0) r = (qmin - qc)/dq; 306 307 308 phi = min( min(r*beta, 1.0), phi); 309 } 310 311 //Update gradient, vertex and edge values using phi limiter 312 x_gradient[k] = x_gradient[k]*phi; 313 y_gradient[k] = y_gradient[k]*phi; 314 315 vertex_values[k3+0] = qc + phi*dqa[0]; 316 vertex_values[k3+1] = qc + phi*dqa[1]; 317 vertex_values[k3+2] = qc + phi*dqa[2]; 318 319 edge_values[k3+0] = 0.5*(vertex_values[k3+1] + vertex_values[k3+2]); 320 edge_values[k3+1] = 0.5*(vertex_values[k3+2] + vertex_values[k3+0]); 321 edge_values[k3+2] = 0.5*(vertex_values[k3+0] + vertex_values[k3+1]); 322 323 } 324 325 return 0; 326 326 } 327 327 … … 337 337 double* y_gradient) { 338 338 339 int i, k, k2, k3, k6; 340 long n; 341 double qmin, qmax, qn, qc; 342 double dq, dqa[3], phi, r; 343 344 for (k=0; k<N; k++){ 345 k6 = 6*k; 346 k3 = 3*k; 347 k2 = 2*k; 348 349 qc = centroid_values[k]; 350 qmin = qc; 351 qmax = qc; 352 353 for (i=0; i<3; i++) { 354 n = neighbours[k3+i]; 355 if (n >= 0) { 356 qn = centroid_values[n]; //Neighbour's centroid value 357 358 qmin = min(qmin, qn); 359 qmax = max(qmax, qn); 360 } 361 } 362 363 phi = 1.0; 364 for (i=0; i<3; i++) { 365 r = 1.0; 366 367 dq = edge_values[k3+i] - qc; //Delta between edge and centroid values 368 dqa[i] = dq; //Save dq for use in updating vertex values 369 370 if (dq > 0.0) r = (qmax - qc)/dq; 371 if (dq < 0.0) r = (qmin - qc)/dq; 339 int i, k, k2, k3, k6; 340 long n; 341 double qmin, qmax, qn, qc; 342 double dq, dqa[3], phi, r; 372 343 373 374 phi = min( min(r*beta, 1.0), phi); 375 } 376 377 //Update gradient, vertex and edge values using phi limiter 378 x_gradient[k] = x_gradient[k]*phi; 379 y_gradient[k] = y_gradient[k]*phi; 380 381 edge_values[k3+0] = qc + phi*dqa[0]; 382 edge_values[k3+1] = qc + phi*dqa[1]; 383 edge_values[k3+2] = qc + phi*dqa[2]; 384 385 vertex_values[k3+0] = edge_values[k3+1] + edge_values[k3+2] - edge_values[k3+0]; 386 vertex_values[k3+1] = edge_values[k3+2] + edge_values[k3+0] - edge_values[k3+1]; 387 vertex_values[k3+2] = edge_values[k3+0] + edge_values[k3+1] - edge_values[k3+2]; 388 389 } 390 391 return 0; 344 for (k=0; k<N; k++){ 345 k6 = 6*k; 346 k3 = 3*k; 347 k2 = 2*k; 348 349 qc = centroid_values[k]; 350 qmin = qc; 351 qmax = qc; 352 353 for (i=0; i<3; i++) { 354 n = neighbours[k3+i]; 355 if (n >= 0) { 356 qn = centroid_values[n]; //Neighbour's centroid value 357 358 qmin = min(qmin, qn); 359 qmax = max(qmax, qn); 360 } 361 } 362 363 phi = 1.0; 364 for (i=0; i<3; i++) { 365 r = 1.0; 366 367 dq = edge_values[k3+i] - qc; //Delta between edge and centroid values 368 dqa[i] = dq; //Save dq for use in updating vertex values 369 370 if (dq > 0.0) r = (qmax - qc)/dq; 371 if (dq < 0.0) r = (qmin - qc)/dq; 372 373 374 phi = min( min(r*beta, 1.0), phi); 375 } 376 377 //Update gradient, vertex and edge values using phi limiter 378 x_gradient[k] = x_gradient[k]*phi; 379 y_gradient[k] = y_gradient[k]*phi; 380 381 edge_values[k3+0] = qc + phi*dqa[0]; 382 edge_values[k3+1] = qc + phi*dqa[1]; 383 edge_values[k3+2] = qc + phi*dqa[2]; 384 385 vertex_values[k3+0] = edge_values[k3+1] + edge_values[k3+2] - edge_values[k3+0]; 386 vertex_values[k3+1] = edge_values[k3+2] + edge_values[k3+0] - edge_values[k3+1]; 387 vertex_values[k3+2] = edge_values[k3+0] + edge_values[k3+1] - edge_values[k3+2]; 388 389 } 390 391 return 0; 392 392 } 393 393 … … 730 730 731 731 732 // MH080605 set semi_implicit_update[k] to 0.0 here, rather than in update_conserved_quantities.py 733 for (k=0;k<N;k++){ 734 semi_implicit_update[k]=0.0; 735 } 732 // Reset semi_implicit_update here ready for next time step 733 memset(semi_implicit_update, 0, N*sizeof(double)); 736 734 737 735 return 0;
Note: See TracChangeset
for help on using the changeset viewer.