TheBoussinesqModel  3.2.1
 All Data Structures Files Functions Variables Typedefs Macros Pages
b_v_advection.c
Go to the documentation of this file.
1 
27 #include "turtle.h"
28 #include "t_alloc.h"
29 #include "t_utilities.h"
30 #include "rw_maps.h"
31 #include "geometry.h"
32 #include "g_raster2plvector.h"
33 #include "bigcells2.h"
34 #include "geometry2.h"
35 #include "b_utilities.h"
36 #include "b_solver.h"
37 #include "keywords_file_b.h"
38 #include "b_volumes.h"
39 #include "b_v_advection.h"
40 
41 extern STRINGBIN *filenames;
42 
43 
45 // extern DOUBLESQUARE_GRID *dsq;
46 extern DOUBLE_GRID *dgrid; // ec 20100413
47 extern PARAM *param;
48 extern FLAG *flag;
49 
69 extern DOUBLEVECTOR *dirichlet;
70 
71 //#define grav param->gravity // gravity acceleration
72 
73 #define VELOCITY_INITIALIZATION_VALUE -9999
74 
75 double F1_coefficient(long j, double velocity, double wet_vert_area) {
86  double coef1=wet_vert_area;
87  double coef2=coef1+runoff_coefficient->element[j]*pow(fabs(velocity),param->p_runoff-1.0)*param->dt*dgrid->coarse->lines->element[j]->length2d;
88 // double coef2=coef1+runoff_coefficient->element[j]*param->dt*dsq->big->grid->lines->element[j]->length2d; // veriation from giuseppe formeta version
89  if (coef2==0.0) {
90  if (coef1==0.0) {
91  return 1.0;
92  } else {
93  printf("Error in F1_coefficient: divide by 0 function return 0! \n");
94  return 0.0;
95  }
96  }
97 // printf("result is %le",coef1/coef2);
98 // stop_execution();
99 
100  return coef1/coef2;
101 }
102 
103 double b_advection(long i) {
113  double bterm=0.0;
114  double dt=param->dt;
115  double eta_previous;
116  double area_vert;
117  long j,kl,kp;
118  char *function_name="b_advection()";
119 
120  long boundary=dgrid->coarse->boundary_indicator;
121 
122  if ((i<dgrid->coarse->polygons->nl) || (i>dgrid->coarse->polygons->nh)) printf("Error in %s : polygon %ld ( %ld %ld) does not exist \n",function_name,i,dgrid->coarse->polygons->nl,dgrid->coarse->polygons->nh);
123  if ((surface_water_velocity->nh!=F1_wet_vert_area->nh) || (surface_water_velocity->nh!=dgrid->coarse->lines->nh)) printf("Error in %s: velocity elements %ld F1_wet_area_elements %ld lines %ld \n",function_name,surface_water_velocity->nh,F1_wet_vert_area->nh,dgrid->coarse->lines->nh);
124  for (j=dgrid->coarse->polygons->element[i]->edge_indices->nl;j<=dgrid->coarse->polygons->element[i]->edge_indices->nh;j++) {
125  // for each edge of i-th polygon
126  kl=dgrid->coarse->polygons->element[i]->edge_indices->element[j];
127  kp=dgrid->coarse->links->element[i]->connections->element[j];
128  if (kp!=boundary) {
129  if (kp==i) {
130  printf("Error in %s: kp is equal to i (%ld) \n",function_name,i);
131  } else if ((kp<dgrid->coarse->polygons->nl) || (kp>dgrid->coarse->polygons->nh)) {
132  printf("Error in %s : polygon %ld (near %ld) ( %ld %ld) does not exist \n",function_name,kp,i,dgrid->coarse->polygons->nl,dgrid->coarse->polygons->nh);
133  } else if ((kl<dgrid->coarse->lines->nl) || (kl>dgrid->coarse->lines->nh)) {
134  printf("Error in %s : line %ld (of polygon %ld) ( %ld %ld) does not exist \n",function_name,kl,i,dgrid->coarse->lines->nl,dgrid->coarse->lines->nh);
135  } else {
136  // WARNING: if kp>i u is oriented from i to kp, otherwise from kp to i
137  eta_previous=water_surface_elevation_mean(water_surface_elevation->element[i],water_surface_elevation->element[kp]);
138  area_vert=vertical_area_surf(eta_previous,kl);
139  // if (i>100) { printf("area_vert: %le",area_vert);
140  // stop_execution();
141  // }
142 
143  //mettere aree
144  //area_vert=vert
145  if (kp>i) {
146  bterm=bterm-dt*area_vert*asymmetric_surface_velocity(kl,eta_previous);
147  } else {
148  bterm=bterm+dt*area_vert*asymmetric_surface_velocity(kl,eta_previous);
149  }
150  //funzione
151  }
152 
153  }
154 
155  }
156  //long
157 
158  return bterm;
159 }
160 
161 double t_st_advection_operator_element(long i, DOUBLEVECTOR *eta,double cond_dirichlet) {
162  /*
163  *
164  *\author Emanuele Cordano, Giuseppe Formetta
165  *\date October 2009
166  *
167  *\param i - (long) index of the polygon \
168  *\param eta - (DOUBLEVECTOR *) water surface elevation
169  *\param cond_dirichlet - (double) (=MAX_ELEVATION_VALUE) in case dirichlet value are neglected or (=param->null_dirichlet) othrwise (added by ec on 20100517)
170  *
171  *\return T tensor (for advection law)
172 
173  */
174  double dt=param->dt;
175  long j,kp,kl;
176 
177 
178  double forcing,val=0;
179  long boundary=dgrid->coarse->boundary_indicator;
180  char *function_name="t_st_advection_operator_element";
181  double eta_previous,area_vert;
182  if ((i<dgrid->coarse->polygons->nl) || (i>dgrid->coarse->polygons->nh)) printf("Error in %s : polygon %ld ( %ld %ld) does not exist \n",function_name,i,dgrid->coarse->polygons->nl,dgrid->coarse->polygons->nh);
183  if (F1_wet_vert_area->nh!=dgrid->coarse->lines->nh) printf("Error in %s: F1_wet_area_elements %ld lines %ld \n",function_name,F1_wet_vert_area->nh,dgrid->coarse->lines->nh);
184 
185  for (j=dgrid->coarse->polygons->element[i]->edge_indices->nl;j<=dgrid->coarse->polygons->element[i]->edge_indices->nh;j++) {
186  // for each edge of i-th polygon
187  kl=dgrid->coarse->polygons->element[i]->edge_indices->element[j];
188  kp=dgrid->coarse->links->element[i]->connections->element[j];
189  if (kp!=boundary) {
190  if (kp==i) {
191  printf("Error in %s: kp is equal to i (%ld) \n",function_name,i);
192  } else if ((kp<dgrid->coarse->polygons->nl) || (kp>dgrid->coarse->polygons->nh)) {
193  printf("Error in %s : polygon %ld (near %ld) ( %ld %ld) does not exist \n",function_name,kp,i,dgrid->coarse->polygons->nl,dgrid->coarse->polygons->nh);
194  } else if ((kl<dgrid->coarse->lines->nl) || (kl>dgrid->coarse->lines->nh)) {
195  printf("Error in %s : line %ld (of polygon %ld) ( %ld %ld) does not exist \n",function_name,kl,i,dgrid->coarse->lines->nl,dgrid->coarse->lines->nh);
196  } else if (dirichlet->element[kp]<=cond_dirichlet){ // added by ec 20100517
197  //mettere descrizione del tensore
198  forcing=(eta->element[kp]-eta->element[i])/dgrid->coarse->links->element[i]->d_connections->element[j];
199  eta_previous=water_surface_elevation_mean(water_surface_elevation->element[i],water_surface_elevation->element[kp]);
200  area_vert=vertical_area_surf(eta_previous,kl);
201  // if (i>100) { printf("area_vert: %le",area_vert);
202  // stop_execution();
203  // }
204  val=val+dt*area_vert*symmetric_surface_velocity(kl,forcing);
205 
206  }
207 
208  }
209 
210  }
211 
212  return val;
213 
214 }
215 
216 double symmetric_surface_velocity(long j, double forcing) {
226 // double vel=
227  double vel=-param->gravity*param->dt*F1_wet_vert_area->element[j]*forcing; // ci va moltplicat per l'area!!!
228 // printf ("%le %le %ld",F1_wet_vert_area->element[j],vel,j);
229 // stop_execution();
230  return vel;
231 
232 }
233 
234 double asymmetric_surface_velocity(long j,double eta_previous) {
243 // double area_vert=vertical_area_surf(eta_previous,j); //correggere qui !!!!
244  double vel=0.0;
245 
246 // if (area_vert>0.0)
247  vel=F1_wet_vert_area->element[j]*surface_water_velocity->element[j];
248 
249 
250  return vel;
251 
252 }
253 
264  long i,j,kp,kl;
265  double forcing,eta_previous;
266  double simm_vel,asimm_vel;
267 
268  long boundary=dgrid->coarse->boundary_indicator;
269  char *function_name="update_velocity";
270  DOUBLEVECTOR *velocity_temp;
271 
272  velocity_temp=new_doublevector(surface_water_velocity->nh);
273 
274  if (eta->nh!=dgrid->coarse->polygons->nh) printf("Error in %s: inconsistent number of eta elements %ld (%ld cells) \n",function_name,eta->nh,dgrid->coarse->polygons->nh);
275  for (j=surface_water_velocity->nl;j<=surface_water_velocity->nh;j++) {
276  velocity_temp->element[j]=VELOCITY_INITIALIZATION_VALUE;
277 
278  }
279 
280 
281  for (i=eta->nl;i<=eta->nh;i++) {
282  for (j=1;j<=dgrid->coarse->links->element[i]->connections->nh;j++) {
283  kp=dgrid->coarse->links->element[i]->connections->element[j];
284  kl=dgrid->coarse->polygons->element[i]->edge_indices->element[j];
285 
286  if (kp!=boundary) {
287  if (kp==i) {
288  printf("Error in %s: kp is equal to i (%ld) \n",function_name,i);
289  return -1;
290  } else if ((kp<dgrid->coarse->polygons->nl) || (kp>dgrid->coarse->polygons->nh)) {
291  printf("Error in %s : polygon %ld (near %ld) ( %ld %ld) does not exist \n",function_name,kp,i,dgrid->coarse->polygons->nl,dgrid->coarse->polygons->nh);
292  return -1;
293  } else if ((kl<dgrid->coarse->lines->nl) || (kl>dgrid->coarse->lines->nh)) {
294  printf("Error in %s : line %ld (of polygon %ld) ( %ld %ld) does not exist \n",function_name,kl,i,dgrid->coarse->lines->nl,dgrid->coarse->lines->nh);
295  return -1;
296  } else if (kp>i){ // fa anche le linnee di frontiera!!!
297  // WARNING: if kp>i u is oriented from i to kp, otherwise from kp to i
298  forcing=(eta->element[kp]-eta->element[i])/dgrid->coarse->links->element[i]->d_connections->element[j];
299  simm_vel=symmetric_surface_velocity(kl,forcing);
300 
301  eta_previous=water_surface_elevation_mean(water_surface_elevation->element[i],water_surface_elevation->element[kp]);
302  asimm_vel=asymmetric_surface_velocity(kl,eta_previous);
303  velocity_temp->element[kl]=simm_vel+asimm_vel;
304  }
305  } else {
306  asimm_vel=asymmetric_surface_velocity(kl,water_surface_elevation->element[i]);
307  velocity_temp->element[kl]=asimm_vel;
308 
309 
310 
311  }
312  }
313  }
314 
315  for (j=surface_water_velocity->nl;j<=surface_water_velocity->nh;j++) {
316  surface_water_velocity->element[j]=velocity_temp->element[j];
317  if (surface_water_velocity->element[j]==VELOCITY_INITIALIZATION_VALUE) {
318  printf("Error in %s: surface velocity (integrated on the vertical area) not calculated at line %ld (%ld %ld)function return -1 \n",function_name,j,surface_water_velocity->nl,surface_water_velocity->nh);
319  return -1;
320  }
321  }
322  free_doublevector(velocity_temp);
323 // for (j=surface_water_velocity->nl;j<=surface_water_velocity->nh;j++) {
324 // surface_water_velocity->element[j]=asymmetric_surface_velocity(j)+simm_vel->element[j];
325 // }
326 // free_doublevector(simm_vel);
327 
328  // aggiugere v asimmetrica
329 
330  return 0;
331 }
332 
342  char *function_name="update_F1_wet_vert_area";
343  long j,i,kp,kl;
344  //long novalue=dsq->big->novalue;
345  long boundary=dgrid->coarse->boundary_indicator;
346  double eta_previous,area_vert,velocity;
347 
348 // printf("stop1a");
349 // stop_execution();
350  if (water_surface_elevation->nh!=dgrid->coarse->polygons->nh) printf("Error in %s: inconsistent number of eta elements %ld (%ld cells) \n",function_name,water_surface_elevation->nh,dgrid->coarse->polygons->nh);
351  for (j=F1_wet_vert_area->nl;j<=F1_wet_vert_area->nh;j++) {
352  F1_wet_vert_area->element[j]=VELOCITY_INITIALIZATION_VALUE;
353  }
354 
355 
356  for (i=water_surface_elevation->nl;i<=water_surface_elevation->nh;i++) {
357  for (j=1;j<=dgrid->coarse->links->element[i]->connections->nh;j++) {
358  kp=dgrid->coarse->links->element[i]->connections->element[j];
359  kl=dgrid->coarse->polygons->element[i]->edge_indices->element[j];
360  // mettere qui!!!!
361  if (kp!=boundary) {
362  if (kp==i) {
363  printf("Error in %s: kp is equal to i (%ld) \n",function_name,i);
364  return -1;
365  } else if ((kp<dgrid->coarse->polygons->nl) || (kp>dgrid->coarse->polygons->nh)) {
366  printf("Error in %s : polygon %ld (near %ld) ( %ld %ld) does not exist \n",function_name,kp,i,dgrid->coarse->polygons->nl,dgrid->coarse->polygons->nh);
367  return -1;
368  } else if ((kl<dgrid->coarse->lines->nl) || (kl>dgrid->coarse->lines->nh)) {
369  printf("Error in %s : line %ld (of polygon %ld) ( %ld %ld) does not exist \n",function_name,kl,i,dgrid->coarse->lines->nl,dgrid->coarse->lines->nh);
370  return -1;
371  } else if (kp>i){
372  // WARNING: if kp>i u is oriented from i to kp, otherwise from kp to i
373  //forcing=(eta->element[kp]-eta->element[i])/dsq->big->grid->links->element[i]->d_connections->element[j];
374  //simm_vel=symmetric_surface_water_velocity(kl,forcing);
375 // fare anche la parte asimmetrica della valocita' ///
376  eta_previous=water_surface_elevation_mean(water_surface_elevation->element[i],water_surface_elevation->element[kp]);
377  //asimm_vel=asymmetric_surface_velocity(j,eta_previous);
378  //surface_water_velocity->element[kl]=simm_vel+asimm_vel;
379  area_vert=vertical_area_surf(eta_previous,kl);
380  // velocity=0.0;
381  // if (area_vert>0.0) velocity=surface_water_velocity->element[kl]/area_vert;
382  velocity=surface_water_velocity->element[kl];
383  F1_wet_vert_area->element[kl]=F1_coefficient(kl,velocity,area_vert);
384  // double sval=F1_coefficient(kl,velocity,area_vert);
385  // printf(" %le %le %ld\n",F1_wet_vert_area->element[kl],sval,kl);
386  // stop_execution();
387  }
388  } else {
389  area_vert=vertical_area_surf(water_surface_elevation->element[i],kl);
390  velocity=0.0;
391  // if (area_vert>0.0)
392  velocity=surface_water_velocity->element[kl];
393  F1_wet_vert_area->element[kl]=F1_coefficient(kl,velocity,area_vert);
394 
395  }
396  }
397  }
398 
399 
400 
401  for (j=F1_wet_vert_area->nl;j<=F1_wet_vert_area->nh;j++) {
402  if (F1_wet_vert_area->element[j]==VELOCITY_INITIALIZATION_VALUE) {
403  printf("Error in %s: F1 coefficient (integrated on the vertical area) not calculated at line %ld (%ld %ld)function return -1 \n",function_name,j,F1_wet_vert_area->nl,F1_wet_vert_area->nh);
404  return -1;
405  }
406  }
407 
408  return 0;
409 
410 }