Common utility subroutines. More...
Functions/Subroutines | |
subroutine | warn_msg (code, warning_msg) |
Prints a warning message. | |
subroutine | warn_assert_msg (code, condition_ok, warning_msg) |
Prints a warning message if condition_ok is false. | |
subroutine | assert_msg (code, condition_ok, error_msg) |
Errors unless condition_ok is true. | |
subroutine | assert (code, condition_ok) |
Errors unless condition_ok is true. | |
subroutine | die (code) |
Error immediately. | |
subroutine | die_msg (code, error_msg) |
Error immediately. | |
integer | get_unit () |
Returns an available unit number. This should be freed by free_unit(). | |
subroutine | free_unit (unit) |
Frees a unit number returned by get_unit(). | |
logical | almost_equal (d1, d2) |
Convert volume (m^3) to radius (m). | |
logical | almost_equal_abs (d1, d2, abs_tol) |
Tests whether two real numbers are almost equal using an absolute and relative tolerance. | |
subroutine | check_event (time, timestep, interval, last_time, do_event) |
Computes whether an event is scheduled to take place. | |
subroutine | linspace (min_x, max_x, x) |
Makes a linearly spaced array from min to max. | |
subroutine | logspace (min_x, max_x, x) |
Makes a logarithmically spaced array of length n from min to max. | |
integer | linspace_find (min_x, max_x, n, x) |
Find the position of a real number in a 1D linear array. | |
integer | logspace_find (min_x, max_x, n, x) |
Find the position of a real number in a 1D logarithmic array. | |
integer | find_1d (n, x_vals, x) |
Find the position of a real number in an arbitrary 1D array. | |
real(kind=dp) | interp_1d (x_vals, y_vals, x) |
1D linear interpolation. | |
real(kind=dp) | interp_linear_disc (x_1, x_n, n, i) |
Linear interpolation over discrete indices. | |
integer | string_to_integer (string) |
Convert a string to an integer. | |
real(kind=dp) | string_to_real (string) |
Convert a string to a real. | |
logical | string_to_logical (string) |
Convert a string to a logical. | |
character(len=PMC_UTIL_CONVERT_STRING_LEN) | integer_to_string (val) |
Convert an integer to a string format. | |
character(len=PMC_UTIL_CONVERT_STRING_LEN) | real_to_string (val) |
Convert a real to a string format. | |
character(len=PMC_UTIL_CONVERT_STRING_LEN) | logical_to_string (val) |
Convert a logical to a string format. | |
character(len=PMC_UTIL_CONVERT_STRING_LEN) | complex_to_string (val) |
Convert a complex to a string format. | |
character(len=PMC_UTIL_CONVERT_STRING_LEN) | integer_to_string_max_len (val, max_len) |
Convert an integer to a string format of maximum length. | |
character(len=PMC_UTIL_CONVERT_STRING_LEN) | real_to_string_max_len (val, max_len) |
Convert a real to a string format of maximum length. | |
character(len=PMC_UTIL_CONVERT_STRING_LEN) | time_to_string_max_len (time, max_len) |
Convert a time to a string format of maximum length. | |
subroutine | vec_cts_to_disc (n, vec_cts, n_samp, vec_disc) |
Convert a real-valued vector into an integer-valued vector. | |
subroutine | average_integer (int_vec, int_avg) |
Computes the average of an array of integer numbers. | |
subroutine | average_real (real_vec, real_avg) |
Computes the average of an array of real numbers. | |
subroutine | get_basename (filename, basename) |
Strip the extension to find the basename. | |
subroutine | iso8601_date_and_time (date_time) |
Current date and time in ISO 8601 format. | |
real(kind=dp) | deg2rad (deg) |
Convert degrees to radians. | |
real(kind=dp) | rad2deg (rad) |
Convert radians to degrees. | |
Variables | |
integer, parameter | max_units = 200 |
Maximum number of IO units usable simultaneously. | |
integer, parameter | unit_offset = 10 |
Minimum unit number to allocate. | |
logical, dimension(max_units), save | unit_used = .false. |
Table of unit numbers storing allocation status. | |
integer, parameter | PMC_UTIL_CONVERT_STRING_LEN = 100 |
Length of string for converting numbers. | |
integer, parameter | PMC_MAX_FILENAME_LEN = 300 |
Maximum length of filenames. |
Common utility subroutines.
logical pmc_util::almost_equal | ( | real(kind=dp),intent(in) | d1, |
real(kind=dp),intent(in) | d2 | ||
) |
Convert volume (m^3) to radius (m).
Volume (m^3). Convert volume (m^3) to diameter (m). Volume (m^3). Convert radius (m) to diameter (m). Radius (m). Convert radius (m) to volume (m^3). Radius (m). Convert diameter (m) to radius (m). Diameter (m). Convert diameter (m) to volume (m^3). Diameter (m). Tests whether two real numbers are almost equal using only a relative tolerance.
d1 | First number to compare. |
d2 | Second number to compare. |
logical pmc_util::almost_equal_abs | ( | real(kind=dp),intent(in) | d1, |
real(kind=dp),intent(in) | d2, | ||
real(kind=dp),intent(in) | abs_tol | ||
) |
Tests whether two real numbers are almost equal using an absolute and relative tolerance.
d1 | First number to compare. |
d2 | Second number to compare. |
abs_tol | Tolerance for when d1 equals d2. |
subroutine pmc_util::assert | ( | integer,intent(in) | code, |
logical,intent(in) | condition_ok | ||
) |
Errors unless condition_ok is true.
code | Status code to use if assertion fails. |
condition_ok | Whether the assertion is ok. |
subroutine pmc_util::assert_msg | ( | integer,intent(in) | code, |
logical,intent(in) | condition_ok, | ||
character(len=*),intent(in) | error_msg | ||
) |
Errors unless condition_ok is true.
code | Status code to use if assertion fails. |
condition_ok | Whether the assertion is ok. |
error_msg | Msg if assertion fails. |
subroutine pmc_util::average_integer | ( | integer,dimension(:),intent(in) | int_vec, |
integer,intent(out) | int_avg | ||
) |
Computes the average of an array of integer numbers.
int_vec | Array of integer numbers. |
int_avg | Average of int_vec. |
subroutine pmc_util::average_real | ( | real(kind=dp),dimension(:),intent(in) | real_vec, |
real(kind=dp),intent(out) | real_avg | ||
) |
Computes the average of an array of real numbers.
real_vec | Array of real numbers. |
real_avg | Average of real_vec. |
subroutine pmc_util::check_event | ( | real(kind=dp),intent(in) | time, |
real(kind=dp),intent(in) | timestep, | ||
real(kind=dp),intent(in) | interval, | ||
real(kind=dp),intent(inout) | last_time, | ||
logical,intent(out) | do_event | ||
) |
Computes whether an event is scheduled to take place.
The events should occur ideally at times 0, interval, 2*interval, etc. The events are guaranteed to occur at least interval * (1 - tolerance) apart, and if at least interval time has passed then the next call is guaranteed to do the event. Otherwise the timestep is used to guess whether to do the event.
time | Current time. |
timestep | Estimate of the time to the next call. |
interval | How often the event should be done. |
last_time | When the event was last done. |
do_event | Whether the event should be done. |
character(len=PMC_UTIL_CONVERT_STRING_LEN) pmc_util::complex_to_string | ( | complex(kind=dc),intent(in) | val ) |
Convert a complex to a string format.
val | Value to convert. |
real(kind=dp) pmc_util::deg2rad | ( | real(kind=dp),intent(in) | deg ) |
Convert degrees to radians.
deg | Input degrees. |
subroutine pmc_util::die | ( | integer,intent(in) | code ) |
Error immediately.
code | Status code to use if assertion fails. |
subroutine pmc_util::die_msg | ( | integer,intent(in) | code, |
character(len=*),intent(in) | error_msg | ||
) |
Error immediately.
code | Status code to use if assertion fails. |
error_msg | Msg if assertion fails. |
integer pmc_util::find_1d | ( | integer,intent(in) | n, |
real(kind=dp),dimension(n),intent(in) | x_vals, | ||
real(kind=dp),intent(in) | x | ||
) |
Find the position of a real number in an arbitrary 1D array.
Takes an array of x_vals, and a single x value, and returns the position p such that x_vals(p) <= x < x_vals(p+1). If p == 0 then x < x_vals(1) and if p == n then x_vals(n) <= x. x_vals must be sorted in increasing order.
If the array is known to be linearly or logarithmically spaced then linspace_find() or logspace_find() will be much faster.
n | Number of values. |
x_vals | X value array, must be sorted. |
x | Value to interpolate at. |
subroutine pmc_util::free_unit | ( | integer,intent(in) | unit ) |
Frees a unit number returned by get_unit().
subroutine pmc_util::get_basename | ( | character(len=*),intent(in) | filename, |
character(len=*),intent(out) | basename | ||
) |
Strip the extension to find the basename.
The filename is assumed to be of the form basename.extension, where extension contains no periods. If there is no period in filename then basename is the whole filename.
filename | Full filename. |
basename | Basename. |
integer pmc_util::get_unit | ( | ) |
Returns an available unit number. This should be freed by free_unit().
character(len=PMC_UTIL_CONVERT_STRING_LEN) pmc_util::integer_to_string | ( | integer,intent(in) | val ) |
Convert an integer to a string format.
val | Value to convert. |
character(len=PMC_UTIL_CONVERT_STRING_LEN) pmc_util::integer_to_string_max_len | ( | integer,intent(in) | val, |
integer,intent(in) | max_len | ||
) |
Convert an integer to a string format of maximum length.
val | Value to convert. |
max_len | Maximum length of resulting string. |
real(kind=dp) pmc_util::interp_1d | ( | real(kind=dp),dimension(:),intent(in) | x_vals, |
real(kind=dp),dimension(size(x_vals),intent(in) | y_vals, | ||
real(kind=dp),intent(in) | x | ||
) |
1D linear interpolation.
Takes an array of x and y, and a single x value, and returns the corresponding y using linear interpolation. x_vals must be sorted.
x_vals | X value array, must be sorted. |
y_vals | Y value array. |
x | Value to interpolate at. |
real(kind=dp) pmc_util::interp_linear_disc | ( | real(kind=dp),intent(in) | x_1, |
real(kind=dp),intent(in) | x_n, | ||
integer,intent(in) | n, | ||
integer,intent(in) | i | ||
) |
Linear interpolation over discrete indices.
Takes real values x_1
and x_n
and integers n
and i
and returns the linear interpolation so that x_1
is returned when i
= 1 and x_n
is returned when i
= n
.
x_1 | Value of x when i = 1. |
x_n | Value of x when i = n. |
n | Number of points to interpolate over. |
i | Index to interpolate at. |
subroutine pmc_util::iso8601_date_and_time | ( | character(len=*),intent(out) | date_time ) |
Current date and time in ISO 8601 format.
date_time | Result string. |
subroutine pmc_util::linspace | ( | real(kind=dp),intent(in) | min_x, |
real(kind=dp),intent(in) | max_x, | ||
real(kind=dp),dimension(:),intent(out) | x | ||
) |
Makes a linearly spaced array from min to max.
min_x | Minimum array value. |
max_x | Maximum array value. |
x | Array. |
integer pmc_util::linspace_find | ( | real(kind=dp),intent(in) | min_x, |
real(kind=dp),intent(in) | max_x, | ||
integer,intent(in) | n, | ||
real(kind=dp),intent(in) | x | ||
) |
Find the position of a real number in a 1D linear array.
If xa is the array allocated by linspace(min_x, max_x, xa) then i = linspace_find(min_x, max_x, n, x) returns the index i satisfying xa(i) <= x < xa(i+1) for min_x <= x < max_x. If x >= max_x then i = n - 1. If x < min_x then i = 1. Thus 1 <= i <= n - 1. Here n is the length of xa.
This is equivalent to using find_1d() but much faster if the array is linear.
min_x | Minimum array value. |
max_x | Maximum array value. |
n | Number of entries. |
x | Value. |
character(len=PMC_UTIL_CONVERT_STRING_LEN) pmc_util::logical_to_string | ( | logical,intent(in) | val ) |
Convert a logical to a string format.
val | Value to convert. |
subroutine pmc_util::logspace | ( | real(kind=dp),intent(in) | min_x, |
real(kind=dp),intent(in) | max_x, | ||
real(kind=dp),dimension(:),intent(out) | x | ||
) |
Makes a logarithmically spaced array of length n from min to max.
min_x | Minimum array value. |
max_x | Maximum array value. |
x | Array. |
integer pmc_util::logspace_find | ( | real(kind=dp),intent(in) | min_x, |
real(kind=dp),intent(in) | max_x, | ||
integer,intent(in) | n, | ||
real(kind=dp),intent(in) | x | ||
) |
Find the position of a real number in a 1D logarithmic array.
If xa is the array allocated by logspace(min_x, max_x, n, xa) then i = logspace_find(min_x, max_x, n, x) returns the index i satisfying xa(i) <= x < xa(i+1) for min_x <= x < max_x. If x >= max_x then i = n. If x < min_x then i = 1. Thus 1 <= i <= n.
This is equivalent to using find_1d() but much faster if the array is known to be logarithmic.
min_x | Minimum array value. |
max_x | Maximum array value. |
n | Number of entries. |
x | Value. |
real(kind=dp) pmc_util::rad2deg | ( | real(kind=dp),intent(in) | rad ) |
Convert radians to degrees.
rad | Input radians. |
character(len=PMC_UTIL_CONVERT_STRING_LEN) pmc_util::real_to_string | ( | real(kind=dp),intent(in) | val ) |
Convert a real to a string format.
val | Value to convert. |
character(len=PMC_UTIL_CONVERT_STRING_LEN) pmc_util::real_to_string_max_len | ( | real(kind=dp),intent(in) | val, |
integer,intent(in) | max_len | ||
) |
Convert a real to a string format of maximum length.
val | Value to convert. |
max_len | Maximum length of resulting string. |
integer pmc_util::string_to_integer | ( | character(len=*),intent(in) | string ) |
Convert a string to an integer.
string | String to convert. |
logical pmc_util::string_to_logical | ( | character(len=*),intent(in) | string ) |
Convert a string to a logical.
string | String to convert. |
real(kind=dp) pmc_util::string_to_real | ( | character(len=*),intent(in) | string ) |
Convert a string to a real.
string | String to convert. |
character(len=PMC_UTIL_CONVERT_STRING_LEN) pmc_util::time_to_string_max_len | ( | real(kind=dp),intent(in) | time, |
integer,intent(in) | max_len | ||
) |
Convert a time to a string format of maximum length.
time | Time to convert (s). |
max_len | Maximum length of resulting string. |
subroutine pmc_util::vec_cts_to_disc | ( | integer,intent(in) | n, |
real(kind=dp),dimension(n),intent(in) | vec_cts, | ||
integer,intent(in) | n_samp, | ||
integer,dimension(n),intent(out) | vec_disc | ||
) |
Convert a real-valued vector into an integer-valued vector.
Use n_samp samples. Returns discrete vector whose relative entry sizes are closest to the continuous vector.
n | Number of entries in vectors. |
vec_cts | Continuous vector. |
n_samp | Number of discrete samples to use. |
vec_disc | Discretized vector. |
subroutine pmc_util::warn_assert_msg | ( | integer,intent(in) | code, |
logical,intent(in) | condition_ok, | ||
character(len=*),intent(in) | warning_msg | ||
) |
Prints a warning message if condition_ok is false.
code | Status code to use. |
condition_ok | Whether the assertion is ok. |
warning_msg | Message to display. |
subroutine pmc_util::warn_msg | ( | integer,intent(in) | code, |
character(len=*),intent(in) | warning_msg | ||
) |
Prints a warning message.
code | Status code to use. |
warning_msg | Message to display. |
integer,parameter pmc_util::max_units = 200 |
Maximum number of IO units usable simultaneously.
integer,parameter pmc_util::PMC_MAX_FILENAME_LEN = 300 |
Maximum length of filenames.
integer,parameter pmc_util::PMC_UTIL_CONVERT_STRING_LEN = 100 |
Length of string for converting numbers.
integer,parameter pmc_util::unit_offset = 10 |
Minimum unit number to allocate.
logical,dimension(max_units),save pmc_util::unit_used = .false. |
Table of unit numbers storing allocation status.