Did you know ... Search Documentation:
Pack logtalk -- logtalk-3.85.0/examples/threads/integration2d/NOTES.md

This file is part of Logtalk https://logtalk.org/ SPDX-FileCopyrightText: 1998-2023 Paulo Moura <pmoura@logtalk.org> SPDX-License-Identifier: Apache-2.0

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

To load this example and for sample queries, please see the SCRIPT.txt file.

This folder contains a multi-threading implementation of Recursive Gaussian Quadrature Methods for Numerical Integration for functions of two variables.

Adaptive quadrature methods are efficient numerical integration techniques as they compensate for functional variation along the integral domain. This is accomplished by using a larger sampling of points in regions with large function variations.

Two objects, quadrec2d and quadsplit2d, implement two versions of the quadrature methods.

In the quadrec2d object, the multi-threading method used is to divide the integral volume amongst the number of threads used (a power of 4) and then recursively apply the same method in each interval. The implementation uses the threaded/1 Logtalk built-in predicate.

In the quadsplit2d object, a divide and conquer approach is also used but the original domain is split along a single dimension. A thread is spawned for each sub-interval. This method can use any number of threads. However, by splitting along a single dimension, this method may perform poorly for functions where the splitting leaves most of work to just a few threads (resulting in load balancing problems).

The split/span/collect of thread goals uses the Logtalk built-in predicates threaded_once/1 and threaded_exit/1.

Both objects implement the same protocol:

integrate(Function, A, B, C, D, NP, Error, Integral)

This predicate allows us to find the integral of a function of two variables on the rectangular domain `[A,B][C,D]` given a maximum approximation error. NP represents the method to be used (0,1,2,3). For NP = 0, an adaptive trapezoidal rule is used. For NP = 1, 2, 3 an adaptive Gaussian quadrature of 1, 2, or 3 points is used.

The 2D recursive algorithm and the example functions i14 and i15 are described in the following article:

Wilhelm M. Pieper, "Recursive Gauss integration", Communications in Numerical Methods in Engineering, Vol. 15(2) 1999, pp 77-90. http://www3.interscience.wiley.com/journal/45002124/abstract?CRETRY=1&SRETRY=0

The example functions bailey1, bailey2, bailey3, bailey4, and bailey5 are from the following article:

David H. Bailey and Jonathan M. Borwein, "Highly Parallel, High-Precision Numerical Integration" (April 22, 2005). Lawrence Berkeley National Laboratory. Paper LBNL-57491. http://repositories.cdlib.org/lbnl/LBNL-57491