-
Notifications
You must be signed in to change notification settings - Fork 191
Implement loadtxt and savetxt #23
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 2 commits
65d8d59
7a7ca5f
9d0d3aa
8d33ead
43ed837
eff8a6f
559bfd7
5e9565e
57d517f
65301b9
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
cmake_minimum_required(VERSION 3.5.0 FATAL_ERROR) | ||
|
||
enable_language(Fortran) | ||
|
||
project(stdlib) | ||
|
||
enable_testing() | ||
|
||
add_subdirectory(src) |
This file was deleted.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
# Fortran stdlib Makefile | ||
|
||
FC = gfortran | ||
FCFLAGS=-O0 | ||
|
||
.PHONY: all clean | ||
|
||
all: stdlib tests | ||
|
||
stdlib: | ||
$(MAKE) -f Makefile.manual FC=${FC} FCFLAGS=${FCFLAGS} --directory=src/lib | ||
|
||
tests: stdlib | ||
$(MAKE) -f Makefile.manual FC=${FC} FCFLAGS=${FCFLAGS} --directory=src/tests | ||
|
||
clean: | ||
$(MAKE) -f Makefile.manual clean --directory=src/lib | ||
$(MAKE) -f Makefile.manual clean --directory=src/tests |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
set(SRC | ||
stdlib_types.f90 | ||
stdlib_io.f90 | ||
) | ||
|
||
add_library(fortran_stdlib ${SRC}) | ||
|
||
install(TARGETS fortran_stdlib | ||
RUNTIME DESTINATION bin | ||
ARCHIVE DESTINATION lib | ||
LIBRARY DESTINATION lib | ||
) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
module stdlib_io | ||
use stdlib_types | ||
implicit none | ||
private | ||
public loadtxt, savetxt | ||
certik marked this conversation as resolved.
Show resolved
Hide resolved
certik marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
contains | ||
|
||
subroutine loadtxt(filename, d) | ||
! Loads a 2D array from a text file. | ||
! | ||
! Arguments | ||
! --------- | ||
! | ||
! Filename to load the array from | ||
character(len=*), intent(in) :: filename | ||
! The array 'd' will be automatically allocated with the correct dimensions | ||
real(dp), allocatable, intent(out) :: d(:, :) | ||
! | ||
! Example | ||
! ------- | ||
! | ||
! real(dp), allocatable :: data(:, :) | ||
! call loadtxt("log.txt", data) ! 'data' will be automatically allocated | ||
! | ||
! Where 'log.txt' contains for example:: | ||
! | ||
! 1 2 3 | ||
! 2 4 6 | ||
! 8 9 10 | ||
! 11 12 13 | ||
! ... | ||
! | ||
character :: c | ||
integer :: s, ncol, nrow, ios, i | ||
logical :: lastwhite | ||
real(dp) :: r | ||
|
||
open(newunit=s, file=filename, status="old") | ||
|
||
! determine number of columns | ||
ncol = 0 | ||
lastwhite = .true. | ||
do | ||
read(s, '(a)', advance='no', iostat=ios) c | ||
if (ios /= 0) exit | ||
if (lastwhite .and. .not. whitechar(c)) ncol = ncol + 1 | ||
lastwhite = whitechar(c) | ||
end do | ||
|
||
rewind(s) | ||
|
||
! determine number or rows | ||
nrow = 0 | ||
do | ||
read(s, *, iostat=ios) r | ||
if (ios /= 0) exit | ||
nrow = nrow + 1 | ||
end do | ||
|
||
rewind(s) | ||
|
||
allocate(d(nrow, ncol)) | ||
do i = 1, nrow | ||
read(s, *) d(i, :) | ||
end do | ||
close(s) | ||
end subroutine | ||
|
||
subroutine savetxt(filename, d) | ||
! Saves a 2D array into a textfile. | ||
! | ||
! Arguments | ||
! --------- | ||
! | ||
character(len=*), intent(in) :: filename ! File to save the array to | ||
real(dp), intent(in) :: d(:, :) ! The 2D array to save | ||
! | ||
! Example | ||
! ------- | ||
! | ||
! real(dp) :: data(3, 2) | ||
! call savetxt("log.txt", data) | ||
|
||
integer :: s, i | ||
open(newunit=s, file=filename, status="replace") | ||
do i = 1, size(d, 1) | ||
write(s, *) d(i, :) | ||
end do | ||
close(s) | ||
end subroutine | ||
|
||
|
||
logical function whitechar(char) ! white character | ||
! returns .true. if char is space (32) or tab (9), .false. otherwise | ||
character, intent(in) :: char | ||
if (iachar(char) == 32 .or. iachar(char) == 9) then | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I intentionally didn't expose There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We have a "circular dependency" here. I would like to submit a pull request for There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Internally in Edit: probably I misunderstood your comment, which was implying to use something like |
||
whitechar = .true. | ||
else | ||
whitechar = .false. | ||
end if | ||
end function | ||
|
||
end module |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
module stdlib_types | ||
implicit none | ||
private | ||
public sp, dp, qp | ||
|
||
integer, parameter :: sp=kind(0.), & ! single precision | ||
dp=kind(0.d0), & ! double precision | ||
qp=selected_real_kind(32) ! quadruple precision | ||
|
||
end module |
Uh oh!
There was an error while loading. Please reload this page.