source: LMDZ5/trunk/tools/Max_diff_nc_with_lib/Jumble/Numerical/get_divisors.f90 @ 1907

Last change on this file since 1907 was 1907, checked in by lguez, 10 years ago

Added a copyright property to every file of the distribution, except
for the fcm files (which have their own copyright). Use svn propget on
a file to see the copyright. For instance:

$ svn propget copyright libf/phylmd/physiq.F90
Name of program: LMDZ
Creation date: 1984
Version: LMDZ5
License: CeCILL version 2
Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
See the license file in the root directory

Also added the files defining the CeCILL version 2 license, in French
and English, at the top of the LMDZ tree.

  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
File size: 1.2 KB
Line 
1module get_divisors_m
2
3  implicit none
4
5contains
6
7  subroutine get_divisors(n, div)
8
9    ! Find all the divisors of a given integer.
10
11    integer, intent(in):: n
12    integer, pointer:: div(:)
13
14    ! Variables local to the procedure:
15
16    integer i, i_max
17    integer n_div ! number of divisors of "n"
18    integer work(n) ! temporary array to hold divisors
19
20    !------------------------
21
22    if (n <= 0) then
23       print *, "get_divisors: n = ", n
24       stop 1
25    end if
26   
27    if (n == 1) then
28       work(1) = 1
29       n_div = 1
30    else
31       ! n >= 2, there are at least two divisors: 1 and "n"
32       work(1) = 1
33       work(2) = n
34       n_div = 2
35
36       i_max = int(sqrt(real(n)))
37
38       do i = 2, i_max - 1
39          if (mod(n, i) == 0) then
40             work(n_div+1) = i
41             work(n_div+2) = n / i
42             n_div = n_div + 2
43          end if
44       end do
45
46       if (i_max >= 2 .and. mod(n, i_max) == 0) then
47          work(n_div+1) = i_max
48          n_div = n_div + 1
49          if (i_max**2 /= n) then
50             work(n_div+1) = n / i_max
51             n_div = n_div + 1
52          end if
53       end if
54    end if
55
56    allocate(div(n_div))
57    div = work(:n_div)
58
59  end subroutine get_divisors
60
61end module get_divisors_m
Note: See TracBrowser for help on using the repository browser.