24 USE v3_utilities,
ONLY:
assert
26 USE stel_constants,
ONLY: twopi, one, zero
29 USE island_params, ns => ns_i, mpol => mpol_i, ntor => ntor_i,
30 ohs =>
ohs_i, nfp => nfp_i, ntheta => nu_i, nzeta => nv_i
33 USE vmec_info,
ONLY: rmnc_i, rmns_i, zmnc_i, zmns_i
35 nus1=>nus, nss1=>nss, nvs1=>nvs, restart_ext,
36 l_tracing1=>l_tracing,
37 l_silo_output1=>l_silo_output, l_silo3d1=> l_silo3d
39 USE nscalingtools,
ONLY: mpi_status
42 USE descriptor_mod,
ONLY: iam, nprocs, siesta_comm
44 USE utilities,
ONLY: to_half_mesh
47 #if defined(SILO_AVAIL)
54 INTEGER,
PARAMETER :: f_full = 0
55 INTEGER,
PARAMETER :: f_half = 1
57 INTEGER,
PARAMETER :: unit_trace=40, nunit_pres=50,
59 INTEGER,
PARAMETER :: nsilo=33
60 INTEGER,
PARAMETER :: &
61 unit_pres = 1,unit_bsups= 2,unit_bsupu= 3,unit_bsupv= 4,
62 unit_br = 5,unit_bz = 6,unit_bphi = 7,unit_ksups= 8,
63 unit_ksupu= 9,unit_ksupv=10,unit_jr =11,unit_jz =12,
64 unit_jphi =13,unit_fors =14,unit_foru =15,unit_forv =16,
65 unit_vsups=17,unit_vsupu=18,unit_vsupv=19,unit_vr =20,
66 unit_vz =21,unit_vphi =22,unit_bsubs=23,unit_bsubu=24,
67 unit_bsubv=25,unit_ksubs=26,unit_ksubu=27,unit_ksubv=28,
68 unit_bgradp=29,unit_bdotj=30,unit_bdot_res=31,
69 unit_divj =32,unit_divb=33
70 CHARACTER(LEN=10),
DIMENSION(nsilo),
PARAMETER :: &
72 (/
"Pressure ",
"Bsups ",
"Bsupu ",
"Bsupv ",
73 "Br ",
"Bz ",
"Bphi ",
"Ksups ",
74 "Ksupu ",
"Ksupv ",
"Jr ",
"Jz ",
75 "Jphi ",
"Force_s ",
"Force_u ",
"Force_v ",
76 "Vsups ",
"Vsupu ",
"Vsupv ",
"Vr ",
77 "Vz ",
"Vphi ",
"Bsubs ",
"Bsubu ",
78 "Bsubv ",
"Ksubs ",
"Ksubu ",
"Ksubv ",
79 "Bgradp ",
"Bdotj ",
"bdot_res ",
"DivJ ",
82 REAL(dp):: zmaxx, rmaxx, zminx, rminx
83 INTEGER:: nrs, nzs, nphis
84 INTEGER:: nvs, nus, nss
85 REAL(dp):: oss, ous, ovs, ors, ozs
86 REAL(dp),
ALLOCATABLE,
DIMENSION(:,:,:):: pmnch, &
88 bsupsmnsh, bsupumnch, bsupvmnch, jacmnch
89 REAL(dp),
ALLOCATABLE,
DIMENSION(:,:,:):: pmnsh, &
90 bsubsmnch, bsubumnsh, bsubvmnsh,
91 bsupsmnch, bsupumnsh, bsupvmnsh, jacmnsh
92 REAL(dp),
ALLOCATABLE,
DIMENSION(:,:,:) :: &
93 ksubsmnsf, ksubumncf, ksubvmncf
94 REAL(dp),
ALLOCATABLE,
DIMENSION(:,:,:) :: &
95 ksubsmncf, ksubumnsf, ksubvmnsf
96 REAL(dp),
ALLOCATABLE,
DIMENSION(:,:,:) :: &
98 REAL(dp),
ALLOCATABLE,
DIMENSION(:,:,:) :: &
100 LOGICAL :: l_silo_output, l_silo3D
101 CHARACTER(LEN=70):: tagname
105 LOGICAL:: l_second = .true.
106 LOGICAL:: l_dodisplacement
107 INTEGER,
PARAMETER:: ilabel = 15
108 CHARACTER(LEN=5),
DIMENSION(ilabel):: label_silo
109 CHARACTER(LEN=100) :: filename_cyl, filename_flx
110 INTEGER:: dbfile2d, dbfile3d
111 INTEGER,
PARAMETER:: ndims3d = 3
112 INTEGER,
DIMENSION(ndims3d):: dims3d
113 INTEGER,
PARAMETER:: ndims2d = 2
114 INTEGER,
DIMENSION(ndims2d):: dims2d
115 REAL,
ALLOCATABLE,
DIMENSION(:) :: tmp_silo
116 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: idum
117 INTEGER:: nxx, nyy, nzz, ilen2D_1, ilen2D_2, ilen2D_3, ilen2D_4, &
118 ilen3d, nsec, index1, index2
119 CHARACTER(LEN=20):: name2d_1, name2d_2, name2d_3, name2d_4, name3d
120 REAL(dp),
DIMENSION(:),
ALLOCATABLE :: pprof
121 REAL(dp),
DIMENSION(:,:),
ALLOCATABLE :: pack_bfld
122 REAL,
DIMENSION(:,:),
ALLOCATABLE :: silo2d, pack_silo
123 REAL,
DIMENSION(:,:,:),
ALLOCATABLE :: silo3d
125 PUBLIC :: write_output
130 SUBROUTINE write_output (wout_file, iter, close_wout)
132 USE read_wout_mod,
ONLY: lwout_opened, read_wout_file, &
134 USE diagnostics_mod,
ONLY: dealloc_diagnostics
136 CHARACTER(LEN=*),
INTENT(IN) :: wout_file
137 INTEGER,
INTENT(IN) :: iter
138 LOGICAL,
INTENT(IN) :: close_wout
145 CALL read_wout_file(wout_file, istat)
146 CALL assert(istat.eq.0,
'Error in write_output')
148 CALL dealloc_diagnostics
150 CALL dump_driver(wout_file, iter)
152 CALL dealloc_diagnostics
154 IF (lwout_opened .and. close_wout)
CALL read_wout_deallocate
156 END SUBROUTINE write_output
158 SUBROUTINE dump_driver(wout_file, iter)
160 USE read_wout_mod, ns_w => ns, ntor_w => ntor, mpol_w => mpol,
161 ntmax_w => ntmax, lthreed_w => lthreed, lasym_w => lasym,
164 CHARACTER(LEN=*),
INTENT(IN) :: wout_file
165 INTEGER,
INTENT(IN):: iter
169 CHARACTER(LEN=10) :: cdum1
170 CHARACTER(LEN=120) :: filename
171 INTEGER :: istat, ik, jk, lk, info, nfe, ndum, nmpi, maxprocs, &
172 npmin, npmax, mpi_err
173 INTEGER :: ndum_s, nmpi_s, maxprocs_s, npmin_s, npmax_s
174 REAL(dp) :: zz, rr, zeta0, fmin, ss, uu, vv
175 REAL(dp),
DIMENSION(3) :: r_cyl, c_flx, c_flx_old
176 REAL(dp) :: ton, toff
178 LOGICAL :: lbfld, lsilo, lendpt
184 IF (nphis1.LE.0 .OR. nvs1.LE.0)
RETURN
185 nss = nss1; nus = nus1; nvs = nvs1
186 nrs = nrs1; nzs = nzs1; nphis = min(10, nphis1)
188 l_tracing = l_tracing1
189 l_silo_output = l_silo_output1
192 index1 = index(tagname,
"wout")
193 IF (index1 .EQ. 0) index1 = index(tagname,
"WOUT")
194 index1 = max(1,index1)
195 tagname = tagname(index1:)
198 dr = rmax_v-rmin_v; dz = zmax_v-zmin_v
199 rmaxx = rmax_v+0.05*dr; rminx = rmin_v-0.05*dr
200 zmaxx = zmax_v+0.05*dz; zminx = zmin_v-0.05*dz
201 ors = (rmaxx - rminx)/(nrs-1)
202 ozs = (zmaxx - zminx)/(nzs-1)
207 nsec = nvs/(2*nfp_w)+1
208 IF (nsec == 1 .OR. nsec > nvs) l_second = .false.
210 CALL prepare_quantities
211 CALL open_dump_files(iter)
212 #if defined(SILO_AVAIL)
213 IF (l_silo_output)
THEN
218 WRITE(6,
'(/,1x,a)')
'>> Starting dump of graphics data...'
219 WRITE(6,
'(6x,a)')
'Creating plot box between:'
220 WRITE(6,49)
'RMIN = ', rminx,
'RMAX = ', rmaxx
221 WRITE(6,49)
'ZMIN = ', zminx,
'ZMAX = ', zmaxx
222 WRITE(6,
'(6x,a,i4)')
'Toroidal sections computed: ', nphis
224 49
FORMAT(6x,2(a,1p,e10.3,2x))
227 maxprocs = nphis*nzs*nrs
228 ndum = maxprocs/min(nprocs, maxprocs)
231 IF (iam .EQ. min(nprocs-1,maxprocs-1)) npmax = maxprocs
232 ALLOCATE (pprof(ndum+(maxprocs-ndum*nprocs)))
236 zeta0 = (2*(lk-1)*pi)/(nfp_w*nphis)
238 zz = zminx + (jk-1)*ozs
241 IF (nmpi .LT. npmin) cycle
242 IF (nmpi .GT. npmax)
GOTO 99
243 rr = rminx + (ik-1)*ors
244 r_cyl(1) = rr; r_cyl(2) = nfp_w*zeta0; r_cyl(3) = zz
248 IF (ik > 1 .AND. nmpi.GT.npmin .AND. (c_flx(1) <= one
249 .AND. c_flx(1) > zero))
THEN
255 CALL cyl2flx(rzl_local, r_cyl, c_flx, ns_w, ntor_w,
256 mpol_w, ntmax_w, lthreed_w, lasym_w, info, nfe, fmin)
258 IF (info .ne. 0 .AND. info.ne.-3)
THEN
261 ss = min(sqrt(c_flx(1)), one)
265 CALL dump_pressure(vv, ss, uu, info, index1)
274 CALL write_pressure_data(nunit_pres, ndum, maxprocs)
277 WRITE(*,
'(/,6x,a)')
'Completed.'
278 WRITE(*,
'(6x,a)')
'Pressure (PGPLOT) using CYLINDRICAL coords..'
283 maxprocs = nphis*(nss-1)*nus
284 ndum = maxprocs/min(nprocs, maxprocs)
287 IF (iam .EQ. min(nprocs-1,maxprocs-1)) npmax = maxprocs
288 ALLOCATE (pprof(ndum+(maxprocs-ndum*nprocs)))
292 vv = (2*(lk-1)*pi)/(nfp_w*nphis)
297 IF (nmpi .LT. npmin) cycle
298 IF (nmpi .GT. npmax)
GOTO 199
302 CALL dump_pressure(vv, ss, uu, info, index1)
311 CALL write_pressure_data(nunit_pres1, ndum, maxprocs)
314 WRITE(*,
'(/,6x,a)')
'Completed.'
315 WRITE(*,
'(6x,a)')
'Pressure (PGPLOT) using SIESTA coords..'
321 tracing:
IF (l_tracing .OR. l_silo_output)
THEN
323 WRITE(*,
'(/,6x,a)')
'Creating additional files:'
325 WRITE(*,
'(6x,a)')
'Tracing BFIELD file..'
326 WRITE(*,
'(6x,a,i4)')
'Toroidal sections computed:', nvs
328 #if defined(SILO_AVAIL)
329 IF (l_silo_output)
THEN
330 WRITE(*,
'(6x,a)')
'SILO 2D database..'
331 WRITE(*,
'(6x,2a,1p,e10.3,a)')
'Toroidal sections computed: 0.0'
332 ' and ', real(360*(nsec-1))/(nvs-1),
' degs.'
334 WRITE(*,
'(6x,a)')
'SILO 3D database..'
335 WRITE(*,
'(6x,a,i4)')
'Toroidal sections computed:', nvs
341 npmin = 1; npmax = -1
343 maxprocs = (nvs-1)*(nss-1)*(nus-1)
344 ndum = maxprocs/min(nprocs, maxprocs)
347 IF (iam .EQ. min(nprocs-1,maxprocs-1)) npmax = maxprocs
348 nmpi=ndum+(maxprocs-ndum*nprocs)
349 ALLOCATE (pack_bfld(6, nmpi), stat=istat)
350 CALL assert(istat.eq.0,
'tracing storage allocation error')
353 npmin_s = 1; npmax_s = -1
354 #if defined(SILO_AVAIL)
355 IF (l_silo_output)
THEN
356 maxprocs_s = nvs*(nss-1)*nus
357 ndum_s = maxprocs_s/min(nprocs, maxprocs_s)
359 npmax_s=(iam+1)*ndum_s
360 IF (iam .EQ. min(nprocs-1,maxprocs_s-1)) npmax_s = maxprocs_s
361 nmpi_s=ndum_s+(maxprocs_s-ndum_s*nprocs)
362 ALLOCATE (pack_silo(nmpi_s,nsilo), stat=istat)
363 CALL assert(istat.eq.0,
'silo storage allocation error')
376 lendpt = (jk.NE.nus .AND. lk.NE.nvs)
380 IF (lendpt .AND. l_tracing)
THEN
382 lbfld = (nmpi.GE.npmin .AND. nmpi.LE.npmax)
384 IF (l_silo_output)
THEN
386 lsilo = (nmpi_s.GE.npmin_s .AND. nmpi_s.LE.npmax_s)
388 IF (nmpi.GT.npmax .AND. nmpi_s.GT.npmax_s)
GOTO 299
389 IF (.NOT.lbfld .AND. .NOT.lsilo) cycle
391 CALL flx_to_cyl(ss, uu, vv, rr, zz)
392 CALL dump_quantities(rr, zz, vv, ss, uu, lbfld, lsilo)
399 bfield:
IF (l_tracing)
THEN
403 CALL write_bfield_data(unit_trace, ndum, maxprocs)
404 IF (iam .EQ. 0 .and.
lverbose)
WRITE(*,
'(/,6x,a)')
'Tracing done'
409 #if defined(SILO_AVAIL)
410 IF (l_silo_output)
THEN
411 CALL dump_silo (ndum_s, ndum_s+(maxprocs_s-ndum_s*nprocs))
412 DEALLOCATE (pack_silo)
414 WRITE(*,
'(/,6x,a)')
'SILO 2D database done'
415 IF(l_silo3d)
WRITE(*,
'(6x,a)')
'SILO 3D database done'
421 IF (iam .EQ. 0 .and.
lverbose)
WRITE(*,
'(/,6x,a,f8.3,a)')
422 'Graphics output completed in ',toff-ton,
' s'
424 CALL close_dump_files
425 CALL dealloc_quantities_dump
427 END SUBROUTINE dump_driver
430 SUBROUTINE write_pressure_data(nunit, ndum1, maxprocs)
431 INTEGER,
INTENT(IN) :: nunit, ndum1, maxprocs
432 INTEGER :: ndum, to=0, from, tag, ik, lk, mpi_err
437 IF (lk .EQ. nprocs) ndum=ndum1+(maxprocs-ndum1*nprocs)
442 CALL mpi_recv(pprof,ndum,mpi_real8,from,tag,
443 siesta_comm,mpi_status,mpi_err)
444 ELSE IF (iam .EQ. from)
THEN
445 CALL mpi_send(pprof,ndum,mpi_real8,to,tag,
450 IF (iam .EQ. to)
THEN
452 WRITE(nunit,
'(1e14.6)') pprof(ik)
459 END SUBROUTINE write_pressure_data
462 SUBROUTINE write_bfield_data(nunit, ndum1, maxprocs)
463 INTEGER,
INTENT(IN) :: nunit, ndum1, maxprocs
464 INTEGER :: ndum, to=0, from, tag, ik, lk, mpi_err
470 IF (lk .EQ. nprocs) ndum=ndum+(maxprocs-ndum*nprocs)
475 CALL mpi_recv(pack_bfld,6*ndum,mpi_real8,from,
476 tag,siesta_comm,mpi_status,mpi_err)
477 ELSE IF (iam .EQ. from)
THEN
478 CALL mpi_send(pack_bfld,6*ndum,mpi_real8,to,
479 tag,siesta_comm,mpi_err)
486 WRITE(unit_trace, 122) pack_bfld(:,ik)
491 DEALLOCATE (pack_bfld)
492 122
FORMAT(3(2x,f12.4),3(2x,1pe16.6))
494 END SUBROUTINE write_bfield_data
497 SUBROUTINE open_dump_files(iter)
499 INTEGER,
INTENT(IN):: iter
501 CHARACTER(LEN=30) :: label, tag
502 CHARACTER(LEN=128) :: siloname3d, siloname2d
503 CHARACTER(LEN=100) :: filename
504 CHARACTER(LEN=10) :: cdum1
505 REAL(dp) :: r1, z1, p1, rs, zs
506 CHARACTER(LEN=20) :: cdum
507 REAL,
ALLOCATABLE,
DIMENSION(:) :: rr, zz, pp
508 REAL,
ALLOCATABLE,
DIMENSION(:,:,:) :: xc, yc, zc
509 INTEGER :: istat, err, optlistid, i, j, k, ierr2
511 IF (iam .NE. 0)
RETURN
513 tag = trim(restart_ext)
514 WRITE(cdum1,
'(i4.4)') min(iter,9999)
515 cdum =
'-' // adjustl(cdum1)
520 filename_cyl = trim(tag)//
'-pressure-CYL'//trim(cdum)
521 filename=trim(filename_cyl)//
'.dat'
522 OPEN(unit=nunit_pres, file=filename, status=
'replace')
523 WRITE (nunit_pres,
'(i6)') nphis
524 WRITE (nunit_pres,
'(2i6)') nrs, nzs
525 WRITE (nunit_pres,
'(4e14.6)') rminx, rmaxx, zminx, zmaxx
527 WRITE (nunit_pres,
'(a)') trim(label)
528 WRITE (nunit_pres,
'(a)') trim(tag)
530 filename_flx = trim(tag)//
'-pressure-FLUX'//trim(cdum)
531 filename=trim(filename_flx)//
'.dat'
532 OPEN(unit=nunit_pres1, file=filename, status=
'replace')
533 WRITE (nunit_pres1,
'(i6)') nphis
534 WRITE (nunit_pres1,
'(2i6)') nus, nss-1
535 WRITE (nunit_pres1,
'(4e14.6)') zero, (nus-1)*ous/(2.*pi), oss, one
537 WRITE (nunit_pres1,
'(a)') trim(label)
538 WRITE (nunit_pres1,
'(a)') trim(tag)
543 filename = trim(tag)//
'-bfield_tracing'//
545 OPEN(unit=unit_trace, file = filename, status =
'unknown')
546 WRITE(unit_trace, *) nvs-1, nss-1, nus-1
549 #if defined(SILO_AVAIL)
550 IF (.NOT.l_silo_output)
RETURN
551 IF (iam .NE. 0)
RETURN
553 siloname2d = trim(tag)//
'-2D'//trim(cdum)//
'.silo'
554 ilen = len(trim(siloname2d)); dbfile2d = 0
555 ierr = dbcreate(trim(siloname2d), ilen, db_clobber, db_local,
556 "2Ddata", 6, db_pdb, dbfile2d)
558 siloname3d = trim(tag)//
'-3D'//trim(cdum)//
'.silo'
559 ilen = len(trim(siloname3d)); dbfile3d = 0
560 ierr = dbcreate(trim(siloname3d), ilen, db_clobber, db_local
561 "3Ddata", 6, db_pdb, dbfile3d)
566 ALLOCATE(idum(1)); idum = db_f77null
567 nxx = nss-1; nyy = nvs; nzz =nus
568 name3d =
"Cart3D"; ilen3d = len(trim(name3d))
569 name2d_1 =
"Flux2D_1"; ilen2d_1 = len(trim(name2d_1))
570 name2d_2 =
"Flux2D_2"; ilen2d_2 = len(trim(name2d_2))
571 name2d_3 =
"Cart2D_1"; ilen2d_3 = len(trim(name2d_3))
572 name2d_4 =
"Cart2D_2"; ilen2d_4 = len(trim(name2d_4))
573 dims3d(1) = nxx; dims3d(2) = nyy; dims3d(3) = nzz
574 dims2d(1) = nxx; dims2d(2) = nzz
576 ALLOCATE(rr(nxx), zz(nyy), pp(nzz))
581 zz(i) = (i-1)*ovs/(2.d0*pi)
584 pp(i) = (i-1)*ous/(2.d0*pi)
587 err = dbmkoptlist(2, optlistid)
588 err = dbaddcopt(optlistid, dbopt_xlabel,
"s", 1)
589 err = dbaddcopt(optlistid, dbopt_ylabel,
"u", 1)
590 err = dbputqm(dbfile2d, trim(name2d_1), ilen2d_1,
"s",
591 1,
"u", 1,
"v", 1, rr, pp, zz, dims2d, ndims2d,
592 db_float, db_collinear, optlistid, ierr)
593 err = dbputqm(dbfile2d, trim(name2d_2), ilen2d_2,
"s",
594 1,
"u", 1,
"v", 1, rr, pp, zz, dims2d, ndims2d,
595 db_float, db_collinear, optlistid, ierr)
596 err = dbfreeoptlist(optlistid)
597 zz = 2.d0*pi*zz; pp = 2.d0*pi*pp
599 ALLOCATE(xc(nxx,nzz,2), zc(nxx,nzz,2))
606 CALL flx_to_cyl(r1, p1, z1, rs, zs)
610 CALL flx_to_cyl(r1, p1, z1, rs, zs)
615 err = dbmkoptlist(2, optlistid)
616 err = dbaddcopt(optlistid, dbopt_xlabel,
"R", 1)
617 err = dbaddcopt(optlistid, dbopt_ylabel,
"Z", 1)
618 err = dbputqm(dbfile2d, trim(name2d_3), ilen2d_3,
"R",
619 1,
"Z", 1,
"P", 1, xc(:,:,1), zc(:,:,1), zz, dims2d,
620 ndims2d, db_float, db_noncollinear, optlistid, ierr)
621 err = dbputqm(dbfile2d, trim(name2d_4), ilen2d_4,
"R",
622 1,
"Z", 1,
"P", 1, xc(:,:,2), zc(:,:,2), zz, dims2d,
623 ndims2d, db_float, db_noncollinear, optlistid, ierr)
624 err = dbfreeoptlist(optlistid)
628 ALLOCATE(xc(nxx, nyy, nzz), yc(nxx, nyy, nzz), &
636 CALL flx_to_cyl(r1, p1, z1, rs, zs)
637 xc(i, j, k) = rs*cos(z1)
638 yc(i, j, k) = rs*sin(z1)
643 err = dbmkoptlist(3, optlistid)
644 err = dbaddcopt(optlistid, dbopt_xlabel,
"X", 1)
645 err = dbaddcopt(optlistid, dbopt_ylabel,
"Y", 1)
646 err = dbaddcopt(optlistid, dbopt_zlabel,
"Z", 1)
647 err = dbputqm(dbfile3d, trim(name3d), ilen3d,
648 "X", 1,
"Y", 1,
"Z", 1, xc, yc, zc, dims3d,
649 ndims3d, db_float, db_noncollinear, optlistid, ierr)
650 err = dbfreeoptlist(optlistid)
651 DEALLOCATE(xc, yc, zc)
653 DEALLOCATE(rr, zz, pp)
655 END SUBROUTINE open_dump_files
658 SUBROUTINE close_dump_files
662 IF (iam .NE. 0)
RETURN
663 CLOSE(unit=nunit_pres)
664 CLOSE(unit=nunit_pres1)
665 IF(l_tracing)
CLOSE(unit=unit_trace)
667 #if defined(SILO_AVAIL)
668 IF (l_silo_output)
THEN
669 ierr = dbclose(dbfile2d)
670 IF (l_silo3d) ierr = dbclose(dbfile3d)
673 END SUBROUTINE close_dump_files
676 SUBROUTINE prepare_quantities
678 USE diagnostics_mod,
ONLY: divj, divb, bdotj, lcurr_init, &
681 USE nscalingtools,
ONLY: startglobrow, endglobrow
683 b_factor, p_factor, jvsupsmncf,
684 bsupsijh0, bsupuijh0, bsupvijh0,
685 ksupsmnsf, ksupumncf, ksupvmncf,
686 ksupsmncf, ksupumnsf, ksupvmnsf,
687 bsubsijf, bsubuijf, bsubvijf,
688 ksubsijf, ksubuijf, ksubvijf
697 INTEGER :: istat, start, endr, js
700 REAL(dp),
ALLOCATABLE,
DIMENSION(:,:,:) :: &
701 bsubsijh , bsubuijh , bsubvijh
707 CALL assert(js.EQ.ns,
' rmnc_i NOT allocated on extended mesh!')
708 ALLOCATE(rmnc_ih(0:mpol,-ntor:ntor,ns),
709 zmns_ih(0:mpol,-ntor:ntor,ns), stat=istat)
713 CALL to_half_mesh(rmnc_i, rmnc_ih)
714 CALL to_half_mesh(zmns_i, zmns_ih)
715 ALLOCATE(jacmnch(0:mpol,-ntor:ntor,ns), stat=istat)
716 CALL assert(istat.eq.0,
'Allocation failed in PREPARE_QUANTITIES'
721 ALLOCATE(rmns_ih(0:mpol,-ntor:ntor,ns),
722 zmnc_ih(0:mpol,-ntor:ntor,ns), stat=istat)
723 rmns_ih = zero; zmnc_ih = zero
725 CALL to_half_mesh(rmns_i, rmns_ih)
726 CALL to_half_mesh(zmnc_i, zmnc_ih)
727 ALLOCATE(jacmnsh(0:mpol,-ntor:ntor,ns), stat=istat)
728 CALL assert(istat.eq.0,
'Allocation failed in PREPARE_QUANTITIES'
744 ALLOCATE(pmnch(0:mpol,-ntor:ntor,ns), stat=istat)
745 CALL assert(istat.eq.0,
'Allocation failed in DUMP_PRESSURE')
748 WHERE (pijh .LT. zero) pijh = zero
749 CALL assert(
SIZE(pmnch,3).EQ.
SIZE(pijh,3),
750 'SIZE pmnch != pijh in prepare_quantities')
753 ALLOCATE(pmnsh(0:mpol,-ntor:ntor,ns), stat=istat)
754 CALL assert(istat.eq.0,
'Allocation failed in DUMP_PRESSURE')
758 IF (l_tracing .OR. l_silo_output)
THEN
759 bsupsijh0 = bsupsijh0/b_factor
760 bsupuijh0 = bsupuijh0/b_factor
761 bsupvijh0 = bsupvijh0/b_factor
763 ALLOCATE(bsupsmnsh(0:mpol,-ntor:ntor,ns),
764 bsupumnch(0:mpol,-ntor:ntor,ns),
765 bsupvmnch(0:mpol,-ntor:ntor,ns), stat=istat)
766 CALL assert(istat.eq.0,
'Allocation failed in PREPARE_QUANTITIES'
772 ALLOCATE(bsupsmnch(0:mpol,-ntor:ntor,ns),
773 bsupumnsh(0:mpol,-ntor:ntor,ns),
774 bsupvmnsh(0:mpol,-ntor:ntor,ns), stat=istat)
775 CALL assert(istat.eq.0,
'Allocation failed in PREPARE_QUANTITIES'
777 bsupsmnch(:,:,1) = zero
779 bsupumnsh(:,:,1) = zero
781 bsupvmnsh(:,:,1) = zero
786 #if defined(SILO_AVAIL)
787 IF (l_silo_output)
THEN
788 ALLOCATE (bsubsijh(ntheta,nzeta,ns),
789 bsubuijh(ntheta,nzeta,ns),
790 bsubvijh(ntheta,nzeta,ns), stat=istat)
791 CALL assert(istat.eq.0,
'Allocation failed in DUMPING PREPARE_QUANTITIES'
792 CALL tolowerh(bsupsijh0, bsupuijh0, bsupvijh0,
793 bsubsijh , bsubuijh , bsubvijh, 1, ns)
794 ksupsmnsf = ksupsmnsf/b_factor; ksubsijf = ksubsijf/b_factor
795 ksupumncf = ksupumncf/b_factor; ksubuijf = ksubuijf/b_factor
796 ksupvmncf = ksupvmncf/b_factor; ksubvijf = ksubvijf/b_factor
798 ALLOCATE(bsubsmnsh(0:mpol,-ntor:ntor,ns),
799 bsubumnch(0:mpol,-ntor:ntor,ns),
800 bsubvmnch(0:mpol,-ntor:ntor,ns),
801 ksubsmnsf(0:mpol,-ntor:ntor,ns),
802 ksubumncf(0:mpol,-ntor:ntor,ns),
803 ksubvmncf(0:mpol,-ntor:ntor,ns), stat=istat)
804 CALL assert(istat.eq.0,
'Allocation failed in DUMPING PREPARE_QUANTITIES'
813 ksupsmncf = ksupsmncf/b_factor
814 ksupumnsf = ksupumnsf/b_factor
815 ksupvmnsf = ksupvmnsf/b_factor
817 ALLOCATE(bsubsmnch(0:mpol,-ntor:ntor,ns),
818 bsubumnsh(0:mpol,-ntor:ntor,ns),
819 bsubvmnsh(0:mpol,-ntor:ntor,ns),
820 ksubsmncf(0:mpol,-ntor:ntor,ns),
821 ksubumnsf(0:mpol,-ntor:ntor,ns),
822 ksubvmnsf(0:mpol,-ntor:ntor,ns), stat=istat)
823 CALL assert(istat.eq.0,
'Allocation failed in DUMPING PREPARE_QUANTITIES'
832 DEALLOCATE (bsubsijh, bsubuijh, bsubvijh)
834 IF (maxval(jvsupsmncf) == zero)
THEN
835 l_dodisplacement = .false.
837 l_dodisplacement = .true.
848 END SUBROUTINE prepare_quantities
851 SUBROUTINE dealloc_quantities_dump
854 DEALLOCATE(rmnc_ih, zmns_ih, jacmnch, pmnch)
855 IF (lasym)
DEALLOCATE(rmns_ih, zmnc_ih, jacmnsh, pmnsh)
856 IF (l_silo_output .OR. l_tracing)
THEN
857 DEALLOCATE(bsupsmnsh, bsupumnch, bsupvmnch)
858 IF (lasym)
DEALLOCATE(bsupsmnch, bsupumnsh, bsupvmnsh)
860 #if defined(SILO_AVAIL)
861 IF (l_silo_output)
THEN
862 DEALLOCATE(ksubsmnsf, ksubumncf, ksubvmncf,
863 bsubsmnsh, bsubumnch, bsubvmnch)
865 DEALLOCATE(ksubsmncf, ksubumnsf, ksubvmnsf,
866 bsubsmnch, bsubumnsh, bsubvmnsh)
870 END SUBROUTINE dealloc_quantities_dump
873 SUBROUTINE flx_to_cyl(ss, uu, vv, rr, zz)
876 REAL(dp),
INTENT(IN):: vv, ss, uu
877 REAL(dp),
INTENT(OUT):: rr, zz
879 CALL toijsp_1p(rmnc_ih, ss, uu, vv, rr,
f_none,
f_cos, f_half)
880 CALL toijsp_1p(zmns_ih, ss, uu, vv, zz,
f_none,
f_sin, f_half)
883 CALL toijsp_1p(rmns_ih, ss, uu, vv, rr,
f_sum,
f_sin, f_half)
884 CALL toijsp_1p(zmnc_ih, ss, uu, vv, zz,
f_sum,
f_cos, f_half)
887 END SUBROUTINE flx_to_cyl
890 SUBROUTINE dump_pressure(vv, ss, uu, info, iunit)
893 INTEGER,
INTENT(IN) :: info, iunit
894 REAL(dp),
INTENT(IN) :: vv, ss, uu
901 ELSE IF (info == 0)
THEN
902 CALL toijsp_1p(pmnch, ss, uu, vv, pp,
f_none,
f_cos, f_half)
904 CALL toijsp_1p(pmnsh, ss, uu, vv, pp,
f_sum,
f_sin, f_half)
907 IF (pp .LT. zero) pp = 0
911 CALL assert(.false.,
'INFO IS NEITHER 0 NOR -3 IN DUMP_PRESSURE!'
914 END SUBROUTINE dump_pressure
917 SUBROUTINE dump_quantities(rr, zz, vv, ss, uu, lbfld, lsilo)
920 USE quantities,
ONLY: jvsupsmncf, jvsupumnsf, jvsupvmnsf, &
921 ksupsmnsf, ksupumncf, ksupvmncf, &
922 jvsupsmnsf, jvsupumncf, jvsupvmncf, &
923 ksupsmncf, ksupumnsf, ksupvmnsf
924 USE diagnostics_mod,
ONLY: bdotjmnch, divjmnsh, divbmnsf, &
925 bdotjmnsh, divjmnch, divbmncf
926 LOGICAL,
INTENT(IN) :: lbfld, lsilo
927 REAL(dp),
INTENT(IN):: rr, zz, vv, ss, uu
928 REAL(dp):: pp, bs, bu, bv, ru, rv, rs, zu, zv, zs, &
929 br, bphi, bz, aux1, aux2, aux3, aux4, bdp, ps, pu,
930 pv, bdp0, bdj, divj, divb, ks, ku, kv, jr, jphi, jz,
931 ws, wu, wv, wr, wphi, wz, jb, dpp, fors, foru, forv
932 REAL(dp),
DIMENSION(:,:,:),
ALLOCATABLE:: bdotjmn_res
933 REAL(dp):: temp, bf0, curr0
934 INTEGER :: ds, du, dv, js
936 CALL toijsp_1p(jacmnch, ss, uu, vv, jb,
f_none,
f_cos, f_half)
937 CALL toijsp_1p(rmnc_ih, ss, uu, vv, rs,
f_ds,
f_cos, f_half)
938 CALL toijsp_1p(rmnc_ih, ss, uu, vv, ru,
f_du,
f_cos, f_half)
939 CALL toijsp_1p(rmnc_ih, ss, uu, vv, rv,
f_dv,
f_cos, f_half)
940 CALL toijsp_1p(zmns_ih, ss, uu, vv, zs,
f_ds,
f_sin, f_half)
941 CALL toijsp_1p(zmns_ih, ss, uu, vv, zu,
f_du,
f_sin, f_half)
942 CALL toijsp_1p(zmns_ih, ss, uu, vv, zv,
f_dv,
f_sin, f_half)
944 CALL toijsp_1p(pmnch, ss, uu, vv, pp,
f_none,
f_cos, f_half)
945 CALL toijsp_1p(bsupsmnsh, ss, uu, vv, bs,
f_none,
f_sin, f_half
946 CALL toijsp_1p(bsupumnch, ss, uu, vv, bu,
f_none,
f_cos, f_half
947 CALL toijsp_1p(bsupvmnch, ss, uu, vv, bv,
f_none,
f_cos, f_half
954 CALL toijsp_1p(jacmnsh, ss, uu, vv, jb,
f_sum,
f_sin, f_half)
955 CALL toijsp_1p(rmns_ih, ss, uu, vv, rs, ds,
f_sin, f_half)
956 CALL toijsp_1p(rmns_ih, ss, uu, vv, ru, du,
f_sin, f_half)
957 CALL toijsp_1p(rmns_ih, ss, uu, vv, rv, dv,
f_sin, f_half)
958 CALL toijsp_1p(zmnc_ih, ss, uu, vv, zs, ds,
f_cos, f_half)
959 CALL toijsp_1p(zmnc_ih, ss, uu, vv, zu, du,
f_cos, f_half)
960 CALL toijsp_1p(zmnc_ih, ss, uu, vv, zv, dv,
f_cos, f_half)
962 CALL toijsp_1p(pmnsh, ss, uu, vv, pp,
f_sum,
f_sin, f_half)
963 CALL toijsp_1p(bsupsmnch, ss, uu, vv, bs,
f_sum,
f_cos, f_half
964 CALL toijsp_1p(bsupumnsh, ss, uu, vv, bu,
f_sum,
f_sin, f_half
965 CALL toijsp_1p(bsupvmnsh, ss, uu, vv, bv,
f_sum,
f_sin, f_half
969 br = bs*rs + bu*ru + bv*rv
970 bz = bs*zs + bu*zu + bv*zv
972 IF (l_tracing .AND. lbfld)
THEN
974 pack_bfld(1,index1) = rr; pack_bfld(2,index1) = zz
975 pack_bfld(3,index1) = vv; pack_bfld(4,index1) = br
976 pack_bfld(5,index1) = bz; pack_bfld(6,index1) = bphi
979 #if defined(SILO_AVAIL)
980 IF (.NOT.l_silo_output .OR. .NOT.lsilo)
RETURN
982 CALL assert(index2.LE.
SIZE(pack_silo,1),
'INDEX2 > SIZE(pack_silo)'
983 pack_silo(index2,unit_pres) = pp
984 pack_silo(index2,unit_bsups) = bs
985 pack_silo(index2,unit_bsupu) = bu
986 pack_silo(index2,unit_bsupv) = bv
987 pack_silo(index2,unit_br) = br
988 pack_silo(index2,unit_bz) = bz
989 pack_silo(index2,unit_bphi) = bphi
991 CALL toijsp_1p(ksupsmnsf, ss, uu, vv, ks,
f_none,
f_sin, f_full
992 CALL toijsp_1p(ksupumncf, ss, uu, vv, ku,
f_none,
f_cos, f_full
993 CALL toijsp_1p(ksupvmncf, ss, uu, vv, kv,
f_none,
f_cos, f_full
996 CALL toijsp_1p(ksupsmncf, ss, uu, vv, ks,
f_sum,
f_cos, f_full
997 CALL toijsp_1p(ksupumnsf, ss, uu, vv, ku,
f_sum,
f_sin, f_full
998 CALL toijsp_1p(ksupvmnsf, ss, uu, vv, kv,
f_sum,
f_sin, f_full
1001 pack_silo(index2,unit_ksups) = ks
1002 pack_silo(index2,unit_ksupu) = ku
1003 pack_silo(index2,unit_ksupv) = kv
1004 jr = (ks*rs + ku*ru + kv*rv)/jb
1005 jz = (ks*zs + ku*zu + kv*zv)/jb
1007 pack_silo(index2,unit_jr) = jr
1008 pack_silo(index2,unit_jz) = jz
1009 pack_silo(index2,unit_jphi) = jphi
1012 CALL toijsp_1p(pmnch, ss, uu, vv, dpp,
f_ds,
f_cos, f_half)
1013 IF (lasym)
CALL toijsp_1p(pmnsh, ss, uu, vv, dpp, ds,
f_sin,
1014 fors = (ku*bv - kv*bu - dpp)
1016 CALL toijsp_1p(pmnch, ss, uu, vv, dpp,
f_du,
f_cos, f_half)
1017 IF (lasym)
CALL toijsp_1p(pmnsh, ss, uu, vv, dpp, du,
f_sin,
1018 foru = (kv*bs - ks*bv - dpp)
1020 CALL toijsp_1p(pmnch, ss, uu, vv, dpp,
f_dv,
f_cos, f_half)
1021 IF (lasym)
CALL toijsp_1p(pmnsh, ss, uu, vv, dpp, dv,
f_sin,
1022 forv = (ks*bu - ku*bs - dpp)
1024 IF (l_dodisplacement)
THEN
1025 CALL toijsp_1p(jvsupsmncf, ss, uu, vv, ws,
f_none,
f_cos, f_full
1026 CALL toijsp_1p(jvsupumnsf, ss, uu, vv, wu,
f_none,
f_sin, f_full
1027 CALL toijsp_1p(jvsupvmnsf, ss, uu, vv, wv,
f_none,
f_sin, f_full
1030 CALL toijsp_1p(jvsupsmncf, ss, uu, vv, ws,
f_sum,
f_sin, f_full
1031 CALL toijsp_1p(jvsupumnsf, ss, uu, vv, wu,
f_sum,
f_cos, f_full
1032 CALL toijsp_1p(jvsupvmnsf, ss, uu, vv, wv,
f_sum,
f_cos, f_full
1035 pack_silo(index2,unit_vsups) = ws
1036 pack_silo(index2,unit_vsupu) = wu
1037 pack_silo(index2,unit_vsupv) = wv
1038 wr = ws*rs + wu*ru + wv*rv
1039 wz = ws*zs + wu*zu + wv*zv
1041 pack_silo(index2,unit_vr) = wr
1042 pack_silo(index2,unit_vz) = wz
1043 pack_silo(index2,unit_vphi) = wphi
1049 CALL toijsp_1p(bsubsmnsh, ss, uu, vv, bs,
f_none,
f_sin, f_half
1050 IF (lasym)
CALL toijsp_1p(bsubsmnch, ss, uu, vv, bs,
f_sum,
f_cos
1051 bf0 = bs*temp; temp = bu
1052 CALL toijsp_1p(bsubumnch, ss, uu, vv, bu,
f_none,
f_cos, f_half
1053 IF (lasym)
CALL toijsp_1p(bsubumnsh, ss, uu, vv, bu,
f_sum,
f_sin
1054 bf0 = bf0 + bu*temp; temp = bv
1055 CALL toijsp_1p(bsubvmnch, ss, uu, vv, bv,
f_none,
f_cos, f_half
1056 IF (lasym)
CALL toijsp_1p(bsubvmnsh, ss, uu, vv, bv,
f_sum,
f_sin
1057 bf0 = bf0 + bv*temp; bf0 = sqrt(bf0)
1058 pack_silo(index2,unit_bsubs) = bs
1059 pack_silo(index2,unit_bsubu) = bu
1060 pack_silo(index2,unit_bsubv) = bv
1063 CALL toijsp_1p(ksubsmnsf, ss, uu, vv, ks,
f_none,
f_sin, f_full
1064 IF (lasym)
CALL toijsp_1p(ksubsmncf, ss, uu, vv, ks,
f_sum,
f_cos
1065 curr0 = ks*temp; temp = ku
1066 CALL toijsp_1p(ksubumncf, ss, uu, vv, ku,
f_none,
f_cos, f_full
1067 IF (lasym)
CALL toijsp_1p(ksubumnsf, ss, uu, vv, ku,
f_sum,
f_sin
1068 curr0 = curr0 + ku*temp; temp = kv
1069 CALL toijsp_1p(ksubvmncf, ss, uu, vv, kv,
f_none,
f_cos, f_full
1070 IF (lasym)
CALL toijsp_1p(ksubvmnsf, ss, uu, vv, kv,
f_sum,
f_sin
1071 curr0 = curr0 + kv*temp; curr0 = sqrt(abs(curr0/jb))
1072 pack_silo(index2,unit_ksubs) = ks
1073 pack_silo(index2,unit_ksubu) = ku
1074 pack_silo(index2,unit_ksubv) = kv
1078 CALL toijsp_1p(pmnch, ss, uu, vv, ps,
f_ds,
f_cos, f_half)
1079 CALL toijsp_1p(pmnch, ss, uu, vv, pu,
f_du,
f_cos, f_half)
1080 CALL toijsp_1p(pmnch, ss, uu, vv, pv,
f_dv,
f_cos, f_half)
1083 CALL toijsp_1p(pmnsh, ss, uu, vv, ps, ds,
f_sin, f_half)
1084 CALL toijsp_1p(pmnsh, ss, uu, vv, pu, du,
f_sin, f_half)
1085 CALL toijsp_1p(pmnsh, ss, uu, vv, pv, dv,
f_sin, f_half)
1088 bdp = bs*ps + bu*pu + bv*pv
1089 bdp0 = bf0*pmnch(2,0,0)/rmnc_ih(2,0,0)
1091 pack_silo(index2,unit_bgradp) = bdp
1093 CALL toijsp_1p(bdotjmnch, ss, uu, vv, bdj,
f_none,
f_cos, f_half
1094 IF (lasym)
CALL toijsp_1p(bdotjmnsh, ss, uu, vv, bdj,
f_sum,
1095 pack_silo(index2,unit_bdotj) = bdj/bdp0
1097 ALLOCATE(bdotjmn_res(0:mpol,-ntor:ntor,ns))
1099 bdotjmn_res(:,mres1,nres1) = bdotjmnch(:,mres1,nres1)
1100 bdotjmn_res(:,mres2,nres2) = bdotjmnch(:,mres2,nres2)
1101 CALL toijsp_1p(bdotjmn_res, ss, uu, vv, bdj,
f_none,
f_cos, f_half
1104 bdotjmn_res(:,mres1,nres1) = bdotjmnsh(:,mres1,nres1)
1105 bdotjmn_res(:,mres2,nres2) = bdotjmnsh(:,mres2,nres2)
1106 CALL toijsp_1p(bdotjmn_res, ss, uu, vv, bdj,
f_sum,
f_sin, f_half
1108 pack_silo(index2,unit_bdot_res) = bdj/bdp0
1109 DEALLOCATE(bdotjmn_res)
1111 CALL toijsp_1p(divjmnsh, ss, uu, vv, divj,
f_none,
f_sin, f_half
1112 IF (lasym)
CALL toijsp_1p(divjmnch, ss, uu, vv, divj,
f_sum,
1113 pack_silo(index2,unit_divj) = divj
1115 CALL toijsp_1p(divbmnsf, ss, uu, vv, divb,
f_none,
f_sin, f_full
1116 IF (lasym)
CALL toijsp_1p(divbmncf, ss, uu, vv, divb,
f_sum,
1117 pack_silo(index2,unit_divb) = divb
1119 IF (curr0 .EQ. zero) curr0 = 1
1120 IF (ss .GT. (one-one/ohs))
THEN
1121 fors = 0; foru = 0; forv = 0
1123 pack_silo(index2,unit_fors) = fors/(curr0*bf0)
1124 pack_silo(index2,unit_foru) = foru/(curr0*bf0)
1125 pack_silo(index2,unit_forv) = forv/(curr0*bf0)
1127 END SUBROUTINE dump_quantities
1130 SUBROUTINE toijsp_1p(XMN, SS, THETA, ZETA, XUV, DFLAG, &
1145 INTEGER,
INTENT(IN):: ihalf
1146 REAL(dp),
DIMENSION(0:mpol,-ntor:ntor,ns), &
1148 INTEGER,
INTENT(IN):: dflag
1149 REAL(dp),
INTENT(IN):: ss, theta, zeta
1150 REAL(dp),
INTENT(INOUT):: xuv
1151 INTEGER,
INTENT(IN):: ipar
1156 INTEGER :: ns_in, ns_out, iout, ndum, istat
1157 REAL(dp),
ALLOCATABLE,
DIMENSION(:,:,:):: work0
1158 REAL(dp),
ALLOCATABLE,
DIMENSION(:,:):: work1, work2
1159 REAL(dp),
ALLOCATABLE,
DIMENSION(:):: xuv_i
1160 REAL(dp) :: arg, d1, d2, ss_in, aux1, aux2
1161 REAL(dp):: lcosmu, lsinmu, lcosnv, lsinnv, lcosmum, &
1166 ss_in = ss*ohs + ihalf*0.5_dp + one
1168 IF (ihalf == 1 .AND. ns_in == 1) ns_in = 2
1169 IF (ns_in == ns) ns_in = ns - 1
1171 d1 = (ss_in - ns_in)
1174 IF (btest(dflag,
b_ds))
THEN
1175 IF (ihalf == 0)
THEN
1176 IF (ns_in == 1) iout = -1
1178 IF (ns_in == 2) iout = -1
1180 IF (ns_in == ns - 1) iout = 1
1186 ALLOCATE(work0(0:mpol,-ntor:ntor,ndum), stat=istat)
1187 CALL assert(istat.eq.0,
'Alloc. problem #1 in TOIJSP_1P')
1192 IF (btest(dflag,
b_ds))
THEN
1193 IF (ihalf == 0)
THEN
1194 IF (ns_in .GT. 1) work0(:,:,ndum-1) =
1197 IF (ns_in .GT. 2) work0(:,:,ndum-1) =
1200 IF (ns_out .LT. ns) work0(:,:,ndum) =
1204 ALLOCATE(work1(-ntor:ntor,ndum),
1205 work2(-ntor:ntor,ndum), stat=istat)
1206 CALL assert(istat.eq.0,
'Alloc. problem #2 in TOIJSP_1P')
1207 work1 = 0; work2 = 0
1211 lcosmu = cos(arg); lsinmu = sin(arg)
1212 lcosmum = m*lcosmu; lsinmum = m*lsinmu
1213 IF (btest(dflag,
b_du))
THEN
1214 work1(:,:) = work1(:,:) - work0(m,:,:)*lsinmum
1215 work2(:,:) = work2(:,:) + work0(m,:,:)*lcosmum
1217 work1(:,:) = work1(:,:) + work0(m,:,:)*lcosmu
1218 work2(:,:) = work2(:,:) + work0(m,:,:)*lsinmu
1223 ALLOCATE(xuv_i(ndum), stat=istat)
1224 CALL assert(istat.eq.0,
'Alloc. problem #3 in TOIJSP_1P')
1227 IF (btest(dflag,
b_dv))
THEN
1229 ELSE IF (ipar == f_cos)
THEN
1237 lcosnv = cos(arg); lsinnv = sin(arg)
1238 lcosnvn = n*nfp_i*lcosnv; lsinnvn = n*nfp_i*lsinnv
1240 IF (ipar == f_cos)
THEN
1242 IF (btest(dflag,
b_dv))
THEN
1244 - (work1(n,:) + work1(-n,:))*lsinnvn
1245 - (work2(n,:) - work2(-n,:))*lcosnvn
1248 + (work1(n,:) + work1(-n,:))*lcosnv
1249 - (work2(n,:) - work2(-n,:))*lsinnv
1254 IF (btest(dflag,
b_dv))
THEN
1256 + (work1(n,:) - work1(-n,:))*lcosnvn
1257 - (work2(n,:) + work2(-n,:))*lsinnvn
1260 + (work1(n,:) - work1(-n,:))*lsinnv
1261 + (work2(n,:) + work2(-n,:))*lcosnv
1267 DEALLOCATE(work1, work2)
1269 IF(btest(dflag,
b_ds))
THEN
1271 aux1 = 0.5d0*(xuv_i(2) - xuv_i(ndum-1))
1272 aux2 = 0.5d0*(xuv_i(ndum) - xuv_i(1))
1273 ELSE IF (iout == -1)
THEN
1274 aux1 = xuv_i(2) - xuv_i(1)
1275 aux2 = 0.5d0*(xuv_i(ndum) - xuv_i(1))
1277 aux1 = 0.5d0*(xuv_i(2) - xuv_i(ndum-1))
1278 aux2 = xuv_i(2) - xuv_i(1)
1280 IF (btest(dflag,
b_sum))
THEN
1281 xuv = xuv + (d1*aux2 + d2*aux1)*ohs
1283 xuv = (d1*aux2 + d2*aux1)*ohs
1286 IF (btest(dflag,
b_sum))
THEN
1287 xuv = xuv + d1*xuv_i(2) + d2*xuv_i(1)
1289 xuv = d1*xuv_i(2) + d2*xuv_i(1)
1295 END SUBROUTINE toijsp_1p
1297 #if defined(SILO_AVAIL)
1298 SUBROUTINE allocate_silo
1300 INTEGER :: istat = 0
1302 IF (iam .NE. 0)
GOTO 100
1304 ALLOCATE(silo2d(nxx, nzz), stat = istat)
1305 IF (istat .NE. 0)
GOTO 100
1308 ALLOCATE(silo3d(nxx, nyy, nzz), stat = istat)
1309 IF (istat .NE. 0)
GOTO 100
1312 ALLOCATE(tmp_silo(nxx*nyy*nzz), stat = istat)
1316 CALL assert(istat.eq.0,
'ERROR in silo alloc.!')
1318 END SUBROUTINE allocate_silo
1321 SUBROUTINE dealloc_silo
1323 IF (iam .EQ. 0)
DEALLOCATE(silo2d, silo3d, tmp_silo, idum)
1325 END SUBROUTINE dealloc_silo
1328 SUBROUTINE dump_silo (nchunk, nlast)
1330 INTEGER,
INTENT(IN) :: nchunk, nlast
1332 CHARACTER(LEN=10):: label
1333 REAL,
DIMENSION(:),
ALLOCATABLE :: br_silo, bphi_silo, &
1334 jr_silo, jphi_silo, jz_silo,
1337 IF (iam.EQ.0 .AND. l_silo3d)
THEN
1338 ALLOCATE (br_silo(nxx*nyy*nzz), bphi_silo(nxx*nyy*nzz),
1339 jr_silo(nxx*nyy*nzz), jphi_silo(nxx*nyy*nzz),
1340 wr_silo(nxx*nyy*nzz), wphi_silo(nxx*nyy*nzz),
1341 jz_silo(nxx*nyy*nzz), stat=loop)
1342 CALL assert(loop.eq.0,
'Allocation error in dump_SILO')
1347 IF (.NOT.l_dodisplacement .AND. loop.GE.unit_vsups .AND.
1348 loop.LE.unit_vphi) cycle
1350 CALL get_tmp_silo (loop, nchunk, nlast)
1352 IF (iam .EQ. 0)
THEN
1353 label = trim(silo_label(loop))
1354 CALL write_to_silodb_2d(label, 1, tmp_silo, 1)
1355 IF (l_second)
CALL write_to_silodb_2d(label, nsec, tmp_silo
1357 CALL write_to_silodb_3d(label, tmp_silo)
1358 IF (loop .EQ. unit_br) br_silo = tmp_silo
1359 IF (loop .EQ. unit_bphi) bphi_silo = tmp_silo
1360 IF (loop .EQ. unit_jr) jr_silo = tmp_silo
1361 IF (loop .EQ. unit_jz) jz_silo = tmp_silo
1362 IF (loop .EQ. unit_jphi) jphi_silo = tmp_silo
1363 IF (loop .EQ. unit_vr) wr_silo = tmp_silo
1364 IF (loop .EQ. unit_vphi) wphi_silo = tmp_silo
1371 IF (iam.EQ.0 .AND. l_silo3d)
THEN
1372 CALL dump_silo3d(br_silo, bphi_silo, jr_silo, jphi_silo,
1373 wr_silo, wphi_silo, jz_silo)
1374 DEALLOCATE (br_silo, bphi_silo, jr_silo, jphi_silo,
1375 wr_silo, wphi_silo, jz_silo)
1378 END SUBROUTINE dump_silo
1381 SUBROUTINE get_tmp_silo(index0, nchunk_in, nlast_in)
1385 INTEGER,
INTENT(IN) :: index0, nchunk_in, nlast_in
1386 INTEGER :: nchunk, ioff, lk, mpi_err, tag, to, from,
1389 IF (iam .EQ. 0) tmp_silo(1:nchunk) = pack_silo(1:nchunk,index0)
1396 #if defined(MPI_OPT)
1397 IF (lk .EQ. nprocs) nchunk=nlast_in
1399 IF (iam .EQ. 0)
THEN
1400 CALL mpi_recv(tmp_silo(ioff),nchunk,mpi_real,from,
1401 tag,siesta_comm,mpi_status,mpi_err)
1403 ELSE IF (iam .EQ. from)
THEN
1404 CALL mpi_send(pack_silo(1,index0),nchunk,mpi_real,to,
1405 tag,siesta_comm,mpi_err)
1410 END SUBROUTINE get_tmp_silo
1413 SUBROUTINE dump_silo3d(br_silo, bphi_silo, jr_silo, jphi_silo, &
1414 wr_silo, wphi_silo, jz_silo)
1416 REAL,
DIMENSION(nxx,nyy,nzz) :: br_silo, bphi_silo, &
1418 wr_silo, wphi_silo, jz_silo
1420 REAL :: pp, max_curr
1421 CHARACTER(LEN=20):: label
1427 pp = 2*pi*(i-1)/(nvs-1)
1428 silo3d(:,i,:) = br_silo(:,i,:)*cos(pp) -
1429 & bphi_silo(:,i,:)*sin(pp)
1432 CALL write_to_silodb_3d(label, silo3d)
1434 pp = 2*pi*(i-1)/(nvs-1)
1435 silo3d(:,i,:) = br_silo(:,i,:)*sin(pp) +
1436 & bphi_silo(:,i,:)*cos(pp)
1439 CALL write_to_silodb_3d(label, silo3d)
1441 max_curr = maxval(jphi_silo*jphi_silo + jz_silo*jz_silo
1443 max_curr = sqrt(max_curr)
1449 pp = 2*pi*(i-1)/(nvs-1)
1450 silo3d(:,i,:) = jr_silo(:,i,:)*cos(pp) -
1451 jphi_silo(:,i,:)*sin(pp)
1453 IF (max_curr > 1.d2 .AND. max_curr <= 1d5)
THEN
1455 silo3d = silo3d/1.d3
1456 ELSE IF (max_curr > 1.d5)
THEN
1458 silo3d = silo3d/1.d6
1460 CALL write_to_silodb_3d(label, silo3d)
1464 pp = 2*pi*(i-1)/(nvs-1)
1465 silo3d(:,i,:) = jr_silo(:,i,:)*sin(pp) +
1466 jphi_silo(:,i,:)*cos(pp)
1468 IF (max_curr > 1.d2 .AND. max_curr <= 1d5)
THEN
1470 silo3d = silo3d/1.d3
1471 ELSE IF (max_curr > 1.d5)
THEN
1473 silo3d = silo3d/1.d6
1475 CALL write_to_silodb_3d(label, silo3d)
1477 IF (max_curr > 1.d2 .AND. max_curr <= 1d5)
THEN
1479 jz_silo = jz_silo/1.d3
1480 CALL write_to_silodb_3d(label, jz_silo)
1481 ELSE IF (max_curr > 1.d5)
THEN
1483 jz_silo = jz_silo/1.d6
1484 CALL write_to_silodb_3d(label, jz_silo)
1487 IF (l_dodisplacement)
THEN
1492 pp = 2*pi*(i-1)/(nvs-1)
1493 silo3d(:,i,:) = wr_silo(:,i,:)*cos(pp) -
1494 wphi_silo(:,i,:)*sin(pp)
1497 CALL write_to_silodb_3d(label, silo3d)
1499 pp = 2*pi*(i-1)/(nvs-1)
1500 silo3d(:,i,:) = wr_silo(:,i,:)*sin(pp) +
1501 wphi_silo(:,i,:)*cos(pp)
1504 CALL write_to_silodb_3d(label, silo3d)
1508 END SUBROUTINE dump_silo3d
1511 SUBROUTINE write_to_silodb_3d(label, array)
1512 CHARACTER*(*):: label
1513 REAL,
DIMENSION(NXX, NYY, NZZ):: array
1514 INTEGER:: err, ierr, optlistid
1517 ilen1 = len(trim(label))
1518 err = dbmkoptlist(6, optlistid)
1519 err = dbaddcopt(optlistid, dbopt_label, trim(label), ilen1)
1520 err = dbputqv1(dbfile3d, trim(label), ilen1, name3d,
1521 ilen3d, array, dims3d, ndims3d, idum, 1, db_float,
1522 db_nodecent, optlistid, ierr)
1523 err = dbfreeoptlist(optlistid)
1525 END SUBROUTINE write_to_silodb_3d
1528 SUBROUTINE write_to_silodb_2d(label, islice, array, isec)
1529 CHARACTER*(*):: label
1530 REAL,
DIMENSION(NXX, NYY,NZZ),
INTENT(IN) :: array
1531 INTEGER:: err, ierr, optlistid, isec
1532 INTEGER:: ilen1, ilen2, islice, iangle
1534 CHARACTER(LEN=3):: cdum, cdum1
1535 CHARACTER(LEN=50):: labelp1, labelp2
1537 CALL assert(islice<=nzz,
'Slice does not exist!')
1538 phiout = 360.*real(islice -1)/real(nzz - 1)
1539 iangle = int(phiout)
1540 IF (iangle < 10)
THEN
1541 WRITE(cdum1,
'(i1)') iangle
1542 cdum =
'00'//trim(cdum1)
1543 ELSE IF (iangle > 9 .AND. iangle < 100)
THEN
1544 WRITE(cdum1,
'(i2)') iangle
1545 cdum =
'0'//trim(cdum1)
1546 ELSE IF (iangle > 99 .AND. iangle< 1000)
THEN
1547 WRITE(cdum1,
'(i3)') iangle
1550 WRITE(*,*)
' Change format in SILODB_2D!'
1553 labelp1 = trim(label)//
'_flux_'//trim(cdum)//
'_deg'
1554 ilen1 = len(trim(labelp1))
1555 labelp2 = trim(label)//
'_RCyl_'//trim(cdum)//
'_deg'
1556 ilen2 = len(trim(labelp2))
1557 silo2d = array(:,islice,:)
1561 err = dbmkoptlist(6, optlistid)
1562 err = dbaddcopt(optlistid, dbopt_label, trim(labelp1), ilen1)
1563 err = dbputqv1(dbfile2d, trim(labelp1), ilen1, trim(name2d_1),
1564 ilen2d_1, silo2d, dims2d, ndims2d, idum, 1, db_float,
1565 db_nodecent, optlistid, ierr)
1566 err = dbfreeoptlist(optlistid)
1568 err = dbmkoptlist(6, optlistid)
1569 err = dbaddcopt(optlistid, dbopt_label, trim(labelp2), ilen2)
1570 err = dbputqv1(dbfile2d, trim(labelp2), ilen2, trim(name2d_3),
1571 ilen2d_3, silo2d, dims2d, ndims2d, idum, 1, db_float,
1572 db_nodecent, optlistid, ierr)
1573 err = dbfreeoptlist(optlistid)
1577 err = dbmkoptlist(6, optlistid)
1578 err = dbaddcopt(optlistid, dbopt_label, trim(labelp1), ilen1)
1579 err = dbputqv1(dbfile2d, trim(labelp1), ilen1, trim(name2d_2),
1580 ilen2d_2, silo2d, dims2d, ndims2d, idum, 1, db_float,
1581 db_nodecent, optlistid, ierr)
1582 err = dbfreeoptlist(optlistid)
1584 err = dbmkoptlist(6, optlistid)
1585 err = dbaddcopt(optlistid, dbopt_label, trim(labelp2), ilen2)
1586 err = dbputqv1(dbfile2d, trim(labelp2), ilen2, trim(name2d_4),
1587 ilen2d_4, silo2d, dims2d, ndims2d, idum, 1, db_float,
1588 db_nodecent, optlistid, ierr)
1589 err = dbfreeoptlist(optlistid)
1593 END SUBROUTINE write_to_silodb_2d
1596 END MODULE dumping_mod