proteus 1.9.0
C/C++/Fortran libraries
Loading...
Searching...
No Matches
RANS3PF2D.h
Go to the documentation of this file.
1#ifndef RANS3PF2D_H
2#define RANS3PF2D_H
3#include <cmath>
4#include <valarray>
5#include <iostream>
6#include <vector>
7#include <set>
8#include <cstring>
9#include "CompKernel.h"
10#include "ModelFactory.h"
11#include "SedClosure.h"
13#include "ArgumentsDict.h"
14const double DM=0.0;//1-mesh conservation and divergence, 0 - weak div(v) only
15const double DM2=0.0;//1-point-wise mesh volume strong-residual, 0 - div(v) only
16const double DM3=1.0;//1-point-wise divergence, 0-point-wise rate of volume change
17#define DRAG_FAC 1.0
18#define TURB_FORCE_FAC 0.0
19#define CUT_CELL_INTEGRATION 0
20double sgn(double val) {
21 return double((0.0 < val) - (val < 0.0));
22}
23
24// ***** TODO ***** //
26// *fix the following w.r.t. not dividing momentum eqn by rho
27// * updateSolidParticleTerms
28// *Double check the following w.r.t. not dividing momentum eqn by rho
29// * updateDarcyForchheimerTerms_Ergun
30// * updateTurbulenceClosure
31// * check pdeResidual_p. In particular check the term with q_dvos_dt
32// * double check exteriorNumericalAdvectiveFlux. I multiply from outside porosity*rho
33// * MOVING MESH. Double check.
34// * Turbulence: double check eddy_viscosity within evaluateCoefficients
35// ***** END OF TODO *****
36
37#define CELL_BASED_EV_COEFF 1
38#define POWER_SMOOTHNESS_INDICATOR 2
39#define EPS_FOR_GAMMA_INDICATOR 1E-10
40#define C_FOR_GAMMA_INDICATOR 0.25 // increase gamma to make the indicator more agressive (less dissipative)
41#define USE_GAMMA_INDICATOR 0
42#define ANISOTROPIC_DIFFUSION 0
43
44inline void baryCoords(const double r0[2],
45 const double r1[2],
46 const double r2[2],
47 const double r[2],
48 double* lambda)
49{
50 double detT = (r1[1] - r2[1])*(r0[0] - r2[0]) + (r2[0] - r1[0])*(r0[1] - r2[1]);
51 lambda[0] = ((r1[1] - r2[1])*(r[0] - r2[0]) + (r2[0] - r1[0])*(r[1] - r2[1]))/detT;
52 lambda[1] = ((r2[1] - r0[1])*(r[0] - r2[0]) + (r0[0] - r2[0])*(r[1] - r2[1]))/detT;
53 lambda[2] = 1.0 - lambda[0] - lambda[1];
54}
55
56namespace proteus
57{
58 template<int nSpace, int nP, int nQ, int nEBQ>
59 // The trailing flag is the IFEM gate. It has always been false here -- by
60 // default rather than by statement -- and must stay false: with it set, an
61 // element whose interface passes through an edge or corner node takes the
62 // IFEM branch in Simplex::set_quad, which forces D to 0 and H/ImH to a hard
63 // 0/1 instead of the moment fit. That deletes the interface measure this
64 // model integrates over. Written out so the choice is visible at the call
65 // site and cannot change underneath us if the template default changes.
66 using GeneralizedFunctions = equivalent_polynomials::GeneralizedFunctions_mix<nSpace, nP, nP, nQ, nEBQ, false>;
67
69 {
70 public:
72 std::valarray<double> uStar_psi, vStar_psi, wStar_psi;
73 std::valarray<double> uStar_hi, vStar_hi, wStar_hi, den_hi;
75 std::valarray<double> uStar_gamma, vStar_gamma, wStar_gamma;
76 virtual ~cppRANS3PF2D_base() {}
77 virtual void setSedClosure(double aDarcy,
78 double betaForch,
79 double grain,
80 double packFraction,
81 double packMargin,
82 double maxFraction,
83 double frFraction,
84 double sigmaC,
85 double C3e,
86 double C4e,
87 double eR,
88 double fContact,
89 double mContact,
90 double nContact,
91 double angFriction,
92 double vos_limiter,
93 double mu_fr_limiter
94 ) {}
96 bool useExact
97 )=0;
98
100 bool useExact)=0;
102 virtual void getBoundaryDOFs(arguments_dict& args)=0;
103 };
104
105 template<class CompKernelType,
106 int nSpace,
107 int nQuadraturePoints_element,
108 int nDOF_mesh_trial_element,
109 int nDOF_trial_element,
110 int nDOF_test_element,
111 int nQuadraturePoints_elementBoundary>
113 {
114 public:
121 CompKernelType ck;
125 nSpace2(4),
126 closure(150.0,
127 0.0,
128 0.0102,
129 0.2,
130 0.01,
131 0.635,
132 0.57,
133 1.1,
134 1.2,
135 1.0,
136 0.8,
137 0.02,
138 2.0,
139 5.0,
140 M_PI/6., 0.05, 1.00),
141 nDOF_test_X_trial_element(nDOF_test_element*nDOF_trial_element),
142 ck(),
143 C_sbm(10.0),
144 beta_sbm(0.0)
145 {/* std::cout<<"Constructing cppRANS3PF2D<CompKernelTemplate<"
146 <<0<<","
147 <<0<<","
148 <<0<<","
149 <<0<<">,"*/
150 /* <<nSpaceIn<<","
151 <<nQuadraturePoints_elementIn<<","
152 <<nDOF_mesh_trial_elementIn<<","
153 <<nDOF_trial_elementIn<<","
154 <<nDOF_test_elementIn<<","
155 <<nQuadraturePoints_elementBoundaryIn<<">());"*/
156 /* <<std::endl<<std::flush; */
157 }
158
159 void setSedClosure(double aDarcy,
160 double betaForch,
161 double grain,
162 double packFraction,
163 double packMargin,
164 double maxFraction,
165 double frFraction,
166 double sigmaC,
167 double C3e,
168 double C4e,
169 double eR,
170 double fContact,
171 double mContact,
172 double nContact,
173 double angFriction,
174 double vos_limiter,
175 double mu_fr_limiter)
176 {
178 betaForch,
179 grain,
180 packFraction,
181 packMargin,
182 maxFraction,
183 frFraction,
184 sigmaC,
185 C3e,
186 C4e,
187 eR,
188 fContact,
189 mContact,
190 nContact,
191 angFriction,
192 vos_limiter,
193 mu_fr_limiter);
194 }
195
196 inline double Dot(const double vec1[nSpace],
197 const double vec2[nSpace])
198 {
199 double dot = 0;
200 for (int I=0; I<nSpace; I++)
201 dot += vec1[I]*vec2[I];
202 return dot;
203 }
204
205 inline void calculateTangentialGradient(const double normal[nSpace],
206 const double vel_grad[nSpace],
207 double vel_tgrad[nSpace])
208 {
209 double normal_dot_vel_grad = Dot(normal,vel_grad);
210 for (int I=0; I<nSpace; I++)
211 vel_tgrad[I] = vel_grad[I] - normal_dot_vel_grad*normal[I];
212 }
213
214 inline
215 void evaluateCoefficients(const double eps_rho,
216 const double eps_mu,
217 const double eps_s,
218 const double sigma,
219 const double rho_0,
220 double nu_0,
221 const double rho_1,
222 double nu_1,
223 const double h_e,
224 const double smagorinskyConstant,
225 const int turbulenceClosureModel,
226 const double g[nSpace],
227 const double useVF,
228 const double& vf,
229 const double& phi,
230 const double n[nSpace],
231 const double distance_to_omega_solid,
232 const double& kappa,
233 const double porosity,//VRANS specific
234 const double& p,
235 const double grad_p[nSpace],
236 const double grad_u[nSpace],
237 const double grad_v[nSpace],
238 const double grad_w[nSpace],
239 const double& u,
240 const double& v,
241 const double& w,
242 const double& uStar,
243 const double& vStar,
244 const double& wStar,
245 double& eddy_viscosity,
246 double& mom_u_acc,
247 double& dmom_u_acc_u,
248 double& mom_v_acc,
249 double& dmom_v_acc_v,
250 double& mom_w_acc,
251 double& dmom_w_acc_w,
252 double mass_adv[nSpace],
253 double dmass_adv_u[nSpace],
254 double dmass_adv_v[nSpace],
255 double dmass_adv_w[nSpace],
256 double mom_u_adv[nSpace],
257 double dmom_u_adv_u[nSpace],
258 double dmom_u_adv_v[nSpace],
259 double dmom_u_adv_w[nSpace],
260 double mom_v_adv[nSpace],
261 double dmom_v_adv_u[nSpace],
262 double dmom_v_adv_v[nSpace],
263 double dmom_v_adv_w[nSpace],
264 double mom_w_adv[nSpace],
265 double dmom_w_adv_u[nSpace],
266 double dmom_w_adv_v[nSpace],
267 double dmom_w_adv_w[nSpace],
268 double mom_uu_diff_ten[nSpace],
269 double mom_vv_diff_ten[nSpace],
270 double mom_ww_diff_ten[nSpace],
271 double mom_uv_diff_ten[1],
272 double mom_uw_diff_ten[1],
273 double mom_vu_diff_ten[1],
274 double mom_vw_diff_ten[1],
275 double mom_wu_diff_ten[1],
276 double mom_wv_diff_ten[1],
277 double& mom_u_source,
278 double& mom_v_source,
279 double& mom_w_source,
280 double& mom_u_ham,
281 double dmom_u_ham_grad_p[nSpace],
282 double dmom_u_ham_grad_u[nSpace],
283 double& mom_v_ham,
284 double dmom_v_ham_grad_p[nSpace],
285 double dmom_v_ham_grad_v[nSpace],
286 double& mom_w_ham,
287 double dmom_w_ham_grad_p[nSpace],
288 double dmom_w_ham_grad_w[nSpace],
289 double& rhoSave,
290 double& nuSave,
291 int KILL_PRESSURE_TERM,
292 int MULTIPLY_EXTERNAL_FORCE_BY_DENSITY,
293 double forcex,
294 double forcey,
295 double forcez,
296 int MATERIAL_PARAMETERS_AS_FUNCTION,
297 double density_as_function,
298 double dynamic_viscosity_as_function,
299 int USE_SBM,
300 double x, double y, double z,
301 int use_ball_as_particle,
302 double* ball_center,
303 double* ball_radius,
304 double* ball_velocity,
305 double* ball_angular_velocity,
306 // int by parts pressure
307 int INT_BY_PARTS_PRESSURE)
308 {
309 double rho,nu,mu,H_rho,ImH_rho,d_rho,H_mu,ImH_mu,d_mu,norm_n,nu_t0=0.0,nu_t1=0.0,nu_t;
310 H_rho = (1.0-useVF)*gf.H(eps_rho,phi) + useVF*fmin(1.0,fmax(0.0,vf));
311 ImH_rho = (1.0-useVF)*gf.ImH(eps_rho,phi) + useVF*(1.0-fmin(1.0,fmax(0.0,vf)));
312 d_rho = (1.0-useVF)*gf.D(eps_rho,phi);
313 H_mu = (1.0-useVF)*gf.H(eps_mu,phi) + useVF*fmin(1.0,fmax(0.0,vf));
314 ImH_mu = (1.0-useVF)*gf.ImH(eps_mu,phi) + useVF*(1.0-fmin(1.0,fmax(0.0,vf)));
315 d_mu = (1.0-useVF)*gf.D(eps_mu,phi);
316
317 //calculate eddy viscosity
318 switch (turbulenceClosureModel)
319 {
320 double norm_S;
321 case 1:
322 {
323 norm_S = sqrt(2.0*(grad_u[0]*grad_u[0] + grad_v[1]*grad_v[1] + //grad_w[2]*grad_w[2] +
324 0.5*(grad_u[1]+grad_v[0])*(grad_u[1]+grad_v[0])));
325
326 nu_t0 = smagorinskyConstant*smagorinskyConstant*h_e*h_e*norm_S;
327 nu_t1 = smagorinskyConstant*smagorinskyConstant*h_e*h_e*norm_S;
328 }
329 case 2:
330 {
331 double re_0,cs_0=0.0,re_1,cs_1=0.0;
332 norm_S = sqrt(2.0*(grad_u[0]*grad_u[0] + grad_v[1]*grad_v[1] +//grad_w[2]*grad_w[2] +
333 0.5*(grad_u[1]+grad_v[0])*(grad_u[1]+grad_v[0])));
334 re_0 = h_e*h_e*norm_S/nu_0;
335 if (re_0 > 1.0)
336 cs_0=0.027*pow(10.0,-3.23*pow(re_0,-0.92));
337 nu_t0 = cs_0*h_e*h_e*norm_S;
338 re_1 = h_e*h_e*norm_S/nu_1;
339 if (re_1 > 1.0)
340 cs_1=0.027*pow(10.0,-3.23*pow(re_1,-0.92));
341 nu_t1 = cs_1*h_e*h_e*norm_S;
342 }
343 }
344
345 if (MATERIAL_PARAMETERS_AS_FUNCTION==0)
346 {
347 rho = rho_0*ImH_rho+rho_1*H_rho;
348 nu_t= nu_t0*ImH_mu+nu_t1*H_mu;
349 nu = nu_0*ImH_mu+nu_1*H_mu;
350 nu += nu_t;
351 mu = rho_0*nu_0*ImH_mu+rho_1*nu_1*H_mu;
352 }
353 else // set the material parameters by a function. To check convergence
354 {
355 rho = density_as_function;
356 nu_t= 0;
357 mu = dynamic_viscosity_as_function;
358 nu = mu/rho;
359 }
360
361 rhoSave = rho;
362 nuSave = nu;
363
364 eddy_viscosity = nu_t*rho; // mql. CHECK. Most changes about not divide by rho are here
365 // mass (volume accumulation)
366 //..hardwired
367
368 double phi_s_effect = (distance_to_omega_solid > 0.0) ? 1.0 : 1e-10;
369
370 if(USE_SBM>0)
371 phi_s_effect = 1.0;
372 //u momentum accumulation
373 mom_u_acc=u;//trick for non-conservative form
374 dmom_u_acc_u=phi_s_effect * rho*porosity;
375
376 //v momentum accumulation
377 mom_v_acc=v;
378 dmom_v_acc_v=phi_s_effect * rho*porosity;
379
380 /* //w momentum accumulation */
381 /* mom_w_acc=phi_s_effect*w; */
382 /* dmom_w_acc_w=phi_s_effect*rho*porosity; */
383
384 //mass advective flux
385 mass_adv[0]=phi_s_effect * porosity*u;
386 mass_adv[1]=phi_s_effect * porosity*v;
387 /* mass_adv[2]=phi_s_effect * porosity*w; */
388
389 dmass_adv_u[0]=phi_s_effect * porosity;
390 dmass_adv_u[1]=0.0;
391 /* dmass_adv_u[2]=0.0; */
392
393 dmass_adv_v[0]=0.0;
394 dmass_adv_v[1]=phi_s_effect * porosity;
395 /* dmass_adv_v[2]=0.0; */
396
397 /* dmass_adv_w[0]=0.0; */
398 /* dmass_adv_w[1]=0.0; */
399 /* dmass_adv_w[2]=phi_s_effect * porosity; */
400
401 //advection switched to non-conservative form but could be used for mesh motion...
402 //u momentum advective flux
403 mom_u_adv[0]=0.0;
404 mom_u_adv[1]=0.0;
405 /* mom_u_adv[2]=0.0; */
406
407 dmom_u_adv_u[0]=0.0;
408 dmom_u_adv_u[1]=0.0;
409 /* dmom_u_adv_u[2]=0.0; */
410
411 dmom_u_adv_v[0]=0.0;
412 dmom_u_adv_v[1]=0.0;
413 /* dmom_u_adv_v[2]=0.0; */
414
415 /* dmom_u_adv_w[0]=0.0; */
416 /* dmom_u_adv_w[1]=0.0; */
417 /* dmom_u_adv_w[2]=0.0; */
418
419 //v momentum advective_flux
420 mom_v_adv[0]=0.0;
421 mom_v_adv[1]=0.0;
422 /* mom_v_adv[2]=0.0; */
423
424 dmom_v_adv_u[0]=0.0;
425 dmom_v_adv_u[1]=0.0;
426 /* dmom_v_adv_u[2]=0.0; */
427
428 /* dmom_v_adv_w[0]=0.0; */
429 /* dmom_v_adv_w[1]=0.0; */
430 /* dmom_v_adv_w[2]=0.0; */
431
432 dmom_v_adv_v[0]=0.0;
433 dmom_v_adv_v[1]=0.0;
434 /* dmom_v_adv_v[2]=0.0; */
435
436 /* //w momentum advective_flux */
437 /* mom_w_adv[0]=0.0; */
438 /* mom_w_adv[1]=0.0; */
439 /* mom_w_adv[2]=0.0; */
440
441 /* dmom_w_adv_u[0]=0.0; */
442 /* dmom_w_adv_u[1]=0.0; */
443 /* dmom_w_adv_u[2]=0.0; */
444
445 /* dmom_w_adv_v[0]=0.0; */
446 /* dmom_w_adv_v[1]=0.0; */
447 /* dmom_w_adv_v[2]=0.0; */
448
449 /* dmom_w_adv_w[0]=0.0; */
450 /* dmom_w_adv_w[1]=0.0; */
451 /* dmom_w_adv_w[2]=0.0; */
452
453 //u momentum diffusion tensor
454 mom_uu_diff_ten[0] = phi_s_effect * porosity*2.0*mu;
455 mom_uu_diff_ten[1] = phi_s_effect * porosity*mu;
456 /* mom_uu_diff_ten[2] = phi_s_effect * porosity*mu; */
457
458 mom_uv_diff_ten[0]=phi_s_effect * porosity*mu;
459
460 /* mom_uw_diff_ten[0]=phi_s_effect * porosity*mu; */
461
462 //v momentum diffusion tensor
463 mom_vv_diff_ten[0] = phi_s_effect * porosity*mu;
464 mom_vv_diff_ten[1] = phi_s_effect * porosity*2.0*mu;
465 /* mom_vv_diff_ten[2] = phi_s_effect * porosity*mu; */
466
467 mom_vu_diff_ten[0]=phi_s_effect * porosity*mu;
468
469 /* mom_vw_diff_ten[0]=phi_s_effect * porosity*mu; */
470
471 /* //w momentum diffusion tensor */
472 /* mom_ww_diff_ten[0] = phi_s_effect * porosity*mu; */
473 /* mom_ww_diff_ten[1] = phi_s_effect * porosity*mu; */
474 /* mom_ww_diff_ten[2] = phi_s_effect * porosity*2.0*mu; */
475
476 /* mom_wu_diff_ten[0]=phi_s_effect * porosity*mu; */
477
478 /* mom_wv_diff_ten[0]=phi_s_effect * orosity*mu; */
479
480 //momentum sources
481 norm_n = sqrt(n[0]*n[0]+n[1]*n[1]);//+n[2]*n[2]);
482 mom_u_source = -phi_s_effect * porosity*rho*g[0];// - porosity*d_mu*sigma*kappa*n[0]/(rho*(norm_n+1.0e-8));
483 mom_v_source = -phi_s_effect * porosity*rho*g[1];// - porosity*d_mu*sigma*kappa*n[1]/(rho*(norm_n+1.0e-8));
484 /* mom_w_source = -porosity*rho*g[2];// - porosity*d_mu*sigma*kappa*n[2]/(rho*(norm_n+1.0e-8)); */
485
486 // mql: add general force term
487 mom_u_source -= (MULTIPLY_EXTERNAL_FORCE_BY_DENSITY == 1 ? porosity*rho : 1.0)*forcex;
488 mom_v_source -= (MULTIPLY_EXTERNAL_FORCE_BY_DENSITY == 1 ? porosity*rho : 1.0)*forcey;
489 /* mom_w_source -= forcez; */
490
491 //u momentum Hamiltonian (pressure)
492 double aux_pressure = (KILL_PRESSURE_TERM==1 ? 0. : 1.)*(INT_BY_PARTS_PRESSURE==1 ? 0. : 1.);
493 mom_u_ham = phi_s_effect * porosity*grad_p[0]*aux_pressure;
494 dmom_u_ham_grad_p[0]=phi_s_effect * porosity*aux_pressure;
495 dmom_u_ham_grad_p[1]=0.0;
496 /* dmom_u_ham_grad_p[2]=0.0; */
497
498 //v momentum Hamiltonian (pressure)
499 mom_v_ham = phi_s_effect * porosity*grad_p[1]*aux_pressure;
500 dmom_v_ham_grad_p[0]=0.0;
501 dmom_v_ham_grad_p[1]=phi_s_effect * porosity*aux_pressure;
502 /* dmom_v_ham_grad_p[2]=0.0; */
503
504 /* //w momentum Hamiltonian (pressure) */
505 /* mom_w_ham = porosity*grad_p[2]; */
506 /* dmom_w_ham_grad_p[0]=0.0; */
507 /* dmom_w_ham_grad_p[1]=0.0; */
508 /* dmom_w_ham_grad_p[2]=porosity; */
509
510 //u momentum Hamiltonian (advection)
511 mom_u_ham += phi_s_effect * porosity*rho*(uStar*grad_u[0]+vStar*grad_u[1]);
512 dmom_u_ham_grad_u[0]=phi_s_effect * porosity*rho*uStar;
513 dmom_u_ham_grad_u[1]=phi_s_effect * porosity*rho*vStar;
514 /* dmom_u_ham_grad_u[2]=porosity*rho*wStar; */
515
516 //v momentum Hamiltonian (advection)
517 mom_v_ham += phi_s_effect * porosity*rho*(uStar*grad_v[0]+vStar*grad_v[1]);
518 dmom_v_ham_grad_v[0]=phi_s_effect * porosity*rho*uStar;
519 dmom_v_ham_grad_v[1]=phi_s_effect * porosity*rho*vStar;
520 /* dmom_v_ham_grad_v[2]=porosity*rho*wStar; */
521
522 /* //w momentum Hamiltonian (advection) */
523 /* mom_w_ham += porosity*rho*(uStar*grad_w[0]+vStar*grad_w[1]+wStar*grad_w[2]); */
524 /* dmom_w_ham_grad_w[0]=porosity*rho*uStar; */
525 /* dmom_w_ham_grad_w[1]=porosity*rho*vStar; */
526 /* dmom_w_ham_grad_w[2]=porosity*rho*wStar; */
527 }
528
529 //VRANS specific
530 inline
531 void updateDarcyForchheimerTerms_Ergun(/* const double linearDragFactor, */
532 /* const double nonlinearDragFactor, */
533 /* const double porosity, */
534 /* const double meanGrainSize, */
535 const double alpha,
536 const double beta,
537 const double eps_rho,
538 const double eps_mu,
539 const double rho_0,
540 const double nu_0,
541 const double rho_1,
542 const double nu_1,
543 double nu_t,
544 const double useVF,
545 const double vf,
546 const double phi,
547 const double u,
548 const double v,
549 const double w,
550 const double uStar,
551 const double vStar,
552 const double wStar,
553 const double eps_s,
554 const double phi_s,
555 const double u_s,
556 const double v_s,
557 const double w_s,
558 const double uStar_s,
559 const double vStar_s,
560 const double wStar_s,
561 double& mom_u_source,
562 double& mom_v_source,
563 double& mom_w_source,
564 double dmom_u_source[nSpace],
565 double dmom_v_source[nSpace],
566 double dmom_w_source[nSpace],
567 double gradC_x,
568 double gradC_y,
569 double gradC_z)
570 {
571 double rho, mu,nu,H_mu,ImH_mu,uc,duc_du,duc_dv,duc_dw,viscosity,H_s;
572 H_mu = (1.0-useVF)*gf.H(eps_mu,phi)+useVF*fmin(1.0,fmax(0.0,vf));
573 ImH_mu = (1.0-useVF)*gf.ImH(eps_mu,phi)+useVF*(1.0-fmin(1.0,fmax(0.0,vf)));
574 nu = nu_0*ImH_mu+nu_1*H_mu;
575 rho = rho_0*ImH_mu+rho_1*H_mu;
576 mu = rho_0*nu_0*ImH_mu+rho_1*nu_1*H_mu;
577 viscosity = nu;
578 uc = sqrt(u*u+v*v*+w*w);
579 duc_du = u/(uc+1.0e-12);
580 duc_dv = v/(uc+1.0e-12);
581 duc_dw = w/(uc+1.0e-12);
582 double fluid_velocity[2]={uStar,vStar}, solid_velocity[2]={uStar_s,vStar_s};
583 double new_beta = closure.betaCoeff(1.0-phi_s,
584 rho,
585 fluid_velocity,
586 solid_velocity,
587 viscosity)*DRAG_FAC;
588 //new_beta = 254800.0;//hack fall velocity of 0.1 with no pressure gradient
589 double beta2 = 156976.4;//hack, fall velocity of 0.1 with hydrostatic water
590
591 mom_u_source += (1.0 - phi_s) * new_beta * (u - u_s) - TURB_FORCE_FAC*new_beta*nu_t*gradC_x/closure.sigmaC_ +
592 (1.0 - phi_s)*(1.0-DRAG_FAC)*beta2*(u-u_s);
593 mom_v_source += (1.0 - phi_s) * new_beta * (v - v_s) - TURB_FORCE_FAC*new_beta*nu_t*gradC_y/closure.sigmaC_ +
594 (1.0 - phi_s)*(1.0-DRAG_FAC)*beta2*(v-v_s);
595
596 /* mom_w_source += phi_s*new_beta*(w-w_s); */
597
598 dmom_u_source[0] = (1.0 - phi_s) * new_beta + (1.0 - phi_s)*(1.0-DRAG_FAC)*beta2;
599 dmom_u_source[1] = 0.0;
600 /* dmom_u_source[2] = 0.0; */
601
602 dmom_v_source[0] = 0.0;
603 dmom_v_source[1] = (1.0 - phi_s) * new_beta + (1.0 - phi_s)*(1.0-DRAG_FAC)*beta2;
604 /*dmom_v_source[2] = 0.0; */
605
606 dmom_w_source[0] = 0.0;
607 dmom_w_source[1] = 0.0;
608 /*dmom_w_source[2] = (1.0 - phi_s) * new_beta; */
609 }
610
611 inline void updateSolidParticleTerms(bool element_owned,
612 const double particle_nitsche,
613 const double dV,
614 const int nParticles,
615 const int sd_offset,
616 double *particle_signed_distances,
617 double *particle_signed_distance_normals,
618 double *particle_velocities,
619 double *particle_centroids,
620 int use_ball_as_particle,
621 double* ball_center,
622 double* ball_radius,
623 double* ball_velocity,
624 double* ball_angular_velocity,
625 const double porosity, //VRANS specific
626 const double penalty,
627 const double alpha,
628 const double beta,
629 const double eps_rho,
630 const double eps_mu,
631 const double rho_0,
632 const double nu_0,
633 const double rho_1,
634 const double nu_1,
635 const double useVF,
636 const double vf,
637 const double phi,
638 const double x,
639 const double y,
640 const double z,
641 const double p,
642 const double u,
643 const double v,
644 const double w,
645 const double uStar,
646 const double vStar,
647 const double wStar,
648 const double eps_s,
649 const double grad_u[nSpace],
650 const double grad_v[nSpace],
651 const double grad_w[nSpace],
652 double &mom_u_source,
653 double &mom_v_source,
654 double &mom_w_source,
655 double dmom_u_source[nSpace],
656 double dmom_v_source[nSpace],
657 double dmom_w_source[nSpace],
658 double mom_u_adv[nSpace],
659 double mom_v_adv[nSpace],
660 double mom_w_adv[nSpace],
661 double dmom_u_adv_u[nSpace],
662 double dmom_v_adv_v[nSpace],
663 double dmom_w_adv_w[nSpace],
664 double &mom_u_ham,
665 double dmom_u_ham_grad_u[nSpace],
666 double &mom_v_ham,
667 double dmom_v_ham_grad_v[nSpace],
668 double &mom_w_ham,
669 double dmom_w_ham_grad_w[nSpace],
670 double *particle_netForces,
671 double *particle_netMoments,
672 double *particle_surfaceArea)
673 {
674 double C, rho, mu, nu, H_mu, ImH_mu, uc, duc_du, duc_dv, duc_dw, H_s, D_s, phi_s, u_s, v_s, w_s;
675 double force_x, force_y, r_x, r_y, force_p_x, force_p_y, force_stress_x, force_stress_y;
676 double phi_s_normal[2]={0.0};
677 double fluid_outward_normal[2];
678 double vel[2];
679 double center[2];
680 H_mu = (1.0 - useVF) * gf.H(eps_mu, phi) + useVF * fmin(1.0, fmax(0.0, vf));
681 ImH_mu = (1.0 - useVF) * gf.ImH(eps_mu, phi) + useVF * (1.0-fmin(1.0, fmax(0.0, vf)));
682 nu = nu_0 * ImH_mu + nu_1 * H_mu;
683 rho = rho_0 * ImH_mu + rho_1 * H_mu;
684 mu = rho_0 * nu_0 * ImH_mu + rho_1 * nu_1 * H_mu;
685 C = 0.0;
686 for (int i = 0; i < nParticles; i++)
687 {
688 double* vel_pointer= &particle_velocities[i*sd_offset*nSpace];
689 if(use_ball_as_particle==1)
690 {
691 get_distance_to_ith_ball(nParticles,ball_center,ball_radius,i,x,y,z,phi_s);
692 get_normal_to_ith_ball(nParticles,ball_center,ball_radius,i,x,y,z,phi_s_normal[0],phi_s_normal[1]);
693 get_velocity_to_ith_ball(nParticles,ball_center,ball_radius,
694 ball_velocity,ball_angular_velocity,
695 i,x,y,z,
696 vel[0],vel[1]);
697 center[0] = ball_center[3*i+0];
698 center[1] = ball_center[3*i+1];
699 u_s = vel[0];
700 v_s = vel[1];
701 }
702 else
703 {
704 phi_s = particle_signed_distances[i * sd_offset];
705 phi_s_normal[0] = particle_signed_distance_normals[i * sd_offset * 3 + 0];
706 phi_s_normal[1] = particle_signed_distance_normals[i * sd_offset * 3 + 1];
707 vel[0] = particle_velocities[i * sd_offset * 3 + 0];
708 vel[1] = particle_velocities[i * sd_offset * 3 + 1];
709 u_s = vel_pointer[0];
710 v_s = vel_pointer[1];
711 center[0] = particle_centroids[3*i+0];
712 center[1] = particle_centroids[3*i+1];
713
714 }
715 fluid_outward_normal[0] = -phi_s_normal[0];
716 fluid_outward_normal[1] = -phi_s_normal[1];
717
718 w_s = 0;
719 H_s = gf_s.H(eps_s, phi_s);
720 D_s = gf_s.D(eps_s, phi_s);
721 double rel_vel_norm = sqrt((uStar - u_s) * (uStar - u_s) +
722 (vStar - v_s) * (vStar - v_s) +
723 (wStar - w_s) * (wStar - w_s));
724
725 // double C_surf = (phi_s > 0.0) ? 0.0 : nu * penalty;
726 //double C_vol = (phi_s > 0.0) ? 0.0 : (alpha + beta * rel_vel_norm);
727 double C_surf = mu * penalty;
728 double C_vol = (alpha + beta * rel_vel_norm);
729
730 C = (D_s * C_surf + gf_s.ImH(eps_s, phi_s) * C_vol);
731 force_x = dV * D_s * (p * fluid_outward_normal[0]
732 - porosity*mu*(fluid_outward_normal[0] * 2* grad_u[0] +
733 fluid_outward_normal[1] * (grad_u[1]+grad_v[0]))
734 +C_surf*(u-u_s)*rho
735 );
736 force_y = dV * D_s * (p * fluid_outward_normal[1]
737 - porosity*mu * (fluid_outward_normal[0] * (grad_u[1]+grad_v[0]) +
738 fluid_outward_normal[1] * 2* grad_v[1])
739 +C_surf*(v-v_s)*rho
740 );
741 force_p_x = dV * D_s * p * fluid_outward_normal[0];
742 force_p_y = dV * D_s * p * fluid_outward_normal[1];
743 force_stress_x = dV * D_s * (-porosity*mu * (fluid_outward_normal[0] * 2* grad_u[0] +
744 fluid_outward_normal[1] * (grad_u[1]+grad_v[0]))
745 +C_surf*(u-u_s)*rho
746 );
747 force_stress_y = dV * D_s * (-porosity*mu * (fluid_outward_normal[0] * (grad_u[1]+grad_v[0]) +
748 fluid_outward_normal[1] * 2* grad_v[1])
749 +C_surf*(v-v_s)*rho
750 );
751 //always 3D for particle centroids
752 r_x = x - center[0];
753 r_y = y - center[1];
754
755 if (element_owned)
756 {
757 particle_surfaceArea[i] += dV * D_s;
758 particle_netForces[i * 3 + 0] += force_x;
759 particle_netForces[i * 3 + 1] += force_y;
760 particle_netForces[(i+ nParticles)*3+0]+= force_p_x;
761 particle_netForces[(i+2*nParticles)*3+0]+= force_stress_x;
762 particle_netForces[(i+ nParticles)*3+1]+= force_p_y;
763 particle_netForces[(i+2*nParticles)*3+1]+= force_stress_y;
764 particle_netMoments[i * 3 + 2] += (r_x * force_y - r_y * force_x);
765 }
766
767 // These should be done inside to make sure the correct velocity of different particles are used
768 mom_u_source += C * (u - u_s);
769 mom_v_source += C * (v - v_s);
770
771 dmom_u_source[0] += C;
772 dmom_v_source[1] += C;
773
774 //Nitsche terms
775 mom_u_ham -= D_s * porosity * mu * (fluid_outward_normal[0] * grad_u[0] + fluid_outward_normal[1] * grad_u[1]);
776 dmom_u_ham_grad_u[0] -= D_s * porosity * mu * fluid_outward_normal[0];
777 dmom_u_ham_grad_u[1] -= D_s * porosity * mu * fluid_outward_normal[1];
778
779 mom_v_ham -= D_s * porosity * mu * (fluid_outward_normal[0] * grad_v[0] + fluid_outward_normal[1] * grad_v[1]);
780 dmom_v_ham_grad_v[0] -= D_s * porosity * mu * fluid_outward_normal[0];
781 dmom_v_ham_grad_v[1] -= D_s * porosity * mu * fluid_outward_normal[1];
782
783 mom_u_adv[0] += D_s * porosity * mu * fluid_outward_normal[0] * (u - u_s);
784 mom_u_adv[1] += D_s * porosity * mu * fluid_outward_normal[1] * (u - u_s);
785 dmom_u_adv_u[0] += D_s * porosity * mu * fluid_outward_normal[0];
786 dmom_u_adv_u[1] += D_s * porosity * mu * fluid_outward_normal[1];
787
788 mom_v_adv[0] += D_s * porosity * mu * fluid_outward_normal[0] * (v - v_s);
789 mom_v_adv[1] += D_s * porosity * mu * fluid_outward_normal[1] * (v - v_s);
790 dmom_v_adv_v[0] += D_s * porosity * mu * fluid_outward_normal[0];
791 dmom_v_adv_v[1] += D_s * porosity * mu * fluid_outward_normal[1];
792 }
793 }
794 inline void compute_force_around_solid(bool element_owned,
795 const double dV,
796 const int nParticles,
797 const int sd_offset,
798 double *particle_signed_distances,
799 double *particle_signed_distance_normals,
800 double *particle_velocities,
801 double *particle_centroids,
802 int use_ball_as_particle,
803 double* ball_center,
804 double* ball_radius,
805 double* ball_velocity,
806 double* ball_angular_velocity,
807 const double penalty,
808 const double alpha,
809 const double beta,
810 const double eps_rho,
811 const double eps_mu,
812 const double rho_0,
813 const double nu_0,
814 const double rho_1,
815 const double nu_1,
816 const double useVF,
817 const double vf,
818 const double phi,
819 const double x,
820 const double y,
821 const double z,
822 const double p,
823 const double u,
824 const double v,
825 const double w,
826 const double uStar,
827 const double vStar,
828 const double wStar,
829 const double eps_s,
830 const double grad_u[nSpace],
831 const double grad_v[nSpace],
832 const double grad_w[nSpace],
833 double* particle_netForces,
834 double* particle_netMoments)
835 {
836 double C, rho, mu, nu, H_mu, ImH_mu, uc, duc_du, duc_dv, duc_dw, H_s, D_s, phi_s, u_s, v_s, w_s, force_x, force_y, r_x, r_y;
837 double phi_s_normal[2];
838 double fluid_outward_normal[2];
839 double vel[2];
840 double center[2];
841 H_mu = (1.0 - useVF) * gf.H(eps_mu, phi) + useVF * fmin(1.0, fmax(0.0, vf));
842 ImH_mu = (1.0 - useVF) * gf.ImH(eps_mu, phi) + useVF * (1.0-fmin(1.0, fmax(0.0, vf)));
843 nu = nu_0 * ImH_mu + nu_1 * H_mu;
844 rho = rho_0 * ImH_mu + rho_1 * H_mu;
845 mu = rho_0 * nu_0 * ImH_mu + rho_1 * nu_1 * H_mu;
846 C = 0.0;
847 for (int i = 0; i < nParticles; i++)
848 {
849 if(use_ball_as_particle==1)
850 {
851 get_distance_to_ith_ball(nParticles,ball_center,ball_radius,i,x,y,z,phi_s);
852 get_normal_to_ith_ball(nParticles,ball_center,ball_radius,i,x,y,z,phi_s_normal[0],phi_s_normal[1]);
853 get_velocity_to_ith_ball(nParticles,ball_center,ball_radius,
854 ball_velocity,ball_angular_velocity,
855 i,x,y,z,
856 vel[0],vel[1]);
857 center[0] = ball_center[3*i+0];
858 center[1] = ball_center[3*i+1];
859 }
860 else
861 {
862 phi_s = particle_signed_distances[i * sd_offset];
863 phi_s_normal[0] = particle_signed_distance_normals[i * sd_offset * 3 + 0];
864 phi_s_normal[1] = particle_signed_distance_normals[i * sd_offset * 3 + 1];
865 vel[0] = particle_velocities[i * sd_offset * 3 + 0];
866 vel[1] = particle_velocities[i * sd_offset * 3 + 1];
867 center[0] = particle_centroids[3*i+0];
868 center[1] = particle_centroids[3*i+1];
869
870 }
871 fluid_outward_normal[0] = -phi_s_normal[0];
872 fluid_outward_normal[1] = -phi_s_normal[1];
873 u_s = vel[0];
874 v_s = vel[1];
875 w_s = 0;
876 H_s = gf_s.H(eps_s, phi_s);
877 D_s = gf_s.D(eps_s, phi_s);
878 double rel_vel_norm = sqrt((uStar - u_s) * (uStar - u_s) +(vStar - v_s) * (vStar - v_s) + (wStar - w_s) * (wStar - w_s));
879 double C_surf = (phi_s > 0.0) ? 0.0 : nu * penalty;
880 double C_vol = (phi_s > 0.0) ? 0.0 : (alpha + beta * rel_vel_norm);
881
882 C = (D_s * C_surf + gf_s.ImH(eps_s, phi_s) * C_vol);
883 force_x = dV * D_s * (p * fluid_outward_normal[0]
884 -mu * (fluid_outward_normal[0] * 2* grad_u[0] + fluid_outward_normal[1] * (grad_u[1]+grad_v[0]))
885 );
886 //+dV*D_s*C_surf*rel_vel_norm*(u-u_s)*rho
887 //+dV * (1.0 - H_s) * C_vol * (u - u_s) * rho;
888 force_y = dV * D_s * (p * fluid_outward_normal[1]
889 -mu * (fluid_outward_normal[0] * (grad_u[1]+grad_v[0]) + fluid_outward_normal[1] * 2* grad_v[1])
890 );
891 //+dV*D_s*C_surf*rel_vel_norm*(v-v_s)*rho
892 //+dV * (1.0 - H_s) * C_vol * (v - v_s) * rho;
893
894 //always 3D for particle centroids
895 r_x = x - center[0];
896 r_y = y - center[1];
897
898 if (element_owned)
899 {
900 particle_netForces[i * 3 + 0] += force_x;
901 particle_netForces[i * 3 + 1] += force_y;
902 particle_netMoments[i * 3 + 2] += (r_x * force_y - r_y * force_x);
903 }
904 }
905 }
906 inline
907 void calculateCFL(const double& hFactor,
908 const double& elementDiameter,
909 const double& dm,
910 const double df[nSpace],
911 double& cfl)
912 {
913 double h,density,nrm_df=0.0;
914 h = hFactor*elementDiameter;
915 density = dm;
916 for(int I=0;I<nSpace;I++)
917 nrm_df+=df[I]*df[I];
918 nrm_df = sqrt(nrm_df);
919 if (density > 1.0e-8)
920 cfl = nrm_df/(h*density);//this is really cfl/dt, but that's what we want to know, the step controller expect this
921 else
922 cfl = nrm_df/h;
923 //cfl = nrm_df/(h*density);//this is really cfl/dt, but that's what we want to know, the step controller expect this
924 }
925
926 inline void updateTurbulenceClosure(const int turbulenceClosureModel,
927 const double eps_rho,
928 const double eps_mu,
929 const double rho_0,
930 const double nu_0,
931 const double rho_1,
932 const double nu_1,
933 const double useVF,
934 const double vf,
935 const double phi,
936 const double porosity,
937 const double eddy_visc_coef_0,
938 const double turb_var_0, //k for k-eps or k-omega
939 const double turb_var_1, //epsilon for k-epsilon, omega for k-omega
940 const double turb_grad_0[nSpace], //grad k for k-eps,k-omega
941 double &eddy_viscosity,
942 double mom_uu_diff_ten[nSpace],
943 double mom_vv_diff_ten[nSpace],
944 double mom_ww_diff_ten[nSpace],
945 double mom_uv_diff_ten[1],
946 double mom_uw_diff_ten[1],
947 double mom_vu_diff_ten[1],
948 double mom_vw_diff_ten[1],
949 double mom_wu_diff_ten[1],
950 double mom_wv_diff_ten[1],
951 double &mom_u_source,
952 double &mom_v_source,
953 double &mom_w_source)
954 {
955 /****
956 eddy_visc_coef
957 <= 2 LES (do nothing)
958 == 3 k-epsilon
959
960 */
961 assert (turbulenceClosureModel >=3);
962 double rho,nu,H_mu,ImH_mu,nu_t=0.0,nu_t_keps =0.0, nu_t_komega=0.0;
963 double isKEpsilon = 1.0;
964 if (turbulenceClosureModel == 4)
965 isKEpsilon = 0.0;
966 H_mu = (1.0-useVF)*gf.H(eps_mu,phi)+useVF*fmin(1.0,fmax(0.0,vf));
967 ImH_mu = (1.0-useVF)*gf.ImH(eps_mu,phi)+useVF*(1.0-fmin(1.0,fmax(0.0,vf)));
968 nu = nu_0*ImH_mu+nu_1*H_mu;
969 rho = rho_0*ImH_mu+rho_1*H_mu;
970
971 const double twoThirds = 2.0/3.0; const double div_zero = 1.0e-2*fmin(nu_0,nu_1);
972 mom_u_source += twoThirds*turb_grad_0[0];
973 mom_v_source += twoThirds*turb_grad_0[1];
974 /* mom_w_source += twoThirds*turb_grad_0[2]; */
975
976 //--- closure model specific ---
977 //k-epsilon
978 nu_t_keps = eddy_visc_coef_0*turb_var_0*turb_var_0/(fabs(turb_var_1) + div_zero);
979 //k-omega
980 nu_t_komega = turb_var_0/(fabs(turb_var_1) + div_zero);
981 //
982 nu_t = isKEpsilon*nu_t_keps + (1.0-isKEpsilon)*nu_t_komega;
983 //mwf debug
984 //if (nu_t > 1.e6*nu)
985 //{
986 // std::cout<<"RANS3PF2D WARNING isKEpsilon = "<<isKEpsilon<<" nu_t = " <<nu_t<<" nu= "<<nu<<" k= "<<turb_var_0<<" turb_var_1= "<<turb_var_1<<std::endl;
987 //}
988
989 nu_t = fmax(nu_t,1.0e-4*nu); //limit according to Lew, Buscaglia etal 01
990 //mwf hack
991 nu_t = fmin(nu_t,1.0e6*nu);
992
993 eddy_viscosity = nu_t*rho; // mql. CHECK.
994 //u momentum diffusion tensor
995 mom_uu_diff_ten[0] += porosity*2.0*eddy_viscosity;
996 mom_uu_diff_ten[1] += porosity*eddy_viscosity;
997 /* mom_uu_diff_ten[2] += porosity*eddy_viscosity; */
998
999 mom_uv_diff_ten[0]+=porosity*eddy_viscosity;
1000
1001 /* mom_uw_diff_ten[0]+=porosity*eddy_viscosity; */
1002
1003 //v momentum diffusion tensor
1004 mom_vv_diff_ten[0] += porosity*eddy_viscosity;
1005 mom_vv_diff_ten[1] += porosity*2.0*eddy_viscosity;
1006 /* mom_vv_diff_ten[2] += porosity*eddy_viscosity; */
1007
1008 mom_vu_diff_ten[0]+=porosity*eddy_viscosity;
1009
1010 /* mom_vw_diff_ten[0]+=porosity*eddy_viscosity; */
1011
1012 /* //w momentum diffusion tensor */
1013 /* mom_ww_diff_ten[0] += porosity*eddy_viscosity; */
1014 /* mom_ww_diff_ten[1] += porosity*eddy_viscosity; */
1015 /* mom_ww_diff_ten[2] += porosity*2.0*eddy_viscosity; */
1016
1017 /* mom_wu_diff_ten[0]+=porosity*eddy_viscosity; */
1018
1019 /* mom_wv_diff_ten[0]+=eddy_viscosity; */
1020 }
1021
1022 inline void calculateSubgridError_tau(const double &hFactor,
1023 const double &elementDiameter,
1024 const double &dmt,
1025 const double &dm,
1026 const double df[nSpace],
1027 const double &a,
1028 const double &pfac,
1029 double &tau_v,
1030 double &tau_p,
1031 double &cfl)
1032 {
1033 double h, oneByAbsdt, density, viscosity, nrm_df;
1034 h = hFactor * elementDiameter;
1035 density = dm;
1036 viscosity = a;
1037 nrm_df = 0.0;
1038 for (int I = 0; I < nSpace; I++)
1039 nrm_df += df[I] * df[I];
1040 nrm_df = sqrt(nrm_df);
1041 if (density > 1.0e-8)
1042 cfl = nrm_df/(h*density);//this is really cfl/dt, but that's what we want to know, the step controller expect this
1043 else
1044 cfl = nrm_df/h;
1045 oneByAbsdt = fabs(dmt);
1046 tau_v = 1.0/(4.0*viscosity/(h*h) + 2.0*nrm_df/h + oneByAbsdt);
1047 tau_p = (4.0*viscosity + 2.0*nrm_df*h + oneByAbsdt*h*h)/pfac;
1048 }
1049
1050 inline void calculateSubgridError_tau(const double &Ct_sge,
1051 const double &Cd_sge,
1052 const double G[nSpace * nSpace],
1053 const double &G_dd_G,
1054 const double &tr_G,
1055 const double &A0,
1056 const double Ai[nSpace],
1057 const double &Kij,
1058 const double &pfac,
1059 double &tau_v,
1060 double &tau_p,
1061 double &q_cfl)
1062 {
1063 double v_d_Gv = 0.0;
1064 for (int I = 0; I < nSpace; I++)
1065 for (int J = 0; J < nSpace; J++)
1066 v_d_Gv += Ai[I] * G[I * nSpace + J] * Ai[J];
1067 tau_v = 1.0 / sqrt(Ct_sge * A0 * A0 + v_d_Gv + Cd_sge * Kij * Kij * G_dd_G + 1.0e-12);
1068 tau_p = 1.0 / (pfac * tr_G * tau_v);
1069 }
1070
1071 inline void calculateSubgridError_tauRes(const double &tau_p,
1072 const double &tau_v,
1073 const double &pdeResidualP,
1074 const double &pdeResidualU,
1075 const double &pdeResidualV,
1076 const double &pdeResidualW,
1077 double &subgridErrorP,
1078 double &subgridErrorU,
1079 double &subgridErrorV,
1080 double &subgridErrorW)
1081 {
1082 /* GLS pressure */
1083 subgridErrorP = -tau_p * pdeResidualP;
1084 /* GLS momentum */
1085 subgridErrorU = -tau_v * pdeResidualU;
1086 subgridErrorV = -tau_v * pdeResidualV;
1087 /* subgridErrorW = -tau_v*pdeResidualW; */
1088 }
1089
1090 inline void calculateSubgridErrorDerivatives_tauRes(const double &tau_p,
1091 const double &tau_v,
1092 const double dpdeResidualP_du[nDOF_trial_element],
1093 const double dpdeResidualP_dv[nDOF_trial_element],
1094 const double dpdeResidualP_dw[nDOF_trial_element],
1095 const double dpdeResidualU_dp[nDOF_trial_element],
1096 const double dpdeResidualU_du[nDOF_trial_element],
1097 const double dpdeResidualV_dp[nDOF_trial_element],
1098 const double dpdeResidualV_dv[nDOF_trial_element],
1099 const double dpdeResidualW_dp[nDOF_trial_element],
1100 const double dpdeResidualW_dw[nDOF_trial_element],
1101 double dsubgridErrorP_du[nDOF_trial_element],
1102 double dsubgridErrorP_dv[nDOF_trial_element],
1103 double dsubgridErrorP_dw[nDOF_trial_element],
1104 double dsubgridErrorU_dp[nDOF_trial_element],
1105 double dsubgridErrorU_du[nDOF_trial_element],
1106 double dsubgridErrorV_dp[nDOF_trial_element],
1107 double dsubgridErrorV_dv[nDOF_trial_element],
1108 double dsubgridErrorW_dp[nDOF_trial_element],
1109 double dsubgridErrorW_dw[nDOF_trial_element])
1110 {
1111 for (int j = 0; j < nDOF_trial_element; j++)
1112 {
1113 /* GLS pressure */
1114 dsubgridErrorP_du[j] = -tau_p * dpdeResidualP_du[j];
1115 dsubgridErrorP_dv[j] = -tau_p * dpdeResidualP_dv[j];
1116 /* dsubgridErrorP_dw[j] = -tau_p*dpdeResidualP_dw[j]; */
1117 /* GLS momentum*/
1118 /* u */
1119 dsubgridErrorU_dp[j] = -tau_v * dpdeResidualU_dp[j];
1120 dsubgridErrorU_du[j] = -tau_v * dpdeResidualU_du[j];
1121 /* v */
1122 dsubgridErrorV_dp[j] = -tau_v * dpdeResidualV_dp[j];
1123 dsubgridErrorV_dv[j] = -tau_v * dpdeResidualV_dv[j];
1124 /* /\* w *\/ */
1125 /* dsubgridErrorW_dp[j] = -tau_v*dpdeResidualW_dp[j]; */
1126 /* dsubgridErrorW_dw[j] = -tau_v*dpdeResidualW_dw[j]; */
1127 }
1128 }
1129
1130 inline
1131 void exteriorNumericalAdvectiveFlux(const int& isDOFBoundary_p,
1132 const int& isDOFBoundary_u,
1133 const int& isDOFBoundary_v,
1134 const int& isDOFBoundary_w,
1135 const int& isFluxBoundary_p,
1136 const int& isFluxBoundary_u,
1137 const int& isFluxBoundary_v,
1138 const int& isFluxBoundary_w,
1139 const double& oneByRho,
1140 const double& bc_oneByRho,
1141 const double n[nSpace],
1142 const double& porosity,
1143 const double& bc_p,
1144 const double& bc_u,
1145 const double& bc_v,
1146 const double& bc_w,
1147 const double bc_f_mass[nSpace],
1148 const double bc_f_umom[nSpace],
1149 const double bc_f_vmom[nSpace],
1150 const double bc_f_wmom[nSpace],
1151 const double& bc_flux_mass,
1152 const double& bc_flux_umom,
1153 const double& bc_flux_vmom,
1154 const double& bc_flux_wmom,
1155 const double& p,
1156 const double& u,
1157 const double& v,
1158 const double& w,
1159 const double f_mass[nSpace],
1160 const double f_umom[nSpace],
1161 const double f_vmom[nSpace],
1162 const double f_wmom[nSpace],
1163 const double df_mass_du[nSpace],
1164 const double df_mass_dv[nSpace],
1165 const double df_mass_dw[nSpace],
1166 const double df_umom_dp[nSpace],
1167 const double df_umom_du[nSpace],
1168 const double df_umom_dv[nSpace],
1169 const double df_umom_dw[nSpace],
1170 const double df_vmom_dp[nSpace],
1171 const double df_vmom_du[nSpace],
1172 const double df_vmom_dv[nSpace],
1173 const double df_vmom_dw[nSpace],
1174 const double df_wmom_dp[nSpace],
1175 const double df_wmom_du[nSpace],
1176 const double df_wmom_dv[nSpace],
1177 const double df_wmom_dw[nSpace],
1178 double& flux_mass,
1179 double& flux_umom,
1180 double& flux_vmom,
1181 double& flux_wmom,
1182 double* velocity_star,
1183 double* velocity)
1184 {
1185 double flowSpeedNormal;
1186 flux_mass = 0.0;
1187 flux_umom = 0.0;
1188 flux_vmom = 0.0;
1189 /* flux_wmom = 0.0; */
1190 flowSpeedNormal=porosity*(n[0]*velocity_star[0] +
1191 n[1]*velocity_star[1]);
1192 velocity[0] = u;
1193 velocity[1] = v;
1194 /* velocity[2] = w; */
1195 if (isDOFBoundary_u != 1)
1196 {
1197 flux_mass += n[0]*f_mass[0];
1198 if (flowSpeedNormal < 0.0)
1199 {
1200 flux_umom+=flowSpeedNormal*(0.0 - u);
1201 }
1202 }
1203 else
1204 {
1205 flux_mass += n[0]*f_mass[0];
1206 if (flowSpeedNormal < 0.0)
1207 {
1208 flux_umom+=flowSpeedNormal*(bc_u - u);
1209 velocity[0] = bc_u;
1210 }
1211 }
1212 if (isDOFBoundary_v != 1)
1213 {
1214 flux_mass+=n[1]*f_mass[1];
1215 if (flowSpeedNormal < 0.0)
1216 {
1217 flux_vmom+=flowSpeedNormal*(0.0 - v);
1218 }
1219 }
1220 else
1221 {
1222 flux_mass+=n[1]*f_mass[1];
1223 if (flowSpeedNormal < 0.0)
1224 {
1225 flux_vmom+=flowSpeedNormal*(bc_v - v);
1226 velocity[1] = bc_v;
1227 }
1228 }
1229 /* if (isDOFBoundary_w != 1) */
1230 /* { */
1231 /* flux_mass+=n[2]*f_mass[2]; */
1232 /* } */
1233 /* else */
1234 /* { */
1235 /* flux_mass +=n[2]*f_mass[2]; */
1236 /* if (flowSpeedNormal < 0.0) */
1237 /* { */
1238 /* flux_wmom+=flowSpeedNormal*(bc_w - w); */
1239 /* } */
1240 /* } */
1241 /* if (isDOFBoundary_w != 1) */
1242 /* { */
1243 /* flux_mass+=n[2]*f_mass[2]; */
1244 /* } */
1245 /* else */
1246 /* { */
1247 /* flux_mass +=n[2]*f_mass[2]; */
1248 /* if (flowSpeedNormal < 0.0) */
1249 /* flux_wmom+=bc_speed*(bc_w - w); */
1250 /* } */
1251 if (isFluxBoundary_u == 1)
1252 {
1253 flux_umom = bc_flux_umom;
1254 velocity[0] = bc_flux_umom/porosity;
1255 }
1256 if (isFluxBoundary_v == 1)
1257 {
1258 flux_vmom = bc_flux_vmom;
1259 velocity[1] = bc_flux_umom/porosity;
1260 }
1261 /* if (isFluxBoundary_w == 1) */
1262 /* { */
1263 /* flux_wmom = bc_flux_wmom; */
1264 /* } */
1265 }
1266
1267 inline
1268 void exteriorNumericalAdvectiveFluxDerivatives(const int& isDOFBoundary_p,
1269 const int& isDOFBoundary_u,
1270 const int& isDOFBoundary_v,
1271 const int& isDOFBoundary_w,
1272 const int& isFluxBoundary_p,
1273 const int& isFluxBoundary_u,
1274 const int& isFluxBoundary_v,
1275 const int& isFluxBoundary_w,
1276 const double& oneByRho,
1277 const double n[nSpace],
1278 const double& porosity, //mql. CHECK. Multiply by rho outside
1279 const double& bc_p,
1280 const double& bc_u,
1281 const double& bc_v,
1282 const double& bc_w,
1283 const double bc_f_mass[nSpace],
1284 const double bc_f_umom[nSpace],
1285 const double bc_f_vmom[nSpace],
1286 const double bc_f_wmom[nSpace],
1287 const double& bc_flux_mass,
1288 const double& bc_flux_umom,
1289 const double& bc_flux_vmom,
1290 const double& bc_flux_wmom,
1291 const double& p,
1292 const double& u,
1293 const double& v,
1294 const double& w,
1295 const double f_mass[nSpace],
1296 const double f_umom[nSpace],
1297 const double f_vmom[nSpace],
1298 const double f_wmom[nSpace],
1299 const double df_mass_du[nSpace],
1300 const double df_mass_dv[nSpace],
1301 const double df_mass_dw[nSpace],
1302 const double df_umom_dp[nSpace],
1303 const double df_umom_du[nSpace],
1304 const double df_umom_dv[nSpace],
1305 const double df_umom_dw[nSpace],
1306 const double df_vmom_dp[nSpace],
1307 const double df_vmom_du[nSpace],
1308 const double df_vmom_dv[nSpace],
1309 const double df_vmom_dw[nSpace],
1310 const double df_wmom_dp[nSpace],
1311 const double df_wmom_du[nSpace],
1312 const double df_wmom_dv[nSpace],
1313 const double df_wmom_dw[nSpace],
1314 double& dflux_mass_du,
1315 double& dflux_mass_dv,
1316 double& dflux_mass_dw,
1317 double& dflux_umom_dp,
1318 double& dflux_umom_du,
1319 double& dflux_umom_dv,
1320 double& dflux_umom_dw,
1321 double& dflux_vmom_dp,
1322 double& dflux_vmom_du,
1323 double& dflux_vmom_dv,
1324 double& dflux_vmom_dw,
1325 double& dflux_wmom_dp,
1326 double& dflux_wmom_du,
1327 double& dflux_wmom_dv,
1328 double& dflux_wmom_dw,
1329 double* velocity_star)
1330 {
1331 double flowSpeedNormal;
1332 dflux_mass_du = 0.0;
1333 dflux_mass_dv = 0.0;
1334 /* dflux_mass_dw = 0.0; */
1335
1336 dflux_umom_dp = 0.0;
1337 dflux_umom_du = 0.0;
1338 dflux_umom_dv = 0.0;
1339 /* dflux_umom_dw = 0.0; */
1340
1341 dflux_vmom_dp = 0.0;
1342 dflux_vmom_du = 0.0;
1343 dflux_vmom_dv = 0.0;
1344 /* dflux_vmom_dw = 0.0; */
1345
1346 dflux_wmom_dp = 0.0;
1347 dflux_wmom_du = 0.0;
1348 dflux_wmom_dv = 0.0;
1349 /* dflux_wmom_dw = 0.0; */
1350 flowSpeedNormal=porosity*(n[0]*velocity_star[0] +
1351 n[1]*velocity_star[1]);
1352 if (isDOFBoundary_u != 1)
1353 {
1354 dflux_mass_du += n[0]*df_mass_du[0];
1355 if (flowSpeedNormal < 0.0)
1356 dflux_umom_du -= flowSpeedNormal;
1357 }
1358 else
1359 {
1360 dflux_mass_du += n[0]*df_mass_du[0];
1361 if (flowSpeedNormal < 0.0)
1362 dflux_umom_du -= flowSpeedNormal;
1363 }
1364 if (isDOFBoundary_v != 1)
1365 {
1366 dflux_mass_dv += n[1]*df_mass_dv[1];
1367 if (flowSpeedNormal < 0.0)
1368 dflux_vmom_dv -= flowSpeedNormal;
1369 }
1370 else
1371 {
1372 dflux_mass_dv += n[1]*df_mass_dv[1];
1373 if (flowSpeedNormal < 0.0)
1374 dflux_vmom_dv -= flowSpeedNormal;
1375 }
1376 /* if (isDOFBoundary_w != 1) */
1377 /* { */
1378 /* dflux_mass_dw+=n[2]*df_mass_dw[2]; */
1379 /* } */
1380 /* else */
1381 /* { */
1382 /* dflux_mass_dw += n[2]*df_mass_dw[2]; */
1383 /* if (flowSpeedNormal < 0.0) */
1384 /* dflux_wmom_dw -= flowSpeedNormal; */
1385 /* } */
1386 /* if (isDOFBoundary_w != 1) */
1387 /* { */
1388 /* dflux_mass_dw+=n[2]*df_mass_dw[2]; */
1389 /* } */
1390 /* else */
1391 /* { */
1392 /* dflux_mass_dw += n[2]*df_mass_dw[2]; */
1393 /* if (flowSpeedNormal < 0.0) */
1394 /* dflux_wmom_dw += bc_speed; */
1395 /* } */
1396 /* if (isDOFBoundary_p == 1) */
1397 /* { */
1398 /* dflux_umom_dp= -n[0]*oneByRho; */
1399 /* dflux_vmom_dp= -n[1]*oneByRho; */
1400 /* /\* dflux_wmom_dp= -n[2]*oneByRho; *\/ */
1401 /* } */
1402 /* if (isFluxBoundary_p == 1) */
1403 /* { */
1404 /* dflux_mass_du = 0.0; */
1405 /* dflux_mass_dv = 0.0; */
1406 /* /\* dflux_mass_dw = 0.0; *\/ */
1407 /* } */
1408 if (isFluxBoundary_u == 1)
1409 {
1410 dflux_umom_dp = 0.0;
1411 dflux_umom_du = 0.0;
1412 dflux_umom_dv = 0.0;
1413 /* dflux_umom_dw = 0.0; */
1414 }
1415 if (isFluxBoundary_v == 1)
1416 {
1417 dflux_vmom_dp = 0.0;
1418 dflux_vmom_du = 0.0;
1419 dflux_vmom_dv = 0.0;
1420 /* dflux_vmom_dw = 0.0; */
1421 }
1422 /* if (isFluxBoundary_w == 1) */
1423 /* { */
1424 /* dflux_wmom_dp = 0.0; */
1425 /* dflux_wmom_du = 0.0; */
1426 /* dflux_wmom_dv = 0.0; */
1427 /* dflux_wmom_dw = 0.0; */
1428 /* } */
1429 }
1430
1431 inline
1432 void exteriorNumericalDiffusiveFlux(const double& eps,
1433 const double& phi,
1434 int* rowptr,
1435 int* colind,
1436 const int& isDOFBoundary,
1437 const int& isFluxBoundary,
1438 const double n[nSpace],
1439 double* bc_a,
1440 const double& bc_u,
1441 const double& bc_flux,
1442 double* a,
1443 const double grad_potential[nSpace],
1444 const double& u,
1445 const double& penalty,
1446 double& flux)
1447 {
1448 double diffusiveVelocityComponent_I,penaltyFlux,max_a;
1449 if(isFluxBoundary == 1)
1450 {
1451 flux = bc_flux;
1452 }
1453 else if(isDOFBoundary == 1)
1454 {
1455 flux = 0.0;
1456 max_a=0.0;
1457 for(int I=0;I<nSpace;I++)
1458 {
1459 diffusiveVelocityComponent_I=0.0;
1460 for(int m=rowptr[I];m<rowptr[I+1];m++)
1461 {
1462 diffusiveVelocityComponent_I -= a[m]*grad_potential[colind[m]];
1463 max_a = fmax(max_a,a[m]);
1464 }
1465 flux+= diffusiveVelocityComponent_I*n[I];
1466 }
1467 penaltyFlux = max_a*penalty*(u-bc_u);
1468 flux += penaltyFlux;
1469 //contact line slip
1470 //flux*=(gf.D(eps,0) - gf.D(eps,phi))/gf.D(eps,0);
1471 }
1472 else
1473 {
1474 std::cerr<<"RANS3PF2D: warning, diffusion term with no boundary condition set, setting diffusive flux to 0.0"<<std::endl;
1475 flux = 0.0;
1476 }
1477 }
1478
1479 inline
1481 const double& phi,
1482 int* rowptr,
1483 int* colind,
1484 const int& isDOFBoundary,
1485 const int& isFluxBoundary,
1486 const double n[nSpace],
1487 double* a,
1488 const double& v,
1489 const double grad_v[nSpace],
1490 const double& penalty)
1491 {
1492 double dvel_I,tmp=0.0,max_a=0.0;
1493 if(isFluxBoundary==0 && isDOFBoundary==1)
1494 {
1495 for(int I=0;I<nSpace;I++)
1496 {
1497 dvel_I=0.0;
1498 for(int m=rowptr[I];m<rowptr[I+1];m++)
1499 {
1500 dvel_I -= a[m]*grad_v[colind[m]];
1501 max_a = fmax(max_a,a[m]);
1502 }
1503 tmp += dvel_I*n[I];
1504 }
1505 tmp +=max_a*penalty*v;
1506 //contact line slip
1507 //tmp*=(gf.D(eps,0) - gf.D(eps,phi))/gf.D(eps,0);
1508 }
1509 return tmp;
1510 }
1511
1512 void get_symmetric_gradient_dot_vec(const double *grad_u, const double *grad_v, const double *n,double res[2])
1513 {
1514// res[0] = 2.0*grad_u[0]*n[0]+(grad_u[1]+grad_v[0])*n[1];
1515// res[1] = (grad_v[0]+grad_u[1])*n[0]+ 2*grad_v[1]*n[1];
1516 res[0] = grad_u[0]*n[0]+grad_u[1]*n[1];
1517 res[1] = grad_v[0]*n[0]+grad_v[1]*n[1];
1518 }
1519 double get_cross_product(const double *u, const double *v)
1520 {
1521 return u[0]*v[1]-u[1]*v[0];
1522 }
1523 double get_dot_product(const double *u, const double *v)
1524 {
1525 return u[0]*v[0]+u[1]*v[1];
1526 }
1527 int get_distance_to_ball(int n_balls,double* ball_center, double* ball_radius, double x, double y, double z, double& distance)
1528 {
1529 distance = 1e10;
1530 int index = -1;
1531 double d_ball_i;
1532 for (int i=0; i<n_balls; ++i)
1533 {
1534 d_ball_i = std::sqrt((ball_center[i*3+0]-x)*(ball_center[i*3+0]-x)
1535 +(ball_center[i*3+1]-y)*(ball_center[i*3+1]-y)
1536// +(ball_center[i*3+2]-z)*(ball_center[i*3+2]-z)
1537 ) - ball_radius[i];
1538 if(d_ball_i<distance)
1539 {
1540 distance = d_ball_i;
1541 index = i;
1542 }
1543 }
1544 return index;
1545 }
1546 void get_distance_to_ith_ball(int n_balls,double* ball_center, double* ball_radius,
1547 int I,
1548 double x, double y, double z,
1549 double& distance)
1550 {
1551 distance = std::sqrt((ball_center[I*3+0]-x)*(ball_center[I*3+0]-x)
1552 + (ball_center[I*3+1]-y)*(ball_center[I*3+1]-y)
1553// + (ball_center[I*3+2]-z)*(ball_center[I*3+2]-z)
1554 ) - ball_radius[I];
1555 }
1556 void get_normal_to_ith_ball(int n_balls,double* ball_center, double* ball_radius,
1557 int I,
1558 double x, double y, double z,
1559 double& nx, double& ny)
1560 {
1561 double distance = std::sqrt((ball_center[I*3+0]-x)*(ball_center[I*3+0]-x)
1562 + (ball_center[I*3+1]-y)*(ball_center[I*3+1]-y)
1563// + (ball_center[I*3+2]-z)*(ball_center[I*3+2]-z)
1564 );
1565 nx = (x - ball_center[I*3+0])/(distance+1e-10);
1566 ny = (y - ball_center[I*3+1])/(distance+1e-10);
1567 }
1568 void get_velocity_to_ith_ball(int n_balls,double* ball_center, double* ball_radius,
1569 double* ball_velocity, double* ball_angular_velocity,
1570 int I,
1571 double x, double y, double z,
1572 double& vx, double& vy)
1573 {
1574 vx = ball_velocity[3*I + 0] - ball_angular_velocity[3*I + 2]*(y-ball_center[3*I + 1]);
1575 vy = ball_velocity[3*I + 1] + ball_angular_velocity[3*I + 2]*(x-ball_center[3*I + 0]);
1576 }
1577
1579 bool useExact)
1580 {
1581 xt::pyarray<double>& mesh_trial_ref = args.array<double>("mesh_trial_ref");
1582 xt::pyarray<double>& mesh_grad_trial_ref = args.array<double>("mesh_grad_trial_ref");
1583 xt::pyarray<double>& mesh_dof = args.array<double>("mesh_dof");
1584 xt::pyarray<double>& mesh_velocity_dof = args.array<double>("mesh_velocity_dof");
1585 double MOVING_DOMAIN = args.scalar<double>("MOVING_DOMAIN");
1586 double PSTAB = args.scalar<double>("PSTAB");
1587 xt::pyarray<int>& mesh_l2g = args.array<int>("mesh_l2g");
1588 xt::pyarray<double>& x_ref = args.array<double>("x_ref");
1589 xt::pyarray<double>& dV_ref = args.array<double>("dV_ref");
1590 int nDOF_per_element_pressure = args.scalar<int>("nDOF_per_element_pressure");
1591 xt::pyarray<double>& p_trial_ref = args.array<double>("p_trial_ref");
1592 xt::pyarray<double>& p_grad_trial_ref = args.array<double>("p_grad_trial_ref");
1593 xt::pyarray<double>& p_test_ref = args.array<double>("p_test_ref");
1594 xt::pyarray<double>& p_grad_test_ref = args.array<double>("p_grad_test_ref");
1595 xt::pyarray<double>& q_p = args.array<double>("q_p");
1596 xt::pyarray<double>& q_grad_p = args.array<double>("q_grad_p");
1597 xt::pyarray<double>& ebqe_p = args.array<double>("ebqe_p");
1598 xt::pyarray<double>& ebqe_grad_p = args.array<double>("ebqe_grad_p");
1599 xt::pyarray<double>& vel_trial_ref = args.array<double>("vel_trial_ref");
1600 xt::pyarray<double>& vel_grad_trial_ref = args.array<double>("vel_grad_trial_ref");
1601 xt::pyarray<double>& vel_hess_trial_ref = args.array<double>("vel_hess_trial_ref");
1602 xt::pyarray<double>& vel_test_ref = args.array<double>("vel_test_ref");
1603 xt::pyarray<double>& vel_grad_test_ref = args.array<double>("vel_grad_test_ref");
1604 xt::pyarray<double>& mesh_trial_trace_ref = args.array<double>("mesh_trial_trace_ref");
1605 xt::pyarray<double>& mesh_grad_trial_trace_ref = args.array<double>("mesh_grad_trial_trace_ref");
1606 xt::pyarray<double>& dS_ref = args.array<double>("dS_ref");
1607 xt::pyarray<double>& p_trial_trace_ref = args.array<double>("p_trial_trace_ref");
1608 xt::pyarray<double>& p_grad_trial_trace_ref = args.array<double>("p_grad_trial_trace_ref");
1609 xt::pyarray<double>& p_test_trace_ref = args.array<double>("p_test_trace_ref");
1610 xt::pyarray<double>& p_grad_test_trace_ref = args.array<double>("p_grad_test_trace_ref");
1611 xt::pyarray<double>& vel_trial_trace_ref = args.array<double>("vel_trial_trace_ref");
1612 xt::pyarray<double>& vel_grad_trial_trace_ref = args.array<double>("vel_grad_trial_trace_ref");
1613 xt::pyarray<double>& vel_test_trace_ref = args.array<double>("vel_test_trace_ref");
1614 xt::pyarray<double>& vel_grad_test_trace_ref = args.array<double>("vel_grad_test_trace_ref");
1615 xt::pyarray<double>& normal_ref = args.array<double>("normal_ref");
1616 xt::pyarray<double>& boundaryJac_ref = args.array<double>("boundaryJac_ref");
1617 double eb_adjoint_sigma = args.scalar<double>("eb_adjoint_sigma");
1618 xt::pyarray<double>& elementDiameter = args.array<double>("elementDiameter");
1619 xt::pyarray<double>& nodeDiametersArray = args.array<double>("nodeDiametersArray");
1620 double hFactor = args.scalar<double>("hFactor");
1621 int nElements_global = args.scalar<int>("nElements_global");
1622 int nElements_owned = args.scalar<int>("nElements_owned");
1623 int nElementBoundaries_global = args.scalar<int>("nElementBoundaries_global");
1624 int nElementBoundaries_owned = args.scalar<int>("nElementBoundaries_owned");
1625 int nNodes_owned = args.scalar<int>("nNodes_owned");
1626 double useRBLES = args.scalar<double>("useRBLES");
1627 double useMetrics = args.scalar<double>("useMetrics");
1628 double alphaBDF = args.scalar<double>("alphaBDF");
1629 double epsFact_rho = args.scalar<double>("epsFact_rho");
1630 double epsFact_mu = args.scalar<double>("epsFact_mu");
1631 double sigma = args.scalar<double>("sigma");
1632 double rho_0 = args.scalar<double>("rho_0");
1633 double nu_0 = args.scalar<double>("nu_0");
1634 double rho_1 = args.scalar<double>("rho_1");
1635 double nu_1 = args.scalar<double>("nu_1");
1636 double smagorinskyConstant = args.scalar<double>("smagorinskyConstant");
1637 int turbulenceClosureModel = args.scalar<int>("turbulenceClosureModel");
1638 double Ct_sge = args.scalar<double>("Ct_sge");
1639 double Cd_sge = args.scalar<double>("Cd_sge");
1640 double C_dc = args.scalar<double>("C_dc");
1641 double C_b = args.scalar<double>("C_b");
1642 const xt::pyarray<double>& eps_solid = args.array<double>("eps_solid");
1643 const xt::pyarray<double>& ebq_global_phi_solid = args.array<double>("ebq_global_phi_solid");
1644 const xt::pyarray<double>& ebq_global_grad_phi_solid = args.array<double>("ebq_global_grad_phi_solid");
1645 const xt::pyarray<double>& ebq_particle_velocity_solid = args.array<double>("ebq_particle_velocity_solid");
1646 xt::pyarray<double>& phi_solid_nodes = args.array<double>("phi_solid_nodes");
1647 xt::pyarray<double>& phi_solid = args.array<double>("phi_solid");
1648 const xt::pyarray<double>& q_velocity_solid = args.array<double>("q_velocity_solid");
1649 const xt::pyarray<double>& q_velocityStar_solid = args.array<double>("q_velocityStar_solid");
1650 const xt::pyarray<double>& q_vos = args.array<double>("q_vos");
1651 const xt::pyarray<double>& q_dvos_dt = args.array<double>("q_dvos_dt");
1652 const xt::pyarray<double>& q_grad_vos = args.array<double>("q_grad_vos");
1653 const xt::pyarray<double>& q_dragAlpha = args.array<double>("q_dragAlpha");
1654 const xt::pyarray<double>& q_dragBeta = args.array<double>("q_dragBeta");
1655 const xt::pyarray<double>& q_mass_source = args.array<double>("q_mass_source");
1656 const xt::pyarray<double>& q_turb_var_0 = args.array<double>("q_turb_var_0");
1657 const xt::pyarray<double>& q_turb_var_1 = args.array<double>("q_turb_var_1");
1658 const xt::pyarray<double>& q_turb_var_grad_0 = args.array<double>("q_turb_var_grad_0");
1659 xt::pyarray<double>& q_eddy_viscosity = args.array<double>("q_eddy_viscosity");
1660 xt::pyarray<int>& p_l2g = args.array<int>("p_l2g");
1661 xt::pyarray<int>& vel_l2g = args.array<int>("vel_l2g");
1662 xt::pyarray<double>& p_dof = args.array<double>("p_dof");
1663 xt::pyarray<double>& u_dof = args.array<double>("u_dof");
1664 xt::pyarray<double>& v_dof = args.array<double>("v_dof");
1665 xt::pyarray<double>& w_dof = args.array<double>("w_dof");
1666 xt::pyarray<double>& u_dof_old = args.array<double>("u_dof_old");
1667 xt::pyarray<double>& v_dof_old = args.array<double>("v_dof_old");
1668 xt::pyarray<double>& w_dof_old = args.array<double>("w_dof_old");
1669 xt::pyarray<double>& u_dof_old_old = args.array<double>("u_dof_old_old");
1670 xt::pyarray<double>& v_dof_old_old = args.array<double>("v_dof_old_old");
1671 xt::pyarray<double>& w_dof_old_old = args.array<double>("w_dof_old_old");
1672 xt::pyarray<double>& uStar_dof = args.array<double>("uStar_dof");
1673 xt::pyarray<double>& vStar_dof = args.array<double>("vStar_dof");
1674 xt::pyarray<double>& wStar_dof = args.array<double>("wStar_dof");
1675 xt::pyarray<double>& g = args.array<double>("g");
1676 const double useVF = args.scalar<double>("useVF");
1677 xt::pyarray<double>& vf = args.array<double>("vf");
1678 xt::pyarray<double>& phi = args.array<double>("phi");
1679 xt::pyarray<double>& phi_dof = args.array<double>("phi_dof");
1680 xt::pyarray<double>& normal_phi = args.array<double>("normal_phi");
1681 xt::pyarray<double>& kappa_phi = args.array<double>("kappa_phi");
1682 xt::pyarray<double>& q_mom_u_acc = args.array<double>("q_mom_u_acc");
1683 xt::pyarray<double>& q_mom_v_acc = args.array<double>("q_mom_v_acc");
1684 xt::pyarray<double>& q_mom_w_acc = args.array<double>("q_mom_w_acc");
1685 xt::pyarray<double>& q_mass_adv = args.array<double>("q_mass_adv");
1686 xt::pyarray<double>& q_mom_u_acc_beta_bdf = args.array<double>("q_mom_u_acc_beta_bdf");
1687 xt::pyarray<double>& q_mom_v_acc_beta_bdf = args.array<double>("q_mom_v_acc_beta_bdf");
1688 xt::pyarray<double>& q_mom_w_acc_beta_bdf = args.array<double>("q_mom_w_acc_beta_bdf");
1689 xt::pyarray<double>& q_dV = args.array<double>("q_dV");
1690 xt::pyarray<double>& q_dV_last = args.array<double>("q_dV_last");
1691 xt::pyarray<double>& q_velocity_sge = args.array<double>("q_velocity_sge");
1692 xt::pyarray<double>& ebqe_velocity_star = args.array<double>("ebqe_velocity_star");
1693 xt::pyarray<double>& q_cfl = args.array<double>("q_cfl");
1694 xt::pyarray<double>& q_numDiff_u = args.array<double>("q_numDiff_u");
1695 xt::pyarray<double>& q_numDiff_v = args.array<double>("q_numDiff_v");
1696 xt::pyarray<double>& q_numDiff_w = args.array<double>("q_numDiff_w");
1697 xt::pyarray<double>& q_numDiff_u_last = args.array<double>("q_numDiff_u_last");
1698 xt::pyarray<double>& q_numDiff_v_last = args.array<double>("q_numDiff_v_last");
1699 xt::pyarray<double>& q_numDiff_w_last = args.array<double>("q_numDiff_w_last");
1700 xt::pyarray<int>& sdInfo_u_u_rowptr = args.array<int>("sdInfo_u_u_rowptr");
1701 xt::pyarray<int>& sdInfo_u_u_colind = args.array<int>("sdInfo_u_u_colind");
1702 xt::pyarray<int>& sdInfo_u_v_rowptr = args.array<int>("sdInfo_u_v_rowptr");
1703 xt::pyarray<int>& sdInfo_u_v_colind = args.array<int>("sdInfo_u_v_colind");
1704 xt::pyarray<int>& sdInfo_u_w_rowptr = args.array<int>("sdInfo_u_w_rowptr");
1705 xt::pyarray<int>& sdInfo_u_w_colind = args.array<int>("sdInfo_u_w_colind");
1706 xt::pyarray<int>& sdInfo_v_v_rowptr = args.array<int>("sdInfo_v_v_rowptr");
1707 xt::pyarray<int>& sdInfo_v_v_colind = args.array<int>("sdInfo_v_v_colind");
1708 xt::pyarray<int>& sdInfo_v_u_rowptr = args.array<int>("sdInfo_v_u_rowptr");
1709 xt::pyarray<int>& sdInfo_v_u_colind = args.array<int>("sdInfo_v_u_colind");
1710 xt::pyarray<int>& sdInfo_v_w_rowptr = args.array<int>("sdInfo_v_w_rowptr");
1711 xt::pyarray<int>& sdInfo_v_w_colind = args.array<int>("sdInfo_v_w_colind");
1712 xt::pyarray<int>& sdInfo_w_w_rowptr = args.array<int>("sdInfo_w_w_rowptr");
1713 xt::pyarray<int>& sdInfo_w_w_colind = args.array<int>("sdInfo_w_w_colind");
1714 xt::pyarray<int>& sdInfo_w_u_rowptr = args.array<int>("sdInfo_w_u_rowptr");
1715 xt::pyarray<int>& sdInfo_w_u_colind = args.array<int>("sdInfo_w_u_colind");
1716 xt::pyarray<int>& sdInfo_w_v_rowptr = args.array<int>("sdInfo_w_v_rowptr");
1717 xt::pyarray<int>& sdInfo_w_v_colind = args.array<int>("sdInfo_w_v_colind");
1718 int offset_p = args.scalar<int>("offset_p");
1719 int offset_u = args.scalar<int>("offset_u");
1720 int offset_v = args.scalar<int>("offset_v");
1721 int offset_w = args.scalar<int>("offset_w");
1722 int stride_p = args.scalar<int>("stride_p");
1723 int stride_u = args.scalar<int>("stride_u");
1724 int stride_v = args.scalar<int>("stride_v");
1725 int stride_w = args.scalar<int>("stride_w");
1726 xt::pyarray<double>& globalResidual = args.array<double>("globalResidual");
1727 int nExteriorElementBoundaries_global = args.scalar<int>("nExteriorElementBoundaries_global");
1728 xt::pyarray<int>& exteriorElementBoundariesArray = args.array<int>("exteriorElementBoundariesArray");
1729 xt::pyarray<int>& elementBoundariesArray = args.array<int>("elementBoundariesArray");
1730 xt::pyarray<int>& elementBoundaryElementsArray = args.array<int>("elementBoundaryElementsArray");
1731 xt::pyarray<int>& elementBoundaryLocalElementBoundariesArray = args.array<int>("elementBoundaryLocalElementBoundariesArray");
1732 xt::pyarray<double>& ebqe_vf_ext = args.array<double>("ebqe_vf_ext");
1733 xt::pyarray<double>& bc_ebqe_vf_ext = args.array<double>("bc_ebqe_vf_ext");
1734 xt::pyarray<double>& ebqe_phi_ext = args.array<double>("ebqe_phi_ext");
1735 xt::pyarray<double>& bc_ebqe_phi_ext = args.array<double>("bc_ebqe_phi_ext");
1736 xt::pyarray<double>& ebqe_normal_phi_ext = args.array<double>("ebqe_normal_phi_ext");
1737 xt::pyarray<double>& ebqe_kappa_phi_ext = args.array<double>("ebqe_kappa_phi_ext");
1738 const xt::pyarray<double>& ebqe_vos_ext = args.array<double>("ebqe_vos_ext");
1739 const xt::pyarray<double>& ebqe_turb_var_0 = args.array<double>("ebqe_turb_var_0");
1740 const xt::pyarray<double>& ebqe_turb_var_1 = args.array<double>("ebqe_turb_var_1");
1741 xt::pyarray<int>& isDOFBoundary_p = args.array<int>("isDOFBoundary_p");
1742 xt::pyarray<int>& isDOFBoundary_u = args.array<int>("isDOFBoundary_u");
1743 xt::pyarray<int>& isDOFBoundary_v = args.array<int>("isDOFBoundary_v");
1744 xt::pyarray<int>& isDOFBoundary_w = args.array<int>("isDOFBoundary_w");
1745 xt::pyarray<int>& isAdvectiveFluxBoundary_p = args.array<int>("isAdvectiveFluxBoundary_p");
1746 xt::pyarray<int>& isAdvectiveFluxBoundary_u = args.array<int>("isAdvectiveFluxBoundary_u");
1747 xt::pyarray<int>& isAdvectiveFluxBoundary_v = args.array<int>("isAdvectiveFluxBoundary_v");
1748 xt::pyarray<int>& isAdvectiveFluxBoundary_w = args.array<int>("isAdvectiveFluxBoundary_w");
1749 xt::pyarray<int>& isDiffusiveFluxBoundary_u = args.array<int>("isDiffusiveFluxBoundary_u");
1750 xt::pyarray<int>& isDiffusiveFluxBoundary_v = args.array<int>("isDiffusiveFluxBoundary_v");
1751 xt::pyarray<int>& isDiffusiveFluxBoundary_w = args.array<int>("isDiffusiveFluxBoundary_w");
1752 xt::pyarray<double>& ebqe_bc_p_ext = args.array<double>("ebqe_bc_p_ext");
1753 xt::pyarray<double>& ebqe_bc_flux_mass_ext = args.array<double>("ebqe_bc_flux_mass_ext");
1754 xt::pyarray<double>& ebqe_bc_flux_mom_u_adv_ext = args.array<double>("ebqe_bc_flux_mom_u_adv_ext");
1755 xt::pyarray<double>& ebqe_bc_flux_mom_v_adv_ext = args.array<double>("ebqe_bc_flux_mom_v_adv_ext");
1756 xt::pyarray<double>& ebqe_bc_flux_mom_w_adv_ext = args.array<double>("ebqe_bc_flux_mom_w_adv_ext");
1757 xt::pyarray<double>& ebqe_bc_u_ext = args.array<double>("ebqe_bc_u_ext");
1758 xt::pyarray<double>& ebqe_bc_flux_u_diff_ext = args.array<double>("ebqe_bc_flux_u_diff_ext");
1759 xt::pyarray<double>& ebqe_penalty_ext = args.array<double>("ebqe_penalty_ext");
1760 xt::pyarray<double>& ebqe_bc_v_ext = args.array<double>("ebqe_bc_v_ext");
1761 xt::pyarray<double>& ebqe_bc_flux_v_diff_ext = args.array<double>("ebqe_bc_flux_v_diff_ext");
1762 xt::pyarray<double>& ebqe_bc_w_ext = args.array<double>("ebqe_bc_w_ext");
1763 xt::pyarray<double>& ebqe_bc_flux_w_diff_ext = args.array<double>("ebqe_bc_flux_w_diff_ext");
1764 xt::pyarray<double>& q_x = args.array<double>("q_x");
1765 xt::pyarray<double>& q_velocity = args.array<double>("q_velocity");
1766 xt::pyarray<double>& ebqe_velocity = args.array<double>("ebqe_velocity");
1767 xt::pyarray<double>& q_grad_u = args.array<double>("q_grad_u");
1768 xt::pyarray<double>& q_grad_v = args.array<double>("q_grad_v");
1769 xt::pyarray<double>& q_grad_w = args.array<double>("q_grad_w");
1770 xt::pyarray<double>& q_divU = args.array<double>("q_divU");
1771 xt::pyarray<double>& ebqe_grad_u = args.array<double>("ebqe_grad_u");
1772 xt::pyarray<double>& ebqe_grad_v = args.array<double>("ebqe_grad_v");
1773 xt::pyarray<double>& ebqe_grad_w = args.array<double>("ebqe_grad_w");
1774 xt::pyarray<double>& flux = args.array<double>("flux");
1775 xt::pyarray<double>& elementResidual_p_save = args.array<double>("elementResidual_p_save");
1776 xt::pyarray<int>& elementFlags = args.array<int>("elementFlags");
1777 xt::pyarray<int>& boundaryFlags = args.array<int>("boundaryFlags");
1778 xt::pyarray<double>& barycenters = args.array<double>("barycenters");
1779 xt::pyarray<double>& wettedAreas = args.array<double>("wettedAreas");
1780 xt::pyarray<double>& netForces_p = args.array<double>("netForces_p");
1781 xt::pyarray<double>& netForces_v = args.array<double>("netForces_v");
1782 xt::pyarray<double>& netMoments = args.array<double>("netMoments");
1783 xt::pyarray<double>& q_rho = args.array<double>("q_rho");
1784 xt::pyarray<double>& ebqe_rho = args.array<double>("ebqe_rho");
1785 xt::pyarray<double>& q_nu = args.array<double>("q_nu");
1786 xt::pyarray<double>& ebqe_nu = args.array<double>("ebqe_nu");
1787 int nParticles = args.scalar<int>("nParticles");
1788 double particle_epsFact = args.scalar<double>("particle_epsFact");
1789 double particle_alpha = args.scalar<double>("particle_alpha");
1790 double particle_beta = args.scalar<double>("particle_beta");
1791 double particle_penalty_constant = args.scalar<double>("particle_penalty_constant");
1792 xt::pyarray<double>& particle_signed_distances = args.array<double>("particle_signed_distances");
1793 xt::pyarray<double>& particle_signed_distance_normals = args.array<double>("particle_signed_distance_normals");
1794 xt::pyarray<double>& particle_velocities = args.array<double>("particle_velocities");
1795 xt::pyarray<double>& particle_centroids = args.array<double>("particle_centroids");
1796 xt::pyarray<double>& particle_netForces = args.array<double>("particle_netForces");
1797 xt::pyarray<double>& particle_netMoments = args.array<double>("particle_netMoments");
1798 xt::pyarray<double>& particle_surfaceArea = args.array<double>("particle_surfaceArea");
1799 double particle_nitsche = args.scalar<double>("particle_nitsche");
1800 int use_ball_as_particle = args.scalar<int>("use_ball_as_particle");
1801 xt::pyarray<double>& ball_center = args.array<double>("ball_center");
1802 xt::pyarray<double>& ball_radius = args.array<double>("ball_radius");
1803 xt::pyarray<double>& ball_velocity = args.array<double>("ball_velocity");
1804 xt::pyarray<double>& ball_angular_velocity = args.array<double>("ball_angular_velocity");
1805 xt::pyarray<double>& phisError = args.array<double>("phisError");
1806 xt::pyarray<double>& phisErrorNodal = args.array<double>("phisErrorNodal");
1807 int USE_SUPG = args.scalar<int>("USE_SUPG");
1808 int ARTIFICIAL_VISCOSITY = args.scalar<int>("ARTIFICIAL_VISCOSITY");
1809 double cMax = args.scalar<double>("cMax");
1810 double cE = args.scalar<double>("cE");
1811 int MULTIPLY_EXTERNAL_FORCE_BY_DENSITY = args.scalar<int>("MULTIPLY_EXTERNAL_FORCE_BY_DENSITY");
1812 xt::pyarray<double>& forcex = args.array<double>("forcex");
1813 xt::pyarray<double>& forcey = args.array<double>("forcey");
1814 xt::pyarray<double>& forcez = args.array<double>("forcez");
1815 int KILL_PRESSURE_TERM = args.scalar<int>("KILL_PRESSURE_TERM");
1816 double dt = args.scalar<double>("dt");
1817 xt::pyarray<double>& quantDOFs = args.array<double>("quantDOFs");
1818 int MATERIAL_PARAMETERS_AS_FUNCTION = args.scalar<int>("MATERIAL_PARAMETERS_AS_FUNCTION");
1819 xt::pyarray<double>& density_as_function = args.array<double>("density_as_function");
1820 xt::pyarray<double>& dynamic_viscosity_as_function = args.array<double>("dynamic_viscosity_as_function");
1821 xt::pyarray<double>& ebqe_density_as_function = args.array<double>("ebqe_density_as_function");
1822 xt::pyarray<double>& ebqe_dynamic_viscosity_as_function = args.array<double>("ebqe_dynamic_viscosity_as_function");
1823 double order_polynomial = args.scalar<double>("order_polynomial");
1824 xt::pyarray<double>& isActiveDOF = args.array<double>("isActiveDOF");
1825 int USE_SBM = args.scalar<int>("USE_SBM");
1826 xt::pyarray<double>& ncDrag = args.array<double>("ncDrag");
1827 xt::pyarray<double>& betaDrag = args.array<double>("betaDrag");
1828 xt::pyarray<double>& vos_vel_nodes = args.array<double>("vos_vel_nodes");
1829 xt::pyarray<double>& entropyResidualPerNode = args.array<double>("entropyResidualPerNode");
1830 xt::pyarray<double>& laggedEntropyResidualPerNode = args.array<double>("laggedEntropyResidualPerNode");
1831 xt::pyarray<double>& uStar_dMatrix = args.array<double>("uStar_dMatrix");
1832 xt::pyarray<double>& vStar_dMatrix = args.array<double>("vStar_dMatrix");
1833 xt::pyarray<double>& wStar_dMatrix = args.array<double>("wStar_dMatrix");
1834 int numDOFs_1D = args.scalar<int>("numDOFs_1D");
1835 int NNZ_1D = args.scalar<int>("NNZ_1D");
1836 xt::pyarray<int>& csrRowIndeces_1D = args.array<int>("csrRowIndeces_1D");
1837 xt::pyarray<int>& csrColumnOffsets_1D = args.array<int>("csrColumnOffsets_1D");
1838 xt::pyarray<int>& rowptr_1D = args.array<int>("rowptr_1D");
1839 xt::pyarray<int>& colind_1D = args.array<int>("colind_1D");
1840 xt::pyarray<double>& isBoundary_1D = args.array<double>("isBoundary_1D");
1841 int INT_BY_PARTS_PRESSURE = args.scalar<int>("INT_BY_PARTS_PRESSURE");
1842 gf.useExact=useExact;
1843 gf_s.useExact=useExact;
1844 surrogate_boundaries.clear();
1847 double cut_cell_boundary_length=0.0, p_force_x=0.0, p_force_y=0.0;
1848 double element_uStar_He[nElements_global], element_vStar_He[nElements_global];
1849 uStar_hi.resize(numDOFs_1D,0.0);
1850 vStar_hi.resize(numDOFs_1D,0.0);
1851 den_hi.resize(numDOFs_1D,0.0);
1852 uStar_min_hiHe.resize(numDOFs_1D,0.0);
1853 vStar_min_hiHe.resize(numDOFs_1D,0.0);
1854 uStar_gamma.resize(numDOFs_1D,0.0);
1855 vStar_gamma.resize(numDOFs_1D,0.0);
1856 TransportMatrix.resize(NNZ_1D,0.0);
1857 TransposeTransportMatrix.resize(NNZ_1D,0.0);
1858 uStar_psi.resize(numDOFs_1D,0.0);
1859 vStar_psi.resize(numDOFs_1D,0.0);
1860
1861 if (ARTIFICIAL_VISCOSITY==3 || ARTIFICIAL_VISCOSITY==4)
1862 {
1863 if (TransportMatrix.size() != NNZ_1D)
1864 TransportMatrix.resize(NNZ_1D);
1865 if (TransposeTransportMatrix.size() != NNZ_1D)
1866 TransposeTransportMatrix.resize(NNZ_1D);
1867 if (psi.size() != numDOFs_1D)
1868 psi.resize(numDOFs_1D);
1869 for (int i=0; i<NNZ_1D; i++)
1870 {
1871 uStar_dMatrix[i]=0.;
1872 vStar_dMatrix[i]=0.;
1873 TransportMatrix[i] = 0.;
1875 }
1876 for (int i=0; i<numDOFs_1D; i++)
1877 {
1878 uStar_min_hiHe[i] = 1E100;
1879 vStar_min_hiHe[i] = 1E100;
1880 entropyResidualPerNode[i]=0.;
1881 uStar_hi[i] = 0.;
1882 vStar_hi[i] = 0.;
1883 den_hi[i] = 0.;
1884 }
1885 }
1886
1887 //
1888 //loop over elements to compute volume integrals and load them into element and global residual
1889 //
1890 double mesh_volume_conservation=0.0,
1891 mesh_volume_conservation_weak=0.0,
1892 mesh_volume_conservation_err_max=0.0,
1893 mesh_volume_conservation_err_max_weak=0.0;
1894 double globalConservationError=0.0;
1895 const int nQuadraturePoints_global(nElements_global*nQuadraturePoints_element);
1896 for(int eN=0;eN<nElements_global;eN++)
1897 {
1898 double elementTransport[nDOF_test_element][nDOF_trial_element];
1899 double elementTransposeTransport[nDOF_test_element][nDOF_trial_element];
1900 //declare local storage for element residual and initialize
1901 double elementResidual_p[nDOF_test_element],elementResidual_mesh[nDOF_test_element],
1902 elementResidual_u[nDOF_test_element],
1903 elementResidual_v[nDOF_test_element],
1904 mom_u_source_i[nDOF_test_element],
1905 mom_v_source_i[nDOF_test_element],
1906 betaDrag_i[nDOF_test_element],
1907 vos_i[nDOF_test_element],
1908 phisErrorElement[nDOF_test_element],
1909 //elementResidual_w[nDOF_test_element],
1910 elementEntropyResidual[nDOF_test_element],
1911 eps_rho,eps_mu;
1912 //const double* elementResidual_w(NULL);
1913 double element_active=1.0;//use 1 since by default it is ibm
1914 double mesh_volume_conservation_element=0.0,
1915 mesh_volume_conservation_element_weak=0.0;
1916 // for entropy viscosity
1917 double linVisc_eN = 0, nlinVisc_eN_num = 0, nlinVisc_eN_den = 0;
1918 // for hessians of uStar
1919 double det_hess_uStar_Ke=0.0, det_hess_vStar_Ke=0.0, area_Ke=0.0;
1920 for (int i=0;i<nDOF_test_element;i++)
1921 {
1922 int eN_i = eN*nDOF_test_element+i;
1923 elementResidual_p_save[eN_i]=0.0;
1924 elementResidual_mesh[i]=0.0;
1925 elementResidual_p[i]=0.0;
1926 elementResidual_u[i]=0.0;
1927 elementResidual_v[i]=0.0;
1928 mom_u_source_i[i]=0.0;
1929 mom_v_source_i[i]=0.0;
1930 betaDrag_i[i]=0.0;
1931 vos_i[i]=0.0;
1932 phisErrorElement[i]=0.0;
1933 /* elementResidual_w[i]=0.0; */
1934 elementEntropyResidual[i]=0.0;
1935 if (ARTIFICIAL_VISCOSITY==3 || ARTIFICIAL_VISCOSITY==4)
1936 {
1937 for (int j=0;j<nDOF_trial_element;j++)
1938 {
1939 elementTransport[i][j]=0.0;
1940 elementTransposeTransport[i][j]=0.0;
1941 }
1942 }
1943 }//i
1944 //Use for plotting result
1945 if(use_ball_as_particle==1)
1946 {
1947 for (int I=0;I<nDOF_mesh_trial_element;I++)
1948 get_distance_to_ball(nParticles, ball_center.data(), ball_radius.data(),
1949 mesh_dof[3*mesh_l2g[eN*nDOF_mesh_trial_element+I]+0],
1950 mesh_dof[3*mesh_l2g[eN*nDOF_mesh_trial_element+I]+1],
1951 mesh_dof[3*mesh_l2g[eN*nDOF_mesh_trial_element+I]+2],
1952 phi_solid_nodes[mesh_l2g[eN*nDOF_mesh_trial_element+I]]);
1953 }
1954 if(CUT_CELL_INTEGRATION > 0)
1955 {
1956 //
1957 //detect cut cells, for unfitted fem we want all cells cut by phi=0 or with phi=0 lying on any boundary
1958 //
1959 double _distance[nDOF_mesh_trial_element]={0.0};
1960 int pos_counter=0;
1961 for (int I=0;I<nDOF_mesh_trial_element;I++)
1962 {
1963 if(use_ball_as_particle==1)
1964 {
1965 get_distance_to_ball(nParticles, ball_center.data(), ball_radius.data(),
1966 mesh_dof[3*mesh_l2g[eN*nDOF_mesh_trial_element+I]+0],
1967 mesh_dof[3*mesh_l2g[eN*nDOF_mesh_trial_element+I]+1],
1968 mesh_dof[3*mesh_l2g[eN*nDOF_mesh_trial_element+I]+2],
1969 _distance[I]);
1970 }
1971 else
1972 {
1973 _distance[I] = phi_solid_nodes[mesh_l2g[eN*nDOF_mesh_trial_element+I]];
1974 }
1975 if ( _distance[I] > 0)//fully in fluid
1976 pos_counter++;
1977 }
1978 if (pos_counter == 3)
1979 {
1980 element_active = 1.0;
1981 }
1982 else if (pos_counter == 0)
1983 {
1984 element_active = 1.0;
1985 }
1986 else
1987 {
1988 element_active = 1.0;//for now leave all elements active
1989 //P1 interpolation operator; only 2D for now
1990 double GI[6*3];//3 DOF to 6DOF for linear interpolation onto 4T refinement
1991 double sub_mesh_dof[6*3], sub_u_dof[15], sub_v_dof[15], sub_phi_dof[6], sub_p_dof[6];//6 3D points
1992 int boundaryNodes[6] = {0,0,0,0,0,0};
1993 std::vector<int> ls_nodes;
1994 for (int I=0;I<nDOF_mesh_trial_element;I++)
1995 {
1996 for (int K=0;K<nDOF_mesh_trial_element;K++)
1997 {
1998 GI[I*3+K] = 0.0;
1999 if (I==K)
2000 {
2001 GI[I*3+K] = 1.0;
2002 }
2003 }
2004 const double eps = 1.0e-4;
2005 double delta_phi=0.0,theta;
2006 delta_phi = _distance[(I+1)%3] - _distance[I];
2007 if (fabs(delta_phi) > eps)//level sets are not parallel to edge
2008 //need tolerance selection guidance
2009 {
2010 theta = -_distance[I]/delta_phi;//zero level set is at theta*xIp1+(1-theta)*xI
2011 if (theta > 1.0-eps || theta < eps)//zero level does NOT intersect between nodes; it may got through a node
2012 {
2013 if (theta > 1.0-eps && theta <= 1.0)//
2014 {
2015 ls_nodes.push_back((I+1)%3);
2016 //todo, fix connectivity for this case--can't use 4T
2017 assert(false);
2018 }
2019 else if (theta > 0.0 && theta < eps)//
2020 {
2021 ls_nodes.push_back(I);
2022 assert(false);
2023 }
2024 else
2025 theta = 0.5;//just put the subelement node at midpoint
2026 }
2027 else
2028 {
2029 boundaryNodes[3+I]=1;
2030 ls_nodes.push_back(3+I);
2031 }
2032 }
2033 else //level set lies on edge
2034 {
2035 theta = 0.5;
2036 if (fabs(_distance[I]) <= eps) //edge IS the zero level set
2037 {
2038 boundaryNodes[I]=1;
2039 boundaryNodes[3+I]=1;
2040 boundaryNodes[(I+1)%3]=1;
2041 ls_nodes.push_back(I);
2042 ls_nodes.push_back((I+1)%3);
2043 }
2044 }
2045 assert(theta <= 1.0);
2046 GI[3*3 + I*3 + I] = 1.0-theta;
2047 GI[3*3 + I*3 + (I+1)%3] = theta;
2048 GI[3*3 + I*3 + (I+2)%3] = 0.0;
2049 }
2050 if (ls_nodes.size() != 2)
2051 {
2052 std::cout<<"level set nodes not 2 "<<ls_nodes.size()<<std::endl;
2053 for(int i=0;i<ls_nodes.size();i++)
2054 std::cout<<ls_nodes[i]<<std::endl;
2055 std::sort(ls_nodes.begin(),ls_nodes.end());
2056 }
2057 int sub_mesh_l2g[12] = {0,3,5,
2058 1,4,3,
2059 2,5,4,
2060 3,4,5};
2061 for (int I=0; I<6; I++)
2062 {
2063 sub_phi_dof[I] = 0.0;
2064 sub_p_dof[I] = 0.0;
2065 for (int K=0; K<3; K++)
2066 sub_mesh_dof[I*3+K] = 0.0;
2067 for (int J=0; J<3; J++)
2068 {
2069 for (int K=0; K<3; K++)
2070 {
2071 sub_mesh_dof[I*3+K] += GI[I*3+J]*mesh_dof[3*mesh_l2g[eN*nDOF_mesh_trial_element+J]+K];
2072 }
2073 sub_phi_dof[I] += GI[I*3+J]*phi_solid_nodes[mesh_l2g[eN*nDOF_mesh_trial_element+J]];
2074 sub_p_dof[I] += GI[I*3+J]*p_dof[p_l2g[eN*nDOF_per_element_pressure+J]];
2075 }
2076 }
2077 int L = ls_nodes[0], R=ls_nodes[1];
2078 double DX=sub_mesh_dof[L*3+0] - sub_mesh_dof[R*3+0];
2079 double DY=sub_mesh_dof[L*3+1] - sub_mesh_dof[R*3+1];
2080 double DS = std::sqrt(DX*DX+DY*DY);
2081 double nx = -DY/DS, ny = DX/DS;
2082 double nxL,nyL,nxR,nyR;
2083 get_normal_to_ith_ball(nParticles,ball_center.data(),ball_radius.data(),
2084 0,
2085 sub_mesh_dof[L*3+0],sub_mesh_dof[L*3+1],0.0,
2086 nxL,nyL);
2087 get_normal_to_ith_ball(nParticles,ball_center.data(),ball_radius.data(),
2088 0,
2089 sub_mesh_dof[R*3+0],sub_mesh_dof[R*3+1],0.0,
2090 nxR,nyR);
2091 //std::cout<<"dot L "<<nx_tmp*nxL+ny_tmp*nyL<<std::endl;
2092 //std::cout<<"dot R "<<nx_tmp*nxR+ny_tmp*nyR<<std::endl;
2093 double n_fluid_sign = -sgn(nx*0.5*(nxL+nxR)+ny*0.5*(nyL+nyR));
2094 nx*=n_fluid_sign;
2095 ny*=n_fluid_sign;
2096 //double dot_test=std::fabs(nx_tmp*nx+ny_tmp*ny);
2097 //assert(dot_test > 1.0-1.0e-4 && dot_test < 1.0 + 1.0e-4);
2098 cut_cell_boundary_length += DS;
2099 p_force_x += sub_p_dof[L]*nx*0.5*DS + sub_p_dof[R]*nx*0.5*DS;
2100 p_force_y += sub_p_dof[L]*ny*0.5*DS + sub_p_dof[R]*ny*0.5*DS;
2101 //TODO for P2
2102 //1. Now define the Lagrange nodes for P2 on the submesh X
2103 //2. Define and evaluate the P2 trial functions for the parent element at the new submesh P2 nodes. X
2104 //3. Form the G2I interpolation operator X
2105 //4. Interpolate the P2 DOF from the parent element to the submesh DOF X
2106 double G2I[15*6];//6 DOF to 15 DOF for quadratic interpolation onto 4T refinement
2107 double lagrangeNodes[9*3];//9 new quadratic nodes in addition to the 6 we have
2108 for (int K=0;K<3;K++)
2109 {
2110 lagrangeNodes[0*3+K] = 0.5*(sub_mesh_dof[0*3+K] + sub_mesh_dof[3*3+0*3+K]);
2111 lagrangeNodes[1*3+K] = 0.5*(sub_mesh_dof[1*3+K] + sub_mesh_dof[3*3+0*3+K]);
2112 lagrangeNodes[2*3+K] = 0.5*(sub_mesh_dof[1*3+K] + sub_mesh_dof[3*3+1*3+K]);
2113 lagrangeNodes[3*3+K] = 0.5*(sub_mesh_dof[2*3+K] + sub_mesh_dof[3*3+1*3+K]);
2114 lagrangeNodes[4*3+K] = 0.5*(sub_mesh_dof[2*3+K] + sub_mesh_dof[3*3+2*3+K]);
2115 lagrangeNodes[5*3+K] = 0.5*(sub_mesh_dof[0*3+K] + sub_mesh_dof[3*3+2*3+K]);
2116 lagrangeNodes[6*3+K] = 0.5*(sub_mesh_dof[3*3+0*3+K] + sub_mesh_dof[3*3+1*3+K]);
2117 lagrangeNodes[7*3+K] = 0.5*(sub_mesh_dof[3*3+1*3+K] + sub_mesh_dof[3*3+2*3+K]);
2118 lagrangeNodes[8*3+K] = 0.5*(sub_mesh_dof[3*3+2*3+K] + sub_mesh_dof[3*3+0*3+K]);
2119 }
2120 double lambda[3];
2121 for (int I=0;I<6;I++)
2122 {
2123 baryCoords(&sub_mesh_dof[0],&sub_mesh_dof[1*3],&sub_mesh_dof[2*3],&sub_mesh_dof[I*3],lambda);
2124 //std::cout<<"lambda"<<'\t'<<lambda[0]<<'\t'<<lambda[1]<<'\t'<<lambda[2]<<std::endl;
2125 G2I[I*6+0] = lambda[0]*(2.0*lambda[0] - 1.0);
2126 G2I[I*6+1] = lambda[1]*(2.0*lambda[1] - 1.0);
2127 G2I[I*6+2] = lambda[2]*(2.0*lambda[2] - 1.0);
2128 G2I[I*6+3] = 4.0*lambda[0]*lambda[1];
2129 G2I[I*6+4] = 4.0*lambda[1]*lambda[2];
2130 G2I[I*6+5] = 4.0*lambda[2]*lambda[0];
2131 }
2132 for (int I=0;I<9;I++)
2133 {
2134 baryCoords(&sub_mesh_dof[0],&sub_mesh_dof[1*3],&sub_mesh_dof[2*3],&lagrangeNodes[I*3],lambda);
2135 G2I[6*6 + I*6 + 0] = lambda[0]*(2.0*lambda[0] - 1.0);
2136 G2I[6*6 + I*6 + 1] = lambda[1]*(2.0*lambda[1] - 1.0);
2137 G2I[6*6 + I*6 + 2] = lambda[2]*(2.0*lambda[2] - 1.0);
2138 G2I[6*6 + I*6 + 3] = 4.0*lambda[0]*lambda[1];
2139 G2I[6*6 + I*6 + 4] = 4.0*lambda[1]*lambda[2];
2140 G2I[6*6 + I*6 + 5] = 4.0*lambda[2]*lambda[0];
2141 }
2142 for (int I=0; I<15; I++)
2143 {
2144 sub_u_dof[I] = 0.0;
2145 sub_v_dof[I] = 0.0;
2146 for (int J=0; J<6; J++)
2147 {
2148 sub_u_dof[I] += G2I[I*6+J]*u_dof[vel_l2g[eN*nDOF_trial_element+J]];
2149 sub_v_dof[I] += G2I[I*6+J]*v_dof[vel_l2g[eN*nDOF_trial_element+J]];
2150 }
2151 }
2152 for (int esN=0;esN<4;esN++)
2153 {
2154 std::cout<<sub_mesh_l2g[esN*3]<<'\t'<<sub_mesh_l2g[esN*3+1]<<'\t'<<sub_mesh_l2g[esN*3+2]<<std::endl;
2155 }
2156 for (int I=0; I<6; I++)
2157 {
2158 std::cout<<sub_mesh_dof[I*3+0]<<'\t'<<sub_mesh_dof[I*3+1]<<'\t'<<sub_mesh_dof[I*3+2]<<'\t'<<boundaryNodes[I]<<'\t'<<sub_phi_dof[I]<<'\t'<<sub_p_dof[I]<<'\t'<<sub_u_dof[I]<<'\t'<<sub_v_dof[I]<<'\t'<<G2I[I*6+0]<<'\t'<<G2I[I*6+1]<<'\t'<<G2I[I*6+2]<<'\t'<<G2I[I*6+3]<<'\t'<<G2I[I*6+4]<<'\t'<<G2I[I*6+5]<<std::endl;
2159 }
2160 }
2161 }
2162 if(USE_SBM>0)
2163 {
2164 //
2165 //detect cut cells
2166 //
2167 double _distance[nDOF_mesh_trial_element]={0.0};
2168 int pos_counter=0;
2169 for (int I=0;I<nDOF_mesh_trial_element;I++)
2170 {
2171 if(use_ball_as_particle==1)
2172 {
2173 get_distance_to_ball(nParticles, ball_center.data(), ball_radius.data(),
2174 mesh_dof[3*mesh_l2g[eN*nDOF_mesh_trial_element+I]+0],
2175 mesh_dof[3*mesh_l2g[eN*nDOF_mesh_trial_element+I]+1],
2176 mesh_dof[3*mesh_l2g[eN*nDOF_mesh_trial_element+I]+2],
2177 _distance[I]);
2178 }
2179 else
2180 {
2181 _distance[I] = phi_solid_nodes[mesh_l2g[eN*nDOF_mesh_trial_element+I]];
2182 }
2183 if ( _distance[I] >= 0)
2184 pos_counter++;
2185 }
2186 if (pos_counter == 2)
2187 {
2188 element_active=0.0;
2189 int opp_node=-1;
2190 for (int I=0;I<nDOF_mesh_trial_element;I++)
2191 {
2192 // quantDOFs[vel_l2g[eN*nDOF_trial_element + I]] = 2.0;//for test
2193 if (_distance[I] < 0)
2194 {
2195 opp_node = I;
2196 // quantDOFs[vel_l2g[eN*nDOF_trial_element + I]] = 1.0;//for test
2197 }
2198 }
2199 assert(opp_node >=0);
2200 assert(opp_node <nDOF_mesh_trial_element);
2201 //For parallel. Two reasons:
2202 //if none of nodes of this edge is owned by this processor,
2203 //1. The surrogate_boundary_elements corresponding to this edge is -1, which gives 0 JacDet and infty h_penalty.
2204 //2. there is no contribution of the integral over this edge to Jacobian and residual.
2205 const int ebN = elementBoundariesArray[eN*nDOF_mesh_trial_element+opp_node];//only works for simplices
2206 const int eN_oppo = (eN == elementBoundaryElementsArray[ebN*2+0])?elementBoundaryElementsArray[ebN*2+1]:elementBoundaryElementsArray[ebN*2+0];
2207 if((mesh_l2g[eN*nDOF_mesh_trial_element+(opp_node+1)%3]<nNodes_owned
2208 || mesh_l2g[eN*nDOF_mesh_trial_element+(opp_node+2)%3]<nNodes_owned)
2209 && eN_oppo!= -1)
2210 {
2211 surrogate_boundaries.push_back(ebN);
2212 //now find which element neighbor this element is
2213 //YY: what if this face is a boundary face?
2214 if (eN == elementBoundaryElementsArray[ebN*2+0])//should be ebN
2215 surrogate_boundary_elements.push_back(1);
2216 else
2217 surrogate_boundary_elements.push_back(0);
2218
2219 //check which particle this surrogate edge is related to.
2220 int j=-1;
2221 if(use_ball_as_particle==1)
2222 {
2223 double middle_point_coord[3]={0.0};
2224 double middle_point_distance;
2225 middle_point_coord[0] = 0.5*(mesh_dof[3*mesh_l2g[eN*nDOF_mesh_trial_element+(opp_node+1)%3]+0]+mesh_dof[3*mesh_l2g[eN*nDOF_mesh_trial_element+(opp_node+2)%3]+0]);
2226 middle_point_coord[1] = 0.5*(mesh_dof[3*mesh_l2g[eN*nDOF_mesh_trial_element+(opp_node+1)%3]+1]+mesh_dof[3*mesh_l2g[eN*nDOF_mesh_trial_element+(opp_node+2)%3]+1]);
2227 j = get_distance_to_ball(nParticles, ball_center.data(), ball_radius.data(),
2228 middle_point_coord[0],middle_point_coord[1],middle_point_coord[2],
2229 middle_point_distance);
2230
2231 }
2232 else
2233 {
2234 //The method is to check one quadrature point inside of this element.
2235 //It works based on the assumption that the distance between any two particles
2236 //is larger than 2*h_min, otherwise it depends on the choice of the quadrature point
2237 //or one edge belongs to two particles .
2238 //But in any case, phi_s is well defined as the minimum.
2239 double distance=1e10, distance_to_ith_particle;
2240 for (int i=0;i<nParticles;++i)
2241 {
2242 distance_to_ith_particle=particle_signed_distances[i*nElements_global*nQuadraturePoints_element
2243 +eN*nQuadraturePoints_element
2244 +0];//0-th quadrature point
2245 if (distance_to_ith_particle<distance)
2246 {
2247 distance = distance_to_ith_particle;
2248 j = i;
2249 }
2250 }
2251 }
2252 surrogate_boundary_particle.push_back(j);
2253 }else{
2254 //If the integral over the surrogate boundary is needed, we have to make sure all edges are in surrogate_boundaries,
2255 //which is based on the assumption that if none of its nodes is owned by the processor, then the edge is not owned
2256 //by the processor. This assert is used to make sure this is the case.
2257 if(ebN<nElementBoundaries_owned)//eN_oppo ==-1
2258 {
2259 assert(eN_oppo==-1);
2260 }
2261 }
2262 }
2263 else if (pos_counter == 3)
2264 {
2265 element_active=1.0;
2266 for (int i=0;i<nDOF_test_element;i++)
2267 {
2268 isActiveDOF[offset_u+stride_u*vel_l2g[eN*nDOF_trial_element + i]]=1.0;
2269 isActiveDOF[offset_v+stride_v*vel_l2g[eN*nDOF_trial_element + i]]=1.0;
2270 }
2271 }
2272 else
2273 {
2274 element_active=0.0;
2275 }
2276 }
2277 double element_phi[nDOF_mesh_trial_element], element_phi_s[nDOF_mesh_trial_element];
2278 for (int j=0;j<nDOF_mesh_trial_element;j++)
2279 {
2280 int eN_j = eN*nDOF_mesh_trial_element+j;
2281 element_phi[j] = phi_dof[p_l2g[eN_j]];
2282 element_phi_s[j] = phi_solid_nodes[p_l2g[eN_j]];
2283 }
2284 double element_nodes[nDOF_mesh_trial_element*3];
2285 for (int i=0;i<nDOF_mesh_trial_element;i++)
2286 {
2287 int eN_i=eN*nDOF_mesh_trial_element+i;
2288 for(int I=0;I<3;I++)
2289 element_nodes[i*3 + I] = mesh_dof[mesh_l2g[eN_i]*3 + I];
2290 }//i
2291 gf_s.calculate(element_phi_s, element_nodes, x_ref.data(), false);
2292 gf.calculate(element_phi, element_nodes, x_ref.data(), false);
2293 //
2294 //loop over quadrature points and compute integrands
2295 //
2296 for(int k=0;k<nQuadraturePoints_element;k++)
2297 {
2298 gf.set_quad(k);
2299 gf_s.set_quad(k);
2300 //compute indices and declare local storage
2301 int eN_k = eN*nQuadraturePoints_element+k,
2302 eN_k_nSpace = eN_k*nSpace,
2303 eN_k_3d = eN_k*3,
2304 eN_nDOF_trial_element = eN*nDOF_trial_element;
2305 double p=0.0,u=0.0,v=0.0,w=0.0,un=0.0,vn=0.0,wn=0.0,
2306 grad_p[nSpace],grad_u[nSpace],grad_v[nSpace],grad_w[nSpace],
2307 hess_u[nSpace2],hess_v[nSpace2],
2308 mom_u_acc=0.0,
2309 dmom_u_acc_u=0.0,
2310 mom_v_acc=0.0,
2311 dmom_v_acc_v=0.0,
2312 mom_w_acc=0.0,
2313 dmom_w_acc_w=0.0,
2314 mass_adv[nSpace],
2315 dmass_adv_u[nSpace],
2316 dmass_adv_v[nSpace],
2317 dmass_adv_w[nSpace],
2318 mom_u_adv[nSpace],
2319 dmom_u_adv_u[nSpace],
2320 dmom_u_adv_v[nSpace],
2321 dmom_u_adv_w[nSpace],
2322 mom_v_adv[nSpace],
2323 dmom_v_adv_u[nSpace],
2324 dmom_v_adv_v[nSpace],
2325 dmom_v_adv_w[nSpace],
2326 mom_w_adv[nSpace],
2327 dmom_w_adv_u[nSpace],
2328 dmom_w_adv_v[nSpace],
2329 dmom_w_adv_w[nSpace],
2330 mom_uu_diff_ten[nSpace],
2331 mom_vv_diff_ten[nSpace],
2332 mom_ww_diff_ten[nSpace],
2333 mom_uv_diff_ten[1],
2334 mom_uw_diff_ten[1],
2335 mom_vu_diff_ten[1],
2336 mom_vw_diff_ten[1],
2337 mom_wu_diff_ten[1],
2338 mom_wv_diff_ten[1],
2339 mom_u_source=0.0,
2340 mom_v_source=0.0,
2341 mom_w_source=0.0,
2342 mom_u_ham=0.0,
2343 dmom_u_ham_grad_p[nSpace],
2344 dmom_u_ham_grad_u[nSpace],
2345 mom_v_ham=0.0,
2346 dmom_v_ham_grad_p[nSpace],
2347 dmom_v_ham_grad_v[nSpace],
2348 mom_w_ham=0.0,
2349 dmom_w_ham_grad_p[nSpace],
2350 dmom_w_ham_grad_w[nSpace],
2351 mom_u_acc_t=0.0,
2352 dmom_u_acc_u_t=0.0,
2353 mom_v_acc_t=0.0,
2354 dmom_v_acc_v_t=0.0,
2355 mom_w_acc_t=0.0,
2356 dmom_w_acc_w_t=0.0,
2357 pdeResidual_p=0.0,
2358 pdeResidual_u=0.0,
2359 pdeResidual_v=0.0,
2360 pdeResidual_w=0.0,
2361 Lstar_u_p[nDOF_test_element],
2362 Lstar_v_p[nDOF_test_element],
2363 Lstar_w_p[nDOF_test_element],
2364 Lstar_u_u[nDOF_test_element],
2365 Lstar_v_v[nDOF_test_element],
2366 Lstar_w_w[nDOF_test_element],
2367 Lstar_p_u[nDOF_test_element],
2368 Lstar_p_v[nDOF_test_element],
2369 Lstar_p_w[nDOF_test_element],
2370 subgridError_p=0.0,
2371 subgridError_u=0.0,
2372 subgridError_v=0.0,
2373 subgridError_w=0.0,
2374 tau_p=0.0,tau_p0=0.0,tau_p1=0.0,
2375 tau_v=0.0,tau_v0=0.0,tau_v1=0.0,
2376 jac[nSpace*nSpace],
2377 jacDet,
2378 jacInv[nSpace*nSpace],
2379 p_grad_trial[nDOF_trial_element*nSpace],vel_grad_trial[nDOF_trial_element*nSpace],
2380 vel_hess_trial[nDOF_trial_element*nSpace2],
2381 p_test_dV[nDOF_trial_element],vel_test_dV[nDOF_trial_element],
2382 p_grad_test_dV[nDOF_test_element*nSpace],vel_grad_test_dV[nDOF_test_element*nSpace],
2383 u_times_vel_grad_test_dV[nDOF_test_element*nSpace], // For entropy residual
2384 v_times_vel_grad_test_dV[nDOF_test_element*nSpace], // For entropy residual
2385 dV,x,y,z,xt,yt,zt,
2386 //
2387 porosity,
2388 //meanGrainSize,
2389 mass_source,
2390 dmom_u_source[nSpace],
2391 dmom_v_source[nSpace],
2392 dmom_w_source[nSpace],
2393 //
2394 velStar[nSpace], hess_uStar[nSpace2], hess_vStar[nSpace2],
2395 //
2396 G[nSpace*nSpace],G_dd_G,tr_G,norm_Rv,h_phi, dmom_adv_star[nSpace],dmom_adv_sge[nSpace];
2397 //get jacobian, etc for mapping reference element
2398 ck.calculateMapping_element(eN,
2399 k,
2400 mesh_dof.data(),
2401 mesh_l2g.data(),
2402 mesh_trial_ref.data(),
2403 mesh_grad_trial_ref.data(),
2404 jac,
2405 jacDet,
2406 jacInv,
2407 x,y,z);
2408 ck.calculateH_element(eN,
2409 k,
2410 nodeDiametersArray.data(),
2411 mesh_l2g.data(),
2412 mesh_trial_ref.data(),
2413 h_phi);
2414 ck.calculateMappingVelocity_element(eN,
2415 k,
2416 mesh_velocity_dof.data(),
2417 mesh_l2g.data(),
2418 mesh_trial_ref.data(),
2419 xt,yt,zt);
2420 //xt=0.0;yt=0.0;zt=0.0;
2421 //std::cout<<"xt "<<xt<<'\t'<<yt<<'\t'<<zt<<std::endl;
2422 //get the physical integration weight
2423 dV = fabs(jacDet)*dV_ref[k];
2424 ck.calculateG(jacInv,G,G_dd_G,tr_G);
2425 //ck.calculateGScale(G,&normal_phi[eN_k_nSpace],h_phi);
2426
2427 eps_rho = epsFact_rho*(useMetrics*h_phi+(1.0-useMetrics)*elementDiameter[eN]);
2428 eps_mu = epsFact_mu *(useMetrics*h_phi+(1.0-useMetrics)*elementDiameter[eN]);
2429 double particle_eps = particle_epsFact*(useMetrics*h_phi+(1.0-useMetrics)*elementDiameter[eN]);
2430
2431 //get the trial function gradients
2432 /* ck.gradTrialFromRef(&p_grad_trial_ref[k*nDOF_trial_element*nSpace],jacInv,p_grad_trial); */
2433 ck.gradTrialFromRef(&vel_grad_trial_ref[k*nDOF_trial_element*nSpace],jacInv,vel_grad_trial);
2434 ck.hessTrialFromRef(&vel_hess_trial_ref[k*nDOF_trial_element*nSpace2],jacInv,vel_hess_trial);
2435 //get the solution
2436 /* ck.valFromDOF(p_dof,&p_l2g[eN_nDOF_trial_element],&p_trial_ref[k*nDOF_trial_element],p); */
2437 p = q_p[eN_k];
2438 // get solution at quad points
2439 ck.valFromDOF(u_dof.data(),&vel_l2g[eN_nDOF_trial_element],&vel_trial_ref[k*nDOF_trial_element],u);
2440 ck.valFromDOF(v_dof.data(),&vel_l2g[eN_nDOF_trial_element],&vel_trial_ref[k*nDOF_trial_element],v);
2441 /* ck.valFromDOF(w_dof,&vel_l2g[eN_nDOF_trial_element],&vel_trial_ref[k*nDOF_trial_element],w); */
2442 // get old solution at quad points
2443 ck.valFromDOF(u_dof_old.data(),&vel_l2g[eN_nDOF_trial_element],&vel_trial_ref[k*nDOF_trial_element],un);
2444 ck.valFromDOF(v_dof_old.data(),&vel_l2g[eN_nDOF_trial_element],&vel_trial_ref[k*nDOF_trial_element],vn);
2445 /* ck.valFromDOF(w_dof_old,&vel_l2g[eN_nDOF_trial_element],&vel_trial_ref[k*nDOF_trial_element],wn); */
2446 //get the solution gradients
2447 /* ck.gradFromDOF(p_dof,&p_l2g[eN_nDOF_trial_element],p_grad_trial,grad_p); */
2448 for (int I=0;I<nSpace;I++)
2449 grad_p[I] = q_grad_p[eN_k_nSpace + I];
2450 ck.gradFromDOF(u_dof.data(),&vel_l2g[eN_nDOF_trial_element],vel_grad_trial,grad_u);
2451 ck.gradFromDOF(v_dof.data(),&vel_l2g[eN_nDOF_trial_element],vel_grad_trial,grad_v);
2452 ck.hessFromDOF(u_dof.data(),&vel_l2g[eN_nDOF_trial_element],vel_hess_trial,hess_u);
2453 ck.hessFromDOF(v_dof.data(),&vel_l2g[eN_nDOF_trial_element],vel_hess_trial,hess_v);
2454 ck.hessFromDOF(uStar_dof.data(),&vel_l2g[eN_nDOF_trial_element],vel_hess_trial,hess_uStar);
2455 ck.hessFromDOF(vStar_dof.data(),&vel_l2g[eN_nDOF_trial_element],vel_hess_trial,hess_vStar);
2456 /* ck.gradFromDOF(w_dof,&vel_l2g[eN_nDOF_trial_element],vel_grad_trial,grad_w); */
2457 //precalculate test function products with integration weights
2458 for (int j=0;j<nDOF_trial_element;j++)
2459 {
2460 /* p_test_dV[j] = p_test_ref[k*nDOF_trial_element+j]*dV; */
2461 vel_test_dV[j] = vel_test_ref[k*nDOF_trial_element+j]*dV;
2462 for (int I=0;I<nSpace;I++)
2463 {
2464 /* p_grad_test_dV[j*nSpace+I] = p_grad_trial[j*nSpace+I]*dV;//cek warning won't work for Petrov-Galerkin */
2465 vel_grad_test_dV[j*nSpace+I] = vel_grad_trial[j*nSpace+I]*dV;//cek warning won't work for Petrov-Galerkin
2466 if (ARTIFICIAL_VISCOSITY==4)
2467 {
2468 // mql: for entropy residual. grad(u*phi) and grad(v*phi)
2469 u_times_vel_grad_test_dV[j*nSpace+I] =
2470 u*vel_grad_trial[j*nSpace+I]*dV + vel_test_dV[j]*grad_u[I];
2471 v_times_vel_grad_test_dV[j*nSpace+I] =
2472 v*vel_grad_trial[j*nSpace+I]*dV + vel_test_dV[j]*grad_v[I];
2473 /*w_times_vel_grad_test_dV[j*nSpace+I] =
2474 w*vel_grad_trial[j*nSpace+I]*dV + vel_test_dV[j]*grad_w[I];*/
2475 }
2476 }
2477 }
2478 // compute determinant of Hessians
2479 if (ARTIFICIAL_VISCOSITY==3)
2480 {
2481 det_hess_uStar_Ke += (hess_uStar[0]*hess_uStar[3] - hess_uStar[2]*hess_uStar[1])*dV;
2482 det_hess_vStar_Ke += (hess_vStar[0]*hess_vStar[3] - hess_vStar[2]*hess_vStar[1])*dV;
2483 area_Ke += dV;
2484 }
2485 //cek hack
2486 double div_mesh_velocity=0.0;
2487 int NDOF_MESH_TRIAL_ELEMENT=3;
2488 for (int j=0;j<NDOF_MESH_TRIAL_ELEMENT;j++)
2489 {
2490 int eN_j=eN*NDOF_MESH_TRIAL_ELEMENT+j;
2491 div_mesh_velocity +=
2492 mesh_velocity_dof[mesh_l2g[eN_j]*3+0]*vel_grad_trial[j*nSpace+0] +
2493 mesh_velocity_dof[mesh_l2g[eN_j]*3+1]*vel_grad_trial[j*nSpace+1];
2494 }
2495 mesh_volume_conservation_element += (alphaBDF*(dV-q_dV_last[eN_k])/dV - div_mesh_velocity)*dV;
2496 div_mesh_velocity = DM3*div_mesh_velocity + (1.0-DM3)*alphaBDF*(dV-q_dV_last[eN_k])/dV;
2497 //VRANS
2498 porosity = 1.0 - q_vos[eN_k];
2499 //meanGrainSize = q_meanGrain[eN_k];
2500 //
2501 q_x[eN_k_3d+0]=x;
2502 q_x[eN_k_3d+1]=y;
2503 /* q_x[eN_k_3d+2]=z; */
2504 //
2505 //calculate pde coefficients at quadrature points
2506 //
2507 double distance_to_omega_solid = 1e10;
2508 if(use_ball_as_particle==1)
2509 {
2510 get_distance_to_ball(nParticles, ball_center.data(), ball_radius.data(),
2511 x,y,z,
2512 distance_to_omega_solid);
2513 }
2514 else
2515 {
2516 for (int i = 0; i < nParticles; i++)
2517 {
2518 double distance_to_i_th_solid = particle_signed_distances[i * nElements_global * nQuadraturePoints_element + eN_k];
2519 distance_to_omega_solid = (distance_to_i_th_solid < distance_to_omega_solid)?distance_to_i_th_solid:distance_to_omega_solid;
2520 }
2521 }
2522 phi_solid[eN_k] = distance_to_omega_solid;//save it
2523 //
2524 //calculate pde coefficients at quadrature points
2525 //
2526 evaluateCoefficients(eps_rho,
2527 eps_mu,
2528 particle_eps,
2529 sigma,
2530 rho_0,
2531 nu_0,
2532 rho_1,
2533 nu_1,
2534 elementDiameter[eN],
2535 smagorinskyConstant,
2536 turbulenceClosureModel,
2537 g.data(),
2538 useVF,
2539 vf[eN_k],
2540 phi[eN_k],
2541 &normal_phi[eN_k_nSpace],
2542 distance_to_omega_solid,
2543 kappa_phi[eN_k],
2544 //VRANS
2545 porosity,
2546 //
2547 p,
2548 grad_p,
2549 grad_u,
2550 grad_v,
2551 grad_w,
2552 u,
2553 v,
2554 w,
2555 q_velocity_sge[eN_k_nSpace+0],
2556 q_velocity_sge[eN_k_nSpace+1],
2557 q_velocity_sge[eN_k_nSpace+1],//hack, shouldn't be used
2558 q_eddy_viscosity[eN_k],
2559 mom_u_acc,
2560 dmom_u_acc_u,
2561 mom_v_acc,
2562 dmom_v_acc_v,
2563 mom_w_acc,
2564 dmom_w_acc_w,
2565 mass_adv,
2566 dmass_adv_u,
2567 dmass_adv_v,
2568 dmass_adv_w,
2569 mom_u_adv,
2570 dmom_u_adv_u,
2571 dmom_u_adv_v,
2572 dmom_u_adv_w,
2573 mom_v_adv,
2574 dmom_v_adv_u,
2575 dmom_v_adv_v,
2576 dmom_v_adv_w,
2577 mom_w_adv,
2578 dmom_w_adv_u,
2579 dmom_w_adv_v,
2580 dmom_w_adv_w,
2581 mom_uu_diff_ten,
2582 mom_vv_diff_ten,
2583 mom_ww_diff_ten,
2584 mom_uv_diff_ten,
2585 mom_uw_diff_ten,
2586 mom_vu_diff_ten,
2587 mom_vw_diff_ten,
2588 mom_wu_diff_ten,
2589 mom_wv_diff_ten,
2590 mom_u_source,
2591 mom_v_source,
2592 mom_w_source,
2593 mom_u_ham,
2594 dmom_u_ham_grad_p,
2595 dmom_u_ham_grad_u,
2596 mom_v_ham,
2597 dmom_v_ham_grad_p,
2598 dmom_v_ham_grad_v,
2599 mom_w_ham,
2600 dmom_w_ham_grad_p,
2601 dmom_w_ham_grad_w,
2602 q_rho[eN_k],
2603 q_nu[eN_k],
2604 KILL_PRESSURE_TERM,
2605 MULTIPLY_EXTERNAL_FORCE_BY_DENSITY,
2606 forcex[eN_k],
2607 forcey[eN_k],
2608 forcez[eN_k],
2609 MATERIAL_PARAMETERS_AS_FUNCTION,
2610 density_as_function[eN_k],
2611 dynamic_viscosity_as_function[eN_k],
2612 USE_SBM,
2613 x,y,z,
2614 use_ball_as_particle,
2615 ball_center.data(),
2616 ball_radius.data(),
2617 ball_velocity.data(),
2618 ball_angular_velocity.data(),
2619 INT_BY_PARTS_PRESSURE);
2620
2621 //VRANS
2622 mass_source = q_mass_source[eN_k];
2623 for (int I=0;I<nSpace;I++)
2624 {
2625 dmom_u_source[I] = 0.0;
2626 dmom_v_source[I] = 0.0;
2627 dmom_w_source[I] = 0.0;
2628 }
2630 q_dragAlpha[eN_k],
2631 q_dragBeta[eN_k],
2632 eps_rho,
2633 eps_mu,
2634 rho_0,
2635 nu_0,
2636 rho_1,
2637 nu_1,
2638 q_eddy_viscosity[eN_k],
2639 useVF,
2640 vf[eN_k],
2641 phi[eN_k],
2642 u,
2643 v,
2644 w,
2645 q_velocity_sge[eN_k_nSpace+0],
2646 q_velocity_sge[eN_k_nSpace+1],
2647 q_velocity_sge[eN_k_nSpace+1],//hack, shouldn't be used
2648 eps_solid[elementFlags[eN]],
2649 porosity,
2650 q_velocity_solid[eN_k_nSpace+0],
2651 q_velocity_solid[eN_k_nSpace+1],
2652 q_velocity_solid[eN_k_nSpace+1],//cek hack, should not be used
2653 q_velocityStar_solid[eN_k_nSpace+0],
2654 q_velocityStar_solid[eN_k_nSpace+1],
2655 q_velocityStar_solid[eN_k_nSpace+1],//cek hack, should not be used
2656 mom_u_source,
2657 mom_v_source,
2658 mom_w_source,
2659 dmom_u_source,
2660 dmom_v_source,
2661 dmom_w_source,
2662 q_grad_vos[eN_k_nSpace+0],
2663 q_grad_vos[eN_k_nSpace+1],
2664 q_grad_vos[eN_k_nSpace+1]);
2665 double C_particles=0.0;
2666 if(nParticles > 0 && USE_SBM==0)
2667 updateSolidParticleTerms(eN < nElements_owned,
2668 particle_nitsche,
2669 dV,
2670 nParticles,
2671 nQuadraturePoints_global,
2672 &particle_signed_distances[eN_k],
2673 &particle_signed_distance_normals[eN_k_3d],
2674 &particle_velocities[eN_k_3d],
2675 particle_centroids.data(),
2676 use_ball_as_particle,
2677 ball_center.data(),
2678 ball_radius.data(),
2679 ball_velocity.data(),
2680 ball_angular_velocity.data(),
2681 porosity,
2682 particle_penalty_constant/h_phi,
2683 particle_alpha/h_phi,
2684 particle_beta/h_phi,
2685 eps_rho,
2686 eps_mu,
2687 rho_0,
2688 nu_0,
2689 rho_1,
2690 nu_1,
2691 useVF,
2692 vf[eN_k],
2693 phi[eN_k],
2694 x,
2695 y,
2696 z,
2697 p,
2698 u,
2699 v,
2700 w,
2701 q_velocity_sge[eN_k_nSpace+0],
2702 q_velocity_sge[eN_k_nSpace+1],
2703 q_velocity_sge[eN_k_nSpace+1],
2704 particle_eps,
2705 grad_u,
2706 grad_v,
2707 grad_w,
2708 mom_u_source,
2709 mom_v_source,
2710 mom_w_source,
2711 dmom_u_source,
2712 dmom_v_source,
2713 dmom_w_source,
2714 mom_u_adv,
2715 mom_v_adv,
2716 mom_w_adv,
2717 dmom_u_adv_u,
2718 dmom_v_adv_v,
2719 dmom_w_adv_w,
2720 mom_u_ham,
2721 dmom_u_ham_grad_u,
2722 mom_v_ham,
2723 dmom_v_ham_grad_v,
2724 mom_w_ham,
2725 dmom_w_ham_grad_w,
2726 particle_netForces.data(),
2727 particle_netMoments.data(),
2728 particle_surfaceArea.data());
2729 if(USE_SBM==2)
2730 compute_force_around_solid(eN < nElements_owned,
2731 dV,
2732 nParticles,
2733 nQuadraturePoints_global,
2734 &particle_signed_distances[eN_k],
2735 &particle_signed_distance_normals[eN_k_3d],
2736 &particle_velocities[eN_k_3d],
2737 particle_centroids.data(),
2738 use_ball_as_particle,
2739 ball_center.data(),
2740 ball_radius.data(),
2741 ball_velocity.data(),
2742 ball_angular_velocity.data(),
2743 particle_penalty_constant/h_phi,
2744 particle_alpha/h_phi,
2745 particle_beta/h_phi,
2746 eps_rho,
2747 eps_mu,
2748 rho_0,
2749 nu_0,
2750 rho_1,
2751 nu_1,
2752 useVF,
2753 vf[eN_k],
2754 phi[eN_k],
2755 x,
2756 y,
2757 z,
2758 p,
2759 u,
2760 v,
2761 w,
2762 q_velocity_sge[eN_k_nSpace+0],
2763 q_velocity_sge[eN_k_nSpace+1],
2764 q_velocity_sge[eN_k_nSpace+1],
2765 particle_eps,
2766 grad_u,
2767 grad_v,
2768 grad_w,
2769 particle_netForces.data(),
2770 particle_netMoments.data());
2771 //Turbulence closure model
2772 if (turbulenceClosureModel >= 3)
2773 {
2774 const double c_mu = 0.09;//mwf hack
2775 updateTurbulenceClosure(turbulenceClosureModel,
2776 eps_rho,
2777 eps_mu,
2778 rho_0,
2779 nu_0,
2780 rho_1,
2781 nu_1,
2782 useVF,
2783 vf[eN_k],
2784 phi[eN_k],
2785 porosity,
2786 c_mu, //mwf hack
2787 q_turb_var_0[eN_k],
2788 q_turb_var_1[eN_k],
2789 &q_turb_var_grad_0[eN_k_nSpace],
2790 q_eddy_viscosity[eN_k],
2791 mom_uu_diff_ten,
2792 mom_vv_diff_ten,
2793 mom_ww_diff_ten,
2794 mom_uv_diff_ten,
2795 mom_uw_diff_ten,
2796 mom_vu_diff_ten,
2797 mom_vw_diff_ten,
2798 mom_wu_diff_ten,
2799 mom_wv_diff_ten,
2800 mom_u_source,
2801 mom_v_source,
2802 mom_w_source);
2803
2804 }
2805 //
2806 //save momentum for time history and velocity for subgrid error
2807 //
2808 q_mom_u_acc[eN_k] = mom_u_acc;
2809 q_mom_v_acc[eN_k] = mom_v_acc;
2810 /* q_mom_w_acc[eN_k] = mom_w_acc; */
2811 //subgrid error uses grid scale velocity
2812 q_mass_adv[eN_k_nSpace+0] = u;
2813 q_mass_adv[eN_k_nSpace+1] = v;
2814 /* q_mass_adv[eN_k_nSpace+2] = w; */
2815 //
2816 //moving mesh
2817 //
2818 mom_u_adv[0] -= MOVING_DOMAIN*dmom_u_acc_u*mom_u_acc*xt; // multiply by rho*porosity. mql. CHECK.
2819 mom_u_adv[1] -= MOVING_DOMAIN*dmom_u_acc_u*mom_u_acc*yt;
2820 /* mom_u_adv[2] -= MOVING_DOMAIN*dmom_u_acc_u*mom_u_acc*zt; */
2821 dmom_u_adv_u[0] -= MOVING_DOMAIN*dmom_u_acc_u*xt;
2822 dmom_u_adv_u[1] -= MOVING_DOMAIN*dmom_u_acc_u*yt;
2823 /* dmom_u_adv_u[2] -= MOVING_DOMAIN*dmom_u_acc_u*zt; */
2824
2825 mom_v_adv[0] -= MOVING_DOMAIN*dmom_v_acc_v*mom_v_acc*xt;
2826 mom_v_adv[1] -= MOVING_DOMAIN*dmom_v_acc_v*mom_v_acc*yt;
2827 /* mom_v_adv[2] -= MOVING_DOMAIN*dmom_v_acc_v*mom_v_acc*zt; */
2828 dmom_v_adv_v[0] -= MOVING_DOMAIN*dmom_v_acc_v*xt;
2829 dmom_v_adv_v[1] -= MOVING_DOMAIN*dmom_v_acc_v*yt;
2830 /* dmom_v_adv_v[2] -= MOVING_DOMAIN*dmom_v_acc_v*zt; */
2831
2832 /* mom_w_adv[0] -= MOVING_DOMAIN*dmom_w_acc_w*mom_w_acc*xt; */
2833 /* mom_w_adv[1] -= MOVING_DOMAIN*dmom_w_acc_w*mom_w_acc*yt; */
2834 /* mom_w_adv[2] -= MOVING_DOMAIN*dmom_w_acc_w*mom_w_acc*zt; */
2835 /* dmom_w_adv_w[0] -= MOVING_DOMAIN*dmom_w_acc_w*xt; */
2836 /* dmom_w_adv_w[1] -= MOVING_DOMAIN*dmom_w_acc_w*yt; */
2837 /* dmom_w_adv_w[2] -= MOVING_DOMAIN*dmom_w_acc_w*zt; */
2838 //
2839 //calculate time derivative at quadrature points
2840 //
2841 if (q_dV_last[eN_k] <= -100)
2842 q_dV_last[eN_k] = dV;
2843 q_dV[eN_k] = dV;
2844 ck.bdf(alphaBDF,
2845 q_mom_u_acc_beta_bdf[eN_k]*q_dV_last[eN_k]/dV,
2846 mom_u_acc,
2847 dmom_u_acc_u,
2848 mom_u_acc_t,
2849 dmom_u_acc_u_t);
2850 ck.bdf(alphaBDF,
2851 q_mom_v_acc_beta_bdf[eN_k]*q_dV_last[eN_k]/dV,
2852 mom_v_acc,
2853 dmom_v_acc_v,
2854 mom_v_acc_t,
2855 dmom_v_acc_v_t);
2856
2857 /* ck.bdf(alphaBDF, */
2858 /* q_mom_w_acc_beta_bdf[eN_k]*q_dV_last[eN_k]/dV, */
2859 /* mom_w_acc, */
2860 /* dmom_w_acc_w, */
2861 /* mom_w_acc_t, */
2862 /* dmom_w_acc_w_t); */
2863 /* // */
2864
2865 mom_u_acc_t *= dmom_u_acc_u; //multiply by rho*porosity. mql. CHECK.
2866 mom_v_acc_t *= dmom_v_acc_v;
2867
2868 //calculate subgrid error (strong residual and adjoint)
2869 //
2870 //calculate strong residual
2871 pdeResidual_p =
2872 ck.Mass_strong(-q_dvos_dt[eN_k]) + // mql. CHECK.
2873 ck.Advection_strong(dmass_adv_u,grad_u) +
2874 ck.Advection_strong(dmass_adv_v,grad_v) +
2875 /* ck.Advection_strong(dmass_adv_w,grad_w) + */
2876 DM2*MOVING_DOMAIN*ck.Reaction_strong(alphaBDF*(dV-q_dV_last[eN_k])/dV - div_mesh_velocity) +
2877 //VRANS
2878 ck.Reaction_strong(mass_source);
2879 //
2880
2881 dmom_adv_sge[0] = dmom_u_acc_u*(q_velocity_sge[eN_k_nSpace+0] - MOVING_DOMAIN*xt);
2882 dmom_adv_sge[1] = dmom_u_acc_u*(q_velocity_sge[eN_k_nSpace+1] - MOVING_DOMAIN*yt);
2883 /* dmom_adv_sge[2] = dmom_u_acc_u*(q_velocity_sge[eN_k_nSpace+2] - MOVING_DOMAIN*zt); */
2884
2885 pdeResidual_u =
2886 ck.Mass_strong(mom_u_acc_t) + // mql. CHECK.
2887 ck.Advection_strong(dmom_adv_sge,grad_u) + //note here and below: same in cons. and non-cons.
2888 ck.Hamiltonian_strong(dmom_u_ham_grad_p,grad_p) +
2889 ck.Reaction_strong(mom_u_source) -
2890 ck.Reaction_strong(u*div_mesh_velocity);
2891
2892 pdeResidual_v =
2893 ck.Mass_strong(mom_v_acc_t) +
2894 ck.Advection_strong(dmom_adv_sge,grad_v) +
2895 ck.Hamiltonian_strong(dmom_v_ham_grad_p,grad_p) +
2896 ck.Reaction_strong(mom_v_source) -
2897 ck.Reaction_strong(v*div_mesh_velocity);
2898
2899 /* pdeResidual_w = ck.Mass_strong(dmom_w_acc_w*mom_w_acc_t) + */
2900 /* ck.Advection_strong(dmom_adv_sge,grad_w) + */
2901 /* ck.Hamiltonian_strong(dmom_w_ham_grad_p,grad_p) + */
2902 /* ck.Reaction_strong(mom_w_source) - */
2903 /* ck.Reaction_strong(w*div_mesh_velocity); */
2904
2905 //calculate tau and tau*Res
2906 //cek debug
2907 double tmpR=dmom_u_acc_u_t + dmom_u_source[0];
2909 elementDiameter[eN],
2910 tmpR,//dmom_u_acc_u_t,
2911 dmom_u_acc_u,
2912 dmom_adv_sge,
2913 mom_uu_diff_ten[1],
2914 dmom_u_ham_grad_p[0],
2915 tau_v0,
2916 tau_p0,
2917 q_cfl[eN_k]);
2918
2919 calculateSubgridError_tau(Ct_sge,Cd_sge,
2920 G,G_dd_G,tr_G,
2921 tmpR,//dmom_u_acc_u_t,
2922 dmom_adv_sge,
2923 mom_uu_diff_ten[1],
2924 dmom_u_ham_grad_p[0],
2925 tau_v1,
2926 tau_p1,
2927 q_cfl[eN_k]);
2928
2929 tau_v = useMetrics*tau_v1+(1.0-useMetrics)*tau_v0;
2930 tau_p = KILL_PRESSURE_TERM == 1 ? 0. : PSTAB*(useMetrics*tau_p1+(1.0-useMetrics)*tau_p0);
2931
2933 tau_v,
2934 pdeResidual_p,
2935 pdeResidual_u,
2936 pdeResidual_v,
2937 pdeResidual_w,
2938 subgridError_p,
2939 subgridError_u,
2940 subgridError_v,
2941 subgridError_w);
2942 // velocity used in adjoint (VMS or RBLES, with or without lagging the grid scale velocity)
2943 dmom_adv_star[0] = dmom_u_acc_u*(q_velocity_sge[eN_k_nSpace+0] - MOVING_DOMAIN*xt + useRBLES*subgridError_u);
2944 dmom_adv_star[1] = dmom_u_acc_u*(q_velocity_sge[eN_k_nSpace+1] - MOVING_DOMAIN*yt + useRBLES*subgridError_v);
2945 /* dmom_adv_star[2] = dmom_u_acc_u*(q_velocity_sge[eN_k_nSpace+2] - MOVING_DOMAIN*zt + useRBLES*subgridError_w); */
2946
2947 mom_u_adv[0] += dmom_u_acc_u*(useRBLES*subgridError_u*q_velocity_sge[eN_k_nSpace+0]);
2948 mom_u_adv[1] += dmom_u_acc_u*(useRBLES*subgridError_v*q_velocity_sge[eN_k_nSpace+0]);
2949 /* mom_u_adv[2] += dmom_u_acc_u*(useRBLES*subgridError_w*q_velocity_sge[eN_k_nSpace+0]); */
2950
2951 // adjoint times the test functions
2952 for (int i=0;i<nDOF_test_element;i++)
2953 {
2954 int i_nSpace = i*nSpace;
2955 /* Lstar_u_p[i]=ck.Advection_adjoint(dmass_adv_u,&p_grad_test_dV[i_nSpace]); */
2956 /* Lstar_v_p[i]=ck.Advection_adjoint(dmass_adv_v,&p_grad_test_dV[i_nSpace]); */
2957 /* Lstar_w_p[i]=ck.Advection_adjoint(dmass_adv_w,&p_grad_test_dV[i_nSpace]); */
2958 //use the same advection adjoint for all three since we're approximating the linearized adjoint
2959 Lstar_u_u[i]=ck.Advection_adjoint(dmom_adv_star,&vel_grad_test_dV[i_nSpace]);
2960 Lstar_v_v[i]=ck.Advection_adjoint(dmom_adv_star,&vel_grad_test_dV[i_nSpace]);
2961 /* Lstar_w_w[i]=ck.Advection_adjoint(dmom_adv_star,&vel_grad_test_dV[i_nSpace]); */
2962 Lstar_p_u[i]=ck.Hamiltonian_adjoint(dmom_u_ham_grad_p,&vel_grad_test_dV[i_nSpace]);
2963 Lstar_p_v[i]=ck.Hamiltonian_adjoint(dmom_v_ham_grad_p,&vel_grad_test_dV[i_nSpace]);
2964 /* Lstar_p_w[i]=ck.Hamiltonian_adjoint(dmom_w_ham_grad_p,&vel_grad_test_dV[i_nSpace]); */
2965
2966 //VRANS account for drag terms, diagonal only here ... decide if need off diagonal terms too
2967 Lstar_u_u[i]+=ck.Reaction_adjoint(dmom_u_source[0],vel_test_dV[i]);
2968 Lstar_v_v[i]+=ck.Reaction_adjoint(dmom_v_source[1],vel_test_dV[i]);
2969 /* Lstar_w_w[i]+=ck.Reaction_adjoint(dmom_w_source[2],vel_test_dV[i]); */
2970 //
2971 }
2972
2973 if (ARTIFICIAL_VISCOSITY==0 || ARTIFICIAL_VISCOSITY==3 || ARTIFICIAL_VISCOSITY==4)
2974 {
2975 q_numDiff_u[eN_k] = 0;
2976 q_numDiff_v[eN_k] = 0;
2977 q_numDiff_w[eN_k] = 0;
2978 }
2979 else if (ARTIFICIAL_VISCOSITY==1) // SHOCK CAPTURING
2980 {
2981 norm_Rv = sqrt(pdeResidual_u*pdeResidual_u + pdeResidual_v*pdeResidual_v);// + pdeResidual_w*pdeResidual_w);
2982 q_numDiff_u[eN_k] = C_dc*norm_Rv*(useMetrics/sqrt(G_dd_G+1.0e-12) +
2983 (1.0-useMetrics)*hFactor*hFactor*elementDiameter[eN]*elementDiameter[eN]);
2984 q_numDiff_v[eN_k] = q_numDiff_u[eN_k];
2985 q_numDiff_w[eN_k] = q_numDiff_u[eN_k];
2986 }
2987 else // ARTIFICIAL_VISCOSITY==2; i.e, ENTROPY VISCOSITY
2988 {
2989 double rho = q_rho[eN_k];
2990 double mu = q_rho[eN_k]*q_nu[eN_k];
2991
2992 double vel2 = u*u + v*v;
2993
2994 // entropy residual
2995 double Res_in_x =
2996 porosity*rho*((u-un)/dt + (u*grad_u[0]+v*grad_u[1]) - g[0])
2997 + (KILL_PRESSURE_TERM == 1 ? 0. : 1.)*grad_p[0]
2998 - (MULTIPLY_EXTERNAL_FORCE_BY_DENSITY == 1 ? porosity*rho : 1.0)*forcex[eN_k]
2999 - mu*(hess_u[0] + hess_u[3]) // u_xx + u_yy
3000 - mu*(hess_u[0] + hess_v[2]); // u_xx + v_yx
3001
3002 double Res_in_y =
3003 porosity*rho*((v-vn)/dt + (u*grad_v[0]+v*grad_v[1]) - g[1])
3004 + (KILL_PRESSURE_TERM == 1 ? 0. : 1.)*grad_p[1]
3005 - (MULTIPLY_EXTERNAL_FORCE_BY_DENSITY == 1 ? porosity*rho : 1.0)*forcey[eN_k]
3006 - mu*(hess_v[0] + hess_v[3]) // v_xx + v_yy
3007 - mu*(hess_u[1] + hess_v[3]); // u_xy + v_yy
3008
3009 // compute entropy residual
3010 double entRes_times_u = Res_in_x*u + Res_in_y*v;
3011
3012 double hK = elementDiameter[eN]/order_polynomial;
3013 q_numDiff_u[eN_k] = fmin(cMax*porosity*rho*hK*std::sqrt(vel2),
3014 cE*hK*hK*fabs(entRes_times_u)/(vel2+1E-10));
3015 q_numDiff_v[eN_k] = q_numDiff_u[eN_k];
3016 q_numDiff_w[eN_k] = q_numDiff_u[eN_k];
3017
3019 {
3020 linVisc_eN = fmax(porosity*rho*std::sqrt(vel2),linVisc_eN);
3021 nlinVisc_eN_num = fmax(fabs(entRes_times_u),nlinVisc_eN_num);
3022 nlinVisc_eN_den = fmax(vel2,nlinVisc_eN_den);
3023 }
3024 }
3025
3026 //
3027 //update element residual
3028 //
3029 double mesh_vel[2];
3030 mesh_vel[0] = xt;
3031 mesh_vel[1] = yt;
3032 // Save velocity and its gradient (to be used in other models and to compute errors)
3033 q_velocity[eN_k_nSpace+0]=u;
3034 q_velocity[eN_k_nSpace+1]=v;
3035 /* q_velocity[eN_k_nSpace+2]=w; */
3036 for (int I=0;I<nSpace;I++)
3037 {
3038 q_grad_u[eN_k_nSpace+I] = grad_u[I];
3039 q_grad_v[eN_k_nSpace+I] = grad_v[I];
3040 /* q_grad_w[eN_k_nSpace+I] = grad_w[I]; */
3041 }
3042 // save divergence of velocity
3043 q_divU[eN_k] = q_grad_u[eN_k_nSpace+0] + q_grad_v[eN_k_nSpace+1];
3044
3045 // SURFACE TENSION //
3046 double unit_normal[nSpace];
3047 double norm_grad_phi = 0.;
3048 for (int I=0;I<nSpace;I++)
3049 norm_grad_phi += normal_phi[eN_k_nSpace+I]*normal_phi[eN_k_nSpace+I];
3050 norm_grad_phi = std::sqrt(norm_grad_phi) + 1E-10;
3051 for (int I=0;I<nSpace;I++)
3052 unit_normal[I] = normal_phi[eN_k_nSpace+I]/norm_grad_phi;
3053 // compute auxiliary vectors for explicit term of 2D surf tension
3054 // v1 = [1-nx^2 -nx*ny]^T
3055 double v1[nSpace];
3056 v1[0]=1.-unit_normal[0]*unit_normal[0];
3057 v1[1]=-unit_normal[0]*unit_normal[1];
3058 // v2 = [-nx*ny 1-ny^2]^T
3059 double v2[nSpace];
3060 v2[0]=-unit_normal[0]*unit_normal[1];
3061 v2[1]=1.-unit_normal[1]*unit_normal[1];
3062 double delta = gf.D(eps_mu,phi[eN_k]); //use eps_rho instead?
3063 double vel_tgrad_test_i[nSpace], tgrad_u[nSpace], tgrad_v[nSpace];
3064 calculateTangentialGradient(unit_normal,
3065 grad_u,
3066 tgrad_u);
3067 calculateTangentialGradient(unit_normal,
3068 grad_v,
3069 tgrad_v);
3070 // END OF SURFACE TENSION //
3071
3072 if (ARTIFICIAL_VISCOSITY==3 || ARTIFICIAL_VISCOSITY==4)
3073 {
3074 velStar[0] = q_velocity_sge[eN_k_nSpace+0];
3075 velStar[1] = q_velocity_sge[eN_k_nSpace+1];
3076 /*velStar[2] = q_velocity_sge[eN_k_nSpace+2];*/
3077 }
3078 for(int i=0;i<nDOF_test_element;i++)
3079 {
3080 int i_nSpace=i*nSpace;
3081 calculateTangentialGradient(unit_normal,
3082 &vel_grad_trial[i_nSpace],
3083 vel_tgrad_test_i);
3084 phisErrorElement[i]+=std::abs(phisError[eN_k_nSpace+0])*p_test_dV[i];
3085 /* std::cout<<"elemRes_mesh "<<mesh_vel[0]<<'\t'<<mesh_vel[2]<<'\t'<<p_test_dV[i]<<'\t'<<(q_dV_last[eN_k]/dV)<<'\t'<<dV<<std::endl; */
3086 /* elementResidual_mesh[i] += ck.Reaction_weak(1.0,p_test_dV[i]) - */
3087 /* ck.Reaction_weak(1.0,p_test_dV[i]*q_dV_last[eN_k]/dV) - */
3088 /* ck.Advection_weak(mesh_vel,&p_grad_test_dV[i_nSpace]); */
3089
3090 /* elementResidual_p[i] += ck.Mass_weak(-q_dvos_dt[eN_k],p_test_dV[i]) + */
3091 /* ck.Advection_weak(mass_adv,&p_grad_test_dV[i_nSpace]) + */
3092 /* DM*MOVING_DOMAIN*(ck.Reaction_weak(alphaBDF*1.0,p_test_dV[i]) - */
3093 /* ck.Reaction_weak(alphaBDF*1.0,p_test_dV[i]*q_dV_last[eN_k]/dV) - */
3094 /* ck.Advection_weak(mesh_vel,&p_grad_test_dV[i_nSpace])) + */
3095 /* //VRANS */
3096 /* ck.Reaction_weak(mass_source,p_test_dV[i]) + //VRANS source term for wave maker */
3097 /* // */
3098 /* ck.SubgridError(subgridError_u,Lstar_u_p[i]) + */
3099 /* ck.SubgridError(subgridError_v,Lstar_v_p[i]);// + */
3100 /* /\* ck.SubgridError(subgridError_w,Lstar_w_p[i]); *\/ */
3101
3102 elementResidual_u[i] += // mql. CHECK.
3103 ck.Mass_weak(mom_u_acc_t,vel_test_dV[i]) +
3104 ck.Advection_weak(mom_u_adv,&vel_grad_test_dV[i_nSpace]) +
3105 ck.Diffusion_weak(sdInfo_u_u_rowptr.data(),sdInfo_u_u_colind.data(),mom_uu_diff_ten,grad_u,&vel_grad_test_dV[i_nSpace]) +
3106 ck.Diffusion_weak(sdInfo_u_v_rowptr.data(),sdInfo_u_v_colind.data(),mom_uv_diff_ten,grad_v,&vel_grad_test_dV[i_nSpace]) +
3107 /* ck.Diffusion_weak(sdInfo_u_w_rowptr,sdInfo_u_w_colind,mom_uw_diff_ten,grad_w,&vel_grad_test_dV[i_nSpace]) + */
3108 ck.Reaction_weak(mom_u_source,vel_test_dV[i]) +
3109 ck.Hamiltonian_weak(mom_u_ham,vel_test_dV[i]) +
3110 (INT_BY_PARTS_PRESSURE==1 ? -1.0*p*vel_grad_test_dV[i_nSpace+0] : 0.) +
3111 //ck.SubgridError(subgridError_p,Lstar_p_u[i]) +
3112 USE_SUPG*ck.SubgridError(subgridError_u,Lstar_u_u[i]) +
3113 ck.NumericalDiffusion(q_numDiff_u_last[eN_k],grad_u,&vel_grad_test_dV[i_nSpace]) +
3114 //surface tension
3115 ck.NumericalDiffusion(delta*sigma*dV,v1,vel_tgrad_test_i) + //exp.
3116 ck.NumericalDiffusion(dt*delta*sigma*dV,tgrad_u,vel_tgrad_test_i); //imp.
3117 mom_u_source_i[i] += ck.Reaction_weak(mom_u_source,vel_test_dV[i]);
3118 betaDrag_i[i] += ck.Reaction_weak(dmom_u_source[0],
3119 vel_test_dV[i]);
3120 vos_i[i] += ck.Reaction_weak(1.0-porosity,
3121 vel_test_dV[i]);
3122
3123 elementResidual_v[i] +=
3124 ck.Mass_weak(mom_v_acc_t,vel_test_dV[i]) +
3125 ck.Advection_weak(mom_v_adv,&vel_grad_test_dV[i_nSpace]) +
3126 ck.Diffusion_weak(sdInfo_v_u_rowptr.data(),sdInfo_v_u_colind.data(),mom_vu_diff_ten,grad_u,&vel_grad_test_dV[i_nSpace]) +
3127 ck.Diffusion_weak(sdInfo_v_v_rowptr.data(),sdInfo_v_v_colind.data(),mom_vv_diff_ten,grad_v,&vel_grad_test_dV[i_nSpace]) +
3128 /* ck.Diffusion_weak(sdInfo_v_w_rowptr,sdInfo_v_w_colind,mom_vw_diff_ten,grad_w,&vel_grad_test_dV[i_nSpace]) + */
3129 ck.Reaction_weak(mom_v_source,vel_test_dV[i]) +
3130 ck.Hamiltonian_weak(mom_v_ham,vel_test_dV[i]) +
3131 (INT_BY_PARTS_PRESSURE==1 ? -1.0*p*vel_grad_test_dV[i_nSpace+1] : 0.) +
3132 //ck.SubgridError(subgridError_p,Lstar_p_v[i]) +
3133 USE_SUPG*ck.SubgridError(subgridError_v,Lstar_v_v[i]) +
3134 ck.NumericalDiffusion(q_numDiff_v_last[eN_k],grad_v,&vel_grad_test_dV[i_nSpace]) +
3135 //surface tension
3136 ck.NumericalDiffusion(delta*sigma*dV,v2,vel_tgrad_test_i) + //exp.
3137 ck.NumericalDiffusion(dt*delta*sigma*dV,tgrad_v,vel_tgrad_test_i); //imp.
3138 mom_v_source_i[i] += ck.Reaction_weak(mom_v_source,vel_test_dV[i]);
3139
3140 /* elementResidual_w[i] +=
3141 ck.Mass_weak(mom_w_acc_t,vel_test_dV[i]) + */
3142 /* ck.Advection_weak(mom_w_adv,&vel_grad_test_dV[i_nSpace]) + */
3143 /* ck.Diffusion_weak(sdInfo_w_u_rowptr,sdInfo_w_u_colind,mom_wu_diff_ten,grad_u,&vel_grad_test_dV[i_nSpace]) + */
3144 /* ck.Diffusion_weak(sdInfo_w_v_rowptr,sdInfo_w_v_colind,mom_wv_diff_ten,grad_v,&vel_grad_test_dV[i_nSpace]) + */
3145 /* ck.Diffusion_weak(sdInfo_w_w_rowptr,sdInfo_w_w_colind,mom_ww_diff_ten,grad_w,&vel_grad_test_dV[i_nSpace]) + */
3146 /* ck.Reaction_weak(mom_w_source,vel_test_dV[i]) + */
3147 /* ck.Hamiltonian_weak(mom_w_ham,vel_test_dV[i]) + */
3148 /* (INT_BY_PARTS_PRESSURE==1 ? -1.0*p*vel_grad_test_dV[i_nSpace+2] : 0.) + */
3149 /* ck.SubgridError(subgridError_p,Lstar_p_w[i]) + */
3150 /* ck.SubgridError(subgridError_w,Lstar_w_w[i]) + */
3151 /* ck.NumericalDiffusion(q_numDiff_w_last[eN_k],grad_w,&vel_grad_test_dV[i_nSpace]); */
3152 if (ARTIFICIAL_VISCOSITY==4)
3153 {
3154 // ***** COMPUTE ENTROPY RESIDUAL ***** //
3155 // mql. NOTE that the test functions are weighted by the velocity
3156 elementEntropyResidual[i] +=
3157 // x-component
3158 ck.Mass_weak(mom_u_acc_t,u*vel_test_dV[i]) + // time derivative
3159 ck.Advection_weak(mom_u_adv,&u_times_vel_grad_test_dV[i_nSpace])+//m.mesh
3160 ck.Diffusion_weak(sdInfo_u_u_rowptr.data(),
3161 sdInfo_u_u_colind.data(),
3162 mom_uu_diff_ten,
3163 grad_u,
3164 &u_times_vel_grad_test_dV[i_nSpace]) +
3165 ck.Diffusion_weak(sdInfo_u_v_rowptr.data(),
3166 sdInfo_u_v_colind.data(),
3167 mom_uv_diff_ten,
3168 grad_v,
3169 &u_times_vel_grad_test_dV[i_nSpace]) +
3170 ck.Reaction_weak(mom_u_source,u*vel_test_dV[i]) + // Force term
3171 ck.Hamiltonian_weak(mom_u_ham,u*vel_test_dV[i]) // Pres + Non-linearity
3172 + // y-component
3173 ck.Mass_weak(mom_v_acc_t,v*vel_test_dV[i]) + // time derivative
3174 ck.Advection_weak(mom_v_adv,&v_times_vel_grad_test_dV[i_nSpace])+//m.mesh
3175 ck.Diffusion_weak(sdInfo_v_u_rowptr.data(),
3176 sdInfo_v_u_colind.data(),
3177 mom_vu_diff_ten,
3178 grad_u,
3179 &v_times_vel_grad_test_dV[i_nSpace])+
3180 ck.Diffusion_weak(sdInfo_v_v_rowptr.data(),
3181 sdInfo_v_v_colind.data(),
3182 mom_vv_diff_ten,
3183 grad_v,
3184 &v_times_vel_grad_test_dV[i_nSpace])+
3185 ck.Reaction_weak(mom_v_source,v*vel_test_dV[i]) + // force term
3186 ck.Hamiltonian_weak(mom_v_ham,v*vel_test_dV[i]); // Pres + Non-linearity
3187 }
3188 if (ARTIFICIAL_VISCOSITY==3 || ARTIFICIAL_VISCOSITY==4)
3189 {
3190 for(int j=0;j<nDOF_trial_element;j++)
3191 {
3192 int j_nSpace = j*nSpace;
3193 int i_nSpace = i*nSpace;
3194 elementTransport[i][j] += // int[rho*(velStar.grad_wj)*wi*dx]
3195 q_rho[eN_k]*porosity*
3196 ck.AdvectionJacobian_strong(velStar,
3197 &vel_grad_test_dV[j_nSpace])
3198 *vel_trial_ref[k*nDOF_trial_element+i];
3199 elementTransposeTransport[i][j] += // int[rho*(velStar.grad_wi)*wj*dx]
3200 q_rho[eN_k]*porosity*
3201 ck.AdvectionJacobian_strong(velStar,
3202 &vel_grad_test_dV[i_nSpace])
3203 *vel_trial_ref[k*nDOF_trial_element+j];
3204 }
3205 }//j
3206 }//i
3207 }
3208 element_uStar_He[eN] = det_hess_uStar_Ke/area_Ke;
3209 element_vStar_He[eN] = det_hess_vStar_Ke/area_Ke;
3210
3211 // End computation of cell based EV coeff //
3212 if (CELL_BASED_EV_COEFF && ARTIFICIAL_VISCOSITY==2)
3213 {
3214 double hK = elementDiameter[eN];
3215 double artVisc = fmin(cMax*hK*linVisc_eN,
3216 cE*hK*hK*nlinVisc_eN_num/(nlinVisc_eN_den+1E-10));
3217 for(int k=0;k<nQuadraturePoints_element;k++)
3218 {
3219 int eN_k = eN*nQuadraturePoints_element+k;
3220 q_numDiff_u[eN_k] = artVisc;
3221 q_numDiff_v[eN_k] = artVisc;
3222 q_numDiff_w[eN_k] = artVisc;
3223 }
3224 }
3225 //
3226 //load element into global residual and save element residual
3227 //
3228 for(int i=0;i<nDOF_test_element;i++)
3229 {
3230 int eN_i=eN*nDOF_test_element+i;
3231 phisErrorNodal[vel_l2g[eN_i]]+= element_active*phisErrorElement[i];
3232 /* elementResidual_p_save[eN_i] += elementResidual_p[i]; */
3233 /* mesh_volume_conservation_element_weak += elementResidual_mesh[i]; */
3234 /* globalResidual[offset_p+stride_p*p_l2g[eN_i]]+=elementResidual_p[i]; */
3235 globalResidual[offset_u+stride_u*vel_l2g[eN_i]]+=element_active*elementResidual_u[i];
3236 globalResidual[offset_v+stride_v*vel_l2g[eN_i]]+=element_active*elementResidual_v[i];
3237 /* globalResidual[offset_w+stride_w*vel_l2g[eN_i]]+=elementResidual_w[i]; */
3238 ncDrag[offset_u+stride_u*vel_l2g[eN_i]]+=mom_u_source_i[i];
3239 ncDrag[offset_v+stride_v*vel_l2g[eN_i]]+=mom_v_source_i[i];
3240 betaDrag[vel_l2g[eN_i]] += betaDrag_i[i];
3241 vos_vel_nodes[vel_l2g[eN_i]] += vos_i[i];
3242
3243 // compute numerator and denominator of uStar_hi and vStar_hi
3244 if (ARTIFICIAL_VISCOSITY==3)
3245 {
3246 uStar_hi[vel_l2g[eN_i]] += element_uStar_He[eN]; // offset=0, stride=1 since this is per component of the equation
3247 vStar_hi[vel_l2g[eN_i]] += element_vStar_He[eN];
3248 den_hi[vel_l2g[eN_i]] += 1;
3249 }
3250 if (ARTIFICIAL_VISCOSITY==4)
3251 {
3252 // DISTRIBUTE ENTROPY RESIDUAL //
3253 entropyResidualPerNode[vel_l2g[eN_i]] += elementEntropyResidual[i];
3254 }
3255 if (ARTIFICIAL_VISCOSITY==3 || ARTIFICIAL_VISCOSITY==4)
3256 {
3257 for (int j=0;j<nDOF_trial_element;j++)
3258 {
3259 int eN_i_j = eN_i*nDOF_trial_element+j;
3260 TransportMatrix[csrRowIndeces_1D[eN_i]
3261 + csrColumnOffsets_1D[eN_i_j]]
3262 += elementTransport[i][j];
3263 // transpose
3264 TransposeTransportMatrix[csrRowIndeces_1D[eN_i]
3265 + csrColumnOffsets_1D[eN_i_j]]
3266 += elementTransposeTransport[i][j];
3267 }//j
3268 }
3269 }//i
3270 /* mesh_volume_conservation += mesh_volume_conservation_element; */
3271 /* mesh_volume_conservation_weak += mesh_volume_conservation_element_weak; */
3272 /* mesh_volume_conservation_err_max=fmax(mesh_volume_conservation_err_max,fabs(mesh_volume_conservation_element)); */
3273 /* mesh_volume_conservation_err_max_weak=fmax(mesh_volume_conservation_err_max_weak,fabs(mesh_volume_conservation_element_weak)); */
3274 }//elements
3275
3276 if(CUT_CELL_INTEGRATION > 0)
3277 std::cout<<std::flush;
3278 // loop in DOFs for discrete upwinding
3279 if (ARTIFICIAL_VISCOSITY==3 || ARTIFICIAL_VISCOSITY==4)
3280 {
3281 // FIRST LOOP ON DOFs //
3282 for (int i=0; i<numDOFs_1D; i++)
3283 {
3284 if (ARTIFICIAL_VISCOSITY==4) // via entropy viscosity
3285 {
3286 // normalize entropy residual per node
3287 double max_u2i = (std::pow(u_dof[i],2.) +
3288 std::pow(v_dof[i],2.));
3289 double min_u2i = max_u2i;
3290 for (int offset=rowptr_1D[i]; offset<rowptr_1D[i+1]; offset++)
3291 {
3292 int j = colind_1D[offset];
3293 double u2j = (std::pow(u_dof[j],2.) +
3294 std::pow(v_dof[j],2.));
3295 max_u2i = fmax(max_u2i,u2j);
3296 min_u2i = fmin(min_u2i,u2j);
3297 }
3298 double normi = 0.5*(max_u2i + min_u2i) + 1E-10;
3299 entropyResidualPerNode[i] = fabs(entropyResidualPerNode[i])/normi;
3300 }
3301 else // via smoothness indicator
3302 {
3303 // computation of beta
3304 double uStari = uStar_dof[i];
3305 double vStari = vStar_dof[i];
3306
3307 double u_beta_numerator = 0., u_beta_denominator = 0.;
3308 double v_beta_numerator = 0., v_beta_denominator = 0.;
3309
3310 // loop on sparsity pattern
3311 for (int offset=rowptr_1D[i]; offset<rowptr_1D[i+1]; offset++)
3312 {
3313 int j = colind_1D[offset];
3314 double uStarj = uStar_dof[j];
3315 double vStarj = vStar_dof[j];
3316
3317 // for u component
3318 u_beta_numerator += (uStarj - uStari);
3319 u_beta_denominator += fabs(uStarj - uStari);
3320 // for v component
3321 v_beta_numerator += (vStarj - vStari);
3322 v_beta_denominator += fabs(vStarj - vStari);
3323 }
3324 double u_beta = fabs(u_beta_numerator)/(u_beta_denominator+1E-10);
3325 double v_beta = fabs(v_beta_numerator)/(v_beta_denominator+1E-10);
3326 // compute psi=beta^power
3327 if (ANISOTROPIC_DIFFUSION==1)
3328 {
3329 uStar_psi[i] = (POWER_SMOOTHNESS_INDICATOR==0 ? 1.0 : std::pow(u_beta, POWER_SMOOTHNESS_INDICATOR));
3330 vStar_psi[i] = (POWER_SMOOTHNESS_INDICATOR==0 ? 1.0 : std::pow(v_beta, POWER_SMOOTHNESS_INDICATOR));
3331 }
3332 else // ISOTROPIC ARTIFICIAL DIFFUSION
3333 {
3334 double psi = (POWER_SMOOTHNESS_INDICATOR==0 ? 1.0 : std::pow(fmax(u_beta,v_beta), POWER_SMOOTHNESS_INDICATOR));
3335 uStar_psi[i] = psi;
3336 vStar_psi[i] = psi;
3337 }
3338 // for computation of gamma
3339 uStar_hi[i] /= den_hi[i];
3340 vStar_hi[i] /= den_hi[i];
3341 }
3342 }
3343
3344 if (ARTIFICIAL_VISCOSITY==3)
3345 {
3346 for(int eN=0;eN<nElements_global;eN++)
3347 {
3348 double uStar_He = element_uStar_He[eN];
3349 double vStar_He = element_vStar_He[eN];
3350 for(int i=0;i<nDOF_test_element;i++)
3351 {
3352 int eN_i=eN*nDOF_test_element+i;
3353 int gi = vel_l2g[eN_i]; // offset=0, stride=1
3354 uStar_min_hiHe[gi] = fmin(uStar_min_hiHe[gi], uStar_hi[gi]*uStar_He);
3355 vStar_min_hiHe[gi] = fmin(vStar_min_hiHe[gi], vStar_hi[gi]*vStar_He);
3356 }
3357 }
3358 }
3359
3360 // EXTRA LOOP ON DOFs to COMPUTE GAMMA INDICATOR//
3361 if (ARTIFICIAL_VISCOSITY==3)
3362 {
3363 for (int i=0; i<numDOFs_1D; i++)
3364 {
3365 // for gamma indicator
3366 double uStar_hi2 = uStar_hi[i]*uStar_hi[i];
3367 double vStar_hi2 = vStar_hi[i]*vStar_hi[i];
3368 if (isBoundary_1D[i] == 1)
3369 {
3370 uStar_gamma[i] = 1; // set gamma=1 since at boundary we don't have enough information
3371 vStar_gamma[i] = 1;
3372 }
3373 else
3374 {
3375 if (ANISOTROPIC_DIFFUSION==1)
3376 {
3377 uStar_gamma[i] = 1.-fmax(0, fmin(uStar_hi2, C_FOR_GAMMA_INDICATOR*uStar_min_hiHe[i]))/(uStar_hi2+EPS_FOR_GAMMA_INDICATOR);
3378 vStar_gamma[i] = 1.-fmax(0, fmin(vStar_hi2, C_FOR_GAMMA_INDICATOR*vStar_min_hiHe[i]))/(vStar_hi2+EPS_FOR_GAMMA_INDICATOR);
3379 }
3380 else // ISOTROPIC ARTIFICIAL DIFFUSION
3381 {
3382 double gamma = fmax(1.-fmax(0, fmin(uStar_hi2, C_FOR_GAMMA_INDICATOR*uStar_min_hiHe[i]))/(uStar_hi2+EPS_FOR_GAMMA_INDICATOR),
3383 1.-fmax(0, fmin(vStar_hi2, C_FOR_GAMMA_INDICATOR*vStar_min_hiHe[i]))/(vStar_hi2+EPS_FOR_GAMMA_INDICATOR));
3384 uStar_gamma[i] = gamma;
3385 vStar_gamma[i] = gamma;
3386 }
3387 }
3388 }
3389 }
3390 // SECOND LOOP ON DOFs //
3391 int ij=0;
3392 for (int i=0; i<numDOFs_1D; i++)
3393 {
3394 int ii;
3395 double uStar_dii = 0;
3396 double vStar_dii = 0;
3397 double ui = u_dof[i];
3398 double vi = v_dof[i];
3399
3400 double ith_u_dissipative_term = 0;
3401 double ith_v_dissipative_term = 0;
3402
3403 double uStar_alphai = USE_GAMMA_INDICATOR==1 ? fmin(uStar_psi[i], uStar_gamma[i]) : uStar_psi[i];
3404 double vStar_alphai = USE_GAMMA_INDICATOR==1 ? fmin(vStar_psi[i], vStar_gamma[i]) : vStar_psi[i];
3405
3406 for (int offset=rowptr_1D[i]; offset<rowptr_1D[i+1]; offset++)
3407 {
3408 int j = colind_1D[offset];
3409 if (i!=j)
3410 {
3411 double uj = u_dof[j];
3412 double vj = v_dof[j];
3413
3414 double uStar_alphaj = USE_GAMMA_INDICATOR==1 ? fmin(uStar_psi[j], uStar_gamma[j]) : uStar_psi[j];
3415 double vStar_alphaj = USE_GAMMA_INDICATOR==1 ? fmin(vStar_psi[j], vStar_gamma[j]) : vStar_psi[j];
3416
3417 if (ARTIFICIAL_VISCOSITY==4) // via entropy viscosity
3418 {
3419 double dEVij = fmax(laggedEntropyResidualPerNode[i],
3420 laggedEntropyResidualPerNode[j]);
3421 double dLij = fmax(0.,fmax(TransportMatrix[ij],
3423 uStar_dMatrix[ij] = fmin(dLij,cE*dEVij);
3424 vStar_dMatrix[i] = uStar_dMatrix[ij];
3425 }
3426 else // via smoothness indicator
3427 {
3428 uStar_dMatrix[ij] = fmax(0.,fmax(uStar_alphai*TransportMatrix[ij], // by S. Badia
3429 uStar_alphaj*TransposeTransportMatrix[ij]));
3430 vStar_dMatrix[ij] = fmax(0.,fmax(vStar_alphai*TransportMatrix[ij], // by S. Badia
3431 vStar_alphaj*TransposeTransportMatrix[ij]));
3432 }
3433 uStar_dii -= uStar_dMatrix[ij];
3434 vStar_dii -= vStar_dMatrix[ij];
3435 //dissipative terms
3436 ith_u_dissipative_term += uStar_dMatrix[ij]*(uj-ui);
3437 ith_v_dissipative_term += vStar_dMatrix[ij]*(vj-vi);
3438 }
3439 else
3440 {
3441 ii = ij;
3442 }
3443 // update ij
3444 ij++;
3445 }
3446 uStar_dMatrix[ii] = uStar_dii;
3447 vStar_dMatrix[ii] = vStar_dii;
3448 globalResidual[offset_u+stride_u*i] += -ith_u_dissipative_term;
3449 globalResidual[offset_v+stride_v*i] += -ith_v_dissipative_term;
3450 }
3451 }
3452
3453 //
3454 //loop over the surrogate boundaries in SB method and assembly into residual
3455 //
3456 if(USE_SBM>0)
3457 {
3458 if(USE_SBM==1)
3459 {
3460 std::memset(particle_netForces.data(),0,nParticles*3*sizeof(double));
3461 std::memset(particle_netMoments.data(),0,nParticles*3*sizeof(double));
3462 }
3463 for (int ebN_s=0;ebN_s < surrogate_boundaries.size();ebN_s++)
3464 {
3465 // Initialization of the force to 0
3466 double Fx = 0.0, Fy = 0.0, Fxp = 0.0, Fyp = 0.0, surfaceArea=0.0, Mz = 0.0;
3467 int ebN = surrogate_boundaries[ebN_s],
3468 eN = elementBoundaryElementsArray[ebN*2+surrogate_boundary_elements[ebN_s]],
3469 ebN_local = elementBoundaryLocalElementBoundariesArray[ebN*2+surrogate_boundary_elements[ebN_s]],
3470 eN_nDOF_trial_element = eN*nDOF_trial_element;
3471 double elementResidual_mesh[nDOF_test_element],
3472 elementResidual_p[nDOF_test_element],
3473 elementResidual_u[nDOF_test_element],
3474 elementResidual_v[nDOF_test_element],
3475 //elementResidual_w[nDOF_test_element],
3476 eps_rho,eps_mu;
3477 //This assumption is wrong for parallel: If one of nodes of this edge is owned by this processor,
3478 //then the integral over this edge has contribution to the residual and Jacobian.
3479 //if (ebN >= nElementBoundaries_owned) continue;
3480 //std::cout<<"Surrogate edge "<<ebN<<" element neighbor "<<eN<<" local element boundary "<<ebN_local<<std::endl;
3481 for (int i=0;i<nDOF_test_element;i++)
3482 {
3483 elementResidual_mesh[i]=0.0;
3484 elementResidual_p[i]=0.0;
3485 elementResidual_u[i]=0.0;
3486 elementResidual_v[i]=0.0;
3487 /* elementResidual_w[i]=0.0; */
3488 }
3489 for (int kb=0;kb<nQuadraturePoints_elementBoundary;kb++)
3490 {
3491 int ebN_kb = ebN*nQuadraturePoints_elementBoundary+kb,
3492 /* ebNE_kb_nSpace = ebNE_kb*nSpace, */
3493 ebN_local_kb = ebN_local*nQuadraturePoints_elementBoundary+kb,
3494 ebN_local_kb_nSpace = ebN_local_kb*nSpace;
3495 double
3496 u_ext=0.0,
3497 v_ext=0.0,
3498 bc_u_ext=0.0,
3499 bc_v_ext=0.0,
3500 grad_u_ext[nSpace],
3501 grad_v_ext[nSpace],
3502 jac_ext[nSpace*nSpace],
3503 jacDet_ext,
3504 jacInv_ext[nSpace*nSpace],
3505 boundaryJac[nSpace*(nSpace-1)],
3506 metricTensor[(nSpace-1)*(nSpace-1)],
3507 metricTensorDetSqrt,
3508 dS,p_test_dS[nDOF_test_element],vel_test_dS[nDOF_test_element],
3509 p_grad_trial_trace[nDOF_trial_element*nSpace],vel_grad_trial_trace[nDOF_trial_element*nSpace],
3510 vel_grad_test_dS[nDOF_trial_element*nSpace],
3511 normal[2],x_ext,y_ext,z_ext,xt_ext,yt_ext,zt_ext,integralScaling,
3512 G[nSpace*nSpace],G_dd_G,tr_G,h_phi,h_penalty,penalty,
3513 force_x,force_y,force_z,force_p_x,force_p_y,force_p_z,force_v_x,force_v_y,force_v_z,r_x,r_y,r_z;
3514 //compute information about mapping from reference element to physical element
3515 ck.calculateMapping_elementBoundary(eN,
3516 ebN_local,
3517 kb,
3518 ebN_local_kb,
3519 mesh_dof.data(),
3520 mesh_l2g.data(),
3521 mesh_trial_trace_ref.data(),
3522 mesh_grad_trial_trace_ref.data(),
3523 boundaryJac_ref.data(),
3524 jac_ext,
3525 jacDet_ext,
3526 jacInv_ext,
3527 boundaryJac,
3528 metricTensor,
3529 metricTensorDetSqrt,
3530 normal_ref.data(),
3531 normal,
3532 x_ext,y_ext,z_ext);
3533 ck.calculateMappingVelocity_elementBoundary(eN,
3534 ebN_local,
3535 kb,
3536 ebN_local_kb,
3537 mesh_velocity_dof.data(),
3538 mesh_l2g.data(),
3539 mesh_trial_trace_ref.data(),
3540 xt_ext,yt_ext,zt_ext,
3541 normal,
3542 boundaryJac,
3543 metricTensor,
3544 integralScaling);
3545 dS = metricTensorDetSqrt*dS_ref[kb];
3546 //get the metric tensor
3547 ck.calculateG(jacInv_ext,G,G_dd_G,tr_G);
3548 //compute shape and solution information
3549 //shape
3550 ck.gradTrialFromRef(&vel_grad_trial_trace_ref[ebN_local_kb_nSpace*nDOF_trial_element],jacInv_ext,vel_grad_trial_trace);
3551 //solution and gradients
3552 ck.valFromDOF(u_dof.data(),&vel_l2g[eN_nDOF_trial_element],&vel_trial_trace_ref[ebN_local_kb*nDOF_test_element],u_ext);
3553 ck.valFromDOF(v_dof.data(),&vel_l2g[eN_nDOF_trial_element],&vel_trial_trace_ref[ebN_local_kb*nDOF_test_element],v_ext);
3554
3555 ck.gradFromDOF(u_dof.data(),&vel_l2g[eN_nDOF_trial_element],vel_grad_trial_trace,grad_u_ext);
3556 ck.gradFromDOF(v_dof.data(),&vel_l2g[eN_nDOF_trial_element],vel_grad_trial_trace,grad_v_ext);
3557 //precalculate test function products with integration weights
3558 for (int j=0;j<nDOF_trial_element;j++)
3559 {
3560 vel_test_dS[j] = vel_test_trace_ref[ebN_local_kb*nDOF_test_element+j]*dS;
3561 for (int I=0;I<nSpace;I++)
3562 vel_grad_test_dS[j*nSpace+I] = vel_grad_trial_trace[j*nSpace+I]*dS;//cek hack, using trial
3563 }
3564
3565 double dist = 0.0;
3566 double distance[2], P_normal[2], P_tangent[2]; // distance vector, normal and tangent of the physical boundary
3567
3568
3569
3570 if(use_ball_as_particle==1)
3571 {
3572 get_distance_to_ball(nParticles,ball_center.data(),ball_radius.data(),
3573 x_ext,y_ext,z_ext,
3574 dist);
3575 get_normal_to_ith_ball(nParticles,ball_center.data(),ball_radius.data(),
3577 x_ext,y_ext,z_ext,
3578 P_normal[0],P_normal[1]);
3579 get_velocity_to_ith_ball(nParticles,ball_center.data(),ball_radius.data(),
3580 ball_velocity.data(),ball_angular_velocity.data(),
3582 x_ext-dist*P_normal[0],//corresponding point on the boundary of the particle
3583 y_ext-dist*P_normal[1],
3584 0.0,//z_ext,
3585 bc_u_ext,bc_v_ext);
3586 }
3587 else
3588 {
3589 dist = ebq_global_phi_solid[ebN_kb];
3590 P_normal[0] = ebq_global_grad_phi_solid[ebN_kb*3+0];
3591 P_normal[1] = ebq_global_grad_phi_solid[ebN_kb*3+1];
3592 bc_u_ext = ebq_particle_velocity_solid [ebN_kb*3+0];
3593 bc_v_ext = ebq_particle_velocity_solid [ebN_kb*3+1];
3594
3595 }
3596
3597 ck.calculateGScale(G,normal,h_penalty);
3598 //
3599 //update the element and global residual storage
3600 //
3601 assert(h_penalty>0.0);
3602 if (h_penalty < std::abs(dist))
3603 h_penalty = std::abs(dist);
3604 distance[0] = -P_normal[0]*dist;//distance=vector from \tilde{x} to x. It holds also when dist<0.0
3605 distance[1] = -P_normal[1]*dist;
3606 P_tangent[0] = -P_normal[1];
3607 P_tangent[1] = P_normal[0];
3608 double visco = nu_0*rho_0;
3609 double C_adim = C_sbm*visco/h_penalty;
3610 double beta_adim = beta_sbm*visco/h_penalty;
3611
3612 const double grad_u_d[2] = {get_dot_product(distance,grad_u_ext),
3613 get_dot_product(distance,grad_v_ext)};
3614 double res[2];
3615 const double u_m_uD[2] = {u_ext - bc_u_ext,v_ext - bc_v_ext};
3616 const double zero_vec[2]={0.,0.};
3617 const double grad_u_t[2] = {get_dot_product(P_tangent,grad_u_ext),
3618 get_dot_product(P_tangent,grad_v_ext)};
3619 for (int i=0;i<nDOF_test_element;i++)
3620 {
3621 int eN_i = eN*nDOF_test_element+i;
3622
3623 int GlobPos_u = offset_u+stride_u*vel_l2g[eN_i];
3624 int GlobPos_v = offset_v+stride_v*vel_l2g[eN_i];
3625 double phi_i = vel_test_dS[i];
3626 double Gxphi_i = vel_grad_test_dS[i*nSpace+0];
3627 double Gyphi_i = vel_grad_test_dS[i*nSpace+1];
3628 double *grad_phi_i = &vel_grad_test_dS[i*nSpace+0];
3629 const double grad_phi_i_dot_d = get_dot_product(distance,grad_phi_i);
3630 const double grad_phi_i_dot_t = get_dot_product(P_tangent,grad_phi_i);
3631
3632 // (1)
3633 globalResidual[GlobPos_u] += C_adim*phi_i*u_m_uD[0];
3634 globalResidual[GlobPos_v] += C_adim*phi_i*u_m_uD[1];
3635 Fx += C_adim*phi_i*u_m_uD[0];
3636 Fy += C_adim*phi_i*u_m_uD[1];
3637
3638 // (2)
3639 get_symmetric_gradient_dot_vec(grad_u_ext,grad_v_ext,normal,res);//Use normal for consistency
3640 globalResidual[GlobPos_u] -= visco * phi_i*res[0];
3641 globalResidual[GlobPos_v] -= visco * phi_i*res[1];
3642 Fx -= visco * phi_i*res[0];
3643 Fy -= visco * phi_i*res[1];
3644
3645 // (3)
3646 get_symmetric_gradient_dot_vec(grad_phi_i,zero_vec,normal,res);
3647 globalResidual[GlobPos_u] -= visco * get_dot_product(u_m_uD,res);//Use normal for consistency
3648 get_symmetric_gradient_dot_vec(zero_vec,grad_phi_i,normal,res);
3649 globalResidual[GlobPos_v] -= visco * get_dot_product(u_m_uD,res);//Use normal for consistency
3650 get_symmetric_gradient_dot_vec(grad_phi_i,zero_vec,normal,res);
3651 Fx -= visco * get_dot_product(u_m_uD,res);//Use normal for consistency
3652 get_symmetric_gradient_dot_vec(zero_vec,grad_phi_i,normal,res);
3653 Fy -= visco * get_dot_product(u_m_uD,res);//Use normal for consistency
3654
3655 // (4)
3656 globalResidual[GlobPos_u] += C_adim*grad_phi_i_dot_d*u_m_uD[0];
3657 globalResidual[GlobPos_v] += C_adim*grad_phi_i_dot_d*u_m_uD[1];
3658 Fx += C_adim*grad_phi_i_dot_d*u_m_uD[0];
3659 Fy += C_adim*grad_phi_i_dot_d*u_m_uD[1];
3660
3661 // (5)
3662 globalResidual[GlobPos_u] += C_adim*grad_phi_i_dot_d*grad_u_d[0];
3663 globalResidual[GlobPos_v] += C_adim*grad_phi_i_dot_d*grad_u_d[1];
3664 Fx += C_adim*grad_phi_i_dot_d*grad_u_d[0];
3665 Fy += C_adim*grad_phi_i_dot_d*grad_u_d[1];
3666
3667 // (6)
3668 globalResidual[GlobPos_u] += C_adim*phi_i*grad_u_d[0];
3669 globalResidual[GlobPos_v] += C_adim*phi_i*grad_u_d[1];
3670 Fx += C_adim*phi_i*grad_u_d[0];
3671 Fy += C_adim*phi_i*grad_u_d[1];
3672
3673 // (7)
3674 get_symmetric_gradient_dot_vec(grad_phi_i,zero_vec,normal,res);//Use normal for consistency
3675 globalResidual[GlobPos_u] -= visco*get_dot_product(grad_u_d,res);
3676 get_symmetric_gradient_dot_vec(zero_vec,grad_phi_i,normal,res);//Use normal for consistency
3677 globalResidual[GlobPos_v] -= visco*get_dot_product(grad_u_d,res);
3678 get_symmetric_gradient_dot_vec(grad_phi_i,zero_vec,normal,res);//Use normal for consistency
3679 Fx -= visco*get_dot_product(grad_u_d,res);
3680 get_symmetric_gradient_dot_vec(zero_vec,grad_phi_i,normal,res);//Use normal for consistency
3681 Fy -= visco*get_dot_product(grad_u_d,res);
3682
3683 //the penalization on the tangential derivative
3684 //B < Gw t , (Gu - GuD) t >
3685 globalResidual[GlobPos_u] += beta_adim*grad_u_t[0]*grad_phi_i_dot_t;
3686 globalResidual[GlobPos_v] += beta_adim*grad_u_t[1]*grad_phi_i_dot_t;
3687 Fx += beta_adim*grad_u_t[0]*grad_phi_i_dot_t;
3688 Fy += beta_adim*grad_u_t[1]*grad_phi_i_dot_t;
3689
3690 }//i
3691
3692 //
3693 // Forces
3694 //
3695 //compute pressure at the quadrature point of the edge from dof-value of the pressure
3696 double p_ext = 0.0;
3697 for (int i=0; i<nDOF_per_element_pressure;++i)
3698 {
3699 p_ext += p_dof[p_l2g[eN*nDOF_per_element_pressure+i]]*p_trial_trace_ref[ebN_local_kb*nDOF_per_element_pressure+i];
3700 }
3701 double nx = P_normal[0]; //YY: normal direction outward of the solid.
3702 double ny = P_normal[1];
3703 Fx -= p_ext*nx*dS;
3704 Fy -= p_ext*ny*dS;
3705 Fxp -= p_ext*nx*dS;
3706 Fyp -= p_ext*ny*dS;
3707 surfaceArea += dS;
3708 if(use_ball_as_particle==1)
3709 {
3710 r_x = x_ext - ball_center[surrogate_boundary_particle[ebN_s] * 3 + 0];
3711 r_y = y_ext - ball_center[surrogate_boundary_particle[ebN_s] * 3 + 1];
3712 }
3713 else
3714 {
3715 r_x = x_ext - particle_centroids[surrogate_boundary_particle[ebN_s] * 3 + 0];
3716 r_y = y_ext - particle_centroids[surrogate_boundary_particle[ebN_s] * 3 + 1];
3717 }
3718 Mz += r_x*Fy-r_y*Fx;
3719 }//kb
3720 if(USE_SBM==1
3721 && ebN < nElementBoundaries_owned)//avoid double counting
3722 {
3723 particle_surfaceArea[surrogate_boundary_particle[ebN_s]] += surfaceArea;
3724 particle_netForces[3*surrogate_boundary_particle[ebN_s]+0] += Fx;
3725 particle_netForces[3*surrogate_boundary_particle[ebN_s]+1] += Fy;
3726 particle_netForces[3*( nParticles+surrogate_boundary_particle[ebN_s])+0] += Fxp;
3727 particle_netForces[3*(2*nParticles+surrogate_boundary_particle[ebN_s])+0] += (Fx-Fxp);
3728 particle_netForces[3*( nParticles+surrogate_boundary_particle[ebN_s])+1] += Fyp;
3729 particle_netForces[3*(2*nParticles+surrogate_boundary_particle[ebN_s])+1] += (Fy-Fyp);
3730 particle_netMoments[3*surrogate_boundary_particle[ebN_s]+2]+= Mz;
3731 }
3732 }//ebN_s
3733 //std::cout<<" sbm force over surrogate boundary is: "<<Fx<<"\t"<<Fy<<std::endl;
3734 //
3735 }
3736 //loop over exterior element boundaries to calculate surface integrals and load into element and global residuals
3737 //
3738 //ebNE is the Exterior element boundary INdex
3739 //ebN is the element boundary INdex
3740 //eN is the element index
3741 gf.useExact=false;
3742 gf_s.useExact=false;
3743 for (int ebNE = 0; ebNE < nExteriorElementBoundaries_global; ebNE++)
3744 {
3745 int ebN = exteriorElementBoundariesArray[ebNE],
3746 eN = elementBoundaryElementsArray[ebN*2+0],
3747 ebN_local = elementBoundaryLocalElementBoundariesArray[ebN*2+0],
3748 eN_nDOF_trial_element = eN*nDOF_trial_element;
3749 double elementResidual_mesh[nDOF_test_element],
3750 elementResidual_p[nDOF_test_element],
3751 elementResidual_u[nDOF_test_element],
3752 elementResidual_v[nDOF_test_element],
3753 //elementResidual_w[nDOF_test_element],
3754 eps_rho,eps_mu;
3755 const double* elementResidual_w(NULL);
3756 for (int i=0;i<nDOF_test_element;i++)
3757 {
3758 elementResidual_mesh[i]=0.0;
3759 elementResidual_p[i]=0.0;
3760 elementResidual_u[i]=0.0;
3761 elementResidual_v[i]=0.0;
3762 /* elementResidual_w[i]=0.0; */
3763 }
3764 for (int kb=0;kb<nQuadraturePoints_elementBoundary;kb++)
3765 {
3766 int ebNE_kb = ebNE*nQuadraturePoints_elementBoundary+kb,
3767 ebNE_kb_nSpace = ebNE_kb*nSpace,
3768 ebN_local_kb = ebN_local*nQuadraturePoints_elementBoundary+kb,
3769 ebN_local_kb_nSpace = ebN_local_kb*nSpace;
3770 double p_ext=0.0,
3771 u_ext=0.0,
3772 v_ext=0.0,
3773 w_ext=0.0,
3774 grad_p_ext[nSpace],
3775 grad_u_ext[nSpace],
3776 grad_v_ext[nSpace],
3777 grad_w_ext[nSpace],
3778 mom_u_acc_ext=0.0,
3779 dmom_u_acc_u_ext=0.0,
3780 mom_v_acc_ext=0.0,
3781 dmom_v_acc_v_ext=0.0,
3782 mom_w_acc_ext=0.0,
3783 dmom_w_acc_w_ext=0.0,
3784 mass_adv_ext[nSpace],
3785 dmass_adv_u_ext[nSpace],
3786 dmass_adv_v_ext[nSpace],
3787 dmass_adv_w_ext[nSpace],
3788 mom_u_adv_ext[nSpace],
3789 dmom_u_adv_u_ext[nSpace],
3790 dmom_u_adv_v_ext[nSpace],
3791 dmom_u_adv_w_ext[nSpace],
3792 mom_v_adv_ext[nSpace],
3793 dmom_v_adv_u_ext[nSpace],
3794 dmom_v_adv_v_ext[nSpace],
3795 dmom_v_adv_w_ext[nSpace],
3796 mom_w_adv_ext[nSpace],
3797 dmom_w_adv_u_ext[nSpace],
3798 dmom_w_adv_v_ext[nSpace],
3799 dmom_w_adv_w_ext[nSpace],
3800 mom_uu_diff_ten_ext[nSpace],
3801 mom_vv_diff_ten_ext[nSpace],
3802 mom_ww_diff_ten_ext[nSpace],
3803 mom_uv_diff_ten_ext[1],
3804 mom_uw_diff_ten_ext[1],
3805 mom_vu_diff_ten_ext[1],
3806 mom_vw_diff_ten_ext[1],
3807 mom_wu_diff_ten_ext[1],
3808 mom_wv_diff_ten_ext[1],
3809 mom_u_source_ext=0.0,
3810 mom_v_source_ext=0.0,
3811 mom_w_source_ext=0.0,
3812 mom_u_ham_ext=0.0,
3813 dmom_u_ham_grad_p_ext[nSpace],
3814 dmom_u_ham_grad_u_ext[nSpace],
3815 mom_v_ham_ext=0.0,
3816 dmom_v_ham_grad_p_ext[nSpace],
3817 dmom_v_ham_grad_v_ext[nSpace],
3818 mom_w_ham_ext=0.0,
3819 dmom_w_ham_grad_p_ext[nSpace],
3820 dmom_w_ham_grad_w_ext[nSpace],
3821 dmom_u_adv_p_ext[nSpace],
3822 dmom_v_adv_p_ext[nSpace],
3823 dmom_w_adv_p_ext[nSpace],
3824 flux_mass_ext=0.0,
3825 flux_mom_u_adv_ext=0.0,
3826 flux_mom_v_adv_ext=0.0,
3827 flux_mom_w_adv_ext=0.0,
3828 flux_mom_uu_diff_ext=0.0,
3829 flux_mom_uv_diff_ext=0.0,
3830 flux_mom_uw_diff_ext=0.0,
3831 flux_mom_vu_diff_ext=0.0,
3832 flux_mom_vv_diff_ext=0.0,
3833 flux_mom_vw_diff_ext=0.0,
3834 flux_mom_wu_diff_ext=0.0,
3835 flux_mom_wv_diff_ext=0.0,
3836 flux_mom_ww_diff_ext=0.0,
3837 bc_p_ext=0.0,
3838 bc_u_ext=0.0,
3839 bc_v_ext=0.0,
3840 bc_w_ext=0.0,
3841 bc_mom_u_acc_ext=0.0,
3842 bc_dmom_u_acc_u_ext=0.0,
3843 bc_mom_v_acc_ext=0.0,
3844 bc_dmom_v_acc_v_ext=0.0,
3845 bc_mom_w_acc_ext=0.0,
3846 bc_dmom_w_acc_w_ext=0.0,
3847 bc_mass_adv_ext[nSpace],
3848 bc_dmass_adv_u_ext[nSpace],
3849 bc_dmass_adv_v_ext[nSpace],
3850 bc_dmass_adv_w_ext[nSpace],
3851 bc_mom_u_adv_ext[nSpace],
3852 bc_dmom_u_adv_u_ext[nSpace],
3853 bc_dmom_u_adv_v_ext[nSpace],
3854 bc_dmom_u_adv_w_ext[nSpace],
3855 bc_mom_v_adv_ext[nSpace],
3856 bc_dmom_v_adv_u_ext[nSpace],
3857 bc_dmom_v_adv_v_ext[nSpace],
3858 bc_dmom_v_adv_w_ext[nSpace],
3859 bc_mom_w_adv_ext[nSpace],
3860 bc_dmom_w_adv_u_ext[nSpace],
3861 bc_dmom_w_adv_v_ext[nSpace],
3862 bc_dmom_w_adv_w_ext[nSpace],
3863 bc_mom_uu_diff_ten_ext[nSpace],
3864 bc_mom_vv_diff_ten_ext[nSpace],
3865 bc_mom_ww_diff_ten_ext[nSpace],
3866 bc_mom_uv_diff_ten_ext[1],
3867 bc_mom_uw_diff_ten_ext[1],
3868 bc_mom_vu_diff_ten_ext[1],
3869 bc_mom_vw_diff_ten_ext[1],
3870 bc_mom_wu_diff_ten_ext[1],
3871 bc_mom_wv_diff_ten_ext[1],
3872 bc_mom_u_source_ext=0.0,
3873 bc_mom_v_source_ext=0.0,
3874 bc_mom_w_source_ext=0.0,
3875 bc_mom_u_ham_ext=0.0,
3876 bc_dmom_u_ham_grad_p_ext[nSpace],
3877 bc_dmom_u_ham_grad_u_ext[nSpace],
3878 bc_mom_v_ham_ext=0.0,
3879 bc_dmom_v_ham_grad_p_ext[nSpace],
3880 bc_dmom_v_ham_grad_v_ext[nSpace],
3881 bc_mom_w_ham_ext=0.0,
3882 bc_dmom_w_ham_grad_p_ext[nSpace],
3883 bc_dmom_w_ham_grad_w_ext[nSpace],
3884 jac_ext[nSpace*nSpace],
3885 jacDet_ext,
3886 jacInv_ext[nSpace*nSpace],
3887 boundaryJac[nSpace*(nSpace-1)],
3888 metricTensor[(nSpace-1)*(nSpace-1)],
3889 metricTensorDetSqrt,
3890 dS,p_test_dS[nDOF_test_element],vel_test_dS[nDOF_test_element],
3891 p_grad_trial_trace[nDOF_trial_element*nSpace],vel_grad_trial_trace[nDOF_trial_element*nSpace],
3892 vel_grad_test_dS[nDOF_trial_element*nSpace],
3893 normal[2],x_ext,y_ext,z_ext,xt_ext,yt_ext,zt_ext,integralScaling,
3894 //VRANS
3895 porosity_ext,
3896 //
3897 G[nSpace*nSpace],G_dd_G,tr_G,h_phi,h_penalty,penalty,
3898 force_x,force_y,force_z,force_p_x,force_p_y,force_p_z,force_v_x,force_v_y,force_v_z,r_x,r_y,r_z;
3899 //compute information about mapping from reference element to physical element
3900 ck.calculateMapping_elementBoundary(eN,
3901 ebN_local,
3902 kb,
3903 ebN_local_kb,
3904 mesh_dof.data(),
3905 mesh_l2g.data(),
3906 mesh_trial_trace_ref.data(),
3907 mesh_grad_trial_trace_ref.data(),
3908 boundaryJac_ref.data(),
3909 jac_ext,
3910 jacDet_ext,
3911 jacInv_ext,
3912 boundaryJac,
3913 metricTensor,
3914 metricTensorDetSqrt,
3915 normal_ref.data(),
3916 normal,
3917 x_ext,y_ext,z_ext);
3918 ck.calculateMappingVelocity_elementBoundary(eN,
3919 ebN_local,
3920 kb,
3921 ebN_local_kb,
3922 mesh_velocity_dof.data(),
3923 mesh_l2g.data(),
3924 mesh_trial_trace_ref.data(),
3925 xt_ext,yt_ext,zt_ext,
3926 normal,
3927 boundaryJac,
3928 metricTensor,
3929 integralScaling);
3930 //xt_ext=0.0;yt_ext=0.0;zt_ext=0.0;
3931 //std::cout<<"xt_ext "<<xt_ext<<'\t'<<yt_ext<<'\t'<<zt_ext<<std::endl;
3932 //std::cout<<"x_ext "<<x_ext<<'\t'<<y_ext<<'\t'<<z_ext<<std::endl;
3933 //std::cout<<"integralScaling - metricTensorDetSrt ==============================="<<integralScaling-metricTensorDetSqrt<<std::endl;
3934 /* std::cout<<"metricTensorDetSqrt "<<metricTensorDetSqrt */
3935 /* <<"dS_ref[kb]"<<dS_ref[kb]<<std::endl; */
3936 //dS = ((1.0-MOVING_DOMAIN)*metricTensorDetSqrt + MOVING_DOMAIN*integralScaling)*dS_ref[kb];//cek need to test effect on accuracy
3937 dS = metricTensorDetSqrt*dS_ref[kb];
3938 //get the metric tensor
3939 //cek todo use symmetry
3940 ck.calculateG(jacInv_ext,G,G_dd_G,tr_G);
3941 ck.calculateGScale(G,&ebqe_normal_phi_ext[ebNE_kb_nSpace],h_phi);
3942
3943 eps_rho = epsFact_rho*(useMetrics*h_phi+(1.0-useMetrics)*elementDiameter[eN]);
3944 eps_mu = epsFact_mu *(useMetrics*h_phi+(1.0-useMetrics)*elementDiameter[eN]);
3945 double particle_eps = particle_epsFact*(useMetrics*h_phi+(1.0-useMetrics)*elementDiameter[eN]);
3946
3947 //compute shape and solution information
3948 //shape
3949 /* ck.gradTrialFromRef(&p_grad_trial_trace_ref[ebN_local_kb_nSpace*nDOF_trial_element],jacInv_ext,p_grad_trial_trace); */
3950 ck.gradTrialFromRef(&vel_grad_trial_trace_ref[ebN_local_kb_nSpace*nDOF_trial_element],jacInv_ext,vel_grad_trial_trace);
3951 //cek hack use trial ck.gradTrialFromRef(&vel_grad_test_trace_ref[ebN_local_kb_nSpace*nDOF_trial_element],jacInv_ext,vel_grad_test_trace);
3952 //solution and gradients
3953 /* ck.valFromDOF(p_dof,&p_l2g[eN_nDOF_trial_element],&p_trial_trace_ref[ebN_local_kb*nDOF_test_element],p_ext); */
3954 p_ext = ebqe_p[ebNE_kb];
3955 ck.valFromDOF(u_dof.data(),&vel_l2g[eN_nDOF_trial_element],&vel_trial_trace_ref[ebN_local_kb*nDOF_test_element],u_ext);
3956 ck.valFromDOF(v_dof.data(),&vel_l2g[eN_nDOF_trial_element],&vel_trial_trace_ref[ebN_local_kb*nDOF_test_element],v_ext);
3957 /* ck.valFromDOF(w_dof,&vel_l2g[eN_nDOF_trial_element],&vel_trial_trace_ref[ebN_local_kb*nDOF_test_element],w_ext); */
3958 /* ck.gradFromDOF(p_dof,&p_l2g[eN_nDOF_trial_element],p_grad_trial_trace,grad_p_ext); */
3959 for (int I=0;I<nSpace;I++)
3960 grad_p_ext[I] = ebqe_grad_p[ebNE_kb_nSpace + I];
3961 ck.gradFromDOF(u_dof.data(),&vel_l2g[eN_nDOF_trial_element],vel_grad_trial_trace,grad_u_ext);
3962 ck.gradFromDOF(v_dof.data(),&vel_l2g[eN_nDOF_trial_element],vel_grad_trial_trace,grad_v_ext);
3963 /* ck.gradFromDOF(w_dof,&vel_l2g[eN_nDOF_trial_element],vel_grad_trial_trace,grad_w_ext); */
3964 //precalculate test function products with integration weights
3965 for (int j=0;j<nDOF_trial_element;j++)
3966 {
3967 /* p_test_dS[j] = p_test_trace_ref[ebN_local_kb*nDOF_test_element+j]*dS; */
3968 vel_test_dS[j] = vel_test_trace_ref[ebN_local_kb*nDOF_test_element+j]*dS;
3969 for (int I=0;I<nSpace;I++)
3970 vel_grad_test_dS[j*nSpace+I] = vel_grad_trial_trace[j*nSpace+I]*dS;//cek hack, using trial
3971 }
3972 bc_p_ext = isDOFBoundary_p[ebNE_kb]*ebqe_bc_p_ext[ebNE_kb]+(1-isDOFBoundary_p[ebNE_kb])*p_ext;
3973 //note, our convention is that bc values at moving boundaries are relative to boundary velocity so we add it here
3974 bc_u_ext = isDOFBoundary_u[ebNE_kb]*(ebqe_bc_u_ext[ebNE_kb] + MOVING_DOMAIN*xt_ext) + (1-isDOFBoundary_u[ebNE_kb])*u_ext;
3975 bc_v_ext = isDOFBoundary_v[ebNE_kb]*(ebqe_bc_v_ext[ebNE_kb] + MOVING_DOMAIN*yt_ext) + (1-isDOFBoundary_v[ebNE_kb])*v_ext;
3976 /* bc_w_ext = isDOFBoundary_w[ebNE_kb]*(ebqe_bc_w_ext[ebNE_kb] + MOVING_DOMAIN*zt_ext) + (1-isDOFBoundary_w[ebNE_kb])*w_ext; */
3977 //VRANS
3978 porosity_ext = 1.0 - ebqe_vos_ext[ebNE_kb];
3979 //
3980 //calculate the pde coefficients using the solution and the boundary values for the solution
3981 //
3982 double distance_to_omega_solid = 1e10;
3983 if (use_ball_as_particle == 1)
3984 {
3985 get_distance_to_ball(nParticles, ball_center.data(), ball_radius.data(), x_ext, y_ext, z_ext, distance_to_omega_solid);
3986 }
3987 else
3988 {
3989 distance_to_omega_solid = ebq_global_phi_solid[ebN*nQuadraturePoints_elementBoundary+kb];
3990 }
3991 double eddy_viscosity_ext(0.),bc_eddy_viscosity_ext(0.); //not interested in saving boundary eddy viscosity for now
3992 evaluateCoefficients(eps_rho,
3993 eps_mu,
3994 particle_eps,
3995 sigma,
3996 rho_0,
3997 nu_0,
3998 rho_1,
3999 nu_1,
4000 elementDiameter[eN],
4001 smagorinskyConstant,
4002 turbulenceClosureModel,
4003 g.data(),
4004 useVF,
4005 ebqe_vf_ext[ebNE_kb],
4006 ebqe_phi_ext[ebNE_kb],
4007 &ebqe_normal_phi_ext[ebNE_kb_nSpace],
4008 distance_to_omega_solid,
4009 ebqe_kappa_phi_ext[ebNE_kb],
4010 //VRANS
4011 porosity_ext,
4012 //
4013 p_ext,
4014 grad_p_ext,
4015 grad_u_ext,
4016 grad_v_ext,
4017 grad_w_ext,
4018 u_ext,
4019 v_ext,
4020 w_ext,
4021 ebqe_velocity_star[ebNE_kb_nSpace+0],
4022 ebqe_velocity_star[ebNE_kb_nSpace+1],
4023 ebqe_velocity_star[ebNE_kb_nSpace+1],//hack,not used
4024 eddy_viscosity_ext,
4025 mom_u_acc_ext,
4026 dmom_u_acc_u_ext,
4027 mom_v_acc_ext,
4028 dmom_v_acc_v_ext,
4029 mom_w_acc_ext,
4030 dmom_w_acc_w_ext,
4031 mass_adv_ext,
4032 dmass_adv_u_ext,
4033 dmass_adv_v_ext,
4034 dmass_adv_w_ext,
4035 mom_u_adv_ext,
4036 dmom_u_adv_u_ext,
4037 dmom_u_adv_v_ext,
4038 dmom_u_adv_w_ext,
4039 mom_v_adv_ext,
4040 dmom_v_adv_u_ext,
4041 dmom_v_adv_v_ext,
4042 dmom_v_adv_w_ext,
4043 mom_w_adv_ext,
4044 dmom_w_adv_u_ext,
4045 dmom_w_adv_v_ext,
4046 dmom_w_adv_w_ext,
4047 mom_uu_diff_ten_ext,
4048 mom_vv_diff_ten_ext,
4049 mom_ww_diff_ten_ext,
4050 mom_uv_diff_ten_ext,
4051 mom_uw_diff_ten_ext,
4052 mom_vu_diff_ten_ext,
4053 mom_vw_diff_ten_ext,
4054 mom_wu_diff_ten_ext,
4055 mom_wv_diff_ten_ext,
4056 mom_u_source_ext,
4057 mom_v_source_ext,
4058 mom_w_source_ext,
4059 mom_u_ham_ext,
4060 dmom_u_ham_grad_p_ext,
4061 dmom_u_ham_grad_u_ext,
4062 mom_v_ham_ext,
4063 dmom_v_ham_grad_p_ext,
4064 dmom_v_ham_grad_v_ext,
4065 mom_w_ham_ext,
4066 dmom_w_ham_grad_p_ext,
4067 dmom_w_ham_grad_w_ext,
4068 ebqe_rho[ebNE_kb],
4069 ebqe_nu[ebNE_kb],
4070 KILL_PRESSURE_TERM,
4071 0,
4072 0., // mql: zero force term at boundary
4073 0.,
4074 0.,
4075 MATERIAL_PARAMETERS_AS_FUNCTION,
4076 ebqe_density_as_function[ebNE_kb],
4077 ebqe_dynamic_viscosity_as_function[ebNE_kb],
4078 USE_SBM,
4079 x_ext,y_ext,z_ext,
4080 use_ball_as_particle,
4081 ball_center.data(),
4082 ball_radius.data(),
4083 ball_velocity.data(),
4084 ball_angular_velocity.data(),
4085 INT_BY_PARTS_PRESSURE);
4086 evaluateCoefficients(eps_rho,
4087 eps_mu,
4088 particle_eps,
4089 sigma,
4090 rho_0,
4091 nu_0,
4092 rho_1,
4093 nu_1,
4094 elementDiameter[eN],
4095 smagorinskyConstant,
4096 turbulenceClosureModel,
4097 g.data(),
4098 useVF,
4099 bc_ebqe_vf_ext[ebNE_kb],
4100 bc_ebqe_phi_ext[ebNE_kb],
4101 &ebqe_normal_phi_ext[ebNE_kb_nSpace],
4102 distance_to_omega_solid,
4103 ebqe_kappa_phi_ext[ebNE_kb],
4104 //VRANS
4105 porosity_ext,
4106 //
4107 bc_p_ext,
4108 grad_p_ext,
4109 grad_u_ext,
4110 grad_v_ext,
4111 grad_w_ext,
4112 bc_u_ext,
4113 bc_v_ext,
4114 bc_w_ext,
4115 ebqe_velocity_star[ebNE_kb_nSpace+0],
4116 ebqe_velocity_star[ebNE_kb_nSpace+1],
4117 ebqe_velocity_star[ebNE_kb_nSpace+1],//hack,not used
4118 bc_eddy_viscosity_ext,
4119 bc_mom_u_acc_ext,
4120 bc_dmom_u_acc_u_ext,
4121 bc_mom_v_acc_ext,
4122 bc_dmom_v_acc_v_ext,
4123 bc_mom_w_acc_ext,
4124 bc_dmom_w_acc_w_ext,
4125 bc_mass_adv_ext,
4126 bc_dmass_adv_u_ext,
4127 bc_dmass_adv_v_ext,
4128 bc_dmass_adv_w_ext,
4129 bc_mom_u_adv_ext,
4130 bc_dmom_u_adv_u_ext,
4131 bc_dmom_u_adv_v_ext,
4132 bc_dmom_u_adv_w_ext,
4133 bc_mom_v_adv_ext,
4134 bc_dmom_v_adv_u_ext,
4135 bc_dmom_v_adv_v_ext,
4136 bc_dmom_v_adv_w_ext,
4137 bc_mom_w_adv_ext,
4138 bc_dmom_w_adv_u_ext,
4139 bc_dmom_w_adv_v_ext,
4140 bc_dmom_w_adv_w_ext,
4141 bc_mom_uu_diff_ten_ext,
4142 bc_mom_vv_diff_ten_ext,
4143 bc_mom_ww_diff_ten_ext,
4144 bc_mom_uv_diff_ten_ext,
4145 bc_mom_uw_diff_ten_ext,
4146 bc_mom_vu_diff_ten_ext,
4147 bc_mom_vw_diff_ten_ext,
4148 bc_mom_wu_diff_ten_ext,
4149 bc_mom_wv_diff_ten_ext,
4150 bc_mom_u_source_ext,
4151 bc_mom_v_source_ext,
4152 bc_mom_w_source_ext,
4153 bc_mom_u_ham_ext,
4154 bc_dmom_u_ham_grad_p_ext,
4155 bc_dmom_u_ham_grad_u_ext,
4156 bc_mom_v_ham_ext,
4157 bc_dmom_v_ham_grad_p_ext,
4158 bc_dmom_v_ham_grad_v_ext,
4159 bc_mom_w_ham_ext,
4160 bc_dmom_w_ham_grad_p_ext,
4161 bc_dmom_w_ham_grad_w_ext,
4162 ebqe_rho[ebNE_kb],
4163 ebqe_nu[ebNE_kb],
4164 KILL_PRESSURE_TERM,
4165 0,
4166 0., // mql: zero force term at boundary
4167 0.,
4168 0.,
4169 MATERIAL_PARAMETERS_AS_FUNCTION,
4170 ebqe_density_as_function[ebNE_kb],
4171 ebqe_dynamic_viscosity_as_function[ebNE_kb],
4172 USE_SBM,
4173 x_ext,y_ext,z_ext,
4174 use_ball_as_particle,
4175 ball_center.data(),
4176 ball_radius.data(),
4177 ball_velocity.data(),
4178 ball_angular_velocity.data(),
4179 INT_BY_PARTS_PRESSURE);
4180
4181 //Turbulence closure model
4182 if (turbulenceClosureModel >= 3)
4183 {
4184 const double turb_var_grad_0_dummy[2] = {0.,0.};
4185 const double c_mu = 0.09;//mwf hack
4186 updateTurbulenceClosure(turbulenceClosureModel,
4187 eps_rho,
4188 eps_mu,
4189 rho_0,
4190 nu_0,
4191 rho_1,
4192 nu_1,
4193 useVF,
4194 ebqe_vf_ext[ebNE_kb],
4195 ebqe_phi_ext[ebNE_kb],
4196 porosity_ext,
4197 c_mu, //mwf hack
4198 ebqe_turb_var_0[ebNE_kb],
4199 ebqe_turb_var_1[ebNE_kb],
4200 turb_var_grad_0_dummy, //not needed
4201 eddy_viscosity_ext,
4202 mom_uu_diff_ten_ext,
4203 mom_vv_diff_ten_ext,
4204 mom_ww_diff_ten_ext,
4205 mom_uv_diff_ten_ext,
4206 mom_uw_diff_ten_ext,
4207 mom_vu_diff_ten_ext,
4208 mom_vw_diff_ten_ext,
4209 mom_wu_diff_ten_ext,
4210 mom_wv_diff_ten_ext,
4211 mom_u_source_ext,
4212 mom_v_source_ext,
4213 mom_w_source_ext);
4214
4215 updateTurbulenceClosure(turbulenceClosureModel,
4216 eps_rho,
4217 eps_mu,
4218 rho_0,
4219 nu_0,
4220 rho_1,
4221 nu_1,
4222 useVF,
4223 bc_ebqe_vf_ext[ebNE_kb],
4224 bc_ebqe_phi_ext[ebNE_kb],
4225 porosity_ext,
4226 c_mu, //mwf hack
4227 ebqe_turb_var_0[ebNE_kb],
4228 ebqe_turb_var_1[ebNE_kb],
4229 turb_var_grad_0_dummy, //not needed
4230 bc_eddy_viscosity_ext,
4231 bc_mom_uu_diff_ten_ext,
4232 bc_mom_vv_diff_ten_ext,
4233 bc_mom_ww_diff_ten_ext,
4234 bc_mom_uv_diff_ten_ext,
4235 bc_mom_uw_diff_ten_ext,
4236 bc_mom_vu_diff_ten_ext,
4237 bc_mom_vw_diff_ten_ext,
4238 bc_mom_wu_diff_ten_ext,
4239 bc_mom_wv_diff_ten_ext,
4240 bc_mom_u_source_ext,
4241 bc_mom_v_source_ext,
4242 bc_mom_w_source_ext);
4243 }
4244
4245
4246 //
4247 //moving domain
4248 //
4249 mom_u_adv_ext[0] -= MOVING_DOMAIN*dmom_u_acc_u_ext*mom_u_acc_ext*xt_ext; // times rho*porosity. mql. CHECK.
4250 mom_u_adv_ext[1] -= MOVING_DOMAIN*dmom_u_acc_u_ext*mom_u_acc_ext*yt_ext;
4251 /* mom_u_adv_ext[2] -= MOVING_DOMAIN*dmom_u_acc_u_ext*mom_u_acc_ext*zt_ext; */
4252 dmom_u_adv_u_ext[0] -= MOVING_DOMAIN*dmom_u_acc_u_ext*xt_ext;
4253 dmom_u_adv_u_ext[1] -= MOVING_DOMAIN*dmom_u_acc_u_ext*yt_ext;
4254 /* dmom_u_adv_u_ext[2] -= MOVING_DOMAIN*dmom_u_acc_u_ext*zt_ext; */
4255
4256 mom_v_adv_ext[0] -= MOVING_DOMAIN*dmom_v_acc_v_ext*mom_v_acc_ext*xt_ext;
4257 mom_v_adv_ext[1] -= MOVING_DOMAIN*dmom_v_acc_v_ext*mom_v_acc_ext*yt_ext;
4258 /* mom_v_adv_ext[2] -= MOVING_DOMAIN*dmom_v_acc_v_ext*mom_v_acc_ext*zt_ext; */
4259 dmom_v_adv_v_ext[0] -= MOVING_DOMAIN*dmom_v_acc_v_ext*xt_ext;
4260 dmom_v_adv_v_ext[1] -= MOVING_DOMAIN*dmom_v_acc_v_ext*yt_ext;
4261 /* dmom_v_adv_v_ext[2] -= MOVING_DOMAIN*dmom_v_acc_v_ext*zt_ext; */
4262
4263 /* mom_w_adv_ext[0] -= MOVING_DOMAIN*dmom_w_acc_w_ext*mom_w_acc_ext*xt_ext; */
4264 /* mom_w_adv_ext[1] -= MOVING_DOMAIN*dmom_w_acc_w_ext*mom_w_acc_ext*yt_ext; */
4265 /* mom_w_adv_ext[2] -= MOVING_DOMAIN*dmom_w_acc_w_ext*mom_w_acc_ext*zt_ext; */
4266 /* dmom_w_adv_w_ext[0] -= MOVING_DOMAIN*dmom_w_acc_w_ext*xt_ext; */
4267 /* dmom_w_adv_w_ext[1] -= MOVING_DOMAIN*dmom_w_acc_w_ext*yt_ext; */
4268 /* dmom_w_adv_w_ext[2] -= MOVING_DOMAIN*dmom_w_acc_w_ext*zt_ext; */
4269
4270 //bc's
4271 // mql. CHECK.
4272 bc_mom_u_adv_ext[0] -= MOVING_DOMAIN*dmom_u_acc_u_ext*bc_mom_u_acc_ext*xt_ext;
4273 bc_mom_u_adv_ext[1] -= MOVING_DOMAIN*dmom_u_acc_u_ext*bc_mom_u_acc_ext*yt_ext;
4274 /* bc_mom_u_adv_ext[2] -= MOVING_DOMAIN*dmom_u_acc_u_ext*bc_mom_u_acc_ext*zt_ext; */
4275
4276 bc_mom_v_adv_ext[0] -= MOVING_DOMAIN*dmom_v_acc_v_ext*bc_mom_v_acc_ext*xt_ext;
4277 bc_mom_v_adv_ext[1] -= MOVING_DOMAIN*dmom_v_acc_v_ext*bc_mom_v_acc_ext*yt_ext;
4278 /* bc_mom_v_adv_ext[2] -= MOVING_DOMAIN*dmom_v_acc_v_ext*bc_mom_v_acc_ext*zt_ext; */
4279
4280 /* bc_mom_w_adv_ext[0] -= MOVING_DOMAIN*dmom_w_acc_w_ext*bc_mom_w_acc_ext*xt_ext; */
4281 /* bc_mom_w_adv_ext[1] -= MOVING_DOMAIN*dmom_w_acc_w_ext*bc_mom_w_acc_ext*yt_ext; */
4282 /* bc_mom_w_adv_ext[2] -= MOVING_DOMAIN*dmom_w_acc_w_ext*bc_mom_w_acc_ext*zt_ext; */
4283 //
4284 //calculate the numerical fluxes
4285 //
4286 ck.calculateGScale(G,normal,h_penalty);
4287 penalty = useMetrics*C_b/h_penalty + (1.0-useMetrics)*ebqe_penalty_ext[ebNE_kb];
4288 exteriorNumericalAdvectiveFlux(isDOFBoundary_p[ebNE_kb],
4289 isDOFBoundary_u[ebNE_kb],
4290 isDOFBoundary_v[ebNE_kb],
4291 isDOFBoundary_w[ebNE_kb],
4292 isAdvectiveFluxBoundary_p[ebNE_kb],
4293 isAdvectiveFluxBoundary_u[ebNE_kb],
4294 isAdvectiveFluxBoundary_v[ebNE_kb],
4295 isAdvectiveFluxBoundary_w[ebNE_kb],
4296 dmom_u_ham_grad_p_ext[0],//=1/rho,
4297 bc_dmom_u_ham_grad_p_ext[0],//=1/bc_rho,
4298 normal,
4299 dmom_u_acc_u_ext,
4300 bc_p_ext,
4301 bc_u_ext,
4302 bc_v_ext,
4303 bc_w_ext,
4304 bc_mass_adv_ext,
4305 bc_mom_u_adv_ext,
4306 bc_mom_v_adv_ext,
4307 bc_mom_w_adv_ext,
4308 ebqe_bc_flux_mass_ext[ebNE_kb]+MOVING_DOMAIN*(xt_ext*normal[0]+yt_ext*normal[1]),//BC is relative mass flux
4309 ebqe_bc_flux_mom_u_adv_ext[ebNE_kb],
4310 ebqe_bc_flux_mom_v_adv_ext[ebNE_kb],
4311 ebqe_bc_flux_mom_w_adv_ext[ebNE_kb],
4312 p_ext,
4313 u_ext,
4314 v_ext,
4315 w_ext,
4316 mass_adv_ext,
4317 mom_u_adv_ext,
4318 mom_v_adv_ext,
4319 mom_w_adv_ext,
4320 dmass_adv_u_ext,
4321 dmass_adv_v_ext,
4322 dmass_adv_w_ext,
4323 dmom_u_adv_p_ext,
4324 dmom_u_adv_u_ext,
4325 dmom_u_adv_v_ext,
4326 dmom_u_adv_w_ext,
4327 dmom_v_adv_p_ext,
4328 dmom_v_adv_u_ext,
4329 dmom_v_adv_v_ext,
4330 dmom_v_adv_w_ext,
4331 dmom_w_adv_p_ext,
4332 dmom_w_adv_u_ext,
4333 dmom_w_adv_v_ext,
4334 dmom_w_adv_w_ext,
4335 flux_mass_ext,
4336 flux_mom_u_adv_ext,
4337 flux_mom_v_adv_ext,
4338 flux_mom_w_adv_ext,
4339 &ebqe_velocity_star[ebNE_kb_nSpace],
4340 &ebqe_velocity[ebNE_kb_nSpace]);
4341 // mql: save gradient of solution for other models and to compute errors
4342 for (int I=0;I<nSpace;I++)
4343 {
4344 ebqe_grad_u[ebNE_kb_nSpace+I] = grad_u_ext[I];
4345 ebqe_grad_v[ebNE_kb_nSpace+I] = grad_v_ext[I];
4346 /* ebqe_grad_w[ebNE_kb_nSpace+I] = grad_w_ext[I]; */
4347 }
4349 ebqe_phi_ext[ebNE_kb],
4350 sdInfo_u_u_rowptr.data(),
4351 sdInfo_u_u_colind.data(),
4352 isDOFBoundary_u[ebNE_kb],
4353 isDiffusiveFluxBoundary_u[ebNE_kb],
4354 normal,
4355 bc_mom_uu_diff_ten_ext,
4356 bc_u_ext,
4357 ebqe_bc_flux_u_diff_ext[ebNE_kb],
4358 mom_uu_diff_ten_ext,
4359 grad_u_ext,
4360 u_ext,
4361 penalty,//ebqe_penalty_ext[ebNE_kb],
4362 flux_mom_uu_diff_ext);
4364 ebqe_phi_ext[ebNE_kb],
4365 sdInfo_u_v_rowptr.data(),
4366 sdInfo_u_v_colind.data(),
4367 isDOFBoundary_v[ebNE_kb],
4368 isDiffusiveFluxBoundary_v[ebNE_kb],
4369 normal,
4370 bc_mom_uv_diff_ten_ext,
4371 bc_v_ext,
4372 0.0,//assume all of the flux gets applied in diagonal component
4373 mom_uv_diff_ten_ext,
4374 grad_v_ext,
4375 v_ext,
4376 penalty,//ebqe_penalty_ext[ebNE_kb],
4377 flux_mom_uv_diff_ext);
4378 /* exteriorNumericalDiffusiveFlux(eps_rho, */
4379 /* ebqe_phi_ext[ebNE_kb], */
4380 /* sdInfo_u_w_rowptr, */
4381 /* sdInfo_u_w_colind, */
4382 /* isDOFBoundary_w[ebNE_kb], */
4383 /* isDiffusiveFluxBoundary_u[ebNE_kb], */
4384 /* normal, */
4385 /* bc_mom_uw_diff_ten_ext, */
4386 /* bc_w_ext, */
4387 /* 0.0,//see above */
4388 /* mom_uw_diff_ten_ext, */
4389 /* grad_w_ext, */
4390 /* w_ext, */
4391 /* penalty,//ebqe_penalty_ext[ebNE_kb], */
4392 /* flux_mom_uw_diff_ext); */
4394 ebqe_phi_ext[ebNE_kb],
4395 sdInfo_v_u_rowptr.data(),
4396 sdInfo_v_u_colind.data(),
4397 isDOFBoundary_u[ebNE_kb],
4398 isDiffusiveFluxBoundary_u[ebNE_kb],
4399 normal,
4400 bc_mom_vu_diff_ten_ext,
4401 bc_u_ext,
4402 0.0,//see above
4403 mom_vu_diff_ten_ext,
4404 grad_u_ext,
4405 u_ext,
4406 penalty,//ebqe_penalty_ext[ebNE_kb],
4407 flux_mom_vu_diff_ext);
4409 ebqe_phi_ext[ebNE_kb],
4410 sdInfo_v_v_rowptr.data(),
4411 sdInfo_v_v_colind.data(),
4412 isDOFBoundary_v[ebNE_kb],
4413 isDiffusiveFluxBoundary_v[ebNE_kb],
4414 normal,
4415 bc_mom_vv_diff_ten_ext,
4416 bc_v_ext,
4417 ebqe_bc_flux_v_diff_ext[ebNE_kb],
4418 mom_vv_diff_ten_ext,
4419 grad_v_ext,
4420 v_ext,
4421 penalty,//ebqe_penalty_ext[ebNE_kb],
4422 flux_mom_vv_diff_ext);
4423 /* exteriorNumericalDiffusiveFlux(eps_rho, */
4424 /* ebqe_phi_ext[ebNE_kb], */
4425 /* sdInfo_v_w_rowptr, */
4426 /* sdInfo_v_w_colind, */
4427 /* isDOFBoundary_w[ebNE_kb], */
4428 /* isDiffusiveFluxBoundary_v[ebNE_kb], */
4429 /* normal, */
4430 /* bc_mom_vw_diff_ten_ext, */
4431 /* bc_w_ext, */
4432 /* 0.0,//see above */
4433 /* mom_vw_diff_ten_ext, */
4434 /* grad_w_ext, */
4435 /* w_ext, */
4436 /* penalty,//ebqe_penalty_ext[ebNE_kb], */
4437 /* flux_mom_vw_diff_ext); */
4438 /* exteriorNumericalDiffusiveFlux(eps_rho, */
4439 /* ebqe_phi_ext[ebNE_kb], */
4440 /* sdInfo_w_u_rowptr, */
4441 /* sdInfo_w_u_colind, */
4442 /* isDOFBoundary_u[ebNE_kb], */
4443 /* isDiffusiveFluxBoundary_w[ebNE_kb], */
4444 /* normal, */
4445 /* bc_mom_wu_diff_ten_ext, */
4446 /* bc_u_ext, */
4447 /* 0.0,//see above */
4448 /* mom_wu_diff_ten_ext, */
4449 /* grad_u_ext, */
4450 /* u_ext, */
4451 /* penalty,//ebqe_penalty_ext[ebNE_kb], */
4452 /* flux_mom_wu_diff_ext); */
4453 /* exteriorNumericalDiffusiveFlux(eps_rho, */
4454 /* ebqe_phi_ext[ebNE_kb], */
4455 /* sdInfo_w_v_rowptr, */
4456 /* sdInfo_w_v_colind, */
4457 /* isDOFBoundary_v[ebNE_kb], */
4458 /* isDiffusiveFluxBoundary_w[ebNE_kb], */
4459 /* normal, */
4460 /* bc_mom_wv_diff_ten_ext, */
4461 /* bc_v_ext, */
4462 /* 0.0,//see above */
4463 /* mom_wv_diff_ten_ext, */
4464 /* grad_v_ext, */
4465 /* v_ext, */
4466 /* penalty,//ebqe_penalty_ext[ebNE_kb], */
4467 /* flux_mom_wv_diff_ext); */
4468 /* exteriorNumericalDiffusiveFlux(eps_rho, */
4469 /* ebqe_phi_ext[ebNE_kb], */
4470 /* sdInfo_w_w_rowptr, */
4471 /* sdInfo_w_w_colind, */
4472 /* isDOFBoundary_w[ebNE_kb], */
4473 /* isDiffusiveFluxBoundary_w[ebNE_kb], */
4474 /* normal, */
4475 /* bc_mom_ww_diff_ten_ext, */
4476 /* bc_w_ext, */
4477 /* ebqe_bc_flux_w_diff_ext[ebNE_kb], */
4478 /* mom_ww_diff_ten_ext, */
4479 /* grad_w_ext, */
4480 /* w_ext, */
4481 /* penalty,//ebqe_penalty_ext[ebNE_kb], */
4482 /* flux_mom_ww_diff_ext); */
4483 flux[ebN*nQuadraturePoints_elementBoundary+kb] = flux_mass_ext;
4484 /* std::cout<<"external u,v,u_n " */
4485 /* <<ebqe_velocity[ebNE_kb_nSpace+0]<<'\t' */
4486 /* <<ebqe_velocity[ebNE_kb_nSpace+1]<<'\t' */
4487 /* <<flux[ebN*nQuadraturePoints_elementBoundary+kb]<<std::endl; */
4488 //
4489 //integrate the net force and moment on flagged boundaries
4490 //
4491 if (ebN < nElementBoundaries_owned)
4492 {
4493 force_v_x = (flux_mom_u_adv_ext + flux_mom_uu_diff_ext + flux_mom_uv_diff_ext + flux_mom_uw_diff_ext)/dmom_u_ham_grad_p_ext[0];//same as *rho
4494 force_v_y = (flux_mom_v_adv_ext + flux_mom_vu_diff_ext + flux_mom_vv_diff_ext + flux_mom_vw_diff_ext)/dmom_u_ham_grad_p_ext[0];
4495 //force_v_z = (flux_mom_wu_diff_ext + flux_mom_wv_diff_ext + flux_mom_ww_diff_ext)/dmom_u_ham_grad_p_ext[0];
4496
4497 force_p_x = p_ext*normal[0];
4498 force_p_y = p_ext*normal[1];
4499 //force_p_z = p_ext*normal[2];
4500
4501 force_x = force_p_x + force_v_x;
4502 force_y = force_p_y + force_v_y;
4503 //force_z = force_p_z + force_v_z;
4504
4505 r_x = x_ext - barycenters[3*boundaryFlags[ebN]+0];
4506 r_y = y_ext - barycenters[3*boundaryFlags[ebN]+1];
4507 //r_z = z_ext - barycenters[3*boundaryFlags[ebN]+2];
4508
4509 wettedAreas[boundaryFlags[ebN]] += dS*(1.0-ebqe_vf_ext[ebNE_kb]);
4510
4511 netForces_p[3*boundaryFlags[ebN]+0] += force_p_x*dS;
4512 netForces_p[3*boundaryFlags[ebN]+1] += force_p_y*dS;
4513 //netForces_p[3*boundaryFlags[ebN]+2] += force_p_z*dS;
4514
4515 netForces_v[3*boundaryFlags[ebN]+0] += force_v_x*dS;
4516 netForces_v[3*boundaryFlags[ebN]+1] += force_v_y*dS;
4517 //netForces_v[3*boundaryFlags[ebN]+2] += force_v_z*dS;
4518
4519 //netMoments[3*boundaryFlags[ebN]+0] += (r_y*force_z - r_z*force_y)*dS;
4520 //netMoments[3*boundaryFlags[ebN]+1] += (r_z*force_x - r_x*force_z)*dS;
4521 netMoments[3*boundaryFlags[ebN]+2] += (r_x*force_y - r_y*force_x)*dS;
4522 }
4523 //
4524 //update residuals
4525 //
4526 for (int i=0;i<nDOF_test_element;i++)
4527 {
4528 /* elementResidual_mesh[i] -= ck.ExteriorElementBoundaryFlux(MOVING_DOMAIN*(xt_ext*normal[0]+yt_ext*normal[1]),p_test_dS[i]); */
4529 /* elementResidual_p[i] += ck.ExteriorElementBoundaryFlux(flux_mass_ext,p_test_dS[i]); */
4530 /* elementResidual_p[i] -= DM*ck.ExteriorElementBoundaryFlux(MOVING_DOMAIN*(xt_ext*normal[0]+yt_ext*normal[1]),p_test_dS[i]); */
4531 /* globalConservationError += ck.ExteriorElementBoundaryFlux(flux_mass_ext,p_test_dS[i]); */
4532 elementResidual_u[i] +=
4533 (INT_BY_PARTS_PRESSURE==1 ? p_ext*vel_test_dS[i]*normal[0] : 0.) +
4534 ck.ExteriorElementBoundaryFlux(flux_mom_u_adv_ext,vel_test_dS[i])+
4535 ck.ExteriorElementBoundaryFlux(flux_mom_uu_diff_ext,vel_test_dS[i])+
4536 ck.ExteriorElementBoundaryFlux(flux_mom_uv_diff_ext,vel_test_dS[i])+
4537 ck.ExteriorElementBoundaryDiffusionAdjoint(isDOFBoundary_u[ebNE_kb],
4538 isDiffusiveFluxBoundary_u[ebNE_kb],
4539 eb_adjoint_sigma,
4540 u_ext,
4541 bc_u_ext,
4542 normal,
4543 sdInfo_u_u_rowptr.data(),
4544 sdInfo_u_u_colind.data(),
4545 mom_uu_diff_ten_ext,
4546 &vel_grad_test_dS[i*nSpace])+
4547 ck.ExteriorElementBoundaryDiffusionAdjoint(isDOFBoundary_v[ebNE_kb],
4548 isDiffusiveFluxBoundary_u[ebNE_kb],
4549 eb_adjoint_sigma,
4550 v_ext,
4551 bc_v_ext,
4552 normal,
4553 sdInfo_u_v_rowptr.data(),
4554 sdInfo_u_v_colind.data(),
4555 mom_uv_diff_ten_ext,
4556 &vel_grad_test_dS[i*nSpace]);//+
4557 /* ck.ExteriorElementBoundaryDiffusionAdjoint(isDOFBoundary_w[ebNE_kb], */
4558 /* isDiffusiveFluxBoundary_u[ebNE_kb], */
4559 /* eb_adjoint_sigma, */
4560 /* w_ext, */
4561 /* bc_w_ext, */
4562 /* normal, */
4563 /* sdInfo_u_w_rowptr, */
4564 /* sdInfo_u_w_colind, */
4565 /* mom_uw_diff_ten_ext, */
4566 /* &vel_grad_test_dS[i*nSpace]); */
4567 elementResidual_v[i] +=
4568 (INT_BY_PARTS_PRESSURE==1 ? p_ext*vel_test_dS[i]*normal[1] : 0.) +
4569 ck.ExteriorElementBoundaryFlux(flux_mom_v_adv_ext,vel_test_dS[i]) +
4570 ck.ExteriorElementBoundaryFlux(flux_mom_vu_diff_ext,vel_test_dS[i])+
4571 ck.ExteriorElementBoundaryFlux(flux_mom_vv_diff_ext,vel_test_dS[i])+
4572 ck.ExteriorElementBoundaryDiffusionAdjoint(isDOFBoundary_u[ebNE_kb],
4573 isDiffusiveFluxBoundary_v[ebNE_kb],
4574 eb_adjoint_sigma,
4575 u_ext,
4576 bc_u_ext,
4577 normal,
4578 sdInfo_v_u_rowptr.data(),
4579 sdInfo_v_u_colind.data(),
4580 mom_vu_diff_ten_ext,
4581 &vel_grad_test_dS[i*nSpace])+
4582 ck.ExteriorElementBoundaryDiffusionAdjoint(isDOFBoundary_v[ebNE_kb],
4583 isDiffusiveFluxBoundary_v[ebNE_kb],
4584 eb_adjoint_sigma,
4585 v_ext,
4586 bc_v_ext,
4587 normal,
4588 sdInfo_v_v_rowptr.data(),
4589 sdInfo_v_v_colind.data(),
4590 mom_vv_diff_ten_ext,
4591 &vel_grad_test_dS[i*nSpace]);//+
4592 /* ck.ExteriorElementBoundaryDiffusionAdjoint(isDOFBoundary_w[ebNE_kb], */
4593 /* isDiffusiveFluxBoundary_v[ebNE_kb], */
4594 /* eb_adjoint_sigma, */
4595 /* w_ext, */
4596 /* bc_w_ext, */
4597 /* normal, */
4598 /* sdInfo_v_w_rowptr, */
4599 /* sdInfo_v_w_colind, */
4600 /* mom_vw_diff_ten_ext, */
4601 /* &vel_grad_test_dS[i*nSpace]); */
4602
4603 /* elementResidual_w[i] += */
4604 /* (INT_BY_PARTS_PRESSURE==1 ? p_ext*vel_test_dS[i]*normal[2] : 0.) +*/
4605 /* ck.ExteriorElementBoundaryFlux(flux_mom_w_adv_ext,vel_test_dS[i]) + */
4606 /* ck.ExteriorElementBoundaryFlux(flux_mom_wu_diff_ext,vel_test_dS[i])+ */
4607 /* ck.ExteriorElementBoundaryFlux(flux_mom_wv_diff_ext,vel_test_dS[i])+ */
4608 /* ck.ExteriorElementBoundaryFlux(flux_mom_ww_diff_ext,vel_test_dS[i])+ */
4609 /* ck.ExteriorElementBoundaryDiffusionAdjoint(isDOFBoundary_u[ebNE_kb], */
4610 /* isDiffusiveFluxBoundary_w[ebNE_kb], */
4611 /* eb_adjoint_sigma, */
4612 /* u_ext, */
4613 /* bc_u_ext, */
4614 /* normal, */
4615 /* sdInfo_w_u_rowptr, */
4616 /* sdInfo_w_u_colind, */
4617 /* mom_wu_diff_ten_ext, */
4618 /* &vel_grad_test_dS[i*nSpace])+ */
4619 /* ck.ExteriorElementBoundaryDiffusionAdjoint(isDOFBoundary_v[ebNE_kb], */
4620 /* isDiffusiveFluxBoundary_w[ebNE_kb], */
4621 /* eb_adjoint_sigma, */
4622 /* v_ext, */
4623 /* bc_v_ext, */
4624 /* normal, */
4625 /* sdInfo_w_v_rowptr, */
4626 /* sdInfo_w_v_colind, */
4627 /* mom_wv_diff_ten_ext, */
4628 /* &vel_grad_test_dS[i*nSpace])+ */
4629 /* ck.ExteriorElementBoundaryDiffusionAdjoint(isDOFBoundary_w[ebNE_kb], */
4630 /* isDiffusiveFluxBoundary_w[ebNE_kb], */
4631 /* eb_adjoint_sigma, */
4632 /* w_ext, */
4633 /* bc_w_ext, */
4634 /* normal, */
4635 /* sdInfo_w_w_rowptr, */
4636 /* sdInfo_w_w_colind, */
4637 /* mom_ww_diff_ten_ext, */
4638 /* &vel_grad_test_dS[i*nSpace]); */
4639 }//i
4640 }//kb
4641 //
4642 //update the element and global residual storage
4643 //
4644 for (int i=0;i<nDOF_test_element;i++)
4645 {
4646 int eN_i = eN*nDOF_test_element+i;
4647
4648 /* elementResidual_p_save[eN_i] += elementResidual_p[i]; */
4649 /* mesh_volume_conservation_weak += elementResidual_mesh[i]; */
4650 /* globalResidual[offset_p+stride_p*p_l2g[eN_i]]+=elementResidual_p[i]; */
4651 globalResidual[offset_u+stride_u*vel_l2g[eN_i]]+=elementResidual_u[i];
4652 globalResidual[offset_v+stride_v*vel_l2g[eN_i]]+=elementResidual_v[i];
4653 /* globalResidual[offset_w+stride_w*vel_l2g[eN_i]]+=elementResidual_w[i]; */
4654 }//i
4655 }//ebNE
4656 gf.useExact=useExact;
4657 gf_s.useExact=useExact;
4658 /* std::cout<<"mesh volume conservation = "<<mesh_volume_conservation<<std::endl; */
4659 /* std::cout<<"mesh volume conservation weak = "<<mesh_volume_conservation_weak<<std::endl; */
4660 /* std::cout<<"mesh volume conservation err max= "<<mesh_volume_conservation_err_max<<std::endl; */
4661 /* std::cout<<"mesh volume conservation err max weak = "<<mesh_volume_conservation_err_max_weak<<std::endl; */
4663 {
4664 particle_surfaceArea[0] = cut_cell_boundary_length;
4665 particle_netForces[(0+nParticles)*3 +0] = p_force_x;
4666 particle_netForces[(0+nParticles)*3 +1] = p_force_y;
4667 std::cout<<"===end mesh==="<<std::endl<<std::flush;
4668 }
4669 }
4670
4672 bool useExact)
4673 {
4674 xt::pyarray<double>& mesh_trial_ref = args.array<double>("mesh_trial_ref");
4675 xt::pyarray<double>& mesh_grad_trial_ref = args.array<double>("mesh_grad_trial_ref");
4676 xt::pyarray<double>& mesh_dof = args.array<double>("mesh_dof");
4677 xt::pyarray<double>& mesh_velocity_dof = args.array<double>("mesh_velocity_dof");
4678 double MOVING_DOMAIN = args.scalar<double>("MOVING_DOMAIN");
4679 double PSTAB = args.scalar<double>("PSTAB");
4680 xt::pyarray<int>& mesh_l2g = args.array<int>("mesh_l2g");
4681 xt::pyarray<double>& x_ref = args.array<double>("x_ref");
4682 xt::pyarray<double>& dV_ref = args.array<double>("dV_ref");
4683 xt::pyarray<double>& p_trial_ref = args.array<double>("p_trial_ref");
4684 xt::pyarray<double>& p_grad_trial_ref = args.array<double>("p_grad_trial_ref");
4685 xt::pyarray<double>& p_test_ref = args.array<double>("p_test_ref");
4686 xt::pyarray<double>& p_grad_test_ref = args.array<double>("p_grad_test_ref");
4687 xt::pyarray<double>& q_p = args.array<double>("q_p");
4688 xt::pyarray<double>& q_grad_p = args.array<double>("q_grad_p");
4689 xt::pyarray<double>& ebqe_p = args.array<double>("ebqe_p");
4690 xt::pyarray<double>& ebqe_grad_p = args.array<double>("ebqe_grad_p");
4691 xt::pyarray<double>& vel_trial_ref = args.array<double>("vel_trial_ref");
4692 xt::pyarray<double>& vel_grad_trial_ref = args.array<double>("vel_grad_trial_ref");
4693 xt::pyarray<double>& vel_hess_trial_ref = args.array<double>("vel_hess_trial_ref");
4694 xt::pyarray<double>& vel_test_ref = args.array<double>("vel_test_ref");
4695 xt::pyarray<double>& vel_grad_test_ref = args.array<double>("vel_grad_test_ref");
4696 xt::pyarray<double>& mesh_trial_trace_ref = args.array<double>("mesh_trial_trace_ref");
4697 xt::pyarray<double>& mesh_grad_trial_trace_ref = args.array<double>("mesh_grad_trial_trace_ref");
4698 xt::pyarray<double>& dS_ref = args.array<double>("dS_ref");
4699 xt::pyarray<double>& p_trial_trace_ref = args.array<double>("p_trial_trace_ref");
4700 xt::pyarray<double>& p_grad_trial_trace_ref = args.array<double>("p_grad_trial_trace_ref");
4701 xt::pyarray<double>& p_test_trace_ref = args.array<double>("p_test_trace_ref");
4702 xt::pyarray<double>& p_grad_test_trace_ref = args.array<double>("p_grad_test_trace_ref");
4703 xt::pyarray<double>& vel_trial_trace_ref = args.array<double>("vel_trial_trace_ref");
4704 xt::pyarray<double>& vel_grad_trial_trace_ref = args.array<double>("vel_grad_trial_trace_ref");
4705 xt::pyarray<double>& vel_test_trace_ref = args.array<double>("vel_test_trace_ref");
4706 xt::pyarray<double>& vel_grad_test_trace_ref = args.array<double>("vel_grad_test_trace_ref");
4707 xt::pyarray<double>& normal_ref = args.array<double>("normal_ref");
4708 xt::pyarray<double>& boundaryJac_ref = args.array<double>("boundaryJac_ref");
4709 double eb_adjoint_sigma = args.scalar<double>("eb_adjoint_sigma");
4710 xt::pyarray<double>& elementDiameter = args.array<double>("elementDiameter");
4711 xt::pyarray<double>& nodeDiametersArray = args.array<double>("nodeDiametersArray");
4712 double hFactor = args.scalar<double>("hFactor");
4713 int nElements_global = args.scalar<int>("nElements_global");
4714 int nElements_owned = args.scalar<int>("nElements_owned");
4715 int nElementBoundaries_global = args.scalar<int>("nElementBoundaries_global");
4716 int nElementBoundaries_owned = args.scalar<int>("nElementBoundaries_owned");
4717 int nNodes_owned = args.scalar<int>("nNodes_owned");
4718 double useRBLES = args.scalar<double>("useRBLES");
4719 double useMetrics = args.scalar<double>("useMetrics");
4720 double alphaBDF = args.scalar<double>("alphaBDF");
4721 double epsFact_rho = args.scalar<double>("epsFact_rho");
4722 double epsFact_mu = args.scalar<double>("epsFact_mu");
4723 double sigma = args.scalar<double>("sigma");
4724 double rho_0 = args.scalar<double>("rho_0");
4725 double nu_0 = args.scalar<double>("nu_0");
4726 double rho_1 = args.scalar<double>("rho_1");
4727 double nu_1 = args.scalar<double>("nu_1");
4728 double smagorinskyConstant = args.scalar<double>("smagorinskyConstant");
4729 int turbulenceClosureModel = args.scalar<int>("turbulenceClosureModel");
4730 double Ct_sge = args.scalar<double>("Ct_sge");
4731 double Cd_sge = args.scalar<double>("Cd_sge");
4732 double C_dg = args.scalar<double>("C_dg");
4733 double C_b = args.scalar<double>("C_b");
4734 const xt::pyarray<double>& eps_solid = args.array<double>("eps_solid");
4735 const xt::pyarray<double>& ebq_global_phi_solid = args.array<double>("ebq_global_phi_solid");
4736 const xt::pyarray<double>& ebq_global_grad_phi_solid = args.array<double>("ebq_global_grad_phi_solid");
4737 const xt::pyarray<double>& ebq_particle_velocity_solid = args.array<double>("ebq_particle_velocity_solid");
4738 xt::pyarray<double>& phi_solid_nodes = args.array<double>("phi_solid_nodes");
4739 const xt::pyarray<double>& phi_solid = args.array<double>("phi_solid");
4740 const xt::pyarray<double>& q_velocity_solid = args.array<double>("q_velocity_solid");
4741 const xt::pyarray<double>& q_velocityStar_solid = args.array<double>("q_velocityStar_solid");
4742 const xt::pyarray<double>& q_vos = args.array<double>("q_vos");
4743 const xt::pyarray<double>& q_dvos_dt = args.array<double>("q_dvos_dt");
4744 const xt::pyarray<double>& q_grad_vos = args.array<double>("q_grad_vos");
4745 const xt::pyarray<double>& q_dragAlpha = args.array<double>("q_dragAlpha");
4746 const xt::pyarray<double>& q_dragBeta = args.array<double>("q_dragBeta");
4747 const xt::pyarray<double>& q_mass_source = args.array<double>("q_mass_source");
4748 const xt::pyarray<double>& q_turb_var_0 = args.array<double>("q_turb_var_0");
4749 const xt::pyarray<double>& q_turb_var_1 = args.array<double>("q_turb_var_1");
4750 const xt::pyarray<double>& q_turb_var_grad_0 = args.array<double>("q_turb_var_grad_0");
4751 xt::pyarray<int>& p_l2g = args.array<int>("p_l2g");
4752 xt::pyarray<int>& vel_l2g = args.array<int>("vel_l2g");
4753 xt::pyarray<double>& p_dof = args.array<double>("p_dof");
4754 xt::pyarray<double>& u_dof = args.array<double>("u_dof");
4755 xt::pyarray<double>& v_dof = args.array<double>("v_dof");
4756 xt::pyarray<double>& w_dof = args.array<double>("w_dof");
4757 xt::pyarray<double>& g = args.array<double>("g");
4758 const double useVF = args.scalar<double>("useVF");
4759 xt::pyarray<double>& vf = args.array<double>("vf");
4760 xt::pyarray<double>& phi = args.array<double>("phi");
4761 xt::pyarray<double>& phi_dof = args.array<double>("phi_dof");
4762 xt::pyarray<double>& normal_phi = args.array<double>("normal_phi");
4763 xt::pyarray<double>& kappa_phi = args.array<double>("kappa_phi");
4764 xt::pyarray<double>& q_mom_u_acc_beta_bdf = args.array<double>("q_mom_u_acc_beta_bdf");
4765 xt::pyarray<double>& q_mom_v_acc_beta_bdf = args.array<double>("q_mom_v_acc_beta_bdf");
4766 xt::pyarray<double>& q_mom_w_acc_beta_bdf = args.array<double>("q_mom_w_acc_beta_bdf");
4767 xt::pyarray<double>& q_dV = args.array<double>("q_dV");
4768 xt::pyarray<double>& q_dV_last = args.array<double>("q_dV_last");
4769 xt::pyarray<double>& q_velocity_sge = args.array<double>("q_velocity_sge");
4770 xt::pyarray<double>& ebqe_velocity_star = args.array<double>("ebqe_velocity_star");
4771 xt::pyarray<double>& q_cfl = args.array<double>("q_cfl");
4772 xt::pyarray<double>& q_numDiff_u_last = args.array<double>("q_numDiff_u_last");
4773 xt::pyarray<double>& q_numDiff_v_last = args.array<double>("q_numDiff_v_last");
4774 xt::pyarray<double>& q_numDiff_w_last = args.array<double>("q_numDiff_w_last");
4775 xt::pyarray<int>& sdInfo_u_u_rowptr = args.array<int>("sdInfo_u_u_rowptr");
4776 xt::pyarray<int>& sdInfo_u_u_colind = args.array<int>("sdInfo_u_u_colind");
4777 xt::pyarray<int>& sdInfo_u_v_rowptr = args.array<int>("sdInfo_u_v_rowptr");
4778 xt::pyarray<int>& sdInfo_u_v_colind = args.array<int>("sdInfo_u_v_colind");
4779 xt::pyarray<int>& sdInfo_u_w_rowptr = args.array<int>("sdInfo_u_w_rowptr");
4780 xt::pyarray<int>& sdInfo_u_w_colind = args.array<int>("sdInfo_u_w_colind");
4781 xt::pyarray<int>& sdInfo_v_v_rowptr = args.array<int>("sdInfo_v_v_rowptr");
4782 xt::pyarray<int>& sdInfo_v_v_colind = args.array<int>("sdInfo_v_v_colind");
4783 xt::pyarray<int>& sdInfo_v_u_rowptr = args.array<int>("sdInfo_v_u_rowptr");
4784 xt::pyarray<int>& sdInfo_v_u_colind = args.array<int>("sdInfo_v_u_colind");
4785 xt::pyarray<int>& sdInfo_v_w_rowptr = args.array<int>("sdInfo_v_w_rowptr");
4786 xt::pyarray<int>& sdInfo_v_w_colind = args.array<int>("sdInfo_v_w_colind");
4787 xt::pyarray<int>& sdInfo_w_w_rowptr = args.array<int>("sdInfo_w_w_rowptr");
4788 xt::pyarray<int>& sdInfo_w_w_colind = args.array<int>("sdInfo_w_w_colind");
4789 xt::pyarray<int>& sdInfo_w_u_rowptr = args.array<int>("sdInfo_w_u_rowptr");
4790 xt::pyarray<int>& sdInfo_w_u_colind = args.array<int>("sdInfo_w_u_colind");
4791 xt::pyarray<int>& sdInfo_w_v_rowptr = args.array<int>("sdInfo_w_v_rowptr");
4792 xt::pyarray<int>& sdInfo_w_v_colind = args.array<int>("sdInfo_w_v_colind");
4793 xt::pyarray<int>& csrRowIndeces_p_p = args.array<int>("csrRowIndeces_p_p");
4794 xt::pyarray<int>& csrColumnOffsets_p_p = args.array<int>("csrColumnOffsets_p_p");
4795 xt::pyarray<int>& csrRowIndeces_p_u = args.array<int>("csrRowIndeces_p_u");
4796 xt::pyarray<int>& csrColumnOffsets_p_u = args.array<int>("csrColumnOffsets_p_u");
4797 xt::pyarray<int>& csrRowIndeces_p_v = args.array<int>("csrRowIndeces_p_v");
4798 xt::pyarray<int>& csrColumnOffsets_p_v = args.array<int>("csrColumnOffsets_p_v");
4799 xt::pyarray<int>& csrRowIndeces_p_w = args.array<int>("csrRowIndeces_p_w");
4800 xt::pyarray<int>& csrColumnOffsets_p_w = args.array<int>("csrColumnOffsets_p_w");
4801 xt::pyarray<int>& csrRowIndeces_u_p = args.array<int>("csrRowIndeces_u_p");
4802 xt::pyarray<int>& csrColumnOffsets_u_p = args.array<int>("csrColumnOffsets_u_p");
4803 xt::pyarray<int>& csrRowIndeces_u_u = args.array<int>("csrRowIndeces_u_u");
4804 xt::pyarray<int>& csrColumnOffsets_u_u = args.array<int>("csrColumnOffsets_u_u");
4805 xt::pyarray<int>& csrRowIndeces_u_v = args.array<int>("csrRowIndeces_u_v");
4806 xt::pyarray<int>& csrColumnOffsets_u_v = args.array<int>("csrColumnOffsets_u_v");
4807 xt::pyarray<int>& csrRowIndeces_u_w = args.array<int>("csrRowIndeces_u_w");
4808 xt::pyarray<int>& csrColumnOffsets_u_w = args.array<int>("csrColumnOffsets_u_w");
4809 xt::pyarray<int>& csrRowIndeces_v_p = args.array<int>("csrRowIndeces_v_p");
4810 xt::pyarray<int>& csrColumnOffsets_v_p = args.array<int>("csrColumnOffsets_v_p");
4811 xt::pyarray<int>& csrRowIndeces_v_u = args.array<int>("csrRowIndeces_v_u");
4812 xt::pyarray<int>& csrColumnOffsets_v_u = args.array<int>("csrColumnOffsets_v_u");
4813 xt::pyarray<int>& csrRowIndeces_v_v = args.array<int>("csrRowIndeces_v_v");
4814 xt::pyarray<int>& csrColumnOffsets_v_v = args.array<int>("csrColumnOffsets_v_v");
4815 xt::pyarray<int>& csrRowIndeces_v_w = args.array<int>("csrRowIndeces_v_w");
4816 xt::pyarray<int>& csrColumnOffsets_v_w = args.array<int>("csrColumnOffsets_v_w");
4817 xt::pyarray<int>& csrRowIndeces_w_p = args.array<int>("csrRowIndeces_w_p");
4818 xt::pyarray<int>& csrColumnOffsets_w_p = args.array<int>("csrColumnOffsets_w_p");
4819 xt::pyarray<int>& csrRowIndeces_w_u = args.array<int>("csrRowIndeces_w_u");
4820 xt::pyarray<int>& csrColumnOffsets_w_u = args.array<int>("csrColumnOffsets_w_u");
4821 xt::pyarray<int>& csrRowIndeces_w_v = args.array<int>("csrRowIndeces_w_v");
4822 xt::pyarray<int>& csrColumnOffsets_w_v = args.array<int>("csrColumnOffsets_w_v");
4823 xt::pyarray<int>& csrRowIndeces_w_w = args.array<int>("csrRowIndeces_w_w");
4824 xt::pyarray<int>& csrColumnOffsets_w_w = args.array<int>("csrColumnOffsets_w_w");
4825 xt::pyarray<double>& globalJacobian = args.array<double>("globalJacobian");
4826 int nExteriorElementBoundaries_global = args.scalar<int>("nExteriorElementBoundaries_global");
4827 xt::pyarray<int>& exteriorElementBoundariesArray = args.array<int>("exteriorElementBoundariesArray");
4828 xt::pyarray<int>& elementBoundariesArray = args.array<int>("elementBoundariesArray");
4829 xt::pyarray<int>& elementBoundaryElementsArray = args.array<int>("elementBoundaryElementsArray");
4830 xt::pyarray<int>& elementBoundaryLocalElementBoundariesArray = args.array<int>("elementBoundaryLocalElementBoundariesArray");
4831 xt::pyarray<double>& ebqe_vf_ext = args.array<double>("ebqe_vf_ext");
4832 xt::pyarray<double>& bc_ebqe_vf_ext = args.array<double>("bc_ebqe_vf_ext");
4833 xt::pyarray<double>& ebqe_phi_ext = args.array<double>("ebqe_phi_ext");
4834 xt::pyarray<double>& bc_ebqe_phi_ext = args.array<double>("bc_ebqe_phi_ext");
4835 xt::pyarray<double>& ebqe_normal_phi_ext = args.array<double>("ebqe_normal_phi_ext");
4836 xt::pyarray<double>& ebqe_kappa_phi_ext = args.array<double>("ebqe_kappa_phi_ext");
4837 const xt::pyarray<double>& ebqe_vos_ext = args.array<double>("ebqe_vos_ext");
4838 const xt::pyarray<double>& ebqe_turb_var_0 = args.array<double>("ebqe_turb_var_0");
4839 const xt::pyarray<double>& ebqe_turb_var_1 = args.array<double>("ebqe_turb_var_1");
4840 xt::pyarray<int>& isDOFBoundary_p = args.array<int>("isDOFBoundary_p");
4841 xt::pyarray<int>& isDOFBoundary_u = args.array<int>("isDOFBoundary_u");
4842 xt::pyarray<int>& isDOFBoundary_v = args.array<int>("isDOFBoundary_v");
4843 xt::pyarray<int>& isDOFBoundary_w = args.array<int>("isDOFBoundary_w");
4844 xt::pyarray<int>& isAdvectiveFluxBoundary_p = args.array<int>("isAdvectiveFluxBoundary_p");
4845 xt::pyarray<int>& isAdvectiveFluxBoundary_u = args.array<int>("isAdvectiveFluxBoundary_u");
4846 xt::pyarray<int>& isAdvectiveFluxBoundary_v = args.array<int>("isAdvectiveFluxBoundary_v");
4847 xt::pyarray<int>& isAdvectiveFluxBoundary_w = args.array<int>("isAdvectiveFluxBoundary_w");
4848 xt::pyarray<int>& isDiffusiveFluxBoundary_u = args.array<int>("isDiffusiveFluxBoundary_u");
4849 xt::pyarray<int>& isDiffusiveFluxBoundary_v = args.array<int>("isDiffusiveFluxBoundary_v");
4850 xt::pyarray<int>& isDiffusiveFluxBoundary_w = args.array<int>("isDiffusiveFluxBoundary_w");
4851 xt::pyarray<double>& ebqe_bc_p_ext = args.array<double>("ebqe_bc_p_ext");
4852 xt::pyarray<double>& ebqe_bc_flux_mass_ext = args.array<double>("ebqe_bc_flux_mass_ext");
4853 xt::pyarray<double>& ebqe_bc_flux_mom_u_adv_ext = args.array<double>("ebqe_bc_flux_mom_u_adv_ext");
4854 xt::pyarray<double>& ebqe_bc_flux_mom_v_adv_ext = args.array<double>("ebqe_bc_flux_mom_v_adv_ext");
4855 xt::pyarray<double>& ebqe_bc_flux_mom_w_adv_ext = args.array<double>("ebqe_bc_flux_mom_w_adv_ext");
4856 xt::pyarray<double>& ebqe_bc_u_ext = args.array<double>("ebqe_bc_u_ext");
4857 xt::pyarray<double>& ebqe_bc_flux_u_diff_ext = args.array<double>("ebqe_bc_flux_u_diff_ext");
4858 xt::pyarray<double>& ebqe_penalty_ext = args.array<double>("ebqe_penalty_ext");
4859 xt::pyarray<double>& ebqe_bc_v_ext = args.array<double>("ebqe_bc_v_ext");
4860 xt::pyarray<double>& ebqe_bc_flux_v_diff_ext = args.array<double>("ebqe_bc_flux_v_diff_ext");
4861 xt::pyarray<double>& ebqe_bc_w_ext = args.array<double>("ebqe_bc_w_ext");
4862 xt::pyarray<double>& ebqe_bc_flux_w_diff_ext = args.array<double>("ebqe_bc_flux_w_diff_ext");
4863 xt::pyarray<int>& csrColumnOffsets_eb_p_p = args.array<int>("csrColumnOffsets_eb_p_p");
4864 xt::pyarray<int>& csrColumnOffsets_eb_p_u = args.array<int>("csrColumnOffsets_eb_p_u");
4865 xt::pyarray<int>& csrColumnOffsets_eb_p_v = args.array<int>("csrColumnOffsets_eb_p_v");
4866 xt::pyarray<int>& csrColumnOffsets_eb_p_w = args.array<int>("csrColumnOffsets_eb_p_w");
4867 xt::pyarray<int>& csrColumnOffsets_eb_u_p = args.array<int>("csrColumnOffsets_eb_u_p");
4868 xt::pyarray<int>& csrColumnOffsets_eb_u_u = args.array<int>("csrColumnOffsets_eb_u_u");
4869 xt::pyarray<int>& csrColumnOffsets_eb_u_v = args.array<int>("csrColumnOffsets_eb_u_v");
4870 xt::pyarray<int>& csrColumnOffsets_eb_u_w = args.array<int>("csrColumnOffsets_eb_u_w");
4871 xt::pyarray<int>& csrColumnOffsets_eb_v_p = args.array<int>("csrColumnOffsets_eb_v_p");
4872 xt::pyarray<int>& csrColumnOffsets_eb_v_u = args.array<int>("csrColumnOffsets_eb_v_u");
4873 xt::pyarray<int>& csrColumnOffsets_eb_v_v = args.array<int>("csrColumnOffsets_eb_v_v");
4874 xt::pyarray<int>& csrColumnOffsets_eb_v_w = args.array<int>("csrColumnOffsets_eb_v_w");
4875 xt::pyarray<int>& csrColumnOffsets_eb_w_p = args.array<int>("csrColumnOffsets_eb_w_p");
4876 xt::pyarray<int>& csrColumnOffsets_eb_w_u = args.array<int>("csrColumnOffsets_eb_w_u");
4877 xt::pyarray<int>& csrColumnOffsets_eb_w_v = args.array<int>("csrColumnOffsets_eb_w_v");
4878 xt::pyarray<int>& csrColumnOffsets_eb_w_w = args.array<int>("csrColumnOffsets_eb_w_w");
4879 xt::pyarray<int>& elementFlags = args.array<int>("elementFlags");
4880 int nParticles = args.scalar<int>("nParticles");
4881 double particle_epsFact = args.scalar<double>("particle_epsFact");
4882 double particle_alpha = args.scalar<double>("particle_alpha");
4883 double particle_beta = args.scalar<double>("particle_beta");
4884 double particle_penalty_constant = args.scalar<double>("particle_penalty_constant");
4885 xt::pyarray<double>& particle_signed_distances = args.array<double>("particle_signed_distances");
4886 xt::pyarray<double>& particle_signed_distance_normals = args.array<double>("particle_signed_distance_normals");
4887 xt::pyarray<double>& particle_velocities = args.array<double>("particle_velocities");
4888 xt::pyarray<double>& particle_centroids = args.array<double>("particle_centroids");
4889 double particle_nitsche = args.scalar<double>("particle_nitsche");
4890 int use_ball_as_particle = args.scalar<int>("use_ball_as_particle");
4891 xt::pyarray<double>& ball_center = args.array<double>("ball_center");
4892 xt::pyarray<double>& ball_radius = args.array<double>("ball_radius");
4893 xt::pyarray<double>& ball_velocity = args.array<double>("ball_velocity");
4894 xt::pyarray<double>& ball_angular_velocity = args.array<double>("ball_angular_velocity");
4895 int USE_SUPG = args.scalar<int>("USE_SUPG");
4896 int KILL_PRESSURE_TERM = args.scalar<int>("KILL_PRESSURE_TERM");
4897 double dt = args.scalar<double>("dt");
4898 int MATERIAL_PARAMETERS_AS_FUNCTION = args.scalar<int>("MATERIAL_PARAMETERS_AS_FUNCTION");
4899 xt::pyarray<double>& density_as_function = args.array<double>("density_as_function");
4900 xt::pyarray<double>& dynamic_viscosity_as_function = args.array<double>("dynamic_viscosity_as_function");
4901 xt::pyarray<double>& ebqe_density_as_function = args.array<double>("ebqe_density_as_function");
4902 xt::pyarray<double>& ebqe_dynamic_viscosity_as_function = args.array<double>("ebqe_dynamic_viscosity_as_function");
4903 int USE_SBM = args.scalar<int>("USE_SBM");
4904 int ARTIFICIAL_VISCOSITY = args.scalar<int>("ARTIFICIAL_VISCOSITY");
4905 xt::pyarray<double>& uStar_dMatrix = args.array<double>("uStar_dMatrix");
4906 xt::pyarray<double>& vStar_dMatrix = args.array<double>("vStar_dMatrix");
4907 xt::pyarray<double>& wStar_dMatrix = args.array<double>("wStar_dMatrix");
4908 int numDOFs_1D = args.scalar<int>("numDOFs_1D");
4909 int offset_u = args.scalar<int>("offset_u");
4910 int offset_v = args.scalar<int>("offset_v");
4911 int offset_w = args.scalar<int>("offset_w");
4912 int stride_u = args.scalar<int>("stride_u");
4913 int stride_v = args.scalar<int>("stride_v");
4914 int stride_w = args.scalar<int>("stride_w");
4915 xt::pyarray<int>& rowptr_1D = args.array<int>("rowptr_1D");
4916 xt::pyarray<int>& colind_1D = args.array<int>("colind_1D");
4917 xt::pyarray<int>& rowptr = args.array<int>("rowptr");
4918 xt::pyarray<int>& colind = args.array<int>("colind");
4919 int INT_BY_PARTS_PRESSURE = args.scalar<int>("INT_BY_PARTS_PRESSURE");
4920 //
4921 //loop over elements to compute volume integrals and load them into the element Jacobians and global Jacobian
4922 //
4923 std::valarray<double> particle_surfaceArea(nParticles), particle_netForces(nParticles*3*3), particle_netMoments(nParticles*3);
4924 const int nQuadraturePoints_global(nElements_global*nQuadraturePoints_element);
4925 for(int eN=0;eN<nElements_global;eN++)
4926 {
4927 double eps_rho,eps_mu;
4928 double element_active=1.0;//value 1 is because it is ibm by default
4929
4930 double elementJacobian_p_p[nDOF_test_element][nDOF_trial_element],
4931 elementJacobian_p_u[nDOF_test_element][nDOF_trial_element],
4932 elementJacobian_p_v[nDOF_test_element][nDOF_trial_element],
4933 elementJacobian_p_w[nDOF_test_element][nDOF_trial_element],
4934 elementJacobian_u_p[nDOF_test_element][nDOF_trial_element],
4935 elementJacobian_u_u[nDOF_test_element][nDOF_trial_element],
4936 elementJacobian_u_v[nDOF_test_element][nDOF_trial_element],
4937 elementJacobian_u_w[nDOF_test_element][nDOF_trial_element],
4938 elementJacobian_v_p[nDOF_test_element][nDOF_trial_element],
4939 elementJacobian_v_u[nDOF_test_element][nDOF_trial_element],
4940 elementJacobian_v_v[nDOF_test_element][nDOF_trial_element],
4941 elementJacobian_v_w[nDOF_test_element][nDOF_trial_element],
4942 elementJacobian_w_p[nDOF_test_element][nDOF_trial_element],
4943 elementJacobian_w_u[nDOF_test_element][nDOF_trial_element],
4944 elementJacobian_w_v[nDOF_test_element][nDOF_trial_element],
4945 elementJacobian_w_w[nDOF_test_element][nDOF_trial_element];
4946 for (int i=0;i<nDOF_test_element;i++)
4947 for (int j=0;j<nDOF_trial_element;j++)
4948 {
4949 elementJacobian_p_p[i][j]=0.0;
4950 elementJacobian_p_u[i][j]=0.0;
4951 elementJacobian_p_v[i][j]=0.0;
4952 elementJacobian_p_w[i][j]=0.0;
4953 elementJacobian_u_p[i][j]=0.0;
4954 elementJacobian_u_u[i][j]=0.0;
4955 elementJacobian_u_v[i][j]=0.0;
4956 elementJacobian_u_w[i][j]=0.0;
4957 elementJacobian_v_p[i][j]=0.0;
4958 elementJacobian_v_u[i][j]=0.0;
4959 elementJacobian_v_v[i][j]=0.0;
4960 elementJacobian_v_w[i][j]=0.0;
4961 elementJacobian_w_p[i][j]=0.0;
4962 elementJacobian_w_u[i][j]=0.0;
4963 elementJacobian_w_v[i][j]=0.0;
4964 elementJacobian_w_w[i][j]=0.0;
4965 }
4966 //
4967 //detect cut cells
4968 //
4969 //if(0)
4970 if(USE_SBM>0)
4971 {
4972 //
4973 //detect cut cells
4974 //
4975 double _distance[nDOF_mesh_trial_element]={0.0};
4976 int pos_counter=0;
4977 for (int I=0;I<nDOF_mesh_trial_element;I++)
4978 {
4979 if(use_ball_as_particle==1)
4980 {
4981 get_distance_to_ball(nParticles, ball_center.data(), ball_radius.data(),
4982 mesh_dof[3*mesh_l2g[eN*nDOF_mesh_trial_element+I]+0],
4983 mesh_dof[3*mesh_l2g[eN*nDOF_mesh_trial_element+I]+1],
4984 mesh_dof[3*mesh_l2g[eN*nDOF_mesh_trial_element+I]+2],
4985 _distance[I]);
4986 }
4987 else
4988 {
4989 _distance[I] = phi_solid_nodes[mesh_l2g[eN*nDOF_mesh_trial_element+I]];
4990 }
4991 if ( _distance[I] >= 0)
4992 pos_counter++;
4993 }
4994 if (pos_counter == 2)
4995 {
4996 element_active=0.0;
4997 //std::cout<<"Identified cut cell"<<std::endl;
4998 int opp_node=-1;
4999 for (int I=0;I<nDOF_mesh_trial_element;I++)
5000 {
5001 if (_distance[I] < 0)
5002 opp_node = I;
5003 }
5004 assert(opp_node >=0);
5005 assert(opp_node <nDOF_mesh_trial_element);
5006 }
5007 else if (pos_counter == 3)
5008 {
5009 element_active=1.0;
5010 }
5011 else
5012 {
5013 element_active=0.0;
5014 }
5015 }
5016 if(use_ball_as_particle==1)
5017 {
5018 for (int I=0;I<nDOF_mesh_trial_element;I++)
5019 get_distance_to_ball(nParticles, ball_center.data(), ball_radius.data(),
5020 mesh_dof[3*mesh_l2g[eN*nDOF_mesh_trial_element+I]+0],
5021 mesh_dof[3*mesh_l2g[eN*nDOF_mesh_trial_element+I]+1],
5022 mesh_dof[3*mesh_l2g[eN*nDOF_mesh_trial_element+I]+2],
5023 phi_solid_nodes[mesh_l2g[eN*nDOF_mesh_trial_element+I]]);
5024 }
5025 double element_phi[nDOF_mesh_trial_element], element_phi_s[nDOF_mesh_trial_element];
5026 for (int j=0;j<nDOF_mesh_trial_element;j++)
5027 {
5028 int eN_j = eN*nDOF_mesh_trial_element+j;
5029 element_phi[j] = phi_dof[p_l2g[eN_j]];
5030 element_phi_s[j] = phi_solid_nodes[p_l2g[eN_j]];
5031 }
5032 double element_nodes[nDOF_mesh_trial_element*3];
5033 for (int i=0;i<nDOF_mesh_trial_element;i++)
5034 {
5035 int eN_i=eN*nDOF_mesh_trial_element+i;
5036 for(int I=0;I<3;I++)
5037 element_nodes[i*3 + I] = mesh_dof[mesh_l2g[eN_i]*3 + I];
5038 }//i
5039 gf_s.calculate(element_phi_s, element_nodes, x_ref.data(), false);
5040 gf.calculate(element_phi, element_nodes, x_ref.data(), false);
5041 for (int k=0;k<nQuadraturePoints_element;k++)
5042 {
5043 gf.set_quad(k);
5044 gf_s.set_quad(k);
5045 int eN_k = eN*nQuadraturePoints_element+k, //index to a scalar at a quadrature point
5046 eN_k_nSpace = eN_k*nSpace,
5047 eN_k_3d = eN_k*3,
5048 eN_nDOF_trial_element = eN*nDOF_trial_element; //index to a vector at a quadrature point
5049
5050 //declare local storage
5051 double p=0.0,u=0.0,v=0.0,w=0.0,
5052 grad_p[nSpace],grad_u[nSpace],grad_v[nSpace],grad_w[nSpace],
5053 hess_u[nSpace2],hess_v[nSpace2],
5054 mom_u_acc=0.0,
5055 dmom_u_acc_u=0.0,
5056 mom_v_acc=0.0,
5057 dmom_v_acc_v=0.0,
5058 mom_w_acc=0.0,
5059 dmom_w_acc_w=0.0,
5060 mass_adv[nSpace],
5061 dmass_adv_u[nSpace],
5062 dmass_adv_v[nSpace],
5063 dmass_adv_w[nSpace],
5064 mom_u_adv[nSpace],
5065 dmom_u_adv_u[nSpace],
5066 dmom_u_adv_v[nSpace],
5067 dmom_u_adv_w[nSpace],
5068 mom_v_adv[nSpace],
5069 dmom_v_adv_u[nSpace],
5070 dmom_v_adv_v[nSpace],
5071 dmom_v_adv_w[nSpace],
5072 mom_w_adv[nSpace],
5073 dmom_w_adv_u[nSpace],
5074 dmom_w_adv_v[nSpace],
5075 dmom_w_adv_w[nSpace],
5076 mom_uu_diff_ten[nSpace],
5077 mom_vv_diff_ten[nSpace],
5078 mom_ww_diff_ten[nSpace],
5079 mom_uv_diff_ten[1],
5080 mom_uw_diff_ten[1],
5081 mom_vu_diff_ten[1],
5082 mom_vw_diff_ten[1],
5083 mom_wu_diff_ten[1],
5084 mom_wv_diff_ten[1],
5085 mom_u_source=0.0,
5086 mom_v_source=0.0,
5087 mom_w_source=0.0,
5088 mom_u_ham=0.0,
5089 dmom_u_ham_grad_p[nSpace],
5090 dmom_u_ham_grad_u[nSpace],
5091 mom_v_ham=0.0,
5092 dmom_v_ham_grad_p[nSpace],
5093 dmom_v_ham_grad_v[nSpace],
5094 mom_w_ham=0.0,
5095 dmom_w_ham_grad_p[nSpace],
5096 dmom_w_ham_grad_w[nSpace],
5097 mom_u_acc_t=0.0,
5098 dmom_u_acc_u_t=0.0,
5099 mom_v_acc_t=0.0,
5100 dmom_v_acc_v_t=0.0,
5101 mom_w_acc_t=0.0,
5102 dmom_w_acc_w_t=0.0,
5103 pdeResidual_p=0.0,
5104 pdeResidual_u=0.0,
5105 pdeResidual_v=0.0,
5106 pdeResidual_w=0.0,
5107 dpdeResidual_p_u[nDOF_trial_element],dpdeResidual_p_v[nDOF_trial_element],dpdeResidual_p_w[nDOF_trial_element],
5108 dpdeResidual_u_p[nDOF_trial_element],dpdeResidual_u_u[nDOF_trial_element],
5109 dpdeResidual_v_p[nDOF_trial_element],dpdeResidual_v_v[nDOF_trial_element],
5110 dpdeResidual_w_p[nDOF_trial_element],dpdeResidual_w_w[nDOF_trial_element],
5111 Lstar_u_p[nDOF_test_element],
5112 Lstar_v_p[nDOF_test_element],
5113 Lstar_w_p[nDOF_test_element],
5114 Lstar_u_u[nDOF_test_element],
5115 Lstar_v_v[nDOF_test_element],
5116 Lstar_w_w[nDOF_test_element],
5117 Lstar_p_u[nDOF_test_element],
5118 Lstar_p_v[nDOF_test_element],
5119 Lstar_p_w[nDOF_test_element],
5120 subgridError_p=0.0,
5121 subgridError_u=0.0,
5122 subgridError_v=0.0,
5123 subgridError_w=0.0,
5124 dsubgridError_p_u[nDOF_trial_element],
5125 dsubgridError_p_v[nDOF_trial_element],
5126 dsubgridError_p_w[nDOF_trial_element],
5127 dsubgridError_u_p[nDOF_trial_element],
5128 dsubgridError_u_u[nDOF_trial_element],
5129 dsubgridError_v_p[nDOF_trial_element],
5130 dsubgridError_v_v[nDOF_trial_element],
5131 dsubgridError_w_p[nDOF_trial_element],
5132 dsubgridError_w_w[nDOF_trial_element],
5133 tau_p=0.0,tau_p0=0.0,tau_p1=0.0,
5134 tau_v=0.0,tau_v0=0.0,tau_v1=0.0,
5135 jac[nSpace*nSpace],
5136 jacDet,
5137 jacInv[nSpace*nSpace],
5138 p_grad_trial[nDOF_trial_element*nSpace],vel_grad_trial[nDOF_trial_element*nSpace],
5139 vel_hess_trial[nDOF_trial_element*nSpace2],
5140 dV,
5141 p_test_dV[nDOF_test_element],vel_test_dV[nDOF_test_element],
5142 p_grad_test_dV[nDOF_test_element*nSpace],vel_grad_test_dV[nDOF_test_element*nSpace],
5143 x,y,z,xt,yt,zt,
5144 //VRANS
5145 porosity,
5146 //meanGrainSize,
5147 dmom_u_source[nSpace],
5148 dmom_v_source[nSpace],
5149 dmom_w_source[nSpace],
5150 mass_source,
5151 //
5152 G[nSpace*nSpace],G_dd_G,tr_G,h_phi, dmom_adv_star[nSpace], dmom_adv_sge[nSpace];
5153 //get jacobian, etc for mapping reference element
5154 ck.calculateMapping_element(eN,
5155 k,
5156 mesh_dof.data(),
5157 mesh_l2g.data(),
5158 mesh_trial_ref.data(),
5159 mesh_grad_trial_ref.data(),
5160 jac,
5161 jacDet,
5162 jacInv,
5163 x,y,z);
5164 ck.calculateH_element(eN,
5165 k,
5166 nodeDiametersArray.data(),
5167 mesh_l2g.data(),
5168 mesh_trial_ref.data(),
5169 h_phi);
5170 ck.calculateMappingVelocity_element(eN,
5171 k,
5172 mesh_velocity_dof.data(),
5173 mesh_l2g.data(),
5174 mesh_trial_ref.data(),
5175 xt,yt,zt);
5176 //xt=0.0;yt=0.0;zt=0.0;
5177 //std::cout<<"xt "<<xt<<'\t'<<yt<<'\t'<<zt<<std::endl;
5178 //get the physical integration weight
5179 dV = fabs(jacDet)*dV_ref[k];
5180 ck.calculateG(jacInv,G,G_dd_G,tr_G);
5181 //ck.calculateGScale(G,&normal_phi[eN_k_nSpace],h_phi);
5182
5183 eps_rho = epsFact_rho*(useMetrics*h_phi+(1.0-useMetrics)*elementDiameter[eN]);
5184 eps_mu = epsFact_mu *(useMetrics*h_phi+(1.0-useMetrics)*elementDiameter[eN]);
5185 const double particle_eps = particle_epsFact*(useMetrics*h_phi+(1.0-useMetrics)*elementDiameter[eN]);
5186
5187 //get the trial function gradients
5188 /* ck.gradTrialFromRef(&p_grad_trial_ref[k*nDOF_trial_element*nSpace],jacInv,p_grad_trial); */
5189 ck.gradTrialFromRef(&vel_grad_trial_ref[k*nDOF_trial_element*nSpace],jacInv,vel_grad_trial);
5190 ck.hessTrialFromRef(&vel_hess_trial_ref[k*nDOF_trial_element*nSpace2],jacInv,vel_hess_trial);
5191 //get the solution
5192 /* ck.valFromDOF(p_dof,&p_l2g[eN_nDOF_trial_element],&p_trial_ref[k*nDOF_trial_element],p); */
5193 p = q_p[eN_k];
5194 ck.valFromDOF(u_dof.data(),&vel_l2g[eN_nDOF_trial_element],&vel_trial_ref[k*nDOF_trial_element],u);
5195 ck.valFromDOF(v_dof.data(),&vel_l2g[eN_nDOF_trial_element],&vel_trial_ref[k*nDOF_trial_element],v);
5196 /* ck.valFromDOF(w_dof,&vel_l2g[eN_nDOF_trial_element],&vel_trial_ref[k*nDOF_trial_element],w); */
5197 //get the solution gradients
5198 /* ck.gradFromDOF(p_dof,&p_l2g[eN_nDOF_trial_element],p_grad_trial,grad_p); */
5199 for (int I=0;I<nSpace;I++)
5200 grad_p[I] = q_grad_p[eN_k_nSpace+I];
5201 ck.gradFromDOF(u_dof.data(),&vel_l2g[eN_nDOF_trial_element],vel_grad_trial,grad_u);
5202 ck.gradFromDOF(v_dof.data(),&vel_l2g[eN_nDOF_trial_element],vel_grad_trial,grad_v);
5203 ck.hessFromDOF(u_dof.data(),&vel_l2g[eN_nDOF_trial_element],vel_hess_trial,hess_u);
5204 ck.hessFromDOF(v_dof.data(),&vel_l2g[eN_nDOF_trial_element],vel_hess_trial,hess_v);
5205 /* ck.gradFromDOF(w_dof,&vel_l2g[eN_nDOF_trial_element],vel_grad_trial,grad_w); */
5206 //precalculate test function products with integration weights
5207 for (int j=0;j<nDOF_trial_element;j++)
5208 {
5209 /* p_test_dV[j] = p_test_ref[k*nDOF_trial_element+j]*dV; */
5210 vel_test_dV[j] = vel_test_ref[k*nDOF_trial_element+j]*dV;
5211 for (int I=0;I<nSpace;I++)
5212 {
5213 /* p_grad_test_dV[j*nSpace+I] = p_grad_trial[j*nSpace+I]*dV;//cek warning won't work for Petrov-Galerkin */
5214 vel_grad_test_dV[j*nSpace+I] = vel_grad_trial[j*nSpace+I]*dV;//cek warning won't work for Petrov-Galerkin}
5215 }
5216 }
5217 //cek hack
5218 double div_mesh_velocity=0.0;
5219 int NDOF_MESH_TRIAL_ELEMENT=3;
5220 for (int j=0;j<NDOF_MESH_TRIAL_ELEMENT;j++)
5221 {
5222 int eN_j=eN*NDOF_MESH_TRIAL_ELEMENT+j;
5223 div_mesh_velocity +=
5224 mesh_velocity_dof[mesh_l2g[eN_j]*3+0]*vel_grad_trial[j*2+0] +
5225 mesh_velocity_dof[mesh_l2g[eN_j]*3+1]*vel_grad_trial[j*2+1];
5226 }
5227 div_mesh_velocity = DM3*div_mesh_velocity + (1.0-DM3)*alphaBDF*(dV-q_dV_last[eN_k])/dV;
5228 //
5229 //VRANS
5230 porosity = 1.0 - q_vos[eN_k];
5231 //
5232 //
5233 //calculate pde coefficients and derivatives at quadrature points
5234 //
5235 double distance_to_omega_solid = phi_solid[eN_k];//computed in getResidual
5236 double eddy_viscosity(0.),rhoSave,nuSave;//not really interested in saving eddy_viscosity in jacobian
5237 evaluateCoefficients(eps_rho,
5238 eps_mu,
5239 particle_eps,
5240 sigma,
5241 rho_0,
5242 nu_0,
5243 rho_1,
5244 nu_1,
5245 elementDiameter[eN],
5246 smagorinskyConstant,
5247 turbulenceClosureModel,
5248 g.data(),
5249 useVF,
5250 vf[eN_k],
5251 phi[eN_k],
5252 &normal_phi[eN_k_nSpace],
5253 distance_to_omega_solid,
5254 kappa_phi[eN_k],
5255 //VRANS
5256 porosity,
5257 //
5258 p,
5259 grad_p,
5260 grad_u,
5261 grad_v,
5262 grad_w,
5263 u,
5264 v,
5265 w,
5266 q_velocity_sge[eN_k_nSpace+0],
5267 q_velocity_sge[eN_k_nSpace+1],
5268 q_velocity_sge[eN_k_nSpace+1],//hack, shouldn't be used
5269 eddy_viscosity,
5270 mom_u_acc,
5271 dmom_u_acc_u,
5272 mom_v_acc,
5273 dmom_v_acc_v,
5274 mom_w_acc,
5275 dmom_w_acc_w,
5276 mass_adv,
5277 dmass_adv_u,
5278 dmass_adv_v,
5279 dmass_adv_w,
5280 mom_u_adv,
5281 dmom_u_adv_u,
5282 dmom_u_adv_v,
5283 dmom_u_adv_w,
5284 mom_v_adv,
5285 dmom_v_adv_u,
5286 dmom_v_adv_v,
5287 dmom_v_adv_w,
5288 mom_w_adv,
5289 dmom_w_adv_u,
5290 dmom_w_adv_v,
5291 dmom_w_adv_w,
5292 mom_uu_diff_ten,
5293 mom_vv_diff_ten,
5294 mom_ww_diff_ten,
5295 mom_uv_diff_ten,
5296 mom_uw_diff_ten,
5297 mom_vu_diff_ten,
5298 mom_vw_diff_ten,
5299 mom_wu_diff_ten,
5300 mom_wv_diff_ten,
5301 mom_u_source,
5302 mom_v_source,
5303 mom_w_source,
5304 mom_u_ham,
5305 dmom_u_ham_grad_p,
5306 dmom_u_ham_grad_u,
5307 mom_v_ham,
5308 dmom_v_ham_grad_p,
5309 dmom_v_ham_grad_v,
5310 mom_w_ham,
5311 dmom_w_ham_grad_p,
5312 dmom_w_ham_grad_w,
5313 rhoSave,
5314 nuSave,
5315 KILL_PRESSURE_TERM,
5316 0,
5317 0., // mql: the force term doesn't play a role in the Jacobian
5318 0.,
5319 0.,
5320 MATERIAL_PARAMETERS_AS_FUNCTION,
5321 density_as_function[eN_k],
5322 dynamic_viscosity_as_function[eN_k],
5323 USE_SBM,
5324 x,y,z,
5325 use_ball_as_particle,
5326 ball_center.data(),
5327 ball_radius.data(),
5328 ball_velocity.data(),
5329 ball_angular_velocity.data(),
5330 INT_BY_PARTS_PRESSURE);
5331 //VRANS
5332 mass_source = q_mass_source[eN_k];
5333 for (int I=0;I<nSpace;I++)
5334 {
5335 dmom_u_source[I] = 0.0;
5336 dmom_v_source[I] = 0.0;
5337 dmom_w_source[I] = 0.0;
5338 }
5339 updateDarcyForchheimerTerms_Ergun(/* linearDragFactor, */
5340 /* nonlinearDragFactor, */
5341 /* porosity, */
5342 /* meanGrainSize, */
5343 q_dragAlpha[eN_k],
5344 q_dragBeta[eN_k],
5345 eps_rho,
5346 eps_mu,
5347 rho_0,
5348 nu_0,
5349 rho_1,
5350 nu_1,
5351 eddy_viscosity,
5352 useVF,
5353 vf[eN_k],
5354 phi[eN_k],
5355 u,
5356 v,
5357 w,
5358 q_velocity_sge[eN_k_nSpace+0],
5359 q_velocity_sge[eN_k_nSpace+1],
5360 q_velocity_sge[eN_k_nSpace+1],//hack, shouldn't be used
5361 eps_solid[elementFlags[eN]],
5362 porosity,
5363 q_velocity_solid[eN_k_nSpace+0],
5364 q_velocity_solid[eN_k_nSpace+1],
5365 q_velocity_solid[eN_k_nSpace+1],//cek hack, should not be used
5366 q_velocityStar_solid[eN_k_nSpace+0],
5367 q_velocityStar_solid[eN_k_nSpace+1],
5368 q_velocityStar_solid[eN_k_nSpace+1],//cek hack, should not be used
5369 mom_u_source,
5370 mom_v_source,
5371 mom_w_source,
5372 dmom_u_source,
5373 dmom_v_source,
5374 dmom_w_source,
5375 q_grad_vos[eN_k_nSpace+0],
5376 q_grad_vos[eN_k_nSpace+1],
5377 q_grad_vos[eN_k_nSpace+1]);//cek hack, should not be used
5378
5379 double C_particles=0.0;
5380 if(nParticles > 0 && USE_SBM==0)
5381 updateSolidParticleTerms(eN < nElements_owned,
5382 particle_nitsche,
5383 dV,
5384 nParticles,
5385 nQuadraturePoints_global,
5386 &particle_signed_distances[eN_k],
5387 &particle_signed_distance_normals[eN_k_3d],
5388 &particle_velocities[eN_k_3d],
5389 particle_centroids.data(),
5390 use_ball_as_particle,
5391 ball_center.data(),
5392 ball_radius.data(),
5393 ball_velocity.data(),
5394 ball_angular_velocity.data(),
5395 porosity,
5396 particle_penalty_constant/h_phi,
5397 particle_alpha/h_phi,
5398 particle_beta/h_phi,
5399 eps_rho,
5400 eps_mu,
5401 rho_0,
5402 nu_0,
5403 rho_1,
5404 nu_1,
5405 useVF,
5406 vf[eN_k],
5407 phi[eN_k],
5408 x,
5409 y,
5410 z,
5411 p,
5412 u,
5413 v,
5414 w,
5415 q_velocity_sge[eN_k_nSpace+0],
5416 q_velocity_sge[eN_k_nSpace+1],
5417 q_velocity_sge[eN_k_nSpace+1],
5418 particle_eps,
5419 grad_u,
5420 grad_v,
5421 grad_w,
5422 mom_u_source,
5423 mom_v_source,
5424 mom_w_source,
5425 dmom_u_source,
5426 dmom_v_source,
5427 dmom_w_source,
5428 mom_u_adv,
5429 mom_v_adv,
5430 mom_w_adv,
5431 dmom_u_adv_u,
5432 dmom_v_adv_v,
5433 dmom_w_adv_w,
5434 mom_u_ham,
5435 dmom_u_ham_grad_u,
5436 mom_v_ham,
5437 dmom_v_ham_grad_v,
5438 mom_w_ham,
5439 dmom_w_ham_grad_w,
5440 &particle_netForces[0],
5441 &particle_netMoments[0],
5442 &particle_surfaceArea[0]);
5443 //Turbulence closure model
5444 if (turbulenceClosureModel >= 3)
5445 {
5446 const double c_mu = 0.09;//mwf hack
5447 updateTurbulenceClosure(turbulenceClosureModel,
5448 eps_rho,
5449 eps_mu,
5450 rho_0,
5451 nu_0,
5452 rho_1,
5453 nu_1,
5454 useVF,
5455 vf[eN_k],
5456 phi[eN_k],
5457 porosity,
5458 c_mu, //mwf hack
5459 q_turb_var_0[eN_k],
5460 q_turb_var_1[eN_k],
5461 &q_turb_var_grad_0[eN_k_nSpace],
5462 eddy_viscosity,
5463 mom_uu_diff_ten,
5464 mom_vv_diff_ten,
5465 mom_ww_diff_ten,
5466 mom_uv_diff_ten,
5467 mom_uw_diff_ten,
5468 mom_vu_diff_ten,
5469 mom_vw_diff_ten,
5470 mom_wu_diff_ten,
5471 mom_wv_diff_ten,
5472 mom_u_source,
5473 mom_v_source,
5474 mom_w_source);
5475
5476 }
5477 //
5478 //
5479 //moving mesh
5480 //
5481 mom_u_adv[0] -= MOVING_DOMAIN*dmom_u_acc_u*mom_u_acc*xt; // multiply by rho*porosity. mql. CHECK.
5482 mom_u_adv[1] -= MOVING_DOMAIN*dmom_u_acc_u*mom_u_acc*yt;
5483 /* mom_u_adv[2] -= MOVING_DOMAIN*dmom_u_acc_u*mom_u_acc*zt; */
5484 dmom_u_adv_u[0] -= MOVING_DOMAIN*dmom_u_acc_u*xt;
5485 dmom_u_adv_u[1] -= MOVING_DOMAIN*dmom_u_acc_u*yt;
5486 /* dmom_u_adv_u[2] -= MOVING_DOMAIN*dmom_u_acc_u*zt; */
5487
5488 mom_v_adv[0] -= MOVING_DOMAIN*dmom_v_acc_v*mom_v_acc*xt;
5489 mom_v_adv[1] -= MOVING_DOMAIN*dmom_v_acc_v*mom_v_acc*yt;
5490 /* mom_v_adv[2] -= MOVING_DOMAIN*dmom_v_acc_v*mom_v_acc*zt; */
5491 dmom_v_adv_v[0] -= MOVING_DOMAIN*dmom_v_acc_v*xt;
5492 dmom_v_adv_v[1] -= MOVING_DOMAIN*dmom_v_acc_v*yt;
5493 /* dmom_v_adv_v[2] -= MOVING_DOMAIN*dmom_v_acc_v*zt; */
5494
5495 /* mom_w_adv[0] -= MOVING_DOMAIN*dmom_w_acc_w*mom_w_acc*xt; */
5496 /* mom_w_adv[1] -= MOVING_DOMAIN*dmom_w_acc_w*mom_w_acc*yt; */
5497 /* mom_w_adv[2] -= MOVING_DOMAIN*dmom_w_acc_w*mom_w_acc*zt; */
5498 /* dmom_w_adv_w[0] -= MOVING_DOMAIN*dmom_w_acc_w*xt; */
5499 /* dmom_w_adv_w[1] -= MOVING_DOMAIN*dmom_w_acc_w*yt; */
5500 /* dmom_w_adv_w[2] -= MOVING_DOMAIN*dmom_w_acc_w*zt; */
5501 //
5502 //calculate time derivatives
5503 //
5504 ck.bdf(alphaBDF,
5505 q_mom_u_acc_beta_bdf[eN_k]*q_dV_last[eN_k]/dV,
5506 mom_u_acc,
5507 dmom_u_acc_u,
5508 mom_u_acc_t,
5509 dmom_u_acc_u_t);
5510 ck.bdf(alphaBDF,
5511 q_mom_v_acc_beta_bdf[eN_k]*q_dV_last[eN_k]/dV,
5512 mom_v_acc,
5513 dmom_v_acc_v,
5514 mom_v_acc_t,
5515 dmom_v_acc_v_t);
5516 /* ck.bdf(alphaBDF, */
5517 /* q_mom_w_acc_beta_bdf[eN_k]*q_dV_last[eN_k]/dV, */
5518 /* mom_w_acc, */
5519 /* dmom_w_acc_w, */
5520 /* mom_w_acc_t, */
5521 /* dmom_w_acc_w_t); */
5522 //
5523 //calculate subgrid error contribution to the Jacobian (strong residual, adjoint, jacobian of strong residual)
5524
5525 mom_u_acc_t *= dmom_u_acc_u; //multiply by porosity*rho. mql. CHECK.
5526 mom_v_acc_t *= dmom_v_acc_v;
5527
5528 //
5529 dmom_adv_sge[0] = dmom_u_acc_u*(q_velocity_sge[eN_k_nSpace+0] - MOVING_DOMAIN*xt);
5530 dmom_adv_sge[1] = dmom_u_acc_u*(q_velocity_sge[eN_k_nSpace+1] - MOVING_DOMAIN*yt);
5531 /* dmom_adv_sge[2] = dmom_u_acc_u*(q_velocity_sge[eN_k_nSpace+2] - MOVING_DOMAIN*zt); */
5532 //
5533 //calculate strong residual
5534 //
5535 pdeResidual_p =
5536 ck.Mass_strong(-q_dvos_dt[eN_k]) + // mql. CHECK.
5537 ck.Advection_strong(dmass_adv_u,grad_u) +
5538 ck.Advection_strong(dmass_adv_v,grad_v) +
5539 /* ck.Advection_strong(dmass_adv_w,grad_w) + */
5540 DM2*MOVING_DOMAIN*ck.Reaction_strong(alphaBDF*(dV-q_dV_last[eN_k])/dV - div_mesh_velocity) +
5541 //VRANS
5542 ck.Reaction_strong(mass_source);
5543 //
5544
5545 pdeResidual_u =
5546 ck.Mass_strong(mom_u_acc_t) +
5547 ck.Advection_strong(dmom_adv_sge,grad_u) +
5548 ck.Hamiltonian_strong(dmom_u_ham_grad_p,grad_p) +
5549 ck.Reaction_strong(mom_u_source) -
5550 ck.Reaction_strong(u*div_mesh_velocity);
5551
5552 pdeResidual_v =
5553 ck.Mass_strong(mom_v_acc_t) +
5554 ck.Advection_strong(dmom_adv_sge,grad_v) +
5555 ck.Hamiltonian_strong(dmom_v_ham_grad_p,grad_p) +
5556 ck.Reaction_strong(mom_v_source) -
5557 ck.Reaction_strong(v*div_mesh_velocity);
5558
5559 /* pdeResidual_w =
5560 ck.Mass_strong(mom_w_acc_t) + */
5561 /* ck.Advection_strong(dmom_adv_sge,grad_w) + */
5562 /* ck.Hamiltonian_strong(dmom_w_ham_grad_p,grad_p) + */
5563 /* ck.Reaction_strong(mom_w_source) - */
5564 /* ck.Reaction_strong(w*div_mesh_velocity); */
5565
5566 //calculate the Jacobian of strong residual
5567 for (int j=0;j<nDOF_trial_element;j++)
5568 {
5569 int j_nSpace = j*nSpace;
5570 dpdeResidual_p_u[j]=ck.AdvectionJacobian_strong(dmass_adv_u,&vel_grad_trial[j_nSpace]);
5571 dpdeResidual_p_v[j]=ck.AdvectionJacobian_strong(dmass_adv_v,&vel_grad_trial[j_nSpace]);
5572 /* dpdeResidual_p_w[j]=ck.AdvectionJacobian_strong(dmass_adv_w,&vel_grad_trial[j_nSpace]); */
5573
5574 dpdeResidual_u_p[j]=ck.HamiltonianJacobian_strong(dmom_u_ham_grad_p,&p_grad_trial[j_nSpace]);
5575 dpdeResidual_u_u[j]=ck.MassJacobian_strong(dmom_u_acc_u_t,vel_trial_ref[k*nDOF_trial_element+j]) +
5576 ck.AdvectionJacobian_strong(dmom_adv_sge,&vel_grad_trial[j_nSpace]) -
5577 ck.ReactionJacobian_strong(div_mesh_velocity,vel_trial_ref[k*nDOF_trial_element+j]);
5578
5579 dpdeResidual_v_p[j]=ck.HamiltonianJacobian_strong(dmom_v_ham_grad_p,&p_grad_trial[j_nSpace]);
5580 dpdeResidual_v_v[j]=ck.MassJacobian_strong(dmom_v_acc_v_t,vel_trial_ref[k*nDOF_trial_element+j]) +
5581 ck.AdvectionJacobian_strong(dmom_adv_sge,&vel_grad_trial[j_nSpace]) -
5582 ck.ReactionJacobian_strong(div_mesh_velocity,vel_trial_ref[k*nDOF_trial_element+j]);
5583
5584 /* dpdeResidual_w_p[j]=ck.HamiltonianJacobian_strong(dmom_w_ham_grad_p,&p_grad_trial[j_nSpace]); */
5585 /* dpdeResidual_w_w[j]=ck.MassJacobian_strong(dmom_w_acc_w_t,vel_trial_ref[k*nDOF_trial_element+j]) + */
5586 /* ck.AdvectionJacobian_strong(dmom_adv_sge,&vel_grad_trial[j_nSpace]) -
5587 ck.ReactionJacobian_strong(div_mesh_velocity,vel_trial_ref[k*nDOF_trial_element+j]); */
5588
5589 //VRANS account for drag terms, diagonal only here ... decide if need off diagonal terms too
5590 dpdeResidual_u_u[j]+= ck.ReactionJacobian_strong(dmom_u_source[0],vel_trial_ref[k*nDOF_trial_element+j]);
5591 dpdeResidual_v_v[j]+= ck.ReactionJacobian_strong(dmom_v_source[1],vel_trial_ref[k*nDOF_trial_element+j]);
5592 /* dpdeResidual_w_w[j]+= ck.ReactionJacobian_strong(dmom_w_source[2],vel_trial_ref[k*nDOF_trial_element+j]); */
5593 //
5594 }
5595 //calculate tau and tau*Res
5596 //cek debug
5597 double tmpR=dmom_u_acc_u_t + dmom_u_source[0];
5599 elementDiameter[eN],
5600 tmpR,//dmom_u_acc_u_t,
5601 dmom_u_acc_u,
5602 dmom_adv_sge,
5603 mom_uu_diff_ten[1],
5604 dmom_u_ham_grad_p[0],
5605 tau_v0,
5606 tau_p0,
5607 q_cfl[eN_k]);
5608
5609 calculateSubgridError_tau(Ct_sge,Cd_sge,
5610 G,G_dd_G,tr_G,
5611 tmpR,//dmom_u_acc_u_t,
5612 dmom_adv_sge,
5613 mom_uu_diff_ten[1],
5614 dmom_u_ham_grad_p[0],
5615 tau_v1,
5616 tau_p1,
5617 q_cfl[eN_k]);
5618
5619
5620 tau_v = useMetrics*tau_v1+(1.0-useMetrics)*tau_v0;
5621 tau_p = KILL_PRESSURE_TERM == 1 ? 0. : PSTAB*(useMetrics*tau_p1+(1.0-useMetrics)*tau_p0);
5623 tau_v,
5624 pdeResidual_p,
5625 pdeResidual_u,
5626 pdeResidual_v,
5627 pdeResidual_w,
5628 subgridError_p,
5629 subgridError_u,
5630 subgridError_v,
5631 subgridError_w);
5632
5634 tau_v,
5635 dpdeResidual_p_u,
5636 dpdeResidual_p_v,
5637 dpdeResidual_p_w,
5638 dpdeResidual_u_p,
5639 dpdeResidual_u_u,
5640 dpdeResidual_v_p,
5641 dpdeResidual_v_v,
5642 dpdeResidual_w_p,
5643 dpdeResidual_w_w,
5644 dsubgridError_p_u,
5645 dsubgridError_p_v,
5646 dsubgridError_p_w,
5647 dsubgridError_u_p,
5648 dsubgridError_u_u,
5649 dsubgridError_v_p,
5650 dsubgridError_v_v,
5651 dsubgridError_w_p,
5652 dsubgridError_w_w);
5653 // velocity used in adjoint (VMS or RBLES, with or without lagging the grid scale velocity)
5654 dmom_adv_star[0] = dmom_u_acc_u*(q_velocity_sge[eN_k_nSpace+0] - MOVING_DOMAIN*xt + useRBLES*subgridError_u);
5655 dmom_adv_star[1] = dmom_u_acc_u*(q_velocity_sge[eN_k_nSpace+1] - MOVING_DOMAIN*yt + useRBLES*subgridError_v);
5656 /* dmom_adv_star[2] = dmom_u_acc_u*(q_velocity_sge[eN_k_nSpace+2] - MOVING_DOMAIN*zt + useRBLES*subgridError_w); */
5657
5658 //calculate the adjoint times the test functions
5659 for (int i=0;i<nDOF_test_element;i++)
5660 {
5661 int i_nSpace = i*nSpace;
5662 Lstar_u_p[i]=ck.Advection_adjoint(dmass_adv_u,&p_grad_test_dV[i_nSpace]);
5663 Lstar_v_p[i]=ck.Advection_adjoint(dmass_adv_v,&p_grad_test_dV[i_nSpace]);
5664 /* Lstar_w_p[i]=ck.Advection_adjoint(dmass_adv_w,&p_grad_test_dV[i_nSpace]); */
5665 Lstar_u_u[i]=ck.Advection_adjoint(dmom_adv_star,&vel_grad_test_dV[i_nSpace]);
5666 Lstar_v_v[i]=ck.Advection_adjoint(dmom_adv_star,&vel_grad_test_dV[i_nSpace]);
5667 /* Lstar_w_w[i]=ck.Advection_adjoint(dmom_adv_star,&vel_grad_test_dV[i_nSpace]); */
5668 Lstar_p_u[i]=ck.Hamiltonian_adjoint(dmom_u_ham_grad_p,&vel_grad_test_dV[i_nSpace]);
5669 Lstar_p_v[i]=ck.Hamiltonian_adjoint(dmom_v_ham_grad_p,&vel_grad_test_dV[i_nSpace]);
5670 /* Lstar_p_w[i]=ck.Hamiltonian_adjoint(dmom_w_ham_grad_p,&vel_grad_test_dV[i_nSpace]); */
5671 //VRANS account for drag terms, diagonal only here ... decide if need off diagonal terms too
5672 Lstar_u_u[i]+=ck.Reaction_adjoint(dmom_u_source[0],vel_test_dV[i]);
5673 Lstar_v_v[i]+=ck.Reaction_adjoint(dmom_v_source[1],vel_test_dV[i]);
5674 /* Lstar_w_w[i]+=ck.Reaction_adjoint(dmom_w_source[2],vel_test_dV[i]); */
5675 }
5676
5677 // Assumes non-lagged subgrid velocity
5678 dmom_u_adv_u[0] += dmom_u_acc_u*(useRBLES*subgridError_u);
5679 dmom_u_adv_u[1] += dmom_u_acc_u*(useRBLES*subgridError_v);
5680 /* dmom_u_adv_u[2] += dmom_u_acc_u*(useRBLES*subgridError_w); */
5681
5682 dmom_v_adv_v[0] += dmom_u_acc_u*(useRBLES*subgridError_u);
5683 dmom_v_adv_v[1] += dmom_u_acc_u*(useRBLES*subgridError_v);
5684 /* dmom_v_adv_v[2] += dmom_u_acc_u*(useRBLES*subgridError_w); */
5685
5686 /* dmom_w_adv_w[0] += dmom_u_acc_u*(useRBLES*subgridError_u); */
5687 /* dmom_w_adv_w[1] += dmom_u_acc_u*(useRBLES*subgridError_v); */
5688 /* dmom_w_adv_w[2] += dmom_u_acc_u*(useRBLES*subgridError_w); */
5689
5690 // SURFACE TENSION //
5691 double unit_normal[nSpace];
5692 double norm_grad_phi = 0.;
5693 for (int I=0;I<nSpace;I++)
5694 norm_grad_phi += normal_phi[eN_k_nSpace+I]*normal_phi[eN_k_nSpace+I];
5695 norm_grad_phi = std::sqrt(norm_grad_phi) + 1E-10;
5696 for (int I=0;I<nSpace;I++)
5697 unit_normal[I] = normal_phi[eN_k_nSpace+I]/norm_grad_phi;
5698 double delta = gf.D(eps_mu,phi[eN_k]); //use eps_rho instead?
5699 double vel_tgrad_test_i[nSpace], vel_tgrad_test_j[nSpace];
5700 // END OF SURFACE TENSION //
5701
5702 //cek todo add RBLES terms consistent to residual modifications or ignore the partials w.r.t the additional RBLES terms
5703 for(int i=0;i<nDOF_test_element;i++)
5704 {
5705 int i_nSpace = i*nSpace;
5706 calculateTangentialGradient(unit_normal,
5707 &vel_grad_trial[i_nSpace],
5708 vel_tgrad_test_i);
5709 for(int j=0;j<nDOF_trial_element;j++)
5710 {
5711 int j_nSpace = j*nSpace;
5712 calculateTangentialGradient(unit_normal,
5713 &vel_grad_trial[j_nSpace],
5714 vel_tgrad_test_j);
5715
5716 /* elementJacobian_p_p[i][j] += ck.SubgridErrorJacobian(dsubgridError_u_p[j],Lstar_u_p[i]) + */
5717 /* ck.SubgridErrorJacobian(dsubgridError_v_p[j],Lstar_v_p[i]);// + */
5718 /* /\* ck.SubgridErrorJacobian(dsubgridError_w_p[j],Lstar_w_p[i]); *\/ */
5719
5720 /* elementJacobian_p_u[i][j] += ck.AdvectionJacobian_weak(dmass_adv_u,vel_trial_ref[k*nDOF_trial_element+j],&p_grad_test_dV[i_nSpace]) + */
5721 /* ck.SubgridErrorJacobian(dsubgridError_u_u[j],Lstar_u_p[i]); */
5722 /* elementJacobian_p_v[i][j] += ck.AdvectionJacobian_weak(dmass_adv_v,vel_trial_ref[k*nDOF_trial_element+j],&p_grad_test_dV[i_nSpace]) + */
5723 /* ck.SubgridErrorJacobian(dsubgridError_v_v[j],Lstar_v_p[i]); */
5724 /* elementJacobian_p_w[i][j] += ck.AdvectionJacobian_weak(dmass_adv_w,vel_trial_ref[k*nDOF_trial_element+j],&p_grad_test_dV[i_nSpace]) + */
5725 /* ck.SubgridErrorJacobian(dsubgridError_w_w[j],Lstar_w_p[i]); */
5726
5727 /* elementJacobian_u_p[i][j] += ck.HamiltonianJacobian_weak(dmom_u_ham_grad_p,&p_grad_trial[j_nSpace],vel_test_dV[i]) + */
5728 /* ck.SubgridErrorJacobian(dsubgridError_u_p[j],Lstar_u_u[i]); */
5729 elementJacobian_u_u[i][j] +=
5730 ck.MassJacobian_weak(dmom_u_acc_u_t,vel_trial_ref[k*nDOF_trial_element+j],vel_test_dV[i]) +
5731 ck.HamiltonianJacobian_weak(dmom_u_ham_grad_u,&vel_grad_trial[j_nSpace],vel_test_dV[i]) +
5732 ck.AdvectionJacobian_weak(dmom_u_adv_u,vel_trial_ref[k*nDOF_trial_element+j],&vel_grad_test_dV[i_nSpace]) +
5733 ck.SimpleDiffusionJacobian_weak(sdInfo_u_u_rowptr.data(),sdInfo_u_u_colind.data(),mom_uu_diff_ten,&vel_grad_trial[j_nSpace],&vel_grad_test_dV[i_nSpace]) +
5734 //VRANS
5735 ck.ReactionJacobian_weak(dmom_u_source[0],vel_trial_ref[k*nDOF_trial_element+j],vel_test_dV[i]) +
5736 //
5737 //ck.SubgridErrorJacobian(dsubgridError_p_u[j],Lstar_p_u[i]) +
5738 USE_SUPG*ck.SubgridErrorJacobian(dsubgridError_u_u[j],Lstar_u_u[i]) +
5739 ck.NumericalDiffusionJacobian(q_numDiff_u_last[eN_k],&vel_grad_trial[j_nSpace],&vel_grad_test_dV[i_nSpace]) +
5740 // surface tension
5741 ck.NumericalDiffusion(dt*delta*sigma*dV,
5742 vel_tgrad_test_i,
5743 vel_tgrad_test_j);
5744
5745 elementJacobian_u_v[i][j] +=
5746 ck.AdvectionJacobian_weak(dmom_u_adv_v,vel_trial_ref[k*nDOF_trial_element+j],&vel_grad_test_dV[i_nSpace]) +
5747 ck.SimpleDiffusionJacobian_weak(sdInfo_u_v_rowptr.data(),sdInfo_u_v_colind.data(),mom_uv_diff_ten,&vel_grad_trial[j_nSpace],&vel_grad_test_dV[i_nSpace]) +
5748 //VRANS
5749 ck.ReactionJacobian_weak(dmom_u_source[1],vel_trial_ref[k*nDOF_trial_element+j],vel_test_dV[i])
5750 //+ck.SubgridErrorJacobian(dsubgridError_p_v[j],Lstar_p_u[i])
5751 ;
5752 /* elementJacobian_u_w[i][j] += ck.AdvectionJacobian_weak(dmom_u_adv_w,vel_trial_ref[k*nDOF_trial_element+j],&vel_grad_test_dV[i_nSpace]) + */
5753 /* ck.SimpleDiffusionJacobian_weak(sdInfo_u_w_rowptr,sdInfo_u_w_colind,mom_uw_diff_ten,&vel_grad_trial[j_nSpace],&vel_grad_test_dV[i_nSpace]) + */
5754 /* //VRANS */
5755 /* ck.ReactionJacobian_weak(dmom_u_source[2],vel_trial_ref[k*nDOF_trial_element+j],vel_test_dV[i]) + */
5756 /* // */
5757 /* ck.SubgridErrorJacobian(dsubgridError_p_w[j],Lstar_p_u[i]); */
5758
5759 /* elementJacobian_v_p[i][j] += ck.HamiltonianJacobian_weak(dmom_v_ham_grad_p,&p_grad_trial[j_nSpace],vel_test_dV[i]) + */
5760 /* ck.SubgridErrorJacobian(dsubgridError_v_p[j],Lstar_v_v[i]); */
5761 elementJacobian_v_u[i][j] +=
5762 ck.AdvectionJacobian_weak(dmom_v_adv_u,vel_trial_ref[k*nDOF_trial_element+j],&vel_grad_test_dV[i_nSpace]) +
5763 ck.SimpleDiffusionJacobian_weak(sdInfo_v_u_rowptr.data(),sdInfo_v_u_colind.data(),mom_vu_diff_ten,&vel_grad_trial[j_nSpace],&vel_grad_test_dV[i_nSpace]) +
5764 //VRANS
5765 ck.ReactionJacobian_weak(dmom_v_source[0],vel_trial_ref[k*nDOF_trial_element+j],vel_test_dV[i])
5766 //+ck.SubgridErrorJacobian(dsubgridError_p_u[j],Lstar_p_v[i])
5767 ;
5768 elementJacobian_v_v[i][j] +=
5769 ck.MassJacobian_weak(dmom_v_acc_v_t,vel_trial_ref[k*nDOF_trial_element+j],vel_test_dV[i]) +
5770 ck.HamiltonianJacobian_weak(dmom_v_ham_grad_v,&vel_grad_trial[j_nSpace],vel_test_dV[i]) +
5771 ck.AdvectionJacobian_weak(dmom_v_adv_v,vel_trial_ref[k*nDOF_trial_element+j],&vel_grad_test_dV[i_nSpace]) +
5772 ck.SimpleDiffusionJacobian_weak(sdInfo_v_v_rowptr.data(),sdInfo_v_v_colind.data(),mom_vv_diff_ten,&vel_grad_trial[j_nSpace],&vel_grad_test_dV[i_nSpace]) +
5773 //VRANS
5774 ck.ReactionJacobian_weak(dmom_v_source[1],vel_trial_ref[k*nDOF_trial_element+j],vel_test_dV[i]) +
5775 //
5776 //ck.SubgridErrorJacobian(dsubgridError_p_v[j],Lstar_p_v[i]) +
5777 USE_SUPG*ck.SubgridErrorJacobian(dsubgridError_v_v[j],Lstar_v_v[i]) +
5778 ck.NumericalDiffusionJacobian(q_numDiff_v_last[eN_k],&vel_grad_trial[j_nSpace],&vel_grad_test_dV[i_nSpace]) +
5779 // surface tension
5780 ck.NumericalDiffusion(dt*delta*sigma*dV,
5781 vel_tgrad_test_i,
5782 vel_tgrad_test_j);
5783
5784 /* elementJacobian_v_w[i][j] += ck.AdvectionJacobian_weak(dmom_v_adv_w,vel_trial_ref[k*nDOF_trial_element+j],&vel_grad_test_dV[i_nSpace]) + */
5785 /* ck.SimpleDiffusionJacobian_weak(sdInfo_v_w_rowptr,sdInfo_v_w_colind,mom_vw_diff_ten,&vel_grad_trial[j_nSpace],&vel_grad_test_dV[i_nSpace]) + */
5786 /* //VRANS */
5787 /* ck.ReactionJacobian_weak(dmom_v_source[2],vel_trial_ref[k*nDOF_trial_element+j],vel_test_dV[i]) + */
5788 /* // */
5789 /* ck.SubgridErrorJacobian(dsubgridError_p_w[j],Lstar_p_v[i]); */
5790
5791 /* elementJacobian_w_p[i][j] += ck.HamiltonianJacobian_weak(dmom_w_ham_grad_p,&p_grad_trial[j_nSpace],vel_test_dV[i]) + */
5792 /* ck.SubgridErrorJacobian(dsubgridError_w_p[j],Lstar_w_w[i]); */
5793 /* elementJacobian_w_u[i][j] += ck.AdvectionJacobian_weak(dmom_w_adv_u,vel_trial_ref[k*nDOF_trial_element+j],&vel_grad_test_dV[i_nSpace]) + */
5794 /* ck.SimpleDiffusionJacobian_weak(sdInfo_w_u_rowptr,sdInfo_w_u_colind,mom_wu_diff_ten,&vel_grad_trial[j_nSpace],&vel_grad_test_dV[i_nSpace]) + */
5795 /* //VRANS */
5796 /* ck.ReactionJacobian_weak(dmom_w_source[0],vel_trial_ref[k*nDOF_trial_element+j],vel_test_dV[i]) + */
5797 /* // */
5798 /* ck.SubgridErrorJacobian(dsubgridError_p_u[j],Lstar_p_w[i]); */
5799 /* elementJacobian_w_v[i][j] += ck.AdvectionJacobian_weak(dmom_w_adv_v,vel_trial_ref[k*nDOF_trial_element+j],&vel_grad_test_dV[i_nSpace]) + */
5800 /* ck.SimpleDiffusionJacobian_weak(sdInfo_w_v_rowptr,sdInfo_w_v_colind,mom_wv_diff_ten,&vel_grad_trial[j_nSpace],&vel_grad_test_dV[i_nSpace]) + */
5801 /* //VRANS */
5802 /* ck.ReactionJacobian_weak(dmom_w_source[1],vel_trial_ref[k*nDOF_trial_element+j],vel_test_dV[i]) + */
5803 /* // */
5804 /* ck.SubgridErrorJacobian(dsubgridError_p_v[j],Lstar_p_w[i]); */
5805 /* elementJacobian_w_w[i][j] += ck.MassJacobian_weak(dmom_w_acc_w_t,vel_trial_ref[k*nDOF_trial_element+j],vel_test_dV[i]) + */
5806 /* ck.HamiltonianJacobian_weak(dmom_w_ham_grad_w,&vel_grad_trial[j_nSpace],vel_test_dV[i]) + */
5807 /* ck.AdvectionJacobian_weak(dmom_w_adv_w,vel_trial_ref[k*nDOF_trial_element+j],&vel_grad_test_dV[i_nSpace]) + */
5808 /* ck.SimpleDiffusionJacobian_weak(sdInfo_w_w_rowptr,sdInfo_w_w_colind,mom_ww_diff_ten,&vel_grad_trial[j_nSpace],&vel_grad_test_dV[i_nSpace]) + */
5809 /* //VRANS */
5810 /* ck.ReactionJacobian_weak(dmom_w_source[2],vel_trial_ref[k*nDOF_trial_element+j],vel_test_dV[i]) + */
5811 /* // */
5812 /* ck.SubgridErrorJacobian(dsubgridError_p_w[j],Lstar_p_w[i]) + */
5813 /* ck.SubgridErrorJacobian(dsubgridError_w_w[j],Lstar_w_w[i]) + */
5814 /* ck.NumericalDiffusionJacobian(q_numDiff_w_last[eN_k],&vel_grad_trial[j_nSpace],&vel_grad_test_dV[i_nSpace]); */
5815 }//j
5816 }//i
5817 }//k
5818 //
5819 //load into element Jacobian into global Jacobian
5820 //
5821 for (int i=0;i<nDOF_test_element;i++)
5822 {
5823 int eN_i = eN*nDOF_test_element+i;
5824 for (int j=0;j<nDOF_trial_element;j++)
5825 {
5826 int eN_i_j = eN_i*nDOF_trial_element+j;
5827 /* globalJacobian[csrRowIndeces_p_p[eN_i] + csrColumnOffsets_p_p[eN_i_j]] += elementJacobian_p_p[i][j]; */
5828 /* globalJacobian[csrRowIndeces_p_u[eN_i] + csrColumnOffsets_p_u[eN_i_j]] += elementJacobian_p_u[i][j]; */
5829 /* globalJacobian[csrRowIndeces_p_v[eN_i] + csrColumnOffsets_p_v[eN_i_j]] += elementJacobian_p_v[i][j]; */
5830 /* globalJacobian[csrRowIndeces_p_w[eN_i] + csrColumnOffsets_p_w[eN_i_j]] += elementJacobian_p_w[i][j]; */
5831
5832 /* globalJacobian[csrRowIndeces_u_p[eN_i] + csrColumnOffsets_u_p[eN_i_j]] += elementJacobian_u_p[i][j]; */
5833 globalJacobian[csrRowIndeces_u_u[eN_i] + csrColumnOffsets_u_u[eN_i_j]] += element_active*elementJacobian_u_u[i][j];
5834 globalJacobian[csrRowIndeces_u_v[eN_i] + csrColumnOffsets_u_v[eN_i_j]] += element_active*elementJacobian_u_v[i][j];
5835 /* globalJacobian[csrRowIndeces_u_w[eN_i] + csrColumnOffsets_u_w[eN_i_j]] += elementJacobian_u_w[i][j]; */
5836
5837 /* globalJacobian[csrRowIndeces_v_p[eN_i] + csrColumnOffsets_v_p[eN_i_j]] += elementJacobian_v_p[i][j]; */
5838 globalJacobian[csrRowIndeces_v_u[eN_i] + csrColumnOffsets_v_u[eN_i_j]] += element_active*elementJacobian_v_u[i][j];
5839 globalJacobian[csrRowIndeces_v_v[eN_i] + csrColumnOffsets_v_v[eN_i_j]] += element_active*elementJacobian_v_v[i][j];
5840 /* globalJacobian[csrRowIndeces_v_w[eN_i] + csrColumnOffsets_v_w[eN_i_j]] += elementJacobian_v_w[i][j]; */
5841
5842 /* globalJacobian[csrRowIndeces_w_p[eN_i] + csrColumnOffsets_w_p[eN_i_j]] += elementJacobian_w_p[i][j]; */
5843 /* globalJacobian[csrRowIndeces_w_u[eN_i] + csrColumnOffsets_w_u[eN_i_j]] += elementJacobian_w_u[i][j]; */
5844 /* globalJacobian[csrRowIndeces_w_v[eN_i] + csrColumnOffsets_w_v[eN_i_j]] += elementJacobian_w_v[i][j]; */
5845 /* globalJacobian[csrRowIndeces_w_w[eN_i] + csrColumnOffsets_w_w[eN_i_j]] += elementJacobian_w_w[i][j]; */
5846 }//j
5847 }//i
5848 }//elements
5849
5850 // loop in DOFs for discrete upwinding
5851 if (ARTIFICIAL_VISCOSITY==3 || ARTIFICIAL_VISCOSITY==4)
5852 {
5853 int ij=0;
5854 for (int i=0; i<numDOFs_1D; i++)
5855 {
5856 // global index for each component
5857 int u_gi = offset_u+stride_u*i;
5858 int v_gi = offset_v+stride_v*i;
5859
5860 // pointer to first entry in the ith row for each component
5861 int u_ith_row_ptr = rowptr[u_gi];
5862 int v_ith_row_ptr = rowptr[v_gi];
5863
5864 // number of DOFs in the ith row (of the small matrix dMatrix)
5865 int numDOFs_ith_row = rowptr_1D[i+1]-rowptr_1D[i];
5866 for (int counter = 0; counter < numDOFs_ith_row; counter++)
5867 {
5868 // ij pointer for each component
5869 int uu_ij = u_ith_row_ptr + (offset_u + counter*stride_u);
5870 int vv_ij = v_ith_row_ptr + (offset_v + counter*stride_v);
5871
5872 // read ij component of dissipative matrix
5873 double uStar_dij = uStar_dMatrix[ij];
5874 double vStar_dij = vStar_dMatrix[ij];
5875
5876 // update global Jacobian
5877 globalJacobian[uu_ij] -= uStar_dij;
5878 globalJacobian[vv_ij] -= vStar_dij;
5879
5880 // update ij
5881 ij++;
5882 }
5883 }
5884 }
5885
5886 if(USE_SBM>0)
5887 {
5888 //loop over the surrogate boundaries in SB method and assembly into jacobian
5889 //
5890 for (int ebN_s=0;ebN_s < surrogate_boundaries.size();ebN_s++)
5891 {
5892 int ebN = surrogate_boundaries[ebN_s],
5893 eN = elementBoundaryElementsArray[ebN*2+surrogate_boundary_elements[ebN_s]],
5894 ebN_local = elementBoundaryLocalElementBoundariesArray[ebN*2+surrogate_boundary_elements[ebN_s]],
5895 eN_nDOF_trial_element = eN*nDOF_trial_element;
5896 double eps_rho,eps_mu;
5897 //This assumption is wrong for parallel: If one of nodes of this edge is owned by this processor,
5898 //then the integral over this edge has contribution to the residual and Jacobian.
5899 //if (ebN >= nElementBoundaries_owned) continue;
5900 for (int kb=0;kb<nQuadraturePoints_elementBoundary;kb++)
5901 {
5902 int ebN_kb = ebN*nQuadraturePoints_elementBoundary+kb,
5903 ebN_kb_nSpace = ebN_kb*nSpace,
5904 ebN_local_kb = ebN_local*nQuadraturePoints_elementBoundary+kb,
5905 ebN_local_kb_nSpace = ebN_local_kb*nSpace;
5906
5907 double u_ext=0.0,
5908 v_ext=0.0,
5909 bc_u_ext=0.0,
5910 bc_v_ext=0.0,
5911 grad_u_ext[nSpace],
5912 grad_v_ext[nSpace],
5913 jac_ext[nSpace*nSpace],
5914 jacDet_ext,
5915 jacInv_ext[nSpace*nSpace],
5916 boundaryJac[nSpace*(nSpace-1)],
5917 metricTensor[(nSpace-1)*(nSpace-1)],
5918 metricTensorDetSqrt,
5919 vel_grad_trial_trace[nDOF_trial_element*nSpace],
5920 dS,
5921 vel_test_dS[nDOF_test_element],
5922 normal[2],
5923 x_ext,y_ext,z_ext,xt_ext,yt_ext,zt_ext,integralScaling,
5924 vel_grad_test_dS[nDOF_trial_element*nSpace],
5925 G[nSpace*nSpace],G_dd_G,tr_G,h_phi,h_penalty,penalty;
5926 ck.calculateMapping_elementBoundary(eN,
5927 ebN_local,
5928 kb,
5929 ebN_local_kb,
5930 mesh_dof.data(),
5931 mesh_l2g.data(),
5932 mesh_trial_trace_ref.data(),
5933 mesh_grad_trial_trace_ref.data(),
5934 boundaryJac_ref.data(),
5935 jac_ext,
5936 jacDet_ext,
5937 jacInv_ext,
5938 boundaryJac,
5939 metricTensor,
5940 metricTensorDetSqrt,
5941 normal_ref.data(),
5942 normal,
5943 x_ext,y_ext,z_ext);
5944 ck.calculateMappingVelocity_elementBoundary(eN,
5945 ebN_local,
5946 kb,
5947 ebN_local_kb,
5948 mesh_velocity_dof.data(),
5949 mesh_l2g.data(),
5950 mesh_trial_trace_ref.data(),
5951 xt_ext,yt_ext,zt_ext,
5952 normal,
5953 boundaryJac,
5954 metricTensor,
5955 integralScaling);
5956 dS = metricTensorDetSqrt*dS_ref[kb];
5957 ck.calculateG(jacInv_ext,G,G_dd_G,tr_G);
5958 //compute shape and solution information
5959 //shape
5960 ck.gradTrialFromRef(&vel_grad_trial_trace_ref[ebN_local_kb_nSpace*nDOF_trial_element],jacInv_ext,vel_grad_trial_trace);
5961 //solution and gradients
5962 ck.valFromDOF(u_dof.data(),&vel_l2g[eN_nDOF_trial_element],&vel_trial_trace_ref[ebN_local_kb*nDOF_test_element],u_ext);
5963 ck.valFromDOF(v_dof.data(),&vel_l2g[eN_nDOF_trial_element],&vel_trial_trace_ref[ebN_local_kb*nDOF_test_element],v_ext);
5964
5965 ck.gradFromDOF(u_dof.data(),&vel_l2g[eN_nDOF_trial_element],vel_grad_trial_trace,grad_u_ext);
5966 ck.gradFromDOF(v_dof.data(),&vel_l2g[eN_nDOF_trial_element],vel_grad_trial_trace,grad_v_ext);
5967 //precalculate test function products with integration weights
5968 for (int j=0;j<nDOF_trial_element;j++)
5969 {
5970 vel_test_dS[j] = vel_test_trace_ref[ebN_local_kb*nDOF_test_element+j]*dS;
5971 for (int I=0;I<nSpace;I++)
5972 vel_grad_test_dS[j*nSpace+I] = vel_grad_trial_trace[j*nSpace+I]*dS;
5973 }
5974 //
5975 //load the boundary values
5976 //
5977 bc_u_ext = 0.0;
5978 bc_v_ext = 0.0;
5979 ck.calculateGScale(G,normal,h_penalty);
5980 //
5981 //update the global Jacobian from the flux Jacobian
5982 //
5983
5984 double dist = 0.0;
5985 double distance[2], P_normal[2], P_tangent[2]; // distance vector, normal and tangent of the physical boundary
5986
5987 if(use_ball_as_particle==1)
5988 {
5989 get_distance_to_ball(nParticles,ball_center.data(),ball_radius.data(),
5990 x_ext,y_ext,z_ext,
5991 dist);
5992 get_normal_to_ith_ball(nParticles,ball_center.data(),ball_radius.data(),
5994 x_ext,y_ext,z_ext,
5995 P_normal[0],P_normal[1]);
5996 get_velocity_to_ith_ball(nParticles,ball_center.data(),ball_radius.data(),
5997 ball_velocity.data(), ball_angular_velocity.data(),
5999 x_ext-dist*P_normal[0],
6000 y_ext-dist*P_normal[1],
6001 0.0,//z_ext,
6002 bc_u_ext,bc_v_ext);
6003 }
6004 else
6005 {
6006 dist = ebq_global_phi_solid[ebN_kb];
6007 P_normal[0] = ebq_global_grad_phi_solid[ebN_kb*3+0];
6008 P_normal[1] = ebq_global_grad_phi_solid[ebN_kb*3+1];
6009 bc_u_ext = ebq_particle_velocity_solid [ebN_kb*3+0];
6010 bc_v_ext = ebq_particle_velocity_solid [ebN_kb*3+1];
6011 }
6012 distance[0] = -P_normal[0]*dist;//distance=vector from \tilde{x} to x. It holds also when dist<0.0
6013 distance[1] = -P_normal[1]*dist;
6014 P_tangent[0]= -P_normal[1];
6015 P_tangent[1]= P_normal[0];
6016 assert(h_penalty>0.0);
6017 if (h_penalty < std::abs(dist))
6018 h_penalty = std::abs(dist);
6019 //hack: this won't work for two-phase flow, need mixture viscosity
6020 double visco = nu_0*rho_0;
6021 double C_adim = C_sbm*visco/h_penalty;
6022 double beta_adim = beta_sbm*visco/h_penalty;
6023
6024 for (int i=0;i<nDOF_test_element;i++)
6025 {
6026 int eN_i = eN*nDOF_test_element+i;
6027 double phi_i = vel_test_dS[i];
6028 double* grad_phi_i = &vel_grad_test_dS[i*nSpace+0];
6029 const double grad_phi_i_dot_d = get_dot_product(grad_phi_i,distance);
6030 const double grad_phi_i_dot_t = get_dot_product(P_tangent,grad_phi_i);
6031
6032 double res[2];
6033 const double zero_vec[2]={0.,0.};
6034 for (int j=0;j<nDOF_trial_element;j++)
6035 {
6036 int ebN_i_j = ebN*4*nDOF_test_X_trial_element
6039 + i*nDOF_trial_element
6040 + j;
6041
6042 double phi_j = vel_test_dS[j]/dS;
6043 const double grad_phi_j[2]={vel_grad_test_dS[j*nSpace+0]/dS,
6044 vel_grad_test_dS[j*nSpace+1]/dS};
6045 const double grad_phi_j_dot_d = get_dot_product(distance, grad_phi_j);
6046 const double grad_phi_j_dot_t = get_dot_product(P_tangent,grad_phi_j);
6047
6048 // Classical Nitsche
6049 // (1)
6050 globalJacobian[csrRowIndeces_u_u[eN_i] + csrColumnOffsets_eb_u_u[ebN_i_j]] +=
6051 phi_i*phi_j*C_adim;
6052 globalJacobian[csrRowIndeces_v_v[eN_i] + csrColumnOffsets_eb_v_v[ebN_i_j]] +=
6053 phi_i*phi_j*C_adim;
6054
6055 // (2)
6056 get_symmetric_gradient_dot_vec(grad_phi_j,zero_vec,normal,res);
6057 globalJacobian[csrRowIndeces_u_u[eN_i] + csrColumnOffsets_eb_u_u[ebN_i_j]] -=
6058 visco * phi_i * res[0];
6059 globalJacobian[csrRowIndeces_u_v[eN_i] + csrColumnOffsets_eb_u_v[ebN_i_j]] -=
6060 visco * phi_i * res[1];
6061
6062 get_symmetric_gradient_dot_vec(zero_vec,grad_phi_j,normal,res);
6063 globalJacobian[csrRowIndeces_v_u[eN_i] + csrColumnOffsets_eb_v_u[ebN_i_j]] -=
6064 visco * phi_i * res[0];
6065 globalJacobian[csrRowIndeces_v_v[eN_i] + csrColumnOffsets_eb_v_v[ebN_i_j]] -=
6066 visco * phi_i * res[1];
6067
6068 // (3)
6069 get_symmetric_gradient_dot_vec(grad_phi_i,zero_vec,normal,res);
6070 globalJacobian[csrRowIndeces_u_u[eN_i] + csrColumnOffsets_eb_u_u[ebN_i_j]] -=
6071 visco * phi_j * res[0];
6072 globalJacobian[csrRowIndeces_u_v[eN_i] + csrColumnOffsets_eb_u_v[ebN_i_j]] -=
6073 visco * phi_j * res[1];
6074 get_symmetric_gradient_dot_vec(zero_vec,grad_phi_i,normal,res);
6075 globalJacobian[csrRowIndeces_v_u[eN_i] + csrColumnOffsets_eb_v_u[ebN_i_j]] -=
6076 visco * phi_j * res[0];
6077 globalJacobian[csrRowIndeces_v_v[eN_i] + csrColumnOffsets_eb_v_v[ebN_i_j]] -=
6078 visco * phi_j * res[1];
6079
6080 // (4)
6081 globalJacobian[csrRowIndeces_u_u[eN_i] + csrColumnOffsets_eb_u_u[ebN_i_j]] +=
6082 C_adim*grad_phi_i_dot_d*phi_j;
6083 globalJacobian[csrRowIndeces_v_v[eN_i] + csrColumnOffsets_eb_v_v[ebN_i_j]] +=
6084 C_adim*grad_phi_i_dot_d*phi_j;
6085
6086 // (5)
6087 globalJacobian[csrRowIndeces_u_u[eN_i] + csrColumnOffsets_eb_u_u[ebN_i_j]] +=
6088 C_adim*grad_phi_i_dot_d*grad_phi_j_dot_d;
6089 globalJacobian[csrRowIndeces_v_v[eN_i] + csrColumnOffsets_eb_v_v[ebN_i_j]] +=
6090 C_adim*grad_phi_i_dot_d*grad_phi_j_dot_d;
6091
6092 // (6)
6093 globalJacobian[csrRowIndeces_u_u[eN_i] + csrColumnOffsets_eb_u_u[ebN_i_j]] +=
6094 C_adim*grad_phi_j_dot_d*phi_i;
6095 globalJacobian[csrRowIndeces_v_v[eN_i] + csrColumnOffsets_eb_v_v[ebN_i_j]] +=
6096 C_adim*grad_phi_j_dot_d*phi_i;
6097
6098 // (7)
6099 get_symmetric_gradient_dot_vec(grad_phi_i,zero_vec,normal,res);
6100 globalJacobian[csrRowIndeces_u_u[eN_i] + csrColumnOffsets_eb_u_u[ebN_i_j]] -=
6101 visco * grad_phi_j_dot_d * res[0];
6102 globalJacobian[csrRowIndeces_u_v[eN_i] + csrColumnOffsets_eb_u_v[ebN_i_j]] -=
6103 visco * grad_phi_j_dot_d * res[1];
6104
6105 get_symmetric_gradient_dot_vec(zero_vec,grad_phi_i,normal,res);
6106 globalJacobian[csrRowIndeces_v_u[eN_i] + csrColumnOffsets_eb_v_u[ebN_i_j]] -=
6107 visco * grad_phi_j_dot_d * res[0] ;
6108 globalJacobian[csrRowIndeces_v_v[eN_i] + csrColumnOffsets_eb_v_v[ebN_i_j]] -=
6109 visco * grad_phi_j_dot_d * res[1];
6110
6111 // (8)
6112 // the penalization on the tangential derivative
6113 // B < Gw t , (Gu - GuD) t >
6114 globalJacobian[csrRowIndeces_u_u[eN_i] + csrColumnOffsets_eb_u_u[ebN_i_j]] +=
6115 beta_adim*grad_phi_j_dot_t*grad_phi_i_dot_t;
6116 globalJacobian[csrRowIndeces_v_v[eN_i] + csrColumnOffsets_eb_v_v[ebN_i_j]] +=
6117 beta_adim*grad_phi_j_dot_t*grad_phi_i_dot_t;
6118
6119 }//j
6120 }//i
6121 }//kb
6122 }//ebN_s
6123 }
6124 //
6125 //loop over exterior element boundaries to compute the surface integrals and load them into the global Jacobian
6126 //
6127 //exact generalized function integration not implemented for boundaries yet
6128 gf.useExact=false;
6129 gf_s.useExact=false;
6130 for (int ebNE = 0; ebNE < nExteriorElementBoundaries_global; ebNE++)
6131 {
6132 int ebN = exteriorElementBoundariesArray[ebNE],
6133 eN = elementBoundaryElementsArray[ebN*2+0],
6134 eN_nDOF_trial_element = eN*nDOF_trial_element,
6135 ebN_local = elementBoundaryLocalElementBoundariesArray[ebN*2+0];
6136 double eps_rho,eps_mu;
6137 for (int kb=0;kb<nQuadraturePoints_elementBoundary;kb++)
6138 {
6139 int ebNE_kb = ebNE*nQuadraturePoints_elementBoundary+kb,
6140 ebNE_kb_nSpace = ebNE_kb*nSpace,
6141 ebN_local_kb = ebN_local*nQuadraturePoints_elementBoundary+kb,
6142 ebN_local_kb_nSpace = ebN_local_kb*nSpace;
6143
6144 double p_ext=0.0,
6145 u_ext=0.0,
6146 v_ext=0.0,
6147 w_ext=0.0,
6148 grad_p_ext[nSpace],
6149 grad_u_ext[nSpace],
6150 grad_v_ext[nSpace],
6151 grad_w_ext[nSpace],
6152 mom_u_acc_ext=0.0,
6153 dmom_u_acc_u_ext=0.0,
6154 mom_v_acc_ext=0.0,
6155 dmom_v_acc_v_ext=0.0,
6156 mom_w_acc_ext=0.0,
6157 dmom_w_acc_w_ext=0.0,
6158 mass_adv_ext[nSpace],
6159 dmass_adv_u_ext[nSpace],
6160 dmass_adv_v_ext[nSpace],
6161 dmass_adv_w_ext[nSpace],
6162 mom_u_adv_ext[nSpace],
6163 dmom_u_adv_u_ext[nSpace],
6164 dmom_u_adv_v_ext[nSpace],
6165 dmom_u_adv_w_ext[nSpace],
6166 mom_v_adv_ext[nSpace],
6167 dmom_v_adv_u_ext[nSpace],
6168 dmom_v_adv_v_ext[nSpace],
6169 dmom_v_adv_w_ext[nSpace],
6170 mom_w_adv_ext[nSpace],
6171 dmom_w_adv_u_ext[nSpace],
6172 dmom_w_adv_v_ext[nSpace],
6173 dmom_w_adv_w_ext[nSpace],
6174 mom_uu_diff_ten_ext[nSpace],
6175 mom_vv_diff_ten_ext[nSpace],
6176 mom_ww_diff_ten_ext[nSpace],
6177 mom_uv_diff_ten_ext[1],
6178 mom_uw_diff_ten_ext[1],
6179 mom_vu_diff_ten_ext[1],
6180 mom_vw_diff_ten_ext[1],
6181 mom_wu_diff_ten_ext[1],
6182 mom_wv_diff_ten_ext[1],
6183 mom_u_source_ext=0.0,
6184 mom_v_source_ext=0.0,
6185 mom_w_source_ext=0.0,
6186 mom_u_ham_ext=0.0,
6187 dmom_u_ham_grad_p_ext[nSpace],
6188 dmom_u_ham_grad_u_ext[nSpace],
6189 mom_v_ham_ext=0.0,
6190 dmom_v_ham_grad_p_ext[nSpace],
6191 dmom_v_ham_grad_v_ext[nSpace],
6192 mom_w_ham_ext=0.0,
6193 dmom_w_ham_grad_p_ext[nSpace],
6194 dmom_w_ham_grad_w_ext[nSpace],
6195 dmom_u_adv_p_ext[nSpace],
6196 dmom_v_adv_p_ext[nSpace],
6197 dmom_w_adv_p_ext[nSpace],
6198 dflux_mass_u_ext=0.0,
6199 dflux_mass_v_ext=0.0,
6200 dflux_mass_w_ext=0.0,
6201 dflux_mom_u_adv_p_ext=0.0,
6202 dflux_mom_u_adv_u_ext=0.0,
6203 dflux_mom_u_adv_v_ext=0.0,
6204 dflux_mom_u_adv_w_ext=0.0,
6205 dflux_mom_v_adv_p_ext=0.0,
6206 dflux_mom_v_adv_u_ext=0.0,
6207 dflux_mom_v_adv_v_ext=0.0,
6208 dflux_mom_v_adv_w_ext=0.0,
6209 dflux_mom_w_adv_p_ext=0.0,
6210 dflux_mom_w_adv_u_ext=0.0,
6211 dflux_mom_w_adv_v_ext=0.0,
6212 dflux_mom_w_adv_w_ext=0.0,
6213 bc_p_ext=0.0,
6214 bc_u_ext=0.0,
6215 bc_v_ext=0.0,
6216 bc_w_ext=0.0,
6217 bc_mom_u_acc_ext=0.0,
6218 bc_dmom_u_acc_u_ext=0.0,
6219 bc_mom_v_acc_ext=0.0,
6220 bc_dmom_v_acc_v_ext=0.0,
6221 bc_mom_w_acc_ext=0.0,
6222 bc_dmom_w_acc_w_ext=0.0,
6223 bc_mass_adv_ext[nSpace],
6224 bc_dmass_adv_u_ext[nSpace],
6225 bc_dmass_adv_v_ext[nSpace],
6226 bc_dmass_adv_w_ext[nSpace],
6227 bc_mom_u_adv_ext[nSpace],
6228 bc_dmom_u_adv_u_ext[nSpace],
6229 bc_dmom_u_adv_v_ext[nSpace],
6230 bc_dmom_u_adv_w_ext[nSpace],
6231 bc_mom_v_adv_ext[nSpace],
6232 bc_dmom_v_adv_u_ext[nSpace],
6233 bc_dmom_v_adv_v_ext[nSpace],
6234 bc_dmom_v_adv_w_ext[nSpace],
6235 bc_mom_w_adv_ext[nSpace],
6236 bc_dmom_w_adv_u_ext[nSpace],
6237 bc_dmom_w_adv_v_ext[nSpace],
6238 bc_dmom_w_adv_w_ext[nSpace],
6239 bc_mom_uu_diff_ten_ext[nSpace],
6240 bc_mom_vv_diff_ten_ext[nSpace],
6241 bc_mom_ww_diff_ten_ext[nSpace],
6242 bc_mom_uv_diff_ten_ext[1],
6243 bc_mom_uw_diff_ten_ext[1],
6244 bc_mom_vu_diff_ten_ext[1],
6245 bc_mom_vw_diff_ten_ext[1],
6246 bc_mom_wu_diff_ten_ext[1],
6247 bc_mom_wv_diff_ten_ext[1],
6248 bc_mom_u_source_ext=0.0,
6249 bc_mom_v_source_ext=0.0,
6250 bc_mom_w_source_ext=0.0,
6251 bc_mom_u_ham_ext=0.0,
6252 bc_dmom_u_ham_grad_p_ext[nSpace],
6253 bc_dmom_u_ham_grad_u_ext[nSpace],
6254 bc_mom_v_ham_ext=0.0,
6255 bc_dmom_v_ham_grad_p_ext[nSpace],
6256 bc_dmom_v_ham_grad_v_ext[nSpace],
6257 bc_mom_w_ham_ext=0.0,
6258 bc_dmom_w_ham_grad_p_ext[nSpace],
6259 bc_dmom_w_ham_grad_w_ext[nSpace],
6260 fluxJacobian_p_p[nDOF_trial_element],
6261 fluxJacobian_p_u[nDOF_trial_element],
6262 fluxJacobian_p_v[nDOF_trial_element],
6263 fluxJacobian_p_w[nDOF_trial_element],
6264 fluxJacobian_u_p[nDOF_trial_element],
6265 fluxJacobian_u_u[nDOF_trial_element],
6266 fluxJacobian_u_v[nDOF_trial_element],
6267 fluxJacobian_u_w[nDOF_trial_element],
6268 fluxJacobian_v_p[nDOF_trial_element],
6269 fluxJacobian_v_u[nDOF_trial_element],
6270 fluxJacobian_v_v[nDOF_trial_element],
6271 fluxJacobian_v_w[nDOF_trial_element],
6272 fluxJacobian_w_p[nDOF_trial_element],
6273 fluxJacobian_w_u[nDOF_trial_element],
6274 fluxJacobian_w_v[nDOF_trial_element],
6275 fluxJacobian_w_w[nDOF_trial_element],
6276 jac_ext[nSpace*nSpace],
6277 jacDet_ext,
6278 jacInv_ext[nSpace*nSpace],
6279 boundaryJac[nSpace*(nSpace-1)],
6280 metricTensor[(nSpace-1)*(nSpace-1)],
6281 metricTensorDetSqrt,
6282 p_grad_trial_trace[nDOF_trial_element*nSpace],
6283 vel_grad_trial_trace[nDOF_trial_element*nSpace],
6284 dS,
6285 p_test_dS[nDOF_test_element],
6286 vel_test_dS[nDOF_test_element],
6287 normal[2],
6288 x_ext,y_ext,z_ext,xt_ext,yt_ext,zt_ext,integralScaling,
6289 vel_grad_test_dS[nDOF_trial_element*nSpace],
6290 //VRANS
6291 porosity_ext,
6292 //
6293 G[nSpace*nSpace],G_dd_G,tr_G,h_phi,h_penalty,penalty;
6294 ck.calculateMapping_elementBoundary(eN,
6295 ebN_local,
6296 kb,
6297 ebN_local_kb,
6298 mesh_dof.data(),
6299 mesh_l2g.data(),
6300 mesh_trial_trace_ref.data(),
6301 mesh_grad_trial_trace_ref.data(),
6302 boundaryJac_ref.data(),
6303 jac_ext,
6304 jacDet_ext,
6305 jacInv_ext,
6306 boundaryJac,
6307 metricTensor,
6308 metricTensorDetSqrt,
6309 normal_ref.data(),
6310 normal,
6311 x_ext,y_ext,z_ext);
6312 ck.calculateMappingVelocity_elementBoundary(eN,
6313 ebN_local,
6314 kb,
6315 ebN_local_kb,
6316 mesh_velocity_dof.data(),
6317 mesh_l2g.data(),
6318 mesh_trial_trace_ref.data(),
6319 xt_ext,yt_ext,zt_ext,
6320 normal,
6321 boundaryJac,
6322 metricTensor,
6323 integralScaling);
6324 //dS = ((1.0-MOVING_DOMAIN)*metricTensorDetSqrt + MOVING_DOMAIN*integralScaling)*dS_ref[kb];
6325 dS = metricTensorDetSqrt*dS_ref[kb];
6326 ck.calculateG(jacInv_ext,G,G_dd_G,tr_G);
6327 ck.calculateGScale(G,&ebqe_normal_phi_ext[ebNE_kb_nSpace],h_phi);
6328
6329 eps_rho = epsFact_rho*(useMetrics*h_phi+(1.0-useMetrics)*elementDiameter[eN]);
6330 eps_mu = epsFact_mu *(useMetrics*h_phi+(1.0-useMetrics)*elementDiameter[eN]);
6331 const double particle_eps = particle_epsFact * (useMetrics * h_phi + (1.0 - useMetrics) * elementDiameter[eN]);
6332
6333 //compute shape and solution information
6334 //shape
6335 /* ck.gradTrialFromRef(&p_grad_trial_trace_ref[ebN_local_kb_nSpace*nDOF_trial_element],jacInv_ext,p_grad_trial_trace); */
6336 ck.gradTrialFromRef(&vel_grad_trial_trace_ref[ebN_local_kb_nSpace*nDOF_trial_element],jacInv_ext,vel_grad_trial_trace);
6337 //solution and gradients
6338 /* ck.valFromDOF(p_dof,&p_l2g[eN_nDOF_trial_element],&p_trial_trace_ref[ebN_local_kb*nDOF_test_element],p_ext); */
6339 p_ext = ebqe_p[ebNE_kb];
6340 ck.valFromDOF(u_dof.data(),&vel_l2g[eN_nDOF_trial_element],&vel_trial_trace_ref[ebN_local_kb*nDOF_test_element],u_ext);
6341 ck.valFromDOF(v_dof.data(),&vel_l2g[eN_nDOF_trial_element],&vel_trial_trace_ref[ebN_local_kb*nDOF_test_element],v_ext);
6342 /* ck.valFromDOF(w_dof,&vel_l2g[eN_nDOF_trial_element],&vel_trial_trace_ref[ebN_local_kb*nDOF_test_element],w_ext); */
6343 /* ck.gradFromDOF(p_dof,&p_l2g[eN_nDOF_trial_element],p_grad_trial_trace,grad_p_ext); */
6344 for (int I=0;I<nSpace;I++)
6345 grad_p_ext[I] = ebqe_grad_p[ebNE_kb_nSpace+I];
6346 ck.gradFromDOF(u_dof.data(),&vel_l2g[eN_nDOF_trial_element],vel_grad_trial_trace,grad_u_ext);
6347 ck.gradFromDOF(v_dof.data(),&vel_l2g[eN_nDOF_trial_element],vel_grad_trial_trace,grad_v_ext);
6348 /* ck.gradFromDOF(w_dof,&vel_l2g[eN_nDOF_trial_element],vel_grad_trial_trace,grad_w_ext); */
6349 //precalculate test function products with integration weights
6350 for (int j=0;j<nDOF_trial_element;j++)
6351 {
6352 /* p_test_dS[j] = p_test_trace_ref[ebN_local_kb*nDOF_test_element+j]*dS; */
6353 vel_test_dS[j] = vel_test_trace_ref[ebN_local_kb*nDOF_test_element+j]*dS;
6354 for (int I=0;I<nSpace;I++)
6355 vel_grad_test_dS[j*nSpace+I] = vel_grad_trial_trace[j*nSpace+I]*dS;//cek hack, using trial
6356 }
6357 //
6358 //load the boundary values
6359 //
6360 bc_p_ext = isDOFBoundary_p[ebNE_kb]*ebqe_bc_p_ext[ebNE_kb]+(1-isDOFBoundary_p[ebNE_kb])*p_ext;
6361 //bc values at moving boundaries are specified relative to boundary motion so we need to add it here
6362 bc_u_ext = isDOFBoundary_u[ebNE_kb]*(ebqe_bc_u_ext[ebNE_kb] + MOVING_DOMAIN*xt_ext) + (1-isDOFBoundary_u[ebNE_kb])*u_ext;
6363 bc_v_ext = isDOFBoundary_v[ebNE_kb]*(ebqe_bc_v_ext[ebNE_kb] + MOVING_DOMAIN*yt_ext) + (1-isDOFBoundary_v[ebNE_kb])*v_ext;
6364 /* bc_w_ext = isDOFBoundary_w[ebNE_kb]*(ebqe_bc_w_ext[ebNE_kb] + MOVING_DOMAIN*zt_ext) + (1-isDOFBoundary_w[ebNE_kb])*w_ext; */
6365 //VRANS
6366 porosity_ext = 1.0 - ebqe_vos_ext[ebNE_kb];
6367 //
6368 //calculate the internal and external trace of the pde coefficients
6369 //
6370 double distance_to_omega_solid = 1e10;
6371 if (use_ball_as_particle == 1)
6372 {
6373 get_distance_to_ball(nParticles, ball_center.data(), ball_radius.data(), x_ext, y_ext, z_ext, distance_to_omega_solid);
6374 }
6375 else
6376 {
6377 distance_to_omega_solid = ebq_global_phi_solid[ebN*nQuadraturePoints_elementBoundary+kb];
6378 }
6379 double eddy_viscosity_ext(0.),bc_eddy_viscosity_ext(0.),rhoSave, nuSave;//not interested in saving boundary eddy viscosity for now
6380 evaluateCoefficients(eps_rho,
6381 eps_mu,
6382 particle_eps,
6383 sigma,
6384 rho_0,
6385 nu_0,
6386 rho_1,
6387 nu_1,
6388 elementDiameter[eN],
6389 smagorinskyConstant,
6390 turbulenceClosureModel,
6391 g.data(),
6392 useVF,
6393 ebqe_vf_ext[ebNE_kb],
6394 ebqe_phi_ext[ebNE_kb],
6395 &ebqe_normal_phi_ext[ebNE_kb_nSpace],
6396 distance_to_omega_solid,
6397 ebqe_kappa_phi_ext[ebNE_kb],
6398 //VRANS
6399 porosity_ext,
6400 //
6401 p_ext,
6402 grad_p_ext,
6403 grad_u_ext,
6404 grad_v_ext,
6405 grad_w_ext,
6406 u_ext,
6407 v_ext,
6408 w_ext,
6409 ebqe_velocity_star[ebNE_kb_nSpace+0],
6410 ebqe_velocity_star[ebNE_kb_nSpace+1],
6411 ebqe_velocity_star[ebNE_kb_nSpace+1],//hack,not used
6412 eddy_viscosity_ext,
6413 mom_u_acc_ext,
6414 dmom_u_acc_u_ext,
6415 mom_v_acc_ext,
6416 dmom_v_acc_v_ext,
6417 mom_w_acc_ext,
6418 dmom_w_acc_w_ext,
6419 mass_adv_ext,
6420 dmass_adv_u_ext,
6421 dmass_adv_v_ext,
6422 dmass_adv_w_ext,
6423 mom_u_adv_ext,
6424 dmom_u_adv_u_ext,
6425 dmom_u_adv_v_ext,
6426 dmom_u_adv_w_ext,
6427 mom_v_adv_ext,
6428 dmom_v_adv_u_ext,
6429 dmom_v_adv_v_ext,
6430 dmom_v_adv_w_ext,
6431 mom_w_adv_ext,
6432 dmom_w_adv_u_ext,
6433 dmom_w_adv_v_ext,
6434 dmom_w_adv_w_ext,
6435 mom_uu_diff_ten_ext,
6436 mom_vv_diff_ten_ext,
6437 mom_ww_diff_ten_ext,
6438 mom_uv_diff_ten_ext,
6439 mom_uw_diff_ten_ext,
6440 mom_vu_diff_ten_ext,
6441 mom_vw_diff_ten_ext,
6442 mom_wu_diff_ten_ext,
6443 mom_wv_diff_ten_ext,
6444 mom_u_source_ext,
6445 mom_v_source_ext,
6446 mom_w_source_ext,
6447 mom_u_ham_ext,
6448 dmom_u_ham_grad_p_ext,
6449 dmom_u_ham_grad_u_ext,
6450 mom_v_ham_ext,
6451 dmom_v_ham_grad_p_ext,
6452 dmom_v_ham_grad_v_ext,
6453 mom_w_ham_ext,
6454 dmom_w_ham_grad_p_ext,
6455 dmom_w_ham_grad_w_ext,
6456 rhoSave,
6457 nuSave,
6458 KILL_PRESSURE_TERM,
6459 0,
6460 0., // mql: zero force term at boundary
6461 0.,
6462 0.,
6463 MATERIAL_PARAMETERS_AS_FUNCTION,
6464 ebqe_density_as_function[ebNE_kb],
6465 ebqe_dynamic_viscosity_as_function[ebNE_kb],
6466 USE_SBM,
6467 x_ext,y_ext,z_ext,
6468 use_ball_as_particle,
6469 ball_center.data(),
6470 ball_radius.data(),
6471 ball_velocity.data(),
6472 ball_angular_velocity.data(),
6473 INT_BY_PARTS_PRESSURE);
6474 evaluateCoefficients(eps_rho,
6475 eps_mu,
6476 particle_eps,
6477 sigma,
6478 rho_0,
6479 nu_0,
6480 rho_1,
6481 nu_1,
6482 elementDiameter[eN],
6483 smagorinskyConstant,
6484 turbulenceClosureModel,
6485 g.data(),
6486 useVF,
6487 bc_ebqe_vf_ext[ebNE_kb],
6488 bc_ebqe_phi_ext[ebNE_kb],
6489 &ebqe_normal_phi_ext[ebNE_kb_nSpace],
6490 distance_to_omega_solid,
6491 ebqe_kappa_phi_ext[ebNE_kb],
6492 //VRANS
6493 porosity_ext,
6494 //
6495 bc_p_ext,
6496 grad_p_ext,
6497 grad_u_ext,
6498 grad_v_ext,
6499 grad_w_ext,
6500 bc_u_ext,
6501 bc_v_ext,
6502 bc_w_ext,
6503 ebqe_velocity_star[ebNE_kb_nSpace+0],
6504 ebqe_velocity_star[ebNE_kb_nSpace+1],
6505 ebqe_velocity_star[ebNE_kb_nSpace+1],//hack,not used
6506 bc_eddy_viscosity_ext,
6507 bc_mom_u_acc_ext,
6508 bc_dmom_u_acc_u_ext,
6509 bc_mom_v_acc_ext,
6510 bc_dmom_v_acc_v_ext,
6511 bc_mom_w_acc_ext,
6512 bc_dmom_w_acc_w_ext,
6513 bc_mass_adv_ext,
6514 bc_dmass_adv_u_ext,
6515 bc_dmass_adv_v_ext,
6516 bc_dmass_adv_w_ext,
6517 bc_mom_u_adv_ext,
6518 bc_dmom_u_adv_u_ext,
6519 bc_dmom_u_adv_v_ext,
6520 bc_dmom_u_adv_w_ext,
6521 bc_mom_v_adv_ext,
6522 bc_dmom_v_adv_u_ext,
6523 bc_dmom_v_adv_v_ext,
6524 bc_dmom_v_adv_w_ext,
6525 bc_mom_w_adv_ext,
6526 bc_dmom_w_adv_u_ext,
6527 bc_dmom_w_adv_v_ext,
6528 bc_dmom_w_adv_w_ext,
6529 bc_mom_uu_diff_ten_ext,
6530 bc_mom_vv_diff_ten_ext,
6531 bc_mom_ww_diff_ten_ext,
6532 bc_mom_uv_diff_ten_ext,
6533 bc_mom_uw_diff_ten_ext,
6534 bc_mom_vu_diff_ten_ext,
6535 bc_mom_vw_diff_ten_ext,
6536 bc_mom_wu_diff_ten_ext,
6537 bc_mom_wv_diff_ten_ext,
6538 bc_mom_u_source_ext,
6539 bc_mom_v_source_ext,
6540 bc_mom_w_source_ext,
6541 bc_mom_u_ham_ext,
6542 bc_dmom_u_ham_grad_p_ext,
6543 bc_dmom_u_ham_grad_u_ext,
6544 bc_mom_v_ham_ext,
6545 bc_dmom_v_ham_grad_p_ext,
6546 bc_dmom_v_ham_grad_v_ext,
6547 bc_mom_w_ham_ext,
6548 bc_dmom_w_ham_grad_p_ext,
6549 bc_dmom_w_ham_grad_w_ext,
6550 rhoSave,
6551 nuSave,
6552 KILL_PRESSURE_TERM,
6553 0,
6554 0., // mql: zero force term at boundary
6555 0.,
6556 0.,
6557 MATERIAL_PARAMETERS_AS_FUNCTION,
6558 ebqe_density_as_function[ebNE_kb],
6559 ebqe_dynamic_viscosity_as_function[ebNE_kb],
6560 USE_SBM,
6561 x_ext,y_ext,z_ext,
6562 use_ball_as_particle,
6563 ball_center.data(),
6564 ball_radius.data(),
6565 ball_velocity.data(),
6566 ball_angular_velocity.data(),
6567 INT_BY_PARTS_PRESSURE);
6568 //Turbulence closure model
6569 if (turbulenceClosureModel >= 3)
6570 {
6571 const double turb_var_grad_0_dummy[2] = {0.,0.};
6572 const double c_mu = 0.09;//mwf hack
6573 updateTurbulenceClosure(turbulenceClosureModel,
6574 eps_rho,
6575 eps_mu,
6576 rho_0,
6577 nu_0,
6578 rho_1,
6579 nu_1,
6580 useVF,
6581 ebqe_vf_ext[ebNE_kb],
6582 ebqe_phi_ext[ebNE_kb],
6583 porosity_ext,
6584 c_mu, //mwf hack
6585 ebqe_turb_var_0[ebNE_kb],
6586 ebqe_turb_var_1[ebNE_kb],
6587 turb_var_grad_0_dummy, //not needed
6588 eddy_viscosity_ext,
6589 mom_uu_diff_ten_ext,
6590 mom_vv_diff_ten_ext,
6591 mom_ww_diff_ten_ext,
6592 mom_uv_diff_ten_ext,
6593 mom_uw_diff_ten_ext,
6594 mom_vu_diff_ten_ext,
6595 mom_vw_diff_ten_ext,
6596 mom_wu_diff_ten_ext,
6597 mom_wv_diff_ten_ext,
6598 mom_u_source_ext,
6599 mom_v_source_ext,
6600 mom_w_source_ext);
6601
6602 updateTurbulenceClosure(turbulenceClosureModel,
6603 eps_rho,
6604 eps_mu,
6605 rho_0,
6606 nu_0,
6607 rho_1,
6608 nu_1,
6609 useVF,
6610 ebqe_vf_ext[ebNE_kb],
6611 ebqe_phi_ext[ebNE_kb],
6612 porosity_ext,
6613 c_mu, //mwf hack
6614 ebqe_turb_var_0[ebNE_kb],
6615 ebqe_turb_var_1[ebNE_kb],
6616 turb_var_grad_0_dummy, //not needed
6617 bc_eddy_viscosity_ext,
6618 bc_mom_uu_diff_ten_ext,
6619 bc_mom_vv_diff_ten_ext,
6620 bc_mom_ww_diff_ten_ext,
6621 bc_mom_uv_diff_ten_ext,
6622 bc_mom_uw_diff_ten_ext,
6623 bc_mom_vu_diff_ten_ext,
6624 bc_mom_vw_diff_ten_ext,
6625 bc_mom_wu_diff_ten_ext,
6626 bc_mom_wv_diff_ten_ext,
6627 bc_mom_u_source_ext,
6628 bc_mom_v_source_ext,
6629 bc_mom_w_source_ext);
6630 }
6631 //
6632 //moving domain
6633 //
6634 mom_u_adv_ext[0] -= MOVING_DOMAIN*dmom_u_acc_u_ext*mom_u_acc_ext*xt_ext; //times rho*porosity. mql. CHECK.
6635 mom_u_adv_ext[1] -= MOVING_DOMAIN*dmom_u_acc_u_ext*mom_u_acc_ext*yt_ext;
6636 /* mom_u_adv_ext[2] -= MOVING_DOMAIN*dmom_u_acc_u_ext*mom_u_acc_ext*zt_ext; */
6637 dmom_u_adv_u_ext[0] -= MOVING_DOMAIN*dmom_u_acc_u_ext*xt_ext;
6638 dmom_u_adv_u_ext[1] -= MOVING_DOMAIN*dmom_u_acc_u_ext*yt_ext;
6639 /* dmom_u_adv_u_ext[2] -= MOVING_DOMAIN*dmom_u_acc_u_ext*zt_ext; */
6640
6641 mom_v_adv_ext[0] -= MOVING_DOMAIN*dmom_v_acc_v_ext*mom_v_acc_ext*xt_ext;
6642 mom_v_adv_ext[1] -= MOVING_DOMAIN*dmom_v_acc_v_ext*mom_v_acc_ext*yt_ext;
6643 /* mom_v_adv_ext[2] -= MOVING_DOMAIN*dmom_v_acc_v_ext*mom_v_acc_ext*zt_ext; */
6644 dmom_v_adv_v_ext[0] -= MOVING_DOMAIN*dmom_v_acc_v_ext*xt_ext;
6645 dmom_v_adv_v_ext[1] -= MOVING_DOMAIN*dmom_v_acc_v_ext*yt_ext;
6646 /* dmom_v_adv_v_ext[2] -= MOVING_DOMAIN*dmom_v_acc_v_ext*zt_ext; */
6647
6648 /* mom_w_adv_ext[0] -= MOVING_DOMAIN*dmom_w_acc_w_ext*mom_w_acc_ext*xt_ext; */
6649 /* mom_w_adv_ext[1] -= MOVING_DOMAIN*dmom_w_acc_w_ext*mom_w_acc_ext*yt_ext; */
6650 /* mom_w_adv_ext[2] -= MOVING_DOMAIN*dmom_w_acc_w_ext*mom_w_acc_ext*zt_ext; */
6651 /* dmom_w_adv_w_ext[0] -= MOVING_DOMAIN*dmom_w_acc_w_ext*xt_ext; */
6652 /* dmom_w_adv_w_ext[1] -= MOVING_DOMAIN*dmom_w_acc_w_ext*yt_ext; */
6653 /* dmom_w_adv_w_ext[2] -= MOVING_DOMAIN*dmom_w_acc_w_ext*zt_ext; */
6654
6655 //moving domain bc's
6656 // mql. CHECK.
6657 bc_mom_u_adv_ext[0] -= MOVING_DOMAIN*dmom_u_acc_u_ext*bc_mom_u_acc_ext*xt_ext; //times rho*porosity
6658 bc_mom_u_adv_ext[1] -= MOVING_DOMAIN*dmom_u_acc_u_ext*bc_mom_u_acc_ext*yt_ext;
6659 /* bc_mom_u_adv_ext[2] -= MOVING_DOMAIN*dmom_u_acc_u_ext*bc_mom_u_acc_ext*zt_ext; */
6660
6661 bc_mom_v_adv_ext[0] -= MOVING_DOMAIN*dmom_v_acc_v_ext*bc_mom_v_acc_ext*xt_ext;
6662 bc_mom_v_adv_ext[1] -= MOVING_DOMAIN*dmom_v_acc_v_ext*bc_mom_v_acc_ext*yt_ext;
6663 /* bc_mom_v_adv_ext[2] -= MOVING_DOMAIN*dmom_v_acc_v_ext*bc_mom_v_acc_ext*zt_ext; */
6664
6665 /* bc_mom_w_adv_ext[0] -= MOVING_DOMAIN*dmom_w_acc_w_ext*bc_mom_w_acc_ext*xt_ext; */
6666 /* bc_mom_w_adv_ext[1] -= MOVING_DOMAIN*dmom_w_acc_w_ext*bc_mom_w_acc_ext*yt_ext; */
6667 /* bc_mom_w_adv_ext[2] -= MOVING_DOMAIN*dmom_w_acc_w_ext*bc_mom_w_acc_ext*zt_ext; */
6668 //
6669 //calculate the numerical fluxes
6670 //
6671 exteriorNumericalAdvectiveFluxDerivatives(isDOFBoundary_p[ebNE_kb],
6672 isDOFBoundary_u[ebNE_kb],
6673 isDOFBoundary_v[ebNE_kb],
6674 isDOFBoundary_w[ebNE_kb],
6675 isAdvectiveFluxBoundary_p[ebNE_kb],
6676 isAdvectiveFluxBoundary_u[ebNE_kb],
6677 isAdvectiveFluxBoundary_v[ebNE_kb],
6678 isAdvectiveFluxBoundary_w[ebNE_kb],
6679 dmom_u_ham_grad_p_ext[0],//=1/rho
6680 normal,
6681 porosity_ext*dmom_u_acc_u_ext, //multiply by rho. mql. CHECK.
6682 bc_p_ext,
6683 bc_u_ext,
6684 bc_v_ext,
6685 bc_w_ext,
6686 bc_mass_adv_ext,
6687 bc_mom_u_adv_ext,
6688 bc_mom_v_adv_ext,
6689 bc_mom_w_adv_ext,
6690 ebqe_bc_flux_mass_ext[ebNE_kb]+MOVING_DOMAIN*(xt_ext*normal[0]+yt_ext*normal[1]),//bc is relative mass flux
6691 ebqe_bc_flux_mom_u_adv_ext[ebNE_kb],
6692 ebqe_bc_flux_mom_v_adv_ext[ebNE_kb],
6693 ebqe_bc_flux_mom_w_adv_ext[ebNE_kb],
6694 p_ext,
6695 u_ext,
6696 v_ext,
6697 w_ext,
6698 mass_adv_ext,
6699 mom_u_adv_ext,
6700 mom_v_adv_ext,
6701 mom_w_adv_ext,
6702 dmass_adv_u_ext,
6703 dmass_adv_v_ext,
6704 dmass_adv_w_ext,
6705 dmom_u_adv_p_ext,
6706 dmom_u_adv_u_ext,
6707 dmom_u_adv_v_ext,
6708 dmom_u_adv_w_ext,
6709 dmom_v_adv_p_ext,
6710 dmom_v_adv_u_ext,
6711 dmom_v_adv_v_ext,
6712 dmom_v_adv_w_ext,
6713 dmom_w_adv_p_ext,
6714 dmom_w_adv_u_ext,
6715 dmom_w_adv_v_ext,
6716 dmom_w_adv_w_ext,
6717 dflux_mass_u_ext,
6718 dflux_mass_v_ext,
6719 dflux_mass_w_ext,
6720 dflux_mom_u_adv_p_ext,
6721 dflux_mom_u_adv_u_ext,
6722 dflux_mom_u_adv_v_ext,
6723 dflux_mom_u_adv_w_ext,
6724 dflux_mom_v_adv_p_ext,
6725 dflux_mom_v_adv_u_ext,
6726 dflux_mom_v_adv_v_ext,
6727 dflux_mom_v_adv_w_ext,
6728 dflux_mom_w_adv_p_ext,
6729 dflux_mom_w_adv_u_ext,
6730 dflux_mom_w_adv_v_ext,
6731 dflux_mom_w_adv_w_ext,
6732 &ebqe_velocity_star[ebNE_kb_nSpace]);
6733 //
6734 //calculate the flux jacobian
6735 //
6736 ck.calculateGScale(G,normal,h_penalty);
6737 penalty = useMetrics*C_b/h_penalty + (1.0-useMetrics)*ebqe_penalty_ext[ebNE_kb];
6738 for (int j=0;j<nDOF_trial_element;j++)
6739 {
6740 int j_nSpace = j*nSpace,ebN_local_kb_j=ebN_local_kb*nDOF_trial_element+j;
6741 /* fluxJacobian_p_p[j]=0.0; */
6742 /* fluxJacobian_p_u[j]=ck.ExteriorNumericalAdvectiveFluxJacobian(dflux_mass_u_ext,vel_trial_trace_ref[ebN_local_kb_j]); */
6743 /* fluxJacobian_p_v[j]=ck.ExteriorNumericalAdvectiveFluxJacobian(dflux_mass_v_ext,vel_trial_trace_ref[ebN_local_kb_j]); */
6744 /* fluxJacobian_p_w[j]=ck.ExteriorNumericalAdvectiveFluxJacobian(dflux_mass_w_ext,vel_trial_trace_ref[ebN_local_kb_j]); */
6745
6746 /* fluxJacobian_u_p[j]=ck.ExteriorNumericalAdvectiveFluxJacobian(dflux_mom_u_adv_p_ext,p_trial_trace_ref[ebN_local_kb_j]); */
6747 fluxJacobian_u_u[j] =
6748 ck.ExteriorNumericalAdvectiveFluxJacobian(dflux_mom_u_adv_u_ext,vel_trial_trace_ref[ebN_local_kb_j]) +
6750 ebqe_phi_ext[ebNE_kb],
6751 sdInfo_u_u_rowptr.data(),
6752 sdInfo_u_u_colind.data(),
6753 isDOFBoundary_u[ebNE_kb],
6754 isDiffusiveFluxBoundary_u[ebNE_kb],
6755 normal,
6756 mom_uu_diff_ten_ext,
6757 vel_trial_trace_ref[ebN_local_kb_j],
6758 &vel_grad_trial_trace[j_nSpace],
6759 penalty);//ebqe_penalty_ext[ebNE_kb]);
6760 fluxJacobian_u_v[j]=
6761 ck.ExteriorNumericalAdvectiveFluxJacobian(dflux_mom_u_adv_v_ext,vel_trial_trace_ref[ebN_local_kb_j]) +
6763 ebqe_phi_ext[ebNE_kb],
6764 sdInfo_u_v_rowptr.data(),
6765 sdInfo_u_v_colind.data(),
6766 isDOFBoundary_v[ebNE_kb],
6767 isDiffusiveFluxBoundary_v[ebNE_kb],
6768 normal,
6769 mom_uv_diff_ten_ext,
6770 vel_trial_trace_ref[ebN_local_kb_j],
6771 &vel_grad_trial_trace[j_nSpace],
6772 penalty);//ebqe_penalty_ext[ebNE_kb]);
6773 /*fluxJacobian_u_w[j]=
6774 ck.ExteriorNumericalAdvectiveFluxJacobian(dflux_mom_u_adv_w_ext,vel_trial_trace_ref[ebN_local_kb_j])+*/
6775 /* ExteriorNumericalDiffusiveFluxJacobian(eps_rho, */
6776 /* ebqe_phi_ext[ebNE_kb], */
6777 /* sdInfo_u_w_rowptr, */
6778 /* sdInfo_u_w_colind, */
6779 /* isDOFBoundary_w[ebNE_kb], */
6780 /* isDiffusiveFluxBoundary_u[ebNE_kb], */
6781 /* normal, */
6782 /* mom_uw_diff_ten_ext, */
6783 /* vel_trial_trace_ref[ebN_local_kb_j], */
6784 /* &vel_grad_trial_trace[j_nSpace], */
6785 /* penalty);//ebqe_penalty_ext[ebNE_kb]); */
6786
6787 /* fluxJacobian_v_p[j]=ck.ExteriorNumericalAdvectiveFluxJacobian(dflux_mom_v_adv_p_ext,p_trial_trace_ref[ebN_local_kb_j]); */
6788 fluxJacobian_v_u[j]=
6789 ck.ExteriorNumericalAdvectiveFluxJacobian(dflux_mom_v_adv_u_ext,vel_trial_trace_ref[ebN_local_kb_j]) +
6791 ebqe_phi_ext[ebNE_kb],
6792 sdInfo_v_u_rowptr.data(),
6793 sdInfo_v_u_colind.data(),
6794 isDOFBoundary_u[ebNE_kb],
6795 isDiffusiveFluxBoundary_u[ebNE_kb],
6796 normal,
6797 mom_vu_diff_ten_ext,
6798 vel_trial_trace_ref[ebN_local_kb_j],
6799 &vel_grad_trial_trace[j_nSpace],
6800 penalty);//ebqe_penalty_ext[ebNE_kb]);
6801 fluxJacobian_v_v[j]=
6802 ck.ExteriorNumericalAdvectiveFluxJacobian(dflux_mom_v_adv_v_ext,vel_trial_trace_ref[ebN_local_kb_j]) +
6804 ebqe_phi_ext[ebNE_kb],
6805 sdInfo_v_v_rowptr.data(),
6806 sdInfo_v_v_colind.data(),
6807 isDOFBoundary_v[ebNE_kb],
6808 isDiffusiveFluxBoundary_v[ebNE_kb],
6809 normal,
6810 mom_vv_diff_ten_ext,
6811 vel_trial_trace_ref[ebN_local_kb_j],
6812 &vel_grad_trial_trace[j_nSpace],
6813 penalty);//ebqe_penalty_ext[ebNE_kb]);
6814 /* fluxJacobian_v_w[j]=
6815 ck.ExteriorNumericalAdvectiveFluxJacobian(dflux_mom_v_adv_w_ext,vel_trial_trace_ref[ebN_local_kb_j]) + */
6816 /* ExteriorNumericalDiffusiveFluxJacobian(eps_rho, */
6817 /* ebqe_phi_ext[ebNE_kb], */
6818 /* sdInfo_v_w_rowptr, */
6819 /* sdInfo_v_w_colind, */
6820 /* isDOFBoundary_w[ebNE_kb], */
6821 /* isDiffusiveFluxBoundary_v[ebNE_kb], */
6822 /* normal, */
6823 /* mom_vw_diff_ten_ext, */
6824 /* vel_trial_trace_ref[ebN_local_kb_j], */
6825 /* &vel_grad_trial_trace[j_nSpace], */
6826 /* penalty);//ebqe_penalty_ext[ebNE_kb]); */
6827
6828 /* fluxJacobian_w_p[j]=ck.ExteriorNumericalAdvectiveFluxJacobian(dflux_mom_w_adv_p_ext,p_trial_trace_ref[ebN_local_kb_j]); */
6829 /* fluxJacobian_w_u[j]=ck.ExteriorNumericalAdvectiveFluxJacobian(dflux_mom_w_adv_u_ext,vel_trial_trace_ref[ebN_local_kb_j]) + */
6830 /* ExteriorNumericalDiffusiveFluxJacobian(eps_rho, */
6831 /* ebqe_phi_ext[ebNE_kb], */
6832 /* sdInfo_w_u_rowptr, */
6833 /* sdInfo_w_u_colind, */
6834 /* isDOFBoundary_u[ebNE_kb], */
6835 /* isDiffusiveFluxBoundary_w[ebNE_kb], */
6836 /* normal, */
6837 /* mom_wu_diff_ten_ext, */
6838 /* vel_trial_trace_ref[ebN_local_kb_j], */
6839 /* &vel_grad_trial_trace[j_nSpace], */
6840 /* penalty);//ebqe_penalty_ext[ebNE_kb]); */
6841 /* fluxJacobian_w_v[j]=ck.ExteriorNumericalAdvectiveFluxJacobian(dflux_mom_w_adv_v_ext,vel_trial_trace_ref[ebN_local_kb_j]) + */
6842 /* ExteriorNumericalDiffusiveFluxJacobian(eps_rho, */
6843 /* ebqe_phi_ext[ebNE_kb], */
6844 /* sdInfo_w_v_rowptr, */
6845 /* sdInfo_w_v_colind, */
6846 /* isDOFBoundary_v[ebNE_kb], */
6847 /* isDiffusiveFluxBoundary_w[ebNE_kb], */
6848 /* normal, */
6849 /* mom_wv_diff_ten_ext, */
6850 /* vel_trial_trace_ref[ebN_local_kb_j], */
6851 /* &vel_grad_trial_trace[j_nSpace], */
6852 /* penalty);//ebqe_penalty_ext[ebNE_kb]); */
6853 /* fluxJacobian_w_w[j]=ck.ExteriorNumericalAdvectiveFluxJacobian(dflux_mom_w_adv_w_ext,vel_trial_trace_ref[ebN_local_kb_j]) + */
6854 /* ExteriorNumericalDiffusiveFluxJacobian(eps_rho, */
6855 /* ebqe_phi_ext[ebNE_kb], */
6856 /* sdInfo_w_w_rowptr, */
6857 /* sdInfo_w_w_colind, */
6858 /* isDOFBoundary_w[ebNE_kb], */
6859 /* isDiffusiveFluxBoundary_w[ebNE_kb], */
6860 /* normal, */
6861 /* mom_ww_diff_ten_ext, */
6862 /* vel_trial_trace_ref[ebN_local_kb_j], */
6863 /* &vel_grad_trial_trace[j_nSpace], */
6864 /* penalty);//ebqe_penalty_ext[ebNE_kb]); */
6865 }//j
6866 //
6867 //update the global Jacobian from the flux Jacobian
6868 //
6869 for (int i=0;i<nDOF_test_element;i++)
6870 {
6871 int eN_i = eN*nDOF_test_element+i;
6872 for (int j=0;j<nDOF_trial_element;j++)
6873 {
6874 int ebN_i_j = ebN*4*nDOF_test_X_trial_element + i*nDOF_trial_element + j,ebN_local_kb_j=ebN_local_kb*nDOF_trial_element+j;
6875
6876 /* globalJacobian[csrRowIndeces_p_p[eN_i] + csrColumnOffsets_eb_p_p[ebN_i_j]] += fluxJacobian_p_p[j]*p_test_dS[i]; */
6877 /* globalJacobian[csrRowIndeces_p_u[eN_i] + csrColumnOffsets_eb_p_u[ebN_i_j]] += fluxJacobian_p_u[j]*p_test_dS[i]; */
6878 /* globalJacobian[csrRowIndeces_p_v[eN_i] + csrColumnOffsets_eb_p_v[ebN_i_j]] += fluxJacobian_p_v[j]*p_test_dS[i]; */
6879 /* globalJacobian[csrRowIndeces_p_w[eN_i] + csrColumnOffsets_eb_p_w[ebN_i_j]] += fluxJacobian_p_w[j]*p_test_dS[i]; */
6880
6881 /* globalJacobian[csrRowIndeces_u_p[eN_i] + csrColumnOffsets_eb_u_p[ebN_i_j]] += fluxJacobian_u_p[j]*vel_test_dS[i]; */
6882 globalJacobian[csrRowIndeces_u_u[eN_i] + csrColumnOffsets_eb_u_u[ebN_i_j]] += fluxJacobian_u_u[j]*vel_test_dS[i]+
6883 ck.ExteriorElementBoundaryDiffusionAdjointJacobian(isDOFBoundary_u[ebNE_kb],
6884 isDiffusiveFluxBoundary_u[ebNE_kb],
6885 eb_adjoint_sigma,
6886 vel_trial_trace_ref[ebN_local_kb_j],
6887 normal,
6888 sdInfo_u_u_rowptr.data(),
6889 sdInfo_u_u_colind.data(),
6890 mom_uu_diff_ten_ext,
6891 &vel_grad_test_dS[i*nSpace]);
6892 globalJacobian[csrRowIndeces_u_v[eN_i] + csrColumnOffsets_eb_u_v[ebN_i_j]] += fluxJacobian_u_v[j]*vel_test_dS[i]+
6893 ck.ExteriorElementBoundaryDiffusionAdjointJacobian(isDOFBoundary_v[ebNE_kb],
6894 isDiffusiveFluxBoundary_u[ebNE_kb],
6895 eb_adjoint_sigma,
6896 vel_trial_trace_ref[ebN_local_kb_j],
6897 normal,
6898 sdInfo_u_v_rowptr.data(),
6899 sdInfo_u_v_colind.data(),
6900 mom_uv_diff_ten_ext,
6901 &vel_grad_test_dS[i*nSpace]);
6902 /* globalJacobian[csrRowIndeces_u_w[eN_i] + csrColumnOffsets_eb_u_w[ebN_i_j]] += fluxJacobian_u_w[j]*vel_test_dS[i]+ */
6903 /* ck.ExteriorElementBoundaryDiffusionAdjointJacobian(isDOFBoundary_w[ebNE_kb], */
6904 /* isDiffusiveFluxBoundary_u[ebNE_kb], */
6905 /* eb_adjoint_sigma, */
6906 /* vel_trial_trace_ref[ebN_local_kb_j], */
6907 /* normal, */
6908 /* sdInfo_u_w_rowptr, */
6909 /* sdInfo_u_w_colind, */
6910 /* mom_uw_diff_ten_ext, */
6911 /* &vel_grad_test_dS[i*nSpace]); */
6912
6913 /* globalJacobian[csrRowIndeces_v_p[eN_i] + csrColumnOffsets_eb_v_p[ebN_i_j]] += fluxJacobian_v_p[j]*vel_test_dS[i]; */
6914 globalJacobian[csrRowIndeces_v_u[eN_i] + csrColumnOffsets_eb_v_u[ebN_i_j]] += fluxJacobian_v_u[j]*vel_test_dS[i]+
6915 ck.ExteriorElementBoundaryDiffusionAdjointJacobian(isDOFBoundary_u[ebNE_kb],
6916 isDiffusiveFluxBoundary_v[ebNE_kb],
6917 eb_adjoint_sigma,
6918 vel_trial_trace_ref[ebN_local_kb_j],
6919 normal,
6920 sdInfo_v_u_rowptr.data(),
6921 sdInfo_v_u_colind.data(),
6922 mom_vu_diff_ten_ext,
6923 &vel_grad_test_dS[i*nSpace]);
6924 globalJacobian[csrRowIndeces_v_v[eN_i] + csrColumnOffsets_eb_v_v[ebN_i_j]] += fluxJacobian_v_v[j]*vel_test_dS[i]+
6925 ck.ExteriorElementBoundaryDiffusionAdjointJacobian(isDOFBoundary_v[ebNE_kb],
6926 isDiffusiveFluxBoundary_v[ebNE_kb],
6927 eb_adjoint_sigma,
6928 vel_trial_trace_ref[ebN_local_kb_j],
6929 normal,
6930 sdInfo_v_v_rowptr.data(),
6931 sdInfo_v_v_colind.data(),
6932 mom_vv_diff_ten_ext,
6933 &vel_grad_test_dS[i*nSpace]);
6934 /* globalJacobian[csrRowIndeces_v_w[eN_i] + csrColumnOffsets_eb_v_w[ebN_i_j]] += fluxJacobian_v_w[j]*vel_test_dS[i]+ */
6935 /* ck.ExteriorElementBoundaryDiffusionAdjointJacobian(isDOFBoundary_w[ebNE_kb], */
6936 /* isDiffusiveFluxBoundary_v[ebNE_kb], */
6937 /* eb_adjoint_sigma, */
6938 /* vel_trial_trace_ref[ebN_local_kb_j], */
6939 /* normal, */
6940 /* sdInfo_v_w_rowptr, */
6941 /* sdInfo_v_w_colind, */
6942 /* mom_vw_diff_ten_ext, */
6943 /* &vel_grad_test_dS[i*nSpace]); */
6944
6945 /* globalJacobian[csrRowIndeces_w_p[eN_i] + csrColumnOffsets_eb_w_p[ebN_i_j]] += fluxJacobian_w_p[j]*vel_test_dS[i]; */
6946 /* globalJacobian[csrRowIndeces_w_u[eN_i] + csrColumnOffsets_eb_w_u[ebN_i_j]] += fluxJacobian_w_u[j]*vel_test_dS[i]+ */
6947 /* ck.ExteriorElementBoundaryDiffusionAdjointJacobian(isDOFBoundary_u[ebNE_kb], */
6948 /* isDiffusiveFluxBoundary_w[ebNE_kb], */
6949 /* eb_adjoint_sigma, */
6950 /* vel_trial_trace_ref[ebN_local_kb_j], */
6951 /* normal, */
6952 /* sdInfo_w_u_rowptr, */
6953 /* sdInfo_w_u_colind, */
6954 /* mom_wu_diff_ten_ext, */
6955 /* &vel_grad_test_dS[i*nSpace]); */
6956 /* globalJacobian[csrRowIndeces_w_v[eN_i] + csrColumnOffsets_eb_w_v[ebN_i_j]] += fluxJacobian_w_v[j]*vel_test_dS[i]+ */
6957 /* ck.ExteriorElementBoundaryDiffusionAdjointJacobian(isDOFBoundary_v[ebNE_kb], */
6958 /* isDiffusiveFluxBoundary_w[ebNE_kb], */
6959 /* eb_adjoint_sigma, */
6960 /* vel_trial_trace_ref[ebN_local_kb_j], */
6961 /* normal, */
6962 /* sdInfo_w_v_rowptr, */
6963 /* sdInfo_w_v_colind, */
6964 /* mom_wv_diff_ten_ext, */
6965 /* &vel_grad_test_dS[i*nSpace]); */
6966 /* globalJacobian[csrRowIndeces_w_w[eN_i] + csrColumnOffsets_eb_w_w[ebN_i_j]] += fluxJacobian_w_w[j]*vel_test_dS[i]+ */
6967 /* ck.ExteriorElementBoundaryDiffusionAdjointJacobian(isDOFBoundary_w[ebNE_kb], */
6968 /* isDiffusiveFluxBoundary_w[ebNE_kb], */
6969 /* eb_adjoint_sigma, */
6970 /* vel_trial_trace_ref[ebN_local_kb_j], */
6971 /* normal, */
6972 /* sdInfo_w_w_rowptr, */
6973 /* sdInfo_w_w_colind, */
6974 /* mom_ww_diff_ten_ext, */
6975 /* &vel_grad_test_dS[i*nSpace]); */
6976 }//j
6977 }//i
6978 }//kb
6979 }//ebNE
6980 gf.useExact=useExact;
6981 gf_s.useExact=useExact;
6982 }//computeJacobian
6983
6985 {
6986 int nExteriorElementBoundaries_global = args.scalar<int>("nExteriorElementBoundaries_global");
6987 xt::pyarray<int>& exteriorElementBoundariesArray = args.array<int>("exteriorElementBoundariesArray");
6988 int nInteriorElementBoundaries_global = args.scalar<int>("nInteriorElementBoundaries_global");
6989 xt::pyarray<int>& interiorElementBoundariesArray = args.array<int>("interiorElementBoundariesArray");
6990 xt::pyarray<int>& elementBoundaryElementsArray = args.array<int>("elementBoundaryElementsArray");
6991 xt::pyarray<int>& elementBoundaryLocalElementBoundariesArray = args.array<int>("elementBoundaryLocalElementBoundariesArray");
6992 xt::pyarray<double>& mesh_dof = args.array<double>("mesh_dof");
6993 xt::pyarray<double>& mesh_velocity_dof = args.array<double>("mesh_velocity_dof");
6994 double MOVING_DOMAIN = args.scalar<double>("MOVING_DOMAIN");
6995 xt::pyarray<int>& mesh_l2g = args.array<int>("mesh_l2g");
6996 xt::pyarray<double>& mesh_trial_trace_ref = args.array<double>("mesh_trial_trace_ref");
6997 xt::pyarray<double>& mesh_grad_trial_trace_ref = args.array<double>("mesh_grad_trial_trace_ref");
6998 xt::pyarray<double>& normal_ref = args.array<double>("normal_ref");
6999 xt::pyarray<double>& boundaryJac_ref = args.array<double>("boundaryJac_ref");
7000 xt::pyarray<int>& vel_l2g = args.array<int>("vel_l2g");
7001 xt::pyarray<double>& u_dof = args.array<double>("u_dof");
7002 xt::pyarray<double>& v_dof = args.array<double>("v_dof");
7003 xt::pyarray<double>& w_dof = args.array<double>("w_dof");
7004 xt::pyarray<double>& vos_dof = args.array<double>("vos_dof");
7005 xt::pyarray<double>& vel_trial_trace_ref = args.array<double>("vel_trial_trace_ref");
7006 xt::pyarray<double>& ebqe_velocity = args.array<double>("ebqe_velocity");
7007 xt::pyarray<double>& velocityAverage = args.array<double>("velocityAverage");
7008 int permutations[nQuadraturePoints_elementBoundary];
7009 double xArray_left[nQuadraturePoints_elementBoundary*2],
7010 xArray_right[nQuadraturePoints_elementBoundary*2];
7011 for (int i=0;i<nQuadraturePoints_elementBoundary;i++)
7012 permutations[i]=i;//just to initialize
7013 for (int ebNE = 0; ebNE < nExteriorElementBoundaries_global; ebNE++)
7014 {
7015 int ebN = exteriorElementBoundariesArray[ebNE];
7016 for (int kb=0;kb<nQuadraturePoints_elementBoundary;kb++)
7017 {
7018 int ebN_kb_nSpace = ebN*nQuadraturePoints_elementBoundary*nSpace+kb*nSpace,
7019 ebNE_kb_nSpace = ebNE*nQuadraturePoints_elementBoundary*nSpace+kb*nSpace;
7020 velocityAverage[ebN_kb_nSpace+0]=ebqe_velocity[ebNE_kb_nSpace+0];
7021 velocityAverage[ebN_kb_nSpace+1]=ebqe_velocity[ebNE_kb_nSpace+1];
7022 }//ebNE
7023 }
7024 for (int ebNI = 0; ebNI < nInteriorElementBoundaries_global; ebNI++)
7025 {
7026 int ebN = interiorElementBoundariesArray[ebNI],
7027 left_eN_global = elementBoundaryElementsArray[ebN*2+0],
7028 left_ebN_element = elementBoundaryLocalElementBoundariesArray[ebN*2+0],
7029 right_eN_global = elementBoundaryElementsArray[ebN*2+1],
7030 right_ebN_element = elementBoundaryLocalElementBoundariesArray[ebN*2+1],
7031 left_eN_nDOF_trial_element = left_eN_global*nDOF_trial_element,
7032 right_eN_nDOF_trial_element = right_eN_global*nDOF_trial_element;
7033 double jac[nSpace*nSpace],
7034 jacDet,
7035 jacInv[nSpace*nSpace],
7036 boundaryJac[nSpace*(nSpace-1)],
7037 metricTensor[(nSpace-1)*(nSpace-1)],
7038 metricTensorDetSqrt,
7039 normal[2],
7040 x,y,z,
7041 xt,yt,zt,integralScaling;
7042
7043 for (int kb=0;kb<nQuadraturePoints_elementBoundary;kb++)
7044 {
7045 ck.calculateMapping_elementBoundary(left_eN_global,
7046 left_ebN_element,
7047 kb,
7048 left_ebN_element*nQuadraturePoints_elementBoundary+kb,
7049 mesh_dof.data(),
7050 mesh_l2g.data(),
7051 mesh_trial_trace_ref.data(),
7052 mesh_grad_trial_trace_ref.data(),
7053 boundaryJac_ref.data(),
7054 jac,
7055 jacDet,
7056 jacInv,
7057 boundaryJac,
7058 metricTensor,
7059 metricTensorDetSqrt,
7060 normal_ref.data(),
7061 normal,
7062 x,y,z);
7063 xArray_left[kb*2+0] = x;
7064 xArray_left[kb*2+1] = y;
7065 /* xArray_left[kb*3+2] = z; */
7066 ck.calculateMapping_elementBoundary(right_eN_global,
7067 right_ebN_element,
7068 kb,
7069 right_ebN_element*nQuadraturePoints_elementBoundary+kb,
7070 mesh_dof.data(),
7071 mesh_l2g.data(),
7072 mesh_trial_trace_ref.data(),
7073 mesh_grad_trial_trace_ref.data(),
7074 boundaryJac_ref.data(),
7075 jac,
7076 jacDet,
7077 jacInv,
7078 boundaryJac,
7079 metricTensor,
7080 metricTensorDetSqrt,
7081 normal_ref.data(),
7082 normal,
7083 x,y,z);
7084 ck.calculateMappingVelocity_elementBoundary(left_eN_global,
7085 left_ebN_element,
7086 kb,
7087 left_ebN_element*nQuadraturePoints_elementBoundary+kb,
7088 mesh_velocity_dof.data(),
7089 mesh_l2g.data(),
7090 mesh_trial_trace_ref.data(),
7091 xt,yt,zt,
7092 normal,
7093 boundaryJac,
7094 metricTensor,
7095 integralScaling);
7096 xArray_right[kb*2+0] = x;
7097 xArray_right[kb*2+1] = y;
7098 /* xArray_right[kb*3+2] = z; */
7099 }
7100 for (int kb_left=0;kb_left<nQuadraturePoints_elementBoundary;kb_left++)
7101 {
7102 double errorNormMin = 1.0;
7103 for (int kb_right=0;kb_right<nQuadraturePoints_elementBoundary;kb_right++)
7104 {
7105 double errorNorm=0.0;
7106 for (int I=0;I<nSpace;I++)
7107 {
7108 errorNorm += fabs(xArray_left[kb_left*2+I]
7109 -
7110 xArray_right[kb_right*2+I]);
7111 }
7112 if (errorNorm < errorNormMin)
7113 {
7114 permutations[kb_right] = kb_left;
7115 errorNormMin = errorNorm;
7116 }
7117 }
7118 }
7119 for (int kb=0;kb<nQuadraturePoints_elementBoundary;kb++)
7120 {
7121 int ebN_kb_nSpace = ebN*nQuadraturePoints_elementBoundary*nSpace+kb*nSpace;
7122 double u_left=0.0,
7123 v_left=0.0,
7124 w_left=0.0,
7125 u_right=0.0,
7126 v_right=0.0,
7127 w_right=0.0,
7128 vos_left=0.0,
7129 vos_right=0.0,
7130 porosity_left=0.0,
7131 porosity_right=0.0;
7132 int left_kb = kb,
7133 right_kb = permutations[kb],
7134 left_ebN_element_kb_nDOF_test_element=(left_ebN_element*nQuadraturePoints_elementBoundary+left_kb)*nDOF_test_element,
7135 right_ebN_element_kb_nDOF_test_element=(right_ebN_element*nQuadraturePoints_elementBoundary+right_kb)*nDOF_test_element;
7136 //
7137 //calculate the velocity solution at quadrature points on left and right
7138 //
7139 ck.valFromDOF(vos_dof.data(),&vel_l2g[left_eN_nDOF_trial_element],&vel_trial_trace_ref[left_ebN_element_kb_nDOF_test_element],vos_left);
7140 ck.valFromDOF(u_dof.data(),&vel_l2g[left_eN_nDOF_trial_element],&vel_trial_trace_ref[left_ebN_element_kb_nDOF_test_element],u_left);
7141 ck.valFromDOF(v_dof.data(),&vel_l2g[left_eN_nDOF_trial_element],&vel_trial_trace_ref[left_ebN_element_kb_nDOF_test_element],v_left);
7142 /* ck.valFromDOF(w_dof,&vel_l2g[left_eN_nDOF_trial_element],&vel_trial_trace_ref[left_ebN_element_kb_nDOF_test_element],w_left); */
7143 //
7144 ck.valFromDOF(vos_dof.data(),&vel_l2g[right_eN_nDOF_trial_element],&vel_trial_trace_ref[right_ebN_element_kb_nDOF_test_element],vos_right);
7145 ck.valFromDOF(u_dof.data(),&vel_l2g[right_eN_nDOF_trial_element],&vel_trial_trace_ref[right_ebN_element_kb_nDOF_test_element],u_right);
7146 ck.valFromDOF(v_dof.data(),&vel_l2g[right_eN_nDOF_trial_element],&vel_trial_trace_ref[right_ebN_element_kb_nDOF_test_element],v_right);
7147 /* ck.valFromDOF(w_dof,&vel_l2g[right_eN_nDOF_trial_element],&vel_trial_trace_ref[right_ebN_element_kb_nDOF_test_element],w_right); */
7148 //
7149 /* porosity_left = 1.0 - vos_left; */
7150 /* porosity_right = 1.0 - vos_right; */
7151 velocityAverage[ebN_kb_nSpace+0]=0.5*(u_left + u_right);
7152 velocityAverage[ebN_kb_nSpace+1]=0.5*(v_left + v_right);
7153 /* velocityAverage[ebN_kb_nSpace+2]=0.5*(w_left + w_right); */
7154 }//ebNI
7155 }
7156 }
7157
7158
7160 {
7161 xt::pyarray<double>& mesh_dof = args.array<double>("mesh_dof");
7162 xt::pyarray<int>& mesh_l2g = args.array<int>("mesh_l2g");
7163 xt::pyarray<double>& mesh_trial_trace_ref = args.array<double>("mesh_trial_trace_ref");
7164 xt::pyarray<double>& mesh_grad_trial_trace_ref = args.array<double>("mesh_grad_trial_trace_ref");
7165 xt::pyarray<double>& dS_ref = args.array<double>("dS_ref");
7166 xt::pyarray<double>& vel_test_trace_ref = args.array<double>("vel_test_trace_ref");
7167 xt::pyarray<double>& normal_ref = args.array<double>("normal_ref");
7168 xt::pyarray<double>& boundaryJac_ref = args.array<double>("boundaryJac_ref");
7169 xt::pyarray<int>& vel_l2g = args.array<int>("vel_l2g");
7170 int nExteriorElementBoundaries_global = args.scalar<int>("nExteriorElementBoundaries_global");
7171 xt::pyarray<int>& exteriorElementBoundariesArray = args.array<int>("exteriorElementBoundariesArray");
7172 xt::pyarray<int>& elementBoundaryElementsArray = args.array<int>("elementBoundaryElementsArray");
7173 xt::pyarray<int>& elementBoundaryLocalElementBoundariesArray = args.array<int>("elementBoundaryLocalElementBoundariesArray");
7174 xt::pyarray<double>& isBoundary_1D = args.array<double>("isBoundary_1D");
7175 //
7176 //loop over exterior element boundaries to calculate surface integrals and load into element and global residuals
7177 //
7178 //ebNE is the Exterior element boundary INdex
7179 //ebN is the element boundary INdex
7180 //eN is the element index
7181 for (int ebNE = 0; ebNE < nExteriorElementBoundaries_global; ebNE++)
7182 {
7183 int ebN = exteriorElementBoundariesArray[ebNE],
7184 eN = elementBoundaryElementsArray[ebN*2+0],
7185 ebN_local = elementBoundaryLocalElementBoundariesArray[ebN*2+0],
7186 eN_nDOF_trial_element = eN*nDOF_trial_element;
7187 double
7188 elementIsBoundary[nDOF_test_element];
7189 const double* elementResidual_w(NULL);
7190 for (int i=0;i<nDOF_test_element;i++)
7191 elementIsBoundary[i]=0.0;
7192 for (int kb=0;kb<nQuadraturePoints_elementBoundary;kb++)
7193 {
7194 int ebNE_kb = ebNE*nQuadraturePoints_elementBoundary+kb,
7195 ebNE_kb_nSpace = ebNE_kb*nSpace,
7196 ebN_local_kb = ebN_local*nQuadraturePoints_elementBoundary+kb,
7197 ebN_local_kb_nSpace = ebN_local_kb*nSpace;
7198 double
7199 jac_ext[nSpace*nSpace],
7200 jacDet_ext,
7201 jacInv_ext[nSpace*nSpace],
7202 boundaryJac[nSpace*(nSpace-1)],
7203 metricTensor[(nSpace-1)*(nSpace-1)],
7204 metricTensorDetSqrt,
7205 dS, vel_test_dS[nDOF_test_element],
7206 normal[2],x_ext,y_ext,z_ext;
7207 //compute information about mapping from reference element to physical element
7208 ck.calculateMapping_elementBoundary(eN,
7209 ebN_local,
7210 kb,
7211 ebN_local_kb,
7212 mesh_dof.data(),
7213 mesh_l2g.data(),
7214 mesh_trial_trace_ref.data(),
7215 mesh_grad_trial_trace_ref.data(),
7216 boundaryJac_ref.data(),
7217 jac_ext,
7218 jacDet_ext,
7219 jacInv_ext,
7220 boundaryJac,
7221 metricTensor,
7222 metricTensorDetSqrt,
7223 normal_ref.data(),
7224 normal,
7225 x_ext,y_ext,z_ext);
7226 dS = metricTensorDetSqrt*dS_ref[kb];
7227 //precalculate test function products with integration weights
7228 for (int j=0;j<nDOF_trial_element;j++)
7229 vel_test_dS[j] = fabs(vel_test_trace_ref[ebN_local_kb*nDOF_test_element+j])*dS;
7230 //
7231 //update residuals
7232 //
7233 for (int i=0;i<nDOF_test_element;i++)
7234 elementIsBoundary[i] += vel_test_dS[i];
7235 }//kb
7236 //
7237 //update the element and global residual storage
7238 //
7239 for (int i=0;i<nDOF_test_element;i++)
7240 {
7241 int eN_i = eN*nDOF_test_element+i;
7242 isBoundary_1D[vel_l2g[eN_i]] += elementIsBoundary[i];
7243 }//i
7244 }//ebNE
7245 }
7246 };//RANS3PF2D
7247
7248 inline cppRANS3PF2D_base* newRANS3PF2D(int nSpaceIn,
7249 int nQuadraturePoints_elementIn,
7250 int nDOF_mesh_trial_elementIn,
7251 int nDOF_trial_elementIn,
7252 int nDOF_test_elementIn,
7253 int nQuadraturePoints_elementBoundaryIn,
7254 int CompKernelFlag,
7255 double aDarcy,
7256 double betaForch,
7257 double grain,
7258 double packFraction,
7259 double packMargin,
7260 double maxFraction,
7261 double frFraction,
7262 double sigmaC,
7263 double C3e,
7264 double C4e,
7265 double eR,
7266 double fContact,
7267 double mContact,
7268 double nContact,
7269 double angFriction, double vos_limiter, double mu_fr_limiter )
7270 {
7272 nQuadraturePoints_elementIn,
7273 nDOF_mesh_trial_elementIn,
7274 nDOF_trial_elementIn,
7275 nDOF_test_elementIn,
7276 nQuadraturePoints_elementBoundaryIn,
7277 CompKernelFlag);
7278 rvalue->setSedClosure(aDarcy,
7279 betaForch,
7280 grain,
7281 packFraction,
7282 packMargin,
7283 maxFraction,
7284 frFraction,
7285 sigmaC,
7286 C3e,
7287 C4e,
7288 eR,
7289 fContact,
7290 mContact,
7291 nContact,
7292 angFriction, vos_limiter, mu_fr_limiter );
7293 return rvalue;
7294 }
7295} //proteus
7296
7297#endif
double nu_0
double rho_1
double nu_1
double rho_0
Int n
Definition Headers.h:28
Double L
Definition Headers.h:72
Double r
Definition Headers.h:83
Double u
Definition Headers.h:89
Double vy
Definition Headers.h:98
Double * z
Definition Headers.h:49
Double v
Definition Headers.h:95
Double R
Definition Headers.h:82
Double vx
Definition Headers.h:97
#define cMax
Definition NCLS3P.h:11
#define cE
Definition NCLS3P.h:10
const double DM3
Definition RANS2P.h:25
const double DM
Definition RANS2P.h:23
const double DM2
Definition RANS2P.h:24
double sgn(double val)
Definition RANS3PF2D.h:20
#define DRAG_FAC
Definition RANS3PF2D.h:17
#define TURB_FORCE_FAC
Definition RANS3PF2D.h:18
#define CUT_CELL_INTEGRATION
Definition RANS3PF2D.h:19
void baryCoords(const double r0[2], const double r1[2], const double r2[2], const double r[2], double *lambda)
Definition RANS3PF2D.h:44
#define C_FOR_GAMMA_INDICATOR
Definition RANS3PF.h:37
#define USE_GAMMA_INDICATOR
Definition RANS3PF.h:38
#define CELL_BASED_EV_COEFF
Definition RANS3PF.h:34
#define EPS_FOR_GAMMA_INDICATOR
Definition RANS3PF.h:36
#define ANISOTROPIC_DIFFUSION
Definition RANS3PF.h:39
int calculate(const double *phi_dof, const double *phi_nodes, const double *xi_r, double ma, double mb, double jf, bool isBoundary, bool scale)
double betaCoeff(double sedF, double rhoFluid, const double uFluid[nSpace], const double uSolid[nSpace], double nu)
Definition SedClosure.h:71
std::valarray< double > wStar_psi
Definition RANS3PF2D.h:72
virtual void calculateResidual(arguments_dict &args, bool useExact)=0
std::valarray< double > vStar_hi
Definition RANS3PF2D.h:73
std::valarray< double > vStar_min_hiHe
Definition RANS3PF2D.h:74
std::valarray< double > uStar_psi
Definition RANS3PF2D.h:72
std::valarray< double > wStar_hi
Definition RANS3PF2D.h:73
std::valarray< double > den_hi
Definition RANS3PF2D.h:73
virtual void calculateVelocityAverage(arguments_dict &args)=0
std::valarray< double > vStar_gamma
Definition RANS3PF2D.h:75
std::valarray< double > uStar_min_hiHe
Definition RANS3PF2D.h:74
virtual void calculateJacobian(arguments_dict &args, bool useExact)=0
virtual void setSedClosure(double aDarcy, double betaForch, double grain, double packFraction, double packMargin, double maxFraction, double frFraction, double sigmaC, double C3e, double C4e, double eR, double fContact, double mContact, double nContact, double angFriction, double vos_limiter, double mu_fr_limiter)
Definition RANS3PF2D.h:77
std::valarray< double > TransportMatrix
Definition RANS3PF2D.h:71
virtual void getBoundaryDOFs(arguments_dict &args)=0
std::valarray< double > vStar_psi
Definition RANS3PF2D.h:72
std::valarray< double > uStar_hi
Definition RANS3PF2D.h:73
std::valarray< double > TransposeTransportMatrix
Definition RANS3PF2D.h:71
std::valarray< double > wStar_min_hiHe
Definition RANS3PF2D.h:74
std::valarray< double > uStar_gamma
Definition RANS3PF2D.h:75
std::valarray< double > wStar_gamma
Definition RANS3PF2D.h:75
void getBoundaryDOFs(arguments_dict &args)
Definition RANS3PF2D.h:7159
double ExteriorNumericalDiffusiveFluxJacobian(const double &eps, const double &phi, int *rowptr, int *colind, const int &isDOFBoundary, const int &isFluxBoundary, const double n[nSpace], double *a, const double &v, const double grad_v[nSpace], const double &penalty)
Definition RANS3PF2D.h:1480
void calculateCFL(const double &hFactor, const double &elementDiameter, const double &dm, const double df[nSpace], double &cfl)
Definition RANS3PF2D.h:907
void exteriorNumericalAdvectiveFlux(const int &isDOFBoundary_p, const int &isDOFBoundary_u, const int &isDOFBoundary_v, const int &isDOFBoundary_w, const int &isFluxBoundary_p, const int &isFluxBoundary_u, const int &isFluxBoundary_v, const int &isFluxBoundary_w, const double &oneByRho, const double &bc_oneByRho, const double n[nSpace], const double &porosity, const double &bc_p, const double &bc_u, const double &bc_v, const double &bc_w, const double bc_f_mass[nSpace], const double bc_f_umom[nSpace], const double bc_f_vmom[nSpace], const double bc_f_wmom[nSpace], const double &bc_flux_mass, const double &bc_flux_umom, const double &bc_flux_vmom, const double &bc_flux_wmom, const double &p, const double &u, const double &v, const double &w, const double f_mass[nSpace], const double f_umom[nSpace], const double f_vmom[nSpace], const double f_wmom[nSpace], const double df_mass_du[nSpace], const double df_mass_dv[nSpace], const double df_mass_dw[nSpace], const double df_umom_dp[nSpace], const double df_umom_du[nSpace], const double df_umom_dv[nSpace], const double df_umom_dw[nSpace], const double df_vmom_dp[nSpace], const double df_vmom_du[nSpace], const double df_vmom_dv[nSpace], const double df_vmom_dw[nSpace], const double df_wmom_dp[nSpace], const double df_wmom_du[nSpace], const double df_wmom_dv[nSpace], const double df_wmom_dw[nSpace], double &flux_mass, double &flux_umom, double &flux_vmom, double &flux_wmom, double *velocity_star, double *velocity)
Definition RANS3PF2D.h:1131
int get_distance_to_ball(int n_balls, double *ball_center, double *ball_radius, double x, double y, double z, double &distance)
Definition RANS3PF2D.h:1527
cppHsuSedStress< 2 > closure
Definition RANS3PF2D.h:118
CompKernelType ck
Definition RANS3PF2D.h:121
double Dot(const double vec1[nSpace], const double vec2[nSpace])
Definition RANS3PF2D.h:196
void exteriorNumericalAdvectiveFluxDerivatives(const int &isDOFBoundary_p, const int &isDOFBoundary_u, const int &isDOFBoundary_v, const int &isDOFBoundary_w, const int &isFluxBoundary_p, const int &isFluxBoundary_u, const int &isFluxBoundary_v, const int &isFluxBoundary_w, const double &oneByRho, const double n[nSpace], const double &porosity, const double &bc_p, const double &bc_u, const double &bc_v, const double &bc_w, const double bc_f_mass[nSpace], const double bc_f_umom[nSpace], const double bc_f_vmom[nSpace], const double bc_f_wmom[nSpace], const double &bc_flux_mass, const double &bc_flux_umom, const double &bc_flux_vmom, const double &bc_flux_wmom, const double &p, const double &u, const double &v, const double &w, const double f_mass[nSpace], const double f_umom[nSpace], const double f_vmom[nSpace], const double f_wmom[nSpace], const double df_mass_du[nSpace], const double df_mass_dv[nSpace], const double df_mass_dw[nSpace], const double df_umom_dp[nSpace], const double df_umom_du[nSpace], const double df_umom_dv[nSpace], const double df_umom_dw[nSpace], const double df_vmom_dp[nSpace], const double df_vmom_du[nSpace], const double df_vmom_dv[nSpace], const double df_vmom_dw[nSpace], const double df_wmom_dp[nSpace], const double df_wmom_du[nSpace], const double df_wmom_dv[nSpace], const double df_wmom_dw[nSpace], double &dflux_mass_du, double &dflux_mass_dv, double &dflux_mass_dw, double &dflux_umom_dp, double &dflux_umom_du, double &dflux_umom_dv, double &dflux_umom_dw, double &dflux_vmom_dp, double &dflux_vmom_du, double &dflux_vmom_dv, double &dflux_vmom_dw, double &dflux_wmom_dp, double &dflux_wmom_du, double &dflux_wmom_dv, double &dflux_wmom_dw, double *velocity_star)
Definition RANS3PF2D.h:1268
std::vector< int > surrogate_boundary_particle
Definition RANS3PF2D.h:115
void calculateSubgridErrorDerivatives_tauRes(const double &tau_p, const double &tau_v, const double dpdeResidualP_du[nDOF_trial_element], const double dpdeResidualP_dv[nDOF_trial_element], const double dpdeResidualP_dw[nDOF_trial_element], const double dpdeResidualU_dp[nDOF_trial_element], const double dpdeResidualU_du[nDOF_trial_element], const double dpdeResidualV_dp[nDOF_trial_element], const double dpdeResidualV_dv[nDOF_trial_element], const double dpdeResidualW_dp[nDOF_trial_element], const double dpdeResidualW_dw[nDOF_trial_element], double dsubgridErrorP_du[nDOF_trial_element], double dsubgridErrorP_dv[nDOF_trial_element], double dsubgridErrorP_dw[nDOF_trial_element], double dsubgridErrorU_dp[nDOF_trial_element], double dsubgridErrorU_du[nDOF_trial_element], double dsubgridErrorV_dp[nDOF_trial_element], double dsubgridErrorV_dv[nDOF_trial_element], double dsubgridErrorW_dp[nDOF_trial_element], double dsubgridErrorW_dw[nDOF_trial_element])
Definition RANS3PF2D.h:1090
std::valarray< double > TransportMatrix
Definition RANS3PF2D.h:116
void calculateTangentialGradient(const double normal[nSpace], const double vel_grad[nSpace], double vel_tgrad[nSpace])
Definition RANS3PF2D.h:205
GeneralizedFunctions< nSpace, 1, nQuadraturePoints_element, nQuadraturePoints_elementBoundary > gf_s
Definition RANS3PF2D.h:123
void calculateSubgridError_tau(const double &hFactor, const double &elementDiameter, const double &dmt, const double &dm, const double df[nSpace], const double &a, const double &pfac, double &tau_v, double &tau_p, double &cfl)
Definition RANS3PF2D.h:1022
void updateTurbulenceClosure(const int turbulenceClosureModel, const double eps_rho, const double eps_mu, const double rho_0, const double nu_0, const double rho_1, const double nu_1, const double useVF, const double vf, const double phi, const double porosity, const double eddy_visc_coef_0, const double turb_var_0, const double turb_var_1, const double turb_grad_0[nSpace], double &eddy_viscosity, double mom_uu_diff_ten[nSpace], double mom_vv_diff_ten[nSpace], double mom_ww_diff_ten[nSpace], double mom_uv_diff_ten[1], double mom_uw_diff_ten[1], double mom_vu_diff_ten[1], double mom_vw_diff_ten[1], double mom_wu_diff_ten[1], double mom_wv_diff_ten[1], double &mom_u_source, double &mom_v_source, double &mom_w_source)
Definition RANS3PF2D.h:926
std::valarray< double > psi
Definition RANS3PF2D.h:116
void calculateSubgridError_tauRes(const double &tau_p, const double &tau_v, const double &pdeResidualP, const double &pdeResidualU, const double &pdeResidualV, const double &pdeResidualW, double &subgridErrorP, double &subgridErrorU, double &subgridErrorV, double &subgridErrorW)
Definition RANS3PF2D.h:1071
GeneralizedFunctions< nSpace, 1, nQuadraturePoints_element, nQuadraturePoints_elementBoundary > gf
Definition RANS3PF2D.h:122
double get_dot_product(const double *u, const double *v)
Definition RANS3PF2D.h:1523
void get_velocity_to_ith_ball(int n_balls, double *ball_center, double *ball_radius, double *ball_velocity, double *ball_angular_velocity, int I, double x, double y, double z, double &vx, double &vy)
Definition RANS3PF2D.h:1568
void setSedClosure(double aDarcy, double betaForch, double grain, double packFraction, double packMargin, double maxFraction, double frFraction, double sigmaC, double C3e, double C4e, double eR, double fContact, double mContact, double nContact, double angFriction, double vos_limiter, double mu_fr_limiter)
Definition RANS3PF2D.h:159
void evaluateCoefficients(const double eps_rho, const double eps_mu, const double eps_s, const double sigma, const double rho_0, double nu_0, const double rho_1, double nu_1, const double h_e, const double smagorinskyConstant, const int turbulenceClosureModel, const double g[nSpace], const double useVF, const double &vf, const double &phi, const double n[nSpace], const double distance_to_omega_solid, const double &kappa, const double porosity, const double &p, const double grad_p[nSpace], const double grad_u[nSpace], const double grad_v[nSpace], const double grad_w[nSpace], const double &u, const double &v, const double &w, const double &uStar, const double &vStar, const double &wStar, double &eddy_viscosity, double &mom_u_acc, double &dmom_u_acc_u, double &mom_v_acc, double &dmom_v_acc_v, double &mom_w_acc, double &dmom_w_acc_w, double mass_adv[nSpace], double dmass_adv_u[nSpace], double dmass_adv_v[nSpace], double dmass_adv_w[nSpace], double mom_u_adv[nSpace], double dmom_u_adv_u[nSpace], double dmom_u_adv_v[nSpace], double dmom_u_adv_w[nSpace], double mom_v_adv[nSpace], double dmom_v_adv_u[nSpace], double dmom_v_adv_v[nSpace], double dmom_v_adv_w[nSpace], double mom_w_adv[nSpace], double dmom_w_adv_u[nSpace], double dmom_w_adv_v[nSpace], double dmom_w_adv_w[nSpace], double mom_uu_diff_ten[nSpace], double mom_vv_diff_ten[nSpace], double mom_ww_diff_ten[nSpace], double mom_uv_diff_ten[1], double mom_uw_diff_ten[1], double mom_vu_diff_ten[1], double mom_vw_diff_ten[1], double mom_wu_diff_ten[1], double mom_wv_diff_ten[1], double &mom_u_source, double &mom_v_source, double &mom_w_source, double &mom_u_ham, double dmom_u_ham_grad_p[nSpace], double dmom_u_ham_grad_u[nSpace], double &mom_v_ham, double dmom_v_ham_grad_p[nSpace], double dmom_v_ham_grad_v[nSpace], double &mom_w_ham, double dmom_w_ham_grad_p[nSpace], double dmom_w_ham_grad_w[nSpace], double &rhoSave, double &nuSave, int KILL_PRESSURE_TERM, int MULTIPLY_EXTERNAL_FORCE_BY_DENSITY, double forcex, double forcey, double forcez, int MATERIAL_PARAMETERS_AS_FUNCTION, double density_as_function, double dynamic_viscosity_as_function, int USE_SBM, double x, double y, double z, int use_ball_as_particle, double *ball_center, double *ball_radius, double *ball_velocity, double *ball_angular_velocity, int INT_BY_PARTS_PRESSURE)
Definition RANS3PF2D.h:215
void get_normal_to_ith_ball(int n_balls, double *ball_center, double *ball_radius, int I, double x, double y, double z, double &nx, double &ny)
Definition RANS3PF2D.h:1556
double get_cross_product(const double *u, const double *v)
Definition RANS3PF2D.h:1519
const int nDOF_test_X_trial_element
Definition RANS3PF2D.h:119
void get_symmetric_gradient_dot_vec(const double *grad_u, const double *grad_v, const double *n, double res[2])
Definition RANS3PF2D.h:1512
void exteriorNumericalDiffusiveFlux(const double &eps, const double &phi, int *rowptr, int *colind, const int &isDOFBoundary, const int &isFluxBoundary, const double n[nSpace], double *bc_a, const double &bc_u, const double &bc_flux, double *a, const double grad_potential[nSpace], const double &u, const double &penalty, double &flux)
Definition RANS3PF2D.h:1432
std::valarray< double > TransposeTransportMatrix
Definition RANS3PF2D.h:116
void calculateSubgridError_tau(const double &Ct_sge, const double &Cd_sge, const double G[nSpace *nSpace], const double &G_dd_G, const double &tr_G, const double &A0, const double Ai[nSpace], const double &Kij, const double &pfac, double &tau_v, double &tau_p, double &q_cfl)
Definition RANS3PF2D.h:1050
void get_distance_to_ith_ball(int n_balls, double *ball_center, double *ball_radius, int I, double x, double y, double z, double &distance)
Definition RANS3PF2D.h:1546
void calculateVelocityAverage(arguments_dict &args)
Definition RANS3PF2D.h:6984
void updateSolidParticleTerms(bool element_owned, const double particle_nitsche, const double dV, const int nParticles, const int sd_offset, double *particle_signed_distances, double *particle_signed_distance_normals, double *particle_velocities, double *particle_centroids, int use_ball_as_particle, double *ball_center, double *ball_radius, double *ball_velocity, double *ball_angular_velocity, const double porosity, const double penalty, const double alpha, const double beta, const double eps_rho, const double eps_mu, const double rho_0, const double nu_0, const double rho_1, const double nu_1, const double useVF, const double vf, const double phi, const double x, const double y, const double z, const double p, const double u, const double v, const double w, const double uStar, const double vStar, const double wStar, const double eps_s, const double grad_u[nSpace], const double grad_v[nSpace], const double grad_w[nSpace], double &mom_u_source, double &mom_v_source, double &mom_w_source, double dmom_u_source[nSpace], double dmom_v_source[nSpace], double dmom_w_source[nSpace], double mom_u_adv[nSpace], double mom_v_adv[nSpace], double mom_w_adv[nSpace], double dmom_u_adv_u[nSpace], double dmom_v_adv_v[nSpace], double dmom_w_adv_w[nSpace], double &mom_u_ham, double dmom_u_ham_grad_u[nSpace], double &mom_v_ham, double dmom_v_ham_grad_v[nSpace], double &mom_w_ham, double dmom_w_ham_grad_w[nSpace], double *particle_netForces, double *particle_netMoments, double *particle_surfaceArea)
Definition RANS3PF2D.h:611
std::vector< int > surrogate_boundary_elements
Definition RANS3PF2D.h:115
std::vector< int > surrogate_boundaries
Definition RANS3PF2D.h:115
void updateDarcyForchheimerTerms_Ergun(const double alpha, const double beta, const double eps_rho, const double eps_mu, const double rho_0, const double nu_0, const double rho_1, const double nu_1, double nu_t, const double useVF, const double vf, const double phi, const double u, const double v, const double w, const double uStar, const double vStar, const double wStar, const double eps_s, const double phi_s, const double u_s, const double v_s, const double w_s, const double uStar_s, const double vStar_s, const double wStar_s, double &mom_u_source, double &mom_v_source, double &mom_w_source, double dmom_u_source[nSpace], double dmom_v_source[nSpace], double dmom_w_source[nSpace], double gradC_x, double gradC_y, double gradC_z)
Definition RANS3PF2D.h:531
void calculateJacobian(arguments_dict &args, bool useExact)
Definition RANS3PF2D.h:4671
void compute_force_around_solid(bool element_owned, const double dV, const int nParticles, const int sd_offset, double *particle_signed_distances, double *particle_signed_distance_normals, double *particle_velocities, double *particle_centroids, int use_ball_as_particle, double *ball_center, double *ball_radius, double *ball_velocity, double *ball_angular_velocity, const double penalty, const double alpha, const double beta, const double eps_rho, const double eps_mu, const double rho_0, const double nu_0, const double rho_1, const double nu_1, const double useVF, const double vf, const double phi, const double x, const double y, const double z, const double p, const double u, const double v, const double w, const double uStar, const double vStar, const double wStar, const double eps_s, const double grad_u[nSpace], const double grad_v[nSpace], const double grad_w[nSpace], double *particle_netForces, double *particle_netMoments)
Definition RANS3PF2D.h:794
void calculateResidual(arguments_dict &args, bool useExact)
Definition RANS3PF2D.h:1578
double df(double C, double b, double a, int q, int r)
void vel(double rS, double norm_v, double r, double theta, double *vR, double *vTHETA)
#define w(x)
Definition jf.h:22
#define POWER_SMOOTHNESS_INDICATOR
Definition m_comp_co2.h:22
Definition ADR.h:19
equivalent_polynomials::GeneralizedFunctions_mix< nSpace, nP_ifem, nP, nQ, nEBQ, true > GeneralizedFunctions
Definition ADR.h:21
double phi(const double &g, const double &h, const double &hL, const double &hR, const double &uL, const double &uR)
Definition SW2DCV.h:62
cppRANS3PF2D_base * newRANS3PF2D(int nSpaceIn, int nQuadraturePoints_elementIn, int nDOF_mesh_trial_elementIn, int nDOF_trial_elementIn, int nDOF_test_elementIn, int nQuadraturePoints_elementBoundaryIn, int CompKernelFlag, double aDarcy, double betaForch, double grain, double packFraction, double packMargin, double maxFraction, double frFraction, double sigmaC, double C3e, double C4e, double eR, double fContact, double mContact, double nContact, double angFriction, double vos_limiter, double mu_fr_limiter)
Definition RANS3PF2D.h:7248
Model_Base * chooseAndAllocateDiscretization2D(int nSpaceIn, int nQuadraturePoints_elementIn, int nDOF_mesh_trial_elementIn, int nDOF_trial_elementIn, int nDOF_test_elementIn, int nDOF_v_trial_elementIn, int nDOF_v_test_elementIn, int nQuadraturePoints_elementBoundaryIn, int CompKernelFlag)
T & scalar(const std::string &key)
xt::pyarray< T > & array(const std::string &key)