1
<?xml version="1.0" encoding="ISO-8859-1"?>
2
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
3
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
4
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
6
<meta http-equiv="Content-Style-Type" content="text/css" />
7
<meta http-equiv="Content-type" content="text/html; charset=ISO-8859-1" />
8
<link rel="stylesheet" href="../robodoc.css" type="text/css" />
9
<title>./src/tutorials/convert_to_xyz.f90</title>
10
<!-- Source: ./src/tutorials/convert_to_xyz.f90 -->
11
<!-- Generated with ROBODoc Version 4.99.30 (Jun 25 2008) -->
15
<a name="robo_top_of_doc">ETSF_IO library - documentation pages</a>
18
</div> <!-- navigation -->
20
<h3>TABLE OF CONTENTS</h3>
22
<li><a href="#robo4">convert_to_xyz</a></li>
25
<a name="etsf5fio5ftutorials2fconvert5fto5fxyz">
26
</a><a name="robo4"></a><h2>convert_to_xyz</h2>
28
<p>[ <a href="#robo_top_of_doc">Top</a> ] [ <a href="./README_f90.html#robo119">etsf_io_tutorials</a> ] [ <a href="../robo_tuto_cat.html#robo_top_of_doc">Tutorials</a> ]</p>
29
<p class="item_name">NAME</p>
30
<p> <strong>convert_to_xyz</strong>
32
<p class="item_name">FUNCTION</p>
33
<p> In this example, we will describe how to use the high level routines from
34
<a href="../utils/etsf_io_file_f90.html#robo1">etsf_io_file</a> and <a href="../utils/etsf_io_tools_f90.html#robo3">etsf_io_tools</a> (from library etsf_io_utils). Doing it, we will
35
read a cristallographic file, check its validity and convert it to XYZ file,
36
reading the coordinates of atoms and getting their names.
39
<p> To compile this exemple, use (assuming default installation paths):
41
<pre> ${F90} -I/opt/include/${F90} -o <strong>convert_to_xyz</strong> <a href="#robo_top_of_doc">convert_to_xyz.f90</a>
42
-L/opt/lib -letsf_io_utils -letsf_io -L/usr/lib -lnetcdf
45
<p class="item_name">SOURCE</p>
46
<pre class="source"><span class="keyword">program</span> <strong>convert_to_xyz</strong>
48
<span class="keyword">use</span> <a href="../low_level/etsf_io_low_level_f90.html#robo2">etsf_io_low_level</a>
49
<span class="keyword">use</span> <a href="../group_level/etsf_io_f90.html#robo0">etsf_io</a>
50
<span class="keyword">use</span> <a href="../utils/etsf_io_file_f90.html#robo1">etsf_io_file</a>
51
<span class="keyword">use</span> <a href="../utils/etsf_io_tools_f90.html#robo3">etsf_io_tools</a>
53
<span class="keyword">implicit</span> <span class="keyword">none</span>
55
<span class="keyword">integer</span> <span class="sign">:</span><span class="sign">:</span> iargc
56
<span class="keyword">character</span><span class="sign">(</span><span class="keyword">len</span> <span class="sign">=</span> <a href="../low_level/public_variables_f90.html#robo71">etsf_io_low_error_len</a><span class="sign">)</span> <span class="sign">:</span><span class="sign">:</span> filename<span class="sign">,</span> error_string
57
<span class="keyword">logical</span> <span class="sign">:</span><span class="sign">:</span> lstat
58
<span class="keyword">type</span><span class="sign">(</span><a href="../low_level/public_variables_f90.html#robo68">etsf_io_low_error</a><span class="sign">)</span> <span class="sign">:</span><span class="sign">:</span> error_data
59
<span class="keyword">integer</span> <span class="sign">:</span><span class="sign">:</span> i_atom
60
<span class="keyword">double</span> <span class="keyword">precision</span> <span class="sign">:</span><span class="sign">:</span> coord<span class="sign">(</span>etsf_3dimlen<span class="sign">)</span>
62
<p class="item_name">NOTES</p>
63
<p> In this tutorial, we will open an ETSF file, and some variable of the
64
geometry group (see the first tutorial on how to <a href="./create_a_crystal_den_file_f90.html#robo5">create_a_crystal_den_file</a>
65
for further explanations on groups and especially <a href="../group_level/etsf_io_f90.html#robo12">etsf_geometry</a>).
68
<p> The required data to create an XYZ file are:
70
<ul><li> primitive_vectors for the box definition,
72
<li> reduced_atom_positions for the atom coordinates,
74
<li> atom_species for the nature of elements.
78
<p class="item_name">SOURCE</p>
79
<pre class="source"> <span class="keyword">integer</span> <span class="sign">:</span><span class="sign">:</span> ncid
80
<span class="keyword">type</span><span class="sign">(</span><a href="../group_level/etsf_io_f90.html#robo10">etsf_dims</a><span class="sign">)</span> <span class="sign">:</span><span class="sign">:</span> dims_data
81
<span class="keyword">type</span><span class="sign">(</span><a href="../group_level/etsf_io_f90.html#robo12">etsf_geometry</a><span class="sign">)</span> <span class="sign">:</span><span class="sign">:</span> geometry_data
82
<span class="keyword">double</span> <span class="keyword">precision</span><span class="sign">,</span> <span class="keyword">allocatable</span><span class="sign">,</span> target <span class="sign">:</span><span class="sign">:</span> primitive_vectors<span class="sign">(</span><span class="sign">:</span><span class="sign">,</span><span class="sign">:</span><span class="sign">)</span>
83
<span class="keyword">double</span> <span class="keyword">precision</span><span class="sign">,</span> <span class="keyword">allocatable</span><span class="sign">,</span> target <span class="sign">:</span><span class="sign">:</span> reduced_atom_positions<span class="sign">(</span><span class="sign">:</span><span class="sign">,</span><span class="sign">:</span><span class="sign">)</span>
84
<span class="keyword">integer</span><span class="sign">,</span> <span class="keyword">allocatable</span><span class="sign">,</span> target <span class="sign">:</span><span class="sign">:</span> atom_species<span class="sign">(</span><span class="sign">:</span><span class="sign">)</span>
86
<p class="item_name">NOTES</p>
87
<p> The names of atoms receives a special treatment since it can be found in several
88
variables. The specifications are clear on preference and we will use the
89
<a href="../utils/etsf_io_tools_f90.html#robo116">etsf_io_tools_get_atom_names</a>() routine to handle this preference and read
92
<p class="item_name">SOURCE</p>
93
<pre class="source"> <span class="keyword">character</span><span class="sign">(</span><span class="keyword">len</span> <span class="sign">=</span> etsf_charlen<span class="sign">)</span><span class="sign">,</span> <span class="keyword">allocatable</span> <span class="sign">:</span><span class="sign">:</span> atom_names<span class="sign">(</span><span class="sign">:</span><span class="sign">)</span>
95
<p class="item_name">NOTES</p>
96
<p> We read the number of argument and get the input filename from the command line.
98
<p class="item_name">SOURCE</p>
99
<pre class="source"> <span class="comment">! Read number of program argument, should be one.</span>
100
<span class="keyword">if</span> <span class="sign">(</span>iargc<span class="sign">(</span><span class="sign">)</span> <span class="sign">/</span><span class="sign">=</span> 1<span class="sign">)</span> <span class="keyword">then</span>
101
<span class="keyword">write</span><span class="sign">(</span>0<span class="sign">,</span> <span class="sign">*</span><span class="sign">)</span> <span class="quote">"Error: one argument is required."</span>
103
<span class="keyword">end</span> <span class="keyword">if</span>
104
<span class="comment">! Read name of input file.</span>
105
<span class="keyword">call</span> getarg<span class="sign">(</span>1<span class="sign">,</span> filename<span class="sign">)</span>
107
<p class="item_name">NOTES</p>
108
<p> Before doing anything else, we check that our file is a valid crystallographic
109
file. To do it, we use the module <a href="../utils/etsf_io_file_f90.html#robo1">etsf_io_file</a> and its routine
110
<a href="../utils/etsf_io_file_public_f90.html#robo41">etsf_io_file_check</a>(). This routine will open the given file and check that it
111
machtes one or several requirements (see flags in <a href="../group_level/etsf_io_f90.html#robo120">ETSF_IO_VALIDITY_FLAGS</a>). Flags
112
can be added to form a complex validation on several specifications.
115
<p> If an error occurs, we transform the error data to a string and output it on
118
<p class="item_name">SOURCE</p>
119
<pre class="source"> <span class="keyword">call</span> <a href="../utils/etsf_io_file_public_f90.html#robo41">etsf_io_file_check</a><span class="sign">(</span><span class="keyword">trim</span><span class="sign">(</span>filename<span class="sign">)</span><span class="sign">,</span> etsf_crystallographic_data<span class="sign">,</span> <span class="sign">&</span>
120
<span class="sign">&</span> lstat<span class="sign">,</span> error_data<span class="sign">)</span>
121
<span class="keyword">if</span> <span class="sign">(</span><span class="sign">.</span><span class="keyword">not</span><span class="sign">.</span> lstat<span class="sign">)</span> <span class="keyword">then</span>
122
<span class="keyword">write</span><span class="sign">(</span>0<span class="sign">,</span> <span class="sign">*</span><span class="sign">)</span> <span class="quote">"Error: invalid input file, it does not match crystallographic"</span>
123
<span class="keyword">write</span><span class="sign">(</span>0<span class="sign">,</span> <span class="sign">*</span><span class="sign">)</span> <span class="quote">" requirements. Given reason:"</span>
124
<span class="keyword">call</span> <a href="../low_level/etsf_io_low_level_f90.html#robo73">etsf_io_low_error_to_str</a><span class="sign">(</span>error_string<span class="sign">,</span> error_data<span class="sign">)</span>
125
<span class="keyword">write</span><span class="sign">(</span>0<span class="sign">,</span> <span class="quote">"(A)"</span><span class="sign">)</span> <span class="keyword">trim</span><span class="sign">(</span>error_string<span class="sign">)</span>
127
<span class="keyword">end</span> <span class="keyword">if</span>
129
<p class="item_name">NOTES</p>
130
<p> Now that our file is valid, we will follow a step by step procedure to
131
reopen it, read the dimensions, allocate our temporary arrays, read the required
132
informations, get the atoms names, close the file and output the informations
135
<p class="item_name">SOURCE</p>
136
<pre class="source"> <span class="keyword">call</span> <a href="../low_level/read_routines_f90.html#robo80">etsf_io_low_open_read</a><span class="sign">(</span>ncid<span class="sign">,</span> <span class="keyword">trim</span><span class="sign">(</span>filename<span class="sign">)</span><span class="sign">,</span> lstat<span class="sign">,</span> error_data <span class="sign">=</span> error_data<span class="sign">)</span>
137
<span class="keyword">if</span> <span class="sign">(</span><span class="sign">.</span><span class="keyword">not</span><span class="sign">.</span> lstat<span class="sign">)</span> <span class="keyword">then</span>
138
<span class="keyword">call</span> <a href="../low_level/etsf_io_low_level_f90.html#robo73">etsf_io_low_error_to_str</a><span class="sign">(</span>error_string<span class="sign">,</span> error_data<span class="sign">)</span>
139
<span class="keyword">write</span><span class="sign">(</span>0<span class="sign">,</span> <span class="quote">"(A)"</span><span class="sign">)</span> <span class="keyword">trim</span><span class="sign">(</span>error_string<span class="sign">)</span>
141
<span class="keyword">end</span> <span class="keyword">if</span>
143
<p class="item_name">NOTES</p>
144
<p> The dimensions are read and stored into dims_data.
146
<p class="item_name">SOURCE</p>
147
<pre class="source"> <span class="keyword">call</span> <a href="../group_level/etsf_io_dims_get_f90.html#robo34">etsf_io_dims_get</a><span class="sign">(</span>ncid<span class="sign">,</span> dims_data<span class="sign">,</span> lstat<span class="sign">,</span> error_data<span class="sign">)</span>
148
<span class="keyword">if</span> <span class="sign">(</span><span class="sign">.</span><span class="keyword">not</span><span class="sign">.</span> lstat<span class="sign">)</span> <span class="keyword">then</span>
149
<span class="keyword">call</span> <a href="../low_level/etsf_io_low_level_f90.html#robo73">etsf_io_low_error_to_str</a><span class="sign">(</span>error_string<span class="sign">,</span> error_data<span class="sign">)</span>
150
<span class="keyword">write</span><span class="sign">(</span>0<span class="sign">,</span> <span class="quote">"(A)"</span><span class="sign">)</span> <span class="keyword">trim</span><span class="sign">(</span>error_string<span class="sign">)</span>
152
<span class="keyword">end</span> <span class="keyword">if</span>
154
<p class="item_name">NOTES</p>
155
<p> We allocate the local arrays where to put the read informations.
157
<p class="item_name">SOURCE</p>
158
<pre class="source"> <span class="keyword">allocate</span><span class="sign">(</span>primitive_vectors<span class="sign">(</span>dims_data<span class="sign">%</span>number_of_cartesian_directions<span class="sign">,</span> <span class="sign">&</span>
159
<span class="sign">&</span> dims_data<span class="sign">%</span>number_of_vectors<span class="sign">)</span><span class="sign">)</span>
160
<span class="keyword">allocate</span><span class="sign">(</span>reduced_atom_positions<span class="sign">(</span>dims_data<span class="sign">%</span>number_of_reduced_dimensions<span class="sign">,</span> <span class="sign">&</span>
161
<span class="sign">&</span> dims_data<span class="sign">%</span>number_of_atoms<span class="sign">)</span><span class="sign">)</span>
162
<span class="keyword">allocate</span><span class="sign">(</span>atom_species<span class="sign">(</span>dims_data<span class="sign">%</span>number_of_atoms<span class="sign">)</span><span class="sign">)</span>
163
<span class="keyword">allocate</span><span class="sign">(</span>atom_names<span class="sign">(</span>dims_data<span class="sign">%</span>number_of_atom_species<span class="sign">)</span><span class="sign">)</span>
164
geometry_data<span class="sign">%</span>primitive_vectors <span class="sign">=</span><span class="sign">></span> primitive_vectors
165
geometry_data<span class="sign">%</span>reduced_atom_positions <span class="sign">=</span><span class="sign">></span> reduced_atom_positions
166
geometry_data<span class="sign">%</span>atom_species <span class="sign">=</span><span class="sign">></span> atom_species
168
<p class="item_name">NOTES</p>
169
<p> We get the informations from the NetCDF file for the pointers that have been
170
associated in geometry_data.
172
<p class="item_name">SOURCE</p>
173
<pre class="source"> <span class="keyword">call</span> <a href="../group_level/etsf_io_geometry_get_f90.html#robo50">etsf_io_geometry_get</a><span class="sign">(</span>ncid<span class="sign">,</span> geometry_data<span class="sign">,</span> lstat<span class="sign">,</span> error_data<span class="sign">)</span>
174
<span class="keyword">if</span> <span class="sign">(</span><span class="sign">.</span><span class="keyword">not</span><span class="sign">.</span> lstat<span class="sign">)</span> <span class="keyword">then</span>
175
<span class="keyword">call</span> <a href="../low_level/etsf_io_low_level_f90.html#robo73">etsf_io_low_error_to_str</a><span class="sign">(</span>error_string<span class="sign">,</span> error_data<span class="sign">)</span>
176
<span class="keyword">write</span><span class="sign">(</span>0<span class="sign">,</span> <span class="quote">"(A)"</span><span class="sign">)</span> <span class="keyword">trim</span><span class="sign">(</span>error_string<span class="sign">)</span>
178
<span class="keyword">end</span> <span class="keyword">if</span>
180
<p class="item_name">NOTES</p>
181
<p> We use the high level routine that get the names of atoms. If the file is valid,
182
it always returns string informations (into @atom_names), but atomic numbers can
183
also be returned as double values in an optional array (see @atom_numbers). We
184
don't need here the double values, so we don't use the optional argument.
186
<p class="item_name">SOURCE</p>
187
<pre class="source"> <span class="keyword">call</span> <a href="../utils/etsf_io_tools_f90.html#robo116">etsf_io_tools_get_atom_names</a><span class="sign">(</span>ncid<span class="sign">,</span> atom_names<span class="sign">,</span> lstat<span class="sign">,</span> error_data<span class="sign">)</span>
188
<span class="keyword">if</span> <span class="sign">(</span><span class="sign">.</span><span class="keyword">not</span><span class="sign">.</span> lstat<span class="sign">)</span> <span class="keyword">then</span>
189
<span class="keyword">call</span> <a href="../low_level/etsf_io_low_level_f90.html#robo73">etsf_io_low_error_to_str</a><span class="sign">(</span>error_string<span class="sign">,</span> error_data<span class="sign">)</span>
190
<span class="keyword">write</span><span class="sign">(</span>0<span class="sign">,</span> <span class="quote">"(A)"</span><span class="sign">)</span> <span class="keyword">trim</span><span class="sign">(</span>error_string<span class="sign">)</span>
192
<span class="keyword">end</span> <span class="keyword">if</span>
194
<p class="item_name">NOTES</p>
195
<p> We don't forget to close the file.
197
<p class="item_name">SOURCE</p>
198
<pre class="source"> <span class="keyword">call</span> <a href="../low_level/etsf_io_low_level_f90.html#robo64">etsf_io_low_close</a><span class="sign">(</span>ncid<span class="sign">,</span> lstat<span class="sign">,</span> error_data<span class="sign">)</span>
199
<span class="keyword">if</span> <span class="sign">(</span><span class="sign">.</span><span class="keyword">not</span><span class="sign">.</span> lstat<span class="sign">)</span> <span class="keyword">then</span>
200
<span class="keyword">call</span> <a href="../low_level/etsf_io_low_level_f90.html#robo73">etsf_io_low_error_to_str</a><span class="sign">(</span>error_string<span class="sign">,</span> error_data<span class="sign">)</span>
201
<span class="keyword">write</span><span class="sign">(</span>0<span class="sign">,</span> <span class="quote">"(A)"</span><span class="sign">)</span> <span class="keyword">trim</span><span class="sign">(</span>error_string<span class="sign">)</span>
203
<span class="keyword">end</span> <span class="keyword">if</span>
205
<p class="item_name">NOTES</p>
206
<p> Finally we output informations in XYZ format.
208
<p class="item_name">SOURCE</p>
209
<pre class="source"> <span class="keyword">write</span><span class="comment">(*, "(I0)") dims_data%number_of_atoms
210
write(*, "(3A)") "Converted from '", trim(filename), "'"
211
do i_atom = 1, dims_data%number_of_atoms, 1
212
coord(1) = primitive_vectors(1, 1) * reduced_atom_positions(1, i_atom) + &
213
& primitive_vectors(2, 1) * reduced_atom_positions(2, i_atom) + &
214
& primitive_vectors(3, 1) * reduced_atom_positions(3, i_atom)
215
coord(2) = primitive_vectors(1, 2) * reduced_atom_positions(1, i_atom) + &
216
& primitive_vectors(2, 2) * reduced_atom_positions(2, i_atom) + &
217
& primitive_vectors(3, 2) * reduced_atom_positions(3, i_atom)
218
coord(3) = primitive_vectors(1, 3) * reduced_atom_positions(1, i_atom) + &
219
& primitive_vectors(2, 3) * reduced_atom_positions(2, i_atom) + &
220
& primitive_vectors(3, 3) * reduced_atom_positions(3, i_atom)
221
write(*, "(A,3E16.6)") trim(atom_names(atom_species(i_atom))), coord
224
deallocate(primitive_vectors)
225
deallocate(reduced_atom_positions)
226
deallocate(atom_species)
227
deallocate(atom_names)
228
end program <strong>convert_to_xyz</strong>
231
</div> <!-- content -->
233
<p>Generated from ./src/tutorials/convert_to_xyz.f90 with <a href="http://www.xs4all.nl/~rfsber/Robo/robodoc.html">ROBODoc</a> V4.99.30 on Mon Mar 29 2010 11:04:46
235
</div> <!-- footer -->