00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include "plumeinput.h"
00030 #include "plumevars.h"
00031 #include <math.h>
00032 #include <utils/utils.h>
00033
00034 int plumeconc(Plume_enviro *env , Plume_grid *grid , Plume_options *opt )
00035 {
00036 int ii, jj, nn;
00037 double aa, bb, ucor, *ccor, plugwidth;
00038 double dl, utest, uu, XX, v1, v2;
00039 Plume_river river = *(env->river);
00040 Plume_ocean ocean = *(env->ocean);
00041 Plume_sediment *sedload = env->sed;
00042
00043
00044
00045
00046
00047
00048 utest = 0.05*river.u0;
00049 dl = 0.5*(double)(grid->dx+grid->dy);
00050
00051
00052 if( (ccor = (double *) calloc(env->n_grains,sizeof(double))) == NULL )
00053 {
00054 fprintf(stderr," PlumeArray ERROR: memory allocation failed \n");
00055 fprintf(stderr," failed on xcl, ycl, dcl \n");
00056 eh_exit(1);
00057 }
00058
00059 for ( nn=0 ; nn<env->n_grains ; nn++ )
00060 {
00061
00062 if ( river.Cs[nn] > .001 )
00063 {
00064
00065 for( ii=0 ; ii<grid->lx ; ii++ )
00066 {
00067
00068 #ifdef DBG
00069 fprintf( stderr ,
00070 "\r PlumeConc ii = %d, lx = %d, ly = %d, nn = %d, ngrains = %d " ,
00071 ii+1 , grid->lx , grid->ly , nn+1 , env->n_grains );
00072 #endif
00073
00074
00075
00076
00077
00078 if( opt->fjrd && grid->xval[ii] > 0 )
00079 {
00080 aa = sqrt( river.b0/(sqpi*C1*grid->xval[ii]) );
00081 bb = 1/(sqtwo*C1*grid->xval[ii]);
00082
00083 ucor = 2.*river.u0*aa*aa*erfc(bb*0.5*(grid->ymax-grid->ymin))/((grid->ymax-grid->ymin)*bb);
00084 ccor[nn] = 2.*river.Cs[nn]*aa*aa*erfc(bb*0.5*(grid->ymax-grid->ymin))/((grid->ymax-grid->ymin)*bb);
00085 }
00086 else
00087 {
00088 ucor = 0;
00089 ccor[nn] = 0;
00090 }
00091
00092 for ( jj=0 ; jj<grid->ly ; jj++ )
00093 {
00094
00095 if( grid->dist[ii][jj][2] < plg*river.b0 )
00096 {
00097
00098 plugwidth = -grid->dist[ii][jj][2]/(2.*plg) + river.b0/2.;
00099
00100 if( grid->dist[ii][jj][3] < plugwidth )
00101 {
00102 grid->ccnc[ii][jj][nn] = river.Cs[nn]+ccor[nn];
00103 grid->ualb[ii][jj] = river.u0+ucor;
00104 }
00105 else
00106 {
00107 v1 = grid->dist[ii][jj][3]
00108 + 0.5*sqpi*C1*grid->dist[ii][jj][2]
00109 - river.b0/2.;
00110 v2 = mx( (sqtwo*C1*grid->dist[ii][jj][2]), 0.01);
00111
00112 grid->ccnc[ii][jj][nn] = river.Cs[nn]*exp(-sq(v1/v2))+ccor[nn];
00113 grid->ualb[ii][jj] = river.u0*exp(-sq(v1/v2))+ucor;
00114 }
00115 }
00116 else
00117 {
00118 v1 = river.b0/(sqpi*C1*grid->dist[ii][jj][2]);
00119 v2 = grid->dist[ii][jj][3]/(sqtwo*C1*grid->dist[ii][jj][2]);
00120
00121 grid->ccnc[ii][jj][nn] = river.Cs[nn]*sqrt(v1)*exp(-sq(v2))
00122 + ccor[nn];
00123 grid->ualb[ii][jj] = river.u0*sqrt(v1)*exp(-sq(v2))+ucor;
00124 }
00125
00126
00127 if ( opt->fjrd )
00128 uu = (river.u0 + grid->dist[ii][jj][4] + 7.*grid->ualb[ii][jj])/9.;
00129 else
00130 uu = (river.u0 + grid->dist[ii][jj][4] + 3.*grid->ualb[ii][jj])/5.;
00131 XX = sqrt(sq(grid->dist[ii][jj][2]) + sq(grid->dist[ii][jj][3]));
00132
00133
00134 if ( grid->ualb[ii][jj] > utest )
00135 grid->ncnc[ii][jj][nn] = grid->ccnc[ii][jj][nn]
00136 * exp(-sedload[nn].lambda*XX/uu)
00137 + ocean.Cw;
00138 else
00139 grid->ncnc[ii][jj][nn] = ocean.Cw;
00140
00141
00142
00143
00144
00145
00146
00147
00148 if ( grid->ncnc[ii][jj][nn] > ocean.Cw
00149 && grid->ualb[ii][jj] > utest )
00150 {
00151 grid->deps[ii][jj][nn] = grid->ncnc[ii][jj][nn]
00152 *( exp(sedload[nn].lambda*dl/grid->ualb[ii][jj]) - 1. )
00153 *( river.d0*dTOs*grid->ualb[ii][jj] )
00154 /( sedload[nn].rho*dl );
00155 }
00156 else
00157 grid->deps[ii][jj][nn] = 0.0;
00158
00159
00160 if( opt->o1 )
00161 grid->sln[ii][jj] = (ocean.Sw-ocean.So)
00162 * (1-grid->ccnc[ii][jj][0]/(river.Cs[0]-ocean.Cw))
00163 + ocean.So;
00164 }
00165 }
00166 }
00167 }
00168
00169 free(ccor);
00170
00171 #ifdef DBG
00172 fprintf(stderr,"\n");
00173 #endif
00174
00175 return 0;
00176
00177 }
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199