~etsf-io-developers/etsf-io/1.0

« back to all changes in this revision

Viewing changes to doc/www/tutorials/convert_to_xyz_f90.html

  • Committer: Damien Caliste
  • Date: 2010-03-29 09:16:49 UTC
  • Revision ID: damien.caliste@cea.fr-20100329091649-263qk2adyod2gqr2
Add the missing tutorial files.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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">
 
5
<head>
 
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) -->
 
12
</head>
 
13
<body>
 
14
<div id="logo">
 
15
<a name="robo_top_of_doc">ETSF_IO library - documentation pages</a>
 
16
</div> <!-- logo -->
 
17
<div id="navigation">
 
18
</div> <!-- navigation -->
 
19
<div id="content">
 
20
<h3>TABLE OF CONTENTS</h3>
 
21
<ul>
 
22
<li><a href="#robo4">convert_to_xyz</a></li>
 
23
</ul>
 
24
<hr />
 
25
<a name="etsf5fio5ftutorials2fconvert5fto5fxyz">
 
26
</a><a name="robo4"></a><h2>convert_to_xyz</h2>
 
27
 
 
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>
 
31
</p>
 
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.
 
37
</p>
 
38
 
 
39
<p>  To compile this exemple, use (assuming default installation paths):
 
40
</p>
 
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
 
43
</pre>
 
44
<p></p>
 
45
<p class="item_name">SOURCE</p>
 
46
<pre class="source"><span class="keyword">program</span> <strong>convert_to_xyz</strong>
 
47
 
 
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>
 
52
 
 
53
  <span class="keyword">implicit</span> <span class="keyword">none</span>
 
54
 
 
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>
 
61
</pre>
 
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>).
 
66
</p>
 
67
 
 
68
<p>  The required data to create an XYZ file are:
 
69
</p>
 
70
<ul><li>  primitive_vectors for the box definition,
 
71
</li>
 
72
<li>  reduced_atom_positions for the atom coordinates,
 
73
</li>
 
74
<li>  atom_species for the nature of elements.
 
75
</li>
 
76
</ul>
 
77
<p></p>
 
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>
 
85
</pre>
 
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
 
90
  the atom names.
 
91
</p>
 
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>
 
94
</pre>
 
95
<p class="item_name">NOTES</p>
 
96
<p>  We read the number of argument and get the input filename from the command line.
 
97
</p>
 
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>
 
102
     stop
 
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>
 
106
</pre>
 
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.
 
113
</p>
 
114
 
 
115
<p>  If an error occurs, we transform the error data to a string and output it on
 
116
  the standard error.
 
117
</p>
 
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">&amp;</span>
 
120
       <span class="sign">&amp;</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>
 
126
     stop
 
127
  <span class="keyword">end</span> <span class="keyword">if</span>
 
128
</pre>
 
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
 
133
  in XYZ format.
 
134
</p>
 
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>
 
140
     stop
 
141
  <span class="keyword">end</span> <span class="keyword">if</span>
 
142
</pre>
 
143
<p class="item_name">NOTES</p>
 
144
<p>  The dimensions are read and stored into dims_data.
 
145
</p>
 
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>
 
151
     stop
 
152
  <span class="keyword">end</span> <span class="keyword">if</span>
 
153
</pre>
 
154
<p class="item_name">NOTES</p>
 
155
<p>  We allocate the local arrays where to put the read informations.
 
156
</p>
 
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">&amp;</span>
 
159
       <span class="sign">&amp;</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">&amp;</span>
 
161
       <span class="sign">&amp;</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">&gt;</span> primitive_vectors
 
165
  geometry_data<span class="sign">%</span>reduced_atom_positions <span class="sign">=</span><span class="sign">&gt;</span> reduced_atom_positions
 
166
  geometry_data<span class="sign">%</span>atom_species <span class="sign">=</span><span class="sign">&gt;</span> atom_species
 
167
</pre>
 
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.
 
171
</p>
 
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>
 
177
     stop
 
178
  <span class="keyword">end</span> <span class="keyword">if</span>
 
179
</pre>
 
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.
 
185
</p>
 
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>
 
191
     stop
 
192
  <span class="keyword">end</span> <span class="keyword">if</span>
 
193
</pre>
 
194
<p class="item_name">NOTES</p>
 
195
<p>  We don't forget to close the file.
 
196
</p>
 
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>
 
202
     stop
 
203
  <span class="keyword">end</span> <span class="keyword">if</span>
 
204
</pre>
 
205
<p class="item_name">NOTES</p>
 
206
<p>  Finally we output informations in XYZ format.
 
207
</p>
 
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) + &amp;
 
213
          &amp; primitive_vectors(2, 1) * reduced_atom_positions(2, i_atom) + &amp;
 
214
          &amp; primitive_vectors(3, 1) * reduced_atom_positions(3, i_atom)
 
215
     coord(2) = primitive_vectors(1, 2) * reduced_atom_positions(1, i_atom) + &amp;
 
216
          &amp; primitive_vectors(2, 2) * reduced_atom_positions(2, i_atom) + &amp;
 
217
          &amp; primitive_vectors(3, 2) * reduced_atom_positions(3, i_atom)
 
218
     coord(3) = primitive_vectors(1, 3) * reduced_atom_positions(1, i_atom) + &amp;
 
219
          &amp; primitive_vectors(2, 3) * reduced_atom_positions(2, i_atom) + &amp;
 
220
          &amp; primitive_vectors(3, 3) * reduced_atom_positions(3, i_atom)
 
221
     write(*, "(A,3E16.6)") trim(atom_names(atom_species(i_atom))), coord
 
222
  end do
 
223
 
 
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>
 
229
</pre>
 
230
 
 
231
</div> <!-- content -->
 
232
<div id="footer">
 
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
 
234
</p>
 
235
</div> <!-- footer -->
 
236
</body>
 
237
</html>