Dice Fortran Backend Documentation
netcdf_out.f90
Go to the documentation of this file.
1 ! ---------------------------------------------------------------------------------------
2 ! Dice Quantum Monte Carlo
3 ! ---------------------------------------------------------------------------------------
4 ! MODULE: NetCDF output
5 !
6 ! DESCRIPTION:
9 !
13 ! ---------------------------------------------------------------------------------------
14 
15 
17  use iso_fortran_env
18  use netcdf
19  use shared_data
20 
21  implicit none
22 
23 contains
24 
25 ! ---------------------------------------------------------------------------------------
26 ! SECTION: NetCDF Check
27 ! ---------------------------------------------------------------------------------------
28 
29 
30  ! -----------------------------------------------------------------------------------
31  ! ROUTINE: error_check
32  !
33  ! DESCRIPTION:
36  !
38  !
39  ! PARAMETERS:
41  ! -----------------------------------------------------------------------------------
42  subroutine error_check(ierr)
43  integer,intent(in) :: ierr
44  if (ierr /= nf90_noerr) then
45  print*, trim(nf90_strerror(ierr))
46  return
47  endif
48  end subroutine error_check
49 
50 ! ---------------------------------------------------------------------------------------
51 ! SECTION: Equilibration Outputs
52 ! ---------------------------------------------------------------------------------------
53 
54 
55  ! -----------------------------------------------------------------------------------
56  ! ROUTINE: write_QHO_equilibration
57  !
58  ! DESCRIPTION:
61  !
64  !
65  ! PARAMETERS:
72  ! -----------------------------------------------------------------------------------
73  subroutine write_qho_equilibration(position_array, energy_array, filename, ierr, &
74  QHO, accept_rate, alpha)
75  ! Declaring input variables
76  real(real64), intent(in), dimension(:) :: position_array, energy_array
77  character(len=*), intent(in) :: filename
78  type(qho_type), intent(in) :: QHO
79  real(real64), intent(in) :: accept_rate, alpha
80 
81 
82  ! Declaring other variables
83  integer, parameter :: ndims=1 ! Dimension of array (1D)
84  integer, parameter :: n_arrays = 2 ! Number of arrays to output
85  integer, dimension(ndims) :: dim_id ! Size of array and dimension ID
86  character(len=1), dimension(ndims) :: dims=(/"t"/) ! Write along t axis
87  integer, dimension(n_arrays) :: var_id ! Variable IDs
88  integer :: ierr, file_id, i ! Error check status, file ID, iterator
89 
90 
91  ! Create file, overwrite if existing
92  ierr = nf90_create(filename, nf90_clobber, file_id)
93  call error_check(ierr)
94 
95  ! 1D array, define dimension
96  do i = 1, ndims
97  ierr = nf90_def_dim(file_id, dims(i), nf90_unlimited, dim_id(i))
98  call error_check(ierr)
99  enddo
100 
101  ! Global metadata
102 
103  ierr = nf90_put_att(file_id, nf90_global, "rcut", qho%rcut)
104  call error_check(ierr)
105  ierr = nf90_put_att(file_id, nf90_global, "sigma", qho%sigma)
106  call error_check(ierr)
107  ierr = nf90_put_att(file_id, nf90_global, "accept_rate", accept_rate)
108  call error_check(ierr)
109  ierr = nf90_put_att(file_id, nf90_global, "alpha", alpha)
110  call error_check(ierr)
111  ierr = nf90_put_att(file_id, nf90_global, "system", "QHO")
112  call error_check(ierr)
113 
114 
115  ! Define variable types from 1D array(s) (real)
116  ierr = nf90_def_var(file_id, "positions", nf90_double, dim_id, var_id(1))
117  call error_check(ierr)
118 
119  ierr = nf90_def_var(file_id, "energies", nf90_double, dim_id, var_id(2))
120  call error_check(ierr)
121 
122  ! Finish defining metadata
123  ierr = nf90_enddef(file_id)
124  call error_check(ierr)
125 
126  ! Actually write 1D array
127  ierr = nf90_put_var(file_id, var_id(1), position_array)
128  call error_check(ierr)
129 
130  ierr = nf90_put_var(file_id, var_id(2), energy_array)
131  call error_check(ierr)
132 
133  ! Close file
134  ierr = nf90_close(file_id)
135  call error_check(ierr)
136 
137  end subroutine write_qho_equilibration
138 
139  ! -----------------------------------------------------------------------------------
140  ! ROUTINE: write_H2plus_equilibration
141  !
142  ! DESCRIPTION:
145  !
148  !
149  ! PARAMETERS:
157  ! -----------------------------------------------------------------------------------
158  subroutine write_h2plus_equilibration(position_array, energy_array, filename, &
159  ierr, H2plus, accept_rate, c, bond_length)
160  ! Declaring input variables
161  real(real64), intent(in), dimension(:, :) :: position_array
162  real(real64), intent(in), dimension(:) :: energy_array
163  character(len=*), intent(in) :: filename
164  type(h2plus_type), intent(in) :: H2plus
165  real(real64), intent(in) :: accept_rate
166  real(real64), intent(in) :: c
167  real(real64), intent(in) :: bond_length
168 
169 
170  ! Declaring other variables
171  integer, parameter :: ndims=2 ! Dimension of position array (2D)
172  integer, parameter :: n_arrays = 2 ! Number of arrays to output
173  integer, dimension(ndims) :: dim_id ! Size of array and dimension ID
174  character(len=1), dimension(ndims) :: dims=(/"y", "t"/) ! Write along t,y axes
175  integer, dimension(ndims) :: dim_lengths=(/3, nf90_unlimited/)
176  integer, dimension(n_arrays) :: var_id ! Variable IDs
177  integer :: ierr, file_id, i ! Error check status, file ID, iterator
178 
179 
180 
181  ! Create file, overwrite if existing
182  ierr = nf90_create(filename, nf90_clobber, file_id)
183  call error_check(ierr)
184 
185  ! 1D array, define dimension
186  do i = 1, ndims
187  ierr = nf90_def_dim(file_id, dims(i), dim_lengths(i), dim_id(i))
188  call error_check(ierr)
189  enddo
190 
191  ! Global metadata
192 
193  ierr = nf90_put_att(file_id, nf90_global, "rcut", h2plus%rcut)
194  call error_check(ierr)
195  ierr = nf90_put_att(file_id, nf90_global, "sigma", h2plus%sigma)
196  call error_check(ierr)
197  ierr = nf90_put_att(file_id, nf90_global, "accept_rate", accept_rate)
198  call error_check(ierr)
199  ierr = nf90_put_att(file_id, nf90_global, "parameter_c", c)
200  call error_check(ierr)
201  ierr = nf90_put_att(file_id, nf90_global, "bond_length", bond_length)
202  call error_check(ierr)
203  ierr = nf90_put_att(file_id, nf90_global, "system", "H2plus")
204  call error_check(ierr)
205 
206 
207  ! Define variable types from 2D array(s) (real)
208  ierr = nf90_def_var(file_id, "positions", nf90_double, dim_id, var_id(1))
209  call error_check(ierr)
210 
211  ! Define variable types from 1D array (real)
212  ierr = nf90_def_var(file_id, "energies", nf90_double, dim_id(2), var_id(2))
213  call error_check(ierr)
214 
215  ! Finish defining metadata
216  ierr = nf90_enddef(file_id)
217  call error_check(ierr)
218 
219  ! Actually write 2D array
220  ierr = nf90_put_var(file_id, var_id(1), position_array)
221  call error_check(ierr)
222  ! Actually write 1D array(s)
223  ierr = nf90_put_var(file_id, var_id(2), energy_array)
224  call error_check(ierr)
225 
226  ! Close file
227  ierr = nf90_close(file_id)
228  call error_check(ierr)
229 
230  end subroutine write_h2plus_equilibration
231 
232  ! -----------------------------------------------------------------------------------
233  ! ROUTINE: write_H2_equilibration
234  !
235  ! DESCRIPTION:
238  !
241  !
242  ! PARAMETERS:
250  ! -----------------------------------------------------------------------------------
251  subroutine write_h2_equilibration(position_array, energy_array, filename, &
252  ierr, H2, accept_rate, beta, bond_length)
253  ! Declaring input variables
254  real(real64), intent(in), dimension(:, :) :: position_array
255  real(real64), intent(in), dimension(:) :: energy_array
256  character(len=*), intent(in) :: filename
257  type(h2_type), intent(in) :: H2
258  real(real64), intent(in) :: accept_rate
259  real(real64), intent(in) :: beta
260  real(real64), intent(in) :: bond_length
261 
262 
263  ! Declaring other variables
264  integer, parameter :: ndims=2 ! Dimension of position array (2D)
265  integer, parameter :: n_arrays = 2 ! Number of arrays to output
266  integer, dimension(ndims) :: dim_id ! Size of array and dimension ID
267  character(len=1), dimension(ndims) :: dims=(/"y", "t"/) ! Write along t,y axes
268  integer, dimension(ndims) :: dim_lengths=(/3, nf90_unlimited/)
269  integer, dimension(n_arrays) :: var_id ! Variable IDs
270  integer :: ierr, file_id, i ! Error check status, file ID, iterator
271 
272 
273  ! Create file, overwrite if existing
274  ierr = nf90_create(filename, nf90_clobber, file_id)
275  call error_check(ierr)
276 
277  ! 1D array, define dimension
278  do i = 1, ndims
279  ierr = nf90_def_dim(file_id, dims(i), dim_lengths(i), dim_id(i))
280  call error_check(ierr)
281  enddo
282 
283  ! Global metadata
284 
285  ierr = nf90_put_att(file_id, nf90_global, "rcut", h2%rcut)
286  call error_check(ierr)
287  ierr = nf90_put_att(file_id, nf90_global, "sigma", h2%sigma)
288  call error_check(ierr)
289  ierr = nf90_put_att(file_id, nf90_global, "accept_rate", accept_rate)
290  call error_check(ierr)
291  ierr = nf90_put_att(file_id, nf90_global, "beta", beta)
292  call error_check(ierr)
293  ierr = nf90_put_att(file_id, nf90_global, "bond_length", bond_length)
294  call error_check(ierr)
295  ierr = nf90_put_att(file_id, nf90_global, "system", "H2")
296  call error_check(ierr)
297 
298 
299  ! Define variable types from 1D array(s) (real)
300  ierr = nf90_def_var(file_id, "positions", nf90_double, dim_id, var_id(1))
301  call error_check(ierr)
302 
303  ! Define variable types from 1D array (real)
304  ierr = nf90_def_var(file_id, "energies", nf90_double, dim_id(2), var_id(2))
305  call error_check(ierr)
306 
307  ! Finish defining metadata
308  ierr = nf90_enddef(file_id)
309  call error_check(ierr)
310 
311  ! Actually write 2D array
312  ierr = nf90_put_var(file_id, var_id(1), position_array)
313  call error_check(ierr)
314  ! Actually write 1D array(s)
315  ierr = nf90_put_var(file_id, var_id(2), energy_array)
316  call error_check(ierr)
317 
318  ! Close file
319  ierr = nf90_close(file_id)
320  call error_check(ierr)
321 
322  end subroutine write_h2_equilibration
323 
324 ! ---------------------------------------------------------------------------------------
325 ! SECTION: Main Outputs
326 ! ---------------------------------------------------------------------------------------
327 
328 
329  ! -----------------------------------------------------------------------------------
330  ! ROUTINE: write_QHO_main
331  !
332  ! DESCRIPTION:
335  !
338  !
339  ! PARAMETERS:
346  ! -----------------------------------------------------------------------------------
347  subroutine write_qho_main(alpha_array,energy_array,uncertainty_array,filename,ierr,QHO,accept_rate)
348  ! Declaring input variables
349  real(real64), intent(in), dimension(:) :: alpha_array, energy_array, uncertainty_array
350  character(len=*), intent(in) :: filename
351  type(qho_type), intent(in) :: QHO
352  real(real64), intent(in), dimension(:) :: accept_rate
353 
354 
355  ! Declaring other variables
356  integer, parameter :: ndims=1 ! Dimension of array (1D)
357  integer, dimension(ndims) :: dim_id ! Size of array and dimension ID
358  character(len=1), dimension(ndims) :: dims=(/"t"/) ! Write along t axis
359  integer :: ierr, file_id, var_id, var_id_, var_id__, i ! Error check status, file and variable ID(s), iterator
360 
361 
362  ! Create file, overwrite if existing
363  ! Check this! May need care if splitting write into sections
364  ierr = nf90_create(filename, nf90_clobber, file_id)
365  call error_check(ierr)
366 
367  ! 1D array, define dimension
368  do i = 1, ndims
369  ierr = nf90_def_dim(file_id, dims(i), nf90_unlimited, dim_id(i))
370  call error_check(ierr)
371  enddo
372 
373  ! Global metadata
374 
375  ierr = nf90_put_att(file_id, nf90_global, "burn_step", qho%burn_step)
376  call error_check(ierr)
377  ierr = nf90_put_att(file_id, nf90_global, "thin_step", qho%thin_step)
378  call error_check(ierr)
379  ierr = nf90_put_att(file_id, nf90_global, "rcut", qho%rcut)
380  call error_check(ierr)
381  ierr = nf90_put_att(file_id, nf90_global, "sigma", qho%sigma)
382  call error_check(ierr)
383  ierr = nf90_put_att(file_id, nf90_global, "accept_rate", accept_rate)
384  call error_check(ierr)
385  ierr = nf90_put_att(file_id, nf90_global, "system", "QHO")
386  call error_check(ierr)
387 
388  ! Define variable types from 1D array(s) (real)
389  ierr = nf90_def_var(file_id, "Alpha_array", nf90_double, dim_id, var_id)
390  call error_check(ierr)
391 
392  ierr = nf90_def_var(file_id, "total_energies", nf90_double, dim_id, var_id_)
393  call error_check(ierr)
394 
395  ierr = nf90_def_var(file_id, "Uncertainties", nf90_double, dim_id, var_id__)
396  call error_check(ierr)
397 
398  ! Finish defining metadata
399  ierr = nf90_enddef(file_id)
400  call error_check(ierr)
401 
402  ! Actually write 1D array(s)
403  ierr = nf90_put_var(file_id, var_id, alpha_array)
404  call error_check(ierr)
405 
406  ierr = nf90_put_var(file_id, var_id_, energy_array)
407  call error_check(ierr)
408 
409  ierr = nf90_put_var(file_id, var_id__, uncertainty_array)
410  call error_check(ierr)
411 
412  ! Close file
413  ierr = nf90_close(file_id)
414  call error_check(ierr)
415 
416  end subroutine write_qho_main
417 
418  ! -----------------------------------------------------------------------------------
419  ! ROUTINE: write_H2plus_main
420  !
421  ! DESCRIPTION:
424  !
427  !
428  ! PARAMETERS:
436  ! -----------------------------------------------------------------------------------
437  subroutine write_h2plus_main(param_array, bondlength_array, energy_array, &
438  uncertainty_array, filename, ierr, H2plus, accept_rate)
439 
440  ! Declaring input variables
441  real(real64), intent(in), dimension(:) :: param_array, bondlength_array
442  real(real64), intent(in), dimension(:) :: energy_array, uncertainty_array
443  character(len=*), intent(in) :: filename
444  type(h2plus_type), intent(in) :: H2plus
445  real(real64), intent(in), dimension(:) :: accept_rate
446 
447 
448  ! Declaring other variables
449  integer, parameter :: ndims=1 ! Dimension of array (1D)
450  integer, parameter :: n_arrays = 4 ! Number of arrays to output
451  integer, dimension(ndims) :: dim_id ! Size of array and dimension ID
452  character(len=1), dimension(ndims) :: dims=(/"t"/) ! Write along t axis
453  integer, dimension(n_arrays) :: var_id ! Variable IDs
454  integer :: ierr, file_id, i ! Error check status, file ID, iterator
455 
456 
457  ! Create file, overwrite if existing
458  ! Check this! May need care if splitting write into sections
459  ierr = nf90_create(filename, nf90_clobber, file_id)
460  call error_check(ierr)
461 
462  ! 1D array, define dimension
463  do i = 1, ndims
464  ierr = nf90_def_dim(file_id, dims(i), nf90_unlimited, dim_id(i))
465  call error_check(ierr)
466  enddo
467 
468  ! Global metadata
469 
470  ierr = nf90_put_att(file_id, nf90_global, "burn_step", h2plus%burn_step)
471  call error_check(ierr)
472  ierr = nf90_put_att(file_id, nf90_global, "thin_step", h2plus%thin_step)
473  call error_check(ierr)
474  ierr = nf90_put_att(file_id, nf90_global, "rcut", h2plus%rcut)
475  call error_check(ierr)
476  ierr = nf90_put_att(file_id, nf90_global, "sigma", h2plus%sigma)
477  call error_check(ierr)
478  ierr = nf90_put_att(file_id, nf90_global, "c_grid", h2plus%c_grid)
479  call error_check(ierr)
480  ierr = nf90_put_att(file_id, nf90_global, "accept_rate", accept_rate)
481  call error_check(ierr)
482  ierr = nf90_put_att(file_id, nf90_global, "system", "H2plus")
483  call error_check(ierr)
484 
485 
486  ! Define variable types from 1D array(s) (real)
487  ierr = nf90_def_var(file_id, "Parameter_array", nf90_double, dim_id, var_id(1))
488  call error_check(ierr)
489 
490  ierr = nf90_def_var(file_id, "Bondlength_array", nf90_double, dim_id, var_id(2))
491  call error_check(ierr)
492 
493  ierr = nf90_def_var(file_id, "total_energies", nf90_double, dim_id, var_id(3))
494  call error_check(ierr)
495 
496  ierr = nf90_def_var(file_id, "Uncertainties", nf90_double, dim_id, var_id(4))
497  call error_check(ierr)
498 
499  ! Finish defining metadata
500  ierr = nf90_enddef(file_id)
501  call error_check(ierr)
502 
503  ! Actually write 1D array(s)
504  ierr = nf90_put_var(file_id, var_id(1), param_array)
505  call error_check(ierr)
506 
507  ierr = nf90_put_var(file_id, var_id(2), bondlength_array)
508  call error_check(ierr)
509 
510  ierr = nf90_put_var(file_id, var_id(3), energy_array)
511  call error_check(ierr)
512 
513  ierr = nf90_put_var(file_id, var_id(4), uncertainty_array)
514  call error_check(ierr)
515 
516  ! Close file
517  ierr = nf90_close(file_id)
518  call error_check(ierr)
519 
520  end subroutine write_h2plus_main
521 
522  ! -----------------------------------------------------------------------------------
523  ! ROUTINE: write_H2_main
524  !
525  ! DESCRIPTION:
528  !
531  !
532  ! PARAMETERS:
541  ! -----------------------------------------------------------------------------------
542  subroutine write_h2_main(param_a_array, param_beta_array, bondlength_array, &
543  energy_array, uncertainty_array, filename, ierr, H2, accept_rate)
544  ! Declaring input variables
545  real(real64), intent(in), dimension(:) :: param_a_array, param_beta_array
546  real(real64), intent(in), dimension(:) :: bondlength_array, energy_array
547  real(real64), intent(in), dimension(:) :: uncertainty_array
548  character(len=*), intent(in) :: filename
549  type(h2_type), intent(in) :: H2
550  real(real64), intent(in), dimension(:) :: accept_rate
551 
552 
553  ! Declaring other variables
554  integer, parameter :: ndims=1 ! Dimension of array (1D)
555  integer, parameter :: n_arrays = 5 ! Number of arrays to output
556  integer, dimension(ndims) :: dim_id ! Size of array and dimension ID
557  character(len=1), dimension(ndims) :: dims=(/"t"/) ! Write along t axis
558  integer, dimension(n_arrays) :: var_id ! Variable IDs
559  integer :: ierr, file_id, i ! Error check status, file ID, iterator
560 
561 
562  ! Create file, overwrite if existing
563  ! Check this! May need care if splitting write into sections
564  ierr = nf90_create(filename, nf90_clobber, file_id)
565  call error_check(ierr)
566 
567  ! 1D array, define dimension
568  do i = 1, ndims
569  ierr = nf90_def_dim(file_id, dims(i), nf90_unlimited, dim_id(i))
570  call error_check(ierr)
571  enddo
572 
573  ! Global metadata
574 
575  ierr = nf90_put_att(file_id, nf90_global, "burn_step", h2%burn_step)
576  call error_check(ierr)
577  ierr = nf90_put_att(file_id, nf90_global, "thin_step", h2%thin_step)
578  call error_check(ierr)
579  ierr = nf90_put_att(file_id, nf90_global, "rcut", h2%rcut)
580  call error_check(ierr)
581  ierr = nf90_put_att(file_id, nf90_global, "sigma", h2%sigma)
582  call error_check(ierr)
583  ierr = nf90_put_att(file_id, nf90_global, "beta_grid", h2%beta_grid)
584  call error_check(ierr)
585  ierr = nf90_put_att(file_id, nf90_global, "accept_rate", accept_rate)
586  call error_check(ierr)
587  ierr = nf90_put_att(file_id, nf90_global, "system", "H2")
588  call error_check(ierr)
589 
590 
591  ! Define variable types from 1D array(s) (real)
592  ierr = nf90_def_var(file_id, "Parameter_a_array", nf90_double, dim_id, var_id(1))
593  call error_check(ierr)
594 
595  ierr = nf90_def_var(file_id, "Parameter_beta_array", nf90_double, dim_id, var_id(2))
596  call error_check(ierr)
597 
598  ierr = nf90_def_var(file_id, "Bondlength_array", nf90_double, dim_id, var_id(3))
599  call error_check(ierr)
600 
601  ierr = nf90_def_var(file_id, "total_energies", nf90_double, dim_id, var_id(4))
602  call error_check(ierr)
603 
604  ierr = nf90_def_var(file_id, "Uncertainties", nf90_double, dim_id, var_id(5))
605  call error_check(ierr)
606 
607  ! Finish defining metadata
608  ierr = nf90_enddef(file_id)
609  call error_check(ierr)
610 
611  ! Actually write 1D array(s)
612  ierr = nf90_put_var(file_id, var_id(1), param_a_array)
613  call error_check(ierr)
614 
615  ierr = nf90_put_var(file_id, var_id(2), param_beta_array)
616  call error_check(ierr)
617 
618  ierr = nf90_put_var(file_id, var_id(3), bondlength_array)
619  call error_check(ierr)
620 
621  ierr = nf90_put_var(file_id, var_id(4), energy_array)
622  call error_check(ierr)
623 
624  ierr = nf90_put_var(file_id, var_id(5), uncertainty_array)
625  call error_check(ierr)
626 
627  ! Close file
628  ierr = nf90_close(file_id)
629  call error_check(ierr)
630 
631  end subroutine write_h2_main
632 
633 
634 ! -----------------------------------------------------------------------------------
635 ! ROUTINE: chain_output_1d
636 !
637 ! DESCRIPTION:
640 !
641 ! PARAMETERS:
645 ! -----------------------------------------------------------------------------------
646 subroutine chain_output_1d(position_array, energy_array, filename, ierr)
647  ! Declaring input variables
648  real(real64), intent(in), dimension(:) :: position_array, energy_array
649  character(len=*), intent(in) :: filename
650 
651  ! Declaring other variables
652  integer, parameter :: ndims=1 ! Dimension of array (1D)
653  integer, parameter :: n_arrays = 2 ! Number of arrays to output
654  integer, dimension(ndims) :: dim_id ! Size of array and dimension ID
655  character(len=1), dimension(ndims) :: dims=(/"t"/) ! Write along t axis
656  integer, dimension(n_arrays) :: var_id ! Variable IDs
657  integer :: ierr, file_id, i ! Error check status, file ID, iterator
658 
659  ! Create file, overwrite if existing
660  ierr = nf90_create(filename, nf90_clobber, file_id)
661  call error_check(ierr)
662 
663  ! 1D array, define dimension
664  do i = 1, ndims
665  ierr = nf90_def_dim(file_id, dims(i), nf90_unlimited, dim_id(i))
666  call error_check(ierr)
667  enddo
668 
669  ! Global metadata
670  ! TO DO
671 
672  ! Define variable types from 1D array (real)
673  ierr = nf90_def_var(file_id, "Positions", nf90_double, dim_id, var_id(1))
674  call error_check(ierr)
675 
676  ierr = nf90_def_var(file_id, "Energies", nf90_double, dim_id, var_id(2))
677  call error_check(ierr)
678 
679  ! Finish defining metadata
680  ierr = nf90_enddef(file_id)
681  call error_check(ierr)
682 
683  ! Actually write 1D array(s)
684  ierr = nf90_put_var(file_id, var_id(1), position_array)
685  call error_check(ierr)
686 
687  ierr = nf90_put_var(file_id, var_id(2), energy_array)
688  call error_check(ierr)
689 
690  ! Close file
691  ierr = nf90_close(file_id)
692  call error_check(ierr)
693 
694 end subroutine chain_output_1d
695 
696 ! -----------------------------------------------------------------------------------
697 ! ROUTINE: chain_output_3d
698 !
699 ! DESCRIPTION:
702 !
703 ! PARAMETERS:
707 ! -----------------------------------------------------------------------------------
708 subroutine chain_output_3d(position_array_3d, energy_array, filename, ierr)
709 
710  ! Declaring input variables
711  real(real64), intent(in), dimension(:,:) :: position_array_3d
712  real(real64), intent(in), dimension(:) :: energy_array
713  character(len=*), intent(in) :: filename
714 
715  ! Declaring other variables
716  integer, parameter :: ndims=2 ! Dimension of position array (2D)
717  integer, parameter :: n_arrays = 2 ! Number of arrays to output
718  integer, dimension(ndims) :: dim_id ! Size of array and dimension ID
719  character(len=1), dimension(ndims) :: dims=(/"y", "t"/) ! Write along t,y axes
720  integer, dimension(ndims) :: dim_lengths=(/3, nf90_unlimited/)
721  integer, dimension(n_arrays) :: var_id ! Variable IDs
722  integer :: ierr, file_id, i ! Error check status, file ID, iterator
723 
724  ! Create file, overwrite if existing
725  ierr = nf90_create(filename, nf90_clobber, file_id)
726  call error_check(ierr)
727 
728  ! 2D array, define dimensions
729  do i = 1, ndims
730  ierr = nf90_def_dim(file_id, dims(i), dim_lengths(i), dim_id(i))
731  call error_check(ierr)
732  enddo
733 
734  ! Global metadata
735  ! TO DO
736 
737  ! Define variable types from 2D array (real)
738  ierr = nf90_def_var(file_id, "3D Positions", nf90_double, dim_id, var_id(1))
739  call error_check(ierr)
740  ! Define variable types from 1D array (real)
741  ierr = nf90_def_var(file_id, "Energies", nf90_double, dim_id(2), var_id(2))
742  call error_check(ierr)
743 
744  ! Finish defining metadata
745  ierr = nf90_enddef(file_id)
746  call error_check(ierr)
747 
748  ! Actually write 2D array(s)
749  ierr = nf90_put_var(file_id, var_id(1), position_array_3d)
750  call error_check(ierr)
751  ! Actually write 1D array(s)
752  ierr = nf90_put_var(file_id, var_id(2), energy_array)
753  call error_check(ierr)
754 
755  ! Close file
756  ierr = nf90_close(file_id)
757  call error_check(ierr)
758 
759 end subroutine chain_output_3d
760 
761 
762 ! -----------------------------------------------------------------------------------
763 ! ROUTINE: append_to_array
764 !
765 ! DESCRIPTION:
768 !
769 ! PARAMETERS:
772 ! -----------------------------------------------------------------------------------
773 subroutine append_to_array(array, filename, ierr)
774  ! Declaring inpit variables
775  real, intent(in), dimension(:) :: array
776  character(len=*), intent(in) :: filename
777 
778  ! Declaring other variables
779  integer, parameter :: ndims=1 ! Dimension of array (1D)
780  integer, dimension(ndims) :: dim_id ! Size of array and dimension ID
781  character(len=1), dimension(ndims) :: dims=(/"t"/) ! Write along t axis
782  integer :: ierr, file_id, var_id, i, array_length ! Error check status, file and variable ID, iterator
783  integer, dimension(1) :: start_array
784 
785 
786  ! Open existing NetCDF file in read / write mode
787  ierr = nf90_open(filename, nf90_write, file_id)
788  call error_check(ierr)
789 
790  ! Grab variable ID of Trace / 1D array
791  ierr = nf90_inq_varid(file_id, "Trace", var_id)
792  call error_check(ierr)
793 
794  ! Grab dimension ID of Trace / 1D array ("t")
795  do i = 1, ndims
796  ierr = nf90_inq_dimid(file_id, dims(i), dim_id(i))
797  call error_check(ierr)
798  enddo
799 
800  ! Grab length of dimension / 1D array
801  ierr = nf90_inquire_dimension(file_id, dim_id(1), dims(1), array_length)
802  call error_check(ierr)
803 
804  start_array(1) = array_length
805 
806  ! Write new data to end of 1D array
807  ierr = nf90_put_var(file_id, var_id, array, start=start_array)
808  call error_check(ierr)
809 
810  ! Close file
811  ierr = nf90_close(file_id)
812  call error_check(ierr)
813 
814 end subroutine append_to_array
815 
816 end module write_netcdf
Contains derived types, and global variables to store input values of simulation parameters.
Definition: shared_data.f90:49
Contains NetCDF output functions for different problem main & equilibration runs.
Definition: netcdf_out.f90:16
subroutine write_h2plus_main(param_array, bondlength_array, energy_array, uncertainty_array, filename, ierr, H2plus, accept_rate)
Output results of H2plus MCMC run.
Definition: netcdf_out.f90:439
subroutine write_qho_main(alpha_array, energy_array, uncertainty_array, filename, ierr, QHO, accept_rate)
Output results of QHO MCMC run.
Definition: netcdf_out.f90:348
subroutine chain_output_3d(position_array_3d, energy_array, filename, ierr)
Output 3d position and 1d energy arrays of MCMC run to NetCDF file [UNUSED].
Definition: netcdf_out.f90:709
subroutine append_to_array(array, filename, ierr)
Appends array to a 1d NetCDF array in file [UNUSED].
Definition: netcdf_out.f90:774
subroutine write_qho_equilibration(position_array, energy_array, filename, ierr, QHO, accept_rate, alpha)
Output QHO system traces for equilibration.
Definition: netcdf_out.f90:75
subroutine write_h2_equilibration(position_array, energy_array, filename, ierr, H2, accept_rate, beta, bond_length)
Output H2 system trace for equilibration.
Definition: netcdf_out.f90:253
subroutine write_h2_main(param_a_array, param_beta_array, bondlength_array, energy_array, uncertainty_array, filename, ierr, H2, accept_rate)
Output results of H2 MCMC run.
Definition: netcdf_out.f90:544
subroutine error_check(ierr)
Checks error status at each point of NetCDF file build.
Definition: netcdf_out.f90:43
subroutine chain_output_1d(position_array, energy_array, filename, ierr)
Output 1d position and energy arrays of MCMC run to NetCDF file [UNUSED].
Definition: netcdf_out.f90:647
subroutine write_h2plus_equilibration(position_array, energy_array, filename, ierr, H2plus, accept_rate, c, bond_length)
Output H2_plus system trace for equilibration.
Definition: netcdf_out.f90:160
Derived Type for Hydrogen Molecule, including VQMC defaults.
Definition: shared_data.f90:97
Derived Type for Hydrogen Ion, including VQMC defaults.
Definition: shared_data.f90:79
Derived Type for Quantum Harmonic Oscillator, including VQMC defaults.
Definition: shared_data.f90:67