mirror of
https://gitlab.com/scemama/EZFIO.git
synced 2024-12-22 04:13:34 +01:00
Migration from Sourceforge
This commit is contained in:
parent
29a999c0f8
commit
0827fb9f54
280
LICENSE
Normal file
280
LICENSE
Normal file
@ -0,0 +1,280 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Lesser General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
55
Makefile
Normal file
55
Makefile
Normal file
@ -0,0 +1,55 @@
|
||||
# EZFIO is an automatic generator of I/O libraries
|
||||
# Copyright (C) 2009 Anthony SCEMAMA, CNRS
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along
|
||||
# with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Anthony Scemama
|
||||
# LCPQ - IRSAMC - CNRS
|
||||
# Universite Paul Sabatier
|
||||
# 118, route de Narbonne
|
||||
# 31062 Toulouse Cedex 4
|
||||
# scemama@irsamc.ups-tlse.fr
|
||||
|
||||
include version
|
||||
include make.config
|
||||
|
||||
.PHONY: default clean distclean archive configure
|
||||
|
||||
default: make.config
|
||||
- bash -c "[[ -e lib/libezfio.a ]] && rm $$PWD/lib/*"
|
||||
@echo Compiling library && make -C $$PWD/src static
|
||||
@echo Building Python module && make -C $$PWD/src python
|
||||
|
||||
clean:
|
||||
- bash -c "[[ -e lib/libezfio.a ]] && rm $$PWD/lib/*"
|
||||
- bash -c "[[ -e Python/ezfio.py ]] && rm $$PWD/Python/*"
|
||||
- make -C $$PWD/src veryclean
|
||||
|
||||
distclean: clean
|
||||
- rm -rf autom4te.cache config.status config.log make.config
|
||||
|
||||
archive: distclean
|
||||
git archive --format=tar HEAD > EZFIO.$(VERSION).tar
|
||||
mkdir EZFIO ; cd EZFIO ; tar -xvf ../EZFIO.$(VERSION).tar
|
||||
rm EZFIO.$(VERSION).tar
|
||||
tar -zcvf EZFIO.$(VERSION).tar.gz EZFIO
|
||||
rm -rf EZFIO
|
||||
|
||||
configure: make.config.in configure.ac
|
||||
autoconf
|
||||
|
||||
make.config:
|
||||
./configure --host=dummy
|
||||
|
0
Ocaml/.empty
Normal file
0
Ocaml/.empty
Normal file
0
Python/.empty
Normal file
0
Python/.empty
Normal file
86
README
Normal file
86
README
Normal file
@ -0,0 +1,86 @@
|
||||
======================================================================
|
||||
EZFIO
|
||||
======================================================================
|
||||
|
||||
Author: A. Scemama, LCPQ-IRSAMC, CNRS-Universite Paul Sabatier
|
||||
scemama@irsamc.ups-tlse.fr
|
||||
|
||||
== About EZFIO ==
|
||||
|
||||
EZFIO is the Easy Fortran I/O library. With EZFIO, your data is organized
|
||||
in a file system inside a main directory. This main directory contains
|
||||
subdirectories, which contain files. Each file corresponds to a data. For
|
||||
atomic data the file is a plain text file, and for array data the file is a
|
||||
gzipped text file.
|
||||
|
||||
|
||||
== Building a library ==
|
||||
|
||||
Your EZFIO library is built according to the definitions given in the
|
||||
files of the 'config' directory. A configuration file can be, for example:
|
||||
---
|
||||
|
||||
system
|
||||
title character*(128)
|
||||
num_elec integer = system_num_alpha + system_num_beta
|
||||
num_alpha integer
|
||||
num_beta integer
|
||||
|
||||
geometry
|
||||
num_atom integer
|
||||
nuc_energy double precision
|
||||
label character*(32) (geometry_num_atom)
|
||||
atomic_number integer (geometry_num_atom)
|
||||
charge double precision (geometry_num_atom)
|
||||
coord double precision (3,geometry_num_atom)
|
||||
|
||||
---
|
||||
|
||||
A subdirectory is defined by its name at the beginning of a new line. The
|
||||
data contained in this subdirectory is defined by the triplet
|
||||
(name,type,dimension), leaving at least one white space at the beginning of the
|
||||
line.
|
||||
If the dimension of an array is a data defined in the file, its name can be
|
||||
used as <name of the subdirectory>_<name of the data>. For example, the
|
||||
dimension '(geometry_num_atom)' uses the data 'num_atom' of subdirectory
|
||||
'geometry'.
|
||||
A data can also be the result of a simple operation. In that case, the
|
||||
simple operation is written after an '=' symbol (as for 'num_elec'). In
|
||||
that case, the data is read_only.
|
||||
|
||||
Once your configuration file is ready, run 'make' and your library will be
|
||||
built.
|
||||
|
||||
== Using the library ==
|
||||
|
||||
In the following, we will call 'EZFIO file' the main directory containing the
|
||||
EZFIO data.
|
||||
|
||||
Only one EZFIO file can be manipulated at a time. To select a file, use:
|
||||
character*(64) :: filename
|
||||
call ezfio_set_file(filename)
|
||||
To get the name of the current used EZFIO file, use
|
||||
character*(64) :: filename
|
||||
call ezfio_get_filename(filename)
|
||||
|
||||
For each data, 3 subroutines are created.
|
||||
<dir> is the name of the subdirectory which contains the data and
|
||||
<data> is the name of the data.
|
||||
|
||||
* subroutine ezfio_has_<dir>_<data> (result)
|
||||
sets result to .True. if the data exists in the EZFIO file, .False. otherwise.
|
||||
|
||||
* subroutine ezfio_set_<dir>_<data> (source)
|
||||
writes the source data to the EZFIO file.
|
||||
|
||||
* subroutine ezfio_get_<dir>_<data> (destination)
|
||||
reads the data from the EZFIO file to the destination.
|
||||
|
||||
For safety, a read-only attribute can be set to the file by
|
||||
call ezfio_set_read_only(.True.)
|
||||
or inquired by
|
||||
logical :: is_read_only
|
||||
call ezfio_is_read_only(is_read_only)
|
||||
|
||||
|
||||
|
340
README.rst
Normal file
340
README.rst
Normal file
@ -0,0 +1,340 @@
|
||||
EZFIO
|
||||
=====
|
||||
|
||||
EZFIO is the Easy Fortran I/O library generator. It generates
|
||||
automatically an I/O library from a simple configuration file. The
|
||||
produced library contains Fortran subroutines to read/write the data
|
||||
from/to disk, and to check if the data exists.
|
||||
A Python and an Ocaml API are also provided.
|
||||
|
||||
With EZFIO, the data is organized in a file system inside a main
|
||||
directory. This main directory contains subdirectories, which contain
|
||||
files. Each file corresponds to a data. For atomic data the file is a
|
||||
plain text file, and for array data the file is a gzipped text file.
|
||||
|
||||
Download
|
||||
========
|
||||
|
||||
The following packages are needed:
|
||||
|
||||
* `IRPF90 <http://irpf90.ups-tlse.fr>`_
|
||||
* `Python <http://www.python.org>`_
|
||||
|
||||
The latest version can be downloaded `here <http://qmcchem.ups-tlse.fr/files/scemama/EZFIO.latest.tar.gz>`_.
|
||||
|
||||
Tutorial
|
||||
========
|
||||
|
||||
In this example, we will write a Fortran program which computes
|
||||
properties of a molecule. The molecule is described as point charges in
|
||||
the 3D space.
|
||||
|
||||
Preparation of the library
|
||||
--------------------------
|
||||
|
||||
Create an empty directory for your project and unpack the ``EZFIO.tar.gz`` file in this directory. This directory now contains:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ ls
|
||||
EZFIO/
|
||||
|
||||
Get into the ``EZFIO`` directory and run:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ ./configure
|
||||
|
||||
Now, configure the library to produce the desired suboutines. Get into
|
||||
the ``config`` directory and create a new file ``test.config``
|
||||
containing::
|
||||
|
||||
molecule
|
||||
num_atoms integer
|
||||
mass real (molecule_num_atoms)
|
||||
coord real (3,molecule_num_atoms)
|
||||
|
||||
properties
|
||||
mass real = sum(molecule_mass)
|
||||
center_of_mass real (3)
|
||||
|
||||
|
||||
In this example, ``molecule`` and ``properties`` are containers of data.
|
||||
Those are defined in the config file by their name at the beginning of a
|
||||
new line.
|
||||
Each data contained inside a container is characterized by a triplet
|
||||
(name,type,dimension), preceded by at least one white space at the
|
||||
beginning of the line.
|
||||
|
||||
If the dimension of an array is a data, the name of the data can be used
|
||||
as ``<container>_<data>`` in the definition of the dimension. For
|
||||
example, the dimension (``molecule_num_atoms``) uses the data
|
||||
``num_atoms`` of container ``molecule``.
|
||||
|
||||
Data can also be the result of a simple operation. In that case, the
|
||||
simple operation is written after an = symbol (as for ``mass`` in the
|
||||
``properties`` container). In that case, the data is read-only.
|
||||
|
||||
Once your configuration file is ready, run ``make`` and your library
|
||||
will be built.
|
||||
|
||||
Building the library
|
||||
--------------------
|
||||
|
||||
Now, go back to the EZFIO root directory, and run:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ make
|
||||
|
||||
The ``lib`` directory now contains the shared library
|
||||
(``libezfio.so``), the static library (``libezfio.a``), and a static
|
||||
library for use under the IRPF90 environment (``libezfio_irp.a``).
|
||||
The ``Python`` directory contains the Python module for the use of the library in Python.
|
||||
|
||||
Using the produced library
|
||||
--------------------------
|
||||
|
||||
In the following, we will call 'EZFIO file' the main directory
|
||||
containing the EZFIO data.
|
||||
|
||||
All the produced libraries contain the following subroutines:
|
||||
|
||||
subroutine ezfio_set_read_only(ro)
|
||||
If ``ro`` is .True., the read-only attribute is set. It will be
|
||||
impossible to write to the EZFIO file.
|
||||
|
||||
subroutine ezfio_is_read_only(ro)
|
||||
Returns the value of the read_only attribute to ``ro``.
|
||||
|
||||
subroutine ezfio_set_file(filename)
|
||||
Only one EZFIO can be manipulated at a time. This subroutine selects
|
||||
which file will be manipulated.
|
||||
|
||||
subroutine ezfio_get_filename(fname)
|
||||
Returns the name of the EZFIO file which is currently manipulated.
|
||||
|
||||
For each data, 3 subroutines are created.
|
||||
<dir> is the name of the container which contains the data and
|
||||
<data> is the name of the data.
|
||||
|
||||
subroutine ezfio_has_<dir>_<data> (has_it)
|
||||
``has_it`` is .True. if the data exists in the EZFIO file, .False. otherwise.
|
||||
|
||||
subroutine ezfio_set_<dir>_<data> (source)
|
||||
writes the source data to the EZFIO file.
|
||||
|
||||
subroutine ezfio_get_<dir>_<data> (destination)
|
||||
reads the data from the EZFIO file to the destination.
|
||||
|
||||
With our example, the library contains the following subroutines:
|
||||
|
||||
.. code-block:: fortran
|
||||
|
||||
subroutine ezfio_set_read_only(ro)
|
||||
subroutine ezfio_is_read_only(ro)
|
||||
subroutine ezfio_set_file(filename)
|
||||
subroutine ezfio_get_filename(filename)
|
||||
|
||||
subroutine ezfio_set_molecule_num_atoms(num_atoms)
|
||||
subroutine ezfio_get_molecule_num_atoms(num_atoms)
|
||||
subroutine ezfio_has_molecule_num_atoms(has_it)
|
||||
|
||||
subroutine ezfio_set_molecule_mass(mass)
|
||||
subroutine ezfio_get_molecule_mass(mass)
|
||||
subroutine ezfio_has_molecule_mass(has_it)
|
||||
|
||||
subroutine ezfio_set_molecule_coord(coord)
|
||||
subroutine ezfio_get_molecule_coord(coord)
|
||||
subroutine ezfio_has_molecule_coord(has_it)
|
||||
|
||||
subroutine ezfio_get_properties_mass(mass)
|
||||
|
||||
subroutine ezfio_set_properties_center_of_mass(center_of_mass)
|
||||
subroutine ezfio_get_properties_center_of_mass(center_of_mass)
|
||||
subroutine ezfio_has_properties_center_of_mass(has_it)
|
||||
|
||||
subroutine ezfio_set_properties_center_of_charge(center_of_charge)
|
||||
subroutine ezfio_get_properties_center_of_charge(center_of_charge)
|
||||
subroutine ezfio_has_properties_center_of_charge(has_it)
|
||||
|
||||
Note that ``ezfio_get_properties_mass`` has only the ``get`` subroutine
|
||||
since it is computed data.
|
||||
|
||||
In Python
|
||||
---------
|
||||
|
||||
All the subroutines are also produced for Python in the ezfio.py file in
|
||||
the Python directory. To use them, in your Python script, use:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
import sys
|
||||
EZFIO = "./EZFIO" # Put here the absolute path to the EZFIO directory
|
||||
sys.path = [ EZFIO+"/Python" ]+sys.path
|
||||
from ezfio import ezfio
|
||||
|
||||
and all the subroutines will be accessible by replacing the first
|
||||
underscore character of the name of the subroutine by a dot (``ezfio_``
|
||||
becomes ``ezfio.``).
|
||||
|
||||
Let us create the input of our Fortran program with a Python script.
|
||||
Create a file named ``create_input.py`` with:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
#!/usr/bin/python
|
||||
|
||||
import sys
|
||||
EZFIO = "./EZFIO" # Put here the absolute path to the EZFIO directory
|
||||
sys.path = [ EZFIO+"/Python" ]+sys.path
|
||||
from ezfio import ezfio
|
||||
|
||||
# Water molecule:
|
||||
# mass, x, y, z
|
||||
input = """16. 0.000000 0.222396 0.000000
|
||||
1. 1.436494 -0.889660 0.000000
|
||||
1. -1.436494 -0.889660 0.000000 """
|
||||
|
||||
Molecule = []
|
||||
for line in input.splitlines():
|
||||
new_list = map(eval,line.split())
|
||||
Molecule.append(new_list)
|
||||
|
||||
# Create the mass array
|
||||
mass = map( lambda x: x[0], Molecule )
|
||||
# print mass
|
||||
# [16.0, 1.0, 1.0]
|
||||
|
||||
# Create the coord array
|
||||
coord = map( lambda x: (x[1], x[2], x[3]), Molecule )
|
||||
# print coord
|
||||
# [(0.0, 0.222396, 0.0), (1.436494, -0.88966, 0.0), (-1.436494, -0.88966, 0.0)]
|
||||
|
||||
# Select the EZFIO file
|
||||
ezfio.set_file("Water")
|
||||
|
||||
# Add the arrays to the file
|
||||
ezfio.molecule_num_atoms = len(Molecule)
|
||||
ezfio.molecule_mass = mass
|
||||
ezfio.molecule_coord = coord
|
||||
|
||||
# Check that the total charge and mass is correct:
|
||||
print ezfio.properties_mass # Should give 18.
|
||||
|
||||
Execute the script:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ python create_input.py
|
||||
18.0
|
||||
|
||||
The printed mass is correct, and a new directory (``Water``) was created with our data:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ ls Water/*
|
||||
Water/ezfio:
|
||||
creation
|
||||
|
||||
Water/molecule:
|
||||
charge.gz coord.gz mass.gz num_atoms
|
||||
|
||||
In Fortran
|
||||
----------
|
||||
|
||||
We will create here a Fortran program which reads the atomic coordinates
|
||||
and the atomic masses from an EZFIO file, computes the coordinates of
|
||||
the center of mass, and writes the coordinates of the center of mass to
|
||||
the EZFIO file.
|
||||
|
||||
.. code-block:: fortran
|
||||
|
||||
program test
|
||||
implicit none
|
||||
integer :: num_atoms
|
||||
real, allocatable :: mass(:)
|
||||
real, allocatable :: coord(:,:)
|
||||
real :: center_of_mass(3)
|
||||
real :: total_mass
|
||||
integer :: i,j
|
||||
|
||||
! Set which file is read/written
|
||||
call ezfio_set_file("Water")
|
||||
|
||||
! Read the number of atoms
|
||||
call ezfio_get_molecule_num_atoms(num_atoms)
|
||||
|
||||
! Allocate the mass and coord arrays
|
||||
allocate(mass(num_atoms), coord(3,num_atoms))
|
||||
|
||||
! Read the arrays from the file
|
||||
call ezfio_get_molecule_mass(mass)
|
||||
call ezfio_get_molecule_coord(coord)
|
||||
|
||||
! Check that the read data is correct
|
||||
print *, 'Data in the EZFIO file:'
|
||||
do i=1,num_atoms
|
||||
print *, mass(i), (coord(j,i),j=1,3)
|
||||
end do
|
||||
! prints:
|
||||
! Data in the EZFIO file:
|
||||
! 16.00000 0.000000 0.2223960 0.000000
|
||||
! 1.000000 1.436494 -0.8896600 0.000000
|
||||
! 1.000000 -1.436494 -0.8896600 0.000000
|
||||
|
||||
! Perform the calculation of the center of mass
|
||||
do j=1,3
|
||||
center_of_mass(j) = 0.
|
||||
end do
|
||||
|
||||
do i=1,num_atoms
|
||||
do j=1,3
|
||||
center_of_mass(j) = center_of_mass(j) + mass(i)*coord(j,i)
|
||||
end do
|
||||
end do
|
||||
|
||||
call ezfio_get_properties_mass(total_mass)
|
||||
do j=1,3
|
||||
center_of_mass(j) = center_of_mass(j)/total_mass
|
||||
end do
|
||||
|
||||
deallocate(mass, coord)
|
||||
|
||||
! Write the center of mass to the EZFIO file
|
||||
call ezfio_set_properties_center_of_mass(center_of_mass)
|
||||
|
||||
end
|
||||
|
||||
A new directory (``properties``) was created with the center_of_mass
|
||||
file:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ ls Water/*
|
||||
Water/ezfio:
|
||||
creation
|
||||
|
||||
Water/molecule:
|
||||
charge.gz coord.gz mass.gz num_atoms
|
||||
|
||||
Water/properties:
|
||||
center_of_mass.gz
|
||||
|
||||
|
||||
Compile and run the program using:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ $FC -o test test.F90 EZFIO/lib/libezfio.a
|
||||
$ ./test
|
||||
|
||||
where ``$FC`` is your fortran compiler, and ``test.F90`` is the file
|
||||
containing the test example. If you don't have the EZFIO static
|
||||
library, you can use the shared library as:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/EZFIO/lib
|
||||
$ $FC -o test -L./EZFIO/lib -lezfio
|
||||
|
0
config/.empty
Normal file
0
config/.empty
Normal file
5
config/ezfio.config
Normal file
5
config/ezfio.config
Normal file
@ -0,0 +1,5 @@
|
||||
ezfio
|
||||
creation character*(64)
|
||||
user character*(64)
|
||||
library character*(2048)
|
||||
last_library character*(2048)
|
134
configure.ac
Normal file
134
configure.ac
Normal file
@ -0,0 +1,134 @@
|
||||
# EZFIO is an automatic generator of I/O libraries
|
||||
# Copyright (C) 2009 Anthony SCEMAMA, CNRS
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along
|
||||
# with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Anthony Scemama
|
||||
# LCPQ - IRSAMC - CNRS
|
||||
# Universite Paul Sabatier
|
||||
# 118, route de Narbonne
|
||||
# 31062 Toulouse Cedex 4
|
||||
# scemama@irsamc.ups-tlse.fr
|
||||
# -*- Autoconf -*-
|
||||
# Process this file with autoconf to produce a configure script.
|
||||
|
||||
VERSION=[`. version ; echo $VERSION`]
|
||||
AC_SUBST([VERSION])
|
||||
|
||||
AC_REVISION([$Revision: $VERSION $])
|
||||
|
||||
AC_PREREQ([2.50])
|
||||
|
||||
AC_INIT([EZFIO Library Generator], [], [scemama@irsamc.ups-tlse.fr],[ezfio],[http://ezfio.sourceforge.net])
|
||||
|
||||
AC_SYS_LONG_FILE_NAMES
|
||||
ROOT=`pwd`
|
||||
AC_SUBST([ROOT])
|
||||
|
||||
AC_CONFIG_SRCDIR([src/run.irp.f])
|
||||
AC_CONFIG_FILES([make.config])
|
||||
AC_PREFIX_DEFAULT([./])
|
||||
|
||||
STATIC_LIB=$ROOT/lib/libezfio.a
|
||||
|
||||
AC_PROG_RANLIB
|
||||
|
||||
# Test Fortran
|
||||
# ------------
|
||||
|
||||
AC_LANG([Fortran])
|
||||
AC_PROG_FC([ifort gfortran],[Fortran 90])
|
||||
AC_PROG_FC_C_O
|
||||
AC_FC_SRCEXT([F90])
|
||||
AC_FC_FREEFORM
|
||||
|
||||
# Test Python
|
||||
# ------------
|
||||
|
||||
AC_CHECK_PROG([PYTHON],[python],[yes],[no])
|
||||
if [[ "$PYTHON" = no ]] ; then
|
||||
AC_MSG_ERROR([Please install Python.])
|
||||
fi
|
||||
|
||||
# Test AR
|
||||
# -------
|
||||
|
||||
if [[ -z "$AR" ]] ; then
|
||||
AC_CHECK_PROG([AR],[ar],[yes],[no])
|
||||
if [[ "$AR" = no ]] ; then
|
||||
AC_MSG_ERROR([ar not found.])
|
||||
fi
|
||||
AR=ar
|
||||
fi
|
||||
AC_SUBST([AR])
|
||||
|
||||
# Test Gzip and zcat
|
||||
# ------------------
|
||||
|
||||
if [[ -z "$HAS_GZIP" ]] ; then
|
||||
AC_CHECK_PROG([GZIP],[gzip],[yes],[no])
|
||||
if [[ "$GZIP" = no ]] ; then
|
||||
HAS_GZIP="-DNO_GZIP"
|
||||
fi
|
||||
|
||||
AC_CHECK_PROG([ZCAT],[zcat],[yes],[no])
|
||||
if [[ "$ZCAT" = no ]] ; then
|
||||
HAS_GZIP="-DNO_GZIP"
|
||||
fi
|
||||
|
||||
AC_CHECK_PROG([MKFIFO],[mkfifo],[yes],[no])
|
||||
if [[ "$MKFIFO" = no ]] ; then
|
||||
HAS_GZIP="-DNO_GZIP"
|
||||
fi
|
||||
fi
|
||||
AC_SUBST([HAS_GZIP])
|
||||
|
||||
# Test IRPF90
|
||||
# ------------
|
||||
|
||||
if [[ -z "$IRPF90" ]] ; then
|
||||
AC_CHECK_PROG([IRPF90],[irpf90],[yes],[no])
|
||||
if [[ "$IRPF90" = no ]] ; then
|
||||
AC_MSG_ERROR([Please install IRPF90:\nhttp://irpf90.ups-tlse.fr])
|
||||
fi
|
||||
IRPF90=`which irpf90`
|
||||
fi
|
||||
AC_SUBST([IRPF90])
|
||||
|
||||
if [[ -z "$FCFLAGS" ]] ; then
|
||||
case $FC in
|
||||
ifort*)
|
||||
FCFLAGS="-O2 -g -ip"
|
||||
STATIC_FC="-static-intel -static-libgcc -static"
|
||||
;;
|
||||
gfortran*)
|
||||
FCFLAGS="-O2 -g -ffree-line-length-none"
|
||||
STATIC_FC="-static-libgcc -static"
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# Write make.config
|
||||
|
||||
LIB="$STATIC_LIB"
|
||||
FCFLAGS="$FCFLAGS $STATIC_FC"
|
||||
AC_SUBST([LIB])
|
||||
|
||||
# Done
|
||||
#-----
|
||||
|
||||
AC_OUTPUT
|
||||
|
||||
|
13
git-tools/commit-msg
Executable file
13
git-tools/commit-msg
Executable file
@ -0,0 +1,13 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
import os,sys
|
||||
ROOT = os.path.dirname(__file__)+'/../../'
|
||||
file = open(ROOT+'version','r')
|
||||
lines = file.readlines()
|
||||
file.close()
|
||||
file = open(sys.argv[1],'a')
|
||||
print >>file, 'Version:'+lines[0].split('=')[1]
|
||||
file.close()
|
||||
|
||||
|
||||
|
10
git-tools/install_tools.sh
Executable file
10
git-tools/install_tools.sh
Executable file
@ -0,0 +1,10 @@
|
||||
#!/bin/bash
|
||||
|
||||
OLD_DIR=$PWD
|
||||
cd ../.git/hooks/
|
||||
|
||||
for i in commit-msg post-commit
|
||||
do
|
||||
rm $i
|
||||
ln -s $OLD_DIR/$i $PWD/$i
|
||||
done
|
17
git-tools/post-commit
Executable file
17
git-tools/post-commit
Executable file
@ -0,0 +1,17 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
import os
|
||||
ROOT = os.path.dirname(__file__)+'/../../'
|
||||
|
||||
file = open(ROOT+'version','r') ;
|
||||
lines = file.readlines() ;
|
||||
file.close() ;
|
||||
v = map(int,lines[0].split('=')[1].split('.'));
|
||||
|
||||
v[2] += 1
|
||||
lines[0] = "VERSION=%d.%d.%d\n"%tuple(v)
|
||||
|
||||
file = open(ROOT+'version','w')
|
||||
file.writelines(lines)
|
||||
file.close()
|
||||
|
0
lib/.empty
Normal file
0
lib/.empty
Normal file
5
make.config.in
Normal file
5
make.config.in
Normal file
@ -0,0 +1,5 @@
|
||||
IRPF90 = @IRPF90@ @HAS_GZIP@
|
||||
FC = @FC@ -fPIC
|
||||
FCFLAGS= @FCFLAGS@
|
||||
RANLIB = @RANLIB@
|
||||
AR = @AR@
|
59
src/Makefile
Normal file
59
src/Makefile
Normal file
@ -0,0 +1,59 @@
|
||||
# EZFIO is an automatic generator of I/O libraries
|
||||
# Copyright (C) 2009 Anthony SCEMAMA, CNRS
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along
|
||||
# with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Anthony Scemama
|
||||
# LCPQ - IRSAMC - CNRS
|
||||
# Universite Paul Sabatier
|
||||
# 118, route de Narbonne
|
||||
# 31062 Toulouse Cedex 4
|
||||
# scemama@irsamc.ups-tlse.fr
|
||||
|
||||
DEFAULT_TARGET: python
|
||||
|
||||
../make.config:
|
||||
make -C .. make.config
|
||||
include ../make.config
|
||||
|
||||
include irpf90.make
|
||||
|
||||
irpf90.make: $(wildcard *.irp.f) ../config/*
|
||||
$(IRPF90)
|
||||
|
||||
include ../version
|
||||
|
||||
.PHONY: python static
|
||||
|
||||
static: ../lib/libezfio_irp.a ../lib/libezfio.a
|
||||
|
||||
../lib/libezfio.a: $(OBJ1)
|
||||
- bash -c "[[ -e ../libezfio.a ]] && rm ../lib/libezfio.a"
|
||||
$(AR) cru ../lib/libezfio.a $(OBJ1)
|
||||
$(RANLIB) ../lib/libezfio.a
|
||||
|
||||
../lib/libezfio_irp.a: ../lib/libezfio.a
|
||||
cp ../lib/libezfio.a ../lib/libezfio_irp.a
|
||||
$(AR) dv ../lib/libezfio_irp.a irp_stack.irp.o
|
||||
$(RANLIB) ../lib/libezfio_irp.a
|
||||
|
||||
test: static
|
||||
ifort -o $@ IRPF90_temp/run.irp.F90 -L../lib/ -lezfio
|
||||
|
||||
python: static
|
||||
cat ezfio-head.py libezfio_groups-gen.py libezfio_util-gen.py ezfio-tail.py > ../Python/ezfio.py
|
||||
|
||||
ezfio.py: python
|
||||
|
89
src/create_ocaml.py
Executable file
89
src/create_ocaml.py
Executable file
@ -0,0 +1,89 @@
|
||||
#!/usr/bin/env python
|
||||
# EZFIO is an automatic generator of I/O libraries
|
||||
# Copyright (C) 2009 Anthony SCEMAMA, CNRS
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along
|
||||
# with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Anthony Scemama
|
||||
# LCPQ - IRSAMC - CNRS
|
||||
# Universite Paul Sabatier
|
||||
# 118, route de Narbonne
|
||||
# 31062 Toulouse Cedex 4
|
||||
# scemama@irsamc.ups-tlse.fr
|
||||
|
||||
import re
|
||||
from read_config import groups
|
||||
from groups_templates import *
|
||||
from f_types import t_short, f2ocaml
|
||||
import os
|
||||
|
||||
import sys
|
||||
|
||||
def run():
|
||||
|
||||
head = []
|
||||
tail = []
|
||||
|
||||
file = open("../version","r")
|
||||
v = file.readline()
|
||||
file.close()
|
||||
v = v.split('=')[1].strip()
|
||||
l = os.getcwd().replace('/src','')
|
||||
head += ["""let version = "%s";;"""%(v),
|
||||
"""let library = "%s";;"""%(l)]
|
||||
|
||||
for group in groups.keys():
|
||||
for var,type,dims,command in groups[group]:
|
||||
if command is not "":
|
||||
continue
|
||||
dims_py = str(dims)
|
||||
for g in groups.keys():
|
||||
dims_py = dims_py.replace(g,'self.'+g)
|
||||
var = var.lower()
|
||||
group = group.lower()
|
||||
strdims = tuple(map(lambda x: '('+str(x)+')',dims))
|
||||
strdims = str(strdims).replace("'","")
|
||||
if len(dims) == 1:
|
||||
strdims = strdims[:-2]+")"
|
||||
dim_max = strdims[1:-1].replace(',','*')
|
||||
type_set = type
|
||||
if type.lower().startswith('character'):
|
||||
type_set = 'character*(*)'
|
||||
d = { 'type_short': f2ocaml[t_short(type)],
|
||||
'type': type,
|
||||
'type_set': type_set,
|
||||
'var': var,
|
||||
'group': group,
|
||||
'dims': strdims}
|
||||
if dims == ():
|
||||
tail += ['let get_%(group)s_%(var)s () = read_%(type_short)s "%(group)s" "%(var)s";;' %(d),
|
||||
'let set_%(group)s_%(var)s = write_%(type_short)s "%(group)s" "%(var)s" ;;' %(d) ,
|
||||
'let has_%(group)s_%(var)s () = has "%(group)s" "%(var)s" ;;' %(d) ]
|
||||
else:
|
||||
tail += ['let get_%(group)s_%(var)s () = read_%(type_short)s_array "%(group)s" "%(var)s";;' %(d),
|
||||
'let set_%(group)s_%(var)s = write_%(type_short)s_array "%(group)s" "%(var)s";;' %(d) ,
|
||||
'let has_%(group)s_%(var)s () = has_array "%(group)s" "%(var)s" ;;' %(d) ]
|
||||
|
||||
|
||||
file = open('ezfio.ml','r')
|
||||
template = file.read()
|
||||
file.close()
|
||||
template = template.replace("(*$HEAD*)",'\n'.join(head))
|
||||
template = template.replace("(*$TAIL*)",'\n'.join(tail))
|
||||
|
||||
file = open('../Ocaml/ezfio.ml','w')
|
||||
file.write(template)
|
||||
file.close()
|
||||
|
256
src/ezfio-head.py
Normal file
256
src/ezfio-head.py
Normal file
@ -0,0 +1,256 @@
|
||||
# EZFIO is an automatic generator of I/O libraries
|
||||
# Copyright (C) 2009 Anthony SCEMAMA, CNRS
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along
|
||||
# with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Anthony Scemama
|
||||
# LCPQ - IRSAMC - CNRS
|
||||
# Universite Paul Sabatier
|
||||
# 118, route de Narbonne
|
||||
# 31062 Toulouse Cedex 4
|
||||
# scemama@irsamc.ups-tlse.fr
|
||||
|
||||
import os, sys
|
||||
import time
|
||||
import cStringIO as StringIO
|
||||
from gzip import GzipFile
|
||||
import tempfile
|
||||
import threading
|
||||
|
||||
def version(x):
|
||||
b = [int(i) for i in x.split('.')]
|
||||
return b[2] + b[1]*100 + b[0]*10000
|
||||
|
||||
def size(x):
|
||||
return len(x)
|
||||
|
||||
def flatten(l):
|
||||
res = []
|
||||
for i in l:
|
||||
if hasattr(i, "__iter__") and not isinstance(i, basestring):
|
||||
res.extend(flatten(i))
|
||||
else:
|
||||
res.append(i)
|
||||
return res
|
||||
|
||||
def maxval(l):
|
||||
return reduce(max, l, l[0])
|
||||
|
||||
def minval(l):
|
||||
return reduce(min, l, l[0])
|
||||
|
||||
|
||||
def reshape(l,shape):
|
||||
l = flatten(l)
|
||||
for d in shape[:-1]:
|
||||
buffer = []
|
||||
buffer2 = []
|
||||
i=0
|
||||
while i<len(l):
|
||||
buffer2.append(l[i])
|
||||
if len(buffer2) == d:
|
||||
buffer.append(buffer2)
|
||||
buffer2 = []
|
||||
i+=1
|
||||
l = list(buffer)
|
||||
return l
|
||||
|
||||
def at(array,index):
|
||||
return array[index-1]
|
||||
|
||||
def n_count_ch(array,isize,val):
|
||||
result = 0
|
||||
for i in array:
|
||||
if i == val:
|
||||
result +=1
|
||||
return result
|
||||
|
||||
n_count_in = n_count_ch
|
||||
n_count_do = n_count_ch
|
||||
n_count_lo = n_count_ch
|
||||
|
||||
|
||||
def get_conv(type):
|
||||
if type in ["do","re"]:
|
||||
conv = float
|
||||
elif type in ["in","i8"]:
|
||||
conv = int
|
||||
elif type == "lo":
|
||||
def conv(a):
|
||||
if a == True:
|
||||
return 'T'
|
||||
elif a == False:
|
||||
return 'F'
|
||||
elif a.lower() == 't':
|
||||
return True
|
||||
elif a.lower() == 'f':
|
||||
return False
|
||||
else:
|
||||
raise TypeError
|
||||
elif type == "ch":
|
||||
conv = lambda x: x.strip()
|
||||
else:
|
||||
raise TypeError
|
||||
return conv
|
||||
|
||||
class ezfio_obj(object):
|
||||
|
||||
def __init__(self,read_only=False):
|
||||
self._filename = "EZFIO_File"
|
||||
self.buffer_rank = -1
|
||||
self.read_only = read_only
|
||||
self.locks = {}
|
||||
|
||||
def acquire_lock(self,var):
|
||||
locks = self.locks
|
||||
try:
|
||||
locks[var].acquire()
|
||||
except:
|
||||
locks[var] = threading.Lock()
|
||||
locks[var].acquire()
|
||||
|
||||
def release_lock(self,var):
|
||||
self.locks[var].release()
|
||||
|
||||
def set_read_only(self,v):
|
||||
self.read_only = v
|
||||
|
||||
def get_read_only(self):
|
||||
return self.read_only
|
||||
|
||||
def exists(self,path):
|
||||
if os.access(path+'/.version',os.F_OK) == 1:
|
||||
file = open(path+'/.version',"r")
|
||||
v = file.readline().strip()
|
||||
file.close()
|
||||
else:
|
||||
return False
|
||||
|
||||
def mkdir(self,path):
|
||||
if self.read_only:
|
||||
self.error('Read-only file.')
|
||||
if self.exists(path):
|
||||
self.error('mkdir','Group '+path+' exists')
|
||||
try:
|
||||
os.mkdir(path.strip())
|
||||
except OSError:
|
||||
pass
|
||||
file = open(path.strip()+'/.version','w')
|
||||
print >>file,self.version
|
||||
file.close()
|
||||
|
||||
def error(self,where,txt):
|
||||
print '------------------------------------------------------------'
|
||||
print 'EZFIO File : '+self.filename
|
||||
print 'EZFIO Error in : '+where.strip()
|
||||
print '------------------------------------------------------------'
|
||||
print ''
|
||||
print txt.strip()
|
||||
print ''
|
||||
print '------------------------------------------------------------'
|
||||
raise IOError
|
||||
|
||||
def get_filename(self):
|
||||
if not self.exists(self._filename):
|
||||
self.mkdir(self._filename)
|
||||
return self._filename
|
||||
|
||||
def set_filename(self,filename):
|
||||
self._filename = filename
|
||||
|
||||
filename = property(fset=set_filename,fget=get_filename)
|
||||
|
||||
def set_file(self,filename):
|
||||
self.filename = filename
|
||||
if not self.exists(filename):
|
||||
self.mkdir(filename)
|
||||
self.mkdir(filename+"/ezfio")
|
||||
os.system("""
|
||||
LANG= date > %s/ezfio/creation
|
||||
echo $USER > %s/ezfio/user
|
||||
echo %s > %s/ezfio/library"""%(filename,filename,self.LIBRARY,filename))
|
||||
|
||||
def open_write_buffer(self,dir,fil,rank):
|
||||
if self.read_only:
|
||||
self.error('Read-only file.')
|
||||
l_filename=dir.strip()+'/'+fil+'.gz'
|
||||
if self.buffer_rank != -1:
|
||||
self.error('open_write_buffer','Another buffered file is already open.')
|
||||
|
||||
self.buffer_rank = rank
|
||||
assert (self.buffer_rank > 0)
|
||||
|
||||
try:
|
||||
self.file = GzipFile(filename=l_filename,mode='wb7')
|
||||
except IOError:
|
||||
self.error('open_write_buffer','Unable to open buffered file.')
|
||||
|
||||
self.file.write("%2d\n"%(rank,))
|
||||
|
||||
|
||||
def open_read_buffer(self,dir,fil,rank):
|
||||
l_filename=dir.strip()+'/'+fil+'.gz'
|
||||
|
||||
if self.buffer_rank != -1:
|
||||
self.error('open_read_buffer','Another buffered file is already open.')
|
||||
|
||||
try:
|
||||
self.file = GzipFile(filename=l_filename,mode='rb')
|
||||
except IOError:
|
||||
self.error('open_read_buffer','Unable to open buffered file.')
|
||||
|
||||
try:
|
||||
rank = eval(self.file.readline())
|
||||
except IOError:
|
||||
self.error('open_read_buffer','Unable to read buffered file.')
|
||||
|
||||
self.buffer_rank = rank
|
||||
assert (self.buffer_rank > 0)
|
||||
return rank
|
||||
|
||||
def close_buffer(self):
|
||||
assert (self.buffer_rank > 0)
|
||||
self.buffer_rank = -1
|
||||
self.file.close()
|
||||
|
||||
def read_buffer(self,isize):
|
||||
|
||||
if self.buffer_rank == -1:
|
||||
self.error('read_buffer','No buffered file is open.')
|
||||
|
||||
indices = []
|
||||
values = []
|
||||
for i in xrange(isize):
|
||||
try:
|
||||
line = self.file.readline().split()
|
||||
except:
|
||||
return indices, values
|
||||
if len(line) == 0:
|
||||
return indices, values
|
||||
indices.append ( [ int(i) for i in line[:-1] ] )
|
||||
values.append (eval(line[-1]))
|
||||
return indices, values
|
||||
|
||||
def write_buffer(self,indices,values,isize):
|
||||
if self.read_only:
|
||||
self.error('Read-only file.')
|
||||
if self.buffer_rank == -1:
|
||||
self.error('write_buffer','No buffered file is open.')
|
||||
|
||||
for i in xrange(isize):
|
||||
for j in indices[i]:
|
||||
self.file.write("%4d "%(j,))
|
||||
self.file.write("%24.15e\n"%(values[i],))
|
||||
|
26
src/ezfio-tail.py
Normal file
26
src/ezfio-tail.py
Normal file
@ -0,0 +1,26 @@
|
||||
# EZFIO is an automatic generator of I/O libraries
|
||||
# Copyright (C) 2009 Anthony SCEMAMA, CNRS
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along
|
||||
# with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Anthony Scemama
|
||||
# LCPQ - IRSAMC - CNRS
|
||||
# Universite Paul Sabatier
|
||||
# 118, route de Narbonne
|
||||
# 31062 Toulouse Cedex 4
|
||||
# scemama@irsamc.ups-tlse.fr
|
||||
|
||||
ezfio = ezfio_obj()
|
||||
|
421
src/ezfio.ml
Normal file
421
src/ezfio.ml
Normal file
@ -0,0 +1,421 @@
|
||||
(*
|
||||
EZFIO is an automatic generator of I/O libraries
|
||||
Copyright (C) 2009 Anthony SCEMAMA, CNRS
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
Anthony Scemama
|
||||
LCPQ - IRSAMC - CNRS
|
||||
Universite Paul Sabatier
|
||||
118, route de Narbonne
|
||||
31062 Toulouse Cedex 4
|
||||
scemama@irsamc.ups-tlse.fr
|
||||
*)
|
||||
|
||||
(*$HEAD*)
|
||||
|
||||
(*
|
||||
Exceptions
|
||||
==========
|
||||
*)
|
||||
|
||||
exception Read_only of string;;
|
||||
|
||||
(*
|
||||
State variables
|
||||
===============
|
||||
*)
|
||||
let read_only = ref false;;
|
||||
let ezfio_filename = ref "EZFIO_File";;
|
||||
|
||||
(*
|
||||
Helper functions
|
||||
=================
|
||||
*)
|
||||
|
||||
let check_readonly =
|
||||
if !read_only then
|
||||
raise (Read_only "Read only attribute is set");
|
||||
;;
|
||||
|
||||
let exists path =
|
||||
let filename = path^"/.version" in
|
||||
Sys.file_exists filename
|
||||
;;
|
||||
|
||||
let has group name =
|
||||
let dirname = !ezfio_filename ^ "/" ^ group in
|
||||
if (exists dirname) then
|
||||
(Sys.file_exists (dirname ^ "/" ^ name) )
|
||||
else
|
||||
false
|
||||
;;
|
||||
|
||||
let has_array group name = has group (name^".gz");;
|
||||
|
||||
let mkdir path =
|
||||
check_readonly;
|
||||
if (exists path) then
|
||||
raise (Failure (path^" already exists"));
|
||||
Unix.mkdir path 0o777;
|
||||
let out_channel = open_out (path^"/.version") in
|
||||
Printf.fprintf out_channel "%s\n" version ;
|
||||
close_out out_channel;
|
||||
;;
|
||||
|
||||
let create_group group =
|
||||
let dirname = !ezfio_filename ^ "/" ^ group in
|
||||
if not (exists dirname) then
|
||||
mkdir dirname;
|
||||
;;
|
||||
|
||||
let split line s =
|
||||
let rec do_work lst word = function
|
||||
| 0 -> word::lst
|
||||
| i ->
|
||||
begin
|
||||
match line.[i-1] with
|
||||
| a when a == s ->
|
||||
if word <> "" then
|
||||
do_work (word::lst) "" (i-1)
|
||||
else
|
||||
do_work lst "" (i-1)
|
||||
| a -> do_work lst ( (Char.escaped a)^word) (i-1)
|
||||
end
|
||||
in do_work [] "" (String.length line)
|
||||
;;
|
||||
|
||||
let ltrim s =
|
||||
let rec do_work s l =
|
||||
match s.[0] with
|
||||
| '\n'
|
||||
| ' ' -> do_work (String.sub s 1 (l-1)) (l-1)
|
||||
| _ -> s
|
||||
in
|
||||
do_work s (String.length s)
|
||||
;;
|
||||
|
||||
let rtrim s =
|
||||
let rec do_work s l =
|
||||
let newl = l-1 in
|
||||
match s.[newl] with
|
||||
| '\n'
|
||||
| ' ' -> do_work (String.sub s 0 (newl)) (newl)
|
||||
| _ -> s
|
||||
in
|
||||
do_work s (String.length s)
|
||||
;;
|
||||
|
||||
let trim s = ltrim (rtrim s) ;;
|
||||
|
||||
let maxval l =
|
||||
match l with
|
||||
| [] -> None
|
||||
| [a] -> Some a
|
||||
| hd::tail -> Some (List.fold_left max hd tail)
|
||||
;;
|
||||
|
||||
let minval l =
|
||||
match l with
|
||||
| [] -> None
|
||||
| [a] -> Some a
|
||||
| hd::tail -> Some (List.fold_left min hd tail)
|
||||
;;
|
||||
|
||||
let at arr idx = arr.(idx);;
|
||||
|
||||
let size (_) = 0;;
|
||||
|
||||
let n_count_ch (str,_,v) =
|
||||
let rec do_work accu = function
|
||||
| 0 -> accu
|
||||
| i ->
|
||||
let newaccu =
|
||||
if str.[i-1] == v then accu+1
|
||||
else accu
|
||||
in do_work newaccu (i-1)
|
||||
in do_work 0 (String.length str)
|
||||
;;
|
||||
|
||||
let n_count (l,_,v) =
|
||||
let rec do_work accu = function
|
||||
| [] -> accu
|
||||
| h::tail ->
|
||||
let newaccu =
|
||||
if h == v then accu+1
|
||||
else accu
|
||||
in do_work newaccu tail
|
||||
in do_work 0 l
|
||||
;;
|
||||
|
||||
(*
|
||||
Scalars
|
||||
=======
|
||||
*)
|
||||
|
||||
(*
|
||||
Read
|
||||
----
|
||||
*)
|
||||
|
||||
let read_scalar type_conversion group name =
|
||||
let in_filename = !ezfio_filename ^ "/" ^ group ^ "/" ^ name in
|
||||
let in_channel = open_in in_filename in
|
||||
let trimmed_line = trim (input_line in_channel) in
|
||||
let result = type_conversion trimmed_line in
|
||||
begin
|
||||
close_in in_channel ;
|
||||
result
|
||||
end
|
||||
;;
|
||||
|
||||
let fortran_bool_of_string = function
|
||||
| "T" | "t" -> true
|
||||
| "F" | "f" -> false
|
||||
| x -> raise (Failure ("fortran_bool_of_string should be T or F: "^x))
|
||||
;;
|
||||
|
||||
let fortran_string_of_bool = function
|
||||
| true -> "T\n"
|
||||
| false-> "F\n"
|
||||
;;
|
||||
|
||||
let read_int = read_scalar int_of_string ;;
|
||||
let read_float = read_scalar float_of_string ;;
|
||||
let read_string= read_scalar (fun (x:string) -> x);;
|
||||
let read_bool = read_scalar fortran_bool_of_string;;
|
||||
|
||||
(*
|
||||
Write
|
||||
-----
|
||||
*)
|
||||
|
||||
let print_int out_channel i = Printf.fprintf out_channel "%16d\n" i
|
||||
and print_float out_channel f = Printf.fprintf out_channel "%24.15e\n" f
|
||||
and print_string out_channel s = Printf.fprintf out_channel "%s\n" s
|
||||
and print_bool out_channel b = Printf.fprintf out_channel "%s\n" (fortran_string_of_bool b);;
|
||||
|
||||
let write_scalar print_fun group name s =
|
||||
check_readonly;
|
||||
create_group group;
|
||||
let out_filename = !ezfio_filename ^ "/" ^ group ^ "/" ^ name in
|
||||
let out_channel = open_out out_filename in
|
||||
begin
|
||||
print_fun out_channel s;
|
||||
close_out out_channel;
|
||||
end
|
||||
;;
|
||||
|
||||
let write_int = write_scalar print_int
|
||||
and write_float = write_scalar print_float
|
||||
and write_bool = write_scalar print_bool
|
||||
and write_string = write_scalar print_string
|
||||
;;
|
||||
|
||||
|
||||
|
||||
(*
|
||||
Arrays
|
||||
======
|
||||
*)
|
||||
|
||||
type 'a ezfio_data =
|
||||
| Ezfio_item of 'a array
|
||||
| Ezfio_data of ('a ezfio_data) array
|
||||
;;
|
||||
|
||||
|
||||
type 'a ezfio_array =
|
||||
{ rank : int ;
|
||||
dim : int array;
|
||||
data : 'a ezfio_data ;
|
||||
}
|
||||
;;
|
||||
|
||||
let ezfio_get_element { rank=r ; dim=d ; data=data } coord =
|
||||
(*assert ((List.length coord) == r);*)
|
||||
let rec do_work buffer = function
|
||||
| [c] ->
|
||||
begin match buffer with
|
||||
| Ezfio_item buffer -> buffer.(c)
|
||||
| Ezfio_data buffer -> raise (Failure "Error in ezfio_get_element")
|
||||
end
|
||||
| c::tail ->
|
||||
begin match buffer with
|
||||
| Ezfio_item buffer -> raise (Failure "Error in ezfio_get_element")
|
||||
| Ezfio_data buffer -> do_work buffer.(c) tail
|
||||
end
|
||||
| [] -> raise (Failure "Error in ezfio_get_element")
|
||||
in
|
||||
do_work data coord
|
||||
;;
|
||||
|
||||
|
||||
let flattened_ezfio_data d =
|
||||
match d with
|
||||
| Ezfio_item d -> d
|
||||
| Ezfio_data d ->
|
||||
let d = Array.to_list d in
|
||||
let rec do_work accu = function
|
||||
| [] -> accu
|
||||
| (Ezfio_item x)::tail -> do_work (Array.append accu x) tail
|
||||
| (Ezfio_data x)::tail ->
|
||||
let newaccu = do_work accu (Array.to_list x )
|
||||
in do_work newaccu tail
|
||||
in
|
||||
do_work (Array.of_list []) d
|
||||
;;
|
||||
|
||||
|
||||
(*
|
||||
Read
|
||||
----
|
||||
*)
|
||||
|
||||
let unzipped_filename filename =
|
||||
if not (Sys.file_exists filename) then
|
||||
raise (Failure ("file "^filename^" doesn't exist"));
|
||||
let uz_filename = Filename.temp_file "" ".tmp" ~temp_dir:(Sys.getcwd ()) in
|
||||
let command = "zcat "^filename^" > "^uz_filename
|
||||
in
|
||||
if (Sys.command command) == 0 then
|
||||
uz_filename
|
||||
else
|
||||
begin
|
||||
Sys.remove uz_filename ;
|
||||
raise (Failure ("Unable to execute :\n"^command))
|
||||
end
|
||||
;;
|
||||
|
||||
let read_rank in_channel =
|
||||
let trimmed_line = trim (input_line in_channel) in
|
||||
int_of_string trimmed_line
|
||||
;;
|
||||
|
||||
let read_dimensions in_channel =
|
||||
let trimmed_line = trim (input_line in_channel) in
|
||||
let list_of_str = split trimmed_line ' ' in
|
||||
Array.of_list (List.map int_of_string list_of_str)
|
||||
;;
|
||||
|
||||
|
||||
let read_array type_conversion group name : 'a ezfio_array =
|
||||
let in_filename = !ezfio_filename ^ "/" ^ group ^ "/" ^ name ^ ".gz" in
|
||||
let uz_filename = unzipped_filename in_filename in
|
||||
let in_channel = open_in uz_filename in
|
||||
(* Read rank *)
|
||||
let rank = read_rank in_channel
|
||||
(* Read dimensions *)
|
||||
and dimensions = read_dimensions in_channel
|
||||
in
|
||||
begin
|
||||
assert (rank == Array.length dimensions) ;
|
||||
(* Read one-dimensional arrays *)
|
||||
let read_1d nmax =
|
||||
let rec do_work accu = function
|
||||
| 0 -> Array.of_list (List.rev accu)
|
||||
| n ->
|
||||
let trimmed_line = trim (input_line in_channel) in
|
||||
do_work ( (type_conversion trimmed_line)::accu ) (n-1)
|
||||
in
|
||||
Ezfio_item (do_work [] nmax)
|
||||
in
|
||||
(* Read multi-dimensional arrays *)
|
||||
let rec read_nd = function
|
||||
| m when m<1 -> raise (Failure "dimension should not be <1")
|
||||
| 1 -> read_1d dimensions.(0)
|
||||
| m ->
|
||||
let rec do_work accu = function
|
||||
| 0 -> Array.of_list (List.rev accu)
|
||||
| n ->
|
||||
let newlist = read_nd (m-1) in
|
||||
do_work (newlist::accu) (n-1)
|
||||
in
|
||||
Ezfio_data (do_work [] dimensions.(m-1))
|
||||
in
|
||||
let result = {
|
||||
rank = rank ;
|
||||
dim = dimensions ;
|
||||
data = read_nd rank ;
|
||||
}
|
||||
in
|
||||
close_in in_channel ;
|
||||
Sys.remove uz_filename ;
|
||||
result;
|
||||
end
|
||||
;;
|
||||
|
||||
let read_int_array = read_array int_of_string
|
||||
and read_float_array = read_array float_of_string
|
||||
and read_bool_array = read_array fortran_bool_of_string
|
||||
and read_string_array = read_array (fun (x:string) -> x)
|
||||
;;
|
||||
|
||||
(*
|
||||
Write
|
||||
-----
|
||||
*)
|
||||
|
||||
let write_array print_fun group name a =
|
||||
check_readonly;
|
||||
create_group group;
|
||||
let out_filename = !ezfio_filename ^ "/" ^ group ^ "/" ^ name ^".gz" in
|
||||
let uz_filename = Filename.temp_file "" ".tmp" ~temp_dir:(Sys.getcwd ()) in
|
||||
let out_channel = open_out uz_filename in
|
||||
let { rank=rank ; dim=dimensions ; data=data } = a in
|
||||
let data = flattened_ezfio_data data
|
||||
in
|
||||
begin
|
||||
(* Write rank *)
|
||||
Printf.fprintf out_channel "%4d\n" rank;
|
||||
(* Write dimensions *)
|
||||
Array.iter (Printf.fprintf out_channel " %8d") dimensions;
|
||||
Printf.fprintf out_channel "\n";
|
||||
Array.iter (print_fun out_channel) data;
|
||||
close_out out_channel ;
|
||||
let command = "gzip -c < "^uz_filename^" > "^out_filename
|
||||
in
|
||||
if (Sys.command command == 0) then (Sys.remove uz_filename )
|
||||
else raise (Failure ("command failed:\n"^command))
|
||||
end
|
||||
;;
|
||||
|
||||
let write_int_array = write_array print_int
|
||||
and write_float_array = write_array print_float
|
||||
and write_string_array = write_array print_string
|
||||
and write_bool_array = write_array print_bool;;
|
||||
|
||||
(*
|
||||
Library routines
|
||||
*)
|
||||
|
||||
let set_file filename =
|
||||
if not (exists filename) then
|
||||
begin
|
||||
mkdir filename;
|
||||
mkdir (filename^"/ezfio");
|
||||
let command = Printf.sprintf "
|
||||
LANG= date > %s/ezfio/creation
|
||||
echo $USER > %s/ezfio/user
|
||||
echo %s > %s/ezfio/library" filename filename library filename
|
||||
in
|
||||
if (Sys.command command <> 0) then
|
||||
raise (Failure ("Unable to create new ezfio file:\n"^filename))
|
||||
end ;
|
||||
ezfio_filename := filename
|
||||
;;
|
||||
|
||||
|
||||
(*$TAIL*)
|
65
src/f_types.py
Normal file
65
src/f_types.py
Normal file
@ -0,0 +1,65 @@
|
||||
# EZFIO is an automatic generator of I/O libraries
|
||||
# Copyright (C) 2009 Anthony SCEMAMA, CNRS
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along
|
||||
# with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Anthony Scemama
|
||||
# LCPQ - IRSAMC - CNRS
|
||||
# Universite Paul Sabatier
|
||||
# 118, route de Narbonne
|
||||
# 31062 Toulouse Cedex 4
|
||||
# scemama@irsamc.ups-tlse.fr
|
||||
|
||||
format= {
|
||||
'integer*8' : ["'(I20)'", "%20d"],
|
||||
'integer' : ["'(I20)'", "%20d"],
|
||||
'real' : ["'(E24.15)'","%24.15E"],
|
||||
'double precision': ["'(E24.15)'","%24.15E"],
|
||||
'logical' : ["'(L)'","%c"],
|
||||
'character*(*)' : ["'(A)'","%s"]
|
||||
}
|
||||
|
||||
def t_short(x):
|
||||
x = x.lower()
|
||||
if x == 'integer*8':
|
||||
return 'i8'
|
||||
elif x == 'integer':
|
||||
return 'in'
|
||||
elif x == 'real':
|
||||
return 're'
|
||||
elif x.startswith('double'):
|
||||
return 'do'
|
||||
elif x == 'logical':
|
||||
return 'lo'
|
||||
elif x.startswith('character'):
|
||||
return 'ch'
|
||||
|
||||
f2c = {
|
||||
'in' : 'int',
|
||||
're' : 'float',
|
||||
'i8' : 'long int',
|
||||
'do' : 'double',
|
||||
'ch' : 'char',
|
||||
'lo' : 'int'
|
||||
}
|
||||
|
||||
f2ocaml = {
|
||||
'in' : 'int',
|
||||
're' : 'float',
|
||||
'i8' : 'int',
|
||||
'do' : 'float',
|
||||
'ch' : 'string',
|
||||
'lo' : 'bool'
|
||||
}
|
150
src/groups.py
Normal file
150
src/groups.py
Normal file
@ -0,0 +1,150 @@
|
||||
#!/usr/bin/python
|
||||
# EZFIO is an automatic generator of I/O libraries
|
||||
# Copyright (C) 2009 Anthony SCEMAMA, CNRS
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along
|
||||
# with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Anthony Scemama
|
||||
# LCPQ - IRSAMC - CNRS
|
||||
# Universite Paul Sabatier
|
||||
# 118, route de Narbonne
|
||||
# 31062 Toulouse Cedex 4
|
||||
# scemama@irsamc.ups-tlse.fr
|
||||
|
||||
|
||||
import re
|
||||
from read_config import groups
|
||||
from groups_templates import *
|
||||
from f_types import t_short, f2c
|
||||
|
||||
file_py = open("libezfio_groups-gen.py","w")
|
||||
file = open("../version","r")
|
||||
v = file.readline()
|
||||
file.close()
|
||||
v = v.split('=')[1].strip()
|
||||
print >>file_py, """
|
||||
def get_version(self):
|
||||
return '%s'
|
||||
version = property(fset=None,fget=get_version)
|
||||
"""%(v)
|
||||
|
||||
import sys
|
||||
|
||||
for group in groups.keys():
|
||||
print path%{ 'group' : group }
|
||||
print >>file_py, path_py%{ 'group' : group }
|
||||
for var,type,dims,command in groups[group]:
|
||||
command_py = command
|
||||
dims_py = str(dims)
|
||||
for g in groups.keys():
|
||||
command_py = command_py.replace(g,'self.'+g)
|
||||
dims_py = dims_py.replace(g,'self.'+g)
|
||||
var = var.lower()
|
||||
group = group.lower()
|
||||
strdims = tuple(map(lambda x: '('+str(x)+')',dims))
|
||||
strdims = str(strdims).replace("'","")
|
||||
if len(dims) == 1:
|
||||
strdims = strdims[:-2]+")"
|
||||
dim_max = strdims[1:-1].replace(',','*')
|
||||
type_set = type
|
||||
cstring = ""
|
||||
cstring2 = ""
|
||||
if type.lower().startswith('character'):
|
||||
type_set = 'character*(*)'
|
||||
cstring = ',long size_'+var+'_string'
|
||||
cstring2 = ',strlen(size_'+var+'_string)'
|
||||
if dims == ():
|
||||
if command == "":
|
||||
d = { 'type_short': t_short(type),
|
||||
'type': type,
|
||||
'ctype': f2c[t_short(type)],
|
||||
'cstring': cstring,
|
||||
'cstring2': cstring2,
|
||||
'type_set': type_set,
|
||||
'var': var,
|
||||
'group': group,
|
||||
'dims': strdims}
|
||||
print attributes%d
|
||||
print >>file_py, attributes_py%d
|
||||
else:
|
||||
d = { 'type': type,
|
||||
'var': var,
|
||||
'ctype': f2c[t_short(type)]+"*",
|
||||
'cstring': cstring,
|
||||
'group': group,
|
||||
'expr': command,
|
||||
'expr_py': command_py}
|
||||
buffer = calculated%d
|
||||
buffer = re.sub(r"at\((.*),(.*)\)",r'\1(\2)',buffer)
|
||||
print buffer
|
||||
print >>file_py, calculated_py%d
|
||||
elif type == "buffered":
|
||||
d = { 'group': group,
|
||||
'var': var,
|
||||
'dims_py': dims_py,
|
||||
'dims': dims }
|
||||
print buffered%d
|
||||
print >>file_py, buffered_py%d
|
||||
else:
|
||||
dims_loop = ''
|
||||
copy_loop = ''
|
||||
dims_loop_py = ''
|
||||
declar_loop = ' integer :: '
|
||||
for k,d in enumerate(dims):
|
||||
declar_loop += "i"+str(k+1)+","
|
||||
declar_loop = declar_loop[:-1]
|
||||
for k,d in enumerate(dims):
|
||||
dims_loop += " dims("+str(k+1)+") = "+str(d)+"\n"
|
||||
dims_loop_py += " dims["+str(k)+"] = "+str(d)+"\n"
|
||||
for k,d in enumerate(dims):
|
||||
copy_loop += k*" "+" do i"+str(k+1)+"=1,"+str(d)+'\n'
|
||||
copy_loop += (k+1)*" "+" %(var)s ("
|
||||
for k,d in enumerate(dims):
|
||||
copy_loop += "i"+str(k+1)+","
|
||||
copy_loop = copy_loop[:-1] + ") = %(group)s_%(var)s ("
|
||||
for k,d in enumerate(dims):
|
||||
copy_loop += "i"+str(k+1)+","
|
||||
copy_loop = copy_loop[:-1]%{'var': var,'group': group} + ")\n"
|
||||
for k,d in enumerate(dims):
|
||||
copy_loop += (len(dims)-k-1)*" "+" enddo\n"
|
||||
for g in groups.keys():
|
||||
dims_loop_py = dims_loop_py.replace(" "+g,' self.'+g)
|
||||
dims_loop_py = dims_loop_py.replace("*"+g,'*self.'+g)
|
||||
dims_loop_py = dims_loop_py.replace("/"+g,'/self.'+g)
|
||||
dims_loop_py = dims_loop_py.replace("+"+g,'+self.'+g)
|
||||
dims_loop_py = dims_loop_py.replace("-"+g,'-self.'+g)
|
||||
dims_loop_py = dims_loop_py.replace("("+g,'(self.'+g)
|
||||
d = { 'type_short': t_short(type),
|
||||
'type': type,
|
||||
'type_set': type_set,
|
||||
'var': var,
|
||||
'ctype': f2c[t_short(type)]+"*",
|
||||
'cstring': cstring,
|
||||
'group': group,
|
||||
'rank' : str(len(dims)),
|
||||
'dims': strdims,
|
||||
'dim_max': str(dim_max),
|
||||
'dims_loop': dims_loop,
|
||||
'dims_loop_py': dims_loop_py,
|
||||
'copy_loop': copy_loop,
|
||||
'declar_loop' : declar_loop}
|
||||
print attributes_arr%d
|
||||
print >>file_py, attributes_arr_py%d
|
||||
|
||||
file_py.close()
|
||||
|
||||
import create_ocaml
|
||||
create_ocaml.run()
|
||||
|
339
src/groups_templates.py
Normal file
339
src/groups_templates.py
Normal file
@ -0,0 +1,339 @@
|
||||
#!/usr/bin/python
|
||||
# EZFIO is an automatic generator of I/O libraries
|
||||
# Copyright (C) 2009 Anthony SCEMAMA, CNRS
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along
|
||||
# with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Anthony Scemama
|
||||
# LCPQ - IRSAMC - CNRS
|
||||
# Universite Paul Sabatier
|
||||
# 118, route de Narbonne
|
||||
# 31062 Toulouse Cedex 4
|
||||
# scemama@irsamc.ups-tlse.fr
|
||||
|
||||
|
||||
|
||||
#--------
|
||||
# Fortran
|
||||
#--------
|
||||
|
||||
path = """
|
||||
BEGIN_PROVIDER [ character*(128), path_%(group)s ]
|
||||
BEGIN_DOC
|
||||
! Path to the %(group)s group
|
||||
END_DOC
|
||||
|
||||
logical :: ezfio_exists
|
||||
|
||||
path_%(group)s = trim(libezfio_filename)//'/%(group)s'
|
||||
if (.not.ezfio_exists(path_%(group)s)) then
|
||||
if (.not.libezfio_read_only) then
|
||||
call ezfio_mkdir(path_%(group)s)
|
||||
endif
|
||||
endif
|
||||
|
||||
END_PROVIDER
|
||||
"""
|
||||
|
||||
attributes = """
|
||||
BEGIN_PROVIDER [ %(type)s, %(group)s_%(var)s ]
|
||||
BEGIN_DOC
|
||||
! %(var)s attribute of group %(group)s
|
||||
END_DOC
|
||||
|
||||
call ezfio_read_%(type_short)s(path_%(group)s,'%(var)s',%(group)s_%(var)s)
|
||||
|
||||
END_PROVIDER
|
||||
|
||||
subroutine ezfio_set_%(group)s_%(var)s(%(var)s)
|
||||
%(type_set)s :: %(var)s
|
||||
call ezfio_write_%(type_short)s(path_%(group)s,'%(var)s',%(var)s)
|
||||
FREE %(group)s_%(var)s
|
||||
end subroutine
|
||||
|
||||
subroutine ezfio_get_%(group)s_%(var)s(%(var)s)
|
||||
%(type)s :: %(var)s
|
||||
%(var)s = %(group)s_%(var)s
|
||||
end subroutine
|
||||
|
||||
subroutine ezfio_has_%(group)s_%(var)s(result)
|
||||
logical :: result
|
||||
inquire(file=trim(path_%(group)s)//'/%(var)s',exist=result)
|
||||
end subroutine
|
||||
|
||||
subroutine ezfio_free_%(group)s_%(var)s()
|
||||
FREE %(group)s_%(var)s
|
||||
end
|
||||
"""
|
||||
|
||||
attributes_arr = """
|
||||
BEGIN_PROVIDER [ %(type)s, %(group)s_%(var)s, %(dims)s ]
|
||||
BEGIN_DOC
|
||||
! %(var)s attribute of group %(group)s
|
||||
END_DOC
|
||||
|
||||
integer :: rank, dim_max, i
|
||||
integer :: dims(10)
|
||||
rank = %(rank)s
|
||||
%(dims_loop)s
|
||||
dim_max = %(dim_max)s
|
||||
call ezfio_read_array_%(type_short)s(path_%(group)s,'%(var)s', &
|
||||
rank,dims,dim_max,%(group)s_%(var)s)
|
||||
|
||||
END_PROVIDER
|
||||
|
||||
subroutine ezfio_set_%(group)s_%(var)s(%(var)s)
|
||||
%(type_set)s :: %(var)s (*)
|
||||
integer :: rank, dim_max, i
|
||||
integer :: dims(10)
|
||||
rank = %(rank)s
|
||||
character*(1024) :: message
|
||||
%(dims_loop)s
|
||||
call ezfio_write_array_%(type_short)s(path_%(group)s,'%(var)s', &
|
||||
rank,dims,%(dim_max)s,%(var)s)
|
||||
FREE %(group)s_%(var)s
|
||||
end subroutine
|
||||
|
||||
subroutine ezfio_get_%(group)s_%(var)s(%(var)s)
|
||||
%(type)s, intent(out) :: %(var)s (*)
|
||||
character*(1024) :: message
|
||||
%(var)s(1: %(dim_max)s ) = reshape ( %(group)s_%(var)s, (/ %(dim_max)s /) )
|
||||
end subroutine
|
||||
|
||||
subroutine ezfio_has_%(group)s_%(var)s(result)
|
||||
logical :: result
|
||||
inquire(file=trim(path_%(group)s)//'/%(var)s.gz',exist=result)
|
||||
end subroutine
|
||||
|
||||
subroutine ezfio_free_%(group)s_%(var)s()
|
||||
FREE %(group)s_%(var)s
|
||||
end
|
||||
"""
|
||||
|
||||
calculated="""
|
||||
BEGIN_PROVIDER [ %(type)s, %(group)s_%(var)s ]
|
||||
BEGIN_DOC
|
||||
! Calculated as %(expr)s
|
||||
END_DOC
|
||||
%(group)s_%(var)s = %(expr)s
|
||||
END_PROVIDER
|
||||
|
||||
subroutine ezfio_get_%(group)s_%(var)s(%(var)s)
|
||||
%(type)s, intent(out) :: %(var)s
|
||||
%(var)s = %(group)s_%(var)s
|
||||
end
|
||||
|
||||
subroutine ezfio_free_%(group)s_%(var)s()
|
||||
FREE %(group)s_%(var)s
|
||||
end
|
||||
"""
|
||||
|
||||
buffered="""
|
||||
subroutine ezfio_open_read_%(group)s_%(var)s()
|
||||
call ezfio_open_read_buffer(path_%(group)s,'%(var)s',%(dims)s)
|
||||
end
|
||||
|
||||
subroutine ezfio_open_write_%(group)s_%(var)s()
|
||||
call ezfio_open_write_buffer(path_%(group)s,'%(var)s',%(dims)s)
|
||||
end
|
||||
|
||||
subroutine ezfio_close_read_%(group)s_%(var)s()
|
||||
call ezfio_close_read_buffer(path_%(group)s,'%(var)s')
|
||||
end
|
||||
|
||||
subroutine ezfio_close_write_%(group)s_%(var)s()
|
||||
call ezfio_close_write_buffer(path_%(group)s,'%(var)s')
|
||||
end
|
||||
|
||||
subroutine ezfio_has_%(group)s_%(var)s(result)
|
||||
logical :: result
|
||||
inquire(file=trim(path_%(group)s)//'/%(var)s.gz',exist=result)
|
||||
end subroutine
|
||||
|
||||
subroutine ezfio_free_%(group)s_%(var)s()
|
||||
FREE %(group)s_%(var)s
|
||||
end
|
||||
"""
|
||||
|
||||
|
||||
|
||||
#---------
|
||||
# C
|
||||
#---------
|
||||
|
||||
attributes_c = """
|
||||
void ezfio_set_%(group)s_%(var)s(%(type)s %(var)s)
|
||||
{
|
||||
ezfio_set_%(group)s_%(var)s_(&%(var)s);
|
||||
}
|
||||
"""
|
||||
|
||||
c_header = """
|
||||
#ifndef EZFIO_H
|
||||
#define EZFIO_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
"""
|
||||
|
||||
c_footer = """
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
"""
|
||||
|
||||
|
||||
file_h = [c_header]
|
||||
file_h +=[ """
|
||||
void ezfio_set_file_(char* filename, long filename_size);
|
||||
|
||||
void ezfio_read_buffer_(int* indices,double* values, int* isize);
|
||||
void ezfio_write_buffer_(int* indices,double* values, int* isize);
|
||||
"""]
|
||||
|
||||
file_c = [ """
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int* indices;
|
||||
double* values;
|
||||
} sparse;
|
||||
|
||||
void ezfio_set_file(char* filename)
|
||||
{
|
||||
long len;
|
||||
len = strlen(filename);
|
||||
ezfio_set_file_(filename,mlen);
|
||||
}
|
||||
|
||||
sparse ezfio_read_buffer(int isize)
|
||||
{
|
||||
sparse result;
|
||||
ezfio_read_buffer_(result.indices,result.values,&isize);
|
||||
return result;
|
||||
}
|
||||
|
||||
void ezfio_write_buffer(sparse data, int isize)
|
||||
{
|
||||
ezfio_write_buffer_(data.indices,data.values,&isize);
|
||||
}
|
||||
|
||||
""" ]
|
||||
|
||||
|
||||
|
||||
#--------
|
||||
# Python
|
||||
#--------
|
||||
|
||||
path_py = """
|
||||
def get_path_%(group)s(self):
|
||||
result = self.filename.strip()+'/%(group)s'
|
||||
self.acquire_lock('%(group)s')
|
||||
try:
|
||||
if not self.exists(result):
|
||||
self.mkdir(result)
|
||||
finally:
|
||||
self.release_lock('%(group)s')
|
||||
return result
|
||||
|
||||
path_%(group)s = property(fget=get_path_%(group)s)
|
||||
"""
|
||||
|
||||
attributes_py = """
|
||||
def get_%(group)s_%(var)s(self):
|
||||
self.acquire_lock('%(group)s_%(var)s')
|
||||
try:
|
||||
result = self.read_%(type_short)s(self.path_%(group)s,'%(var)s')
|
||||
finally:
|
||||
self.release_lock('%(group)s_%(var)s')
|
||||
return result
|
||||
|
||||
def set_%(group)s_%(var)s(self,%(var)s):
|
||||
self.acquire_lock('%(group)s_%(var)s')
|
||||
try:
|
||||
self.write_%(type_short)s(self.path_%(group)s,'%(var)s',%(var)s)
|
||||
finally:
|
||||
self.release_lock('%(group)s_%(var)s')
|
||||
|
||||
%(group)s_%(var)s = property(fset=set_%(group)s_%(var)s, \
|
||||
fget=get_%(group)s_%(var)s)
|
||||
|
||||
def has_%(group)s_%(var)s(self):
|
||||
return (os.access(self.path_%(group)s+'/%(var)s',os.F_OK) == 1)
|
||||
"""
|
||||
|
||||
attributes_arr_py = """
|
||||
def get_%(group)s_%(var)s(self):
|
||||
rank = %(rank)s
|
||||
dims = range(rank)
|
||||
%(dims_loop_py)s
|
||||
dim_max = 1
|
||||
for d in dims:
|
||||
dim_max *= d
|
||||
self.acquire_lock('%(group)s_%(var)s')
|
||||
try:
|
||||
result = self.read_array_%(type_short)s(self.path_%(group)s,'%(var)s', rank,dims,dim_max)
|
||||
finally:
|
||||
self.release_lock('%(group)s_%(var)s')
|
||||
return result
|
||||
|
||||
def set_%(group)s_%(var)s(self,%(var)s):
|
||||
rank = %(rank)s
|
||||
dims = range(rank)
|
||||
%(dims_loop_py)s
|
||||
dim_max = 1
|
||||
for d in dims:
|
||||
dim_max *= d
|
||||
self.acquire_lock('%(group)s_%(var)s')
|
||||
try:
|
||||
self.write_array_%(type_short)s(self.path_%(group)s,'%(var)s', rank,dims,dim_max,%(var)s)
|
||||
finally:
|
||||
self.release_lock('%(group)s_%(var)s')
|
||||
|
||||
%(group)s_%(var)s = property(fset=set_%(group)s_%(var)s,fget=get_%(group)s_%(var)s)
|
||||
|
||||
def has_%(group)s_%(var)s(self):
|
||||
return (os.access(self.path_%(group)s+'/%(var)s.gz',os.F_OK) == 1)
|
||||
"""
|
||||
|
||||
calculated_py="""
|
||||
def get_%(group)s_%(var)s(self):
|
||||
return %(expr_py)s
|
||||
|
||||
%(group)s_%(var)s = property(fget=get_%(group)s_%(var)s)
|
||||
"""
|
||||
|
||||
buffered_py="""
|
||||
def open_read_%(group)s_%(var)s(self):
|
||||
self.open_read_buffer(self.path_%(group)s,'%(var)s',%(dims_py)s)
|
||||
|
||||
def open_write_%(group)s_%(var)s(self):
|
||||
self.open_write_buffer(self.path_%(group)s,'%(var)s',%(dims_py)s)
|
||||
|
||||
def close_read_%(group)s_%(var)s(self):
|
||||
self.close_buffer()
|
||||
|
||||
def close_write_%(group)s_%(var)s(self):
|
||||
self.close_buffer()
|
||||
|
||||
def has_%(group)s_%(var)s(self):
|
||||
return (os.access(self.path_%(group)s+'/%(var)s.gz',os.F_OK) == 1)
|
||||
"""
|
||||
|
||||
|
||||
|
42
src/libezfio_error.irp.f
Normal file
42
src/libezfio_error.irp.f
Normal file
@ -0,0 +1,42 @@
|
||||
! EZFIO is an automatic generator of I/O libraries
|
||||
! Copyright (C) 2009 Anthony SCEMAMA, CNRS
|
||||
!
|
||||
! This program is free software; you can redistribute it and/or modify
|
||||
! it under the terms of the GNU General Public License as published by
|
||||
! the Free Software Foundation; either version 2 of the License, or
|
||||
! (at your option) any later version.
|
||||
!
|
||||
! This program is distributed in the hope that it will be useful,
|
||||
! but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
! GNU General Public License for more details.
|
||||
!
|
||||
! You should have received a copy of the GNU General Public License along
|
||||
! with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
! 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
!
|
||||
! Anthony Scemama
|
||||
! LCPQ - IRSAMC - CNRS
|
||||
! Universite Paul Sabatier
|
||||
! 118, route de Narbonne
|
||||
! 31062 Toulouse Cedex 4
|
||||
! scemama@irsamc.ups-tlse.fr
|
||||
|
||||
subroutine ezfio_error(where,txt)
|
||||
implicit none
|
||||
character*(*) :: where
|
||||
character*(*) :: txt
|
||||
character*(128) :: fname
|
||||
|
||||
fname = libezfio_filename
|
||||
print *, '------------------------------------------------------------'
|
||||
print *, 'EZFIO File : '//trim(fname)
|
||||
print *, 'EZFIO Error in : '//trim(where)
|
||||
print *, '------------------------------------------------------------'
|
||||
print *, ''
|
||||
print *, trim(txt)
|
||||
print *, ''
|
||||
print *, '------------------------------------------------------------'
|
||||
stop
|
||||
end subroutine
|
||||
|
162
src/libezfio_file.irp.f
Normal file
162
src/libezfio_file.irp.f
Normal file
@ -0,0 +1,162 @@
|
||||
! EZFIO is an automatic generator of I/O libraries
|
||||
! Copyright (C) 2009 Anthony SCEMAMA, CNRS
|
||||
!
|
||||
! This program is free software; you can redistribute it and/or modify
|
||||
! it under the terms of the GNU General Public License as published by
|
||||
! the Free Software Foundation; either version 2 of the License, or
|
||||
! (at your option) any later version.
|
||||
!
|
||||
! This program is distributed in the hope that it will be useful,
|
||||
! but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
! GNU General Public License for more details.
|
||||
!
|
||||
! You should have received a copy of the GNU General Public License along
|
||||
! with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
! 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
!
|
||||
! Anthony Scemama
|
||||
! LCPQ - IRSAMC - CNRS
|
||||
! Universite Paul Sabatier
|
||||
! 118, route de Narbonne
|
||||
! 31062 Toulouse Cedex 4
|
||||
! scemama@irsamc.ups-tlse.fr
|
||||
|
||||
BEGIN_PROVIDER [ logical, libezfio_read_only ]
|
||||
BEGIN_DOC
|
||||
! If true, the EZFIO file is read-only
|
||||
END_DOC
|
||||
|
||||
libezfio_read_only = .False.
|
||||
END_PROVIDER
|
||||
|
||||
subroutine ezfio_set_read_only(v)
|
||||
logical :: v
|
||||
libezfio_read_only = v
|
||||
TOUCH libezfio_read_only
|
||||
end subroutine ezfio_set_read_only
|
||||
|
||||
subroutine ezfio_is_read_only(v)
|
||||
logical :: v
|
||||
v = libezfio_read_only
|
||||
end subroutine ezfio_is_read_only
|
||||
|
||||
integer function char_to_version(v)
|
||||
implicit none
|
||||
character*(32), intent(in) :: v
|
||||
character*(32) :: vnew
|
||||
integer :: i, j, k
|
||||
vnew=v
|
||||
do i=1,32
|
||||
if (vnew(i:i) == '.') then
|
||||
vnew(i:i) = ' '
|
||||
endif
|
||||
enddo
|
||||
read(vnew,*) i,j,k
|
||||
char_to_version = j*1000 + i*1000000
|
||||
end
|
||||
|
||||
BEGIN_PROVIDER [ character*(32), libezfio_version ]
|
||||
implicit none
|
||||
BEGIN_DOC
|
||||
! Version of the library
|
||||
END_DOC
|
||||
BEGIN_SHELL [/bin/sh]
|
||||
echo libezfio_version = \"`cat ../version | cut -d '=' -f 2` \"
|
||||
END_SHELL
|
||||
END_PROVIDER
|
||||
|
||||
BEGIN_PROVIDER [ character*(128), libezfio_filename ]
|
||||
implicit none
|
||||
BEGIN_DOC
|
||||
! Name of the EZFIO filesystem
|
||||
END_DOC
|
||||
|
||||
libezfio_filename = 'EZFIO_File'
|
||||
|
||||
END_PROVIDER
|
||||
|
||||
subroutine ezfio_get_filename(fname)
|
||||
implicit none
|
||||
character*(*) :: fname
|
||||
fname = libezfio_filename
|
||||
end subroutine
|
||||
|
||||
BEGIN_PROVIDER [ integer, libezfio_iunit ]
|
||||
implicit none
|
||||
BEGIN_DOC
|
||||
! Unit number for I/O access
|
||||
END_DOC
|
||||
|
||||
logical :: is_open
|
||||
is_open = .True.
|
||||
libezfio_iunit = 99
|
||||
do while (is_open)
|
||||
inquire(unit=libezfio_iunit,opened=is_open)
|
||||
if (is_open) then
|
||||
libezfio_iunit = libezfio_iunit-1
|
||||
endif
|
||||
if (libezfio_iunit == 9) then
|
||||
call ezfio_error(irp_here,'No more free file units!')
|
||||
endif
|
||||
enddo
|
||||
if ( (libezfio_iunit < 10).or.(libezfio_iunit > 99) ) then
|
||||
call ezfio_error(irp_here,'No more free units for files.')
|
||||
endif
|
||||
END_PROVIDER
|
||||
|
||||
logical function exists(path)
|
||||
implicit none
|
||||
character*(*) :: path
|
||||
character*(32) :: V
|
||||
inquire(file=trim(path)//'/.version',exist=exists)
|
||||
if (exists) then
|
||||
open(libezfio_iunit,file=trim(path)//'/.version')
|
||||
read(libezfio_iunit,*) V
|
||||
close(libezfio_iunit)
|
||||
! integer :: char_to_version
|
||||
! if (char_to_version(V) > char_to_version(libezfio_version)) then
|
||||
! call ezfio_error(irp_here, 'This file was generated with version '//trim(V)//&
|
||||
! ' but the current installed version is '//trim(libezfio_version)//'')
|
||||
! endif
|
||||
endif
|
||||
end function
|
||||
|
||||
subroutine ezfio_set_file(filename_in)
|
||||
implicit none
|
||||
|
||||
character*(*) :: filename_in
|
||||
|
||||
if (filename_in == '') then
|
||||
call ezfio_error(irp_here,'EZFIO file name is empty.')
|
||||
endif
|
||||
libezfio_filename = filename_in
|
||||
|
||||
logical :: exists
|
||||
if (.not.exists(libezfio_filename)) then
|
||||
call ezfio_mkdir(libezfio_filename)
|
||||
call ezfio_mkdir(trim(libezfio_filename)//'/ezfio')
|
||||
call system('LANG= date > '//trim(libezfio_filename)//'/ezfio/creation')
|
||||
call system('echo $USER > '//trim(libezfio_filename)//'/ezfio/user')
|
||||
BEGIN_SHELL [ /usr/bin/python ]
|
||||
import os
|
||||
command = "'echo %s > '//trim(libezfio_filename)//'/ezfio/library'"
|
||||
cwd = os.getcwd()
|
||||
cwd = cwd.split('src')[:-1]
|
||||
cwd = '/'.join(cwd)
|
||||
print "call system("+command%cwd+")"
|
||||
END_SHELL
|
||||
endif
|
||||
|
||||
TOUCH libezfio_filename
|
||||
end subroutine
|
||||
|
||||
subroutine ezfio_finish()
|
||||
implicit none
|
||||
close(libezfio_iunit)
|
||||
BEGIN_SHELL [ /usr/bin/python ]
|
||||
import os
|
||||
from zlib import crc32
|
||||
print ' call irp_finalize_%s'%(str(abs(crc32(os.getcwd()))))
|
||||
END_SHELL
|
||||
end
|
28
src/libezfio_groups.irp.f
Normal file
28
src/libezfio_groups.irp.f
Normal file
@ -0,0 +1,28 @@
|
||||
! EZFIO is an automatic generator of I/O libraries
|
||||
! Copyright (C) 2009 Anthony SCEMAMA, CNRS
|
||||
!
|
||||
! This program is free software; you can redistribute it and/or modify
|
||||
! it under the terms of the GNU General Public License as published by
|
||||
! the Free Software Foundation; either version 2 of the License, or
|
||||
! (at your option) any later version.
|
||||
!
|
||||
! This program is distributed in the hope that it will be useful,
|
||||
! but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
! GNU General Public License for more details.
|
||||
!
|
||||
! You should have received a copy of the GNU General Public License along
|
||||
! with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
! 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
!
|
||||
! Anthony Scemama
|
||||
! LCPQ - IRSAMC - CNRS
|
||||
! Universite Paul Sabatier
|
||||
! 118, route de Narbonne
|
||||
! 31062 Toulouse Cedex 4
|
||||
! scemama@irsamc.ups-tlse.fr
|
||||
|
||||
BEGIN_SHELL [ /usr/bin/python ]
|
||||
import groups
|
||||
END_SHELL
|
||||
|
473
src/libezfio_util.irp.f
Normal file
473
src/libezfio_util.irp.f
Normal file
@ -0,0 +1,473 @@
|
||||
! EZFIO is an automatic generator of I/O libraries
|
||||
! Copyright (C) 2009 Anthony SCEMAMA, CNRS
|
||||
!
|
||||
! This program is free software; you can redistribute it and/or modify
|
||||
! it under the terms of the GNU General Public License as published by
|
||||
! the Free Software Foundation; either version 2 of the License, or
|
||||
! (at your option) any later version.
|
||||
!
|
||||
! This program is distributed in the hope that it will be useful,
|
||||
! but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
! GNU General Public License for more details.
|
||||
!
|
||||
! You should have received a copy of the GNU General Public License along
|
||||
! with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
! 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
!
|
||||
! Anthony Scemama
|
||||
! LCPQ - IRSAMC - CNRS
|
||||
! Universite Paul Sabatier
|
||||
! 118, route de Narbonne
|
||||
! 31062 Toulouse Cedex 4
|
||||
! scemama@irsamc.ups-tlse.fr
|
||||
|
||||
BEGIN_PROVIDER [ integer, PID ]
|
||||
&BEGIN_PROVIDER [ character*(8), PID_str ]
|
||||
implicit none
|
||||
BEGIN_DOC
|
||||
! Current process ID
|
||||
END_DOC
|
||||
integer :: getpid
|
||||
PID = getpid()
|
||||
write(PID_str,'(I8.8)') PID
|
||||
END_PROVIDER
|
||||
|
||||
logical function ezfio_exists(path)
|
||||
implicit none
|
||||
character*(*) :: path
|
||||
inquire(file=trim(path)//'/.version',exist=ezfio_exists)
|
||||
if (ezfio_exists) then
|
||||
open(unit=libezfio_iunit,file=trim(path)//'/.version')
|
||||
character*(32) :: V
|
||||
read(libezfio_iunit,*) V
|
||||
close(libezfio_iunit)
|
||||
! integer :: char_to_version
|
||||
! if (char_to_version(V) > char_to_version(libezfio_version)) then
|
||||
! call ezfio_error(irp_here, "This file was generated with version "//trim(V)//&
|
||||
! " but the current installed version is "//trim(libezfio_version)//".")
|
||||
! endif
|
||||
endif
|
||||
end function
|
||||
|
||||
subroutine ezfio_mkdir(path)
|
||||
implicit none
|
||||
character*(*) :: path
|
||||
logical :: ezfio_exists
|
||||
if (libezfio_read_only) then
|
||||
call ezfio_error(irp_here,'Read-only file.')
|
||||
endif
|
||||
if (.not.ezfio_exists(path)) then
|
||||
call system('mkdir '//trim(path))
|
||||
open(unit=libezfio_iunit,file=trim(path)//'/.version')
|
||||
write(libezfio_iunit,'(A)') libezfio_version
|
||||
close(libezfio_iunit)
|
||||
endif
|
||||
|
||||
end subroutine
|
||||
|
||||
|
||||
subroutine libezfio_openz(filename,mode,err)
|
||||
implicit none
|
||||
character*(*) :: filename, mode
|
||||
character*(1024) :: fifo
|
||||
integer :: err
|
||||
fifo = trim(filename)//'.'//PID_str
|
||||
err=1
|
||||
|
||||
if (mode(1:1) == 'r') then
|
||||
call system('zcat '//trim(filename)//' > '//trim(fifo))
|
||||
open(unit=libezfio_iunit,file=trim(fifo),form='FORMATTED',action='READ')
|
||||
err=0
|
||||
else if (mode(1:1) == 'w') then
|
||||
open(unit=libezfio_iunit,file=trim(fifo),form='FORMATTED',action='WRITE')
|
||||
err=0
|
||||
else
|
||||
call ezfio_error(irp_here,'Mode '//trim(mode)//' is not implemented.')
|
||||
endif
|
||||
end
|
||||
|
||||
subroutine libezfio_closez(filename,mode)
|
||||
implicit none
|
||||
character*(*) :: filename, mode
|
||||
character*(1024) :: fifo
|
||||
fifo = trim(filename)//'.'//PID_str
|
||||
if (mode(1:1) == 'w') then
|
||||
close(unit=libezfio_iunit)
|
||||
call system('gzip -c < '//trim(fifo)//' > '//trim(filename))
|
||||
open(unit=libezfio_iunit,file=trim(fifo),form='FORMATTED',action='WRITE')
|
||||
endif
|
||||
close(unit=libezfio_iunit,status='DELETE')
|
||||
end
|
||||
|
||||
|
||||
BEGIN_SHELL [ /usr/bin/python ]
|
||||
from f_types import format, t_short
|
||||
|
||||
|
||||
template = """
|
||||
subroutine ezfio_read_%(type_short)s(dir,fil,dat)
|
||||
implicit none
|
||||
character*(*), intent(in) :: dir, fil
|
||||
%(type)s, intent(out) :: dat
|
||||
character*(1024) :: l_filename
|
||||
l_filename=trim(dir)//'/'//fil
|
||||
open(unit=libezfio_iunit,file=l_filename,form='FORMATTED', &
|
||||
action='READ',err=9)
|
||||
read(libezfio_iunit,%(fmt)s,end=9,err=9) dat
|
||||
close(libezfio_iunit)
|
||||
return
|
||||
9 continue
|
||||
call ezfio_error(irp_here,'Attribute '//trim(dir)//'/'//trim(fil)//' is not set')
|
||||
end
|
||||
|
||||
subroutine ezfio_write_%(type_short)s(dir,fil,dat)
|
||||
implicit none
|
||||
character*(*), intent(in) :: dir, fil
|
||||
%(type)s, intent(in) :: dat
|
||||
character*(1024) :: l_filename(2)
|
||||
if (libezfio_read_only) then
|
||||
call ezfio_error(irp_here,'Read-only file.')
|
||||
endif
|
||||
l_filename(1)=trim(dir)//'/.'//fil//'.'//PID_str
|
||||
l_filename(2)=trim(dir)//'/'//fil
|
||||
open(unit=libezfio_iunit,file=l_filename(1),form='FORMATTED',action='WRITE')
|
||||
write(libezfio_iunit,%(fmt)s) dat
|
||||
close(libezfio_iunit)
|
||||
call system( 'mv -f '//trim(l_filename(1))//' '//trim(l_filename(2)) )
|
||||
end
|
||||
|
||||
subroutine ezfio_read_array_%(type_short)s(dir,fil,rank,dims,dim_max,dat)
|
||||
implicit none
|
||||
character*(*), intent(in) :: dir, fil
|
||||
integer :: rank
|
||||
integer :: dims(rank)
|
||||
integer :: dim_max
|
||||
%(type)s :: dat(dim_max)
|
||||
integer :: err
|
||||
character*(1024) :: l_filename
|
||||
l_filename=trim(dir)//'/'//fil//'.gz'
|
||||
|
||||
err = 0
|
||||
call libezfio_openz(trim(l_filename),'rb',err)
|
||||
if (err == 0) then
|
||||
integer :: rank_read
|
||||
integer :: dims_read(rank), i
|
||||
|
||||
read(libezfio_iunit,'(I3)') rank_read
|
||||
if (rank_read /= rank) then
|
||||
call ezfio_error(irp_here,'Rank of data '//trim(l_filename)//&
|
||||
' different from array.')
|
||||
endif
|
||||
|
||||
if (err /= 0) then
|
||||
call ezfio_error(irp_here,'Error reading data in '//trim(l_filename)//&
|
||||
'.')
|
||||
endif
|
||||
read(libezfio_iunit,'(30(I20,X))') dims_read(1:rank)
|
||||
do i=1,rank
|
||||
if (dims_read(i) /= dims(i)) then
|
||||
call ezfio_error(irp_here,'Dimensions of data '//trim(l_filename)//&
|
||||
' different from array.')
|
||||
endif
|
||||
enddo
|
||||
|
||||
do i=1,dim_max
|
||||
if (err /= 0) then
|
||||
call ezfio_error(irp_here,'Error reading data in '//trim(l_filename)//&
|
||||
'.')
|
||||
endif
|
||||
read(libezfio_iunit,%(fmt)s) dat(i)
|
||||
enddo
|
||||
call libezfio_closez(trim(l_filename),'r')
|
||||
return
|
||||
else
|
||||
call ezfio_error(irp_here,'Attribute '//trim(l_filename)//' is not set')
|
||||
endif
|
||||
end
|
||||
subroutine ezfio_write_array_%(type_short)s(dir,fil,rank,dims,dim_max,dat)
|
||||
implicit none
|
||||
character*(*), intent(in) :: dir, fil
|
||||
integer, intent(in) :: rank
|
||||
integer, intent(in) :: dims(rank)
|
||||
integer, intent(in) :: dim_max
|
||||
%(type)s, intent(in) :: dat(dim_max)
|
||||
integer :: err
|
||||
character*(1024) :: l_filename(2)
|
||||
if (libezfio_read_only) then
|
||||
call ezfio_error(irp_here,'Read-only file.')
|
||||
endif
|
||||
l_filename(1)=trim(dir)//'/.'//fil//PID_str//'.gz'
|
||||
l_filename(2)=trim(dir)//'/'//fil//'.gz'
|
||||
|
||||
err = 0
|
||||
call libezfio_openz(trim(l_filename(1)),'wb',err)
|
||||
if (err == 0) then
|
||||
write(libezfio_iunit,'(I3)') rank
|
||||
write(libezfio_iunit,'(30(I20,X))') dims(1:rank)
|
||||
|
||||
integer :: i
|
||||
do i=1,dim_max
|
||||
write(libezfio_iunit,%(fmt)s) dat(i)
|
||||
enddo
|
||||
call libezfio_closez(trim(l_filename(1)),'w')
|
||||
endif
|
||||
call system( 'mv -f '//trim(l_filename(1))//' '//trim(l_filename(2)) )
|
||||
end
|
||||
"""
|
||||
|
||||
template_no_logical = """
|
||||
integer function n_count_%(type_short)s(array,isize,val)
|
||||
%(type)s, intent(in) :: array(*)
|
||||
integer, intent(in) :: isize
|
||||
%(type)s, intent(in) :: val
|
||||
|
||||
integer :: i
|
||||
n_count_%(type_short)s = 0
|
||||
do i=1,isize
|
||||
if (array(i) == val) then
|
||||
n_count_%(type_short)s = n_count_%(type_short)s +1
|
||||
endif
|
||||
enddo
|
||||
|
||||
end function
|
||||
! Build Python functions
|
||||
"""
|
||||
for t in format.keys():
|
||||
print template%{ 'type_short' : t_short(t), 'type' : t, 'fmt':format[t][0] }
|
||||
if t != "logical":
|
||||
print template_no_logical%{ 'type_short' : t_short(t), 'type' : t, 'fmt':format[t][0] }
|
||||
|
||||
template_py = """
|
||||
def read_%(type_short)s(self,dir,fil):
|
||||
conv = get_conv("%(type_short)s")
|
||||
l_filename=dir.strip()+'/'+fil
|
||||
try:
|
||||
file = open(l_filename,"r")
|
||||
except IOError:
|
||||
self.error('read_%(type_short)s',\
|
||||
'Attribute '+dir.strip()+'/'+fil+' is not set')
|
||||
dat = file.readline().strip()
|
||||
try:
|
||||
dat = conv(dat)
|
||||
except SyntaxError:
|
||||
pass
|
||||
file.close()
|
||||
return dat
|
||||
|
||||
def write_%(type_short)s(self,dir,fil,dat):
|
||||
if self.read_only:
|
||||
self.error('Read-only file.')
|
||||
conv = get_conv("%(type_short)s")
|
||||
l_filename= [ dir.strip()+'/.'+fil ]
|
||||
l_filename += [ dir.strip()+'/'+fil ]
|
||||
dat = conv(dat)
|
||||
file = open(l_filename[0],'w')
|
||||
print >>file,'%(fmt)s'%%(dat,)
|
||||
file.close()
|
||||
os.rename(l_filename[0],l_filename[1])
|
||||
|
||||
def read_array_%(type_short)s(self,dir,fil,rank,dims,dim_max):
|
||||
l_filename=dir.strip()+'/'+fil+'.gz'
|
||||
conv = get_conv("%(type_short)s")
|
||||
try:
|
||||
file = GzipFile(filename=l_filename,mode='rb')
|
||||
lines = file.read().splitlines()
|
||||
rank_read = int(lines[0])
|
||||
assert (rank_read == rank)
|
||||
|
||||
dims_read = map(int,lines[1].split())
|
||||
|
||||
for i,j in zip(dims_read,dims):
|
||||
assert i == j
|
||||
|
||||
lines.pop(0)
|
||||
lines.pop(0)
|
||||
dat = map(conv,lines)
|
||||
|
||||
file.close()
|
||||
return reshape(dat,dims)
|
||||
|
||||
except IOError:
|
||||
self.error('read_array_%(type_short)s', 'Attribute '+l_filename+' is not set')
|
||||
|
||||
def write_array_%(type_short)s(self,dir,fil,rank,dims,dim_max,dat):
|
||||
if self.read_only:
|
||||
self.error('Read-only file.')
|
||||
l_filename = [ tempfile.mktemp(dir=dir.strip()), dir.strip()+'/'+fil+'.gz' ]
|
||||
try:
|
||||
file = StringIO.StringIO()
|
||||
file.write("%%3d\\n"%%(rank,))
|
||||
for d in dims:
|
||||
file.write("%%20d "%%(d,))
|
||||
file.write("\\n")
|
||||
|
||||
dat = flatten(dat)
|
||||
for i in xrange(dim_max):
|
||||
file.write("%(fmt)s\\n"%%(dat[i],))
|
||||
file.flush()
|
||||
buffer = file.getvalue()
|
||||
file.close()
|
||||
file = GzipFile(filename=l_filename[0],mode='wb')
|
||||
file.write(buffer)
|
||||
file.close()
|
||||
os.rename(l_filename[0],l_filename[1])
|
||||
except:
|
||||
self.error("write_array_%(type_short)s",
|
||||
"Unable to write "+l_filename[1])
|
||||
"""
|
||||
|
||||
file_py = open("libezfio_util-gen.py","w")
|
||||
for t in format.keys():
|
||||
print >>file_py, template_py%{ 'type_short' : t_short(t), 'type' : t, 'fmt':format[t][1] }
|
||||
|
||||
import os
|
||||
command = "'echo %s > '//libezfio_filename//'/ezfio/last_library'"
|
||||
cwd = os.getcwd()
|
||||
cwd = cwd.split('src')[:-1]
|
||||
cwd = '/'.join(cwd)
|
||||
print >>file_py, """
|
||||
LIBRARY = "%s"
|
||||
"""%cwd
|
||||
|
||||
file_py.close()
|
||||
END_SHELL
|
||||
|
||||
BEGIN_PROVIDER [ integer, libezfio_buffer_rank ]
|
||||
BEGIN_DOC
|
||||
! Rank of the buffer ready for reading
|
||||
END_DOC
|
||||
libezfio_buffer_rank = -1
|
||||
END_PROVIDER
|
||||
|
||||
subroutine ezfio_open_write_buffer(dir,fil,rank)
|
||||
implicit none
|
||||
character*(*),intent(in) :: dir
|
||||
character*(*),intent(in) :: fil
|
||||
integer,intent(in) :: rank
|
||||
character*(1024) :: l_filename
|
||||
if (libezfio_read_only) then
|
||||
call ezfio_error(irp_here,'Read-only file.')
|
||||
endif
|
||||
l_filename=trim(dir)//'/'//fil//'.gz'
|
||||
|
||||
if (libezfio_buffer_rank /= -1) then
|
||||
call ezfio_error(irp_here,'Another buffered file is already open.')
|
||||
endif
|
||||
|
||||
libezfio_buffer_rank = rank
|
||||
if (libezfio_buffer_rank <= 0) then
|
||||
call ezfio_error(irp_here,'In file '//trim(l_filename)//': rank <= 0.')
|
||||
endif
|
||||
TOUCH libezfio_buffer_rank
|
||||
|
||||
integer :: err
|
||||
call libezfio_openz(trim(l_filename),'wb',err)
|
||||
if (err /= 0) then
|
||||
call ezfio_error(irp_here,'Unable to open buffered file '//trim(l_filename)//'.')
|
||||
endif
|
||||
|
||||
write(libezfio_iunit,'(I2)') rank
|
||||
|
||||
end
|
||||
|
||||
subroutine ezfio_open_read_buffer(dir,fil,rank)
|
||||
implicit none
|
||||
character*(*),intent(in) :: dir
|
||||
character*(*),intent(in) :: fil
|
||||
integer,intent(in) :: rank
|
||||
character*(1024) :: l_filename
|
||||
l_filename=trim(dir)//'/'//fil//'.gz'
|
||||
|
||||
if (libezfio_buffer_rank /= -1) then
|
||||
call ezfio_error(irp_here,'Another buffered file is already open.')
|
||||
endif
|
||||
|
||||
integer :: err
|
||||
call libezfio_openz(trim(l_filename),'rb',err)
|
||||
if (err /= 0) then
|
||||
print *, err, l_filename
|
||||
call ezfio_error(irp_here,'Unable to open buffered file '//trim(l_filename)//'.')
|
||||
endif
|
||||
|
||||
if (err /= 0) then
|
||||
print *, err, l_filename
|
||||
call ezfio_error(irp_here,'Unable to read buffered file '//trim(l_filename)//'.')
|
||||
endif
|
||||
|
||||
read(libezfio_iunit,'(I2)') libezfio_buffer_rank
|
||||
if (libezfio_buffer_rank /= rank) then
|
||||
call ezfio_error(irp_here,'In file '//trim(l_filename)//': Rank is not correct')
|
||||
endif
|
||||
TOUCH libezfio_buffer_rank
|
||||
|
||||
end
|
||||
|
||||
subroutine ezfio_close_read_buffer(dir,fil,rank)
|
||||
implicit none
|
||||
character*(*),intent(in) :: dir
|
||||
character*(*),intent(in) :: fil
|
||||
integer,intent(in) :: rank
|
||||
character*(1024) :: l_filename
|
||||
l_filename=trim(dir)//'/'//fil//'.gz'
|
||||
ASSERT (libezfio_buffer_rank > 0)
|
||||
call libezfio_closez(l_filename,'r')
|
||||
FREE libezfio_buffer_rank
|
||||
end
|
||||
|
||||
subroutine ezfio_close_write_buffer(dir,fil,rank)
|
||||
implicit none
|
||||
character*(*),intent(in) :: dir
|
||||
character*(*),intent(in) :: fil
|
||||
integer,intent(in) :: rank
|
||||
character*(1024) :: l_filename
|
||||
l_filename=trim(dir)//'/'//fil//'.gz'
|
||||
ASSERT (libezfio_buffer_rank > 0)
|
||||
call libezfio_closez(l_filename,'w')
|
||||
FREE libezfio_buffer_rank
|
||||
end
|
||||
|
||||
subroutine ezfio_read_buffer(indices,values,isize)
|
||||
implicit none
|
||||
|
||||
integer, intent(inout) :: isize
|
||||
integer, intent(out) :: indices(*)
|
||||
double precision, intent(out) :: values(isize)
|
||||
|
||||
integer :: i, j
|
||||
|
||||
if (libezfio_buffer_rank == -1) then
|
||||
call ezfio_error(irp_here,'No buffered file is open.')
|
||||
endif
|
||||
|
||||
do i=1,isize
|
||||
read(libezfio_iunit,err=10) (indices((i-1)*libezfio_buffer_rank+j), j=1,libezfio_buffer_rank), values(i)
|
||||
enddo
|
||||
return
|
||||
10 continue
|
||||
isize=i-1
|
||||
end
|
||||
|
||||
subroutine ezfio_write_buffer(indices,values,isize)
|
||||
implicit none
|
||||
|
||||
integer, intent(in) :: isize
|
||||
integer, intent(in) :: indices(*)
|
||||
double precision, intent(in) :: values(isize)
|
||||
|
||||
character*(80) :: cformat
|
||||
integer :: i, j, k, num, imax, l1, l2
|
||||
|
||||
if (libezfio_read_only) then
|
||||
call ezfio_error(irp_here,'Read-only file.')
|
||||
endif
|
||||
if (libezfio_buffer_rank == -1) then
|
||||
call ezfio_error(irp_here,'No buffered file is open.')
|
||||
endif
|
||||
|
||||
write(cformat,*) '(',num,'(',libezfio_buffer_rank,'(I4,X),E24.15,A1))'
|
||||
write(libezfio_iunit,cformat) ((indices((i-1)*libezfio_buffer_rank+j), j=1,libezfio_buffer_rank), &
|
||||
values(i), i=1,isize)
|
||||
|
||||
end
|
||||
|
87
src/read_config.py
Normal file
87
src/read_config.py
Normal file
@ -0,0 +1,87 @@
|
||||
#!/usr/bin/python
|
||||
# EZFIO is an automatic generator of I/O libraries
|
||||
# Copyright (C) 2009 Anthony SCEMAMA, CNRS
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along
|
||||
# with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Anthony Scemama
|
||||
# LCPQ - IRSAMC - CNRS
|
||||
# Universite Paul Sabatier
|
||||
# 118, route de Narbonne
|
||||
# 31062 Toulouse Cedex 4
|
||||
# scemama@irsamc.ups-tlse.fr
|
||||
|
||||
|
||||
# Read ezfio config file
|
||||
#----------------------
|
||||
|
||||
import os, sys
|
||||
lines = []
|
||||
for filename in [ '../config/'+i for i in os.listdir('../config')]:
|
||||
file = open(filename,'r')
|
||||
lines += map(lambda x: (x,filename), file.readlines())
|
||||
try:
|
||||
if lines[-1] != '':
|
||||
lines.append( ('', filename) )
|
||||
except:
|
||||
pass
|
||||
file.close()
|
||||
|
||||
import re
|
||||
|
||||
groups = {}
|
||||
group = None
|
||||
my_list = []
|
||||
for line, filename in lines:
|
||||
try:
|
||||
|
||||
if len(line.strip()) == 0:
|
||||
groups[group] = my_list
|
||||
elif line[0] != ' ': # New group
|
||||
group = line.strip()
|
||||
if group in groups.keys():
|
||||
my_list = groups[group]
|
||||
else:
|
||||
my_list = []
|
||||
else:
|
||||
line = line.replace("double precision","double_precision")
|
||||
line = line.split('=')
|
||||
if len(line) == 1:
|
||||
command = ""
|
||||
else:
|
||||
command = line[1].strip()
|
||||
line = line[0]
|
||||
buffer = line.split()
|
||||
if len(buffer) == 2:
|
||||
buffer += ["()"]
|
||||
else:
|
||||
buffer[2] = re.sub(r"\)",r',)',buffer[2])
|
||||
if buffer[1] == "double_precision":
|
||||
buffer[1] = "double precision"
|
||||
buffer[2] = re.sub(r"([a-zA-Z0-9_\-\+*/]+)",r'"\1"',buffer[2])
|
||||
buffer[2] = eval(buffer[2])
|
||||
buffer.append(command)
|
||||
my_list.append(tuple(buffer))
|
||||
except:
|
||||
import sys, time
|
||||
print >>sys.stderr, ''
|
||||
print >>sys.stderr, '*'*80
|
||||
print >>sys.stderr, 'Error in EZFIO config file '+filename+' :'
|
||||
print >>sys.stderr, line
|
||||
print >>sys.stderr, '*'*80
|
||||
print >>sys.stderr, ''
|
||||
time.sleep(3)
|
||||
sys.exit(1)
|
||||
|
28
src/run.irp.f
Normal file
28
src/run.irp.f
Normal file
@ -0,0 +1,28 @@
|
||||
! EZFIO is an automatic generator of I/O libraries
|
||||
! Copyright (C) 2009 Anthony SCEMAMA, CNRS
|
||||
!
|
||||
! This program is free software; you can redistribute it and/or modify
|
||||
! it under the terms of the GNU General Public License as published by
|
||||
! the Free Software Foundation; either version 2 of the License, or
|
||||
! (at your option) any later version.
|
||||
!
|
||||
! This program is distributed in the hope that it will be useful,
|
||||
! but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
! GNU General Public License for more details.
|
||||
!
|
||||
! You should have received a copy of the GNU General Public License along
|
||||
! with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
! 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
!
|
||||
! Anthony Scemama
|
||||
! LCPQ - IRSAMC - CNRS
|
||||
! Universite Paul Sabatier
|
||||
! 118, route de Narbonne
|
||||
! 31062 Toulouse Cedex 4
|
||||
! scemama@irsamc.ups-tlse.fr
|
||||
|
||||
program run
|
||||
! Leave this empty
|
||||
end
|
||||
|
50
src/test.py
Executable file
50
src/test.py
Executable file
@ -0,0 +1,50 @@
|
||||
#!/usr/bin/python
|
||||
# EZFIO is an automatic generator of I/O libraries
|
||||
# Copyright (C) 2009 Anthony SCEMAMA, CNRS
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along
|
||||
# with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Anthony Scemama
|
||||
# LCPQ - IRSAMC - CNRS
|
||||
# Universite Paul Sabatier
|
||||
# 118, route de Narbonne
|
||||
# 31062 Toulouse Cedex 4
|
||||
# scemama@irsamc.ups-tlse.fr
|
||||
|
||||
|
||||
from ezfio import ezfio
|
||||
|
||||
EZFIO=ezfio
|
||||
|
||||
EZFIO.set_file('icule')
|
||||
EZFIO.set_system_num_alpha(4)
|
||||
EZFIO.set_geometry_num_atom(5)
|
||||
x = [ "label"+str(i) for i in range(5) ]
|
||||
indices = [ [ 1, 2, 3, 4 ], [ 5, 6, 7, 8] ]
|
||||
values = [ 10., 20.]
|
||||
isize = len(indices)
|
||||
EZFIO.open_write_ao_two_int()
|
||||
EZFIO.write_buffer(indices,values,isize)
|
||||
EZFIO.write_buffer(indices,values,isize)
|
||||
EZFIO.close_write_ao_two_int()
|
||||
indices = []
|
||||
values = []
|
||||
isize = 5
|
||||
EZFIO.open_read_ao_two_int()
|
||||
indices,values = EZFIO.read_buffer(isize)
|
||||
print indices
|
||||
print values
|
||||
EZFIO.close_read_ao_two_int()
|
||||
|
Loading…
Reference in New Issue
Block a user