163 REAL (rprec) :: factor
165 CHARACTER (len=2) :: units
167 CHARACTER (len=diagnostic_dot_id_name) :: d_type
169 CHARACTER (len=diagnostic_dot_id_name) :: id_name
172 REAL (rprec),
DIMENSION(3) :: position
174 REAL (rprec),
DIMENSION(3) :: direction
203 CHARACTER (len=*),
INTENT(in) :: filename
210 CHARACTER (len=diagnostic_dot_line_len) :: line
211 INTEGER :: line_number
212 REAL (rprec) :: start_time
219 current_coil => null()
222 CALL safe_open(iou, status, filename,
'old',
'formatted')
227 READ (iou,
'(a)', iostat=status) line
231 SELECT CASE (trim(line))
234 READ (iou,
'(a)', iostat=status) line
235 line_number = line_number + 1
244 new_coil%d_type =
'flux_loop'
246 CASE (
'flux_loop_circular')
250 new_coil%d_type =
'flux_loop_circular'
252 CASE (
'magnetic_probe')
256 new_coil%d_type =
'magnetic_probe'
258 CASE (
'magnetic_probe_tokamak')
262 new_coil%d_type =
'magnetic_probe_tokamak'
264 CASE (
'rogowski',
'b_rogowski')
268 new_coil%d_type =
'b_rogowski'
274 new_coil%d_type =
'i_rogowski'
280 new_coil%d_type =
'f_rogowski'
285 new_coil%d_type =
's_rogowski'
287 CASE (
'b_point_probe')
291 new_coil%d_type =
'b_point_probe'
293 CASE (
'b_point_probe_cyl')
297 new_coil%d_type =
'b_point_probe'
306 IF (
ASSOCIATED(new_coil))
THEN
308 current_coil => new_coil
311 current_coil%next => new_coil
312 current_coil => current_coil%next
341 TYPE (diagnostic_dot_coil),
POINTER :: list
344 TYPE (diagnostic_dot_coil),
POINTER :: current_coil
347 DO WHILE(
ASSOCIATED(list))
354 IF (
ASSOCIATED(list%next))
THEN
358 IF (
ASSOCIATED(current_coil%coil))
THEN
359 DEALLOCATE(current_coil%coil)
360 current_coil%coil => null()
363 DEALLOCATE(current_coil)
393 CHARACTER (len=*),
INTENT(in) :: subject
394 CHARACTER (len=*),
INTENT(in) :: line
395 INTEGER,
INTENT(in) :: line_number
396 CHARACTER (len=*),
INTENT(in) :: caller
399 IF (len(subject) .eq. 4)
THEN
400 WRITE (*,1000) subject, line_number
402 WRITE (*,1100) subject, line_number
405 WRITE (*,1300) caller
408 1000
FORMAT(
'Failed to read ', a4,
' on line: ',i6)
409 1100
FORMAT(
'Failed to read ', a6,
' on line: ',i6)
411 1300
FORMAT(
'Called from: ',a)
431 CHARACTER (len=diagnostic_dot_id_name) ::
434 CHARACTER (len=diagnostic_dot_line_len),
INTENT(out) :: line
435 INTEGER,
INTENT(inout) :: line_number
436 CHARACTER (len=*),
INTENT(in) :: caller
440 REAL (rprec) :: start_time
446 READ (iou,1000,iostat=status) line
447 line_number = line_number + 1
449 IF (status .ne. 0)
THEN
480 CHARACTER (len=diagnostic_dot_line_len),
INTENT(out) :: line
481 INTEGER,
INTENT(inout) :: line_number
482 CHARACTER (len=*),
INTENT(in) :: caller
486 REAL (rprec) :: start_time
492 READ (iou,1000,iostat=status) line
493 line_number = line_number + 1
496 IF (status .ne. 0)
THEN
526 CHARACTER (len=diagnostic_dot_line_len),
INTENT(out) :: line
527 INTEGER,
INTENT(inout) :: line_number
528 INTEGER,
INTENT(out) :: status
531 REAL (rprec) :: start_time
537 READ (iou,1000,iostat=status) line
538 line_number = line_number + 1
569 CHARACTER (len=diagnostic_dot_line_len),
INTENT(out) :: line
570 INTEGER,
INTENT(inout) :: line_number
571 INTEGER,
INTENT(out) :: status
574 REAL (rprec) :: start_time
580 READ (iou,1000,iostat=status) line
581 line_number = line_number + 1
610 CHARACTER (len=diagnostic_dot_line_len),
INTENT(out) :: line
611 INTEGER,
INTENT(inout) :: line_number
614 REAL (rprec),
DIMENSION(:,:),
POINTER :: coil
615 REAL (rprec),
DIMENSION(:,:),
POINTER :: coil_temp
616 REAL (rprec),
DIMENSION(4) :: node
618 CHARACTER (len=diagnostic_dot_id_name) :: id_name
620 REAL (rprec) :: start_time
632 &
'diagnostic_dot_parse_s_rogowski')
635 DO WHILE(status .eq. 0)
639 IF (status .eq. 0)
THEN
642 IF (num_coil + 1 .gt.
SIZE(coil, 2))
THEN
643 ALLOCATE(coil_temp(4,2*
SIZE(coil, 2)))
644 coil_temp(:,1:
SIZE(coil, 2)) = coil
650 num_coil = num_coil + 1
651 coil(:,num_coil) = node
665 &
'fil_rogo_s', trim(id_name),
'', 1.0_dp,
666 & coil(1:3,1:num_coil),
667 & sen=coil(4,1:num_coil - 1))
693 & is_rogowski, units)
701 CHARACTER (len=diagnostic_dot_line_len),
INTENT(out) :: line
702 INTEGER,
INTENT(inout) :: line_number
703 LOGICAL,
INTENT(in) :: is_rogowski
704 CHARACTER (len=*),
INTENT(in) :: units
707 REAL (rprec),
DIMENSION(:,:),
POINTER :: coil
708 REAL (rprec),
DIMENSION(:,:),
POINTER :: coil_temp
709 REAL (rprec),
DIMENSION(3) :: node
712 CHARACTER (len=diagnostic_dot_id_name) :: id_name
713 REAL (rprec) :: num_turns
715 REAL (rprec) :: start_time
727 &
'diagnostic_dot_parse_filaments')
729 IF (is_rogowski)
THEN
732 &
'diagnostic_dot_parse_filaments')
733 READ(line,*,iostat=status) num_turns, area
734 IF (status .ne. 0)
THEN
736 &
'diagnostic_dot_parse_filaments')
738 IF (num_turns*area .eq. 0.0)
THEN
739 WRITE (*,1000) num_turns, area
744 DO WHILE(status .eq. 0)
749 IF (status .eq. 0)
THEN
752 IF (num_coil + 1 .gt.
SIZE(coil, 2))
THEN
753 ALLOCATE(coil_temp(3,2*
SIZE(coil, 2)))
754 coil_temp(:,1:
SIZE(coil, 2)) = coil
760 num_coil = num_coil + 1
761 coil(:,num_coil) = node
769 IF (.not.is_rogowski .and. num_coil .gt. 2)
THEN
770 node(1) = sum((coil(1,2:num_coil) - coil(1,1:num_coil - 1))**2)
771 node(2) = sum((coil(2,2:num_coil) - coil(2,1:num_coil - 1))**2)
772 node(3) = sum((coil(3,2:num_coil) - coil(3,1:num_coil - 1))**2)
775 node(1) = sum(node)/num_coil
778 node(2) = sum((coil(:,1) - coil(:,num_coil))**2)
780 IF (node(2)/node(1) .lt. 1.0e-12)
THEN
781 num_coil = num_coil - 1
792 IF (is_rogowski)
THEN
794 &
'fil_rogo', trim(id_name),
'', 1.0_dp,
795 & coil(:,1:num_coil), anturns=num_turns,
799 &
'fil_loop', trim(id_name),
'', 1.0_dp,
800 & coil(:,1:num_coil))
803 SELECT CASE (trim(units))
823 1000
FORMAT(
'Number of turns (',i6,
') x cross section area (',i6,
824 &
') cannot be zero.')
852 CHARACTER (len=diagnostic_dot_line_len),
INTENT(out) :: line
853 INTEGER,
INTENT(inout) :: line_number
854 LOGICAL,
INTENT(in) :: is_tokamak
855 CHARACTER (len=*),
INTENT(in) :: units
858 CHARACTER (len=diagnostic_dot_id_name) :: id_name
859 REAL (rprec) :: radius
860 REAL (rprec) :: pitch
861 REAL (rprec),
DIMENSION(3) :: center
862 REAL (rprec),
DIMENSION(3) :: normal
864 REAL (rprec) :: start_time
871 &
'diagnostic_dot_parse_probe')
877 READ (iou,1000, iostat=status) line
879 IF (status .ne. 0)
THEN
881 &
'diagnostic_dot_parse_magnetic_probe_tokamak')
884 READ (line,*,iostat=status) radius, normal, pitch
885 IF (status .ne. 0)
THEN
887 &
'diagnostic_dot_parse_magnetic_probe_tokamak')
891 normal(2) = normal(2)*degree
893 center(1) = normal(1)*cos(normal(2))
894 center(2) = normal(1)*sin(normal(2))
895 center(3) = normal(3)
896 normal(1) = cos(pitch)*cos(normal(2))
897 normal(2) = cos(pitch)*sin(normal(2))
898 normal(3) = sin(pitch)
902 &
'diagnostic_dot_parse_probe')
907 IF (status .ne. 0)
THEN
909 &
'diagnostic_dot_parse_probe')
915 IF (status .ne. 0)
THEN
917 &
'diagnostic_dot_parse_probe')
928 SELECT CASE (trim(units))
939 & id_name,
'', 1.0_dp, rcirc=radius,
940 & xcent=center(1:3), enhat=normal(1:3))
943 READ (iou,1000,iostat=status) line
944 line_number = line_number + 1
979 CHARACTER (len=diagnostic_dot_line_len),
INTENT(out) :: line
980 INTEGER,
INTENT(inout) :: line_number
981 CHARACTER (len=*),
INTENT(in) :: units
982 LOGICAL,
INTENT(in) :: is_cart
985 CHARACTER (len=diagnostic_dot_id_name) :: id_name
986 REAL (rprec),
DIMENSION(3) :: position
987 REAL (rprec),
DIMENSION(3) :: direction
989 REAL (rprec) :: start_time
995 &
'diagnostic_dot_parse_point')
999 IF (status .ne. 0)
THEN
1001 &
'diagnostic_dot_parse_point')
1006 IF (status .ne. 0)
THEN
1008 &
'diagnostic_dot_parse_point')
1012 direction = direction/sqrt(dot_product(direction, direction))
1020 position(2) = position(2)*degree
1033 READ (iou,1000,iostat=status) line
1034 line_number = line_number + 1