LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
LMCAS::vector_calculus_detail 命名空间参考

函数

VectorField curl_impl (const VectorField &F, const std::vector< std::string > &vars, detail::RewriteBudget &transform_budget)
VectorCalculusExprResult curve_integral_scalar_strict (const std::shared_ptr< SymbolicExpr > &function, const VectorField &parametrization, const std::string &parameter, const std::shared_ptr< SymbolicExpr > &lower, const std::shared_ptr< SymbolicExpr > &upper, ComputationContext &context, const std::string &operation, detail::RewriteBudget &transform_budget)
VectorCalculusExprResult curve_integral_vector_strict (const VectorField &field, const VectorField &parametrization, const std::string &parameter, const std::shared_ptr< SymbolicExpr > &lower, const std::shared_ptr< SymbolicExpr > &upper, ComputationContext &context, const std::string &operation, detail::RewriteBudget &transform_budget)
std::shared_ptr< SymbolicExpr > directional_derivative_impl (const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars, const VectorField &direction, int order, detail::RewriteBudget &transform_budget)
std::shared_ptr< SymbolicExpr > divergence_impl (const VectorField &F, const std::vector< std::string > &vars, detail::RewriteBudget &transform_budget)
VectorCalculusExprResult divergence_theorem_strict (const VectorField &field, const std::vector< std::string > &variables, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &x_bounds, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &y_bounds, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &z_bounds, ComputationContext &context, const std::string &operation, detail::RewriteBudget &transform_budget)
VectorField gradient_impl (const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars, detail::RewriteBudget &transform_budget)
VectorCalculusExprResult greens_theorem_area_strict (const VectorField &parametrization, const std::string &parameter, const std::shared_ptr< SymbolicExpr > &lower, const std::shared_ptr< SymbolicExpr > &upper, ComputationContext &context, const std::string &operation, detail::RewriteBudget &transform_budget)
VectorCalculusExprResult greens_theorem_strict (const std::shared_ptr< SymbolicExpr > &p, const std::shared_ptr< SymbolicExpr > &q, const std::vector< std::string > &variables, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &x_bounds, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &y_bounds, ComputationContext &context, const std::string &operation, detail::RewriteBudget &transform_budget)
std::shared_ptr< SymbolicExpr > hessian_impl (const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars, detail::RewriteBudget &transform_budget)
std::shared_ptr< SymbolicExpr > jacobian_impl (const std::vector< std::shared_ptr< SymbolicExpr > > &functions, const std::vector< std::string > &vars, detail::RewriteBudget &transform_budget)
std::shared_ptr< SymbolicExpr > laplacian_impl (const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars, detail::RewriteBudget &transform_budget)
VectorCalculusExprResult stokes_theorem_strict (const VectorField &field, const std::vector< std::string > &variables, const VectorField &parametrization, const std::string &u, const std::string &v, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &u_bounds, const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &v_bounds, ComputationContext &context, const std::string &operation, detail::RewriteBudget &transform_budget)
VectorCalculusExprResult surface_integral_scalar_strict (const std::shared_ptr< SymbolicExpr > &function, const VectorField &parametrization, const std::string &u, const std::string &v, const std::shared_ptr< SymbolicExpr > &u_lower, const std::shared_ptr< SymbolicExpr > &u_upper, const std::shared_ptr< SymbolicExpr > &v_lower, const std::shared_ptr< SymbolicExpr > &v_upper, ComputationContext &context, const std::string &operation, detail::RewriteBudget &transform_budget)
VectorCalculusExprResult surface_integral_vector_strict (const VectorField &field, const VectorField &parametrization, const std::string &u, const std::string &v, const std::shared_ptr< SymbolicExpr > &u_lower, const std::shared_ptr< SymbolicExpr > &u_upper, const std::shared_ptr< SymbolicExpr > &v_lower, const std::shared_ptr< SymbolicExpr > &v_upper, ComputationContext &context, const std::string &operation, detail::RewriteBudget &transform_budget)
bool vector_calculus_checked_finite_numeric (const std::shared_ptr< SymbolicExpr > &expr, double &value, ComputationContext &context)
std::vector< std::string > vector_calculus_coord_vars (std::size_t dimension)
std::shared_ptr< SymbolicExpr > vector_calculus_cross_component (const VectorField &left, const VectorField &right, std::size_t index)
VectorField vector_calculus_cross_product_partials (const VectorField &parametrization, const std::string &u, const std::string &v, detail::RewriteBudget &transform_budget)
VectorCalculusExprResult vector_calculus_differentiate_strict (const std::shared_ptr< SymbolicExpr > &expr, const std::string &variable, const std::string &operation, detail::RewriteBudget &transform_budget)
bool vector_calculus_expr_zero_after_substitution (const std::shared_ptr< SymbolicExpr > &expr, const std::map< std::string, std::shared_ptr< SymbolicExpr > > &point, ComputationContext &context, detail::RewriteBudget &transform_budget)
std::shared_ptr< SymbolicExpr > vector_calculus_integrate_with_fallback (const std::shared_ptr< SymbolicExpr > &integrand, const std::string &variable, const std::shared_ptr< SymbolicExpr > &lower, const std::shared_ptr< SymbolicExpr > &upper, ComputationContext &context, detail::RewriteBudget &transform_budget)
bool vector_calculus_point_has_vars (const std::map< std::string, std::shared_ptr< SymbolicExpr > > &point, const std::vector< std::string > &vars)
VectorCalculusExprResult vector_calculus_simplify_strict (const std::shared_ptr< SymbolicExpr > &expr, const std::string &operation, const std::string &message, detail::RewriteBudget &transform_budget)
Result< void > vector_calculus_validate_bound_pair (const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > &bounds, ComputationContext &context, const std::string &operation, const std::string &label)
Result< void > vector_calculus_validate_curve_parametrization (const VectorField &parametrization, const std::string &t, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context, const std::string &operation)
Result< void > vector_calculus_validate_curve_scalar_inputs (const std::shared_ptr< SymbolicExpr > &f, const VectorField &parametrization, const std::string &t, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context, const std::string &operation)
Result< void > vector_calculus_validate_curve_vector_inputs (const VectorField &F, const VectorField &parametrization, const std::string &t, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context, const std::string &operation)
Result< void > vector_calculus_validate_distinct_vars (const std::vector< std::string > &vars, std::size_t expected, ComputationContext &context, const std::string &operation)
Result< void > vector_calculus_validate_expr_vars (const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars, ComputationContext &context, const std::string &operation)
Result< void > vector_calculus_validate_field_vars (const VectorField &field, const std::vector< std::string > &vars, ComputationContext &context, const std::string &operation)
Result< void > vector_calculus_validate_functions_vars (const std::vector< std::shared_ptr< SymbolicExpr > > &functions, const std::vector< std::string > &vars, ComputationContext &context, const std::string &operation)
static Result< void > vector_calculus_validate_surface_bounds (const std::shared_ptr< SymbolicExpr > &u_lower, const std::shared_ptr< SymbolicExpr > &u_upper, const std::shared_ptr< SymbolicExpr > &v_lower, const std::shared_ptr< SymbolicExpr > &v_upper, const std::string &operation)
Result< void > vector_calculus_validate_surface_parametrization (const VectorField &parametrization, const std::string &u, const std::string &v, const std::shared_ptr< SymbolicExpr > &u_lower, const std::shared_ptr< SymbolicExpr > &u_upper, const std::shared_ptr< SymbolicExpr > &v_lower, const std::shared_ptr< SymbolicExpr > &v_upper, ComputationContext &context, const std::string &operation)
Result< void > vector_calculus_validate_surface_scalar_inputs (const std::shared_ptr< SymbolicExpr > &f, const VectorField &parametrization, const std::string &u, const std::string &v, const std::shared_ptr< SymbolicExpr > &u_lower, const std::shared_ptr< SymbolicExpr > &u_upper, const std::shared_ptr< SymbolicExpr > &v_lower, const std::shared_ptr< SymbolicExpr > &v_upper, ComputationContext &context, const std::string &operation)
Result< void > vector_calculus_validate_surface_vector_inputs (const VectorField &F, const VectorField &parametrization, const std::string &u, const std::string &v, const std::shared_ptr< SymbolicExpr > &u_lower, const std::shared_ptr< SymbolicExpr > &u_upper, const std::shared_ptr< SymbolicExpr > &v_lower, const std::shared_ptr< SymbolicExpr > &v_upper, ComputationContext &context, const std::string &operation)
VectorCalculusExprResult vector_calculus_wrap_expr (std::shared_ptr< SymbolicExpr > expr, const std::string &operation)
VectorCalculusFieldResult vector_calculus_wrap_field (VectorField field, const std::string &operation)

函数说明

◆ curl_impl()

VectorField LMCAS::vector_calculus_detail::curl_impl ( const VectorField & F,
const std::vector< std::string > & vars,
detail::RewriteBudget & transform_budget )

二维标量旋度: ∂F₂/∂x₁ - ∂F₁/∂x₂

三维旋度

curl_x = ∂F₃/∂x₂ - ∂F₂/∂x₃

curl_y = ∂F₁/∂x₃ - ∂F₃/∂x₁

curl_z = ∂F₂/∂x₁ - ∂F₁/∂x₂

在文件 vector_calculus_differential.cpp 第 194 行定义.

197{
198 if (F.size() != vars.size()) {
199 throw std::invalid_argument(
200 "curl: F and vars must have the same dimension");
201 }
202
203 /// 二维标量旋度: ∂F₂/∂x₁ - ∂F₁/∂x₂
204 if (F.size() == 2 && vars.size() == 2) {
205 auto dF2_dx1 = detail::make_expression_ptr(detail::differentiate_node(detail::node(F[1]), vars[0], transform_budget));
206 auto dF1_dx2 = detail::make_expression_ptr(detail::differentiate_node(detail::node(F[0]), vars[1], transform_budget));
207
208 auto neg_dF1_dx2 = SymbolicExpr::multiply(
209 SymbolicExpr::number(-1), dF1_dx2);
210 auto scalar_curl = SymbolicExpr::add(dF2_dx1, neg_dF1_dx2);
211 scalar_curl = detail::make_expression_ptr(detail::normalize_node(detail::node(scalar_curl), transform_budget));
212
213 return VectorField{scalar_curl};
214 }
215
216 /// 三维旋度
217 if (F.size() != 3 || vars.size() != 3) {
218 throw std::invalid_argument(
219 "curl: requires 2D or 3D vector field");
220 }
221
222 /// curl_x = ∂F₃/∂x₂ - ∂F₂/∂x₃
223 auto dF3_dx2 = detail::make_expression_ptr(detail::differentiate_node(detail::node(F[2]), vars[1], transform_budget));
224 auto dF2_dx3 = detail::make_expression_ptr(detail::differentiate_node(detail::node(F[1]), vars[2], transform_budget));
225 auto curl_x = SymbolicExpr::add(
226 dF3_dx2,
227 SymbolicExpr::multiply(SymbolicExpr::number(-1), dF2_dx3));
228 curl_x = detail::make_expression_ptr(detail::normalize_node(detail::node(curl_x), transform_budget));
229
230 /// curl_y = ∂F₁/∂x₃ - ∂F₃/∂x₁
231 auto dF1_dx3 = detail::make_expression_ptr(detail::differentiate_node(detail::node(F[0]), vars[2], transform_budget));
232 auto dF3_dx1 = detail::make_expression_ptr(detail::differentiate_node(detail::node(F[2]), vars[0], transform_budget));
233 auto curl_y = SymbolicExpr::add(
234 dF1_dx3,
235 SymbolicExpr::multiply(SymbolicExpr::number(-1), dF3_dx1));
236 curl_y = detail::make_expression_ptr(detail::normalize_node(detail::node(curl_y), transform_budget));
237
238 /// curl_z = ∂F₂/∂x₁ - ∂F₁/∂x₂
239 auto dF2_dx1 = detail::make_expression_ptr(detail::differentiate_node(detail::node(F[1]), vars[0], transform_budget));
240 auto dF1_dx2 = detail::make_expression_ptr(detail::differentiate_node(detail::node(F[0]), vars[1], transform_budget));
241 auto curl_z = SymbolicExpr::add(
242 dF2_dx1,
243 SymbolicExpr::multiply(SymbolicExpr::number(-1), dF1_dx2));
244 curl_z = detail::make_expression_ptr(detail::normalize_node(detail::node(curl_z), transform_budget));
245
246 VectorField result{curl_x, curl_y, curl_z};
247 std::size_t nodes = 0;
248 for (const auto& component : result) {
249 nodes = transform_budget.append_size(
250 nodes, transform_budget.measure(detail::node(component)));
251 }
252 return result;
253}
std::size_t measure(const std::shared_ptr< const SymbolicNode > &node)
std::size_t append_size(std::size_t current, std::size_t child)
SymbolicNodePtr differentiate_node(const SymbolicNodePtr &node, const std::string &variable, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
SymbolicNodePtr normalize_node(const SymbolicNodePtr &node, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
__attribute__((visibility("default"))) VectorCalculusFieldResult gradient_checked(const std __attribute__((visibility("default"))) VectorCalculusFieldResult gradient_checked(const std __attribute__((visibility("default"))) VectorField gradient(const std const std::vector< std::string > & vars
std::vector< std::shared_ptr< SymbolicExpr > > VectorField
向量场由标量表达式组成。

引用了 LMCAS::detail::RewriteBudget::append_size(), LMCAS::detail::differentiate_node(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::RewriteBudget::measure(), LMCAS::detail::node(), LMCAS::detail::normalize_node() , 以及 LMCAS::vars.

被这些函数引用 LMCAS::curl(), LMCAS::curl_checked(), LMCAS::stokes_theorem() , 以及 vector_calculus_coord_vars().

函数调用图:
这是这个函数的调用关系图:

◆ curve_integral_scalar_strict()

VectorCalculusExprResult LMCAS::vector_calculus_detail::curve_integral_scalar_strict ( const std::shared_ptr< SymbolicExpr > & function,
const VectorField & parametrization,
const std::string & parameter,
const std::shared_ptr< SymbolicExpr > & lower,
const std::shared_ptr< SymbolicExpr > & upper,
ComputationContext & context,
const std::string & operation,
detail::RewriteBudget & transform_budget )

在文件 vector_calculus_integrals.cpp 第 278 行定义.

285{
286 const auto coord_vars = vector_calculus_coord_vars(parametrization.size());
287 auto f_composed = vector_calculus_substitute_coords_strict(f, coord_vars, parametrization, operation, transform_budget);
288 if (!f_composed) {
289 return f_composed;
290 }
291
292 std::shared_ptr<SymbolicExpr> speed_sq;
293 for (const auto& component : parametrization) {
294 auto derivative = vector_calculus_differentiate_strict(component, t, operation, transform_budget);
295 if (!derivative) {
296 return derivative;
297 }
298 auto sq = SymbolicExpr::power(derivative.value(), SymbolicExpr::number(2));
299 auto sq_checked = vector_calculus_simplify_strict(sq, operation, "curve speed construction is outside the supported domain", transform_budget);
300 if (!sq_checked) {
301 return sq_checked;
302 }
303 speed_sq = speed_sq ? SymbolicExpr::add(speed_sq, sq_checked.value())
304 : sq_checked.value();
305 auto speed_sq_checked = vector_calculus_simplify_strict(speed_sq, operation, "curve speed construction is outside the supported domain", transform_budget);
306 if (!speed_sq_checked) {
307 return speed_sq_checked;
308 }
309 speed_sq = std::move(speed_sq_checked.value());
310 }
311
312 auto speed = SymbolicExpr::sqrt(speed_sq);
313 auto speed_checked = vector_calculus_simplify_strict(speed, operation, "curve speed construction is outside the supported domain", transform_budget);
314 if (!speed_checked) {
315 return speed_checked;
316 }
317
318 auto integrand = SymbolicExpr::multiply(f_composed.value(), speed_checked.value());
319 auto integrand_checked = vector_calculus_simplify_strict(integrand, operation, "curve integrand construction is outside the supported domain", transform_budget);
320 if (!integrand_checked) {
321 return integrand_checked;
322 }
323
324 return vector_calculus_definite_integral_strict(integrand_checked.value(), t, a, b, context, operation, transform_budget);
325}
VectorCalculusExprResult vector_calculus_differentiate_strict(const std::shared_ptr< SymbolicExpr > &expr, const std::string &variable, const std::string &operation, detail::RewriteBudget &transform_budget)
std::vector< std::string > vector_calculus_coord_vars(std::size_t dimension)
VectorCalculusExprResult vector_calculus_simplify_strict(const std::shared_ptr< SymbolicExpr > &expr, const std::string &operation, const std::string &message, detail::RewriteBudget &transform_budget)
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
static VectorCalculusExprResult vector_calculus_definite_integral_strict(const std::shared_ptr< SymbolicExpr > &integrand, const std::string &var, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context, const std::string &operation, detail::RewriteBudget &transform_budget)
const MultiPoly & b
__attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::shared_ptr< SymbolicExpr > & a
__attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField & parametrization
const std::string const ExprPtr & value
static VectorCalculusExprResult vector_calculus_substitute_coords_strict(const std::shared_ptr< SymbolicExpr > &expr, const std::vector< std::string > &coord_vars, const VectorField &values, const std::string &operation, detail::RewriteBudget &transform_budget)
__attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult curve_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string & t

引用了 LMCAS::a, LMCAS::b, LMCAS::context, LMCAS::parametrization, LMCAS::t, vector_calculus_coord_vars(), LMCAS::vector_calculus_definite_integral_strict(), vector_calculus_differentiate_strict(), vector_calculus_simplify_strict() , 以及 LMCAS::vector_calculus_substitute_coords_strict().

被这些函数引用 LMCAS::curve_integral_scalar_checked() , 以及 vector_calculus_coord_vars().

函数调用图:
这是这个函数的调用关系图:

◆ curve_integral_vector_strict()

VectorCalculusExprResult LMCAS::vector_calculus_detail::curve_integral_vector_strict ( const VectorField & field,
const VectorField & parametrization,
const std::string & parameter,
const std::shared_ptr< SymbolicExpr > & lower,
const std::shared_ptr< SymbolicExpr > & upper,
ComputationContext & context,
const std::string & operation,
detail::RewriteBudget & transform_budget )

在文件 vector_calculus_integrals.cpp 第 328 行定义.

335{
336 const auto coord_vars = vector_calculus_coord_vars(parametrization.size());
337 std::shared_ptr<SymbolicExpr> dot_product;
338 for (size_t i = 0; i < F.size(); ++i) {
339 auto Fi_composed = vector_calculus_substitute_coords_strict(F[i], coord_vars, parametrization, operation, transform_budget);
340 if (!Fi_composed) return Fi_composed;
341
342 auto ri_prime = vector_calculus_differentiate_strict(parametrization[i], t, operation, transform_budget);
343 if (!ri_prime) return ri_prime;
344
345 auto term = SymbolicExpr::multiply(Fi_composed.value(), ri_prime.value());
346 auto term_checked = vector_calculus_simplify_strict(term, operation, "curve integrand construction is outside the supported domain", transform_budget);
347 if (!term_checked) return term_checked;
348
349 dot_product = dot_product ? SymbolicExpr::add(dot_product, term_checked.value())
350 : term_checked.value();
351 auto dot_checked = vector_calculus_simplify_strict(dot_product, operation, "curve integrand construction is outside the supported domain", transform_budget);
352 if (!dot_checked) return dot_checked;
353 dot_product = std::move(dot_checked.value());
354 }
355
356 return vector_calculus_definite_integral_strict(dot_product, t, a, b, context, operation, transform_budget);
357}
VectorCalculusExprResult dot_product(const VectorField &a, const VectorField &b)

引用了 LMCAS::a, LMCAS::b, LMCAS::context, LMCAS::dot_product(), LMCAS::parametrization, LMCAS::t, LMCAS::Result< T >::value(), vector_calculus_coord_vars(), LMCAS::vector_calculus_definite_integral_strict(), vector_calculus_differentiate_strict(), vector_calculus_simplify_strict() , 以及 LMCAS::vector_calculus_substitute_coords_strict().

被这些函数引用 LMCAS::curve_integral_vector_checked() , 以及 vector_calculus_coord_vars().

函数调用图:
这是这个函数的调用关系图:

◆ directional_derivative_impl()

std::shared_ptr< SymbolicExpr > LMCAS::vector_calculus_detail::directional_derivative_impl ( const std::shared_ptr< SymbolicExpr > & f,
const std::vector< std::string > & vars,
const VectorField & direction,
int order,
detail::RewriteBudget & transform_budget )

在文件 vector_calculus_directional.cpp 第 128 行定义.

132{
133 if (!f) {
134 throw std::invalid_argument("directional_derivative: f must not be null");
135 }
136 if (direction.size() != vars.size()) {
137 throw std::invalid_argument(
138 "directional_derivative: direction and vars must have the same dimension");
139 }
140 if (order < 1) {
141 throw std::invalid_argument(
142 "directional_derivative: order must be >= 1");
143 }
144
145 auto mag_sq = vector_calculus_magnitude_squared(direction, transform_budget);
146 if (!mag_sq || mag_sq->is_zero()) {
147 return nullptr;
148 }
149
150 auto magnitude = SymbolicExpr::sqrt(mag_sq);
151 magnitude = detail::make_expression_ptr(detail::normalize_node(detail::node(magnitude), transform_budget));
152 VectorField unit_dir;
153 unit_dir.reserve(direction.size());
154 for (const auto& comp : direction) {
155 if (!comp || comp->is_zero()) {
156 unit_dir.push_back(SymbolicExpr::number(0));
157 } else {
158 auto u_comp = SymbolicExpr::multiply(
159 comp,
160 SymbolicExpr::power(magnitude, SymbolicExpr::number(-1)));
161 u_comp = detail::make_expression_ptr(detail::normalize_node(detail::node(u_comp), transform_budget));
162 unit_dir.push_back(u_comp);
163 }
164 }
165
166 auto result = f;
167 for (int k = 0; k < order; ++k) {
168 result = vector_calculus_single_dir_deriv(result, vars, unit_dir, transform_budget);
169 if (!result) {
170 return SymbolicExpr::number(0);
171 }
172 }
173
174 return result;
175}
const std::vector< FGLMPoly > const MonomialOrder & order
const std::string const LimitExprPtr LimitDirection direction
static std::shared_ptr< SymbolicExpr > vector_calculus_magnitude_squared(const VectorField &v, detail::RewriteBudget &transform_budget)
static std::shared_ptr< SymbolicExpr > vector_calculus_single_dir_deriv(const std::shared_ptr< SymbolicExpr > &f, const std::vector< std::string > &vars, const VectorField &unit_dir, detail::RewriteBudget &transform_budget)

引用了 LMCAS::direction, LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::order, LMCAS::vars, LMCAS::vector_calculus_magnitude_squared() , 以及 LMCAS::vector_calculus_single_dir_deriv().

被这些函数引用 LMCAS::directional_derivative(), LMCAS::directional_derivative_checked() , 以及 vector_calculus_coord_vars().

函数调用图:
这是这个函数的调用关系图:

◆ divergence_impl()

std::shared_ptr< SymbolicExpr > LMCAS::vector_calculus_detail::divergence_impl ( const VectorField & F,
const std::vector< std::string > & vars,
detail::RewriteBudget & transform_budget )

在文件 vector_calculus_differential.cpp 第 112 行定义.

115{
116 if (F.size() != vars.size()) {
117 throw std::invalid_argument(
118 "divergence: F and vars must have the same dimension");
119 }
120 if (F.empty()) {
121 return SymbolicExpr::number(0);
122 }
123
124 std::shared_ptr<SymbolicExpr> sum = nullptr;
125 for (size_t i = 0; i < F.size(); ++i) {
126 if (!F[i]) {
127 continue;
128 }
129 auto partial = detail::make_expression_ptr(detail::differentiate_node(detail::node(F[i]), vars[i], transform_budget));
130 if (!partial) {
131 continue;
132 }
133 partial = detail::make_expression_ptr(detail::normalize_node(detail::node(partial), transform_budget));
134 if (!sum) {
135 sum = partial;
136 } else {
137 sum = SymbolicExpr::add(sum, partial);
139 }
140 }
141
142 if (!sum) {
143 return SymbolicExpr::number(0);
144 }
146}

引用了 LMCAS::detail::differentiate_node(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node() , 以及 LMCAS::vars.

被这些函数引用 LMCAS::divergence(), LMCAS::divergence_checked(), LMCAS::divergence_theorem() , 以及 vector_calculus_coord_vars().

函数调用图:
这是这个函数的调用关系图:

◆ divergence_theorem_strict()

VectorCalculusExprResult LMCAS::vector_calculus_detail::divergence_theorem_strict ( const VectorField & field,
const std::vector< std::string > & variables,
const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & x_bounds,
const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & y_bounds,
const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & z_bounds,
ComputationContext & context,
const std::string & operation,
detail::RewriteBudget & transform_budget )

在文件 vector_calculus_integrals.cpp 第 544 行定义.

553{
554 std::shared_ptr<SymbolicExpr> div_F;
555 for (size_t i = 0; i < 3; ++i) {
556 auto partial = vector_calculus_differentiate_strict(F[i], vars[i], operation, transform_budget);
557 if (!partial) return partial;
558 div_F = div_F ? SymbolicExpr::add(div_F, partial.value()) : partial.value();
559 auto div_checked = vector_calculus_simplify_strict(div_F, operation, "divergence theorem integrand is outside the supported domain", transform_budget);
560 if (!div_checked) return div_checked;
561 div_F = std::move(div_checked.value());
562 }
563
564 std::vector<IntegrationStep> steps;
565 steps.push_back({vars[2], z_bounds.first, z_bounds.second});
566 steps.push_back({vars[1], y_bounds.first, y_bounds.second});
567 steps.push_back({vars[0], x_bounds.first, x_bounds.second});
568 return vector_calculus_multiple_integral_strict(div_F, steps, context, operation, transform_budget);
569}
__attribute__((visibility("default"))) std const std::vector< std::string > const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & z_bounds
__attribute__((visibility("default"))) std const std::vector< std::string > const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & x_bounds
__attribute__((visibility("default"))) std const std::vector< std::string > const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & y_bounds
static VectorCalculusExprResult vector_calculus_multiple_integral_strict(const std::shared_ptr< SymbolicExpr > &integrand, const std::vector< IntegrationStep > &steps, ComputationContext &context, const std::string &operation, detail::RewriteBudget &transform_budget)

引用了 LMCAS::context, LMCAS::steps, LMCAS::vars, vector_calculus_differentiate_strict(), LMCAS::vector_calculus_multiple_integral_strict(), vector_calculus_simplify_strict(), LMCAS::x_bounds, LMCAS::y_bounds , 以及 LMCAS::z_bounds.

被这些函数引用 LMCAS::divergence_theorem_checked() , 以及 vector_calculus_coord_vars().

函数调用图:
这是这个函数的调用关系图:

◆ gradient_impl()

VectorField LMCAS::vector_calculus_detail::gradient_impl ( const std::shared_ptr< SymbolicExpr > & f,
const std::vector< std::string > & vars,
detail::RewriteBudget & transform_budget )

在文件 vector_calculus_differential.cpp 第 49 行定义.

52{
53 if (!f) {
54 throw std::invalid_argument("gradient: f must not be null");
55 }
56 VectorField result;
57 transform_budget.require_nodes(vars.size());
58 std::size_t nodes = 0;
59 result.reserve(vars.size());
60 for (const auto& var : vars) {
61 auto partial = detail::make_expression_ptr(detail::differentiate_node(detail::node(f), var, transform_budget));
62 if (partial) {
63 partial = detail::make_expression_ptr(detail::normalize_node(detail::node(partial), transform_budget));
64 }
65 nodes = transform_budget.append_size(
66 nodes, transform_budget.measure(detail::node(partial)));
67 result.push_back(partial);
68 }
69 return result;
70}
void require_nodes(std::size_t nodes) const

引用了 LMCAS::detail::RewriteBudget::append_size(), LMCAS::detail::differentiate_node(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::RewriteBudget::measure(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::detail::RewriteBudget::require_nodes() , 以及 LMCAS::vars.

被这些函数引用 LMCAS::gradient(), LMCAS::gradient_checked() , 以及 vector_calculus_coord_vars().

函数调用图:
这是这个函数的调用关系图:

◆ greens_theorem_area_strict()

VectorCalculusExprResult LMCAS::vector_calculus_detail::greens_theorem_area_strict ( const VectorField & parametrization,
const std::string & parameter,
const std::shared_ptr< SymbolicExpr > & lower,
const std::shared_ptr< SymbolicExpr > & upper,
ComputationContext & context,
const std::string & operation,
detail::RewriteBudget & transform_budget )

在文件 vector_calculus_integrals.cpp 第 511 行定义.

519{
520 auto dx_dt = vector_calculus_differentiate_strict(parametrization[0], t, operation, transform_budget);
521 if (!dx_dt) return dx_dt;
522 auto dy_dt = vector_calculus_differentiate_strict(parametrization[1], t, operation, transform_budget);
523 if (!dy_dt) return dy_dt;
524
525 auto term1 = SymbolicExpr::multiply(parametrization[0], dy_dt.value());
526 auto term2 = SymbolicExpr::multiply(parametrization[1], dx_dt.value());
527 auto integrand = SymbolicExpr::add(
528 term1,
529 SymbolicExpr::multiply(SymbolicExpr::number(-1), term2));
530 auto integrand_checked = vector_calculus_simplify_strict(integrand, operation, "Green's area integrand is outside the supported domain", transform_budget);
531 if (!integrand_checked) return integrand_checked;
532 integrand_checked = vector_calculus_constant_integrand(integrand_checked.value(), t, context, transform_budget);
533 if (!integrand_checked) return integrand_checked;
534
535 auto integral = vector_calculus_definite_integral_strict(integrand_checked.value(), t, a, b, context, operation, transform_budget);
536 if (!integral) return integral;
537
540 auto area = SymbolicExpr::multiply(half, integral.value());
541 return vector_calculus_simplify_strict(area, operation, "Green's area result is outside the supported domain", transform_budget);
542}
std::shared_ptr< const Node > make_node(Args &&... args)
static VectorCalculusExprResult vector_calculus_constant_integrand(const std::shared_ptr< SymbolicExpr > &integrand, const std::string &variable, ComputationContext &context, detail::RewriteBudget &transform_budget)

引用了 LMCAS::a, LMCAS::b, LMCAS::context, LMCAS::detail::make_expression_ptr(), LMCAS::detail::make_node(), LMCAS::parametrization, LMCAS::t, LMCAS::Result< T >::value(), LMCAS::vector_calculus_constant_integrand(), LMCAS::vector_calculus_definite_integral_strict(), vector_calculus_differentiate_strict() , 以及 vector_calculus_simplify_strict().

被这些函数引用 LMCAS::greens_theorem_area_checked() , 以及 vector_calculus_coord_vars().

函数调用图:
这是这个函数的调用关系图:

◆ greens_theorem_strict()

VectorCalculusExprResult LMCAS::vector_calculus_detail::greens_theorem_strict ( const std::shared_ptr< SymbolicExpr > & p,
const std::shared_ptr< SymbolicExpr > & q,
const std::vector< std::string > & variables,
const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & x_bounds,
const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & y_bounds,
ComputationContext & context,
const std::string & operation,
detail::RewriteBudget & transform_budget )

在文件 vector_calculus_integrals.cpp 第 459 行定义.

468{
469 auto dQ_dx = vector_calculus_differentiate_strict(Q, vars[0], operation, transform_budget);
470 if (!dQ_dx) return dQ_dx;
471 auto dP_dy = vector_calculus_differentiate_strict(P, vars[1], operation, transform_budget);
472 if (!dP_dy) return dP_dy;
473
474 auto integrand = SymbolicExpr::add(
475 dQ_dx.value(),
476 SymbolicExpr::multiply(SymbolicExpr::number(-1), dP_dy.value()));
477 auto integrand_checked = vector_calculus_simplify_strict(integrand, operation, "Green's theorem integrand is outside the supported domain", transform_budget);
478 if (!integrand_checked) return integrand_checked;
479
480 std::vector<IntegrationStep> steps;
481 steps.push_back({vars[1], y_bounds.first, y_bounds.second});
482 steps.push_back({vars[0], x_bounds.first, x_bounds.second});
483 return vector_calculus_multiple_integral_strict(integrand_checked.value(), steps, context, operation, transform_budget);
484}

引用了 LMCAS::context, LMCAS::steps, LMCAS::vars, vector_calculus_differentiate_strict(), LMCAS::vector_calculus_multiple_integral_strict(), vector_calculus_simplify_strict(), LMCAS::x_bounds , 以及 LMCAS::y_bounds.

被这些函数引用 LMCAS::greens_theorem_checked() , 以及 vector_calculus_coord_vars().

函数调用图:
这是这个函数的调用关系图:

◆ hessian_impl()

std::shared_ptr< SymbolicExpr > LMCAS::vector_calculus_detail::hessian_impl ( const std::shared_ptr< SymbolicExpr > & f,
const std::vector< std::string > & vars,
detail::RewriteBudget & transform_budget )

在文件 vector_calculus_matrices.cpp 第 119 行定义.

122{
123 size_t n = vars.size();
124 std::size_t nodes = 1;
125 transform_budget.require_nodes(nodes);
126
127 std::vector<std::shared_ptr<SymbolicExpr>> first_partials;
128 first_partials.reserve(n);
129 for (size_t i = 0; i < n; ++i) {
130 first_partials.push_back(detail::make_expression_ptr(detail::differentiate_node(detail::node(f), vars[i], transform_budget)));
131 }
132
133 std::vector<std::vector<std::shared_ptr<SymbolicExpr>>> grid(n,
134 std::vector<std::shared_ptr<SymbolicExpr>>(n));
135
136 for (size_t i = 0; i < n; ++i) {
137 for (size_t j = i; j < n; ++j) {
138 auto second_partial = detail::make_expression_ptr(detail::differentiate_node(detail::node(first_partials[i]), vars[j], transform_budget));
139 second_partial = detail::make_expression_ptr(detail::normalize_node(detail::node(second_partial), transform_budget));
140 const auto partial_nodes = transform_budget.measure(detail::node(second_partial));
141 nodes = transform_budget.append_size(nodes, partial_nodes);
142 if (i != j) nodes = transform_budget.append_size(nodes, partial_nodes);
143 grid[i][j] = second_partial;
144 if (i != j) {
145 grid[j][i] = second_partial;
146 }
147 }
148 }
149
150 return SymbolicExpr::matrix(grid);
151}

引用了 LMCAS::detail::RewriteBudget::append_size(), LMCAS::detail::differentiate_node(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::RewriteBudget::measure(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::detail::RewriteBudget::require_nodes() , 以及 LMCAS::vars.

被这些函数引用 LMCAS::find_extrema_impl(), LMCAS::hessian(), LMCAS::hessian_checked() , 以及 vector_calculus_coord_vars().

函数调用图:
这是这个函数的调用关系图:

◆ jacobian_impl()

std::shared_ptr< SymbolicExpr > LMCAS::vector_calculus_detail::jacobian_impl ( const std::vector< std::shared_ptr< SymbolicExpr > > & functions,
const std::vector< std::string > & vars,
detail::RewriteBudget & transform_budget )

在文件 vector_calculus_matrices.cpp 第 50 行定义.

54{
55 size_t m = functions.size();
56 size_t n = vars.size();
57 std::size_t nodes = 1;
58 transform_budget.require_nodes(nodes);
59
60 std::vector<std::vector<std::shared_ptr<SymbolicExpr>>> grid;
61 grid.reserve(m);
62
63 for (size_t i = 0; i < m; ++i) {
64 std::vector<std::shared_ptr<SymbolicExpr>> row;
65 row.reserve(n);
66 for (size_t j = 0; j < n; ++j) {
67 auto partial = detail::make_expression_ptr(detail::differentiate_node(detail::node(functions[i]), vars[j], transform_budget));
68 partial = detail::make_expression_ptr(detail::normalize_node(detail::node(partial), transform_budget));
69 nodes = transform_budget.append_size(
70 nodes, transform_budget.measure(detail::node(partial)));
71 row.push_back(partial);
72 }
73 grid.push_back(std::move(row));
74 }
75
76 return SymbolicExpr::matrix(grid);
77}

引用了 LMCAS::detail::RewriteBudget::append_size(), LMCAS::detail::differentiate_node(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::RewriteBudget::measure(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::detail::RewriteBudget::require_nodes() , 以及 LMCAS::vars.

被这些函数引用 LMCAS::jacobian(), LMCAS::jacobian_checked() , 以及 vector_calculus_coord_vars().

函数调用图:
这是这个函数的调用关系图:

◆ laplacian_impl()

std::shared_ptr< SymbolicExpr > LMCAS::vector_calculus_detail::laplacian_impl ( const std::shared_ptr< SymbolicExpr > & f,
const std::vector< std::string > & vars,
detail::RewriteBudget & transform_budget )

在文件 vector_calculus_differential.cpp 第 295 行定义.

298{
299 if (!f) {
300 throw std::invalid_argument("laplacian: f must not be null");
301 }
302 if (vars.empty()) {
303 return SymbolicExpr::number(0);
304 }
305
306 std::shared_ptr<SymbolicExpr> sum = nullptr;
307 for (const auto& var : vars) {
308 auto first = detail::make_expression_ptr(detail::differentiate_node(detail::node(f), var, transform_budget));
309 if (!first) {
310 continue;
311 }
312 auto second = detail::make_expression_ptr(detail::differentiate_node(detail::node(first), var, transform_budget));
313 if (!second) {
314 continue;
315 }
316 second = detail::make_expression_ptr(detail::normalize_node(detail::node(second), transform_budget));
317 if (!sum) {
318 sum = second;
319 } else {
320 sum = SymbolicExpr::add(sum, second);
322 }
323 }
324
325 if (!sum) {
326 return SymbolicExpr::number(0);
327 }
329}

引用了 LMCAS::detail::differentiate_node(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node() , 以及 LMCAS::vars.

被这些函数引用 LMCAS::laplacian(), LMCAS::laplacian_checked() , 以及 vector_calculus_coord_vars().

函数调用图:
这是这个函数的调用关系图:

◆ stokes_theorem_strict()

VectorCalculusExprResult LMCAS::vector_calculus_detail::stokes_theorem_strict ( const VectorField & field,
const std::vector< std::string > & variables,
const VectorField & parametrization,
const std::string & u,
const std::string & v,
const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & u_bounds,
const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & v_bounds,
ComputationContext & context,
const std::string & operation,
detail::RewriteBudget & transform_budget )

在文件 vector_calculus_integrals.cpp 第 632 行定义.

643{
644 auto curl_F = vector_calculus_curl_strict(F, vars, operation, transform_budget);
645 if (!curl_F) return VectorCalculusExprResult::failure(curl_F.error());
646
647 auto cross = vector_calculus_cross_product_partials_strict(parametrization, u, v, operation, transform_budget);
648 if (!cross) return VectorCalculusExprResult::failure(cross.error());
649
651 "Stokes theorem integrand is outside the supported domain",
652 operation, transform_budget);
653 if (!dot_product) return dot_product;
654
655 std::vector<IntegrationStep> steps;
656 steps.push_back({v, v_bounds.first, v_bounds.second});
657 steps.push_back({u, u_bounds.first, u_bounds.second});
658 return vector_calculus_multiple_integral_strict(dot_product.value(), steps, context, operation, transform_budget);
659}
static Result failure(CasErrc code, std::string message, std::string operation={})
__attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::string & v
static Result< VectorField > vector_calculus_cross_product_partials_strict(const VectorField &parametrization, const std::string &u, const std::string &v, const std::string &operation, detail::RewriteBudget &transform_budget)
static Result< VectorField > vector_calculus_curl_strict(const VectorField &F, const std::vector< std::string > &vars, const std::string &operation, detail::RewriteBudget &transform_budget)
__attribute__((visibility("default"))) std const std::vector< std::string > const VectorField const std::string const std::string const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & u_bounds
static VectorCalculusExprResult vector_calculus_surface_dot_strict(const VectorField &field, const std::vector< std::string > &coordinates, const VectorField &parametrization, const VectorField &normal, const std::string &message, const std::string &operation, detail::RewriteBudget &transform_budget)
__attribute__((visibility("default"))) std const std::vector< std::string > const VectorField const std::string const std::string const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & v_bounds
__attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string & u

引用了 LMCAS::context, LMCAS::dot_product(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), LMCAS::parametrization, LMCAS::steps, LMCAS::u, LMCAS::u_bounds, LMCAS::v, LMCAS::v_bounds, LMCAS::Result< T >::value(), LMCAS::vars, LMCAS::vector_calculus_cross_product_partials_strict(), LMCAS::vector_calculus_curl_strict(), LMCAS::vector_calculus_multiple_integral_strict() , 以及 LMCAS::vector_calculus_surface_dot_strict().

被这些函数引用 LMCAS::stokes_theorem_checked() , 以及 vector_calculus_coord_vars().

函数调用图:
这是这个函数的调用关系图:

◆ surface_integral_scalar_strict()

VectorCalculusExprResult LMCAS::vector_calculus_detail::surface_integral_scalar_strict ( const std::shared_ptr< SymbolicExpr > & function,
const VectorField & parametrization,
const std::string & u,
const std::string & v,
const std::shared_ptr< SymbolicExpr > & u_lower,
const std::shared_ptr< SymbolicExpr > & u_upper,
const std::shared_ptr< SymbolicExpr > & v_lower,
const std::shared_ptr< SymbolicExpr > & v_upper,
ComputationContext & context,
const std::string & operation,
detail::RewriteBudget & transform_budget )

在文件 vector_calculus_integrals.cpp 第 360 行定义.

368{
369 const std::vector<std::string> coord_vars = {"x", "y", "z"};
370 auto f_composed = vector_calculus_substitute_coords_strict(f, coord_vars, parametrization, operation, transform_budget);
371 if (!f_composed) return f_composed;
372
373 auto cross = vector_calculus_cross_product_partials_strict(parametrization, u, v, operation, transform_budget);
374 if (!cross) return VectorCalculusExprResult::failure(cross.error());
375
376 std::shared_ptr<SymbolicExpr> mag_sq;
377 for (const auto& component : cross.value()) {
378 auto sq = SymbolicExpr::power(component, SymbolicExpr::number(2));
379 auto sq_checked = vector_calculus_simplify_strict(sq, operation, "surface magnitude construction is outside the supported domain", transform_budget);
380 if (!sq_checked) return sq_checked;
381 mag_sq = mag_sq ? SymbolicExpr::add(mag_sq, sq_checked.value())
382 : sq_checked.value();
383 auto mag_sq_checked = vector_calculus_simplify_strict(mag_sq, operation, "surface magnitude construction is outside the supported domain", transform_budget);
384 if (!mag_sq_checked) return mag_sq_checked;
385 mag_sq = std::move(mag_sq_checked.value());
386 }
387
388 auto magnitude = SymbolicExpr::sqrt(mag_sq);
389 auto magnitude_checked = vector_calculus_simplify_strict(magnitude, operation, "surface magnitude construction is outside the supported domain", transform_budget);
390 if (!magnitude_checked) return magnitude_checked;
391
392 auto integrand = SymbolicExpr::multiply(f_composed.value(), magnitude_checked.value());
393 auto integrand_checked = vector_calculus_simplify_strict(integrand, operation, "surface integrand construction is outside the supported domain", transform_budget);
394 if (!integrand_checked) return integrand_checked;
395
396 std::vector<IntegrationStep> steps;
397 steps.push_back({v, v_lower, v_upper});
398 steps.push_back({u, u_lower, u_upper});
399 return vector_calculus_multiple_integral_strict(integrand_checked.value(), steps, context, operation, transform_budget);
400}
__attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::string const std::shared_ptr< SymbolicExpr > const std::shared_ptr< SymbolicExpr > const std::shared_ptr< SymbolicExpr > & v_lower
__attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::string const std::shared_ptr< SymbolicExpr > & u_lower
__attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::string const std::shared_ptr< SymbolicExpr > const std::shared_ptr< SymbolicExpr > const std::shared_ptr< SymbolicExpr > const std::shared_ptr< SymbolicExpr > & v_upper
__attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) VectorCalculusExprResult surface_integral_scalar_checked(const std __attribute__((visibility("default"))) std const VectorField const std::string const std::string const std::shared_ptr< SymbolicExpr > const std::shared_ptr< SymbolicExpr > & u_upper

引用了 LMCAS::context, LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), LMCAS::parametrization, LMCAS::steps, LMCAS::u, LMCAS::u_lower, LMCAS::u_upper, LMCAS::v, LMCAS::v_lower, LMCAS::v_upper, LMCAS::vector_calculus_cross_product_partials_strict(), LMCAS::vector_calculus_multiple_integral_strict(), vector_calculus_simplify_strict() , 以及 LMCAS::vector_calculus_substitute_coords_strict().

被这些函数引用 LMCAS::surface_integral_scalar_checked() , 以及 vector_calculus_coord_vars().

函数调用图:
这是这个函数的调用关系图:

◆ surface_integral_vector_strict()

VectorCalculusExprResult LMCAS::vector_calculus_detail::surface_integral_vector_strict ( const VectorField & field,
const VectorField & parametrization,
const std::string & u,
const std::string & v,
const std::shared_ptr< SymbolicExpr > & u_lower,
const std::shared_ptr< SymbolicExpr > & u_upper,
const std::shared_ptr< SymbolicExpr > & v_lower,
const std::shared_ptr< SymbolicExpr > & v_upper,
ComputationContext & context,
const std::string & operation,
detail::RewriteBudget & transform_budget )

在文件 vector_calculus_integrals.cpp 第 435 行定义.

443{
444 const std::vector<std::string> coord_vars = {"x", "y", "z"};
445 auto cross = vector_calculus_cross_product_partials_strict(parametrization, u, v, operation, transform_budget);
446 if (!cross) return VectorCalculusExprResult::failure(cross.error());
447
449 "surface integrand construction is outside the supported domain",
450 operation, transform_budget);
451 if (!dot_product) return dot_product;
452
453 std::vector<IntegrationStep> steps;
454 steps.push_back({v, v_lower, v_upper});
455 steps.push_back({u, u_lower, u_upper});
456 return vector_calculus_multiple_integral_strict(dot_product.value(), steps, context, operation, transform_budget);
457}

引用了 LMCAS::context, LMCAS::dot_product(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), LMCAS::parametrization, LMCAS::steps, LMCAS::u, LMCAS::u_lower, LMCAS::u_upper, LMCAS::v, LMCAS::v_lower, LMCAS::v_upper, LMCAS::Result< T >::value(), LMCAS::vector_calculus_cross_product_partials_strict(), LMCAS::vector_calculus_multiple_integral_strict() , 以及 LMCAS::vector_calculus_surface_dot_strict().

被这些函数引用 LMCAS::surface_integral_vector_checked() , 以及 vector_calculus_coord_vars().

函数调用图:
这是这个函数的调用关系图:

◆ vector_calculus_checked_finite_numeric()

bool LMCAS::vector_calculus_detail::vector_calculus_checked_finite_numeric ( const std::shared_ptr< SymbolicExpr > & expr,
double & value,
ComputationContext & context )

在文件 vector_calculus_support.cpp 第 19 行定义.

23{
24 if (!expr) return false;
25 auto numeric = detail::try_finite_numeric(*expr, context);
26 if (!numeric) return false;
27 value = *numeric;
28 return true;
29}
std::optional< double > try_finite_numeric(const SymbolicExpr &expression, ComputationContext &context)

引用了 LMCAS::context, LMCAS::detail::try_finite_numeric(), LMCAS::value , 以及 vector_calculus_checked_finite_numeric().

被这些函数引用 LMCAS::classify_hessian_eigenvalues(), vector_calculus_checked_finite_numeric(), vector_calculus_coord_vars(), LMCAS::vector_calculus_evaluate_hessian_at_point(), vector_calculus_expr_zero_after_substitution() , 以及 LMCAS::vector_calculus_numerical_definite().

函数调用图:
这是这个函数的调用关系图:

◆ vector_calculus_coord_vars()

std::vector< std::string > LMCAS::vector_calculus_detail::vector_calculus_coord_vars ( std::size_t dimension)

引用了 LMCAS::a, LMCAS::b, LMCAS::context, curl_impl(), curve_integral_scalar_strict(), curve_integral_vector_strict(), LMCAS::direction, directional_derivative_impl(), divergence_impl(), divergence_theorem_strict(), LMCAS::function(), gradient_impl(), greens_theorem_area_strict(), greens_theorem_strict(), hessian_impl(), jacobian_impl(), laplacian_impl(), LMCAS::lower, LMCAS::order, LMCAS::parametrization, LMCAS::point, LMCAS::right, stokes_theorem_strict(), surface_integral_scalar_strict(), surface_integral_vector_strict(), LMCAS::t, LMCAS::u, LMCAS::u_bounds, LMCAS::u_lower, LMCAS::u_upper, LMCAS::upper, LMCAS::v, LMCAS::v_bounds, LMCAS::v_lower, LMCAS::v_upper, LMCAS::value, LMCAS::variable, LMCAS::vars, vector_calculus_checked_finite_numeric(), vector_calculus_coord_vars(), vector_calculus_cross_component(), vector_calculus_cross_product_partials(), vector_calculus_differentiate_strict(), vector_calculus_expr_zero_after_substitution(), vector_calculus_integrate_with_fallback(), vector_calculus_point_has_vars(), vector_calculus_simplify_strict(), vector_calculus_validate_bound_pair(), vector_calculus_validate_curve_parametrization(), vector_calculus_validate_curve_scalar_inputs(), vector_calculus_validate_curve_vector_inputs(), vector_calculus_validate_distinct_vars(), vector_calculus_validate_expr_vars(), vector_calculus_validate_field_vars(), vector_calculus_validate_functions_vars(), vector_calculus_validate_surface_parametrization(), vector_calculus_validate_surface_scalar_inputs(), vector_calculus_validate_surface_vector_inputs(), vector_calculus_wrap_expr(), vector_calculus_wrap_field(), LMCAS::x_bounds, LMCAS::y_bounds , 以及 LMCAS::z_bounds.

被这些函数引用 LMCAS::curve_integral_scalar(), curve_integral_scalar_strict(), LMCAS::curve_integral_vector(), curve_integral_vector_strict() , 以及 vector_calculus_coord_vars().

函数调用图:
这是这个函数的调用关系图:

◆ vector_calculus_cross_component()

std::shared_ptr< SymbolicExpr > LMCAS::vector_calculus_detail::vector_calculus_cross_component ( const VectorField & left,
const VectorField & right,
std::size_t index )

在文件 vector_calculus_algebra.cpp 第 28 行定义.

29 {
30 static constexpr std::size_t first[] = {1, 2, 0};
31 static constexpr std::size_t second[] = {2, 0, 1};
32 return SymbolicExpr::add(
33 SymbolicExpr::multiply(left[first[index]], right[second[index]]),
34 SymbolicExpr::multiply(
35 SymbolicExpr::number(-1),
36 SymbolicExpr::multiply(
37 left[second[index]], right[first[index]])));
38}
const ExprPtr & right

引用了 LMCAS::right.

被这些函数引用 LMCAS::cross_product_impl(), vector_calculus_coord_vars(), vector_calculus_cross_product_partials() , 以及 LMCAS::vector_calculus_cross_product_partials_strict().

这是这个函数的调用关系图:

◆ vector_calculus_cross_product_partials()

VectorField LMCAS::vector_calculus_detail::vector_calculus_cross_product_partials ( const VectorField & parametrization,
const std::string & u,
const std::string & v,
detail::RewriteBudget & transform_budget )

在文件 vector_calculus_surfaces.cpp 第 11 行定义.

15{
16 VectorField r_u;
17 r_u.reserve(3);
18 for (size_t i = 0; i < 3; ++i) {
20 r_u.push_back(deriv ? detail::make_expression_ptr(detail::normalize_node(detail::node(deriv), transform_budget)) : SymbolicExpr::number(0));
21 }
22
23 VectorField r_v;
24 r_v.reserve(3);
25 for (size_t i = 0; i < 3; ++i) {
27 r_v.push_back(deriv ? detail::make_expression_ptr(detail::normalize_node(detail::node(deriv), transform_budget)) : SymbolicExpr::number(0));
28 }
29
30 VectorField result;
31 result.reserve(3);
32 for (std::size_t index = 0; index < 3; ++index) {
33 result.push_back(
35 }
36 return result;
37}
std::shared_ptr< SymbolicExpr > vector_calculus_cross_component(const VectorField &left, const VectorField &right, std::size_t index)

引用了 LMCAS::detail::differentiate_node(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::parametrization, LMCAS::u, LMCAS::v , 以及 vector_calculus_cross_component().

被这些函数引用 LMCAS::stokes_theorem(), LMCAS::surface_integral_scalar(), LMCAS::surface_integral_vector() , 以及 vector_calculus_coord_vars().

函数调用图:
这是这个函数的调用关系图:

◆ vector_calculus_differentiate_strict()

VectorCalculusExprResult LMCAS::vector_calculus_detail::vector_calculus_differentiate_strict ( const std::shared_ptr< SymbolicExpr > & expr,
const std::string & variable,
const std::string & operation,
detail::RewriteBudget & transform_budget )

在文件 vector_calculus_integrals.cpp 第 154 行定义.

159{
160 if (!expr || !LMCAS::detail::node(expr)) {
162 operation, "expression derivative is outside the supported domain");
163 }
164 try {
165 auto derivative = detail::make_expression_ptr(detail::differentiate_node(detail::node(expr), var, transform_budget));
166 return vector_calculus_simplify_strict(derivative, operation,
167 "expression derivative is outside the supported domain", transform_budget);
168 } catch (const CasError& error) {
169 if (error.code != CasErrc::UnsupportedExpression) {
171 }
173 operation, "expression derivative is outside the supported domain");
174 }
175}
static VectorCalculusExprResult vector_calculus_inconclusive(const std::string &operation, const std::string &message)

引用了 LMCAS::CasError::code, LMCAS::detail::differentiate_node(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::UnsupportedExpression, LMCAS::vector_calculus_inconclusive() , 以及 vector_calculus_simplify_strict().

被这些函数引用 curve_integral_scalar_strict(), curve_integral_vector_strict(), divergence_theorem_strict(), LMCAS::find_extrema_checked(), greens_theorem_area_strict(), greens_theorem_strict(), LMCAS::lagrange_gradient_strict(), vector_calculus_coord_vars(), LMCAS::vector_calculus_cross_product_partials_strict() , 以及 LMCAS::vector_calculus_curl_strict().

函数调用图:
这是这个函数的调用关系图:

◆ vector_calculus_expr_zero_after_substitution()

bool LMCAS::vector_calculus_detail::vector_calculus_expr_zero_after_substitution ( const std::shared_ptr< SymbolicExpr > & expr,
const std::map< std::string, std::shared_ptr< SymbolicExpr > > & point,
ComputationContext & context,
detail::RewriteBudget & transform_budget )

在文件 vector_calculus_support.cpp 第 376 行定义.

381{
382 if (!expr || !LMCAS::detail::node(expr)) {
383 return false;
384 }
385 auto substituted = expr;
386 for (const auto& [var, value] : point) {
387 if (!value || !LMCAS::detail::node(value)) {
388 return false;
389 }
390 substituted = detail::make_expression_ptr(detail::substitute_node(detail::node(substituted), var, detail::node(value), transform_budget));
391 if (!substituted || !LMCAS::detail::node(substituted)) {
392 return false;
393 }
394 }
395 substituted = detail::make_expression_ptr(detail::normalize_node(detail::node(substituted), transform_budget));
396 if (!substituted || !LMCAS::detail::node(substituted)) {
397 return false;
398 }
399 if (substituted->is_zero()) {
400 return true;
401 }
402 double value = 0.0;
404 std::abs(value) < 1e-8;
405}
SymbolicNodePtr substitute_node(const SymbolicNodePtr &node, const std::string &variable, const SymbolicNodePtr &replacement, RewriteBudget &budget, const FactsQuery &facts, Domain domain)
bool vector_calculus_checked_finite_numeric(const std::shared_ptr< SymbolicExpr > &expr, double &value, ComputationContext &context)
const std::string const LimitExprPtr & point
ExprResult e()

引用了 LMCAS::context, LMCAS::e(), LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::point, LMCAS::detail::substitute_node(), LMCAS::value, vector_calculus_checked_finite_numeric() , 以及 vector_calculus_expr_zero_after_substitution().

被这些函数引用 LMCAS::find_extrema_checked(), vector_calculus_coord_vars() , 以及 vector_calculus_expr_zero_after_substitution().

函数调用图:
这是这个函数的调用关系图:

◆ vector_calculus_integrate_with_fallback()

std::shared_ptr< SymbolicExpr > LMCAS::vector_calculus_detail::vector_calculus_integrate_with_fallback ( const std::shared_ptr< SymbolicExpr > & integrand,
const std::string & variable,
const std::shared_ptr< SymbolicExpr > & lower,
const std::shared_ptr< SymbolicExpr > & upper,
ComputationContext & context,
detail::RewriteBudget & transform_budget )

在文件 vector_calculus_integrals.cpp 第 112 行定义.

119{
120 auto symbolic_result = vector_calculus_try_definite(integrand, var, a, b, context, transform_budget);
121 if (symbolic_result && symbolic_result.value()) {
122 return std::move(symbolic_result.value());
123 }
124 if (!symbolic_result) throw symbolic_result.error();
125 auto numerical_result = vector_calculus_numerical_definite(integrand, var, a, b, context, transform_budget);
126 if (!numerical_result) throw numerical_result.error();
127 return std::move(numerical_result.value());
128}
static VectorCalculusExprResult vector_calculus_try_definite(const std::shared_ptr< SymbolicExpr > &integrand, const std::string &var, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context, detail::RewriteBudget &transform_budget)
static VectorCalculusExprResult vector_calculus_numerical_definite(const std::shared_ptr< SymbolicExpr > &integrand, const std::string &var, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context, detail::RewriteBudget &transform_budget)

引用了 LMCAS::a, LMCAS::b, LMCAS::context, LMCAS::vector_calculus_numerical_definite() , 以及 LMCAS::vector_calculus_try_definite().

被这些函数引用 LMCAS::curve_integral_scalar(), LMCAS::curve_integral_vector() , 以及 vector_calculus_coord_vars().

函数调用图:
这是这个函数的调用关系图:

◆ vector_calculus_point_has_vars()

bool LMCAS::vector_calculus_detail::vector_calculus_point_has_vars ( const std::map< std::string, std::shared_ptr< SymbolicExpr > > & point,
const std::vector< std::string > & vars )

在文件 vector_calculus_support.cpp 第 407 行定义.

410{
411 for (const auto& var : vars) {
412 auto it = point.find(var);
413 if (it == point.end() || !it->second || !LMCAS::detail::node(it->second)) {
414 return false;
415 }
416 }
417 return true;
418}

引用了 LMCAS::detail::node(), LMCAS::point, LMCAS::vars , 以及 vector_calculus_point_has_vars().

被这些函数引用 LMCAS::find_extrema_checked(), vector_calculus_coord_vars(), vector_calculus_point_has_vars() , 以及 LMCAS::verify_lagrange_solutions().

函数调用图:
这是这个函数的调用关系图:

◆ vector_calculus_simplify_strict()

VectorCalculusExprResult LMCAS::vector_calculus_detail::vector_calculus_simplify_strict ( const std::shared_ptr< SymbolicExpr > & expr,
const std::string & operation,
const std::string & message,
detail::RewriteBudget & transform_budget )

在文件 vector_calculus_integrals.cpp 第 138 行定义.

143{
144 if (!expr || !LMCAS::detail::node(expr)) {
145 return vector_calculus_inconclusive(operation, message);
146 }
147 auto simplified = detail::make_expression_ptr(detail::normalize_node(detail::node(expr), transform_budget));
148 if (!simplified || !LMCAS::detail::node(simplified)) {
149 return vector_calculus_inconclusive(operation, message);
150 }
151 return VectorCalculusExprResult::success(std::move(simplified));
152}
static Result success(std::shared_ptr< SymbolicExpr > value)

引用了 LMCAS::detail::make_expression_ptr(), LMCAS::detail::node(), LMCAS::detail::normalize_node(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::success() , 以及 LMCAS::vector_calculus_inconclusive().

被这些函数引用 curve_integral_scalar_strict(), curve_integral_vector_strict(), divergence_theorem_strict(), greens_theorem_area_strict(), greens_theorem_strict(), LMCAS::lagrange_multipliers_strict(), surface_integral_scalar_strict(), vector_calculus_coord_vars(), LMCAS::vector_calculus_cross_product_partials_strict(), LMCAS::vector_calculus_curl_strict(), vector_calculus_differentiate_strict(), LMCAS::vector_calculus_multiple_integral_strict(), LMCAS::vector_calculus_substitute_coords_strict() , 以及 LMCAS::vector_calculus_surface_dot_strict().

函数调用图:
这是这个函数的调用关系图:

◆ vector_calculus_validate_bound_pair()

Result< void > LMCAS::vector_calculus_detail::vector_calculus_validate_bound_pair ( const std::pair< std::shared_ptr< SymbolicExpr >, std::shared_ptr< SymbolicExpr > > & bounds,
ComputationContext & context,
const std::string & operation,
const std::string & label )

在文件 vector_calculus_support.cpp 第 331 行定义.

336{
337 auto step = context.consume_steps(1, operation);
338 if (!step) return step;
339 if (!bounds.first || !LMCAS::detail::node(bounds.first) || !bounds.second || !LMCAS::detail::node(bounds.second)) {
341 label + " bounds cannot be null",
342 operation);
343 }
344 return Result<void>::success();
345}

引用了 LMCAS::context, LMCAS::Result< T >::failure(), LMCAS::InvalidArgument, LMCAS::detail::node(), LMCAS::Result< T >::success() , 以及 vector_calculus_validate_bound_pair().

被这些函数引用 LMCAS::divergence_theorem_checked(), LMCAS::greens_theorem_checked(), vector_calculus_coord_vars() , 以及 vector_calculus_validate_bound_pair().

函数调用图:
这是这个函数的调用关系图:

◆ vector_calculus_validate_curve_parametrization()

Result< void > LMCAS::vector_calculus_detail::vector_calculus_validate_curve_parametrization ( const VectorField & parametrization,
const std::string & t,
const std::shared_ptr< SymbolicExpr > & a,
const std::shared_ptr< SymbolicExpr > & b,
ComputationContext & context,
const std::string & operation )

在文件 vector_calculus_support.cpp 第 127 行定义.

134{
135 auto step = context.consume_steps(1, operation);
136 if (!step) return step;
137 if (parametrization.size() != 2 && parametrization.size() != 3) {
139 "curve parametrization must be two- or three-dimensional",
140 operation);
141 }
142 if (t.empty()) {
144 "parameter variable name cannot be empty",
145 operation);
146 }
147 if (!a || !LMCAS::detail::node(a) || !b || !LMCAS::detail::node(b)) {
149 "curve integral bounds cannot be null",
150 operation);
151 }
152 for (const auto& component : parametrization) {
153 if (!component || !LMCAS::detail::node(component)) {
155 "curve parametrization components cannot be null",
156 operation);
157 }
158 }
159 return Result<void>::success();
160}

引用了 LMCAS::a, LMCAS::b, LMCAS::context, LMCAS::Result< T >::failure(), LMCAS::InvalidArgument, LMCAS::detail::node(), LMCAS::parametrization, LMCAS::Result< T >::success(), LMCAS::t , 以及 vector_calculus_validate_curve_parametrization().

被这些函数引用 LMCAS::greens_theorem_area_checked(), vector_calculus_coord_vars(), vector_calculus_validate_curve_parametrization(), vector_calculus_validate_curve_scalar_inputs() , 以及 vector_calculus_validate_curve_vector_inputs().

函数调用图:
这是这个函数的调用关系图:

◆ vector_calculus_validate_curve_scalar_inputs()

Result< void > LMCAS::vector_calculus_detail::vector_calculus_validate_curve_scalar_inputs ( const std::shared_ptr< SymbolicExpr > & f,
const VectorField & parametrization,
const std::string & t,
const std::shared_ptr< SymbolicExpr > & a,
const std::shared_ptr< SymbolicExpr > & b,
ComputationContext & context,
const std::string & operation )

在文件 vector_calculus_support.cpp 第 162 行定义.

170{
171 auto step = context.consume_steps(1, operation);
172 if (!step) return step;
173 if (!f || !LMCAS::detail::node(f)) {
175 "scalar field cannot be null",
176 operation);
177 }
179 parametrization, t, a, b, context, operation);
180}
Result< void > vector_calculus_validate_curve_parametrization(const VectorField &parametrization, const std::string &t, const std::shared_ptr< SymbolicExpr > &a, const std::shared_ptr< SymbolicExpr > &b, ComputationContext &context, const std::string &operation)

引用了 LMCAS::a, LMCAS::b, LMCAS::context, LMCAS::Result< T >::failure(), LMCAS::InvalidArgument, LMCAS::detail::node(), LMCAS::parametrization, LMCAS::t, vector_calculus_validate_curve_parametrization() , 以及 vector_calculus_validate_curve_scalar_inputs().

被这些函数引用 LMCAS::curve_integral_scalar_checked(), vector_calculus_coord_vars() , 以及 vector_calculus_validate_curve_scalar_inputs().

函数调用图:
这是这个函数的调用关系图:

◆ vector_calculus_validate_curve_vector_inputs()

Result< void > LMCAS::vector_calculus_detail::vector_calculus_validate_curve_vector_inputs ( const VectorField & F,
const VectorField & parametrization,
const std::string & t,
const std::shared_ptr< SymbolicExpr > & a,
const std::shared_ptr< SymbolicExpr > & b,
ComputationContext & context,
const std::string & operation )

在文件 vector_calculus_support.cpp 第 182 行定义.

190{
191 auto step = context.consume_steps(1, operation);
192 if (!step) return step;
193 if (F.empty()) {
195 "vector field cannot be empty",
196 operation);
197 }
198 if (F.size() != parametrization.size()) {
200 "vector field and parametrization must have the same dimension",
201 operation);
202 }
203 for (const auto& component : F) {
204 if (!component || !LMCAS::detail::node(component)) {
206 "vector field components cannot be null",
207 operation);
208 }
209 }
211 parametrization, t, a, b, context, operation);
212}

引用了 LMCAS::a, LMCAS::b, LMCAS::context, LMCAS::Result< T >::failure(), LMCAS::InvalidArgument, LMCAS::detail::node(), LMCAS::parametrization, LMCAS::t, vector_calculus_validate_curve_parametrization() , 以及 vector_calculus_validate_curve_vector_inputs().

被这些函数引用 LMCAS::curve_integral_vector_checked(), vector_calculus_coord_vars() , 以及 vector_calculus_validate_curve_vector_inputs().

函数调用图:
这是这个函数的调用关系图:

◆ vector_calculus_validate_distinct_vars()

Result< void > LMCAS::vector_calculus_detail::vector_calculus_validate_distinct_vars ( const std::vector< std::string > & vars,
std::size_t expected,
ComputationContext & context,
const std::string & operation )

在文件 vector_calculus_support.cpp 第 347 行定义.

352{
353 auto step = context.consume_steps(1, operation);
354 if (!step) return step;
355 if (vars.size() != expected) {
357 "variable list has the wrong dimension",
358 operation);
359 }
360 std::set<std::string> seen;
361 for (const auto& var : vars) {
362 if (var.empty()) {
364 "variable name cannot be empty",
365 operation);
366 }
367 if (!seen.insert(var).second) {
369 "variable names must be distinct",
370 operation);
371 }
372 }
373 return Result<void>::success();
374}

引用了 LMCAS::context, LMCAS::Result< T >::failure(), LMCAS::InvalidArgument, LMCAS::Result< T >::success(), LMCAS::vars , 以及 vector_calculus_validate_distinct_vars().

被这些函数引用 LMCAS::divergence_theorem_checked(), LMCAS::find_extrema_checked(), LMCAS::greens_theorem_checked(), LMCAS::lagrange_multipliers_checked(), LMCAS::stokes_theorem_checked(), vector_calculus_coord_vars() , 以及 vector_calculus_validate_distinct_vars().

函数调用图:
这是这个函数的调用关系图:

◆ vector_calculus_validate_expr_vars()

Result< void > LMCAS::vector_calculus_detail::vector_calculus_validate_expr_vars ( const std::shared_ptr< SymbolicExpr > & f,
const std::vector< std::string > & vars,
ComputationContext & context,
const std::string & operation )

在文件 vector_calculus_support.cpp 第 32 行定义.

37{
38 auto step = context.consume_steps(1, operation);
39 if (!step) return step;
40 if (!f || !LMCAS::detail::node(f)) {
42 "expression cannot be null", operation);
43 }
44 if (vars.empty()) {
46 "variable list cannot be empty", operation);
47 }
48 for (const auto& var : vars) {
49 if (var.empty()) {
51 "variable name cannot be empty",
52 operation);
53 }
54 }
55 return Result<void>::success();
56}

引用了 LMCAS::context, LMCAS::Result< T >::failure(), LMCAS::InvalidArgument, LMCAS::detail::node(), LMCAS::Result< T >::success(), LMCAS::vars , 以及 vector_calculus_validate_expr_vars().

被这些函数引用 LMCAS::directional_derivative_checked(), LMCAS::find_extrema_checked(), LMCAS::gradient_checked(), LMCAS::hessian_checked(), LMCAS::lagrange_multipliers_checked(), LMCAS::laplacian_checked(), vector_calculus_coord_vars() , 以及 vector_calculus_validate_expr_vars().

函数调用图:
这是这个函数的调用关系图:

◆ vector_calculus_validate_field_vars()

Result< void > LMCAS::vector_calculus_detail::vector_calculus_validate_field_vars ( const VectorField & field,
const std::vector< std::string > & vars,
ComputationContext & context,
const std::string & operation )

在文件 vector_calculus_support.cpp 第 58 行定义.

63{
64 auto step = context.consume_steps(1, operation);
65 if (!step) return step;
66 if (field.empty()) {
68 "vector field cannot be empty", operation);
69 }
70 if (field.size() != vars.size()) {
72 "vector field and variables must have the same dimension",
73 operation);
74 }
75 for (const auto& var : vars) {
76 if (var.empty()) {
78 "variable name cannot be empty",
79 operation);
80 }
81 }
82 for (const auto& component : field) {
83 if (!component || !LMCAS::detail::node(component)) {
85 "vector field components cannot be null",
86 operation);
87 }
88 }
89 return Result<void>::success();
90}

引用了 LMCAS::context, LMCAS::Result< T >::failure(), LMCAS::InvalidArgument, LMCAS::detail::node(), LMCAS::Result< T >::success(), LMCAS::vars , 以及 vector_calculus_validate_field_vars().

被这些函数引用 LMCAS::curl_checked(), LMCAS::directional_derivative_checked(), LMCAS::divergence_checked(), LMCAS::divergence_theorem_checked(), LMCAS::stokes_theorem_checked(), vector_calculus_coord_vars() , 以及 vector_calculus_validate_field_vars().

函数调用图:
这是这个函数的调用关系图:

◆ vector_calculus_validate_functions_vars()

Result< void > LMCAS::vector_calculus_detail::vector_calculus_validate_functions_vars ( const std::vector< std::shared_ptr< SymbolicExpr > > & functions,
const std::vector< std::string > & vars,
ComputationContext & context,
const std::string & operation )

在文件 vector_calculus_support.cpp 第 92 行定义.

97{
98 auto step = context.consume_steps(1, operation);
99 if (!step) return step;
100 if (functions.empty()) {
102 "function list cannot be empty",
103 operation);
104 }
105 if (vars.empty()) {
107 "variable list cannot be empty",
108 operation);
109 }
110 for (const auto& var : vars) {
111 if (var.empty()) {
113 "variable name cannot be empty",
114 operation);
115 }
116 }
117 for (const auto& function : functions) {
120 "function expressions cannot be null",
121 operation);
122 }
123 }
124 return Result<void>::success();
125}
ExprResult function(const std::string &name, std::vector< ExprPtr > arguments)

引用了 LMCAS::context, LMCAS::Result< T >::failure(), LMCAS::function(), LMCAS::InvalidArgument, LMCAS::detail::node(), LMCAS::Result< T >::success(), LMCAS::vars , 以及 vector_calculus_validate_functions_vars().

被这些函数引用 LMCAS::jacobian_checked(), vector_calculus_coord_vars() , 以及 vector_calculus_validate_functions_vars().

函数调用图:
这是这个函数的调用关系图:

◆ vector_calculus_validate_surface_bounds()

Result< void > LMCAS::vector_calculus_detail::vector_calculus_validate_surface_bounds ( const std::shared_ptr< SymbolicExpr > & u_lower,
const std::shared_ptr< SymbolicExpr > & u_upper,
const std::shared_ptr< SymbolicExpr > & v_lower,
const std::shared_ptr< SymbolicExpr > & v_upper,
const std::string & operation )
static

在文件 vector_calculus_support.cpp 第 214 行定义.

220{
221 for (const auto* bound : {&u_lower, &u_upper, &v_lower, &v_upper}) {
222 if (!*bound || !LMCAS::detail::node(*bound)) {
224 "surface integral bounds cannot be null",
225 operation);
226 }
227 }
228 return Result<void>::success();
229}

引用了 LMCAS::Result< T >::failure(), LMCAS::InvalidArgument, LMCAS::detail::node(), LMCAS::Result< T >::success(), LMCAS::u_lower, LMCAS::u_upper, LMCAS::v_lower, LMCAS::v_upper , 以及 vector_calculus_validate_surface_bounds().

被这些函数引用 vector_calculus_validate_surface_bounds() , 以及 vector_calculus_validate_surface_parametrization().

函数调用图:
这是这个函数的调用关系图:

◆ vector_calculus_validate_surface_parametrization()

Result< void > LMCAS::vector_calculus_detail::vector_calculus_validate_surface_parametrization ( const VectorField & parametrization,
const std::string & u,
const std::string & v,
const std::shared_ptr< SymbolicExpr > & u_lower,
const std::shared_ptr< SymbolicExpr > & u_upper,
const std::shared_ptr< SymbolicExpr > & v_lower,
const std::shared_ptr< SymbolicExpr > & v_upper,
ComputationContext & context,
const std::string & operation )

在文件 vector_calculus_support.cpp 第 231 行定义.

241{
242 auto step = context.consume_steps(1, operation);
243 if (!step) {
244 return step;
245 }
246 if (parametrization.size() != 3) {
248 "surface parametrization must be three-dimensional",
249 operation);
250 }
251 if (u.empty() || v.empty()) {
253 "surface parameter variable names cannot be empty",
254 operation);
255 }
256 if (u == v) {
258 "surface parameter variables must be distinct",
259 operation);
260 }
262 u_lower, u_upper, v_lower, v_upper, operation);
263 if (!bounds) {
264 return bounds;
265 }
266 for (const auto& component : parametrization) {
267 if (!component || !LMCAS::detail::node(component)) {
269 "surface parametrization components cannot be null",
270 operation);
271 }
272 }
273 return Result<void>::success();
274}
static Result< void > vector_calculus_validate_surface_bounds(const std::shared_ptr< SymbolicExpr > &u_lower, const std::shared_ptr< SymbolicExpr > &u_upper, const std::shared_ptr< SymbolicExpr > &v_lower, const std::shared_ptr< SymbolicExpr > &v_upper, const std::string &operation)

引用了 LMCAS::context, LMCAS::Result< T >::failure(), LMCAS::InvalidArgument, LMCAS::detail::node(), LMCAS::parametrization, LMCAS::Result< T >::success(), LMCAS::u, LMCAS::u_lower, LMCAS::u_upper, LMCAS::v, LMCAS::v_lower, LMCAS::v_upper, vector_calculus_validate_surface_bounds() , 以及 vector_calculus_validate_surface_parametrization().

被这些函数引用 LMCAS::stokes_theorem_checked(), vector_calculus_coord_vars(), vector_calculus_validate_surface_parametrization(), vector_calculus_validate_surface_scalar_inputs() , 以及 vector_calculus_validate_surface_vector_inputs().

函数调用图:
这是这个函数的调用关系图:

◆ vector_calculus_validate_surface_scalar_inputs()

Result< void > LMCAS::vector_calculus_detail::vector_calculus_validate_surface_scalar_inputs ( const std::shared_ptr< SymbolicExpr > & f,
const VectorField & parametrization,
const std::string & u,
const std::string & v,
const std::shared_ptr< SymbolicExpr > & u_lower,
const std::shared_ptr< SymbolicExpr > & u_upper,
const std::shared_ptr< SymbolicExpr > & v_lower,
const std::shared_ptr< SymbolicExpr > & v_upper,
ComputationContext & context,
const std::string & operation )

在文件 vector_calculus_support.cpp 第 276 行定义.

287{
288 auto step = context.consume_steps(1, operation);
289 if (!step) return step;
290 if (!f || !LMCAS::detail::node(f)) {
292 "scalar field cannot be null",
293 operation);
294 }
297 context, operation);
298}
Result< void > vector_calculus_validate_surface_parametrization(const VectorField &parametrization, const std::string &u, const std::string &v, const std::shared_ptr< SymbolicExpr > &u_lower, const std::shared_ptr< SymbolicExpr > &u_upper, const std::shared_ptr< SymbolicExpr > &v_lower, const std::shared_ptr< SymbolicExpr > &v_upper, ComputationContext &context, const std::string &operation)

引用了 LMCAS::context, LMCAS::Result< T >::failure(), LMCAS::InvalidArgument, LMCAS::detail::node(), LMCAS::parametrization, LMCAS::u, LMCAS::u_lower, LMCAS::u_upper, LMCAS::v, LMCAS::v_lower, LMCAS::v_upper, vector_calculus_validate_surface_parametrization() , 以及 vector_calculus_validate_surface_scalar_inputs().

被这些函数引用 LMCAS::surface_integral_scalar_checked(), vector_calculus_coord_vars() , 以及 vector_calculus_validate_surface_scalar_inputs().

函数调用图:
这是这个函数的调用关系图:

◆ vector_calculus_validate_surface_vector_inputs()

Result< void > LMCAS::vector_calculus_detail::vector_calculus_validate_surface_vector_inputs ( const VectorField & F,
const VectorField & parametrization,
const std::string & u,
const std::string & v,
const std::shared_ptr< SymbolicExpr > & u_lower,
const std::shared_ptr< SymbolicExpr > & u_upper,
const std::shared_ptr< SymbolicExpr > & v_lower,
const std::shared_ptr< SymbolicExpr > & v_upper,
ComputationContext & context,
const std::string & operation )

在文件 vector_calculus_support.cpp 第 300 行定义.

311{
312 auto step = context.consume_steps(1, operation);
313 if (!step) return step;
314 if (F.size() != 3) {
316 "surface vector field must have three components",
317 operation);
318 }
319 for (const auto& component : F) {
320 if (!component || !LMCAS::detail::node(component)) {
322 "surface vector field components cannot be null",
323 operation);
324 }
325 }
328 context, operation);
329}

引用了 LMCAS::context, LMCAS::Result< T >::failure(), LMCAS::InvalidArgument, LMCAS::detail::node(), LMCAS::parametrization, LMCAS::u, LMCAS::u_lower, LMCAS::u_upper, LMCAS::v, LMCAS::v_lower, LMCAS::v_upper, vector_calculus_validate_surface_parametrization() , 以及 vector_calculus_validate_surface_vector_inputs().

被这些函数引用 LMCAS::surface_integral_vector_checked(), vector_calculus_coord_vars() , 以及 vector_calculus_validate_surface_vector_inputs().

函数调用图:
这是这个函数的调用关系图:

◆ vector_calculus_wrap_expr()

VectorCalculusExprResult LMCAS::vector_calculus_detail::vector_calculus_wrap_expr ( std::shared_ptr< SymbolicExpr > expr,
const std::string & operation )

在文件 vector_calculus_support.cpp 第 420 行定义.

423{
424 if (!expr || !LMCAS::detail::node(expr)) {
427 "vector calculus construction produced a null expression",
428 operation);
429 }
430 return VectorCalculusExprResult::success(std::move(expr));
431}

引用了 LMCAS::Result< std::shared_ptr< SymbolicExpr > >::failure(), LMCAS::InternalInvariant, LMCAS::detail::node(), LMCAS::Result< std::shared_ptr< SymbolicExpr > >::success() , 以及 vector_calculus_wrap_expr().

被这些函数引用 LMCAS::directional_derivative_checked(), LMCAS::divergence_checked(), LMCAS::hessian_checked(), LMCAS::jacobian_checked(), LMCAS::laplacian_checked(), vector_calculus_coord_vars() , 以及 vector_calculus_wrap_expr().

函数调用图:
这是这个函数的调用关系图:

◆ vector_calculus_wrap_field()

VectorCalculusFieldResult LMCAS::vector_calculus_detail::vector_calculus_wrap_field ( VectorField field,
const std::string & operation )

在文件 vector_calculus_support.cpp 第 433 行定义.

436{
437 for (const auto& component : field) {
438 if (!component || !LMCAS::detail::node(component)) {
441 "vector calculus construction produced a null component",
442 operation);
443 }
444 }
445 return VectorCalculusFieldResult::success(std::move(field));
446}

引用了 LMCAS::Result< VectorField >::failure(), LMCAS::InternalInvariant, LMCAS::detail::node(), LMCAS::Result< VectorField >::success() , 以及 vector_calculus_wrap_field().

被这些函数引用 LMCAS::curl_checked(), LMCAS::gradient_checked(), vector_calculus_coord_vars() , 以及 vector_calculus_wrap_field().

函数调用图:
这是这个函数的调用关系图: