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 ::
rbigval = huge(0.0_c_float)
42 real (c_double),
parameter ::
dbigval = huge(0.0_c_double)
43 integer(c_int),
parameter ::
ibigval = huge(0_c_int)
44 real (c_float),
parameter ::
rtinyval = -(huge(0.0_c_float) - 1.0)
45 real (c_double),
parameter ::
dtinyval = -(huge(0.0_c_double) - 1.0)
46 real (c_float),
parameter ::
ftinyval = -(huge(0.0_c_float) - 1.0)
47 integer(c_int),
parameter ::
itinyval = -(huge(0_c_int) - 1)
48 real (c_float),
parameter ::
rfreezing = 32.0_c_float
49 real (c_float),
parameter ::
ffreezing = 32.0_c_float
50 real (c_double),
parameter ::
dfreezing = 32.0_c_double
51 integer (c_int),
parameter ::
izero = 0_c_int
52 real (c_float),
parameter ::
fzero = 0.0_c_float
53 real (c_float),
parameter ::
rzero = 0.0_c_float
54 real (c_double),
parameter ::
dzero = 0.0_c_double
61 real (c_double),
parameter,
public ::
c_per_f = 5.0_c_double / 9.0_c_double
62 real (c_double),
parameter,
public ::
f_per_c = 9.0_c_double / 5.0_c_double
63 real (c_double),
parameter,
public ::
m_per_foot = 0.3048_c_double
64 real (c_double),
parameter,
public ::
mm_per_in = 25.4_c_double
76 character (len=:),
allocatable :: sproj4_string
77 integer (c_int) :: inumcols
78 integer (c_int) :: inumrows
79 real (c_double) :: fx_ll, fy_ll
80 real (c_double) :: fx_ur, fy_ur
81 real (c_double) :: fgridcellsize
86 public ::
operator(.approxequal.)
87 interface operator(.approxequal.)
91 end interface operator(.approxequal.)
198 character (len=*),
intent(in) :: input_pathname
199 character (len=len_trim(input_pathname)) :: output_pathname
202 integer (c_int) :: indx, jndx
204 do indx=1,len_trim(input_pathname)
206 jndx = min( indx+1, len_trim(input_pathname) )
208 if ( ( (input_pathname(indx:indx) ==
'/') &
209 .or. (input_pathname(indx:indx) ==
'\') ) &
210 .and. (input_pathname(jndx:jndx) /=
' ' ) )
then
216 output_pathname(indx:indx) = input_pathname(indx:indx)
227 real (c_float),
intent(in) :: fvalue1
228 real (c_float),
intent(in) :: fvalue2
229 logical (c_bool) :: lbool
244 real (c_float),
intent(in) :: fvalue1
245 real (c_double),
intent(in) :: fvalue2
246 logical (c_bool) :: lbool
262 real (c_double),
intent(in) :: fvalue1
263 real (c_double),
intent(in) :: fvalue2
264 logical (c_bool) :: lbool
282 character (len=*),
intent(in) :: value
286 character (len=256) :: sbuf
290 if ( len_trim( sbuf ) == 0 )
then
306 real (c_float),
intent(in) :: degrees
307 real (c_float) :: radians
322 real (c_double),
intent(in) :: degrees
323 real (c_double) :: radians
338 real (c_float),
intent(in) :: radians
339 real (c_float) :: degrees
353 real (c_double),
intent(in) :: radians
354 real (c_double) :: degrees
369 real (c_float),
intent(in) :: degrees_f
370 real (c_float) :: degrees_c
385 real (c_double),
intent(in) :: degrees_f
386 real (c_double) :: degrees_c
401 real (c_float),
intent(in) :: degrees_c
402 real (c_float) :: degrees_f
417 real (c_double),
intent(in) :: degrees_c
418 real (c_double) :: degrees_f
433 real (c_float),
intent(in) :: degrees_f
434 real (c_float) :: degrees_k
449 real (c_double),
intent(in) :: degrees_f
450 real (c_double) :: degrees_k
465 real (c_float),
intent(in) :: degrees_c
466 real (c_float) :: degrees_k
468 degrees_k = degrees_c + 273.15_c_double
481 real (c_double),
intent(in) :: degrees_c
482 real (c_double) :: degrees_k
484 degrees_k = degrees_c + 273.15_c_double
496 real (c_float),
intent(in) :: inches
499 mm = inches * 25.4_c_double
511 real (c_double),
intent(in) :: inches
512 real (c_double) :: mm
514 mm = inches * 25.4_c_double
526 real (c_float),
intent(in) :: mm
527 real (c_float) :: inches
529 inches = mm / 25.4_c_double
541 real (c_double),
intent(in) :: mm
542 real (c_double) :: inches
544 inches = mm / 25.4_c_double
554 integer (c_short),
intent(in) :: ishortval
555 logical (c_bool) :: lvalue
557 if ( ishortval == 0 )
then
571 integer (c_int),
intent(in) :: ivalue
572 logical (c_bool) :: lvalue
574 if ( ivalue == 0 )
then
588 real (c_float),
intent(in) :: rvalue
589 logical (c_bool) :: lvalue
592 real (c_float),
parameter :: fminresolution = 2.0 * spacing(1.0_c_float)
594 if ( rvalue > -fminresolution .and. rvalue < fminresolution )
then
608 real (c_double),
intent(in) :: rvalue
609 logical (c_bool) :: lvalue
612 real (c_double),
parameter :: dminresolution = 2.0 * spacing(1.0_c_float)
614 if ( rvalue > -dminresolution .and. rvalue < dminresolution )
then
628 character (len=*),
intent(in) :: svalue
629 logical (c_bool) :: lvalue
631 select case ( svalue )
633 case (
"TRUE",
"True",
"true",
"T",
"YES",
"Yes",
"yes",
"1" )
651 integer (c_short),
intent(in) :: ishortval
652 integer (c_int) :: ivalue
654 ivalue = int( ishortval, c_int )
662 impure elemental function char2int(sValue)
result(iValue)
664 character (len=*),
intent(in) :: svalue
665 integer (c_int) :: ivalue
668 integer (c_int) :: istat
669 character (len=:),
allocatable :: stempval
670 real (c_float) :: rvalue
676 if ( scan(stempval,
".") /= 0 )
then
678 read(unit=stempval, fmt=*, iostat=istat) rvalue
680 if (istat == 0) ivalue = int(rvalue, c_int)
684 read(unit=stempval, fmt=*, iostat=istat) ivalue
698 real (c_float),
intent(in) :: rvalue
699 integer (c_int) :: ivalue
701 ivalue = int(rvalue, c_int)
709elemental function dbl2int(rValue)
result(iValue)
711 real (c_double),
intent(in) :: rvalue
712 integer (c_int) :: ivalue
714 ivalue = int(rvalue, c_int)
724 character (len=*),
intent(in) :: svalue
725 real (c_float) :: rvalue
728 integer (c_int) :: istat
730 read(unit=svalue, fmt=*, iostat=istat) rvalue
742 integer (c_short),
intent(in) :: ivalue
743 real (c_float) :: rvalue
745 rvalue = real(ivalue, c_float)
755 integer (c_int),
intent(in) :: ivalue
756 real (c_float) :: rvalue
758 rvalue = real(ivalue, c_float)
768 real (c_double),
intent(in) :: dpvalue
769 real (c_float) :: rvalue
771 rvalue = real(dpvalue, c_float)
779 logical (c_bool),
intent(in) :: lvalue
780 real (c_float) :: rvalue
796 character (len=*),
intent(in) :: svalue
797 real (c_double) :: dvalue
800 integer (c_int) :: istat
802 read(unit=svalue, fmt=*, iostat=istat) dvalue
814 integer (c_short),
intent(in) :: ivalue
815 real (c_double) :: dvalue
817 dvalue = real(ivalue, c_double)
825elemental function int2dbl(iValue)
result(dValue)
827 integer (c_int),
intent(in) :: ivalue
828 real (c_double) :: dvalue
830 dvalue = real(ivalue, c_double)
840 real (c_float),
intent(in) :: fvalue
841 real (c_double) :: dvalue
843 dvalue = real(fvalue, c_double)
850elemental pure function bool2dbl(lValue)
result(dValue)
851 logical (c_bool),
intent(in) :: lvalue
852 real (c_double) :: dvalue
855 dvalue = 1.0_c_double
857 dvalue = 0.0_c_double
869 type(c_ptr) :: cpcharacterptr
870 character(len=256) :: stext
871 character (c_char),
pointer,
dimension(:) :: fptr
872 integer (c_int) :: icount
874 stext = repeat(
" ", 256)
876 call c_f_pointer(cpcharacterptr, fptr, [256])
880 if( index(string=fptr(icount), substring=c_null_char ) /= 0)
exit
881 stext(icount:icount) = fptr(icount)
894 character (len=*),
intent(in) :: ccharacterstring
895 character(len=len(cCharacterString) - 1) :: stext
896 integer (c_int) :: iindex
900 iindex = index( string=ccharacterstring, substring=c_null_char )
904 stext = trim(adjustl(ccharacterstring))
908 stext = ccharacterstring(1:iindex-1)
921 character (len=*),
intent(in) :: stext
922 character(len=256) :: ccharacterstring
923 integer (c_int) :: iindex
925 iindex = index(string=stext, substring=c_null_char)
927 if (iindex == 0)
then
928 ccharacterstring = trim(stext)//c_null_char
930 ccharacterstring = stext(1:iindex)
942 character (len=*),
intent(in) :: stext1
943 character (len=len(sText1)) :: stext
946 character (len=512) :: stemp
947 character (len=512) :: sbuf
948 integer (c_int) :: ir
949 integer (c_int) :: iindex1, iindex2
950 character (len=:),
allocatable :: stargetcharacters_l
954 stargetcharacters_l =
"qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM" &
955 //
"!@#$%^&*()_+-={}[]|\:;'<,>?/~`'"//
'"'
958 stemp = adjustl(stext1)
962 do iindex1 = 1,len_trim(stext1)
964 ir = scan(stemp(iindex1:iindex1), stargetcharacters_l)
967 iindex2 = iindex2 + 1
968 sbuf(iindex2:iindex2) = stemp(iindex1:iindex1)
979 integer (c_int),
intent(in) :: value
980 integer (c_int),
intent(in) :: minval
981 integer (c_int),
intent(in) :: maxval
982 integer (c_int) :: retval
984 retval = min( max(
value, minval ), maxval)
990 real (c_float),
intent(in) :: value
991 real (c_float),
intent(in) :: minval
992 real (c_float),
intent(in) :: maxval
993 real (c_float) :: retval
995 retval = min( max(
value, minval ), maxval)
1001 real (c_double),
intent(in) :: value
1002 real (c_double),
intent(in) :: minval
1003 real (c_double),
intent(in) :: maxval
1004 real (c_double) :: retval
1006 retval = min( max(
value, minval ), maxval)
establish generic interfaces to single and double precision functions
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_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 real(c_double) function char2dbl(svalue)
Convert a character value into a double.
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
integer(c_long_long) random_start
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.