10 use iso_c_binding,
only : c_short, c_int, c_long, c_float, c_double, c_bool, &
24 real (c_double),
parameter ::
pi = 4.0_c_double*atan(1.0_c_double)
25 real (c_double),
parameter ::
twopi =
pi * 2.0_c_double
26 real (c_double),
parameter ::
halfpi =
pi / 2.0_c_double
38 logical (c_bool),
parameter ::
true = .
true._c_bool
41 real (c_float),
parameter ::
near_zero = epsilon(1.0_c_float)
42 real (c_float),
parameter ::
rbigval = huge(0.0_c_float)
43 real (c_double),
parameter ::
dbigval = huge(0.0_c_double)
44 integer(c_int),
parameter ::
ibigval = huge(0_c_int)
45 real (c_float),
parameter ::
rtinyval = -(huge(0.0_c_float) - 1.0)
46 real (c_double),
parameter ::
dtinyval = -(huge(0.0_c_double) - 1.0)
47 real (c_float),
parameter ::
ftinyval = -(huge(0.0_c_float) - 1.0)
48 integer(c_int),
parameter ::
itinyval = -(huge(0_c_int) - 1)
49 real (c_float),
parameter ::
rfreezing = 32.0_c_float
50 real (c_float),
parameter ::
ffreezing = 32.0_c_float
51 real (c_double),
parameter ::
dfreezing = 32.0_c_double
52 integer (c_int),
parameter ::
izero = 0_c_int
53 real (c_float),
parameter ::
fzero = 0.0_c_float
54 real (c_float),
parameter ::
rzero = 0.0_c_float
55 real (c_double),
parameter ::
dzero = 0.0_c_double
62 real (c_double),
parameter,
public ::
c_per_f = 5.0_c_double / 9.0_c_double
63 real (c_double),
parameter,
public ::
f_per_c = 9.0_c_double / 5.0_c_double
64 real (c_double),
parameter,
public ::
m_per_foot = 0.3048_c_double
65 real (c_double),
parameter,
public ::
mm_per_in = 25.4_c_double
77 character (len=:),
allocatable :: sproj4_string
78 integer (c_int) :: inumcols
79 integer (c_int) :: inumrows
80 real (c_double) :: fx_ll, fy_ll
81 real (c_double) :: fx_ur, fy_ur
82 real (c_double) :: fgridcellsize
87 public ::
operator(.approxequal.)
88 interface operator(.approxequal.)
92 end interface operator(.approxequal.)
200 character (len=*),
intent(in) :: input_pathname
201 character (len=len_trim(input_pathname)) :: output_pathname
204 integer (c_int) :: indx, jndx
206 do indx=1,len_trim(input_pathname)
208 jndx = min( indx+1, len_trim(input_pathname) )
210 if ( ( (input_pathname(indx:indx) ==
'/') &
211 .or. (input_pathname(indx:indx) ==
'\') ) &
212 .and. (input_pathname(jndx:jndx) /=
' ' ) )
then
218 output_pathname(indx:indx) = input_pathname(indx:indx)
229 real (c_float),
intent(in) :: fvalue1
230 real (c_float),
intent(in) :: fvalue2
231 logical (c_bool) :: lbool
246 real (c_float),
intent(in) :: fvalue1
247 real (c_double),
intent(in) :: fvalue2
248 logical (c_bool) :: lbool
264 real (c_double),
intent(in) :: fvalue1
265 real (c_double),
intent(in) :: fvalue2
266 logical (c_bool) :: lbool
284 character (len=*),
intent(in) :: value
288 character (len=256) :: sbuf
292 if ( len_trim( sbuf ) == 0 )
then
308 real (c_float),
intent(in) :: degrees
309 real (c_float) :: radians
324 real (c_double),
intent(in) :: degrees
325 real (c_double) :: radians
340 real (c_float),
intent(in) :: radians
341 real (c_float) :: degrees
355 real (c_double),
intent(in) :: radians
356 real (c_double) :: degrees
371 real (c_float),
intent(in) :: degrees_f
372 real (c_float) :: degrees_c
387 real (c_double),
intent(in) :: degrees_f
388 real (c_double) :: degrees_c
403 real (c_float),
intent(in) :: degrees_c
404 real (c_float) :: degrees_f
419 real (c_double),
intent(in) :: degrees_c
420 real (c_double) :: degrees_f
435 real (c_float),
intent(in) :: degrees_f
436 real (c_float) :: degrees_k
438 degrees_k = real((degrees_f -
dfreezing) *
c_per_f + 273.15_c_double, c_float)
451 real (c_double),
intent(in) :: degrees_f
452 real (c_double) :: degrees_k
467 real (c_float),
intent(in) :: degrees_c
468 real (c_float) :: degrees_k
470 degrees_k = real(degrees_c + 273.15_c_double, c_float)
483 real (c_double),
intent(in) :: degrees_c
484 real (c_double) :: degrees_k
486 degrees_k = degrees_c + 273.15_c_double
498 real (c_float),
intent(in) :: inches
501 mm = real(inches * 25.4_c_double, c_float)
513 real (c_double),
intent(in) :: inches
514 real (c_double) :: mm
516 mm = inches * 25.4_c_double
528 real (c_float),
intent(in) :: mm
529 real (c_float) :: inches
531 inches = real(mm / 25.4_c_double, c_float)
543 real (c_double),
intent(in) :: mm
544 real (c_double) :: inches
546 inches = mm / 25.4_c_double
556 integer (c_short),
intent(in) :: ishortval
557 logical (c_bool) :: lvalue
559 if ( ishortval == 0 )
then
573 integer (c_int),
intent(in) :: ivalue
574 logical (c_bool) :: lvalue
576 if ( ivalue == 0 )
then
590 real (c_float),
intent(in) :: rvalue
591 logical (c_bool) :: lvalue
594 real (c_float),
parameter :: fminresolution = 2.0 * spacing(1.0_c_float)
596 if ( rvalue > -fminresolution .and. rvalue < fminresolution )
then
610 real (c_double),
intent(in) :: rvalue
611 logical (c_bool) :: lvalue
614 real (c_double),
parameter :: dminresolution = 2.0 * spacing(1.0_c_float)
616 if ( rvalue > -dminresolution .and. rvalue < dminresolution )
then
630 character (len=*),
intent(in) :: svalue
631 logical (c_bool) :: lvalue
633 select case ( svalue )
635 case (
"TRUE",
"True",
"true",
"T",
"YES",
"Yes",
"yes",
"1" )
653 integer (c_short),
intent(in) :: ishortval
654 integer (c_int) :: ivalue
656 ivalue = int( ishortval, c_int )
664 impure elemental function char2int(sValue)
result(iValue)
666 character (len=*),
intent(in) :: svalue
667 integer (c_int) :: ivalue
670 integer (c_int) :: istat
671 character (len=:),
allocatable :: stempval
672 real (c_float) :: rvalue
678 if ( scan(stempval,
".") /= 0 )
then
680 read(unit=stempval, fmt=*, iostat=istat) rvalue
682 if (istat == 0) ivalue = int(rvalue, c_int)
686 read(unit=stempval, fmt=*, iostat=istat) ivalue
700 real (c_float),
intent(in) :: rvalue
701 integer (c_int) :: ivalue
703 ivalue = int(rvalue, c_int)
711elemental function dbl2int(rValue)
result(iValue)
713 real (c_double),
intent(in) :: rvalue
714 integer (c_int) :: ivalue
716 ivalue = int(rvalue, c_int)
723elemental pure function bool2int(lValue)
result(iValue)
724 logical (c_bool),
intent(in) :: lvalue
725 integer (c_int) :: ivalue
739 character (len=*),
intent(in) :: svalue
740 real (c_float) :: rvalue
743 integer (c_int) :: istat
745 read(unit=svalue, fmt=*, iostat=istat) rvalue
757 integer (c_short),
intent(in) :: ivalue
758 real (c_float) :: rvalue
760 rvalue = real(ivalue, c_float)
770 integer (c_int),
intent(in) :: ivalue
771 real (c_float) :: rvalue
773 rvalue = real(ivalue, c_float)
783 real (c_double),
intent(in) :: dpvalue
784 real (c_float) :: rvalue
786 rvalue = real(dpvalue, c_float)
794 logical (c_bool),
intent(in) :: lvalue
795 real (c_float) :: rvalue
811 character (len=*),
intent(in) :: svalue
812 real (c_double) :: dvalue
815 integer (c_int) :: istat
817 read(unit=svalue, fmt=*, iostat=istat) dvalue
829 integer (c_short),
intent(in) :: ivalue
830 real (c_double) :: dvalue
832 dvalue = real(ivalue, c_double)
840elemental function int2dbl(iValue)
result(dValue)
842 integer (c_int),
intent(in) :: ivalue
843 real (c_double) :: dvalue
845 dvalue = real(ivalue, c_double)
855 real (c_float),
intent(in) :: fvalue
856 real (c_double) :: dvalue
858 dvalue = real(fvalue, c_double)
865elemental pure function bool2dbl(lValue)
result(dValue)
866 logical (c_bool),
intent(in) :: lvalue
867 real (c_double) :: dvalue
870 dvalue = 1.0_c_double
872 dvalue = 0.0_c_double
884 type(c_ptr) :: cpcharacterptr
885 character(len=256) :: stext
886 character (c_char),
pointer,
dimension(:) :: fptr
887 integer (c_int) :: icount
889 stext = repeat(
" ", 256)
891 call c_f_pointer(cpcharacterptr, fptr, [256])
895 if( index(string=fptr(icount), substring=c_null_char ) /= 0)
exit
896 stext(icount:icount) = fptr(icount)
909 character (len=*),
intent(in) :: ccharacterstring
910 character(len=len(cCharacterString) - 1) :: stext
911 integer (c_int) :: iindex
915 iindex = index( string=ccharacterstring, substring=c_null_char )
919 stext = trim(adjustl(ccharacterstring))
923 stext = ccharacterstring(1:iindex-1)
936 character (len=*),
intent(in) :: stext
937 character(len=256) :: ccharacterstring
938 integer (c_int) :: iindex
940 iindex = index(string=stext, substring=c_null_char)
942 if (iindex == 0)
then
943 ccharacterstring = trim(stext)//c_null_char
945 ccharacterstring = stext(1:iindex)
957 character (len=*),
intent(in) :: stext1
958 character (len=len(sText1)) :: stext
961 character (len=512) :: stemp
962 character (len=512) :: sbuf
963 integer (c_int) :: ir
964 integer (c_int) :: iindex1, iindex2
965 character (len=:),
allocatable :: stargetcharacters_l
969 stargetcharacters_l =
"qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM" &
970 //
"!@#$%^&*()_+-={}[]|\:;'<,>?/~`'"//
'"'
973 stemp = adjustl(stext1)
977 do iindex1 = 1,len_trim(stext1)
979 ir = scan(stemp(iindex1:iindex1), stargetcharacters_l)
982 iindex2 = iindex2 + 1
983 sbuf(iindex2:iindex2) = stemp(iindex1:iindex1)
994 integer (c_int),
intent(in) :: value
995 integer (c_int),
intent(in) :: minval
996 integer (c_int),
intent(in) :: maxval
997 integer (c_int) :: retval
999 retval = min( max(
value, minval ), maxval)
1005 real (c_float),
intent(in) :: value
1006 real (c_float),
intent(in) :: minval
1007 real (c_float),
intent(in) :: maxval
1008 real (c_float) :: retval
1010 retval = min( max(
value, minval ), maxval)
1016 real (c_double),
intent(in) :: value
1017 real (c_double),
intent(in) :: minval
1018 real (c_double),
intent(in) :: maxval
1019 real (c_double) :: retval
1021 retval = min( max(
value, minval ), maxval)
This module contains physical constants and convenience functions aimed at performing unit conversion...
character(len=len_trim(input_pathname)) function fix_pathname(input_pathname)
elemental real(c_float) function inches_to_mm_sgl_fn(inches)
Convert inches to mm.
elemental logical(c_bool) function real2logical(rvalue)
Convert a real to a logical value.
real(c_double), parameter, public dbigval
logical(c_bool), parameter, public true
elemental integer(c_int) function dbl2int(rvalue)
Convert a double-precision value to an integer.
elemental character(len=256) function, public fortran_to_c_string(stext)
integer(c_int), parameter izero
character(len=1) os_native_path_delimiter
real(c_double), parameter, public f_per_c
elemental real(c_float) function deg_to_rad_sgl_fn(degrees)
Convert degrees to radians.
elemental real(c_double) function enforce_bounds_dbl_fn(value, minval, maxval)
real(c_double), parameter tolerance_double
elemental integer(c_int) function real2int(rvalue)
Convert a real value into a integer.
elemental real(c_double) function ftok_dbl_fn(degrees_f)
Convert degrees Fahrenheit to Kelvins.
real(c_float), parameter ffreezing
elemental real(c_float) function ctok_sgl_fn(degrees_c)
Convert degrees Celsius to Kelvins.
elemental real(c_float) function int2real(ivalue)
Convert an int value into a real.
elemental logical(c_bool) function dbl2logical(rvalue)
Convert a double to a logical value.
type(bounds_t), public bnds
character(len=:), allocatable, public output_prefix_name
elemental real(c_double) function ctok_dbl_fn(degrees_c)
Convert degrees Fahrenheit to Kelvins.
impure elemental character(len=len(stext1)) function keepnumeric(stext1)
Strip everything except numeric characters from a text string.
elemental real(c_double) function ctof_dbl_fn(degrees_c)
Convert degrees Celsius to degrees Fahrenheit.
real(c_float), parameter, public rtinyval
impure elemental integer(c_int) function char2int(svalue)
Convert a character value into a integer.
elemental logical(c_bool) function approx_equal_float_double(fvalue1, fvalue2)
real(c_double), parameter, public mm_per_in
elemental real(c_double) function ftoc_dbl_fn(degrees_f)
Convert degrees Fahrenheit to degrees Celsius.
real(c_double), parameter dzero
real(c_float), parameter tolerance_float
real(c_double), parameter, public twopi
real(c_float), parameter, public rfreezing
elemental real(c_double) function real2dbl(fvalue)
Convert a real value into a double.
real(c_float), parameter, public rzero
real(c_float), parameter, public near_zero
real(c_double), parameter, public dfreezing
real(c_double), parameter, public dtinyval
character(len=:), allocatable, public lookup_table_directory_name
elemental real(c_float) function ftoc_sgl_fn(degrees_f)
Convert degrees Fahrenheit to degrees Celsius.
integer(c_int), parameter datatype_short
integer(c_int), parameter datatype_real
logical(c_bool), parameter, public false
elemental logical(c_bool) function approx_equal_float_float(fvalue1, fvalue2)
real(c_double), parameter, public freezing_point_of_water_kelvin
elemental real(c_double) function rad_to_deg_dbl_fn(radians)
Convert radians to degrees.
elemental real(c_float) function rad_to_deg_sgl_fn(radians)
Convert radians to degrees.
real(c_double), parameter, public freezing_point_of_water_fahrenheit
real(c_double), parameter, public m_per_foot
integer(c_int), parameter datatype_float
real(c_double), parameter, public pi
elemental logical(c_bool) function approx_equal_double_double(fvalue1, fvalue2)
elemental real(c_float) function ftok_sgl_fn(degrees_f)
Convert degrees Fahrenheit to Kelvins.
elemental real(c_float) function enforce_bounds_sgl_fn(value, minval, maxval)
real(c_double), parameter, public c_per_f
elemental real(c_float) function char2real(svalue)
Convert a character value into a real.
elemental integer(c_int) function short2int(ishortval)
Convert a short integer to an integer.
elemental real(c_double) function inches_to_mm_dbl_fn(inches)
Convert inches to mm.
elemental real(c_double) function mm_to_inches_dbl_fn(mm)
Convert millimeters to inches.
elemental logical(c_bool) function int2logical(ivalue)
Convert an integer to a logical value.
real(c_double), parameter, public degrees_to_radians
elemental real(c_double) function deg_to_rad_dbl_fn(degrees)
Convert degrees to radians.
real(c_float), parameter ftinyval
real(c_float), parameter, public rbigval
elemental real(c_double) function short2dbl(ivalue)
Convert a short int value into a double.
elemental logical(c_bool) function short2logical(ishortval)
Convert a short integer to a logical value.
character(len=:), allocatable, public output_directory_name
elemental character(len=len(ccharacterstring) - 1) function, public c_to_fortran_string(ccharacterstring)
elemental real(c_float) function ctof_sgl_fn(degrees_c)
Convert degrees Celsius to degrees Fahrenheit.
impure elemental logical(c_bool) function, public is_numeric(value)
Determine if string contains numeric values.
elemental logical(c_bool) function char2logical(svalue)
Convert a character string to a logical value.
elemental integer(c_int) function enforce_bounds_int_fn(value, minval, maxval)
character(len=:), allocatable, public data_directory_name
elemental real(c_double) function int2dbl(ivalue)
Convert an int value into a double.
integer(c_int), parameter, public itinyval
elemental pure integer(c_int) function bool2int(lvalue)
Convert a boolean value into a int.
elemental real(c_double) function char2dbl(svalue)
Convert a character value into a double.
integer(c_int) random_start
integer(c_int), parameter datatype_int
integer(c_int), parameter datatype_na
elemental real(c_float) function mm_to_inches_sgl_fn(mm)
Convert millimeters to inches.
character(len=256) function, public char_ptr_to_fortran_string(cpcharacterptr)
real(c_float), parameter fzero
elemental real(c_float) function short2real(ivalue)
Convert a short int value into a real.
real(c_double), parameter, public radians_to_degrees
elemental pure real(c_float) function bool2real(lvalue)
Convert a boolean value into a real.
integer(c_int), parameter datatype_double
elemental pure real(c_double) function bool2dbl(lvalue)
Convert a boolean value into a double.
integer(c_int), parameter, public ibigval
real(c_double), parameter, public halfpi
elemental real(c_float) function dbl2real(dpvalue)
Convert a dbl value into a real.
establish generic interfaces to single and double precision functions