Line data Source code
1 : !!****m* ABINIT/m_lwf_ncfile
2 : !! NAME
3 : !! m_lwf_ncfile
4 : !!
5 : !! FUNCTION
6 : !! This module contains the subroutines for output netcdf file
7 : !!
8 : !!
9 : !! Datatypes:
10 : !! lwf_ncfile_t: store data to calculate lwf_ncfile
11 : !!
12 : !!
13 : !! COPYRIGHT
14 : !! Copyright (C) 2001-2026 ABINIT group (hexu)
15 : !! This file is distributed under the terms of the
16 : !! GNU General Public License, see ~abinit/COPYING
17 : !! or http://www.gnu.org/copyleft/gpl.txt .
18 : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt .
19 : !!
20 : !! SOURCE
21 :
22 :
23 : #if defined HAVE_CONFIG_H
24 : #include "config.h"
25 : #endif
26 :
27 : #include "abi_common.h"
28 :
29 : module m_lwf_ncfile
30 :
31 : use defs_basis
32 : use m_abicore
33 : use m_errors
34 : use m_xmpi
35 : use m_nctk
36 : use m_lwf_hist , only: lwf_hist_t
37 : use m_lwf_primitive_potential, only: lwf_primitive_potential_t
38 : use m_lwf_potential , only: lwf_potential_t
39 : use m_multibinit_dataset, only: multibinit_dtset_type
40 : use m_multibinit_cell, only: mbcell_t, mbsupercell_t
41 : use m_lwf_observables, only : lwf_observables_t
42 : #if defined HAVE_NETCDF
43 : use netcdf
44 : #endif
45 : implicit none
46 :
47 : private
48 : !!***
49 : type, public :: lwf_ncfile_t
50 : logical :: isopen=.False. ! if the file is open
51 : ! dimensions
52 : integer :: three, nlwf
53 : ! three: 3
54 :
55 : ! file id
56 : integer :: ncerr, ncid
57 : ! variable id
58 : integer :: lwf_id, time_id, itime_id, etotal_id, entropy_id, displacement_id
59 : integer :: ilwf_prim_id, rvec_id, lwf_masses_id, natom_id
60 : integer :: itime, ntime,ncell
61 : ! itime: time index
62 : integer :: write_traj=1
63 : !whether to write the trajectory
64 : character(len=fnlen) :: filename
65 :
66 : ! netcdf filename
67 : logical :: has_constrain=.False.
68 : integer :: n_fixed_lwf
69 : integer, allocatable :: fixed_lwf_ids(:)
70 : real(dp), allocatable :: fixed_lwf_values(:)
71 : contains
72 : ! initialize
73 : procedure :: initialize
74 : procedure :: finalize
75 : procedure :: def_lwf_var
76 : procedure :: write_cell
77 : procedure :: write_one_step
78 : end type lwf_ncfile_t
79 :
80 : contains
81 7 : subroutine initialize(self, filename, write_traj)
82 : class(lwf_ncfile_t) :: self
83 : character(len=*),intent(in) :: filename
84 : integer, intent(in) :: write_traj
85 : integer :: ncerr
86 7 : self%itime=0
87 7 : self%write_traj=write_traj
88 7 : self%filename=trim(filename)
89 : #if defined HAVE_NETCDF
90 7 : write(std_out,*) "Write iteration in lwf history file "//trim(self%filename)//"."
91 : ! Create netCDF file
92 7 : ncerr = nf90_create(path=trim(self%filename), cmode=NF90_NETCDF4, ncid=self%ncid)
93 7 : NCF_CHECK_MSG(ncerr, "Error when creating netcdf history file")
94 7 : self%isopen=.True.
95 7 : ncerr =nf90_enddef(self%ncid)
96 7 : NCF_CHECK_MSG(ncerr, "Error when ending def mode in lwf netcdf history file")
97 : #endif
98 7 : end subroutine initialize
99 :
100 7 : subroutine finalize(self)
101 : class(lwf_ncfile_t), intent(inout) :: self
102 : #if defined HAVE_NETCDF
103 : integer :: ncerr
104 7 : if (self%isopen) then
105 7 : write(std_out, *) "Closing lwf history file "//trim(self%filename)//"."
106 7 : ncerr=nf90_close(self%ncid)
107 7 : NCF_CHECK_MSG(ncerr, "close netcdf lwf history file"//trim(self%filename)//".")
108 : end if
109 : #endif
110 7 : end subroutine finalize
111 :
112 7 : subroutine write_cell(self, supercell)
113 : class(lwf_ncfile_t), intent(inout) :: self
114 : type(mbsupercell_t), intent(in) :: supercell
115 : integer :: ncerr, natom3, nnz, id_nnz, id_natom3, id_map_ilwf, id_map_idisp, id_map_val
116 : integer :: latt_rvec_id, ilatt_prim_id, ref_cell_id, ref_xcart_id, zion_id, masses_id
117 : #if defined HAVE_NETCDF
118 7 : ncerr = nf90_redef(self%ncid)
119 7 : NCF_CHECK_MSG(ncerr, "Error when starting defining trajectory variables in lwf history file.")
120 : ! define dimensions
121 7 : ncerr=nf90_def_dim(self%ncid, "three", 3, self%three)
122 7 : NCF_CHECK_MSG(ncerr, "Error when defining dimension three in history file.")
123 :
124 7 : ncerr=nf90_def_dim(self%ncid, "nlwf", supercell%lwf%nlwf, self%nlwf)
125 7 : NCF_CHECK_MSG(ncerr, "Error when defining dimension nlwf in history file.")
126 :
127 :
128 7 : ncerr=nf90_def_dim(self%ncid, "natom", supercell%lattice%natom, self%natom_id)
129 7 : NCF_CHECK_MSG(ncerr, "Error when defining dimension natom in history file.")
130 :
131 :
132 7 : natom3=supercell%lwf%lwf_latt_coeffs%coeffs%mshape(1)
133 7 : ncerr=nf90_def_dim(self%ncid, "natom3", natom3, id_natom3)
134 7 : NCF_CHECK_MSG(ncerr, "Error when defining dimension natom3 in history file.")
135 :
136 7 : nnz=supercell%lwf%lwf_latt_coeffs%coeffs%nnz
137 7 : ncerr=nf90_def_dim(self%ncid, "lwf_latt_map_nnz",nnz, id_nnz)
138 7 : NCF_CHECK_MSG(ncerr, "Error when defining dimension nlwf in history file.")
139 :
140 : !ncerr=nf90_def_dim(self%ncid, "nR", 3, self%nlwf)
141 : !NCF_CHECK_MSG(ncerr, "Error when defining dimension three in history file.")
142 :
143 : call ab_define_var(self%ncid, [self%three, self%nlwf], &
144 21 : & self%rvec_id, NF90_INT, "lwf_rvec", "R-vectors for LWF ", "dimensionless")
145 :
146 : call ab_define_var(self%ncid, [self%nlwf], &
147 : & self%ilwf_prim_id, NF90_INT, "ilwf_prim", &
148 14 : & "index of lwf in primitive cell", "dimensionless")
149 :
150 : call ab_define_var(self%ncid, [self%nlwf], &
151 14 : & self%lwf_masses_id, NF90_DOUBLE, "lwf_masses", "LWF MASSES", "dimensionless")
152 :
153 :
154 : ! Lattice
155 : call ab_define_var(self%ncid, [self%three, self%natom_id], &
156 21 : & latt_rvec_id, NF90_INT, "lattice_rvec", "R-vectors for LATTICE ", "dimensionless")
157 :
158 : call ab_define_var(self%ncid, [self%natom_id], &
159 : & ilatt_prim_id, NF90_INT, "ilatt_prim", &
160 14 : & "index of lattice in primitive cell", "dimensionless")
161 :
162 :
163 : call ab_define_var(self%ncid, [self%three,self%three], &
164 : & ref_cell_id, NF90_DOUBLE, "ref_cell", &
165 21 : & "REFerence CELL", "bohr")
166 :
167 : call ab_define_var(self%ncid, [self%three,self%natom_id], &
168 : & ref_xcart_id, NF90_DOUBLE, "ref_xcart", &
169 21 : & "REFerence XCART", "bohr")
170 :
171 : call ab_define_var(self%ncid, [self%natom_id], &
172 : & zion_id, NF90_INT, "zion", &
173 14 : & "ZION", "dimensionless")
174 :
175 : call ab_define_var(self%ncid, [self%natom_id], &
176 : & masses_id, NF90_DOUBLE, "masses", &
177 14 : & "MASSES", "dimensionless")
178 :
179 :
180 :
181 : ! define vars for lwf lattice displacement mapping in the format of a COO matrix.
182 : call ab_define_var(self%ncid, [id_nnz], id_map_idisp, &
183 : & NF90_INT, "lwf_latt_map_id_displacement", &
184 14 : & "LWF lattice mapping coefficient COO matrix displacement id", "dimensionless")
185 :
186 7 : ncerr=nf90_def_var_deflate(self%ncid, id_map_idisp, shuffle=1, deflate=1, deflate_level=2)
187 7 : NCF_CHECK_MSG(ncerr, "Error when defining deflating for variable id_map_idisp")
188 :
189 :
190 :
191 : call ab_define_var(self%ncid, [id_nnz], id_map_ilwf,&
192 : & NF90_INT, "lwf_latt_map_id_lwf", &
193 14 : & "LWF lattice mapping coefficient COO matrix LWF id","dimensionless")
194 :
195 7 : ncerr=nf90_def_var_deflate(self%ncid, id_map_ilwf, shuffle=1, deflate=1, deflate_level=2)
196 7 : NCF_CHECK_MSG(ncerr, "Error when defining delfating for variable id_map_ilwf")
197 :
198 :
199 : call ab_define_var(self%ncid, [id_nnz], id_map_val, &
200 : & NF90_DOUBLE, "lwf_latt_map_values", &
201 14 : & "LWF lattice mapping coefficient COO matrix values","dimensionless")
202 :
203 7 : ncerr=nf90_def_var_deflate(self%ncid, id_map_val, shuffle=1, deflate=1, deflate_level=2)
204 7 : NCF_CHECK_MSG(ncerr, "Error when defining delfating for variable id_map_val")
205 :
206 7 : ncerr=nf90_enddef(self%ncid)
207 :
208 :
209 :
210 : ncerr=nf90_put_var(self%ncid, zion_id, [supercell%lattice%zion], &
211 43029 : & start=[1], count=[supercell%lattice%natom])
212 7 : NCF_CHECK_MSG(ncerr, "Error when writting zion in lattice history file.")
213 :
214 : ncerr=nf90_put_var(self%ncid, masses_id, [supercell%lattice%masses], &
215 43029 : & start=[1], count=[supercell%lattice%natom])
216 7 : NCF_CHECK_MSG(ncerr, "Error when writting masses in lattice history file.")
217 :
218 : ncerr=nf90_put_var(self%ncid, ref_xcart_id, [supercell%lattice%xcart], &
219 150556 : & start=[1,1], count=[3,supercell%lattice%natom])
220 7 : NCF_CHECK_MSG(ncerr, "Error when writting ref_xcart in lattice history file.")
221 :
222 : ncerr=nf90_put_var(self%ncid, ref_cell_id, [supercell%lattice%cell], &
223 154 : & start=[1,1], count=[3,3])
224 7 : NCF_CHECK_MSG(ncerr, "Error when writting ref_cell in lattice history file.")
225 :
226 :
227 :
228 : ncerr=nf90_put_var(self%ncid, self%ilwf_prim_id, [supercell%lwf%ilwf_prim], &
229 14357 : & start=[1], count=[supercell%lwf%nlwf])
230 7 : NCF_CHECK_MSG(ncerr, "Error when writting ilwf_prim in lwf history file.")
231 :
232 : ncerr=nf90_put_var(self%ncid, self%rvec_id, [supercell%lwf%rvec], &
233 50204 : & start=[1,1], count=[3, supercell%lwf%nlwf])
234 7 : NCF_CHECK_MSG(ncerr, "Error when writting lwf rvec in lwf history file.")
235 :
236 : ncerr=nf90_put_var(self%ncid, self%lwf_masses_id, [supercell%lwf%lwf_masses], &
237 14357 : & start=[1], count=[supercell%lwf%nlwf])
238 7 : NCF_CHECK_MSG(ncerr, "Error when writting lwf_masses in lwf history file.")
239 :
240 : ncerr=nf90_put_var(self%ncid, id_map_idisp, &
241 : & supercell%lwf%lwf_latt_coeffs%coeffs%ind%data(1, 1:nnz), &
242 14 : & start=[1], count=[nnz])
243 7 : NCF_CHECK_MSG(ncerr, "Error when writting id_map_idisp in lwf history file.")
244 :
245 :
246 : ncerr=nf90_put_var(self%ncid, id_map_ilwf, &
247 : & supercell%lwf%lwf_latt_coeffs%coeffs%ind%data(2, 1:nnz), &
248 14 : & start=[1], count=[nnz])
249 7 : NCF_CHECK_MSG(ncerr, "Error when writting id_map_ilwf in lwf history file.")
250 :
251 :
252 : ncerr=nf90_put_var(self%ncid, id_map_val, &
253 : & supercell%lwf%lwf_latt_coeffs%coeffs%val%data(1:nnz), &
254 14 : & start=[1], count=[nnz])
255 7 : NCF_CHECK_MSG(ncerr, "Error when writting id_map_ilwf in lwf history file.")
256 :
257 :
258 : #endif
259 :
260 7 : end subroutine write_cell
261 :
262 7 : subroutine def_lwf_var(self, hist)
263 : class(lwf_ncfile_t), intent(inout) :: self
264 : type(lwf_hist_t),intent(in) :: hist
265 : integer :: ncerr
266 7 : ABI_UNUSED_A(hist)
267 :
268 : #if defined HAVE_NETCDF
269 7 : ncerr = nf90_redef(self%ncid)
270 7 : NCF_CHECK_MSG(ncerr, "Error when starting defining trajectory variables in lwf history file.")
271 : ! define dimensions
272 7 : ncerr=nf90_def_dim(self%ncid, "ntime", nf90_unlimited, self%ntime)
273 7 : NCF_CHECK_MSG(ncerr, "Error when defining dimension ntime in lwf history file.")
274 : !call ab_define_var(ncid,dim1,typat_id,NF90_DOUBLE,&
275 : ! & "typat","types of atoms","dimensionless" )
276 :
277 : !if(self%write_traj==1) then
278 : call ab_define_var(self%ncid, (/ self%nlwf, self%ntime /), &
279 21 : & self%lwf_id, NF90_DOUBLE, "lwf", "lwf amplitude", "dimensionless")
280 :
281 7 : ncerr=nf90_def_var_deflate(self%ncid, self%lwf_id, shuffle=1, deflate=1, deflate_level=2)
282 7 : NCF_CHECK_MSG(ncerr, "Error when defining deflating for variable lwf")
283 :
284 : !endif
285 :
286 : !call ab_define_var(self%ncid, (/ self%ntime /), &
287 : ! & self%time_id, NF90_DOUBLE, "time", "time", "s")
288 : call ab_define_var(self%ncid, (/ self%ntime /), &
289 14 : & self%etotal_id, NF90_DOUBLE, "etotal", "TOTAL energy", "Ha")
290 : !call ab_define_var(self%ncid, (/ self%ntime /), &
291 : ! & self%entropy_id, NF90_DOUBLE, "entropy", "Entropy", "Joule/K")
292 :
293 : call ab_define_var(self%ncid, (/ self%ntime /), &
294 14 : & self%itime_id, NF90_INT, "itime", "index of time in timeline", "1")
295 :
296 7 : ncerr=nf90_enddef(self%ncid)
297 7 : NCF_CHECK_MSG(ncerr, "Error when finishing defining variables in lwf history file.")
298 : #endif
299 :
300 7 : end subroutine def_lwf_var
301 :
302 :
303 :
304 217 : subroutine write_one_step(self, hist)
305 : class(lwf_ncfile_t), intent(inout) :: self
306 : type(lwf_hist_t), intent(in) :: hist
307 : integer :: ncerr, itime
308 217 : self%itime=self%itime+1
309 217 : itime = self%itime
310 :
311 : #if defined HAVE_NETCDF
312 : !if(self%write_traj ==1) then
313 : !print *, "Write one step of netcdf."
314 : ncerr=nf90_put_var(self%ncid, self%lwf_id, hist%current_lwf, &
315 1085 : & start=[1, itime], count=[hist%nlwf, 1])
316 217 : NCF_CHECK_MSG(ncerr, "Error when writting lwf amplitudes in lwf history file.")
317 : !end if
318 :
319 : ncerr=nf90_put_var(self%ncid, self%etotal_id, [hist%current_energy], &
320 651 : & start=[itime], count=[1])
321 217 : NCF_CHECK_MSG(ncerr, "Error when writting energy in lwf history file.")
322 :
323 : ncerr=nf90_put_var(self%ncid, self%itime_id, [self%itime], &
324 651 : & start=[itime], count=[1])
325 217 : NCF_CHECK_MSG(ncerr, "Error when writting energy in lwf history file.")
326 :
327 : !ncerr=nf90_put_var(self%ncid, self%displacement_id, [displacement], &
328 : ! & start=[1,itime], count=[3, hist%natom, 1])
329 : !NCF_CHECK_MSG(ncerr, "Error when writting energy in lwf history file.")
330 :
331 : #endif
332 :
333 217 : end subroutine write_one_step
334 :
335 :
336 0 : end module m_lwf_ncfile
|