Changeset 6454


Ignore:
Timestamp:
Mar 4, 2009, 3:37:20 PM (15 years ago)
Author:
steve
Message:

Added Padarn's C code

Location:
anuga_work/development/anuga_1d
Files:
2 added
1 edited

Legend:

Unmodified
Added
Removed
  • anuga_work/development/anuga_1d/channel_domain_ext.c

    r6206 r6454  
    4646
    4747
    48 
     48//WELL BALANCED VERSION
    4949//Innermost flux function (using w=z+h)
    50 int _flux_function_channel(double *q_leftm,double *q_leftp, double *q_rightm,
     50int _flux_function_channel21(double *q_leftm,double *q_leftp, double *q_rightm,
    5151                           double *q_rightp, double g, double epsilon, double h0,                           double *edgeflux, double *max_speed) {
    5252
     
    6060    double zphalf,zmhalf,hleftstar,hrightstar;
    6161    double fluxtemp1,fluxtemp0,speedtemp;
    62     double batemp;
     62    double batemp,bphalf,bmhalf;
    6363
    6464    zmhalf = max(q_leftm[2],q_leftp[2]);
     
    100100    hrightstar = q_rightm[3];   
    101101
     102     bphalf = 0.5*(b_rightm+b_rightp);
     103     bmhalf = 0.5*(b_leftm+b_leftp);
     104     //bphalf = min(b_rightm,b_rightp);
     105     //bmhalf = min(b_leftm,b_leftp);
     106
     107
    102108    soundspeed_leftp = sqrt(g*h_leftp);
    103109    soundspeed_leftm = sqrt(g*h_leftm);
     
    119125    // Flux formulas for left hand side
    120126    flux_left[0] = d_leftm;
    121     flux_left[1] = u_leftm*d_leftm + 0.5*g*h_leftm*h_leftm*b_leftm;
     127    flux_left[1] = u_leftm*d_leftm + 0.5*g*h_leftm*h_leftm*bmhalf;
    122128
    123129    flux_right[0] = d_leftp;
    124     flux_right[1] = u_leftp*d_leftp + 0.5*g*h_leftp*h_leftp*b_leftp;
     130    flux_right[1] = u_leftp*d_leftp + 0.5*g*h_leftp*h_leftp*bmhalf;
    125131
    126132   
     
    132138        edgeflux[0] = s_maxl*flux_left[0] - s_minl*flux_right[0];
    133139
    134         batemp = (h_leftp)*b_leftp-(h_leftm)*b_leftm;
    135                 edgeflux[0] += s_maxl*s_minl*batemp;
     140        batemp = (q_leftp[3]+q_leftp[2])*bmhalf-(q_leftm[3]+q_leftm[2])*bmhalf;
     141        edgeflux[0] += s_maxl*s_minl*batemp;
    136142        edgeflux[0] /= denom;
    137143        edgeflux[1] = s_maxl*flux_left[1] - s_minl*flux_right[1];
     
    147153    // Flux formulas for right hand side
    148154    flux_left[0] = d_rightm;
    149     flux_left[1] = u_rightm*d_rightm + 0.5*g*h_rightm*h_rightm*b_rightm;
     155    flux_left[1] = u_rightm*d_rightm + 0.5*g*h_rightm*h_rightm*bphalf;
    150156
    151157    flux_right[0] = d_rightp;
    152     flux_right[1] = u_rightp*d_rightp + 0.5*g*h_rightp*h_rightp*b_rightp;
     158    flux_right[1] = u_rightp*d_rightp + 0.5*g*h_rightp*h_rightp*bphalf;
    153159   
    154160   
     
    161167        edgeflux[0] = s_maxr*flux_left[0] - s_minr*flux_right[0];
    162168
    163         batemp = (h_rightp)*b_rightp-(h_rightm)*b_rightm;
    164 
    165                 edgeflux[0] += s_maxr*s_minr*batemp;
     169        batemp = (q_rightp[3]+q_rightp[2])*bphalf-(q_rightm[3]+q_rightm[2])*bphalf;
     170
     171        edgeflux[0] += s_maxr*s_minr*batemp;
    166172        edgeflux[0] /= denom;
    167173        edgeflux[1] = s_maxr*flux_left[1] - s_minr*flux_right[1];
     
    177183   
    178184   
    179      edgeflux[1]-=0.5*g*h_rightm*h_rightm*b_rightm-0.5*g*hrightstar*hrightstar*b_rightm+0.5*g*hleftstar*hleftstar*b_leftp-0.5*g*h_leftp*h_leftp*b_leftp;
    180 
    181    
    182      //edgeflux[1]-=0.5*g*h_rightm*h_rightm-0.5*g*hrightstar*hrightstar+0.5*g*hleftstar*hleftstar-0.5*g*h_leftp*h_leftp;
     185    edgeflux[1]-=0.5*g*h_rightm*h_rightm*bphalf-0.5*g*hrightstar*hrightstar*b_rightm+0.5*g*hleftstar*hleftstar*b_leftp-0.5*g*h_leftp*h_leftp*bmhalf;
     186
     187    // printf("edgflux:%f expected:%f \n",edgeflux[1],hrightstar*hrightstar*g*0.5*b_rightm-hleftstar*hleftstar*g*0.5*b_leftp);
     188
     189    edgeflux[1]-=g*(1.0/6.0)*(b_rightm*(hleftstar*hleftstar+hrightstar*(hrightstar+2*z_leftp-2*z_rightm)+hleftstar*(hrightstar+z_leftp-z_rightm))-b_leftp*(hleftstar*hleftstar+hrightstar*(hrightstar-z_leftp+z_rightm)+hleftstar*(hrightstar-2*z_leftp+2*z_rightm)));
     190
     191   
     192    //edgeflux[1]-=0.5*g*h_rightm*h_rightm-0.5*g*hrightstar*hrightstar+0.5*g*hleftstar*hleftstar-0.5*g*h_leftp*h_leftp;
    183193     
    184194     //edgeflux[1]-=0.5*g*b_rightm*h_rightm*h_rightm-0.5*g*b_leftp*h_leftp*h_leftp;
     
    196206    return 0;
    197207}
    198 
    199 
    200 
     208// GOOD BUT NOT WELL BALANCED VERSION
     209int _flux_function_channel(double *q_leftm,double *q_leftp, double *q_rightm,
     210                           double *q_rightp, double g, double epsilon, double h0,                           double *edgeflux, double *max_speed){
     211
     212    int i;
     213    double flux_left[2], flux_right[2];
     214    double a_leftm,w_leftm, h_leftm, d_leftm, z_leftm, u_leftm, b_leftm, soundspeed_leftm;
     215     double a_leftp,w_leftp, h_leftp, d_leftp, z_leftp, u_leftp, b_leftp, soundspeed_leftp;
     216 double a_rightm,w_rightm, h_rightm, d_rightm, z_rightm, u_rightm, b_rightm, soundspeed_rightm;
     217 double a_rightp,w_rightp, h_rightp, d_rightp, z_rightp, u_rightp, b_rightp, soundspeed_rightp;
     218    double s_maxl, s_minl,s_maxr,s_minr, denom;
     219    double zphalf,zmhalf,hleftstar,hrightstar;
     220    double fluxtemp1,fluxtemp0,speedtemp;
     221    double batemp,bphalf,bmhalf;
     222
     223    zmhalf = max(q_leftm[2],q_leftp[2]);
     224    zphalf = max(q_rightm[2],q_rightp[2]);   
     225
     226    a_leftm  = q_leftm[0];
     227    d_leftm = q_leftm[1];
     228    z_leftm  = q_leftm[2];
     229    h_leftm  = q_leftm[3];
     230    u_leftm  = q_leftm[4];
     231    b_leftm  = q_leftm[5];
     232    w_leftm  = h_leftm+z_leftm;
     233
     234    a_leftp  = q_leftp[0];
     235    d_leftp = q_leftp[1];
     236    z_leftp  = q_leftp[2];
     237    h_leftp  = q_leftp[3];
     238    u_leftp  = q_leftp[4];
     239    b_leftp  = q_leftp[5];
     240    w_leftp  = h_leftp+z_leftp;
     241
     242    a_rightm  = q_rightm[0];
     243    d_rightm = q_rightm[1];
     244    z_rightm  = q_rightm[2];
     245    h_rightm  = q_rightm[3];
     246    u_rightm  = q_rightm[4];
     247    b_rightm  = q_rightm[5];
     248    w_rightm  = h_rightm+z_rightm;
     249
     250    a_rightp  = q_rightp[0];
     251    d_rightp = q_rightp[1];
     252    z_rightp  = q_rightp[2];
     253    h_rightp  = q_rightp[3];
     254    u_rightp  = q_rightp[4];
     255    b_rightp  = q_rightp[5];
     256    w_rightp  = h_rightp+z_rightp;
     257
     258    hleftstar = q_leftp[3];
     259    hrightstar = q_rightm[3];   
     260
     261    bphalf = min(b_rightm,b_rightp);
     262    bmhalf = min(b_leftm,b_leftp);
     263
     264    soundspeed_leftp = sqrt(g*h_leftp);
     265    soundspeed_leftm = sqrt(g*h_leftm);
     266    soundspeed_rightp = sqrt(g*h_rightp);
     267    soundspeed_rightm = sqrt(g*h_rightm);
     268
     269    s_maxl = max(u_leftm+soundspeed_leftm, u_leftp+soundspeed_leftp);
     270    if (s_maxl < 0.0) s_maxl = 0.0;
     271
     272    s_minl = min(u_leftm-soundspeed_leftm, u_leftp-soundspeed_leftp);
     273    if (s_minl > 0.0) s_minl = 0.0;
     274
     275    s_maxr = max(u_rightm+soundspeed_rightm, u_rightp+soundspeed_rightp);
     276    if (s_maxr < 0.0) s_maxr = 0.0;
     277
     278    s_minr = min(u_rightm-soundspeed_rightm, u_rightp-soundspeed_rightp);
     279    if (s_minr > 0.0) s_minr = 0.0;
     280
     281    // Flux formulas for left hand side
     282    flux_left[0] = d_leftm;
     283    flux_left[1] = u_leftm*d_leftm + 0.5*g*h_leftm*h_leftm*b_leftm;
     284
     285    flux_right[0] = d_leftp;
     286    flux_right[1] = u_leftp*d_leftp + 0.5*g*h_leftp*h_leftp*b_leftp;
     287
     288   
     289    // Flux computation for left hand side
     290    denom = s_maxl-s_minl;
     291    if (denom < epsilon) {
     292        for (i=0; i<2; i++) edgeflux[i] = 0.0;
     293    } else {
     294        edgeflux[0] = s_maxl*flux_left[0] - s_minl*flux_right[0];
     295
     296        batemp = (q_leftp[3]+q_leftp[2])*b_leftp-(q_leftm[3]+q_leftm[2])*b_leftm;
     297        edgeflux[0] += s_maxl*s_minl*batemp;
     298        edgeflux[0] /= denom;
     299        edgeflux[1] = s_maxl*flux_left[1] - s_minl*flux_right[1];
     300        edgeflux[1] += s_maxl*s_minl*(d_leftp-d_leftm);
     301        edgeflux[1] /= denom;
     302   
     303
     304    }
     305        fluxtemp0 = edgeflux[0];
     306        fluxtemp1 = edgeflux[1];
     307   
     308
     309    // Flux formulas for right hand side
     310    flux_left[0] = d_rightm;
     311    flux_left[1] = u_rightm*d_rightm + 0.5*g*h_rightm*h_rightm*b_rightm;
     312
     313    flux_right[0] = d_rightp;
     314    flux_right[1] = u_rightp*d_rightp + 0.5*g*h_rightp*h_rightp*b_rightp;
     315   
     316   
     317   
     318    // Flux computation for right hand side
     319    denom = s_maxr-s_minr;
     320    if (denom < epsilon) {
     321        for (i=0; i<2; i++) edgeflux[i] = 0.0;
     322    } else {
     323        edgeflux[0] = s_maxr*flux_left[0] - s_minr*flux_right[0];
     324
     325        batemp = (q_rightp[3]+q_rightp[2])*b_rightp-(q_rightm[3]+q_rightm[2])*b_rightm;
     326
     327        edgeflux[0] += s_maxr*s_minr*batemp;
     328        edgeflux[0] /= denom;
     329        edgeflux[1] = s_maxr*flux_left[1] - s_minr*flux_right[1];
     330        edgeflux[1] += s_maxr*s_minr*(d_rightp-d_rightm);
     331        edgeflux[1] /= denom;
     332   
     333
     334    }
     335   
     336   
     337    edgeflux[0]=edgeflux[0]-fluxtemp0;
     338    edgeflux[1]=edgeflux[1]-fluxtemp1;
     339   
     340    edgeflux[1]-=-0.5*0.5*g*(h_rightm+h_leftp)*(b_rightm+b_leftp)*(z_rightm-z_leftp)+0.5*(h_rightm+h_leftp)*(h_rightm+h_leftp)*0.5*0.5*(b_rightm-b_leftp)*g;
     341
     342    //edgeflux[1]-=0.5*g*h_rightm*h_rightm*bphalf-0.5*g*hrightstar*hrightstar*b_rightm+0.5*g*hleftstar*hleftstar*b_leftp-0.5*g*h_leftp*h_leftp*bmhalf;
     343
     344    // printf("edgflux:%f expected:%f \n",edgeflux[1],hrightstar*hrightstar*g*0.5*b_rightm-hleftstar*hleftstar*g*0.5*b_leftp);
     345
     346    //edgeflux[1]-=g*(1.0/6.0)*(b_rightm*(hleftstar*hleftstar+hrightstar*(hrightstar+2*z_leftp-2*z_rightm)+hleftstar*(hrightstar+z_leftp-z_rightm))-b_leftp*(hleftstar*hleftstar+hrightstar*(hrightstar-z_leftp+z_rightm)+hleftstar*(hrightstar-2*z_leftp+2*z_rightm)));
     347
     348   
     349    //edgeflux[1]-=0.5*g*h_rightm*h_rightm-0.5*g*hrightstar*hrightstar+0.5*g*hleftstar*hleftstar-0.5*g*h_leftp*h_leftp;
     350     
     351     //edgeflux[1]-=0.5*g*b_rightm*h_rightm*h_rightm-0.5*g*b_leftp*h_leftp*h_leftp;
     352                // Maximal wavespeed
     353        if ( (s_maxl-s_minl)<epsilon && (s_maxr-s_minr)<epsilon ){
     354            *max_speed = 0.0;
     355        }else{
     356        speedtemp = max(fabs(s_maxl),fabs(s_minl));
     357        speedtemp = max(speedtemp,fabs(s_maxr));
     358        speedtemp = max(speedtemp,fabs(s_minr));
     359        *max_speed = speedtemp;
     360        }
     361
     362//printf("%f\n",h_right);
     363    return 0;
     364}
     365// NAIEVE VERSION
     366int _flux_function_channel2(double *q_leftm,double *q_leftp, double *q_rightm,
     367                           double *q_rightp, double g, double epsilon, double h0,                           double *edgeflux, double *max_speed){
     368
     369    int i;
     370    double flux_left[2], flux_right[2];
     371    double a_leftm,w_leftm, h_leftm, d_leftm, z_leftm, u_leftm, b_leftm, soundspeed_leftm;
     372     double a_leftp,w_leftp, h_leftp, d_leftp, z_leftp, u_leftp, b_leftp, soundspeed_leftp;
     373 double a_rightm,w_rightm, h_rightm, d_rightm, z_rightm, u_rightm, b_rightm, soundspeed_rightm;
     374 double a_rightp,w_rightp, h_rightp, d_rightp, z_rightp, u_rightp, b_rightp, soundspeed_rightp;
     375    double s_maxl, s_minl,s_maxr,s_minr, denom;
     376    double zphalf,zmhalf,hleftstar,hrightstar;
     377    double fluxtemp1,fluxtemp0,speedtemp;
     378    double batemp,bphalf,bmhalf;
     379
     380    zmhalf = max(q_leftm[2],q_leftp[2]);
     381    zphalf = max(q_rightm[2],q_rightp[2]);   
     382
     383    a_leftm  = q_leftm[0];
     384    d_leftm = q_leftm[1];
     385    z_leftm  = q_leftm[2];
     386    h_leftm  = q_leftm[3];
     387    u_leftm  = q_leftm[4];
     388    b_leftm  = q_leftm[5];
     389    w_leftm  = h_leftm+z_leftm;
     390
     391    a_leftp  = q_leftp[0];
     392    d_leftp = q_leftp[1];
     393    z_leftp  = q_leftp[2];
     394    h_leftp  = q_leftp[3];
     395    u_leftp  = q_leftp[4];
     396    b_leftp  = q_leftp[5];
     397    w_leftp  = h_leftp+z_leftp;
     398
     399    a_rightm  = q_rightm[0];
     400    d_rightm = q_rightm[1];
     401    z_rightm  = q_rightm[2];
     402    h_rightm  = q_rightm[3];
     403    u_rightm  = q_rightm[4];
     404    b_rightm  = q_rightm[5];
     405    w_rightm  = h_rightm+z_rightm;
     406
     407    a_rightp  = q_rightp[0];
     408    d_rightp = q_rightp[1];
     409    z_rightp  = q_rightp[2];
     410    h_rightp  = q_rightp[3];
     411    u_rightp  = q_rightp[4];
     412    b_rightp  = q_rightp[5];
     413    w_rightp  = h_rightp+z_rightp;
     414
     415    hleftstar = q_leftp[3];
     416    hrightstar = q_rightm[3];   
     417
     418    bphalf = min(b_rightm,b_rightp);
     419    bmhalf = min(b_leftm,b_leftp);
     420
     421    soundspeed_leftp = sqrt(g*h_leftp);
     422    soundspeed_leftm = sqrt(g*h_leftm);
     423    soundspeed_rightp = sqrt(g*h_rightp);
     424    soundspeed_rightm = sqrt(g*h_rightm);
     425
     426    s_maxl = max(u_leftm+soundspeed_leftm, u_leftp+soundspeed_leftp);
     427    if (s_maxl < 0.0) s_maxl = 0.0;
     428
     429    s_minl = min(u_leftm-soundspeed_leftm, u_leftp-soundspeed_leftp);
     430    if (s_minl > 0.0) s_minl = 0.0;
     431
     432    s_maxr = max(u_rightm+soundspeed_rightm, u_rightp+soundspeed_rightp);
     433    if (s_maxr < 0.0) s_maxr = 0.0;
     434
     435    s_minr = min(u_rightm-soundspeed_rightm, u_rightp-soundspeed_rightp);
     436    if (s_minr > 0.0) s_minr = 0.0;
     437
     438    // Flux formulas for left hand side
     439    flux_left[0] = d_leftm;
     440    flux_left[1] = u_leftm*d_leftm + 0.5*g*h_leftm*h_leftm*b_leftm;
     441
     442    flux_right[0] = d_leftp;
     443    flux_right[1] = u_leftp*d_leftp + 0.5*g*h_leftp*h_leftp*b_leftp;
     444
     445   
     446    // Flux computation for left hand side
     447    denom = s_maxl-s_minl;
     448    if (denom < epsilon) {
     449        for (i=0; i<2; i++) edgeflux[i] = 0.0;
     450    } else {
     451        edgeflux[0] = s_maxl*flux_left[0] - s_minl*flux_right[0];
     452
     453        batemp = (q_leftp[3]+q_leftp[2])*b_leftp-(q_leftm[3]+q_leftm[2])*b_leftm;
     454       
     455        edgeflux[0] = 0.5*(flux_left[0]+flux_right[0]);
     456        edgeflux[1] = 0.5*(flux_left[1]+flux_right[1]);
     457
     458   
     459
     460    }
     461        fluxtemp0 = edgeflux[0];
     462        fluxtemp1 = edgeflux[1];
     463   
     464
     465    // Flux formulas for right hand side
     466    flux_left[0] = d_rightm;
     467    flux_left[1] = u_rightm*d_rightm + 0.5*g*h_rightm*h_rightm*b_rightm;
     468
     469    flux_right[0] = d_rightp;
     470    flux_right[1] = u_rightp*d_rightp + 0.5*g*h_rightp*h_rightp*b_rightp;
     471   
     472   
     473   
     474    // Flux computation for right hand side
     475    denom = s_maxr-s_minr;
     476    if (denom < epsilon) {
     477        for (i=0; i<2; i++) edgeflux[i] = 0.0;
     478    } else {
     479        edgeflux[0] = s_maxr*flux_left[0] - s_minr*flux_right[0];
     480
     481        batemp = (q_rightp[3]+q_rightp[2])*b_rightp-(q_rightm[3]+q_rightm[2])*b_rightm;
     482
     483     
     484        edgeflux[0] = 0.5*(flux_right[0]+flux_left[0]);
     485
     486
     487        edgeflux[1] = 0.5*(flux_left[1]+flux_right[1]);
     488   
     489
     490    }
     491   
     492   
     493    edgeflux[0]=edgeflux[0]-fluxtemp0;
     494    edgeflux[1]=edgeflux[1]-fluxtemp1;
     495   
     496    edgeflux[1]-=-0.5*0.5*g*(h_rightm+h_leftp)*(b_rightm+b_leftp)*(z_rightm-z_leftp)+0.5*(h_rightm+h_leftp)*(h_rightm+h_leftp)*0.5*0.5*(b_rightm-b_leftp)*g;
     497
     498    //edgeflux[1]-=0.5*g*h_rightm*h_rightm*bphalf-0.5*g*hrightstar*hrightstar*b_rightm+0.5*g*hleftstar*hleftstar*b_leftp-0.5*g*h_leftp*h_leftp*bmhalf;
     499
     500    // printf("edgflux:%f expected:%f \n",edgeflux[1],hrightstar*hrightstar*g*0.5*b_rightm-hleftstar*hleftstar*g*0.5*b_leftp);
     501
     502    //edgeflux[1]-=g*(1.0/6.0)*(b_rightm*(hleftstar*hleftstar+hrightstar*(hrightstar+2*z_leftp-2*z_rightm)+hleftstar*(hrightstar+z_leftp-z_rightm))-b_leftp*(hleftstar*hleftstar+hrightstar*(hrightstar-z_leftp+z_rightm)+hleftstar*(hrightstar-2*z_leftp+2*z_rightm)));
     503
     504   
     505    //edgeflux[1]-=0.5*g*h_rightm*h_rightm-0.5*g*hrightstar*hrightstar+0.5*g*hleftstar*hleftstar-0.5*g*h_leftp*h_leftp;
     506     
     507     //edgeflux[1]-=0.5*g*b_rightm*h_rightm*h_rightm-0.5*g*b_leftp*h_leftp*h_leftp;
     508                // Maximal wavespeed
     509        if ( (s_maxl-s_minl)<epsilon && (s_maxr-s_minr)<epsilon ){
     510            *max_speed = 0.0;
     511        }else{
     512        speedtemp = max(fabs(s_maxl),fabs(s_minl));
     513        speedtemp = max(speedtemp,fabs(s_maxr));
     514        speedtemp = max(speedtemp,fabs(s_minr));
     515        *max_speed = speedtemp;
     516        }
     517
     518//printf("%f\n",h_right);
     519    return 0;
     520}
    201521
    202522
Note: See TracChangeset for help on using the changeset viewer.