Line data Source code
1 : !!****m* ABINIT/m_lattice_ncfile
2 : !! NAME
3 : !! m_lattice_ncfile
4 : !!
5 : !! FUNCTION
6 : !! This module contains the subroutines for output netcdf file
7 : !!
8 : !! Datatypes:
9 : !! lattice_ncfile_t: store data to calculate lattice_ncfile
10 : !!
11 : !! COPYRIGHT
12 : !! Copyright (C) 2001-2026 ABINIT group (hexu)
13 : !! This file is distributed under the terms of the
14 : !! GNU General Public License, see ~abinit/COPYING
15 : !! or http://www.gnu.org/copyleft/gpl.txt .
16 : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt .
17 : !!
18 : !! SOURCE
19 :
20 :
21 : #if defined HAVE_CONFIG_H
22 : #include "config.h"
23 : #endif
24 :
25 : #include "abi_common.h"
26 :
27 :
28 : module m_lattice_ncfile
29 :
30 : use defs_basis
31 : use m_abicore
32 : use m_errors
33 : use m_xmpi
34 : use m_nctk
35 : use m_lattice_harmonic_primitive_potential, only: lattice_harmonic_primitive_potential_t
36 : use m_lattice_harmonic_potential , only: lattice_harmonic_potential_t
37 : use m_multibinit_dataset, only: multibinit_dtset_type
38 : use m_multibinit_cell, only: mbcell_t, mbsupercell_t
39 : use netcdf
40 :
41 : implicit none
42 :
43 : private
44 : !!***
45 : type, public :: lattice_ncfile_t
46 : logical :: isopen=.False. ! if the file is open
47 : ! dimensions
48 : integer :: three, natom
49 : ! three: 3
50 :
51 : ! file id
52 : integer :: ncerr, ncid
53 : ! variable id
54 : integer :: vcart_id, xcart_id, cell_id, time_id, itime_id, etotal_id, ekin_id, entropy_id
55 : integer :: ilatt_prim_id, rvec_id, zion_id, masses_id, ref_xcart_id, ref_cell_id
56 : integer :: itime, ntime,ncell
57 : ! itime: time index
58 : integer :: write_traj=1
59 : !whether to write the trajectory
60 : character(len=fnlen) :: filename
61 : ! netcdf filename
62 : contains
63 : ! initialize
64 : procedure :: initialize
65 : procedure :: finalize
66 : procedure :: def_lattice_var
67 : procedure :: write_cell
68 : procedure :: write_one_step
69 : end type lattice_ncfile_t
70 :
71 : contains
72 3 : subroutine initialize(self, filename, write_traj)
73 : class(lattice_ncfile_t) :: self
74 : character(len=*),intent(in) :: filename
75 : integer, intent(in) :: write_traj
76 : integer :: ncerr
77 3 : self%itime=0
78 3 : self%write_traj=write_traj
79 3 : self%filename=trim(filename)
80 3 : write(std_out,*) "Write iteration in lattice history file "//trim(self%filename)//"."
81 : ! Create netCDF file
82 3 : ncerr = nf90_create(path=trim(filename), cmode=NF90_CLOBBER, ncid=self%ncid)
83 3 : NCF_CHECK_MSG(ncerr, "Error when creating netcdf history file")
84 3 : self%isopen=.True.
85 3 : ncerr =nf90_enddef(self%ncid)
86 3 : NCF_CHECK_MSG(ncerr, "Error when ending def mode in lattice netcdf history file")
87 3 : end subroutine initialize
88 :
89 3 : subroutine finalize(self)
90 : class(lattice_ncfile_t), intent(inout) :: self
91 : integer :: ncerr
92 3 : if (self%isopen) then
93 3 : write(std_out, *) "Closing lattice history file "//trim(self%filename)//"."
94 3 : ncerr=nf90_close(self%ncid)
95 3 : NCF_CHECK_MSG(ncerr, "close netcdf lattice history file"//trim(self%filename)//".")
96 : end if
97 :
98 3 : end subroutine finalize
99 :
100 3 : subroutine write_cell(self, supercell)
101 : class(lattice_ncfile_t), intent(inout) :: self
102 : type(mbsupercell_t), intent(in) :: supercell
103 : integer :: ncerr
104 :
105 3 : ncerr = nf90_redef(self%ncid)
106 3 : NCF_CHECK_MSG(ncerr, "Error when starting defining trajectory variables in lattice history file.")
107 : ! define dimensions
108 3 : ncerr=nf90_def_dim(self%ncid, "three", 3, self%three)
109 3 : NCF_CHECK_MSG(ncerr, "Error when defining dimension three in history file.")
110 :
111 3 : ncerr=nf90_def_dim(self%ncid, "natom", supercell%lattice%natom, self%natom)
112 3 : NCF_CHECK_MSG(ncerr, "Error when defining dimension natom in history file.")
113 :
114 : call ab_define_var(self%ncid, [self%three, self%natom], &
115 9 : & self%rvec_id, NF90_INT, "lattice_rvec", "R-vectors for LATTICE ", "dimensionless")
116 :
117 : call ab_define_var(self%ncid, [self%natom], &
118 : & self%ilatt_prim_id, NF90_INT, "ilatt_prim", &
119 6 : & "index of lattice in primitive cell", "dimensionless")
120 :
121 :
122 : call ab_define_var(self%ncid, [self%three,self%three], &
123 : & self%ref_cell_id, NF90_DOUBLE, "ref_cell", &
124 9 : & "REFerence CELL", "bohr")
125 :
126 :
127 :
128 : call ab_define_var(self%ncid, [self%three,self%natom], &
129 : & self%ref_xcart_id, NF90_DOUBLE, "ref_xcart", &
130 9 : & "REFerence XCART", "bohr")
131 :
132 : call ab_define_var(self%ncid, [self%natom], &
133 : & self%zion_id, NF90_INT, "zion", &
134 6 : & "ZION", "dimensionless")
135 :
136 : call ab_define_var(self%ncid, [self%natom], &
137 : & self%masses_id, NF90_DOUBLE, "masses", &
138 6 : & "MASSES", "dimensionless")
139 :
140 :
141 3 : Ncerr=nf90_enddef(self%ncid)
142 :
143 : ! ncerr=nf90_put_var(self%ncid, self%ilatt_prim_id, [supercell%lattice%ilatt_prim], &
144 : ! & start=[1], count=[supercell%lattice%natom])
145 : ! NCF_CHECK_MSG(ncerr, "Error when writting ilatt_prim in lattice history file.")
146 :
147 : ! ncerr=nf90_put_var(self%ncid, self%rvec_id, [supercell%lattice%rvec], &
148 : ! & start=[1,1], count=[3, supercell%lattice%natom])
149 : ! NCF_CHECK_MSG(ncerr, "Error when writting ilatt_prim in lattice history file.")
150 :
151 : ncerr=nf90_put_var(self%ncid, self%zion_id, [supercell%lattice%zion], &
152 4969 : & start=[1], count=[supercell%lattice%natom])
153 3 : NCF_CHECK_MSG(ncerr, "Error when writting zion in lattice history file.")
154 :
155 : ncerr=nf90_put_var(self%ncid, self%masses_id, [supercell%lattice%masses], &
156 4969 : & start=[1], count=[supercell%lattice%natom])
157 3 : NCF_CHECK_MSG(ncerr, "Error when writting masses in lattice history file.")
158 :
159 : ncerr=nf90_put_var(self%ncid, self%ref_xcart_id, [supercell%lattice%xcart], &
160 17372 : & start=[1,1], count=[3,supercell%lattice%natom])
161 3 : NCF_CHECK_MSG(ncerr, "Error when writting ref_xcart in lattice history file.")
162 :
163 : ncerr=nf90_put_var(self%ncid, self%ref_cell_id, [supercell%lattice%cell], &
164 66 : & start=[1,1], count=[3,3])
165 3 : NCF_CHECK_MSG(ncerr, "Error when writting ref_cell in lattice history file.")
166 :
167 3 : end subroutine write_cell
168 :
169 3 : subroutine def_lattice_var(self)
170 : class(lattice_ncfile_t), intent(inout) :: self
171 : !type(lattice_hist_t),intent(in) :: hist
172 : integer :: ncerr
173 :
174 3 : ncerr = nf90_redef(self%ncid)
175 3 : NCF_CHECK_MSG(ncerr, "Error when starting defining trajectory variables in lattice history file.")
176 : ! define dimensions
177 3 : ncerr=nf90_def_dim(self%ncid, "ntime", nf90_unlimited, self%ntime)
178 3 : NCF_CHECK_MSG(ncerr, "Error when defining dimension ntime in lattice history file.")
179 : !call ab_define_var(ncid,dim1,typat_id,NF90_DOUBLE,&
180 : ! & "typat","types of atoms","dimensionless" )
181 :
182 : !if(self%write_traj==1) then
183 : call ab_define_var(self%ncid, (/self%three, self%natom, self%ntime /), &
184 12 : & self%xcart_id, NF90_DOUBLE, "xcart", "lattice amplitude", "bohr")
185 : call ab_define_var(self%ncid, (/self%three, self%natom, self%ntime /), &
186 12 : & self%vcart_id, NF90_DOUBLE, "vcart", "cartesian velocity", "bohr/a.u.")
187 : call ab_define_var(self%ncid, (/self%three, self%three, self%ntime /), &
188 12 : & self%cell_id, NF90_DOUBLE, "cell", "cell parameters", "bohr")
189 :
190 :
191 : !endif
192 :
193 : !call ab_define_var(self%ncid, (/ self%ntime /), &
194 : ! & self%time_id, NF90_DOUBLE, "time", "time", "s")
195 : call ab_define_var(self%ncid, (/ self%ntime /), &
196 6 : & self%etotal_id, NF90_DOUBLE, "etotal", "TOTAL energy", "Ha")
197 : call ab_define_var(self%ncid, (/ self%ntime /), &
198 6 : & self%ekin_id, NF90_DOUBLE, "ekin", "Kinetic energy", "Ha")
199 :
200 : !call ab_define_var(self%ncid, (/ self%ntime /), &
201 : ! & self%entropy_id, NF90_DOUBLE, "entropy", "Entropy", "Joule/K")
202 :
203 : call ab_define_var(self%ncid, (/ self%ntime /), &
204 6 : & self%itime_id, NF90_INT, "itime", "index of time in timeline", "1")
205 :
206 3 : ncerr=nf90_enddef(self%ncid)
207 3 : NCF_CHECK_MSG(ncerr, "Error when finishing defining variables in lattice history file.")
208 :
209 3 : end subroutine def_lattice_var
210 :
211 :
212 :
213 213 : subroutine write_one_step(self, xcart, vcart, Etotal, Ek)
214 : class(lattice_ncfile_t), intent(inout) :: self
215 : !type(lattice_hist_t), intent(in) :: hist
216 : real(dp) , intent(in) :: Etotal, Ek, xcart(:,:), vcart(:,:)
217 : integer :: ncerr, itime, natom
218 213 : natom=size(xcart, 2)
219 213 : self%itime=self%itime+1
220 213 : itime = self%itime
221 :
222 : !if(self%write_traj ==1) then
223 : ncerr=nf90_put_var(self%ncid, self%xcart_id, xcart, &
224 1491 : & start=[1,1, itime], count=[3,natom, 1])
225 :
226 : ncerr=nf90_put_var(self%ncid, self%vcart_id, vcart, &
227 1491 : & start=[1,1, itime], count=[3,natom, 1])
228 :
229 213 : NCF_CHECK_MSG(ncerr, "Error when writting lattice amplitudes in lattice history file.")
230 : !end if
231 :
232 : ncerr=nf90_put_var(self%ncid, self%etotal_id, [Etotal], &
233 639 : & start=[itime], count=[1])
234 213 : NCF_CHECK_MSG(ncerr, "Error when writting total energy in lattice history file.")
235 :
236 : ncerr=nf90_put_var(self%ncid, self%ekin_id, [Ek], &
237 639 : & start=[itime], count=[1])
238 213 : NCF_CHECK_MSG(ncerr, "Error when writting kinetic energy in lattice history file.")
239 :
240 : ncerr=nf90_put_var(self%ncid, self%itime_id, [self%itime], &
241 639 : & start=[itime], count=[1])
242 213 : NCF_CHECK_MSG(ncerr, "Error when writting itime in lattice history file.")
243 :
244 213 : end subroutine write_one_step
245 :
246 : subroutine close(self)
247 : class(lattice_ncfile_t) :: self
248 : self%isopen=.False.
249 : end subroutine close
250 :
251 :
252 0 : end module m_lattice_ncfile
|