Skip to content

Commit 5ed0393

Browse files
committed
Replaced initialization loops and trivial computations with STL algorithms
1 parent 6307c44 commit 5ed0393

File tree

2 files changed

+43
-73
lines changed

2 files changed

+43
-73
lines changed

proteus/mprans/ArgumentsDict.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ namespace proteus
119119
});
120120
// IMPORTANT: keep the scalar overloads AFTER the pyarray overloads,
121121
// because numpy array containing a single elements can be implicitly
122-
// converted to scalars. If the scalar overload is define before the
122+
// converted to scalars. If the scalar overload is defined before the
123123
// pyarray overload, it is chosen by pybind11 and the array ends up
124124
// in the wrong dictionary.
125125
cl.def("__setitem__",

proteus/mprans/RANS2P2D.h

Lines changed: 42 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,16 @@ const double DM3=1.0;//1-point-wise divergence, 0-point-wise rate of volume cha
2424
const double inertial_term=1.0;
2525
namespace 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

Comments
 (0)