V3FIT
read_v3post_mod.f
1  MODULE read_v3post_mod
2 !
3 ! Use READ_V3POST_MOD to include variables dynamically allocated
4 ! in this module
5 ! Call DEALLOCATE_READ_V3POST to free this memory when it is no longer needed
6 !
7  USE stel_kinds
8 
9  IMPLICIT NONE
10 #if defined(NETCDF)
11 C-----------------------------------------------
12 C L O C A L P A R A M E T E R S
13 C-----------------------------------------------
14 ! Variable names (vn_...) : put eventually into library, used by read_wout too...
15  CHARACTER (LEN=*), PARAMETER ::
16  1 vn_cal = 'signal_diag_cal',
17  2 vn_cext = 'signal_diag_cext',
18  3 vn_plasma = 'signal_diag_plasma',
19  4 vn_sname = 'signal_diag_sname'
20  CHARACTER(LEN=*), PARAMETER, DIMENSION(1) ::
21  1 d1dim = (/'num_diagno'/)
22  CHARACTER(LEN=*), DIMENSION(2), PARAMETER ::
23  1 d2dim = (/'str_len ','num_diagno'/)
24 #endif
25 !-----------------------------------------------
26 ! L o c a l V a r i a b l e s
27 !-----------------------------------------------
28  INTEGER :: num_diagno
29  REAL(rprec), ALLOCATABLE, DIMENSION(:) :: signal_diag_cext,
30  1 signal_diag_plasma
31  CHARACTER (LEN=30), ALLOCATABLE, DIMENSION(:) :: signal_sname
32 !-----------------------------------------------
33 
34  CONTAINS
35 
36  SUBROUTINE read_v3post_file (file_or_extension, filename, ierr)
37  USE safe_open_mod
38  IMPLICIT NONE
39 C-----------------------------------------------
40 C D u m m y A r g u m e n t s
41 C-----------------------------------------------
42  INTEGER, INTENT(out) :: ierr
43  CHARACTER(LEN=*), INTENT(in) :: file_or_extension
44  CHARACTER(LEN=*), INTENT(out) :: filename
45 C-----------------------------------------------
46 C L o c a l V a r i a b l e s
47 C-----------------------------------------------
48  INTEGER, PARAMETER :: iunit_init = 10
49  INTEGER :: iunit
50  LOGICAL :: isnc
51 C-----------------------------------------------
52 !
53 ! THIS SUBROUTINE READS THE WOUT FILE CREATED BY THE VMEC CODE
54 ! AND STORES THE DATA IN THE READ_WOUT MODULE
55 !
56 ! FIRST, CHECK IF THIS IS A FULLY-QUALIFIED PATH NAME
57 ! MAKE SURE wout IS NOT EMBEDDED IN THE NAME (PERVERSE USER...)
58 !
59  filename = 'v3post'
60  CALL parse_extension(filename, file_or_extension, isnc)
61  IF (isnc) THEN
62 #if defined(NETCDF)
63  CALL read_v3post_nc (filename, ierr)
64 #else
65  print *, "NETCDF wout file can not be opened on this platform"
66  ierr = -100
67 #endif
68  ELSE
69  iunit = iunit_init
70  CALL safe_open (iunit, ierr, filename, 'old', 'formatted')
71  IF (ierr .eq. 0) CALL read_v3post_text(iunit, ierr)
72  CLOSE(unit=iunit)
73  END IF
74 
75  END SUBROUTINE read_v3post_file
76 
77 
78  SUBROUTINE read_v3post_text(iunit, ierr)
79  IMPLICIT NONE
80 C-----------------------------------------------
81 C D u m m y A r g u m e n t s
82 C-----------------------------------------------
83  INTEGER :: iunit, ierr
84 C-----------------------------------------------
85 C L o c a l V a r i a b l e s
86 C-----------------------------------------------
87  stop 'read_v3post TEXT file read not implemented!'
88 
89  END SUBROUTINE read_v3post_text
90 
91 
92 #if defined(NETCDF)
93  SUBROUTINE read_v3post_nc(filename, ierr)
94  USE ezcdf
95  IMPLICIT NONE
96 C-----------------------------------------------
97 C D u m m y A r g u m e n t s
98 C-----------------------------------------------
99  INTEGER, INTENT(out) :: ierr
100  CHARACTER(LEN=*), INTENT(in) :: filename
101 C-----------------------------------------------
102 C L o c a l V a r i a b l e s
103 C-----------------------------------------------
104  INTEGER :: ncdf, istat
105  INTEGER, DIMENSION(2) :: dimlens
106 C-----------------------------------------------
107 ! Open cdf File
108  call cdf_open(ncdf,filename,'r', ierr)
109  IF (ierr .ne. 0) THEN
110  print *,' Error opening v3post .nc file'
111  RETURN
112  END IF
113 
114 ! Be sure all arrays are deallocated
115  CALL read_v3post_deallocate
116 
117  CALL cdf_inquire(ncdf, vn_plasma, dimlens)
118  num_diagno = dimlens(1)
119 
120  ALLOCATE (signal_diag_cext(num_diagno),
121  1 signal_diag_plasma(num_diagno),
122  1 signal_sname(num_diagno), stat=istat)
123 
124  IF (istat .ne. 0) stop 'Allocation error in read_v3post'
125  signal_diag_cext = 0 ; signal_diag_plasma = 0
126  CALL cdf_read(ncdf, vn_cext, signal_diag_cext)
127  CALL cdf_read(ncdf, vn_plasma, signal_diag_plasma)
128  CALL cdf_read(ncdf, vn_sname, signal_sname)
129  CALL cdf_close(ncdf)
130 
131  END SUBROUTINE read_v3post_nc
132 #endif
133 
134  SUBROUTINE read_v3post_deallocate
135  IMPLICIT NONE
136 !-----------------------------------------------
137 ! L o c a l V a r i a b l e s
138 !-----------------------------------------------
139  INTEGER :: istat
140 !-----------------------------------------------
141  istat = 0
142 
143  IF (ALLOCATED(signal_diag_cext)) DEALLOCATE (signal_diag_cext,
144  1 signal_sname, signal_diag_plasma, stat=istat)
145 
146  END SUBROUTINE read_v3post_deallocate
147 
148  END MODULE read_v3post_mod