Getting Started
===============
This guide will help you get started with PIC in your Fortran projects.
Basic Usage
-----------
PIC provides an umbrella module that exposes all functionality:
.. code-block:: fortran
program my_program
use pic
implicit none
! Your code here
end program my_program
For finer control, import specific modules:
.. code-block:: fortran
program my_program
use pic_types, only: default_int, dp
use pic_strings, only: to_string
use pic_logger, only: log_info
implicit none
! Your code here
end program my_program
Types and Kinds
---------------
PIC uses portable kind definitions. **Always use these instead of literal kinds** to ensure your code compiles on all compilers.
.. code-block:: fortran
use pic_types, only: default_int, sp, dp, qp, int32, int64
! Portable integer (32 or 64-bit depending on build config)
integer(default_int) :: n
! Fixed-width integers
integer(int32) :: i32
integer(int64) :: i64
! Floating point kinds
real(sp) :: single_val ! Single precision (32-bit)
real(dp) :: double_val ! Double precision (64-bit)
real(qp) :: quad_val ! Quad precision (128-bit)
.. warning::
Never use bare ``integer`` or ``integer(4)`` / ``integer(8)`` / ``real(8)``.
These lead to portability issues across compilers. Always use PIC's kind definitions.
Why Default Integer Matters
^^^^^^^^^^^^^^^^^^^^^^^^^^^
Many legacy Fortran codes compile with flags like ``-fdefault-integer-8`` to make all integers 64-bit. This causes problems when interfacing with other codes.
PIC solves this by providing ``default_int`` which can be toggled at **compile time** without compiler flags:
.. code-block:: bash
# Build with 32-bit default integers (default)
cmake -B build
# Build with 64-bit default integers
cmake -B build -DPIC_DEFAULT_INT8=ON
String Operations
-----------------
PIC provides a dynamic string type and string utilities:
.. code-block:: fortran
use pic_string_type, only: string_type
use pic_strings, only: to_string, to_lower, to_upper, starts_with, ends_with
type(string_type) :: s
character(len=:), allocatable :: str
! Convert numbers to strings
str = to_string(42) ! "42"
str = to_string(3.14159_dp) ! "3.14159..."
str = to_string(.true.) ! "T"
! Case conversion
str = to_lower("HELLO WORLD") ! "hello world"
str = to_upper("hello world") ! "HELLO WORLD"
! String queries
if (starts_with("hello.f90", "hello")) then
print *, "Starts with hello"
end if
Logging
-------
PIC includes a logging system with severity levels:
.. code-block:: fortran
use pic_logger
! Different severity levels
call log_debug("Detailed debug information")
call log_info("Starting computation...")
call log_warning("Memory usage is high")
call log_error("Failed to open file")
Output example::
[INFO] Starting computation...
[WARNING] Memory usage is high
[ERROR] Failed to open file
Pure Logger
^^^^^^^^^^^
For use in ``pure`` procedures, use ``pic_pure_logger``:
.. code-block:: fortran
use pic_pure_logger
pure function compute(x) result(y)
real(dp), intent(in) :: x
real(dp) :: y
character(len=256) :: msg
! Pure logging (deferred output)
call pure_log_info("Computing...", msg)
y = x * 2.0_dp
end function compute
Timer
-----
Measure execution time with high-resolution timers:
.. code-block:: fortran
use pic_timer
use pic_types, only: dp
type(timer_type) :: t
real(dp) :: elapsed
call t%start()
! ... your computation ...
call t%stop()
elapsed = t%elapsed()
print '(A,F10.3,A)', "Elapsed time: ", elapsed, " seconds"
Array Operations
----------------
PIC provides array utilities with optional OpenMP parallelization:
.. code-block:: fortran
use pic_array, only: fill_vector, fill_matrix
use pic_types, only: dp
real(dp) :: vec(1000)
real(dp) :: mat(100, 100)
! Fill arrays with values
call fill_vector(vec, 0.0_dp)
call fill_matrix(mat, 1.0_dp)
! Enable threaded filling (requires PIC_ENABLE_OMP)
call fill_vector(vec, 0.0_dp, threaded=.true.)
Sorting
-------
Sorting routines that work on all compilers (unlike stdlib which may fail on some):
.. code-block:: fortran
use pic_sorting
use pic_types, only: dp
real(dp) :: arr(100)
integer(default_int) :: indices(100)
! Sort in place
call sort(arr)
! Get sorted indices
call argsort(arr, indices)
Hash Functions
--------------
FNV-1a 32-bit hash implementation:
.. code-block:: fortran
use pic_hash_32bit, only: fnv1a_hash
use pic_types, only: int32
integer(int32) :: hash_val
character(len=*), parameter :: key = "my_key"
hash_val = fnv1a_hash(key)
Complete Example
----------------
Here's a complete example showing multiple PIC features:
.. code-block:: fortran
program pic_demo
use pic
implicit none
type(timer_type) :: timer
real(dp) :: data(1000), elapsed
integer(default_int) :: i
! Start timing
call timer%start()
! Initialize array
call fill_vector(data, 0.0_dp)
do i = 1, size(data)
data(i) = real(i, dp)
end do
! Sort the data
call sort(data)
! Stop timing
call timer%stop()
elapsed = timer%elapsed()
! Log results
call log_info("Sorted " // to_string(size(data)) // " elements")
call log_info("Time: " // to_string(elapsed) // " seconds")
end program pic_demo
Next Steps
----------
- Explore the :doc:`features` page for a complete module reference
- Check the `API documentation `_ for detailed interfaces
- See the `examples repository `_ for more use cases