@@ -24,6 +24,16 @@ const double DM3=1.0;//1-point-wise divergence, 0-point-wise rate of volume cha
2424const double inertial_term=1.0 ;
2525namespace proteus
2626{
27+ namespace detail
28+ {
29+ template <size_t N, class T >
30+ inline std::array<T, N> make_array (const T& t)
31+ {
32+ std::array<T, N> res;
33+ std::fill_n (res.begin (), N, t);
34+ }
35+ }
36+
2737 template <int nSpace, int nP, int nQ, int nEBQ>
2838 using GeneralizedFunctions = equivalent_polynomials::GeneralizedFunctions_mix<nSpace, nP, nQ, nEBQ>;
2939
@@ -1617,7 +1627,7 @@ namespace proteus
16171627 xt::pyarray<double >& forcex = args.array <double >(" forcex" );
16181628 xt::pyarray<double >& forcey = args.array <double >(" forcey" );
16191629 xt::pyarray<double >& forcez = args.array <double >(" forcez" );
1620- int use_ball_as_particle = args.scalar <int >(" use_ball_as_particle" );
1630+ int use_ball_as_particle = args.scalar <int >(" use_ball_as_particle" );
16211631 xt::pyarray<double >& ball_center = args.array <double >(" ball_center" );
16221632 xt::pyarray<double >& ball_radius = args.array <double >(" ball_radius" );
16231633 xt::pyarray<double >& ball_velocity = args.array <double >(" ball_velocity" );
@@ -1680,36 +1690,21 @@ namespace proteus
16801690 /* <<"Ball Info: velocity "<<ball_velocity[0]<<'\t'<<ball_velocity[1]<<'\t'<<ball_velocity[2]<<std::endl */
16811691 /* <<"Ball Info: angular "<<ball_angular_velocity[0]<<ball_angular_velocity[1]<<ball_angular_velocity[2]<<std::endl; */
16821692 for (int eN=0 ;eN<nElements_global;eN++)
1683- {
1684- // declare local storage for element residual and initialize
1685- register double elementResidual_p[nDOF_test_element],elementResidual_p_check[nDOF_test_element],elementResidual_mesh[nDOF_test_element],
1686- elementResidual_u[nDOF_v_test_element],
1687- elementResidual_v[nDOF_v_test_element],
1688- pelementResidual_u[nDOF_v_test_element],
1689- pelementResidual_v[nDOF_v_test_element],
1690- velocityErrorElement[nDOF_v_test_element],
1691- eps_rho,eps_mu;
1693+ {
1694+ auto elementResidual_p = detail::make_array<nDOF_test_element>(0.0 );
1695+ auto elementResidual_p_check = detail::make_array<nDOF_test_element>(0.0 );
1696+ auto elementResidual_mesh = detail::make_array<nDOF_test_element>(0.0 );
1697+ auto elementResidual_u = detail::make_array<nDOF_v_test_element>(0.0 );
1698+ auto elementResidual_v = detail::make_array<nDOF_v_test_element>(0.0 );
1699+ auto pelementResidual_u = detail::make_array<nDOF_v_test_element>(0.0 );
1700+ auto pelementResidual_v = detail::make_array<nDOF_v_test_element>(0.0 );
1701+ auto velocityErrorElement = detail::make_array<nDOF_v_test_element>(0.0 );
1702+ double eps_rho, eps_mu;
16921703 bool element_active=false ;
16931704 elementIsActive[eN]=false ;
16941705 const double * elementResidual_w (NULL );
16951706 double mesh_volume_conservation_element=0.0 ,
16961707 mesh_volume_conservation_element_weak=0.0 ;
1697- for (int i=0 ;i<nDOF_test_element;i++)
1698- {
1699- int eN_i = eN*nDOF_test_element+i;
1700- elementResidual_p_save.data ()[eN_i]=0.0 ;
1701- elementResidual_mesh[i]=0.0 ;
1702- elementResidual_p[i]=0.0 ;
1703- elementResidual_p_check[i]=0.0 ;
1704- }
1705- for (int i=0 ;i<nDOF_v_test_element;i++)
1706- {
1707- elementResidual_u[i]=0.0 ;
1708- elementResidual_v[i]=0.0 ;
1709- pelementResidual_u[i]=0.0 ;
1710- pelementResidual_v[i]=0.0 ;
1711- velocityErrorElement[i]=0.0 ;
1712- }// i
17131708 // Use for plotting result
17141709 if (use_ball_as_particle==1 && nParticles > 0 )
17151710 {
@@ -1925,6 +1920,7 @@ namespace proteus
19251920 dmass_ham_u_s=0.0 ,
19261921 dmass_ham_v_s=0.0 ,
19271922 dmass_ham_w_s=0.0 ;
1923+
19281924 // get jacobian, etc for mapping reference element
19291925 gf_s.set_quad (k);
19301926 gf.set_quad (k);
@@ -1965,18 +1961,11 @@ namespace proteus
19651961 // get the trial function gradients
19661962 ck.gradTrialFromRef (&p_grad_trial_ref.data ()[k*nDOF_trial_element*nSpace],jacInv,p_grad_trial);
19671963 ck_v.gradTrialFromRef (&vel_grad_trial_ref.data ()[k*nDOF_v_trial_element*nSpace],jacInv,vel_grad_trial);
1968- for (int i=0 ; i < nDOF_trial_element; i++)
1969- {
1970- p_trial[i] = p_trial_ref.data ()[k*nDOF_trial_element + i];
1971- p_grad_trial_ib[i*nSpace + 0 ] = p_grad_trial[i*nSpace+0 ];
1972- p_grad_trial_ib[i*nSpace + 1 ] = p_grad_trial[i*nSpace+1 ];
1973- }
1974- for (int i=0 ; i < nDOF_v_trial_element; i++)
1975- {
1976- vel_trial[i] = vel_trial_ref.data ()[k*nDOF_v_trial_element + i];
1977- vel_grad_trial_ib[i*nSpace + 0 ] = vel_grad_trial[i*nSpace+0 ];
1978- vel_grad_trial_ib[i*nSpace + 1 ] = vel_grad_trial[i*nSpace+1 ];
1979- }
1964+ std::copy_n (p_trial_ref.data () + k*nDOF_trial_element, nDOF_trial_element, p_trial);
1965+ std::copy_n (p_grad_trial, nDOF_trial_element*nSpace, p_grad_trial_ib);
1966+ std::copy_n (vel_trial_ref.data () + k*nDOF_v_trial_element, nDOF_v_trial_element, vel_trial);
1967+ std::copy_n (vel_grad_trial, nDOF_v_trial_element*nSpace, vel_grad_trial_ib);
1968+
19801969 if (icase == 0 )
19811970 {
19821971#ifdef IFEMBASIS
@@ -2092,42 +2081,23 @@ namespace proteus
20922081 if (PRESSURE_PROJECTION_STABILIZATION)
20932082 ck.DOFaverage (p_dof.data (), &p_l2g.data ()[eN_nDOF_trial_element],p_element_avg);
20942083 // precalculate test function products with integration weights
2084+ auto dv_lambda = [dV](double arg) { return arg * dV; };
20952085#ifdef IFEMGALERKIN
2096- for (int j=0 ;j<nDOF_test_element;j++)
2097- {
2098- p_test_dV[j] = p_trial[j]*dV;
2099- for (int I=0 ;I<nSpace;I++)
2100- {
2101- p_grad_test_dV[j*nSpace+I] = p_grad_trial_ib[j*nSpace+I]*dV;
2102- }
2103- }
2104- // precalculate test function products with integration weights
2105- for (int j=0 ;j<nDOF_v_test_element;j++)
2106- {
2107- vel_test_dV[j] = vel_trial[j]*dV;
2108- for (int I=0 ;I<nSpace;I++)
2109- {
2110- vel_grad_test_dV[j*nSpace+I] = vel_grad_trial_ib[j*nSpace+I]*dV;
2111- }
2112- }
2086+ std::transform (p_trial, p_trial + nDOF_test_element, p_test_dV, dv_lambda)
2087+ std::transform (p_grad_trial_ib, p_grad_trial_ib + nDOF_test_element*nSpace, p_grad_test_dV, dv_lambda);
2088+ std::transform (vel_trial, vel_trial + nDOF_v_test_element, vel_test_dV, dv_lambda);
2089+ std::transform (vel_grad_trial_ib, vel_grad_trial_ib + nDOF_v_test_element*nSpace, vel_grad_test_dV, dv_lambda);
21132090#else
2114- for (int j=0 ;j<nDOF_test_element;j++)
2115- {
2116- p_test_dV[j] = p_test_ref.data ()[k*nDOF_trial_element+j]*dV;
2117- for (int I=0 ;I<nSpace;I++)
2118- {
2119- p_grad_test_dV[j*nSpace+I] = p_grad_trial[j*nSpace+I]*dV;// assume test_i = trial_i, not using ib basis here
2120- }
2121- }
2122- // precalculate test function products with integration weights
2123- for (int j=0 ;j<nDOF_v_test_element;j++)
2124- {
2125- vel_test_dV[j] = vel_test_ref.data ()[k*nDOF_v_trial_element+j]*dV;
2126- for (int I=0 ;I<nSpace;I++)
2127- {
2128- vel_grad_test_dV[j*nSpace+I] = vel_grad_trial[j*nSpace+I]*dV;// assume test_i = trial_i
2129- }
2130- }
2091+ std::transform (p_test_ref.data () + k*nDOF_trial_element,
2092+ p_test_ref.data () + (k+1 )*nDOF_trial_element,
2093+ p_test_dV,
2094+ dv_lambda);
2095+ std::transform (p_grad_trial, p_grad_trial+nDOF_test_element*nSpace, p_grad_test_dV, dv_lambda);
2096+ std::transform (vel_test_ref.data () + k*nDOF_v_trial_element,
2097+ vel_test_ref.data () + (k+1 )*nDOF_v_test_element,
2098+ vel_test_dV,
2099+ dv_lambda);
2100+ std::transform (vel_grad_trial, vel_grad_trial+nDOF_v_test_element*nSpace, vel_grad_test_dV, dv_lambda);
21312101#endif
21322102 // todo: extend this to higher-order meshes, for now assume mesh trial and p trial are same
21332103 double div_mesh_velocity=0.0 ;
0 commit comments