日々の記録
2026
2025
2024
2023
2022
2021
2020
2019
2018
2017
2016
2015
2014
2013
2012
2011
2010
2009
2008
1月
2月
3月
4月
5月
6月
7月
8月
9月
10月
11月
12月
全1件 (1件中 1-1件目)
1
Fortranで巨大なファイルをソートする必要があり、いい方法がないかと探したら、Fortran標準ライブラリというものがあるらしい。その中のsort_indexというコマンドが使えそうだ。やったことは以下の通り。まずstdlibのインストール#git clone https://github.com/fortran-lang/stdlib#cd stdlib#cmake -B buildここで、エラーが出る。gccのバージョンは9以上必要とのこと。centos7の場合、devtoolsetを使えば、バージョンを上げられるが、結局、これでも同じエラーが出るので、諦める。almallinux9のマシンで再度挑戦。このマシンでは、gcc-11である。#cmake -B build再びエラー。今回は、fyppがないとのこと。#pip install fyppここでもエラー。いろいろ試したところ、どうもpythonが古いようだ。pythonをpyenvで管理しているのだが、pyenvも古くてpythonの更新ができない。そこで、pyenvの更新。#cd .pyenv/plugins#git clone https://github.com/pyenv/pyenv-update.git#pyenv updateこの後、python(anaconda)の更新# pyenv install anaconda3-2023.09-0# pyenv global anaconda3-2023.09-0これで、fyppのインストールができる。# pip install fyppここから、stdlibのインストールに戻る。#cmake -B build#cmake -build build#su#cmake -install build標準では、/usr/local/lib64/にlibfortran_stdlib.a/usr/local/include/fortran_stdlib/GNU-11.4.1/にstdlib_sorting.modがインストールされるようだ。GNU-11.4.1は、gccのバージョンだと思う。次に、fortranのプログラムに関して。行頭に以下の文を入れておく。 use :: stdlib_sorting, only: sort_index,int_sizeそれと、index用の配列を定義しておく。 INTEGER(int_size), allocatable :: index(:)例えば、integerのarrayをsortの対象とすると、 INTEGER, allocatable :: array(:)... allocate (array(num)) allocate (index(num))arrayとindexは、同じ大きさの配列であるということ。... call sort_index(array, index)オプションなしだと、call後に、arrayは小さい順に並ぶ。index配列にcall前に何か数字を入れておく必要はない。call前、arrayの一番小さな数値がn番目にあったとすると、call後、index(n)=1となる。makefileは、以下のようになると思う。TARGET = a.outOBJECTS = main.oFC = gfortran FFLAGS = -O2 -mcmodel=mediumINCLUDE=-I /usr/local/include/fortran_stdlib/GNU-11.4.1/LFLAGS=-L /usr/local/lib64 -l fortran_stdlib.SUFFIXES : .o .f90.f90.o: ${FC} ${FFLAGS} ${INCLUDE} -c $<${TARGET} : ${OBJECTS} ${FC} ${FFLAGS} -o $@ ${OBJECTS} ${LFLAGS}.PHONY: cleanclean: ${RM} ${TARGET} ${OBJECTS}
2024.02.13