source: LMDZ6/trunk/libf/phylmd/cosp2/array_lib.F90 @ 3605

Last change on this file since 3605 was 3358, checked in by idelkadi, 6 years ago

Implementation de la nouvelle version COSPv2 dans LMDZ.
Pour compiler avec makelmdz_fcma utiliser l'option "-cosp2 true"

File size: 3.8 KB
Line 
1! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2! Copyright (c) 2015, Regents of the University of Colorado
3! All rights reserved.
4!
5! Redistribution and use in source and binary forms, with or without modification, are
6! permitted provided that the following conditions are met:
7!
8! 1. Redistributions of source code must retain the above copyright notice, this list of
9!    conditions and the following disclaimer.
10!
11! 2. Redistributions in binary form must reproduce the above copyright notice, this list
12!    of conditions and the following disclaimer in the documentation and/or other
13!    materials provided with the distribution.
14!
15! 3. Neither the name of the copyright holder nor the names of its contributors may be
16!    used to endorse or promote products derived from this software without specific prior
17!    written permission.
18!
19! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
20! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
22! THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
24! OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28!
29! History:
30! 10/16/03  John Haynes   - Original version (haynes@atmos.colostate.edu)
31! 01/31/06  John Haynes   - IDL to Fortran 90
32! 01/01/15  Dustin Swales - Modified for COSPv2.0
33!
34! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
35module array_lib
36  USE COSP_KINDS, ONLY: wp
37  implicit none
38contains
39
40  ! ############################################################################
41  !                               function INFIND
42  ! ############################################################################
43  function infind(list,val)
44    implicit none
45    ! ##########################################################################
46    ! Purpose:
47    !   Finds the index of an array that is closest to a value, plus the
48    !   difference between the value found and the value specified
49    !
50    ! Inputs:
51    !   [list]   an array of sequential values
52    !   [val]    a value to locate
53    ! Optional input:
54    !   [sort]   set to 1 if [list] is in unknown/non-sequential order
55    !
56    ! Returns:
57    !   index of [list] that is closest to [val]
58    !
59    ! Optional output:
60    !   [dist]   set to variable containing [list([result])] - [val]
61    !
62    ! Requires:
63    !   mrgrnk library
64    !
65    ! ##########################################################################
66
67    ! INPUTS
68    real(wp), dimension(:), intent(in) :: &
69         list   ! An array of sequential values
70    real(wp), intent(in) :: &
71         val    ! A value to locate
72    ! OUTPUTS
73    integer :: &
74         infind ! Index of [list] that is closest to [val]
75
76    ! Internal Variables
77    real(wp), dimension(size(list)) :: lists
78    integer :: nlist, result, tmp(1), sort_list
79    integer, dimension(size(list)) :: mask
80   
81    sort_list = 0
82   
83    nlist = size(list)
84    lists = list
85   
86    if (val >= lists(nlist)) then
87       result = nlist
88    else if (val <= lists(1)) then
89       result = 1
90    else
91       mask(:) = 0
92       where (lists < val) mask = 1
93       tmp = minloc(mask,1)
94       if (abs(lists(tmp(1)-1)-val) < abs(lists(tmp(1))-val)) then
95          result = tmp(1) - 1
96      else
97         result = tmp(1)
98      endif
99   endif
100   infind = result
101 end function infind
102
103end module array_lib
Note: See TracBrowser for help on using the repository browser.