From f1fd4fc6bd2c6b76dbd6ddc77dede94cfd3d3fa1 Mon Sep 17 00:00:00 2001 From: Jonathan Schilling Date: Fri, 1 Jul 2022 17:46:43 +0200 Subject: [PATCH 01/15] move external routines into src/contrib --- src/{ => contrib}/d1mach.f | 0 src/{ => contrib}/dcuhre.f | 0 src/{ => contrib}/i1mach.f | 0 src/{ => contrib}/ilut.f | 0 src/{ => contrib}/iqpack.f | 0 src/{ => contrib}/iters.f | 0 src/{ => contrib}/minpack.f | 0 src/{ => contrib}/rksuite.f | 0 8 files changed, 0 insertions(+), 0 deletions(-) rename src/{ => contrib}/d1mach.f (100%) rename src/{ => contrib}/dcuhre.f (100%) rename src/{ => contrib}/i1mach.f (100%) rename src/{ => contrib}/ilut.f (100%) rename src/{ => contrib}/iqpack.f (100%) rename src/{ => contrib}/iters.f (100%) rename src/{ => contrib}/minpack.f (100%) rename src/{ => contrib}/rksuite.f (100%) diff --git a/src/d1mach.f b/src/contrib/d1mach.f similarity index 100% rename from src/d1mach.f rename to src/contrib/d1mach.f diff --git a/src/dcuhre.f b/src/contrib/dcuhre.f similarity index 100% rename from src/dcuhre.f rename to src/contrib/dcuhre.f diff --git a/src/i1mach.f b/src/contrib/i1mach.f similarity index 100% rename from src/i1mach.f rename to src/contrib/i1mach.f diff --git a/src/ilut.f b/src/contrib/ilut.f similarity index 100% rename from src/ilut.f rename to src/contrib/ilut.f diff --git a/src/iqpack.f b/src/contrib/iqpack.f similarity index 100% rename from src/iqpack.f rename to src/contrib/iqpack.f diff --git a/src/iters.f b/src/contrib/iters.f similarity index 100% rename from src/iters.f rename to src/contrib/iters.f diff --git a/src/minpack.f b/src/contrib/minpack.f similarity index 100% rename from src/minpack.f rename to src/contrib/minpack.f diff --git a/src/rksuite.f b/src/contrib/rksuite.f similarity index 100% rename from src/rksuite.f rename to src/contrib/rksuite.f From 75baae955a85da216d6829a41812a667d1fcd021 Mon Sep 17 00:00:00 2001 From: Jonathan Schilling Date: Fri, 1 Jul 2022 19:46:47 +0200 Subject: [PATCH 02/15] initial try to get SPEC to compile again --- Makefile | 93 +- SPECfile | 17 +- src/{basefn.f90 => basefn.F90} | 56 +- src/{bfield.f90 => bfield.F90} | 136 +- src/{bnorml.f90 => bnorml.F90} | 70 +- src/{brcast.f90 => brcast.F90} | 145 ++- src/{casing.f90 => casing.F90} | 129 +- src/{coords.f90 => coords.F90} | 183 ++- src/{curent.f90 => curent.F90} | 54 +- src/{contrib => }/d1mach.f | 0 src/{contrib => }/dcuhre.f | 0 src/{df00ab.f90 => df00ab.F90} | 57 +- src/{dforce.f90 => dforce.F90} | 602 ++++++--- src/{dfp100.f90 => dfp100.F90} | 174 ++- src/{dfp200.f90 => dfp200.F90} | 1084 ++++++++++++---- src/{global.f90 => global.F90} | 1776 +++++++++++++++++--------- src/h5utils.f90_tmp | 946 ++++++++++++++ src/{hesian.f90 => hesian.F90} | 306 +++-- src/{contrib => }/i1mach.f | 0 src/{contrib => }/ilut.f | 0 src/{inputlist.f90 => inputlist.F90} | 252 ++-- src/{intghs.f90 => intghs.F90} | 281 +++- src/{contrib => }/iqpack.f | 0 src/{contrib => }/iters.f | 0 src/{jo00aa.f90 => jo00aa.F90} | 100 +- src/{lbpol.f90 => lbpol.F90} | 69 +- src/{lforce.f90 => lforce.F90} | 97 +- src/{ma00aa.f90 => ma00aa.F90} | 86 +- src/{ma02aa.f90 => ma02aa.F90} | 336 +++-- src/macros | 1296 +------------------ src/{manual.f90 => manual.F90} | 77 +- src/{matrix.f90 => matrix.F90} | 113 +- src/memory.F90 | 637 +++++++++ src/memory.f90 | 298 ----- src/{metrix.f90 => metrix.F90} | 41 +- src/{contrib => }/minpack.f | 0 src/mod_kinds.F90 | 7 + src/{mp00ac.f90 => mp00ac.F90} | 354 +++-- src/{mtrxhs.f90 => mtrxhs.F90} | 57 +- src/{newton.f90 => newton.F90} | 476 +++++-- src/numrec.F90 | 331 +++++ src/numrec.f90 | 720 ----------- src/{packab.f90 => packab.F90} | 117 +- src/{packxi.f90 => packxi.F90} | 60 +- src/{pc00aa.f90 => pc00aa.F90} | 61 +- src/{pc00ab.f90 => pc00ab.F90} | 77 +- src/{pp00aa.f90 => pp00aa.F90} | 97 +- src/{pp00ab.f90 => pp00ab.F90} | 95 +- src/{preset.f90 => preset.F90} | 1110 ++++++++++++---- src/{ra00aa.f90 => ra00aa.F90} | 164 ++- src/{contrib => }/rksuite.f | 0 src/{rzaxis.f90 => rzaxis.F90} | 209 ++- src/sphdf5.F90 | 1495 ++++++++++++++++++++++ src/sphdf5.f90 | 1232 ------------------ src/{spsint.f90 => spsint.F90} | 66 +- src/{spsmat.f90 => spsmat.F90} | 131 +- src/{stzxyz.f90 => stzxyz.F90} | 55 +- src/{tr00ab.f90 => tr00ab.F90} | 502 ++++++-- src/{volume.f90 => volume.F90} | 108 +- src/{wa00aa.f90 => wa00aa.F90} | 213 ++- src/{xspech.f90 => xspech.F90} | 434 +++++-- 61 files changed, 11413 insertions(+), 6269 deletions(-) rename src/{basefn.f90 => basefn.F90} (89%) rename src/{bfield.f90 => bfield.F90} (83%) rename src/{bnorml.f90 => bnorml.F90} (86%) rename src/{brcast.f90 => brcast.F90} (61%) rename src/{casing.f90 => casing.F90} (89%) rename src/{coords.f90 => coords.F90} (84%) rename src/{curent.f90 => curent.F90} (89%) rename src/{contrib => }/d1mach.f (100%) rename src/{contrib => }/dcuhre.f (100%) rename src/{df00ab.f90 => df00ab.F90} (72%) rename src/{dforce.f90 => dforce.F90} (78%) rename src/{dfp100.f90 => dfp100.F90} (64%) rename src/{dfp200.f90 => dfp200.F90} (77%) rename src/{global.f90 => global.F90} (53%) create mode 100644 src/h5utils.f90_tmp rename src/{hesian.f90 => hesian.F90} (77%) rename src/{contrib => }/i1mach.f (100%) rename src/{contrib => }/ilut.f (100%) rename src/{inputlist.f90 => inputlist.F90} (83%) rename src/{intghs.f90 => intghs.F90} (79%) rename src/{contrib => }/iqpack.f (100%) rename src/{contrib => }/iters.f (100%) rename src/{jo00aa.f90 => jo00aa.F90} (89%) rename src/{lbpol.f90 => lbpol.F90} (79%) rename src/{lforce.f90 => lforce.F90} (89%) rename src/{ma00aa.f90 => ma00aa.F90} (90%) rename src/{ma02aa.f90 => ma02aa.F90} (79%) rename src/{manual.f90 => manual.F90} (94%) rename src/{matrix.f90 => matrix.F90} (95%) create mode 100644 src/memory.F90 delete mode 100644 src/memory.f90 rename src/{metrix.f90 => metrix.F90} (90%) rename src/{contrib => }/minpack.f (100%) create mode 100644 src/mod_kinds.F90 rename src/{mp00ac.f90 => mp00ac.F90} (83%) rename src/{mtrxhs.f90 => mtrxhs.F90} (91%) rename src/{newton.f90 => newton.F90} (71%) create mode 100644 src/numrec.F90 delete mode 100644 src/numrec.f90 rename src/{packab.f90 => packab.F90} (72%) rename src/{packxi.f90 => packxi.F90} (84%) rename src/{pc00aa.f90 => pc00aa.F90} (83%) rename src/{pc00ab.f90 => pc00ab.F90} (86%) rename src/{pp00aa.f90 => pp00aa.F90} (85%) rename src/{pp00ab.f90 => pp00ab.F90} (76%) rename src/{preset.f90 => preset.F90} (74%) rename src/{ra00aa.f90 => ra00aa.F90} (69%) rename src/{contrib => }/rksuite.f (100%) rename src/{rzaxis.f90 => rzaxis.F90} (90%) create mode 100644 src/sphdf5.F90 delete mode 100644 src/sphdf5.f90 rename src/{spsint.f90 => spsint.F90} (86%) rename src/{spsmat.f90 => spsmat.F90} (90%) rename src/{stzxyz.f90 => stzxyz.F90} (80%) rename src/{tr00ab.f90 => tr00ab.F90} (75%) rename src/{volume.f90 => volume.F90} (85%) rename src/{wa00aa.f90 => wa00aa.F90} (71%) rename src/{xspech.f90 => xspech.F90} (77%) diff --git a/Makefile b/Makefile index 1b0ba938..f38f7957 100644 --- a/Makefile +++ b/Makefile @@ -9,15 +9,9 @@ # are defined there as well. include SPECfile -# files to be preprocessed by m4 -PREPROC=$(ALLSPEC:=_m.F90) - ROBJS=$(SPECFILES:=_r.o) DOBJS=$(SPECFILES:=_d.o) -ROBJS_IO=$(IOFILES:=_r.o) -DOBJS_IO=$(IOFILES:=_d.o) - ############################################################################################################################################################### date:=$(shell date) @@ -25,42 +19,12 @@ text:=$(shell date +%F) ############################################################################################################################################################### -xspec: $(addsuffix _r.o,$(ALLFILES)) $(MACROS) Makefile +xspec: $(addsuffix _r.o,$(ALLFILES)) Makefile $(FC) $(FLAGS) $(CFLAGS) $(RFLAGS) -o xspec $(addsuffix _r.o,$(ALLFILES)) $(LINKS) -dspec: $(addsuffix _d.o,$(ALLFILES)) $(MACROS) Makefile +dspec: $(addsuffix _d.o,$(ALLFILES)) Makefile $(FC) $(FLAGS) $(CFLAGS) $(DFLAGS) -o dspec $(addsuffix _d.o,$(ALLFILES)) $(LINKS) -############################################################################################################################################################### -# inputlist needs special handling: expansion of DSCREENLIST and NSCREENLIST using awk (not anymore !!!) - -inputlist_r.o: %_r.o: src/inputlist.f90 $(MACROS) - m4 -P $(MACROS) src/inputlist.f90 > inputlist_m.F90 - $(FC) $(FLAGS) $(CFLAGS) $(RFLAGS) -o inputlist_r.o -c inputlist_m.F90 $(LIBS) - @wc -l -L -w inputlist_m.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' - @echo '' - -inputlist_d.o: %_d.o: src/inputlist.f90 $(MACROS) - m4 -P $(MACROS) src/inputlist.f90 > inputlist_m.F90 - $(FC) $(FLAGS) $(CFLAGS) $(DFLAGS) -o inputlist_d.o -c inputlist_m.F90 $(LIBS) - @wc -l -L -w inputlist_m.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' - @echo '' - -############################################################################################################################################################### -# global needs special handling: expansion of CPUVARIABLE, BSCREENLIST and WSCREENLIST using awk (not anymore !!!) - -global_r.o: %_r.o: inputlist_r.o src/global.f90 $(MACROS) - m4 -P $(MACROS) src/global.f90 > global_m.F90 - $(FC) $(FLAGS) $(CFLAGS) $(RFLAGS) -o global_r.o -c global_m.F90 $(LIBS) - @wc -l -L -w global_m.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' - @echo '' - -global_d.o: %_d.o: inputlist_d.o src/global.f90 $(MACROS) - m4 -P $(MACROS) src/global.f90 > global_m.F90 - $(FC) $(FLAGS) $(CFLAGS) $(DFLAGS) -o global_d.o -c global_m.F90 $(LIBS) - @wc -l -L -w global_m.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' - @echo '' - ############################################################################################################################################################### %_r.o: src/%.f @@ -75,64 +39,38 @@ global_d.o: %_d.o: inputlist_d.o src/global.f90 $(MACROS) ############################################################################################################################################################### -$(PREPROC): %_m.F90: src/%.f90 $(MACROS) - @awk -v file=$*.f90 '{ gsub("__LINE__", NR); gsub("__FILE__",file); print }' src/$*.f90 > $*_p.f90 - m4 -P $(MACROS) $*_p.f90 > $*_m.F90 - - -$(ROBJS_IO): %_r.o: %_m.F90 $(addsuffix _r.o,$(BASEFILES)) $(MACROS) - $(FC) $(FLAGS) $(CFLAGS) $(RFLAGS) -o $*_r.o -c $*_m.F90 $(LIBS) - @wc -l -L -w $*_m.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' - @echo '' - -$(DOBJS_IO): %_d.o: %_m.F90 $(addsuffix _d.o,$(BASEFILES)) $(MACROS) - $(FC) $(FLAGS) $(CFLAGS) $(DFLAGS) -o $*_d.o -c $*_m.F90 $(LIBS) - @wc -l -L -w $*_m.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' - @echo '' - - -$(ROBJS): %_r.o: %_m.F90 $(addsuffix _r.o,$(BASEFILES)) $(addsuffix _r.o,$(IOFILES)) $(MACROS) - $(FC) $(FLAGS) $(CFLAGS) $(RFLAGS) -o $*_r.o -c $*_m.F90 $(LIBS) - @wc -l -L -w $*_m.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' +$(ROBJS): %_r.o: src/%.F90 + $(FC) $(FLAGS) $(CFLAGS) $(RFLAGS) -o $*_r.o -c src/$*.F90 $(LIBS) + @wc -l -L -w src/$*.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' @echo '' -$(DOBJS): %_d.o: %_m.F90 $(addsuffix _d.o,$(BASEFILES)) $(addsuffix _d.o,$(IOFILES)) $(MACROS) - $(FC) $(FLAGS) $(CFLAGS) $(DFLAGS) -o $*_d.o -c $*_m.F90 $(LIBS) - @wc -l -L -w $*_m.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' +$(DOBJS): %_d.o: src/%.F90 + $(FC) $(FLAGS) $(CFLAGS) $(DFLAGS) -o $*_d.o -c src/$*.F90 $(LIBS) + @wc -l -L -w src/$*.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' @echo '' ############################################################################################################################################################### -xspech_r.o: src/xspech.f90 global_r.o sphdf5_r.o $(addsuffix _r.o,$(files)) $(MACROS) - @awk -v date='$(date)' -v pwd='$(PWD)' -v macros='$(MACROS)' -v fc='$(FC)' -v flags='$(FLAGS) $(CFLAGS) $(RFLAGS)' -v allfiles='$(ALLFILES)' \ +xspech_r.o: src/xspech.F90 $(addsuffix _r.o,$(SPECFILES)) $(addsuffix _r.o,$(sfiles)) + @awk -v date='$(date)' -v pwd='$(PWD)' -v fc='$(FC)' -v flags='$(FLAGS) $(CFLAGS) $(RFLAGS)' -v allfiles='$(ALLFILES)' \ 'BEGIN{nfiles=split(allfiles,files," ")} \ {if($$2=="COMPILATION") {print " write(ounit,*)\" : compiled : date = "date" ; \"" ; \ print " write(ounit,*)\" : : srcdir = "pwd" ; \"" ; \ - print " write(ounit,*)\" : : macros = "macros" ; \"" ; \ print " write(ounit,*)\" : : fc = "fc" ; \"" ; \ print " write(ounit,*)\" : : flags = "flags" ; \"" }} \ - {if($$2=="SUMTIME") {for (i=1;i<=nfiles;i++) print " SUMTIME("files[i]")"}}\ - {if($$2=="PRTTIME") {for (i=1;i<=nfiles;i++) print " PRTTIME("files[i]")"}}\ - {print}' src/xspech.f90 > mspech.f90 - m4 -P $(MACROS) mspech.f90 > xspech_m.F90 - @rm -f mspech.f90 + {print}' src/xspech.F90 > xspech_m.F90 $(FC) $(FLAGS) $(CFLAGS) $(RFLAGS) -o xspech_r.o -c xspech_m.F90 $(LIBS) @wc -l -L -w xspech_m.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' @echo '' -xspech_d.o: src/xspech.f90 global_d.o sphdf5_d.o $(addsuffix _d.o,$(files)) $(MACROS) - @awk -v date='$(date)' -v pwd='$(PWD)' -v macros='$(MACROS)' -v fc='$(FC)' -v flags='$(FLAGS) $(CFLAGS) $(DFLAGS)' -v allfiles='$(ALLFILES)' \ +xspech_d.o: src/xspech.F90 $(addsuffix _r.o,$(SPECFILES)) $(addsuffix _r.o,$(sfiles)) + @awk -v date='$(date)' -v pwd='$(PWD)' -v fc='$(FC)' -v flags='$(FLAGS) $(CFLAGS) $(DFLAGS)' -v allfiles='$(ALLFILES)' \ 'BEGIN{nfiles=split(allfiles,files," ")} \ {if($$2=="COMPILATION") {print " write(ounit,*)\" : compiled : date = "date" ; \"" ; \ print " write(ounit,*)\" : : srcdir = "pwd" ; \"" ; \ - print " write(ounit,*)\" : : macros = "macros" ; \"" ; \ print " write(ounit,*)\" : : fc = "fc" ; \"" ; \ print " write(ounit,*)\" : : flags = "flags" ; \"" }} \ - {if($$2=="SUMTIME") {for (i=1;i<=nfiles;i++) print " SUMTIME("files[i]")"}}\ - {if($$2=="PRTTIME") {for (i=1;i<=nfiles;i++) print " PRTTIME("files[i]")"}}\ - {print}' src/xspech.f90 > mspech.f90 - m4 -P $(MACROS) mspech.f90 > xspech_m.F90 - @rm -f mspech.f90 + {print}' src/xspech.F90 > xspech_m.F90 $(FC) $(FLAGS) $(CFLAGS) $(DFLAGS) -o xspech_d.o -c xspech_m.F90 $(LIBS) @wc -l -L -w xspech_m.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' @echo '' @@ -140,7 +78,8 @@ xspech_d.o: src/xspech.f90 global_d.o sphdf5_d.o $(addsuffix _d.o,$(files)) $(MA ############################################################################################################################################################### clean: - rm -f *.o *.mod *_p.f90 *_m.F90 .*.h *.pdf *.dvi *.out *.bbl *.toc .*.date ; rm -rf ./docs/html ./docs/latex + rm -f *.o *.mod *.pdf *.dvi *.out *.bbl *.toc .*.date *_m.F90 + rm -rf ./docs/html ./docs/latex ############################################################################################################################################################### diff --git a/SPECfile b/SPECfile index 4d64785c..e52d39df 100644 --- a/SPECfile +++ b/SPECfile @@ -10,13 +10,7 @@ ############################################################################################################################################################### -# basis of SPEC: input variables, global workspace, HDF5 output file writing -# these are split off since they require special treatment (needed by all others and/or special macros) -BASEFILES=inputlist global -IOFILES=sphdf5 - -# (most of) physics part of SPEC -afiles=preset manual rzaxis packxi volume coords basefn memory +afiles=mod_kinds inputlist global sphdf5 preset manual rzaxis packxi volume coords basefn memory bfiles=metrix ma00aa matrix spsmat spsint mp00ac ma02aa packab tr00ab curent df00ab lforce intghs mtrxhs lbpol cfiles=brcast dfp100 dfp200 dforce newton dfiles=casing bnorml @@ -32,15 +26,8 @@ sfiles=dcuhre minpack iqpack rksuite i1mach d1mach ilut iters # all of SPEC except BASEFILES SPECFILES=$(afiles) $(bfiles) $(cfiles) $(dfiles) $(efiles) $(ffiles) -# all of "our" (vs. contributed) files needed for the "core" of SPEC -ALLSPEC=$(BASEFILES) $(IOFILES) $(SPECFILES) - # *ALL* files needed for the main SPEC executable -ALLFILES=$(sfiles) $(ALLSPEC) xspech - -############################################################################################################################################################### - -MACROS=src/macros +ALLFILES=$(sfiles) $(SPECFILES) xspech ############################################################################################################################################################### diff --git a/src/basefn.f90 b/src/basefn.F90 similarity index 89% rename from src/basefn.f90 rename to src/basefn.F90 index 375ff633..72ebecc1 100644 --- a/src/basefn.f90 +++ b/src/basefn.F90 @@ -20,14 +20,14 @@ !> @param[in] lrad radial resolution !> @param[out] cheby the value, first derivative of Chebyshev polynomial subroutine get_cheby(lss, lrad, cheby) - + use mod_kinds, only: wp => dp use constants, only : zero, one, two implicit none - REAL,intent(in) :: lss - INTEGER, intent(in) :: lrad - REAL, intent(inout) :: cheby(0:lrad,0:1) + real(wp),intent(in) :: lss + integer, intent(in) :: lrad + real(wp), intent(inout) :: cheby(0:lrad,0:1) integer :: ll @@ -57,14 +57,14 @@ end subroutine get_cheby !> @param[in] lrad radial resolution !> @param[out] cheby the value, first and second derivative of Chebyshev polynomial subroutine get_cheby_d2(lss, lrad, cheby) - + use mod_kinds, only: wp => dp use constants, only : zero, one, two implicit none - REAL,intent(in) :: lss - INTEGER, intent(in) :: lrad - REAL, intent(inout) :: cheby(0:lrad,0:2) + real(wp),intent(in) :: lss + integer, intent(in) :: lrad + real(wp), intent(inout) :: cheby(0:lrad,0:2) integer :: ll @@ -128,18 +128,18 @@ end subroutine get_cheby_d2 !> @param[in] mpol poloidal resolution !> @param[out] zernike the value, first derivative of Zernike polynomial subroutine get_zernike(r, lrad, mpol, zernike) - + use mod_kinds, only: wp => dp use constants, only : zero, one, two implicit none - REAL,intent(in) :: r - INTEGER, intent(in) :: lrad, mpol - REAL, intent(inout) :: zernike(0:lrad,0:mpol,0:1) + real(wp),intent(in) :: r + integer, intent(in) :: lrad, mpol + real(wp), intent(inout) :: zernike(0:lrad,0:mpol,0:1) - REAL :: rm, rm1 ! r to the power of m'th and m-1'th - REAL :: factor1, factor2, factor3, factor4 - INTEGER :: m, n ! Zernike R^m_n + real(wp) :: rm, rm1 ! r to the power of m'th and m-1'th + real(wp) :: factor1, factor2, factor3, factor4 + integer :: m, n ! Zernike R^m_n rm = one ! r to the power of m'th rm1 = zero ! r to the power of m-1'th @@ -196,18 +196,18 @@ end subroutine get_zernike !> @param[in] mpol poloidal resolution !> @param[out] zernike the value, first/second derivative of Zernike polynomial subroutine get_zernike_d2(r, lrad, mpol, zernike) - + use mod_kinds, only: wp => dp use constants, only : zero, one, two implicit none - REAL,intent(in) :: r - INTEGER, intent(in) :: lrad, mpol - REAL, intent(inout) :: zernike(0:lrad,0:mpol,0:2) + real(wp),intent(in) :: r + integer, intent(in) :: lrad, mpol + real(wp), intent(inout) :: zernike(0:lrad,0:mpol,0:2) - REAL :: rm, rm1, rm2 ! r to the power of m'th, m-1'th and m-2'th - REAL :: factor1, factor2, factor3, factor4 - INTEGER :: m, n ! Zernike R^m_n + real(wp) :: rm, rm1, rm2 ! r to the power of m'th, m-1'th and m-2'th + real(wp) :: factor1, factor2, factor3, factor4 + integer :: m, n ! Zernike R^m_n rm = one ! r to the power of m'th rm1 = zero ! r to the power of m-1'th @@ -270,17 +270,17 @@ end subroutine get_zernike_d2 !> @param[in] mpol poloidal resolution !> @param[out] zernike the value subroutine get_zernike_rm(r, lrad, mpol, zernike) - + use mod_kinds, only: wp => dp use constants, only : zero, one, two implicit none - REAL,intent(in) :: r - INTEGER, intent(in) :: lrad, mpol - REAL, intent(inout) :: zernike(0:lrad,0:mpol) + real(wp),intent(in) :: r + integer, intent(in) :: lrad, mpol + real(wp), intent(inout) :: zernike(0:lrad,0:mpol) - REAL :: factor1, factor2, factor3, factor4 - INTEGER :: m, n ! Zernike R^m_n + real(wp) :: factor1, factor2, factor3, factor4 + integer :: m, n ! Zernike R^m_n zernike(:,:) = zero do m = 0, mpol diff --git a/src/bfield.f90 b/src/bfield.F90 similarity index 83% rename from src/bfield.f90 rename to src/bfield.F90 index f0d000a5..99fd2f04 100644 --- a/src/bfield.f90 +++ b/src/bfield.F90 @@ -49,7 +49,7 @@ !> @param[in] st radial coordinate \f$s\f$ and poloidal angle \f$\theta\f$ !> @param[out] Bst tangential magnetic field directions \f$B_s, B_\theta\f$ subroutine bfield( zeta, st, Bst ) - + use mod_kinds, only: wp => dp !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! use constants, only : zero, one, half, two @@ -71,23 +71,45 @@ subroutine bfield( zeta, st, Bst ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS - REAL, intent(in) :: zeta, st(1:Node) - REAL, intent(out) :: Bst(1:Node) +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + - INTEGER :: lvol, ii, ll, mi, ni, ideriv - REAL :: teta, lss, sbar, sbarhm(0:1), arg, carg, sarg, dBu(1:3) - REAL :: cheby(0:Lrad(ivol),0:1), zernike(0:Lrad(1),0:Mpol,0:1) + real(wp), intent(in) :: zeta, st(1:Node) + real(wp), intent(out) :: Bst(1:Node) - REAL :: TT(0:Lrad(ivol),0:1) ! this is almost identical to cheby; 17 Dec 15; + integer :: lvol, ii, ll, mi, ni, ideriv + real(wp) :: teta, lss, sbar, sbarhm(0:1), arg, carg, sarg, dBu(1:3) + real(wp) :: cheby(0:Lrad(ivol),0:1), zernike(0:Lrad(1),0:Mpol,0:1) + + real(wp) :: TT(0:Lrad(ivol),0:1) ! this is almost identical to cheby; 17 Dec 15; + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif - BEGIN(bfield) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! #ifdef DEBUG - FATAL( bfield, ivol.lt.1 .or. ivol.gt.Mvol, invalid ivol ) + + if( ivol.lt.1 .or. ivol.gt.Mvol ) then + write(6,'("bfield : fatal : myid=",i3," ; ivol.lt.1 .or. ivol.gt.Mvol ; invalid ivol ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "bfield : ivol.lt.1 .or. ivol.gt.Mvol : invalid ivol ;" + endif + #endif !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -124,7 +146,13 @@ subroutine bfield( zeta, st, Bst ) if( Lcoordinatesingularity ) then ! regularization factor depends on mi; 17 Dec 15; - FATAL( bfield, abs(sbar).lt.vsmall, need to avoid divide-by-zero ) + + if( abs(sbar).lt.vsmall ) then + write(6,'("bfield : fatal : myid=",i3," ; abs(sbar).lt.vsmall ; need to avoid divide-by-zero ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "bfield : abs(sbar).lt.vsmall : need to avoid divide-by-zero ;" + endif + do ll = 0, Lrad(lvol) ; TT(ll,0:1) = (/ zernike(ll,mi,0), zernike(ll,mi,1)*half /) enddo @@ -161,12 +189,18 @@ subroutine bfield( zeta, st, Bst ) if( abs(gBzeta).lt.vsmall ) then - cput = GETTIME + cput = MPI_WTIME() write(ounit,'("bfield : ",f10.2," : lvol=",i3," ; zeta="es23.15" ; (s,t)=("es23.15" ,"es23.15" ) ; B^z="es23.15" ;")') & cput-cpus, lvol, zeta, st(1:2), dBu(3) - FATAL( bfield, abs(dBu(3)).lt.vsmall, field is not toroidal ) + + if( abs(dBu(3)).lt.vsmall ) then + write(6,'("bfield : fatal : myid=",i3," ; abs(dBu(3)).lt.vsmall ; field is not toroidal ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "bfield : abs(dBu(3)).lt.vsmall : field is not toroidal ;" + endif + endif @@ -176,7 +210,12 @@ subroutine bfield( zeta, st, Bst ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - RETURN(bfield) + +9999 continue + cput = MPI_WTIME() + Tbfield = Tbfield + ( cput-cpuo ) + return + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -188,7 +227,7 @@ end subroutine bfield !> @param[in] st radial(s) and poloidal(theta) positions !> @param[out] Bst tangential magnetic field subroutine bfield_tangent( zeta, st, Bst ) - + use mod_kinds, only: wp => dp !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! use constants, only : zero, one, half, two @@ -210,25 +249,47 @@ subroutine bfield_tangent( zeta, st, Bst ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS - REAL, intent(in) :: zeta, st(1:6) - REAL, intent(out) :: Bst(1:6) +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + - INTEGER :: lvol, ii, ll, mi, ni, ideriv - REAL :: teta, lss, sbar, sbarhm(0:1), arg, carg, sarg, dBu(1:3,0:2) - REAL :: cheby(0:Lrad(ivol),0:2), zernike(0:Lrad(1),0:Mpol,0:2) + real(wp), intent(in) :: zeta, st(1:6) + real(wp), intent(out) :: Bst(1:6) - REAL :: M(2,2), deltax(2,2) + integer :: lvol, ii, ll, mi, ni, ideriv + real(wp) :: teta, lss, sbar, sbarhm(0:1), arg, carg, sarg, dBu(1:3,0:2) + real(wp) :: cheby(0:Lrad(ivol),0:2), zernike(0:Lrad(1),0:Mpol,0:2) - REAL :: TT(0:Lrad(ivol),0:2) ! this is almost identical to cheby; 17 Dec 15; + real(wp) :: M(2,2), deltax(2,2) + + real(wp) :: TT(0:Lrad(ivol),0:2) ! this is almost identical to cheby; 17 Dec 15; + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif - BEGIN(bfield) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! #ifdef DEBUG - FATAL( bfield, ivol.lt.1 .or. ivol.gt.Mvol, invalid ivol ) + + if( ivol.lt.1 .or. ivol.gt.Mvol ) then + write(6,'("bfield : fatal : myid=",i3," ; ivol.lt.1 .or. ivol.gt.Mvol ; invalid ivol ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "bfield : ivol.lt.1 .or. ivol.gt.Mvol : invalid ivol ;" + endif + #endif !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -269,7 +330,13 @@ subroutine bfield_tangent( zeta, st, Bst ) if( Lcoordinatesingularity ) then ! regularization factor depends on mi; 17 Dec 15; - FATAL( bfield, abs(sbar).lt.vsmall, need to avoid divide-by-zero ) + + if( abs(sbar).lt.vsmall ) then + write(6,'("bfield : fatal : myid=",i3," ; abs(sbar).lt.vsmall ; need to avoid divide-by-zero ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "bfield : abs(sbar).lt.vsmall : need to avoid divide-by-zero ;" + endif + do ll = 0, Lrad(lvol) ; TT(ll,0:2) = (/ zernike(ll,mi,0), zernike(ll,mi,1)*half , zernike(ll,mi,2)*half*half /) enddo @@ -324,12 +391,18 @@ subroutine bfield_tangent( zeta, st, Bst ) if( abs(gBzeta).lt.vsmall ) then - cput = GETTIME + cput = MPI_WTIME() write(ounit,'("bfield : ",f10.2," : lvol=",i3," ; zeta="es23.15" ; (s,t)=("es23.15" ,"es23.15" ) ; B^z="es23.15" ;")') & cput-cpus, lvol, zeta, st(1:2), gBzeta - FATAL( bfield, abs(gBzeta).lt.vsmall, field is not toroidal ) + + if( abs(gBzeta).lt.vsmall ) then + write(6,'("bfield : fatal : myid=",i3," ; abs(gBzeta).lt.vsmall ; field is not toroidal ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "bfield : abs(gBzeta).lt.vsmall : field is not toroidal ;" + endif + endif @@ -351,7 +424,12 @@ subroutine bfield_tangent( zeta, st, Bst ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - RETURN(bfield) + +9999 continue + cput = MPI_WTIME() + Tbfield = Tbfield + ( cput-cpuo ) + return + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! diff --git a/src/bnorml.f90 b/src/bnorml.F90 similarity index 86% rename from src/bnorml.f90 rename to src/bnorml.F90 index 4a47e8fb..ccc20da9 100644 --- a/src/bnorml.f90 +++ b/src/bnorml.F90 @@ -76,7 +76,7 @@ !> @param[out] efmn even Fourier coefficients !> @param[out] ofmn odd Fouier coefficients subroutine bnorml( mn, Ntz, efmn, ofmn ) - + use mod_kinds, only: wp => dp !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! use constants, only : zero, half, one, two, pi, pi2, ten @@ -100,19 +100,35 @@ subroutine bnorml( mn, Ntz, efmn, ofmn ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS - INTEGER, intent(in) :: mn, Ntz - REAL , intent(out) :: efmn(1:mn), ofmn(1:mn) +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + integer, intent(in) :: mn, Ntz + real(wp) , intent(out) :: efmn(1:mn), ofmn(1:mn) - INTEGER :: lvol, Lcurvature, Lparallel, ii, jj, kk, jk, ll, kkmodnp, jkmodnp, ifail, id01daf, nvccalls, icasing, ideriv - REAL :: lss, zeta, teta, cszeta(0:1), tetalow, tetaupp, absacc, gBn - REAL :: Jxyz(1:Ntz,1:3), Bxyz(1:Ntz,1:3), dAt(1:Ntz), dAz(1:Ntz), distance(1:Ntz) + integer :: lvol, Lcurvature, Lparallel, ii, jj, kk, jk, ll, kkmodnp, jkmodnp, ifail, id01daf, nvccalls, icasing, ideriv + real(wp) :: lss, zeta, teta, cszeta(0:1), tetalow, tetaupp, absacc, gBn + real(wp) :: Jxyz(1:Ntz,1:3), Bxyz(1:Ntz,1:3), dAt(1:Ntz), dAz(1:Ntz), distance(1:Ntz) !REAL :: vcintegrand, zetalow, zetaupp ! external :: vcintegrand, zetalow, zetaupp - BEGIN(bnorml) + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -153,7 +169,13 @@ subroutine bnorml( mn, Ntz, efmn, ofmn ) case( 1 ) ! Lparallel = 1 ; 09 Mar 17; if( myid.ne.modulo(jk-1,ncpu) ) cycle ! 11 Oct 12; this is a weird parallelization, but perhaps better exploits all available cpus; case default ! Lparallel; 09 Mar 17; - FATAL( bnorml, .true., invalid Lparallel in parallelization loop ) + + if( .true. ) then + write(6,'("bnorml : fatal : myid=",i3," ; .true. ; invalid Lparallel in parallelization loop ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "bnorml : .true. : invalid Lparallel in parallelization loop ;" + endif + end select ! end of select case( Lparallel ) ; 09 Mar 17; tetazeta(1:2) = (/ teta, zeta /) ! this is global; passed through to zetalow & zetaupp; 14 Apr 17; @@ -168,7 +190,12 @@ subroutine bnorml( mn, Ntz, efmn, ofmn ) ! !#endif - WCALL( bnorml, casing, ( teta, zeta, gBn, icasing ) ) ! tetazeta is global; 26 Apr 17; + + cput = MPI_WTIME() + Tbnorml = Tbnorml + ( cput-cpuo ) + call casing( teta, zeta, gBn, icasing ) + cpuo = MPI_WTIME() + ! tetazeta is global; 26 Apr 17; ijreal(jk) = gBn @@ -205,7 +232,9 @@ subroutine bnorml( mn, Ntz, efmn, ofmn ) case( 0 ) ! Lparallel = 0 ; 09 Mar 17; - RlBCAST(ijreal(1+kk*Nt:Nt+kk*Nt),Nt,kkmodnp) ! plasma; 03 Apr 13; + + call MPI_BCAST(ijreal(1+kk*Nt:Nt+kk*Nt),Nt,MPI_DOUBLE_PRECISION,kkmodnp,MPI_COMM_SPEC,ierr) + ! plasma; 03 Apr 13; !RlBCAST(ijimag(1+kk*Nt:Nt+kk*Nt),Nt,kkmodnp) !RlBCAST(jireal(1+kk*Nt:Nt+kk*Nt),Nt,kkmodnp) @@ -219,7 +248,9 @@ subroutine bnorml( mn, Ntz, efmn, ofmn ) jkmodnp = modulo(jk-1,ncpu) - RlBCAST(ijreal(jk),1,jkmodnp) ! plasma; 03 Apr 13; + + call MPI_BCAST(ijreal(jk),1,MPI_DOUBLE_PRECISION,jkmodnp,MPI_COMM_SPEC,ierr) + ! plasma; 03 Apr 13; !RlBCAST(ijimag(jk),1,jkmodnp) !RlBCAST(jireal(jk),1,jkmodnp) @@ -229,7 +260,13 @@ subroutine bnorml( mn, Ntz, efmn, ofmn ) case default ! Lparallel; 09 Mar 17; - FATAL( bnorml, .true., invalid Lparallel for broadcasting ) + + if( .true. ) then + write(6,'("bnorml : fatal : myid=",i3," ; .true. ; invalid Lparallel for broadcasting ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "bnorml : .true. : invalid Lparallel for broadcasting ;" + endif + end select ! end of select case( Lparallel ) ; 09 Mar 17; @@ -245,7 +282,12 @@ subroutine bnorml( mn, Ntz, efmn, ofmn ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - RETURN(bnorml) + +9999 continue + cput = MPI_WTIME() + Tbnorml = Tbnorml + ( cput-cpuo ) + return + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! diff --git a/src/brcast.f90 b/src/brcast.F90 similarity index 61% rename from src/brcast.f90 rename to src/brcast.F90 index 0fc94027..1e364f07 100644 --- a/src/brcast.f90 +++ b/src/brcast.F90 @@ -16,7 +16,7 @@ !> !> @param[in] lvol index of nested volume subroutine brcast( lvol ) - + use mod_kinds, only: wp => dp !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! use constants, only : zero @@ -46,13 +46,29 @@ subroutine brcast( lvol ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS - INTEGER, intent(in) :: lvol +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + integer, intent(in) :: lvol + + integer :: llmodnp, io, iRZl, ii, ideriv, Nbc - INTEGER :: llmodnp, io, iRZl, ii, ideriv, Nbc - BEGIN(brcast) + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -60,7 +76,13 @@ subroutine brcast( lvol ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - FATAL( brcast, lvol.le.0 .or. lvol.gt.Mvol, error ) + + if( lvol.le.0 .or. lvol.gt.Mvol ) then + write(6,'("brcast : fatal : myid=",i3," ; lvol.le.0 .or. lvol.gt.Mvol ; error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "brcast : lvol.le.0 .or. lvol.gt.Mvol : error ;" + endif + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -68,17 +90,35 @@ subroutine brcast( lvol ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - RlBCAST( mu(lvol), 1, llmodnp ) - RlBCAST( dtflux(lvol), 1, llmodnp ) - RlBCAST( dpflux(lvol), 1, llmodnp ) - RlBCAST( helicity(lvol), 1, llmodnp) - RlBCAST( vvolume(lvol), 1, llmodnp ) - RlBCAST( lBBintegral(lvol), 1, llmodnp ) - RlBCAST( lABintegral(lvol), 1, llmodnp ) + call MPI_BCAST(mu(lvol),1,MPI_DOUBLE_PRECISION,llmodnp ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(dtflux(lvol),1,MPI_DOUBLE_PRECISION,llmodnp ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(dpflux(lvol),1,MPI_DOUBLE_PRECISION,llmodnp ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(helicity(lvol),1,MPI_DOUBLE_PRECISION,llmodnp,MPI_COMM_SPEC,ierr) + + + + call MPI_BCAST(vvolume(lvol),1,MPI_DOUBLE_PRECISION,llmodnp ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(lBBintegral(lvol),1,MPI_DOUBLE_PRECISION,llmodnp ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(lABintegral(lvol),1,MPI_DOUBLE_PRECISION,llmodnp ,MPI_COMM_SPEC,ierr) + + + + call MPI_BCAST(diotadxup(0:1,-1:2,lvol),8,MPI_DOUBLE_PRECISION,llmodnp ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(dItGpdxtp(0:1,-1:2,lvol),8,MPI_DOUBLE_PRECISION,llmodnp ,MPI_COMM_SPEC,ierr) - RlBCAST( diotadxup(0:1,-1:2,lvol), 8, llmodnp ) - RlBCAST( dItGpdxtp(0:1,-1:2,lvol), 8, llmodnp ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -87,14 +127,20 @@ subroutine brcast( lvol ) if( LocalConstraint ) then Nbc = LGdof* 2* LGdof* 2 - RlBCAST( dFFdRZ(1:LGdof,0:1,1:LGdof,0:1,lvol), Nbc, llmodnp ) - + + call MPI_BCAST(dFFdRZ(1:LGdof,0:1,1:LGdof,0:1,lvol),Nbc,MPI_DOUBLE_PRECISION,llmodnp ,MPI_COMM_SPEC,ierr) + + Nbc = LGdof* 2* 2 - RlBCAST( dBBdmp(1:LGdof,lvol,0:1,1:2), Nbc, llmodnp ) + + call MPI_BCAST(dBBdmp(1:LGdof,lvol,0:1,1:2),Nbc,MPI_DOUBLE_PRECISION,llmodnp ,MPI_COMM_SPEC,ierr) + Nbc = 2* LGdof* 2 - RlBCAST( dmupfdx(lvol,1:1 ,1:2,1:LGdof,0:1), Nbc, llmodnp ) ! why is this broadcast; 02 Sep 14; + + call MPI_BCAST(dmupfdx(lvol,1:1 ,1:2,1:LGdof,0:1),Nbc,MPI_DOUBLE_PRECISION,llmodnp ,MPI_COMM_SPEC,ierr) + ! why is this broadcast; 02 Sep 14; endif @@ -103,13 +149,19 @@ subroutine brcast( lvol ) if (Lhessian3Dallocated) then Nbc = LGdof* 2* LGdof* 2 - RlBCAST(denergydrr(1:LGdof,lvol,0:1,1:LGdof,0:1), Nbc, llmodnp ) - RlBCAST(denergydzr(1:LGdof,lvol,0:1,1:LGdof,0:1), Nbc, llmodnp ) + + call MPI_BCAST(denergydrr(1:LGdof,lvol,0:1,1:LGdof,0:1),Nbc,MPI_DOUBLE_PRECISION,llmodnp ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(denergydzr(1:LGdof,lvol,0:1,1:LGdof,0:1),Nbc,MPI_DOUBLE_PRECISION,llmodnp ,MPI_COMM_SPEC,ierr) + endif - + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LlBCAST( ImagneticOK(lvol), 1, llmodnp ) + + call MPI_BCAST(ImagneticOK(lvol),1,MPI_LOGICAL,llmodnp ,MPI_COMM_SPEC,ierr) + ! Commented - broadcasted in dfp200 ! do ideriv = 0, 2 @@ -121,10 +173,18 @@ subroutine brcast( lvol ) ! enddo - RlBCAST( Bemn(1:mn,lvol,0:1), 2*mn, llmodnp ) ! perhaps all these should be re-ordered; 18 Jul 14; - RlBCAST( Iomn(1:mn,lvol ), mn, llmodnp ) - RlBCAST( Somn(1:mn,lvol,0:1), 2*mn, llmodnp ) - RlBCAST( Pomn(1:mn,lvol,0:2), 3*mn, llmodnp ) ! 15 Sep 15; + + call MPI_BCAST(Bemn(1:mn,lvol,0:1),2*mn,MPI_DOUBLE_PRECISION,llmodnp ,MPI_COMM_SPEC,ierr) + ! perhaps all these should be re-ordered; 18 Jul 14; + + call MPI_BCAST(Iomn(1:mn,lvol ),mn,MPI_DOUBLE_PRECISION,llmodnp ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(Somn(1:mn,lvol,0:1),2*mn,MPI_DOUBLE_PRECISION,llmodnp ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(Pomn(1:mn,lvol,0:2),3*mn,MPI_DOUBLE_PRECISION,llmodnp ,MPI_COMM_SPEC,ierr) + ! 15 Sep 15; if( NOTstellsym ) then ! do ideriv = 0, 2 @@ -134,10 +194,18 @@ subroutine brcast( lvol ) ! enddo ! enddo - RlBCAST( Bomn(1:mn,lvol,0:1), 2*mn, llmodnp ) - RlBCAST( Iemn(1:mn,lvol ), mn, llmodnp ) - RlBCAST( Semn(1:mn,lvol,0:1), 2*mn, llmodnp ) - RlBCAST( Pemn(1:mn,lvol,0:2), 3*mn, llmodnp ) + + call MPI_BCAST(Bomn(1:mn,lvol,0:1),2*mn,MPI_DOUBLE_PRECISION,llmodnp ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(Iemn(1:mn,lvol ),mn,MPI_DOUBLE_PRECISION,llmodnp ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(Semn(1:mn,lvol,0:1),2*mn,MPI_DOUBLE_PRECISION,llmodnp ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(Pemn(1:mn,lvol,0:2),3*mn,MPI_DOUBLE_PRECISION,llmodnp ,MPI_COMM_SPEC,ierr) + endif ! end of if( NOTstellsym) ; 11 Aug 14; !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -145,12 +213,21 @@ subroutine brcast( lvol ) ! if( lvol.gt.Nvol .and. Lconstraint.eq.-1 .and. Wcurent ) then ! 27 Feb 17; if( lvol.gt.Nvol .and. Wcurent ) then ! 27 Feb 17; !write(ounit,'("brcast : " 10x " : myid="i3" ; broadcasting : curtor="es13.5" ; curpol="es13.5" ;")') myid, curtor, curpol - RlBCAST( curtor, 1, llmodnp ) - RlBCAST( curpol, 1, llmodnp ) + + call MPI_BCAST(curtor,1,MPI_DOUBLE_PRECISION,llmodnp ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(curpol,1,MPI_DOUBLE_PRECISION,llmodnp ,MPI_COMM_SPEC,ierr) + endif !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - RETURN(brcast) + +9999 continue + cput = MPI_WTIME() + Tbrcast = Tbrcast + ( cput-cpuo ) + return + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! diff --git a/src/casing.f90 b/src/casing.F90 similarity index 89% rename from src/casing.f90 rename to src/casing.F90 index 99e00888..7af6a1a6 100644 --- a/src/casing.f90 +++ b/src/casing.F90 @@ -101,7 +101,7 @@ !> @param[out] gBn \f$ \sqrt g {\bf B} \cdot {\bf n}\f$ !> @param[out] icasing return flag from dcuhre() subroutine casing( teta, zeta, gBn, icasing ) - + use mod_kinds, only: wp => dp !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! use constants, only : zero, pi, pi2 @@ -118,22 +118,38 @@ subroutine casing( teta, zeta, gBn, icasing ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS - REAL, intent(in) :: teta, zeta ! arbitrary location; Cartesian; - REAL, intent(out) :: gBn ! magnetic field; Cartesian; - INTEGER, intent(out) :: icasing +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + real(wp), intent(in) :: teta, zeta ! arbitrary location; Cartesian; + real(wp), intent(out) :: gBn ! magnetic field; Cartesian; + integer, intent(out) :: icasing - INTEGER, parameter :: Ndim = 2, Nfun = 1 + integer, parameter :: Ndim = 2, Nfun = 1 - INTEGER :: ldim, lfun, minpts, maxpts, Lrwk, idcuhre, jk, irestart, funcls, key, num, maxsub - REAL :: integrals(1:Nfun), low(1:Ndim), upp(1:Ndim), labs, lrel, absest(1:Nfun) - REAL, allocatable :: rwk(:) + integer :: ldim, lfun, minpts, maxpts, Lrwk, idcuhre, jk, irestart, funcls, key, num, maxsub + real(wp) :: integrals(1:Nfun), low(1:Ndim), upp(1:Ndim), labs, lrel, absest(1:Nfun) + real(wp), allocatable :: rwk(:) ! REAL :: dvcfield external :: dvcfield - BEGIN(casing) + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -168,7 +184,10 @@ subroutine casing( teta, zeta, gBn, icasing ) Lrwk = maxsub * ( 2 * Ndim + 2 * Nfun + 2 ) + 17 * Nfun + 1 - SALLOCATE( rwk, (1:Lrwk), zero ) + + allocate( rwk(1:Lrwk), stat=astat ) + rwk(1:Lrwk) = zero + irestart = 0 ; funcls = 0 @@ -181,7 +200,7 @@ subroutine casing( teta, zeta, gBn, icasing ) gBn = integrals(1) - cput = GETTIME + cput = MPI_WTIME() select case( idcuhre ) ! "123456789012345678901234" case(0) ; ; ; exit @@ -219,9 +238,14 @@ subroutine casing( teta, zeta, gBn, icasing ) Lrwk = maxsub * ( 2 * Ndim + 2 * Nfun + 2 ) + 17 * Nfun + 1 - DALLOCATE(rwk) - SALLOCATE(rwk, (1:Lrwk), zero) + deallocate(rwk,stat=astat) + + + + allocate( rwk(1:Lrwk), stat=astat ) + rwk(1:Lrwk) = zero + enddo ! end of virtual casing accuracy infinite-do-loop; 10 Apr 13; @@ -239,11 +263,18 @@ subroutine casing( teta, zeta, gBn, icasing ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - DALLOCATE(rwk) + + deallocate(rwk,stat=astat) + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - RETURN(casing) + +9999 continue + cput = MPI_WTIME() + Tcasing = Tcasing + ( cput-cpuo ) + return + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -261,7 +292,7 @@ end subroutine casing !> @param[in] Nfun number of function values (==3) !> @param[out] vcintegrand cartesian components of magnetic field subroutine dvcfield( Ndim, tz, Nfun, vcintegrand ) ! differential virtual-casing field; format is fixed by NAG requirements; - + use mod_kinds, only: wp => dp !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! use constants, only : zero, half, one, three, four @@ -287,23 +318,43 @@ subroutine dvcfield( Ndim, tz, Nfun, vcintegrand ) ! differential virtual-casing !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS - INTEGER , intent(in) :: Ndim, Nfun - REAL , intent(in) :: tz(1:Ndim) - REAL , intent(out) :: vcintegrand(1:Nfun) ! integrand; components of magnetic field due to plasma currents in Cartesian coordinates; +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + integer , intent(in) :: Ndim, Nfun + real(wp) , intent(in) :: tz(1:Ndim) + real(wp) , intent(out) :: vcintegrand(1:Nfun) ! integrand; components of magnetic field due to plasma currents in Cartesian coordinates; - INTEGER :: ii, mi, ni, ll, ideriv, jk - REAL :: dR(0:3), dZ(0:3), gBut, gBuz, gtt, gtz, gzz, sqrtg, Blt, Blz, czeta, szeta, arg, carg, sarg, XX, YY, ZZ, teta, zeta - REAL :: jj(1:3), rr(1:3), distance(1:3), firstorderfactor + integer :: ii, mi, ni, ll, ideriv, jk + real(wp) :: dR(0:3), dZ(0:3), gBut, gBuz, gtt, gtz, gzz, sqrtg, Blt, Blz, czeta, szeta, arg, carg, sarg, XX, YY, ZZ, teta, zeta + real(wp) :: jj(1:3), rr(1:3), distance(1:3), firstorderfactor - REAL :: XXt, XXz, YYt, YYz, ZZt, ZZz, ds, Bxyz(1:3) + real(wp) :: XXt, XXz, YYt, YYz, ZZt, ZZz, ds, Bxyz(1:3) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! #ifdef DEBUG - FATAL( casing, Ndim.ne. 2, incorrect ) - FATAL( casing, Nfun.ne. 1, incorrect ) + + if( Ndim.ne. 2 ) then + write(6,'("casing : fatal : myid=",i3," ; Ndim.ne. 2 ; incorrect ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "casing : Ndim.ne. 2 : incorrect ;" + endif + + + if( Nfun.ne. 1 ) then + write(6,'("casing : fatal : myid=",i3," ; Nfun.ne. 1 ; incorrect ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "casing : Nfun.ne. 1 : incorrect ;" + endif + #endif !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -371,7 +422,13 @@ subroutine dvcfield( Ndim, tz, Nfun, vcintegrand ) ! differential virtual-casing case( 2 ) ! Igeometry = 2 ; 09 Mar 17; - FATAL( casing, .true., virtual casing under construction for cylindrical geometry ) + + if( .true. ) then + write(6,'("casing : fatal : myid=",i3," ; .true. ; virtual casing under construction for cylindrical geometry ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "casing : .true. : virtual casing under construction for cylindrical geometry ;" + endif + case( 3 ) ! Igeometry = 3 ; 09 Mar 17; @@ -452,7 +509,13 @@ subroutine dvcfield( Ndim, tz, Nfun, vcintegrand ) ! differential virtual-casing case( 2 ) ! Igeometry = 2 ; 09 Mar 17; - FATAL( casing, .true., virtual casing under construction for cylindrical geometry ) + + if( .true. ) then + write(6,'("casing : fatal : myid=",i3," ; .true. ; virtual casing under construction for cylindrical geometry ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "casing : .true. : virtual casing under construction for cylindrical geometry ;" + endif + case( 3 ) ! Igeometry = 3 ; 09 Mar 17; @@ -481,7 +544,13 @@ subroutine dvcfield( Ndim, tz, Nfun, vcintegrand ) ! differential virtual-casing case( 2 ) ! Igeometry = 2 ; 09 Mar 17; - FATAL( casing, .true., virtual casing under construction for cylindrical geometry ) + + if( .true. ) then + write(6,'("casing : fatal : myid=",i3," ; .true. ; virtual casing under construction for cylindrical geometry ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "casing : .true. : virtual casing under construction for cylindrical geometry ;" + endif + case( 3 ) ! Igeometry = 3 ; toroidal geometry; diff --git a/src/coords.f90 b/src/coords.F90 similarity index 84% rename from src/coords.f90 rename to src/coords.F90 index 651e0b20..c5b8b348 100644 --- a/src/coords.f90 +++ b/src/coords.F90 @@ -141,7 +141,7 @@ !> @param[in] Ntz number of points in \f$\theta\f$ and \f$\zeta\f$ !> @param[in] mn number of Fourier harmonics subroutine coords( lvol, lss, Lcurvature, Ntz, mn ) - + use mod_kinds, only: wp => dp !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! use constants, only : zero, half, one, two, pi2 @@ -167,24 +167,58 @@ subroutine coords( lvol, lss, Lcurvature, Ntz, mn ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS - INTEGER, intent(in) :: lvol, Lcurvature, Ntz, mn - REAL , intent(in) :: lss +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + integer, intent(in) :: lvol, Lcurvature, Ntz, mn + real(wp) , intent(in) :: lss - INTEGER :: ii, jj, kk, irz, innout, issym, signlss, mi, ni, imn - REAL :: Remn(1:mn,0:2), Zomn(1:mn,0:2), Romn(1:mn,0:2), Zemn(1:mn,0:2), alss, blss, sbar, sbarhim(1:mn), fj(1:mn,0:2) + integer :: ii, jj, kk, irz, innout, issym, signlss, mi, ni, imn + real(wp) :: Remn(1:mn,0:2), Zomn(1:mn,0:2), Romn(1:mn,0:2), Zemn(1:mn,0:2), alss, blss, sbar, sbarhim(1:mn), fj(1:mn,0:2) - REAL :: Dij(1:Ntz,0:3), dguvij(1:Ntz,1:3,1:3), DRxij(1:Ntz,0:3), DZxij(1:Ntz,0:3) + real(wp) :: Dij(1:Ntz,0:3), dguvij(1:Ntz,1:3,1:3), DRxij(1:Ntz,0:3), DZxij(1:Ntz,0:3) + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif - BEGIN(coords) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! #ifdef DEBUG - FATAL( coords, lvol.lt.1 .or. lvol.gt.Mvol, invalid volume label ) - FATAL( coords, abs(lss).gt.one, invalid radial coordinate ) - FATAL( coords, Lcurvature.lt.0 .or. Lcurvature.gt.5, invalid input value for Lcurvature ) + + if( lvol.lt.1 .or. lvol.gt.Mvol ) then + write(6,'("coords : fatal : myid=",i3," ; lvol.lt.1 .or. lvol.gt.Mvol ; invalid volume label ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "coords : lvol.lt.1 .or. lvol.gt.Mvol : invalid volume label ;" + endif + + + if( abs(lss).gt.one ) then + write(6,'("coords : fatal : myid=",i3," ; abs(lss).gt.one ; invalid radial coordinate ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "coords : abs(lss).gt.one : invalid radial coordinate ;" + endif + + + if( Lcurvature.lt.0 .or. Lcurvature.gt.5 ) then + write(6,'("coords : fatal : myid=",i3," ; Lcurvature.lt.0 .or. Lcurvature.gt.5 ; invalid input value for Lcurvature ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "coords : Lcurvature.lt.0 .or. Lcurvature.gt.5 : invalid input value for Lcurvature ;" + endif + #endif !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -206,14 +240,26 @@ subroutine coords( lvol, lss, Lcurvature, Ntz, mn ) sbar = ( lss + one ) * half #ifdef DEBUG - FATAL( coords, sbar.lt.zero .or. sbar.gt.one, invalid sbar ) + + if( sbar.lt.zero .or. sbar.gt.one ) then + write(6,'("coords : fatal : myid=",i3," ; sbar.lt.zero .or. sbar.gt.one ; invalid sbar ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "coords : sbar.lt.zero .or. sbar.gt.one : invalid sbar ;" + endif + #endif select case( Igeometry ) case( 2 ) ; fj( 1:Ntor+1,0) = sbar ! these are the mj.eq.0 harmonics; 11 Aug 14; switch to sbar=r; 29 Jun 19 ; ; fj(Ntor+2:mn ,0) = sbar**(im(Ntor+2:mn)+1) ! these are the me.ne.0 harmonics; 11 Aug 14; switch to sbar=r; 29 Jun 19 case( 3 ) ; fj( 1:Ntor+1,0) = sbar**2 ! switch to sbar=r; 29 Jun 19 ; ; fj(Ntor+2:mn ,0) = sbar**im(Ntor+2:mn) ! these are the me.ne.0 harmonics; 11 Aug 14; switch to sbar=r; 29 Jun 19 - case default ; FATAL( coords, .true., invalid Igeometry for Lcoordinatesingularity=T ) + case default ; + if( .true. ) then + write(6,'("coords : fatal : myid=",i3," ; .true. ; invalid Igeometry for Lcoordinatesingularity=T ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "coords : .true. : invalid Igeometry for Lcoordinatesingularity=T ;" + endif + end select @@ -257,14 +303,26 @@ subroutine coords( lvol, lss, Lcurvature, Ntz, mn ) if( Lcoordinatesingularity ) then #ifdef DEBUG - FATAL( coords, sbar.lt.small, small denominator ) + + if( sbar.lt.small ) then + write(6,'("coords : fatal : myid=",i3," ; sbar.lt.small ; small denominator ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "coords : sbar.lt.small : small denominator ;" + endif + #endif select case( Igeometry ) case( 2 ) ; fj( 1:Ntor+1,1) = half ! these are the mj.eq.0 harmonics; 11 Aug 14; switch to sbar=r; 29 Jun 19 ; ; fj(Ntor+2:mn ,1) = half*(im(Ntor+2:mn)+one) * fj(Ntor+2:mn ,0) / sbar ! these are the me.ne.0 harmonics; 11 Aug 14; switch to sbar=r; 29 Jun 19 case( 3 ) ; fj( 1:Ntor+1,1) = sbar ! these are the mj.eq.0 harmonics; 11 Aug 14; switch to sbar=r; 29 Jun 19 ; ; fj(Ntor+2:mn ,1) = half * im(Ntor+2:mn) * fj(Ntor+2:mn ,0) / sbar ! these are the me.ne.0 harmonics; 11 Aug 14; switch to sbar=r; 29 Jun 19 - case default ; FATAL( coords, .true., invalid Igeometry for Lcoordinatesingularity=T and Lcurvature.ne.0 ) + case default ; + if( .true. ) then + write(6,'("coords : fatal : myid=",i3," ; .true. ; invalid Igeometry for Lcoordinatesingularity=T and Lcurvature.ne.0 ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "coords : .true. : invalid Igeometry for Lcoordinatesingularity=T and Lcurvature.ne.0 ;" + endif + end select Remn(1:mn,1) = ( iRbc(1:mn,1) - iRbc(1:mn,0) ) * fj(1:mn,1) @@ -366,7 +424,13 @@ subroutine coords( lvol, lss, Lcurvature, Ntz, mn ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - FATAL( coords, .true., selected Igeometry not supported ) + + if( .true. ) then + write(6,'("coords : fatal : myid=",i3," ; .true. ; selected Igeometry not supported ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "coords : .true. : selected Igeometry not supported ;" + endif + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -392,7 +456,13 @@ subroutine coords( lvol, lss, Lcurvature, Ntz, mn ) if( Lcoordinatesingularity ) then #ifdef DEBUG - FATAL( coords, sbar.lt.small, small denominator ) + + if( sbar.lt.small ) then + write(6,'("coords : fatal : myid=",i3," ; sbar.lt.small ; small denominator ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "coords : sbar.lt.small : small denominator ;" + endif + #endif select case( Igeometry ) case( 2 ) ; fj( 1:Ntor+1,2) = zero ! these are the mj.eq.0 harmonics; 11 Aug 14; switch to sbar=r; 29 Jun 19 @@ -400,7 +470,13 @@ subroutine coords( lvol, lss, Lcurvature, Ntz, mn ) case( 3 ) ; fj( 1:Ntor+1,2) = half ! these are the mj.eq.0 harmonics; 11 Aug 14; switch to sbar=r; 29 Jun 19 ; ; fj(Ntor+2:mn ,2) = half * ( im(Ntor+2:mn) - one ) * fj(Ntor+2:mn ,1) / sbar ! these are the me.ne.0 harmonics; 11 Aug 14; switch to sbar=r; 29 Jun 19 case default ; - ; ; FATAL( coords, .true., invalid Igeometry for Lcoordinatesingularity=T and Lcurvature=2 ) + ; ; + if( .true. ) then + write(6,'("coords : fatal : myid=",i3," ; .true. ; invalid Igeometry for Lcoordinatesingularity=T and Lcurvature=2 ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "coords : .true. : invalid Igeometry for Lcoordinatesingularity=T and Lcurvature=2 ;" + endif + end select ; Remn(1:mn,2) = ( iRbc(1:mn,1) - iRbc(1:mn,0) ) * fj(1:mn,2) @@ -520,7 +596,13 @@ subroutine coords( lvol, lss, Lcurvature, Ntz, mn ) case default - FATAL( coords, .true., selected Igeometry not supported for Lcurvature.eq.2 ) + + if( .true. ) then + write(6,'("coords : fatal : myid=",i3," ; .true. ; selected Igeometry not supported for Lcurvature.eq.2 ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "coords : .true. : selected Igeometry not supported for Lcurvature.eq.2 ;" + endif + end select ! end of select case( Igeometry ) ; 15 Sep 16; @@ -538,11 +620,23 @@ subroutine coords( lvol, lss, Lcurvature, Ntz, mn ) if( Lcoordinatesingularity ) then #ifdef DEBUG - FATAL( coords, innout.eq.0, cannot differentiate metric elements wrt coordinate singularity ) + + if( innout.eq.0 ) then + write(6,'("coords : fatal : myid=",i3," ; innout.eq.0 ; cannot differentiate metric elements wrt coordinate singularity ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "coords : innout.eq.0 : cannot differentiate metric elements wrt coordinate singularity ;" + endif + #endif #ifdef DEBUG - FATAL( coords, Igeometry.eq.1, Cartesian does not need regularization factor ) + + if( Igeometry.eq.1 ) then + write(6,'("coords : fatal : myid=",i3," ; Igeometry.eq.1 ; Cartesian does not need regularization factor ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "coords : Igeometry.eq.1 : Cartesian does not need regularization factor ;" + endif + #endif if( ( irz.eq.0 .and. issym.eq.0 ) .or. ( irz.eq.1 .and. issym.eq.1 ) ) then ! cosine harmonics; 13 Sep 13; @@ -616,7 +710,13 @@ subroutine coords( lvol, lss, Lcurvature, Ntz, mn ) if( irz.eq.1 ) sg(1:Ntz,1) = ( Dij(1:Ntz,1 )*Rij(1:Ntz,2,0) - Rij(1:Ntz,1,0)*Dij(1:Ntz,2 ) ) else - FATAL( coords, Lcurvature.eq.5 .and. Igeometry.ne.3, Lcurvature.eq.5 can only be combined with Igeometry.ne.3 ) + + if( Lcurvature.eq.5 .and. Igeometry.ne.3 ) then + write(6,'("coords : fatal : myid=",i3," ; Lcurvature.eq.5 .and. Igeometry.ne.3 ; Lcurvature.eq.5 can only be combined with Igeometry.ne.3 ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "coords : Lcurvature.eq.5 .and. Igeometry.ne.3 : Lcurvature.eq.5 can only be combined with Igeometry.ne.3 ;" + endif + end if ! if (Igeometry .eq. 3) ; 13 Jan 20 else ! we need more for Lcurvature=3,4 ; 13 Jan 20 @@ -626,7 +726,13 @@ subroutine coords( lvol, lss, Lcurvature, Ntz, mn ) case( 1 ) ! Lcurvature=3,4 ; Igeometry=1 ; Cartesian; 04 Dec 14; #ifdef DEBUG - FATAL( coords, irz.eq.1, there is no dependence on Zbs or Zbc ) + + if( irz.eq.1 ) then + write(6,'("coords : fatal : myid=",i3," ; irz.eq.1 ; there is no dependence on Zbs or Zbc ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "coords : irz.eq.1 : there is no dependence on Zbs or Zbc ;" + endif + #endif ! sg(1:Ntz,0) = Rij(1:Ntz,1,0)*rpol*rtor @@ -643,7 +749,13 @@ subroutine coords( lvol, lss, Lcurvature, Ntz, mn ) case( 2 ) ! Lcurvature=3,4,5 ; Igeometry=2 ; cylindrical; #ifdef DEBUG - FATAL( coords, irz.eq.1, there is no dependence on Zbs or Zbc ) + + if( irz.eq.1 ) then + write(6,'("coords : fatal : myid=",i3," ; irz.eq.1 ; there is no dependence on Zbs or Zbc ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "coords : irz.eq.1 : there is no dependence on Zbs or Zbc ;" + endif + #endif ! sg(1:Ntz,0) = Rij(1:Ntz,1,0) * Rij(1:Ntz,0,0) @@ -654,7 +766,13 @@ subroutine coords( lvol, lss, Lcurvature, Ntz, mn ) do jj = ii, 3 if( irz.eq.0 ) dguvij(1:Ntz,ii,jj) = Dij(1:Ntz,ii) * Rij(1:Ntz,jj,0) + Rij(1:Ntz,ii,0) * Dij(1:Ntz,jj) if( irz.eq.1 ) then - FATAL(coords, .true., No Z-geometrical degree of freedom when Igeometry=2)!dguvij(1:Ntz,ii,jj) = Dij(1:Ntz,ii) * Zij(1:Ntz,jj,0) + Zij(1:Ntz,ii,0) * Dij(1:Ntz,jj) ! TODO REMOVE + + if( .true. ) then + write(6,'("coords : fatal : myid=",i3," ; .true. ; No Z-geometrical degree of freedom when Igeometry=2;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "coords : .true. : No Z-geometrical degree of freedom when Igeometry=2 ;" + endif +!dguvij(1:Ntz,ii,jj) = Dij(1:Ntz,ii) * Zij(1:Ntz,jj,0) + Zij(1:Ntz,ii,0) * Dij(1:Ntz,jj) ! TODO REMOVE endif enddo enddo @@ -704,7 +822,13 @@ subroutine coords( lvol, lss, Lcurvature, Ntz, mn ) case default - FATAL( coords, .true., supplied Igeometry is not yet supported for Lcurvature.eq.3 or Lcurvature.eq.4 ) + + if( .true. ) then + write(6,'("coords : fatal : myid=",i3," ; .true. ; supplied Igeometry is not yet supported for Lcurvature.eq.3 or Lcurvature.eq.4 ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "coords : .true. : supplied Igeometry is not yet supported for Lcurvature.eq.3 or Lcurvature.eq.4 ;" + endif + end select ! end of select case( Igeometry ); 7 Mar 13; @@ -737,7 +861,12 @@ subroutine coords( lvol, lss, Lcurvature, Ntz, mn ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - RETURN(coords) + +9999 continue + cput = MPI_WTIME() + Tcoords = Tcoords + ( cput-cpuo ) + return + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! diff --git a/src/curent.f90 b/src/curent.F90 similarity index 89% rename from src/curent.f90 rename to src/curent.F90 index 87cd1255..7c828238 100644 --- a/src/curent.f90 +++ b/src/curent.F90 @@ -54,7 +54,7 @@ !> @param[in] iflag some integer flag !> @param[out] ldItGp plasma and linking current subroutine curent( lvol, mn, Nt, Nz, iflag, ldItGp ) - + use mod_kinds, only: wp => dp !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! use constants, only : zero, one, two, pi2 @@ -78,21 +78,43 @@ subroutine curent( lvol, mn, Nt, Nz, iflag, ldItGp ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS - INTEGER, intent(in) :: lvol, mn, Nt, Nz, iflag - REAL , intent(out) :: ldItGp(0:1,-1:2) +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + integer, intent(in) :: lvol, mn, Nt, Nz, iflag + real(wp) , intent(out) :: ldItGp(0:1,-1:2) + + integer :: innout, ideriv, ii, ll, Lcurvature, ifail + real(wp) :: lss + real(wp) :: Bsupt(1:Nt*Nz,-1:2), Bsupz(1:Nt*Nz,-1:2) + - INTEGER :: innout, ideriv, ii, ll, Lcurvature, ifail - REAL :: lss - REAL :: Bsupt(1:Nt*Nz,-1:2), Bsupz(1:Nt*Nz,-1:2) + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif - BEGIN(curent) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! #ifdef DEBUG - FATAL( curent, lvol.ne.Mvol, this is only defined in the vacuum region ) + + if( lvol.ne.Mvol ) then + write(6,'("curent : fatal : myid=",i3," ; lvol.ne.Mvol ; this is only defined in the vacuum region ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "curent : lvol.ne.Mvol : this is only defined in the vacuum region ;" + endif + #endif !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -126,7 +148,12 @@ subroutine curent( lvol, mn, Nt, Nz, iflag, ldItGp ) case( 2 ) ; Lcurvature = 1 end select - WCALL( curent, coords,( lvol, lss, Lcurvature, Ntz, mn ) ) ! get "lower" metric elements evaluated on innout interface; + + cput = MPI_WTIME() + Tcurent = Tcurent + ( cput-cpuo ) + call coords( lvol, lss, Lcurvature, Ntz, mn ) + cpuo = MPI_WTIME() + ! get "lower" metric elements evaluated on innout interface; !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -183,7 +210,12 @@ subroutine curent( lvol, mn, Nt, Nz, iflag, ldItGp ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - RETURN(curent) + +9999 continue + cput = MPI_WTIME() + Tcurent = Tcurent + ( cput-cpuo ) + return + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! diff --git a/src/contrib/d1mach.f b/src/d1mach.f similarity index 100% rename from src/contrib/d1mach.f rename to src/d1mach.f diff --git a/src/contrib/dcuhre.f b/src/dcuhre.f similarity index 100% rename from src/contrib/dcuhre.f rename to src/dcuhre.f diff --git a/src/df00ab.f90 b/src/df00ab.F90 similarity index 72% rename from src/df00ab.f90 rename to src/df00ab.F90 index b36d5e23..38f5805b 100644 --- a/src/df00ab.f90 +++ b/src/df00ab.F90 @@ -11,7 +11,7 @@ !> @param[in] Ldfjac !> @param[in] iflag subroutine df00ab( pNN , xi , Fxi , DFxi , Ldfjac , iflag ) - + use mod_kinds, only: wp => dp !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! use constants, only : zero, half, one, two @@ -28,23 +28,45 @@ subroutine df00ab( pNN , xi , Fxi , DFxi , Ldfjac , iflag ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS - INTEGER, intent(in) :: pNN, Ldfjac - INTEGER, intent(in) :: iflag - REAL , intent(in) :: xi(0:pNN-1) - REAL , intent(out) :: Fxi(0:pNN-1), DFxi(0:Ldfjac-1,0:pNN-1) +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + integer, intent(in) :: pNN, Ldfjac + integer, intent(in) :: iflag + real(wp) , intent(in) :: xi(0:pNN-1) + real(wp) , intent(out) :: Fxi(0:pNN-1), DFxi(0:Ldfjac-1,0:pNN-1) + + integer :: NN + real(wp) :: lmu ! , dpsi(1:2) + - INTEGER :: NN - REAL :: lmu ! , dpsi(1:2) + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif - BEGIN(df00ab) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! #ifdef DEBUG - FATAL(df00ab, ivol.lt.1 .or. ivol.gt.Nvol, ivol invalid ) ! 26 Feb 13; + + if( ivol.lt.1 .or. ivol.gt.Nvol ) then + write(6,'("df00ab : fatal : myid=",i3," ; ivol.lt.1 .or. ivol.gt.Nvol ; ivol invalid ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "df00ab : ivol.lt.1 .or. ivol.gt.Nvol : ivol invalid ;" + endif + ! 26 Feb 13; #endif @@ -75,13 +97,24 @@ subroutine df00ab( pNN , xi , Fxi , DFxi , Ldfjac , iflag ) case default - FATAL(df00ab, .true., supplied value of iflag is not supported ) + + if( .true. ) then + write(6,'("df00ab : fatal : myid=",i3," ; .true. ; supplied value of iflag is not supported ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "df00ab : .true. : supplied value of iflag is not supported ;" + endif + end select !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - RETURN(df00ab) + +9999 continue + cput = MPI_WTIME() + Tdf00ab = Tdf00ab + ( cput-cpuo ) + return + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! diff --git a/src/dforce.f90 b/src/dforce.F90 similarity index 78% rename from src/dforce.f90 rename to src/dforce.F90 index 64bc8a9a..ada29439 100644 --- a/src/dforce.f90 +++ b/src/dforce.F90 @@ -91,7 +91,7 @@ !> @param[in] LComputeDerivatives !> @param[inout] LComputeAxis subroutine dforce( NGdof, position, force, LComputeDerivatives, LComputeAxis) - + use mod_kinds, only: wp => dp !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! use constants, only : zero, half, one, pi, pi2 @@ -106,7 +106,7 @@ subroutine dforce( NGdof, position, force, LComputeDerivatives, LComputeAxis) Lextrap, & mupftol, & Lfreebound, LHmatrix - + use cputiming, only : Tdforce use allglobal, only : ncpu, myid, cpus, MPI_COMM_SPEC, & @@ -138,40 +138,56 @@ subroutine dforce( NGdof, position, force, LComputeDerivatives, LComputeAxis) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS - INTEGER, parameter :: NB = 3 ! optimal workspace block size for LAPACK:DSYSVX; +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + - INTEGER, intent(in) :: NGdof ! dimensions; - REAL, intent(in) :: position(0:NGdof) ! degrees-of-freedom = internal geometry; - REAL, intent(out) :: force(0:NGdof) ! force; + integer, parameter :: NB = 3 ! optimal workspace block size for LAPACK:DSYSVX; + + integer, intent(in) :: NGdof ! dimensions; + real(wp), intent(in) :: position(0:NGdof) ! degrees-of-freedom = internal geometry; + real(wp), intent(out) :: force(0:NGdof) ! force; LOGICAL, intent(in) :: LComputeDerivatives ! indicates whether derivatives are to be calculated; - INTEGER :: vvol, innout, ii, jj, irz, issym, iocons, tdoc, idoc, idof, tdof, jdof, ivol, imn, ll, ihybrd1, lwa, Ndofgl, llmodnp - INTEGER :: maxfev, ml, muhybr, mode, nprint, nfev, ldfjac, lr, Nbc, NN, cpu_id, ideriv - REAL :: epsfcn, factor - REAL :: Fdof(1:Mvol-1), Xdof(1:Mvol-1) - INTEGER :: ipiv(1:Mvol) - REAL, allocatable :: fjac(:, :), r(:), Fvec(:), dpfluxout(:) + integer :: vvol, innout, ii, jj, irz, issym, iocons, tdoc, idoc, idof, tdof, jdof, ivol, imn, ll, ihybrd1, lwa, Ndofgl, llmodnp + integer :: maxfev, ml, muhybr, mode, nprint, nfev, ldfjac, lr, Nbc, NN, cpu_id, ideriv + real(wp) :: epsfcn, factor + real(wp) :: Fdof(1:Mvol-1), Xdof(1:Mvol-1) + integer :: ipiv(1:Mvol) + real(wp), allocatable :: fjac(:, :), r(:), Fvec(:), dpfluxout(:) - INTEGER :: status(MPI_STATUS_SIZE), request_recv, request_send, cpu_send - INTEGER :: id - INTEGER :: iflag, idgesv, Lwork - INTEGER :: idofr,idofz,tdofr,tdofz + integer :: status(MPI_STATUS_SIZE), request_recv, request_send, cpu_send + integer :: id + integer :: iflag, idgesv, Lwork + integer :: idofr,idofz,tdofr,tdofz - CHARACTER :: packorunpack + character :: packorunpack EXTERNAL :: dfp100, dfp200 LOGICAL :: LComputeAxis, dfp100_logical #ifdef DEBUG - INTEGER :: isymdiff - REAL :: dvol(-1:+1), evolume, imupf(1:2,-2:2), lfactor - REAL, allocatable :: isolution(:,:) - REAL, allocatable :: oRbc(:,:), oZbs(:,:), oRbs(:,:), oZbc(:,:), iforce(:,:), iposition(:,:), finitediff_hessian(:,:) ! original geometry; + integer :: isymdiff + real(wp) :: dvol(-1:+1), evolume, imupf(1:2,-2:2), lfactor + real(wp), allocatable :: isolution(:,:) + real(wp), allocatable :: oRbc(:,:), oZbs(:,:), oRbs(:,:), oZbc(:,:), iforce(:,:), iposition(:,:), finitediff_hessian(:,:) ! original geometry; +#endif + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 #endif - BEGIN(dforce) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -183,14 +199,25 @@ subroutine dforce( NGdof, position, force, LComputeDerivatives, LComputeAxis) LComputeAxis = .true. #endif - WCALL( dforce, packxi,( NGdof, position(0:NGdof), Mvol, mn, iRbc(1:mn,0:Mvol), iZbs(1:mn,0:Mvol), & - iRbs(1:mn,0:Mvol), iZbc(1:mn,0:Mvol), packorunpack, LcomputeDerivatives, LComputeAxis ) ) + + cput = MPI_WTIME() + Tdforce = Tdforce + ( cput-cpuo ) + call packxi( NGdof, position(0:NGdof), Mvol, mn, iRbc(1:mn,0:Mvol), iZbs(1:mn,0:Mvol), & + iRbs(1:mn,0:Mvol), iZbc(1:mn,0:Mvol), packorunpack, LcomputeDerivatives, LComputeAxis ) + cpuo = MPI_WTIME() + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! if( LcomputeDerivatives ) then #ifdef DEBUG - FATAL( dforce, .not.allocated(dBBdmp), do not pass go ) + + if( .not.allocated(dBBdmp) ) then + write(6,'("dforce : fatal : myid=",i3," ; .not.allocated(dBBdmp) ; do not pass go ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "dforce : .not.allocated(dBBdmp) : do not pass go ;" + endif + #endif dBBdmp(1:LGdof,1:Mvol,0:1,1:2) = zero endif @@ -213,16 +240,26 @@ subroutine dforce( NGdof, position, force, LComputeDerivatives, LComputeAxis) if( LocalConstraint ) then - SALLOCATE( Fvec, (1:Mvol-1), zero) + + allocate( Fvec(1:Mvol-1), stat=astat ) + Fvec(1:Mvol-1) = zero + Ndofgl = 0; Fvec(1:Mvol-1) = 0; dfp100_logical = .FALSE.; Xdof(1:Mvol-1) = dpflux(2:Mvol) + xoffset ! Solve for field dBdX%L = LComputeDerivatives - WCALL(dforce, dfp100, (Ndofgl, Xdof, Fvec, dfp100_logical) ) - DALLOCATE( Fvec ) + cput = MPI_WTIME() + Tdforce = Tdforce + ( cput-cpuo ) + call dfp100(Ndofgl, Xdof, Fvec, dfp100_logical) + cpuo = MPI_WTIME() + + + + deallocate(Fvec ,stat=astat) + !do vvol=1,Mvol ! WCALL(dforce, brcast, (vvol) ) @@ -242,13 +279,24 @@ subroutine dforce( NGdof, position, force, LComputeDerivatives, LComputeAxis) Ndofgl = Mvol-1 endif - SALLOCATE( Fvec, (1:Ndofgl), zero ) + + allocate( Fvec(1:Ndofgl), stat=astat ) + Fvec(1:Ndofgl) = zero + dfp100_logical = .FALSE. - WCALL(dforce, dfp100, (Ndofgl, Xdof(1:Mvol-1), Fvec(1:Ndofgl), dfp100_logical)) - SALLOCATE(dpfluxout, (1:Ndofgl), zero ) + cput = MPI_WTIME() + Tdforce = Tdforce + ( cput-cpuo ) + call dfp100(Ndofgl, Xdof(1:Mvol-1), Fvec(1:Ndofgl), dfp100_logical) + cpuo = MPI_WTIME() + + + + allocate( dpfluxout(1:Ndofgl), stat=astat ) + dpfluxout(1:Ndofgl) = zero + if ( myid .eq. 0 ) then dpfluxout = Fvec @@ -262,34 +310,69 @@ subroutine dforce( NGdof, position, force, LComputeDerivatives, LComputeAxis) endif ! Broadcast the field and pflux - RlBCAST(dpfluxout(1:Ndofgl), Ndofgl, 0) - RlBCAST(dpflux(1:Mvol) , Mvol, 0) + + call MPI_BCAST(dpfluxout(1:Ndofgl),Ndofgl,MPI_DOUBLE_PRECISION,0,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(dpflux(1:Mvol) ,Mvol,MPI_DOUBLE_PRECISION,0,MPI_COMM_SPEC,ierr) + if( Lfreebound.eq.1 ) then - RlBCAST(dtflux(Mvol), 1, 0) + + call MPI_BCAST(dtflux(Mvol),1,MPI_DOUBLE_PRECISION,0,MPI_COMM_SPEC,ierr) + endif do vvol = 2, Mvol - WCALL(dforce, IsMyVolume, (vvol)) + + cput = MPI_WTIME() + Tdforce = Tdforce + ( cput-cpuo ) + call IsMyVolume(vvol) + cpuo = MPI_WTIME() + if( IsMyVolumeValue .EQ. 0 ) then cycle else if( IsMyVolumeValue .EQ. -1) then - FATAL(dforce, .true., Unassociated volume) + + if( .true. ) then + write(6,'("dforce : fatal : myid=",i3," ; .true. ; Unassociated volume;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "dforce : .true. : Unassociated volume ;" + endif + endif NN = NAdof(vvol) - SALLOCATE( solution, (1:NN, 0:2), zero) + + allocate( solution(1:NN, 0:2), stat=astat ) + solution(1:NN, 0:2) = zero + ! Pack field and its derivatives packorunpack = 'P' - WCALL( dforce, packab, ( packorunpack, vvol, NN, solution(1:NN,0), 0 ) ) ! packing; - WCALL( dforce, packab, ( packorunpack, vvol, NN, solution(1:NN,2), 2 ) ) ! packing; + + cput = MPI_WTIME() + Tdforce = Tdforce + ( cput-cpuo ) + call packab( packorunpack, vvol, NN, solution(1:NN,0), 0 ) + cpuo = MPI_WTIME() + ! packing; + + cput = MPI_WTIME() + Tdforce = Tdforce + ( cput-cpuo ) + call packab( packorunpack, vvol, NN, solution(1:NN,2), 2 ) + cpuo = MPI_WTIME() + ! packing; ! compute the field with renewed dpflux via single Newton method step if( Lfreebound.eq.1 .and.(vvol.eq.Mvol) ) then - WCALL( dforce, packab, ( packorunpack, vvol, NN, solution(1:NN,1), 1 ) ) ! packing; + + cput = MPI_WTIME() + Tdforce = Tdforce + ( cput-cpuo ) + call packab( packorunpack, vvol, NN, solution(1:NN,1), 1 ) + cpuo = MPI_WTIME() + ! packing; solution(1:NN, 0) = solution(1:NN, 0) - dpfluxout(vvol-1) * solution(1:NN, 2) & ! derivative w.r.t pflux - dpfluxout(vvol ) * solution(1:NN, 1) ! derivative w.r.t tflux else @@ -298,14 +381,25 @@ subroutine dforce( NGdof, position, force, LComputeDerivatives, LComputeAxis) ! Unpack field in vector potential Fourier harmonics packorunpack = 'U' - WCALL( dforce, packab, ( packorunpack, vvol, NN, solution(1:NN,0), 0 ) ) ! unpacking; - DALLOCATE( solution ) + cput = MPI_WTIME() + Tdforce = Tdforce + ( cput-cpuo ) + call packab( packorunpack, vvol, NN, solution(1:NN,0), 0 ) + cpuo = MPI_WTIME() + ! unpacking; + + + deallocate(solution ,stat=astat) + enddo ! end of do vvol = 1, Mvol - DALLOCATE(Fvec) - DALLOCATE(dpfluxout) + + deallocate(Fvec,stat=astat) + + + deallocate(dpfluxout,stat=astat) + ! #ifdef DEBUG ! select case( ihybrd1 ) @@ -331,13 +425,19 @@ subroutine dforce( NGdof, position, force, LComputeDerivatives, LComputeAxis) ! Broadcast all ImagneticOK !write(ounit,'("dforce : " 10x " : myid="i3"; vvol="i3"; ; ImagneticOK="999L2)') myid, vvol, ImagneticOK(1:Mvol) !write(ounit,'("dforce : " 10x " : cpu_id="i3"; vvol="i3"; ; ImagneticOK="999L2)') cpu_id, vvol, ImagneticOK(vvol) - LlBCAST( ImagneticOK(vvol) , 1, cpu_id) + + call MPI_BCAST(ImagneticOK(vvol) ,1,MPI_LOGICAL,cpu_id,MPI_COMM_SPEC,ierr) + do ideriv=0,2 if( (.not.LcomputeDerivatives) .and. (ideriv.ne.0) ) cycle do ii = 1, mn - RlBCAST( Ate(vvol,ideriv,ii)%s(0:Lrad(vvol)), Lrad(vvol)+1, cpu_id) - RlBCAST( Aze(vvol,ideriv,ii)%s(0:Lrad(vvol)), Lrad(vvol)+1, cpu_id) + + call MPI_BCAST(Ate(vvol,ideriv,ii)%s(0:Lrad(vvol)),Lrad(vvol)+1,MPI_DOUBLE_PRECISION,cpu_id,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(Aze(vvol,ideriv,ii)%s(0:Lrad(vvol)),Lrad(vvol)+1,MPI_DOUBLE_PRECISION,cpu_id,MPI_COMM_SPEC,ierr) + enddo enddo @@ -346,18 +446,27 @@ subroutine dforce( NGdof, position, force, LComputeDerivatives, LComputeAxis) do ideriv=0,2 if( (.not.LcomputeDerivatives) .and. (ideriv.ne.0) ) cycle do ii = 1, mn - RlBCAST( Ato(vvol,ideriv,ii)%s(0:Lrad(vvol)), Lrad(vvol)+1, cpu_id) - RlBCAST( Azo(vvol,ideriv,ii)%s(0:Lrad(vvol)), Lrad(vvol)+1, cpu_id) + + call MPI_BCAST(Ato(vvol,ideriv,ii)%s(0:Lrad(vvol)),Lrad(vvol)+1,MPI_DOUBLE_PRECISION,cpu_id,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(Azo(vvol,ideriv,ii)%s(0:Lrad(vvol)),Lrad(vvol)+1,MPI_DOUBLE_PRECISION,cpu_id,MPI_COMM_SPEC,ierr) + enddo enddo endif enddo !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - - ! Compute local force and derivatives + + ! Compute local force and derivatives !Compuatation of Hessian2d is cleared at this point. - WCALL(dforce, dfp200, ( LcomputeDerivatives, vvol) ) + + cput = MPI_WTIME() + Tdforce = Tdforce + ( cput-cpuo ) + call dfp200( LcomputeDerivatives, vvol) + cpuo = MPI_WTIME() + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -367,7 +476,13 @@ subroutine dforce( NGdof, position, force, LComputeDerivatives, LComputeAxis) stop "dforce : : myid= ; finished computing derivatives of rotational-transform wrt mu and dpflux ;" ! this will allow other cpus to finish; endif - FATAL( dforce, Lcheck.eq.2, finished computing derivatives of rotational-transform wrt mu and dpflux ) + + if( Lcheck.eq.2 ) then + write(6,'("dforce : fatal : myid=",i3," ; Lcheck.eq.2 ; finished computing derivatives of rotational-transform wrt mu and dpflux ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "dforce : Lcheck.eq.2 : finished computing derivatives of rotational-transform wrt mu and dpflux ;" + endif + if( Wdforce ) write(ounit,'("dforce : " 10x " : myid="i3" ; LComputeDerivatives="L2" ; ImagneticOK="999L2)') myid, LComputeDerivatives, ImagneticOK(1:Mvol) #endif @@ -377,8 +492,23 @@ subroutine dforce( NGdof, position, force, LComputeDerivatives, LComputeAxis) ! Broadcast information to all CPUs do vvol = 1, Mvol - LREGION( vvol ) - WCALL( dforce, brcast, ( vvol ) ) + + if( Igeometry.eq.1 .or. vvol .gt.1 ) then ; Lcoordinatesingularity = .false. + else ; Lcoordinatesingularity = .true. + endif + + if( vvol .le.Nvol ) then ; Lplasmaregion = .true. + else ; Lplasmaregion = .false. + endif + + Lvacuumregion = .not.Lplasmaregion + + + cput = MPI_WTIME() + Tdforce = Tdforce + ( cput-cpuo ) + call brcast( vvol ) + cpuo = MPI_WTIME() + enddo @@ -404,7 +534,17 @@ subroutine dforce( NGdof, position, force, LComputeDerivatives, LComputeAxis) do vvol = 1, Mvol-1 - LREGION(vvol) + + if( Igeometry.eq.1 .or. vvol.gt.1 ) then ; Lcoordinatesingularity = .false. + else ; Lcoordinatesingularity = .true. + endif + + if( vvol.le.Nvol ) then ; Lplasmaregion = .true. + else ; Lplasmaregion = .false. + endif + + Lvacuumregion = .not.Lplasmaregion + tdoc = (vvol-1) * LGdof @@ -413,7 +553,13 @@ subroutine dforce( NGdof, position, force, LComputeDerivatives, LComputeAxis) ; idoc = 0 ! degree-of-constraint counter; set; if( Lextrap.eq.1 .and. vvol.eq.1 ) then ! to be made redundant; - FATAL( dforce, 2.gt.Mvol, psifactor needs attention ) + + if( 2.gt.Mvol ) then + write(6,'("dforce : fatal : myid=",i3," ; 2.gt.Mvol ; psifactor needs attention ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "dforce : 2.gt.Mvol : psifactor needs attention ;" + endif + ;force(tdoc+idoc+1:tdoc+idoc+mn) = position(1:mn) - ( iRbc(1:mn,2) / psifactor(1:mn,2) ) else ;force(tdoc+idoc+1:tdoc+idoc+mn ) = ( Bemn(1:mn ,vvol+1,0) - Bemn(1:mn ,vvol+0,1) ) * BBweight(1:mn) ! pressure imbalance; @@ -466,7 +612,13 @@ subroutine dforce( NGdof, position, force, LComputeDerivatives, LComputeAxis) endif ! end of if( NOTstellsym ) ; #ifdef DEBUG - FATAL( dforce, idoc.ne.LGdof, counting error ) ! this has caught bugs; + + if( idoc.ne.LGdof ) then + write(6,'("dforce : fatal : myid=",i3," ; idoc.ne.LGdof ; counting error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "dforce : idoc.ne.LGdof : counting error ;" + endif + ! this has caught bugs; #endif else ! matches if( ImagneticOK(vvol) .and. ImagneticOK(vvol+1) ); @@ -495,7 +647,7 @@ subroutine dforce( NGdof, position, force, LComputeDerivatives, LComputeAxis) if( Wdforce .and. myid.eq.0 ) then - cput = GETTIME + cput = MPI_WTIME() ; ; write(ounit,4000) cput-cpus, ForceErr, cput-cpuo, "|BB|e", alog10(BBe(1:min(Mvol-1,28))) if( Igeometry.ge.3 ) write(ounit,4001) "|II|o", alog10(IIo(1:min(Mvol-1,28))) if( NOTstellsym ) then @@ -516,49 +668,49 @@ subroutine dforce( NGdof, position, force, LComputeDerivatives, LComputeAxis) if( Lhessian3Dallocated .and. Igeometry.ge.3) then ! construct Hessian3D; if (LcomputeDerivatives ) then - - hessian2D(1:NGdof,1:NGdof) = zero - + + hessian2D(1:NGdof,1:NGdof) = zero + do vvol = 1, Mvol-1 ! loop over interior surfaces; - + if( ImagneticOK(vvol) .and. ImagneticOK(vvol+1) ) then ! the magnetic fields in the volumes adjacent to this interface are valid; - + idof = 0 ! labels degree-of-freedom = Fourier harmonic of surface geometry; idofr=0 idofz=0 - + do ii = 1, mn ! loop over degrees-of-freedom; - + do irz = 0, 1 ! Fourier harmonic of R, Fourier harmonic of Z; - + !if( irz.eq.1 .and. Igeometry.lt.3 ) cycle ! no dependence on Z; - + do issym = 0, 1 ! stellarator symmetry; - + if( issym.eq.1 .and. YESstellsym ) cycle ! no dependence on the non-stellarator symmetric harmonics; - + if( ii.eq.1 .and. irz.eq.1 .and. issym.eq.0 ) cycle ! no dependence on Zbs_{m=0,n=0}; if( ii.eq.1 .and. irz.eq.0 .and. issym.eq.1 ) cycle ! no dependence on Rbs_{m=0,n=0}; - + idof = idof + 1 ! labels degree-of-freedom; !if( LocalConstraint) then - + if (irz.eq.0) then idofr = idofr + 1 ! labels degree-of-freedom; else idofz = idofz + 1 endif - ! use tdof for number of volume more than 2 + ! use tdof for number of volume more than 2 if ( vvol.gt.1 ) then tdofr = (vvol-2) * LGdof + idofr ! labels degree-of-freedom in internal interface geometry ; tdofz = (vvol-2) * LGdof + idofz tdoc = (vvol-1) * LGdof ! labels force-balance constraint across internal interfaces; !always fix idoc = 0 ! local force-balance constraint across internal interface ; if (irz .eq.0) then - hessian2D(tdoc+idoc+1:tdoc+idoc+LGdof,tdofr) = -denergydrr(idoc+1:idoc+LGdof ,vvol+0,1,idof,0) + hessian2D(tdoc+idoc+1:tdoc+idoc+LGdof,tdofr) = -denergydrr(idoc+1:idoc+LGdof ,vvol+0,1,idof,0) else - hessian2D(tdoc+idoc+1:tdoc+idoc+LGdof,tdofz+mn)= -denergydzr(idoc+1:idoc+LGdof,vvol+0,1,idof,0) + hessian2D(tdoc+idoc+1:tdoc+idoc+LGdof,tdofz+mn)= -denergydzr(idoc+1:idoc+LGdof,vvol+0,1,idof,0) endif endif ! end of if( vvol.gt.1 ) ; @@ -568,14 +720,14 @@ subroutine dforce( NGdof, position, force, LComputeDerivatives, LComputeAxis) ;idoc = 0 ! diagonal elements; if (irz .eq. 0) then ;hessian2D(tdoc+1:tdoc+LGdof,tdofr) = denergydrr(idoc+1:idoc+LGdof,vvol+1,0,idof,0) - denergydrr(idoc+1:idoc+LGdof,vvol+0,1,idof,1)! & - !write(ounit,*) im(ii), hessian2D(1,tdofr) !vvol, im(ii), in(ii), irz, issym, tdofr, tdofz + !write(ounit,*) im(ii), hessian2D(1,tdofr) !vvol, im(ii), in(ii), irz, issym, tdofr, tdofz else ;hessian2D(tdoc+1:tdoc+LGdof,tdofz+mn) = denergydzr(idoc+1:idoc+LGdof,vvol+1,0,idof,0) - denergydzr(idoc+1:idoc+LGdof,vvol+0,1,idof,1) - !write(ounit,*) im(ii), hessian2D(1,tdofr) !vvol, im(ii), in(ii), irz, issym, tdofr, tdofz + !write(ounit,*) im(ii), hessian2D(1,tdofr) !vvol, im(ii), in(ii), irz, issym, tdofr, tdofz + + endif - endif - if ( vvol.lt.Mvol-1 ) then tdofr = (vvol+0) * LGdof + idofr tdofz = (vvol+0) * LGdof + idofz @@ -585,77 +737,83 @@ subroutine dforce( NGdof, position, force, LComputeDerivatives, LComputeAxis) ! else ; hessian(tdoc+idof,tdof) = - one ! endif if (irz.eq.0) then - hessian2D(tdoc+idoc+1:tdoc+idoc+LGdof,tdofr) = denergydrr(idoc+1:idoc+LGdof ,vvol+1,0,idof,1) - else - hessian2D(tdoc+idoc+1:tdoc+idoc+LGdof,tdofz+mn) = denergydzr(idoc+1:idoc+LGdof ,vvol+1,0,idof,1) + hessian2D(tdoc+idoc+1:tdoc+idoc+LGdof,tdofr) = denergydrr(idoc+1:idoc+LGdof ,vvol+1,0,idof,1) + else + hessian2D(tdoc+idoc+1:tdoc+idoc+LGdof,tdofz+mn) = denergydzr(idoc+1:idoc+LGdof ,vvol+1,0,idof,1) endif ! end of if( vvol.lt.Mvol-1 ) ; - endif - + endif + ! Case of last interface in case of boundary variation ? !if( vvol.eq.Mvol-1 ) then !tdof = (vvol+0) * LGdof + idof ! tdoc = (vvol-1) * LGdof ! shorthand ; !idoc = 0 !dessian3D(tdoc+idoc+1:tdoc+idoc+LGdof,idof) = HdFFdRZ(idoc+1:idoc+LGdof,0,idof,1,vvol+1) - + !endif ! end of if( vvol.lt.Mvol-1 ) ; - + !else ! Global constraint - + ! In the general case of global constraint, there are no zero element in the hessian. We thus loop again on all volumes !FATAL( dforce, .true., incorrect choice of Lconstraint in SPEC) - + !endif ! matches if( LocalConstraint ); enddo ! matches do issym ; - + enddo ! matches do irz ; enddo ! matches do ii ; - - else ! matches if( ImagneticOK(vvol) .and. ImagneticOK(vvol+1) ) ; - - FATAL( dforce, .true., need to provide suitable values for hessian2D in case of field failure ) - + + else ! matches if( ImagneticOK(vvol) .and. ImagneticOK(vvol+1) ) ; + + + if( .true. ) then + write(6,'("dforce : fatal : myid=",i3," ; .true. ; need to provide suitable values for hessian2D in case of field failure ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "dforce : .true. : need to provide suitable values for hessian2D in case of field failure ;" + endif + + endif ! end of if( ImagneticOK(vvol) .and. ImagneticOK(vvol+1) ) ; - + enddo ! end of do vvol; endif - + endif ! end of if( LcomputeDerivatives ) ; !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - + if( LHmatrix .and. Lhessian2Dallocated .and. Igeometry.eq.2) then ! construct Hessian2D; if (LcomputeDerivatives ) then - - hessian2D(1:NGdof,1:NGdof) = zero - + + hessian2D(1:NGdof,1:NGdof) = zero + do vvol = 1, Mvol-1 ! loop over interior surfaces; - + if( ImagneticOK(vvol) .and. ImagneticOK(vvol+1) ) then ! the magnetic fields in the volumes adjacent to this interface are valid; - + idof = 0 ! labels degree-of-freedom = Fourier harmonic of surface geometry; - + do ii = 1, mn ! loop over degrees-of-freedom; - + do irz = 0, 1 ! Fourier harmonic of R, Fourier harmonic of Z; - + if( irz.eq.1 .and. Igeometry.lt.3 ) cycle ! no dependence on Z; - + do issym = 0, 1 ! stellarator symmetry; - + if( issym.eq.1 .and. YESstellsym ) cycle ! no dependence on the non-stellarator symmetric harmonics; - + if( ii.eq.1 .and. irz.eq.1 .and. issym.eq.0 ) cycle ! no dependence on Zbs_{m=0,n=0}; if( ii.eq.1 .and. irz.eq.0 .and. issym.eq.1 ) cycle ! no dependence on Rbs_{m=0,n=0}; - + idof = idof + 1 ! labels degree-of-freedom; - + if( LocalConstraint) then ! Derivative with respect to previous interface if( vvol.gt.1 ) then @@ -663,21 +821,21 @@ subroutine dforce( NGdof, position, force, LComputeDerivatives, LComputeAxis) tdoc = (vvol-1) * LGdof ! labels force-balance constraint across internal interfaces; idoc = 0 ! local force-balance constraint across internal interface ; hessian2D(tdoc+idoc+1:tdoc+idoc+LGdof,tdof) = - HdFFdRZ(idoc+1:idoc+LGdof,1,idof,0,vvol+0) - + endif ! end of if( vvol.gt.1 ) ; - + ! Derivative with respect to current interface ;tdof = (vvol-1) * LGdof + idof ;tdoc = (vvol-1) * LGdof ! shorthand; ;idoc = 0 - + if( Lextrap.eq.1 .and. vvol.eq.1 ) then ;hessian2D(tdoc+idof ,tdof) = one ! diagonal elements; else ;hessian2D(tdoc+idoc+1:tdoc+idoc+LGdof,tdof) = HdFFdRZ(idoc+1:idoc+LGdof,0,idof,0,vvol+1) - HdFFdRZ(idoc+1:idoc+LGdof,1,idof,1,vvol+0) endif ! end of if( Lextrap.eq.1 .and. vvol.eq.1 ) - - + + ! Derivative with respect to next interface if( vvol.lt.Mvol-1 ) then tdof = (vvol+0) * LGdof + idof @@ -691,39 +849,51 @@ subroutine dforce( NGdof, position, force, LComputeDerivatives, LComputeAxis) hessian2D(tdoc+idoc+1:tdoc+idoc+LGdof,tdof) = HdFFdRZ(idoc+1:idoc+LGdof,0,idof,1,vvol+1) endif endif ! end of if( vvol.lt.Mvol-1 ) ; - - + + ! Case of last interface in case of boundary variation ? if( vvol.eq.Mvol-1 ) then !tdof = (vvol+0) * LGdof + idof tdoc = (vvol-1) * LGdof ! shorthand ; idoc = 0 dessian2D(tdoc+idoc+1:tdoc+idoc+LGdof,idof) = HdFFdRZ(idoc+1:idoc+LGdof,0,idof,1,vvol+1) - + endif ! end of if( vvol.lt.Mvol-1 ) ; - + else ! Global constraint - + ! In the general case of global constraint, there are no zero element in the hessian. We thus loop again on all volumes - FATAL( dforce, .true., incorrect choice of Lconstraint in SPEC) - + + if( .true. ) then + write(6,'("dforce : fatal : myid=",i3," ; .true. ; incorrect choice of Lconstraint in SPEC;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "dforce : .true. : incorrect choice of Lconstraint in SPEC ;" + endif + + endif ! matches if( LocalConstraint ); enddo ! matches do issym ; - + enddo ! matches do irz ; enddo ! matches do ii ; - - else ! matches if( ImagneticOK(vvol) .and. ImagneticOK(vvol+1) ) ; - - FATAL( dforce, .true., need to provide suitable values for hessian2D in case of field failure ) - + + else ! matches if( ImagneticOK(vvol) .and. ImagneticOK(vvol+1) ) ; + + + if( .true. ) then + write(6,'("dforce : fatal : myid=",i3," ; .true. ; need to provide suitable values for hessian2D in case of field failure ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "dforce : .true. : need to provide suitable values for hessian2D in case of field failure ;" + endif + + endif ! end of if( ImagneticOK(vvol) .and. ImagneticOK(vvol+1) ) ; - + enddo ! end of do vvol; endif - + endif ! end of if( LcomputeDerivatives ) ; @@ -737,7 +907,13 @@ subroutine dforce( NGdof, position, force, LComputeDerivatives, LComputeAxis) if( LcomputeDerivatives .and. Lhessianallocated) then ! construct Hessian; #ifdef DEBUG - FATAL( dforce, .not.Lhessianallocated, need to allocate hessian ) + + if( .not.Lhessianallocated ) then + write(6,'("dforce : fatal : myid=",i3," ; .not.Lhessianallocated ; need to allocate hessian ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "dforce : .not.Lhessianallocated : need to allocate hessian ;" + endif + #endif hessian(1:NGdof,1:NGdof) = zero @@ -782,7 +958,13 @@ subroutine dforce( NGdof, position, force, LComputeDerivatives, LComputeAxis) #ifdef DEBUG if( idof.gt.LGdof ) write(ounit,1000) myid, vvol, ii, irz, issym, idof, LGdof ! can be deleted; 1000 format("hforce : " 10x " : myid=",i3," ; vvol=",i3," ; ii= ",i3," ; irz="i3" ; issym="i3" ; idof="i3" ; LGdof="i3" ;") - FATAL( hforce, idof.gt.LGdof, illegal degree-of-freedom index constructing hessian ) ! can be deleted; + + if( idof.gt.LGdof ) then + write(6,'("hforce : fatal : myid=",i3," ; idof.gt.LGdof ; illegal degree-of-freedom index constructing hessian ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "hforce : idof.gt.LGdof : illegal degree-of-freedom index constructing hessian ;" + endif + ! can be deleted; #endif if( LocalConstraint ) then @@ -883,7 +1065,13 @@ subroutine dforce( NGdof, position, force, LComputeDerivatives, LComputeAxis) else ! matches if( ImagneticOK(vvol) .and. ImagneticOK(vvol+1) ) ; - FATAL( dforce, .true., need to provide suitable values for hessian in case of field failure ) + + if( .true. ) then + write(6,'("dforce : fatal : myid=",i3," ; .true. ; need to provide suitable values for hessian in case of field failure ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "dforce : .true. : need to provide suitable values for hessian in case of field failure ;" + endif + endif ! end of if( ImagneticOK(vvol) .and. ImagneticOK(vvol+1) ) ; enddo ! end of do vvol; @@ -891,7 +1079,12 @@ subroutine dforce( NGdof, position, force, LComputeDerivatives, LComputeAxis) ! Evaluate force gradient #ifdef DEBUG if( Lcheck.eq.6 ) then - WCALL(dforce, fndiff_dforce, ( NGdof ) ) + + cput = MPI_WTIME() + Tdforce = Tdforce + ( cput-cpuo ) + call fndiff_dforce( NGdof ) + cpuo = MPI_WTIME() + endif #endif @@ -901,7 +1094,12 @@ subroutine dforce( NGdof, position, force, LComputeDerivatives, LComputeAxis) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - RETURN(dforce) + +9999 continue + cput = MPI_WTIME() + Tdforce = Tdforce + ( cput-cpuo ) + return + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -909,7 +1107,7 @@ end subroutine dforce subroutine fndiff_dforce( NGdof ) - + use mod_kinds, only: wp => dp use constants, only: zero, one, half, two use fileunits, only: ounit @@ -927,36 +1125,73 @@ subroutine fndiff_dforce( NGdof ) YESstellsym, NOTstellsym, & hessian, ext -LOCALS -INTEGER, intent(in) :: NGdof +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + +integer, intent(in) :: NGdof -INTEGER :: vvol, idof, ii, irz, issym, isymdiff ! loop indices -INTEGER :: tdof ! hessian index +integer :: vvol, idof, ii, irz, issym, isymdiff ! loop indices +integer :: tdof ! hessian index -REAL :: lfactor -CHARACTER :: packorunpack +real(wp) :: lfactor +character :: packorunpack LOGICAL :: LComputeAxis -REAL, allocatable :: oRbc(:,:), oZbs(:,:), oRbs(:,:), oZbc(:,:) ! used to store original geometry; -REAL, allocatable :: iposition(:,:), iforce(:,:) ! perturbed interfaces position and force -REAL, allocatable :: finitediff_estimate(:,:) ! store finite differences +real(wp), allocatable :: oRbc(:,:), oZbs(:,:), oRbs(:,:), oZbc(:,:) ! used to store original geometry; +real(wp), allocatable :: iposition(:,:), iforce(:,:) ! perturbed interfaces position and force +real(wp), allocatable :: finitediff_estimate(:,:) ! store finite differences + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif -BEGIN(dforce) write(ounit, '("fndiff : Starting finite difference evaluation of hessian ...")') if( ncpu.eq.1) then - SALLOCATE( finitediff_estimate, (1:NGdof, 1:NGdof), zero ) + + allocate( finitediff_estimate(1:NGdof, 1:NGdof), stat=astat ) + finitediff_estimate(1:NGdof, 1:NGdof) = zero + dBdX%L = .false. - SALLOCATE( oRbc, (1:mn,0:Mvol), iRbc(1:mn,0:Mvol) ) !save unperturbed geometry - SALLOCATE( oZbs, (1:mn,0:Mvol), iZbs(1:mn,0:Mvol) ) - SALLOCATE( oRbs, (1:mn,0:Mvol), iRbs(1:mn,0:Mvol) ) - SALLOCATE( oZbc, (1:mn,0:Mvol), iZbc(1:mn,0:Mvol) ) - SALLOCATE( iforce, (-2:2, 0:NGdof), zero) - SALLOCATE( iposition, (-2:2, 0:NGdof), zero) + + allocate( oRbc(1:mn,0:Mvol), stat=astat ) + oRbc(1:mn,0:Mvol) = iRbc(1:mn,0:Mvol) + !save unperturbed geometry + + allocate( oZbs(1:mn,0:Mvol), stat=astat ) + oZbs(1:mn,0:Mvol) = iZbs(1:mn,0:Mvol) + + + allocate( oRbs(1:mn,0:Mvol), stat=astat ) + oRbs(1:mn,0:Mvol) = iRbs(1:mn,0:Mvol) + + + allocate( oZbc(1:mn,0:Mvol), stat=astat ) + oZbc(1:mn,0:Mvol) = iZbc(1:mn,0:Mvol) + + + allocate( iforce(-2:2, 0:NGdof), stat=astat ) + iforce(-2:2, 0:NGdof) = zero + + + allocate( iposition(-2:2, 0:NGdof), stat=astat ) + iposition(-2:2, 0:NGdof) = zero + do vvol = 1, Mvol-1 ! loop over interior surfaces; @@ -1004,9 +1239,19 @@ subroutine fndiff_dforce( NGdof ) !LComputeAxis = .false. ! keep axis fixed LComputeAxis = .true. - WCALL(dforce, packxi,( NGdof, iposition(isymdiff,0:NGdof), Mvol, mn,iRbc(1:mn,0:Mvol),iZbs(1:mn,0:Mvol),iRbs(1:mn,0:Mvol),& - iZbc(1:mn,0:Mvol),packorunpack, .false., LComputeAxis ) ) - WCALL(dforce, dforce,( NGdof, iposition(isymdiff,0:NGdof), iforce(isymdiff,0:NGdof), .false., LComputeAxis) ) + + cput = MPI_WTIME() + Tdforce = Tdforce + ( cput-cpuo ) + call packxi( NGdof, iposition(isymdiff,0:NGdof), Mvol, mn,iRbc(1:mn,0:Mvol),iZbs(1:mn,0:Mvol),iRbs(1:mn,0:Mvol),& + iZbc(1:mn,0:Mvol),packorunpack, .false., LComputeAxis ) + cpuo = MPI_WTIME() + + + cput = MPI_WTIME() + Tdforce = Tdforce + ( cput-cpuo ) + call dforce( NGdof, iposition(isymdiff,0:NGdof), iforce(isymdiff,0:NGdof), .false., LComputeAxis) + cpuo = MPI_WTIME() + enddo ! Fourth order centered finite difference scheme @@ -1024,12 +1269,24 @@ subroutine fndiff_dforce( NGdof ) enddo !vvol - DALLOCATE(iforce) - DALLOCATE(iposition) - DALLOCATE(oZbc) - DALLOCATE(oRbs) - DALLOCATE(oZbs) - DALLOCATE(oRbc) + + deallocate(iforce,stat=astat) + + + deallocate(iposition,stat=astat) + + + deallocate(oZbc,stat=astat) + + + deallocate(oRbs,stat=astat) + + + deallocate(oZbs,stat=astat) + + + deallocate(oRbc,stat=astat) + ! Print in file for diagnostics if(myid.eq.0) then @@ -1060,12 +1317,25 @@ subroutine fndiff_dforce( NGdof ) endif - DALLOCATE(finitediff_estimate) + + deallocate(finitediff_estimate,stat=astat) + endif -FATAL(fndiff, .true., Finite differences have been evaluated. ) -RETURN(dforce) + if( .true. ) then + write(6,'("fndiff : fatal : myid=",i3," ; .true. ; Finite differences have been evaluated. ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "fndiff : .true. : Finite differences have been evaluated. ;" + endif + + + +9999 continue + cput = MPI_WTIME() + Tdforce = Tdforce + ( cput-cpuo ) + return + end subroutine fndiff_dforce diff --git a/src/dfp100.f90 b/src/dfp100.F90 similarity index 64% rename from src/dfp100.f90 rename to src/dfp100.F90 index 715add73..eb1cb8f6 100644 --- a/src/dfp100.f90 +++ b/src/dfp100.F90 @@ -37,7 +37,7 @@ !> @param Fvec !> @param LComputeDerivatives subroutine dfp100(Ndofgl, x, Fvec, LComputeDerivatives) - + use mod_kinds, only: wp => dp use constants, only : zero, half, one, two, pi2, pi, mu0 use fileunits, only : ounit @@ -65,7 +65,15 @@ subroutine dfp100(Ndofgl, x, Fvec, LComputeDerivatives) dMA, dMB, dMD, dMG, MBpsi, solution, & Nt, Nz, LILUprecond, Lsavedguvij, NOTMatrixFree, guvijsave, izbs - LOCALS + +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + !------ ! vvol: loop index on volumes ! Ndofgl: Input parameter necessary for the use of hybrd1. Unused otherwise. @@ -75,22 +83,40 @@ subroutine dfp100(Ndofgl, x, Fvec, LComputeDerivatives) ! Fvec: Global constraint values ! x: Degrees of freedom of hybrd1. For now contains only the poloidal flux - INTEGER :: vvol, Ndofgl, iflag, cpu_send_one, cpu_send_two, ll, NN, ideriv, iocons - INTEGER :: status(MPI_STATUS_SIZE), request1, request2 - REAL :: Fvec(1:Ndofgl), x(1:Mvol-1), Bt00(1:Mvol, 0:1, -1:2), ldItGp(0:1, -1:2) + integer :: vvol, Ndofgl, iflag, cpu_send_one, cpu_send_two, ll, NN, ideriv, iocons + integer :: status(MPI_STATUS_SIZE), request1, request2 + real(wp) :: Fvec(1:Ndofgl), x(1:Mvol-1), Bt00(1:Mvol, 0:1, -1:2), ldItGp(0:1, -1:2) LOGICAL :: LComputeDerivatives - INTEGER :: deriv, Lcurvature + integer :: deriv, Lcurvature - BEGIN(dfp100) + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif + dpflux(2:Mvol) = x - xoffset ! Now each CPU perform the calculation in its volume(s) do vvol = 1, Mvol - LREGION(vvol) ! assigns Lcoordinatesingularity, Lplasmaregion, etc. ; + + if( Igeometry.eq.1 .or. vvol.gt.1 ) then ; Lcoordinatesingularity = .false. + else ; Lcoordinatesingularity = .true. + endif + + if( vvol.le.Nvol ) then ; Lplasmaregion = .true. + else ; Lplasmaregion = .false. + endif + + Lvacuumregion = .not.Lplasmaregion + ! assigns Lcoordinatesingularity, Lplasmaregion, etc. ; ImagneticOK(vvol) = .false. !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -100,7 +126,13 @@ subroutine dfp100(Ndofgl, x, Fvec, LComputeDerivatives) if( IsMyVolumeValue .EQ. 0 ) then cycle else if( IsMyVolumeValue .EQ. -1) then - FATAL(dfp100, .true., Unassociated volume) + + if( .true. ) then + write(6,'("dfp100 : fatal : myid=",i3," ; .true. ; Unassociated volume;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "dfp100 : .true. : Unassociated volume ;" + endif + endif NN = NAdof(vvol) @@ -113,24 +145,59 @@ subroutine dfp100(Ndofgl, x, Fvec, LComputeDerivatives) dBdX%L = .false. ! No need to take derivatives of matrices w.r.t geometry. ideriv = 0 ; Lcurvature = 1 - WCALL( dfp100, compute_guvijsave, (Iquad(vvol), vvol, ideriv, Lcurvature) ) + + cput = MPI_WTIME() + Tdfp100 = Tdfp100 + ( cput-cpuo ) + call compute_guvijsave(Iquad(vvol), vvol, ideriv, Lcurvature) + cpuo = MPI_WTIME() + Lsavedguvij = .true. ! we need to construct the preconditioner if needed if (LILUprecond) then - WCALL( dfp100, spsint, ( Iquad(vvol), mn, vvol, ll ) ) - WCALL( dfp100, spsmat, ( vvol, mn, ll) ) + + cput = MPI_WTIME() + Tdfp100 = Tdfp100 + ( cput-cpuo ) + call spsint( Iquad(vvol), mn, vvol, ll ) + cpuo = MPI_WTIME() + + + cput = MPI_WTIME() + Tdfp100 = Tdfp100 + ( cput-cpuo ) + call spsmat( vvol, mn, ll) + cpuo = MPI_WTIME() + endif if (NOTMatrixFree) then ! construct Beltrami matrix - WCALL( dfp100, ma00aa, ( Iquad(vvol), mn, vvol, ll ) ) ! compute volume integrals of metric elements; - WCALL( dfp100, matrix, ( vvol, mn, ll ) ) + + cput = MPI_WTIME() + Tdfp100 = Tdfp100 + ( cput-cpuo ) + call ma00aa( Iquad(vvol), mn, vvol, ll ) + cpuo = MPI_WTIME() + ! compute volume integrals of metric elements; + + cput = MPI_WTIME() + Tdfp100 = Tdfp100 + ( cput-cpuo ) + call matrix( vvol, mn, ll ) + cpuo = MPI_WTIME() + else ! matrix free, so construct something else ! we will still need to construct the dMB and dMG matrix - WCALL( dfp100, matrixBG, ( vvol, mn, ll ) ) + + cput = MPI_WTIME() + Tdfp100 = Tdfp100 + ( cput-cpuo ) + call matrixBG( vvol, mn, ll ) + cpuo = MPI_WTIME() + endif - WCALL( dfp100, ma02aa, ( vvol, NN ) ) + + cput = MPI_WTIME() + Tdfp100 = Tdfp100 + ( cput-cpuo ) + call ma02aa( vvol, NN ) + cpuo = MPI_WTIME() + Lsavedguvij = .false. @@ -146,24 +213,50 @@ subroutine dfp100(Ndofgl, x, Fvec, LComputeDerivatives) if( ( Lcoordinatesingularity .and. iocons.eq.0 ) .or. ( Lvacuumregion .and. iocons.eq.1 ) ) cycle ideriv = 0 - WCALL( dfp100, lbpol, (vvol, Bt00(1:Mvol, 0:1, -1:2), ideriv, iocons) ) !Compute field at interface for global constraint + + cput = MPI_WTIME() + Tdfp100 = Tdfp100 + ( cput-cpuo ) + call lbpol(vvol, Bt00(1:Mvol, 0:1, -1:2), ideriv, iocons) + cpuo = MPI_WTIME() + !Compute field at interface for global constraint ideriv = 2 - WCALL( dfp100, lbpol, (vvol, Bt00(1:Mvol, 0:1, -1:2), ideriv, iocons) ) !Compute field at interface for global constraint, d w.r.t. pflux + + cput = MPI_WTIME() + Tdfp100 = Tdfp100 + ( cput-cpuo ) + call lbpol(vvol, Bt00(1:Mvol, 0:1, -1:2), ideriv, iocons) + cpuo = MPI_WTIME() + !Compute field at interface for global constraint, d w.r.t. pflux enddo if( Lvacuumregion ) then #ifdef DEBUG - FATAL( dfp100, vvol.ne.Mvol, Incorrect vvol in last volume) + + if( vvol.ne.Mvol ) then + write(6,'("dfp100 : fatal : myid=",i3," ; vvol.ne.Mvol ; Incorrect vvol in last volume;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "dfp100 : vvol.ne.Mvol : Incorrect vvol in last volume ;" + endif + #endif ideriv=1 ! derivatives of Btheta w.r.t tflux iocons=0 ! Only need inner side of volume derivatives - WCALL( dfp100, lbpol, (Mvol, Bt00(1:Mvol, 0:1, -1:2), ideriv, iocons) ) + + cput = MPI_WTIME() + Tdfp100 = Tdfp100 + ( cput-cpuo ) + call lbpol(Mvol, Bt00(1:Mvol, 0:1, -1:2), ideriv, iocons) + cpuo = MPI_WTIME() + iflag=2 ! derivatives of poloidal linking current w.r.t geometry not required - WCALL( dfp100, curent, (Mvol, mn, Nt, Nz, iflag, ldItGp(0:1,-1:2) ) ) + + cput = MPI_WTIME() + Tdfp100 = Tdfp100 + ( cput-cpuo ) + call curent(Mvol, mn, Nt, Nz, iflag, ldItGp(0:1,-1:2) ) + cpuo = MPI_WTIME() + endif endif enddo @@ -186,10 +279,18 @@ subroutine dfp100(Ndofgl, x, Fvec, LComputeDerivatives) call WhichCpuID(vvol+1, cpu_send_two) ! Broadcast magnetic field at the interface. - RlBCAST(Bt00(vvol , 1, 0), 1, cpu_send_one) - RlBCAST(Bt00(vvol+1, 0, 0), 1, cpu_send_two) - RlBCAST(Bt00(vvol , 1, 2), 1, cpu_send_one) - RlBCAST(Bt00(vvol+1, 0, 2), 1, cpu_send_two) + + call MPI_BCAST(Bt00(vvol , 1, 0),1,MPI_DOUBLE_PRECISION,cpu_send_one,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(Bt00(vvol+1, 0, 0),1,MPI_DOUBLE_PRECISION,cpu_send_two,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(Bt00(vvol , 1, 2),1,MPI_DOUBLE_PRECISION,cpu_send_one,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(Bt00(vvol+1, 0, 2),1,MPI_DOUBLE_PRECISION,cpu_send_two,MPI_COMM_SPEC,ierr) + ! Evaluate surface current IPDt(vvol) = pi2 * (Bt00(vvol+1, 0, 0) - Bt00(vvol, 1, 0)) @@ -209,8 +310,12 @@ subroutine dfp100(Ndofgl, x, Fvec, LComputeDerivatives) ! Communicate additional derivatives call WhichCpuID(Mvol, cpu_send_one) - RlBCAST( ldItGp(0:1, -1:2), 8, cpu_send_one ) - RlBCAST( Bt00(Mvol, 0:1, 1), 2, cpu_send_one ) + + call MPI_BCAST(ldItGp(0:1, -1:2),8,MPI_DOUBLE_PRECISION,cpu_send_one ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(Bt00(Mvol, 0:1, 1),2,MPI_DOUBLE_PRECISION,cpu_send_one ,MPI_COMM_SPEC,ierr) + ! Complete output: RHS Fvec(Mvol ) = ldItGp(1, 0) - curpol @@ -223,10 +328,21 @@ subroutine dfp100(Ndofgl, x, Fvec, LComputeDerivatives) case default - FATAL(dfp100, .true., Unaccepted value for Lconstraint) + + if( .true. ) then + write(6,'("dfp100 : fatal : myid=",i3," ; .true. ; Unaccepted value for Lconstraint;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "dfp100 : .true. : Unaccepted value for Lconstraint ;" + endif + end select endif - RETURN(dfp100) + +9999 continue + cput = MPI_WTIME() + Tdfp100 = Tdfp100 + ( cput-cpuo ) + return + end subroutine dfp100 diff --git a/src/dfp200.f90 b/src/dfp200.F90 similarity index 77% rename from src/dfp200.f90 rename to src/dfp200.F90 index 2015b3b6..15e05e80 100644 --- a/src/dfp200.f90 +++ b/src/dfp200.F90 @@ -43,7 +43,7 @@ !> @param LcomputeDerivatives !> @param vvol subroutine dfp200( LcomputeDerivatives, vvol) - + use mod_kinds, only: wp => dp use constants, only : zero, half, one, two use numerical, only : small @@ -97,28 +97,44 @@ subroutine dfp200( LcomputeDerivatives, vvol) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS + +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + LOGICAL, intent(in) :: LComputeDerivatives ! indicates whether derivatives are to be calculated; LOGICAL :: LInnerVolume - INTEGER :: NN, IA, ifail, if01adf, vflag, MM, idgetrf, idgetri, Lwork, lvol, pvol - INTEGER :: vvol, innout, ii, jj, irz, issym, iocons, idoc, idof, imn, ll - INTEGER :: Lcurvature, ideriv, id - INTEGER :: iflag, cpu_id, cpu_id1, even_or_odd, vol_parity - INTEGER :: stat(MPI_STATUS_SIZE), tag, tag2, req1, req2, req3, req4 + integer :: NN, IA, ifail, if01adf, vflag, MM, idgetrf, idgetri, Lwork, lvol, pvol + integer :: vvol, innout, ii, jj, irz, issym, iocons, idoc, idof, imn, ll + integer :: Lcurvature, ideriv, id + integer :: iflag, cpu_id, cpu_id1, even_or_odd, vol_parity + integer :: stat(MPI_STATUS_SIZE), tag, tag2, req1, req2, req3, req4 - REAL :: lastcpu, lss, lfactor, DDl, MMl - REAL :: det - REAL , allocatable :: XX(:), YY(:), dBB(:,:), dII(:), dLL(:), dPP(:), length(:), dRR(:,:), dZZ(:,:), constraint(:) - REAL , allocatable :: ddFcol1(:), ddFcol2(:), ddFcol3(:), ddFcol4(:) + real(wp) :: lastcpu, lss, lfactor, DDl, MMl + real(wp) :: det + real(wp) , allocatable :: XX(:), YY(:), dBB(:,:), dII(:), dLL(:), dPP(:), length(:), dRR(:,:), dZZ(:,:), constraint(:) + real(wp) , allocatable :: ddFcol1(:), ddFcol2(:), ddFcol3(:), ddFcol4(:) - CHARACTER :: packorunpack + character :: packorunpack type(MatrixLU) :: oBI(1:Mvol) - BEGIN(dfp200) + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif + #ifdef DEBUG @@ -127,38 +143,101 @@ subroutine dfp200( LcomputeDerivatives, vvol) endif #endif - SALLOCATE( dBB , (1:Ntz,-1:2), zero ) ! magnetic field strength (on interfaces) in real space and derivatives; - SALLOCATE( XX , (1:Ntz ), zero ) - SALLOCATE( YY , (1:Ntz ), zero ) - SALLOCATE( length , (1:Ntz ), zero ) ! this is calculated in lforce; + + allocate( dBB (1:Ntz,-1:2), stat=astat ) + dBB (1:Ntz,-1:2) = zero + ! magnetic field strength (on interfaces) in real space and derivatives; + + allocate( XX (1:Ntz ), stat=astat ) + XX (1:Ntz ) = zero + + + allocate( YY (1:Ntz ), stat=astat ) + YY (1:Ntz ) = zero + + + allocate( length (1:Ntz ), stat=astat ) + length (1:Ntz ) = zero + ! this is calculated in lforce; if( LComputeDerivatives ) then - SALLOCATE( dRR , (1:Ntz,-1:1), zero ) - SALLOCATE( dZZ , (1:Ntz,-1:1), zero ) - SALLOCATE( dII , (1:Ntz ), zero ) ! spectral constraint; - SALLOCATE( dLL , (1:Ntz ), zero ) ! length constraint; - SALLOCATE( dPP , (1:Ntz ), zero ) ! poloidal constraint; - SALLOCATE( constraint, (1:Ntz ), zero ) - SALLOCATE( ddFcol1 , (1:Ntz ), zero ) - SALLOCATE( ddFcol2 , (1:Ntz ), zero ) - SALLOCATE( ddFcol3 , (1:Ntz ), zero ) - SALLOCATE( ddFcol4 , (1:Ntz ), zero ) + + allocate( dRR (1:Ntz,-1:1), stat=astat ) + dRR (1:Ntz,-1:1) = zero + + + allocate( dZZ (1:Ntz,-1:1), stat=astat ) + dZZ (1:Ntz,-1:1) = zero + + + allocate( dII (1:Ntz ), stat=astat ) + dII (1:Ntz ) = zero + ! spectral constraint; + + allocate( dLL (1:Ntz ), stat=astat ) + dLL (1:Ntz ) = zero + ! length constraint; + + allocate( dPP (1:Ntz ), stat=astat ) + dPP (1:Ntz ) = zero + ! poloidal constraint; + + allocate( constraint(1:Ntz ), stat=astat ) + constraint(1:Ntz ) = zero + + + allocate( ddFcol1 (1:Ntz ), stat=astat ) + ddFcol1 (1:Ntz ) = zero + + + allocate( ddFcol2 (1:Ntz ), stat=astat ) + ddFcol2 (1:Ntz ) = zero + + + allocate( ddFcol3 (1:Ntz ), stat=astat ) + ddFcol3 (1:Ntz ) = zero + + + allocate( ddFcol4 (1:Ntz ), stat=astat ) + ddFcol4 (1:Ntz ) = zero + endif if( LocalConstraint ) then do vvol = 1, Mvol - WCALL(dfp200, IsMyVolume, (vvol)) + + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call IsMyVolume(vvol) + cpuo = MPI_WTIME() + if( IsMyVolumeValue .EQ. 0 ) then cycle else if( IsMyVolumeValue .EQ. -1) then - FATAL(dfp200, .true., Unassociated volume) + + if( .true. ) then + write(6,'("dfp200 : fatal : myid=",i3," ; .true. ; Unassociated volume;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "dfp200 : .true. : Unassociated volume ;" + endif + endif - LREGION(vvol) ! assigns Lcoordinatesingularity, Lplasmaregion, etc. ; + + if( Igeometry.eq.1 .or. vvol.gt.1 ) then ; Lcoordinatesingularity = .false. + else ; Lcoordinatesingularity = .true. + endif + + if( vvol.le.Nvol ) then ; Lplasmaregion = .true. + else ; Lplasmaregion = .false. + endif + + Lvacuumregion = .not.Lplasmaregion + ! assigns Lcoordinatesingularity, Lplasmaregion, etc. ; dBdX%vol = vvol ! Label ll = Lrad(vvol) ! Shorthand @@ -167,7 +246,12 @@ subroutine dfp200( LcomputeDerivatives, vvol) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! vflag = 1 - WCALL( dfp200, volume, ( vvol, vflag ) ) ! compute volume; + + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call volume( vvol, vflag ) + cpuo = MPI_WTIME() + ! compute volume; !!----Hessian2D cleared----- @@ -179,7 +263,12 @@ subroutine dfp200( LcomputeDerivatives, vvol) ideriv = 0 ; id = ideriv iflag = 0 ! XX & YY are returned by lforce; Bemn(1:mn,vvol,iocons), Iomn(1:mn,vvol) etc. are returned through global; - WCALL( dfp200, lforce, ( vvol, iocons, ideriv, Ntz, dBB(1:Ntz,id), XX(1:Ntz), YY(1:Ntz), length(1:Ntz), DDl, MMl, iflag ) ) + + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call lforce( vvol, iocons, ideriv, Ntz, dBB(1:Ntz,id), XX(1:Ntz), YY(1:Ntz), length(1:Ntz), DDl, MMl, iflag ) + cpuo = MPI_WTIME() + enddo ! end of do iocons = 0, 1; @@ -187,8 +276,14 @@ subroutine dfp200( LcomputeDerivatives, vvol) ! Allocate some memory for storing the LU matrix and ipivot ! we need one extra dimension for helicity constraint, so dimension is NN+1 -> 0:NN - SALLOCATE( oBI(vvol)%mat, (0:NN,0:NN ), zero ) ! inverse of ``original'', i.e. unperturbed, Beltrami matrix; - SALLOCATE( oBI(vvol)%ipivot, (0:NN), zero) + + allocate( oBI(vvol)%mat(0:NN,0:NN ), stat=astat ) + oBI(vvol)%mat(0:NN,0:NN ) = zero + ! inverse of ``original'', i.e. unperturbed, Beltrami matrix; + + allocate( oBI(vvol)%ipivot(0:NN), stat=astat ) + oBI(vvol)%ipivot(0:NN) = zero + ! initialize matrices for Beltrami linear system call allocate_geometry_matrices(vvol, LcomputeDerivatives) @@ -196,7 +291,12 @@ subroutine dfp200( LcomputeDerivatives, vvol) call intghs_workspace_init(vvol) packorunpack = 'P' - WCALL( dfp200, packab, ( packorunpack, vvol, NN, solution(1:NN,0), 0 ) ) ! packing, put the solutions back to the solution matrix; + + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call packab( packorunpack, vvol, NN, solution(1:NN,0), 0 ) + cpuo = MPI_WTIME() + ! packing, put the solutions back to the solution matrix; !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -224,7 +324,13 @@ subroutine dfp200( LcomputeDerivatives, vvol) idof = idof + 1 ! this labels the degree-of-freedom that the derivative is taken with respect to; this is outside do innout; #ifdef DEBUG - FATAL( dfp200, idof.gt.LGdof, illegal degree-of-freedom index constructing derivatives ) ! this can be deleted; + + if( idof.gt.LGdof ) then + write(6,'("dfp200 : fatal : myid=",i3," ; idof.gt.LGdof ; illegal degree-of-freedom index constructing derivatives ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "dfp200 : idof.gt.LGdof : illegal degree-of-freedom index constructing derivatives ;" + endif + ! this can be deleted; #endif do innout = 0, 1 ! loop over deformations to inner and outer interface; inside do vvol; inside do ii; inside do irz; @@ -271,8 +377,12 @@ subroutine dfp200( LcomputeDerivatives, vvol) call deallocate_Beltrami_matrices(LcomputeDerivatives) call deallocate_geometry_matrices(LcomputeDerivatives) - DALLOCATE(oBI(vvol)%mat) - DALLOCATE(oBI(vvol)%ipivot) + + deallocate(oBI(vvol)%mat,stat=astat) + + + deallocate(oBI(vvol)%ipivot,stat=astat) + endif ! end of if( LComputeDerivatives ) ; @@ -283,23 +393,49 @@ subroutine dfp200( LcomputeDerivatives, vvol) else ! CASE SEMI GLOBAL CONSTRAINT do vvol = 1, Mvol - WCALL(dfp200, IsMyVolume, (vvol)) + + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call IsMyVolume(vvol) + cpuo = MPI_WTIME() + if( IsMyVolumeValue .EQ. 0 ) then cycle else if( IsMyVolumeValue .EQ. -1) then - FATAL(dfp200, .true., Unassociated volume) + + if( .true. ) then + write(6,'("dfp200 : fatal : myid=",i3," ; .true. ; Unassociated volume;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "dfp200 : .true. : Unassociated volume ;" + endif + endif - LREGION(vvol) ! assigns Lcoordinatesingularity, Lplasmaregion, etc. ; + + if( Igeometry.eq.1 .or. vvol.gt.1 ) then ; Lcoordinatesingularity = .false. + else ; Lcoordinatesingularity = .true. + endif + + if( vvol.le.Nvol ) then ; Lplasmaregion = .true. + else ; Lplasmaregion = .false. + endif + + Lvacuumregion = .not.Lplasmaregion + ! assigns Lcoordinatesingularity, Lplasmaregion, etc. ; ll = Lrad(vvol) ! Shorthand NN = NAdof(vvol) ! shorthand; !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! vflag = 1 - WCALL( dfp200, volume, ( vvol, vflag ) ) ! compute volume; + + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call volume( vvol, vflag ) + cpuo = MPI_WTIME() + ! compute volume; do iocons = 0, 1 ! construct field magnitude on inner and outer interfaces; inside do vvol; @@ -308,7 +444,12 @@ subroutine dfp200( LcomputeDerivatives, vvol) ideriv = 0 ; id = ideriv iflag = 0 ! dAt, dAz, XX & YY are returned by lforce; Bemn(1:mn,vvol,iocons), Iomn(1:mn,vvol) etc. are returned through global; - WCALL( dfp200, lforce, ( vvol, iocons, ideriv, Ntz, dBB(1:Ntz,id), XX(1:Ntz), YY(1:Ntz), length(1:Ntz), DDl, MMl, iflag ) ) + + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call lforce( vvol, iocons, ideriv, Ntz, dBB(1:Ntz,id), XX(1:Ntz), YY(1:Ntz), length(1:Ntz), DDl, MMl, iflag ) + cpuo = MPI_WTIME() + enddo ! end of do iocons = 0, 1; enddo @@ -327,8 +468,12 @@ subroutine dfp200( LcomputeDerivatives, vvol) call WhichCpuID(Mvol, cpu_id) - RlBCAST( Ate(Mvol,ideriv,ii)%s(0:Lrad(Mvol)), Lrad(Mvol)+1, cpu_id ) - RlBCAST( Aze(Mvol,ideriv,ii)%s(0:Lrad(Mvol)), Lrad(Mvol)+1, cpu_id ) + + call MPI_BCAST(Ate(Mvol,ideriv,ii)%s(0:Lrad(Mvol)),Lrad(Mvol)+1,MPI_DOUBLE_PRECISION,cpu_id ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(Aze(Mvol,ideriv,ii)%s(0:Lrad(Mvol)),Lrad(Mvol)+1,MPI_DOUBLE_PRECISION,cpu_id ,MPI_COMM_SPEC,ierr) + enddo enddo endif @@ -348,19 +493,46 @@ subroutine dfp200( LcomputeDerivatives, vvol) ! First invert Beltrami matrices and store them in OBI do vvol = 1, Mvol - LREGION(vvol) ! assigns Lcoordinatesingularity, Lplasmaregion, etc. ; TODO: maybe not necessary, remove + + if( Igeometry.eq.1 .or. vvol.gt.1 ) then ; Lcoordinatesingularity = .false. + else ; Lcoordinatesingularity = .true. + endif + + if( vvol.le.Nvol ) then ; Lplasmaregion = .true. + else ; Lplasmaregion = .false. + endif + + Lvacuumregion = .not.Lplasmaregion + ! assigns Lcoordinatesingularity, Lplasmaregion, etc. ; TODO: maybe not necessary, remove NN = NAdof(vvol) ! shorthand; ll = Lrad(vvol) - SALLOCATE( oBI(vvol)%mat, (0:NN,0:NN ), zero ) ! inverse of ``original'', i.e. unperturbed, Beltrami matrix; - SALLOCATE( oBI(vvol)%ipivot, (0:NN), zero) + + allocate( oBI(vvol)%mat(0:NN,0:NN ), stat=astat ) + oBI(vvol)%mat(0:NN,0:NN ) = zero + ! inverse of ``original'', i.e. unperturbed, Beltrami matrix; + + allocate( oBI(vvol)%ipivot(0:NN), stat=astat ) + oBI(vvol)%ipivot(0:NN) = zero + ! Parallelization - WCALL(dfp200, IsMyVolume, (vvol)) + + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call IsMyVolume(vvol) + cpuo = MPI_WTIME() + if( IsMyVolumeValue .EQ. 0 ) then cycle else if( IsMyVolumeValue .EQ. -1) then - FATAL(dfp200, .true., Unassociated volume) + + if( .true. ) then + write(6,'("dfp200 : fatal : myid=",i3," ; .true. ; Unassociated volume;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "dfp200 : .true. : Unassociated volume ;" + endif + endif @@ -401,22 +573,44 @@ subroutine dfp200( LcomputeDerivatives, vvol) if( (vol_parity.eq.0 ) .and. (even_or_odd.eq.1) ) cycle ! even_or_odd=1 thus perturb only odd interfaces if( (vol_parity.eq.1 ) .and. (even_or_odd.eq.0) ) cycle ! even_or_odd=0 thus perturb only even interfaces - WCALL(dfp200, IsMyVolume, (vvol)) + + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call IsMyVolume(vvol) + cpuo = MPI_WTIME() + if( IsMyVolumeValue.EQ.0 ) then ! This CPU does not deal with interface's inner volume - WCALL(dfp200, IsMyVolume, (vvol+1)) + + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call IsMyVolume(vvol+1) + cpuo = MPI_WTIME() + if( IsMyVolumeValue.eq.0 ) then ! This CPU does not deal with interface's outer volume either - cycle cycle else if( IsMyVolumeValue.eq.-1 ) then - FATAL(dfp200, .true., Unassociated volume) + + if( .true. ) then + write(6,'("dfp200 : fatal : myid=",i3," ; .true. ; Unassociated volume;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "dfp200 : .true. : Unassociated volume ;" + endif + else LInnerVolume = .false. endif else if( IsMyVolumeValue.EQ.-1 ) then - FATAL(dfp200, .true., Unassociated volume) + + if( .true. ) then + write(6,'("dfp200 : fatal : myid=",i3," ; .true. ; Unassociated volume;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "dfp200 : .true. : Unassociated volume ;" + endif + else LinnerVolume = .true. endif @@ -440,7 +634,13 @@ subroutine dfp200( LcomputeDerivatives, vvol) idof = idof + 1 ! this labels the degree-of-freedom that the derivative is taken with respect to; this is outside do innout; #ifdef DEBUG - FATAL( dfp200, idof.gt.LGdof, illegal degree-of-freedom index constructing derivatives ) ! this can be deleted; + + if( idof.gt.LGdof ) then + write(6,'("dfp200 : fatal : myid=",i3," ; idof.gt.LGdof ; illegal degree-of-freedom index constructing derivatives ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "dfp200 : idof.gt.LGdof : illegal degree-of-freedom index constructing derivatives ;" + endif + ! this can be deleted; #endif @@ -460,7 +660,17 @@ subroutine dfp200( LcomputeDerivatives, vvol) dBdX%L = .true. ! Set up volume information - LREGION(lvol) ! assigns Lcoordinatesingularity, Lplasmaregion, etc. ; + + if( Igeometry.eq.1 .or. lvol.gt.1 ) then ; Lcoordinatesingularity = .false. + else ; Lcoordinatesingularity = .true. + endif + + if( lvol.le.Nvol ) then ; Lplasmaregion = .true. + else ; Lplasmaregion = .false. + endif + + Lvacuumregion = .not.Lplasmaregion + ! assigns Lcoordinatesingularity, Lplasmaregion, etc. ; NN = NAdof(lvol) ! Allocate memory. This cannot be moved outside due to NN and ll dependence on volume. @@ -540,12 +750,23 @@ subroutine dfp200( LcomputeDerivatives, vvol) endif do lvol = vvol, vvol+1 - WCALL(dfp200, IsMyVolume, (lvol)) + + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call IsMyVolume(lvol) + cpuo = MPI_WTIME() + if( IsMyVolumeValue .EQ. 0 ) then cycle else if( IsMyVolumeValue .EQ. -1) then - FATAL(dfp200, .true., Unassociated volume) + + if( .true. ) then + write(6,'("dfp200 : fatal : myid=",i3," ; .true. ; Unassociated volume;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "dfp200 : .true. : Unassociated volume ;" + endif + endif if( lvol.eq.vvol ) then @@ -555,7 +776,17 @@ subroutine dfp200( LcomputeDerivatives, vvol) endif dBdX%innout = innout - LREGION(lvol) ! assigns Lcoordinatesingularity, Lplasmaregion, etc. ; + + if( Igeometry.eq.1 .or. lvol.gt.1 ) then ; Lcoordinatesingularity = .false. + else ; Lcoordinatesingularity = .true. + endif + + if( lvol.le.Nvol ) then ; Lplasmaregion = .true. + else ; Lplasmaregion = .false. + endif + + Lvacuumregion = .not.Lplasmaregion + ! assigns Lcoordinatesingularity, Lplasmaregion, etc. ; ! EVALUATE dBB call evaluate_dBB(lvol, idof, innout, issym, irz, ii, dBB, XX, YY, length, dRR, dZZ, dII, dLL, dPP, Ntz, & @@ -575,8 +806,12 @@ subroutine dfp200( LcomputeDerivatives, vvol) ! Free memory do vvol = 1, Mvol - DALLOCATE(oBi(vvol)%mat) - DALLOCATE(oBI(vvol)%ipivot) + + deallocate(oBi(vvol)%mat,stat=astat) + + + deallocate(oBI(vvol)%ipivot,stat=astat) + enddo dBdX%L = .false. ! probably not needed, but included anyway; @@ -612,27 +847,60 @@ subroutine dfp200( LcomputeDerivatives, vvol) endif ! End of if( LocalConstraint ) if( LcomputeDerivatives ) then - DALLOCATE(constraint) - DALLOCATE(dPP) - DALLOCATE(dLL) - DALLOCATE(dII) - DALLOCATE(dZZ) - DALLOCATE(dRR) - DALLOCATE(ddFcol1) - DALLOCATE(ddFcol2) - DALLOCATE(ddFcol3) - DALLOCATE(ddFcol4) + + deallocate(constraint,stat=astat) + + + deallocate(dPP,stat=astat) + + + deallocate(dLL,stat=astat) + + + deallocate(dII,stat=astat) + + + deallocate(dZZ,stat=astat) + + + deallocate(dRR,stat=astat) + + + deallocate(ddFcol1,stat=astat) + + + deallocate(ddFcol2,stat=astat) + + + deallocate(ddFcol3,stat=astat) + + + deallocate(ddFcol4,stat=astat) + endif - DALLOCATE(dBB) - DALLOCATE( XX) ! spectral constraints; not used; - DALLOCATE( YY) - DALLOCATE(length) + + deallocate(dBB,stat=astat) + + + deallocate(XX,stat=astat) + ! spectral constraints; not used; + + deallocate(YY,stat=astat) + + + deallocate(length,stat=astat) + 2000 continue - RETURN(dfp200) + +9999 continue + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + return + end subroutine dfp200 @@ -648,7 +916,7 @@ end subroutine dfp200 !> @param oBI !> @param NN subroutine get_LU_beltrami_matrices(vvol, oBI, NN) - + use mod_kinds, only: wp => dp ! Evaluate the LU factorization of Beltrami matrices and store the original one in oBI. ! INPUT @@ -677,19 +945,27 @@ subroutine get_LU_beltrami_matrices(vvol, oBI, NN) use typedefns - LOCALS + +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + ! ------ TYPE(MatrixLU), intent(inout) :: oBI - INTEGER, intent(in) :: vvol, NN + integer, intent(in) :: vvol, NN - INTEGER :: IA, MM, LDA, Lwork, ll - INTEGER :: idgetrf, idgetri - REAL :: lastcpu - REAL, allocatable :: work(:) + integer :: IA, MM, LDA, Lwork, ll + integer :: idgetrf, idgetri + real(wp) :: lastcpu + real(wp), allocatable :: work(:) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!- - lastcpu = GETTIME + lastcpu = MPI_WTIME() ll = Lrad(vvol) @@ -698,10 +974,20 @@ subroutine get_LU_beltrami_matrices(vvol, oBI, NN) Lsavedguvij = .false. - WCALL( dfp200, ma00aa, (Iquad(vvol), mn, vvol, ll) ) - WCALL( dfp200, matrix, (vvol, mn, ll) ) - lastcpu = GETTIME + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call ma00aa(Iquad(vvol), mn, vvol, ll) + cpuo = MPI_WTIME() + + + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call matrix(vvol, mn, ll) + cpuo = MPI_WTIME() + + + lastcpu = MPI_WTIME() if(Lconstraint .eq. 2) then ! for helicity constraint @@ -716,12 +1002,18 @@ subroutine get_LU_beltrami_matrices(vvol, oBI, NN) MM = NN ; LDA = NN+1 ; Lwork = NN+1 idgetrf = 1 ; call DGETRF( MM+1, NN+1, dMA(0:LDA-1,0:NN), LDA, oBI%ipivot, idgetrf ) - cput = GETTIME + cput = MPI_WTIME() select case( idgetrf ) ! 0123456789012345678 case( :-1 ) ; write(ounit,1010) cput-cpus, myid, vvol, cput-lastcpu, idgetrf, "input error; " case( 0 ) ; if( Wdforce ) write(ounit,1010) cput-cpus, myid, vvol, cput-lastcpu, idgetrf, "success; " case( 1: ) ; write(ounit,1010) cput-cpus, myid, vvol, cput-lastcpu, idgetrf, "singular; " - case default ; FATAL( dforce, .true., illegal ifail returned from F07ADF ) + case default ; + if( .true. ) then + write(6,'("dforce : fatal : myid=",i3," ; .true. ; illegal ifail returned from F07ADF ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "dforce : .true. : illegal ifail returned from F07ADF ;" + endif + end select call DCOPY((1+NN)*(1+NN), dMA, 1, oBI%mat, 1) ! BLAS version; 24 Jul 2019 @@ -741,12 +1033,18 @@ subroutine get_LU_beltrami_matrices(vvol, oBI, NN) idgetrf = 1 ; call DGETRF( MM, NN, dMA(1,1), LDA, oBI%ipivot(1:NN), idgetrf ) - cput = GETTIME + cput = MPI_WTIME() select case( idgetrf ) ! 0123456789012345678 case( :-1 ) ; write(ounit,1010) cput-cpus, myid, vvol, cput-lastcpu, idgetrf, "input error; " case( 0 ) ; if( Wdforce ) write(ounit,1010) cput-cpus, myid, vvol, cput-lastcpu, idgetrf, "success; " case( 1: ) ; write(ounit,1010) cput-cpus, myid, vvol, cput-lastcpu, idgetrf, "singular; " - case default ; FATAL( dforce, .true., illegal ifail returned from F07ADF ) + case default ; + if( .true. ) then + write(6,'("dforce : fatal : myid=",i3," ; .true. ; illegal ifail returned from F07ADF ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "dforce : .true. : illegal ifail returned from F07ADF ;" + endif + end select oBI%mat(1:NN,1:NN) = dMA(1:NN,1:NN) @@ -767,7 +1065,7 @@ end subroutine get_LU_beltrami_matrices !> @param oBI !> @param NN subroutine get_perturbed_solution(vvol, oBI, NN) - + use mod_kinds, only: wp => dp ! This routine evaluates the value of the magnetic field once the interface is perturbed using matrix perturbation theory. ! Separated from the main dfp200 core to allow local and semi-global constraints to be prescribed ! @@ -788,15 +1086,23 @@ subroutine get_perturbed_solution(vvol, oBI, NN) use typedefns - LOCALS + +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + !------ - INTEGER, intent(in) :: vvol, NN + integer, intent(in) :: vvol, NN TYPE(MatrixLU),intent(inout) :: oBI - INTEGER :: ideriv, ll, idgetrs - REAL :: dpsi(1:2), work(1:NN+1), rhs(0:NN), dVA(0:NN), dVD(0:NN) - CHARACTER :: packorunpack + integer :: ideriv, ll, idgetrs + real(wp) :: dpsi(1:2), work(1:NN+1), rhs(0:NN), dVA(0:NN), dVD(0:NN) + character :: packorunpack !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!- @@ -805,9 +1111,19 @@ subroutine get_perturbed_solution(vvol, oBI, NN) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - WCALL( dfp200, intghs, ( Iquad(vvol), mn, vvol, ll, 0 ) ) - WCALL( dfp200, mtrxhs, ( vvol, mn, ll, dVA, dVD, 0) ) + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call intghs( Iquad(vvol), mn, vvol, ll, 0 ) + cpuo = MPI_WTIME() + + + + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call mtrxhs( vvol, mn, ll, dVA, dVD, 0) + cpuo = MPI_WTIME() + rhs(0) = zero rhs(1:NN) = -dVA(1:NN) @@ -825,7 +1141,12 @@ subroutine get_perturbed_solution(vvol, oBI, NN) ! Unpack derivatives of solution packorunpack = 'U' - WCALL( dfp200, packab,( packorunpack, vvol, NN, solution(1:NN,-1), -1 ) ) ! derivatives placed in Ate(lvol,ideriv,1:mn)%s(0:Lrad), + + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call packab( packorunpack, vvol, NN, solution(1:NN,-1), -1 ) + cpuo = MPI_WTIME() + ! derivatives placed in Ate(lvol,ideriv,1:mn)%s(0:Lrad), end subroutine get_perturbed_solution @@ -843,7 +1164,7 @@ end subroutine get_perturbed_solution !> @param issym !> @param irz subroutine evaluate_dmupfdx(innout, idof, ii, issym, irz) - + use mod_kinds, only: wp => dp ! Evaluate mu and psip derivatives and store them in dmupfdx. ! If debug and Lcheck=4, compare with finite difference approximation ! @@ -889,28 +1210,34 @@ subroutine evaluate_dmupfdx(innout, idof, ii, issym, irz) dMA, dMB, dMG, dMD - LOCALS: -! ------- - INTEGER :: vvol, innout, idof, iflag, ii, issym, irz, ll, NN, ifail - INTEGER :: vflag, N, iwork(1:Nvol-1), idgesvx, pvol, order, IDGESV - INTEGER :: iocons - INTEGER, allocatable:: IPIV(:) - REAL :: det, lfactor, Bt00(1:Mvol, 0:1, -1:2) - REAL :: R(1:Nvol-1), C(1:Nvol-1), work(1:4*Nvol-4), ferr, berr, rcond, tmp(2:Nvol) +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + integer :: vvol, innout, idof, iflag, ii, issym, irz, ll, NN, ifail + integer :: vflag, N, iwork(1:Nvol-1), idgesvx, pvol, order, IDGESV + integer :: iocons + integer, allocatable:: IPIV(:) + real(wp) :: det, lfactor, Bt00(1:Mvol, 0:1, -1:2) + real(wp) :: R(1:Nvol-1), C(1:Nvol-1), work(1:4*Nvol-4), ferr, berr, rcond, tmp(2:Nvol) LOGICAL :: Lonlysolution, LcomputeDerivatives, dfp100_logical - REAL, allocatable :: dBdmpf(:,:), dBdx2(:) + real(wp), allocatable :: dBdmpf(:,:), dBdx2(:) #ifdef DEBUG - INTEGER :: isymdiff, lr, ml, mode - INTEGER :: jj, tdoc, idoc, tdof, jdof, imn, Ndofgl - REAL :: dvol(-1:+1), evolume, imupf_global(1:Mvol,1:2,-2:2), imupf_local(1:2,-2:2), factor, Btemn_debug(1:mn, 0:1, 1:Mvol, -1:2) - REAL :: position(0:NGdof), force(0:NGdof) - REAL :: Fdof(1:Mvol-1), Xdof(1:Mvol-1) - REAL, allocatable :: fjac(:, :), r_deb(:), Fvec(:), dpfluxout(:) - REAL, allocatable :: oRbc(:,:), oZbs(:,:), oRbs(:,:), oZbc(:,:) ! original geometry; + integer :: isymdiff, lr, ml, mode + integer :: jj, tdoc, idoc, tdof, jdof, imn, Ndofgl + real(wp) :: dvol(-1:+1), evolume, imupf_global(1:Mvol,1:2,-2:2), imupf_local(1:2,-2:2), factor, Btemn_debug(1:mn, 0:1, 1:Mvol, -1:2) + real(wp) :: position(0:NGdof), force(0:NGdof) + real(wp) :: Fdof(1:Mvol-1), Xdof(1:Mvol-1) + real(wp), allocatable :: fjac(:, :), r_deb(:), Fvec(:), dpfluxout(:) + real(wp), allocatable :: oRbc(:,:), oZbs(:,:), oRbs(:,:), oZbc(:,:) ! original geometry; - CHARACTER :: packorunpack + character :: packorunpack EXTERNAL :: dfp100 #endif @@ -924,7 +1251,13 @@ subroutine evaluate_dmupfdx(innout, idof, ii, issym, irz) NN = NAdof(vvol) ! shorthand; #ifdef DEBUG - FATAL( dfp200, vvol-1+innout.gt.Mvol, psifactor needs attention ) + + if( vvol-1+innout.gt.Mvol ) then + write(6,'("dfp200 : fatal : myid=",i3," ; vvol-1+innout.gt.Mvol ; psifactor needs attention ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "dfp200 : vvol-1+innout.gt.Mvol : psifactor needs attention ;" + endif + #endif @@ -933,10 +1266,22 @@ subroutine evaluate_dmupfdx(innout, idof, ii, issym, irz) ! Store initial arrays for debug purposes. if( Lcheck.eq.3 .or. Lcheck.eq.4 ) then ! will check volume derivatives; - SALLOCATE( oRbc, (1:mn,0:Mvol), iRbc(1:mn,0:Mvol) ) - SALLOCATE( oZbs, (1:mn,0:Mvol), iZbs(1:mn,0:Mvol) ) - SALLOCATE( oRbs, (1:mn,0:Mvol), iRbs(1:mn,0:Mvol) ) - SALLOCATE( oZbc, (1:mn,0:Mvol), iZbc(1:mn,0:Mvol) ) + + allocate( oRbc(1:mn,0:Mvol), stat=astat ) + oRbc(1:mn,0:Mvol) = iRbc(1:mn,0:Mvol) + + + allocate( oZbs(1:mn,0:Mvol), stat=astat ) + oZbs(1:mn,0:Mvol) = iZbs(1:mn,0:Mvol) + + + allocate( oRbs(1:mn,0:Mvol), stat=astat ) + oRbs(1:mn,0:Mvol) = iRbs(1:mn,0:Mvol) + + + allocate( oZbc(1:mn,0:Mvol), stat=astat ) + oZbc(1:mn,0:Mvol) = iZbc(1:mn,0:Mvol) + endif ! end of if( Lcheck.eq.3 .or. Lcheck.eq.4 ) ; #endif @@ -954,9 +1299,18 @@ subroutine evaluate_dmupfdx(innout, idof, ii, issym, irz) order = Mvol-1 endif - SALLOCATE(dBdmpf , ( 1:order, 1:order ), zero) - SALLOCATE(dBdx2 , ( 1:order ), zero) - SALLOCATE(IPIV , ( 1:order ), zero) + + allocate( dBdmpf ( 1:order, 1:order ), stat=astat ) + dBdmpf ( 1:order, 1:order ) = zero + + + allocate( dBdx2 ( 1:order ), stat=astat ) + dBdx2 ( 1:order ) = zero + + + allocate( IPIV ( 1:order ), stat=astat ) + IPIV ( 1:order ) = zero + ! Derivatives of helicity multipliers @@ -965,11 +1319,26 @@ subroutine evaluate_dmupfdx(innout, idof, ii, issym, irz) ! Derivatives of poloidal flux. Need to solve a linear system of 5 equations - by hand for now ! Matrix coefficients evaluation do pvol = 1, Mvol - LREGION(pvol) + + if( Igeometry.eq.1 .or. pvol.gt.1 ) then ; Lcoordinatesingularity = .false. + else ; Lcoordinatesingularity = .true. + endif + + if( pvol.le.Nvol ) then ; Lplasmaregion = .true. + else ; Lplasmaregion = .false. + endif + + Lvacuumregion = .not.Lplasmaregion + do iocons = 0, 1 if( ( Lcoordinatesingularity .and. iocons.eq.0 ) .or. ( Lvacuumregion .and. iocons.eq.1 ) ) cycle - WCALL(dfp200, lbpol, (pvol, Bt00(1:Mvol, 0:1, -1:2), 2, iocons)) ! Stores derivative in global variable Btemn + + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call lbpol(pvol, Bt00(1:Mvol, 0:1, -1:2), 2, iocons) + cpuo = MPI_WTIME() + ! Stores derivative in global variable Btemn enddo #ifdef DEBUG if( .false. ) then @@ -1001,7 +1370,17 @@ subroutine evaluate_dmupfdx(innout, idof, ii, issym, irz) ! RHS coefficients evaluation do pvol = vvol, vvol+1 - LREGION(pvol) + + if( Igeometry.eq.1 .or. pvol.gt.1 ) then ; Lcoordinatesingularity = .false. + else ; Lcoordinatesingularity = .true. + endif + + if( pvol.le.Nvol ) then ; Lplasmaregion = .true. + else ; Lplasmaregion = .false. + endif + + Lvacuumregion = .not.Lplasmaregion + if( pvol.eq.vvol ) then dBdX%innout = 1 ! take derivative w.r.t outer interface else !pvol.eq.vvol+1 @@ -1010,7 +1389,12 @@ subroutine evaluate_dmupfdx(innout, idof, ii, issym, irz) do iocons = 0, 1 if( ( Lcoordinatesingularity .and. iocons.eq.0 ) .or. ( Lvacuumregion .and. iocons.eq.1 ) ) cycle - WCALL(dfp200, lbpol, (pvol, Bt00(1:Mvol, 0:1, -1:2), -1, iocons)) ! derivate w.r.t geometry + + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call lbpol(pvol, Bt00(1:Mvol, 0:1, -1:2), -1, iocons) + cpuo = MPI_WTIME() + ! derivate w.r.t geometry enddo #ifdef DEBUG @@ -1038,12 +1422,22 @@ subroutine evaluate_dmupfdx(innout, idof, ii, issym, irz) ! Get derivatives of B_theta w.r.t the toroidal flux in vacuum region iocons = 0 - WCALL(dfp200, lbpol, (Mvol, Bt00(1:Mvol, 0:1, -1:2), 1, iocons)) + + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call lbpol(Mvol, Bt00(1:Mvol, 0:1, -1:2), 1, iocons) + cpuo = MPI_WTIME() + ! compute d(Itor,Gpol)/dpsip and d(Itor,Gpol)/dpsit ! TODO: this should already be evaluated in mp00ac... ! TODO: THIS COULD BE MOVED OUTSIDE THE LOOPS - iflag = 2 ; WCALL( dfp200, curent, ( Mvol, mn, Nt, Nz, iflag, dItGpdxtp(0:1,-1:2,Mvol) ) ) + iflag = 2 ; + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call curent( Mvol, mn, Nt, Nz, iflag, dItGpdxtp(0:1,-1:2,Mvol) ) + cpuo = MPI_WTIME() + dBdmpf(Mvol-1, Mvol ) = Bt00(Mvol, 0, 1) !dBdpsit dBdmpf(Mvol , Mvol-1) = dItGpdxtp( 1, 2, Mvol) !dIpdpsip @@ -1051,7 +1445,12 @@ subroutine evaluate_dmupfdx(innout, idof, ii, issym, irz) ! compute d(Itor,Gpol)/dx if( vvol.eq.Mvol-1 ) then ! Plasma interface is perturbed - iflag = -1 ; WCALL( dfp200, curent, ( Mvol, mn, Nt, Nz, iflag, dItGpdxtp(0:1,-1:2,Mvol) ) ) + iflag = -1 ; + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call curent( Mvol, mn, Nt, Nz, iflag, dItGpdxtp(0:1,-1:2,Mvol) ) + cpuo = MPI_WTIME() + dBdx2( Mvol ) = -dItGpdxtp( 1,-1, Mvol) !-dIpdxj else ! Inner interface is perturbed dBdx2( Mvol ) = zero @@ -1078,19 +1477,35 @@ subroutine evaluate_dmupfdx(innout, idof, ii, issym, irz) endif ! Free memory - DALLOCATE( dBdmpf ) - DALLOCATE( dBdx2 ) - DALLOCATE( IPIV ) + + deallocate(dBdmpf ,stat=astat) + + + deallocate(dBdx2 ,stat=astat) + + + deallocate(IPIV ,stat=astat) + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! else ! LocalConstraint if( Lconstraint.eq.1 ) then - iflag = -1 ; WCALL( dfp200, tr00ab, ( vvol, mn, lmns, Nt, Nz, iflag, diotadxup(0:1,-1:2,vvol) ) ) ! compute d(transform)/dx; + iflag = -1 ; + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call tr00ab( vvol, mn, lmns, Nt, Nz, iflag, diotadxup(0:1,-1:2,vvol) ) + cpuo = MPI_WTIME() + ! compute d(transform)/dx; endif if( Lvacuumregion .and. Lconstraint.ge.0 ) then - iflag = -1 ; WCALL( dfp200, curent, ( vvol, mn, Nt, Nz, iflag, dItGpdxtp(0:1,-1:2,vvol) ) ) ! compute d(Itor,Gpol)/dx; + iflag = -1 ; + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call curent( vvol, mn, Nt, Nz, iflag, dItGpdxtp(0:1,-1:2,vvol) ) + cpuo = MPI_WTIME() + ! compute d(Itor,Gpol)/dx; endif dmupfdx(vvol,1,1,idof,innout) = zero ! Prepare array @@ -1103,7 +1518,13 @@ subroutine evaluate_dmupfdx(innout, idof, ii, issym, irz) if( Lcoordinatesingularity ) then ! solution does not depend on dpflux, and only outer transform is a constraint; det = diotadxup(1,1,vvol) - FATAL( dfp200, abs(det).lt.small, error computing derivatives of mu wrt geometry at fixed transform ) + + if( abs(det).lt.small ) then + write(6,'("dfp200 : fatal : myid=",i3," ; abs(det).lt.small ; error computing derivatives of mu wrt geometry at fixed transform ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "dfp200 : abs(det).lt.small : error computing derivatives of mu wrt geometry at fixed transform ;" + endif + dmupfdx(vvol,1,1,idof,innout) = - lfactor * ( diotadxup(1,-1,vvol) ) / det dmupfdx(vvol,1,2,idof,innout) = zero @@ -1111,7 +1532,13 @@ subroutine evaluate_dmupfdx(innout, idof, ii, issym, irz) else ! if( .not.Lcoordinatesingularity ) ; det = diotadxup(0,1,vvol) * diotadxup(1,2,vvol) - diotadxup(0,2,vvol) * diotadxup(1,1,vvol) - FATAL( dfp200, abs(det).lt.small, error computing derivatives of mu & dpflux wrt geometry at fixed transform ) + + if( abs(det).lt.small ) then + write(6,'("dfp200 : fatal : myid=",i3," ; abs(det).lt.small ; error computing derivatives of mu & dpflux wrt geometry at fixed transform ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "dfp200 : abs(det).lt.small : error computing derivatives of mu & dpflux wrt geometry at fixed transform ;" + endif + dmupfdx(vvol,1,1,idof,innout) = - lfactor * ( + diotadxup(1, 2,vvol) * diotadxup(0,-1,vvol) - diotadxup(0, 2,vvol) * diotadxup(1,-1,vvol) ) / det dmupfdx(vvol,1,2,idof,innout) = - lfactor * ( - diotadxup(1, 1,vvol) * diotadxup(0,-1,vvol) + diotadxup(0, 1,vvol) * diotadxup(1,-1,vvol) ) / det @@ -1125,7 +1552,13 @@ subroutine evaluate_dmupfdx(innout, idof, ii, issym, irz) if ( Lconstraint.eq.0 ) then ! THIS NEEDS ATTENTION; det = dItGpdxtp(0,1,vvol) * dItGpdxtp(1,2,vvol) - dItGpdxtp(0,2,vvol) * dItGpdxtp(1,1,vvol) - FATAL( dfp200, abs(det).lt.small, error computing derivatives of dtflux & dpflux wrt geometry at fixed Itor and Gpol ) + + if( abs(det).lt.small ) then + write(6,'("dfp200 : fatal : myid=",i3," ; abs(det).lt.small ; error computing derivatives of dtflux & dpflux wrt geometry at fixed Itor and Gpol ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "dfp200 : abs(det).lt.small : error computing derivatives of dtflux & dpflux wrt geometry at fixed Itor and Gpol ;" + endif + dmupfdx(vvol,1,1,idof,innout) = - lfactor * ( + dItGpdxtp(1, 2,vvol) * dItGpdxtp(0,-1,vvol) - dItGpdxtp(0, 2,vvol) * dItGpdxtp(1,-1,vvol) ) / det dmupfdx(vvol,1,2,idof,innout) = - lfactor * ( - dItGpdxtp(1, 1,vvol) * dItGpdxtp(0,-1,vvol) + dItGpdxtp(0, 1,vvol) * dItGpdxtp(1,-1,vvol) ) / det @@ -1133,7 +1566,13 @@ subroutine evaluate_dmupfdx(innout, idof, ii, issym, irz) else if( Lconstraint.eq.1 ) then det = diotadxup(0,1,vvol) * dItGpdxtp(1,2,vvol) - diotadxup(0,2,vvol) * dItGpdxtp(1,1,vvol) - FATAL( dfp200, abs(det).lt.small, error computing derivatives of dtflux & dpflux wrt geometry at fixed Itor and Gpol ) + + if( abs(det).lt.small ) then + write(6,'("dfp200 : fatal : myid=",i3," ; abs(det).lt.small ; error computing derivatives of dtflux & dpflux wrt geometry at fixed Itor and Gpol ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "dfp200 : abs(det).lt.small : error computing derivatives of dtflux & dpflux wrt geometry at fixed Itor and Gpol ;" + endif + dmupfdx(vvol,1,1,idof,innout) = - lfactor * ( + dItGpdxtp(1, 2,vvol) * diotadxup(0,-1,vvol) - diotadxup(0, 2,vvol) * dItGpdxtp(1,-1,vvol) ) / det dmupfdx(vvol,1,2,idof,innout) = - lfactor * ( - dItGpdxtp(1, 1,vvol) * diotadxup(0,-1,vvol) + diotadxup(0, 1,vvol) * dItGpdxtp(1,-1,vvol) ) / det @@ -1158,9 +1597,24 @@ subroutine evaluate_dmupfdx(innout, idof, ii, issym, irz) dBdX%L = .false. if( LocalConstraint ) then - WCALL(dfp200, deallocate_geometry_matrices, (LcomputeDerivatives)) - WCALL(dfp200, deallocate_Beltrami_matrices, (LcomputeDerivatives)) - WCALL(dfp200, intghs_workspace_destroy, ())) + + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call deallocate_geometry_matrices(LcomputeDerivatives) + cpuo = MPI_WTIME() + + + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call deallocate_Beltrami_matrices(LcomputeDerivatives) + cpuo = MPI_WTIME() + + + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call intghs_workspace_destroy() + cpuo = MPI_WTIME() +) endif do isymdiff = -2, 2 ! symmetric fourth-order, finite-difference used to approximate derivatives; @@ -1188,16 +1642,26 @@ subroutine evaluate_dmupfdx(innout, idof, ii, issym, irz) Xdof(1:Mvol-1) = zero; if( LocalConstraint ) then - SALLOCATE( Fvec, (1:Mvol-1), zero) + + allocate( Fvec(1:Mvol-1), stat=astat ) + Fvec(1:Mvol-1) = zero + Ndofgl = 0; Fvec(1:Mvol-1) = 0; dfp100_logical = .FALSE.; Xdof(1:Mvol-1) = dpflux(2:Mvol) + xoffset ! Solve for field dBdX%L = .false. ! No need for derivatives in this context - WCALL(dfp200, dfp100, (Ndofgl, Xdof, Fvec, dfp100_logical) ) - DALLOCATE( Fvec ) + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call dfp100(Ndofgl, Xdof, Fvec, dfp100_logical) + cpuo = MPI_WTIME() + + + + deallocate(Fvec ,stat=astat) + ! -------------------------------------------------------------------------------------------------- ! Global constraint - call the master thread calls hybrd1 on dfp100, others call dfp100_loop. @@ -1214,13 +1678,27 @@ subroutine evaluate_dmupfdx(innout, idof, ii, issym, irz) Ndofgl = Mvol-1 endif - SALLOCATE(dpfluxout, (1:Ndofgl), zero ) - SALLOCATE( Fvec, (1:Ndofgl), zero ) - SALLOCATE( IPIV, (1:Mvol-1), zero ) + + allocate( dpfluxout(1:Ndofgl), stat=astat ) + dpfluxout(1:Ndofgl) = zero + + + allocate( Fvec(1:Ndofgl), stat=astat ) + Fvec(1:Ndofgl) = zero + + + allocate( IPIV(1:Mvol-1), stat=astat ) + IPIV(1:Mvol-1) = zero + dfp100_logical = .TRUE. - WCALL(dfp200, dfp100, (Ndofgl, Xdof(1:Mvol-1), Fvec(1:Ndofgl), dfp100_logical)) + + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call dfp100(Ndofgl, Xdof(1:Mvol-1), Fvec(1:Ndofgl), dfp100_logical) + cpuo = MPI_WTIME() + ! Only one cpu with this test - thus no need for broadcast dpfluxout = Fvec @@ -1232,15 +1710,31 @@ subroutine evaluate_dmupfdx(innout, idof, ii, issym, irz) dtflux(Mvol) = dtflux(Mvol ) - dpfluxout(Mvol ) endif - DALLOCATE(IPIV) - DALLOCATE(Fvec) - DALLOCATE(dpfluxout) + + deallocate(IPIV,stat=astat) + + + deallocate(Fvec,stat=astat) + + + deallocate(dpfluxout,stat=astat) + endif if( LocalConstraint ) then - LREGION(vvol) + + if( Igeometry.eq.1 .or. vvol.gt.1 ) then ; Lcoordinatesingularity = .false. + else ; Lcoordinatesingularity = .true. + endif + + if( vvol.le.Nvol ) then ; Lplasmaregion = .true. + else ; Lplasmaregion = .false. + endif + + Lvacuumregion = .not.Lplasmaregion + ll = Lrad(vvol) ! shorthand NN = NAdof(vvol) ! shorthand; @@ -1265,9 +1759,24 @@ subroutine evaluate_dmupfdx(innout, idof, ii, issym, irz) if( LocalConstraint ) then ! reallocate matrices for next iteration - WCALL(dfp200, intghs_workspace_init, (vvol)) - WCALL(dfp200, allocate_Beltrami_matrices, (vvol,LcomputeDerivatives)) - WCALL(dfp200, allocate_geometry_matrices, (vvol,LcomputeDerivatives)) + + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call intghs_workspace_init(vvol) + cpuo = MPI_WTIME() + + + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call allocate_Beltrami_matrices(vvol,LcomputeDerivatives) + cpuo = MPI_WTIME() + + + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call allocate_geometry_matrices(vvol,LcomputeDerivatives) + cpuo = MPI_WTIME() + endif 8294 continue @@ -1282,7 +1791,7 @@ subroutine evaluate_dmupfdx(innout, idof, ii, issym, irz) + 1 * imupf_global(1:Mvol,1:2,-2) ) / ( 12 * dRZ ) endif - cput = GETTIME + cput = MPI_WTIME() write(ounit,3003) if( LocalConstraint ) then @@ -1322,7 +1831,12 @@ subroutine evaluate_dmupfdx(innout, idof, ii, issym, irz) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! vflag = 1 ! this flag instructs volume to continue even if the volume is invalid; - WCALL( dfp200, volume, ( vvol, vflag ) ) ! compute derivative of volume; wrt to harmonic described by dBdX structure; + + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call volume( vvol, vflag ) + cpuo = MPI_WTIME() + ! compute derivative of volume; wrt to harmonic described by dBdX structure; #ifdef DEBUG @@ -1330,7 +1844,7 @@ subroutine evaluate_dmupfdx(innout, idof, ii, issym, irz) dvol(0) = dvolume - cput = GETTIME + cput = MPI_WTIME() write(ounit,1001) cput-cpus, myid, vvol, im(ii), in(ii), irz, issym, innout, "analytic", dvolume 1001 format("dfp200 : ",f10.2," : myid=",i3," ; vvol=",i3," ; (",i3," ,",i3,") ; irz=",i2," ; issym=",i2," ; innout=",i2,& @@ -1349,7 +1863,12 @@ subroutine evaluate_dmupfdx(innout, idof, ii, issym, irz) endif vflag = 1 ! this flag instructs volume to continue even if the volume is invalid; - WCALL( dfp200, volume, ( vvol, vflag ) ) ! compute volume; this corrupts calculation of dvolume; + + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call volume( vvol, vflag ) + cpuo = MPI_WTIME() + ! compute volume; this corrupts calculation of dvolume; dvol(isymdiff) = vvolume(vvol) @@ -1357,10 +1876,16 @@ subroutine evaluate_dmupfdx(innout, idof, ii, issym, irz) evolume = abs( ( dvol(+1)-dvol(-1) ) / dRZ - dvol(0) ) ! error in finite-difference calculation and analytic derivative; - cput = GETTIME + cput = MPI_WTIME() write(ounit,1001) cput-cpus, myid, vvol, im(ii), in(ii), irz, issym, innout, "finite-d", ( dvol(+1)-dvol(-1) ) / dRZ, evolume - FATAL( dfp200, evolume.gt.dRZ, unacceptable error in volume derivative ) + + if( evolume.gt.dRZ ) then + write(6,'("dfp200 : fatal : myid=",i3," ; evolume.gt.dRZ ; unacceptable error in volume derivative ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "dfp200 : evolume.gt.dRZ : unacceptable error in volume derivative ;" + endif + iRbc(1:mn,0:Mvol) = oRbc(1:mn,0:Mvol) iZbs(1:mn,0:Mvol) = oZbs(1:mn,0:Mvol) @@ -1378,10 +1903,18 @@ subroutine evaluate_dmupfdx(innout, idof, ii, issym, irz) #ifdef DEBUG if( Lcheck.eq.3 .or. Lcheck.eq.4 ) then - DALLOCATE(oRbc) - DALLOCATE(oZbs) - DALLOCATE(oRbs) - DALLOCATE(oZbc) + + deallocate(oRbc,stat=astat) + + + deallocate(oZbs,stat=astat) + + + deallocate(oRbs,stat=astat) + + + deallocate(oZbc,stat=astat) + endif #endif @@ -1410,7 +1943,7 @@ end subroutine evaluate_dmupfdx !> @param Ntz !> @param LcomputeDerivatives subroutine evaluate_dBB(lvol, idof, innout, issym, irz, ii, dBB, XX, YY, length, dRR, dZZ, dII, dLL, dPP, Ntz, LcomputeDerivatives) - + use mod_kinds, only: wp => dp ! Evaluate the derivative of the square of the magnetic field modulus. Add spectral constraint derivatives if ! required. @@ -1460,20 +1993,28 @@ subroutine evaluate_dBB(lvol, idof, innout, issym, irz, ii, dBB, XX, YY, length, dRodR, dRodZ, dZodR, dZodZ, dBdX, & xoffset - LOCALS + +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + !------ LOGICAL, intent(in) :: LComputeDerivatives -INTEGER :: iocons, lvol, ideriv, id, iflag, Lcurvature, innout, issym, irz, ii, ifail, idoc, idof, Ntz -REAL :: lss, DDl, MMl -REAL :: dAt(1:Ntz,-1:2), dAz(1:Ntz,-1:2), XX(1:Ntz), YY(1:Ntz), dBB(1:Ntz,-1:2), dII(1:Ntz), dLL(1:Ntz) -REAL :: dPP(1:Ntz), length(1:Ntz), dRR(1:Ntz,-1:2), dZZ(1:Ntz,-1:2), constraint(1:Ntz) +integer :: iocons, lvol, ideriv, id, iflag, Lcurvature, innout, issym, irz, ii, ifail, idoc, idof, Ntz +real(wp) :: lss, DDl, MMl +real(wp) :: dAt(1:Ntz,-1:2), dAz(1:Ntz,-1:2), XX(1:Ntz), YY(1:Ntz), dBB(1:Ntz,-1:2), dII(1:Ntz), dLL(1:Ntz) +real(wp) :: dPP(1:Ntz), length(1:Ntz), dRR(1:Ntz,-1:2), dZZ(1:Ntz,-1:2), constraint(1:Ntz) #ifdef DEBUG -INTEGER :: isymdiff, ll, NN, ndofgl, pvol -REAL :: Fvec(1:Mvol-1), Xdof(1:Mvol-1) -REAL, allocatable :: oRbc(:,:), oZbs(:,:), oRbs(:,:), oZbc(:,:) ! original geometry; -REAL, allocatable :: idBB(:,:), iforce(:,:), iposition(:,:) -CHARACTER :: packorunpack +integer :: isymdiff, ll, NN, ndofgl, pvol +real(wp) :: Fvec(1:Mvol-1), Xdof(1:Mvol-1) +real(wp), allocatable :: oRbc(:,:), oZbs(:,:), oRbs(:,:), oZbc(:,:) ! original geometry; +real(wp), allocatable :: idBB(:,:), iforce(:,:), iposition(:,:) +character :: packorunpack #endif do iocons = 0, 1 @@ -1492,7 +2033,12 @@ subroutine evaluate_dBB(lvol, idof, innout, issym, irz, ii, dBB, XX, YY, length, iflag = 1 do ideriv=1, 2 !call evaluate_Bsquare(iocons, lvol, dBB, dAt, dAz, XX, YY, length, DDl, MMl, ideriv)! In a subroutine; called somewhere else when semi global constraint - WCALL(dfp200, lforce, (lvol, iocons, ideriv, Ntz, dBB, XX, YY, length, DDl, MMl, iflag) ) + + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call lforce(lvol, iocons, ideriv, Ntz, dBB, XX, YY, length, DDl, MMl, iflag) + cpuo = MPI_WTIME() + enddo call tfft( Nt, Nz, dBB(1:Ntz,1), dBB(1:Ntz,2), & ! derivatives of B^2 wrt mu and dpflux; @@ -1529,7 +2075,12 @@ subroutine evaluate_dBB(lvol, idof, innout, issym, irz, ii, dBB, XX, YY, length, ! ----------------------------------- ideriv = 0; iflag=1 - WCALL( dfp200, lforce, (lvol, iocons, ideriv, Ntz, dBB, XX, YY, length, DDl, MMl, iflag) ) + + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call lforce(lvol, iocons, ideriv, Ntz, dBB, XX, YY, length, DDl, MMl, iflag) + cpuo = MPI_WTIME() + ! dFFdRZ CONSTRUCTION @@ -1539,10 +2090,21 @@ subroutine evaluate_dBB(lvol, idof, innout, issym, irz, ii, dBB, XX, YY, length, ! --------------------- ideriv = -1; iflag=0 - WCALL( dfp200, lforce, (lvol, iocons, ideriv, Ntz, dBB, XX, YY, length, DDl, MMl, iflag) ) + + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call lforce(lvol, iocons, ideriv, Ntz, dBB, XX, YY, length, DDl, MMl, iflag) + cpuo = MPI_WTIME() + ! Add derivatives of pressure as well - FATAL( dfp200, vvolume(lvol).lt.small, shall divide by vvolume(lvol)**(gamma+one) ) + + if( vvolume(lvol).lt.small ) then + write(6,'("dfp200 : fatal : myid=",i3," ; vvolume(lvol).lt.small ; shall divide by vvolume(lvol)**(gamma+one) ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "dfp200 : vvolume(lvol).lt.small : shall divide by vvolume(lvol)**(gamma+one) ;" + endif + ! Derivatives of force wrt geometry; In real space. ijreal(1:Ntz) = - adiabatic(lvol) * pscale * gamma * dvolume / vvolume(lvol)**(gamma+one) + dBB(1:Ntz,-1) @@ -1560,7 +2122,13 @@ subroutine evaluate_dBB(lvol, idof, innout, issym, irz, ii, dBB, XX, YY, length, if( innout.eq.1 .and. iocons.eq.1 ) then ! include derivatives of spectral constraints; #ifdef DEBUG - FATAL( dfp200, abs(DDl).lt.small, divide by zero on spectral constraint ) + + if( abs(DDl).lt.small ) then + write(6,'("dfp200 : fatal : myid=",i3," ; abs(DDl).lt.small ; divide by zero on spectral constraint ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "dfp200 : abs(DDl).lt.small : divide by zero on spectral constraint ;" + endif + #endif if( issym.eq.0 ) then ! take derivatives wrt Rbc and Zbs; @@ -1717,7 +2285,13 @@ subroutine evaluate_dBB(lvol, idof, innout, issym, irz, ii, dBB, XX, YY, length, mn, im(1:mn), in(1:mn), evmn(1:mn), odmn(1:mn), comn(1:mn), simn(1:mn), ifail ) ! evmn and odmn are available as workspace; - FATAL( dfp200, lvol-1+innout.gt.Mvol, psifactor needs attention ) + + if( lvol-1+innout.gt.Mvol ) then + write(6,'("dfp200 : fatal : myid=",i3," ; lvol-1+innout.gt.Mvol ; psifactor needs attention ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "dfp200 : lvol-1+innout.gt.Mvol : psifactor needs attention ;" + endif + idoc = 0 @@ -1753,7 +2327,13 @@ subroutine evaluate_dBB(lvol, idof, innout, issym, irz, ii, dBB, XX, YY, length, endif ! end of if( NOTstellsym) ; #ifdef DEBUG - FATAL( dfp200, idoc.ne.LGdof, counting error ) + + if( idoc.ne.LGdof ) then + write(6,'("dfp200 : fatal : myid=",i3," ; idoc.ne.LGdof ; counting error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "dfp200 : idoc.ne.LGdof : counting error ;" + endif + #endif enddo ! end of do iocons; @@ -1762,7 +2342,7 @@ end subroutine evaluate_dBB subroutine hessian_dFFdRZ(lvol, idof, innout, issym, irz, ii, dBB, XX, YY, length, dRR, dZZ, dII, dLL, dPP, Ntz) - + use mod_kinds, only: wp => dp ! Evaluate the derivative of the square of the magnetic field modulus. Add spectral constraint derivatives if ! required. @@ -1813,19 +2393,27 @@ subroutine hessian_dFFdRZ(lvol, idof, innout, issym, irz, ii, dBB, XX, YY, lengt dRodR, dRodZ, dZodR, dZodZ, dBdX, & xoffset - LOCALS + +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + !------ -INTEGER :: iocons, lvol, ideriv, id, iflag, Lcurvature, innout, issym, irz, ii, ifail, idoc, idof, Ntz -REAL :: lss, DDl, MMl -REAL :: dAt(1:Ntz,-1:2), dAz(1:Ntz,-1:2), XX(1:Ntz), YY(1:Ntz), dBB(1:Ntz,-1:2), dII(1:Ntz), dLL(1:Ntz) -REAL :: dPP(1:Ntz), length(1:Ntz), dRR(1:Ntz,-1:2), dZZ(1:Ntz,-1:2), constraint(1:Ntz) +integer :: iocons, lvol, ideriv, id, iflag, Lcurvature, innout, issym, irz, ii, ifail, idoc, idof, Ntz +real(wp) :: lss, DDl, MMl +real(wp) :: dAt(1:Ntz,-1:2), dAz(1:Ntz,-1:2), XX(1:Ntz), YY(1:Ntz), dBB(1:Ntz,-1:2), dII(1:Ntz), dLL(1:Ntz) +real(wp) :: dPP(1:Ntz), length(1:Ntz), dRR(1:Ntz,-1:2), dZZ(1:Ntz,-1:2), constraint(1:Ntz) #ifdef DEBUG -INTEGER :: isymdiff, ll, NN, ndofgl, pvol -REAL :: Fvec(1:Mvol-1), Xdof(1:Mvol-1) -REAL, allocatable :: oRbc(:,:), oZbs(:,:), oRbs(:,:), oZbc(:,:) ! original geometry; -REAL, allocatable :: idBB(:,:), iforce(:,:), iposition(:,:) -CHARACTER :: packorunpack +integer :: isymdiff, ll, NN, ndofgl, pvol +real(wp) :: Fvec(1:Mvol-1), Xdof(1:Mvol-1) +real(wp), allocatable :: oRbc(:,:), oZbs(:,:), oRbs(:,:), oZbc(:,:) ! original geometry; +real(wp), allocatable :: idBB(:,:), iforce(:,:), iposition(:,:) +character :: packorunpack #endif @@ -1840,7 +2428,12 @@ subroutine hessian_dFFdRZ(lvol, idof, innout, issym, irz, ii, dBB, XX, YY, lengt ! ----------------------------------- ideriv = 0; iflag=1 - WCALL( dfp200, lforce, (lvol, iocons, ideriv, Ntz, dBB, XX, YY, length, DDl, MMl, iflag) ) + + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call lforce(lvol, iocons, ideriv, Ntz, dBB, XX, YY, length, DDl, MMl, iflag) + cpuo = MPI_WTIME() + ! hessian_dFFdRZ CONSTRUCTION ! =================== @@ -1849,10 +2442,21 @@ subroutine hessian_dFFdRZ(lvol, idof, innout, issym, irz, ii, dBB, XX, YY, lengt ! --------------------- ideriv = -1; iflag=0 - WCALL( dfp200, lforce, (lvol, iocons, ideriv, Ntz, dBB, XX, YY, length, DDl, MMl, iflag) ) + + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call lforce(lvol, iocons, ideriv, Ntz, dBB, XX, YY, length, DDl, MMl, iflag) + cpuo = MPI_WTIME() + ! Add derivatives of pressure as well - FATAL( dfp200, vvolume(lvol).lt.small, shall divide by vvolume(lvol)**(gamma+one) ) + + if( vvolume(lvol).lt.small ) then + write(6,'("dfp200 : fatal : myid=",i3," ; vvolume(lvol).lt.small ; shall divide by vvolume(lvol)**(gamma+one) ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "dfp200 : vvolume(lvol).lt.small : shall divide by vvolume(lvol)**(gamma+one) ;" + endif + ! Derivatives of force wrt geometry; In real space. ijreal(1:Ntz) = - adiabatic(lvol) * pscale * gamma * dvolume / vvolume(lvol)**(gamma+one) + dBB(1:Ntz,-1)*Rij(1:Ntz,0,0) @@ -1870,7 +2474,13 @@ subroutine hessian_dFFdRZ(lvol, idof, innout, issym, irz, ii, dBB, XX, YY, lengt mn, im(1:mn), in(1:mn), efmn(1:mn), ofmn(1:mn), cfmn(1:mn), sfmn(1:mn), ifail ) - FATAL( dfp200, lvol-1+innout.gt.Mvol, psifactor needs attention ) + + if( lvol-1+innout.gt.Mvol ) then + write(6,'("dfp200 : fatal : myid=",i3," ; lvol-1+innout.gt.Mvol ; psifactor needs attention ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "dfp200 : lvol-1+innout.gt.Mvol : psifactor needs attention ;" + endif + idoc = 0 @@ -1904,7 +2514,13 @@ subroutine hessian_dFFdRZ(lvol, idof, innout, issym, irz, ii, dBB, XX, YY, lengt endif ! end of if( NOTstellsym) ; #ifdef DEBUG - FATAL( dfp200, idoc.ne.LGdof, counting error ) + + if( idoc.ne.LGdof ) then + write(6,'("dfp200 : fatal : myid=",i3," ; idoc.ne.LGdof ; counting error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "dfp200 : idoc.ne.LGdof : counting error ;" + endif + #endif enddo ! end of do iocons; @@ -1912,7 +2528,7 @@ subroutine hessian_dFFdRZ(lvol, idof, innout, issym, irz, ii, dBB, XX, YY, lengt end subroutine hessian_dFFdRZ subroutine hessian3D_dFFdRZ(lvol, idof, innout, issym, irz, ii, dBB, XX, YY, length, dRR, dZZ, dII, dLL, dPP, Ntz) - + use mod_kinds, only: wp => dp ! Evaluate the derivative of the square of the magnetic field modulus. Add spectral constraint derivatives if ! required. @@ -1965,21 +2581,29 @@ subroutine hessian3D_dFFdRZ(lvol, idof, innout, issym, irz, ii, dBB, XX, YY, len dRodR, dRodZ, dZodR, dZodZ, dBdX, & xoffset - LOCALS + +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + !------ -INTEGER :: iocons, lvol, ideriv, id, iflag, Lcurvature, innout, issym, irz, ii, ifail, idoc, idof, Ntz -REAL :: lss, DDl, MMl -REAL :: dAt(1:Ntz,-1:2), dAz(1:Ntz,-1:2), XX(1:Ntz), YY(1:Ntz), dBB(1:Ntz,-1:2), dII(1:Ntz), dLL(1:Ntz) -REAL :: dPP(1:Ntz), length(1:Ntz), dRR(1:Ntz,-1:2), dZZ(1:Ntz,-1:2), constraint(1:Ntz) -REAL :: ddFcol1(1:Ntz), ddFcol2(1:Ntz),ddFcol3(1:Ntz), ddFcol4(1:Ntz) +integer :: iocons, lvol, ideriv, id, iflag, Lcurvature, innout, issym, irz, ii, ifail, idoc, idof, Ntz +real(wp) :: lss, DDl, MMl +real(wp) :: dAt(1:Ntz,-1:2), dAz(1:Ntz,-1:2), XX(1:Ntz), YY(1:Ntz), dBB(1:Ntz,-1:2), dII(1:Ntz), dLL(1:Ntz) +real(wp) :: dPP(1:Ntz), length(1:Ntz), dRR(1:Ntz,-1:2), dZZ(1:Ntz,-1:2), constraint(1:Ntz) +real(wp) :: ddFcol1(1:Ntz), ddFcol2(1:Ntz),ddFcol3(1:Ntz), ddFcol4(1:Ntz) #ifdef DEBUG -INTEGER :: isymdiff, ll, NN, ndofgl, pvol -REAL :: Fvec(1:Mvol-1), Xdof(1:Mvol-1) -REAL, allocatable :: oRbc(:,:), oZbs(:,:), oRbs(:,:), oZbc(:,:) ! original geometry; -REAL, allocatable :: idBB(:,:), iforce(:,:), iposition(:,:) -CHARACTER :: packorunpack +integer :: isymdiff, ll, NN, ndofgl, pvol +real(wp) :: Fvec(1:Mvol-1), Xdof(1:Mvol-1) +real(wp), allocatable :: oRbc(:,:), oZbs(:,:), oRbs(:,:), oZbc(:,:) ! original geometry; +real(wp), allocatable :: idBB(:,:), iforce(:,:), iposition(:,:) +character :: packorunpack #endif @@ -1994,7 +2618,12 @@ subroutine hessian3D_dFFdRZ(lvol, idof, innout, issym, irz, ii, dBB, XX, YY, len ! ----------------------------------- ideriv = 0; iflag=0 - WCALL( dfp200, lforce, (lvol, iocons, ideriv, Ntz, dBB, XX, YY, length, DDl, MMl,iflag) ) + + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call lforce(lvol, iocons, ideriv, Ntz, dBB, XX, YY, length, DDl, MMl,iflag) + cpuo = MPI_WTIME() + ! hessian_dFFdRZ CONSTRUCTION @@ -2004,10 +2633,21 @@ subroutine hessian3D_dFFdRZ(lvol, idof, innout, issym, irz, ii, dBB, XX, YY, len ! --------------------- ideriv = -1; iflag=1 - WCALL( dfp200, lforce, (lvol, iocons, ideriv, Ntz, dBB, XX, YY, length, DDl, MMl, iflag) ) + + cput = MPI_WTIME() + Tdfp200 = Tdfp200 + ( cput-cpuo ) + call lforce(lvol, iocons, ideriv, Ntz, dBB, XX, YY, length, DDl, MMl, iflag) + cpuo = MPI_WTIME() + ! Add derivatives of pressure as well - FATAL( dfp200, vvolume(lvol).lt.small, shall divide by vvolume(lvol)**(gamma+one) ) + + if( vvolume(lvol).lt.small ) then + write(6,'("dfp200 : fatal : myid=",i3," ; vvolume(lvol).lt.small ; shall divide by vvolume(lvol)**(gamma+one) ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "dfp200 : vvolume(lvol).lt.small : shall divide by vvolume(lvol)**(gamma+one) ;" + endif + ! Derivatives of force wrt geometry; In real space. ijreal(1:Ntz) = - adiabatic(lvol) * pscale * gamma * dvolume / vvolume(lvol)**(gamma+one) + dBB(1:Ntz,-1) @@ -2129,7 +2769,13 @@ subroutine hessian3D_dFFdRZ(lvol, idof, innout, issym, irz, ii, dBB, XX, YY, len dII(1:Ntz) = zero ! no angle/spectral width constraint #ifdef DEBUG - FATAL( dfp200, idoc.ne.LGdof, counting error ) + + if( idoc.ne.LGdof ) then + write(6,'("dfp200 : fatal : myid=",i3," ; idoc.ne.LGdof ; counting error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "dfp200 : idoc.ne.LGdof : counting error ;" + endif + #endif enddo ! end of do iocons; diff --git a/src/global.f90 b/src/global.F90 similarity index 53% rename from src/global.f90 rename to src/global.F90 index d87d1884..ef53fd4b 100644 --- a/src/global.f90 +++ b/src/global.F90 @@ -34,39 +34,39 @@ !> \ingroup grp_global !> \brief some constants used throughout the code module constants - + use mod_kinds, only: wp => dp implicit none - REAL, parameter :: zero = 0.0 !< 0 - REAL, parameter :: one = 1.0 !< 1 - REAL, parameter :: two = 2.0 !< 2 - REAL, parameter :: three = 3.0 !< 3 - REAL, parameter :: four = 4.0 !< 4 - REAL, parameter :: five = 5.0 !< 5 - REAL, parameter :: six = 6.0 !< 6 - REAL, parameter :: seven = 7.0 !< 7 - REAL, parameter :: eight = 8.0 !< 8 - REAL, parameter :: nine = 9.0 !< 9 - REAL, parameter :: ten = 10.0 !< 10 - - REAL, parameter :: eleven = 11.0 !< 11 - REAL, parameter :: twelve = 12.0 !< 12 - - REAL, parameter :: hundred = 100.0 !< 100 - REAL, parameter :: thousand = 1000.0 !< 1000 - - REAL, parameter :: half = one / two !< 1/2 - REAL, parameter :: third = one / three !< 1/3 - REAL, parameter :: quart = one / four !< 1/4 - REAL, parameter :: fifth = one / five !< 1/5 - REAL, parameter :: sixth = one / six !< 1/6 - - REAL, parameter :: pi2 = 6.28318530717958623 !< \f$2\pi\f$ - REAL, parameter :: pi = pi2 / two !< \f$\pi\f$ - REAL, parameter :: mu0 = 2.0E-07 * pi2 !< \f$4\pi\cdot10^{-7}\f$ - REAL, parameter :: goldenmean = 1.618033988749895 !< golden mean = \f$( 1 + \sqrt 5 ) / 2\f$ ; - - REAL, parameter :: version = 3.20 !< version of SPEC + real(wp), parameter :: zero = 0.0 !< 0 + real(wp), parameter :: one = 1.0 !< 1 + real(wp), parameter :: two = 2.0 !< 2 + real(wp), parameter :: three = 3.0 !< 3 + real(wp), parameter :: four = 4.0 !< 4 + real(wp), parameter :: five = 5.0 !< 5 + real(wp), parameter :: six = 6.0 !< 6 + real(wp), parameter :: seven = 7.0 !< 7 + real(wp), parameter :: eight = 8.0 !< 8 + real(wp), parameter :: nine = 9.0 !< 9 + real(wp), parameter :: ten = 10.0 !< 10 + + real(wp), parameter :: eleven = 11.0 !< 11 + real(wp), parameter :: twelve = 12.0 !< 12 + + real(wp), parameter :: hundred = 100.0 !< 100 + real(wp), parameter :: thousand = 1000.0 !< 1000 + + real(wp), parameter :: half = one / two !< 1/2 + real(wp), parameter :: third = one / three !< 1/3 + real(wp), parameter :: quart = one / four !< 1/4 + real(wp), parameter :: fifth = one / five !< 1/5 + real(wp), parameter :: sixth = one / six !< 1/6 + + real(wp), parameter :: pi2 = 6.28318530717958623 !< \f$2\pi\f$ + real(wp), parameter :: pi = pi2 / two !< \f$\pi\f$ + real(wp), parameter :: mu0 = 2.0E-07 * pi2 !< \f$4\pi\cdot10^{-7}\f$ + real(wp), parameter :: goldenmean = 1.618033988749895 !< golden mean = \f$( 1 + \sqrt 5 ) / 2\f$ ; + + real(wp), parameter :: version = 3.20 !< version of SPEC end module constants @@ -75,14 +75,14 @@ end module constants !> \brief platform-dependant numerical resolution !> \ingroup grp_global module numerical - + use mod_kinds, only: wp => dp implicit none - REAL, parameter :: machprec = 1.11e-16 !< machine precision: 0.5*epsilon(one) for 64 bit double precision - REAL, parameter :: vsmall = 100*machprec !< very small number - REAL, parameter :: small = 10000*machprec !< small number - REAL, parameter :: sqrtmachprec = sqrt(machprec) !< square root of machine precision - REAL, parameter :: logtolerance = 1.0e-32 !< this is used to avoid taking alog10(zero); see e.g. dforce; + real(wp), parameter :: machprec = 1.11e-16 !< machine precision: 0.5*epsilon(one) for 64 bit double precision + real(wp), parameter :: vsmall = 100*machprec !< very small number + real(wp), parameter :: small = 10000*machprec !< small number + real(wp), parameter :: sqrtmachprec = sqrt(machprec) !< square root of machine precision + real(wp), parameter :: logtolerance = 1.0e-32 !< this is used to avoid taking alog10(zero); see e.g. dforce; end module numerical @@ -91,27 +91,27 @@ end module numerical !> \brief central definition of file units to avoid conflicts !> \ingroup grp_global module fileunits - + use mod_kinds, only: wp => dp implicit none - INTEGER :: iunit = 10 !< input; used in global/readin:ext.sp, global/wrtend:ext.sp.end - INTEGER :: ounit = 6 !< screen output; - INTEGER :: gunit = 13 !< wall geometry; used in wa00aa + integer :: iunit = 10 !< input; used in global/readin:ext.sp, global/wrtend:ext.sp.end + integer :: ounit = 6 !< screen output; + integer :: gunit = 13 !< wall geometry; used in wa00aa - INTEGER :: aunit = 11 !< vector potential; used in ra00aa:.ext.AtAzmn; - INTEGER :: dunit = 12 !< derivative matrix; used in newton:.ext.GF; - INTEGER :: hunit = 14 !< eigenvalues of Hessian; under re-construction; - INTEGER :: munit = 14 !< matrix elements of Hessian; - INTEGER :: lunit = 20 !< local unit; used in lunit+myid: pp00aa:.ext.poincare,.ext.transform; - INTEGER :: vunit = 15 !< for examination of adaptive quadrature; used in casing:.ext.vcint; + integer :: aunit = 11 !< vector potential; used in ra00aa:.ext.AtAzmn; + integer :: dunit = 12 !< derivative matrix; used in newton:.ext.GF; + integer :: hunit = 14 !< eigenvalues of Hessian; under re-construction; + integer :: munit = 14 !< matrix elements of Hessian; + integer :: lunit = 20 !< local unit; used in lunit+myid: pp00aa:.ext.poincare,.ext.transform; + integer :: vunit = 15 !< for examination of adaptive quadrature; used in casing:.ext.vcint; contains subroutine mute(action) implicit none - INTEGER,intent(in) :: action - INTEGER, parameter :: iopen = 1, iclose = 0, null = 37 - INTEGER :: ios + integer,intent(in) :: action + integer, parameter :: iopen = 1, iclose = 0, null = 37 + integer :: ios character(len=*), parameter :: nullfile="/dev/null" ! open a tmp file for screen output @@ -131,61 +131,61 @@ end module fileunits !> \brief timing variables !> \ingroup grp_global module cputiming - - REAL :: Tmanual = 0.0, manualT = 0.0 - REAL :: Trzaxis = 0.0, rzaxisT = 0.0 - REAL :: Tpackxi = 0.0, packxiT = 0.0 - REAL :: Tvolume = 0.0, volumeT = 0.0 - REAL :: Tcoords = 0.0, coordsT = 0.0 - REAL :: Tbasefn = 0.0, basefnT = 0.0 - REAL :: Tmemory = 0.0, memoryT = 0.0 - REAL :: Tmetrix = 0.0, metrixT = 0.0 - REAL :: Tma00aa = 0.0, ma00aaT = 0.0 - REAL :: Tmatrix = 0.0, matrixT = 0.0 - REAL :: Tspsmat = 0.0, spsmatT = 0.0 - REAL :: Tspsint = 0.0, spsintT = 0.0 - REAL :: Tmp00ac = 0.0, mp00acT = 0.0 - REAL :: Tma02aa = 0.0, ma02aaT = 0.0 - REAL :: Tpackab = 0.0, packabT = 0.0 - REAL :: Ttr00ab = 0.0, tr00abT = 0.0 - REAL :: Tcurent = 0.0, curentT = 0.0 - REAL :: Tdf00ab = 0.0, df00abT = 0.0 - REAL :: Tlforce = 0.0, lforceT = 0.0 - REAL :: Tintghs = 0.0, intghsT = 0.0 - REAL :: Tmtrxhs = 0.0, mtrxhsT = 0.0 - REAL :: Tlbpol = 0.0, lbpolT = 0.0 - REAL :: Tbrcast = 0.0, brcastT = 0.0 - REAL :: Tdfp100 = 0.0, dfp100T = 0.0 - REAL :: Tdfp200 = 0.0, dfp200T = 0.0 - REAL :: Tdforce = 0.0, dforceT = 0.0 - REAL :: Tnewton = 0.0, newtonT = 0.0 - REAL :: Tcasing = 0.0, casingT = 0.0 - REAL :: Tbnorml = 0.0, bnormlT = 0.0 - REAL :: Tjo00aa = 0.0, jo00aaT = 0.0 - REAL :: Tpp00aa = 0.0, pp00aaT = 0.0 - REAL :: Tpp00ab = 0.0, pp00abT = 0.0 - REAL :: Tbfield = 0.0, bfieldT = 0.0 - REAL :: Tstzxyz = 0.0, stzxyzT = 0.0 - REAL :: Thesian = 0.0, hesianT = 0.0 - REAL :: Tra00aa = 0.0, ra00aaT = 0.0 - REAL :: Tnumrec = 0.0, numrecT = 0.0 - REAL :: Tdcuhre = 0.0, dcuhreT = 0.0 - REAL :: Tminpack = 0.0, minpackT = 0.0 - REAL :: Tiqpack = 0.0, iqpackT = 0.0 - REAL :: Trksuite = 0.0, rksuiteT = 0.0 - REAL :: Ti1mach = 0.0, i1machT = 0.0 - REAL :: Td1mach = 0.0, d1machT = 0.0 - REAL :: Tilut = 0.0, ilutT = 0.0 - REAL :: Titers = 0.0, itersT = 0.0 - REAL :: Tsphdf5 = 0.0, sphdf5T = 0.0 - REAL :: Tpreset = 0.0, presetT = 0.0 - REAL :: Tglobal = 0.0, globalT = 0.0 - REAL :: Txspech = 0.0, xspechT = 0.0 - REAL :: Tinputlist = 0.0, inputlistT = 0.0 - - REAL :: Treadin = 0.0 + use mod_kinds, only: wp => dp + real(wp) :: Tmanual = 0.0, manualT = 0.0 + real(wp) :: Trzaxis = 0.0, rzaxisT = 0.0 + real(wp) :: Tpackxi = 0.0, packxiT = 0.0 + real(wp) :: Tvolume = 0.0, volumeT = 0.0 + real(wp) :: Tcoords = 0.0, coordsT = 0.0 + real(wp) :: Tbasefn = 0.0, basefnT = 0.0 + real(wp) :: Tmemory = 0.0, memoryT = 0.0 + real(wp) :: Tmetrix = 0.0, metrixT = 0.0 + real(wp) :: Tma00aa = 0.0, ma00aaT = 0.0 + real(wp) :: Tmatrix = 0.0, matrixT = 0.0 + real(wp) :: Tspsmat = 0.0, spsmatT = 0.0 + real(wp) :: Tspsint = 0.0, spsintT = 0.0 + real(wp) :: Tmp00ac = 0.0, mp00acT = 0.0 + real(wp) :: Tma02aa = 0.0, ma02aaT = 0.0 + real(wp) :: Tpackab = 0.0, packabT = 0.0 + real(wp) :: Ttr00ab = 0.0, tr00abT = 0.0 + real(wp) :: Tcurent = 0.0, curentT = 0.0 + real(wp) :: Tdf00ab = 0.0, df00abT = 0.0 + real(wp) :: Tlforce = 0.0, lforceT = 0.0 + real(wp) :: Tintghs = 0.0, intghsT = 0.0 + real(wp) :: Tmtrxhs = 0.0, mtrxhsT = 0.0 + real(wp) :: Tlbpol = 0.0, lbpolT = 0.0 + real(wp) :: Tbrcast = 0.0, brcastT = 0.0 + real(wp) :: Tdfp100 = 0.0, dfp100T = 0.0 + real(wp) :: Tdfp200 = 0.0, dfp200T = 0.0 + real(wp) :: Tdforce = 0.0, dforceT = 0.0 + real(wp) :: Tnewton = 0.0, newtonT = 0.0 + real(wp) :: Tcasing = 0.0, casingT = 0.0 + real(wp) :: Tbnorml = 0.0, bnormlT = 0.0 + real(wp) :: Tjo00aa = 0.0, jo00aaT = 0.0 + real(wp) :: Tpp00aa = 0.0, pp00aaT = 0.0 + real(wp) :: Tpp00ab = 0.0, pp00abT = 0.0 + real(wp) :: Tbfield = 0.0, bfieldT = 0.0 + real(wp) :: Tstzxyz = 0.0, stzxyzT = 0.0 + real(wp) :: Thesian = 0.0, hesianT = 0.0 + real(wp) :: Tra00aa = 0.0, ra00aaT = 0.0 + real(wp) :: Tnumrec = 0.0, numrecT = 0.0 + real(wp) :: Tdcuhre = 0.0, dcuhreT = 0.0 + real(wp) :: Tminpack = 0.0, minpackT = 0.0 + real(wp) :: Tiqpack = 0.0, iqpackT = 0.0 + real(wp) :: Trksuite = 0.0, rksuiteT = 0.0 + real(wp) :: Ti1mach = 0.0, i1machT = 0.0 + real(wp) :: Td1mach = 0.0, d1machT = 0.0 + real(wp) :: Tilut = 0.0, ilutT = 0.0 + real(wp) :: Titers = 0.0, itersT = 0.0 + real(wp) :: Tsphdf5 = 0.0, sphdf5T = 0.0 + real(wp) :: Tpreset = 0.0, presetT = 0.0 + real(wp) :: Tglobal = 0.0, globalT = 0.0 + real(wp) :: Txspech = 0.0, xspechT = 0.0 + real(wp) :: Tinputlist = 0.0, inputlistT = 0.0 + + real(wp) :: Treadin = 0.0 ! REAL :: Twritin = 0.0 ! redundant; - REAL :: Twrtend = 0.0 + real(wp) :: Twrtend = 0.0 end module cputiming @@ -194,26 +194,26 @@ end module cputiming !> \brief type definitions for custom datatypes !> \ingroup grp_global module typedefns - + use mod_kinds, only: wp => dp !> \brief used for quantities which have different resolutions in different volumes, e.g. the vector potential type subgrid - REAL, allocatable :: s(:) !< coefficients - INTEGER, allocatable :: i(:) !< indices + real(wp), allocatable :: s(:) !< coefficients + integer, allocatable :: i(:) !< indices end type subgrid type MatrixLU - REAL, allocatable :: mat(:,:) - INTEGER, allocatable :: ipivot(:) + real(wp), allocatable :: mat(:,:) + integer, allocatable :: ipivot(:) end type MatrixLU !> \brief \f${\rm d}\mathbf{B}/{\rm d}\mathbf{X}\f$ (?) type derivative LOGICAL :: L !< what is this? - INTEGER :: vol !< Used in coords(); required for global constraint force gradient evaluation - INTEGER :: innout !< what is this? - INTEGER :: ii !< what is this? - INTEGER :: irz !< what is this? - INTEGER :: issym !< what is this? + integer :: vol !< Used in coords(); required for global constraint force gradient evaluation + integer :: innout !< what is this? + integer :: ii !< what is this? + integer :: irz !< what is this? + integer :: issym !< what is this? end type derivative end module typedefns @@ -222,7 +222,7 @@ end module typedefns !> \brief global variable storage used as "workspace" throughout the code module allglobal - + use mod_kinds, only: wp => dp use constants use typedefns @@ -230,44 +230,44 @@ module allglobal !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!``-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - INTEGER :: myid !< MPI rank of current CPU - INTEGER :: ncpu !< number of MPI tasks - INTEGER :: IsMyVolumeValue !< flag to indicate if a CPU is operating on its assigned volume - REAL :: cpus !< initial time - INTEGER :: MPI_COMM_SPEC !< SPEC MPI communicator + integer :: myid !< MPI rank of current CPU + integer :: ncpu !< number of MPI tasks + integer :: IsMyVolumeValue !< flag to indicate if a CPU is operating on its assigned volume + real(wp) :: cpus !< initial time + integer :: MPI_COMM_SPEC !< SPEC MPI communicator LOGICAL :: skip_write = .false. ! flag to disable any HDF5-related calls - REAL :: pi2nfp ! pi2/nfp ; assigned in readin; - REAL :: pi2pi2nfp - REAL :: pi2pi2nfphalf - REAL :: pi2pi2nfpquart + real(wp) :: pi2nfp ! pi2/nfp ; assigned in readin; + real(wp) :: pi2pi2nfp + real(wp) :: pi2pi2nfphalf + real(wp) :: pi2pi2nfpquart !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - CHARACTER(LEN=1000) :: ext ! extension of input filename, i.e., "G3V01L1Fi.001" for an input file G3V01L1Fi.001.sp + character :: ext ! extension of input filename, i.e., "G3V01L1Fi.001" for an input file G3V01L1Fi.001.sp - REAL :: ForceErr !< total force-imbalance - REAL :: Energy !< MHD energy + real(wp) :: ForceErr !< total force-imbalance + real(wp) :: Energy !< MHD energy - REAL , allocatable :: IPDt(:), IPDtDpf(:,:) !< Toroidal pressure-driven current + real(wp) , allocatable :: IPDt(:), IPDtDpf(:,:) !< Toroidal pressure-driven current - INTEGER :: Mvol + integer :: Mvol LOGICAL :: YESstellsym !< internal shorthand copies of Istellsym, which is an integer input; LOGICAL :: NOTstellsym !< internal shorthand copies of Istellsym, which is an integer input; LOGICAL :: YESMatrixFree, NOTMatrixFree !< to use matrix-free method or not - REAL , allocatable :: cheby(:,:) !< local workspace for evaluation of Chebychev polynomials - REAL , allocatable :: zernike(:,:,:) !< local workspace for evaluation of Zernike polynomials + real(wp) , allocatable :: cheby(:,:) !< local workspace for evaluation of Chebychev polynomials + real(wp) , allocatable :: zernike(:,:,:) !< local workspace for evaluation of Zernike polynomials - REAL , allocatable :: TT(:,:,:) !< derivatives of Chebyshev polynomials at the inner and outer interfaces; - REAL , allocatable :: RTT(:,:,:,:) !< derivatives of Zernike polynomials at the inner and outer interfaces; + real(wp) , allocatable :: TT(:,:,:) !< derivatives of Chebyshev polynomials at the inner and outer interfaces; + real(wp) , allocatable :: RTT(:,:,:,:) !< derivatives of Zernike polynomials at the inner and outer interfaces; - REAL , allocatable :: RTM(:,:) !< \f$r^m\f$ term of Zernike polynomials at the origin - REAL , allocatable :: ZernikeDof(:) !< Zernike degree of freedom for each \f$m\f$ + real(wp) , allocatable :: RTM(:,:) !< \f$r^m\f$ term of Zernike polynomials at the origin + real(wp) , allocatable :: ZernikeDof(:) !< Zernike degree of freedom for each \f$m\f$ !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -275,9 +275,9 @@ module allglobal !> Enhanced resolution is required for the metric elements, \f$g_{ij}/\sqrt g\f$, which is given by mne, ime, and ine. !> The Fourier resolution here is determined by \c lMpol=2*Mpol and \c lNtor=2*Ntor. !> @{ - INTEGER :: mne !< enhanced resolution for metric elements - INTEGER, allocatable :: ime(:) !< enhanced poloidal mode numbers for metric elements - INTEGER, allocatable :: ine(:) !< enhanced toroidal mode numbers for metric elements + integer :: mne !< enhanced resolution for metric elements + integer, allocatable :: ime(:) !< enhanced poloidal mode numbers for metric elements + integer, allocatable :: ine(:) !< enhanced toroidal mode numbers for metric elements !> @} !> \addtogroup grp_enh_res_sfl Enhanced resolution for transformation to straight-field line angle @@ -285,19 +285,19 @@ module allglobal !> which is given by mns, ims and ins. !> The Fourier resolution here is determined by \c iMpol and \c iNtor. !> @{ - INTEGER :: mns !< enhanced resolution for straight field line transformation - INTEGER, allocatable :: ims(:) !< enhanced poloidal mode numbers for straight field line transformation - INTEGER, allocatable :: ins(:) !< enhanced toroidal mode numbers for straight field line transformation + integer :: mns !< enhanced resolution for straight field line transformation + integer, allocatable :: ims(:) !< enhanced poloidal mode numbers for straight field line transformation + integer, allocatable :: ins(:) !< enhanced toroidal mode numbers for straight field line transformation !> @} - INTEGER :: lMpol !< what is this? - INTEGER :: lNtor !< what is this? - INTEGER :: sMpol !< what is this? - INTEGER :: sNtor !< what is this? + integer :: lMpol !< what is this? + integer :: lNtor !< what is this? + integer :: sMpol !< what is this? + integer :: sNtor !< what is this? !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - REAL :: xoffset = 1.0 !< used to normalize NAG routines (which ones exacly where?) + real(wp) :: xoffset = 1.0 !< used to normalize NAG routines (which ones exacly where?) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -305,7 +305,7 @@ module allglobal LOGICAL :: IconstraintOK !< Used to break iteration loops of slaves in the global constraint minimization. - REAL , allocatable :: beltramierror(:,:) !< to store the integral of |curlB-mu*B| computed by jo00aa; + real(wp) , allocatable :: beltramierror(:,:) !< to store the integral of |curlB-mu*B| computed by jo00aa; !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -314,20 +314,20 @@ module allglobal !> !> \addtogroup grp_fourier_repr Fourier representation !> @{ - INTEGER :: mn !< total number of Fourier harmonics for coordinates/fields; calculated from Mpol, Ntor in readin() - INTEGER, allocatable :: im(:) !< poloidal mode numbers for Fourier representation - INTEGER, allocatable :: in(:) !< toroidal mode numbers for Fourier representation + integer :: mn !< total number of Fourier harmonics for coordinates/fields; calculated from Mpol, Ntor in readin() + integer, allocatable :: im(:) !< poloidal mode numbers for Fourier representation + integer, allocatable :: in(:) !< toroidal mode numbers for Fourier representation - REAL, allocatable :: halfmm(:) !< I saw this already somewhere... - REAL, allocatable :: regumm(:) !< I saw this already somewhere... + real(wp), allocatable :: halfmm(:) !< I saw this already somewhere... + real(wp), allocatable :: regumm(:) !< I saw this already somewhere... - REAL :: Rscale !< no idea - REAL, allocatable :: psifactor(:,:) !< no idea - REAL, allocatable :: inifactor(:,:) !< no idea + real(wp) :: Rscale !< no idea + real(wp), allocatable :: psifactor(:,:) !< no idea + real(wp), allocatable :: inifactor(:,:) !< no idea - REAL, allocatable :: BBweight(:) !< weight on force-imbalance harmonics; used in dforce() + real(wp), allocatable :: BBweight(:) !< weight on force-imbalance harmonics; used in dforce() - REAL, allocatable :: mmpp(:) !< spectral condensation factors + real(wp), allocatable :: mmpp(:) !< spectral condensation factors !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! !> @} @@ -336,37 +336,37 @@ module allglobal !> The Fourier harmonics of the interfaces are contained in \c iRbc(1:mn,0:Mvol) and \c iZbs(1:mn,0:Mvol), where !> \c iRbc(l,j), \c iZbs(l,j) contains the Fourier harmonics, \f$R_j\f$, \f$Z_j\f$, of the \f$l\f$-th interface. !> @{ - REAL, allocatable :: iRbc(:,:) !< cosine R harmonics of interface surface geometry; stellarator symmetric - REAL, allocatable :: iZbs(:,:) !< sine Z harmonics of interface surface geometry; stellarator symmetric - REAL, allocatable :: iRbs(:,:) !< sine R harmonics of interface surface geometry; non-stellarator symmetric - REAL, allocatable :: iZbc(:,:) !< cosine Z harmonics of interface surface geometry; non-stellarator symmetric - - REAL, allocatable :: dRbc(:,:) !< cosine R harmonics of interface surface geometry; stellarator symmetric; linear deformation - REAL, allocatable :: dZbs(:,:) !< sine Z harmonics of interface surface geometry; stellarator symmetric; linear deformation - REAL, allocatable :: dRbs(:,:) !< sine R harmonics of interface surface geometry; non-stellarator symmetric; linear deformation - REAL, allocatable :: dZbc(:,:) !< cosine Z harmonics of interface surface geometry; non-stellarator symmetric; linear deformation - - REAL, allocatable :: iRij(:,:) !< interface surface geometry; real space - REAL, allocatable :: iZij(:,:) !< interface surface geometry; real space - REAL, allocatable :: dRij(:,:) !< interface surface geometry; real space - REAL, allocatable :: dZij(:,:) !< interface surface geometry; real space - REAL, allocatable :: tRij(:,:) !< interface surface geometry; real space - REAL, allocatable :: tZij(:,:) !< interface surface geometry; real space - - REAL, allocatable :: iVns(:) !< sine harmonics of vacuum normal magnetic field on interfaces; stellarator symmetric - REAL, allocatable :: iBns(:) !< sine harmonics of plasma normal magnetic field on interfaces; stellarator symmetric - REAL, allocatable :: iVnc(:) !< cosine harmonics of vacuum normal magnetic field on interfaces; non-stellarator symmetric - REAL, allocatable :: iBnc(:) !< cosine harmonics of plasma normal magnetic field on interfaces; non-stellarator symmetric - - REAL, allocatable :: lRbc(:) !< local workspace - REAL, allocatable :: lZbs(:) !< local workspace - REAL, allocatable :: lRbs(:) !< local workspace - REAL, allocatable :: lZbc(:) !< local workspace + real(wp), allocatable :: iRbc(:,:) !< cosine R harmonics of interface surface geometry; stellarator symmetric + real(wp), allocatable :: iZbs(:,:) !< sine Z harmonics of interface surface geometry; stellarator symmetric + real(wp), allocatable :: iRbs(:,:) !< sine R harmonics of interface surface geometry; non-stellarator symmetric + real(wp), allocatable :: iZbc(:,:) !< cosine Z harmonics of interface surface geometry; non-stellarator symmetric + + real(wp), allocatable :: dRbc(:,:) !< cosine R harmonics of interface surface geometry; stellarator symmetric; linear deformation + real(wp), allocatable :: dZbs(:,:) !< sine Z harmonics of interface surface geometry; stellarator symmetric; linear deformation + real(wp), allocatable :: dRbs(:,:) !< sine R harmonics of interface surface geometry; non-stellarator symmetric; linear deformation + real(wp), allocatable :: dZbc(:,:) !< cosine Z harmonics of interface surface geometry; non-stellarator symmetric; linear deformation + + real(wp), allocatable :: iRij(:,:) !< interface surface geometry; real space + real(wp), allocatable :: iZij(:,:) !< interface surface geometry; real space + real(wp), allocatable :: dRij(:,:) !< interface surface geometry; real space + real(wp), allocatable :: dZij(:,:) !< interface surface geometry; real space + real(wp), allocatable :: tRij(:,:) !< interface surface geometry; real space + real(wp), allocatable :: tZij(:,:) !< interface surface geometry; real space + + real(wp), allocatable :: iVns(:) !< sine harmonics of vacuum normal magnetic field on interfaces; stellarator symmetric + real(wp), allocatable :: iBns(:) !< sine harmonics of plasma normal magnetic field on interfaces; stellarator symmetric + real(wp), allocatable :: iVnc(:) !< cosine harmonics of vacuum normal magnetic field on interfaces; non-stellarator symmetric + real(wp), allocatable :: iBnc(:) !< cosine harmonics of plasma normal magnetic field on interfaces; non-stellarator symmetric + + real(wp), allocatable :: lRbc(:) !< local workspace + real(wp), allocatable :: lZbs(:) !< local workspace + real(wp), allocatable :: lRbs(:) !< local workspace + real(wp), allocatable :: lZbc(:) !< local workspace ! local array used for reading interface Fourier harmonics from file; - INTEGER :: num_modes - INTEGER, allocatable :: mmRZRZ(:), nnRZRZ(:) - REAL, allocatable :: allRZRZ(:,:,:) + integer :: num_modes + integer, allocatable :: mmRZRZ(:), nnRZRZ(:) + real(wp), allocatable :: allRZRZ(:,:,:) !> @} !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -380,69 +380,69 @@ module allglobal !> \c sg(0:3,Ntz), which contains the Jacobian and its derivatives; !> and \c guv(0:6,0:3,1:Ntz), which contains the metric elements and their derivatives. !> @{ - INTEGER :: Nt !< discrete resolution along \f$\theta\f$ of grid in real space - INTEGER :: Nz !< discrete resolution along \f$\zeta\f$ of grid in real space - INTEGER :: Ntz !< discrete resolution; Ntz=Nt*Nz shorthand - INTEGER :: hNt !< discrete resolution; Ntz=Nt*Nz shorthand - INTEGER :: hNz !< discrete resolution; Ntz=Nt*Nz shorthand - REAL :: soNtz !< one / sqrt (one*Ntz); shorthand - - REAL , allocatable :: Rij(:,:,:) !< real-space grid; R - REAL , allocatable :: Zij(:,:,:) !< real-space grid; Z - REAL , allocatable :: Xij(:,:,:) !< what is this? - REAL , allocatable :: Yij(:,:,:) !< what is this? - REAL , allocatable :: sg(:,:) !< real-space grid; jacobian and its derivatives - REAL , allocatable :: guvij(:,:,:,:) !< real-space grid; metric elements - REAL , allocatable :: gvuij(:,:,:) !< real-space grid; metric elements (?); 10 Dec 15; - REAL , allocatable :: guvijsave(:,:,:,:) !< what is this? - - INTEGER, allocatable :: ki(:,:) !< identification of Fourier modes - INTEGER, allocatable :: kijs(:,:,:) !< identification of Fourier modes - INTEGER, allocatable :: kija(:,:,:) !< identification of Fourier modes - - INTEGER, allocatable :: iotakkii(:) !< identification of Fourier modes - INTEGER, allocatable :: iotaksub(:,:) !< identification of Fourier modes - INTEGER, allocatable :: iotakadd(:,:) !< identification of Fourier modes - INTEGER, allocatable :: iotaksgn(:,:) !< identification of Fourier modes - - REAL , allocatable :: efmn(:) !< Fourier harmonics; dummy workspace - REAL , allocatable :: ofmn(:) !< Fourier harmonics; dummy workspace - REAL , allocatable :: cfmn(:) !< Fourier harmonics; dummy workspace - REAL , allocatable :: sfmn(:) !< Fourier harmonics; dummy workspace - REAL , allocatable :: evmn(:) !< Fourier harmonics; dummy workspace - REAL , allocatable :: odmn(:) !< Fourier harmonics; dummy workspace - REAL , allocatable :: comn(:) !< Fourier harmonics; dummy workspace - REAL , allocatable :: simn(:) !< Fourier harmonics; dummy workspace - - REAL , allocatable :: ijreal(:) !< what is this ? - REAL , allocatable :: ijimag(:) !< what is this ? - REAL , allocatable :: jireal(:) !< what is this ? - REAL , allocatable :: jiimag(:) !< what is this ? - - REAL , allocatable :: jkreal(:) !< what is this ? - REAL , allocatable :: jkimag(:) !< what is this ? - REAL , allocatable :: kjreal(:) !< what is this ? - REAL , allocatable :: kjimag(:) !< what is this ? - - REAL , allocatable :: Bsupumn(:,:,:) !< tangential field on interfaces; \f$\theta\f$-component; required for virtual casing construction of field; 11 Oct 12 - REAL , allocatable :: Bsupvmn(:,:,:) !< tangential field on interfaces; \f$\zeta\f$ -component; required for virtual casing construction of field; 11 Oct 12 - -!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - - REAL , allocatable :: goomne(:,:) !< described in preset() - REAL , allocatable :: goomno(:,:) !< described in preset() - REAL , allocatable :: gssmne(:,:) !< described in preset() - REAL , allocatable :: gssmno(:,:) !< described in preset() - REAL , allocatable :: gstmne(:,:) !< described in preset() - REAL , allocatable :: gstmno(:,:) !< described in preset() - REAL , allocatable :: gszmne(:,:) !< described in preset() - REAL , allocatable :: gszmno(:,:) !< described in preset() - REAL , allocatable :: gttmne(:,:) !< described in preset() - REAL , allocatable :: gttmno(:,:) !< described in preset() - REAL , allocatable :: gtzmne(:,:) !< described in preset() - REAL , allocatable :: gtzmno(:,:) !< described in preset() - REAL , allocatable :: gzzmne(:,:) !< described in preset() - REAL , allocatable :: gzzmno(:,:) !< described in preset() + integer :: Nt !< discrete resolution along \f$\theta\f$ of grid in real space + integer :: Nz !< discrete resolution along \f$\zeta\f$ of grid in real space + integer :: Ntz !< discrete resolution; Ntz=Nt*Nz shorthand + integer :: hNt !< discrete resolution; Ntz=Nt*Nz shorthand + integer :: hNz !< discrete resolution; Ntz=Nt*Nz shorthand + real(wp) :: soNtz !< one / sqrt (one*Ntz); shorthand + + real(wp) , allocatable :: Rij(:,:,:) !< real-space grid; R + real(wp) , allocatable :: Zij(:,:,:) !< real-space grid; Z + real(wp) , allocatable :: Xij(:,:,:) !< what is this? + real(wp) , allocatable :: Yij(:,:,:) !< what is this? + real(wp) , allocatable :: sg(:,:) !< real-space grid; jacobian and its derivatives + real(wp) , allocatable :: guvij(:,:,:,:) !< real-space grid; metric elements + real(wp) , allocatable :: gvuij(:,:,:) !< real-space grid; metric elements (?); 10 Dec 15; + real(wp) , allocatable :: guvijsave(:,:,:,:) !< what is this? + + integer, allocatable :: ki(:,:) !< identification of Fourier modes + integer, allocatable :: kijs(:,:,:) !< identification of Fourier modes + integer, allocatable :: kija(:,:,:) !< identification of Fourier modes + + integer, allocatable :: iotakkii(:) !< identification of Fourier modes + integer, allocatable :: iotaksub(:,:) !< identification of Fourier modes + integer, allocatable :: iotakadd(:,:) !< identification of Fourier modes + integer, allocatable :: iotaksgn(:,:) !< identification of Fourier modes + + real(wp) , allocatable :: efmn(:) !< Fourier harmonics; dummy workspace + real(wp) , allocatable :: ofmn(:) !< Fourier harmonics; dummy workspace + real(wp) , allocatable :: cfmn(:) !< Fourier harmonics; dummy workspace + real(wp) , allocatable :: sfmn(:) !< Fourier harmonics; dummy workspace + real(wp) , allocatable :: evmn(:) !< Fourier harmonics; dummy workspace + real(wp) , allocatable :: odmn(:) !< Fourier harmonics; dummy workspace + real(wp) , allocatable :: comn(:) !< Fourier harmonics; dummy workspace + real(wp) , allocatable :: simn(:) !< Fourier harmonics; dummy workspace + + real(wp) , allocatable :: ijreal(:) !< what is this ? + real(wp) , allocatable :: ijimag(:) !< what is this ? + real(wp) , allocatable :: jireal(:) !< what is this ? + real(wp) , allocatable :: jiimag(:) !< what is this ? + + real(wp) , allocatable :: jkreal(:) !< what is this ? + real(wp) , allocatable :: jkimag(:) !< what is this ? + real(wp) , allocatable :: kjreal(:) !< what is this ? + real(wp) , allocatable :: kjimag(:) !< what is this ? + + real(wp) , allocatable :: Bsupumn(:,:,:) !< tangential field on interfaces; \f$\theta\f$-component; required for virtual casing construction of field; 11 Oct 12 + real(wp) , allocatable :: Bsupvmn(:,:,:) !< tangential field on interfaces; \f$\zeta\f$ -component; required for virtual casing construction of field; 11 Oct 12 + +!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! + + real(wp) , allocatable :: goomne(:,:) !< described in preset() + real(wp) , allocatable :: goomno(:,:) !< described in preset() + real(wp) , allocatable :: gssmne(:,:) !< described in preset() + real(wp) , allocatable :: gssmno(:,:) !< described in preset() + real(wp) , allocatable :: gstmne(:,:) !< described in preset() + real(wp) , allocatable :: gstmno(:,:) !< described in preset() + real(wp) , allocatable :: gszmne(:,:) !< described in preset() + real(wp) , allocatable :: gszmno(:,:) !< described in preset() + real(wp) , allocatable :: gttmne(:,:) !< described in preset() + real(wp) , allocatable :: gttmno(:,:) !< described in preset() + real(wp) , allocatable :: gtzmne(:,:) !< described in preset() + real(wp) , allocatable :: gtzmno(:,:) !< described in preset() + real(wp) , allocatable :: gzzmne(:,:) !< described in preset() + real(wp) , allocatable :: gzzmno(:,:) !< described in preset() !> @} !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -450,56 +450,56 @@ module allglobal !> \addtogroup grp_chebychev_metric Volume-integrated Chebyshev-metrics !> These are allocated in dforce(), defined in ma00aa(), and are used in matrix() to construct the matrices. !> @{ - REAL, allocatable :: DToocc(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() - REAL, allocatable :: DToocs(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() - REAL, allocatable :: DToosc(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() - REAL, allocatable :: DTooss(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() - REAL, allocatable :: TTsscc(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() - REAL, allocatable :: TTsscs(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() - REAL, allocatable :: TTsssc(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() - REAL, allocatable :: TTssss(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() - REAL, allocatable :: TDstcc(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() - REAL, allocatable :: TDstcs(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() - REAL, allocatable :: TDstsc(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() - REAL, allocatable :: TDstss(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() - REAL, allocatable :: TDszcc(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() - REAL, allocatable :: TDszcs(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() - REAL, allocatable :: TDszsc(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() - REAL, allocatable :: TDszss(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() - REAL, allocatable :: DDttcc(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() - REAL, allocatable :: DDttcs(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() - REAL, allocatable :: DDttsc(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() - REAL, allocatable :: DDttss(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() - REAL, allocatable :: DDtzcc(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() - REAL, allocatable :: DDtzcs(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() - REAL, allocatable :: DDtzsc(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() - REAL, allocatable :: DDtzss(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() - REAL, allocatable :: DDzzcc(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() - REAL, allocatable :: DDzzcs(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() - REAL, allocatable :: DDzzsc(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() - REAL, allocatable :: DDzzss(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() - -!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - - REAL, allocatable :: Tsc(:,:) !< what is this? - REAL, allocatable :: Tss(:,:) !< what is this? - REAL, allocatable :: Dtc(:,:) !< what is this? - REAL, allocatable :: Dts(:,:) !< what is this? - REAL, allocatable :: Dzc(:,:) !< what is this? - REAL, allocatable :: Dzs(:,:) !< what is this? - REAL, allocatable :: Ttc(:,:) !< what is this? - REAL, allocatable :: Tzc(:,:) !< what is this? - REAL, allocatable :: Tts(:,:) !< what is this? - REAL, allocatable :: Tzs(:,:) !< what is this? - -!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - - REAL, allocatable :: dtflux(:) !< \f$\delta \psi_{toroidal}\f$ in each annulus - REAL, allocatable :: dpflux(:) !< \f$\delta \psi_{poloidal}\f$ in each annulus - -!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - - REAL, allocatable :: sweight(:) !< minimum poloidal length constraint weight + real(wp), allocatable :: DToocc(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() + real(wp), allocatable :: DToocs(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() + real(wp), allocatable :: DToosc(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() + real(wp), allocatable :: DTooss(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() + real(wp), allocatable :: TTsscc(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() + real(wp), allocatable :: TTsscs(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() + real(wp), allocatable :: TTsssc(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() + real(wp), allocatable :: TTssss(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() + real(wp), allocatable :: TDstcc(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() + real(wp), allocatable :: TDstcs(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() + real(wp), allocatable :: TDstsc(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() + real(wp), allocatable :: TDstss(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() + real(wp), allocatable :: TDszcc(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() + real(wp), allocatable :: TDszcs(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() + real(wp), allocatable :: TDszsc(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() + real(wp), allocatable :: TDszss(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() + real(wp), allocatable :: DDttcc(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() + real(wp), allocatable :: DDttcs(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() + real(wp), allocatable :: DDttsc(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() + real(wp), allocatable :: DDttss(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() + real(wp), allocatable :: DDtzcc(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() + real(wp), allocatable :: DDtzcs(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() + real(wp), allocatable :: DDtzsc(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() + real(wp), allocatable :: DDtzss(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() + real(wp), allocatable :: DDzzcc(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() + real(wp), allocatable :: DDzzcs(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() + real(wp), allocatable :: DDzzsc(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() + real(wp), allocatable :: DDzzss(:,:,:,:) !< volume-integrated Chebychev-metrics; see matrix() + +!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! + + real(wp), allocatable :: Tsc(:,:) !< what is this? + real(wp), allocatable :: Tss(:,:) !< what is this? + real(wp), allocatable :: Dtc(:,:) !< what is this? + real(wp), allocatable :: Dts(:,:) !< what is this? + real(wp), allocatable :: Dzc(:,:) !< what is this? + real(wp), allocatable :: Dzs(:,:) !< what is this? + real(wp), allocatable :: Ttc(:,:) !< what is this? + real(wp), allocatable :: Tzc(:,:) !< what is this? + real(wp), allocatable :: Tts(:,:) !< what is this? + real(wp), allocatable :: Tzs(:,:) !< what is this? + +!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! + + real(wp), allocatable :: dtflux(:) !< \f$\delta \psi_{toroidal}\f$ in each annulus + real(wp), allocatable :: dpflux(:) !< \f$\delta \psi_{poloidal}\f$ in each annulus + +!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! + + real(wp), allocatable :: sweight(:) !< minimum poloidal length constraint weight !> @} !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -524,34 +524,34 @@ module allglobal !> \c dAzo(0,i)%%s(l) \f$\equiv {\color{Cerulean}A_{\zeta ,o,i,l}}\f$ !> !> @{ - INTEGER, allocatable :: NAdof(:) !< degrees of freedom in Beltrami fields in each annulus - INTEGER, allocatable :: Nfielddof(:) !< degrees of freedom in Beltrami fields in each annulus, field only, no Lagrange multipliers + integer, allocatable :: NAdof(:) !< degrees of freedom in Beltrami fields in each annulus + integer, allocatable :: Nfielddof(:) !< degrees of freedom in Beltrami fields in each annulus, field only, no Lagrange multipliers type(subgrid), allocatable :: Ate(:,:,:) !< magnetic vector potential cosine Fourier harmonics; stellarator-symmetric type(subgrid), allocatable :: Aze(:,:,:) !< magnetic vector potential cosine Fourier harmonics; stellarator-symmetric type(subgrid), allocatable :: Ato(:,:,:) !< magnetic vector potential sine Fourier harmonics; non-stellarator-symmetric type(subgrid), allocatable :: Azo(:,:,:) !< magnetic vector potential sine Fourier harmonics; non-stellarator-symmetric - INTEGER , allocatable :: Lma(:,:) !< Lagrange multipliers (?) - INTEGER , allocatable :: Lmb(:,:) !< Lagrange multipliers (?) - INTEGER , allocatable :: Lmc(:,:) !< Lagrange multipliers (?) - INTEGER , allocatable :: Lmd(:,:) !< Lagrange multipliers (?) - INTEGER , allocatable :: Lme(:,:) !< Lagrange multipliers (?) - INTEGER , allocatable :: Lmf(:,:) !< Lagrange multipliers (?) - INTEGER , allocatable :: Lmg(:,:) !< Lagrange multipliers (?) - INTEGER , allocatable :: Lmh(:,:) !< Lagrange multipliers (?) - - REAL , allocatable :: Lmavalue(:,:) !< what is this? - REAL , allocatable :: Lmbvalue(:,:) !< what is this? - REAL , allocatable :: Lmcvalue(:,:) !< what is this? - REAL , allocatable :: Lmdvalue(:,:) !< what is this? - REAL , allocatable :: Lmevalue(:,:) !< what is this? - REAL , allocatable :: Lmfvalue(:,:) !< what is this? - REAL , allocatable :: Lmgvalue(:,:) !< what is this? - REAL , allocatable :: Lmhvalue(:,:) !< what is this? - - INTEGER , allocatable :: Fso(:,:) !< what is this? - INTEGER , allocatable :: Fse(:,:) !< what is this? + integer , allocatable :: Lma(:,:) !< Lagrange multipliers (?) + integer , allocatable :: Lmb(:,:) !< Lagrange multipliers (?) + integer , allocatable :: Lmc(:,:) !< Lagrange multipliers (?) + integer , allocatable :: Lmd(:,:) !< Lagrange multipliers (?) + integer , allocatable :: Lme(:,:) !< Lagrange multipliers (?) + integer , allocatable :: Lmf(:,:) !< Lagrange multipliers (?) + integer , allocatable :: Lmg(:,:) !< Lagrange multipliers (?) + integer , allocatable :: Lmh(:,:) !< Lagrange multipliers (?) + + real(wp) , allocatable :: Lmavalue(:,:) !< what is this? + real(wp) , allocatable :: Lmbvalue(:,:) !< what is this? + real(wp) , allocatable :: Lmcvalue(:,:) !< what is this? + real(wp) , allocatable :: Lmdvalue(:,:) !< what is this? + real(wp) , allocatable :: Lmevalue(:,:) !< what is this? + real(wp) , allocatable :: Lmfvalue(:,:) !< what is this? + real(wp) , allocatable :: Lmgvalue(:,:) !< what is this? + real(wp) , allocatable :: Lmhvalue(:,:) !< what is this? + + integer , allocatable :: Fso(:,:) !< what is this? + integer , allocatable :: Fse(:,:) !< what is this? LOGICAL :: Lcoordinatesingularity !< set by \c LREGION macro; true if inside the innermost volume LOGICAL :: Lplasmaregion !< set by \c LREGION macro; true if inside the plasma region @@ -573,45 +573,45 @@ module allglobal !>
  • These are allocated and deallocated in dforce(), assigned in matrix(), and used in mp00ac() and (?) df00aa().
  • !> !> @{ - REAL, allocatable :: dMA(:,:) !< energy and helicity matrices; quadratic forms - REAL, allocatable :: dMB(:,:) !< energy and helicity matrices; quadratic forms + real(wp), allocatable :: dMA(:,:) !< energy and helicity matrices; quadratic forms + real(wp), allocatable :: dMB(:,:) !< energy and helicity matrices; quadratic forms ! REAL, allocatable :: dMC(:,:) !< energy and helicity matrices; quadratic forms - REAL, allocatable :: dMD(:,:) !< energy and helicity matrices; quadratic forms + real(wp), allocatable :: dMD(:,:) !< energy and helicity matrices; quadratic forms ! REAL, allocatable :: dME(:,:) !< energy and helicity matrices; quadratic forms ! REAL, allocatable :: dMF(:,:) !< energy and helicity matrices; quadratic forms - REAL, allocatable :: dMAS(:) !< sparse version of dMA, data - REAL, allocatable :: dMDS(:) !< sparse version of dMD, data - INTEGER,allocatable :: idMAS(:) !< sparse version of dMA and dMD, indices - INTEGER,allocatable :: jdMAS(:) !< sparse version of dMA and dMD, indices - INTEGER,allocatable :: NdMASmax(:) !< number of elements for sparse matrices - INTEGER,allocatable :: NdMAS(:) !< number of elements for sparse matrices + real(wp), allocatable :: dMAS(:) !< sparse version of dMA, data + real(wp), allocatable :: dMDS(:) !< sparse version of dMD, data + integer,allocatable :: idMAS(:) !< sparse version of dMA and dMD, indices + integer,allocatable :: jdMAS(:) !< sparse version of dMA and dMD, indices + integer,allocatable :: NdMASmax(:) !< number of elements for sparse matrices + integer,allocatable :: NdMAS(:) !< number of elements for sparse matrices - REAL, allocatable :: dMG(: ) !< what is this? + real(wp), allocatable :: dMG(: ) !< what is this? - REAL, allocatable :: AdotX(:) !< the matrix-vector product - REAL, allocatable :: DdotX(:) !< the matrix-vector product + real(wp), allocatable :: AdotX(:) !< the matrix-vector product + real(wp), allocatable :: DdotX(:) !< the matrix-vector product - REAL, allocatable :: solution(:,:) !< this is allocated in dforce; used in mp00ac and ma02aa; and is passed to packab + real(wp), allocatable :: solution(:,:) !< this is allocated in dforce; used in mp00ac and ma02aa; and is passed to packab - REAL, allocatable :: GMRESlastsolution(:,:,:) !< used to store the last solution for restarting GMRES + real(wp), allocatable :: GMRESlastsolution(:,:,:) !< used to store the last solution for restarting GMRES - REAL, allocatable :: MBpsi(:) !< matrix vector products + real(wp), allocatable :: MBpsi(:) !< matrix vector products LOGICAL :: LILUprecond !< whether to use ILU preconditioner for GMRES - REAL, allocatable :: BeltramiInverse(:,:) !< Beltrami inverse matrix + real(wp), allocatable :: BeltramiInverse(:,:) !< Beltrami inverse matrix !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - REAL , allocatable :: diotadxup(:,:,:) !< measured rotational transform on inner/outer interfaces for each volume; d(transform)/dx; (see dforce) - REAL , allocatable :: dItGpdxtp(:,:,:) !< measured toroidal and poloidal current on inner/outer interfaces for each volume; d(Itor,Gpol)/dx; (see dforce) + real(wp) , allocatable :: diotadxup(:,:,:) !< measured rotational transform on inner/outer interfaces for each volume; d(transform)/dx; (see dforce) + real(wp) , allocatable :: dItGpdxtp(:,:,:) !< measured toroidal and poloidal current on inner/outer interfaces for each volume; d(Itor,Gpol)/dx; (see dforce) - REAL , allocatable :: glambda(:,:,:,:) !< save initial guesses for iterative calculation of rotational-transform + real(wp) , allocatable :: glambda(:,:,:,:) !< save initial guesses for iterative calculation of rotational-transform - INTEGER :: lmns !< number of independent degrees of freedom in angle transformation; + integer :: lmns !< number of independent degrees of freedom in angle transformation; - REAL, allocatable :: dlambdaout(:,:,:) + real(wp), allocatable :: dlambdaout(:,:,:) !> @} !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -619,45 +619,45 @@ module allglobal !> \addtogroup grp_force_constr Construction of "force" !> The force vector is comprised of \c Bomn and \c Iomn. !> @{ - REAL, allocatable :: Bemn(:,:,:) !< force vector; stellarator-symmetric (?) - REAL, allocatable :: Iomn(:,:) !< force vector; stellarator-symmetric (?) - REAL, allocatable :: Somn(:,:,:) !< force vector; non-stellarator-symmetric (?) - REAL, allocatable :: Pomn(:,:,:) !< force vector; non-stellarator-symmetric (?) - - REAL, allocatable :: Bomn(:,:,:) !< force vector; stellarator-symmetric (?) - REAL, allocatable :: Iemn(:,:) !< force vector; stellarator-symmetric (?) - REAL, allocatable :: Semn(:,:,:) !< force vector; non-stellarator-symmetric (?) - REAL, allocatable :: Pemn(:,:,:) !< force vector; non-stellarator-symmetric (?) - - REAL, allocatable :: BBe(:) !< force vector (?); stellarator-symmetric (?) - REAL, allocatable :: IIo(:) !< force vector (?); stellarator-symmetric (?) - REAL, allocatable :: BBo(:) !< force vector (?); non-stellarator-symmetric (?) - REAL, allocatable :: IIe(:) !< force vector (?); non-stellarator-symmetric (?) + real(wp), allocatable :: Bemn(:,:,:) !< force vector; stellarator-symmetric (?) + real(wp), allocatable :: Iomn(:,:) !< force vector; stellarator-symmetric (?) + real(wp), allocatable :: Somn(:,:,:) !< force vector; non-stellarator-symmetric (?) + real(wp), allocatable :: Pomn(:,:,:) !< force vector; non-stellarator-symmetric (?) + + real(wp), allocatable :: Bomn(:,:,:) !< force vector; stellarator-symmetric (?) + real(wp), allocatable :: Iemn(:,:) !< force vector; stellarator-symmetric (?) + real(wp), allocatable :: Semn(:,:,:) !< force vector; non-stellarator-symmetric (?) + real(wp), allocatable :: Pemn(:,:,:) !< force vector; non-stellarator-symmetric (?) + + real(wp), allocatable :: BBe(:) !< force vector (?); stellarator-symmetric (?) + real(wp), allocatable :: IIo(:) !< force vector (?); stellarator-symmetric (?) + real(wp), allocatable :: BBo(:) !< force vector (?); non-stellarator-symmetric (?) + real(wp), allocatable :: IIe(:) !< force vector (?); non-stellarator-symmetric (?) !> @} !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! !> \addtogroup grp_covar_field_ifaces Covariant field on interfaces: Btemn, Bzemn, Btomn, Bzomn !> The covariant field !> @{ - REAL, allocatable :: Btemn(:,:,:) !< covariant \f$\theta\f$ cosine component of the tangential field on interfaces; stellarator-symmetric - REAL, allocatable :: Bzemn(:,:,:) !< covariant \f$\zeta\f$ cosine component of the tangential field on interfaces; stellarator-symmetric - REAL, allocatable :: Btomn(:,:,:) !< covariant \f$\theta\f$ sine component of the tangential field on interfaces; non-stellarator-symmetric - REAL, allocatable :: Bzomn(:,:,:) !< covariant \f$\zeta\f$ sine component of the tangential field on interfaces; non-stellarator-symmetric + real(wp), allocatable :: Btemn(:,:,:) !< covariant \f$\theta\f$ cosine component of the tangential field on interfaces; stellarator-symmetric + real(wp), allocatable :: Bzemn(:,:,:) !< covariant \f$\zeta\f$ cosine component of the tangential field on interfaces; stellarator-symmetric + real(wp), allocatable :: Btomn(:,:,:) !< covariant \f$\theta\f$ sine component of the tangential field on interfaces; non-stellarator-symmetric + real(wp), allocatable :: Bzomn(:,:,:) !< covariant \f$\zeta\f$ sine component of the tangential field on interfaces; non-stellarator-symmetric !> @} !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! !> \addtogroup grp_covar_field_hessian covariant field for Hessian computation: Bloweremn, Bloweromn !> @{ - REAL, allocatable :: Bloweremn(:,:) !< covariant field for Hessian computation - REAL, allocatable :: Bloweromn(:,:) !< covariant field for Hessian computation + real(wp), allocatable :: Bloweremn(:,:) !< covariant field for Hessian computation + real(wp), allocatable :: Bloweromn(:,:) !< covariant field for Hessian computation !> @} !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! !> \addtogroup grp_geomdof Geometrical degrees-of-freedom: LGdof, NGdof !> The geometrical degrees-of-freedom !> @{ - INTEGER :: LGdof !< geometrical degrees of freedom associated with each interface - INTEGER :: NGdof !< total geometrical degrees of freedom + integer :: LGdof !< geometrical degrees of freedom associated with each interface + integer :: NGdof !< total geometrical degrees of freedom !> @} !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -668,18 +668,18 @@ module allglobal !>
  • force-balance across the \f$l\f$-th interface depends on the fields in the adjacent interfaces.
  • !> !> @{ - REAL, allocatable :: dBBdRZ(:,:,:) !< derivative of magnetic field w.r.t. geometry (?) - REAL, allocatable :: dIIdRZ(: ,:) !< derivative of spectral constraints w.r.t. geometry (?) + real(wp), allocatable :: dBBdRZ(:,:,:) !< derivative of magnetic field w.r.t. geometry (?) + real(wp), allocatable :: dIIdRZ(: ,:) !< derivative of spectral constraints w.r.t. geometry (?) - REAL, allocatable :: dFFdRZ(:,:,:,:,:) !< derivatives of B^2 at the interfaces wrt geometry - REAL, allocatable :: dBBdmp(:,:,:,: ) !< derivatives of B^2 at the interfaces wrt mu and dpflux + real(wp), allocatable :: dFFdRZ(:,:,:,:,:) !< derivatives of B^2 at the interfaces wrt geometry + real(wp), allocatable :: dBBdmp(:,:,:,: ) !< derivatives of B^2 at the interfaces wrt mu and dpflux - REAL, allocatable :: HdFFdRZ(:,:,:,:,:) !< derivatives of B^2 at the interfaces wrt geometry 2D Hessian; + real(wp), allocatable :: HdFFdRZ(:,:,:,:,:) !< derivatives of B^2 at the interfaces wrt geometry 2D Hessian; - REAL, allocatable :: denergydrr(:,:,:,:,:) !< derivatives of energy at the interfaces wrt geometry 3D Hessian; - REAL, allocatable :: denergydrz(:,:,:,:,:) !< derivatives of energy at the interfaces wrt geometry 3D Hessian; - REAL, allocatable :: denergydzr(:,:,:,:,:) !< derivatives of energy at the interfaces wrt geometry 3D Hessian; - REAL, allocatable :: denergydzz(:,:,:,:,:) !< derivatives of energy at the interfaces wrt geometry 3D Hessian; + real(wp), allocatable :: denergydrr(:,:,:,:,:) !< derivatives of energy at the interfaces wrt geometry 3D Hessian; + real(wp), allocatable :: denergydrz(:,:,:,:,:) !< derivatives of energy at the interfaces wrt geometry 3D Hessian; + real(wp), allocatable :: denergydzr(:,:,:,:,:) !< derivatives of energy at the interfaces wrt geometry 3D Hessian; + real(wp), allocatable :: denergydzz(:,:,:,:,:) !< derivatives of energy at the interfaces wrt geometry 3D Hessian; !> @} !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -722,21 +722,21 @@ module allglobal !>
  • A finite-difference estimate is computed if \c Lcheck==4.
  • !> !> @{ - REAL, allocatable :: dmupfdx(:,:,:,:,:) !< derivatives of mu and dpflux wrt geometry at constant interface transform + real(wp), allocatable :: dmupfdx(:,:,:,:,:) !< derivatives of mu and dpflux wrt geometry at constant interface transform !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! LOGICAL :: Lhessianallocated !< flag to indicate that force gradient matrix is allocated (?) - REAL, allocatable :: hessian(:,:) !< force gradient matrix (?) - REAL, allocatable :: dessian(:,:) !< derivative of force gradient matrix (?) + real(wp), allocatable :: hessian(:,:) !< force gradient matrix (?) + real(wp), allocatable :: dessian(:,:) !< derivative of force gradient matrix (?) LOGICAL :: Lhessian2Dallocated !< flag to indicate that 2D Hessian matrix is allocated (?) - REAL, allocatable :: hessian2D(:,:) !< Hessian 2D - REAL, allocatable :: dessian2D(:,:) !< derivative Hessian 2D + real(wp), allocatable :: hessian2D(:,:) !< Hessian 2D + real(wp), allocatable :: dessian2D(:,:) !< derivative Hessian 2D LOGICAL :: Lhessian3Dallocated !< flag to indicate that 2D Hessian matrix is allocated (?) - REAL, allocatable :: hessian3D(:,:) !< Hessian 3D - REAL, allocatable :: dessian3D(:,:) !< derivative Hessian 3D + real(wp), allocatable :: hessian3D(:,:) !< Hessian 3D + real(wp), allocatable :: dessian3D(:,:) !< derivative Hessian 3D !> @} !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -749,25 +749,25 @@ module allglobal !> \f} !> !> @{ - REAL , allocatable :: cosi(:,:) !< some precomputed cosines - REAL , allocatable :: sini(:,:) !< some precomputed sines - REAL , allocatable :: gteta(:) !< something related to \f$\sqrt g\f$ and \f$\theta\f$ ? - REAL , allocatable :: gzeta(:) !< something related to \f$\sqrt g\f$ and \f$\zeta\f$ ? + real(wp) , allocatable :: cosi(:,:) !< some precomputed cosines + real(wp) , allocatable :: sini(:,:) !< some precomputed sines + real(wp) , allocatable :: gteta(:) !< something related to \f$\sqrt g\f$ and \f$\theta\f$ ? + real(wp) , allocatable :: gzeta(:) !< something related to \f$\sqrt g\f$ and \f$\zeta\f$ ? - REAL , allocatable :: ajk(:) !< definition of coordinate axis + real(wp) , allocatable :: ajk(:) !< definition of coordinate axis - REAL , allocatable :: dRadR(:,:,:,:) !< derivatives of coordinate axis - REAL , allocatable :: dRadZ(:,:,:,:) !< derivatives of coordinate axis - REAL , allocatable :: dZadR(:,:,:,:) !< derivatives of coordinate axis - REAL , allocatable :: dZadZ(:,:,:,:) !< derivatives of coordinate axis + real(wp) , allocatable :: dRadR(:,:,:,:) !< derivatives of coordinate axis + real(wp) , allocatable :: dRadZ(:,:,:,:) !< derivatives of coordinate axis + real(wp) , allocatable :: dZadR(:,:,:,:) !< derivatives of coordinate axis + real(wp) , allocatable :: dZadZ(:,:,:,:) !< derivatives of coordinate axis - REAL , allocatable :: dRodR(:,:,:) !< derivatives of coordinate axis - REAL , allocatable :: dRodZ(:,:,:) !< derivatives of coordinate axis - REAL , allocatable :: dZodR(:,:,:) !< derivatives of coordinate axis - REAL , allocatable :: dZodZ(:,:,:) !< derivatives of coordinate axis + real(wp) , allocatable :: dRodR(:,:,:) !< derivatives of coordinate axis + real(wp) , allocatable :: dRodZ(:,:,:) !< derivatives of coordinate axis + real(wp) , allocatable :: dZodR(:,:,:) !< derivatives of coordinate axis + real(wp) , allocatable :: dZodZ(:,:,:) !< derivatives of coordinate axis - INTEGER, allocatable :: djkp(:,:) !< for calculating cylindrical volume - INTEGER, allocatable :: djkm(:,:) !< for calculating cylindrical volume + integer, allocatable :: djkp(:,:) !< for calculating cylindrical volume + integer, allocatable :: djkm(:,:) !< for calculating cylindrical volume !> @} !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -798,11 +798,11 @@ module allglobal !> are computed and saved in \c volume(0:2,1:Nvol). !> !> @{ - REAL , allocatable :: lBBintegral(:) !< B.B integral - REAL , allocatable :: lABintegral(:) !< A.B integral + real(wp) , allocatable :: lBBintegral(:) !< B.B integral + real(wp) , allocatable :: lABintegral(:) !< A.B integral - REAL , allocatable :: vvolume(:) !< volume integral of \f$\sqrt g\f$; computed in volume - REAL :: dvolume !< derivative of volume w.r.t. interface geometry + real(wp) , allocatable :: vvolume(:) !< volume integral of \f$\sqrt g\f$; computed in volume + real(wp) :: dvolume !< derivative of volume w.r.t. interface geometry !> @} !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -810,20 +810,20 @@ module allglobal !> \addtogroup grp_int_global Internal global variables !> internal global variables; internal logical variables; default values are provided here; these may be changed according to input values !> @{ - INTEGER :: ivol !< labels volume; some subroutines (called by NAG) are fixed argument list but require the volume label + integer :: ivol !< labels volume; some subroutines (called by NAG) are fixed argument list but require the volume label - REAL :: gBzeta !< toroidal (contravariant) field; calculated in bfield; required to convert \f$\dot \theta\f$ to \f$B^\theta\f$, \f$\dot s\f$ to \f$B^s\f$ + real(wp) :: gBzeta !< toroidal (contravariant) field; calculated in bfield; required to convert \f$\dot \theta\f$ to \f$B^\theta\f$, \f$\dot s\f$ to \f$B^s\f$ - INTEGER, allocatable :: Iquad(:) !< internal copy of Nquad + integer, allocatable :: Iquad(:) !< internal copy of Nquad - REAL , allocatable :: gaussianweight(:,:) !< weights for Gaussian quadrature - REAL , allocatable :: gaussianabscissae(:,:) !< abscissae for Gaussian quadrature + real(wp) , allocatable :: gaussianweight(:,:) !< weights for Gaussian quadrature + real(wp) , allocatable :: gaussianabscissae(:,:) !< abscissae for Gaussian quadrature LOGICAL :: LBlinear !< controls selection of Beltrami field solver; depends on LBeltrami LOGICAL :: LBnewton !< controls selection of Beltrami field solver; depends on LBeltrami LOGICAL :: LBsequad !< controls selection of Beltrami field solver; depends on LBeltrami - REAL :: oRZp(1:3) !< used in mg00aa() to determine \f$(s,\theta,\zeta)\f$ given \f$(R,Z,\varphi)\f$ + real(wp) :: oRZp(1:3) !< used in mg00aa() to determine \f$(s,\theta,\zeta)\f$ given \f$(R,Z,\varphi)\f$ !> @} @@ -832,22 +832,22 @@ module allglobal !> \addtogroup grp_misc Miscellaneous !> The following are miscellaneous flags required for the virtual casing field, external (vacuum) field integration, ... !> @{ - INTEGER :: globaljk !< labels position - REAL, allocatable :: Dxyz(:,:) !< computational boundary; position - REAL, allocatable :: Nxyz(:,:) !< computational boundary; normal - REAL, allocatable :: Jxyz(:,:) !< plasma boundary; surface current + integer :: globaljk !< labels position + real(wp), allocatable :: Dxyz(:,:) !< computational boundary; position + real(wp), allocatable :: Nxyz(:,:) !< computational boundary; normal + real(wp), allocatable :: Jxyz(:,:) !< plasma boundary; surface current - REAL :: tetazeta(1:2) !< what is this? + real(wp) :: tetazeta(1:2) !< what is this? - REAL :: virtualcasingfactor = -one / (four*pi) !< this agrees with diagno + real(wp) :: virtualcasingfactor = -one / (four*pi) !< this agrees with diagno - INTEGER :: IBerror !< for computing error in magnetic field + integer :: IBerror !< for computing error in magnetic field - INTEGER :: nfreeboundaryiterations !< number of free-boundary iterations already performed + integer :: nfreeboundaryiterations !< number of free-boundary iterations already performed !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - INTEGER, parameter :: Node = 2 !< best to make this global for consistency between calling and called routines + integer, parameter :: Node = 2 !< best to make this global for consistency between calling and called routines !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -861,7 +861,6 @@ module allglobal !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! subroutine build_vector_potential(lvol, iocons, aderiv, tderiv) - ! Builds the covariant component of the vector potential and store them in efmn, ofmn, sfmn, cfmn. use constants, only: zero, half @@ -874,24 +873,40 @@ subroutine build_vector_potential(lvol, iocons, aderiv, tderiv) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS - INTEGER :: aderiv ! Derivative of A. -1: w.r.t geometrical degree of freedom +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + integer :: aderiv ! Derivative of A. -1: w.r.t geometrical degree of freedom ! 0: no derivatives ! 1: w.r.t mu ! 2: w.r.t pflux - INTEGER :: tderiv ! Derivative of Chebyshev polynomialc. 0: no derivatives + integer :: tderiv ! Derivative of Chebyshev polynomialc. 0: no derivatives ! 1: w.r.t radial coordinate s - INTEGER :: ii, & ! Loop index on Fourier harmonics + integer :: ii, & ! Loop index on Fourier harmonics ll, & ! Loop index on radial resolution mi, & ! Poloidal mode number lvol,& ! Volume number iocons ! inner (0) or outer (1) side of the volume - REAL :: mfactor ! Regularization factor when LcoordinateSingularity + real(wp) :: mfactor ! Regularization factor when LcoordinateSingularity !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - BEGIN(build_vector_potential) + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif + efmn(1:mn) = zero ; sfmn(1:mn) = zero ; cfmn(1:mn) = zero ; ofmn(1:mn) = zero @@ -958,18 +973,32 @@ subroutine read_inputlists_from_file() use ifport ! for fseek, ftell with Intel compiler #endif - LOCALS + +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + LOGICAL :: Lspexist integer :: filepos, seek_status, cpfile, instat, idx_mode character(len=1000) :: line - INTEGER :: mm, nn - REAL, allocatable :: RZRZ(:,:) ! local array used for reading interface Fourier harmonics from file; + integer :: mm, nn + real(wp), allocatable :: RZRZ(:,:) ! local array used for reading interface Fourier harmonics from file; inquire( file=trim(ext)//".sp", exist=Lspexist ) ! check if file exists; - FATAL( readin, .not.Lspexist, the input file does not exist ) ! if not, abort; + + if( .not.Lspexist ) then + write(6,'("readin : fatal : myid=",i3," ; .not.Lspexist ; the input file does not exist ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "readin : .not.Lspexist : the input file does not exist ;" + endif + ! if not, abort; !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -980,7 +1009,7 @@ subroutine read_inputlists_from_file() instat = 0 ! initially, no error ! read namelists one after another - if( Wreadin ) then ; cput = GETTIME ; write(ounit,'("readin : ",f10.2," : reading physicslist from ext.sp ;")') cput-cpus + if( Wreadin ) then ; cput = MPI_WTIME() ; write(ounit,'("readin : ",f10.2," : reading physicslist from ext.sp ;")') cput-cpus endif read(iunit, physicslist, iostat=instat) @@ -992,10 +1021,10 @@ subroutine read_inputlists_from_file() write(*,'(A)') 'Invalid line in physicslist: '//trim(line) end if - if( Wreadin ) then ; cput = GETTIME ; write(ounit,'("readin : ",f10.2," : read physicslist from ext.sp ;")') cput-cpus + if( Wreadin ) then ; cput = MPI_WTIME() ; write(ounit,'("readin : ",f10.2," : read physicslist from ext.sp ;")') cput-cpus endif - if( Wreadin ) then ; cput = GETTIME ; write(ounit,'("readin : ",f10.2," : reading numericlist from ext.sp ;")') cput-cpus + if( Wreadin ) then ; cput = MPI_WTIME() ; write(ounit,'("readin : ",f10.2," : reading numericlist from ext.sp ;")') cput-cpus endif read(iunit, numericlist, iostat=instat) @@ -1007,10 +1036,10 @@ subroutine read_inputlists_from_file() write(*,'(A)') 'Invalid line in numericlist: '//trim(line) end if - if( Wreadin ) then ; cput = GETTIME ; write(ounit,'("readin : ",f10.2," : read numericlist from ext.sp ;")') cput-cpus + if( Wreadin ) then ; cput = MPI_WTIME() ; write(ounit,'("readin : ",f10.2," : read numericlist from ext.sp ;")') cput-cpus endif - if( Wreadin ) then ; cput = GETTIME ; write(ounit,'("readin : ",f10.2," : reading locallist from ext.sp ;")') cput-cpus + if( Wreadin ) then ; cput = MPI_WTIME() ; write(ounit,'("readin : ",f10.2," : reading locallist from ext.sp ;")') cput-cpus endif read(iunit, locallist, iostat=instat) @@ -1022,10 +1051,10 @@ subroutine read_inputlists_from_file() write(*,'(A)') 'Invalid line in locallist: '//trim(line) end if - if( Wreadin ) then ; cput = GETTIME ; write(ounit,'("readin : ",f10.2," : read locallist from ext.sp ;")') cput-cpus + if( Wreadin ) then ; cput = MPI_WTIME() ; write(ounit,'("readin : ",f10.2," : read locallist from ext.sp ;")') cput-cpus endif - if( Wreadin ) then ; cput = GETTIME ; write(ounit,'("readin : ",f10.2," : reading globallist from ext.sp ;")') cput-cpus + if( Wreadin ) then ; cput = MPI_WTIME() ; write(ounit,'("readin : ",f10.2," : reading globallist from ext.sp ;")') cput-cpus endif read(iunit, globallist, iostat=instat) @@ -1037,10 +1066,10 @@ subroutine read_inputlists_from_file() write(*,'(A)') 'Invalid line in globallist: '//trim(line) end if - if( Wreadin ) then ; cput = GETTIME ; write(ounit,'("readin : ",f10.2," : read globallist from ext.sp ;")') cput-cpus + if( Wreadin ) then ; cput = MPI_WTIME() ; write(ounit,'("readin : ",f10.2," : read globallist from ext.sp ;")') cput-cpus endif - if( Wreadin ) then ; cput = GETTIME ; write(ounit,'("readin : ",f10.2," : reading diagnosticslist from ext.sp ;")') cput-cpus + if( Wreadin ) then ; cput = MPI_WTIME() ; write(ounit,'("readin : ",f10.2," : reading diagnosticslist from ext.sp ;")') cput-cpus endif read(iunit, diagnosticslist, iostat=instat) @@ -1052,10 +1081,10 @@ subroutine read_inputlists_from_file() write(*,'(A)') 'Invalid line in diagnosticslist: '//trim(line) end if - if( Wreadin ) then ; cput = GETTIME ; write(ounit,'("readin : ",f10.2," : read diagnosticslist from ext.sp ;")') cput-cpus + if( Wreadin ) then ; cput = MPI_WTIME() ; write(ounit,'("readin : ",f10.2," : read diagnosticslist from ext.sp ;")') cput-cpus endif - if( Wreadin ) then ; cput = GETTIME ; write(ounit,'("readin : ",f10.2," : reading screenlist from ext.sp ;")') cput-cpus + if( Wreadin ) then ; cput = MPI_WTIME() ; write(ounit,'("readin : ",f10.2," : reading screenlist from ext.sp ;")') cput-cpus endif read(iunit, screenlist, iostat=instat) @@ -1067,7 +1096,7 @@ subroutine read_inputlists_from_file() write(*,'(A)') 'Invalid line in screenlist: '//trim(line) end if - if( Wreadin ) then ; cput = GETTIME ; write(ounit,'("readin : ",f10.2," : read screenlist from ext.sp ;")') cput-cpus + if( Wreadin ) then ; cput = MPI_WTIME() ; write(ounit,'("readin : ",f10.2," : read screenlist from ext.sp ;")') cput-cpus endif ! At this point, the input namelists are read. @@ -1081,9 +1110,18 @@ subroutine read_inputlists_from_file() if (Linitialize .le. 0) then ! duplicate of checks required for below code - FATAL( readin, Nvol.lt.1 .or. Nvol.gt.MNvol, invalid Nvol: may need to recompile with higher MNvol ) - SALLOCATE( RZRZ, (1:4,1:Nvol), zero ) ! temp array for reading input; + if( Nvol.lt.1 .or. Nvol.gt.MNvol ) then + write(6,'("readin : fatal : myid=",i3," ; Nvol.lt.1 .or. Nvol.gt.MNvol ; invalid Nvol: may need to recompile with higher MNvol ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "readin : Nvol.lt.1 .or. Nvol.gt.MNvol : invalid Nvol: may need to recompile with higher MNvol ;" + endif + + + + allocate( RZRZ(1:4,1:Nvol), stat=astat ) + RZRZ(1:4,1:Nvol) = zero + ! temp array for reading input; ! determine how many modes are specified by reading them once #ifdef IFORT @@ -1107,7 +1145,13 @@ subroutine read_inputlists_from_file() #else call fseek(iunit, filepos, 0, seek_status) #endif - FATAL(inplst, seek_status.ne.0, failed to seek to end of input namelists ) + + if( seek_status.ne.0 ) then + write(6,'("inplst : fatal : myid=",i3," ; seek_status.ne.0 ; failed to seek to end of input namelists ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "inplst : seek_status.ne.0 : failed to seek to end of input namelists ;" + endif + ! now allocate arrays and read... ! Need to free memory, in case preset() called multiple times via python wrappers @@ -1119,7 +1163,9 @@ subroutine read_inputlists_from_file() enddo ! no need for temporary RZRZ anymore - DALLOCATE(RZRZ) + + deallocate(RZRZ,stat=astat) + end if ! Linitialize .le. 0 @@ -1137,18 +1183,34 @@ subroutine check_inputs() use inputlist use cputiming, only: Treadin - LOCALS - INTEGER :: vvol - REAL :: xx, toroidalflux, toroidalcurrent +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + integer :: vvol + real(wp) :: xx, toroidalflux, toroidalcurrent + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif - BEGIN(readin) Mvol = Nvol + Lfreebound ! this is just for screen output and initial check; true assignment of Mvol appears outside if( myid.eq.0 ) then ; write(ounit,'("readin : ", 10x ," : ")') - cput = GETTIME + cput = MPI_WTIME() write(ounit,1010) cput-cpus, Igeometry, Istellsym, Lreflect write(ounit,1011) Lfreebound, phiedge, curtor, curpol @@ -1176,17 +1238,83 @@ subroutine check_inputs() endif #endif - FATAL( readin, Igeometry.lt.1 .or. Igeometry.gt.3, invalid geometry ) - FATAL( readin, Nfp.le.0, invalid Nfp ) - FATAL( readin, Mpol.lt.0 .or. Mpol.gt.MMpol, invalid poloidal resolution: may need to recompile with higher MMpol ) - FATAL( readin, Ntor.lt.0 .or. Ntor.gt.MNtor, invalid toroidal resolution: may need to recompile with higher MNtor ) - FATAL( readin, Nvol.lt.1 .or. Nvol.gt.MNvol, invalid Nvol: may need to recompile with higher MNvol ) - FATAL( readin, mupftol.le.zero, mupftol is too small ) - FATAL( readin, abs(one+gamma).lt.vsmall, 1+gamma appears in denominator in dforce ) !< \todo Please check this; SRH: 27 Feb 18; - FATAL( readin, abs(one-gamma).lt.vsmall, 1-gamma appears in denominator in fu00aa ) !< \todo Please check this; SRH: 27 Feb 18; - FATAL( readin, Lconstraint.lt.-1 .or. Lconstraint.gt.3, illegal Lconstraint ) - FATAL( readin, Igeometry.eq.1 .and. rpol.lt.vsmall, poloidal extent of slab too small or negative ) - FATAL( readin, Igeometry.eq.1 .and. rtor.lt.vsmall, toroidal extent of slab too small or negative ) + + if( Igeometry.lt.1 .or. Igeometry.gt.3 ) then + write(6,'("readin : fatal : myid=",i3," ; Igeometry.lt.1 .or. Igeometry.gt.3 ; invalid geometry ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "readin : Igeometry.lt.1 .or. Igeometry.gt.3 : invalid geometry ;" + endif + + + if( Nfp.le.0 ) then + write(6,'("readin : fatal : myid=",i3," ; Nfp.le.0 ; invalid Nfp ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "readin : Nfp.le.0 : invalid Nfp ;" + endif + + + if( Mpol.lt.0 .or. Mpol.gt.MMpol ) then + write(6,'("readin : fatal : myid=",i3," ; Mpol.lt.0 .or. Mpol.gt.MMpol ; invalid poloidal resolution: may need to recompile with higher MMpol ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "readin : Mpol.lt.0 .or. Mpol.gt.MMpol : invalid poloidal resolution: may need to recompile with higher MMpol ;" + endif + + + if( Ntor.lt.0 .or. Ntor.gt.MNtor ) then + write(6,'("readin : fatal : myid=",i3," ; Ntor.lt.0 .or. Ntor.gt.MNtor ; invalid toroidal resolution: may need to recompile with higher MNtor ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "readin : Ntor.lt.0 .or. Ntor.gt.MNtor : invalid toroidal resolution: may need to recompile with higher MNtor ;" + endif + + + if( Nvol.lt.1 .or. Nvol.gt.MNvol ) then + write(6,'("readin : fatal : myid=",i3," ; Nvol.lt.1 .or. Nvol.gt.MNvol ; invalid Nvol: may need to recompile with higher MNvol ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "readin : Nvol.lt.1 .or. Nvol.gt.MNvol : invalid Nvol: may need to recompile with higher MNvol ;" + endif + + + if( mupftol.le.zero ) then + write(6,'("readin : fatal : myid=",i3," ; mupftol.le.zero ; mupftol is too small ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "readin : mupftol.le.zero : mupftol is too small ;" + endif + + + if( abs(one+gamma).lt.vsmall ) then + write(6,'("readin : fatal : myid=",i3," ; abs(one+gamma).lt.vsmall ; 1+gamma appears in denominator in dforce ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "readin : abs(one+gamma).lt.vsmall : 1+gamma appears in denominator in dforce ;" + endif + !< \todo Please check this; SRH: 27 Feb 18; + + if( abs(one-gamma).lt.vsmall ) then + write(6,'("readin : fatal : myid=",i3," ; abs(one-gamma).lt.vsmall ; 1-gamma appears in denominator in fu00aa ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "readin : abs(one-gamma).lt.vsmall : 1-gamma appears in denominator in fu00aa ;" + endif + !< \todo Please check this; SRH: 27 Feb 18; + + if( Lconstraint.lt.-1 .or. Lconstraint.gt.3 ) then + write(6,'("readin : fatal : myid=",i3," ; Lconstraint.lt.-1 .or. Lconstraint.gt.3 ; illegal Lconstraint ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "readin : Lconstraint.lt.-1 .or. Lconstraint.gt.3 : illegal Lconstraint ;" + endif + + + if( Igeometry.eq.1 .and. rpol.lt.vsmall ) then + write(6,'("readin : fatal : myid=",i3," ; Igeometry.eq.1 .and. rpol.lt.vsmall ; poloidal extent of slab too small or negative ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "readin : Igeometry.eq.1 .and. rpol.lt.vsmall : poloidal extent of slab too small or negative ;" + endif + + + if( Igeometry.eq.1 .and. rtor.lt.vsmall ) then + write(6,'("readin : fatal : myid=",i3," ; Igeometry.eq.1 .and. rtor.lt.vsmall ; toroidal extent of slab too small or negative ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "readin : Igeometry.eq.1 .and. rtor.lt.vsmall : toroidal extent of slab too small or negative ;" + endif + if( Istellsym.eq.1 ) then Rbs(-MNtor:MNtor,-MMpol:MMpol) = zero @@ -1214,14 +1342,26 @@ subroutine check_inputs() !> \f$Isurf \rightarrow Isurf \cdot \frac{curtor}{\sum_i Isurf_i + Ivolume_i}\f$ !> - FATAL( readin, abs(tflux(Nvol)).lt. vsmall, enclosed toroidal flux cannot be zero ) + + if( abs(tflux(Nvol)).lt. vsmall ) then + write(6,'("readin : fatal : myid=",i3," ; abs(tflux(Nvol)).lt. vsmall ; enclosed toroidal flux cannot be zero ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "readin : abs(tflux(Nvol)).lt. vsmall : enclosed toroidal flux cannot be zero ;" + endif + toroidalflux = tflux(Nvol) ! toroidal flux is a local variable; SRH: 27 Feb 18 tflux(1:Mvol) = tflux(1:Mvol) / toroidalflux ! normalize toroidal flux pflux(1:Mvol) = pflux(1:Mvol) / toroidalflux ! normalize poloidal flux - FATAL( readin, tflux(1).lt.zero, enclosed toroidal flux cannot be zero ) + + if( tflux(1).lt.zero ) then + write(6,'("readin : fatal : myid=",i3," ; tflux(1).lt.zero ; enclosed toroidal flux cannot be zero ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "readin : tflux(1).lt.zero : enclosed toroidal flux cannot be zero ;" + endif + do vvol = 2, Mvol !FATAL( readin, tflux(vvol)-tflux(vvol-1).lt.small, toroidal flux is not monotonic ) enddo @@ -1246,13 +1386,25 @@ subroutine check_inputs() toroidalcurrent = Ivolume(Mvol) + sum(Isurf(1:Mvol-1)) if( curtor.NE.0 ) then - FATAL( readin, toroidalcurrent.EQ.0 , Incompatible current profiles and toroidal linking current) + + if( toroidalcurrent.EQ.0 ) then + write(6,'("readin : fatal : myid=",i3," ; toroidalcurrent.EQ.0 ; Incompatible current profiles and toroidal linking current;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "readin : toroidalcurrent.EQ.0 : Incompatible current profiles and toroidal linking current ;" + endif + Ivolume(1:Mvol) = Ivolume(1:Mvol) * curtor / toroidalcurrent Isurf(1:Mvol-1) = Isurf(1:Mvol-1) * curtor / toroidalcurrent else - FATAL( readin, toroidalcurrent.NE.0, Incompatible current profiles and toroidal linking current) + + if( toroidalcurrent.NE.0 ) then + write(6,'("readin : fatal : myid=",i3," ; toroidalcurrent.NE.0 ; Incompatible current profiles and toroidal linking current;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "readin : toroidalcurrent.NE.0 : Incompatible current profiles and toroidal linking current ;" + endif + ! No rescaling if profiles have an overall zero toroidal current endif @@ -1263,14 +1415,26 @@ subroutine check_inputs() do vvol = 1, Mvol - FATAL( readin, Lrad(vvol ).lt.2, require Chebyshev resolution Lrad > 2 so that Lagrange constraints can be satisfied ) + + if( Lrad(vvol ).lt.2 ) then + write(6,'("readin : fatal : myid=",i3," ; Lrad(vvol ).lt.2 ; require Chebyshev resolution Lrad > 2 so that Lagrange constraints can be satisfied ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "readin : Lrad(vvol ).lt.2 : require Chebyshev resolution Lrad > 2 so that Lagrange constraints can be satisfied ;" + endif + enddo if (Igeometry.ge.2 .and. Lrad(1).lt.Mpol) then write(ounit,'("readin : ",f10.2," : Minimum Lrad(1) is Mpol, automatically adjusted it to Mpol+4")') cput-cpus Lrad(1) = Mpol + 4 endif - FATAL( readin, mupfits.le.0, must give ma01aa:hybrj a postive integer value for the maximum iterations = mupfits given on input ) + + if( mupfits.le.0 ) then + write(6,'("readin : fatal : myid=",i3," ; mupfits.le.0 ; must give ma01aa:hybrj a postive integer value for the maximum iterations = mupfits given on input ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "readin : mupfits.le.0 : must give ma01aa:hybrj a postive integer value for the maximum iterations = mupfits given on input ;" + endif + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -1288,11 +1452,23 @@ subroutine check_inputs() 1022 format("readin : ", 10x ," : Lsparse="i2" ; Lsvdiota="i2" ; imethod="i2" ; iorder="i2" ; iprecon="i2" ; iotatol="es13.5" ;") 1023 format("readin : ", 10x ," : Lextrap="i2" ; Mregular="i3" ; Lrzaxis="i2" ; Ntoraxis="i2" ;") - FATAL( readin, Ndiscrete.le.0, error ) + + if( Ndiscrete.le.0 ) then + write(6,'("readin : fatal : myid=",i3," ; Ndiscrete.le.0 ; error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "readin : Ndiscrete.le.0 : error ;" + endif + !FATAL(readin, Lfreebound.eq.1 .and. Lconstraint.gt.0 .and. Lsparse.eq.0, have not implemented dense Fourier angle transformation in vacuum region ) - FATAL( readin, iotatol.gt.one, illegal value for sparse tolerance ) ! I think that the sparse iota solver is no longer implemented; SRH: 27 Feb 18; + + if( iotatol.gt.one ) then + write(6,'("readin : fatal : myid=",i3," ; iotatol.gt.one ; illegal value for sparse tolerance ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "readin : iotatol.gt.one : illegal value for sparse tolerance ;" + endif + ! I think that the sparse iota solver is no longer implemented; SRH: 27 Feb 18; !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -1310,12 +1486,48 @@ subroutine check_inputs() 1030 format("readin : ",f10.2," : LBeltrami="i2" ; Linitgues="i2" ; Lmatsolver="i2" ; LGMRESprec="i2" ; NiterGMRES="i4" ; epsGMRES="es13.5" ; epsILU="es13.5" ;" ) - FATAL( readin, LBeltrami.lt.0 .or. LBeltrami.gt.7, error ) - FATAL( readin, Lmatsolver.lt.0 .or. Lmatsolver.gt.3, error ) - FATAL( readin, LGMRESprec.lt.0 .or. LGMRESprec.gt.1, error ) - FATAL( readin, NiterGMRES.lt.0, error ) - FATAL( readin, abs(epsGMRES).le.machprec , error ) - FATAL( readin, abs(epsILU).le.machprec , error ) + + if( LBeltrami.lt.0 .or. LBeltrami.gt.7 ) then + write(6,'("readin : fatal : myid=",i3," ; LBeltrami.lt.0 .or. LBeltrami.gt.7 ; error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "readin : LBeltrami.lt.0 .or. LBeltrami.gt.7 : error ;" + endif + + + if( Lmatsolver.lt.0 .or. Lmatsolver.gt.3 ) then + write(6,'("readin : fatal : myid=",i3," ; Lmatsolver.lt.0 .or. Lmatsolver.gt.3 ; error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "readin : Lmatsolver.lt.0 .or. Lmatsolver.gt.3 : error ;" + endif + + + if( LGMRESprec.lt.0 .or. LGMRESprec.gt.1 ) then + write(6,'("readin : fatal : myid=",i3," ; LGMRESprec.lt.0 .or. LGMRESprec.gt.1 ; error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "readin : LGMRESprec.lt.0 .or. LGMRESprec.gt.1 : error ;" + endif + + + if( NiterGMRES.lt.0 ) then + write(6,'("readin : fatal : myid=",i3," ; NiterGMRES.lt.0 ; error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "readin : NiterGMRES.lt.0 : error ;" + endif + + + if( abs(epsGMRES).le.machprec ) then + write(6,'("readin : fatal : myid=",i3," ; abs(epsGMRES).le.machprec ; error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "readin : abs(epsGMRES).le.machprec : error ;" + endif + + + if( abs(epsILU).le.machprec ) then + write(6,'("readin : fatal : myid=",i3," ; abs(epsILU).le.machprec ; error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "readin : abs(epsILU).le.machprec : error ;" + endif + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -1335,13 +1547,43 @@ subroutine check_inputs() 1043 format("readin : ", 10x ," : mfreeits="i4" ; gBntol="es13.5" ; gBnbld="es13.5" ;") 1044 format("readin : ", 10x ," : vcasingeps="es13.5" ; vcasingtol="es13.5" ; vcasingits="i6" ; vcasingper="i6" ;") - FATAL( readin, escale .lt.zero , error ) - FATAL( readin, pcondense .lt.one , error ) - FATAL( readin, abs(c05xtol).le.machprec , error ) - FATAL( readin, c05factor .le.zero , error ) + + if( escale .lt.zero ) then + write(6,'("readin : fatal : myid=",i3," ; escale .lt.zero ; error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "readin : escale .lt.zero : error ;" + endif + + + if( pcondense .lt.one ) then + write(6,'("readin : fatal : myid=",i3," ; pcondense .lt.one ; error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "readin : pcondense .lt.one : error ;" + endif + + + if( abs(c05xtol).le.machprec ) then + write(6,'("readin : fatal : myid=",i3," ; abs(c05xtol).le.machprec ; error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "readin : abs(c05xtol).le.machprec : error ;" + endif + + + if( c05factor .le.zero ) then + write(6,'("readin : fatal : myid=",i3," ; c05factor .le.zero ; error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "readin : c05factor .le.zero : error ;" + endif + !FATAL( readin, mfreeits .lt.zero , error ) - FATAL( readin, Igeometry.eq.3 .and. pcondense.le.zero, pcondense must be positive ) + + if( Igeometry.eq.3 .and. pcondense.le.zero ) then + write(6,'("readin : fatal : myid=",i3," ; Igeometry.eq.3 .and. pcondense.le.zero ; pcondense must be positive ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "readin : Igeometry.eq.3 .and. pcondense.le.zero : pcondense must be positive ;" + endif + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -1355,7 +1597,13 @@ subroutine check_inputs() 1050 format("readin : ",f10.2," : odetol="es10.2" ; nPpts="i6" ;") 1051 format("readin : ", 10x ," : LHevalues="L2" ; LHevectors="L2" ; LHmatrix="L2" ; Lperturbed="i2" ; dpp="i3" ; dqq="i3" ; dRZ="es16.8" ; Lcheck="i3" ; Ltiming="L2" ;") - FATAL( readin, odetol.le.zero, input error ) + + if( odetol.le.zero ) then + write(6,'("readin : fatal : myid=",i3," ; odetol.le.zero ; input error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "readin : odetol.le.zero : input error ;" + endif + !FATAL( readin, absreq.le.zero, input error ) !FATAL( readin, relreq.le.zero, input error ) !FATAL( readin, absacc.le.zero, input error ) @@ -1369,7 +1617,12 @@ subroutine check_inputs() write(ounit,'("readin : ", 10x ," : ")') - RETURN(readin) + +9999 continue + cput = MPI_WTIME() + Treadin = Treadin + ( cput-cpuo ) + return + end subroutine ! check_inputs @@ -1380,164 +1633,376 @@ subroutine broadcast_inputs use fileunits use inputlist - LOCALS - ClBCAST( ext , 100, 0 ) +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + + call MPI_BCAST(ext ,100,MPI_CHARACTER,0 ,MPI_COMM_SPEC,ierr) + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! !> **broadcast physicslist** - if( Wreadin ) then ; cput = GETTIME ; write(ounit,'("readin : ",f10.2," : broadcasting physicslist from ext.sp ;")') cput-cpus + if( Wreadin ) then ; cput = MPI_WTIME() ; write(ounit,'("readin : ",f10.2," : broadcasting physicslist from ext.sp ;")') cput-cpus endif - IlBCAST( Igeometry , 1, 0 ) - IlBCAST( Istellsym , 1, 0 ) - IlBCAST( Lfreebound , 1, 0 ) - RlBCAST( phiedge , 1, 0 ) - RlBCAST( curtor , 1, 0 ) - RlBCAST( curpol , 1, 0 ) - RlBCAST( gamma , 1, 0 ) - IlBCAST( Nfp , 1, 0 ) - IlBCAST( Nvol , 1, 0 ) - IlBCAST( Mpol , 1, 0 ) - IlBCAST( Ntor , 1, 0 ) - IlBCAST( Lrad , MNvol+1, 0 ) - RlBCAST( tflux , MNvol+1, 0 ) - RlBCAST( pflux , MNvol+1, 0 ) - RlBCAST( helicity , MNvol , 0 ) - RlBCAST( pscale , 1, 0 ) - RlBCAST( pressure , MNvol+1, 0 ) - IlBCAST( Ladiabatic , 1, 0 ) - RlBCAST( adiabatic , MNvol+1, 0 ) - RlBCAST( mu , MNvol+1, 0 ) - RlBCAST( Ivolume , MNvol+1, 0 ) - RlBCAST( Isurf , MNvol+1, 0 ) - IlBCAST( Lconstraint, 1, 0 ) - IlBCAST( pl , MNvol , 0 ) - IlBCAST( ql , MNvol , 0 ) - IlBCAST( pr , MNvol , 0 ) - IlBCAST( qr , MNvol , 0 ) - RlBCAST( iota , MNvol , 0 ) - IlBCAST( lp , MNvol , 0 ) - IlBCAST( lq , MNvol , 0 ) - IlBCAST( rp , MNvol , 0 ) - IlBCAST( rq , MNvol , 0 ) - RlBCAST( oita , MNvol , 0 ) - RlBCAST( mupftol , 1, 0 ) - IlBCAST( mupfits , 1, 0 ) - IlBCAST( Lreflect , 1, 0 ) - RlBCAST( rpol , 1, 0 ) - RlBCAST( rtor , 1, 0 ) + + call MPI_BCAST( Igeometry , 1, MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST( Istellsym , 1, MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST( Lfreebound , 1, MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST(phiedge ,1,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(curtor ,1,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(curpol ,1,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(gamma ,1,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST( Nfp , 1, MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST( Nvol , 1, MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST( Mpol , 1, MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST( Ntor , 1, MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST( Lrad , MNvol+1, MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST(tflux ,MNvol+1,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(pflux ,MNvol+1,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(helicity ,MNvol ,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(pscale ,1,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(pressure ,MNvol+1,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST( Ladiabatic , 1, MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST(adiabatic ,MNvol+1,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(mu ,MNvol+1,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(Ivolume ,MNvol+1,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(Isurf ,MNvol+1,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST( Lconstraint, 1, MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST( pl , MNvol , MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST( ql , MNvol , MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST( pr , MNvol , MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST( qr , MNvol , MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST(iota ,MNvol ,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST( lp , MNvol , MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST( lq , MNvol , MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST( rp , MNvol , MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST( rq , MNvol , MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST(oita ,MNvol ,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(mupftol ,1,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST( mupfits , 1, MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST( Lreflect , 1, MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST(rpol ,1,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(rtor ,1,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! !> **broadcast numericlist** - if( Wreadin ) then ; cput = GETTIME ; write(ounit,'("readin : ",f10.2," : broadcasting numericlist from ext.sp ;")') cput-cpus + if( Wreadin ) then ; cput = MPI_WTIME() ; write(ounit,'("readin : ",f10.2," : broadcasting numericlist from ext.sp ;")') cput-cpus endif - IlBCAST( Linitialize, 1, 0 ) - IlBCAST( LautoinitBn, 1, 0 ) - IlBCAST( Lzerovac , 1, 0 ) - IlBCAST( Ndiscrete , 1, 0 ) - IlBCAST( Nquad , 1, 0 ) - IlBCAST( iMpol , 1, 0 ) - IlBCAST( iNtor , 1, 0 ) - IlBCAST( Lsparse , 1, 0 ) - IlBCAST( Lsvdiota , 1, 0 ) - IlBCAST( imethod , 1, 0 ) - IlBCAST( iorder , 1, 0 ) - IlBCAST( iprecon , 1, 0 ) - RlBCAST( iotatol , 1, 0 ) - IlBCAST( Lextrap , 1, 0 ) - IlBCAST( Mregular , 1, 0 ) - IlBCAST( Lrzaxis , 1, 0 ) - IlBCAST( Ntoraxis , 1, 0 ) + + call MPI_BCAST( Linitialize, 1, MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST( LautoinitBn, 1, MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST( Lzerovac , 1, MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST( Ndiscrete , 1, MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST( Nquad , 1, MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST( iMpol , 1, MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST( iNtor , 1, MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST( Lsparse , 1, MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST( Lsvdiota , 1, MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST( imethod , 1, MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST( iorder , 1, MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST( iprecon , 1, MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST(iotatol ,1,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST( Lextrap , 1, MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST( Mregular , 1, MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST( Lrzaxis , 1, MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST( Ntoraxis , 1, MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! !> **broadcast globallist** - if( Wreadin ) then ; cput = GETTIME ; write(ounit,'("readin : ",f10.2," : broadcasting globallist from ext.sp ;")') cput-cpus + if( Wreadin ) then ; cput = MPI_WTIME() ; write(ounit,'("readin : ",f10.2," : broadcasting globallist from ext.sp ;")') cput-cpus endif - IlBCAST( Lfindzero , 1 , 0 ) - RlBCAST( escale , 1 , 0 ) - RlBCAST( opsilon , 1 , 0 ) - RlBCAST( pcondense , 1 , 0 ) - RlBCAST( epsilon , 1 , 0 ) - RlBCAST( wpoloidal , 1 , 0 ) - RlBCAST( upsilon , 1 , 0 ) - RlBCAST( forcetol , 1 , 0 ) - RlBCAST( c05xmax , 1 , 0 ) - RlBCAST( c05xtol , 1 , 0 ) - RlBCAST( c05factor , 1 , 0 ) - LlBCAST( LreadGF , 1 , 0 ) - IlBCAST( mfreeits , 1 , 0 ) - RlBCAST( gBntol , 1 , 0 ) - RlBCAST( gBnbld , 1 , 0 ) - RlBCAST( vcasingeps, 1 , 0 ) - RlBCAST( vcasingtol, 1 , 0 ) - IlBCAST( vcasingits, 1 , 0 ) - IlBCAST( vcasingper, 1 , 0 ) + + call MPI_BCAST( Lfindzero , 1 , MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST(escale ,1 ,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(opsilon ,1 ,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(pcondense ,1 ,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(epsilon ,1 ,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(wpoloidal ,1 ,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(upsilon ,1 ,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(forcetol ,1 ,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(c05xmax ,1 ,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(c05xtol ,1 ,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(c05factor ,1 ,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(LreadGF ,1 ,MPI_LOGICAL,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST( mfreeits , 1 , MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST(gBntol ,1 ,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(gBnbld ,1 ,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(vcasingeps,1 ,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(vcasingtol,1 ,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST( vcasingits, 1 , MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST( vcasingper, 1 , MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! !> **broadcast locallist** - if( Wreadin ) then ; cput = GETTIME ; write(ounit,'("readin : ",f10.2," : broadcasting locallist from ext.sp ;")') cput-cpus + if( Wreadin ) then ; cput = MPI_WTIME() ; write(ounit,'("readin : ",f10.2," : broadcasting locallist from ext.sp ;")') cput-cpus endif - IlBCAST( LBeltrami , 1, 0 ) - IlBCAST( Linitgues , 1, 0 ) - RlBCAST( maxrndgues , 1, 0) - IlBCAST( Lmatsolver , 1, 0 ) - IlBCAST( NiterGMRES , 1, 0 ) - RlBCAST( epsGMRES , 1, 0 ) - IlBCAST( LGMRESprec , 1, 0 ) - RlBCAST( epsILU , 1, 0 ) + + call MPI_BCAST( LBeltrami , 1, MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST( Linitgues , 1, MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST(maxrndgues ,1,MPI_DOUBLE_PRECISION,0,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST( Lmatsolver , 1, MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST( NiterGMRES , 1, MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST(epsGMRES ,1,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST( LGMRESprec , 1, MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST(epsILU ,1,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + ! IlBCAST( Lposdef , 1, 0 ) ! redundant; !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! !> **broadcast diagnosticslist** - if( Wreadin ) then ; cput = GETTIME ; write(ounit,'("readin : ",f10.2," : broadcasting diagnosticslist from ext.sp ;")') cput-cpus + if( Wreadin ) then ; cput = MPI_WTIME() ; write(ounit,'("readin : ",f10.2," : broadcasting diagnosticslist from ext.sp ;")') cput-cpus endif - RlBCAST( odetol , 1 , 0 ) + + call MPI_BCAST(odetol ,1 ,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + !RlBCAST( absreq , 1 , 0 ) !RlBCAST( relreq , 1 , 0 ) !RlBCAST( absacc , 1 , 0 ) !RlBCAST( epsr , 1 , 0 ) - IlBCAST( nPpts , 1 , 0 ) - RlBCAST( Ppts , 1 , 0 ) - IlBCAST( nPtrj , MNvol+1, 0 ) - LlBCAST( LHevalues , 1 , 0 ) - LlBCAST( LHevectors, 1 , 0 ) - LlBCAST( Ltransform, 1 , 0 ) - LlBCAST( LHmatrix , 1 , 0 ) - IlBCAST( Lperturbed, 1 , 0 ) - IlBCAST( dpp , 1 , 0 ) - IlBCAST( dqq , 1 , 0 ) - IlBCAST( Lerrortype, 1 , 0 ) - IlBCAST( Ngrid , 1 , 0 ) - RlBCAST( dRZ , 1 , 0 ) - IlBCAST( Lcheck , 1 , 0 ) - LlBCAST( Ltiming , 1 , 0 ) + + call MPI_BCAST( nPpts , 1 , MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST(Ppts ,1 ,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST( nPtrj , MNvol+1, MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST(LHevalues ,1 ,MPI_LOGICAL,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(LHevectors,1 ,MPI_LOGICAL,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(Ltransform,1 ,MPI_LOGICAL,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(LHmatrix ,1 ,MPI_LOGICAL,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST( Lperturbed, 1 , MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST( dpp , 1 , MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST( dqq , 1 , MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST( Lerrortype, 1 , MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST( Ngrid , 1 , MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST(dRZ ,1 ,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST( Lcheck , 1 , MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + + + call MPI_BCAST(Ltiming ,1 ,MPI_LOGICAL,0 ,MPI_COMM_SPEC,ierr) + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! !> **broadcast screenlist** - if( Wreadin ) then ; cput = GETTIME ; write(ounit,'("readin : ",f10.2," : broadcasting screenlist from ext.sp ;")') cput-cpus + if( Wreadin ) then ; cput = MPI_WTIME() ; write(ounit,'("readin : ",f10.2," : broadcasting screenlist from ext.sp ;")') cput-cpus endif ! BSCREENLIST ! broadcast screenlist; this is expanded by Makefile; do not remove; - LlBCAST( Wreadin, 1, 0 ) - LlBCAST( Wwrtend, 1, 0 ) - LlBCAST( Wmacros, 1, 0 ) + + call MPI_BCAST(Wreadin,1,MPI_LOGICAL,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(Wwrtend,1,MPI_LOGICAL,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(Wmacros,1,MPI_LOGICAL,0 ,MPI_COMM_SPEC,ierr) + end subroutine ! broadcast_inputs @@ -1558,28 +2023,44 @@ subroutine wrtend !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS - - INTEGER :: vvol !< iteration variable over all nested volumes - INTEGER :: imn !< iteration variable for all Fourier harmonics - INTEGER :: ii !< iteration variable for all Fourier harmonics - INTEGER :: jj !< iteration variable - INTEGER :: kk !< iteration variable - INTEGER :: jk !< iteration variable - INTEGER :: Lcurvature !< curvature flag (?) - INTEGER :: mm !< current poloidal mode number - INTEGER :: nn !< current toroidal mode number - REAL :: lss !< (?) - REAL :: teta !< (?) - REAL :: zeta !< (?) - REAL :: st(1:Node) !< (?) - REAL :: Bst(1:Node) !< (?) - REAL :: BR !< (?) - REAL :: BZ !< (?) - REAL :: BP !< (?) +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + integer :: vvol !< iteration variable over all nested volumes + integer :: imn !< iteration variable for all Fourier harmonics + integer :: ii !< iteration variable for all Fourier harmonics + integer :: jj !< iteration variable + integer :: kk !< iteration variable + integer :: jk !< iteration variable + integer :: Lcurvature !< curvature flag (?) + integer :: mm !< current poloidal mode number + integer :: nn !< current toroidal mode number + + real(wp) :: lss !< (?) + real(wp) :: teta !< (?) + real(wp) :: zeta !< (?) + real(wp) :: st(1:Node) !< (?) + real(wp) :: Bst(1:Node) !< (?) + real(wp) :: BR !< (?) + real(wp) :: BZ !< (?) + real(wp) :: BP !< (?) + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif - BEGIN(wrtend) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -1588,14 +2069,14 @@ subroutine wrtend !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! #ifdef DEBUG - if( Wwrtend ) then ; cput = GETTIME ; write(ounit,'("wrtend : ",f10.2," : myid=",i3," ; opening/writing ext.sp.end ;")') cput-cpus, myid + if( Wwrtend ) then ; cput = MPI_WTIME() ; write(ounit,'("wrtend : ",f10.2," : myid=",i3," ; opening/writing ext.sp.end ;")') cput-cpus, myid endif #endif open(iunit,file=trim(ext)//".sp.end",status="unknown") ! restart input file; #ifdef DEBUG - if( Wwrtend ) then ; cput = GETTIME ; write(ounit,'("wrtend : ",f10.2," : myid=",i3," ; writing physicslist ;")') cput-cpus, myid + if( Wwrtend ) then ; cput = MPI_WTIME() ; write(ounit,'("wrtend : ",f10.2," : myid=",i3," ; writing physicslist ;")') cput-cpus, myid endif #endif @@ -1743,7 +2224,7 @@ subroutine wrtend write(iunit,'("/")') - if( Wwrtend ) then ; cput = GETTIME ; write(ounit,'("wrtend : ",f10.2," : myid=",i3," ; writing numericlist ;")') cput-cpus, myid + if( Wwrtend ) then ; cput = MPI_WTIME() ; write(ounit,'("wrtend : ",f10.2," : myid=",i3," ; writing numericlist ;")') cput-cpus, myid endif write(iunit,'("&numericlist")') @@ -1766,7 +2247,7 @@ subroutine wrtend write(iunit,'(" Ntoraxis = ",i9 )') Ntoraxis write(iunit,'("/")') - if( Wwrtend ) then ; cput = GETTIME ; write(ounit,'("wrtend : ",f10.2," : myid=",i3," ; writing locallist ;")') cput-cpus, myid + if( Wwrtend ) then ; cput = MPI_WTIME() ; write(ounit,'("wrtend : ",f10.2," : myid=",i3," ; writing locallist ;")') cput-cpus, myid endif write(iunit,'("&locallist")') @@ -1782,7 +2263,7 @@ subroutine wrtend !write(iunit,'(" Nmaxexp = ",i9 )') Nmaxexp write(iunit,'("/")') - if( Wwrtend ) then ; cput = GETTIME ; write(ounit,'("wrtend : ",f10.2," : myid=",i3," ; writing globallist ;")') cput-cpus, myid + if( Wwrtend ) then ; cput = MPI_WTIME() ; write(ounit,'("wrtend : ",f10.2," : myid=",i3," ; writing globallist ;")') cput-cpus, myid endif write(iunit,'("&globallist")') @@ -1807,7 +2288,7 @@ subroutine wrtend write(iunit,'(" vcasingper = ",i9 )') vcasingper write(iunit,'("/")') - if( Wwrtend ) then ; cput = GETTIME ; write(ounit,'("wrtend : ",f10.2," : myid=",i3," ; writing diagnosticslist ;")') cput-cpus, myid + if( Wwrtend ) then ; cput = MPI_WTIME() ; write(ounit,'("wrtend : ",f10.2," : myid=",i3," ; writing diagnosticslist ;")') cput-cpus, myid endif write(iunit,'("&diagnosticslist")') @@ -1830,7 +2311,7 @@ subroutine wrtend write(iunit,'(" Ltiming = ",L9 )') Ltiming write(iunit,'("/")') - if( Wwrtend ) then ; cput = GETTIME ; write(ounit,'("wrtend : ",f10.2," : myid=",i3," ; writing screenlist ;")') cput-cpus, myid + if( Wwrtend ) then ; cput = MPI_WTIME() ; write(ounit,'("wrtend : ",f10.2," : myid=",i3," ; writing screenlist ;")') cput-cpus, myid endif write(iunit,'("&screenlist")') @@ -1841,10 +2322,34 @@ subroutine wrtend write(iunit,'("/")') #ifdef DEBUG - FATAL( wrtend, .not.allocated(iRbc), error ) - FATAL( wrtend, .not.allocated(iZbs), error ) - FATAL( wrtend, .not.allocated(iRbs), error ) - FATAL( wrtend, .not.allocated(iZbc), error ) + + if( .not.allocated(iRbc) ) then + write(6,'("wrtend : fatal : myid=",i3," ; .not.allocated(iRbc) ; error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "wrtend : .not.allocated(iRbc) : error ;" + endif + + + if( .not.allocated(iZbs) ) then + write(6,'("wrtend : fatal : myid=",i3," ; .not.allocated(iZbs) ; error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "wrtend : .not.allocated(iZbs) : error ;" + endif + + + if( .not.allocated(iRbs) ) then + write(6,'("wrtend : fatal : myid=",i3," ; .not.allocated(iRbs) ; error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "wrtend : .not.allocated(iRbs) : error ;" + endif + + + if( .not.allocated(iZbc) ) then + write(6,'("wrtend : fatal : myid=",i3," ; .not.allocated(iZbc) ; error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "wrtend : .not.allocated(iZbc) : error ;" + endif + #endif ! write initial guess of interface geometry @@ -1854,13 +2359,18 @@ subroutine wrtend close(iunit) #ifdef DEBUG - if( Wwrtend ) then ; cput = GETTIME ; write(ounit,'("wrtend : ",f10.2," : myid=",i3," ; wrote ext.sp.end ;")') cput-cpus, myid + if( Wwrtend ) then ; cput = MPI_WTIME() ; write(ounit,'("wrtend : ",f10.2," : myid=",i3," ; wrote ext.sp.end ;")') cput-cpus, myid endif #endif !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - RETURN(wrtend) + +9999 continue + cput = MPI_WTIME() + Twrtend = Twrtend + ( cput-cpuo ) + return + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -1876,9 +2386,17 @@ end subroutine wrtend !> @param vvol volume to check subroutine IsMyVolume(vvol) -LOCALS -INTEGER, intent(in) :: vvol +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + +integer, intent(in) :: vvol !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -1896,9 +2414,17 @@ end subroutine IsMyVolume !> \brief Returns which MPI node is associated to a given volume. subroutine WhichCpuID(vvol, cpu_id) -LOCALS -INTEGER :: vvol, cpu_id +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + +integer :: vvol, cpu_id !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -1914,7 +2440,7 @@ end module allglobal !> \brief Interface to FFTW library module fftw_interface ! JAB; 25 Jul 17 - + use mod_kinds, only: wp => dp use, intrinsic :: iso_c_binding implicit none diff --git a/src/h5utils.f90_tmp b/src/h5utils.f90_tmp new file mode 100644 index 00000000..780a2047 --- /dev/null +++ b/src/h5utils.f90_tmp @@ -0,0 +1,946 @@ +m4_define(HDEFGRP,{! macro expansion of hdefgrp; +! define a HDF5 group in _1 with name _2 and save reference into hid_t _3; _4 and _5 should be __FILE__ and __LINE__ + + call h5lexists_f($1, "$2", grp_exists, hdfier) + + if (.not.grp_exists) then + ! if group does not exist, create it + call h5gcreate_f($1, "$2", $3, hdfier) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5gcreate_f from hdefgrp at $4:$5 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5gcreate_f from hdefgrp at $4:$5 ;" + endif + else + ! if the group already exists, open it + call h5gopen_f($1, "$2", $3, hdfier) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5gopen_f from hdefgrp at $4:$5 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5gopen_f from hdefgrp at $4:$5 ;" + endif + endif + + ! macro expansion of hdefgrp; end;})m4_dnl +m4_define(HCLOSEGRP,{! macro expansion of hclosegrp; +! close a HDF5 group given in _1 + + call h5gclose_f($1, hdfier) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5gclose_f from hclosegrp at $4:$5 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5gclose_f from hclosegrp at $4:$5 ;" + endif + + ! macro expansion of hclosegrp; end;})m4_dnl +m4_define(H5DESCR,{! macro expansion of h5descr; +! describe an already-open HDF5 object given in _1 at location _2 with text given in _3 and leave it open; _4 and _5 should be __FILE__ and __LINE__ +! also write a LaTeX comment on that output object +!latex \item{\verb+$2+} $3 + attr_data = "$3" + attrlen=len(attr_data) + + call h5screate_simple_f(arank, adims, aspace_id, hdfier) ! Create scalar data space for the attribute. + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from h5descr at $4:$5 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5screate_simple_f from h5descr at $4:$5 ;" + endif + + call h5tcopy_f(H5T_NATIVE_CHARACTER, atype_id, hdfier) ! Create datatype for the attribute. + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5tcopy_f from h5descr at $4:$5 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5tcopy_f from h5descr at $4:$5 ;" + endif + + call h5tset_size_f(atype_id, attrlen, hdfier) ! Create datatype for the attribute. + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5tset_size_f from h5descr at $4:$5 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5tset_size_f from h5descr at $4:$5 ;" + endif + + call h5acreate_f($1, aname, atype_id, aspace_id, attr_id, hdfier) ! create descriptive attribute + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5acreate_f from h5descr at $4:$5 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5acreate_f from h5descr at $4:$5 ;" + endif + + call h5awrite_f(attr_id, atype_id, attr_data, adims, hdfier) ! Write the attribute data. + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5awrite_f from h5descr at $4:$5 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5awrite_f from h5descr at $4:$5 ;" + endif + + call h5aclose_f(attr_id, hdfier) ! Close the attribute. + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5aclose_f from h5descr at $4:$5 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5aclose_f from h5descr at $4:$5 ;" + endif + + call h5tclose_f(atype_id, hdfier) ! Close the attribute datatype. + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5tclose_f from h5descr at $4:$5 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5tclose_f from h5descr at $4:$5 ;" + endif + + call h5sclose_f(aspace_id, hdfier) ! Terminate access to the data space. + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5sclose_f from h5descr at $4:$5 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5sclose_f from h5descr at $4:$5 ;" + endif + + ! macro expansion of h5descr; end;})m4_dnl + m4_define(H5DESCR_CDSET,{! macro expansion of h5descr_cdset; +! describe an already-open HDF5 dataset identified by dset_id at location _1 with text given in _2 and close it at the end; _3 and _4 should be __FILE__ and __LINE__ +! also write a LaTeX comment on that output object +!latex \item{\verb+$1+} $2 + attr_data = "$2" + attrlen=len(attr_data) + + ! Create scalar data space for the attribute. + call h5screate_simple_f(arank, adims, aspace_id, hdfier) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from h5descr_cdset at $3:$4 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5screate_simple_f from h5descr_cdset at $3:$4 ;" + endif + + ! Create datatype for the attribute. + call h5tcopy_f(H5T_NATIVE_CHARACTER, atype_id, hdfier) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5tcopy_f from h5descr_cdset at $3:$4 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5tcopy_f from h5descr_cdset at $3:$4 ;" + endif + + call h5tset_size_f(atype_id, attrlen, hdfier) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5tset_size_f from h5descr_cdset at $3:$4 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5tset_size_f from h5descr_cdset at $3:$4 ;" + endif + + ! create descriptive attribute + call h5acreate_f(dset_id, aname, atype_id, aspace_id, attr_id, hdfier) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5acreate_f from h5descr_cdset at $3:$4 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5acreate_f from h5descr_cdset at $3:$4 ;" + endif + + ! Write the attribute data. + call h5awrite_f(attr_id, atype_id, attr_data, adims, hdfier) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5awrite_f from h5descr_cdset at $3:$4 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5awrite_f from h5descr_cdset at $3:$4 ;" + endif + + ! Close the attribute. + call h5aclose_f(attr_id, hdfier) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5aclose_f from h5descr_cdset at $3:$4 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5aclose_f from h5descr_cdset at $3:$4 ;" + endif + + ! Close the attribute datatype. + call h5tclose_f(atype_id, hdfier) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5tclose_f from h5descr_cdset at $3:$4 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5tclose_f from h5descr_cdset at $3:$4 ;" + endif + + ! Terminate access to the data space. + call h5sclose_f(aspace_id, hdfier) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5sclose_f from h5descr_cdset at $3:$4 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5sclose_f from h5descr_cdset at $3:$4 ;" + endif + + call h5dclose_f(dset_id, hdfier) ! terminate dataset; + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5dclose_f from h5descr_cdset at $3:$4 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5dclose_f from h5descr_cdset at $3:$4 ;" + endif + + ! macro expansion of h5descr_cdset; end;})m4_dnl +m4_define(HWRITELV,{! macro expansion of hwritelv; +! write logical variable _4 (scalar (_2=1) or rank-1 (_2=length)) into a dataset named _3 into group _1; _5 and _6 should be __FILE__ and __LINE__ +! example: hwritelv( grpInputGlobal, 1, LreadGF, (/ LreadGF /) ) ! scalar +! example: hwritelv( grpInput, 5, success, success(1:5) ) ! rank-1 + +#ifdef DEBUG + if( Wmacros ) write(ounit,'("macros : ", 10x ," : myid=",i3," ; writing $3 ;")') myid +#endif + + rank = 1 ; onedims(1) = $2 + + if( $2.le.0 ) then + + write(6,'("sphdf5 : "10x" : error calling hwriteiv ; $3 : $2.le.0 at $5:$6 ;")') + + else + + call h5screate_simple_f( rank, onedims, space_id, hdfier ) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from hwritelv at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5screate_simple_f from hwritelv at $5:$6 ;" + endif + + ! temporarily disable error printing to not confuse users + call h5eset_auto_f(0, hdfier) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwritelv at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5eset_auto_f from hwritelv at $5:$6 ;" + endif + + ! check if dataset can be opened + call h5dopen_f($1, "$3", dset_id, hdfier) + if (hdfier.lt.0) then + var_exists = .false. + if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $3 does not exist yet, creating it" + endif + else + var_exists = .true. + if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $3 exists already, opening it" + endif + endif + + ! re-establish previous state of error printing to be sensitive to "real" errors + call h5eset_auto_f(internalHdf5Msg, hdfier) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwritelv at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5eset_auto_f from hwritelv at $5:$6 ;" + endif + + ! if the dataset does not exist already, create it. Otherwise, it should be open already + if (.not.var_exists) then + call h5dcreate_f( $1, "$3", H5T_NATIVE_INTEGER, space_id, dset_id, hdfier ) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5dcreate_f from hwritelv at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5dcreate_f from hwritelv at $5:$6 ;" + endif + endif + + call h5dwrite_f( dset_id, H5T_NATIVE_INTEGER, merge(1,0,$4) , onedims, hdfier ) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5dwrite_f from hwritelv at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5dwrite_f from hwritelv at $5:$6 ;" + endif + + call h5dclose_f(dset_id, hdfier) ! terminate dataset; + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5dclose_f from hwritelv at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5dclose_f from hwritelv at $5:$6 ;" + endif + + endif + + ! macro expansion of hwritelv; end;})m4_dnl +m4_define(HWRITELV_LO,{! macro expansion of hwritelv_lo; +! write logical variable _4 (scalar (_2=1) or rank-1 (_2=length)) into a dataset named _3 into group _1 and leave dataset open for e.g. adding an attribute; _5 and _6 should be __FILE__ and __LINE__ +! example: hwritelv_lo( grpInputGlobal, 1, LreadGF, (/ LreadGF /) ) ! scalar +! example: hwritelv_lo( grpInput, 5, success, success(1:5) ) ! rank-1 +! and close it using h5descr_cdset( /input/global/LreadGF, reading flag for GF ) + +#ifdef DEBUG + if( Wmacros ) write(ounit,'("macros : ", 10x ," : myid=",i3," ; writing $3 ;")') myid +#endif + + rank = 1 ; onedims(1) = $2 + + if( $2.le.0 ) then + + write(6,'("sphdf5 : "10x" : error calling hwriteiv ; $3 : $2.le.0 at $5:$6 ;")') + + else + + call h5screate_simple_f( rank, onedims, space_id, hdfier ) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from hwritelv_lo at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5screate_simple_f from hwritelv_lo at $5:$6 ;" + endif + + ! temporarily disable error printing to not confuse users + call h5eset_auto_f(0, hdfier) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwritelv_lo at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5eset_auto_f from hwritelv_lo at $5:$6 ;" + endif + + ! check if dataset can be opened + call h5dopen_f($1, "$3", dset_id, hdfier) + if (hdfier.lt.0) then + var_exists = .false. + if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $3 does not exist yet, creating it" + endif + else + var_exists = .true. + if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $3 exists already, opening it" + endif + endif + + ! re-establish previous state of error printing to be sensitive to "real" errors + call h5eset_auto_f(internalHdf5Msg, hdfier) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwritelv_lo at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5eset_auto_f from hwritelv_lo at $5:$6 ;" + endif + + ! if the dataset does not exist already, create it. Otherwise, it should be open already + if (.not.var_exists) then + call h5dcreate_f( $1, "$3", H5T_NATIVE_INTEGER, space_id, dset_id, hdfier ) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5dcreate_f from hwritelv_lo at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5dcreate_f from hwritelv_lo at $5:$6 ;" + endif + endif + + call h5dwrite_f( dset_id, H5T_NATIVE_INTEGER, merge(1,0,$4) , onedims, hdfier ) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5dwrite_f from hwritelv_lo at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5dwrite_f from hwritelv_lo at $5:$6 ;" + endif + + endif + + ! macro expansion of hwritelv_lo; end;})m4_dnl +m4_define(HWRITEIV,{! macro expansion of hwriteiv; +! write integer variable _4 (scalar (_2=1) or rank-1 (_2=length)) into a dataset named _3 into group _1; _5 and _6 should be __FILE__ and __LINE__ +! example: hwriteiv( grpInputPhysics, 1, Igeometry, (/ Igeometry /) ) ! scalar +! example: hwriteiv( grpInputPhysics, Mvol, Lrad, Lrad(1:Mvol) ) ! rank-1 + +#ifdef DEBUG + if( Wmacros ) write(ounit,'("macros : ", 10x ," : myid=",i3," ; writing $3 ;")') myid +#endif + + rank = 1 ; onedims(1) = $2 + + if( $2.le.0 ) then + + write(6,'("sphdf5 : "10x" : error calling hwriteiv ; $3 : $2.le.0 at $5:$6 ;")') + + else + + call h5screate_simple_f( rank, onedims, space_id, hdfier ) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from hwriteiv at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5screate_simple_f from hwriteiv at $5:$6 ;" + endif + + ! temporarily disable error printing to not confuse users + call h5eset_auto_f(0, hdfier) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriteiv at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5eset_auto_f from hwriteiv at $5:$6 ;" + endif + + ! check if dataset can be opened + call h5dopen_f($1, "$3", dset_id, hdfier) + if (hdfier.lt.0) then + var_exists = .false. + if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $3 does not exist yet, creating it" + endif + else + var_exists = .true. + if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $3 exists already, opening it" + endif + endif + + ! re-establish previous state of error printing to be sensitive to "real" errors + call h5eset_auto_f(internalHdf5Msg, hdfier) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriteiv at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5eset_auto_f from hwriteiv at $5:$6 ;" + endif + + ! if the dataset does not exist already, create it. Otherwise, it should be open already + if (.not.var_exists) then + call h5dcreate_f( $1, "$3", H5T_NATIVE_INTEGER, space_id, dset_id, hdfier ) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5dcreate_f from hwriteiv at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5dcreate_f from hwriteiv at $5:$6 ;" + endif + endif + + call h5dwrite_f( dset_id, H5T_NATIVE_INTEGER, $4, onedims, hdfier ) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5dwrite_f from hwriteiv at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5dwrite_f from hwriteiv at $5:$6 ;" + endif + + call h5dclose_f(dset_id, hdfier) ! terminate dataset; + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5dclose_f from hwriteiv at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5dclose_f from hwriteiv at $5:$6 ;" + endif + + endif + + ! macro expansion of hwriteiv; end;})m4_dnl +m4_define(HWRITEIV_LO,{! macro expansion of hwriteiv_lo; +! write integer variable _4 (scalar (_2=1) or rank-1 (_2=length)) into a dataset named _3 into group _1 and leave the dataset open for e.g. adding and attribute +! example: hwriteiv( grpInputPhysics, 1, Igeometry, (/ Igeometry /) ) ! scalar +! example: hwriteiv( grpInputPhysics, Mvol, Lrad, Lrad(1:Mvol) ) ! rank-1 +! and close it using h5descr_cdset( /input/physics/Igeometry, geometry identifier ) + +#ifdef DEBUG + if( Wmacros ) write(ounit,'("macros : ", 10x ," : myid=",i3," ; writing $3 ;")') myid +#endif + + rank = 1 ; onedims(1) = $2 + + if( $2.le.0 ) then + + write(6,'("sphdf5 : "10x" : error calling hwriteiv_lo ; $3 : $2.le.0 at $5:$6 ;")') + + else + + call h5screate_simple_f( rank, onedims, space_id, hdfier ) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from hwriteiv_lo at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5screate_simple_f from hwriteiv_lo at $5:$6 ;" + endif + + ! temporarily disable error printing to not confuse users + call h5eset_auto_f(0, hdfier) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriteiv_lo at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5eset_auto_f from hwriteiv_lo at $5:$6 ;" + endif + + ! check if dataset can be opened + call h5dopen_f($1, "$3", dset_id, hdfier) + if (hdfier.lt.0) then + var_exists = .false. + if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $3 does not exist yet, creating it" + endif + else + var_exists = .true. + if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $3 exists already, opening it" + endif + endif + + ! re-establish previous state of error printing to be sensitive to "real" errors + call h5eset_auto_f(internalHdf5Msg, hdfier) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriteiv_lo at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5eset_auto_f from hwriteiv_lo at $5:$6 ;" + endif + + ! if the dataset does not exist already, create it. Otherwise, it should be open already + if (.not.var_exists) then + call h5dcreate_f( $1, "$3", H5T_NATIVE_INTEGER, space_id, dset_id, hdfier ) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5dcreate_f from hwriteiv_lo at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5dcreate_f from hwriteiv_lo at $5:$6 ;" + endif + endif + + call h5dwrite_f( dset_id, H5T_NATIVE_INTEGER, $4, onedims, hdfier ) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5dwrite_f from hwriteiv_lo at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5dwrite_f from hwriteiv_lo at $5:$6 ;" + endif + + endif + + ! macro expansion of hwriteiv_lo; end;})m4_dnl +m4_define(HWRITERV,{! macro expansion of hwriterv; +! write real variable _4 (scalar (_2=1) or rank-1 (_2=length)) into a dataset named _3 into group _1; _5 and _6 should be __LINE__ and __FILE__ +! example: hwriterv( grpInputPhysics, 1, phiedge, (/ phiedge /) ) ! scalar +! example: hwriterv( grpInputPhysics, Mvol, tflux, tflux(1:Mvol) ) ! rank-1 + +#ifdef DEBUG + if( Wmacros ) write(ounit,'("macros : ", 10x ," : myid=",i3," ; writing $3 ;")') myid +#endif + + rank = 1 ; onedims(1) = $2 + + if( $2.le.0 ) then + + write(6,'("sphdf5 : "10x" : error calling hwriterv ; $3 : $2.le.0 at $5:$6 ;")') + + else + + call h5screate_simple_f( rank, onedims, space_id, hdfier ) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from hwriterv at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5screate_simple_f from hwriterv at $5:$6 ;" + endif + + ! temporarily disable error printing to not confuse users + call h5eset_auto_f(0, hdfier) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriterv at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5eset_auto_f from hwriterv at $5:$6 ;" + endif + + ! check if dataset can be opened + call h5dopen_f($1, "$3", dset_id, hdfier) + if (hdfier.lt.0) then + var_exists = .false. + if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $3 does not exist yet, creating it" + endif + else + var_exists = .true. + if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $3 exists already, opening it" + endif + endif + + ! re-establish previous state of error printing to be sensitive to "real" errors + call h5eset_auto_f(internalHdf5Msg, hdfier) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriterv at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5eset_auto_f from hwriterv at $5:$6 ;" + endif + + ! if the dataset does not exist already, create it. Otherwise, it should be open already + if (.not.var_exists) then + call h5dcreate_f( $1, "$3", H5T_NATIVE_DOUBLE, space_id, dset_id, hdfier ) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5dcreate_f from hwriterv at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5dcreate_f from hwriterv at $5:$6 ;" + endif + endif + + call h5dwrite_f( dset_id, H5T_NATIVE_DOUBLE, $4, onedims, hdfier ) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5dwrite_f from hwriterv at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5dwrite_f from hwriterv at $5:$6 ;" + endif + + call h5dclose_f(dset_id, hdfier) ! terminate dataset; + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5dclose_f from hwriterv at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5dclose_f from hwriterv at $5:$6 ;" + endif + + endif + + ! macro expansion of hwriterv; end;})m4_dnl +m4_define(HWRITERV_LO,{! macro expansion of hwriterv_lo; +! write real variable _4 (scalar (_2=1) or rank-1 (_2=length)) into a dataset named _3 into group _1 and leave it open, e.g. for adding an attribute; _5 and _6 should be __FILE__ and __LINE__ +! example: hwriterv( grpInputPhysics, 1, phiedge, (/ phiedge /) ) ! scalar +! example: hwriterv( grpInputPhysics, Mvol, tflux, tflux(1:Mvol) ) ! rank-1 +! and close it with h5descr_cdset( /input/physics/phiedge, total enclosed toroidal flux ) + +#ifdef DEBUG + if( Wmacros ) write(ounit,'("macros : ", 10x ," : myid=",i3," ; writing $3 ;")') myid +#endif + + rank = 1 ; onedims(1) = $2 + + if( $2.le.0 ) then + + write(6,'("sphdf5 : "10x" : error calling hwriterv ; $3 : $2.le.0 at $5:$6 ;")') + + else + + call h5screate_simple_f( rank, onedims, space_id, hdfier ) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from hwriterv_lo at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5screate_simple_f from hwriterv_lo at $5:$6 ;" + endif + + ! temporarily disable error printing to not confuse users + call h5eset_auto_f(0, hdfier) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriterv_lo at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5eset_auto_f from hwriterv_lo at $5:$6 ;" + endif + + ! check if dataset can be opened + call h5dopen_f($1, "$3", dset_id, hdfier) + if (hdfier.lt.0) then + var_exists = .false. + if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $3 does not exist yet, creating it" + endif + else + var_exists = .true. + if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $3 exists already, opening it" + endif + endif + + ! re-establish previous state of error printing to be sensitive to "real" errors + call h5eset_auto_f(internalHdf5Msg, hdfier) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriterv_lo at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5eset_auto_f from hwriterv_lo at $5:$6 ;" + endif + + ! if the dataset does not exist already, create it. Otherwise, it should be open already + if (.not.var_exists) then + call h5dcreate_f( $1, "$3", H5T_NATIVE_DOUBLE, space_id, dset_id, hdfier ) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5dcreate_f from hwriterv_lo at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5dcreate_f from hwriterv_lo at $5:$6 ;" + endif + endif + + call h5dwrite_f( dset_id, H5T_NATIVE_DOUBLE, $4, onedims, hdfier ) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5dwrite_f from hwriterv_lo at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5dwrite_f from hwriterv_lo at $5:$6 ;" + endif + + endif + + ! macro expansion of hwriterv_lo; end;})m4_dnl +m4_define(HWRITERA,{! macro expansion of hwritea; +! write real array _5 (_2 rows, _3 columns) into a dataset named _4 into group _1; _6 and _7 should be __FILE__ and __LINE__ +! example: hwritera( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Rbc, Rbc(-Ntor:Ntor,-Mpol:Mpol) ) + +#ifdef DEBUG + if( Wmacros ) write(ounit,'("macros : ", 10x ," : myid=",i3," ; writing $4 ;")') myid +#endif + + rank = 2 ; twodims(1:2) = (/ $2, $3 /) + + if( $2.le.0 .or. $3.le.0 ) then + + write(6,'("sphdf5 : "10x" : error calling hwritera ; $4 : $2.le.0 .or. $3.le.0 at $6:$7 ;")') + + else + + call h5screate_simple_f( rank, twodims, space_id, hdfier ) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from hwritera at $6:$7 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5screate_simple_f from hwritera at $6:$7 ;" + endif + + ! temporarily disable error printing to not confuse users + call h5eset_auto_f(0, hdfier) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwritera at $6:$7 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5eset_auto_f from hwritera at $6:$7 ;" + endif + + ! check if dataset can be opened + call h5dopen_f($1, "$4", dset_id, hdfier) + if (hdfier.lt.0) then + var_exists = .false. + if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $4 does not exist yet, creating it" + endif + else + var_exists = .true. + if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $4 exists already, opening it" + endif + endif + + ! re-establish previous state of error printing to be sensitive to "real" errors + call h5eset_auto_f(internalHdf5Msg, hdfier) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwritera at $6:$7 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5eset_auto_f from hwritera at $6:$7 ;" + endif + + ! if the dataset does not exist already, create it. Otherwise, it should be open already + if (.not.var_exists) then + call h5dcreate_f( $1, "$4", H5T_NATIVE_DOUBLE, space_id, dset_id, hdfier ) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5dcreate_f from hwritera at $6:$7 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5dcreate_f from hwritera at $6:$7 ;" + endif + endif + + call h5dwrite_f( dset_id, H5T_NATIVE_DOUBLE, $5, twodims, hdfier ) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5dwrite_f from hwritera at $6:$7 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5dwrite_f from hwritera at $6:$7 ;" + endif + + call h5dclose_f(dset_id, hdfier) ! terminate dataset; + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5dclose_f from hwritera at $6:$7 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5dclose_f from hwritera at $6:$7 ;" + endif + + endif + + ! macro expansion of hwritea; end;})m4_dnl +m4_define(HWRITERA_LO,{! macro expansion of hwritea_lo; +! write real array _5 (_2 rows, _3 columns) into a dataset named _4 into group _1 and leave it open, e.g. for adding an attribute; _6 and _7 should be __FILE__ and __LINE__ +! example: hwritera( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Rbc, Rbc(-Ntor:Ntor,-Mpol:Mpol) ) +! and close it then via h5descr_cdset( /input/physics/Rbc, boundary R cosine Fourier coefficients ) + +#ifdef DEBUG + if( Wmacros ) write(ounit,'("macros : ", 10x ," : myid=",i3," ; writing $4 ;")') myid +#endif + + rank = 2 ; twodims(1:2) = (/ $2, $3 /) + + if( $2.le.0 .or. $3.le.0 ) then + + write(6,'("sphdf5 : "10x" : error calling hwritera ; $4 : $2.le.0 .or. $3.le.0 at $6:$7 ;")') + + else + + call h5screate_simple_f( rank, twodims, space_id, hdfier ) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from hwritera_lo at $6:$7 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5screate_simple_f from hwritera_lo at $6:$7 ;" + endif + + ! temporarily disable error printing to not confuse users + call h5eset_auto_f(0, hdfier) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwritera_lo at $6:$7 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5eset_auto_f from hwritera_lo at $6:$7 ;" + endif + + ! check if dataset can be opened + call h5dopen_f($1, "$4", dset_id, hdfier) + if (hdfier.lt.0) then + var_exists = .false. + if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $4 does not exist yet, creating it" + endif + else + var_exists = .true. + if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $4 exists already, opening it" + endif + endif + + ! re-establish previous state of error printing to be sensitive to "real" errors + call h5eset_auto_f(internalHdf5Msg, hdfier) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwritera_lo at $6:$7 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5eset_auto_f from hwritera_lo at $6:$7 ;" + endif + + ! if the dataset does not exist already, create it. Otherwise, it should be open already + if (.not.var_exists) then + call h5dcreate_f( $1, "$4", H5T_NATIVE_DOUBLE, space_id, dset_id, hdfier ) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5dcreate_f from hwritera_lo at $6:$7 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5dcreate_f from hwritera_lo at $6:$7 ;" + endif + endif + + call h5dwrite_f( dset_id, H5T_NATIVE_DOUBLE, $5, twodims, hdfier ) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5dwrite_f from hwritera_lo at $6:$7 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5dwrite_f from hwritera_lo at $6:$7 ;" + endif + + endif + + ! macro expansion of hwritea_lo; end;})m4_dnl +m4_define(HWRITERC,{! macro expansion of hwriterc; +! write real cube _6 (_2 rows, _3 columns, _4 pages) into a dataset named _5 into group _1; _7 and _8 should containt __FILE__ and __LINE__ +! example: hwriterc( grpOutput, (Mrad+1), 2, 2, TT, TT(0:Mrad,0:1,0:1) ) + +#ifdef DEBUG + if( Wmacros ) write(ounit,'("macros : ", 10x ," : myid=",i3," ; writing $5 ;")') myid +#endif + + rank = 3 ; threedims(1:3) = (/ $2, $3, $4 /) + + if( $2.le.0 .or. $3.le.0 .or. $4.le.0 ) then + + write(6,'("sphdf5 : "10x" : error calling hwriterc ; $5 : $2.le.0 .or. $3.le.0 .or. $4.le.0 at $7:$8 ;")') + + else + + call h5screate_simple_f( rank, threedims, space_id, hdfier ) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from hwriterc at $7:$8 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5screate_simple_f from hwriterc at $7:$8 ;" + endif + + ! temporarily disable error printing to not confuse users + call h5eset_auto_f(0, hdfier) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriterc at $7:$8 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5eset_auto_f from hwriterc at $7:$8 ;" + endif + + ! check if dataset can be opened + call h5dopen_f($1, "$5", dset_id, hdfier) + if (hdfier.lt.0) then + var_exists = .false. + if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $5 does not exist yet, creating it" + endif + else + var_exists = .true. + if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $5 exists already, opening it" + endif + endif + + ! re-establish previous state of error printing to be sensitive to "real" errors + call h5eset_auto_f(internalHdf5Msg, hdfier) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriterc at $7:$8 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5eset_auto_f from hwriterc at $7:$8 ;" + endif + + ! if the dataset does not exist already, create it. Otherwise, it should be open already + if (.not.var_exists) then + call h5dcreate_f( $1, "$5", H5T_NATIVE_DOUBLE, space_id, dset_id, hdfier ) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5dcreate_f from hwriterc at $7:$8 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5dcreate_f from hwriterc at $7:$8 ;" + endif + endif + + call h5dwrite_f( dset_id, H5T_NATIVE_DOUBLE, $6, threedims, hdfier ) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5dwrite_f from hwriterc at $7:$8 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5dwrite_f from hwriterc at $7:$8 ;" + endif + + call h5dclose_f(dset_id, hdfier) ! terminate dataset; + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5dclose_f from hwriterc at $7:$8 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5dclose_f from hwriterc at $7:$8 ;" + endif + + endif + + ! macro expansion of hwriterc; end;})m4_dnl +m4_define(HWRITERC_LO,{! macro expansion of hwriterc_lo; +! write real cube _6 (_2 rows, _3 columns, _4 pages) into a dataset named _5 into group _1 and leave open for e.g. adding an attribute; _7 and _8 should be __FILE__ and __LINE__ +! example: hwriterc( grpOutput, (Mrad+1), 2, 2, TT, TT(0:Mrad,0:1,0:1) ) +! and close it with h5descr_cdset( /output/TT, something abbreviated by TT ) + +#ifdef DEBUG + if( Wmacros ) write(ounit,'("macros : ", 10x ," : myid=",i3," ; writing $5 ;")') myid +#endif + + rank = 3 ; threedims(1:3) = (/ $2, $3, $4 /) + + if( $2.le.0 .or. $3.le.0 .or. $4.le.0 ) then + + write(6,'("sphdf5 : "10x" : error calling hwriterc ; $5 : $2.le.0 .or. $3.le.0 .or. $4.le.0 at $7:$8 ;")') + + else + + call h5screate_simple_f( rank, threedims, space_id, hdfier ) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from hwriterc_lo at $7:$8 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5screate_simple_f from hwriterc_lo at $7:$8 ;" + endif + + ! temporarily disable error printing to not confuse users + call h5eset_auto_f(0, hdfier) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriterc_lo at $7:$8 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5eset_auto_f from hwriterc_lo at $7:$8 ;" + endif + + ! check if dataset can be opened + call h5dopen_f($1, "$5", dset_id, hdfier) + if (hdfier.lt.0) then + var_exists = .false. + if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $5 does not exist yet, creating it" + endif + else + var_exists = .true. + if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $5 exists already, opening it" + endif + endif + + ! re-establish previous state of error printing to be sensitive to "real" errors + call h5eset_auto_f(internalHdf5Msg, hdfier) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriterc_lo at $7:$8 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5eset_auto_f from hwriterc_lo at $7:$8 ;" + endif + + ! if the dataset does not exist already, create it. Otherwise, it should be open already + if (.not.var_exists) then + call h5dcreate_f( $1, "$5", H5T_NATIVE_DOUBLE, space_id, dset_id, hdfier ) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5dcreate_f from hwriterc_lo at $7:$8 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5dcreate_f from hwriterc_lo at $7:$8 ;" + endif + endif + + call h5dwrite_f( dset_id, H5T_NATIVE_DOUBLE, $6, threedims, hdfier ) + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling h5dwrite_f from hwriterc_lo at $7:$8 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5dwrite_f from hwriterc_lo at $7:$8 ;" + endif + + endif + + ! macro expansion of hwriterc_lo; end;})m4_dnl +m4_define(H5CALL,{! macro expansion of h5call; +! wrapper for HDF5 API calls which checks the hdfier error flag after each call +! and interrupts execution of the program right away if anything goes wrong +! call _2 with arguments _3 from within _1 and write wall time needed for call to screen; _4 and _5 should be __FILE__ and __LINE__ + + call $2$3 + if( hdfier.ne.0 ) then + write(6,'("sphdf5 : "10x" : error calling $2 in process ",i3," from h5call at $4:$5;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling $2 from h5call at $4:$5 ;" + endif + + ! macro expansion of h5call; end;})m4_dnl diff --git a/src/hesian.f90 b/src/hesian.F90 similarity index 77% rename from src/hesian.f90 rename to src/hesian.F90 index d4fb9e33..2a1126b3 100644 --- a/src/hesian.f90 +++ b/src/hesian.F90 @@ -10,7 +10,7 @@ !> @param[in] mn number of Fourier harmonics !> @param[in] LGdof what is this? subroutine hesian( NGdof, position, Mvol, mn, LGdof ) - + use mod_kinds, only: wp => dp !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! use constants, only : zero, half, one, two, ten @@ -36,59 +36,75 @@ subroutine hesian( NGdof, position, Mvol, mn, LGdof ) hessian2D,dessian2D,Lhessian2Dallocated, & Lhessian3Dallocated,denergydrr, denergydrz,denergydzr,denergydzz, & LocalConstraint - + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS - INTEGER, intent(in) :: NGdof, Mvol, mn, LGdof - REAL :: position(0:NGdof) +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + integer, intent(in) :: NGdof, Mvol, mn, LGdof + real(wp) :: position(0:NGdof) LOGICAL :: LComputeDerivatives, LComputeAxis - REAL :: force(0:NGdof), gradient(0:NGdof) + real(wp) :: force(0:NGdof), gradient(0:NGdof) - REAL :: xx(0:NGdof,-2:2), ff(0:NGdof,-2:2), df(1:NGdof)!, deriv + real(wp) :: xx(0:NGdof,-2:2), ff(0:NGdof,-2:2), df(1:NGdof)!, deriv - INTEGER :: vvol, idof, ii, mi, ni, irz, issym, isymdiff, lvol, ieval(1:1), igdof, ifd - REAL :: oldEnergy(-2:2), error, cpul + integer :: vvol, idof, ii, mi, ni, irz, issym, isymdiff, lvol, ieval(1:1), igdof, ifd + real(wp) :: oldEnergy(-2:2), error, cpul - REAL :: oldBB(1:Mvol,-2:2), oBBdRZ(1:Mvol,0:1,1:LGdof), ohessian(1:NGdof,1:NGdof) + real(wp) :: oldBB(1:Mvol,-2:2), oBBdRZ(1:Mvol,0:1,1:LGdof), ohessian(1:NGdof,1:NGdof) - REAL :: oRbc(1:mn,0:Mvol), oZbs(1:mn,0:Mvol), oRbs(1:mn,0:Mvol), oZbc(1:mn,0:Mvol), determinant + real(wp) :: oRbc(1:mn,0:Mvol), oZbs(1:mn,0:Mvol), oRbs(1:mn,0:Mvol), oZbc(1:mn,0:Mvol), determinant - CHARACTER :: pack + character :: pack - CHARACTER :: svol*3 + character :: svol*3 ! LOGICAL :: Lderiv ! for parallel / series construction of Hessian; ! INTEGER :: lvol, jvol, ivol, innout, imn, irz, jmn, jrz, tdoc, tdof, ilocaldof, jlocaldof ! for parallel / series construction of Hessian; - INTEGER :: tdof, tdoc, jvol, jj, jrz, jssym + integer :: tdof, tdoc, jvol, jj, jrz, jssym - INTEGER :: Lwork, LDA, Ldvi, Ldvr, if02ebf - REAL :: evalr(1:NGdof), evali(1:NGdof) + integer :: Lwork, LDA, Ldvi, Ldvr, if02ebf + real(wp) :: evalr(1:NGdof), evali(1:NGdof) ! REAL :: evecr(1:NGdof,1:NGdof), eveci(1:NGdof,1:NGdof) - REAL :: evecr(1:NGdof,1:NGdof), eveci(1:NGdof,1:NGdof),revecr(1:NGdof,1:2*NGdof), evecl(1:NGdof,1:NGdof) - REAL :: work(1:4*NGdof) ! for construction of evalues/evectors; - CHARACTER :: JOB + real(wp) :: evecr(1:NGdof,1:NGdof), eveci(1:NGdof,1:NGdof),revecr(1:NGdof,1:2*NGdof), evecl(1:NGdof,1:NGdof) + real(wp) :: work(1:4*NGdof) ! for construction of evalues/evectors; + character :: JOB - INTEGER :: iev, jev, M1, M2, irank(1:NGdof), im01daf ! for construction of evalues/evectors; - CHARACTER :: order + integer :: iev, jev, M1, M2, irank(1:NGdof), im01daf ! for construction of evalues/evectors; + character :: order - REAL :: dRZ != 1.0e-03 + real(wp) :: dRZ != 1.0e-03 - REAL :: lmu(1:Mvol), lpflux(1:Mvol), lhelicity(1:Mvol) ! original profiles; 20 Jun 14; + real(wp) :: lmu(1:Mvol), lpflux(1:Mvol), lhelicity(1:Mvol) ! original profiles; 20 Jun 14; - INTEGER :: IA - INTEGER :: idgesvx, idgetrf, ipiv(1:Ngdof), iwork4(1:NGdof) - CHARACTER :: equed - REAL :: perturbation(1:LGdof) - REAL :: rhs(1:NGdof), solution(0:NGdof) - REAL :: rworka(1:NGdof), rworkb(1:NGdof), AA(1:NGdof,1:NGdof) - REAL :: Rdgesvx(1:NGdof), Cdgesvx(1:NGdof), AF(1:NGdof,1:NGdof), work4(1:4*NGdof), rcond, ferr, berr, sgn + integer :: IA + integer :: idgesvx, idgetrf, ipiv(1:Ngdof), iwork4(1:NGdof) + character :: equed + real(wp) :: perturbation(1:LGdof) + real(wp) :: rhs(1:NGdof), solution(0:NGdof) + real(wp) :: rworka(1:NGdof), rworkb(1:NGdof), AA(1:NGdof,1:NGdof) + real(wp) :: Rdgesvx(1:NGdof), Cdgesvx(1:NGdof), AF(1:NGdof,1:NGdof), work4(1:4*NGdof), rcond, ferr, berr, sgn + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif - BEGIN(hesian) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -105,7 +121,13 @@ subroutine hesian( NGdof, position, Mvol, mn, LGdof ) oldBB(1:Mvol,0) = lBBintegral(1:Mvol) - FATAL( hesian, .not.allocated(dBBdRZ), need to revise logic in preset where dBBdRZ is allocated ) + + if( .not.allocated(dBBdRZ) ) then + write(6,'("hesian : fatal : myid=",i3," ; .not.allocated(dBBdRZ) ; need to revise logic in preset where dBBdRZ is allocated ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "hesian : .not.allocated(dBBdRZ) : need to revise logic in preset where dBBdRZ is allocated ;" + endif + oBBdRZ(1:Mvol,0:1,1:LGdof) = dBBdRZ(1:Mvol,0:1,1:LGdof) @@ -114,7 +136,13 @@ subroutine hesian( NGdof, position, Mvol, mn, LGdof ) oRbs(1:mn,0:Mvol) = iRbs(1:mn,0:Mvol) oZbc(1:mn,0:Mvol) = iZbc(1:mn,0:Mvol) - FATAL( hesian, Lfreebound.eq.1, this routine needs attention ) + + if( Lfreebound.eq.1 ) then + write(6,'("hesian : fatal : myid=",i3," ; Lfreebound.eq.1 ; this routine needs attention ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "hesian : Lfreebound.eq.1 : this routine needs attention ;" + endif + do vvol = 1, Mvol-1 ! loop over volumes; 26 Feb 13; @@ -159,11 +187,21 @@ subroutine hesian( NGdof, position, Mvol, mn, LGdof ) pack = 'P' !; position(0) = zero ! this is not used; 11 Aug 14; LComputeAxis = .true. LComputeDerivatives = .false. !; position(0) = zero ! this is not used; 11 Aug 14; - WCALL( hesian, packxi, ( NGdof, position(0:NGdof), Mvol, mn, iRbc(1:mn,0:Mvol), iZbs(1:mn,0:Mvol), & - iRbs(1:mn,0:Mvol), iZbc(1:mn,0:Mvol), pack, LComputeDerivatives, LComputeAxis ) ) + + cput = MPI_WTIME() + Thesian = Thesian + ( cput-cpuo ) + call packxi( NGdof, position(0:NGdof), Mvol, mn, iRbc(1:mn,0:Mvol), iZbs(1:mn,0:Mvol), & + iRbs(1:mn,0:Mvol), iZbc(1:mn,0:Mvol), pack, LComputeDerivatives, LComputeAxis ) + cpuo = MPI_WTIME() - WCALL( hesian, dforce, ( NGdof, position(0:NGdof), gradient(0:NGdof), LComputeDerivatives, LComputeAxis ) ) ! re-calculate Beltrami fields; + + + cput = MPI_WTIME() + Thesian = Thesian + ( cput-cpuo ) + call dforce( NGdof, position(0:NGdof), gradient(0:NGdof), LComputeDerivatives, LComputeAxis ) + cpuo = MPI_WTIME() + ! re-calculate Beltrami fields; oldBB(1:Mvol,isymdiff) = lBBintegral(1:Mvol) @@ -175,14 +213,20 @@ subroutine hesian( NGdof, position, Mvol, mn, LGdof ) oldEnergy(0) = ( - 1 * oldEnergy(2) + 8 * oldEnergy(1) - 8 * oldEnergy(-1) + 1 * oldEnergy(-2) ) / ( 12 * dRZ ) - cput = GETTIME + cput = MPI_WTIME() write(ounit,1000) cput-cpus !12345678901234567 write(ounit,1000) cput-cpus, myid, vvol, irz, mi, ni, "finite-difference", oldBB(vvol:vvol+1,0) write(ounit,1000) cput-cpus, myid, vvol, irz, mi, ni, "analytic ", (/ oBBdRZ(vvol,1,idof), oBBdRZ(vvol+1,0,idof) /) / psifactor(ii,vvol) write(ounit,1001) cput-cpus, myid, vvol, irz, mi, ni, oldEnergy(0) write(ounit,1001) cput-cpus, myid, vvol, irz, mi, ni, ( oBBdRZ(vvol,1,idof) + oBBdRZ(vvol+1,0,idof) ) / psifactor(ii,vvol) ! ENERGY GRADIENT; - FATAL( hesian, Igeometry.eq.1, Cartesian geometry does not need regularization factor ) + + if( Igeometry.eq.1 ) then + write(6,'("hesian : fatal : myid=",i3," ; Igeometry.eq.1 ; Cartesian geometry does not need regularization factor ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "hesian : Igeometry.eq.1 : Cartesian geometry does not need regularization factor ;" + endif + 1000 format("hesian : ",f10.2," : ":"myid=",i3," ; ":"vvol=",i3," ; ":"irz="i2" ; (",i3," ,",i3," ) ; "a17" ["es15.7","es15.7" ]") 1001 format("hesian : ",f10.2," : ":"myid=",i3," ; ":"vvol=",i3," ; ":"irz="i2" ; (",i3," ,",i3," ) ; "es15.7" ; ") @@ -201,30 +245,59 @@ subroutine hesian( NGdof, position, Mvol, mn, LGdof ) iZbc(1:mn,0:Mvol) = oZbc(1:mn,0:Mvol) pack = 'P' !; position(0) = zero ! this is not used; 11 Aug 14; - WCALL( hesian, packxi,( NGdof, position(0:NGdof), Mvol, mn, iRbc(1:mn,0:Mvol), iZbs(1:mn,0:Mvol), & - iRbs(1:mn,0:Mvol), iZbc(1:mn,0:Mvol), pack, LComputeDerivatives, LComputeAxis ) ) + + cput = MPI_WTIME() + Thesian = Thesian + ( cput-cpuo ) + call packxi( NGdof, position(0:NGdof), Mvol, mn, iRbc(1:mn,0:Mvol), iZbs(1:mn,0:Mvol), & + iRbs(1:mn,0:Mvol), iZbc(1:mn,0:Mvol), pack, LComputeDerivatives, LComputeAxis ) + cpuo = MPI_WTIME() + #endif !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - if(LHmatrix .and. Igeometry.eq.2) then - SALLOCATE( HdFFdRZ , (1:LGdof,0:1,1:LGdof,0:1,1:Mvol), zero ) + if(LHmatrix .and. Igeometry.eq.2) then + + allocate( HdFFdRZ (1:LGdof,0:1,1:LGdof,0:1,1:Mvol), stat=astat ) + HdFFdRZ (1:LGdof,0:1,1:LGdof,0:1,1:Mvol) = zero + endif - SALLOCATE( dBBdmp , (1:LGdof,1:Mvol,0:1, 1:2), zero ) - - SALLOCATE( denergydrr, (1:LGdof,1:Mvol,0:1,1:LGdof,0:1), zero) + + allocate( dBBdmp (1:LGdof,1:Mvol,0:1, 1:2), stat=astat ) + dBBdmp (1:LGdof,1:Mvol,0:1, 1:2) = zero + + + + allocate( denergydrr(1:LGdof,1:Mvol,0:1,1:LGdof,0:1), stat=astat ) + denergydrr(1:LGdof,1:Mvol,0:1,1:LGdof,0:1) = zero + !SALLOCATE( denergydrz, (1:LGdof,1:Mvol,0:1,1:LGdof,0:1), zero) - SALLOCATE( denergydzr, (1:LGdof,1:Mvol,0:1,1:LGdof,0:1), zero) + + allocate( denergydzr(1:LGdof,1:Mvol,0:1,1:LGdof,0:1), stat=astat ) + denergydzr(1:LGdof,1:Mvol,0:1,1:LGdof,0:1) = zero + !SALLOCATE( denergydzz, (1:LGdof,1:Mvol,0:1,1:LGdof,0:1), zero) if( LocalConstraint ) then - SALLOCATE( dmupfdx, (1:Mvol, 1:1, 1:2, 1:LGdof, 0:1), zero ) + + allocate( dmupfdx(1:Mvol, 1:1, 1:2, 1:LGdof, 0:1), stat=astat ) + dmupfdx(1:Mvol, 1:1, 1:2, 1:LGdof, 0:1) = zero + else - SALLOCATE( dmupfdx, (1:Mvol, 1:Mvol-1, 1:2, 1:LGdof, 0:1), zero) + + allocate( dmupfdx(1:Mvol, 1:Mvol-1, 1:2, 1:LGdof, 0:1), stat=astat ) + dmupfdx(1:Mvol, 1:Mvol-1, 1:2, 1:LGdof, 0:1) = zero + endif - SALLOCATE( hessian2D, (1:NGdof,1:NGdof), zero ) - SALLOCATE( dessian2D, (1:NGdof,1:LGdof), zero ) ! part of hessian that depends on boundary variations; 18 Dec 14; + + allocate( hessian2D(1:NGdof,1:NGdof), stat=astat ) + hessian2D(1:NGdof,1:NGdof) = zero + + + allocate( dessian2D(1:NGdof,1:LGdof), stat=astat ) + dessian2D(1:NGdof,1:LGdof) = zero + ! part of hessian that depends on boundary variations; 18 Dec 14; !if (LHmatrix) then Lhessian3Dallocated = .true. @@ -235,8 +308,13 @@ subroutine hesian( NGdof, position, Mvol, mn, LGdof ) LComputeDerivatives = .true. !; position(0) = zero ! this is not used; 11 Aug 14; LComputeAxis = .false. - WCALL( hesian, dforce, ( NGdof, position(0:NGdof), force(0:NGdof), LComputeDerivatives, LComputeAxis) ) ! calculate force-imbalance & hessian; - + + cput = MPI_WTIME() + Thesian = Thesian + ( cput-cpuo ) + call dforce( NGdof, position(0:NGdof), force(0:NGdof), LComputeDerivatives, LComputeAxis) + cpuo = MPI_WTIME() + ! calculate force-imbalance & hessian; + ohessian(1:NGdof,1:NGdof) = hessian2D(1:NGdof,1:NGdof) ! internal copy; 22 Apr 15; @@ -268,7 +346,7 @@ subroutine hesian( NGdof, position, Mvol, mn, LGdof ) do vvol = 1, Mvol-1 ! loop over internal interfaces; - cput = GETTIME + cput = MPI_WTIME() ! write(lunit+myid,'("hesian : ", 10x ," : ")') ! write(lunit+myid,'("hesian : ",f10.2," : myid=",i3," ; vvol=",i3," ; dRZ=",es9.1," ;")') cput-cpus, myid, vvol, dRZ ! write(lunit+myid,'("hesian : ", 10x ," : ")') @@ -298,7 +376,12 @@ subroutine hesian( NGdof, position, Mvol, mn, LGdof ) LComputeDerivatives = .false. LComputeAxis = .true. - WCALL( hesian, dforce, ( NGdof, xx(0:NGdof,isymdiff), ff(0:NGdof,isymdiff), LComputeDerivatives, LComputeAxis) ) ! force-imbalance; + + cput = MPI_WTIME() + Thesian = Thesian + ( cput-cpuo ) + call dforce( NGdof, xx(0:NGdof,isymdiff), ff(0:NGdof,isymdiff), LComputeDerivatives, LComputeAxis) + cpuo = MPI_WTIME() + ! force-imbalance; enddo ! end of do isymdiff; 20 Jun 14; @@ -323,10 +406,22 @@ subroutine hesian( NGdof, position, Mvol, mn, LGdof ) tdoc = tdoc + 1 - FATAL( hesian, tdoc.lt. 1, needs attention ) - FATAL( hesian, tdoc.gt.NGdof, needs attention ) - cput = GETTIME + if( tdoc.lt. 1 ) then + write(6,'("hesian : fatal : myid=",i3," ; tdoc.lt. 1 ; needs attention ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "hesian : tdoc.lt. 1 : needs attention ;" + endif + + + if( tdoc.gt.NGdof ) then + write(6,'("hesian : fatal : myid=",i3," ; tdoc.gt.NGdof ; needs attention ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "hesian : tdoc.gt.NGdof : needs attention ;" + endif + + + cput = MPI_WTIME() error = abs( df(tdoc)-hessian(tdoc,tdof) ) @@ -378,7 +473,12 @@ subroutine hesian( NGdof, position, Mvol, mn, LGdof ) enddo ! end of do vvol; pack = 'U' !; position(0) = zero ! this is not used; 11 Aug 14; - WCALL( hesian, packxi, ( NGdof, position(0:NGdof), Mvol, mn, iRbc(1:mn,0:Mvol), iZbs(1:mn,0:Mvol), iRbs(1:mn,0:Mvol), iZbc(1:mn,0:Mvol), pack, .false., LComputeAxis ) ) + + cput = MPI_WTIME() + Thesian = Thesian + ( cput-cpuo ) + call packxi( NGdof, position(0:NGdof), Mvol, mn, iRbc(1:mn,0:Mvol), iZbs(1:mn,0:Mvol), iRbs(1:mn,0:Mvol), iZbc(1:mn,0:Mvol), pack, .false., LComputeAxis ) + cpuo = MPI_WTIME() + mu(1:Nvol) = lmu(1:Nvol) ; pflux(1:Nvol) = lpflux(1:Nvol) ; helicity(1:Nvol) = lhelicity(1:Nvol) @@ -418,7 +518,7 @@ subroutine hesian( NGdof, position, Mvol, mn, LGdof ) if( LHmatrix ) then - if( myid.eq.0 ) then ; cput = GETTIME ; write(ounit,'("hesian : ",f10.2," : LHmatrix="L2" ;")')cput-cpus, LHmatrix ; + if( myid.eq.0 ) then ; cput = MPI_WTIME() ; write(ounit,'("hesian : ",f10.2," : LHmatrix="L2" ;")')cput-cpus, LHmatrix ; open(munit, file="."//trim(ext)//".GF.ma", status="unknown", form="unformatted") write(munit) NGdof write(munit) ohessian(1:NGdof,1:NGdof) @@ -431,7 +531,7 @@ subroutine hesian( NGdof, position, Mvol, mn, LGdof ) ! if( myid.eq.0 .and. ( LHevalues .or. LHevectors ) ) then ! the call to dforce below requires all cpus; 04 Dec 14; if( ( LHevalues .or. LHevectors ) ) then - if( myid.eq.0 ) then ; cput = GETTIME ; write(ounit,'("hesian : ",f10.2," : LHevalues="L2" , LHevectors="L2" ;")')cput-cpus, LHevalues, LHevectors + if( myid.eq.0 ) then ; cput = MPI_WTIME() ; write(ounit,'("hesian : ",f10.2," : LHevalues="L2" , LHevectors="L2" ;")')cput-cpus, LHevalues, LHevectors endif evalr(1:NGdof) = zero ; evecr(1:NGdof,1:NGdof) = zero @@ -441,10 +541,10 @@ subroutine hesian( NGdof, position, Mvol, mn, LGdof ) else ; JOB='N' ; Ldvr = 1 ; Ldvi = 1 ! provide dummy values when eigenvectors are not required; 04 Dec 14; endif - cpul = GETTIME + cpul = MPI_WTIME() if02ebf = 1 ; LDA = NGdof ; Lwork = 4*NGdof - + hessian2D(1:NGdof,1:NGdof) = ohessian(1:NGdof,1:NGdof) !#ifdef NAG18 @@ -459,7 +559,7 @@ subroutine hesian( NGdof, position, Mvol, mn, LGdof ) eveci(1:Ldvr,1:NGdof) = revecr(1:Ldvr,NGdof+1:2*NGdof) if( myid.eq.0 ) then - cput = GETTIME + cput = MPI_WTIME() if (if02ebf < 0) then write(ounit,'("hesian : ",f10.2," : DGEEV error the "i2" th argument had illegal value ; time="f10.2"s ;")') cput-cpus, -if02ebf, cput-cpul else if (if02ebf > 0) then @@ -593,7 +693,13 @@ subroutine hesian( NGdof, position, Mvol, mn, LGdof ) perturbation(1:LGdof) = zero - FATAL( hesian, Igeometry.gt.2 .or. NOTstellsym, only for stellarator-symmetric cylindrical ) + + if( Igeometry.gt.2 .or. NOTstellsym ) then + write(6,'("hesian : fatal : myid=",i3," ; Igeometry.gt.2 .or. NOTstellsym ; only for stellarator-symmetric cylindrical ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "hesian : Igeometry.gt.2 .or. NOTstellsym : only for stellarator-symmetric cylindrical ;" + endif + do ii = 1, mn if( im(ii).eq.dqq .and. in(ii).eq.dpp ) perturbation(ii) = one ! impose arbitrary perturbation; 18 Dec 14; @@ -608,11 +714,11 @@ subroutine hesian( NGdof, position, Mvol, mn, LGdof ) else rhs(1:NGdof) = - matmul( dessian(1:NGdof,1:LGdof), perturbation(1:LGdof) ) - + hessian2D(1:NGdof,1:NGdof) = ohessian(1:NGdof,1:NGdof) call dgesvx( 'N', 'N', NGdof, 1, hessian2D(1:NGdof,1:NGdof), NGdof, AF(1:NGdof,1:NGdof), & ! Linear solver; 09 Nov 17; - NGdof, ipiv(1:NGdof), equed, Rdgesvx(1:NGdof), Cdgesvx(1:NGdof), & + NGdof, ipiv(1:NGdof), equed, Rdgesvx(1:NGdof), Cdgesvx(1:NGdof), & rhs(1:NGdof), NGdof, solution(1:NGdof), NGdof, rcond, ferr, berr, & work4(1:4*NGdof), iwork4(1:NGdof), idgesvx ) @@ -620,11 +726,22 @@ subroutine hesian( NGdof, position, Mvol, mn, LGdof ) case( 0 ) ; write(ounit,'("hesian : " 10x " : myid="i3" ; linear perturbation ; idgesvx="i3" ;")') myid, idgesvx case( 1: ) ; write(ounit,'("hesian : " 10x " : myid="i3" ; singular matrix ; idgesvx="i3" ;")') myid, idgesvx case( :-1 ) ; write(ounit,'("hesian : " 10x " : myid="i3" ; input error ; idgesvx="i3" ;")') myid, idgesvx - case default ; FATAL( hesian, .true., illegal ifail returned from dgesvx ) + case default ; + if( .true. ) then + write(6,'("hesian : fatal : myid=",i3," ; .true. ; illegal ifail returned from dgesvx ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "hesian : .true. : illegal ifail returned from dgesvx ;" + endif + end select pack = 'U' ! unpack geometrical degrees-of-freedom; 13 Sep 13; - WCALL( hesian, packxi, ( NGdof, solution(0:NGdof), Mvol, mn, dRbc(1:mn,0:Mvol), dZbs(1:mn,0:Mvol), dRbs(1:mn,0:Mvol), dZbc(1:mn,0:Mvol), pack, .false., LComputeAxis ) ) + + cput = MPI_WTIME() + Thesian = Thesian + ( cput-cpuo ) + call packxi( NGdof, solution(0:NGdof), Mvol, mn, dRbc(1:mn,0:Mvol), dZbs(1:mn,0:Mvol), dRbs(1:mn,0:Mvol), dZbc(1:mn,0:Mvol), pack, .false., LComputeAxis ) + cpuo = MPI_WTIME() + dRbc(1:mn,Mvol) = perturbation(1:LGdof) @@ -650,11 +767,11 @@ subroutine hesian( NGdof, position, Mvol, mn, LGdof ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! if( myid.eq.0 ) then - + hessian2D(1:NGdof,1:NGdof) = ohessian(1:NGdof,1:NGdof) - + call dgetrf( NGdof, NGdof, hessian2D(1:NGdof,1:NGdof), NGdof, ipiv(1:NGdof), idgetrf ) - + determinant = one do iev = 1,NGdof @@ -675,34 +792,59 @@ subroutine hesian( NGdof, position, Mvol, mn, LGdof ) case( 0 ) ; write(ounit,'("hesian : " 10x " : myid="i3" ; idgetrf="i3" ; ; determinant="es13.5" ;")') myid, idgetrf, determinant case( 1: ) ; write(ounit,'("hesian : " 10x " : myid="i3" ; idgetrf="i3" ; singular ; determinant="es13.5" ;")') myid, idgetrf, determinant case( :-1 ) ; write(ounit,'("hesian : " 10x " : myid="i3" ; idgetrf="i3" ; input error ; determinant="es13.5" ;")') myid, idgetrf, determinant - case default ; FATAL( hesian, .true., illegal ifail returned from dgetrf ) + case default ; + if( .true. ) then + write(6,'("hesian : fatal : myid=",i3," ; .true. ; illegal ifail returned from dgetrf ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "hesian : .true. : illegal ifail returned from dgetrf ;" + endif + end select endif !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - if(LHmatrix .and. Igeometry.eq.2) then - DALLOCATE(HdFFdRZ) + if(LHmatrix .and. Igeometry.eq.2) then + + deallocate(HdFFdRZ,stat=astat) + endif - - DALLOCATE(dBBdmp) - DALLOCATE(dmupfdx) - DALLOCATE(denergydrr) + + + deallocate(dBBdmp,stat=astat) + + + deallocate(dmupfdx,stat=astat) + + + deallocate(denergydrr,stat=astat) + !DALLOCATE(denergydrz) - DALLOCATE(denergydzr) + + deallocate(denergydzr,stat=astat) + !DALLOCATE(denergydzz) Lhessian3Dallocated=.false. - DALLOCATE(hessian2D) + + deallocate(hessian2D,stat=astat) + write(ounit,*) 5656 - DALLOCATE(dessian2D) + + deallocate(dessian2D,stat=astat) + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - RETURN(hesian) + +9999 continue + cput = MPI_WTIME() + Thesian = Thesian + ( cput-cpuo ) + return + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! diff --git a/src/contrib/i1mach.f b/src/i1mach.f similarity index 100% rename from src/contrib/i1mach.f rename to src/i1mach.f diff --git a/src/contrib/ilut.f b/src/ilut.f similarity index 100% rename from src/contrib/ilut.f rename to src/ilut.f diff --git a/src/inputlist.f90 b/src/inputlist.F90 similarity index 83% rename from src/inputlist.f90 rename to src/inputlist.F90 index 044019df..1d96def0 100644 --- a/src/inputlist.f90 +++ b/src/inputlist.F90 @@ -5,42 +5,42 @@ !> \addtogroup grp_global !> @{ module inputlist - + use mod_kinds, only: wp => dp implicit none ! The following parameters set the maximum allowed resolution: - INTEGER, parameter :: MNvol = 256 !< The maximum value of \c Nvol is \c MNvol=256. - INTEGER, parameter :: MMpol = 128 !< The maximum value of \c Mpol is \c MNpol=64. - INTEGER, parameter :: MNtor = 128 !< The maximum value of \c Ntor is \c MNtor=64. + integer, parameter :: MNvol = 256 !< The maximum value of \c Nvol is \c MNvol=256. + integer, parameter :: MMpol = 128 !< The maximum value of \c Mpol is \c MNpol=64. + integer, parameter :: MNtor = 128 !< The maximum value of \c Ntor is \c MNtor=64. !> \addtogroup grp_global_physicslist physicslist !> \brief The namelist \c physicslist controls the geometry, profiles, and numerical resolution. !> @{ ! note that all variables in namelist need to be broadcasted in readin - INTEGER :: Igeometry = 3 !< selects Cartesian, cylindrical or toroidal geometry; + integer :: Igeometry = 3 !< selects Cartesian, cylindrical or toroidal geometry; !< - INTEGER :: Istellsym = 1 !< stellarator symmetry is enforced if \c Istellsym==1 - INTEGER :: Lfreebound = 0 !< compute vacuum field surrounding plasma - REAL :: phiedge = 1.0 !< total enclosed toroidal magnetic flux; - REAL :: curtor = 0.0 !< total enclosed (toroidal) plasma current; - REAL :: curpol = 0.0 !< total enclosed (poloidal) linking current; - REAL :: gamma = 0.0 !< adiabatic index; cannot set \f$|\gamma| = 1\f$ - INTEGER :: Nfp = 1 !< field periodicity + integer :: Istellsym = 1 !< stellarator symmetry is enforced if \c Istellsym==1 + integer :: Lfreebound = 0 !< compute vacuum field surrounding plasma + real(wp) :: phiedge = 1.0 !< total enclosed toroidal magnetic flux; + real(wp) :: curtor = 0.0 !< total enclosed (toroidal) plasma current; + real(wp) :: curpol = 0.0 !< total enclosed (poloidal) linking current; + real(wp) :: gamma = 0.0 !< adiabatic index; cannot set \f$|\gamma| = 1\f$ + integer :: Nfp = 1 !< field periodicity !< - INTEGER :: Nvol = 1 !< number of volumes + integer :: Nvol = 1 !< number of volumes !< - INTEGER :: Mpol = 0 !< number of poloidal Fourier harmonics + integer :: Mpol = 0 !< number of poloidal Fourier harmonics !< - INTEGER :: Ntor = 0 !< number of toroidal Fourier harmonics + integer :: Ntor = 0 !< number of toroidal Fourier harmonics !< - INTEGER :: Lrad(1:MNvol+1) = 4 !< Chebyshev resolution in each volume + integer :: Lrad(1:MNvol+1) = 4 !< Chebyshev resolution in each volume !< - INTEGER :: Lconstraint = -1 !< selects constraints; primarily used in ma02aa() and mp00ac(). + integer :: Lconstraint = -1 !< selects constraints; primarily used in ma02aa() and mp00ac(). !< - REAL :: tflux(1:MNvol+1) = 0.0 !< toroidal flux, \f$\psi_t\f$, enclosed by each interface + real(wp) :: tflux(1:MNvol+1) = 0.0 !< toroidal flux, \f$\psi_t\f$, enclosed by each interface !< - REAL :: pflux(1:MNvol+1) = 0.0 !< poloidal flux, \f$\psi_p\f$, enclosed by each interface - REAL :: helicity(1:MNvol) = 0.0 !< helicity, \f${\cal K}\f$, in each volume, \f${\cal V}_i\f$ + real(wp) :: pflux(1:MNvol+1) = 0.0 !< poloidal flux, \f$\psi_p\f$, enclosed by each interface + real(wp) :: helicity(1:MNvol) = 0.0 !< helicity, \f${\cal K}\f$, in each volume, \f${\cal V}_i\f$ !< - REAL :: pscale = 0.0 !< pressure scale factor + real(wp) :: pscale = 0.0 !< pressure scale factor !< - REAL :: pressure(1:MNvol+1) = 0.0 !< pressure in each volume + real(wp) :: pressure(1:MNvol+1) = 0.0 !< pressure in each volume !< - INTEGER :: Ladiabatic = 0 !< logical flag + integer :: Ladiabatic = 0 !< logical flag !< - REAL :: adiabatic(1:MNvol+1) = 0.0 !< adiabatic constants in each volume + real(wp) :: adiabatic(1:MNvol+1) = 0.0 !< adiabatic constants in each volume !< - REAL :: mu(1:MNvol+1) = 0.0 !< helicity-multiplier, \f$\mu\f$, in each volume - REAL :: Ivolume(1:MNvol+1) = 0.0 !< Toroidal current constraint normalized by \f$\mu_0\f$ (\f$I_{volume} = \mu_0\cdot [A]\f$), in each volume. + real(wp) :: mu(1:MNvol+1) = 0.0 !< helicity-multiplier, \f$\mu\f$, in each volume + real(wp) :: Ivolume(1:MNvol+1) = 0.0 !< Toroidal current constraint normalized by \f$\mu_0\f$ (\f$I_{volume} = \mu_0\cdot [A]\f$), in each volume. !< This is a cumulative quantity: \f$I_{\mathcal{V},i} = \int_0^{\psi_{t,i}} \mathbf{J}\cdot\mathbf{dS}\f$. !< Physically, it represents the sum of all non-pressure driven currents. - REAL :: Isurf(1:MNvol) = 0.0 !< Toroidal current normalized by \f$\mu_0\f$ at each interface (cumulative). This is the sum of all pressure driven currents. - INTEGER :: pl(0:MNvol) = 0 !< "inside" interface rotational-transform is \f$\mbox{$\,\iota\!\!$-} = (p_l+\gamma p_r)/(q_l+\gamma q_r)\f$, + real(wp) :: Isurf(1:MNvol) = 0.0 !< Toroidal current normalized by \f$\mu_0\f$ at each interface (cumulative). This is the sum of all pressure driven currents. + integer :: pl(0:MNvol) = 0 !< "inside" interface rotational-transform is \f$\mbox{$\,\iota\!\!$-} = (p_l+\gamma p_r)/(q_l+\gamma q_r)\f$, !< where \f$\gamma\f$ is the golden mean, \f$\gamma = (1 + \sqrt 5 ) / 2 \f$. !< !< If both \f$q_l = 0\f$ *and* \f$q_r = 0\f$, then the (inside) interface rotational-transform is defined by \c iota . - INTEGER :: ql(0:MNvol) = 0 !< "inside" interface rotational-transform is \f$\mbox{$\,\iota\!\!$-} = (p_l+\gamma p_r)/(q_l+\gamma q_r)\f$, + integer :: ql(0:MNvol) = 0 !< "inside" interface rotational-transform is \f$\mbox{$\,\iota\!\!$-} = (p_l+\gamma p_r)/(q_l+\gamma q_r)\f$, !< where \f$\gamma\f$ is the golden mean, \f$\gamma = (1 + \sqrt 5 ) / 2 \f$. !< !< If both \f$q_l = 0\f$ *and* \f$q_r = 0\f$, then the (inside) interface rotational-transform is defined by \c iota . - INTEGER :: pr(0:MNvol) = 0 !< "inside" interface rotational-transform is \f$\mbox{$\,\iota\!\!$-} = (p_l+\gamma p_r)/(q_l+\gamma q_r)\f$, + integer :: pr(0:MNvol) = 0 !< "inside" interface rotational-transform is \f$\mbox{$\,\iota\!\!$-} = (p_l+\gamma p_r)/(q_l+\gamma q_r)\f$, !< where \f$\gamma\f$ is the golden mean, \f$\gamma = (1 + \sqrt 5 ) / 2 \f$. !< !< If both \f$q_l = 0\f$ *and* \f$q_r = 0\f$, then the (inside) interface rotational-transform is defined by \c iota . - INTEGER :: qr(0:MNvol) = 0 !< "inside" interface rotational-transform is \f$\mbox{$\,\iota\!\!$-} = (p_l+\gamma p_r)/(q_l+\gamma q_r)\f$, + integer :: qr(0:MNvol) = 0 !< "inside" interface rotational-transform is \f$\mbox{$\,\iota\!\!$-} = (p_l+\gamma p_r)/(q_l+\gamma q_r)\f$, !< where \f$\gamma\f$ is the golden mean, \f$\gamma = (1 + \sqrt 5 ) / 2 \f$. !< !< If both \f$q_l = 0\f$ *and* \f$q_r = 0\f$, then the (inside) interface rotational-transform is defined by \c iota . - REAL :: iota(0:MNvol) = 0.0 !< rotational-transform, \f$\mbox{$\,\iota\!\!$-}\f$, on inner side of each interface + real(wp) :: iota(0:MNvol) = 0.0 !< rotational-transform, \f$\mbox{$\,\iota\!\!$-}\f$, on inner side of each interface !< - INTEGER :: lp(0:MNvol) = 0 !< "outer" interface rotational-transform is \f$\mbox{$\,\iota\!\!$-} = (p_l+\gamma p_r)/(q_l+\gamma q_r)\f$, + integer :: lp(0:MNvol) = 0 !< "outer" interface rotational-transform is \f$\mbox{$\,\iota\!\!$-} = (p_l+\gamma p_r)/(q_l+\gamma q_r)\f$, !< where \f$\gamma\f$ is the golden mean, \f$\gamma = (1 + \sqrt 5 ) / 2\f$. !< !< If both \f$q_l = 0\f$ *and* \f$q_r = 0\f$, then the (outer) interface rotational-transform is defined by \c oita . - INTEGER :: lq(0:MNvol) = 0 !< "outer" interface rotational-transform is \f$\mbox{$\,\iota\!\!$-} = (p_l+\gamma p_r)/(q_l+\gamma q_r)\f$, + integer :: lq(0:MNvol) = 0 !< "outer" interface rotational-transform is \f$\mbox{$\,\iota\!\!$-} = (p_l+\gamma p_r)/(q_l+\gamma q_r)\f$, !< where \f$\gamma\f$ is the golden mean, \f$\gamma = (1 + \sqrt 5 ) / 2\f$. !< !< If both \f$q_l = 0\f$ *and* \f$q_r = 0\f$, then the (outer) interface rotational-transform is defined by \c oita . - INTEGER :: rp(0:MNvol) = 0 !< "outer" interface rotational-transform is \f$\mbox{$\,\iota\!\!$-} = (p_l+\gamma p_r)/(q_l+\gamma q_r)\f$, + integer :: rp(0:MNvol) = 0 !< "outer" interface rotational-transform is \f$\mbox{$\,\iota\!\!$-} = (p_l+\gamma p_r)/(q_l+\gamma q_r)\f$, !< where \f$\gamma\f$ is the golden mean, \f$\gamma = (1 + \sqrt 5 ) / 2\f$. !< !< If both \f$q_l = 0\f$ *and* \f$q_r = 0\f$, then the (outer) interface rotational-transform is defined by \c oita . - INTEGER :: rq(0:MNvol) = 0 !< "outer" interface rotational-transform is \f$\mbox{$\,\iota\!\!$-} = (p_l+\gamma p_r)/(q_l+\gamma q_r)\f$, + integer :: rq(0:MNvol) = 0 !< "outer" interface rotational-transform is \f$\mbox{$\,\iota\!\!$-} = (p_l+\gamma p_r)/(q_l+\gamma q_r)\f$, !< where \f$\gamma\f$ is the golden mean, \f$\gamma = (1 + \sqrt 5 ) / 2\f$. !< !< If both \f$q_l = 0\f$ *and* \f$q_r = 0\f$, then the (outer) interface rotational-transform is defined by \c oita . - REAL :: oita(0:MNvol) = 0.0 !< rotational-transform, \f$\mbox{$\,\iota\!\!$-}\f$, on outer side of each interface + real(wp) :: oita(0:MNvol) = 0.0 !< rotational-transform, \f$\mbox{$\,\iota\!\!$-}\f$, on outer side of each interface !< - REAL :: mupftol = 1.0e-14 !< accuracy to which \f$\mu\f$ and \f$\Delta\psi_p\f$ are required + real(wp) :: mupftol = 1.0e-14 !< accuracy to which \f$\mu\f$ and \f$\Delta\psi_p\f$ are required !< - INTEGER :: mupfits = 8 !< an upper limit on the transform/helicity constraint iterations; + integer :: mupfits = 8 !< an upper limit on the transform/helicity constraint iterations; !< - REAL :: rpol = 1.0 !< poloidal extent of slab (effective radius) + real(wp) :: rpol = 1.0 !< poloidal extent of slab (effective radius) !< - REAL :: rtor = 1.0 !< toroidal extent of slab (effective radius) + real(wp) :: rtor = 1.0 !< toroidal extent of slab (effective radius) !< - INTEGER :: Lreflect = 0 !< =1 reflect the upper and lower bound in slab, =0 do not reflect - - REAL :: Rac( 0:MNtor ) = 0.0 !< stellarator symmetric coordinate axis; - REAL :: Zas( 0:MNtor ) = 0.0 !< stellarator symmetric coordinate axis; - REAL :: Ras( 0:MNtor ) = 0.0 !< non-stellarator symmetric coordinate axis; - REAL :: Zac( 0:MNtor ) = 0.0 !< non-stellarator symmetric coordinate axis; - - REAL :: Rbc(-MNtor:MNtor,-MMpol:MMpol) = 0.0 !< stellarator symmetric boundary components; - REAL :: Zbs(-MNtor:MNtor,-MMpol:MMpol) = 0.0 !< stellarator symmetric boundary components; - REAL :: Rbs(-MNtor:MNtor,-MMpol:MMpol) = 0.0 !< non-stellarator symmetric boundary components; - REAL :: Zbc(-MNtor:MNtor,-MMpol:MMpol) = 0.0 !< non-stellarator symmetric boundary components; - - REAL :: Rwc(-MNtor:MNtor,-MMpol:MMpol) = 0.0 !< stellarator symmetric boundary components of wall; - REAL :: Zws(-MNtor:MNtor,-MMpol:MMpol) = 0.0 !< stellarator symmetric boundary components of wall; - REAL :: Rws(-MNtor:MNtor,-MMpol:MMpol) = 0.0 !< non-stellarator symmetric boundary components of wall; - REAL :: Zwc(-MNtor:MNtor,-MMpol:MMpol) = 0.0 !< non-stellarator symmetric boundary components of wall; - - REAL :: Vns(-MNtor:MNtor,-MMpol:MMpol) = 0.0 !< stellarator symmetric normal field at boundary; vacuum component; - REAL :: Bns(-MNtor:MNtor,-MMpol:MMpol) = 0.0 !< stellarator symmetric normal field at boundary; plasma component; - REAL :: Vnc(-MNtor:MNtor,-MMpol:MMpol) = 0.0 !< non-stellarator symmetric normal field at boundary; vacuum component; - REAL :: Bnc(-MNtor:MNtor,-MMpol:MMpol) = 0.0 !< non-stellarator symmetric normal field at boundary; plasma component; + integer :: Lreflect = 0 !< =1 reflect the upper and lower bound in slab, =0 do not reflect + + real(wp) :: Rac( 0:MNtor ) = 0.0 !< stellarator symmetric coordinate axis; + real(wp) :: Zas( 0:MNtor ) = 0.0 !< stellarator symmetric coordinate axis; + real(wp) :: Ras( 0:MNtor ) = 0.0 !< non-stellarator symmetric coordinate axis; + real(wp) :: Zac( 0:MNtor ) = 0.0 !< non-stellarator symmetric coordinate axis; + + real(wp) :: Rbc(-MNtor:MNtor,-MMpol:MMpol) = 0.0 !< stellarator symmetric boundary components; + real(wp) :: Zbs(-MNtor:MNtor,-MMpol:MMpol) = 0.0 !< stellarator symmetric boundary components; + real(wp) :: Rbs(-MNtor:MNtor,-MMpol:MMpol) = 0.0 !< non-stellarator symmetric boundary components; + real(wp) :: Zbc(-MNtor:MNtor,-MMpol:MMpol) = 0.0 !< non-stellarator symmetric boundary components; + + real(wp) :: Rwc(-MNtor:MNtor,-MMpol:MMpol) = 0.0 !< stellarator symmetric boundary components of wall; + real(wp) :: Zws(-MNtor:MNtor,-MMpol:MMpol) = 0.0 !< stellarator symmetric boundary components of wall; + real(wp) :: Rws(-MNtor:MNtor,-MMpol:MMpol) = 0.0 !< non-stellarator symmetric boundary components of wall; + real(wp) :: Zwc(-MNtor:MNtor,-MMpol:MMpol) = 0.0 !< non-stellarator symmetric boundary components of wall; + + real(wp) :: Vns(-MNtor:MNtor,-MMpol:MMpol) = 0.0 !< stellarator symmetric normal field at boundary; vacuum component; + real(wp) :: Bns(-MNtor:MNtor,-MMpol:MMpol) = 0.0 !< stellarator symmetric normal field at boundary; plasma component; + real(wp) :: Vnc(-MNtor:MNtor,-MMpol:MMpol) = 0.0 !< non-stellarator symmetric normal field at boundary; vacuum component; + real(wp) :: Bnc(-MNtor:MNtor,-MMpol:MMpol) = 0.0 !< non-stellarator symmetric normal field at boundary; plasma component; !> @} !> \addtogroup grp_global_numerics numericlist !> \brief The namelist \c numericlist controls internal resolution parameters that the user rarely needs to consider. !> @{ - INTEGER :: Linitialize = 0 !< Used to initialize geometry using a regularization / extrapolation method + integer :: Linitialize = 0 !< Used to initialize geometry using a regularization / extrapolation method !< - INTEGER :: LautoinitBn = 1 !< Used to initialize \f$B_{ns}\f$ using an initial fixed-boundary calculation + integer :: LautoinitBn = 1 !< Used to initialize \f$B_{ns}\f$ using an initial fixed-boundary calculation !< - INTEGER :: Lzerovac = 0 !< Used to adjust vacuum field to cancel plasma field on computational boundary + integer :: Lzerovac = 0 !< Used to adjust vacuum field to cancel plasma field on computational boundary !< - INTEGER :: Ndiscrete = 2 !< resolution of the real space grid on which fast Fourier transforms are performed is given by \c Ndiscrete*Mpol*4 + integer :: Ndiscrete = 2 !< resolution of the real space grid on which fast Fourier transforms are performed is given by \c Ndiscrete*Mpol*4 !< - INTEGER :: Nquad = -1 !< Resolution of the Gaussian quadrature + integer :: Nquad = -1 !< Resolution of the Gaussian quadrature !< - INTEGER :: iMpol = -4 !< Fourier resolution of straight-fieldline angle on interfaces + integer :: iMpol = -4 !< Fourier resolution of straight-fieldline angle on interfaces !< - INTEGER :: iNtor = -4 !< Fourier resolution of straight-fieldline angle on interfaces; + integer :: iNtor = -4 !< Fourier resolution of straight-fieldline angle on interfaces; !< - INTEGER :: Lsparse = 0 !< controls method used to solve for rotational-transform on interfaces + integer :: Lsparse = 0 !< controls method used to solve for rotational-transform on interfaces !< - INTEGER :: Lsvdiota = 0 !< controls method used to solve for rotational-transform on interfaces; + integer :: Lsvdiota = 0 !< controls method used to solve for rotational-transform on interfaces; !< only relevant if \c Lsparse = 0 !< - INTEGER :: imethod = 3 !< controls iterative solution to sparse matrix + integer :: imethod = 3 !< controls iterative solution to sparse matrix !< arising in real-space transformation to the straight-fieldline angle; !< only relevant if \c Lsparse.eq.2; \see tr00ab() for details !< - INTEGER :: iorder = 2 !< controls real-space grid resolution for constructing the straight-fieldline angle; + integer :: iorder = 2 !< controls real-space grid resolution for constructing the straight-fieldline angle; !< only relevant if \c Lsparse>0 !< !< determines order of finite-difference approximation to the derivatives @@ -293,7 +293,7 @@ module inputlist !<
  • if \c iorder = 4,
  • !<
  • if \c iorder = 6,
  • !< - INTEGER :: iprecon = 0 !< controls iterative solution to sparse matrix arising in real-space transformation + integer :: iprecon = 0 !< controls iterative solution to sparse matrix arising in real-space transformation !< to the straight-fieldline angle; !< only relevant if \c Lsparse.eq.2; \see tr00ab() for details !< - REAL :: iotatol = -1.0 !< tolerance required for iterative construction of straight-fieldline angle; + real(wp) :: iotatol = -1.0 !< tolerance required for iterative construction of straight-fieldline angle; !< only relevant if \c Lsparse.ge.2 - INTEGER :: Lextrap = 0 !< geometry of innermost interface is defined by extrapolation - INTEGER :: Mregular = -1 !< maximum regularization factor + integer :: Lextrap = 0 !< geometry of innermost interface is defined by extrapolation + integer :: Mregular = -1 !< maximum regularization factor !< - INTEGER :: Lrzaxis = 1 !< controls the guess of geometry axis in the innermost volume or initialization of interfaces + integer :: Lrzaxis = 1 !< controls the guess of geometry axis in the innermost volume or initialization of interfaces !< - INTEGER :: Ntoraxis = 3 !< the number of \f$n\f$ harmonics used in the Jacobian \f$m=1\f$ harmonic elimination method; + integer :: Ntoraxis = 3 !< the number of \f$n\f$ harmonics used in the Jacobian \f$m=1\f$ harmonic elimination method; !< only relevant if \c Lrzaxis.ge.1 . !> @} @@ -323,7 +323,7 @@ module inputlist !> The transformation to straight-fieldline coordinates is singular when the rotational-transform of the interfaces is rational; !> however, the rotational-transform is still well defined. !> @{ - INTEGER :: LBeltrami = 4 !< Control flag for solution of Beltrami equation + integer :: LBeltrami = 4 !< Control flag for solution of Beltrami equation !< !< - INTEGER :: Linitgues = 1 !< controls how initial guess for Beltrami field is constructed + integer :: Linitgues = 1 !< controls how initial guess for Beltrami field is constructed !< - INTEGER :: Lposdef = 0 !< redundant; - REAL :: maxrndgues = 1.0 !< the maximum random number of the Beltrami field if \c Linitgues = 3 - INTEGER :: Lmatsolver = 3 !< 1 for LU factorization, 2 for GMRES, 3 for GMRES matrix-free - INTEGER :: NiterGMRES = 200 !< number of max iteration for GMRES - REAL :: epsGMRES = 1e-14 !< the precision of GMRES - INTEGER :: LGMRESprec = 1 !< type of preconditioner for GMRES, 1 for ILU sparse matrix - REAL :: epsILU = 1e-12 !< the precision of incomplete LU factorization for preconditioning + integer :: Lposdef = 0 !< redundant; + real(wp) :: maxrndgues = 1.0 !< the maximum random number of the Beltrami field if \c Linitgues = 3 + integer :: Lmatsolver = 3 !< 1 for LU factorization, 2 for GMRES, 3 for GMRES matrix-free + integer :: NiterGMRES = 200 !< number of max iteration for GMRES + real(wp) :: epsGMRES = 1e-14 !< the precision of GMRES + integer :: LGMRESprec = 1 !< type of preconditioner for GMRES, 1 for ILU sparse matrix + real(wp) :: epsILU = 1e-12 !< the precision of incomplete LU factorization for preconditioning !> @} !> \addtogroup grp_global_global globallist @@ -385,39 +385,39 @@ module inputlist !> where \f$\psi_v\equiv\f$ normalized toroidal flux, \c tflux, and \f$\omega\equiv\f$ \c wpoloidal. !> !> @{ - INTEGER :: Lfindzero = 0 !< use Newton methods to find zero of force-balance, which is computed by dforce() + integer :: Lfindzero = 0 !< use Newton methods to find zero of force-balance, which is computed by dforce() !< - REAL :: escale = 0.0 !< controls the weight factor, \c BBweight, in the force-imbalance harmonics + real(wp) :: escale = 0.0 !< controls the weight factor, \c BBweight, in the force-imbalance harmonics !< - REAL :: opsilon = 1.0 !< weighting of force-imbalance + real(wp) :: opsilon = 1.0 !< weighting of force-imbalance !< - REAL :: pcondense = 2.0 !< spectral condensation parameter + real(wp) :: pcondense = 2.0 !< spectral condensation parameter !< - REAL :: epsilon = 0.0 !< weighting of spectral-width constraint + real(wp) :: epsilon = 0.0 !< weighting of spectral-width constraint !< - REAL :: wpoloidal = 1.0 !< "star-like" poloidal angle constraint radial exponential factor + real(wp) :: wpoloidal = 1.0 !< "star-like" poloidal angle constraint radial exponential factor !< used in preset() to construct \c sweight - REAL :: upsilon = 1.0 !< weighting of "star-like" poloidal angle constraint + real(wp) :: upsilon = 1.0 !< weighting of "star-like" poloidal angle constraint !< used in preset() to construct \c sweight - REAL :: forcetol = 1.0e-10 !< required tolerance in force-balance error; only used as an initial check + real(wp) :: forcetol = 1.0e-10 !< required tolerance in force-balance error; only used as an initial check !< - REAL :: c05xmax = 1.0e-06 !< required tolerance in position, \f${\bf x} \equiv \{ R_{i,v}, Z_{i,v}\}\f$ - REAL :: c05xtol = 1.0e-12 !< required tolerance in position, \f${\bf x} \equiv \{ R_{i,v}, Z_{i,v}\}\f$ + real(wp) :: c05xmax = 1.0e-06 !< required tolerance in position, \f${\bf x} \equiv \{ R_{i,v}, Z_{i,v}\}\f$ + real(wp) :: c05xtol = 1.0e-12 !< required tolerance in position, \f${\bf x} \equiv \{ R_{i,v}, Z_{i,v}\}\f$ !< - REAL :: c05factor = 1.0e-02 !< used to control initial step size in + real(wp) :: c05factor = 1.0e-02 !< used to control initial step size in !< \c C05NDF and \c C05PDF !< - INTEGER :: mfreeits = 0 !< maximum allowed free-boundary iterations + integer :: mfreeits = 0 !< maximum allowed free-boundary iterations !< - REAL :: bnstol = 1.0e-06 !< redundant; - REAL :: bnsblend = 0.666 !< redundant; - REAL :: gBntol = 1.0e-06 !< required tolerance in free-boundary iterations + real(wp) :: bnstol = 1.0e-06 !< redundant; + real(wp) :: bnsblend = 0.666 !< redundant; + real(wp) :: gBntol = 1.0e-06 !< required tolerance in free-boundary iterations !< - REAL :: gBnbld = 0.666 !< normal blend + real(wp) :: gBnbld = 0.666 !< normal blend !< - REAL :: vcasingeps = 1.e-12 !< regularization of Biot-Savart; see bnorml(), casing() - REAL :: vcasingtol = 1.e-08 !< accuracy on virtual casing integral; see bnorml(), casing() - INTEGER :: vcasingits = 8 !< minimum number of calls to adaptive virtual casing routine; see casing() - INTEGER :: vcasingper = 1 !< periods of integragion in adaptive virtual casing routine; see casing() - INTEGER :: mcasingcal = 8 !< minimum number of calls to adaptive virtual casing routine; see casing(); redundant; + real(wp) :: vcasingeps = 1.e-12 !< regularization of Biot-Savart; see bnorml(), casing() + real(wp) :: vcasingtol = 1.e-08 !< accuracy on virtual casing integral; see bnorml(), casing() + integer :: vcasingits = 8 !< minimum number of calls to adaptive virtual casing routine; see casing() + integer :: vcasingper = 1 !< periods of integragion in adaptive virtual casing routine; see casing() + integer :: mcasingcal = 8 !< minimum number of calls to adaptive virtual casing routine; see casing(); redundant; !> @} !> \addtogroup grp_global_diagnostics diagnosticslist !> \brief The namelist \c diagnosticslist controls post-processor diagnostics, such as Poincaré plot resolution, etc. !> @{ - REAL :: odetol = 1.0e-07 !< o.d.e. integration tolerance for all field line tracing routines - REAL :: absreq = 1.0e-08 !< redundant - REAL :: relreq = 1.0e-08 !< redundant - REAL :: absacc = 1.0e-04 !< redundant - REAL :: epsr = 1.0e-08 !< redundant - INTEGER :: nPpts = 0 !< number of toroidal transits used (per trajectory) in following field lines + real(wp) :: odetol = 1.0e-07 !< o.d.e. integration tolerance for all field line tracing routines + real(wp) :: absreq = 1.0e-08 !< redundant + real(wp) :: relreq = 1.0e-08 !< redundant + real(wp) :: absacc = 1.0e-04 !< redundant + real(wp) :: epsr = 1.0e-08 !< redundant + integer :: nPpts = 0 !< number of toroidal transits used (per trajectory) in following field lines !< for constructing Poincaré plots; !< if \c nPpts<1, no Poincaré plot is constructed; - REAL :: Ppts = 0.0 !< stands for Poincare plot theta start. Chose at which angle (normalized over \f$\pi\f$) the Poincare field-line tracing start. - INTEGER :: nPtrj(1:MNvol+1) = -1 !< number of trajectories in each annulus to be followed in constructing Poincaré plot + real(wp) :: Ppts = 0.0 !< stands for Poincare plot theta start. Chose at which angle (normalized over \f$\pi\f$) the Poincare field-line tracing start. + integer :: nPtrj(1:MNvol+1) = -1 !< number of trajectories in each annulus to be followed in constructing Poincaré plot !< diff --git a/src/lbpol.f90 b/src/lbpol.F90 similarity index 79% rename from src/lbpol.f90 rename to src/lbpol.F90 index c4958705..963d0603 100644 --- a/src/lbpol.f90 +++ b/src/lbpol.F90 @@ -6,19 +6,19 @@ !latex \calledby{\link{xspech} and !latex \link{dfp100}} -!latex \calls{\link{coords} and +!latex \calls{\link{coords} and !latex \link{numrec}} !latex \begin{enumerate} !latex \item Call \link{coords} to compute the metric coefficients and the jacobian. -!latex \item Build coefficients \inputvar{efmn}, \inputvar{ofmn}, \inputvar{cfmn}, \inputvar{sfmn} from the field vector potential \inputvar{Ate}, \inputvar{Ato}, +!latex \item Build coefficients \inputvar{efmn}, \inputvar{ofmn}, \inputvar{cfmn}, \inputvar{sfmn} from the field vector potential \inputvar{Ate}, \inputvar{Ato}, !latex \inputvar{Aze} and \inputvar{Azo}, and radial derivatives of the Chebyshev polynomials \inputvar{TT(ll,innout,1)}. These variables -!latex are the radial derivative of the Fourier coefficients of the magnetic field vector potential. -!latex \item Take the inverse Fourier transform of \inputvar{efmn}, \inputvar{ofmn}, \inputvar{cfmn}, \inputvar{sfmn}. These are the covariant components of $dA$, +!latex are the radial derivative of the Fourier coefficients of the magnetic field vector potential. +!latex \item Take the inverse Fourier transform of \inputvar{efmn}, \inputvar{ofmn}, \inputvar{cfmn}, \inputvar{sfmn}. These are the covariant components of $dA$, !latex \textit{i.e.} the contravariant components of $\mathbf{B}$. !latex \item Build covariant components of the field using the metric coefficients \inputvar{guvij} and the jacobian \inputvar{sg}. -!latex \item Fourier transform the covariant components of the field and store them in the variables \inputvar{Btemn}, \inputvar{Btomn}, \inputvar{Bzemn} and +!latex \item Fourier transform the covariant components of the field and store them in the variables \inputvar{Btemn}, \inputvar{Btomn}, \inputvar{Bzemn} and !latex \inputvar{Bzomn}. !latex \end{enumerate} @@ -26,7 +26,7 @@ !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! subroutine lbpol(lvol, Bt00, ideriv, iocons) - + use mod_kinds, only: wp => dp use constants, only : mu0, pi, pi2, two, one, half, zero use allglobal, only : Ate, Aze, Ato, Azo, TT, & @@ -48,15 +48,23 @@ subroutine lbpol(lvol, Bt00, ideriv, iocons) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS + +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + ! ------ - - INTEGER :: Lcurvature, ideriv, ii, ll, ifail, lvol, mi, ni, iocons - REAL :: lss, Bt00(1:Mvol, 0:1, -1:2) - REAL :: lAte(1:mn), lAze(1:mn), lAto(1:mn), lAzo(1:mn) - REAL :: dAt(1:Ntz), dAz(1:Ntz), Bt(1:Ntz), Bz(1:Ntz), dAt0(1:Ntz), dAz0(1:Ntz) - REAL :: dBtzero ! Value of first B_theta mode jump - REAL :: mfactor ! Regularisation factor + + integer :: Lcurvature, ideriv, ii, ll, ifail, lvol, mi, ni, iocons + real(wp) :: lss, Bt00(1:Mvol, 0:1, -1:2) + real(wp) :: lAte(1:mn), lAze(1:mn), lAto(1:mn), lAzo(1:mn) + real(wp) :: dAt(1:Ntz), dAz(1:Ntz), Bt(1:Ntz), Bz(1:Ntz), dAt0(1:Ntz), dAz0(1:Ntz) + real(wp) :: dBtzero ! Value of first B_theta mode jump + real(wp) :: mfactor ! Regularisation factor LOGICAL :: LGeometricDerivative ! Lcurvature: Controls what the routine coords computes. @@ -66,7 +74,15 @@ subroutine lbpol(lvol, Bt00, ideriv, iocons) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - BEGIN(lbpol) + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif + ! TODO: This subroutine is very similar to curent.f90 - maybe merge both in a single subroutine to simplify? @@ -84,8 +100,13 @@ subroutine lbpol(lvol, Bt00, ideriv, iocons) ! First get the metric component and jacobian Lcurvature = 1 - WCALL( lbpol, coords, (lvol, lss, Lcurvature, Ntz, mn ) ) ! get guvij and sg - + + cput = MPI_WTIME() + Tlbpol = Tlbpol + ( cput-cpuo ) + call coords(lvol, lss, Lcurvature, Ntz, mn ) + cpuo = MPI_WTIME() + ! get guvij and sg + ! Then compute the vector potential and its derivatives. call build_vector_potential(lvol, iocons, ideriv, 1) @@ -101,7 +122,12 @@ subroutine lbpol(lvol, Bt00, ideriv, iocons) ! Get derivatives of metric element Lcurvature = 3 - WCALL( lbpol, coords, (lvol, lss, Lcurvature, Ntz, mn ) ) ! get sg times d/dx (g_mu,nu / sg) + + cput = MPI_WTIME() + Tlbpol = Tlbpol + ( cput-cpuo ) + call coords(lvol, lss, Lcurvature, Ntz, mn ) + cpuo = MPI_WTIME() + ! get sg times d/dx (g_mu,nu / sg) ! Compute vector potential without taking derivatives call build_vector_potential(lvol, iocons, 0, 1) @@ -127,7 +153,12 @@ subroutine lbpol(lvol, Bt00, ideriv, iocons) ! Now Btemn(1, 0, vvol) and Btemn(1, 1, vvol) contain Bte00(s=-1) and Bte00(s=1) for each volume vvol. - RETURN(lbpol) + +9999 continue + cput = MPI_WTIME() + Tlbpol = Tlbpol + ( cput-cpuo ) + return + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! diff --git a/src/lforce.f90 b/src/lforce.F90 similarity index 89% rename from src/lforce.f90 rename to src/lforce.F90 index 1d9fd715..1d1098b8 100644 --- a/src/lforce.f90 +++ b/src/lforce.F90 @@ -142,7 +142,7 @@ !> @param MMl !> @param[in] iflag subroutine lforce( lvol, iocons, ideriv, Ntz, dBB, XX, YY, length, DDl, MMl, iflag ) - + use mod_kinds, only: wp => dp !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! use constants, only : zero, half, one, two @@ -172,27 +172,67 @@ subroutine lforce( lvol, iocons, ideriv, Ntz, dBB, XX, YY, length, DDl, MMl, ifl !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS - INTEGER, intent(in) :: lvol, iocons, ideriv, Ntz, iflag - REAL :: dAt(1:Ntz, -1:2), dAz(1:Ntz, -1:2), XX(1:Ntz), YY(1:Ntz), dRR(1:Ntz,-1:1), dZZ(1:Ntz,-1:1), DDl, MMl +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + integer, intent(in) :: lvol, iocons, ideriv, Ntz, iflag + real(wp) :: dAt(1:Ntz, -1:2), dAz(1:Ntz, -1:2), XX(1:Ntz), YY(1:Ntz), dRR(1:Ntz,-1:1), dZZ(1:Ntz,-1:1), DDl, MMl - REAL :: IIl(1:Ntz), length(1:Ntz), dLL(1:Ntz) - INTEGER :: Lcurvature, ii, jj, kk, ll, ifail, ivol, lnn, mi, id!, oicons - REAL :: dBB(1:Ntz, -1:2), lss, mfactor + real(wp) :: IIl(1:Ntz), length(1:Ntz), dLL(1:Ntz) + integer :: Lcurvature, ii, jj, kk, ll, ifail, ivol, lnn, mi, id!, oicons + real(wp) :: dBB(1:Ntz, -1:2), lss, mfactor - REAL :: dAs(1:Ntz)!, dRdt(-1:1,0:1), dZdt(-1:1,0:1) - REAL :: lgvuij(1:Ntz,1:3,1:3) ! local workspace; 13 Sep 13; + real(wp) :: dAs(1:Ntz)!, dRdt(-1:1,0:1), dZdt(-1:1,0:1) + real(wp) :: lgvuij(1:Ntz,1:3,1:3) ! local workspace; 13 Sep 13; + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif - BEGIN(lforce) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! #ifdef DEBUG - FATAL( lforce, lvol.lt.1 .or. lvol.gt.Mvol, illegal lvol ) - FATAL( lforce, lvol.eq.1 .and. iocons.eq.0, illegal combination ) - FATAL( lforce, lvol.eq.Mvol .and. iocons.eq.1, illegal combination ) - FATAL( lforce, iflag.lt.0 .or. iflag.gt.1, illegal iflag ) + + if( lvol.lt.1 .or. lvol.gt.Mvol ) then + write(6,'("lforce : fatal : myid=",i3," ; lvol.lt.1 .or. lvol.gt.Mvol ; illegal lvol ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "lforce : lvol.lt.1 .or. lvol.gt.Mvol : illegal lvol ;" + endif + + + if( lvol.eq.1 .and. iocons.eq.0 ) then + write(6,'("lforce : fatal : myid=",i3," ; lvol.eq.1 .and. iocons.eq.0 ; illegal combination ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "lforce : lvol.eq.1 .and. iocons.eq.0 : illegal combination ;" + endif + + + if( lvol.eq.Mvol .and. iocons.eq.1 ) then + write(6,'("lforce : fatal : myid=",i3," ; lvol.eq.Mvol .and. iocons.eq.1 ; illegal combination ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "lforce : lvol.eq.Mvol .and. iocons.eq.1 : illegal combination ;" + endif + + + if( iflag.lt.0 .or. iflag.gt.1 ) then + write(6,'("lforce : fatal : myid=",i3," ; iflag.lt.0 .or. iflag.gt.1 ; illegal iflag ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "lforce : iflag.lt.0 .or. iflag.gt.1 : illegal iflag ;" + endif + #endif !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -208,7 +248,12 @@ subroutine lforce( lvol, iocons, ideriv, Ntz, dBB, XX, YY, length, DDl, MMl, ifl Lcurvature = 1 - WCALL( lforce, coords, ( lvol, lss, Lcurvature, Ntz, mn ) ) ! get coordinates and derivatives wrt Rj, Zj, at specific radial location; + + cput = MPI_WTIME() + Tlforce = Tlforce + ( cput-cpuo ) + call coords( lvol, lss, Lcurvature, Ntz, mn ) + cpuo = MPI_WTIME() + ! get coordinates and derivatives wrt Rj, Zj, at specific radial location; !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -252,7 +297,12 @@ subroutine lforce( lvol, iocons, ideriv, Ntz, dBB, XX, YY, length, DDl, MMl, ifl if( ideriv.eq.-1 ) then ! Get coordinate metrics and their derivatives wrt Rj, Zj on interface; lss = two * iocons - one ; Lcurvature = 4 - WCALL( lforce, coords, ( lvol, lss, Lcurvature, Ntz, mn ) ) + + cput = MPI_WTIME() + Tlforce = Tlforce + ( cput-cpuo ) + call coords( lvol, lss, Lcurvature, Ntz, mn ) + cpuo = MPI_WTIME() + dBB(1:Ntz,id) = dBB(1:Ntz, id) + & half * ( dAz(1:Ntz, 0)*dAz(1:Ntz, 0)*guvij(1:Ntz,2,2,1) & @@ -342,7 +392,13 @@ subroutine lforce( lvol, iocons, ideriv, Ntz, dBB, XX, YY, length, DDl, MMl, ifl ! ijreal(1:Ntz) contains the pressure + magnetic energy term; #ifdef DEBUG - FATAL( lforce, iocons.lt.0 .or. iocons.gt.2, error ) + + if( iocons.lt.0 .or. iocons.gt.2 ) then + write(6,'("lforce : fatal : myid=",i3," ; iocons.lt.0 .or. iocons.gt.2 ; error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "lforce : iocons.lt.0 .or. iocons.gt.2 : error ;" + endif + #endif ;ifail = 0 @@ -367,7 +423,12 @@ subroutine lforce( lvol, iocons, ideriv, Ntz, dBB, XX, YY, length, DDl, MMl, ifl !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - RETURN(lforce) + +9999 continue + cput = MPI_WTIME() + Tlforce = Tlforce + ( cput-cpuo ) + return + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! diff --git a/src/ma00aa.f90 b/src/ma00aa.F90 similarity index 90% rename from src/ma00aa.f90 rename to src/ma00aa.F90 index cb9b5390..25ae8cf4 100644 --- a/src/ma00aa.f90 +++ b/src/ma00aa.F90 @@ -65,7 +65,7 @@ !> @param[in] lvol index of nested volume !> @param[in] lrad order of Chebychev polynomials subroutine ma00aa( lquad, mn, lvol, lrad ) - + use mod_kinds, only: wp => dp !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! use constants, only : zero, half, one, two, pi, pi2 @@ -102,34 +102,56 @@ subroutine ma00aa( lquad, mn, lvol, lrad ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS - INTEGER, intent(in) :: lquad, mn, lvol, lrad +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + integer, intent(in) :: lquad, mn, lvol, lrad + + integer :: jquad, ll, pp, ll1, pp1, uv, ii, jj, io, mn2, lp2, mn2_max, lp2_max, nele - INTEGER :: jquad, ll, pp, ll1, pp1, uv, ii, jj, io, mn2, lp2, mn2_max, lp2_max, nele + integer :: kk, kd, kka, kks, kda, kds, Lcurvature, ideriv - INTEGER :: kk, kd, kka, kks, kda, kds, Lcurvature, ideriv + real(wp) :: lss, jthweight, fee, feo, foe, foo, Tl, Dl, Tp, Dp, TlTp, TlDp, DlTp, DlDp, ikda, ikds, imn2, ilrad, lssm - REAL :: lss, jthweight, fee, feo, foe, foo, Tl, Dl, Tp, Dp, TlTp, TlDp, DlTp, DlDp, ikda, ikds, imn2, ilrad, lssm + real(wp) :: foocc, foocs, foosc, fooss + real(wp) :: fsscc, fsscs, fsssc, fssss + real(wp) :: fstcc, fstcs, fstsc, fstss + real(wp) :: fszcc, fszcs, fszsc, fszss + real(wp) :: fttcc, fttcs, fttsc, fttss + real(wp) :: ftzcc, ftzcs, ftzsc, ftzss + real(wp) :: fzzcc, fzzcs, fzzsc, fzzss - REAL :: foocc, foocs, foosc, fooss - REAL :: fsscc, fsscs, fsssc, fssss - REAL :: fstcc, fstcs, fstsc, fstss - REAL :: fszcc, fszcs, fszsc, fszss - REAL :: fttcc, fttcs, fttsc, fttss - REAL :: ftzcc, ftzcs, ftzsc, ftzss - REAL :: fzzcc, fzzcs, fzzsc, fzzss + real(wp) :: sbar + real(wp), allocatable :: basis(:,:,:,:) - REAL :: sbar - REAL, allocatable :: basis(:,:,:,:) - BEGIN( ma00aa ) + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! #ifdef DEBUG - FATAL( ma00aa, lvol.lt.1 .or. lvol.gt.Mvol, illegal volume label ) + + if( lvol.lt.1 .or. lvol.gt.Mvol ) then + write(6,'("ma00aa : fatal : myid=",i3," ; lvol.lt.1 .or. lvol.gt.Mvol ; illegal volume label ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "ma00aa : lvol.lt.1 .or. lvol.gt.Mvol : illegal volume label ;" + endif + #endif !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -177,16 +199,29 @@ subroutine ma00aa( lquad, mn, lvol, lrad ) DDzzss = zero endif !NOTstellsym - SALLOCATE(basis, (0:lrad,0:mpol,0:1,lquad), zero) + + allocate( basis(0:lrad,0:mpol,0:1,lquad), stat=astat ) + basis(0:lrad,0:mpol,0:1,lquad) = zero + if( dBdX%L ) then ; Lcurvature = 3 ; ideriv = 1 else ; Lcurvature = 1 ; ideriv = 0 endif if (.not. Lsavedguvij) then - WCALL( ma00aa, compute_guvijsave, (lquad, lvol, ideriv, Lcurvature) ) + + cput = MPI_WTIME() + Tma00aa = Tma00aa + ( cput-cpuo ) + call compute_guvijsave(lquad, lvol, ideriv, Lcurvature) + cpuo = MPI_WTIME() + endif - WCALL( ma00aa, metrix,( lquad, lvol ) ) ! compute metric elements; 16 Jan 13; + + cput = MPI_WTIME() + Tma00aa = Tma00aa + ( cput-cpuo ) + call metrix( lquad, lvol ) + cpuo = MPI_WTIME() + ! compute metric elements; 16 Jan 13; do jquad = 1, lquad lss = gaussianabscissae(jquad,lvol) ; jthweight = gaussianweight(jquad,lvol) @@ -342,7 +377,9 @@ subroutine ma00aa( lquad, mn, lvol, lrad ) !$OMP END PARALLEL DO !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - DALLOCATE(basis) + + deallocate(basis,stat=astat) + DToocc = DToocc * pi2pi2nfphalf TTssss = TTssss * pi2pi2nfphalf @@ -385,7 +422,12 @@ subroutine ma00aa( lquad, mn, lvol, lrad ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - RETURN( ma00aa ) + +9999 continue + cput = MPI_WTIME() + Tma00aa = Tma00aa + ( cput-cpuo ) + return + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! diff --git a/src/ma02aa.f90 b/src/ma02aa.F90 similarity index 79% rename from src/ma02aa.f90 rename to src/ma02aa.F90 index 4a175dc3..6e3db768 100644 --- a/src/ma02aa.f90 +++ b/src/ma02aa.F90 @@ -9,7 +9,7 @@ !> @param[in] lvol index of nested volume for which to run this !> @param[in] NN number of degrees of freedom in the (packed format) vector potential; subroutine ma02aa( lvol, NN ) - + use mod_kinds, only: wp => dp !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! use constants, only : zero, half, one, ten @@ -40,53 +40,75 @@ subroutine ma02aa( lvol, NN ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS - INTEGER, intent(in) :: lvol, NN +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + integer, intent(in) :: lvol, NN - INTEGER :: ideriv - REAL :: tol, dpsi(1:2), lastcpu - CHARACTER :: packorunpack + integer :: ideriv + real(wp) :: tol, dpsi(1:2), lastcpu + character :: packorunpack - INTEGER :: Nxdof, Ndof, Ldfjac, iflag, maxfev, mode, LRR, nfev, njev, nprint, ihybrj - REAL :: Xdof(1:2), Fdof(1:2), Ddof(1:2,1:2), oDdof(1:2,1:2) - REAL :: factor, diag(1:2), RR(1:2*(2+1)/2), QTF(1:2), wk(1:2,1:4) + integer :: Nxdof, Ndof, Ldfjac, iflag, maxfev, mode, LRR, nfev, njev, nprint, ihybrj + real(wp) :: Xdof(1:2), Fdof(1:2), Ddof(1:2,1:2), oDdof(1:2,1:2) + real(wp) :: factor, diag(1:2), RR(1:2*(2+1)/2), QTF(1:2), wk(1:2,1:4) - INTEGER :: irevcm + integer :: irevcm - INTEGER :: pNN + integer :: pNN - REAL :: xi(0:NN), Fxi(0:NN), xo(0:NN), Mxi(1:NN) + real(wp) :: xi(0:NN), Fxi(0:NN), xo(0:NN), Mxi(1:NN) external :: mp00ac #ifdef DEBUG - INTEGER :: ixx, jxx, jfinite ! computing finite-difference derivatives of \iota wrt \mu and \Delta \psi_p; - REAL :: lfdiff, dFdof(-1:1,-1:1,1:2) - REAL, allocatable :: dsolution(:,:,:,:) + integer :: ixx, jxx, jfinite ! computing finite-difference derivatives of \iota wrt \mu and \Delta \psi_p; + real(wp) :: lfdiff, dFdof(-1:1,-1:1,1:2) + real(wp), allocatable :: dsolution(:,:,:,:) #endif !required for hybrj1; - INTEGER :: ihybrj1, Ldfmuaa, lengthwork - REAL :: NewtonError - REAL , allocatable :: DFxi(:,:), work(:) + integer :: ihybrj1, Ldfmuaa, lengthwork + real(wp) :: NewtonError + real(wp) , allocatable :: DFxi(:,:), work(:) external :: df00ab ! required for E04UFF; - INTEGER :: NLinearConstraints, NNonLinearConstraints, LDA, LDCJ, LDR, iterations, LIWk, LRWk, ie04uff - INTEGER, allocatable :: Istate(:), NEEDC(:), IWk(:) - REAL :: objectivefunction - REAL , allocatable :: LinearConstraintMatrix(:,:), LowerBound(:), UpperBound(:) - REAL , allocatable :: constraintfunction(:), constraintgradient(:,:), multipliers(:), objectivegradient(:), RS(:,:), RWk(:) - CHARACTER :: optionalparameter*33 + integer :: NLinearConstraints, NNonLinearConstraints, LDA, LDCJ, LDR, iterations, LIWk, LRWk, ie04uff + integer, allocatable :: Istate(:), NEEDC(:), IWk(:) + real(wp) :: objectivefunction + real(wp) , allocatable :: LinearConstraintMatrix(:,:), LowerBound(:), UpperBound(:) + real(wp) , allocatable :: constraintfunction(:), constraintgradient(:,:), multipliers(:), objectivegradient(:), RS(:,:), RWk(:) + character :: optionalparameter*33 + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif - BEGIN(ma02aa) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! #ifdef DEBUG - FATAL( ma02aa, lvol.lt.1 .or. lvol.gt.Mvol, illegal lvol ) + + if( lvol.lt.1 .or. lvol.gt.Mvol ) then + write(6,'("ma02aa : fatal : myid=",i3," ; lvol.lt.1 .or. lvol.gt.Mvol ; illegal lvol ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "ma02aa : lvol.lt.1 .or. lvol.gt.Mvol : illegal lvol ;" + endif + #endif !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -102,7 +124,7 @@ subroutine ma02aa( lvol, NN ) !> if( LBsequad ) then ! sequential quadratic programming (SQP); construct minimum energy with constrained helicity; - lastcpu = GETTIME + lastcpu = MPI_WTIME() NLinearConstraints = 0 ! no linear constraints; @@ -114,10 +136,19 @@ subroutine ma02aa( lvol, NN ) LDR = NN - SALLOCATE( LinearConstraintMatrix, (1:LDA,1:1), zero ) ! linear constraint matrix; - SALLOCATE( LowerBound, (1:NN+NLinearConstraints+NNonLinearConstraints), zero ) ! lower bounds on variables, linear constraints and non-linear constraints; - SALLOCATE( UpperBound, (1:NN+NLinearConstraints+NNonLinearConstraints), zero ) ! upper bounds on variables, linear constraints and non-linear constraints; + allocate( LinearConstraintMatrix(1:LDA,1:1), stat=astat ) + LinearConstraintMatrix(1:LDA,1:1) = zero + ! linear constraint matrix; + + + allocate( LowerBound(1:NN+NLinearConstraints+NNonLinearConstraints), stat=astat ) + LowerBound(1:NN+NLinearConstraints+NNonLinearConstraints) = zero + ! lower bounds on variables, linear constraints and non-linear constraints; + + allocate( UpperBound(1:NN+NLinearConstraints+NNonLinearConstraints), stat=astat ) + UpperBound(1:NN+NLinearConstraints+NNonLinearConstraints) = zero + ! upper bounds on variables, linear constraints and non-linear constraints; LowerBound( 1 : NN ) = -1.0E+21 ! variable constraints; no constraint; UpperBound( 1 : NN ) = +1.0E+21 ! @@ -128,32 +159,64 @@ subroutine ma02aa( lvol, NN ) iterations = 0 ! iteration counter; - SALLOCATE( Istate, (1:NN+NLinearConstraints+NNonLinearConstraints), 0 ) - SALLOCATE( constraintfunction, (1:NNonLinearConstraints), zero ) ! constraint functions; + allocate( Istate(1:NN+NLinearConstraints+NNonLinearConstraints), stat=astat ) + Istate(1:NN+NLinearConstraints+NNonLinearConstraints) = 0 + - SALLOCATE( constraintgradient, (1:LDCJ,1:NN), zero ) ! derivatives of constraint functions; - SALLOCATE( multipliers, (1:NN+NLinearConstraints+NNonLinearConstraints), zero ) ! Lagrange multipliers ?; + allocate( constraintfunction(1:NNonLinearConstraints), stat=astat ) + constraintfunction(1:NNonLinearConstraints) = zero + ! constraint functions; + + + allocate( constraintgradient(1:LDCJ,1:NN), stat=astat ) + constraintgradient(1:LDCJ,1:NN) = zero + ! derivatives of constraint functions; + + + allocate( multipliers(1:NN+NLinearConstraints+NNonLinearConstraints), stat=astat ) + multipliers(1:NN+NLinearConstraints+NNonLinearConstraints) = zero + ! Lagrange multipliers ?; objectivefunction = zero ! objective function; - SALLOCATE( objectivegradient, (1:NN), zero ) ! derivatives of objective function; - SALLOCATE( RS, (1:LDR,1:NN), zero ) + allocate( objectivegradient(1:NN), stat=astat ) + objectivegradient(1:NN) = zero + ! derivatives of objective function; + + + allocate( RS(1:LDR,1:NN), stat=astat ) + RS(1:LDR,1:NN) = zero + ideriv = 0 ; dpsi(1:2) = (/ dtflux(lvol), dpflux(lvol) /) ! these are also used below; packorunpack = 'P' - CALL( ma02aa, packab, ( packorunpack, lvol, NN, xi(1:NN), ideriv ) ) - SALLOCATE( NEEDC, (1:NNonLinearConstraints), 0 ) + cput = MPI_WTIME() + Tma02aa = Tma02aa + ( cput-cpuo ) + call packab( packorunpack, lvol, NN, xi(1:NN), ideriv ) + cpuo = MPI_WTIME() + + + + allocate( NEEDC(1:NNonLinearConstraints), stat=astat ) + NEEDC(1:NNonLinearConstraints) = 0 + LIWk = 3*NN + NLinearConstraints + 2*NNonLinearConstraints ! workspace; - SALLOCATE( IWk, (1:LIWk), 0 ) ! workspace; + + allocate( IWk(1:LIWk), stat=astat ) + IWk(1:LIWk) = 0 + ! workspace; LRWk = 2*NN**2 + NN * NLinearConstraints + 2 * NN * NNonLinearConstraints + 21 * NN + 11 * NLinearConstraints + 22 * NNonLinearConstraints + 1 ! workspace; - SALLOCATE( RWk, (1:LRWk), zero ) ! workspace; + + allocate( RWk(1:LRWk), stat=astat ) + RWk(1:LRWk) = zero + ! workspace; irevcm = 0 ; ie04uff = 1 ! reverse communication loop control; ifail error flag; @@ -242,22 +305,51 @@ subroutine ma02aa( lvol, NN ) ! enddo ! end of do ! reverse communication loop; - DALLOCATE(RWk) - DALLOCATE(IWk) - DALLOCATE(NEEDC) - DALLOCATE(RS) - DALLOCATE(objectivegradient) - DALLOCATE(multipliers) - DALLOCATE(constraintgradient) - DALLOCATE(constraintfunction) - DALLOCATE(Istate) - DALLOCATE(LowerBound) - DALLOCATE(UpperBound) - DALLOCATE(LinearConstraintMatrix) + + deallocate(RWk,stat=astat) + + + deallocate(IWk,stat=astat) + + + deallocate(NEEDC,stat=astat) + + + deallocate(RS,stat=astat) + + + deallocate(objectivegradient,stat=astat) + + + deallocate(multipliers,stat=astat) + + + deallocate(constraintgradient,stat=astat) + + + deallocate(constraintfunction,stat=astat) + + + deallocate(Istate,stat=astat) + + + deallocate(LowerBound,stat=astat) + + + deallocate(UpperBound,stat=astat) + + + deallocate(LinearConstraintMatrix,stat=astat) + packorunpack = 'U' - CALL( ma02aa, packab ( packorunpack, lvol, NN, xi(1:NN), ideriv ) ) + + cput = MPI_WTIME() + Tma02aa = Tma02aa + ( cput-cpuo ) + call packab ( packorunpack, lvol, NN, xi(1:NN), ideriv ) + cpuo = MPI_WTIME() + lBBintegral(lvol) = half * sum( xi(1:NN) * matmul( dMA(1:NN,1:NN), xi(1:NN) ) ) + sum( xi(1:NN) * MBpsi(1:NN) ) ! + psiMCpsi lABintegral(lvol) = half * sum( xi(1:NN) * matmul( dMD(1:NN,1:NN), xi(1:NN) ) ) ! + sum( xi(1:NN) * MEpsi(1:NN) ) ! + psiMFpsi @@ -276,10 +368,16 @@ subroutine ma02aa( lvol, NN ) if( LBnewton ) then - lastcpu = GETTIME + lastcpu = MPI_WTIME() + + + allocate( DFxi(0:NN,0:NN), stat=astat ) + DFxi(0:NN,0:NN) = zero + + + allocate( work(1:(1+NN)*(1+NN+13)/2), stat=astat ) + work(1:(1+NN)*(1+NN+13)/2) = zero - SALLOCATE(DFxi, (0:NN,0:NN), zero) - SALLOCATE(work, (1:(1+NN)*(1+NN+13)/2), zero) xi(0) = mu(lvol) ! initialize; helicity multiplier is treated as an independent degree-of-freedom; @@ -287,7 +385,12 @@ subroutine ma02aa( lvol, NN ) packorunpack = 'P' ! CALL( ma02aa, packab ( packorunpack, lvol, NN, xi(1:NN), dpsi(1:2), ideriv ) ) - CALL( ma02aa, packab ( packorunpack, lvol, NN, xi(1:NN), ideriv ) ) + + cput = MPI_WTIME() + Tma02aa = Tma02aa + ( cput-cpuo ) + call packab ( packorunpack, lvol, NN, xi(1:NN), ideriv ) + cpuo = MPI_WTIME() + pNN = NN + 1 ; Ldfmuaa = pNN ; tol = mupftol ; lengthwork = pNN * ( pNN+13 ) / 2 @@ -306,9 +409,14 @@ subroutine ma02aa( lvol, NN ) packorunpack = 'U' ; ideriv = 0 - CALL( ma02aa, packab( packorunpack, lvol, NN, xi(1:NN), ideriv ) ) - cput = GETTIME + cput = MPI_WTIME() + Tma02aa = Tma02aa + ( cput-cpuo ) + call packab( packorunpack, lvol, NN, xi(1:NN), ideriv ) + cpuo = MPI_WTIME() + + + cput = MPI_WTIME() select case( ihybrj1 ) case( :-1 ) @@ -328,14 +436,31 @@ subroutine ma02aa( lvol, NN ) ; write(ounit,1020) cput-cpus, myid, lvol, ihybrj1, helicity(lvol), mu(lvol), dpflux(lvol), cput-lastcpu, NewtonError, "bad progress ; " endif case default - FATAL( ma02aa, .true., illegal ifail returned by hybrj1 ) + + if( .true. ) then + write(6,'("ma02aa : fatal : myid=",i3," ; .true. ; illegal ifail returned by hybrj1 ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "ma02aa : .true. : illegal ifail returned by hybrj1 ;" + endif + end select #ifdef DEBUG xo(1:NN) = xi(1:NN) ! save original for comparison; packorunpack = 'P' ; ideriv = 0 - CALL( ma02aa, packab( packorunpack, lvol, NN, xi(1:NN), ideriv ) ) - FATAL( ma02aa, sum(abs(xi(1:Nfielddof(lvol))-xo(1:Nfielddof(lvol))))/Nfielddof(lvol).gt.vsmall, un/packing routine is incorrect ) + + cput = MPI_WTIME() + Tma02aa = Tma02aa + ( cput-cpuo ) + call packab( packorunpack, lvol, NN, xi(1:NN), ideriv ) + cpuo = MPI_WTIME() + + + if( sum(abs(xi(1:Nfielddof(lvol))-xo(1:Nfielddof(lvol))))/Nfielddof(lvol).gt.vsmall ) then + write(6,'("ma02aa : fatal : myid=",i3," ; sum(abs(xi(1:Nfielddof(lvol))-xo(1:Nfielddof(lvol))))/Nfielddof(lvol).gt.vsmall ; un/packing routine is incorrect ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "ma02aa : sum(abs(xi(1:Nfielddof(lvol))-xo(1:Nfielddof(lvol))))/Nfielddof(lvol).gt.vsmall : un/packing routine is incorrect ;" + endif + #endif !if( NewtonError.lt.mupftol ) then @@ -347,8 +472,12 @@ subroutine ma02aa( lvol, NN ) solution(1:NN,0) = xi(1:NN) - DALLOCATE( DFxi ) - DALLOCATE( work ) + + deallocate(DFxi ,stat=astat) + + + deallocate(work ,stat=astat) + endif ! end of if( LBnewton ) then @@ -419,7 +548,7 @@ subroutine ma02aa( lvol, NN ) if( LBlinear ) then ! assume Beltrami field is parameterized by helicity multiplier (and poloidal flux); - lastcpu = GETTIME + lastcpu = MPI_WTIME() if( Lplasmaregion ) then @@ -461,7 +590,12 @@ subroutine ma02aa( lvol, NN ) ; ; Ndof = 1 ; Ldfjac = Ndof ; nfev = 1 ; njev = 0 ; ihybrj = 1; ! provide dummy values for consistency; - WCALL( ma02aa, mp00ac, ( Ndof, Xdof(1:Ndof), Fdof(1:Ndof), Ddof(1:Ldfjac,1:Ndof), Ldfjac, iflag ) ) + + cput = MPI_WTIME() + Tma02aa = Tma02aa + ( cput-cpuo ) + call mp00ac( Ndof, Xdof(1:Ndof), Fdof(1:Ndof), Ddof(1:Ldfjac,1:Ndof), Ldfjac, iflag ) + cpuo = MPI_WTIME() + helicity(lvol) = lABintegral(lvol) ! this was computed in mp00ac; @@ -472,11 +606,22 @@ subroutine ma02aa( lvol, NN ) tol = mupftol ; LRR = Ndof * ( Ndof+1 ) / 2 ; mode = 0 ; diag(1:2) = zero ; factor = one ; maxfev = mupfits ; nprint = 0 - FATAL( ma02aa, Ndof.gt.2, illegal ) - WCALL( ma02aa, hybrj2, ( mp00ac, Ndof, Xdof(1:Ndof), Fdof(1:Ndof), Ddof(1:Ldfjac,1:Ndof), Ldfjac, tol, & + if( Ndof.gt.2 ) then + write(6,'("ma02aa : fatal : myid=",i3," ; Ndof.gt.2 ; illegal ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "ma02aa : Ndof.gt.2 : illegal ;" + endif + + + + cput = MPI_WTIME() + Tma02aa = Tma02aa + ( cput-cpuo ) + call hybrj2( mp00ac, Ndof, Xdof(1:Ndof), Fdof(1:Ndof), Ddof(1:Ldfjac,1:Ndof), Ldfjac, tol, & maxfev, diag(1:Ndof), mode, factor, nprint, ihybrj, nfev, njev, RR(1:LRR), LRR, QTF(1:Ndof), & - WK(1:Ndof,1), WK(1:Ndof,2), WK(1:Ndof,3), WK(1:Ndof,4) ) ) + WK(1:Ndof,1), WK(1:Ndof,2), WK(1:Ndof,3), WK(1:Ndof,4) ) + cpuo = MPI_WTIME() + if( Lplasmaregion ) then @@ -506,7 +651,12 @@ subroutine ma02aa( lvol, NN ) iflag = 2 ; Ldfjac = Ndof ! call mp00ac: tr00ab/curent to ensure the derivatives of B, transform, currents, wrt mu/dtflux & dpflux are calculated; - WCALL( ma02aa, mp00ac, ( Ndof, Xdof(1:Ndof), Fdof(1:Ndof), Ddof(1:Ldfjac,1:Ndof), Ldfjac, iflag ) ) + + cput = MPI_WTIME() + Tma02aa = Tma02aa + ( cput-cpuo ) + call mp00ac( Ndof, Xdof(1:Ndof), Fdof(1:Ndof), Ddof(1:Ldfjac,1:Ndof), Ldfjac, iflag ) + cpuo = MPI_WTIME() + endif ! end of if( Lconstraint.eq.1 .or. ( Lvacuumregion .and. Lconstraint.eq.0 ) ) ; @@ -515,7 +665,7 @@ subroutine ma02aa( lvol, NN ) end select ! end of select case( Nxdof ) ; - cput = GETTIME + cput = MPI_WTIME() select case(ihybrj) ! this screen output may not be correct for Lvacuumregion; case( 1 ) @@ -534,7 +684,13 @@ subroutine ma02aa( lvol, NN ) ; write(ounit,1040) cput-cpus, myid, lvol, ihybrj, helicity(lvol), mu(lvol), dpflux(lvol), cput-lastcpu, "bad progress ", Fdof(1:Ndof) case default ; write(ounit,1040) cput-cpus, myid, lvol, ihybrj, helicity(lvol), mu(lvol), dpflux(lvol), cput-lastcpu, "illegal ifail ", Fdof(1:Ndof) - FATAL( ma02aa, .true., illegal ifail returned by hybrj ) + + if( .true. ) then + write(6,'("ma02aa : fatal : myid=",i3," ; .true. ; illegal ifail returned by hybrj ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "ma02aa : .true. : illegal ifail returned by hybrj ;" + endif + end select endif ! end of if( LBlinear ) then; @@ -567,7 +723,10 @@ subroutine ma02aa( lvol, NN ) if( Lconstraint.eq.1 .or. Lvacuumregion ) then ! only in this case are the derivatives calculated; - SALLOCATE( dsolution, (1:NN,0:2,-1:1,-1:1), zero ) ! packed vector potential; + + allocate( dsolution(1:NN,0:2,-1:1,-1:1), stat=astat ) + dsolution(1:NN,0:2,-1:1,-1:1) = zero + ! packed vector potential; if( Lplasmaregion ) then Xdof(1:2) = xoffset + (/ mu(lvol), dpflux(lvol) /) ! initial guess for degrees of freedom; offset from zero so that relative error is small; @@ -589,13 +748,18 @@ subroutine ma02aa( lvol, NN ) iflag = 2 ! iflag controls derivative calculation in mp00ac; analytic derivatives of rotational-transform are required; - CALL( ma02aa, mp00ac( Ndof, Xdof(1:Ndof), dFdof(ixx,jxx,1:Ndof), oDdof(1:Ldfjac,1:Ndof), Ldfjac, iflag ) ) ! compute "exact" derivatives; + + cput = MPI_WTIME() + Tma02aa = Tma02aa + ( cput-cpuo ) + call mp00ac( Ndof, Xdof(1:Ndof), dFdof(ixx,jxx,1:Ndof), oDdof(1:Ldfjac,1:Ndof), Ldfjac, iflag ) + cpuo = MPI_WTIME() + ! compute "exact" derivatives; dsolution(1:NN,1,0,0) = solution(1:NN,1) ! packed vector potential; derivative wrt mu ; dsolution(1:NN,2,0,0) = solution(1:NN,2) ! packed vector potential; derivative wrt dpflux; jfinite = 0 - cput = GETTIME + cput = MPI_WTIME() write(ounit,2000) cput-cpus, myid, lvol, jfinite, "derivative", oDdof(1:Ldfjac,1:Ndof) do jfinite = -4,-2,+1 ; lfdiff = ten**jfinite @@ -615,7 +779,12 @@ subroutine ma02aa( lvol, NN ) iflag = 1 ! analytic derivatives of rotational-transform are not required; - CALL( ma02aa, mp00ac( Ndof, Xdof(1:Ndof), dFdof(ixx,jxx,1:Ndof), Ddof(1:Ldfjac,1:Ndof), Ldfjac, iflag ) ) ! compute function values only; + + cput = MPI_WTIME() + Tma02aa = Tma02aa + ( cput-cpuo ) + call mp00ac( Ndof, Xdof(1:Ndof), dFdof(ixx,jxx,1:Ndof), Ddof(1:Ldfjac,1:Ndof), Ldfjac, iflag ) + cpuo = MPI_WTIME() + ! compute function values only; dsolution(1:NN,0,ixx,jxx) = solution(1:NN,0) @@ -625,16 +794,18 @@ subroutine ma02aa( lvol, NN ) ; Ddof(1:Ndof,1) = ( dFdof( 1, 0, 1:Ndof) - dFdof(-1, 0, 1:Ndof) ) / lfdiff ! derivative wrt helicity multiplier ; if( Ndof.eq.2 ) Ddof(1:Ndof,2) = ( dFdof( 0, 1, 1:Ndof) - dFdof( 0,-1, 1:Ndof) ) / lfdiff ! derivative wrt enclosed poloidal flux; - cput = GETTIME + cput = MPI_WTIME() !write(ounit,2000) cput-cpus, myid, lvol, jfinite, " error ", Ddof(1:Ldfjac,1:Ndof) - oDdof(1:Ldfjac,1:Ndof) write(ounit,2000) cput-cpus, myid, lvol, jfinite, " estimate ", Ddof(1:Ldfjac,1:Ndof) enddo ! end of do jfinite; - cput = GETTIME + cput = MPI_WTIME() write(ounit,2000) cput-cpus - DALLOCATE(dsolution) + + deallocate(dsolution,stat=astat) + 2000 format("ma02aa : ":,f10.2," :":" myid=",i3," : lvol=",i3," ; jj=",i3," ; "a10" : DF=["es23.15" ,"es23.15" ,"es23.15" ,"es23.15" ] ;") @@ -646,7 +817,12 @@ subroutine ma02aa( lvol, NN ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - RETURN(ma02aa) + +9999 continue + cput = MPI_WTIME() + Tma02aa = Tma02aa + ( cput-cpuo ) + return + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! diff --git a/src/macros b/src/macros index d534ec4d..8d090b58 100644 --- a/src/macros +++ b/src/macros @@ -1,30 +1,19 @@ -!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - -! this file, ext_m.F90, has been constructed by macro expansion; see ext.f90 for source; - -!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - -m4_changequote({,})m4_dnl ; can put comments here; -m4_changecom(!)m4_dnl ; can put comments here; -m4_define(INTEGER,integer)m4_dnl ; can put comments here; -m4_define(REAL,real(8))m4_dnl ; can put comments here; -!m4_define(CHARACTER,character)m4_dnl ; can put comments here; -m4_define(GETTIME,MPI_WTIME())m4_dnl ; can put comments here; -m4_define(MPISTART,{! macro expansion of mpistart; - +m4_changequote({,})m4_dnl +m4_changecom(!)m4_dnl +m4_define(INTEGER,integer)m4_dnl +m4_define(REAL,real(wp))m4_dnl +m4_define(CHARACTER,character)m4_dnl +m4_define(GETTIME,MPI_WTIME())m4_dnl +m4_define(MPISTART,{ myid = 0 ; ncpu = 1 call MPI_INIT( ierr ) call MPI_COMM_RANK( MPI_COMM_WORLD, myid, ierr ) call MPI_COMM_SIZE( MPI_COMM_WORLD, ncpu, ierr ) - - ! macro expansion of mpistart; end;})m4_dnl can put comments here -m4_define(MPIFINALIZE,{! macro expansion of mpifinalize; - +})m4_dnl +m4_define(MPIFINALIZE,{ call MPI_FINALIZE(ierr) - - ! macro expansion of mpifinalize; end;})m4_dnl can put comments here -m4_define(LOCALS,{! macro expansion of locals; - +})m4_dnl +m4_define(LOCALS,{ #ifdef OPENMP USE OMP_LIB #endif @@ -32,1207 +21,56 @@ m4_define(LOCALS,{! macro expansion of locals; implicit none INTEGER :: ierr, astat, ios, nthreads, ithread REAL :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; - - ! macro expansion of locals; end;})m4_dnl ; can put comments here; - -m4_define(GETTHREAD,{! macro expansion of getthread; - +})m4_dnl +m4_define(GETTHREAD,{ #ifdef OPENMP ithread = omp_get_thread_num() + 1 #else ithread = 1 #endif - - ! macro expansion of getthread; end;})m4_dnl ; can put comments here; - -m4_define(SALLOCATE,{ ! macro expansion of sallocate = set allocate; -! allocate a variable of name _1 in the range _2 and set the value to _3 - -#ifdef DEBUG - if( allocated( $1 ) ) then - cput = MPI_WTIME() - write(6,'("macros : ",f10.2," : myid=",i3," ; $1 already allocated ;")') cput-cpus, myid - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop 'macros : 0123456789 : myid= ; $1 already allocated ;' - endif - if( Wmacros ) write(ounit,'("macros : ", 10x ," : myid=",i3," ; allocating $1 ;")') myid -#endif - - if( allocated( $1 ) ) deallocate( $1 ) - +})m4_dnl +m4_define(SALLOCATE,{ allocate( $1$2, stat=astat ) - -#ifdef DEBUG - if( astat.ne.0 ) then - cput = MPI_WTIME() - write(6,'("macros : ",f10.2," : myid=",i3," ; error allocating $1 ;")') cput-cpus, myid - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop 'error allocating $1' - endif - if( Wmacros ) write(ounit,'("macros : ", 10x ," : myid=",i3," ; allocated $1 ;")') myid -#endif - $1$2 = $3 - - ! macro expansion of sallocate; end;})m4_dnl ; can put comments here; -m4_define(NALLOCATE,{! macro expansion of nallocate; -! allocate a variable of name _1 in the range _2 - -#ifdef DEBUG - - if( allocated($1) ) then - cput = MPI_WTIME() - write(6,'("macros : ",f10.2," : myid=",i3," ; $1 already allocated ;")') cput-cpus, myid - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop '$1 allocated' - endif - - if( Wmacros ) write(ounit,'("macros : ", 10x ," : myid=",i3," ; allocating $1 ;")') myid - -#endif - - if( allocated( $1 ) ) deallocate( $1 ) +})m4_dnl +m4_define(NALLOCATE,{ allocate($1$2,stat=astat) - -#ifdef DEBUG - - if( astat.ne.0 ) then - cput = MPI_WTIME() - write(6,'("macros : ",f10.2," : myid=",i3," ; error allocating $1 ;")') cput-cpus, myid - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop 'error allocating $1' - endif - - if( Wmacros ) write(ounit,'("macros : ", 10x ," : myid=",i3," ; allocated $1 ;")') myid - -#endif - - ! macro expansion of nallocate; end;})m4_dnl ; can put comments here; -m4_define(DALLOCATE,{! macro expansion of dallocate; -! deallocate _1 -#ifdef DEBUG - - if( .not.allocated($1) ) then - cput = MPI_WTIME() - write(6,'("macros : ",f10.2," : myid=",i3," ; $1 not allocated ;")') cput-cpus, myid - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop '$1 allocated' - endif - - if( Wmacros ) write(ounit,'("macros : ", 10x ," : myid=",i3," ; de-allocating $1 ;")') myid - -#endif - +})m4_dnl +m4_define(DALLOCATE,{ deallocate($1,stat=astat) - -#ifdef DEBUG - - if( astat.ne.0 ) then - cput = MPI_WTIME() - write(6,'("macros : ",f10.2," : myid=",i3," ; error de-allocating $1 ;")') cput-cpus, myid - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop 'error allocating $1' - - endif - - if( Wmacros ) write(ounit,'("macros : ", 10x ," : myid=",i3," ; de-allocated $1 ;")') myid - -#endif - - ! macro expansion of dallocate; end;})m4_dnl ; can put comments here; -m4_define(FATAL,{! macro expansion of fatal; -! called from within _1; check logical expression in _2 and exit with reason _3 if the expression _2 is true +})m4_dnl +m4_define(FATAL,{ if( $2 ) then write(6,'("$1 : fatal : myid=",i3," ; $2 ; $3;")') myid call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) stop "$1 : $2 : $3 ;" endif - - ! macro expansion of fatal; end;})m4_dnl ; can put comments here; -m4_define(LlBCAST,{! macro expansion of llbcast; -! logical MPI broadcast of _1; length is _2; what is _3 ? - -#ifdef DEBUG - - if( $2.lt.0 ) then - write(6,'(" : ",10x," ; myid=",i3," ; error broadcasting $1 ;")') myid - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop - endif - - if( Wmacros ) write(6,'(" : ",10x," ; myid=",i3," ; lvol=",i3," ; broadcasting $1 ;")') myid, $3+1 - -#endif - +})m4_dnl +m4_define(LlBCAST,{ call MPI_BCAST($1,$2,MPI_LOGICAL,$3,MPI_COMM_SPEC,ierr) - -#ifdef DEBUG - - if( Wmacros ) write(6,'(" : ",10x," ; myid=",i3," ; lvol=",i3," ; broadcasted $1 ;")') myid, $3+1 - -#endif - - ! macro expansion of llbcast; end;})m4_dnl can put comments here -m4_define(IlBCAST,{! macro expansion of ilbcast; -! integer MPI broadcast of _1; length is _2; what is _3 ? - -#ifdef DEBUG - - if( $2.lt.0 ) then - write(6,'(" : "10x" ; myid=",i3," ; error broadcasting $1 ;")') myid - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop - endif - - if( Wmacros ) write(6,'(" : "10x" ; myid=",i3," ; lvol=",i3," ; broadcasting $1 ;")') myid, $3 - -#endif - +})m4_dnl +m4_define(IlBCAST,{ call MPI_BCAST( $1, $2, MPI_INTEGER, $3, MPI_COMM_SPEC, ierr ) - -#ifdef DEBUG - - if( Wmacros ) write(6,'(" : "10x" ; myid=",i3," ; lvol=",i3," ; broadcasted $1 ;")') myid, $3 - -#endif - - ! macro expansion of ilbcast; end;})m4_dnl can put comments here -m4_define(RlBCAST,{! macro expansion of rlbcast; -! real MPI broadcast of _1; length is _2; _3 is radial volume which is worked on - -#ifdef DEBUG - - if( $2.lt.0 ) then - write(6,'(" : "10x" ; myid=",i3," ; error broadcasting $1 ;")')myid - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop - endif - - if( Wmacros ) write(6,'(" : "10x" ; myid=",i3," ; lvol=",i3," ; broadcasting $1 ;")') myid, $3+1 - -#endif - +})m4_dnl +m4_define(RlBCAST,{ call MPI_BCAST($1,$2,MPI_DOUBLE_PRECISION,$3,MPI_COMM_SPEC,ierr) - -#ifdef DEBUG - - if( Wmacros ) write(6,'(" : "10x" ; myid=",i3," ; lvol=",i3," ; broadcasted $1 ;")') myid, $3+1 - -#endif - - ! macro expansion of rlbcast; end;})m4_dnl can put comments here -m4_define(ClBCAST,{! macro expansion of clbcast; -! character MPI broadcast of _1; length is _2; index is _3 - -#ifdef DEBUG - - if( $2.lt.0 ) then - write(6,'(" : "10x" ; myid=",i3," ; lvol=",i3," ; error broadcasting $1 ;")') myid, $3+1 - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop - endif - - if( Wmacros ) write(6,'(" : "10x" ; myid=",i3," ; lvol=",i3," ; broadcasting $1 ;")') myid, $3+1 - -#endif - +})m4_dnl +m4_define(ClBCAST,{ call MPI_BCAST($1,$2,MPI_CHARACTER,$3,MPI_COMM_SPEC,ierr) - -#ifdef DEBUG - - if( Wmacros ) write(6,'(" : "10x" ; myid=",i3," ; lvol=",i3," ; broadcasted $1 ;")') myid, $3+1 - -#endif - - ! macro expansion of clbcast; end;})m4_dnl can put comments here -m4_define(CALL,{! macro expansion of call; -! call _2 with arguments _3 from within _1 - +})m4_dnl +m4_define(CALL,{ cput = MPI_WTIME() - T$1 = T$1 + ( cput-cpuo ) - + T$1 = T$1 + ( cput-cpuo ) call $2$3 - - !cpuo = zero cpuo = MPI_WTIME() - - ! macro expansion of call; end;})m4_dnl ; can put comments here; -m4_define(WCALL,{! macro expansion of wcall; -! call _2 with arguments _3 from within _1 and write wall time needed for call to screen - +})m4_dnl +m4_define(WCALL,{ cput = MPI_WTIME() - T$1 = T$1 + ( cput-cpuo ) - -#ifdef DEBUG - if( W$1 ) then - cput = MPI_WTIME() - write(ounit,'("$1 : ",f10.2," : myid=",i3," ; calling $2 ;")') cput-cpus, myid - endif -#endif - + T$1 = T$1 + ( cput-cpuo ) call $2$3 - -#ifdef DEBUG - if( W$1 ) then - cput = MPI_WTIME() - write(ounit,'("$1 : ",f10.2," : myid=",i3," ; called $2 ;")') cput-cpus, myid - endif -#endif - - !cpuo = zero cpuo = MPI_WTIME() - - ! macro expansion of wcall; end;})m4_dnl ; can put comments here; -m4_define(HDEFGRP,{! macro expansion of hdefgrp; -! define a HDF5 group in _1 with name _2 and save reference into hid_t _3; _4 and _5 should be __FILE__ and __LINE__ - - call h5lexists_f($1, "$2", grp_exists, hdfier) - - if (.not.grp_exists) then - ! if group does not exist, create it - call h5gcreate_f($1, "$2", $3, hdfier) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5gcreate_f from hdefgrp at $4:$5 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5gcreate_f from hdefgrp at $4:$5 ;" - endif - else - ! if the group already exists, open it - call h5gopen_f($1, "$2", $3, hdfier) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5gopen_f from hdefgrp at $4:$5 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5gopen_f from hdefgrp at $4:$5 ;" - endif - endif - - ! macro expansion of hdefgrp; end;})m4_dnl ; can put comments here; -m4_define(HCLOSEGRP,{! macro expansion of hclosegrp; -! close a HDF5 group given in _1 - - call h5gclose_f($1, hdfier) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5gclose_f from hclosegrp at $4:$5 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5gclose_f from hclosegrp at $4:$5 ;" - endif - - ! macro expansion of hclosegrp; end;})m4_dnl ; can put comments here; -m4_define(H5DESCR,{! macro expansion of h5descr; -! describe an already-open HDF5 object given in _1 at location _2 with text given in _3 and leave it open; _4 and _5 should be __FILE__ and __LINE__ -! also write a LaTeX comment on that output object -!latex \item{\verb+$2+} $3 - attr_data = "$3" - attrlen=len(attr_data) - - call h5screate_simple_f(arank, adims, aspace_id, hdfier) ! Create scalar data space for the attribute. - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from h5descr at $4:$5 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5screate_simple_f from h5descr at $4:$5 ;" - endif - - call h5tcopy_f(H5T_NATIVE_CHARACTER, atype_id, hdfier) ! Create datatype for the attribute. - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5tcopy_f from h5descr at $4:$5 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5tcopy_f from h5descr at $4:$5 ;" - endif - - call h5tset_size_f(atype_id, attrlen, hdfier) ! Create datatype for the attribute. - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5tset_size_f from h5descr at $4:$5 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5tset_size_f from h5descr at $4:$5 ;" - endif - - call h5acreate_f($1, aname, atype_id, aspace_id, attr_id, hdfier) ! create descriptive attribute - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5acreate_f from h5descr at $4:$5 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5acreate_f from h5descr at $4:$5 ;" - endif - - call h5awrite_f(attr_id, atype_id, attr_data, adims, hdfier) ! Write the attribute data. - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5awrite_f from h5descr at $4:$5 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5awrite_f from h5descr at $4:$5 ;" - endif - - call h5aclose_f(attr_id, hdfier) ! Close the attribute. - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5aclose_f from h5descr at $4:$5 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5aclose_f from h5descr at $4:$5 ;" - endif - - call h5tclose_f(atype_id, hdfier) ! Close the attribute datatype. - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5tclose_f from h5descr at $4:$5 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5tclose_f from h5descr at $4:$5 ;" - endif - - call h5sclose_f(aspace_id, hdfier) ! Terminate access to the data space. - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5sclose_f from h5descr at $4:$5 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5sclose_f from h5descr at $4:$5 ;" - endif - - ! macro expansion of h5descr; end;})m4_dnl ; can put comments here; - m4_define(H5DESCR_CDSET,{! macro expansion of h5descr_cdset; -! describe an already-open HDF5 dataset identified by dset_id at location _1 with text given in _2 and close it at the end; _3 and _4 should be __FILE__ and __LINE__ -! also write a LaTeX comment on that output object -!latex \item{\verb+$1+} $2 - attr_data = "$2" - attrlen=len(attr_data) - - ! Create scalar data space for the attribute. - call h5screate_simple_f(arank, adims, aspace_id, hdfier) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from h5descr_cdset at $3:$4 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5screate_simple_f from h5descr_cdset at $3:$4 ;" - endif - - ! Create datatype for the attribute. - call h5tcopy_f(H5T_NATIVE_CHARACTER, atype_id, hdfier) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5tcopy_f from h5descr_cdset at $3:$4 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5tcopy_f from h5descr_cdset at $3:$4 ;" - endif - - call h5tset_size_f(atype_id, attrlen, hdfier) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5tset_size_f from h5descr_cdset at $3:$4 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5tset_size_f from h5descr_cdset at $3:$4 ;" - endif - - ! create descriptive attribute - call h5acreate_f(dset_id, aname, atype_id, aspace_id, attr_id, hdfier) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5acreate_f from h5descr_cdset at $3:$4 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5acreate_f from h5descr_cdset at $3:$4 ;" - endif - - ! Write the attribute data. - call h5awrite_f(attr_id, atype_id, attr_data, adims, hdfier) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5awrite_f from h5descr_cdset at $3:$4 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5awrite_f from h5descr_cdset at $3:$4 ;" - endif - - ! Close the attribute. - call h5aclose_f(attr_id, hdfier) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5aclose_f from h5descr_cdset at $3:$4 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5aclose_f from h5descr_cdset at $3:$4 ;" - endif - - ! Close the attribute datatype. - call h5tclose_f(atype_id, hdfier) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5tclose_f from h5descr_cdset at $3:$4 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5tclose_f from h5descr_cdset at $3:$4 ;" - endif - - ! Terminate access to the data space. - call h5sclose_f(aspace_id, hdfier) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5sclose_f from h5descr_cdset at $3:$4 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5sclose_f from h5descr_cdset at $3:$4 ;" - endif - - call h5dclose_f(dset_id, hdfier) ! terminate dataset; - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5dclose_f from h5descr_cdset at $3:$4 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5dclose_f from h5descr_cdset at $3:$4 ;" - endif - - ! macro expansion of h5descr_cdset; end;})m4_dnl ; can put comments here; -m4_define(HWRITELV,{! macro expansion of hwritelv; -! write logical variable _4 (scalar (_2=1) or rank-1 (_2=length)) into a dataset named _3 into group _1; _5 and _6 should be __FILE__ and __LINE__ -! example: hwritelv( grpInputGlobal, 1, LreadGF, (/ LreadGF /) ) ! scalar -! example: hwritelv( grpInput, 5, success, success(1:5) ) ! rank-1 - -#ifdef DEBUG - if( Wmacros ) write(ounit,'("macros : ", 10x ," : myid=",i3," ; writing $3 ;")') myid -#endif - - rank = 1 ; onedims(1) = $2 - - if( $2.le.0 ) then - - write(6,'("sphdf5 : "10x" : error calling hwriteiv ; $3 : $2.le.0 at $5:$6 ;")') - - else - - call h5screate_simple_f( rank, onedims, space_id, hdfier ) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from hwritelv at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5screate_simple_f from hwritelv at $5:$6 ;" - endif - - ! temporarily disable error printing to not confuse users - call h5eset_auto_f(0, hdfier) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwritelv at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5eset_auto_f from hwritelv at $5:$6 ;" - endif - - ! check if dataset can be opened - call h5dopen_f($1, "$3", dset_id, hdfier) - if (hdfier.lt.0) then - var_exists = .false. - if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $3 does not exist yet, creating it" - endif - else - var_exists = .true. - if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $3 exists already, opening it" - endif - endif - - ! re-establish previous state of error printing to be sensitive to "real" errors - call h5eset_auto_f(internalHdf5Msg, hdfier) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwritelv at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5eset_auto_f from hwritelv at $5:$6 ;" - endif - - ! if the dataset does not exist already, create it. Otherwise, it should be open already - if (.not.var_exists) then - call h5dcreate_f( $1, "$3", H5T_NATIVE_INTEGER, space_id, dset_id, hdfier ) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5dcreate_f from hwritelv at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5dcreate_f from hwritelv at $5:$6 ;" - endif - endif - - call h5dwrite_f( dset_id, H5T_NATIVE_INTEGER, merge(1,0,$4) , onedims, hdfier ) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5dwrite_f from hwritelv at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5dwrite_f from hwritelv at $5:$6 ;" - endif - - call h5dclose_f(dset_id, hdfier) ! terminate dataset; - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5dclose_f from hwritelv at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5dclose_f from hwritelv at $5:$6 ;" - endif - - endif - - ! macro expansion of hwritelv; end;})m4_dnl ; can put comments here; -m4_define(HWRITELV_LO,{! macro expansion of hwritelv_lo; -! write logical variable _4 (scalar (_2=1) or rank-1 (_2=length)) into a dataset named _3 into group _1 and leave dataset open for e.g. adding an attribute; _5 and _6 should be __FILE__ and __LINE__ -! example: hwritelv_lo( grpInputGlobal, 1, LreadGF, (/ LreadGF /) ) ! scalar -! example: hwritelv_lo( grpInput, 5, success, success(1:5) ) ! rank-1 -! and close it using h5descr_cdset( /input/global/LreadGF, reading flag for GF ) - -#ifdef DEBUG - if( Wmacros ) write(ounit,'("macros : ", 10x ," : myid=",i3," ; writing $3 ;")') myid -#endif - - rank = 1 ; onedims(1) = $2 - - if( $2.le.0 ) then - - write(6,'("sphdf5 : "10x" : error calling hwriteiv ; $3 : $2.le.0 at $5:$6 ;")') - - else - - call h5screate_simple_f( rank, onedims, space_id, hdfier ) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from hwritelv_lo at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5screate_simple_f from hwritelv_lo at $5:$6 ;" - endif - - ! temporarily disable error printing to not confuse users - call h5eset_auto_f(0, hdfier) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwritelv_lo at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5eset_auto_f from hwritelv_lo at $5:$6 ;" - endif - - ! check if dataset can be opened - call h5dopen_f($1, "$3", dset_id, hdfier) - if (hdfier.lt.0) then - var_exists = .false. - if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $3 does not exist yet, creating it" - endif - else - var_exists = .true. - if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $3 exists already, opening it" - endif - endif - - ! re-establish previous state of error printing to be sensitive to "real" errors - call h5eset_auto_f(internalHdf5Msg, hdfier) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwritelv_lo at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5eset_auto_f from hwritelv_lo at $5:$6 ;" - endif - - ! if the dataset does not exist already, create it. Otherwise, it should be open already - if (.not.var_exists) then - call h5dcreate_f( $1, "$3", H5T_NATIVE_INTEGER, space_id, dset_id, hdfier ) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5dcreate_f from hwritelv_lo at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5dcreate_f from hwritelv_lo at $5:$6 ;" - endif - endif - - call h5dwrite_f( dset_id, H5T_NATIVE_INTEGER, merge(1,0,$4) , onedims, hdfier ) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5dwrite_f from hwritelv_lo at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5dwrite_f from hwritelv_lo at $5:$6 ;" - endif - - endif - - ! macro expansion of hwritelv_lo; end;})m4_dnl ; can put comments here; -m4_define(HWRITEIV,{! macro expansion of hwriteiv; -! write integer variable _4 (scalar (_2=1) or rank-1 (_2=length)) into a dataset named _3 into group _1; _5 and _6 should be __FILE__ and __LINE__ -! example: hwriteiv( grpInputPhysics, 1, Igeometry, (/ Igeometry /) ) ! scalar -! example: hwriteiv( grpInputPhysics, Mvol, Lrad, Lrad(1:Mvol) ) ! rank-1 - -#ifdef DEBUG - if( Wmacros ) write(ounit,'("macros : ", 10x ," : myid=",i3," ; writing $3 ;")') myid -#endif - - rank = 1 ; onedims(1) = $2 - - if( $2.le.0 ) then - - write(6,'("sphdf5 : "10x" : error calling hwriteiv ; $3 : $2.le.0 at $5:$6 ;")') - - else - - call h5screate_simple_f( rank, onedims, space_id, hdfier ) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from hwriteiv at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5screate_simple_f from hwriteiv at $5:$6 ;" - endif - - ! temporarily disable error printing to not confuse users - call h5eset_auto_f(0, hdfier) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriteiv at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5eset_auto_f from hwriteiv at $5:$6 ;" - endif - - ! check if dataset can be opened - call h5dopen_f($1, "$3", dset_id, hdfier) - if (hdfier.lt.0) then - var_exists = .false. - if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $3 does not exist yet, creating it" - endif - else - var_exists = .true. - if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $3 exists already, opening it" - endif - endif - - ! re-establish previous state of error printing to be sensitive to "real" errors - call h5eset_auto_f(internalHdf5Msg, hdfier) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriteiv at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5eset_auto_f from hwriteiv at $5:$6 ;" - endif - - ! if the dataset does not exist already, create it. Otherwise, it should be open already - if (.not.var_exists) then - call h5dcreate_f( $1, "$3", H5T_NATIVE_INTEGER, space_id, dset_id, hdfier ) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5dcreate_f from hwriteiv at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5dcreate_f from hwriteiv at $5:$6 ;" - endif - endif - - call h5dwrite_f( dset_id, H5T_NATIVE_INTEGER, $4, onedims, hdfier ) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5dwrite_f from hwriteiv at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5dwrite_f from hwriteiv at $5:$6 ;" - endif - - call h5dclose_f(dset_id, hdfier) ! terminate dataset; - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5dclose_f from hwriteiv at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5dclose_f from hwriteiv at $5:$6 ;" - endif - - endif - - ! macro expansion of hwriteiv; end;})m4_dnl ; can put comments here; -m4_define(HWRITEIV_LO,{! macro expansion of hwriteiv_lo; -! write integer variable _4 (scalar (_2=1) or rank-1 (_2=length)) into a dataset named _3 into group _1 and leave the dataset open for e.g. adding and attribute -! example: hwriteiv( grpInputPhysics, 1, Igeometry, (/ Igeometry /) ) ! scalar -! example: hwriteiv( grpInputPhysics, Mvol, Lrad, Lrad(1:Mvol) ) ! rank-1 -! and close it using h5descr_cdset( /input/physics/Igeometry, geometry identifier ) - -#ifdef DEBUG - if( Wmacros ) write(ounit,'("macros : ", 10x ," : myid=",i3," ; writing $3 ;")') myid -#endif - - rank = 1 ; onedims(1) = $2 - - if( $2.le.0 ) then - - write(6,'("sphdf5 : "10x" : error calling hwriteiv_lo ; $3 : $2.le.0 at $5:$6 ;")') - - else - - call h5screate_simple_f( rank, onedims, space_id, hdfier ) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from hwriteiv_lo at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5screate_simple_f from hwriteiv_lo at $5:$6 ;" - endif - - ! temporarily disable error printing to not confuse users - call h5eset_auto_f(0, hdfier) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriteiv_lo at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5eset_auto_f from hwriteiv_lo at $5:$6 ;" - endif - - ! check if dataset can be opened - call h5dopen_f($1, "$3", dset_id, hdfier) - if (hdfier.lt.0) then - var_exists = .false. - if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $3 does not exist yet, creating it" - endif - else - var_exists = .true. - if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $3 exists already, opening it" - endif - endif - - ! re-establish previous state of error printing to be sensitive to "real" errors - call h5eset_auto_f(internalHdf5Msg, hdfier) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriteiv_lo at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5eset_auto_f from hwriteiv_lo at $5:$6 ;" - endif - - ! if the dataset does not exist already, create it. Otherwise, it should be open already - if (.not.var_exists) then - call h5dcreate_f( $1, "$3", H5T_NATIVE_INTEGER, space_id, dset_id, hdfier ) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5dcreate_f from hwriteiv_lo at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5dcreate_f from hwriteiv_lo at $5:$6 ;" - endif - endif - - call h5dwrite_f( dset_id, H5T_NATIVE_INTEGER, $4, onedims, hdfier ) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5dwrite_f from hwriteiv_lo at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5dwrite_f from hwriteiv_lo at $5:$6 ;" - endif - - endif - - ! macro expansion of hwriteiv_lo; end;})m4_dnl ; can put comments here; -m4_define(HWRITERV,{! macro expansion of hwriterv; -! write real variable _4 (scalar (_2=1) or rank-1 (_2=length)) into a dataset named _3 into group _1; _5 and _6 should be __LINE__ and __FILE__ -! example: hwriterv( grpInputPhysics, 1, phiedge, (/ phiedge /) ) ! scalar -! example: hwriterv( grpInputPhysics, Mvol, tflux, tflux(1:Mvol) ) ! rank-1 - -#ifdef DEBUG - if( Wmacros ) write(ounit,'("macros : ", 10x ," : myid=",i3," ; writing $3 ;")') myid -#endif - - rank = 1 ; onedims(1) = $2 - - if( $2.le.0 ) then - - write(6,'("sphdf5 : "10x" : error calling hwriterv ; $3 : $2.le.0 at $5:$6 ;")') - - else - - call h5screate_simple_f( rank, onedims, space_id, hdfier ) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from hwriterv at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5screate_simple_f from hwriterv at $5:$6 ;" - endif - - ! temporarily disable error printing to not confuse users - call h5eset_auto_f(0, hdfier) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriterv at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5eset_auto_f from hwriterv at $5:$6 ;" - endif - - ! check if dataset can be opened - call h5dopen_f($1, "$3", dset_id, hdfier) - if (hdfier.lt.0) then - var_exists = .false. - if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $3 does not exist yet, creating it" - endif - else - var_exists = .true. - if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $3 exists already, opening it" - endif - endif - - ! re-establish previous state of error printing to be sensitive to "real" errors - call h5eset_auto_f(internalHdf5Msg, hdfier) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriterv at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5eset_auto_f from hwriterv at $5:$6 ;" - endif - - ! if the dataset does not exist already, create it. Otherwise, it should be open already - if (.not.var_exists) then - call h5dcreate_f( $1, "$3", H5T_NATIVE_DOUBLE, space_id, dset_id, hdfier ) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5dcreate_f from hwriterv at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5dcreate_f from hwriterv at $5:$6 ;" - endif - endif - - call h5dwrite_f( dset_id, H5T_NATIVE_DOUBLE, $4, onedims, hdfier ) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5dwrite_f from hwriterv at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5dwrite_f from hwriterv at $5:$6 ;" - endif - - call h5dclose_f(dset_id, hdfier) ! terminate dataset; - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5dclose_f from hwriterv at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5dclose_f from hwriterv at $5:$6 ;" - endif - - endif - - ! macro expansion of hwriterv; end;})m4_dnl ; can put comments here; -m4_define(HWRITERV_LO,{! macro expansion of hwriterv_lo; -! write real variable _4 (scalar (_2=1) or rank-1 (_2=length)) into a dataset named _3 into group _1 and leave it open, e.g. for adding an attribute; _5 and _6 should be __FILE__ and __LINE__ -! example: hwriterv( grpInputPhysics, 1, phiedge, (/ phiedge /) ) ! scalar -! example: hwriterv( grpInputPhysics, Mvol, tflux, tflux(1:Mvol) ) ! rank-1 -! and close it with h5descr_cdset( /input/physics/phiedge, total enclosed toroidal flux ) - -#ifdef DEBUG - if( Wmacros ) write(ounit,'("macros : ", 10x ," : myid=",i3," ; writing $3 ;")') myid -#endif - - rank = 1 ; onedims(1) = $2 - - if( $2.le.0 ) then - - write(6,'("sphdf5 : "10x" : error calling hwriterv ; $3 : $2.le.0 at $5:$6 ;")') - - else - - call h5screate_simple_f( rank, onedims, space_id, hdfier ) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from hwriterv_lo at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5screate_simple_f from hwriterv_lo at $5:$6 ;" - endif - - ! temporarily disable error printing to not confuse users - call h5eset_auto_f(0, hdfier) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriterv_lo at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5eset_auto_f from hwriterv_lo at $5:$6 ;" - endif - - ! check if dataset can be opened - call h5dopen_f($1, "$3", dset_id, hdfier) - if (hdfier.lt.0) then - var_exists = .false. - if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $3 does not exist yet, creating it" - endif - else - var_exists = .true. - if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $3 exists already, opening it" - endif - endif - - ! re-establish previous state of error printing to be sensitive to "real" errors - call h5eset_auto_f(internalHdf5Msg, hdfier) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriterv_lo at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5eset_auto_f from hwriterv_lo at $5:$6 ;" - endif - - ! if the dataset does not exist already, create it. Otherwise, it should be open already - if (.not.var_exists) then - call h5dcreate_f( $1, "$3", H5T_NATIVE_DOUBLE, space_id, dset_id, hdfier ) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5dcreate_f from hwriterv_lo at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5dcreate_f from hwriterv_lo at $5:$6 ;" - endif - endif - - call h5dwrite_f( dset_id, H5T_NATIVE_DOUBLE, $4, onedims, hdfier ) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5dwrite_f from hwriterv_lo at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5dwrite_f from hwriterv_lo at $5:$6 ;" - endif - - endif - - ! macro expansion of hwriterv_lo; end;})m4_dnl ; can put comments here; -m4_define(HWRITERA,{! macro expansion of hwritea; -! write real array _5 (_2 rows, _3 columns) into a dataset named _4 into group _1; _6 and _7 should be __FILE__ and __LINE__ -! example: hwritera( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Rbc, Rbc(-Ntor:Ntor,-Mpol:Mpol) ) - -#ifdef DEBUG - if( Wmacros ) write(ounit,'("macros : ", 10x ," : myid=",i3," ; writing $4 ;")') myid -#endif - - rank = 2 ; twodims(1:2) = (/ $2, $3 /) - - if( $2.le.0 .or. $3.le.0 ) then - - write(6,'("sphdf5 : "10x" : error calling hwritera ; $4 : $2.le.0 .or. $3.le.0 at $6:$7 ;")') - - else - - call h5screate_simple_f( rank, twodims, space_id, hdfier ) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from hwritera at $6:$7 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5screate_simple_f from hwritera at $6:$7 ;" - endif - - ! temporarily disable error printing to not confuse users - call h5eset_auto_f(0, hdfier) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwritera at $6:$7 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5eset_auto_f from hwritera at $6:$7 ;" - endif - - ! check if dataset can be opened - call h5dopen_f($1, "$4", dset_id, hdfier) - if (hdfier.lt.0) then - var_exists = .false. - if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $4 does not exist yet, creating it" - endif - else - var_exists = .true. - if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $4 exists already, opening it" - endif - endif - - ! re-establish previous state of error printing to be sensitive to "real" errors - call h5eset_auto_f(internalHdf5Msg, hdfier) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwritera at $6:$7 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5eset_auto_f from hwritera at $6:$7 ;" - endif - - ! if the dataset does not exist already, create it. Otherwise, it should be open already - if (.not.var_exists) then - call h5dcreate_f( $1, "$4", H5T_NATIVE_DOUBLE, space_id, dset_id, hdfier ) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5dcreate_f from hwritera at $6:$7 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5dcreate_f from hwritera at $6:$7 ;" - endif - endif - - call h5dwrite_f( dset_id, H5T_NATIVE_DOUBLE, $5, twodims, hdfier ) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5dwrite_f from hwritera at $6:$7 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5dwrite_f from hwritera at $6:$7 ;" - endif - - call h5dclose_f(dset_id, hdfier) ! terminate dataset; - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5dclose_f from hwritera at $6:$7 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5dclose_f from hwritera at $6:$7 ;" - endif - - endif - - ! macro expansion of hwritea; end;})m4_dnl ; can put comments here; -m4_define(HWRITERA_LO,{! macro expansion of hwritea_lo; -! write real array _5 (_2 rows, _3 columns) into a dataset named _4 into group _1 and leave it open, e.g. for adding an attribute; _6 and _7 should be __FILE__ and __LINE__ -! example: hwritera( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Rbc, Rbc(-Ntor:Ntor,-Mpol:Mpol) ) -! and close it then via h5descr_cdset( /input/physics/Rbc, boundary R cosine Fourier coefficients ) - -#ifdef DEBUG - if( Wmacros ) write(ounit,'("macros : ", 10x ," : myid=",i3," ; writing $4 ;")') myid -#endif - - rank = 2 ; twodims(1:2) = (/ $2, $3 /) - - if( $2.le.0 .or. $3.le.0 ) then - - write(6,'("sphdf5 : "10x" : error calling hwritera ; $4 : $2.le.0 .or. $3.le.0 at $6:$7 ;")') - - else - - call h5screate_simple_f( rank, twodims, space_id, hdfier ) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from hwritera_lo at $6:$7 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5screate_simple_f from hwritera_lo at $6:$7 ;" - endif - - ! temporarily disable error printing to not confuse users - call h5eset_auto_f(0, hdfier) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwritera_lo at $6:$7 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5eset_auto_f from hwritera_lo at $6:$7 ;" - endif - - ! check if dataset can be opened - call h5dopen_f($1, "$4", dset_id, hdfier) - if (hdfier.lt.0) then - var_exists = .false. - if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $4 does not exist yet, creating it" - endif - else - var_exists = .true. - if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $4 exists already, opening it" - endif - endif - - ! re-establish previous state of error printing to be sensitive to "real" errors - call h5eset_auto_f(internalHdf5Msg, hdfier) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwritera_lo at $6:$7 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5eset_auto_f from hwritera_lo at $6:$7 ;" - endif - - ! if the dataset does not exist already, create it. Otherwise, it should be open already - if (.not.var_exists) then - call h5dcreate_f( $1, "$4", H5T_NATIVE_DOUBLE, space_id, dset_id, hdfier ) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5dcreate_f from hwritera_lo at $6:$7 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5dcreate_f from hwritera_lo at $6:$7 ;" - endif - endif - - call h5dwrite_f( dset_id, H5T_NATIVE_DOUBLE, $5, twodims, hdfier ) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5dwrite_f from hwritera_lo at $6:$7 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5dwrite_f from hwritera_lo at $6:$7 ;" - endif - - endif - - ! macro expansion of hwritea_lo; end;})m4_dnl ; can put comments here; -m4_define(HWRITERC,{! macro expansion of hwriterc; -! write real cube _6 (_2 rows, _3 columns, _4 pages) into a dataset named _5 into group _1; _7 and _8 should containt __FILE__ and __LINE__ -! example: hwriterc( grpOutput, (Mrad+1), 2, 2, TT, TT(0:Mrad,0:1,0:1) ) - -#ifdef DEBUG - if( Wmacros ) write(ounit,'("macros : ", 10x ," : myid=",i3," ; writing $5 ;")') myid -#endif - - rank = 3 ; threedims(1:3) = (/ $2, $3, $4 /) - - if( $2.le.0 .or. $3.le.0 .or. $4.le.0 ) then - - write(6,'("sphdf5 : "10x" : error calling hwriterc ; $5 : $2.le.0 .or. $3.le.0 .or. $4.le.0 at $7:$8 ;")') - - else - - call h5screate_simple_f( rank, threedims, space_id, hdfier ) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from hwriterc at $7:$8 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5screate_simple_f from hwriterc at $7:$8 ;" - endif - - ! temporarily disable error printing to not confuse users - call h5eset_auto_f(0, hdfier) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriterc at $7:$8 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5eset_auto_f from hwriterc at $7:$8 ;" - endif - - ! check if dataset can be opened - call h5dopen_f($1, "$5", dset_id, hdfier) - if (hdfier.lt.0) then - var_exists = .false. - if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $5 does not exist yet, creating it" - endif - else - var_exists = .true. - if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $5 exists already, opening it" - endif - endif - - ! re-establish previous state of error printing to be sensitive to "real" errors - call h5eset_auto_f(internalHdf5Msg, hdfier) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriterc at $7:$8 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5eset_auto_f from hwriterc at $7:$8 ;" - endif - - ! if the dataset does not exist already, create it. Otherwise, it should be open already - if (.not.var_exists) then - call h5dcreate_f( $1, "$5", H5T_NATIVE_DOUBLE, space_id, dset_id, hdfier ) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5dcreate_f from hwriterc at $7:$8 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5dcreate_f from hwriterc at $7:$8 ;" - endif - endif - - call h5dwrite_f( dset_id, H5T_NATIVE_DOUBLE, $6, threedims, hdfier ) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5dwrite_f from hwriterc at $7:$8 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5dwrite_f from hwriterc at $7:$8 ;" - endif - - call h5dclose_f(dset_id, hdfier) ! terminate dataset; - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5dclose_f from hwriterc at $7:$8 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5dclose_f from hwriterc at $7:$8 ;" - endif - - endif - - ! macro expansion of hwriterc; end;})m4_dnl ; can put comments here; -m4_define(HWRITERC_LO,{! macro expansion of hwriterc_lo; -! write real cube _6 (_2 rows, _3 columns, _4 pages) into a dataset named _5 into group _1 and leave open for e.g. adding an attribute; _7 and _8 should be __FILE__ and __LINE__ -! example: hwriterc( grpOutput, (Mrad+1), 2, 2, TT, TT(0:Mrad,0:1,0:1) ) -! and close it with h5descr_cdset( /output/TT, something abbreviated by TT ) - -#ifdef DEBUG - if( Wmacros ) write(ounit,'("macros : ", 10x ," : myid=",i3," ; writing $5 ;")') myid -#endif - - rank = 3 ; threedims(1:3) = (/ $2, $3, $4 /) - - if( $2.le.0 .or. $3.le.0 .or. $4.le.0 ) then - - write(6,'("sphdf5 : "10x" : error calling hwriterc ; $5 : $2.le.0 .or. $3.le.0 .or. $4.le.0 at $7:$8 ;")') - - else - - call h5screate_simple_f( rank, threedims, space_id, hdfier ) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from hwriterc_lo at $7:$8 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5screate_simple_f from hwriterc_lo at $7:$8 ;" - endif - - ! temporarily disable error printing to not confuse users - call h5eset_auto_f(0, hdfier) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriterc_lo at $7:$8 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5eset_auto_f from hwriterc_lo at $7:$8 ;" - endif - - ! check if dataset can be opened - call h5dopen_f($1, "$5", dset_id, hdfier) - if (hdfier.lt.0) then - var_exists = .false. - if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $5 does not exist yet, creating it" - endif - else - var_exists = .true. - if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $5 exists already, opening it" - endif - endif - - ! re-establish previous state of error printing to be sensitive to "real" errors - call h5eset_auto_f(internalHdf5Msg, hdfier) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriterc_lo at $7:$8 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5eset_auto_f from hwriterc_lo at $7:$8 ;" - endif - - ! if the dataset does not exist already, create it. Otherwise, it should be open already - if (.not.var_exists) then - call h5dcreate_f( $1, "$5", H5T_NATIVE_DOUBLE, space_id, dset_id, hdfier ) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5dcreate_f from hwriterc_lo at $7:$8 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5dcreate_f from hwriterc_lo at $7:$8 ;" - endif - endif - - call h5dwrite_f( dset_id, H5T_NATIVE_DOUBLE, $6, threedims, hdfier ) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5dwrite_f from hwriterc_lo at $7:$8 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5dwrite_f from hwriterc_lo at $7:$8 ;" - endif - - endif - - ! macro expansion of hwriterc_lo; end;})m4_dnl ; can put comments here; -m4_define(H5CALL,{! macro expansion of h5call; -! wrapper for HDF5 API calls which checks the hdfier error flag after each call -! and interrupts execution of the program right away if anything goes wrong -! call _2 with arguments _3 from within _1 and write wall time needed for call to screen; _4 and _5 should be __FILE__ and __LINE__ - - call $2$3 - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling $2 in process ",i3," from h5call at $4:$5;")') myid - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling $2 from h5call at $4:$5 ;" - endif - - ! macro expansion of h5call; end;})m4_dnl ; can put comments here; -m4_define(BEGIN,{! macro expansion of begin; -! comment the start of a subroutine to screen output - - !cpui = zero +})m4_dnl +m4_define(BEGIN,{ cpui = MPI_WTIME() cpuo = cpui #ifdef OPENMP @@ -1240,69 +78,33 @@ m4_define(BEGIN,{! macro expansion of begin; #else nthreads = 1 #endif - -#ifdef DEBUG - - if( W$1 ) write(ounit,'("$1 : ",f10.2," : myid=",i3," ; start ;")') cpui-cpus, myid - -#endif - - ! macro expansion of begin; end;})m4_dnl ; can put comments here; -m4_define(LREGION,{! macro expansion of lregion; -! given annulus number _1, set Lcoordinatesingularity, Lplasmaregion and Lvacuumregion accordingly - +})m4_dnl +m4_define(LREGION,{ if( Igeometry.eq.1 .or. $1.gt.1 ) then ; Lcoordinatesingularity = .false. else ; Lcoordinatesingularity = .true. endif - + if( $1.le.Nvol ) then ; Lplasmaregion = .true. else ; Lplasmaregion = .false. endif Lvacuumregion = .not.Lplasmaregion - - ! macro expansion of lregion; end;})m4_dnl ; can put comments here; -m4_define(RETURN,{! macro expansion of return; -! comment the end of a subroutine to screen output - +})m4_dnl +m4_define(RETURN,{ 9999 continue - cput = MPI_WTIME() T$1 = T$1 + ( cput-cpuo ) - -#ifdef DEBUG - - if( W$1 ) write(ounit,'("$1 : ",f10.2," : myid=",i3," ; finish ; time=",f10.2," ;")') cput-cpus, myid, cput-cpui - -#endif - return - - ! macro expansion of return; end;})m4_dnl ; can put comments here; -m4_define(SUMTIME,{! macro expansion of sumtime; - -#ifdef DEBUG - if( Wmacros ) write(ounit,'(" : ", 10x ," : calling mpi_reduce : $1 ;")') -#endif - +})m4_dnl +m4_define(SUMTIME,{ call MPI_REDUCE(T$1, $1T, 1, MPI_DOUBLE_PRECISION, MPI_SUM, 0, MPI_COMM_SPEC, ierr ) - -#ifdef DEBUG - if( Wmacros ) write(ounit,'(" : ", 10x ," : called mpi_reduce : $1 ;")') -#endif - - ! macro expansion of sumtime; end;})m4_dnl ; can put comments here; -m4_define(PRTTIME,{! macro expansion of prttime; - +})m4_dnl +m4_define(PRTTIME,{ write(ounit,'("finish : ",f10.2," : time spent in $1 =",f10.2," ;")') cput-cpus, $1T ; Ttotal = Ttotal + $1T - - ! macro expansion of prttime; end;})m4_dnl ; can put comments here; - -m4_define(TMPOUT,{ !Temperarily output a message to help debugging +})m4_dnl +m4_define(TMPOUT,{ if( myid .eq. 0) write(ounit,*) "### DEBUG : $1 = ", $1 })m4_dnl - - -m4_define(MPIOUT,{ !Temperarily output a message to help debugging +m4_define(MPIOUT,{ write(ounit,*) "*** DEBUG : myid = ", myid, " ; $1 = ", $1 })m4_dnl diff --git a/src/manual.f90 b/src/manual.F90 similarity index 94% rename from src/manual.f90 rename to src/manual.F90 index 22cc8271..f8aef8d6 100644 --- a/src/manual.f90 +++ b/src/manual.F90 @@ -13,23 +13,23 @@ !latex \subsection{poloidal flux and rotational transform} -!latex Given the canonical integrable form, -!latex ${\bf A} = \psi \nabla \t - \chi(\psi) \nabla \z$, -!latex we can derive +!latex Given the canonical integrable form, +!latex ${\bf A} = \psi \nabla \t - \chi(\psi) \nabla \z$, +!latex we can derive !latex ${\bf B} = \nabla \psi \times \nabla \t +\nabla \zeta \times \nabla \psi \;\chi^\prime$. -!latex The poloidal flux is given by +!latex The poloidal flux is given by !latex \begin{eqnarray} \Psi_p = \int \!\! \int {\bf B} \cdot {\bf e}_\zeta \times{\bf e}_\psi \; d\zeta d\psi = 2 \pi \int \chi^\prime d\psi. !latex \end{eqnarray} -!latex The rotational-transform is +!latex The rotational-transform is !latex \begin{eqnarray} \iotabar = \frac{ {\bf B} \cdot \nabla \t}{ {\bf B} \cdot \nabla \zeta} = \chi^\prime. !latex \end{eqnarray} !latex The rotational-transform is the same sign as the poloidal flux. -!latex +!latex !latex The SPEC representation for the magnetic vector potential is !latex \begin{eqnarray} {\bf A} = A_\t \nabla \t + A_\z \nabla \z, !latex \end{eqnarray} !latex where we can see that $A_\z = - \chi$. -!latex The poloidal flux is +!latex The poloidal flux is !latex \begin{eqnarray} \int {\bf B}\cdot d{\bf s} = \oint A_\z d\z. !latex \end{eqnarray} !latex It would seem that the rotational-transform has opposite sign to $A_\z$. @@ -37,15 +37,15 @@ !latex \subsection{Outline} -!latex This document is intended to organise the different potentially valuable improvements to the SPEC code, which could make it more robust, faster, and increase its capabilities. +!latex This document is intended to organise the different potentially valuable improvements to the SPEC code, which could make it more robust, faster, and increase its capabilities. !latex The document is divided in two categories. -!latex In \Sec{NumericalImprovements}, Numerical Improvements: independent improvements that are of numerical importance but have no added physics value \emph{per se}, although they may allow new or better physics investigations. +!latex In \Sec{NumericalImprovements}, Numerical Improvements: independent improvements that are of numerical importance but have no added physics value \emph{per se}, although they may allow new or better physics investigations. !latex In \Sec{PhysicsApplications}, research topics that could be addressed with the code, either in its present form or after the completion of one or more topics listed in \Sec{NumericalImprovements}. !latex \subsection{Numerical Improvements} \label{sec:NumericalImprovements} !latex \subsubsection{Downloading \SPEC to \type{Git}} -!latex This should be straight forward and easy. +!latex This should be straight forward and easy. !latex SRH will work on this. Estimated date of completion 06/2017. !latex \subsubsection{Compile code with \type{GCC} for error checking} \label{sec:recompile} @@ -75,18 +75,18 @@ !latex Potential speed improvement is considerable. !latex \subsubsection{Exploit symmetry of ``local'' Beltrami matrices} \label{sec:beltrami} -!latex This is easy. Take a look at \link{matrix}, which constructs the Beltrami matrices, and \link{mp00ac}, which performs the inversion. +!latex This is easy. Take a look at \link{matrix}, which constructs the Beltrami matrices, and \link{mp00ac}, which performs the inversion. !latex Potential speed improvement is considerable. -!latex \subsubsection{Exploit block tri-diagonal structure of ``global'' linearized force balance matrix} +!latex \subsubsection{Exploit block tri-diagonal structure of ``global'' linearized force balance matrix} !latex This requires an efficient subroutine. !latex SRH believes that Hirshman constructed such a routine !latex [\paper{S.P. Hirshman {\em et al.}}{S.P. Hirshman, K.S. Purumalla {\em et al.}}{10.1016/j.jcp.2010.04.049}{J. Comput. Phys.}{229}{6392}{2010}]. !latex The potential speed improvement is tremendous. !latex See \link{newton} for where the tri-diagonal, linearized force-balance matrix is inverted. -!latex \subsubsection{Enforce Helicity constraint} \label{sec:L2} -!latex This will allow investigation of different, arguably more-physical classes of equilibria. +!latex \subsubsection{Enforce Helicity constraint} \label{sec:L2} +!latex This will allow investigation of different, arguably more-physical classes of equilibria. !latex See \link{ma02aa} !latex \subsubsection{Establish test-cases} \label{sec:testcase} @@ -106,7 +106,7 @@ !latex \subsubsection{Interpret eigenvectors and eigenvalues of Hessian} \label{sec:stability} !latex This is already completed: see \link{hesian}. !latex For toroidal geometry there is a complication; namely that the hessian matrix includes the derivatives of the spectral constraints. -!latex For Cartesian geometry, it is ready to go. +!latex For Cartesian geometry, it is ready to go. !latex SRH will begin writing a paper on the stability of slab MRxMHD equilibria. !latex \subsection{Physics Applications} \label{sec:PhysicsApplications} @@ -119,7 +119,7 @@ !latex requires: \Sec{freeb} !latex \subsubsection{Evaluate stability of MRxMHD equilibria} perhaps starting from simplest system (slab tearing). !latex requires: \Sec{stability} - + !latex \subsection{Revision of coordinate singularity: axisymmetric; polar coordinates;} !latex \begin{enumerate} @@ -147,7 +147,7 @@ !latex \be A_x & = & \sum_m r^m [ a_{m,0} + a_{m,1} \; r^2 + a_{m,2} \; r^4 + \dots ] \sin(m\t), \\ !latex A_y & = & \sum_m r^m [ b_{m,0} + b_{m,1} \; r^2 + b_{m,2} \; r^4 + \dots ] \cos(m\t), \\ !latex A_z & = & \sum_m r^m [ c_{m,0} + c_{m,1} \; r^2 + c_{m,2} \; r^4 + \dots ] \cos(m\t), \label{eq:regularAz} \\ -!latex g & = & \sum_m r^m [ g_{m,0} + g_{m,1} \; r^2 + g_{m,2} \; r^4 + \dots ] \sin(m\t), +!latex g & = & \sum_m r^m [ g_{m,0} + g_{m,1} \; r^2 + g_{m,2} \; r^4 + \dots ] \sin(m\t), !latex \ee !latex where attention is restricted to stellarator symmetric geometry, but similar expressions hold for the non-stellarator symmetric terms. !latex \item Collecting these expressions, the vector potential can be expressed @@ -193,7 +193,7 @@ !latex \ee !latex where the $f_{m,n}(\rho)$ and $g_{m,n}(\rho)$ are arbitrary polynomials in $\rho$. !latex \item Additional gauge freedom can be exploited: including an additional gauge term $\nabla h$ where $h$ only depends on $\z$, e.g. -!latex \be h(\z) = h_{0,0} \, \z + \sum h_{0,n} \sin( - n\z),\ee +!latex \be h(\z) = h_{0,0} \, \z + \sum h_{0,n} \sin( - n\z),\ee !latex does not change the magnetic field and does not change any of the above discussion. !latex \item The representation for the $A_{\t,m,n}$ does not change, but we must clarify that \Eqn{Azmn} holds for only the $m\ne0$ harmonics: !latex \be A_{\z,m,n} & = & r^{m} \;\;\;\;g_{m,n}(\rho), \;\;\;\mbox{\rm for $m \ne 0$}. @@ -209,7 +209,7 @@ !latex \item To simplify the algorithmic implementation of these conditions, !latex we shall introduce a `regularization' factor, $\rho^{m/2} = r^m$. !latex \item Note that the representation for $A_{\t,m,n}$ given in \Eqn{Atmn}, -!latex with an arbitrary polynomial $f_{m,n}(\rho) = f_{m,n,0} + f_{m,n,1}\rho + f_{m,n,2}\rho^2 + \dots$, +!latex with an arbitrary polynomial $f_{m,n}(\rho) = f_{m,n,0} + f_{m,n,1}\rho + f_{m,n,2}\rho^2 + \dots$, !latex is equivalent to $A_{\t,m,n} = \rho^{m/2} \alpha_{m,n}(\rho)$ where $\alpha_{m,n}(\rho)$ is an arbitrary polynomial !latex with the constraint $\alpha_{m,n}(0)=0$. !latex \item We can write the vector potential as @@ -247,12 +247,12 @@ !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! subroutine manual - + use mod_kinds, only: wp => dp !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - + use constants, only : zero - use numerical, only : + use numerical, only : use fileunits, only : ounit @@ -261,20 +261,41 @@ subroutine manual use cputiming, only : Tmanual use allglobal, only : myid, cpus - + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - - LOCALS - BEGIN(manual) + +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! ! this "routine" is purely for documentation; 08 Feb 16; - + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - RETURN(manual) + +9999 continue + cput = MPI_WTIME() + Tmanual = Tmanual + ( cput-cpuo ) + return + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! diff --git a/src/matrix.f90 b/src/matrix.F90 similarity index 95% rename from src/matrix.f90 rename to src/matrix.F90 index dfc25641..087b9f3f 100644 --- a/src/matrix.f90 +++ b/src/matrix.F90 @@ -344,7 +344,7 @@ !> @param[in] mn !> @param[in] lrad subroutine matrix( lvol, mn, lrad ) - + use mod_kinds, only: wp => dp !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! use constants, only : zero, one, two @@ -377,37 +377,77 @@ subroutine matrix( lvol, mn, lrad ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS + +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - INTEGER, intent(in) :: lvol, mn, lrad + integer, intent(in) :: lvol, mn, lrad !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - INTEGER :: NN, ii, jj, ll, kk, pp, ll1, pp1, mi, ni, mj, nj, mimj, minj, nimj, ninj, mjmi, mjni, njmi, njni, id, jd + integer :: NN, ii, jj, ll, kk, pp, ll1, pp1, mi, ni, mj, nj, mimj, minj, nimj, ninj, mjmi, mjni, njmi, njni, id, jd - REAL :: Wtete, Wteto, Wtote, Wtoto - REAL :: Wteze, Wtezo, Wtoze, Wtozo - REAL :: Wzete, Wzeto, Wzote, Wzoto - REAL :: Wzeze, Wzezo, Wzoze, Wzozo + real(wp) :: Wtete, Wteto, Wtote, Wtoto + real(wp) :: Wteze, Wtezo, Wtoze, Wtozo + real(wp) :: Wzete, Wzeto, Wzote, Wzoto + real(wp) :: Wzeze, Wzezo, Wzoze, Wzozo - REAL :: Htete, Hteto, Htote, Htoto - REAL :: Hteze, Htezo, Htoze, Htozo - REAL :: Hzete, Hzeto, Hzote, Hzoto - REAL :: Hzeze, Hzezo, Hzoze, Hzozo + real(wp) :: Htete, Hteto, Htote, Htoto + real(wp) :: Hteze, Htezo, Htoze, Htozo + real(wp) :: Hzete, Hzeto, Hzote, Hzoto + real(wp) :: Hzeze, Hzezo, Hzoze, Hzozo - REAL,allocatable :: TTdata(:,:,:), TTMdata(:,:) ! queues to construct sparse matrices + real(wp),allocatable :: TTdata(:,:,:), TTMdata(:,:) ! queues to construct sparse matrices + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif - BEGIN(matrix) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! #ifdef DEBUG - FATAL( matrix, .not.allocated(dMA), error ) - FATAL( matrix, .not.allocated(dMD), error ) - FATAL( matrix, .not.allocated(dMB), error ) - FATAL( matrix, .not.allocated(dMG), error ) + + if( .not.allocated(dMA) ) then + write(6,'("matrix : fatal : myid=",i3," ; .not.allocated(dMA) ; error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "matrix : .not.allocated(dMA) : error ;" + endif + + + if( .not.allocated(dMD) ) then + write(6,'("matrix : fatal : myid=",i3," ; .not.allocated(dMD) ; error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "matrix : .not.allocated(dMD) : error ;" + endif + + + if( .not.allocated(dMB) ) then + write(6,'("matrix : fatal : myid=",i3," ; .not.allocated(dMB) ; error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "matrix : .not.allocated(dMB) : error ;" + endif + + + if( .not.allocated(dMG) ) then + write(6,'("matrix : fatal : myid=",i3," ; .not.allocated(dMG) ; error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "matrix : .not.allocated(dMG) : error ;" + endif + #endif !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -417,8 +457,14 @@ subroutine matrix( lvol, mn, lrad ) dMA(0:NN,0:NN) = zero dMD(0:NN,0:NN) = zero - SALLOCATE( TTdata, (0:lrad, 0:mpol, 0:1), zero) - SALLOCATE( TTMdata, (0:lrad, 0:mpol), zero) + + allocate( TTdata(0:lrad, 0:mpol, 0:1), stat=astat ) + TTdata(0:lrad, 0:mpol, 0:1) = zero + + + allocate( TTMdata(0:lrad, 0:mpol), stat=astat ) + TTMdata(0:lrad, 0:mpol) = zero + ! fill in Zernike/Chebyshev polynomials depending on Lcooridnatesingularity if (Lcoordinatesingularity) then @@ -628,10 +674,19 @@ subroutine matrix( lvol, mn, lrad ) endif ! end of if( YESstellsym ) ; ! call subroutine matrixBG to construct dMB and dMG - WCALL( matrix, matrixBG, ( lvol, mn, lrad ) ) - DALLOCATE( TTdata ) - DALLOCATE( TTMdata ) + cput = MPI_WTIME() + Tmatrix = Tmatrix + ( cput-cpuo ) + call matrixBG( lvol, mn, lrad ) + cpuo = MPI_WTIME() + + + + deallocate(TTdata ,stat=astat) + + + deallocate(TTMdata ,stat=astat) + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -663,7 +718,12 @@ subroutine matrix( lvol, mn, lrad ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - RETURN(matrix) + +9999 continue + cput = MPI_WTIME() + Tmatrix = Tmatrix + ( cput-cpuo ) + return + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -672,6 +732,7 @@ end subroutine matrix !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! subroutine matrixBG( lvol, mn, lrad ) + use mod_kinds, only: wp => dp ! only compute the dMB and dMG matrix for matrix-free mode use constants, only : zero, one use allglobal, only : NAdof, im, in,& @@ -679,9 +740,9 @@ subroutine matrixBG( lvol, mn, lrad ) iVnc, iVns, iBnc, iBns, & Lme, Lmf, Lmg, Lmh implicit none - INTEGER, intent(in) :: lvol, mn, lrad + integer, intent(in) :: lvol, mn, lrad - INTEGER :: NN, ii, id, mi, ni + integer :: NN, ii, id, mi, ni NN = NAdof(lvol) ! shorthand; diff --git a/src/memory.F90 b/src/memory.F90 new file mode 100644 index 00000000..2f5425a1 --- /dev/null +++ b/src/memory.F90 @@ -0,0 +1,637 @@ +!> \file +!> \brief memory management module + +!> \brief allocate Beltrami matrices +!> +!> @param vvol +!> @param LcomputeDerivatives +subroutine allocate_Beltrami_matrices(vvol, LcomputeDerivatives) + use mod_kinds, only: wp => dp + use fileunits + + use inputlist, only: Wmemory, Wmacros + + use allglobal + + use cputiming + + +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + integer, intent(in) :: vvol + LOGICAL, intent(in) :: LcomputeDerivatives + integer :: NN + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif + + + NN = NAdof(vvol) ! shorthand; + + if (NOTMatrixFree .or. LcomputeDerivatives) then + + allocate( dMA(0:NN,0:NN), stat=astat ) + dMA(0:NN,0:NN) = zero + ! required for both plasma region and vacuum region; + + allocate( dMD(0:NN,0:NN), stat=astat ) + dMD(0:NN,0:NN) = zero + + else + + allocate( Adotx(0:NN), stat=astat ) + Adotx(0:NN) = zero + + + allocate( Ddotx(0:NN), stat=astat ) + Ddotx(0:NN) = zero + + endif + + ! we will need the rest even with or without matrix-free + + allocate( dMB(0:NN,0: 2), stat=astat ) + dMB(0:NN,0: 2) = zero + + + allocate( dMG(0:NN ), stat=astat ) + dMG(0:NN ) = zero + + + + allocate( solution(1:NN,-1:2), stat=astat ) + solution(1:NN,-1:2) = zero + ! this will contain the vector potential from the linear solver and its derivatives; + + + allocate( MBpsi(1:NN), stat=astat ) + MBpsi(1:NN) = zero + + + if (LILUprecond) then + + allocate( dMAS(1:NdMASmax(vvol)), stat=astat ) + dMAS(1:NdMASmax(vvol)) = zero + + + allocate( dMDS(1:NdMASmax(vvol)), stat=astat ) + dMDS(1:NdMASmax(vvol)) = zero + + + allocate( idMAS(1:NN+1), stat=astat ) + idMAS(1:NN+1) = 0 + + + allocate( jdMAS(1:NdMASmax(vvol)), stat=astat ) + jdMAS(1:NdMASmax(vvol)) = 0 + + endif ! if we use GMRES and ILU preconditioner + + +9999 continue + cput = MPI_WTIME() + Tmemory = Tmemory + ( cput-cpuo ) + return + + +end subroutine allocate_Beltrami_matrices + +!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! + +!> \brief deallocate Beltrami matrices +!> +!> @param LcomputeDerivatives +subroutine deallocate_Beltrami_matrices(LcomputeDerivatives) + use mod_kinds, only: wp => dp + use fileunits + + use inputlist, only: Wmemory, Wmacros + + use allglobal + + use cputiming + + +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + LOGICAL, intent(in) :: LcomputeDerivatives + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif + + + if (NOTMatrixFree .or. LcomputeDerivatives) then + + deallocate(dMA,stat=astat) + + + deallocate(dMD,stat=astat) + + else + + deallocate(Adotx,stat=astat) + + + deallocate(Ddotx,stat=astat) + + endif + + + deallocate(dMB,stat=astat) + + + + deallocate(dMG,stat=astat) + + + + deallocate(solution,stat=astat) + + + + deallocate(MBpsi,stat=astat) + + + if (LILUprecond) then + + deallocate(dMAS,stat=astat) + + + deallocate(dMDS,stat=astat) + + + deallocate(idMAS,stat=astat) + + + deallocate(jdMAS,stat=astat) + + endif ! if we use GMRES and ILU preconditioner + + +9999 continue + cput = MPI_WTIME() + Tmemory = Tmemory + ( cput-cpuo ) + return + + +end subroutine deallocate_Beltrami_matrices + +!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! + +!> \brief allocate geometry matrices +!> +!> @param vvol +!> @param LcomputeDerivatives +subroutine allocate_geometry_matrices(vvol, LcomputeDerivatives) + use mod_kinds, only: wp => dp +! Allocate all geometry dependent matrices for a given ll + + use constants, only: zero + + use fileunits + + use inputlist, only: Wmemory, Wmacros, Mpol, Lrad + + use allglobal + + use cputiming + +!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! + + +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + integer :: vvol + + LOGICAL, intent(in) :: LcomputeDerivatives + + integer :: ll, lldof, jjdof, iidof + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif + + + ll = Lrad(vvol) + + if (Lcoordinatesingularity) then ! different radial dof for Zernike; 02 Jul 19 + lldof = (Lrad(vvol) - mod(Lrad(vvol),2)) / 2 + if (YESMatrixFree .and. .not. LcomputeDerivatives) then + ! we only need a reduced number of terms to be computed for the preconditioner + iidof = Mpol + 1 + jjdof = 1 + else + ! we need full-size matrices + iidof = mn + jjdof = mn + endif + else + lldof = Lrad(vvol) + if (YESMatrixFree .and. .not. LcomputeDerivatives) then + iidof = 1 + jjdof = 1 + else + iidof = mn + jjdof = mn + endif + end if + + + allocate( guvijsave(1:Ntz,1:3,1:3,1:Iquad(vvol)), stat=astat ) + guvijsave(1:Ntz,1:3,1:3,1:Iquad(vvol)) = zero + + + + allocate( DToocc(0:lldof,0:lldof,1:iidof,1:jjdof), stat=astat ) + DToocc(0:lldof,0:lldof,1:iidof,1:jjdof) = zero + + + allocate( TTssss(0:lldof,0:lldof,1:iidof,1:jjdof), stat=astat ) + TTssss(0:lldof,0:lldof,1:iidof,1:jjdof) = zero + + + allocate( TDstsc(0:lldof,0:lldof,1:iidof,1:jjdof), stat=astat ) + TDstsc(0:lldof,0:lldof,1:iidof,1:jjdof) = zero + + + allocate( TDszsc(0:lldof,0:lldof,1:iidof,1:jjdof), stat=astat ) + TDszsc(0:lldof,0:lldof,1:iidof,1:jjdof) = zero + + + allocate( DDttcc(0:lldof,0:lldof,1:iidof,1:jjdof), stat=astat ) + DDttcc(0:lldof,0:lldof,1:iidof,1:jjdof) = zero + + + allocate( DDtzcc(0:lldof,0:lldof,1:iidof,1:jjdof), stat=astat ) + DDtzcc(0:lldof,0:lldof,1:iidof,1:jjdof) = zero + + + allocate( DDzzcc(0:lldof,0:lldof,1:iidof,1:jjdof), stat=astat ) + DDzzcc(0:lldof,0:lldof,1:iidof,1:jjdof) = zero + + + + allocate( Tss(0:lldof,1:mn), stat=astat ) + Tss(0:lldof,1:mn) = zero + + + allocate( Dtc(0:lldof,1:mn), stat=astat ) + Dtc(0:lldof,1:mn) = zero + + + allocate( Dzc(0:lldof,1:mn), stat=astat ) + Dzc(0:lldof,1:mn) = zero + + + allocate( Ttc(0:lldof,1:mn), stat=astat ) + Ttc(0:lldof,1:mn) = zero + + + allocate( Tzc(0:lldof,1:mn), stat=astat ) + Tzc(0:lldof,1:mn) = zero + + + if (NOTstellsym) then + + + allocate( DToocs(0:lldof,0:lldof,1:iidof,1:jjdof), stat=astat ) + DToocs(0:lldof,0:lldof,1:iidof,1:jjdof) = zero + + + allocate( DToosc(0:lldof,0:lldof,1:iidof,1:jjdof), stat=astat ) + DToosc(0:lldof,0:lldof,1:iidof,1:jjdof) = zero + + + allocate( DTooss(0:lldof,0:lldof,1:iidof,1:jjdof), stat=astat ) + DTooss(0:lldof,0:lldof,1:iidof,1:jjdof) = zero + + + + allocate( TTsscc(0:lldof,0:lldof,1:iidof,1:jjdof), stat=astat ) + TTsscc(0:lldof,0:lldof,1:iidof,1:jjdof) = zero + + + allocate( TTsscs(0:lldof,0:lldof,1:iidof,1:jjdof), stat=astat ) + TTsscs(0:lldof,0:lldof,1:iidof,1:jjdof) = zero + + + allocate( TTsssc(0:lldof,0:lldof,1:iidof,1:jjdof), stat=astat ) + TTsssc(0:lldof,0:lldof,1:iidof,1:jjdof) = zero + + + + allocate( TDstcc(0:lldof,0:lldof,1:iidof,1:jjdof), stat=astat ) + TDstcc(0:lldof,0:lldof,1:iidof,1:jjdof) = zero + + + allocate( TDstcs(0:lldof,0:lldof,1:iidof,1:jjdof), stat=astat ) + TDstcs(0:lldof,0:lldof,1:iidof,1:jjdof) = zero + + + allocate( TDstss(0:lldof,0:lldof,1:iidof,1:jjdof), stat=astat ) + TDstss(0:lldof,0:lldof,1:iidof,1:jjdof) = zero + + + + allocate( TDszcc(0:lldof,0:lldof,1:iidof,1:jjdof), stat=astat ) + TDszcc(0:lldof,0:lldof,1:iidof,1:jjdof) = zero + + + allocate( TDszcs(0:lldof,0:lldof,1:iidof,1:jjdof), stat=astat ) + TDszcs(0:lldof,0:lldof,1:iidof,1:jjdof) = zero + + + allocate( TDszss(0:lldof,0:lldof,1:iidof,1:jjdof), stat=astat ) + TDszss(0:lldof,0:lldof,1:iidof,1:jjdof) = zero + + + + allocate( DDttcs(0:lldof,0:lldof,1:iidof,1:jjdof), stat=astat ) + DDttcs(0:lldof,0:lldof,1:iidof,1:jjdof) = zero + + + allocate( DDttsc(0:lldof,0:lldof,1:iidof,1:jjdof), stat=astat ) + DDttsc(0:lldof,0:lldof,1:iidof,1:jjdof) = zero + + + allocate( DDttss(0:lldof,0:lldof,1:iidof,1:jjdof), stat=astat ) + DDttss(0:lldof,0:lldof,1:iidof,1:jjdof) = zero + + + + allocate( DDtzcs(0:lldof,0:lldof,1:iidof,1:jjdof), stat=astat ) + DDtzcs(0:lldof,0:lldof,1:iidof,1:jjdof) = zero + + + allocate( DDtzsc(0:lldof,0:lldof,1:iidof,1:jjdof), stat=astat ) + DDtzsc(0:lldof,0:lldof,1:iidof,1:jjdof) = zero + + + allocate( DDtzss(0:lldof,0:lldof,1:iidof,1:jjdof), stat=astat ) + DDtzss(0:lldof,0:lldof,1:iidof,1:jjdof) = zero + + + + allocate( DDzzcs(0:lldof,0:lldof,1:iidof,1:jjdof), stat=astat ) + DDzzcs(0:lldof,0:lldof,1:iidof,1:jjdof) = zero + + + allocate( DDzzsc(0:lldof,0:lldof,1:iidof,1:jjdof), stat=astat ) + DDzzsc(0:lldof,0:lldof,1:iidof,1:jjdof) = zero + + + allocate( DDzzss(0:lldof,0:lldof,1:iidof,1:jjdof), stat=astat ) + DDzzss(0:lldof,0:lldof,1:iidof,1:jjdof) = zero + + + + allocate( Tsc(0:lldof,1:mn), stat=astat ) + Tsc(0:lldof,1:mn) = zero + + + allocate( Dts(0:lldof,1:mn), stat=astat ) + Dts(0:lldof,1:mn) = zero + + + allocate( Dzs(0:lldof,1:mn), stat=astat ) + Dzs(0:lldof,1:mn) = zero + + + allocate( Tts(0:lldof,1:mn), stat=astat ) + Tts(0:lldof,1:mn) = zero + + + allocate( Tzs(0:lldof,1:mn), stat=astat ) + Tzs(0:lldof,1:mn) = zero + + + end if !NOTstellsym + + +9999 continue + cput = MPI_WTIME() + Tmemory = Tmemory + ( cput-cpuo ) + return + + +end subroutine allocate_geometry_matrices + +!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! + +!> \brief deallocate geometry matrices +!> +!> @param LcomputeDerivatives +subroutine deallocate_geometry_matrices(LcomputeDerivatives) + use mod_kinds, only: wp => dp +! Deallocate all geometry dependent matrices + use constants, only: zero + + use fileunits + + use inputlist, only: Wmemory, Wmacros + + use allglobal + + use cputiming + + +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + LOGICAL, intent(in) :: LcomputeDerivatives + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif + + + Lsavedguvij = .false. + + deallocate(guvijsave,stat=astat) + + + + deallocate(DToocc,stat=astat) + + + deallocate(TTssss,stat=astat) + + + deallocate(TDstsc,stat=astat) + + + deallocate(TDszsc,stat=astat) + + + deallocate(DDttcc,stat=astat) + + + deallocate(DDtzcc,stat=astat) + + + deallocate(DDzzcc,stat=astat) + + + + deallocate(Tss,stat=astat) + + + deallocate(Dtc,stat=astat) + + + deallocate(Dzc,stat=astat) + + + deallocate(Ttc,stat=astat) + + + deallocate(Tzc,stat=astat) + + + if (NOTstellsym) then + + + deallocate(DToocs,stat=astat) + + + deallocate(DToosc,stat=astat) + + + deallocate(DTooss,stat=astat) + + + + deallocate(TTsscc,stat=astat) + + + deallocate(TTsscs,stat=astat) + + + deallocate(TTsssc,stat=astat) + + + + deallocate(TDstcc,stat=astat) + + + deallocate(TDstcs,stat=astat) + + + deallocate(TDstss,stat=astat) + + + + deallocate(TDszcc,stat=astat) + + + deallocate(TDszcs,stat=astat) + + + deallocate(TDszss,stat=astat) + + + + deallocate(DDttcs,stat=astat) + + + deallocate(DDttsc,stat=astat) + + + deallocate(DDttss,stat=astat) + + + + deallocate(DDtzcs,stat=astat) + + + deallocate(DDtzsc,stat=astat) + + + deallocate(DDtzss,stat=astat) + + + + deallocate(DDzzcs,stat=astat) + + + deallocate(DDzzsc,stat=astat) + + + deallocate(DDzzss,stat=astat) + + + + deallocate(Tsc,stat=astat) + + + deallocate(Dts,stat=astat) + + + deallocate(Dzs,stat=astat) + + + deallocate(Tts,stat=astat) + + + deallocate(Tzs,stat=astat) + + + endif + + +9999 continue + cput = MPI_WTIME() + Tmemory = Tmemory + ( cput-cpuo ) + return + + +end subroutine deallocate_geometry_matrices diff --git a/src/memory.f90 b/src/memory.f90 deleted file mode 100644 index 744cd16d..00000000 --- a/src/memory.f90 +++ /dev/null @@ -1,298 +0,0 @@ -!> \file -!> \brief memory management module - -!> \brief allocate Beltrami matrices -!> -!> @param vvol -!> @param LcomputeDerivatives -subroutine allocate_Beltrami_matrices(vvol, LcomputeDerivatives) - - use fileunits - - use inputlist, only: Wmemory, Wmacros - - use allglobal - - use cputiming - - LOCALS - - INTEGER, intent(in) :: vvol - LOGICAL, intent(in) :: LcomputeDerivatives - INTEGER :: NN - - BEGIN(memory) - - NN = NAdof(vvol) ! shorthand; - - if (NOTMatrixFree .or. LcomputeDerivatives) then - SALLOCATE( dMA, (0:NN,0:NN), zero ) ! required for both plasma region and vacuum region; - SALLOCATE( dMD, (0:NN,0:NN), zero ) - else - SALLOCATE( Adotx, (0:NN), zero) - SALLOCATE( Ddotx, (0:NN), zero) - endif - - ! we will need the rest even with or without matrix-free - SALLOCATE( dMB, (0:NN,0: 2), zero ) - SALLOCATE( dMG, (0:NN ), zero ) - - SALLOCATE( solution, (1:NN,-1:2), zero ) ! this will contain the vector potential from the linear solver and its derivatives; - - SALLOCATE( MBpsi, (1:NN), zero ) - - if (LILUprecond) then - SALLOCATE( dMAS, (1:NdMASmax(vvol)), zero) - SALLOCATE( dMDS, (1:NdMASmax(vvol)), zero) - SALLOCATE( idMAS, (1:NN+1), 0) - SALLOCATE( jdMAS, (1:NdMASmax(vvol)), 0) - endif ! if we use GMRES and ILU preconditioner - - RETURN(memory) - -end subroutine allocate_Beltrami_matrices - -!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - -!> \brief deallocate Beltrami matrices -!> -!> @param LcomputeDerivatives -subroutine deallocate_Beltrami_matrices(LcomputeDerivatives) - - use fileunits - - use inputlist, only: Wmemory, Wmacros - - use allglobal - - use cputiming - - LOCALS - - LOGICAL, intent(in) :: LcomputeDerivatives - - BEGIN(memory) - - if (NOTMatrixFree .or. LcomputeDerivatives) then - DALLOCATE(dMA) - DALLOCATE(dMD) - else - DALLOCATE(Adotx) - DALLOCATE(Ddotx) - endif - - DALLOCATE(dMB) - - DALLOCATE(dMG) - - DALLOCATE(solution) - - DALLOCATE(MBpsi) - - if (LILUprecond) then - DALLOCATE(dMAS) - DALLOCATE(dMDS) - DALLOCATE(idMAS) - DALLOCATE(jdMAS) - endif ! if we use GMRES and ILU preconditioner - - RETURN(memory) - -end subroutine deallocate_Beltrami_matrices - -!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - -!> \brief allocate geometry matrices -!> -!> @param vvol -!> @param LcomputeDerivatives -subroutine allocate_geometry_matrices(vvol, LcomputeDerivatives) - -! Allocate all geometry dependent matrices for a given ll - - use constants, only: zero - - use fileunits - - use inputlist, only: Wmemory, Wmacros, Mpol, Lrad - - use allglobal - - use cputiming - -!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - - LOCALS - - INTEGER :: vvol - - LOGICAL, intent(in) :: LcomputeDerivatives - - INTEGER :: ll, lldof, jjdof, iidof - - BEGIN(memory) - - ll = Lrad(vvol) - - if (Lcoordinatesingularity) then ! different radial dof for Zernike; 02 Jul 19 - lldof = (Lrad(vvol) - mod(Lrad(vvol),2)) / 2 - if (YESMatrixFree .and. .not. LcomputeDerivatives) then - ! we only need a reduced number of terms to be computed for the preconditioner - iidof = Mpol + 1 - jjdof = 1 - else - ! we need full-size matrices - iidof = mn - jjdof = mn - endif - else - lldof = Lrad(vvol) - if (YESMatrixFree .and. .not. LcomputeDerivatives) then - iidof = 1 - jjdof = 1 - else - iidof = mn - jjdof = mn - endif - end if - - SALLOCATE( guvijsave, (1:Ntz,1:3,1:3,1:Iquad(vvol)), zero) - - SALLOCATE( DToocc, (0:lldof,0:lldof,1:iidof,1:jjdof), zero ) - SALLOCATE( TTssss, (0:lldof,0:lldof,1:iidof,1:jjdof), zero ) - SALLOCATE( TDstsc, (0:lldof,0:lldof,1:iidof,1:jjdof), zero ) - SALLOCATE( TDszsc, (0:lldof,0:lldof,1:iidof,1:jjdof), zero ) - SALLOCATE( DDttcc, (0:lldof,0:lldof,1:iidof,1:jjdof), zero ) - SALLOCATE( DDtzcc, (0:lldof,0:lldof,1:iidof,1:jjdof), zero ) - SALLOCATE( DDzzcc, (0:lldof,0:lldof,1:iidof,1:jjdof), zero ) - - SALLOCATE( Tss, (0:lldof,1:mn), zero ) - SALLOCATE( Dtc, (0:lldof,1:mn), zero ) - SALLOCATE( Dzc, (0:lldof,1:mn), zero ) - SALLOCATE( Ttc, (0:lldof,1:mn), zero ) - SALLOCATE( Tzc, (0:lldof,1:mn), zero ) - - if (NOTstellsym) then - - SALLOCATE( DToocs, (0:lldof,0:lldof,1:iidof,1:jjdof), zero ) - SALLOCATE( DToosc, (0:lldof,0:lldof,1:iidof,1:jjdof), zero ) - SALLOCATE( DTooss, (0:lldof,0:lldof,1:iidof,1:jjdof), zero ) - - SALLOCATE( TTsscc, (0:lldof,0:lldof,1:iidof,1:jjdof), zero ) - SALLOCATE( TTsscs, (0:lldof,0:lldof,1:iidof,1:jjdof), zero ) - SALLOCATE( TTsssc, (0:lldof,0:lldof,1:iidof,1:jjdof), zero ) - - SALLOCATE( TDstcc, (0:lldof,0:lldof,1:iidof,1:jjdof), zero ) - SALLOCATE( TDstcs, (0:lldof,0:lldof,1:iidof,1:jjdof), zero ) - SALLOCATE( TDstss, (0:lldof,0:lldof,1:iidof,1:jjdof), zero ) - - SALLOCATE( TDszcc, (0:lldof,0:lldof,1:iidof,1:jjdof), zero ) - SALLOCATE( TDszcs, (0:lldof,0:lldof,1:iidof,1:jjdof), zero ) - SALLOCATE( TDszss, (0:lldof,0:lldof,1:iidof,1:jjdof), zero ) - - SALLOCATE( DDttcs, (0:lldof,0:lldof,1:iidof,1:jjdof), zero ) - SALLOCATE( DDttsc, (0:lldof,0:lldof,1:iidof,1:jjdof), zero ) - SALLOCATE( DDttss, (0:lldof,0:lldof,1:iidof,1:jjdof), zero ) - - SALLOCATE( DDtzcs, (0:lldof,0:lldof,1:iidof,1:jjdof), zero ) - SALLOCATE( DDtzsc, (0:lldof,0:lldof,1:iidof,1:jjdof), zero ) - SALLOCATE( DDtzss, (0:lldof,0:lldof,1:iidof,1:jjdof), zero ) - - SALLOCATE( DDzzcs, (0:lldof,0:lldof,1:iidof,1:jjdof), zero ) - SALLOCATE( DDzzsc, (0:lldof,0:lldof,1:iidof,1:jjdof), zero ) - SALLOCATE( DDzzss, (0:lldof,0:lldof,1:iidof,1:jjdof), zero ) - - SALLOCATE( Tsc, (0:lldof,1:mn), zero ) - SALLOCATE( Dts, (0:lldof,1:mn), zero ) - SALLOCATE( Dzs, (0:lldof,1:mn), zero ) - SALLOCATE( Tts, (0:lldof,1:mn), zero ) - SALLOCATE( Tzs, (0:lldof,1:mn), zero ) - - end if !NOTstellsym - - RETURN(memory) - -end subroutine allocate_geometry_matrices - -!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - -!> \brief deallocate geometry matrices -!> -!> @param LcomputeDerivatives -subroutine deallocate_geometry_matrices(LcomputeDerivatives) - -! Deallocate all geometry dependent matrices - use constants, only: zero - - use fileunits - - use inputlist, only: Wmemory, Wmacros - - use allglobal - - use cputiming - - LOCALS - - LOGICAL, intent(in) :: LcomputeDerivatives - - BEGIN(memory) - - Lsavedguvij = .false. - DALLOCATE(guvijsave) - - DALLOCATE(DToocc) - DALLOCATE(TTssss) - DALLOCATE(TDstsc) - DALLOCATE(TDszsc) - DALLOCATE(DDttcc) - DALLOCATE(DDtzcc) - DALLOCATE(DDzzcc) - - DALLOCATE(Tss) - DALLOCATE(Dtc) - DALLOCATE(Dzc) - DALLOCATE(Ttc) - DALLOCATE(Tzc) - - if (NOTstellsym) then - - DALLOCATE(DToocs) - DALLOCATE(DToosc) - DALLOCATE(DTooss) - - DALLOCATE(TTsscc) - DALLOCATE(TTsscs) - DALLOCATE(TTsssc) - - DALLOCATE(TDstcc) - DALLOCATE(TDstcs) - DALLOCATE(TDstss) - - DALLOCATE(TDszcc) - DALLOCATE(TDszcs) - DALLOCATE(TDszss) - - DALLOCATE(DDttcs) - DALLOCATE(DDttsc) - DALLOCATE(DDttss) - - DALLOCATE(DDtzcs) - DALLOCATE(DDtzsc) - DALLOCATE(DDtzss) - - DALLOCATE(DDzzcs) - DALLOCATE(DDzzsc) - DALLOCATE(DDzzss) - - DALLOCATE(Tsc) - DALLOCATE(Dts) - DALLOCATE(Dzs) - DALLOCATE(Tts) - DALLOCATE(Tzs) - - endif - - RETURN(memory) - -end subroutine deallocate_geometry_matrices diff --git a/src/metrix.f90 b/src/metrix.F90 similarity index 90% rename from src/metrix.f90 rename to src/metrix.F90 index 3f579541..57332f23 100644 --- a/src/metrix.f90 +++ b/src/metrix.F90 @@ -36,7 +36,7 @@ !> (The "extended" Fourier resolution is used.) !> subroutine metrix( lquad, lvol ) - + use mod_kinds, only: wp => dp !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! use constants, only : zero, one @@ -67,13 +67,29 @@ subroutine metrix( lquad, lvol ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS - INTEGER, intent(in) :: lvol, lquad +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + integer, intent(in) :: lvol, lquad + + integer :: Lcurvature, ifail, ideriv, jquad - INTEGER :: Lcurvature, ifail, ideriv, jquad - BEGIN( metrix ) + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -114,7 +130,12 @@ subroutine metrix( lquad, lvol ) enddo !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - RETURN( metrix ) + +9999 continue + cput = MPI_WTIME() + Tmetrix = Tmetrix + ( cput-cpuo ) + return + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -129,15 +150,15 @@ end subroutine metrix !> @param ideriv !> @param Lcurvature subroutine compute_guvijsave(lquad, vvol, ideriv, Lcurvature) - + use mod_kinds, only: wp => dp use allglobal, only : gaussianabscissae, Ntz, mn, guvij, guvijsave, & sg implicit none - INTEGER, intent(in):: vvol, lquad, ideriv, Lcurvature - INTEGER :: jquad, ii, jj - REAL :: lss + integer, intent(in):: vvol, lquad, ideriv, Lcurvature + integer :: jquad, ii, jj + real(wp) :: lss ! we need to compute guvij and save it in guvijsave do jquad = 1, lquad diff --git a/src/contrib/minpack.f b/src/minpack.f similarity index 100% rename from src/contrib/minpack.f rename to src/minpack.f diff --git a/src/mod_kinds.F90 b/src/mod_kinds.F90 new file mode 100644 index 00000000..39207684 --- /dev/null +++ b/src/mod_kinds.F90 @@ -0,0 +1,7 @@ +!> https://fortran-lang.discourse.group/t/best-way-to-declare-a-double-precision-in-fortran/69/2 +module mod_kinds +use iso_fortran_env, only: real32, real64 +implicit none +integer, parameter :: sp = real32 +integer, parameter :: dp = real64 +end module mod_kinds diff --git a/src/mp00ac.f90 b/src/mp00ac.F90 similarity index 83% rename from src/mp00ac.f90 rename to src/mp00ac.F90 index 2ecaf1ab..dba8dfae 100644 --- a/src/mp00ac.f90 +++ b/src/mp00ac.F90 @@ -110,7 +110,7 @@ !> @param[in] Ldfjac !> @param iflag indicates whether (i) iflag=1: "function" values are required; or (ii) iflag=2: "derivative" values are required subroutine mp00ac( Ndof, Xdof, Fdof, Ddof, Ldfjac, iflag ) ! argument list is fixed by NAG; ma02aa calls mp00ac through C05PCF; - + use mod_kinds, only: wp => dp ! if iflag.eq.0 : Xdof and Fdof are available for PRINTING ; Fdof MUST NOT BE CHANGED; Ddof MUST NOT BE CHANGED; ! if iflag.eq.1 : Fdof is to be UPDATED ; ; Ddof MUST NOT BE CHANGED; ! if iflag.eq.2 : Ddof is to be UPDATED ; Fdof MUST NOT BE CHANGED; @@ -152,51 +152,67 @@ subroutine mp00ac( Ndof, Xdof, Fdof, Ddof, Ldfjac, iflag ) ! argument list is fi !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS - INTEGER, intent(in) :: Ndof, Ldfjac - REAL , intent(in) :: Xdof(1:Ndof) - REAL :: Fdof(1:Ndof), Ddof(1:Ldfjac,1:Ndof) - INTEGER :: iflag +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + integer, intent(in) :: Ndof, Ldfjac + real(wp) , intent(in) :: Xdof(1:Ndof) + real(wp) :: Fdof(1:Ndof), Ddof(1:Ldfjac,1:Ndof) + integer :: iflag - INTEGER, parameter :: NB = 4 ! optimal workspace block size for LAPACK:DGECON; - INTEGER :: lvol, NN, MM, ideriv, lmns, ii, jj, nnz, Lwork + integer, parameter :: NB = 4 ! optimal workspace block size for LAPACK:DGECON; - INTEGER :: idgetrf(0:1), idgetrs(0:1), idgerfs(0:1), idgecon(0:1) + integer :: lvol, NN, MM, ideriv, lmns, ii, jj, nnz, Lwork - REAL :: lmu, dpf, dtf, dpsi(1:2), tpsi(1:2), ppsi(1:2), lcpu, test(2,2) + integer :: idgetrf(0:1), idgetrs(0:1), idgerfs(0:1), idgecon(0:1) - REAL :: anorm, rcond, ferr(2), berr(2), signfactor + real(wp) :: lmu, dpf, dtf, dpsi(1:2), tpsi(1:2), ppsi(1:2), lcpu, test(2,2) - CHARACTER :: packorunpack + real(wp) :: anorm, rcond, ferr(2), berr(2), signfactor + + character :: packorunpack ! For direct LU decompose - INTEGER, allocatable :: ipiv(:), Iwork(:) + integer, allocatable :: ipiv(:), Iwork(:) - REAL , allocatable :: matrix(:,:), rhs(:,:), LU(:,:) + real(wp) , allocatable :: matrix(:,:), rhs(:,:), LU(:,:) - REAL , allocatable :: RW(:), RD(:,:) + real(wp) , allocatable :: RW(:), RD(:,:) - REAL , allocatable :: matrixC(:,:) + real(wp) , allocatable :: matrixC(:,:) ! For GMRES + ILU - INTEGER, parameter :: nrestart = 5 ! do GMRES restart after nrestart iterations - INTEGER :: maxfil ! bandwidth for ILU subroutines, will be estimated + integer, parameter :: nrestart = 5 ! do GMRES restart after nrestart iterations + integer :: maxfil ! bandwidth for ILU subroutines, will be estimated - INTEGER :: NS, itercount, Nbilut + integer :: NS, itercount, Nbilut - REAL , allocatable :: matrixS(:), bilut(:) - INTEGER, allocatable :: ibilut(:), jbilut(:) + real(wp) , allocatable :: matrixS(:), bilut(:) + integer, allocatable :: ibilut(:), jbilut(:) - INTEGER, parameter :: ipar_SIZE = 128 - INTEGER :: ipar(ipar_SIZE), iluierr, RCI_REQUEST, nw, t1, t2, t3 - REAL :: fpar(ipar_SIZE), v1 - REAL, allocatable :: wk(:) - INTEGER,allocatable :: jw(:), iperm(:) + integer, parameter :: ipar_SIZE = 128 + integer :: ipar(ipar_SIZE), iluierr, RCI_REQUEST, nw, t1, t2, t3 + real(wp) :: fpar(ipar_SIZE), v1 + real(wp), allocatable :: wk(:) + integer,allocatable :: jw(:), iperm(:) + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif - BEGIN(mp00ac) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -205,7 +221,13 @@ subroutine mp00ac( Ndof, Xdof, Fdof, Ddof, Ldfjac, iflag ) ! argument list is fi !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! #ifdef DEBUG - FATAL( mp00ac, iflag.ne.1 .and. iflag.ne.2, invalid iflag ) ! see nprint=0 in ma02aa and C05PCF; perhaps NAG:C05PCF is no longer used; + + if( iflag.ne.1 .and. iflag.ne.2 ) then + write(6,'("mp00ac : fatal : myid=",i3," ; iflag.ne.1 .and. iflag.ne.2 ; invalid iflag ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "mp00ac : iflag.ne.1 .and. iflag.ne.2 : invalid iflag ;" + endif + ! see nprint=0 in ma02aa and C05PCF; perhaps NAG:C05PCF is no longer used; #endif !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -246,11 +268,20 @@ subroutine mp00ac( Ndof, Xdof, Fdof, Ddof, Ldfjac, iflag ) ! argument list is fi NN = NAdof(lvol) ! shorthand; - SALLOCATE( rhs , (1:NN,0:2 ), zero ) + + allocate( rhs (1:NN,0:2 ), stat=astat ) + rhs (1:NN,0:2 ) = zero + if (NOTMatrixFree) then ! create the full size matrix - SALLOCATE( matrix, (1:NN,1:NN), zero ) + + allocate( matrix(1:NN,1:NN), stat=astat ) + matrix(1:NN,1:NN) = zero + else ! create a dummy variable - SALLOCATE( matrix, (1:1,1:1), zero ) + + allocate( matrix(1:1,1:1), stat=astat ) + matrix(1:1,1:1) = zero + endif solution(1:NN,-1:2) = zero ! this is a global array allocated in dforce; @@ -260,15 +291,33 @@ subroutine mp00ac( Ndof, Xdof, Fdof, Ddof, Ldfjac, iflag ) ! argument list is fi case (1) ! direct matrix solver Lwork = NB*NN - SALLOCATE( RW, (1:Lwork ), zero ) - SALLOCATE( RD, (1:NN,0:2), zero ) - SALLOCATE( LU, (1:NN,1:NN), zero ) - SALLOCATE( ipiv, (1:NN), 0 ) - SALLOCATE( Iwork, (1:NN), 0 ) + + allocate( RW(1:Lwork ), stat=astat ) + RW(1:Lwork ) = zero + + + allocate( RD(1:NN,0:2), stat=astat ) + RD(1:NN,0:2) = zero + + + allocate( LU(1:NN,1:NN), stat=astat ) + LU(1:NN,1:NN) = zero + + + allocate( ipiv(1:NN), stat=astat ) + ipiv(1:NN) = 0 + + + allocate( Iwork(1:NN), stat=astat ) + Iwork(1:NN) = 0 + case (2:3) ! GMRES if (LILUprecond) then NS = NdMAS(lvol) ! shorthand - SALLOCATE( matrixS, (1:NS), zero ) + + allocate( matrixS(1:NS), stat=astat ) + matrixS(1:NS) = zero + ! estimate bandwidth if (Lcoordinatesingularity) then @@ -280,15 +329,33 @@ subroutine mp00ac( Ndof, Xdof, Fdof, Ddof, Ldfjac, iflag ) ! argument list is fi end if Nbilut = (2*maxfil+2)*NN - SALLOCATE( bilut, (1:Nbilut), zero) - SALLOCATE( jbilut, (1:Nbilut), 0) - SALLOCATE( ibilut, (1:NN+1), 0) + + allocate( bilut(1:Nbilut), stat=astat ) + bilut(1:Nbilut) = zero + + + allocate( jbilut(1:Nbilut), stat=astat ) + jbilut(1:Nbilut) = 0 + + + allocate( ibilut(1:NN+1), stat=astat ) + ibilut(1:NN+1) = 0 + endif nw = (NN+3)*(nrestart+2) + (nrestart+1)*nrestart - SALLOCATE( wk, (1:nw), zero) - SALLOCATE( jw, (1:2*NN), 0) - SALLOCATE( iperm, (1:2*NN), 0) + + allocate( wk(1:nw), stat=astat ) + wk(1:nw) = zero + + + allocate( jw(1:2*NN), stat=astat ) + jw(1:2*NN) = 0 + + + allocate( iperm(1:2*NN), stat=astat ) + iperm(1:2*NN) = 0 + end select !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -352,7 +419,13 @@ subroutine mp00ac( Ndof, Xdof, Fdof, Ddof, Ldfjac, iflag ) ! argument list is fi else ! Lvacuumregion ; #ifdef FORCEFREEVACUUM - FATAL( mp00ac, .true., need to revise Beltrami matrices in vacuum region for arbitrary force-free field ) + + if( .true. ) then + write(6,'("mp00ac : fatal : myid=",i3," ; .true. ; need to revise Beltrami matrices in vacuum region for arbitrary force-free field ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "mp00ac : .true. : need to revise Beltrami matrices in vacuum region for arbitrary force-free field ;" + endif + #else if (NOTMatrixFree) then @@ -400,7 +473,7 @@ subroutine mp00ac( Ndof, Xdof, Fdof, Ddof, Ldfjac, iflag ) ! argument list is fi end select ! ideriv; - cput = GETTIME + cput = MPI_WTIME() if( idgetrf(ideriv) .eq. 0 .and. idgetrs(ideriv) .eq. 0 .and. idgerfs(ideriv) .eq. 0 .and. rcond .ge. machprec) then if( Wmp00ac ) write(ounit,1010) cput-cpus, myid, lvol, ideriv, "idgetrf idgetrs idgerfs", idgetrf(ideriv), idgetrs(ideriv), idgetrf(ideriv), "success ; ", cput-lcpu @@ -435,7 +508,13 @@ subroutine mp00ac( Ndof, Xdof, Fdof, Ddof, Ldfjac, iflag ) ! argument list is fi if (LILUprecond) then ! ILU factorization call ilutp(NN,matrixS,jdMAS,idMAS,maxfil,epsILU,0.1,NN,bilut,jbilut,ibilut,Nbilut,wk,jw,iperm,iluierr) - FATAL(mp00ac, iluierr.ne.0, construction of preconditioner failed) + + if( iluierr.ne.0 ) then + write(6,'("mp00ac : fatal : myid=",i3," ; iluierr.ne.0 ; construction of preconditioner failed;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "mp00ac : iluierr.ne.0 : construction of preconditioner failed ;" + endif + endif call rungmres(NN,nrestart,lmu,lvol,rhs(1:NN,0),solution(1:NN,0),ipar,fpar,wk,nw,GMRESlastsolution(1:NN,0,lvol),matrix,bilut,jbilut,ibilut,iperm,ierr) @@ -469,7 +548,7 @@ subroutine mp00ac( Ndof, Xdof, Fdof, Ddof, Ldfjac, iflag ) ! argument list is fi end do ! ii end select ! ideriv - cput = GETTIME + cput = MPI_WTIME() if (ierr.ge.0) then if( Wmp00ac ) write(ounit,1011) cput-cpus, myid, lvol, ideriv, ierr, " successful ; " @@ -495,7 +574,12 @@ subroutine mp00ac( Ndof, Xdof, Fdof, Ddof, Ldfjac, iflag ) ! argument list is fi if( iflag.eq.1 .and. ideriv.gt.0 ) cycle packorunpack = 'U' - WCALL( mp00ac, packab, ( packorunpack, lvol, NN, solution(1:NN,ideriv), ideriv ) ) ! unpacking; this assigns oAt, oAz through common; + + cput = MPI_WTIME() + Tmp00ac = Tmp00ac + ( cput-cpuo ) + call packab( packorunpack, lvol, NN, solution(1:NN,ideriv), ideriv ) + cpuo = MPI_WTIME() + ! unpacking; this assigns oAt, oAz through common; if (ideriv .eq. 0 .and. .not. NOTMatrixFree) then call intghs(Iquad(lvol), mn, lvol, Lrad(lvol), 0) ! compute the integrals of B_lower @@ -525,26 +609,54 @@ subroutine mp00ac( Ndof, Xdof, Fdof, Ddof, Ldfjac, iflag ) ! argument list is fi endif !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - DALLOCATE( matrix ) - DALLOCATE( rhs ) + + deallocate(matrix ,stat=astat) + + + deallocate(rhs ,stat=astat) + select case (Lmatsolver) case (1) ! LU - DALLOCATE( RW ) - DALLOCATE( RD ) - DALLOCATE( LU ) - DALLOCATE( ipiv ) - DALLOCATE( Iwork ) + + deallocate(RW ,stat=astat) + + + deallocate(RD ,stat=astat) + + + deallocate(LU ,stat=astat) + + + deallocate(ipiv ,stat=astat) + + + deallocate(Iwork ,stat=astat) + case (2:3) ! GMRES if (LILUprecond) then - DALLOCATE( matrixS ) - DALLOCATE( bilut ) - DALLOCATE( jbilut ) - DALLOCATE( ibilut ) + + deallocate(matrixS ,stat=astat) + + + deallocate(bilut ,stat=astat) + + + deallocate(jbilut ,stat=astat) + + + deallocate(ibilut ,stat=astat) + endif - DALLOCATE( wk ) - DALLOCATE( jw ) - DALLOCATE( iperm ) + + deallocate(wk ,stat=astat) + + + deallocate(jw ,stat=astat) + + + deallocate(iperm ,stat=astat) + end select !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -590,7 +702,12 @@ subroutine mp00ac( Ndof, Xdof, Fdof, Ddof, Ldfjac, iflag ) ! argument list is fi if( Lplasmaregion ) then if( Wtr00ab ) then ! compute rotational transform only for diagnostic purposes; - WCALL( mp00ac, tr00ab, ( lvol, mn, lmns, Nt, Nz, iflag, diotadxup(0:1,-1:2,lvol) ) ) + + cput = MPI_WTIME() + Tmp00ac = Tmp00ac + ( cput-cpuo ) + call tr00ab( lvol, mn, lmns, Nt, Nz, iflag, diotadxup(0:1,-1:2,lvol) ) + cpuo = MPI_WTIME() + endif Fdof(1:Ndof ) = zero ! provide dummy intent out; Lconstraint=-1 indicates no iterations over mu , dpflux are required; @@ -599,11 +716,21 @@ subroutine mp00ac( Ndof, Xdof, Fdof, Ddof, Ldfjac, iflag ) ! argument list is fi else ! Lvacuumregion if( Wtr00ab ) then ! compute rotational transform only for diagnostic purposes; - WCALL( mp00ac, tr00ab, ( lvol, mn, lmns, Nt, Nz, iflag, diotadxup(0:1,-1:2,lvol) ) ) + + cput = MPI_WTIME() + Tmp00ac = Tmp00ac + ( cput-cpuo ) + call tr00ab( lvol, mn, lmns, Nt, Nz, iflag, diotadxup(0:1,-1:2,lvol) ) + cpuo = MPI_WTIME() + endif if( Wcurent ) then ! compute enclosed currents only for diagnostic purposes; - WCALL( mp00ac, curent,( lvol, mn, Nt, Nz, iflag, dItGpdxtp(0:1,-1:2,lvol) ) ) + + cput = MPI_WTIME() + Tmp00ac = Tmp00ac + ( cput-cpuo ) + call curent( lvol, mn, Nt, Nz, iflag, dItGpdxtp(0:1,-1:2,lvol) ) + cpuo = MPI_WTIME() + curtor = dItGpdxtp(0,0,lvol) ! icurrent(0) ! update input variables; curpol = dItGpdxtp(1,0,lvol) ! gcurrent(0) endif @@ -618,7 +745,12 @@ subroutine mp00ac( Ndof, Xdof, Fdof, Ddof, Ldfjac, iflag ) ! argument list is fi if( Lplasmaregion ) then if( Wtr00ab ) then ! compute rotational transform only for diagnostic purposes; - WCALL( mp00ac, tr00ab, ( lvol, mn, lmns, Nt, Nz, iflag, diotadxup(0:1,-1:2,lvol) ) ) + + cput = MPI_WTIME() + Tmp00ac = Tmp00ac + ( cput-cpuo ) + call tr00ab( lvol, mn, lmns, Nt, Nz, iflag, diotadxup(0:1,-1:2,lvol) ) + cpuo = MPI_WTIME() + endif Fdof(1:Ndof ) = zero ! provide dummy intent out; Lconstraint= 0 indicates no iterations over mu, dpflux are required; @@ -626,7 +758,12 @@ subroutine mp00ac( Ndof, Xdof, Fdof, Ddof, Ldfjac, iflag ) ! argument list is fi else ! Lvacuumregion - WCALL( mp00ac, curent,( lvol, mn, Nt, Nz, iflag, dItGpdxtp(0:1,-1:2,lvol) ) ) + + cput = MPI_WTIME() + Tmp00ac = Tmp00ac + ( cput-cpuo ) + call curent( lvol, mn, Nt, Nz, iflag, dItGpdxtp(0:1,-1:2,lvol) ) + cpuo = MPI_WTIME() + if( iflag.eq.1 ) Fdof(1:2 ) = (/ dItGpdxtp(0,0,lvol) - curtor, dItGpdxtp(1,0,lvol) - curpol /) if( iflag.eq.2 ) Ddof(1:2,1) = (/ dItGpdxtp(0,1,lvol) , dItGpdxtp(1,1,lvol) /) @@ -637,7 +774,12 @@ subroutine mp00ac( Ndof, Xdof, Fdof, Ddof, Ldfjac, iflag ) ! argument list is fi case( 1 ) ! Lconstraint= 1; - WCALL( mp00ac, tr00ab,( lvol, mn, lmns, Nt, Nz, iflag, diotadxup(0:1,-1:2,lvol) ) ) ! required for both plasma and vacuum region; + + cput = MPI_WTIME() + Tmp00ac = Tmp00ac + ( cput-cpuo ) + call tr00ab( lvol, mn, lmns, Nt, Nz, iflag, diotadxup(0:1,-1:2,lvol) ) + cpuo = MPI_WTIME() + ! required for both plasma and vacuum region; if( Lplasmaregion ) then @@ -654,7 +796,12 @@ subroutine mp00ac( Ndof, Xdof, Fdof, Ddof, Ldfjac, iflag ) ! argument list is fi else ! Lvacuumregion - WCALL( mp00ac, curent, ( lvol, mn, Nt, Nz, iflag, dItGpdxtp(0:1,-1:2,lvol) ) ) + + cput = MPI_WTIME() + Tmp00ac = Tmp00ac + ( cput-cpuo ) + call curent( lvol, mn, Nt, Nz, iflag, dItGpdxtp(0:1,-1:2,lvol) ) + cpuo = MPI_WTIME() + curtor = dItGpdxtp(0,0,lvol) ! update input variables; 08 Jun 16; !curpol = dItGpdxtp(1,0,lvol) @@ -683,7 +830,12 @@ subroutine mp00ac( Ndof, Xdof, Fdof, Ddof, Ldfjac, iflag ) ! argument list is fi if( Lplasmaregion ) then if( Wtr00ab ) then ! compute rotational transform only for diagnostic purposes; - WCALL( mp00ac, tr00ab, ( lvol, mn, lmns, Nt, Nz, iflag, diotadxup(0:1,-1:2,lvol) ) ) + + cput = MPI_WTIME() + Tmp00ac = Tmp00ac + ( cput-cpuo ) + call tr00ab( lvol, mn, lmns, Nt, Nz, iflag, diotadxup(0:1,-1:2,lvol) ) + cpuo = MPI_WTIME() + endif Fdof(1:Ndof ) = zero ! provide dummy intent out; no iteration other mu and psip locally @@ -708,21 +860,33 @@ subroutine mp00ac( Ndof, Xdof, Fdof, Ddof, Ldfjac, iflag ) ! argument list is fi if( Wmp00ac .or. Wma02aa ) then ! the following is screen output; - cput = GETTIME + cput = MPI_WTIME() if( Lplasmaregion ) then select case( iflag ) case( 0 ) ; write(ounit,3000) cput-cpus, myid, lvol, lmu, dpf, iflag ! this is impossible by above logic; case( 1 ) ; write(ounit,3000) cput-cpus, myid, lvol, lmu, dpf, iflag, Fdof(1:Ndof) case( 2 ) ; write(ounit,3010) cput-cpus, myid, lvol, lmu, dpf, iflag, Ddof(1:Ndof,1:Ndof) - case default ; FATAL( mp00ac, .true., illegal iflag on entry ) + case default ; + if( .true. ) then + write(6,'("mp00ac : fatal : myid=",i3," ; .true. ; illegal iflag on entry ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "mp00ac : .true. : illegal iflag on entry ;" + endif + end select else ! Lvacuumregion select case( iflag ) case( 0 ) ; write(ounit,3001) cput-cpus, myid, lvol, dtf, dpf, iflag ! this is impossible by above logic; case( 1 ) ; write(ounit,3001) cput-cpus, myid, lvol, dtf, dpf, iflag, Fdof(1:Ndof) case( 2 ) ; write(ounit,3011) cput-cpus, myid, lvol, dtf, dpf, iflag, Ddof(1:Ndof,1:Ndof) - case default ; FATAL( mp00ac, .true., illegal iflag on entry ) + case default ; + if( .true. ) then + write(6,'("mp00ac : fatal : myid=",i3," ; .true. ; illegal iflag on entry ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "mp00ac : .true. : illegal iflag on entry ;" + endif + end select endif @@ -755,7 +919,12 @@ subroutine mp00ac( Ndof, Xdof, Fdof, Ddof, Ldfjac, iflag ) ! argument list is fi !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - RETURN(mp00ac) + +9999 continue + cput = MPI_WTIME() + Tmp00ac = Tmp00ac + ( cput-cpuo ) + return + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -783,6 +952,7 @@ end subroutine mp00ac !> @param iperm !> @param ierr subroutine rungmres(n,nrestart,mu,vvol,rhs,sol,ipar,fpar,wk,nw,guess,a,au,jau,ju,iperm,ierr) + use mod_kinds, only: wp => dp ! Driver subroutine for GMRES ! modified from riters.f from SPARSKIT v2.0 ! by ZSQ 02 Feb 2020 @@ -791,14 +961,14 @@ subroutine rungmres(n,nrestart,mu,vvol,rhs,sol,ipar,fpar,wk,nw,guess,a,au,jau,ju use allglobal, only : LILUprecond use fileunits implicit none - INTEGER :: n, nrestart, nw, vvol, ju(*), jau(*), iperm(*) - INTEGER :: ipar(16) - INTEGER :: ierr - REAL :: guess(n), au(*), mu - REAL :: fpar(16), rhs(1:n), sol(1:n), wk(1:nw), a(*) + integer :: n, nrestart, nw, vvol, ju(*), jau(*), iperm(*) + integer :: ipar(16) + integer :: ierr + real(wp) :: guess(n), au(*), mu + real(wp) :: fpar(16), rhs(1:n), sol(1:n), wk(1:nw), a(*) - INTEGER :: i, its - REAL :: res, tmprhs(1:n) + integer :: i, its + real(wp) :: res, tmprhs(1:n) its = 0 res = zero @@ -860,17 +1030,18 @@ end subroutine rungmres !> @param mu !> @param vvol subroutine matvec(n, x, ax, a, mu, vvol) + use mod_kinds, only: wp => dp ! compute a.x by either by coumputing it directly, ! or using a matrix free method use constants, only : zero, one use inputlist, only : Lrad use allglobal, only : NOTMatrixFree, Iquad, mn, dmd implicit none - INTEGER, intent(in) :: n, vvol - REAL :: ax(1:n), x(1:n), a(*), mu - INTEGER :: ideriv - REAL :: dax(0:n), ddx(0:n), cput, lastcpu - CHARACTER :: packorunpack + integer, intent(in) :: n, vvol + real(wp) :: ax(1:n), x(1:n), a(*), mu + integer :: ideriv + real(wp) :: dax(0:n), ddx(0:n), cput, lastcpu + character :: packorunpack if (NOTMatrixFree) then ! if we have the matrix, then just multiply it to x call DGEMV('N', n, n, one, dMD(1,1), n+1, x, 1, zero, ddx(1), 1) @@ -898,14 +1069,15 @@ end subroutine matvec !> @param ju !> @param iperm subroutine prec_solve(n,vecin,vecout,au,jau,ju,iperm) + use mod_kinds, only: wp => dp ! apply the preconditioner implicit none - INTEGER :: n, iperm(*), jau(*), ju(*) - REAL :: vecin(*), au(*) - REAL :: vecout(*) + integer :: n, iperm(*), jau(*), ju(*) + real(wp) :: vecin(*), au(*) + real(wp) :: vecout(*) - INTEGER :: ii - REAL :: tempv(n) + integer :: ii + real(wp) :: tempv(n) call lusol(n,vecin,tempv,au,jau,ju) ! sparse LU solve ! apply permutation diff --git a/src/mtrxhs.f90 b/src/mtrxhs.F90 similarity index 91% rename from src/mtrxhs.f90 rename to src/mtrxhs.F90 index 101dbd91..dc9fac3b 100644 --- a/src/mtrxhs.f90 +++ b/src/mtrxhs.F90 @@ -11,7 +11,7 @@ !> @param resultD !> @param idx subroutine mtrxhs( lvol, mn, lrad, resultA, resultD, idx ) - + use mod_kinds, only: wp => dp !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! use constants, only : zero, one, two, half @@ -40,24 +40,40 @@ subroutine mtrxhs( lvol, mn, lrad, resultA, resultD, idx ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS + +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - INTEGER, intent(in) :: lvol, mn, lrad, idx + integer, intent(in) :: lvol, mn, lrad, idx - REAL, intent(out) :: resultA(0:NAdof(lvol)), resultD(0:NAdof(lvol)) + real(wp), intent(out) :: resultA(0:NAdof(lvol)), resultD(0:NAdof(lvol)) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - INTEGER :: NN, ii, ll, jj, ll1, mi, ni, id, jd, kk + integer :: NN, ii, ll, jj, ll1, mi, ni, id, jd, kk + + real(wp) :: Wte, Wto, Wze, Wzo, Hte, Hto, Hze, Hzo - REAL :: Wte, Wto, Wze, Wzo, Hte, Hto, Hze, Hzo + real(wp), allocatable :: TTdata(:,:,:), TTMdata(:,:) - REAL, allocatable :: TTdata(:,:,:), TTMdata(:,:) - BEGIN(mtrxhs) + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -67,8 +83,14 @@ subroutine mtrxhs( lvol, mn, lrad, resultA, resultD, idx ) resultA(0:NN) = zero resultD(0:NN) = zero - SALLOCATE( TTdata, (0:lrad, 0:mpol, 0:1), zero) - SALLOCATE( TTMdata, (0:lrad, 0:mpol), zero) + + allocate( TTdata(0:lrad, 0:mpol, 0:1), stat=astat ) + TTdata(0:lrad, 0:mpol, 0:1) = zero + + + allocate( TTMdata(0:lrad, 0:mpol), stat=astat ) + TTMdata(0:lrad, 0:mpol) = zero + ! fill in Zernike/Chebyshev polynomials depending on Lcooridnatesingularity if (Lcoordinatesingularity) then @@ -207,12 +229,21 @@ subroutine mtrxhs( lvol, mn, lrad, resultA, resultD, idx ) !$OMP END PARALLEL DO endif ! end of if( YESstellsym ) ; - DALLOCATE( TTdata ) - DALLOCATE( TTMdata ) + + deallocate(TTdata ,stat=astat) + + + deallocate(TTMdata ,stat=astat) + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - RETURN(mtrxhs) + +9999 continue + cput = MPI_WTIME() + Tmtrxhs = Tmtrxhs + ( cput-cpuo ) + return + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! diff --git a/src/newton.f90 b/src/newton.F90 similarity index 71% rename from src/newton.f90 rename to src/newton.F90 index c86e87c6..b44fdcb9 100644 --- a/src/newton.f90 +++ b/src/newton.F90 @@ -5,10 +5,10 @@ !> \brief timing of Newton iterations module newtontime - - INTEGER :: nFcalls !< number of calls to get function values (?) - INTEGER :: nDcalls !< number of calls to get derivative values (?) - REAL :: lastcpu !< last CPU that called this (?) + use mod_kinds, only: wp => dp + integer :: nFcalls !< number of calls to get function values (?) + integer :: nDcalls !< number of calls to get derivative values (?) + real(wp) :: lastcpu !< last CPU that called this (?) end module newtontime @@ -47,7 +47,7 @@ end module newtontime !> @param[inout] position !> @param[out] ihybrd subroutine newton( NGdof, position, ihybrd ) - + use mod_kinds, only: wp => dp !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! use constants, only : zero, one, two, ten @@ -77,41 +77,57 @@ subroutine newton( NGdof, position, ihybrd ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS - INTEGER, intent(in) :: NGdof - REAL , intent(inout) :: position(0:NGdof) - INTEGER, intent(out) :: ihybrd +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + integer, intent(in) :: NGdof + real(wp) , intent(inout) :: position(0:NGdof) + integer, intent(out) :: ihybrd LOGICAL :: LComputeDerivatives - INTEGER :: wflag, iflag, idof, jdof, ijdof, ireadhessian, igdof, lvol, ii, imn, ierr2 - REAL :: rflag - CHARACTER :: pack + integer :: wflag, iflag, idof, jdof, ijdof, ireadhessian, igdof, lvol, ii, imn, ierr2 + real(wp) :: rflag + character :: pack - INTEGER :: irevcm, mode, Ldfjac, LR - REAL :: xtol, epsfcn, factor - REAL :: diag(1:NGdof), QTF(1:NGdof), workspace(1:NGdof,1:4) + integer :: irevcm, mode, Ldfjac, LR + real(wp) :: xtol, epsfcn, factor + real(wp) :: diag(1:NGdof), QTF(1:NGdof), workspace(1:NGdof,1:4) - REAL :: force(0:NGdof) - REAL, allocatable :: fjac(:,:), RR(:), work(:,:) + real(wp) :: force(0:NGdof) + real(wp), allocatable :: fjac(:,:), RR(:), work(:,:) - INTEGER :: ML, MU ! required for only Lc05ndf; + integer :: ML, MU ! required for only Lc05ndf; LOGICAL :: Lexit = .true. ! perhaps this could be made user input; LOGICAL :: LComputeAxis - INTEGER :: nprint = 1, nfev, njev + integer :: nprint = 1, nfev, njev - INTEGER, parameter :: maxfev = 5000 ! maximum calls per iteration; + integer, parameter :: maxfev = 5000 ! maximum calls per iteration; external :: fcn1, fcn2 - BEGIN(newton) + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! if( Wnewton .and. myid.eq.0 ) then ! screen output; - cput = GETTIME + cput = MPI_WTIME() write(ounit,'("newton : ", 10x ," : ")') write(ounit,'("newton : ",f10.2," : Lfindzero="i2" ; forcetol="es13.5" ; c05xtol="es13.5" ; c05factor="es13.5" ; LreadGF="L2" ; NGdof="i6" ;")')& cput-cpus, Lfindzero, forcetol, c05xtol, c05factor, LreadGF, NGdof @@ -141,16 +157,21 @@ subroutine newton( NGdof, position, ihybrd ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - lastcpu = GETTIME + lastcpu = MPI_WTIME() if( Lexit ) then ! will call initial force, and if ForceErr.lt.forcetol will immediately exit; LComputeDerivatives= .false. LComputeAxis = .true. - WCALL( newton, dforce, ( NGdof, position(0:NGdof), force(0:NGdof), LComputeDerivatives, LComputeAxis) ) ! calculate the force-imbalance; + + cput = MPI_WTIME() + Tnewton = Tnewton + ( cput-cpuo ) + call dforce( NGdof, position(0:NGdof), force(0:NGdof), LComputeDerivatives, LComputeAxis) + cpuo = MPI_WTIME() + ! calculate the force-imbalance; if( myid.eq.0 ) then ! screen output; - cput = GETTIME + cput = MPI_WTIME() ; write(ounit,1000) cput-cpus, nFcalls, nDcalls, ForceErr, cput-lastcpu, "|BB|e", alog10(BBe(1:min(Mvol-1,28))) if( Igeometry.ge.3 ) then ! include spectral constraints; ;write(ounit,1001) "|II|o", alog10(IIo(1:min(Mvol-1,28))) @@ -179,20 +200,44 @@ subroutine newton( NGdof, position, ihybrd ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - SALLOCATE( fjac, (1:NGdof, 1:NGdof), zero) - SALLOCATE( RR, (1:NGdof*(NGdof+1)/2), zero) + + allocate( fjac(1:NGdof, 1:NGdof), stat=astat ) + fjac(1:NGdof, 1:NGdof) = zero + + + allocate( RR(1:NGdof*(NGdof+1)/2), stat=astat ) + RR(1:NGdof*(NGdof+1)/2) = zero + if( Lfindzero.eq.2 ) then - SALLOCATE( dFFdRZ, (1:LGdof,0:1,1:LGdof,0:1,1:Mvol), zero ) - SALLOCATE( dBBdmp, (1:LGdof,1:Mvol,0:1,1:2), zero ) + + allocate( dFFdRZ(1:LGdof,0:1,1:LGdof,0:1,1:Mvol), stat=astat ) + dFFdRZ(1:LGdof,0:1,1:LGdof,0:1,1:Mvol) = zero + + + allocate( dBBdmp(1:LGdof,1:Mvol,0:1,1:2), stat=astat ) + dBBdmp(1:LGdof,1:Mvol,0:1,1:2) = zero + if( LocalConstraint ) then - SALLOCATE( dmupfdx, (1:Mvol, 1:1,1:2,1:LGdof,0:1), zero ) + + allocate( dmupfdx(1:Mvol, 1:1,1:2,1:LGdof,0:1), stat=astat ) + dmupfdx(1:Mvol, 1:1,1:2,1:LGdof,0:1) = zero + else - SALLOCATE( dmupfdx, (1:Mvol, 1:Mvol-1,1:2,1:LGdof,1), zero ) ! TODO change the format to put vvol in last index position... + + allocate( dmupfdx(1:Mvol, 1:Mvol-1,1:2,1:LGdof,1), stat=astat ) + dmupfdx(1:Mvol, 1:Mvol-1,1:2,1:LGdof,1) = zero + ! TODO change the format to put vvol in last index position... endif - SALLOCATE( hessian, (1:NGdof,1:NGdof), zero ) - SALLOCATE( dessian, (1:NGdof,1:LGdof), zero ) + + allocate( hessian(1:NGdof,1:NGdof), stat=astat ) + hessian(1:NGdof,1:NGdof) = zero + + + allocate( dessian(1:NGdof,1:LGdof), stat=astat ) + dessian(1:NGdof,1:LGdof) = zero + Lhessianallocated = .true. else @@ -201,33 +246,49 @@ subroutine newton( NGdof, position, ihybrd ) Lhessian2Dallocated = .false. Lhessian3Dallocated = .false. - + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! select case( Lfindzero ) case( 1 ) ! use function values to find x st f(x)=0, where x is the geometry of the interfaces, and f is the force; - WCALL( newton, hybrd, ( fcn1, NGdof, position(1:NGdof), force(1:NGdof), & + + cput = MPI_WTIME() + Tnewton = Tnewton + ( cput-cpuo ) + call hybrd( fcn1, NGdof, position(1:NGdof), force(1:NGdof), & xtol, maxfev, ML, MU, epsfcn, diag(1:NGdof), mode, factor, nprint, ihybrd, nfev, fjac(1:Ldfjac,1:NGdof), Ldfjac, & - RR(1:LR), LR, QTF(1:NGdof), workspace(1:NGdof,1), workspace(1:NGdof,2), workspace(1:NGdof,3), workspace(1:NGdof,4) ) ) + RR(1:LR), LR, QTF(1:NGdof), workspace(1:NGdof,1), workspace(1:NGdof,2), workspace(1:NGdof,3), workspace(1:NGdof,4) ) + cpuo = MPI_WTIME() + case( 2 ) ! use function values and user-supplied derivatives to find x st f(x)=0, where x is the geometry of the interfaces, and f is the force; - WCALL( newton, hybrj, ( fcn2, NGdof, position(1:NGdof), force(1:NGdof), fjac(1:Ldfjac,1:NGdof), Ldfjac, & + + cput = MPI_WTIME() + Tnewton = Tnewton + ( cput-cpuo ) + call hybrj( fcn2, NGdof, position(1:NGdof), force(1:NGdof), fjac(1:Ldfjac,1:NGdof), Ldfjac, & xtol, maxfev, diag(1:NGdof), mode, factor, nprint, ihybrd, nfev, njev, & - RR(1:LR), LR, QTF(1:NGdof), workspace(1:NGdof,1), workspace(1:NGdof,2), workspace(1:NGdof,3), workspace(1:NGdof,4) ) ) + RR(1:LR), LR, QTF(1:NGdof), workspace(1:NGdof,1), workspace(1:NGdof,2), workspace(1:NGdof,3), workspace(1:NGdof,4) ) + cpuo = MPI_WTIME() + case default - FATAL( newton, .true., value of Lfindzero not supported ) + + if( .true. ) then + write(6,'("newton : fatal : myid=",i3," ; .true. ; value of Lfindzero not supported ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "newton : .true. : value of Lfindzero not supported ;" + endif + end select !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! if( myid.eq.0 ) then - cput = GETTIME + cput = MPI_WTIME() ; write(ounit,'("newton : ", 10x ," :")') select case( ihybrd ) case( 1 ) ; write(ounit,'("newton : ",f10.2," : finished ; success ; ic05p*f="i2" ; its="i7" ,"i4" ;")') cput-cpus, ihybrd, nFcalls, nDcalls @@ -246,11 +307,20 @@ subroutine newton( NGdof, position, ihybrd ) if( Wnewton ) write(ounit,'("newton : ", 10x ," : saving derivative matrix to file ;")') #ifdef DEBUG - FATAL( newton, .not.Lhessianallocated, error ) + + if( .not.Lhessianallocated ) then + write(6,'("newton : fatal : myid=",i3," ; .not.Lhessianallocated ; error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "newton : .not.Lhessianallocated : error ;" + endif + #endif !hessian(1:NGdof,1:NGdof) = zero - SALLOCATE(work, (1:NGdof,1:NGdof), zero)! BLAS version; 19 Jul 2019 + + allocate( work(1:NGdof,1:NGdof), stat=astat ) + work(1:NGdof,1:NGdof) = zero +! BLAS version; 19 Jul 2019 ijdof = 0 do idof = 1, NGdof !do jdof = idof, NGdof ; ijdof = ijdof + 1 ; hessian(idof,jdof) = RR(ijdof) ! un-pack R matrix; old version @@ -262,7 +332,9 @@ subroutine newton( NGdof, position, ihybrd ) !hessian(1:NGdof,1:NGdof) = matmul( fjac(1:NGdof,1:NGdof), hessian(1:NGdof,1:NGdof) ) call DGEMM('N','N',NGdof,NGdof,NGdof,one,fjac,NGdof,work,NGdof,zero,hessian,NGdof) ! BLAS version; 19 Jul 2019 - DALLOCATE(work)! BLAS version; 19 Jul 2019 + + deallocate(work,stat=astat) +! BLAS version; 19 Jul 2019 call writereadgf( 'W', NGdof, ireadhessian ) ! write derivative matrix to file; @@ -274,19 +346,38 @@ subroutine newton( NGdof, position, ihybrd ) call MPI_BARRIER( MPI_COMM_SPEC, ierr2) if( Lfindzero.eq.2 ) then - DALLOCATE( dFFdRZ ) - DALLOCATE( dBBdmp ) - DALLOCATE( dmupfdx ) - DALLOCATE( hessian ) - DALLOCATE( dessian ) + + deallocate(dFFdRZ ,stat=astat) + + + deallocate(dBBdmp ,stat=astat) + + + deallocate(dmupfdx ,stat=astat) + + + deallocate(hessian ,stat=astat) + + + deallocate(dessian ,stat=astat) + Lhessianallocated = .false. endif - DALLOCATE( fjac ) - DALLOCATE( RR ) + + deallocate(fjac ,stat=astat) + + + deallocate(RR ,stat=astat) + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - RETURN(newton) + +9999 continue + cput = MPI_WTIME() + Tnewton = Tnewton + ( cput-cpuo ) + return + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -302,7 +393,7 @@ end subroutine newton !> @param[in] NGdof !> @param[out] ireadhessian subroutine writereadgf( readorwrite, NGdof , ireadhessian ) - + use mod_kinds, only: wp => dp use constants, only : zero use numerical, only : @@ -316,16 +407,30 @@ subroutine writereadgf( readorwrite, NGdof , ireadhessian ) use allglobal, only : myid, cpus, MPI_COMM_SPEC, ext, & mn, im, in, hessian, Lhessianallocated - LOCALS - CHARACTER, intent(in) :: readorwrite +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + character, intent(in) :: readorwrite LOGICAL :: exist - INTEGER, intent(in) :: NGdof - INTEGER, intent(out) :: ireadhessian + integer, intent(in) :: NGdof + integer, intent(out) :: ireadhessian - INTEGER :: lIgeometry, lIstellsym, lLfreebound, lNvol, lMpol, lNtor, lNGdof + integer :: lIgeometry, lIstellsym, lLfreebound, lNvol, lMpol, lNtor, lNGdof + + + if( .not.Lhessianallocated ) then + write(6,'("newton : fatal : myid=",i3," ; .not.Lhessianallocated ; error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "newton : .not.Lhessianallocated : error ;" + endif - FATAL( newton, .not.Lhessianallocated, error ) ireadhessian = 0 ! set default intent out; @@ -337,20 +442,44 @@ subroutine writereadgf( readorwrite, NGdof , ireadhessian ) ios = 0 open( dunit, file="."//trim(ext)//".sp.DF", status="replace", form="unformatted", iostat=ios ) ! save derivative matrix to file; - FATAL( newton, ios.ne.0, error opening derivative matrix file ) + + if( ios.ne.0 ) then + write(6,'("newton : fatal : myid=",i3," ; ios.ne.0 ; error opening derivative matrix file ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "newton : ios.ne.0 : error opening derivative matrix file ;" + endif + write( dunit, iostat=ios ) Igeometry, Istellsym, Lfreebound, Nvol, Mpol, Ntor, NGdof ! enable resolution consistency check; - FATAL( newton, ios.ne.0, error writing Nvol, Mpol, Ntor, NGdof ) + + if( ios.ne.0 ) then + write(6,'("newton : fatal : myid=",i3," ; ios.ne.0 ; error writing Nvol;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "newton : ios.ne.0 : error writing Nvol ;" + endif + write( dunit, iostat=ios ) hessian(1:NGdof,1:NGdof) - FATAL( newton, ios.ne.0, error writing hessian to file ) + + if( ios.ne.0 ) then + write(6,'("newton : fatal : myid=",i3," ; ios.ne.0 ; error writing hessian to file ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "newton : ios.ne.0 : error writing hessian to file ;" + endif + close( dunit, iostat=ios ) - FATAL( newton, ios.ne.0, error closing derivative matrix file ) + + if( ios.ne.0 ) then + write(6,'("newton : fatal : myid=",i3," ; ios.ne.0 ; error closing derivative matrix file ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "newton : ios.ne.0 : error closing derivative matrix file ;" + endif + case( 'R' ) - cput = GETTIME + cput = MPI_WTIME() inquire( file="."//trim(ext)//".sp.DF", exist=exist ) ! the derivative matrix; @@ -404,7 +533,13 @@ subroutine writereadgf( readorwrite, NGdof , ireadhessian ) case default - FATAL( newton, .true., invalid readorwrite ) + + if( .true. ) then + write(6,'("newton : fatal : myid=",i3," ; .true. ; invalid readorwrite ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "newton : .true. : invalid readorwrite ;" + endif + end select @@ -425,7 +560,7 @@ end subroutine writereadgf !> @param[out] fvec !> @param[in] irevcm subroutine fcn1( NGdof, xx, fvec, irevcm ) - + use mod_kinds, only: wp => dp !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! use constants, only : zero, one, two, ten @@ -456,19 +591,35 @@ subroutine fcn1( NGdof, xx, fvec, irevcm ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS - INTEGER, intent(in) :: NGdof, irevcm - REAL , intent(in) :: xx(1:NGdof) - REAL , intent(out) :: fvec(1:NGdof) +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + - REAL :: position(0:NGdof), force(0:NGdof) + integer, intent(in) :: NGdof, irevcm + real(wp) , intent(in) :: xx(1:NGdof) + real(wp) , intent(out) :: fvec(1:NGdof) + + real(wp) :: position(0:NGdof), force(0:NGdof) LOGICAL :: LComputeDerivatives, Lonlysolution, LComputeAxis - INTEGER :: idof, jdof, ijdof, ireadhessian, igdof, lvol, ii, imn - CHARACTER :: pack + integer :: idof, jdof, ijdof, ireadhessian, igdof, lvol, ii, imn + character :: pack + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif - BEGIN(newton) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -485,12 +636,17 @@ subroutine fcn1( NGdof, xx, fvec, irevcm ) pack = 'U' ! unpack geometrical degrees of freedom; LComputeAxis = .true. LComputeDerivatives = .false. - WCALL( newton, packxi, ( NGdof, position(0:NGdof), Mvol, mn, iRbc(1:mn,0:Mvol), iZbs(1:mn,0:Mvol), & - iRbs(1:mn,0:Mvol), iZbc(1:mn,0:Mvol), pack, LComputeDerivatives, LComputeAxis ) ) + + cput = MPI_WTIME() + Tnewton = Tnewton + ( cput-cpuo ) + call packxi( NGdof, position(0:NGdof), Mvol, mn, iRbc(1:mn,0:Mvol), iZbs(1:mn,0:Mvol), & + iRbs(1:mn,0:Mvol), iZbc(1:mn,0:Mvol), pack, LComputeDerivatives, LComputeAxis ) + cpuo = MPI_WTIME() + if( myid.eq.0 ) then - cput = GETTIME + cput = MPI_WTIME() ; write(ounit,1000) cput-cpus, nFcalls, nDcalls, ForceErr, cput-lastcpu, "|BB|e", alog10(BBe(1:min(Mvol-1,28))) if( Igeometry.ge.3 ) then ! include spectral constraints; @@ -502,13 +658,23 @@ subroutine fcn1( NGdof, xx, fvec, irevcm ) write(ounit,1001) "|II|e", alog10(IIe(1:min(Mvol-1,28))) endif endif - lastcpu = GETTIME + lastcpu = MPI_WTIME() - WCALL( newton, wrtend ) ! write restart file; save geometry to ext.end; + + cput = MPI_WTIME() + Tnewton = Tnewton + ( cput-cpuo ) + call wrtend + cpuo = MPI_WTIME() + ! write restart file; save geometry to ext.end; endif ! end of if( myid.eq.0 ); - WCALL( newton, write_convergence_output, ( nDcalls, ForceErr ) ) ! save iRbc, iZbs consistent with position; + + cput = MPI_WTIME() + Tnewton = Tnewton + ( cput-cpuo ) + call write_convergence_output( nDcalls, ForceErr ) + cpuo = MPI_WTIME() + ! save iRbc, iZbs consistent with position; !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -518,7 +684,12 @@ subroutine fcn1( NGdof, xx, fvec, irevcm ) LComputeDerivatives = .false. LComputeAxis = .true. - WCALL( newton, dforce, ( NGdof, position(0:NGdof), force(0:NGdof), LComputeDerivatives, LComputeAxis ) ) ! calculate the force-imbalance; + + cput = MPI_WTIME() + Tnewton = Tnewton + ( cput-cpuo ) + call dforce( NGdof, position(0:NGdof), force(0:NGdof), LComputeDerivatives, LComputeAxis ) + cpuo = MPI_WTIME() + ! calculate the force-imbalance; fvec(1:NGdof) = force(1:NGdof) @@ -526,7 +697,13 @@ subroutine fcn1( NGdof, xx, fvec, irevcm ) case default - FATAL( fcn1 , .true., illegal irevcm : C05P*F error ) + + if( .true. ) then + write(6,'("fcn1 : fatal : myid=",i3," ; .true. ; illegal irevcm : C05P*F error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "fcn1 : .true. : illegal irevcm : C05P*F error ;" + endif + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -539,7 +716,12 @@ subroutine fcn1( NGdof, xx, fvec, irevcm ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - RETURN(newton) + +9999 continue + cput = MPI_WTIME() + Tnewton = Tnewton + ( cput-cpuo ) + return + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -558,7 +740,7 @@ end subroutine fcn1 !> @param[in] Ldfjac !> @param[in] irevcm subroutine fcn2( NGdof, xx, fvec, fjac, Ldfjac, irevcm ) - + use mod_kinds, only: wp => dp !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! use constants, only : zero, one, two, ten @@ -589,19 +771,35 @@ subroutine fcn2( NGdof, xx, fvec, fjac, Ldfjac, irevcm ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS - INTEGER, intent(in) :: NGdof, Ldfjac, irevcm - REAL , intent(in) :: xx(1:NGdof) - REAL , intent(out) :: fvec(1:NGdof), fjac(1:Ldfjac,1:NGdof) +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + - REAL :: position(0:NGdof), force(0:NGdof) + integer, intent(in) :: NGdof, Ldfjac, irevcm + real(wp) , intent(in) :: xx(1:NGdof) + real(wp) , intent(out) :: fvec(1:NGdof), fjac(1:Ldfjac,1:NGdof) + + real(wp) :: position(0:NGdof), force(0:NGdof) LOGICAL :: LComputeDerivatives, Lonlysolution, LComputeAxis - INTEGER :: idof, jdof, ijdof, ireadhessian, igdof, lvol, ii, imn - CHARACTER :: pack + integer :: idof, jdof, ijdof, ireadhessian, igdof, lvol, ii, imn + character :: pack + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif - BEGIN(newton) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -618,12 +816,17 @@ subroutine fcn2( NGdof, xx, fvec, fjac, Ldfjac, irevcm ) pack = 'U' ! unpack geometrical degrees of freedom; LComputeAxis = .true. LComputeDerivatives = .false. - WCALL( newton, packxi, ( NGdof, position(0:NGdof), Mvol, mn, iRbc(1:mn,0:Mvol), iZbs(1:mn,0:Mvol), & - iRbs(1:mn,0:Mvol), iZbc(1:mn,0:Mvol), pack, LComputeDerivatives, LComputeAxis ) ) + + cput = MPI_WTIME() + Tnewton = Tnewton + ( cput-cpuo ) + call packxi( NGdof, position(0:NGdof), Mvol, mn, iRbc(1:mn,0:Mvol), iZbs(1:mn,0:Mvol), & + iRbs(1:mn,0:Mvol), iZbc(1:mn,0:Mvol), pack, LComputeDerivatives, LComputeAxis ) + cpuo = MPI_WTIME() + if( myid.eq.0 ) then - cput = GETTIME + cput = MPI_WTIME() ; write(ounit,1000) cput-cpus, nFcalls, nDcalls, ForceErr, cput-lastcpu, "|BB|e", alog10(BBe(1:min(Mvol-1,28))) if( Igeometry.ge.3 ) then ! include spectral constraints; @@ -635,13 +838,23 @@ subroutine fcn2( NGdof, xx, fvec, fjac, Ldfjac, irevcm ) write(ounit,1001) "|II|e", alog10(IIe(1:min(Mvol-1,28))) endif endif - lastcpu = GETTIME + lastcpu = MPI_WTIME() - WCALL( newton, wrtend ) ! write restart file; save geometry to ext.end; + + cput = MPI_WTIME() + Tnewton = Tnewton + ( cput-cpuo ) + call wrtend + cpuo = MPI_WTIME() + ! write restart file; save geometry to ext.end; endif ! end of if( myid.eq.0 ); - WCALL( newton, write_convergence_output, ( nDcalls, ForceErr ) ) ! save iRbc, iZbs consistent with position; + + cput = MPI_WTIME() + Tnewton = Tnewton + ( cput-cpuo ) + call write_convergence_output( nDcalls, ForceErr ) + cpuo = MPI_WTIME() + ! save iRbc, iZbs consistent with position; !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -651,7 +864,12 @@ subroutine fcn2( NGdof, xx, fvec, fjac, Ldfjac, irevcm ) LComputeDerivatives = .false. LComputeAxis = .true. - WCALL( newton, dforce, ( NGdof, position(0:NGdof), force(0:NGdof), LComputeDerivatives, LComputeAxis ) ) ! calculate the force-imbalance; + + cput = MPI_WTIME() + Tnewton = Tnewton + ( cput-cpuo ) + call dforce( NGdof, position(0:NGdof), force(0:NGdof), LComputeDerivatives, LComputeAxis ) + cpuo = MPI_WTIME() + ! calculate the force-imbalance; fvec(1:NGdof) = force(1:NGdof) @@ -660,7 +878,13 @@ subroutine fcn2( NGdof, xx, fvec, fjac, Ldfjac, irevcm ) case( 2 ) ! before re-entry to C05PDF, fjac must contain the derivatives; #ifdef DEBUG - FATAL( newton, .not.Lhessianallocated, need to allocate hessian ) + + if( .not.Lhessianallocated ) then + write(6,'("newton : fatal : myid=",i3," ; .not.Lhessianallocated ; need to allocate hessian ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "newton : .not.Lhessianallocated : need to allocate hessian ;" + endif + #endif nDcalls = nDcalls + 1 @@ -669,10 +893,14 @@ subroutine fcn2( NGdof, xx, fvec, fjac, Ldfjac, irevcm ) if( myid.eq.0 ) call writereadgf( 'R', NGdof, ireadhessian ) ! reads derivatives matrix from file; - IlBCAST( ireadhessian, 1, 0 ) + + call MPI_BCAST( ireadhessian, 1, MPI_INTEGER, 0 , MPI_COMM_SPEC, ierr ) + if( ireadhessian.eq.1 ) then ! derivative matrix has been read from file; - RlBCAST( hessian(1:NGdof,1:NGdof), NGdof*NGdof, 0 ) + + call MPI_BCAST(hessian(1:NGdof,1:NGdof),NGdof*NGdof,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + endif else ! matches if( LreadGF .and. nDcalls.eq.1 ) then; @@ -685,10 +913,21 @@ subroutine fcn2( NGdof, xx, fvec, fjac, Ldfjac, irevcm ) LComputeDerivatives = .true. LComputeAxis = .true. - WCALL( newton, dforce, ( NGdof, position(0:NGdof), force(0:NGdof), LComputeDerivatives, LComputeAxis ) ) ! calculate the force-imbalance; + + cput = MPI_WTIME() + Tnewton = Tnewton + ( cput-cpuo ) + call dforce( NGdof, position(0:NGdof), force(0:NGdof), LComputeDerivatives, LComputeAxis ) + cpuo = MPI_WTIME() + ! calculate the force-imbalance; #ifdef DEBUG - FATAL( newton, Lcheck.eq.4, derivatives of Beltrami field have been computed ) + + if( Lcheck.eq.4 ) then + write(6,'("newton : fatal : myid=",i3," ; Lcheck.eq.4 ; derivatives of Beltrami field have been computed ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "newton : Lcheck.eq.4 : derivatives of Beltrami field have been computed ;" + endif + #endif endif @@ -704,14 +943,26 @@ subroutine fcn2( NGdof, xx, fvec, fjac, Ldfjac, irevcm ) stop "newton : : myid= ; volume derivatives have been compared ;" endif - FATAL( newton, Lcheck.eq.3, volume derivatives have been compared ) ! the first process will terminate all processes; + + if( Lcheck.eq.3 ) then + write(6,'("newton : fatal : myid=",i3," ; Lcheck.eq.3 ; volume derivatives have been compared ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "newton : Lcheck.eq.3 : volume derivatives have been compared ;" + endif + ! the first process will terminate all processes; if( (Lcheck.eq.4) .and. (nDcalls.ne.1) ) then write(ounit,'("newton : ", 10x ," : myid=",i3," ; field derivatives have been compared ;")') myid stop "newton : : myid= ; field derivatives have been compared ;" endif - FATAL( newton, (Lcheck.eq.4) .and. (nDcalls.ne.1), field derivatives have been compared ) ! the first process will terminate all processes; + + if( (Lcheck.eq.4) .and. (nDcalls.ne.1) ) then + write(6,'("newton : fatal : myid=",i3," ; (Lcheck.eq.4) .and. (nDcalls.ne.1) ; field derivatives have been compared ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "newton : (Lcheck.eq.4) .and. (nDcalls.ne.1) : field derivatives have been compared ;" + endif + ! the first process will terminate all processes; #endif @@ -719,7 +970,13 @@ subroutine fcn2( NGdof, xx, fvec, fjac, Ldfjac, irevcm ) case default - FATAL( fcn2 , .true., illegal irevcm : hybrj error ) + + if( .true. ) then + write(6,'("fcn2 : fatal : myid=",i3," ; .true. ; illegal irevcm : hybrj error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "fcn2 : .true. : illegal irevcm : hybrj error ;" + endif + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -732,7 +989,12 @@ subroutine fcn2( NGdof, xx, fvec, fjac, Ldfjac, irevcm ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - RETURN(newton) + +9999 continue + cput = MPI_WTIME() + Tnewton = Tnewton + ( cput-cpuo ) + return + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! diff --git a/src/numrec.F90 b/src/numrec.F90 new file mode 100644 index 00000000..dde3f4bb --- /dev/null +++ b/src/numrec.F90 @@ -0,0 +1,331 @@ +!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! + +!title (numerics) ! Some miscellaneous numerical routines. + +!latex \briefly{miscellaneous ``numerical'' routines} + +!l tex \calledby{\link{}} +!l tex \calls{\link{}} + +!latex \tableofcontents + +!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! + +!latex \subsection{Outline} + +!latex This file contains various miscellaneous ``numerical'' routines as described below. + +!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! + +!l tex \begin{itemize} + +!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! + +!l tex \item \type{gi00aa} + +!subroutine gi00aa( ii, jj, ig ) ! not used; SRH: 27 Feb 18; +! +! implicit none +! +! INTEGER, intent(in) :: ii,jj +! INTEGER, intent(out) :: ig +! +! if( ( ii.eq.1 .and. jj.eq.1 ) ) ig = 1 +! if( ( ii.eq.1 .and. jj.eq.2 ) .or. ( ii.eq.2 .and. jj.eq.1 ) ) ig = 2 +! if( ( ii.eq.1 .and. jj.eq.3 ) .or. ( ii.eq.3 .and. jj.eq.1 ) ) ig = 3 +! if( ( ii.eq.2 .and. jj.eq.2 ) ) ig = 4 +! if( ( ii.eq.2 .and. jj.eq.3 ) .or. ( ii.eq.3 .and. jj.eq.2 ) ) ig = 5 +! if( ( ii.eq.3 .and. jj.eq.3 ) ) ig = 6 +! +! return +! +!end subroutine gi00aa + +!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! + +!latex \subsection{\type{gi00ab}} + +!latex \begin{enumerate} + +!latex \item This routine assigns the Fourier mode labels that converts a double-sum into a single sum; i.e., the $m_j$ and $n_j$ are assigned where +!latex \be f(\t,\z) & = & \sum_{n=0}^{N} f_{0,n}\cos(-n \, N_P \, \z) +!latex + \sum_{m=1}^{M} \sum_{n=-N}^{N} f_{m,n}\cos(m\t-n \, N_P \, \z) \\ +!latex & = & \sum_j f_j \cos(m_j\t-n_j\z), \label{eq:condensedFourierrepresentation} +!latex \ee +!latex where $N\equiv $ \type{Ntor} and $M\equiv $ \type{Mpol} are given on input, and $N_P \equiv $ \type{Nfp} is the field periodicity. + +!latex \end{enumerate} + +subroutine gi00ab( Mpol, Ntor, Nfp, mn, im, in ) + use mod_kinds, only: wp => dp + implicit none + + integer, intent(in) :: Mpol, Ntor, Nfp, mn + integer, intent(out) :: im(mn), in(mn) + + integer :: imn, mm, nn + + imn = 0 + + ; mm = 0 + ;do nn = 0, Ntor + ; imn = imn+1 ; im(imn) = mm ; in(imn) = nn*Nfp + ;enddo + ; + + do mm = 1, Mpol + do nn = -Ntor, Ntor + imn = imn+1 ; im(imn) = mm ; in(imn) = nn*Nfp + enddo + enddo + + return + +end subroutine gi00ab + +!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! + +subroutine getimn(Mpol, Ntor, Nfp, mi, ni, idx) + use mod_kinds, only: wp => dp + ! convert m and n to index + implicit none + integer, intent(in) :: Mpol, Ntor, Nfp, mi, ni + integer, intent(out) :: idx + + if (mi.gt.Mpol .or. mi.lt.0 .or. ni.gt.Ntor*Nfp .or. ni.lt.-Ntor*Nfp ) then + idx = 0 + elseif (mi .eq. 0) then + idx = 1 + ni / Nfp + else + idx = 1 + Ntor + (2 * Ntor + 1) * (mi - 1) + (ni / Nfp + Ntor + 1) + end if + +end subroutine getimn + +!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! + +!latex \subsection{\type{tfft}} + +!latex \begin{enumerate} + +!latex \item This constructs the ``forward'' Fourier transform. + +!latex \item Given a set of data, $(f_{i},g_{i})$ for $i = 1, \dots N_\theta N_\zeta$, on a regular two-dimensional angle grid, +!latex where $\theta_j = 2 \pi j / N_\theta$ for $j = 0, N_\theta-1$, and +!latex $\zeta_k = 2 \pi k / N_\zeta $ for $k = 0, N_\zeta -1$. +!latex The ``packing'' is governed by $i = 1 + j + k N_\theta$. +!latex The ``discrete'' resolution is $N_\theta \equiv $ \type{Nt}, $N_\zeta \equiv $ \type{Nz} and \type{Ntz} $=$ \type{Nt} $\times$ \type{Nz}, +!latex which are set in \link{preset}. +!latex \item The Fourier harmonics consistent with \Eqn{condensedFourierrepresentation} are constructed. +!latex The mode identification labels appearing in \Eqn{condensedFourierrepresentation} are $m_j \equiv $ \type{im(j)} and $n_j \equiv $ \type{in(j)}, +!latex which are set in \link{global} via a call to \type{gi00ab}. + +!latex \end{enumerate} + +subroutine tfft( Nt, Nz, ijreal, ijimag, mn, im, in, efmn, ofmn, cfmn, sfmn, ifail ) + use mod_kinds, only: wp => dp + use constants, only : half, zero, pi2 + + use fileunits, only : ounit + + use inputlist, only : Nfp + use allglobal, only : pi2nfp + + use fftw_interface +#ifdef OPENMP + use OMP_LIB +#endif + implicit none + + intrinsic aimag + + integer :: Nt, Nz, mn, im(1:mn), in(1:mn), Ntz, imn, ifail, mm, nn + real(wp) :: ijreal(1:Nt*Nz), ijimag(1:Nt*Nz), efmn(1:mn), ofmn(1:mn), cfmn(1:mn), sfmn(1:mn) + + LOGICAL :: Lcheck = .false. + integer :: jj, kk, ithread + !REAL :: jireal(1:Nt*Nz), jiimag(1:Nt*Nz), arg, ca, sa + real(wp) :: arg, ca, sa + COMPLEX(C_DOUBLE_COMPLEX) :: z1, z2, z3 + + +#ifdef OPENMP + ithread = omp_get_thread_num() + 1 +#else + ithread = 1 +#endif + + !if( Lcheck ) then ; jireal = ijreal ; jiimag = ijimag + !endif + + do jj = 1, Nz ; cplxin(:,jj,ithread) = CMPLX( ijreal((jj-1)*Nt+1:jj*Nt), ijimag((jj-1)*Nt+1:jj*Nt), KIND=C_DOUBLE_COMPLEX ) + enddo + + call fftw_execute_dft( planf, cplxin(:,:,ithread), cplxout(:,:,ithread) ) !Forward transform + Ntz = Nt * Nz + cplxout(:,:,ithread) = cplxout(:,:,ithread) / Ntz + cplxout(1,1,ithread) = half*cplxout(1,1,ithread) + + do imn = 1, mn + mm = im(imn); nn = in(imn) / Nfp + + z1 = cplxout(1 + MOD(Nt - mm, Nt), 1 + MOD(Nz + nn, Nz),ithread) + z2 = cplxout(1 + mm, 1 + MOD(Nz - nn, Nz),ithread) + + z3 = z1 + z2 + efmn(imn) = real(z3); cfmn(imn) = aimag(z3) + + z3 = z1 - z2 + ofmn(imn) = aimag(z3); sfmn(imn) = -real(z3) + enddo + + if( .not.Lcheck ) return + + ijreal(1:Ntz) = zero ; ijimag(1:Ntz) = zero + + do jj = 0, Nt-1 + + do kk = 0, Nz-1 + + do imn = 1, mn ; arg = im(imn) * jj * pi2 / Nt - in(imn) * kk * pi2nfp / Nz ; ca = cos(arg) ; sa = sin(arg) + + ijreal(1+jj+kk*Nt) = ijreal(1+jj+kk*Nt) + efmn(imn) * ca + ofmn(imn) * sa + ijimag(1+jj+kk*Nt) = ijimag(1+jj+kk*Nt) + cfmn(imn) * ca + sfmn(imn) * sa + + enddo + enddo + enddo + + !write(ounit,'("tfft : ",10x," : Fourier reconstruction error =",2es15.5," ;")') sqrt(sum((ijreal-jireal)**2)/Ntz), sqrt(sum((ijimag-jiimag)**2)/Ntz) + + return + +end subroutine tfft + +!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! + +!latex \subsection{\type{invfft}} + +!latex \begin{enumerate} + +!latex \item Given the Fourier harmonics, the data on a regular angular grid are constructed. + +!latex \item This is the inverse routine to \type{tfft}. + +!latex \end{enumerate} + +subroutine invfft( mn, im, in, efmn, ofmn, cfmn, sfmn, Nt, Nz, ijreal, ijimag ) + use mod_kinds, only: wp => dp + use constants, only : zero, two, half + use inputlist, only : Nfp + use fftw_interface +#ifdef OPENMP + use OMP_LIB +#endif + + implicit none + + integer, intent(in) :: mn, im(mn), in(mn) + real(wp) , intent(in) :: efmn(mn), ofmn(mn), cfmn(mn), sfmn(mn) + integer, intent(in) :: Nt, Nz + real(wp) , intent(out) :: ijreal(Nt*Nz), ijimag(Nt*Nz) ! output real space; + + integer :: imn, jj, mm, nn, ithread + + +#ifdef OPENMP + ithread = omp_get_thread_num() + 1 +#else + ithread = 1 +#endif + + + cplxin(:,:,ithread) = zero + + !Copy real arrays to complex + do imn = 1,mn ; mm = im(imn) ; nn = in(imn) / Nfp + cplxin(1 + MOD(Nt - mm, Nt), 1 + MOD(Nz + nn, Nz),ithread) = & + half * CMPLX(efmn(imn) - sfmn(imn), cfmn(imn) + ofmn(imn), KIND=C_DOUBLE_COMPLEX) + cplxin(1 + mm, 1 + MOD(Nz - nn, Nz),ithread) = & + half * CMPLX(efmn(imn) + sfmn(imn), cfmn(imn) - ofmn(imn), KIND=C_DOUBLE_COMPLEX) + enddo + cplxin(1,1,ithread) = two*cplxin(1,1,ithread) + + call fftw_execute_dft(planb, cplxin(:,:,ithread), cplxout(:,:,ithread)) !Inverse transform + + !Copy complex result back to real arrays + do jj=1,Nz + ijreal((jj-1)*Nt+1:jj*Nt) = real(cplxout(:,jj,ithread)) + ijimag((jj-1)*Nt+1:jj*Nt) = aimag(cplxout(:,jj,ithread)) + enddo + + return + +end subroutine invfft + +!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! + +!latex \subsection{\type{gauleg}} + +!latex \begin{enumerate} + +!latex \item Compute Gaussian integration weights and abscissae. + +!latex \item From Numerical Recipes. + +!latex \end{enumerate} + +subroutine gauleg( n, weight, abscis, ifail ) + use mod_kinds, only: wp => dp + use constants, only : zero, one, two, pi + + implicit none + + intrinsic abs, cos, epsilon + + integer, intent(in) :: n + real(wp), dimension(n), intent(out) :: weight, abscis + integer, intent(out) :: ifail + + integer, parameter :: maxiter=16 + integer :: m, j, i, irefl, iter + real(wp) :: z1,z,pp,p3,p2,p1 + real(wp), parameter :: eps = epsilon(z) + + !Error checking + if( n < 1 ) then ; ifail = 2 ; return + endif + + m = (n + 1)/2 !Roots are symmetric in interval, so we only need half + do i=1,m !Loop over desired roots + irefl = n + 1 - i + if (i .ne. irefl) then + z = cos(pi*(i - 0.25)/(n + 0.5)) ! Approximate ith root + else !For an odd number of abscissae, the center must be at zero by symmetry. + z = 0.0 + endif + + !Refine by Newton method + do iter=1,maxiter + p1 = one; p2 = zero ! Initialize recurrence relation + + do j=1,n !Recurrence relation to get P(x) + p3 = p2; p2 = p1 + p1 = ((two*j - one)*z*p2 - (j - one)*p3)/j + enddo !j + + pp = n*(z*p1 - p2)/(z*z - one) !Derivative of P(x) + z1 = z; z = z1 - p1/pp !Newton iteration + if (abs(z - z1) .le. eps) exit !Convergence test + enddo !iter + if (iter > maxiter) then + ifail = 1; return + endif + + abscis(i) = -z; abscis(irefl) = z + weight(i) = two/((one - z*z)*pp*pp) + weight(irefl) = weight(i) + enddo !i + + ifail = 0 +end subroutine gauleg diff --git a/src/numrec.f90 b/src/numrec.f90 deleted file mode 100644 index b1640e33..00000000 --- a/src/numrec.f90 +++ /dev/null @@ -1,720 +0,0 @@ -!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - -!title (numerics) ! Some miscellaneous numerical routines. - -!latex \briefly{miscellaneous ``numerical'' routines} - -!l tex \calledby{\link{}} -!l tex \calls{\link{}} - -!latex \tableofcontents - -!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - -!latex \subsection{Outline} - -!latex This file contains various miscellaneous ``numerical'' routines as described below. - -!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - -!l tex \begin{itemize} - -!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - -!l tex \item \type{gi00aa} - -!subroutine gi00aa( ii, jj, ig ) ! not used; SRH: 27 Feb 18; -! -! implicit none -! -! INTEGER, intent(in) :: ii,jj -! INTEGER, intent(out) :: ig -! -! if( ( ii.eq.1 .and. jj.eq.1 ) ) ig = 1 -! if( ( ii.eq.1 .and. jj.eq.2 ) .or. ( ii.eq.2 .and. jj.eq.1 ) ) ig = 2 -! if( ( ii.eq.1 .and. jj.eq.3 ) .or. ( ii.eq.3 .and. jj.eq.1 ) ) ig = 3 -! if( ( ii.eq.2 .and. jj.eq.2 ) ) ig = 4 -! if( ( ii.eq.2 .and. jj.eq.3 ) .or. ( ii.eq.3 .and. jj.eq.2 ) ) ig = 5 -! if( ( ii.eq.3 .and. jj.eq.3 ) ) ig = 6 -! -! return -! -!end subroutine gi00aa - -!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - -!latex \subsection{\type{gi00ab}} - -!latex \begin{enumerate} - -!latex \item This routine assigns the Fourier mode labels that converts a double-sum into a single sum; i.e., the $m_j$ and $n_j$ are assigned where -!latex \be f(\t,\z) & = & \sum_{n=0}^{N} f_{0,n}\cos(-n \, N_P \, \z) -!latex + \sum_{m=1}^{M} \sum_{n=-N}^{N} f_{m,n}\cos(m\t-n \, N_P \, \z) \\ -!latex & = & \sum_j f_j \cos(m_j\t-n_j\z), \label{eq:condensedFourierrepresentation} -!latex \ee -!latex where $N\equiv $ \type{Ntor} and $M\equiv $ \type{Mpol} are given on input, and $N_P \equiv $ \type{Nfp} is the field periodicity. - -!latex \end{enumerate} - -subroutine gi00ab( Mpol, Ntor, Nfp, mn, im, in ) - - implicit none - - INTEGER, intent(in) :: Mpol, Ntor, Nfp, mn - INTEGER, intent(out) :: im(mn), in(mn) - - INTEGER :: imn, mm, nn - - imn = 0 - - ; mm = 0 - ;do nn = 0, Ntor - ; imn = imn+1 ; im(imn) = mm ; in(imn) = nn*Nfp - ;enddo - ; - - do mm = 1, Mpol - do nn = -Ntor, Ntor - imn = imn+1 ; im(imn) = mm ; in(imn) = nn*Nfp - enddo - enddo - - return - -end subroutine gi00ab - -!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - -subroutine getimn(Mpol, Ntor, Nfp, mi, ni, idx) - ! convert m and n to index - implicit none - integer, intent(in) :: Mpol, Ntor, Nfp, mi, ni - integer, intent(out) :: idx - - if (mi.gt.Mpol .or. mi.lt.0 .or. ni.gt.Ntor*Nfp .or. ni.lt.-Ntor*Nfp ) then - idx = 0 - elseif (mi .eq. 0) then - idx = 1 + ni / Nfp - else - idx = 1 + Ntor + (2 * Ntor + 1) * (mi - 1) + (ni / Nfp + Ntor + 1) - end if - -end subroutine getimn - -!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - -!latex \subsection{\type{tfft}} - -!latex \begin{enumerate} - -!latex \item This constructs the ``forward'' Fourier transform. - -!latex \item Given a set of data, $(f_{i},g_{i})$ for $i = 1, \dots N_\theta N_\zeta$, on a regular two-dimensional angle grid, -!latex where $\theta_j = 2 \pi j / N_\theta$ for $j = 0, N_\theta-1$, and -!latex $\zeta_k = 2 \pi k / N_\zeta $ for $k = 0, N_\zeta -1$. -!latex The ``packing'' is governed by $i = 1 + j + k N_\theta$. -!latex The ``discrete'' resolution is $N_\theta \equiv $ \type{Nt}, $N_\zeta \equiv $ \type{Nz} and \type{Ntz} $=$ \type{Nt} $\times$ \type{Nz}, -!latex which are set in \link{preset}. -!latex \item The Fourier harmonics consistent with \Eqn{condensedFourierrepresentation} are constructed. -!latex The mode identification labels appearing in \Eqn{condensedFourierrepresentation} are $m_j \equiv $ \type{im(j)} and $n_j \equiv $ \type{in(j)}, -!latex which are set in \link{global} via a call to \type{gi00ab}. - -!latex \end{enumerate} - -subroutine tfft( Nt, Nz, ijreal, ijimag, mn, im, in, efmn, ofmn, cfmn, sfmn, ifail ) - - use constants, only : half, zero, pi2 - - use fileunits, only : ounit - - use inputlist, only : Nfp - use allglobal, only : pi2nfp - - use fftw_interface -#ifdef OPENMP - use OMP_LIB -#endif - implicit none - - intrinsic aimag - - INTEGER :: Nt, Nz, mn, im(1:mn), in(1:mn), Ntz, imn, ifail, mm, nn - REAL :: ijreal(1:Nt*Nz), ijimag(1:Nt*Nz), efmn(1:mn), ofmn(1:mn), cfmn(1:mn), sfmn(1:mn) - - LOGICAL :: Lcheck = .false. - INTEGER :: jj, kk, ithread - !REAL :: jireal(1:Nt*Nz), jiimag(1:Nt*Nz), arg, ca, sa - REAL :: arg, ca, sa - COMPLEX(C_DOUBLE_COMPLEX) :: z1, z2, z3 - - GETTHREAD - !if( Lcheck ) then ; jireal = ijreal ; jiimag = ijimag - !endif - - do jj = 1, Nz ; cplxin(:,jj,ithread) = CMPLX( ijreal((jj-1)*Nt+1:jj*Nt), ijimag((jj-1)*Nt+1:jj*Nt), KIND=C_DOUBLE_COMPLEX ) - enddo - - call fftw_execute_dft( planf, cplxin(:,:,ithread), cplxout(:,:,ithread) ) !Forward transform - Ntz = Nt * Nz - cplxout(:,:,ithread) = cplxout(:,:,ithread) / Ntz - cplxout(1,1,ithread) = half*cplxout(1,1,ithread) - - do imn = 1, mn - mm = im(imn); nn = in(imn) / Nfp - - z1 = cplxout(1 + MOD(Nt - mm, Nt), 1 + MOD(Nz + nn, Nz),ithread) - z2 = cplxout(1 + mm, 1 + MOD(Nz - nn, Nz),ithread) - - z3 = z1 + z2 - efmn(imn) = real(z3); cfmn(imn) = aimag(z3) - - z3 = z1 - z2 - ofmn(imn) = aimag(z3); sfmn(imn) = -real(z3) - enddo - - if( .not.Lcheck ) return - - ijreal(1:Ntz) = zero ; ijimag(1:Ntz) = zero - - do jj = 0, Nt-1 - - do kk = 0, Nz-1 - - do imn = 1, mn ; arg = im(imn) * jj * pi2 / Nt - in(imn) * kk * pi2nfp / Nz ; ca = cos(arg) ; sa = sin(arg) - - ijreal(1+jj+kk*Nt) = ijreal(1+jj+kk*Nt) + efmn(imn) * ca + ofmn(imn) * sa - ijimag(1+jj+kk*Nt) = ijimag(1+jj+kk*Nt) + cfmn(imn) * ca + sfmn(imn) * sa - - enddo - enddo - enddo - - !write(ounit,'("tfft : ",10x," : Fourier reconstruction error =",2es15.5," ;")') sqrt(sum((ijreal-jireal)**2)/Ntz), sqrt(sum((ijimag-jiimag)**2)/Ntz) - - return - -end subroutine tfft - -!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - -!latex \subsection{\type{invfft}} - -!latex \begin{enumerate} - -!latex \item Given the Fourier harmonics, the data on a regular angular grid are constructed. - -!latex \item This is the inverse routine to \type{tfft}. - -!latex \end{enumerate} - -subroutine invfft( mn, im, in, efmn, ofmn, cfmn, sfmn, Nt, Nz, ijreal, ijimag ) - - use constants, only : zero, two, half - use inputlist, only : Nfp - use fftw_interface -#ifdef OPENMP - use OMP_LIB -#endif - - implicit none - - INTEGER, intent(in) :: mn, im(mn), in(mn) - REAL , intent(in) :: efmn(mn), ofmn(mn), cfmn(mn), sfmn(mn) - INTEGER, intent(in) :: Nt, Nz - REAL , intent(out) :: ijreal(Nt*Nz), ijimag(Nt*Nz) ! output real space; - - INTEGER :: imn, jj, mm, nn, ithread - - GETTHREAD - - cplxin(:,:,ithread) = zero - - !Copy real arrays to complex - do imn = 1,mn ; mm = im(imn) ; nn = in(imn) / Nfp - cplxin(1 + MOD(Nt - mm, Nt), 1 + MOD(Nz + nn, Nz),ithread) = & - half * CMPLX(efmn(imn) - sfmn(imn), cfmn(imn) + ofmn(imn), KIND=C_DOUBLE_COMPLEX) - cplxin(1 + mm, 1 + MOD(Nz - nn, Nz),ithread) = & - half * CMPLX(efmn(imn) + sfmn(imn), cfmn(imn) - ofmn(imn), KIND=C_DOUBLE_COMPLEX) - enddo - cplxin(1,1,ithread) = two*cplxin(1,1,ithread) - - call fftw_execute_dft(planb, cplxin(:,:,ithread), cplxout(:,:,ithread)) !Inverse transform - - !Copy complex result back to real arrays - do jj=1,Nz - ijreal((jj-1)*Nt+1:jj*Nt) = real(cplxout(:,jj,ithread)) - ijimag((jj-1)*Nt+1:jj*Nt) = aimag(cplxout(:,jj,ithread)) - enddo - - return - -end subroutine invfft - -!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - -!latex \subsection{\type{gauleg}} - -!latex \begin{enumerate} - -!latex \item Compute Gaussian integration weights and abscissae. - -!latex \item From Numerical Recipes. - -!latex \end{enumerate} - -subroutine gauleg( n, weight, abscis, ifail ) - - use constants, only : zero, one, two, pi - - implicit none - - intrinsic abs, cos, epsilon - - INTEGER, intent(in) :: n - REAL, dimension(n), intent(out) :: weight, abscis - INTEGER, intent(out) :: ifail - - INTEGER, parameter :: maxiter=16 - INTEGER :: m, j, i, irefl, iter - REAL :: z1,z,pp,p3,p2,p1 - REAL, parameter :: eps = epsilon(z) - - !Error checking - if( n < 1 ) then ; ifail = 2 ; return - endif - - m = (n + 1)/2 !Roots are symmetric in interval, so we only need half - do i=1,m !Loop over desired roots - irefl = n + 1 - i - if (i .ne. irefl) then - z = cos(pi*(i - 0.25)/(n + 0.5)) ! Approximate ith root - else !For an odd number of abscissae, the center must be at zero by symmetry. - z = 0.0 - endif - - !Refine by Newton method - do iter=1,maxiter - p1 = one; p2 = zero ! Initialize recurrence relation - - do j=1,n !Recurrence relation to get P(x) - p3 = p2; p2 = p1 - p1 = ((two*j - one)*z*p2 - (j - one)*p3)/j - enddo !j - - pp = n*(z*p1 - p2)/(z*z - one) !Derivative of P(x) - z1 = z; z = z1 - p1/pp !Newton iteration - if (abs(z - z1) .le. eps) exit !Convergence test - enddo !iter - if (iter > maxiter) then - ifail = 1; return - endif - - abscis(i) = -z; abscis(irefl) = z - weight(i) = two/((one - z*z)*pp*pp) - weight(irefl) = weight(i) - enddo !i - - ifail = 0 -end subroutine gauleg - -!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - -!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - -#ifdef DELETETHIS - -!l tex \subsection{\type{svdcmp}} ! not used; SRH: 27 Feb 18; - -subroutine svdcmp(a,m,n,mp,np,w,v) - use constants,only:zero,one - - implicit none - integer nMaX,M,n,MP,nP,i,j,jj,k,l,its,nM - parameter (nMaX=500) - REAL :: a(MP,nP),w(nP),v(nP,nP),rv1(nMaX) - REAL :: c,F,g,H,s,X,Y,Z,scale,anorM,pythag,oone - - !stop "svdcmp : to be deleted?" - - g=zero - scale=zero - anorm=zero - do 25 i=1,n - l=i+1 - rv1(i)=scale*g - g=zero - s=zero - scale=zero - if(i.le.m)then - do 11 k=i,m - scale=scale+abs(a(k,i)) -11 continue - if(scale.ne.zero)then - do 12 k=i,m - a(k,i)=a(k,i)/scale - s=s+a(k,i)*a(k,i) -12 continue - f=a(i,i) - g=-sign(sqrt(s),f) - h=f*g-s - a(i,i)=f-g - do 15 j=l,n - s=zero - do 13 k=i,m - s=s+a(k,i)*a(k,j) -13 continue - f=s/h - do 14 k=i,m - a(k,j)=a(k,j)+f*a(k,i) -14 continue -15 continue - do 16 k=i,m - a(k,i)=scale*a(k,i) -16 continue - endif - endif - w(i)=scale *g - g=zero - s=zero - scale=zero - if((i.le.m).and.(i.ne.n))then - do 17 k=l,n - scale=scale+abs(a(i,k)) -17 continue - if(scale.ne.zero)then - do 18 k=l,n - a(i,k)=a(i,k)/scale - s=s+a(i,k)*a(i,k) -18 continue - f=a(i,l) - g=-sign(sqrt(s),f) - h=f*g-s - a(i,l)=f-g - do 19 k=l,n - rv1(k)=a(i,k)/h -19 continue - do 23 j=l,m - s=zero - do 21 k=l,n - s=s+a(j,k)*a(i,k) -21 continue - do 22 k=l,n - a(j,k)=a(j,k)+s*rv1(k) -22 continue -23 continue - do 24 k=l,n - a(i,k)=scale*a(i,k) -24 continue - endif - endif - anorm=max(anorm,(abs(w(i))+abs(rv1(i)))) -25 continue - do 32 i=n,1,-1 - if(i.lt.n)then - if(g.ne.zero)then - do 26 j=l,n - v(j,i)=(a(i,j)/a(i,l))/g -26 continue - do 29 j=l,n - s=zero - do 27 k=l,n - s=s+a(i,k)*v(k,j) -27 continue - do 28 k=l,n - v(k,j)=v(k,j)+s*v(k,i) -28 continue -29 continue - endif - do 31 j=l,n - v(i,j)=zero - v(j,i)=zero -31 continue - endif - v(i,i)=one - g=rv1(i) - l=i -32 continue - do 39 i=min(m,n),1,-1 - l=i+1 - g=w(i) - do 33 j=l,n - a(i,j)=zero -33 continue - if(g.ne.zero)then - g=one/g - do 36 j=l,n - s=zero - do 34 k=l,m - s=s+a(k,i)*a(k,j) -34 continue - f=(s/a(i,i))*g - do 35 k=i,m - a(k,j)=a(k,j)+f*a(k,i) -35 continue -36 continue - do 37 j=i,m - a(j,i)=a(j,i)*g -37 continue - else - do 38 j= i,m - a(j,i)=zero -38 continue - endif - a(i,i)=a(i,i)+one -39 continue - do 49 k=n,1,-1 - do 48 its=1,30 - do 41 l=k,1,-1 - nm=l-1 - if((abs(rv1(l))+anorm).eq.anorm) goto 2 - if((abs(w(nm))+anorm).eq.anorm) goto 1 -41 continue -1 c=zero - s=one - do 43 i=l,k - f=s*rv1(i) - rv1(i)=c*rv1(i) - if((abs(f)+anorm).eq.anorm) goto 2 - g=w(i) - h=pythag(f,g) - w(i)=h - h=one/h - c= (g*h) - s=-(f*h) - do 42 j=1,m - y=a(j,nm) - z=a(j,i) - a(j,nm)=(y*c)+(z*s) - a(j,i)=-(y*s)+(z*c) -42 continue -43 continue -2 z=w(k) - if(l.eq.k)then - if(z.lt.zero)then - w(k)=-z - do 44 j=1,n - v(j,k)=-v(j,k) -44 continue - endif - goto 3 - endif - if(its.eq.30) stop "svdcmp : no convergence" - x=w(l) - nm=k-1 - y=w(nm) - g=rv1(nm) - h=rv1(k) - f=((y-z)*(y+z)+(g-h)*(g+h))/(2.0*h*y) - oone=one - g=pythag(f,oone) - f=((x-z)*(x+z)+h*((y/(f+sign(g,f)))-h))/x - c=one - s=one - do 47 j=l,nm - i=j+1 - g=rv1(i) - y=w(i) - h=s*g - g=c*g - z=pythag(f,h) - rv1(j)=z - c=f/z - s=h/z - f= (x*c)+(g*s) - g=-(x*s)+(g*c) - h=y*s - y=y*c - do 45 jj=1,n - x=v(jj,j) - z=v(jj,i) - v(jj,j)= (x*c)+(z*s) - v(jj,i)=-(x*s)+(z*c) -45 continue - z=pythag(f,h) - w(j)=z - if(z.ne.zero)then - z=one/z - c=f*z - s=h*z - endif - f= (c*g)+(s*y) - x=-(s*g)+(c*y) - do 46 jj=1,m - y=a(jj,j) - z=a(jj,i) - a(jj,j)= (y*c)+(z*s) - a(jj,i)=-(y*s)+(z*c) -46 continue -47 continue - rv1(l)=zero - rv1(k)=f - w(k)=x -48 continue -3 continue -49 continue - return - end - -#endif - -!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - -#ifdef DELETETHIS - -!l tex \subsection{\type{pythag}} ! not used; SRH: 27 Feb 18; - -REAL function pythag(a,b) - implicit none - REAL :: a,b - REAL :: absa,absb - - !stop "pythag : to be deleted?" - - absa=abs(a) - absb=abs(b) - if(absa.gt.absb) then - pythag=absa*sqrt(1.+(absb/absa)**2) - else - if(absb.eq.0.) then - pythag=0. - else - pythag=absb*sqrt(1.+(absa/absb)**2) - endif - endif - return -end function pythag - -#endif - -!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - -#ifdef DELETETHIS - -!l tex \subsection{\type{svbksb}} ! not used; SRH: 27 Feb 18; - -subroutine svbksb(u,w,v,M,n,MP,nP,b,X) - - implicit none - integer nMaX,M,n,MP,nP,i,j,jj - parameter (nMaX=10000) - REAL, intent(in) :: b(MP) - REAL :: u(MP,nP),w(nP),v(nP,nP),X(nP),tMP(nMaX) - REAL :: s - - !stop "svbksb : to be deleted?" - - do 12 j=1,n - s=0. - if(w(j).ne.0.)then - do 11 i=1,M - s=s+u(i,j)*b(i) -11 continue - s=s/w(j) - endif - tMP(j)=s -12 continue - do 14 j=1,n - s=0. - do 13 jj=1,n - s=s+v(j,jj)*tMP(jj) -13 continue - X(j)=s -14 continue - return - end - -#endif - -!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - -#ifdef DELETETHIS - -!l tex \subsection{\type{sort}} ! not used; SRH: 27 Feb 18; - - subroutine sort(n,ra) - - implicit none - integer n,l,ir,i,j - REAL :: ra(n),rra - - !stop "sort : to be deleted?" - - if(n.eq.1) return - l=n/2+1 - ir=n -10 continue - if(l.gt.1)then - l=l-1 - rra=ra(l) - else - rra=ra(ir) - ra(ir)=ra(1) - ir=ir-1 - if(ir.eq.1)then - ra(1)=rra - return - endif - endif - i=l - j=l+l -20 if(j.le.ir)then - if(j.lt.ir)then - if(ra(j).lt.ra(j+1))j=j+1 - endif - if(rra.lt.ra(j))then - ra(i)=ra(j) - i=j - j=j+j - else - j=ir+1 - endif - goto 20 - endif - ra(i)=rra - goto 10 - end - -#endif - -!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - -#ifdef DELETETHIS - -!l tex \subsection{\type{singvalues}} ! not used; SRH: 27 Feb 18; - - subroutine singvalues(nrow,ncol,Mat,b,sx,cutoff,wsvd) ! nrow = nconstraints ; ncol = nfreedom - implicit none - INTEGER, intent(in) :: nrow,ncol - REAL,intent(in) :: Mat(nrow,ncol),b(nrow) - integer i,nev - - REAL :: Mato(nrow,ncol) - REAL :: sx(ncol) - REAL :: vsvd(ncol,ncol),wsvd(ncol),wsvdc(ncol) - REAL :: cutoff,wmax,wmin - - sx=0.0;wsvd=0.0;vsvd=0.0;wsvdc=0.0;wmax=0.0;Mato=Mat - - call svdcmp(Mato,nrow,ncol,nrow,ncol,wsvd,vsvd) - wsvdc=wsvd - call sort(ncol,wsvdc) - wmax=wsvdc(ncol) - wmin=abs(wmax)*cutoff - wsvdc=0.0;nev=0 - do i=1,ncol - if(abs(wsvd(i)).ge.wmin) then;wsvdc(i)=wsvd(i);nev=nev+1 - endif - enddo - call svbksb(Mato,wsvdc,vsvd,nrow,ncol,nrow,ncol,b,sx) - !Mat=Mato - call sort(ncol,wsvd) - return - end subroutine singvalues - -#endif - -!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - -!l tex \end{itemize} - -!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! diff --git a/src/packab.f90 b/src/packab.F90 similarity index 72% rename from src/packab.f90 rename to src/packab.F90 index b2b5ccc2..652147c8 100644 --- a/src/packab.f90 +++ b/src/packab.F90 @@ -31,7 +31,7 @@ !> @param solution !> @param ideriv subroutine packab( packorunpack, lvol, NN, solution, ideriv ) - + use mod_kinds, only: wp => dp !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! use constants, only : zero @@ -52,15 +52,31 @@ subroutine packab( packorunpack, lvol, NN, solution, ideriv ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS - CHARACTER, intent(in) :: packorunpack - INTEGER , intent(in) :: lvol, NN, ideriv - REAL :: solution(1:NN) +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + character, intent(in) :: packorunpack + integer , intent(in) :: lvol, NN, ideriv + real(wp) :: solution(1:NN) - INTEGER :: ii, ll, id, llrad + integer :: ii, ll, id, llrad + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif - BEGIN(packab) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -79,26 +95,86 @@ subroutine packab( packorunpack, lvol, NN, solution, ideriv ) if( YESstellsym ) then ; ii = 1 - do ll = 0, llrad ; id = Ate(lvol,0,ii)%i(ll) ; FATAL( packab, id.lt.1 .or. id.gt.NN, unpacking illegal subscript ) - ; ; id = Aze(lvol,0,ii)%i(ll) ; FATAL( packab, id.lt.1 .or. id.gt.NN, unpacking illegal subscript ) + do ll = 0, llrad ; id = Ate(lvol,0,ii)%i(ll) ; + if( id.lt.1 .or. id.gt.NN ) then + write(6,'("packab : fatal : myid=",i3," ; id.lt.1 .or. id.gt.NN ; unpacking illegal subscript ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "packab : id.lt.1 .or. id.gt.NN : unpacking illegal subscript ;" + endif + + ; ; id = Aze(lvol,0,ii)%i(ll) ; + if( id.lt.1 .or. id.gt.NN ) then + write(6,'("packab : fatal : myid=",i3," ; id.lt.1 .or. id.gt.NN ; unpacking illegal subscript ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "packab : id.lt.1 .or. id.gt.NN : unpacking illegal subscript ;" + endif + enddo ! end of do ll; do ii = 2, mn - do ll = 0, llrad ; id = Ate(lvol,0,ii)%i(ll) ; FATAL( packab, id.lt.1 .or. id.gt.NN, unpacking illegal subscript ) - ; ; id = Aze(lvol,0,ii)%i(ll) ; FATAL( packab, id.lt.1 .or. id.gt.NN, unpacking illegal subscript ) + do ll = 0, llrad ; id = Ate(lvol,0,ii)%i(ll) ; + if( id.lt.1 .or. id.gt.NN ) then + write(6,'("packab : fatal : myid=",i3," ; id.lt.1 .or. id.gt.NN ; unpacking illegal subscript ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "packab : id.lt.1 .or. id.gt.NN : unpacking illegal subscript ;" + endif + + ; ; id = Aze(lvol,0,ii)%i(ll) ; + if( id.lt.1 .or. id.gt.NN ) then + write(6,'("packab : fatal : myid=",i3," ; id.lt.1 .or. id.gt.NN ; unpacking illegal subscript ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "packab : id.lt.1 .or. id.gt.NN : unpacking illegal subscript ;" + endif + enddo ! end of do ll; enddo ! end of do ii; else ! NOTstellsym; ; ii = 1 - do ll = 0, llrad ; id = Ate(lvol,0,ii)%i(ll) ; FATAL( packab, id.lt.1 .or. id.gt.NN, unpacking illegal subscript ) - ; ; id = Aze(lvol,0,ii)%i(ll) ; FATAL( packab, id.lt.1 .or. id.gt.NN, unpacking illegal subscript ) + do ll = 0, llrad ; id = Ate(lvol,0,ii)%i(ll) ; + if( id.lt.1 .or. id.gt.NN ) then + write(6,'("packab : fatal : myid=",i3," ; id.lt.1 .or. id.gt.NN ; unpacking illegal subscript ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "packab : id.lt.1 .or. id.gt.NN : unpacking illegal subscript ;" + endif + + ; ; id = Aze(lvol,0,ii)%i(ll) ; + if( id.lt.1 .or. id.gt.NN ) then + write(6,'("packab : fatal : myid=",i3," ; id.lt.1 .or. id.gt.NN ; unpacking illegal subscript ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "packab : id.lt.1 .or. id.gt.NN : unpacking illegal subscript ;" + endif + enddo do ii = 2, mn - do ll = 0, llrad ; id = Ate(lvol,0,ii)%i(ll) ; FATAL( packab, id.lt.1 .or. id.gt.NN, unpacking illegal subscript ) - ; ; id = Aze(lvol,0,ii)%i(ll) ; FATAL( packab, id.lt.1 .or. id.gt.NN, unpacking illegal subscript ) - ; ; id = Ato(lvol,0,ii)%i(ll) ; FATAL( packab, id.lt.1 .or. id.gt.NN, unpacking illegal subscript ) - ; ; id = Azo(lvol,0,ii)%i(ll) ; FATAL( packab, id.lt.1 .or. id.gt.NN, unpacking illegal subscript ) + do ll = 0, llrad ; id = Ate(lvol,0,ii)%i(ll) ; + if( id.lt.1 .or. id.gt.NN ) then + write(6,'("packab : fatal : myid=",i3," ; id.lt.1 .or. id.gt.NN ; unpacking illegal subscript ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "packab : id.lt.1 .or. id.gt.NN : unpacking illegal subscript ;" + endif + + ; ; id = Aze(lvol,0,ii)%i(ll) ; + if( id.lt.1 .or. id.gt.NN ) then + write(6,'("packab : fatal : myid=",i3," ; id.lt.1 .or. id.gt.NN ; unpacking illegal subscript ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "packab : id.lt.1 .or. id.gt.NN : unpacking illegal subscript ;" + endif + + ; ; id = Ato(lvol,0,ii)%i(ll) ; + if( id.lt.1 .or. id.gt.NN ) then + write(6,'("packab : fatal : myid=",i3," ; id.lt.1 .or. id.gt.NN ; unpacking illegal subscript ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "packab : id.lt.1 .or. id.gt.NN : unpacking illegal subscript ;" + endif + + ; ; id = Azo(lvol,0,ii)%i(ll) ; + if( id.lt.1 .or. id.gt.NN ) then + write(6,'("packab : fatal : myid=",i3," ; id.lt.1 .or. id.gt.NN ; unpacking illegal subscript ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "packab : id.lt.1 .or. id.gt.NN : unpacking illegal subscript ;" + endif + enddo ! end of do ll; enddo ! end of do ii; @@ -282,7 +358,12 @@ subroutine packab( packorunpack, lvol, NN, solution, ideriv ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - RETURN(packab) + +9999 continue + cput = MPI_WTIME() + Tpackab = Tpackab + ( cput-cpuo ) + return + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! diff --git a/src/packxi.f90 b/src/packxi.F90 similarity index 84% rename from src/packxi.f90 rename to src/packxi.F90 index b70d01ee..8b663abd 100644 --- a/src/packxi.f90 +++ b/src/packxi.F90 @@ -55,7 +55,7 @@ !> @param[in] LComputeDerivatives !> @param[in] LComputeAxis subroutine packxi( NGdof, position, Mvol, mn, iRbc, iZbs, iRbs, iZbc, packorunpack, LComputeDerivatives, LComputeAxis ) - + use mod_kinds, only: wp => dp !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! use constants, only : zero @@ -76,18 +76,34 @@ subroutine packxi( NGdof, position, Mvol, mn, iRbc, iZbs, iRbs, iZbc, packorunpa !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS + +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + LOGICAL, intent(in) :: LComputeDerivatives ! indicates whether derivatives are to be calculated; LOGICAL, intent(in) :: LComputeAxis ! if to recompute the axis - INTEGER, intent(in) :: NGdof, Mvol, mn - REAL :: position(0:NGdof), iRbc(1:mn,0:Mvol), iZbs(1:mn,0:Mvol), iRbs(1:mn,0:Mvol), iZbc(1:mn,0:Mvol) - CHARACTER :: packorunpack + integer, intent(in) :: NGdof, Mvol, mn + real(wp) :: position(0:NGdof), iRbc(1:mn,0:Mvol), iZbs(1:mn,0:Mvol), iRbs(1:mn,0:Mvol), iZbc(1:mn,0:Mvol) + character :: packorunpack - INTEGER :: lvol, jj, kk, irz, issym, idof, ifail, ivol + integer :: lvol, jj, kk, irz, issym, idof, ifail, ivol + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif - BEGIN(packxi) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -113,7 +129,13 @@ subroutine packxi( NGdof, position, Mvol, mn, iRbc, iZbs, iRbs, iZbc, packorunpa idof = idof + 1 #ifdef DEBUG - FATAL( packxi, idof.le.0 .or. idof.gt.NGdof, out of bounds ) + + if( idof.le.0 .or. idof.gt.NGdof ) then + write(6,'("packxi : fatal : myid=",i3," ; idof.le.0 .or. idof.gt.NGdof ; out of bounds ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "packxi : idof.le.0 .or. idof.gt.NGdof : out of bounds ;" + endif + #endif select case( packorunpack ) @@ -145,7 +167,13 @@ subroutine packxi( NGdof, position, Mvol, mn, iRbc, iZbs, iRbs, iZbc, packorunpa !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! #ifdef DEBUG - FATAL( packxi, idof.ne.NGdof, counting error ) + + if( idof.ne.NGdof ) then + write(6,'("packxi : fatal : myid=",i3," ; idof.ne.NGdof ; counting error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "packxi : idof.ne.NGdof : counting error ;" + endif + #endif !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -171,14 +199,24 @@ subroutine packxi( NGdof, position, Mvol, mn, iRbc, iZbs, iRbs, iZbc, packorunpa if( (Mvol .ne. 1) .and. (Lfindzero .ne. 0) ) then if (LComputeAxis) then - WCALL( packxi, rzaxis, ( Mvol, mn, iRbc(1:mn,0:Mvol), iZbs(1:mn,0:Mvol), iRbs(1:mn,0:Mvol), iZbc(1:mn,0:Mvol), ivol, LComputeDerivatives ) ) ! set coordinate axis; 19 Jul 16; + + cput = MPI_WTIME() + Tpackxi = Tpackxi + ( cput-cpuo ) + call rzaxis( Mvol, mn, iRbc(1:mn,0:Mvol), iZbs(1:mn,0:Mvol), iRbs(1:mn,0:Mvol), iZbc(1:mn,0:Mvol), ivol, LComputeDerivatives ) + cpuo = MPI_WTIME() + ! set coordinate axis; 19 Jul 16; endif endif end select !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - RETURN(packxi) + +9999 continue + cput = MPI_WTIME() + Tpackxi = Tpackxi + ( cput-cpuo ) + return + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! diff --git a/src/pc00aa.f90 b/src/pc00aa.F90 similarity index 83% rename from src/pc00aa.f90 rename to src/pc00aa.F90 index c79d1c27..fabcccc3 100644 --- a/src/pc00aa.f90 +++ b/src/pc00aa.F90 @@ -39,7 +39,7 @@ !> @param[in] mn !> @param ie04dgf subroutine pc00aa( NGdof, position, Nvol, mn, ie04dgf ) ! argument list is optional; - + use mod_kinds, only: wp => dp !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! use constants, only : zero, ten @@ -56,25 +56,41 @@ subroutine pc00aa( NGdof, position, Nvol, mn, ie04dgf ) ! argument list is optio !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS - INTEGER, intent(in) :: Nvol, mn, NGdof - REAL , intent(inout) :: position(0:NGdof) - INTEGER :: ie04dgf +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + integer, intent(in) :: Nvol, mn, NGdof + real(wp) , intent(inout) :: position(0:NGdof) + integer :: ie04dgf LOGICAL :: LComputeDerivatives!, Lexit = .true. - INTEGER :: niterations, Iwork(1:NGdof+1), iuser(1:2) - REAL :: lEnergy, Gradient(0:NGdof), work(1:13*NGdof), ruser(1:1) - CHARACTER :: smaxstep*34 + integer :: niterations, Iwork(1:NGdof+1), iuser(1:2) + real(wp) :: lEnergy, Gradient(0:NGdof), work(1:13*NGdof), ruser(1:1) + character :: smaxstep*34 external :: pc00ab - BEGIN(pc00aa) + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! if( myid.eq.0 ) then - cput = GETTIME + cput = MPI_WTIME() write(ounit,'("pc00aa : ", 10x ," : ")') write(ounit,1000) cput-cpus, myid, NGdof, maxstep, maxiter, verify endif @@ -120,7 +136,13 @@ subroutine pc00aa( NGdof, position, Nvol, mn, ie04dgf ) ! argument list is optio case( 1 ) ! extensive test; call E04DKF('Verify = 1') ! extensive test; case default - FATAL(pc00aa, .true., invalid verify supplied on input) + + if( .true. ) then + write(6,'("pc00aa : fatal : myid=",i3," ; .true. ; invalid verify supplied on input;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "pc00aa : .true. : invalid verify supplied on input ;" + endif + end select call E04DKF('Iteration Limit = 99999999') @@ -134,7 +156,7 @@ subroutine pc00aa( NGdof, position, Nvol, mn, ie04dgf ) ! argument list is optio call E04DGF( NGdof, pc00ab, niterations, lEnergy, Gradient(1:NGdof), position(1:NGdof), & Iwork(1:NGdof+1), work(1:13*NGdof), iuser(1:2), ruser(1:1), ie04dgf ) - cput = GETTIME + cput = MPI_WTIME() select case( ie04dgf ) case(:-1) ; if( myid.eq.0 ) write(ounit,'("pc00aa : ",f10.2," : user requested termination ; ie04dgf=",i3," ;")')cput-cpus,ie04dgf @@ -146,12 +168,23 @@ subroutine pc00aa( NGdof, position, Nvol, mn, ie04dgf ) ! argument list is optio case( 8) ; if( myid.eq.0 ) write(ounit,'("pc00aa : ",f10.2," : initial gradient too small ; ie04dgf=",i3," ;")')cput-cpus,ie04dgf case( 9) ; if( myid.eq.0 ) write(ounit,'("pc00aa : ",f10.2," : input error ; ie04dgf=",i3," ;")')cput-cpus,ie04dgf case default - FATAL(pc00aa, .true., E04DGF ifail error) + + if( .true. ) then + write(6,'("pc00aa : fatal : myid=",i3," ; .true. ; E04DGF ifail error;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "pc00aa : .true. : E04DGF ifail error ;" + endif + end select !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - RETURN(pc00aa) + +9999 continue + cput = MPI_WTIME() + Tpc00aa = Tpc00aa + ( cput-cpuo ) + return + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! diff --git a/src/pc00ab.f90 b/src/pc00ab.F90 similarity index 86% rename from src/pc00ab.f90 rename to src/pc00ab.F90 index b47907c0..5d526658 100644 --- a/src/pc00ab.f90 +++ b/src/pc00ab.F90 @@ -79,7 +79,7 @@ !> !> subroutine pc00ab( mode, NGdof, Position, Energy, Gradient, nstate, iuser, ruser ) ! argument fixed by NAG; see pc00aa; - + use mod_kinds, only: wp => dp use constants, only : zero, half, one use numerical, only : @@ -94,16 +94,32 @@ subroutine pc00ab( mode, NGdof, Position, Energy, Gradient, nstate, iuser, ruser !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS - INTEGER :: mode, NGdof, nstate, iuser(1:2) - REAL :: Position(1:NGdof), Energy, Gradient(1:NGdof), ruser(1:1) +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + integer :: mode, NGdof, nstate, iuser(1:2) + real(wp) :: Position(1:NGdof), Energy, Gradient(1:NGdof), ruser(1:1) LOGICAL :: LComputeDerivatives, LComputeAxis - INTEGER :: ii, vvol, irz, issym, totaldof, localdof, wflag, iflag!, mi, ni !idof, imn, irz, totaldof, localdof, jj, kk, ll, mi, ni, mj, nj, mk, nk, ml, nl, mjmk - REAL :: force(0:NGdof), gradienterror, rflag + integer :: ii, vvol, irz, issym, totaldof, localdof, wflag, iflag!, mi, ni !idof, imn, irz, totaldof, localdof, jj, kk, ll, mi, ni, mj, nj, mk, nk, ml, nl, mjmk + real(wp) :: force(0:NGdof), gradienterror, rflag + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif - BEGIN(pc00ab) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -113,7 +129,12 @@ subroutine pc00ab( mode, NGdof, Position, Energy, Gradient, nstate, iuser, ruser LComputeDerivatives = .false. LComputeAxis = .true. - WCALL(pc00ab,dforce,( NGdof, Position(1:NGdof), force(0:NGdof), LComputeDerivatives, LComputeAxis )) + + cput = MPI_WTIME() + Tpc00ab = Tpc00ab + ( cput-cpuo ) + call dforce( NGdof, Position(1:NGdof), force(0:NGdof), LComputeDerivatives, LComputeAxis ) + cpuo = MPI_WTIME() + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -174,24 +195,47 @@ subroutine pc00ab( mode, NGdof, Position, Energy, Gradient, nstate, iuser, ruser enddo ! end of do vvol; 26 Feb 13; - FATAL(pc00ab, totaldof.ne.NGdof, counting error ) + + if( totaldof.ne.NGdof ) then + write(6,'("pc00ab : fatal : myid=",i3," ; totaldof.ne.NGdof ; counting error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "pc00ab : totaldof.ne.NGdof : counting error ;" + endif + gradienterror = sum( abs( Gradient(1:NGdof) ) ) / NGdof ! only used for screen output; 26 Feb 13; wflag = 1 ; iflag = 0 ; rflag = gradienterror - WCALL(pc00ab,writin,( wflag, iflag, rflag)) ! write restart file etc.; + + cput = MPI_WTIME() + Tpc00ab = Tpc00ab + ( cput-cpuo ) + call writin( wflag, iflag, rflag) + cpuo = MPI_WTIME() + ! write restart file etc.; !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! case( 3 ) ! second derivatives; required for E04LYF, which is called by pc02aa; - FATAL(pc00ab, .true., have not yet computed second derivatives ) + + if( .true. ) then + write(6,'("pc00ab : fatal : myid=",i3," ; .true. ; have not yet computed second derivatives ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "pc00ab : .true. : have not yet computed second derivatives ;" + endif + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! case default - FATAL(pc00ab, .true., invalid mode provided to pc00ab ) + + if( .true. ) then + write(6,'("pc00ab : fatal : myid=",i3," ; .true. ; invalid mode provided to pc00ab ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "pc00ab : .true. : invalid mode provided to pc00ab ;" + endif + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -199,7 +243,7 @@ subroutine pc00ab( mode, NGdof, Position, Energy, Gradient, nstate, iuser, ruser !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - cput = GETTIME + cput = MPI_WTIME() if( myid.eq.0 ) write(ounit,1000) cput-cpus, iuser(1:2), mode, Energy, gradienterror, ForceErr !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -214,7 +258,12 @@ subroutine pc00ab( mode, NGdof, Position, Energy, Gradient, nstate, iuser, ruser !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - RETURN(pc00ab) + +9999 continue + cput = MPI_WTIME() + Tpc00ab = Tpc00ab + ( cput-cpuo ) + return + 1000 format("pc00ab : ",f10.2," : iterations="2i8" ; mode=",i3," ; Energy="es23.15" ; |DF|="es13.5" ; ForceErr="es23.15" ;") diff --git a/src/pp00aa.f90 b/src/pp00aa.F90 similarity index 85% rename from src/pp00aa.f90 rename to src/pp00aa.F90 index dc91ff31..36472577 100644 --- a/src/pp00aa.f90 +++ b/src/pp00aa.F90 @@ -64,7 +64,7 @@ !> !> subroutine pp00aa - + use mod_kinds, only: wp => dp !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! use constants, only : zero, half, one, two, pi @@ -87,22 +87,48 @@ subroutine pp00aa !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS - INTEGER :: lnPtrj, ioff, vvol, itrj, lvol - INTEGER, allocatable :: utflag(:), numTrajs(:) - REAL :: sti(1:2), ltransform(1:2) - REAL, allocatable :: data(:,:,:,:), fiota(:,:) +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + integer :: lnPtrj, ioff, vvol, itrj, lvol + integer, allocatable :: utflag(:), numTrajs(:) + real(wp) :: sti(1:2), ltransform(1:2) + real(wp), allocatable :: data(:,:,:,:), fiota(:,:) integer :: id, numTraj, recvId integer :: status(MPI_STATUS_SIZE) - BEGIN(pp00aa) + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif + ! count how many Poincare trajectories should be computed in total ; executed on each CPU allocate(numTrajs(1:Mvol)) do vvol = 1, Mvol - LREGION(vvol) ! sets e.g. Lcoordinatesingularity + + if( Igeometry.eq.1 .or. vvol.gt.1 ) then ; Lcoordinatesingularity = .false. + else ; Lcoordinatesingularity = .true. + endif + + if( vvol.le.Nvol ) then ; Lplasmaregion = .true. + else ; Lplasmaregion = .false. + endif + + Lvacuumregion = .not.Lplasmaregion + ! sets e.g. Lcoordinatesingularity if( Lcoordinatesingularity ) then ; ioff = 1 ! keep away from coordinate axis; else ; ioff = 0 endif @@ -129,7 +155,17 @@ subroutine pp00aa if( myid.eq.modulo(vvol-1,ncpu) .and. myid.lt.Mvol) then ! the following is in parallel; 20 Jun 14; ! lower bound for radial indices - LREGION(vvol) ! sets e.g. Lcoordinatesingularity + + if( Igeometry.eq.1 .or. vvol.gt.1 ) then ; Lcoordinatesingularity = .false. + else ; Lcoordinatesingularity = .true. + endif + + if( vvol.le.Nvol ) then ; Lplasmaregion = .true. + else ; Lplasmaregion = .false. + endif + + Lvacuumregion = .not.Lplasmaregion + ! sets e.g. Lcoordinatesingularity if( Lcoordinatesingularity ) then ; ioff = 1 ! keep away from coordinate axis; else ; ioff = 0 endif @@ -141,9 +177,18 @@ subroutine pp00aa !write(*,'(ai2ai2ai2ai2)') "CPU ",myid," works on trajectories ",ioff," to ",lnPtrj," in volume ",vvol - SALLOCATE( data, (ioff:lnPtrj, 1:4,0:Nz-1,1:nPpts), zero ) ! for block writing to file (allows faster reading of output data files for post-processing plotting routines); - SALLOCATE( utflag, (ioff:lnPtrj ), 0 ) ! error flag that indicates if fieldlines successfully followed; 22 Apr 13; - SALLOCATE( fiota, (ioff:lnPtrj, 1:2 ), zero ) ! will always need fiota(0,1:2); + + allocate( data(ioff:lnPtrj, 1:4,0:Nz-1,1:nPpts), stat=astat ) + data(ioff:lnPtrj, 1:4,0:Nz-1,1:nPpts) = zero + ! for block writing to file (allows faster reading of output data files for post-processing plotting routines); + + allocate( utflag(ioff:lnPtrj ), stat=astat ) + utflag(ioff:lnPtrj ) = 0 + ! error flag that indicates if fieldlines successfully followed; 22 Apr 13; + + allocate( fiota(ioff:lnPtrj, 1:2 ), stat=astat ) + fiota(ioff:lnPtrj, 1:2 ) = zero + ! will always need fiota(0,1:2); !$OMP PARALLEL DO SHARED(lnPtrj,ioff,Wpp00aa,Nz,data,fiota,utflag,iota,oita,myid,vvol,cpus,Lconstraint,nPpts,ppts) PRIVATE(itrj,sti) do itrj = ioff, lnPtrj ! initialize Poincare plot with trajectories regularly spaced between interfaces along \t=0; @@ -154,10 +199,15 @@ subroutine pp00aa if( itrj.eq.lnPtrj ) sti(1) = one ! avoid machine precision errors; 08 Feb 16; ! call actual field line integration subroutine - CALL( pp00aa, pp00ab, ( vvol, sti(1:2), Nz, nPpts, data(itrj,1:4,0:Nz-1,1:nPpts), fiota(itrj,1:2), utflag(itrj) ) ) + + cput = MPI_WTIME() + Tpp00aa = Tpp00aa + ( cput-cpuo ) + call pp00ab( vvol, sti(1:2), Nz, nPpts, data(itrj,1:4,0:Nz-1,1:nPpts), fiota(itrj,1:2), utflag(itrj) ) + cpuo = MPI_WTIME() + if( Wpp00aa ) then - cput = GETTIME + cput = MPI_WTIME() if( Lconstraint.eq.1 ) then if( itrj.eq.0 ) write(ounit,1002) cput-cpus, myid, vvol, itrj, sti(1:2), utflag(itrj), fiota(itrj,2), fiota(itrj,2)-oita(vvol-1) if( itrj.gt.0 .and. itrj.lt.lnPtrj ) write(ounit,1002) cput-cpus, myid, vvol, itrj, sti(1:2), utflag(itrj), fiota(itrj,2) @@ -258,9 +308,15 @@ subroutine pp00aa !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - DALLOCATE(data) - DALLOCATE(utflag) - DALLOCATE(fiota) + + deallocate(data,stat=astat) + + + deallocate(utflag,stat=astat) + + + deallocate(fiota,stat=astat) + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! endif ! myid.eq.modulo(vvol-1,ncpu) @@ -273,7 +329,12 @@ subroutine pp00aa call finalize_flt_output endif - RETURN(pp00aa) + +9999 continue + cput = MPI_WTIME() + Tpp00aa = Tpp00aa + ( cput-cpuo ) + return + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! diff --git a/src/pp00ab.f90 b/src/pp00ab.F90 similarity index 76% rename from src/pp00ab.f90 rename to src/pp00ab.F90 index a4963797..74614874 100644 --- a/src/pp00ab.f90 +++ b/src/pp00ab.F90 @@ -30,7 +30,7 @@ !> @param fittedtransform !> @param[out] utflag subroutine pp00ab( lvol, sti, Nz, nPpts, poincaredata, fittedtransform, utflag ) - + use mod_kinds, only: wp => dp !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! use constants, only : zero, one, two, pi2 @@ -47,38 +47,66 @@ subroutine pp00ab( lvol, sti, Nz, nPpts, poincaredata, fittedtransform, utflag ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS - INTEGER, intent(in) :: lvol, Nz, nPpts - INTEGER, intent(out) :: utflag - REAL :: sti(1:2), poincaredata(1:4,0:Nz-1,1:nPpts), fittedtransform(1:2), dzeta +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + integer, intent(in) :: lvol, Nz, nPpts + integer, intent(out) :: utflag + real(wp) :: sti(1:2), poincaredata(1:4,0:Nz-1,1:nPpts), fittedtransform(1:2), dzeta - INTEGER :: jj, kk - REAL :: ppt(1:4) + integer :: jj, kk + real(wp) :: ppt(1:4) - INTEGER, parameter :: Lrwork = 20*Node - REAL :: zst, zend, st(1:Node), rwork(1:Lrwork), tol, stz(1:3), RpZ(1:3), leastfit(1:5) - CHARACTER :: RA + integer, parameter :: Lrwork = 20*Node + real(wp) :: zst, zend, st(1:Node), rwork(1:Lrwork), tol, stz(1:3), RpZ(1:3), leastfit(1:5) + character :: RA - INTEGER, parameter :: Lenwrk = 32*Node - INTEGER :: rkmethod, outch - REAL :: hstart, thres(1:Node), rkwork(1:Lenwrk), mchpes, dwarf - REAL :: zgot, ygot(1:Node), ypgot(1:Node), ymax(1:Node) - CHARACTER :: rktask + integer, parameter :: Lenwrk = 32*Node + integer :: rkmethod, outch + real(wp) :: hstart, thres(1:Node), rkwork(1:Lenwrk), mchpes, dwarf + real(wp) :: zgot, ygot(1:Node), ypgot(1:Node), ymax(1:Node) + character :: rktask LOGICAL :: errass, mesage external :: bfield external :: SETUP, UT, ENVIRN - BEGIN(pp00ab) + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! ivol = lvol ! required to pass through to bfield; #ifdef DEBUG - FATAL(pp00ab, lvol.lt.1.or.lvol.gt.Mvol, invalid volume ) - FATAL(pp00ab, abs(sti(1)).gt.one, illegal radial coordinate ) + + if( lvol.lt.1.or.lvol.gt.Mvol ) then + write(6,'("pp00ab : fatal : myid=",i3," ; lvol.lt.1.or.lvol.gt.Mvol ; invalid volume ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "pp00ab : lvol.lt.1.or.lvol.gt.Mvol : invalid volume ;" + endif + + + if( abs(sti(1)).gt.one ) then + write(6,'("pp00ab : fatal : myid=",i3," ; abs(sti(1)).gt.one ; illegal radial coordinate ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "pp00ab : abs(sti(1)).gt.one : illegal radial coordinate ;" + endif + #endif dzeta = pi2nfp @@ -127,7 +155,12 @@ subroutine pp00ab( lvol, sti, Nz, nPpts, poincaredata, fittedtransform, utflag ) 1002 format("pp00ab : ", 10x ," : myid=",i3," ; lvol=",i3," ; "3x" : (s,t)=("f21.17" ,"f21.17" ) ; "3x" ; outside domain ;") - CALL( pp00ab, stzxyz, ( lvol, stz(1:3), RpZ(1:3) ) ) ! map to cylindrical; + + cput = MPI_WTIME() + Tpp00ab = Tpp00ab + ( cput-cpuo ) + call stzxyz( lvol, stz(1:3), RpZ(1:3) ) + cpuo = MPI_WTIME() + ! map to cylindrical; ppt(3:4)=(/ RpZ(1), RpZ(3) /) ! cylindrical coordinates; @@ -139,13 +172,18 @@ subroutine pp00ab( lvol, sti, Nz, nPpts, poincaredata, fittedtransform, utflag ) call SETUP(Node, zst, st(1:Node), zend, tol, thres(1:Node), rkmethod, rktask, errass, hstart, rkwork(1:Lenwrk), Lenwrk, mesage) - CALL( pp00ab, UT, (bfield, zend, zgot, ygot(1:Node), ypgot(1:Node), ymax(1:Node), rkwork(1:Lenwrk), utflag) ) ! integrate to next plane; + + cput = MPI_WTIME() + Tpp00ab = Tpp00ab + ( cput-cpuo ) + call UT(bfield, zend, zgot, ygot(1:Node), ypgot(1:Node), ymax(1:Node), rkwork(1:Lenwrk), utflag) + cpuo = MPI_WTIME() + ! integrate to next plane; zst = zend st(1:Node) = ygot(1:Node) - cput = GETTIME + cput = MPI_WTIME() select case( utflag ) ! 1 2 3 4 5 6 case( 1 ) ; ! give screen output if error is encountered; !123456789012345678901234567890123456789012345678901234567890123 case( 2 ) ; write(ounit,2001) cput-cpus, myid, lvol, jj, kk, utflag, "step size too small (try RK method 2) " @@ -154,7 +192,13 @@ subroutine pp00ab( lvol, sti, Nz, nPpts, poincaredata, fittedtransform, utflag ) case( 5 ) ; write(ounit,2001) cput-cpus, myid, lvol, jj, kk, utflag, "odetol/thres too small or RK method too low " case( 6 ) ; write(ounit,2001) cput-cpus, myid, lvol, jj, kk, utflag, "integration interrupted (error assessment not possible " case default - FATAL(pp00ab,.true.,illegal value of ifail returned from UT) + + if( .true. ) then + write(6,'("pp00ab : fatal : myid=",i3," ; .true. ; illegal value of ifail returned from UT;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "pp00ab : .true. : illegal value of ifail returned from UT ;" + endif + end select 2001 format("pp00ab : ",f10.2," : myid=",i3," ; lvol=",i3," ; (jj,kk)=("i4" ,"i4" ); ifail="i2" ; "a63) @@ -185,7 +229,12 @@ subroutine pp00ab( lvol, sti, Nz, nPpts, poincaredata, fittedtransform, utflag ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - RETURN(pp00ab) + +9999 continue + cput = MPI_WTIME() + Tpp00ab = Tpp00ab + ( cput-cpuo ) + return + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! diff --git a/src/preset.f90 b/src/preset.F90 similarity index 74% rename from src/preset.f90 rename to src/preset.F90 index 2ee5a16a..3a2493dd 100644 --- a/src/preset.f90 +++ b/src/preset.F90 @@ -12,7 +12,7 @@ !> \ingroup grp_initialization !> subroutine preset - + use mod_kinds, only: wp => dp !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! use constants, only : zero, one, mu0 @@ -31,21 +31,37 @@ subroutine preset !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS - INTEGER :: innout, idof, jk, ll, ii, ifail, ideriv, vvol, mi, ni, mj, nj, mk, nk, mimj, ninj, mkmj, nknj, jj, kk, lvol, mm, nn, imn - INTEGER :: lquad, igauleg, maxIquad, Mrad, jquad, Lcurvature, zerdof, iret, work1, work2 - REAL :: teta, zeta, arg, lss, cszeta(0:1), error +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + integer :: innout, idof, jk, ll, ii, ifail, ideriv, vvol, mi, ni, mj, nj, mk, nk, mimj, ninj, mkmj, nknj, jj, kk, lvol, mm, nn, imn + integer :: lquad, igauleg, maxIquad, Mrad, jquad, Lcurvature, zerdof, iret, work1, work2 + real(wp) :: teta, zeta, arg, lss, cszeta(0:1), error LOGICAL :: LComputeAxis LOGICAL :: Lchangeangle - INTEGER :: nb, ix, ij, ip, idx_mode - REAL :: xx + integer :: nb, ix, ij, ip, idx_mode + real(wp) :: xx !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - BEGIN(preset) + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -57,7 +73,13 @@ subroutine preset case( 0 ) ; YESstellsym = .false. ; NOTstellsym = .true. case( 1 ) ; YESstellsym = .true. ; NOTstellsym = .false. case default ; - FATAL( readin, .true., illegal Istellsym ) + + if( .true. ) then + write(6,'("readin : fatal : myid=",i3," ; .true. ; illegal Istellsym ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "readin : .true. : illegal Istellsym ;" + endif + end select !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -67,13 +89,22 @@ subroutine preset !latex \item The number of plasma volumes is \internal{Mvol}=\inputvar{Nvol}+\inputvar{Lfreebound}; !latex \end{enumerate} - FATAL( readin, Lfreebound.lt.0 .or. Lfreebound.gt.1, illegal Lfreebound ) + + if( Lfreebound.lt.0 .or. Lfreebound.gt.1 ) then + write(6,'("readin : fatal : myid=",i3," ; Lfreebound.lt.0 .or. Lfreebound.gt.1 ; illegal Lfreebound ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "readin : Lfreebound.lt.0 .or. Lfreebound.gt.1 : illegal Lfreebound ;" + endif + Mvol = Nvol + Lfreebound !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - SALLOCATE( beltramierror,(1:Mvol,1:9), zero) + + allocate( beltramierror(1:Mvol,1:9), stat=astat ) + beltramierror(1:Mvol,1:9) = zero + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -93,8 +124,14 @@ subroutine preset mn = 1 + Ntor + Mpol * ( 2 * Ntor + 1 ) ! Fourier resolution of interface geometry & vector potential; - SALLOCATE( im, (1:mn), 0 ) - SALLOCATE( in, (1:mn), 0 ) + + allocate( im(1:mn), stat=astat ) + im(1:mn) = 0 + + + allocate( in(1:mn), stat=astat ) + in(1:mn) = 0 + call gi00ab( Mpol, Ntor, Nfp, mn, im(1:mn), in(1:mn) ) ! this sets the im and in mode identification arrays; @@ -106,8 +143,14 @@ subroutine preset !latex \item This is used in \link{lforce}, \link{bfield}, \link{stzxyz}, \link{coords}, \link{jo00aa}, \link{ma00aa}, \link{sc00aa} and \link{tr00ab}. !latex \end{enumerate} - SALLOCATE( halfmm, (1:mn), im(1:mn) * half ) - SALLOCATE( regumm, (1:mn), im(1:mn) * half ) + + allocate( halfmm(1:mn), stat=astat ) + halfmm(1:mn) = im(1:mn) * half + + + allocate( regumm(1:mn), stat=astat ) + regumm(1:mn) = im(1:mn) * half + if( Mregular.ge.2 ) then @@ -130,8 +173,14 @@ subroutine preset mne = 1 + lNtor + lMpol * ( 2 * lNtor + 1 ) ! resolution of metrics; enhanced resolution; see metrix; - SALLOCATE( ime, (1:mne), 0 ) - SALLOCATE( ine, (1:mne), 0 ) + + allocate( ime(1:mne), stat=astat ) + ime(1:mne) = 0 + + + allocate( ine(1:mne), stat=astat ) + ine(1:mne) = 0 + call gi00ab( lMpol, lNtor, Nfp, mne, ime(1:mne), ine(1:mne) ) @@ -147,8 +196,14 @@ subroutine preset mns = 1 + sNtor + sMpol * ( 2 * sNtor + 1 ) ! resolution of straight-field line transformation on interfaces; see tr00ab; soon to be redundant; - SALLOCATE( ims, (1:mns), 0 ) - SALLOCATE( ins, (1:mns), 0 ) + + allocate( ims(1:mns), stat=astat ) + ims(1:mns) = 0 + + + allocate( ins(1:mns), stat=astat ) + ins(1:mns) = 0 + call gi00ab( sMpol, sNtor, Nfp, mns, ims(1:mns), ins(1:mns) ) ! note that the field periodicity factor is included in ins; @@ -180,24 +235,60 @@ subroutine preset !latex \item \type{iVns}, \type{iVnc}, \type{iBns} and \type{iBns} : Fourier harmonics of normal field at computational boundary; !latex \end{enumerate} - SALLOCATE( iRbc, (1:mn,0:Mvol), zero ) ! interface Fourier harmonics; - SALLOCATE( iZbs, (1:mn,0:Mvol), zero ) - SALLOCATE( iRbs, (1:mn,0:Mvol), zero ) - SALLOCATE( iZbc, (1:mn,0:Mvol), zero ) + + allocate( iRbc(1:mn,0:Mvol), stat=astat ) + iRbc(1:mn,0:Mvol) = zero + ! interface Fourier harmonics; + + allocate( iZbs(1:mn,0:Mvol), stat=astat ) + iZbs(1:mn,0:Mvol) = zero + + + allocate( iRbs(1:mn,0:Mvol), stat=astat ) + iRbs(1:mn,0:Mvol) = zero + + + allocate( iZbc(1:mn,0:Mvol), stat=astat ) + iZbc(1:mn,0:Mvol) = zero + if( Lperturbed.eq.1 ) then - SALLOCATE( dRbc, (1:mn,0:Mvol), zero ) ! interface Fourier harmonics; - SALLOCATE( dZbs, (1:mn,0:Mvol), zero ) - SALLOCATE( dRbs, (1:mn,0:Mvol), zero ) - SALLOCATE( dZbc, (1:mn,0:Mvol), zero ) + + allocate( dRbc(1:mn,0:Mvol), stat=astat ) + dRbc(1:mn,0:Mvol) = zero + ! interface Fourier harmonics; + + allocate( dZbs(1:mn,0:Mvol), stat=astat ) + dZbs(1:mn,0:Mvol) = zero + + + allocate( dRbs(1:mn,0:Mvol), stat=astat ) + dRbs(1:mn,0:Mvol) = zero + + + allocate( dZbc(1:mn,0:Mvol), stat=astat ) + dZbc(1:mn,0:Mvol) = zero + endif !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - SALLOCATE( iVns, (1:mn), zero ) - SALLOCATE( iBns, (1:mn), zero ) - SALLOCATE( iVnc, (1:mn), zero ) - SALLOCATE( iBnc, (1:mn), zero ) + + allocate( iVns(1:mn), stat=astat ) + iVns(1:mn) = zero + + + allocate( iBns(1:mn), stat=astat ) + iBns(1:mn) = zero + + + allocate( iVnc(1:mn), stat=astat ) + iVnc(1:mn) = zero + + + allocate( iBnc(1:mn), stat=astat ) + iBnc(1:mn) = zero + !SALLOCATE( lRbc, (1:mn), zero ) ! not used; SRH: 27 Feb 18; !SALLOCATE( lZbs, (1:mn), zero ) @@ -214,7 +305,10 @@ subroutine preset !latex \internal{ajk[i]} $\equiv 0 $ if $m_i \ne 0$. !latex \end{enumerate} - SALLOCATE( ajk, (1:mn), zero ) ! this must be allocated & assigned now, as it is used in readin; primarily used in packxi; 02 Jan 15; + + allocate( ajk(1:mn), stat=astat ) + ajk(1:mn) = zero + ! this must be allocated & assigned now, as it is used in readin; primarily used in packxi; 02 Jan 15; do kk = 1, mn ; mk = im(kk) ; nk = in(kk) @@ -369,23 +463,39 @@ subroutine preset !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - ; RlBCAST( iRbc(1:mn,0:Mvol), (Mvol+1)*mn, 0 ) + ; + call MPI_BCAST(iRbc(1:mn,0:Mvol),(Mvol+1)*mn,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + if( Igeometry.eq.3 ) then - ;RlBCAST( iZbs(1:mn,0:Mvol), (Mvol+1)*mn, 0 ) ! only required for ii > 1 ; + ; + call MPI_BCAST(iZbs(1:mn,0:Mvol),(Mvol+1)*mn,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + ! only required for ii > 1 ; endif if( NOTstellsym ) then - ;RlBCAST( iRbs(1:mn,0:Mvol), (Mvol+1)*mn, 0 ) ! only required for ii > 1 ; + ; + call MPI_BCAST(iRbs(1:mn,0:Mvol),(Mvol+1)*mn,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + ! only required for ii > 1 ; if( Igeometry.eq.3 ) then - RlBCAST( iZbc(1:mn,0:Mvol), (Mvol+1)*mn, 0 ) + + call MPI_BCAST(iZbc(1:mn,0:Mvol),(Mvol+1)*mn,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + endif endif if( Lfreebound.eq.1 ) then - ;RlBCAST( iVns(1:mn), mn, 0 ) ! only required for ii > 1 ; - ;RlBCAST( iBns(1:mn), mn, 0 ) ! only required for ii > 1 ; + ; + call MPI_BCAST(iVns(1:mn),mn,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + ! only required for ii > 1 ; + ; + call MPI_BCAST(iBns(1:mn),mn,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + ! only required for ii > 1 ; if( NOTstellsym ) then - RlBCAST( iVnc(1:mn), mn, 0 ) - RlBCAST( iBnc(1:mn), mn, 0 ) + + call MPI_BCAST(iVnc(1:mn),mn,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(iBnc(1:mn),mn,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + endif endif @@ -457,7 +567,7 @@ subroutine preset NGdof = ( Mvol-1 ) * LGdof - if( Wpreset ) then ; cput = GETTIME ; write(ounit,'("preset : ",f10.2," : myid=",i3," ; NGdof=",i9," ;")') cput-cpus, myid, NGdof + if( Wpreset ) then ; cput = MPI_WTIME() ; write(ounit,'("preset : ",f10.2," : myid=",i3," ; NGdof=",i9," ;")') cput-cpus, myid, NGdof endif !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -505,8 +615,14 @@ subroutine preset !> \f$\psi_{pol,i} \rightarrow \psi_{pol,i} / \psi_{0}\f$, where \f$\psi_{0} \equiv \psi_{tor,N}\f$ on input. !> - SALLOCATE( dtflux, (1:Mvol), zero ) - SALLOCATE( dpflux, (1:Mvol), zero ) + + allocate( dtflux(1:Mvol), stat=astat ) + dtflux(1:Mvol) = zero + + + allocate( dpflux(1:Mvol), stat=astat ) + dpflux(1:Mvol) = zero + select case( Igeometry ) case( 1 ) ; dtflux(1) = tflux(1) ; dpflux(1) = pflux(1) ! Cartesian ; this is the "inverse" operation defined in xspech; 09 Mar 17; @@ -561,7 +677,10 @@ subroutine preset !> and \f$w \equiv\,\f$\c wpoloidal. !> - SALLOCATE( sweight, (1:Mvol), zero ) + + allocate( sweight(1:Mvol), stat=astat ) + sweight(1:Mvol) = zero + !sweight(1:Mvol) = upsilon * tflux(1:Mvol)**wpoloidal ! toroidal flux in vacuum region is not constant; 11 July 18; do vvol = 1, Mvol ; sweight(vvol) = upsilon * (vvol*one/Nvol)**wpoloidal ! 11 July 18; enddo @@ -605,9 +724,18 @@ subroutine preset !> !> - SALLOCATE( TT, (0:Mrad,0:1,0:1), zero ) - SALLOCATE(RTT, (0:Lrad(1),0:Mpol,0:1,0:1), zero ) - SALLOCATE(RTM, (0:Lrad(1),0:Mpol), zero ) + + allocate( TT(0:Mrad,0:1,0:1), stat=astat ) + TT(0:Mrad,0:1,0:1) = zero + + + allocate( RTT(0:Lrad(1),0:Mpol,0:1,0:1), stat=astat ) + RTT(0:Lrad(1),0:Mpol,0:1,0:1) = zero + + + allocate( RTM(0:Lrad(1),0:Mpol), stat=astat ) + RTM(0:Lrad(1),0:Mpol) = zero + call get_cheby( -one, Mrad, TT(:,0,:)) call get_cheby( one , Mrad, TT(:,1,:)) @@ -628,7 +756,10 @@ subroutine preset !> then \c ImagneticOK is set to \c .true. . !> - SALLOCATE( ImagneticOK, (1:Mvol), .false. ) + + allocate( ImagneticOK(1:Mvol), stat=astat ) + ImagneticOK(1:Mvol) = .false. + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -688,9 +819,18 @@ subroutine preset !> Also, take care that the sign of the sine harmonics in the above expressions will change for these cases. !> - SALLOCATE( ki, (1:mn,0:1), 0 ) - SALLOCATE( kija, (1:mn,1:mn,0:1), 0 ) - SALLOCATE( kijs, (1:mn,1:mn,0:1), 0 ) + + allocate( ki(1:mn,0:1), stat=astat ) + ki(1:mn,0:1) = 0 + + + allocate( kija(1:mn,1:mn,0:1), stat=astat ) + kija(1:mn,1:mn,0:1) = 0 + + + allocate( kijs(1:mn,1:mn,0:1), stat=astat ) + kijs(1:mn,1:mn,0:1) = 0 + do ii = 1, mn ; mi = im(ii) ; ni = in(ii) @@ -734,8 +874,14 @@ subroutine preset if( Igeometry.eq.2 ) then ! standard cylindrical; 04 Dec 14; - SALLOCATE( djkp, (1:mn,1:mn), 0 ) ! only used in volume; trigonometric identities; 04 Dec 14; - SALLOCATE( djkm, (1:mn,1:mn), 0 ) ! only used in volume; trigonometric identities; 04 Dec 14; + + allocate( djkp(1:mn,1:mn), stat=astat ) + djkp(1:mn,1:mn) = 0 + ! only used in volume; trigonometric identities; 04 Dec 14; + + allocate( djkm(1:mn,1:mn), stat=astat ) + djkm(1:mn,1:mn) = 0 + ! only used in volume; trigonometric identities; 04 Dec 14; do ii = 1, mn ; mi = im(ii) ; ni = in(ii) do jj = 1, mn ; mj = im(jj) ; nj = in(jj) @@ -750,11 +896,23 @@ subroutine preset !> **iotakki** - SALLOCATE( iotakkii, (1:mn ), 0 ) ! used to identify matrix elements in straight-field-line angle transformation; - SALLOCATE( iotaksub, (1:mn,1:mns), 0 ) - SALLOCATE( iotaksgn, (1:mn,1:mns), 0 ) - SALLOCATE( iotakadd, (1:mn,1:mns), 0 ) + allocate( iotakkii(1:mn ), stat=astat ) + iotakkii(1:mn ) = 0 + ! used to identify matrix elements in straight-field-line angle transformation; + + + allocate( iotaksub(1:mn,1:mns), stat=astat ) + iotaksub(1:mn,1:mns) = 0 + + + allocate( iotaksgn(1:mn,1:mns), stat=astat ) + iotaksgn(1:mn,1:mns) = 0 + + + allocate( iotakadd(1:mn,1:mns), stat=astat ) + iotakadd(1:mn,1:mns) = 0 + do kk = 1, mn ; mk = im(kk) ; nk = in(kk) @@ -803,15 +961,30 @@ subroutine preset ! Allocate space for the toroidal current array in each interface - SALLOCATE( IPDt, (1:Mvol), zero) + + allocate( IPDt(1:Mvol), stat=astat ) + IPDt(1:Mvol) = zero + if( Lfreebound.eq.1 ) then - SALLOCATE( IPDtDpf, (1:Mvol , 1:Mvol ), zero) + + allocate( IPDtDpf(1:Mvol , 1:Mvol ), stat=astat ) + IPDtDpf(1:Mvol , 1:Mvol ) = zero + else - SALLOCATE( IPDtDpf, (1:Mvol-1, 1:Mvol-1), zero) + + allocate( IPDtDpf(1:Mvol-1, 1:Mvol-1), stat=astat ) + IPDtDpf(1:Mvol-1, 1:Mvol-1) = zero + endif - SALLOCATE( cheby, (0:Mrad,0:2), zero ) - SALLOCATE( zernike, (0:Lrad(1), 0:Mpol, 0:2), zero ) + + allocate( cheby(0:Mrad,0:2), stat=astat ) + cheby(0:Mrad,0:2) = zero + + + allocate( zernike(0:Lrad(1), 0:Mpol, 0:2), stat=astat ) + zernike(0:Lrad(1), 0:Mpol, 0:2) = zero + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -832,11 +1005,24 @@ subroutine preset !> also see jo00aa(), where \c Iquad\f$_v\f$ is used to compute the volume integrals of \f$||\nabla\times{\bf B} - \mu {\bf B}||\f$. !> - SALLOCATE( Iquad, (1:Mvol), 0 ) ! 16 Jan 13; + + allocate( Iquad(1:Mvol), stat=astat ) + Iquad(1:Mvol) = 0 + ! 16 Jan 13; do vvol = 1, Mvol - LREGION(vvol) + + if( Igeometry.eq.1 .or. vvol.gt.1 ) then ; Lcoordinatesingularity = .false. + else ; Lcoordinatesingularity = .true. + endif + + if( vvol.le.Nvol ) then ; Lplasmaregion = .true. + else ; Lplasmaregion = .false. + endif + + Lvacuumregion = .not.Lplasmaregion + if( Nquad.gt.0 ) then ; Iquad(vvol) = Nquad else @@ -848,8 +1034,14 @@ subroutine preset maxIquad = maxval(Iquad(1:Mvol)) - SALLOCATE( gaussianweight , (1:maxIquad,1:Mvol), zero ) ! perhaps it would be neater to make this a structure; 26 Jan 16; - SALLOCATE( gaussianabscissae, (1:maxIquad,1:Mvol), zero ) + + allocate( gaussianweight (1:maxIquad,1:Mvol), stat=astat ) + gaussianweight (1:maxIquad,1:Mvol) = zero + ! perhaps it would be neater to make this a structure; 26 Jan 16; + + allocate( gaussianabscissae(1:maxIquad,1:Mvol), stat=astat ) + gaussianabscissae(1:maxIquad,1:Mvol) = zero + do vvol = 1, Mvol @@ -858,13 +1050,19 @@ subroutine preset call gauleg( lquad, gaussianweight(1:lquad,vvol), gaussianabscissae(1:lquad,vvol), igauleg ) ! JAB; 28 Jul 17 if( myid.eq.0 ) then - cput= GETTIME + cput= MPI_WTIME() select case( igauleg ) ! 123456789012345 case( 0 ) ; if( Wpreset ) write(ounit,1000) cput-cpus, vvol, igauleg, "success ", gaussianabscissae(1:lquad,vvol) case( 1 ) ; write(ounit,1000) cput-cpus, vvol, igauleg, "failed ", gaussianabscissae(1:lquad,vvol) case( 2 ) ; write(ounit,1000) cput-cpus, vvol, igauleg, "input error ", gaussianabscissae(1:lquad,vvol) case default ; write(ounit,1000) cput-cpus, vvol, igauleg, "weird ", gaussianabscissae(1:lquad,vvol) - FATAL( preset, .true., weird ifail returned by gauleg ) + + if( .true. ) then + write(6,'("preset : fatal : myid=",i3," ; .true. ; weird ifail returned by gauleg ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "preset : .true. : weird ifail returned by gauleg ;" + endif + end select ; ; if( Wpreset ) write(ounit,1001) gaussianweight(1:lquad,vvol) endif @@ -893,7 +1091,13 @@ subroutine preset if (LBnewton .or. LBsequad) Lconstraint = 2 if (Lconstraint .eq. 2) then - FATAL( preset, Lfreebound.eq.1, The combination of helicity constraint and free boundary is under construction ) + + if( Lfreebound.eq.1 ) then + write(6,'("preset : fatal : myid=",i3," ; Lfreebound.eq.1 ; The combination of helicity constraint and free boundary is under construction ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "preset : Lfreebound.eq.1 : The combination of helicity constraint and free boundary is under construction ;" + endif + if (Igeometry .eq. 3 .and. myid.eq.0) then write(ounit, *) 'WARNING: The Hessian matrix needs further review for Igeometry = 3' write(ounit, *) ' However, it can still serve the purpose of Lfindzero = 2' @@ -901,7 +1105,7 @@ subroutine preset endif if( myid.eq.0 ) then - cput = GETTIME + cput = MPI_WTIME() write(ounit,'("preset : ",f10.2," : LBsequad="L2" , LBnewton="L2" , LBlinear="L2" ;")')cput-cpus, LBsequad, LBnewton, LBlinear endif @@ -916,7 +1120,10 @@ subroutine preset !>
  • this is only used in dforce() in constructing the force-imbalance vector
  • !> - SALLOCATE( BBweight, (1:mn), opsilon * exp( - escale * ( im(1:mn)**2 + (in(1:mn)/Nfp)**2 ) ) ) + + allocate( BBweight(1:mn), stat=astat ) + BBweight(1:mn) = opsilon * exp( - escale * ( im(1:mn)**2 + (in(1:mn)/Nfp)**2 ) ) + if( myid.eq.0 .and. escale.gt.small ) then do ii = 1, mn ; write(ounit,'("preset : " 10x " : myid="i3" ; ("i3","i3") : BBweight="es13.5" ;")') myid, im(ii), in(ii)/Nfp, BBweight(ii) @@ -934,7 +1141,10 @@ subroutine preset !> where \f$p \equiv\,\f$\c pcondense . !> - SALLOCATE( mmpp, (1:mn), zero ) + + allocate( mmpp(1:mn), stat=astat ) + mmpp(1:mn) = zero + do ii = 1, mn ; mi = im(ii) @@ -974,40 +1184,124 @@ subroutine preset !> An initial state is required for iterative solvers of the Beltrami fields, see \c LBeltrami . !> - SALLOCATE( NAdof, (1:Mvol ), 0 ) ! Beltrami degrees-of-freedom in each annulus; - SALLOCATE( Nfielddof,(1:Mvol ), 0 ) ! Beltrami degrees-of-freedom in each annulus, field only; - SALLOCATE( NdMASmax, (1:Mvol ), 0 ) ! The maximum size of sparse matrix for GMRES preconditioning; - SALLOCATE( NdMAS , (1:Mvol ), 0 ) ! The actual size of sparse matrix for GMRES preconditioning; - - NALLOCATE( Ate , (1:Mvol,-2:2,1:mn) ) ! recall that this is type:sub-grid; 31 Jan 13; - NALLOCATE( Aze , (1:Mvol,-2:2,1:mn) ) ! -2 : for use of matrix-free solver ; -1 : for use of force gradient - NALLOCATE( Ato , (1:Mvol,-2:2,1:mn) ) ! 0 : normal data - NALLOCATE( Azo , (1:Mvol,-2:2,1:mn) ) ! 1:2: use to compute derivative w.r.t. fluxes - - SALLOCATE( Fso , (1:Mvol, 1:mn), 0 ) ! these will become redundant if/when Lagrange multipliers are used to enforce bounday constraints; 26 Jan 16; - SALLOCATE( Fse , (1:Mvol, 1:mn), 0 ) - - SALLOCATE( Lma , (1:Mvol, 1:mn), 0 ) ! degree of freedom index; for Lagrange multiplier; 08 Feb 16; - SALLOCATE( Lmb , (1:Mvol, 1:mn), 0 ) - SALLOCATE( Lmc , (1:Mvol, 1:mn), 0 ) ! only need Lmc(2:mn) ; only for NOTstellsym; 08 Feb 16; - SALLOCATE( Lmd , (1:Mvol, 1:mn), 0 ) ! only need Lmd(2:mn) ; only for NOTstellsym; 08 Feb 16; - SALLOCATE( Lme , (1:Mvol, 1:mn), 0 ) ! only need Lme(2:mn) ; - SALLOCATE( Lmf , (1:Mvol, 1:mn), 0 ) ! only need Lmf(2:mn) ; only for NOTstellsym; 08 Feb 16; - SALLOCATE( Lmg , (1:Mvol, 1:mn), 0 ) ! only need Lmg(1 ) ; - SALLOCATE( Lmh , (1:Mvol, 1:mn), 0 ) ! only need Lmh(1 ) ; - - SALLOCATE( Lmavalue, (1:Mvol, 1:mn), zero ) - SALLOCATE( Lmbvalue, (1:Mvol, 1:mn), zero ) - SALLOCATE( Lmcvalue, (1:Mvol, 1:mn), zero ) - SALLOCATE( Lmdvalue, (1:Mvol, 1:mn), zero ) - SALLOCATE( Lmevalue, (1:Mvol, 1:mn), zero ) - SALLOCATE( Lmfvalue, (1:Mvol, 1:mn), zero ) - SALLOCATE( Lmgvalue, (1:Mvol, 1:mn), zero ) - SALLOCATE( Lmhvalue, (1:Mvol, 1:mn), zero ) + + allocate( NAdof(1:Mvol ), stat=astat ) + NAdof(1:Mvol ) = 0 + ! Beltrami degrees-of-freedom in each annulus; + + allocate( Nfielddof(1:Mvol ), stat=astat ) + Nfielddof(1:Mvol ) = 0 + ! Beltrami degrees-of-freedom in each annulus, field only; + + allocate( NdMASmax(1:Mvol ), stat=astat ) + NdMASmax(1:Mvol ) = 0 + ! The maximum size of sparse matrix for GMRES preconditioning; + + allocate( NdMAS (1:Mvol ), stat=astat ) + NdMAS (1:Mvol ) = 0 + ! The actual size of sparse matrix for GMRES preconditioning; + + + allocate(Ate (1:Mvol,-2:2,1:mn) ,stat=astat) + ! recall that this is type:sub-grid; 31 Jan 13; + + allocate(Aze (1:Mvol,-2:2,1:mn) ,stat=astat) + ! -2 : for use of matrix-free solver ; -1 : for use of force gradient + + allocate(Ato (1:Mvol,-2:2,1:mn) ,stat=astat) + ! 0 : normal data + + allocate(Azo (1:Mvol,-2:2,1:mn) ,stat=astat) + ! 1:2: use to compute derivative w.r.t. fluxes + + + allocate( Fso (1:Mvol, 1:mn), stat=astat ) + Fso (1:Mvol, 1:mn) = 0 + ! these will become redundant if/when Lagrange multipliers are used to enforce bounday constraints; 26 Jan 16; + + allocate( Fse (1:Mvol, 1:mn), stat=astat ) + Fse (1:Mvol, 1:mn) = 0 + + + + allocate( Lma (1:Mvol, 1:mn), stat=astat ) + Lma (1:Mvol, 1:mn) = 0 + ! degree of freedom index; for Lagrange multiplier; 08 Feb 16; + + allocate( Lmb (1:Mvol, 1:mn), stat=astat ) + Lmb (1:Mvol, 1:mn) = 0 + + + allocate( Lmc (1:Mvol, 1:mn), stat=astat ) + Lmc (1:Mvol, 1:mn) = 0 + ! only need Lmc(2:mn) ; only for NOTstellsym; 08 Feb 16; + + allocate( Lmd (1:Mvol, 1:mn), stat=astat ) + Lmd (1:Mvol, 1:mn) = 0 + ! only need Lmd(2:mn) ; only for NOTstellsym; 08 Feb 16; + + allocate( Lme (1:Mvol, 1:mn), stat=astat ) + Lme (1:Mvol, 1:mn) = 0 + ! only need Lme(2:mn) ; + + allocate( Lmf (1:Mvol, 1:mn), stat=astat ) + Lmf (1:Mvol, 1:mn) = 0 + ! only need Lmf(2:mn) ; only for NOTstellsym; 08 Feb 16; + + allocate( Lmg (1:Mvol, 1:mn), stat=astat ) + Lmg (1:Mvol, 1:mn) = 0 + ! only need Lmg(1 ) ; + + allocate( Lmh (1:Mvol, 1:mn), stat=astat ) + Lmh (1:Mvol, 1:mn) = 0 + ! only need Lmh(1 ) ; + + + allocate( Lmavalue(1:Mvol, 1:mn), stat=astat ) + Lmavalue(1:Mvol, 1:mn) = zero + + + allocate( Lmbvalue(1:Mvol, 1:mn), stat=astat ) + Lmbvalue(1:Mvol, 1:mn) = zero + + + allocate( Lmcvalue(1:Mvol, 1:mn), stat=astat ) + Lmcvalue(1:Mvol, 1:mn) = zero + + + allocate( Lmdvalue(1:Mvol, 1:mn), stat=astat ) + Lmdvalue(1:Mvol, 1:mn) = zero + + + allocate( Lmevalue(1:Mvol, 1:mn), stat=astat ) + Lmevalue(1:Mvol, 1:mn) = zero + + + allocate( Lmfvalue(1:Mvol, 1:mn), stat=astat ) + Lmfvalue(1:Mvol, 1:mn) = zero + + + allocate( Lmgvalue(1:Mvol, 1:mn), stat=astat ) + Lmgvalue(1:Mvol, 1:mn) = zero + + + allocate( Lmhvalue(1:Mvol, 1:mn), stat=astat ) + Lmhvalue(1:Mvol, 1:mn) = zero + do vvol = 1, Mvol - LREGION(vvol) + + if( Igeometry.eq.1 .or. vvol.gt.1 ) then ; Lcoordinatesingularity = .false. + else ; Lcoordinatesingularity = .true. + endif + + if( vvol.le.Nvol ) then ; Lplasmaregion = .true. + else ; Lplasmaregion = .false. + endif + + Lvacuumregion = .not.Lplasmaregion + if( Lcoordinatesingularity ) then zerdof = 0 ! count Zernike degree of freedom 30 Jun 19 @@ -1084,19 +1378,43 @@ subroutine preset do ideriv = -2, 2 ! loop over derivatives; 14 Jan 13; - SALLOCATE( Ate(vvol,ideriv,ii)%s, (0:Lrad(vvol)), zero ) - SALLOCATE( Aze(vvol,ideriv,ii)%s, (0:Lrad(vvol)), zero ) - SALLOCATE( Ato(vvol,ideriv,ii)%s, (0:Lrad(vvol)), zero ) - SALLOCATE( Azo(vvol,ideriv,ii)%s, (0:Lrad(vvol)), zero ) + + allocate( Ate(vvol,ideriv,ii)%s(0:Lrad(vvol)), stat=astat ) + Ate(vvol,ideriv,ii)%s(0:Lrad(vvol)) = zero + + + allocate( Aze(vvol,ideriv,ii)%s(0:Lrad(vvol)), stat=astat ) + Aze(vvol,ideriv,ii)%s(0:Lrad(vvol)) = zero + + + allocate( Ato(vvol,ideriv,ii)%s(0:Lrad(vvol)), stat=astat ) + Ato(vvol,ideriv,ii)%s(0:Lrad(vvol)) = zero + + + allocate( Azo(vvol,ideriv,ii)%s(0:Lrad(vvol)), stat=astat ) + Azo(vvol,ideriv,ii)%s(0:Lrad(vvol)) = zero + enddo ! end of do ideriv; ; ideriv = 0 - SALLOCATE( Ate(vvol,ideriv,ii)%i, (0:Lrad(vvol)), 0 ) ! degree of freedom index; 17 Jan 13; - SALLOCATE( Aze(vvol,ideriv,ii)%i, (0:Lrad(vvol)), 0 ) - SALLOCATE( Ato(vvol,ideriv,ii)%i, (0:Lrad(vvol)), 0 ) - SALLOCATE( Azo(vvol,ideriv,ii)%i, (0:Lrad(vvol)), 0 ) + + allocate( Ate(vvol,ideriv,ii)%i(0:Lrad(vvol)), stat=astat ) + Ate(vvol,ideriv,ii)%i(0:Lrad(vvol)) = 0 + ! degree of freedom index; 17 Jan 13; + + allocate( Aze(vvol,ideriv,ii)%i(0:Lrad(vvol)), stat=astat ) + Aze(vvol,ideriv,ii)%i(0:Lrad(vvol)) = 0 + + + allocate( Ato(vvol,ideriv,ii)%i(0:Lrad(vvol)), stat=astat ) + Ato(vvol,ideriv,ii)%i(0:Lrad(vvol)) = 0 + + + allocate( Azo(vvol,ideriv,ii)%i(0:Lrad(vvol)), stat=astat ) + Azo(vvol,ideriv,ii)%i(0:Lrad(vvol)) = 0 + enddo ! end of do ii; @@ -1184,8 +1502,20 @@ subroutine preset enddo ! end of do ii; 25 Jan 13; - FATAL( preset, idof.ne.NAdof(vvol), need to count Beltrami degrees-of-freedom more carefully for coordinate singularity ) - FATAL( preset, (idof+1)**2.ge.HUGE(idof)), NAdof too big, should be smaller than maximum of int32 type ) + + if( idof.ne.NAdof(vvol) ) then + write(6,'("preset : fatal : myid=",i3," ; idof.ne.NAdof(vvol) ; need to count Beltrami degrees-of-freedom more carefully for coordinate singularity ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "preset : idof.ne.NAdof(vvol) : need to count Beltrami degrees-of-freedom more carefully for coordinate singularity ;" + endif + + + if( (idof+1)**2.ge.HUGE(idof) ) then + write(6,'("preset : fatal : myid=",i3," ; (idof+1)**2.ge.HUGE(idof) ; ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "preset : (idof+1)**2.ge.HUGE(idof) : ;" + endif + ! NAdof too big, should be smaller than maximum of int32 type ) else ! .not.Lcoordinatesingularity; @@ -1236,12 +1566,30 @@ subroutine preset ! enddo !endif - FATAL( preset, idof.ne.NAdof(vvol), need to count degrees-of-freedom more carefully for new matrix ) - FATAL( preset, (idof+1)**2.ge.HUGE(idof)), NAdof too big, should be smaller than maximum of int32 type ) + + if( idof.ne.NAdof(vvol) ) then + write(6,'("preset : fatal : myid=",i3," ; idof.ne.NAdof(vvol) ; need to count degrees-of-freedom more carefully for new matrix ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "preset : idof.ne.NAdof(vvol) : need to count degrees-of-freedom more carefully for new matrix ;" + endif + + + if( (idof+1)**2.ge.HUGE(idof) ) then + write(6,'("preset : fatal : myid=",i3," ; (idof+1)**2.ge.HUGE(idof) ; ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "preset : (idof+1)**2.ge.HUGE(idof) : ;" + endif + !, NAdof too big, should be smaller than maximum of int32 type ) endif ! end of if( Lcoordinatesingularity ) ; - FATAL( preset, idof.ne.NAdof(vvol), impossible logic ) + + if( idof.ne.NAdof(vvol) ) then + write(6,'("preset : fatal : myid=",i3," ; idof.ne.NAdof(vvol) ; impossible logic ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "preset : idof.ne.NAdof(vvol) : impossible logic ;" + endif + do ii = 1, mn do jj = 0, Lrad(vvol) @@ -1259,13 +1607,18 @@ subroutine preset !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - if( Linitgues.eq.2 ) then ; WCALL( preset, ra00aa, ('R') ) ! read initial guess for Beltrami field from file; 02 Jan 15; + if( Linitgues.eq.2 ) then ; + cput = MPI_WTIME() + Tpreset = Tpreset + ( cput-cpuo ) + call ra00aa('R') + cpuo = MPI_WTIME() + ! read initial guess for Beltrami field from file; 02 Jan 15; endif !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! if( myid.eq.0 ) then ! 17 Oct 12; - cput = GETTIME + cput = MPI_WTIME() write(ounit,'("preset : ", 10x ," : ")') write(ounit,'("preset : ",f10.2," : Nquad="i4" ; mn="i5" ; NGdof="i6" ; NAdof="16(i6",")" ...")') cput-cpus, Nquad, mn, NGdof, NAdof(1:min(Mvol,16)) endif @@ -1284,34 +1637,91 @@ subroutine preset endif if( myid.eq.0 ) then ! 17 Oct 12; - cput = GETTIME + cput = MPI_WTIME() write(ounit,'("preset : ", 10x ," : ")') write(ounit,'("preset : ",f10.2," : Nt="i6" ; Nz="i6" ; Ntz="i9" ;")') cput-cpus, Nt, Nz, Ntz endif - SALLOCATE( iRij, (1:Ntz,0:Mvol), zero ) ! interface geometry in real space; ! 18 Jul 14; - SALLOCATE( iZij, (1:Ntz,0:Mvol), zero ) ! - SALLOCATE( dRij, (1:Ntz,1:Mvol), zero ) ! interface geometry in real space; poloidal derivative; ! 18 Jul 14; - SALLOCATE( dZij, (1:Ntz,1:Mvol), zero ) - SALLOCATE( tRij, (1:Ntz,0:Mvol), zero ) ! interface geometry in real space; poloidal derivative; ! 18 Jul 14; - SALLOCATE( tZij, (1:Ntz,0:Mvol), zero ) - SALLOCATE( Rij, (1:Ntz,0:3,0:3 ), zero ) ! these are used for inverse fft to reconstruct real space geometry from interpolated Fourier harmonics; - SALLOCATE( Zij, (1:Ntz,0:3,0:3 ), zero ) - SALLOCATE( sg , (1:Ntz,0:3 ), zero ) - SALLOCATE( guvij, (1:Ntz,0:3,0:3,-1:3), zero ) ! need this on higher resolution grid for accurate Fourier decomposition; - SALLOCATE( gvuij, (1:Ntz,0:3,0:3 ), zero ) ! need this on higher resolution grid for accurate Fourier decomposition; 10 Dec 15; + allocate( iRij(1:Ntz,0:Mvol), stat=astat ) + iRij(1:Ntz,0:Mvol) = zero + ! interface geometry in real space; ! 18 Jul 14; + + allocate( iZij(1:Ntz,0:Mvol), stat=astat ) + iZij(1:Ntz,0:Mvol) = zero + ! + + allocate( dRij(1:Ntz,1:Mvol), stat=astat ) + dRij(1:Ntz,1:Mvol) = zero + ! interface geometry in real space; poloidal derivative; ! 18 Jul 14; + + allocate( dZij(1:Ntz,1:Mvol), stat=astat ) + dZij(1:Ntz,1:Mvol) = zero + + + allocate( tRij(1:Ntz,0:Mvol), stat=astat ) + tRij(1:Ntz,0:Mvol) = zero + ! interface geometry in real space; poloidal derivative; ! 18 Jul 14; + + allocate( tZij(1:Ntz,0:Mvol), stat=astat ) + tZij(1:Ntz,0:Mvol) = zero + + + + allocate( Rij(1:Ntz,0:3,0:3 ), stat=astat ) + Rij(1:Ntz,0:3,0:3 ) = zero + ! these are used for inverse fft to reconstruct real space geometry from interpolated Fourier harmonics; + + allocate( Zij(1:Ntz,0:3,0:3 ), stat=astat ) + Zij(1:Ntz,0:3,0:3 ) = zero + + + allocate( sg (1:Ntz,0:3 ), stat=astat ) + sg (1:Ntz,0:3 ) = zero + + + allocate( guvij(1:Ntz,0:3,0:3,-1:3), stat=astat ) + guvij(1:Ntz,0:3,0:3,-1:3) = zero + ! need this on higher resolution grid for accurate Fourier decomposition; + + allocate( gvuij(1:Ntz,0:3,0:3 ), stat=astat ) + gvuij(1:Ntz,0:3,0:3 ) = zero + ! need this on higher resolution grid for accurate Fourier decomposition; 10 Dec 15; if ((Lfindzero .eq. 2) .or. (Lcheck.eq.5 .or. LHevalues .or. LHevectors .or. LHmatrix .or. Lperturbed.eq.1)) then - SALLOCATE( dRadR, (1:mn,0:1,0:1,1:mn), zero ) ! calculated in rzaxis; 19 Sep 16; - SALLOCATE( dRadZ, (1:mn,0:1,0:1,1:mn), zero ) - SALLOCATE( dZadR, (1:mn,0:1,0:1,1:mn), zero ) - SALLOCATE( dZadZ, (1:mn,0:1,0:1,1:mn), zero ) - - SALLOCATE( dRodR, (1:Ntz,0:3,1:mn), zero ) ! calculated in rzaxis; 19 Sep 16; - SALLOCATE( dRodZ, (1:Ntz,0:3,1:mn), zero ) - SALLOCATE( dZodR, (1:Ntz,0:3,1:mn), zero ) - SALLOCATE( dZodZ, (1:Ntz,0:3,1:mn), zero ) + + allocate( dRadR(1:mn,0:1,0:1,1:mn), stat=astat ) + dRadR(1:mn,0:1,0:1,1:mn) = zero + ! calculated in rzaxis; 19 Sep 16; + + allocate( dRadZ(1:mn,0:1,0:1,1:mn), stat=astat ) + dRadZ(1:mn,0:1,0:1,1:mn) = zero + + + allocate( dZadR(1:mn,0:1,0:1,1:mn), stat=astat ) + dZadR(1:mn,0:1,0:1,1:mn) = zero + + + allocate( dZadZ(1:mn,0:1,0:1,1:mn), stat=astat ) + dZadZ(1:mn,0:1,0:1,1:mn) = zero + + + + allocate( dRodR(1:Ntz,0:3,1:mn), stat=astat ) + dRodR(1:Ntz,0:3,1:mn) = zero + ! calculated in rzaxis; 19 Sep 16; + + allocate( dRodZ(1:Ntz,0:3,1:mn), stat=astat ) + dRodZ(1:Ntz,0:3,1:mn) = zero + + + allocate( dZodR(1:Ntz,0:3,1:mn), stat=astat ) + dZodR(1:Ntz,0:3,1:mn) = zero + + + allocate( dZodZ(1:Ntz,0:3,1:mn), stat=astat ) + dZodZ(1:Ntz,0:3,1:mn) = zero + endif !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -1337,48 +1747,144 @@ subroutine preset !> **gzzmne, gzzmno: metric information** !> These are defined in metrix() , and used in ma00aa(). !> - SALLOCATE( goomne, (0:mne, maxIquad), zero ) ! workspace for Fourier decomposition of metric terms; - SALLOCATE( goomno, (0:mne, maxIquad), zero ) - SALLOCATE( gssmne, (0:mne, maxIquad), zero ) ! workspace for Fourier decomposition of metric terms; - SALLOCATE( gssmno, (0:mne, maxIquad), zero ) - SALLOCATE( gstmne, (0:mne, maxIquad), zero ) ! workspace for Fourier decomposition of metric terms; - SALLOCATE( gstmno, (0:mne, maxIquad), zero ) - SALLOCATE( gszmne, (0:mne, maxIquad), zero ) ! workspace for Fourier decomposition of metric terms; - SALLOCATE( gszmno, (0:mne, maxIquad), zero ) - SALLOCATE( gttmne, (0:mne, maxIquad), zero ) ! workspace for Fourier decomposition of metric terms; - SALLOCATE( gttmno, (0:mne, maxIquad), zero ) - SALLOCATE( gtzmne, (0:mne, maxIquad), zero ) ! workspace for Fourier decomposition of metric terms; - SALLOCATE( gtzmno, (0:mne, maxIquad), zero ) - SALLOCATE( gzzmne, (0:mne, maxIquad), zero ) ! workspace for Fourier decomposition of metric terms; - SALLOCATE( gzzmno, (0:mne, maxIquad), zero ) + + allocate( goomne(0:mne, maxIquad), stat=astat ) + goomne(0:mne, maxIquad) = zero + ! workspace for Fourier decomposition of metric terms; + + allocate( goomno(0:mne, maxIquad), stat=astat ) + goomno(0:mne, maxIquad) = zero + + + allocate( gssmne(0:mne, maxIquad), stat=astat ) + gssmne(0:mne, maxIquad) = zero + ! workspace for Fourier decomposition of metric terms; + + allocate( gssmno(0:mne, maxIquad), stat=astat ) + gssmno(0:mne, maxIquad) = zero + + + allocate( gstmne(0:mne, maxIquad), stat=astat ) + gstmne(0:mne, maxIquad) = zero + ! workspace for Fourier decomposition of metric terms; + + allocate( gstmno(0:mne, maxIquad), stat=astat ) + gstmno(0:mne, maxIquad) = zero + + + allocate( gszmne(0:mne, maxIquad), stat=astat ) + gszmne(0:mne, maxIquad) = zero + ! workspace for Fourier decomposition of metric terms; + + allocate( gszmno(0:mne, maxIquad), stat=astat ) + gszmno(0:mne, maxIquad) = zero + + + allocate( gttmne(0:mne, maxIquad), stat=astat ) + gttmne(0:mne, maxIquad) = zero + ! workspace for Fourier decomposition of metric terms; + + allocate( gttmno(0:mne, maxIquad), stat=astat ) + gttmno(0:mne, maxIquad) = zero + + + allocate( gtzmne(0:mne, maxIquad), stat=astat ) + gtzmne(0:mne, maxIquad) = zero + ! workspace for Fourier decomposition of metric terms; + + allocate( gtzmno(0:mne, maxIquad), stat=astat ) + gtzmno(0:mne, maxIquad) = zero + + + allocate( gzzmne(0:mne, maxIquad), stat=astat ) + gzzmne(0:mne, maxIquad) = zero + ! workspace for Fourier decomposition of metric terms; + + allocate( gzzmno(0:mne, maxIquad), stat=astat ) + gzzmno(0:mne, maxIquad) = zero + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - SALLOCATE( ijreal, (1:Ntz), zero ) ! real space grid; - SALLOCATE( ijimag, (1:Ntz), zero ) - SALLOCATE( jireal, (1:Ntz), zero ) - SALLOCATE( jiimag, (1:Ntz), zero ) - SALLOCATE( jkreal, (1:Ntz), zero ) - SALLOCATE( jkimag, (1:Ntz), zero ) - SALLOCATE( kjreal, (1:Ntz), zero ) - SALLOCATE( kjimag, (1:Ntz), zero ) + allocate( ijreal(1:Ntz), stat=astat ) + ijreal(1:Ntz) = zero + ! real space grid; + + allocate( ijimag(1:Ntz), stat=astat ) + ijimag(1:Ntz) = zero + + + allocate( jireal(1:Ntz), stat=astat ) + jireal(1:Ntz) = zero + + + allocate( jiimag(1:Ntz), stat=astat ) + jiimag(1:Ntz) = zero + + + + allocate( jkreal(1:Ntz), stat=astat ) + jkreal(1:Ntz) = zero + + + allocate( jkimag(1:Ntz), stat=astat ) + jkimag(1:Ntz) = zero + + + allocate( kjreal(1:Ntz), stat=astat ) + kjreal(1:Ntz) = zero + + + allocate( kjimag(1:Ntz), stat=astat ) + kjimag(1:Ntz) = zero + + + + allocate( cplxin(1:Nt,1:Nz,nthreads), stat=astat ) + cplxin(1:Nt,1:Nz,nthreads) = zero + + + allocate( cplxout(1:Nt,1:Nz,nthreads), stat=astat ) + cplxout(1:Nt,1:Nz,nthreads) = zero - SALLOCATE( cplxin, (1:Nt,1:Nz,nthreads), zero ) - SALLOCATE( cplxout, (1:Nt,1:Nz,nthreads), zero ) ! Create and save optimal plans for forward and inverse 2D fast Fourier transforms with FFTW. -JAB; 25 Jul 2017 planf = fftw_plan_dft_2d( Nz, Nt, cplxin(:,:,1), cplxout(:,:,1), FFTW_FORWARD, FFTW_MEASURE + FFTW_DESTROY_INPUT ) planb = fftw_plan_dft_2d( Nz, Nt, cplxin(:,:,1), cplxout(:,:,1), FFTW_BACKWARD, FFTW_MEASURE + FFTW_DESTROY_INPUT ) - SALLOCATE( efmn, (1:mne), zero ) ! Fourier harmonics workspace; 24 Apr 13; - SALLOCATE( ofmn, (1:mne), zero ) - SALLOCATE( cfmn, (1:mne), zero ) - SALLOCATE( sfmn, (1:mne), zero ) - SALLOCATE( evmn, (1:mne), zero ) - SALLOCATE( odmn, (1:mne), zero ) - SALLOCATE( comn, (1:mne), zero ) - SALLOCATE( simn, (1:mne), zero ) + + allocate( efmn(1:mne), stat=astat ) + efmn(1:mne) = zero + ! Fourier harmonics workspace; 24 Apr 13; + + allocate( ofmn(1:mne), stat=astat ) + ofmn(1:mne) = zero + + + allocate( cfmn(1:mne), stat=astat ) + cfmn(1:mne) = zero + + + allocate( sfmn(1:mne), stat=astat ) + sfmn(1:mne) = zero + + + allocate( evmn(1:mne), stat=astat ) + evmn(1:mne) = zero + + + allocate( odmn(1:mne), stat=astat ) + odmn(1:mne) = zero + + + allocate( comn(1:mne), stat=astat ) + comn(1:mne) = zero + + + allocate( simn(1:mne), stat=astat ) + simn(1:mne) = zero + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -1391,14 +1897,38 @@ subroutine preset !> \f} !> - SALLOCATE( gteta, (1:Ntz), zero ) - SALLOCATE( gzeta, (1:Ntz), zero ) - SALLOCATE( cosi, (1:Ntz,1:mn), zero ) - SALLOCATE( sini, (1:Ntz,1:mn), zero ) + allocate( gteta(1:Ntz), stat=astat ) + gteta(1:Ntz) = zero + + + allocate( gzeta(1:Ntz), stat=astat ) + gzeta(1:Ntz) = zero + + + + allocate( cosi(1:Ntz,1:mn), stat=astat ) + cosi(1:Ntz,1:mn) = zero + + + allocate( sini(1:Ntz,1:mn), stat=astat ) + sini(1:Ntz,1:mn) = zero + + + + if( Nz.eq.0 ) then + write(6,'("preset : fatal : myid=",i3," ; Nz.eq.0 ; illegal division ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "preset : Nz.eq.0 : illegal division ;" + endif + + + if( Nt.eq.0 ) then + write(6,'("preset : fatal : myid=",i3," ; Nt.eq.0 ; illegal division ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "preset : Nt.eq.0 : illegal division ;" + endif - FATAL( preset, Nz.eq.0, illegal division ) - FATAL( preset, Nt.eq.0, illegal division ) do ii = 1, mn ; mi = im(ii) ; ni = in(ii) ! loop over Fourier harmonics; @@ -1471,7 +2001,12 @@ subroutine preset case( 2 ) ; vvol = Mvol end select - WCALL( preset, rzaxis, ( Mvol, mn, iRbc(1:mn,0:Mvol), iZbs(1:mn,0:Mvol), iRbs(1:mn,0:Mvol), iZbc(1:mn,0:Mvol), vvol, .false. ) ) ! set coordinate axis; 19 Jul 16; + + cput = MPI_WTIME() + Tpreset = Tpreset + ( cput-cpuo ) + call rzaxis( Mvol, mn, iRbc(1:mn,0:Mvol), iZbs(1:mn,0:Mvol), iRbs(1:mn,0:Mvol), iZbc(1:mn,0:Mvol), vvol, .false. ) + cpuo = MPI_WTIME() + ! set coordinate axis; 19 Jul 16; endif ! end of if( Igeometry.eq.3 ) then ; 19 Jul 16; @@ -1497,8 +2032,14 @@ subroutine preset !> and used only for the initialization of the surfaces taking into account axis information if provided. !> - SALLOCATE( psifactor, (1:mn,1:Mvol), zero ) - SALLOCATE( inifactor, (1:mn,1:Mvol), zero ) + + allocate( psifactor(1:mn,1:Mvol), stat=astat ) + psifactor(1:mn,1:Mvol) = zero + + + allocate( inifactor(1:mn,1:Mvol), stat=astat ) + inifactor(1:mn,1:Mvol) = zero + psifactor(1:mn,1:Mvol) = one inifactor(1:mn,1:Mvol) = one @@ -1533,7 +2074,13 @@ subroutine preset case default - FATAL( readin, .true., invalid Igeometry for construction of psifactor ) + + if( .true. ) then + write(6,'("readin : fatal : myid=",i3," ; .true. ; invalid Igeometry for construction of psifactor ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "readin : .true. : invalid Igeometry for construction of psifactor ;" + endif + end select @@ -1556,7 +2103,13 @@ subroutine preset case( 2 ) ! cylindrical - standard; 20 Apr 13; - FATAL( preset, Linitialize.ne.1, geometrical initialization under construction for cylindrical ) + + if( Linitialize.ne.1 ) then + write(6,'("preset : fatal : myid=",i3," ; Linitialize.ne.1 ; geometrical initialization under construction for cylindrical ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "preset : Linitialize.ne.1 : geometrical initialization under construction for cylindrical ;" + endif + do vvol = 1, Nvol-1 ;iRbc(1:mn,vvol) = iRbc(1:mn,Nvol) * psifactor(1:mn,vvol) @@ -1567,11 +2120,23 @@ subroutine preset case( 3 ) ! toroidal; 20 Apr 13; - FATAL( preset, Linitialize.lt.0, geometrical initialization under construction for toroidal ) ! see commented-out source below; 19 Jul 16; + + if( Linitialize.lt.0 ) then + write(6,'("preset : fatal : myid=",i3," ; Linitialize.lt.0 ; geometrical initialization under construction for toroidal ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "preset : Linitialize.lt.0 : geometrical initialization under construction for toroidal ;" + endif + ! see commented-out source below; 19 Jul 16; lvol = Nvol-1 + Linitialize - FATAL( preset, lvol.gt.Mvol, perhaps illegal combination of Linitialize and Lfreebound ) + + if( lvol.gt.Mvol ) then + write(6,'("preset : fatal : myid=",i3," ; lvol.gt.Mvol ; perhaps illegal combination of Linitialize and Lfreebound ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "preset : lvol.gt.Mvol : perhaps illegal combination of Linitialize and Lfreebound ;" + endif + ! do vvol = 1, Nvol-1 ! 19 Jul 16; ! ;iRbc(1:mn,vvol) = iRbc(1:mn,0) + ( iRbc(1:mn,Nvol) - iRbc(1:mn,0) ) * psifactor(1:mn,vvol) ! 19 Jul 16; @@ -1608,8 +2173,14 @@ subroutine preset !> **Bsupumn and Bsupvmn** - SALLOCATE( Bsupumn, (1:Nvol,0:1,1:mn), zero ) ! Fourier components of {\bf B}\cdot\nabla \theta on boundary; required for virtual casing; - SALLOCATE( Bsupvmn, (1:Nvol,0:1,1:mn), zero ) ! Fourier components of {\bf B}\cdot\nabla \zeta on boundary; + + allocate( Bsupumn(1:Nvol,0:1,1:mn), stat=astat ) + Bsupumn(1:Nvol,0:1,1:mn) = zero + ! Fourier components of {\bf B}\cdot\nabla \theta on boundary; required for virtual casing; + + allocate( Bsupvmn(1:Nvol,0:1,1:mn), stat=astat ) + Bsupvmn(1:Nvol,0:1,1:mn) = zero + ! Fourier components of {\bf B}\cdot\nabla \zeta on boundary; !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -1649,38 +2220,101 @@ subroutine preset !>
  • The values of \c diotadxup are assigned in mp00aa() after calling tr00ab().
  • !> - SALLOCATE( diotadxup, (0:1,-1:2,1:Mvol), zero ) ! measured rotational transform on inner/outer interfaces in each annulus; - SALLOCATE( dItGpdxtp, (0:1,-1:2,1:Mvol), zero ) ! measured plasma and linking currents ; - SALLOCATE( glambda, (1:Ntz+1,0:2,0:1,1:Mvol), zero ) ! save initial guesses for iterative calculation of rotational-transform; 21 Apr 13; + allocate( diotadxup(0:1,-1:2,1:Mvol), stat=astat ) + diotadxup(0:1,-1:2,1:Mvol) = zero + ! measured rotational transform on inner/outer interfaces in each annulus; + + allocate( dItGpdxtp(0:1,-1:2,1:Mvol), stat=astat ) + dItGpdxtp(0:1,-1:2,1:Mvol) = zero + ! measured plasma and linking currents ; + + + allocate( glambda(1:Ntz+1,0:2,0:1,1:Mvol), stat=astat ) + glambda(1:Ntz+1,0:2,0:1,1:Mvol) = zero + ! save initial guesses for iterative calculation of rotational-transform; 21 Apr 13; !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! ! Construction of ``force''; - SALLOCATE( Bemn, (1:mn,1:Mvol,0:1), zero ) - SALLOCATE( Bomn, (1:mn,1:Mvol,0:1), zero ) - SALLOCATE( Iomn, (1:mn,1:Mvol ), zero ) - SALLOCATE( Iemn, (1:mn,1:Mvol ), zero ) - SALLOCATE( Somn, (1:mn,1:Mvol,0:1), zero ) - SALLOCATE( Semn, (1:mn,1:Mvol,0:1), zero ) - SALLOCATE( Pomn, (1:mn,1:Mvol,0:2), zero ) - SALLOCATE( Pemn, (1:mn,1:Mvol,0:2), zero ) - SALLOCATE( BBe , (1:Mvol-1), zero ) - SALLOCATE( IIo , (1:Mvol-1), zero ) - SALLOCATE( BBo , (1:Mvol-1), zero ) - SALLOCATE( IIe , (1:Mvol-1), zero ) + allocate( Bemn(1:mn,1:Mvol,0:1), stat=astat ) + Bemn(1:mn,1:Mvol,0:1) = zero + + + allocate( Bomn(1:mn,1:Mvol,0:1), stat=astat ) + Bomn(1:mn,1:Mvol,0:1) = zero + + + allocate( Iomn(1:mn,1:Mvol ), stat=astat ) + Iomn(1:mn,1:Mvol ) = zero + + + allocate( Iemn(1:mn,1:Mvol ), stat=astat ) + Iemn(1:mn,1:Mvol ) = zero + + + allocate( Somn(1:mn,1:Mvol,0:1), stat=astat ) + Somn(1:mn,1:Mvol,0:1) = zero + + + allocate( Semn(1:mn,1:Mvol,0:1), stat=astat ) + Semn(1:mn,1:Mvol,0:1) = zero + + + allocate( Pomn(1:mn,1:Mvol,0:2), stat=astat ) + Pomn(1:mn,1:Mvol,0:2) = zero + + + allocate( Pemn(1:mn,1:Mvol,0:2), stat=astat ) + Pemn(1:mn,1:Mvol,0:2) = zero + + + + allocate( BBe (1:Mvol-1), stat=astat ) + BBe (1:Mvol-1) = zero + + + allocate( IIo (1:Mvol-1), stat=astat ) + IIo (1:Mvol-1) = zero + + + allocate( BBo (1:Mvol-1), stat=astat ) + BBo (1:Mvol-1) = zero + + + allocate( IIe (1:Mvol-1), stat=astat ) + IIe (1:Mvol-1) = zero + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - SALLOCATE( Btemn, (1:mn,0:1,1:Mvol), zero ) ! these are declared in global, calculated in sc00aa, broadcast in xspech, and written to file in hdfint; - SALLOCATE( Bzemn, (1:mn,0:1,1:Mvol), zero ) - SALLOCATE( Btomn, (1:mn,0:1,1:Mvol), zero ) - SALLOCATE( Bzomn, (1:mn,0:1,1:Mvol), zero ) - SALLOCATE( Bloweremn, (1:mn, 3), zero) ! these are declared in global, calculated in getbco, used in mtrxhs - SALLOCATE( Bloweromn, (1:mn, 3), zero) + allocate( Btemn(1:mn,0:1,1:Mvol), stat=astat ) + Btemn(1:mn,0:1,1:Mvol) = zero + ! these are declared in global, calculated in sc00aa, broadcast in xspech, and written to file in hdfint; + + allocate( Bzemn(1:mn,0:1,1:Mvol), stat=astat ) + Bzemn(1:mn,0:1,1:Mvol) = zero + + + allocate( Btomn(1:mn,0:1,1:Mvol), stat=astat ) + Btomn(1:mn,0:1,1:Mvol) = zero + + + allocate( Bzomn(1:mn,0:1,1:Mvol), stat=astat ) + Bzomn(1:mn,0:1,1:Mvol) = zero + + + + allocate( Bloweremn(1:mn, 3), stat=astat ) + Bloweremn(1:mn, 3) = zero + ! these are declared in global, calculated in getbco, used in mtrxhs + + allocate( Bloweromn(1:mn, 3), stat=astat ) + Bloweromn(1:mn, 3) = zero + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -1697,7 +2331,10 @@ subroutine preset ! Allocate matrix to store the last solution of GMRES as initialization LILUprecond = .false. if (Lmatsolver.eq.2 .or. Lmatsolver.eq.3) then ! use GMRES - SALLOCATE(GMRESlastsolution, (MAXVAL(NAdof),0:2,1:Mvol), zero ) + + allocate( GMRESlastsolution(MAXVAL(NAdof),0:2,1:Mvol), stat=astat ) + GMRESlastsolution(MAXVAL(NAdof),0:2,1:Mvol) = zero + GMRESlastsolution = zero if (LGMRESprec .eq. 1) LILUprecond = .true. endif @@ -1710,29 +2347,55 @@ subroutine preset NOTMatrixFree = .true. endif - SALLOCATE( vvolume , (1:Mvol), zero ) ! volume integral of \sqrt g; - SALLOCATE( lBBintegral, (1:Mvol), zero ) ! volume integral of B.B ; - SALLOCATE( lABintegral, (1:Mvol), zero ) ! volume integral of A.B ; + + allocate( vvolume (1:Mvol), stat=astat ) + vvolume (1:Mvol) = zero + ! volume integral of \sqrt g; + + allocate( lBBintegral(1:Mvol), stat=astat ) + lBBintegral(1:Mvol) = zero + ! volume integral of B.B ; + + allocate( lABintegral(1:Mvol), stat=astat ) + lABintegral(1:Mvol) = zero + ! volume integral of A.B ; !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! if( YESstellsym ) lmns = 1 + (mns-1) ! number of independent degrees-of-freedom in angle transformation; 30 Jan 13; if( NOTstellsym ) lmns = 1 + (mns-1) + (mns-1) ! number of independent degrees-of-freedom in angle transformation; 30 Jan 13; - SALLOCATE( dlambdaout, (1:lmns,1:Mvol,0:1), zero ) + + allocate( dlambdaout(1:lmns,1:Mvol,0:1), stat=astat ) + dlambdaout(1:lmns,1:Mvol,0:1) = zero + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! if (Lfreebound > 0) then ! Only do for free-boundary; 7 Nov 18; - SALLOCATE( Dxyz, (1:3,1:Ntz), zero ) ! Cartesian components of computational boundary; position; 14 Apr 17; - SALLOCATE( Nxyz, (1:3,1:Ntz), zero ) ! Cartesian components of computational boundary; normal ; 14 Apr 17; - SALLOCATE( Jxyz, (1:Ntz,1:3), zero ) ! Cartesian components of virtual casing surface current; needs to be recalculated at each iteration; + allocate( Dxyz(1:3,1:Ntz), stat=astat ) + Dxyz(1:3,1:Ntz) = zero + ! Cartesian components of computational boundary; position; 14 Apr 17; + + allocate( Nxyz(1:3,1:Ntz), stat=astat ) + Nxyz(1:3,1:Ntz) = zero + ! Cartesian components of computational boundary; normal ; 14 Apr 17; + + + allocate( Jxyz(1:Ntz,1:3), stat=astat ) + Jxyz(1:Ntz,1:3) = zero + ! Cartesian components of virtual casing surface current; needs to be recalculated at each iteration; lvol = Mvol ; lss = one ; Lcurvature = 1 ; Lcoordinatesingularity = .false. ! will only require normal field on outer interface = computational boundary; - WCALL( preset, coords,( lvol, lss, Lcurvature, Ntz, mn ) ) ! will need Rij, Zij; THE COMPUTATIONAL BOUNDARY DOES NOT CHANGE; + + cput = MPI_WTIME() + Tpreset = Tpreset + ( cput-cpuo ) + call coords( lvol, lss, Lcurvature, Ntz, mn ) + cpuo = MPI_WTIME() + ! will need Rij, Zij; THE COMPUTATIONAL BOUNDARY DOES NOT CHANGE; do kk = 0, Nz-1 ; zeta = kk * pi2nfp / Nz @@ -1746,7 +2409,13 @@ subroutine preset Dxyz(1:3,jk) = (/ teta , zeta , Rij(jk,0,0) /) Nxyz(1:3,jk) = (/ - Rij(jk,2,0), -Rij(jk,3,0), one /) case( 2 ) ! Igeometry = 2 ; - FATAL( bnorml, .true., free-boundary calculations not yet implemented in cylindrical geometry ) + + if( .true. ) then + write(6,'("bnorml : fatal : myid=",i3," ; .true. ; free-boundary calculations not yet implemented in cylindrical geometry ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "bnorml : .true. : free-boundary calculations not yet implemented in cylindrical geometry ;" + endif + case( 3 ) ! Igeometry = 3 ; Dxyz(1:3,jk) = (/ Rij(jk,0,0) * cszeta(0), Rij(jk,0,0) * cszeta(1), Zij(jk,0,0) /) Nxyz(1:3,jk) = (/ Rij(jk,2,0) * cszeta(1) * Zij(jk,3,0) - Zij(jk,2,0) * ( Rij(jk,3,0) * cszeta(1) + Rij(jk,0,0) * cszeta(0) ), & @@ -1768,7 +2437,12 @@ subroutine preset Localconstraint = .true. endif - RETURN(preset) + +9999 continue + cput = MPI_WTIME() + Tpreset = Tpreset + ( cput-cpuo ) + return + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! diff --git a/src/ra00aa.f90 b/src/ra00aa.F90 similarity index 69% rename from src/ra00aa.f90 rename to src/ra00aa.F90 index 81553e76..1cf56b30 100644 --- a/src/ra00aa.f90 +++ b/src/ra00aa.F90 @@ -44,7 +44,7 @@ !> !> @param[in] writeorread 'W' to write the vector potential; 'R' to read it subroutine ra00aa( writeorread ) - + use mod_kinds, only: wp => dp !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! use constants, only : zero @@ -63,19 +63,35 @@ subroutine ra00aa( writeorread ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS - CHARACTER, intent(in) :: writeorread +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + character, intent(in) :: writeorread LOGICAL :: exist - INTEGER :: vvol, oldMvol, oldMpol, oldNtor, oldmn, oldNfp, oldLrad, ii, jj, minLrad, llmodnp, ideriv, sumLrad - INTEGER, allocatable :: oldim(:), oldin(:) - REAL , allocatable :: oldAte(:), oldAze(:), oldAto(:), oldAzo(:) - REAL , allocatable :: allAte(:,:), allAze(:,:), allAto(:,:), allAzo(:,:) + integer :: vvol, oldMvol, oldMpol, oldNtor, oldmn, oldNfp, oldLrad, ii, jj, minLrad, llmodnp, ideriv, sumLrad + integer, allocatable :: oldim(:), oldin(:) + real(wp) , allocatable :: oldAte(:), oldAze(:), oldAto(:), oldAzo(:) + real(wp) , allocatable :: allAte(:,:), allAze(:,:), allAto(:,:), allAzo(:,:) - BEGIN(ra00aa) + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -94,11 +110,41 @@ subroutine ra00aa( writeorread ) if( myid.eq.0 ) then do vvol = 1, Mvol do ii = 1, mn ! loop over Fourier harmonics; - FATAL( ra00aa, .not.allocated(Ate(vvol,ideriv,ii)%s), error ) - FATAL( ra00aa, .not.allocated(Aze(vvol,ideriv,ii)%s), error ) - FATAL( ra00aa, .not.allocated(Ato(vvol,ideriv,ii)%s), error ) - FATAL( ra00aa, .not.allocated(Azo(vvol,ideriv,ii)%s), error ) - FATAL( ra00aa, Lrad(vvol).le.0, error ) ! TODO: probably not needed, since a lot other things do not work as well if Lrad is messed up + + if( .not.allocated(Ate(vvol,ideriv,ii)%s) ) then + write(6,'("ra00aa : fatal : myid=",i3," ; .not.allocated(Ate(vvol,ideriv,ii)%s) ; error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "ra00aa : .not.allocated(Ate(vvol,ideriv,ii)%s) : error ;" + endif + + + if( .not.allocated(Aze(vvol,ideriv,ii)%s) ) then + write(6,'("ra00aa : fatal : myid=",i3," ; .not.allocated(Aze(vvol,ideriv,ii)%s) ; error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "ra00aa : .not.allocated(Aze(vvol,ideriv,ii)%s) : error ;" + endif + + + if( .not.allocated(Ato(vvol,ideriv,ii)%s) ) then + write(6,'("ra00aa : fatal : myid=",i3," ; .not.allocated(Ato(vvol,ideriv,ii)%s) ; error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "ra00aa : .not.allocated(Ato(vvol,ideriv,ii)%s) : error ;" + endif + + + if( .not.allocated(Azo(vvol,ideriv,ii)%s) ) then + write(6,'("ra00aa : fatal : myid=",i3," ; .not.allocated(Azo(vvol,ideriv,ii)%s) ; error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "ra00aa : .not.allocated(Azo(vvol,ideriv,ii)%s) : error ;" + endif + + + if( Lrad(vvol).le.0 ) then + write(6,'("ra00aa : fatal : myid=",i3," ; Lrad(vvol).le.0 ; error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "ra00aa : Lrad(vvol).le.0 : error ;" + endif + ! TODO: probably not needed, since a lot other things do not work as well if Lrad is messed up enddo ! end of do ii; 6 Feb 13; enddo ! end of do vvol; 6 Feb 13; endif ! end of if( myid.eq.0 ) ; 6 Feb 13; @@ -132,7 +178,12 @@ subroutine ra00aa( writeorread ) sumLrad = sum(Lrad(1:Mvol)+1) ! HDF5 calls have to be done from all CPUs when using the collective API - WCALL( ra00aa, write_vector_potential, (sumLrad, allAte, allAze, allAto, allAzo) ) + + cput = MPI_WTIME() + Tra00aa = Tra00aa + ( cput-cpuo ) + call write_vector_potential(sumLrad, allAte, allAze, allAto, allAzo) + cpuo = MPI_WTIME() + ! clean up after yourself deallocate(allAte) @@ -170,8 +221,14 @@ subroutine ra00aa( writeorread ) if( oldMvol.ne.Mvol ) then ; write(ounit,'("ra00aa : ",f10.2," : myid=",i3," ; error ; inconsistent Mvol ;")') cput-cpus, myid ; goto 9997 endif - SALLOCATE( oldim, (1:oldmn), 0 ) - SALLOCATE( oldin, (1:oldmn), 0 ) + + allocate( oldim(1:oldmn), stat=astat ) + oldim(1:oldmn) = 0 + + + allocate( oldin(1:oldmn), stat=astat ) + oldin(1:oldmn) = 0 + read(aunit,iostat=ios) oldim(1:oldmn) read(aunit,iostat=ios) oldin(1:oldmn) @@ -182,10 +239,22 @@ subroutine ra00aa( writeorread ) minLrad = min(oldLrad,Lrad(vvol)) - SALLOCATE( oldAte, (0:oldLrad), zero ) - SALLOCATE( oldAze, (0:oldLrad), zero ) - SALLOCATE( oldAto, (0:oldLrad), zero ) - SALLOCATE( oldAzo, (0:oldLrad), zero ) + + allocate( oldAte(0:oldLrad), stat=astat ) + oldAte(0:oldLrad) = zero + + + allocate( oldAze(0:oldLrad), stat=astat ) + oldAze(0:oldLrad) = zero + + + allocate( oldAto(0:oldLrad), stat=astat ) + oldAto(0:oldLrad) = zero + + + allocate( oldAzo(0:oldLrad), stat=astat ) + oldAzo(0:oldLrad) = zero + do jj = 1, oldmn @@ -204,15 +273,27 @@ subroutine ra00aa( writeorread ) enddo ! end of do jj; 26 Feb 13; - DALLOCATE(oldAte) - DALLOCATE(oldAze) - DALLOCATE(oldAto) - DALLOCATE(oldAzo) + + deallocate(oldAte,stat=astat) + + + deallocate(oldAze,stat=astat) + + + deallocate(oldAto,stat=astat) + + + deallocate(oldAzo,stat=astat) + enddo ! end of do vvol; 26 Feb 13; - DALLOCATE(oldim) - DALLOCATE(oldin) + + deallocate(oldim,stat=astat) + + + deallocate(oldin,stat=astat) + 9997 continue @@ -227,13 +308,21 @@ subroutine ra00aa( writeorread ) llmodnp = 0 ! this node contains the information that is to be broadcast; 26 Feb 13; do ii = 1, mn - RlBCAST( Ate(vvol,ideriv,ii)%s(0:Lrad(vvol)), Lrad(vvol)+1, llmodnp ) - RlBCAST( Aze(vvol,ideriv,ii)%s(0:Lrad(vvol)), Lrad(vvol)+1, llmodnp ) + + call MPI_BCAST(Ate(vvol,ideriv,ii)%s(0:Lrad(vvol)),Lrad(vvol)+1,MPI_DOUBLE_PRECISION,llmodnp ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(Aze(vvol,ideriv,ii)%s(0:Lrad(vvol)),Lrad(vvol)+1,MPI_DOUBLE_PRECISION,llmodnp ,MPI_COMM_SPEC,ierr) + enddo !if( NOTstellsym ) then do ii = 1, mn - RlBCAST( Ato(vvol,ideriv,ii)%s(0:Lrad(vvol)), Lrad(vvol)+1, llmodnp ) - RlBCAST( Azo(vvol,ideriv,ii)%s(0:Lrad(vvol)), Lrad(vvol)+1, llmodnp ) + + call MPI_BCAST(Ato(vvol,ideriv,ii)%s(0:Lrad(vvol)),Lrad(vvol)+1,MPI_DOUBLE_PRECISION,llmodnp ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(Azo(vvol,ideriv,ii)%s(0:Lrad(vvol)),Lrad(vvol)+1,MPI_DOUBLE_PRECISION,llmodnp ,MPI_COMM_SPEC,ierr) + enddo !endif @@ -243,13 +332,24 @@ subroutine ra00aa( writeorread ) case default - FATAL(ra00aa, .true., invalid writeorread flag supplied on input ) + + if( .true. ) then + write(6,'("ra00aa : fatal : myid=",i3," ; .true. ; invalid writeorread flag supplied on input ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "ra00aa : .true. : invalid writeorread flag supplied on input ;" + endif + end select !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - RETURN(ra00aa) + +9999 continue + cput = MPI_WTIME() + Tra00aa = Tra00aa + ( cput-cpuo ) + return + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! diff --git a/src/contrib/rksuite.f b/src/rksuite.f similarity index 100% rename from src/contrib/rksuite.f rename to src/rksuite.f diff --git a/src/rzaxis.f90 b/src/rzaxis.F90 similarity index 90% rename from src/rzaxis.f90 rename to src/rzaxis.F90 index 0156e62b..28ecc58e 100644 --- a/src/rzaxis.f90 +++ b/src/rzaxis.F90 @@ -72,11 +72,8 @@ !> @param inZbc !> @param[in] ivol !> @param LcomputeDerivatives -!#ifdef DEBUG -!recursive subroutine rzaxis( Mvol, mn, inRbc, inZbs, inRbs, inZbc, ivol, LcomputeDerivatives ) -!#else subroutine rzaxis( Mvol, mn, inRbc, inZbs, inRbs, inZbc, ivol, LcomputeDerivatives ) -!#endif + use mod_kinds, only: wp => dp !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -103,39 +100,61 @@ subroutine rzaxis( Mvol, mn, inRbc, inZbs, inRbs, inZbc, ivol, LcomputeDerivativ !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS + +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + LOGICAL, intent(in) :: LComputeDerivatives ! indicates whether derivatives are to be calculated; - INTEGER, intent(in) :: Mvol, mn, ivol - REAL :: inRbc(1:mn,0:Mvol), inZbs(1:mn,0:Mvol), inRbs(1:mn,0:Mvol), inZbc(1:mn,0:Mvol) - REAL :: jRbc(1:mn,0:Mvol), jZbs(1:mn,0:Mvol), jRbs(1:mn,0:Mvol), jZbc(1:mn,0:Mvol) - REAL :: tmpRbc(1:mn,0:Mvol), tmpZbs(1:mn,0:Mvol), tmpRbs(1:mn,0:Mvol), tmpZbc(1:mn,0:Mvol) ! use as temp matrices to store iRbc etc + integer, intent(in) :: Mvol, mn, ivol + real(wp) :: inRbc(1:mn,0:Mvol), inZbs(1:mn,0:Mvol), inRbs(1:mn,0:Mvol), inZbc(1:mn,0:Mvol) + real(wp) :: jRbc(1:mn,0:Mvol), jZbs(1:mn,0:Mvol), jRbs(1:mn,0:Mvol), jZbc(1:mn,0:Mvol) + real(wp) :: tmpRbc(1:mn,0:Mvol), tmpZbs(1:mn,0:Mvol), tmpRbs(1:mn,0:Mvol), tmpZbc(1:mn,0:Mvol) ! use as temp matrices to store iRbc etc - REAL :: jacbase(1:Ntz), jacbasec(1:mn), jacbases(1:mn) ! the 2D Jacobian and its Fourier - REAL :: junkc(1:mn), junks(1:mn) ! these are junk matrices used for fft + real(wp) :: jacbase(1:Ntz), jacbasec(1:mn), jacbases(1:mn) ! the 2D Jacobian and its Fourier + real(wp) :: junkc(1:mn), junks(1:mn) ! these are junk matrices used for fft - INTEGER :: jvol, ii, ifail, jj, id, issym, irz, imn - INTEGER :: idJc, idJs, idRc, idRs, idZc, idZs + integer :: jvol, ii, ifail, jj, id, issym, irz, imn + integer :: idJc, idJs, idRc, idRs, idZc, idZs - INTEGER :: Lcurvature + integer :: Lcurvature - INTEGER :: Njac, idgetrf, idgetrs ! internal variables used in Jacobian method - REAL, allocatable :: jacrhs(:), djacrhs(:), jacmat(:,:), djacmat(:,:), solution(:), LU(:,:) ! internal matrices used in Jacobian method - INTEGER, allocatable :: ipiv(:) ! internal matrices used in Jacobian method + integer :: Njac, idgetrf, idgetrs ! internal variables used in Jacobian method + real(wp), allocatable :: jacrhs(:), djacrhs(:), jacmat(:,:), djacmat(:,:), solution(:), LU(:,:) ! internal matrices used in Jacobian method + integer, allocatable :: ipiv(:) ! internal matrices used in Jacobian method #ifdef DEBUG ! Debug variables - REAL :: dx, threshold ! used to check result with finite difference. - REAL :: newRbc(1:mn,0:Mvol), newZbs(1:mn,0:Mvol), newRbs(1:mn,0:Mvol), newZbc(1:mn,0:Mvol) + real(wp) :: dx, threshold ! used to check result with finite difference. + real(wp) :: newRbc(1:mn,0:Mvol), newZbs(1:mn,0:Mvol), newRbs(1:mn,0:Mvol), newZbc(1:mn,0:Mvol) +#endif + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 #endif - BEGIN(rzaxis) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! #ifdef DEBUG - FATAL( rzaxis, ivol.gt.Mvol, perhaps illegal combination Linitialize=2 and Lfreebound=0 ) + + if( ivol.gt.Mvol ) then + write(6,'("rzaxis : fatal : myid=",i3," ; ivol.gt.Mvol ; perhaps illegal combination Linitialize=2 and Lfreebound=0 ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "rzaxis : ivol.gt.Mvol : perhaps illegal combination Linitialize=2 and Lfreebound=0 ;" + endif + #endif !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -219,7 +238,7 @@ subroutine rzaxis( Mvol, mn, inRbc, inZbs, inRbs, inZbc, ivol, LcomputeDerivativ #ifdef DEBUG if( Wrzaxis ) then - cput = GETTIME + cput = MPI_WTIME() write(ounit,'("rzaxis : ", 10x ," : ")') write(ounit,'("rzaxis : ",f10.2," : myid=",i3," ; inner : Rbc=[", 999(es23.15," ,"))') cput-cpus, myid, inRbc(1:Ntor+1,ivol) write(ounit,'("rzaxis : ",f10.2," : myid=",i3," ; axis : Rbc=[", 999(es23.15," ,"))') cput-cpus, myid, inRbc(1:Ntor+1,jvol) @@ -242,8 +261,20 @@ subroutine rzaxis( Mvol, mn, inRbc, inZbs, inRbs, inZbc, ivol, LcomputeDerivativ #ifdef DEBUG if (LComputeDerivatives) then - FATAL( rzaxis, .not.allocated(cosi), fatal ) - FATAL( rzaxis, .not.allocated(sini), fatal ) + + if( .not.allocated(cosi) ) then + write(6,'("rzaxis : fatal : myid=",i3," ; .not.allocated(cosi) ; fatal ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "rzaxis : .not.allocated(cosi) : fatal ;" + endif + + + if( .not.allocated(sini) ) then + write(6,'("rzaxis : fatal : myid=",i3," ; .not.allocated(sini) ; fatal ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "rzaxis : .not.allocated(sini) : fatal ;" + endif + endif #endif @@ -376,11 +407,26 @@ subroutine rzaxis( Mvol, mn, inRbc, inZbs, inRbs, inZbc, ivol, LcomputeDerivativ Njac = 2 * (2 * Ntoraxis + 1) end if - SALLOCATE( jacrhs, (1:Njac), zero ) - SALLOCATE( jacmat, (1:Njac, 1:Njac), zero ) - SALLOCATE( LU, (1:Njac, 1:Njac), zero ) - SALLOCATE( solution, (1:Njac), zero ) - SALLOCATE( ipiv, (1:Njac), 0) + + allocate( jacrhs(1:Njac), stat=astat ) + jacrhs(1:Njac) = zero + + + allocate( jacmat(1:Njac, 1:Njac), stat=astat ) + jacmat(1:Njac, 1:Njac) = zero + + + allocate( LU(1:Njac, 1:Njac), stat=astat ) + LU(1:Njac, 1:Njac) = zero + + + allocate( solution(1:Njac), stat=astat ) + solution(1:Njac) = zero + + + allocate( ipiv(1:Njac), stat=astat ) + ipiv(1:Njac) = 0 + ! replace iRbc to use subroutine coords iRbc(1:mn,1) = jRbc(1:mn, ivol) @@ -410,7 +456,12 @@ subroutine rzaxis( Mvol, mn, inRbc, inZbs, inRbs, inZbc, ivol, LcomputeDerivativ idRs = 2 * Ntoraxis + 1 idZc = 3 * Ntoraxis + 2 - WCALL( rzaxis, coords, (1, one, Lcurvature, Ntz, mn )) + + cput = MPI_WTIME() + Trzaxis = Trzaxis + ( cput-cpuo ) + call coords(1, one, Lcurvature, Ntz, mn ) + cpuo = MPI_WTIME() + jacbase = sg(1:Ntz,0) / Rij(1:Ntz,0,0) ! extract the baseline 2D jacobian, note the definition here does not have the R factor @@ -563,8 +614,14 @@ subroutine rzaxis( Mvol, mn, inRbc, inZbs, inRbs, inZbc, ivol, LcomputeDerivativ dZadZ = zero ! allocate the temp matrices - SALLOCATE( djacrhs, (1:Njac), zero ) - SALLOCATE( djacmat, (1:Njac, 1:Njac), zero ) + + allocate( djacrhs(1:Njac), stat=astat ) + djacrhs(1:Njac) = zero + + + allocate( djacmat(1:Njac, 1:Njac), stat=astat ) + djacmat(1:Njac, 1:Njac) = zero + dBdX%L = .true. ! will need derivatives; @@ -587,7 +644,12 @@ subroutine rzaxis( Mvol, mn, inRbc, inZbs, inRbs, inZbc, ivol, LcomputeDerivativ if (im(imn).eq.0) then ! the jacobian on the RHS does not depend on m=0 terms jacbase = zero else - WCALL( rzaxis, coords, (1, one, Lcurvature, Ntz, mn )) ! the derivative of Jabobian w.r.t. geometry is computed by coords + + cput = MPI_WTIME() + Trzaxis = Trzaxis + ( cput-cpuo ) + call coords(1, one, Lcurvature, Ntz, mn ) + cpuo = MPI_WTIME() + ! the derivative of Jabobian w.r.t. geometry is computed by coords jacbase = sg(1:Ntz,1) end if @@ -772,8 +834,12 @@ subroutine rzaxis( Mvol, mn, inRbc, inZbs, inRbs, inZbc, ivol, LcomputeDerivativ end do ! imn = 1, mn ! deallocate the matrices - DALLOCATE( djacrhs ) - DALLOCATE( djacmat ) + + deallocate(djacrhs ,stat=astat) + + + deallocate(djacmat ,stat=astat) + dBdX%L = .FALSE. @@ -793,7 +859,12 @@ subroutine rzaxis( Mvol, mn, inRbc, inZbs, inRbs, inZbc, ivol, LcomputeDerivativ iZbc(1:Ntoraxis+1,0) = -solution(3*Ntoraxis+2:4*Ntoraxis+2) + iZbc(1:Ntoraxis+1,0) endif - WCALL( rzaxis, coords, (1, one, Lcurvature, Ntz, mn )) + + cput = MPI_WTIME() + Trzaxis = Trzaxis + ( cput-cpuo ) + call coords(1, one, Lcurvature, Ntz, mn ) + cpuo = MPI_WTIME() + jacbase = sg(1:Ntz,0) / Rij(1:Ntz,0,0) ! extract the baseline 2D jacobian call tfft( Nt, Nz, jacbase, Rij, & @@ -839,11 +910,21 @@ subroutine rzaxis( Mvol, mn, inRbc, inZbs, inRbs, inZbc, ivol, LcomputeDerivativ endif ! YESstellsym ! Deallocate - DALLOCATE( jacrhs ) - DALLOCATE( jacmat ) - DALLOCATE( LU ) - DALLOCATE( solution ) - DALLOCATE( ipiv ) + + deallocate(jacrhs ,stat=astat) + + + deallocate(jacmat ,stat=astat) + + + deallocate(LU ,stat=astat) + + + deallocate(solution ,stat=astat) + + + deallocate(ipiv ,stat=astat) + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -855,14 +936,19 @@ subroutine rzaxis( Mvol, mn, inRbc, inZbs, inRbs, inZbc, ivol, LcomputeDerivativ !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - RETURN(rzaxis) + +9999 continue + cput = MPI_WTIME() + Trzaxis = Trzaxis + ( cput-cpuo ) + return + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! end subroutine rzaxis subroutine fndiff_rzaxis( Mvol, mn, ivol, jRbc, jRbs, jZbc, JZbs, imn, irz, issym ) - + use mod_kinds, only: wp => dp use constants, only : zero, one, half, two use numerical, only : vsmall @@ -878,16 +964,32 @@ subroutine fndiff_rzaxis( Mvol, mn, ivol, jRbc, jRbs, jZbc, JZbs, imn, irz, issy dRadR, dRadZ, dZadR, dZadZ, & NOTstellsym -LOCALS - INTEGER, intent(in) :: Mvol, mn, ivol, imn, irz, issym - REAL, intent(in) :: jRbc(1:mn,0:Mvol), jZbs(1:mn,0:Mvol), jRbs(1:mn,0:Mvol), jZbc(1:mn,0:Mvol) +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + integer, intent(in) :: Mvol, mn, ivol, imn, irz, issym + real(wp), intent(in) :: jRbc(1:mn,0:Mvol), jZbs(1:mn,0:Mvol), jRbs(1:mn,0:Mvol), jZbc(1:mn,0:Mvol) - INTEGER :: jvol, ii - REAL :: dx, threshold ! used to check result with finite difference. - REAL :: newRbc(1:mn,0:Mvol), newZbs(1:mn,0:Mvol), newRbs(1:mn,0:Mvol), newZbc(1:mn,0:Mvol) + integer :: jvol, ii + real(wp) :: dx, threshold ! used to check result with finite difference. + real(wp) :: newRbc(1:mn,0:Mvol), newZbs(1:mn,0:Mvol), newRbs(1:mn,0:Mvol), newZbc(1:mn,0:Mvol) + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif -BEGIN( rzaxis ) threshold = 1e-8 ! print with difference between FD and analytical more than this threshold dx = 1e-8 * jRbc(1,ivol) @@ -946,7 +1048,12 @@ subroutine fndiff_rzaxis( Mvol, mn, ivol, jRbc, jRbs, jZbc, JZbs, imn, irz, issy enddo -RETURN( rzaxis ) + +9999 continue + cput = MPI_WTIME() + Trzaxis = Trzaxis + ( cput-cpuo ) + return + end subroutine fndiff_rzaxis diff --git a/src/sphdf5.F90 b/src/sphdf5.F90 new file mode 100644 index 00000000..0877012c --- /dev/null +++ b/src/sphdf5.F90 @@ -0,0 +1,1495 @@ +!> \file +!> \brief Writes all the output information to \c ext.sp.h5. +!> +!> If the output file already exists, it will be deleted and replaced +!> by an empty one, which gets filled in with the updated data. +!> All calls to the HDF5 API are filtered to only happen from MPI rank-0 +!> to be able to use the serial HDF5 library. +!> Parallel HDF5 was considered in the past, but abandoned due to very +!> subtle and irreproducible errors. + +!> \brief writing the HDF5 output file +!> \ingroup grp_output +module sphdf5 + use mod_kinds, only: wp => dp + use inputlist , only : Wsphdf5, Wmacros + use fileunits , only : ounit + use cputiming , only : Tsphdf5 + use allglobal , only : myid, cpus, MPI_COMM_SPEC, ext, skip_write + use constants , only : version + use hdf5 + + implicit none + + logical, parameter :: hdfDebug = .false. !< global flag to enable verbal diarrhea commenting HDF5 operations + integer, parameter :: internalHdf5Msg = 0 !< 1: print internal HDF5 error messages; 0: only error messages from sphdf5 + + integer :: hdfier !< error flag for HDF5 library + integer :: rank !< rank of data to write using macros + integer(hid_t) :: file_id !< default file ID used in macros + integer(hid_t) :: space_id !< default dataspace ID used in macros + integer(hid_t) :: dset_id !< default dataset ID used in macros + integer(hsize_t) :: onedims(1:1) !< dimension specifier for one-dimensional data used in macros + integer(hsize_t) :: twodims(1:2) !< dimension specifier for two-dimensional data used in macros + integer(hsize_t) :: threedims(1:3) !< dimension specifier for three-dimensional data used in macros + logical :: grp_exists !< flags used to signal if a group already exists + logical :: var_exists !< flags used to signal if a variable already exists + + integer(hid_t) :: iteration_dset_id !< Dataset identifier for "iteration" + integer(hid_t) :: dataspace !< dataspace for extension by 1 iteration object + integer(hid_t) :: memspace !< memspace for extension by 1 iteration object + integer(hsize_t), dimension(1) :: old_data_dims !< current dimensions of "iterations" dataset + integer(hsize_t), dimension(1) :: data_dims !< new dimensions for "iterations" dataset + integer(hsize_t), dimension(1) :: max_dims !< maximum dimensions for "iterations" dataset + integer(hid_t) :: plist_id !< Property list identifier used to activate dataset transfer property + integer(hid_t) :: dt_nDcalls_id !< Memory datatype identifier (for "nDcalls" dataset in "/grid") + integer(hid_t) :: dt_Energy_id !< Memory datatype identifier (for "Energy" dataset in "/grid") + integer(hid_t) :: dt_ForceErr_id !< Memory datatype identifier (for "ForceErr" dataset in "/grid") + integer(hid_t) :: dt_iRbc_id !< Memory datatype identifier (for "iRbc" dataset in "/grid") + integer(hid_t) :: dt_iZbs_id !< Memory datatype identifier (for "iZbs" dataset in "/grid") + integer(hid_t) :: dt_iRbs_id !< Memory datatype identifier (for "iRbs" dataset in "/grid") + integer(hid_t) :: dt_iZbc_id !< Memory datatype identifier (for "iZbc" dataset in "/grid") + + integer, parameter :: rankP=3 !< rank of Poincare data + integer, parameter :: rankT=2 !< rank of rotational transform data + + integer(hid_t) :: grpPoincare !< group for Poincare data + integer(HID_T) :: dset_id_t !< Dataset identifier for \f$\theta\f$ coordinate of field line following + integer(HID_T) :: dset_id_s !< Dataset identifier for \f$s\f$ coordinate of field line following + integer(HID_T) :: dset_id_R !< Dataset identifier for \f$R\f$ coordinate of field line following + integer(HID_T) :: dset_id_Z !< Dataset identifier for \f$Z\f$ coordinate of field line following + integer(HID_T) :: dset_id_success !< Dataset identifier for success flag of trajectories to follow + integer(HID_T) :: filespace_t !< Dataspace identifier in file for \f$\theta\f$ coordinate of field line following + integer(HID_T) :: filespace_s !< Dataspace identifier in file for \f$s\f$ coordinate of field line following + integer(HID_T) :: filespace_R !< Dataspace identifier in file for \f$R\f$ coordinate of field line following + integer(HID_T) :: filespace_Z !< Dataspace identifier in file for \f$Z\f$ coordinate of field line following + integer(HID_T) :: filespace_success !< Dataspace identifier in file for success flag of trajectories to follow + integer(HID_T) :: memspace_t !< Dataspace identifier in memory for \f$\theta\f$ coordinate of field line following + integer(HID_T) :: memspace_s !< Dataspace identifier in memory for \f$s\f$ coordinate of field line following + integer(HID_T) :: memspace_R !< Dataspace identifier in memory for \f$R\f$ coordinate of field line following + integer(HID_T) :: memspace_Z !< Dataspace identifier in memory for \f$Z\f$ coordinate of field line following + integer(HID_T) :: memspace_success !< Dataspace identifier in memory for success flag of trajectories to follow + + integer(hid_t) :: grpTransform !< group for rotational transform data + integer(HID_T) :: dset_id_diotadxup !< Dataset identifier for diotadxup (derivative of rotational transform ?) + integer(HID_T) :: dset_id_fiota !< Dataset identifier for fiota ( rotational transform ?) + integer(HID_T) :: filespace_diotadxup !< Dataspace identifier in file for diotadxup + integer(HID_T) :: filespace_fiota !< Dataspace identifier in file for fiota + integer(HID_T) :: memspace_diotadxup !< Dataspace identifier in memory for diotadxup + integer(HID_T) :: memspace_fiota !< Dataspace identifier in memory for fiota + + + character(LEN=15), parameter :: aname = "description" !< Attribute name for descriptive info + + integer(HID_T) :: attr_id !< Attribute identifier + integer(HID_T) :: aspace_id !< Attribute Dataspace identifier + integer(HID_T) :: atype_id !< Attribute Datatype identifier + + integer, parameter :: arank = 1 !< Attribure rank + integer(HSIZE_T), dimension(arank) :: adims = (/1/) !< Attribute dimension + + integer(SIZE_T) :: attrlen !< Length of the attribute string + character(len=:), allocatable :: attr_data !< Attribute data + +contains + +!> \brief Initialize the interface to the HDF5 library and open the output file. +!> \ingroup grp_output +!> +subroutine init_outfile + + +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif + + + if (myid.eq.0 .and. .not.skip_write) then +! +! ! initialize Fortran interface to the HDF5 library; +! H5CALL( sphdf5, h5open_f, (hdfier), __FILE__, __LINE__) +! +! ! (en/dis)able HDF5 internal error messages; sphdf5 has its own error messages coming from the macros +! H5CALL( sphdf5, h5eset_auto_f, (internalHdf5Msg, hdfier), __FILE__, __LINE__) +! +! ! Create the file +! H5CALL( sphdf5, h5fcreate_f, (trim(ext)//".sp.h5", H5F_ACC_TRUNC_F, file_id, hdfier ), __FILE__, __LINE__ ) +! +! ! write version number +! HWRITERV_LO( file_id, 1, version, (/ version /), __FILE__, __LINE__) +! H5DESCR_CDSET( /version, version of SPEC, __FILE__, __LINE__) + + endif ! myid.eq.0 + +end subroutine init_outfile + +!> \brief Mirror input variables into output file. +!> \ingroup grp_output +!> +!> The goal of this routine is to have an exact copy of the input file contents +!> that were used to parameterize a given SPEC run. +!> This also serves to check after the run if SPEC correctly understood the text-based input file. +subroutine mirror_input_to_outfile + + use inputlist + use allglobal , only : Mvol + + +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + integer(hid_t) :: grpInput + integer(hid_t) :: grpInputPhysics, grpInputNumerics, grpInputLocal, grpInputGlobal, grpInputDiagnostics + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif + + + if (myid.eq.0 .and. .not.skip_write) then + +! HDEFGRP( file_id, input, grpInput, __FILE__, __LINE__ ) +! H5DESCR( grpInput, /input, group for mirrored input data, __FILE__, __LINE__ ) +! +! ! the following variables constitute the namelist/physicslist/; note that all variables in namelist need to be broadcasted in readin; +! ! they go into ext.h5/input/physics +! +! ! the calls used here work as follows: +! ! step 1. HWRITEIV_LO e.g. write(s an) i(nteger) v(ariable) and l(eaves) o(pen) the dataset, so that in +! ! step 2a. an attribute with descr(iptive) information can be attached to the dataset and finally, in +! ! step 2b. the attribute is closed and also we c(lose the) d(ata)set. +! +! HDEFGRP( grpInput, physics, grpInputPhysics, __FILE__, __LINE__) +! H5DESCR( grpInputPhysics, /input/physics, physics inputs, __FILE__, __LINE__) +! +! HWRITEIV_LO( grpInputPhysics, 1, Igeometry , (/ Igeometry /), __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/Igeometry, geometry identifier, __FILE__, __LINE__) +! HWRITEIV_LO( grpInputPhysics, 1, Istellsym , (/ Istellsym /), __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/Istellsym, stellarator symmetry flag, __FILE__, __LINE__) +! HWRITEIV_LO( grpInputPhysics, 1, Lfreebound , (/ Lfreebound /), __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/Lfreebound, free boundary flag, __FILE__, __LINE__) +! HWRITERV_LO( grpInputPhysics, 1, phiedge , (/ phiedge /), __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/phiedge, total enclosed toroidal magnetic flux, __FILE__, __LINE__) +! HWRITERV_LO( grpInputPhysics, 1, curtor , (/ curtor /), __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/curtor, total enclosed toroidal current, __FILE__, __LINE__) +! HWRITERV_LO( grpInputPhysics, 1, curpol , (/ curpol /), __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/curpol, total enclosed poloidal current, __FILE__, __LINE__) +! HWRITERV_LO( grpInputPhysics, 1, gamma , (/ gamma /), __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/gamma, adiabatic index, __FILE__, __LINE__) +! HWRITEIV_LO( grpInputPhysics, 1, Nfp , (/ Nfp /), __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/Nfp, number of stellarator field periods, __FILE__, __LINE__) +! HWRITEIV_LO( grpInputPhysics, 1, Nvol , (/ Nvol /), __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/Nvol, number of volumes, __FILE__, __LINE__) +! HWRITEIV_LO( grpInputPhysics, 1, Mpol , (/ Mpol /), __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/Mpol, maximum poloidal mode number, __FILE__, __LINE__) +! HWRITEIV_LO( grpInputPhysics, 1, Ntor , (/ Ntor /), __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/Ntor, maximum toroidal mode number, __FILE__, __LINE__) +! HWRITEIV_LO( grpInputPhysics, Mvol, Lrad , Lrad(1:Mvol) , __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/Lrad, degree of radial Chebychev polynomials, __FILE__, __LINE__) +! HWRITEIV_LO( grpInputPhysics, 1, Lconstraint, (/ Lconstraint /), __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/Lconstraint, type of constraint to enforce, __FILE__, __LINE__) +! HWRITEIV_LO( grpInputPhysics, 1, Lreflect, (/ Lreflect /), __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/Lreflect, whether to reflect the perturbation on both boundaries for slab geometry __FILE__, __LINE__) +! HWRITERV_LO( grpInputPhysics, Mvol, tflux , tflux(1:Mvol) , __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/tflux, toroidal magnetic flux in volumes, __FILE__, __LINE__) +! HWRITERV_LO( grpInputPhysics, Mvol, pflux , pflux(1:Mvol) , __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/pflux, poloidal magnetic flux in volumes, __FILE__, __LINE__) +! HWRITERV_LO( grpInputPhysics, Nvol, helicity , helicity(1:Nvol) , __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/helicity, helicity profile, __FILE__, __LINE__) +! HWRITERV_LO( grpInputPhysics, 1, pscale , (/ pscale /), __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/pscale, scaling factor for pressure, __FILE__, __LINE__) +! HWRITERV_LO( grpInputPhysics, Nvol, pressure , pressure(1:Nvol) , __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/pressure, pressure profile, __FILE__, __LINE__) +! HWRITEIV_LO( grpInputPhysics, 1, Ladiabatic , (/ Ladiabatic /), __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/Ladiabatic, adiabatic flag, __FILE__, __LINE__) +! HWRITERV_LO( grpInputPhysics, Mvol, adiabatic , adiabatic(1:Nvol) , __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/adiabatic, adiabatic profile (?), __FILE__, __LINE__) +! HWRITERV_LO( grpInputPhysics, (1+Nvol), mu , mu(1:Mvol) , __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/mu, Beltrami parameter, parallel current profile, __FILE__, __LINE__) +! HWRITERV_LO( grpInputPhysics, (1+Nvol), Ivolume , Ivolume(1:Mvol) , __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/Ivolume, Volume current, externally driven, parallel current profile, __FILE__, __LINE__) +! HWRITERV_LO( grpInputPhysics, (Mvol ), Isurf , Isurf(1:Mvol ) , __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/mu, Surface current, currents that are not volume currents (pressure driven, shielding currents) , __FILE__, __LINE__) +! HWRITEIV_LO( grpInputPhysics, (1+Mvol), pl , pl(0:Nvol) , __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/pl, pl ?, __FILE__, __LINE__) +! HWRITEIV_LO( grpInputPhysics, (1+Mvol), ql , ql(0:Nvol) , __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/ql, ql ?, __FILE__, __LINE__) +! HWRITEIV_LO( grpInputPhysics, (1+Mvol), pr , pr(0:Nvol) , __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/pr, pr ?, __FILE__, __LINE__) +! HWRITEIV_LO( grpInputPhysics, (1+Mvol), qr , qr(0:Nvol) , __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/qr, qr ?, __FILE__, __LINE__) +! HWRITERV_LO( grpInputPhysics, (1+Nvol), iota , iota(0:Nvol) , __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/iota, rotational transform profile on inside of ideal interfaces, __FILE__, __LINE__) +! HWRITEIV_LO( grpInputPhysics, (1+Mvol), lp , lp(0:Nvol) , __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/lp, lp ?, __FILE__, __LINE__) +! HWRITEIV_LO( grpInputPhysics, (1+Mvol), lq , lq(0:Nvol) , __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/lq, lq ?, __FILE__, __LINE__) +! HWRITEIV_LO( grpInputPhysics, (1+Mvol), rp , rp(0:Nvol) , __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/rp, rp ?, __FILE__, __LINE__) +! HWRITEIV_LO( grpInputPhysics, (1+Mvol), rq , rq(0:Nvol) , __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/rq, rq ?, __FILE__, __LINE__) +! HWRITERV_LO( grpInputPhysics, (1+Nvol), oita , oita(0:Nvol) , __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/oita, rotational transform profile on outside of ideal interfaces, __FILE__, __LINE__) +! HWRITERV_LO( grpInputPhysics, 1, rtor , (/ rtor /), __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/rpol, for aspect ratio in slab, __FILE__, __LINE__) +! HWRITERV_LO( grpInputPhysics, 1, rpol , (/ rpol /), __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/rpol, for aspect ratio in slab, __FILE__, __LINE__) +! +! HWRITERV_LO( grpInputPhysics, (1+Ntor), Rac , Rac(0:Ntor) , __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/Rac, stellarator symmetric coordinate axis R cosine Fourier coefficients, __FILE__, __LINE__) +! HWRITERV_LO( grpInputPhysics, (1+Ntor), Zas , Zas(0:Ntor) , __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/Zas, stellarator symmetric coordinate axis Z sine Fourier coefficients, __FILE__, __LINE__) +! HWRITERV_LO( grpInputPhysics, (1+Ntor), Ras , Ras(0:Ntor) , __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/Ras, non-stellarator symmetric coordinate axis R sine Fourier coefficients, __FILE__, __LINE__) +! HWRITERV_LO( grpInputPhysics, (1+Ntor), Zac , Zac(0:Ntor) , __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/Zac, non-stellarator symmetric coordinate axis Z cosine Fourier coefficients, __FILE__, __LINE__) +! +! HWRITERA_LO( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Rbc, Rbc(-Ntor:Ntor,-Mpol:Mpol), __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/Rbc, stellarator symmetric boundary R cosine Fourier coefficients, __FILE__, __LINE__) +! HWRITERA_LO( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Zbs, Zbs(-Ntor:Ntor,-Mpol:Mpol), __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/Zbs, stellarator symmetric boundary Z sine Fourier coefficients, __FILE__, __LINE__) +! HWRITERA_LO( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Rbs, Rbs(-Ntor:Ntor,-Mpol:Mpol), __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/Rbs, non-stellarator symmetric boundary R sine Fourier coefficients, __FILE__, __LINE__) +! HWRITERA_LO( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Zbc, Zbc(-Ntor:Ntor,-Mpol:Mpol), __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/Zbc, non-stellarator symmetric boundary Z cosine Fourier coefficients, __FILE__, __LINE__) +! +! HWRITERA_LO( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Rwc, Rwc(-Ntor:Ntor,-Mpol:Mpol), __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/Rwc, stellarator symmetric boundary R cosine Fourier coefficients of wall, __FILE__, __LINE__) +! HWRITERA_LO( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Zws, Zws(-Ntor:Ntor,-Mpol:Mpol), __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/Zws, stellarator symmetric boundary Z sine Fourier coefficients of wall, __FILE__, __LINE__) +! HWRITERA_LO( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Rws, Rws(-Ntor:Ntor,-Mpol:Mpol), __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/Rws, non-stellarator symmetric boundary R sine Fourier coefficients of wall, __FILE__, __LINE__) +! HWRITERA_LO( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Zwc, Zwc(-Ntor:Ntor,-Mpol:Mpol), __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/Zwc, non-stellarator symmetric boundary Z cosine Fourier coefficients of wall, __FILE__, __LINE__) +! +! HWRITERA_LO( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Vns, Vns(-Ntor:Ntor,-Mpol:Mpol), __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/Vns, stellarator symmetric normal field sine Fourier coefficients at boundary; vacuum component, __FILE__, __LINE__) +! HWRITERA_LO( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Bns, Bns(-Ntor:Ntor,-Mpol:Mpol), __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/Bns, stellarator symmetric normal field sine Fourier coefficients at boundary; plasma component, __FILE__, __LINE__) +! HWRITERA_LO( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Vnc, Vnc(-Ntor:Ntor,-Mpol:Mpol), __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/Vnc, non-stellarator symmetric normal field cosine Fourier coefficients at boundary; vacuum component, __FILE__, __LINE__) +! HWRITERA_LO( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Bnc, Bnc(-Ntor:Ntor,-Mpol:Mpol), __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/Bnc, non-stellarator symmetric normal field cosine Fourier coefficients at boundary; plasma component, __FILE__, __LINE__) +! +! HWRITERV_LO( grpInputPhysics, 1, mupftol, (/ mupftol /), __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/mupftol, mupftol , __FILE__, __LINE__) +! HWRITEIV_LO( grpInputPhysics, 1, mupfits, (/ mupfits /), __FILE__, __LINE__) +! H5DESCR_CDSET( /input/physics/mupfits, mupfits , __FILE__, __LINE__) +! +! HCLOSEGRP( grpInputPhysics , __FILE__, __LINE__) +! +! !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! +! +! ! the following variables constitute the namelist/numericlist/; note that all variables in namelist need to be broadcasted in readin; +! ! they go into ext.h5/input/numerics +! +! HDEFGRP( grpInput, numerics, grpInputNumerics, __FILE__, __LINE__) +! +! HWRITEIV( grpInputNumerics, 1, Linitialize , (/ Linitialize /)) +! HWRITEIV( grpInputNumerics, 1, Lzerovac , (/ Lzerovac /)) +! HWRITEIV( grpInputNumerics, 1, Ndiscrete , (/ Ndiscrete /)) +! HWRITEIV( grpInputNumerics, 1, Nquad , (/ Nquad /)) +! HWRITEIV( grpInputNumerics, 1, iMpol , (/ iMpol /)) +! HWRITEIV( grpInputNumerics, 1, iNtor , (/ iNtor /)) +! HWRITEIV( grpInputNumerics, 1, Lsparse , (/ Lsparse /)) +! HWRITEIV( grpInputNumerics, 1, Lsvdiota , (/ Lsvdiota /)) +! HWRITEIV( grpInputNumerics, 1, imethod , (/ imethod /)) +! HWRITEIV( grpInputNumerics, 1, iorder , (/ iorder /)) +! HWRITEIV( grpInputNumerics, 1, iprecon , (/ iprecon /)) +! HWRITERV( grpInputNumerics, 1, iotatol , (/ iotatol /)) +! HWRITEIV( grpInputNumerics, 1, Lextrap , (/ Lextrap /)) +! HWRITEIV( grpInputNumerics, 1, Mregular , (/ Mregular /)) +! HWRITEIV( grpInputNumerics, 1, Lrzaxis , (/ Lrzaxis /)) +! HWRITEIV( grpInputNumerics, 1, Ntoraxis , (/ Ntoraxis /)) +! +! HCLOSEGRP( grpInputNumerics, __FILE__, __LINE__) +! +! !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! +! +! ! the following variables constitute the namelist/locallist/; note that all variables in namelist need to be broadcasted in readin; +! ! they go into ext.h5/input/local +! +! HDEFGRP( grpInput, local, grpInputLocal ) +! +! HWRITEIV( grpInputLocal, 1, LBeltrami , (/ LBeltrami /)) +! HWRITEIV( grpInputLocal, 1, Linitgues , (/ Linitgues /)) +! HWRITEIV( grpInputLocal, 1, Lposdef , (/ Lposdef /)) ! redundant; +! HWRITERV( grpInputLocal, 1, maxrndgues , (/ maxrndgues /)) +! HWRITEIV( grpInputLocal, 1, Lmatsolver , (/ Lmatsolver /)) +! HWRITEIV( grpInputLocal, 1, LGMRESprec , (/ LGMRESprec /)) +! HWRITERV( grpInputLocal, 1, epsGMRES , (/ epsGMRES /)) +! HWRITERV( grpInputLocal, 1, epsILU , (/ epsILU /)) +! +! HCLOSEGRP( grpInputLocal ) +! +! !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! +! +! ! the following variables constitute the namelist/globallist/; note that all variables in namelist need to be broadcasted in readin; +! ! they go into ext.h5/input/global +! +! HDEFGRP( grpInput, global, grpInputGlobal ) +! +! HWRITEIV( grpInputGlobal, 1, Lfindzero , (/ Lfindzero /)) +! HWRITERV( grpInputGlobal, 1, escale , (/ escale /)) +! HWRITERV( grpInputGlobal, 1, opsilon , (/ opsilon /)) +! HWRITERV( grpInputGlobal, 1, pcondense , (/ pcondense /)) +! HWRITERV( grpInputGlobal, 1, epsilon , (/ epsilon /)) +! HWRITERV( grpInputGlobal, 1, wpoloidal , (/ wpoloidal /)) +! HWRITERV( grpInputGlobal, 1, upsilon , (/ upsilon /)) +! HWRITERV( grpInputGlobal, 1, forcetol , (/ forcetol /)) +! HWRITERV( grpInputGlobal, 1, c05xmax , (/ c05xmax /)) +! HWRITERV( grpInputGlobal, 1, c05xtol , (/ c05xtol /)) +! HWRITERV( grpInputGlobal, 1, c05factor , (/ c05factor /)) +! HWRITELV( grpInputGlobal, 1, LreadGF , (/ LreadGF /)) +! HWRITEIV( grpInputGlobal, 1, mfreeits , (/ mfreeits /)) +! HWRITERV( grpInputGlobal, 1, bnstol , (/ bnstol /)) ! redundant; +! HWRITERV( grpInputGlobal, 1, bnsblend , (/ bnsblend /)) ! redundant; +! HWRITERV( grpInputGlobal, 1, gBntol , (/ gBntol /)) +! HWRITERV( grpInputGlobal, 1, gBnbld , (/ gBnbld /)) +! HWRITERV( grpInputGlobal, 1, vcasingeps , (/ vcasingeps /)) +! HWRITERV( grpInputGlobal, 1, vcasingtol , (/ vcasingtol /)) +! HWRITEIV( grpInputGlobal, 1, vcasingits , (/ vcasingits /)) +! HWRITEIV( grpInputGlobal, 1, vcasingper , (/ vcasingper /)) +! HWRITEIV( grpInputGlobal, 1, mcasingcal , (/ mcasingcal /)) ! redundant; +! +! HCLOSEGRP( grpInputGlobal ) +! +! !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! +! +! ! the following variables constitute the namelist/diagnosticslist/; note that all variables in namelist need to be broadcasted in readin; +! ! they go into ext.h5/input/diagnostics +! +! HDEFGRP( grpInput, diagnostics, grpInputDiagnostics ) +! +! HWRITERV( grpInputDiagnostics, 1, odetol , (/ odetol /)) +! HWRITERV( grpInputDiagnostics, 1, absreq , (/ absreq /)) ! redundant; +! HWRITERV( grpInputDiagnostics, 1, relreq , (/ relreq /)) ! redundant; +! HWRITERV( grpInputDiagnostics, 1, absacc , (/ absacc /)) ! redundant; +! HWRITERV( grpInputDiagnostics, 1, epsr , (/ epsr /)) ! redundant; +! HWRITEIV( grpInputDiagnostics, 1, nPpts , (/ nPpts /)) +! HWRITEIV( grpInputDiagnostics, 1, Ppts , (/ Ppts /)) +! HWRITEIV( grpInputDiagnostics, Mvol, nPtrj , nPtrj(1:Mvol) ) +! HWRITELV( grpInputDiagnostics, 1, LHevalues , (/ LHevalues /)) +! HWRITELV( grpInputDiagnostics, 1, LHevectors , (/ LHevectors /)) +! HWRITELV( grpInputDiagnostics, 1, LHmatrix , (/ LHmatrix /)) +! HWRITEIV( grpInputDiagnostics, 1, Lperturbed , (/ Lperturbed /)) +! HWRITEIV( grpInputDiagnostics, 1, dpp , (/ dpp /)) +! HWRITEIV( grpInputDiagnostics, 1, dqq , (/ dqq /)) +! HWRITEIV( grpInputDiagnostics, 1, Lcheck , (/ Lcheck /)) +! HWRITELV( grpInputDiagnostics, 1, Ltiming , (/ Ltiming /)) +! HWRITEIV( grpInputDiagnostics, 1, Lerrortype , (/ Lerrortype /)) +! HWRITEIV( grpInputDiagnostics, 1, Ngrid , (/ Ngrid /)) +! HWRITERV( grpInputDiagnostics, 1, fudge , (/ fudge /)) ! redundant; +! HWRITERV( grpInputDiagnostics, 1, scaling , (/ scaling /)) ! redundant; +! +! HCLOSEGRP( grpInputDiagnostics ) +! +! HCLOSEGRP( grpInput ) + + endif ! myid.eq.0 + +end subroutine mirror_input_to_outfile + +!> \brief Prepare convergence evolution output. +!> \ingroup grp_output +!> +!> +subroutine init_convergence_output + + use allglobal, only : mn, Mvol + + +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + integer(hid_t) :: iteration_dspace_id !< dataspace for "iteration" + integer(hid_t) :: iteration_dtype_id !< Compound datatype for "iteration" + integer(hid_t) :: iRZbscArray_id !< Memory datatype identifier + integer(size_t) :: iteration_dtype_size !< Size of the "iteration" datatype + integer(size_t) :: type_size_i !< Size of the integer datatype + integer(size_t) :: type_size_d !< Size of the double precision datatype + integer(size_t) :: offset !< Member's offset + integer(hid_t) :: crp_list !< Dataset creation property identifier + integer, parameter :: rank = 1 !< logging rank: convergence logging is one-dimensional + integer(hsize_t), dimension(rank) :: maxdims !< convergence logging maximum dimensions => will be unlimited + integer(hsize_t), dimension(rank) :: dims = (/ 0 /) !< current convergence logging dimensions + integer(hsize_t), dimension(rank) :: dimsc = (/ 1 /) !< chunking length ??? + integer(size_t) :: irbc_size_template !< size ofiRbc array in iterations logging + integer(size_t) :: irbc_size !< size ofiRbc array in iterations logging + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif + + + if (myid.eq.0 .and. .not.skip_write) then + +! ! Set dataset transfer property to preserve partially initialized fields +! ! during write/read to/from dataset with compound datatype. +! H5CALL( sphdf5, h5pcreate_f, (H5P_DATASET_XFER_F, plist_id, hdfier)) +! +! H5CALL( sphdf5, h5pset_preserve_f, (plist_id, .TRUE., hdfier) ) +! +! maxdims = (/ H5S_UNLIMITED_F /) ! unlimited array size: "converge" until you get bored +! H5CALL( sphdf5, h5screate_simple_f, (rank, dims, iteration_dspace_id, hdfier, maxdims) ) ! Create the dataspace with zero initial size and allow it to grow +! +! H5CALL( sphdf5, h5pcreate_f, (H5P_DATASET_CREATE_F, crp_list, hdfier) ) ! dataset creation property list with chunking +! +! H5CALL( sphdf5, h5pset_chunk_f, (crp_list, rank, dimsc, hdfier) ) +! +! ! declare "iteration" compound datatype +! ! declare array parts +! H5CALL( sphdf5, h5tarray_create_f, (H5T_NATIVE_DOUBLE, 2, int((/mn, Mvol+1/),hsize_t), iRZbscArray_id, hdfier) ) ! create array datatypes for i{R,Z}b{c,s} +! H5CALL( sphdf5, h5tget_size_f, (iRZbscArray_id, irbc_size, hdfier) ) +! H5CALL( sphdf5, h5tget_size_f, (H5T_NATIVE_INTEGER, type_size_i, hdfier) ) ! size of an integer field +! H5CALL( sphdf5, h5tget_size_f, (H5T_NATIVE_DOUBLE, type_size_d, hdfier) ) ! size of a double field +! iteration_dtype_size = 2*type_size_i + 2*type_size_d + 4*irbc_size ! wflag, nDcalls, Energy, ForceErr, i{R,Z}b{c,s} +! +! H5CALL( sphdf5, h5tcreate_f, (H5T_COMPOUND_F, iteration_dtype_size, iteration_dtype_id, hdfier) ) ! create compound datatype +! +! offset = 0 ! offset for first field starts at 0 +! H5CALL( sphdf5, h5tinsert_f, (iteration_dtype_id, "nDcalls", offset, H5T_NATIVE_INTEGER, hdfier) ) ! insert "nDcalls" field in datatype +! offset = offset + type_size_i ! increment offset by size of field +! H5CALL( sphdf5, h5tinsert_f, (iteration_dtype_id, "Energy", offset, H5T_NATIVE_DOUBLE, hdfier) ) ! insert "Energy" field in datatype +! offset = offset + type_size_d ! increment offset by size of field +! H5CALL( sphdf5, h5tinsert_f, (iteration_dtype_id, "ForceErr", offset, H5T_NATIVE_DOUBLE, hdfier) ) ! insert "ForceErr" field in datatype +! offset = offset + type_size_d ! increment offset by size of field +! H5CALL( sphdf5, h5tinsert_f, (iteration_dtype_id, "iRbc", offset, iRZbscArray_id, hdfier) ) ! insert "iRbc" field in datatype +! offset = offset + irbc_size ! increment offset by size of field +! H5CALL( sphdf5, h5tinsert_f, (iteration_dtype_id, "iZbs", offset, iRZbscArray_id, hdfier) ) ! insert "iZbs" field in datatype +! offset = offset + irbc_size ! increment offset by size of field +! H5CALL( sphdf5, h5tinsert_f, (iteration_dtype_id, "iRbs", offset, iRZbscArray_id, hdfier) ) ! insert "iRbs" field in datatype +! offset = offset + irbc_size ! increment offset by size of field +! H5CALL( sphdf5, h5tinsert_f, (iteration_dtype_id, "iZbc", offset, iRZbscArray_id, hdfier) ) ! insert "iZbc" field in datatype +! offset = offset + irbc_size ! increment offset by size of field +! +! H5CALL( sphdf5, h5dcreate_f, (file_id, "iterations", iteration_dtype_id, iteration_dspace_id, & ! create dataset with compound type +! & iteration_dset_id, hdfier, crp_list) ) +! +! H5CALL( sphdf5, h5sclose_f, (iteration_dspace_id, hdfier) ) ! Terminate access to the data space (does not show up in obj_count below) +! ! --> only needed for creation of dataset +! +! ! Create memory types. We have to create a compound datatype +! ! for each member we want to write. +! offset = 0 +! H5CALL( sphdf5, h5tcreate_f, (H5T_COMPOUND_F, type_size_i, dt_nDcalls_id, hdfier) ) +! H5CALL( sphdf5, h5tcreate_f, (H5T_COMPOUND_F, type_size_d, dt_Energy_id, hdfier) ) +! H5CALL( sphdf5, h5tcreate_f, (H5T_COMPOUND_F, type_size_d, dt_ForceErr_id, hdfier) ) +! H5CALL( sphdf5, h5tcreate_f, (H5T_COMPOUND_F, irbc_size, dt_iRbc_id, hdfier) ) +! H5CALL( sphdf5, h5tcreate_f, (H5T_COMPOUND_F, irbc_size, dt_iZbs_id, hdfier) ) +! H5CALL( sphdf5, h5tcreate_f, (H5T_COMPOUND_F, irbc_size, dt_iRbs_id, hdfier) ) +! H5CALL( sphdf5, h5tcreate_f, (H5T_COMPOUND_F, irbc_size, dt_iZbc_id, hdfier) ) +! +! H5CALL( sphdf5, h5tinsert_f, (dt_nDcalls_id, "nDcalls", offset, H5T_NATIVE_INTEGER, hdfier) ) +! H5CALL( sphdf5, h5tinsert_f, (dt_Energy_id, "Energy", offset, H5T_NATIVE_DOUBLE, hdfier) ) +! H5CALL( sphdf5, h5tinsert_f, (dt_ForceErr_id, "ForceErr", offset, H5T_NATIVE_DOUBLE, hdfier) ) +! H5CALL( sphdf5, h5tinsert_f, (dt_iRbc_id, "iRbc", offset, iRZbscArray_id, hdfier) ) +! H5CALL( sphdf5, h5tinsert_f, (dt_iZbs_id, "iZbs", offset, iRZbscArray_id, hdfier) ) +! H5CALL( sphdf5, h5tinsert_f, (dt_iRbs_id, "iRbs", offset, iRZbscArray_id, hdfier) ) +! H5CALL( sphdf5, h5tinsert_f, (dt_iZbc_id, "iZbc", offset, iRZbscArray_id, hdfier) ) +! +! ! create memspace with size of compound object to append +! dims(1) = 1 ! only append one iteration at a time +! H5CALL( sphdf5, h5screate_simple_f, (rank, dims, memspace, hdfier) ) +! +! H5CALL( sphdf5, h5pclose_f, (crp_list, hdfier) ) +! H5CALL( sphdf5, h5tclose_f, (iteration_dtype_id, hdfier) ) ! Terminate access to the datatype +! H5CALL( sphdf5, h5tclose_f, (iRZbscArray_id, hdfier) ) ! Terminate access to the datatype + + endif ! myid.eq.0 + +end subroutine init_convergence_output + + +!> \brief Write convergence output (evolution of interface geometry, force, etc). +!> \ingroup grp_output +!> +subroutine write_convergence_output( nDcalls, ForceErr ) + + use allglobal, only : myid, mn, Mvol, Energy, iRbc, iZbs, iRbs, iZbc + + +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + integer, intent(in) :: nDcalls + real(wp) , intent(in) :: ForceErr + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif + + + if (myid.eq.0 .and. .not.skip_write) then + +! ! append updated values to "iterations" dataset +! +! ! open dataspace to get current state of dataset +! H5CALL( sphdf5, h5dget_space_f, (iteration_dset_id, dataspace, hdfier), __FILE__, __LINE__) +! +! ! get current size of dataset +! call h5sget_simple_extent_dims_f(dataspace, old_data_dims, max_dims, hdfier) +! +! if( hdfier.ne.1 ) then +! write(6,'("sphdf5 : fatal : myid=",i3," ; hdfier.ne.1 ; rank of convergence dataspace is not 1 ;")') myid +! call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) +! stop "sphdf5 : hdfier.ne.1 : rank of convergence dataspace is not 1 ;" +! endif +! +! +! ! blow up dataset to new size +! data_dims = old_data_dims+1 +! H5CALL( sphdf5, h5dset_extent_f, (iteration_dset_id, data_dims, hdfier), __FILE__, __LINE__) +! +! ! get dataspace slab corresponding to region which the iterations dataset was extended by +! H5CALL( sphdf5, h5dget_space_f, (iteration_dset_id, dataspace, hdfier), __FILE__, __LINE__) ! re-select dataspace to update size info in HDF5 lib +! H5CALL( sphdf5, h5sselect_hyperslab_f, (dataspace, H5S_SELECT_SET_F, old_data_dims, (/ INT(1, HSIZE_T) /), hdfier), __FILE__, __LINE__) ! newly appended slab is at old size and 1 long +! +! ! write next iteration object +! H5CALL( sphdf5, h5dwrite_f, (iteration_dset_id, dt_nDcalls_id, nDcalls, INT((/1/), HSIZE_T), hdfier, & +! & mem_space_id=memspace, file_space_id=dataspace, xfer_prp=plist_id), __FILE__, __LINE__) +! H5CALL( sphdf5, h5dwrite_f, (iteration_dset_id, dt_Energy_id, Energy, INT((/1/), HSIZE_T), hdfier, & +! & mem_space_id=memspace, file_space_id=dataspace, xfer_prp=plist_id), __FILE__, __LINE__) +! H5CALL( sphdf5, h5dwrite_f, (iteration_dset_id, dt_ForceErr_id, ForceErr, INT((/1/), HSIZE_T), hdfier, & +! & mem_space_id=memspace, file_space_id=dataspace, xfer_prp=plist_id), __FILE__, __LINE__) +! H5CALL( sphdf5, h5dwrite_f, (iteration_dset_id, dt_iRbc_id, iRbc, INT((/mn,Mvol+1/), HSIZE_T), hdfier, & +! & mem_space_id=memspace, file_space_id=dataspace, xfer_prp=plist_id), __FILE__, __LINE__) +! H5CALL( sphdf5, h5dwrite_f, (iteration_dset_id, dt_iZbs_id, iZbs, INT((/mn,Mvol+1/), HSIZE_T), hdfier, & +! & mem_space_id=memspace, file_space_id=dataspace, xfer_prp=plist_id), __FILE__, __LINE__) +! H5CALL( sphdf5, h5dwrite_f, (iteration_dset_id, dt_iRbs_id, iRbs, INT((/mn,Mvol+1/), HSIZE_T), hdfier, & +! & mem_space_id=memspace, file_space_id=dataspace, xfer_prp=plist_id), __FILE__, __LINE__) +! H5CALL( sphdf5, h5dwrite_f, (iteration_dset_id, dt_iZbc_id, iZbc, INT((/mn,Mvol+1/), HSIZE_T), hdfier, & +! & mem_space_id=memspace, file_space_id=dataspace, xfer_prp=plist_id), __FILE__, __LINE__) +! +! ! dataspace to appended object should be closed now +! ! MAYBE we otherwise keep all the iterations in memory? +! H5CALL( sphdf5, h5sclose_f, (dataspace, hdfier), __FILE__, __LINE__) + + endif ! myid.eq.0 + +end subroutine write_convergence_output + +!> \brief Write the magnetic field on a grid. +!> \ingroup grp_output +!> +!> The magnetic field is evaluated on a regular grid in \f$(s, \theta, \zeta)\f$ +!> and the corresponding cylindrical coordinates \f$(R,Z)\f$ +!> as well as the cylindrical components of the magnetic field \f$(B^R, B^\varphi, B^Z)\f$ +!> are written out. +subroutine write_grid + + use constants + use allglobal, only : myid, ijreal, ijimag, jireal, & + & Nt, Nz, Ntz, Mvol, pi2nfp, ivol, mn, Node, gBzeta, & + & Lcoordinatesingularity, Lplasmaregion, Lvacuumregion, & + & Rij, Zij, sg + use inputlist, only : Lrad, Igeometry, Nvol, Ngrid, rtor, rpol + use cputiming, only : Tsphdf5 + + +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + integer(hid_t) :: grpGrid + integer :: sumLrad, alongLrad, Ngrid_local, Ngrid_sum + integer :: vvol, ii, jj, kk, jk, Lcurvature + real(wp) :: lss, teta, zeta, st(1:Node), Bst(1:Node) + real(wp) , allocatable :: Rij_grid(:,:), Zij_grid(:,:), sg_grid(:,:), ijreal_grid(:,:), ijimag_grid(:,:), jireal_grid(:,:) + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif + + + if (myid.eq.0 .and. .not.skip_write) then + +! ijreal(1:Ntz) = zero ; ijimag(1:Ntz) = zero ; jireal(1:Ntz) = zero +! +! HDEFGRP( file_id, grid, grpGrid ) +! +! ! Igeometry already is in input, Mvol already is in output +! HWRITEIV( grpGrid, 1, Nt , (/ Nt /)) +! HWRITEIV( grpGrid, 1, Nz , (/ Nz /)) +! HWRITEIV( grpGrid, 1, Ntz , (/ Ntz /)) +! HWRITERV( grpGrid, 1, pi2nfp , (/ pi2nfp /)) +! +! ! combine all radial parts into one dimension as Lrad values can be different for different volumes +! if (Ngrid .lt. 0) then +! sumLrad = sum(Lrad(1:Mvol)+1) +! else +! sumLrad = (Ngrid + 1) * Mvol +! endif +! +! +! allocate( Rij_grid(1:sumLrad, 1:Ntz), stat=astat ) +! Rij_grid(1:sumLrad, 1:Ntz) = zero +! +! +! allocate( Zij_grid(1:sumLrad, 1:Ntz), stat=astat ) +! Zij_grid(1:sumLrad, 1:Ntz) = zero +! +! +! allocate( sg_grid(1:sumLrad, 1:Ntz), stat=astat ) +! sg_grid(1:sumLrad, 1:Ntz) = zero +! +! +! allocate( ijreal_grid(1:sumLrad, 1:Ntz), stat=astat ) +! ijreal_grid(1:sumLrad, 1:Ntz) = zero +! +! +! allocate( ijimag_grid(1:sumLrad, 1:Ntz), stat=astat ) +! ijimag_grid(1:sumLrad, 1:Ntz) = zero +! +! +! allocate( jireal_grid(1:sumLrad, 1:Ntz), stat=astat ) +! jireal_grid(1:sumLrad, 1:Ntz) = zero +! +! +! Ngrid_sum = 0 +! +! do vvol = 1, Mvol ; ivol = vvol +! +! if( Igeometry.eq.1 .or. vvol.gt.1 ) then ; Lcoordinatesingularity = .false. +! else ; Lcoordinatesingularity = .true. +! endif +! +! if( vvol.le.Nvol ) then ; Lplasmaregion = .true. +! else ; Lplasmaregion = .false. +! endif +! +! Lvacuumregion = .not.Lplasmaregion +! ! sets Lcoordinatesingularity and Lplasmaregion ; +! +! if (Ngrid .lt. 0) then +! Ngrid_local = Lrad(vvol) ! default +! else +! Ngrid_local = Ngrid +! endif +! if (Ngrid_local .eq. 0) cycle ! nothing to output +! +! do ii = 0, Ngrid_local ! sub-grid; +! lss = ii * two / Ngrid_local - one +! if( Lcoordinatesingularity .and. ii.eq.0 ) then ; Lcurvature = 0 ! Jacobian is not defined; +! else ; Lcurvature = 1 ! compute Jacobian ; +! endif +! +! +! cput = MPI_WTIME() +! Tsphdf5 = Tsphdf5 + ( cput-cpuo ) +! call coords( vvol, lss, Lcurvature, Ntz, mn ) +! cpuo = MPI_WTIME() +! ! only Rij(0,:) and Zij(0,:) are required; Rmn & Zmn are available; +! +! alongLrad = Ngrid_sum+ii+1 +! +! Rij_grid(alongLrad,1:Ntz) = Rij(1:Ntz,0,0) +! Zij_grid(alongLrad,1:Ntz) = Zij(1:Ntz,0,0) +! sg_grid (alongLrad,1:Ntz) = sg(1:Ntz,0) +! +! if( Lcurvature.eq.1 ) then +! +! select case (Igeometry) +! +! case (3) +! do kk = 0, Nz-1 ; zeta = kk * pi2nfp / Nz +! do jj = 0, Nt-1 ; teta = jj * pi2 / Nt ; jk = 1 + jj + kk*Nt ; st(1:2) = (/ lss, teta /) +! +! cput = MPI_WTIME() +! Tsphdf5 = Tsphdf5 + ( cput-cpuo ) +! call bfield( zeta, st(1:Node), Bst(1:Node) ) +! cpuo = MPI_WTIME() +! +! ijreal(jk) = ( Rij(jk,1,0) * Bst(1) + Rij(jk,2,0) * Bst(2) + Rij(jk,3,0) * one ) * gBzeta / sg(jk,0) ! BR; +! ijimag(jk) = ( one ) * gBzeta / sg(jk,0) ! Bp; +! jireal(jk) = ( Zij(jk,1,0) * Bst(1) + Zij(jk,2,0) * Bst(2) + Zij(jk,3,0) * one ) * gBzeta / sg(jk,0) ! BZ; +! enddo +! enddo +! +! case (1) +! do kk = 0, Nz-1 ; zeta = kk * pi2nfp / Nz +! do jj = 0, Nt-1 ; teta = jj * pi2 / Nt ; jk = 1 + jj + kk*Nt ; st(1:2) = (/ lss, teta /) +! +! cput = MPI_WTIME() +! Tsphdf5 = Tsphdf5 + ( cput-cpuo ) +! call bfield( zeta, st(1:Node), Bst(1:Node) ) +! cpuo = MPI_WTIME() +! +! ijreal(jk) = ( Rij(jk,1,0) * Bst(1) + Rij(jk,2,0) * Bst(2) + Rij(jk,3,0) * one ) * gBzeta / sg(jk,0) ! BR; +! ijimag(jk) = ( rpol ) * gBzeta / sg(jk,0) ! Bzeta; +! jireal(jk) = ( + rtor * Bst(2) ) * gBzeta / sg(jk,0) ! Btheta; +! enddo +! enddo +! +! case (2) +! do kk = 0, Nz-1 ; zeta = kk * pi2nfp / Nz +! do jj = 0, Nt-1 ; teta = jj * pi2 / Nt ; jk = 1 + jj + kk*Nt ; st(1:2) = (/ lss, teta /) +! +! cput = MPI_WTIME() +! Tsphdf5 = Tsphdf5 + ( cput-cpuo ) +! call bfield( zeta, st(1:Node), Bst(1:Node) ) +! cpuo = MPI_WTIME() +! +! ijreal(jk) = ( Rij(jk,1,0) * Bst(1) + Rij(jk,2,0) * Bst(2) + Rij(jk,3,0) * one ) * gBzeta / sg(jk,0) ! BR; +! ijimag(jk) = ( one ) * gBzeta / sg(jk,0) ! Bp; +! jireal(jk) = ( Bst(2) ) * gBzeta / sg(jk,0) ! BZ; +! enddo +! enddo +! +! end select !Igeometry +! endif ! end of if( Lcurvature.eq.1 ) ; +! +! ijreal_grid(alongLrad,1:Ntz) = ijreal(1:Ntz) +! ijimag_grid(alongLrad,1:Ntz) = ijimag(1:Ntz) +! jireal_grid(alongLrad,1:Ntz) = jireal(1:Ntz) +! +! enddo ! end of do ii; +! +! Ngrid_sum = Ngrid_sum + Ngrid_local + 1 ! offset for storing data +! +! enddo ! end of do vvol; +! +! HWRITERA( grpGrid, sumLrad, Ntz, Rij, Rij_grid ) +! HWRITERA( grpGrid, sumLrad, Ntz, Zij, Zij_grid ) +! HWRITERA( grpGrid, sumLrad, Ntz, sg, sg_grid ) +! HWRITERA( grpGrid, sumLrad, Ntz, BR, ijreal_grid ) +! HWRITERA( grpGrid, sumLrad, Ntz, Bp, ijimag_grid ) +! HWRITERA( grpGrid, sumLrad, Ntz, BZ, jireal_grid ) +! +! +! deallocate(Rij_grid ,stat=astat) +! +! +! deallocate(Zij_grid ,stat=astat) +! +! +! deallocate(sg_grid ,stat=astat) +! +! +! deallocate(ijreal_grid ,stat=astat) +! +! +! deallocate(ijimag_grid ,stat=astat) +! +! +! deallocate(jireal_grid ,stat=astat) +! +! +! HCLOSEGRP( grpGrid ) + + +9999 continue + cput = MPI_WTIME() + Tsphdf5 = Tsphdf5 + ( cput-cpuo ) + return + + + endif ! myid.eq.0 + +end subroutine write_grid + +!> \brief Initialize field line tracing output group and create array datasets. +!> \ingroup grp_output +!> +!> The field-line tracing diagnostic is parallelized over volumes, +!> where all threads/ranks produce individual output. +!> This is gathered in the output file, stacked over the radial dimension. +!> The \c success flag signals if the integrator was successful in following +!> the fieldline for the derired number of toroidal periods. +!> +!> @param[in] numTrajTotal total number of Poincare trajectories +subroutine init_flt_output( numTrajTotal ) + + use allglobal, only : Nz, Mvol, lmns + use inputlist, only : nPpts + + +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + integer, intent(in) :: numTrajTotal ! total number of trajectories + integer(HSIZE_T), dimension(rankP) :: dims_traj ! Dataset dimensions. + integer(HSIZE_T), dimension(rankP) :: length ! Dataset dimensions. + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif + + + if (myid.eq.0 .and. .not.skip_write) then + +! ! create Poincare group in HDF5 file +! HDEFGRP( file_id, poincare, grpPoincare ) +! +! dims_traj = (/ Nz, nPpts, numTrajTotal /) ! dimensions for whole Poincare dataset +! length = (/ Nz, nPpts, 1 /) ! which is written in these slice lengths +! +! ! Create the data space for the dataset. +! H5CALL( sphdf5, h5screate_simple_f, (rankP, dims_traj, filespace_t, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5screate_simple_f, (rankP, dims_traj, filespace_s, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5screate_simple_f, (rankP, dims_traj, filespace_R, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5screate_simple_f, (rankP, dims_traj, filespace_Z, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5screate_simple_f, (1, int((/ numTrajTotal /),HSIZE_T), filespace_success, hdfier), __FILE__, __LINE__ ) +! +! ! Create the dataset with default properties. +! H5CALL( sphdf5, h5dcreate_f, (grpPoincare, "t", H5T_NATIVE_DOUBLE, filespace_t, dset_id_t, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5dcreate_f, (grpPoincare, "s", H5T_NATIVE_DOUBLE, filespace_s, dset_id_s, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5dcreate_f, (grpPoincare, "R", H5T_NATIVE_DOUBLE, filespace_R, dset_id_R, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5dcreate_f, (grpPoincare, "Z", H5T_NATIVE_DOUBLE, filespace_Z, dset_id_Z, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5dcreate_f, (grpPoincare, "success", H5T_NATIVE_INTEGER, filespace_success, dset_id_success, hdfier), __FILE__, __LINE__ ) +! +! ! filespaces can be closed as soon as datasets are created +! H5CALL( sphdf5, h5sclose_f, (filespace_t, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5sclose_f, (filespace_s, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5sclose_f, (filespace_R, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5sclose_f, (filespace_Z, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5sclose_f, (filespace_success, hdfier), __FILE__, __LINE__ ) +! +! ! Select hyperslab in the file. +! H5CALL( sphdf5, h5dget_space_f, (dset_id_t, filespace_t, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5dget_space_f, (dset_id_s, filespace_s, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5dget_space_f, (dset_id_R, filespace_R, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5dget_space_f, (dset_id_Z, filespace_Z, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5dget_space_f, (dset_id_success, filespace_success, hdfier), __FILE__, __LINE__ ) +! +! ! Each process defines dataset in memory and writes it to the hyperslab in the file. +! H5CALL( sphdf5, h5screate_simple_f, (rankP, length, memspace_t, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5screate_simple_f, (rankP, length, memspace_s, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5screate_simple_f, (rankP, length, memspace_R, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5screate_simple_f, (rankP, length, memspace_Z, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5screate_simple_f, (1, int((/ 1 /),HSIZE_T), memspace_success, hdfier), __FILE__, __LINE__ ) +! +! ! create rotational transform group in HDF5 file +! HDEFGRP( file_id, transform, grpTransform ) +! +! ! Create the data space for the dataset. +! H5CALL( sphdf5, h5screate_simple_f, (rankT, int((/ 2,Mvol/),HSIZE_T), filespace_diotadxup, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5screate_simple_f, (rankT, int((/numTrajTotal, 2/),HSIZE_T), filespace_fiota , hdfier), __FILE__, __LINE__ ) +! +! ! Create the dataset with default properties. +! H5CALL( sphdf5, h5dcreate_f, (grpTransform, "diotadxup", H5T_NATIVE_DOUBLE, filespace_diotadxup, dset_id_diotadxup, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5dcreate_f, (grpTransform, "fiota", H5T_NATIVE_DOUBLE, filespace_fiota , dset_id_fiota , hdfier), __FILE__, __LINE__ ) +! +! ! filespaces can be closed as soon as datasets are created +! H5CALL( sphdf5, h5sclose_f, (filespace_diotadxup, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5sclose_f, (filespace_fiota , hdfier), __FILE__, __LINE__ ) +! +! ! Select hyperslab in the file. +! H5CALL( sphdf5, h5dget_space_f, (dset_id_diotadxup, filespace_diotadxup, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5dget_space_f, (dset_id_fiota , filespace_fiota , hdfier), __FILE__, __LINE__ ) +! +! ! Each process defines dataset in memory and writes it to the hyperslab in the file. +! H5CALL( sphdf5, h5screate_simple_f, (rankT, int((/2,1/),HSIZE_T), memspace_diotadxup, hdfier), __FILE__, __LINE__ ) + + endif ! myid.eq.0 + +end subroutine init_flt_output + +!> \brief Write a hyperslab of Poincare data corresponding to the output of one parallel worker. +!> \ingroup grp_output +!> +!> @param offset radial offset at which the data belongs +!> @param data output from field-line tracing +!> @param success flags to indicate if integrator was successful +subroutine write_poincare( offset, data, success ) + + use allglobal, only : Nz + use inputlist, only : nPpts + + +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + integer, intent(in) :: offset, success(:) + real(wp), intent(in) :: data(:,:,:) + integer(hsize_t), dimension(3) :: length + integer(HSIZE_T), dimension(2) :: dims_singleTraj ! dimensions of single trajectory data + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif + + + if (myid.eq.0 .and. .not.skip_write) then +! +! dims_singleTraj = (/ Nz, nPpts /) +! length = (/ Nz, nPpts, 1 /) +! +! ! On entry, Fortran does not know that indexing in data is from 0 to Nz-1. +! ! Hence, use default indices 1:Nz in this routine +! H5CALL( sphdf5, h5sselect_hyperslab_f, (filespace_t, H5S_SELECT_SET_F, int((/0,0,offset/),HSSIZE_T), length, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5dwrite_f, (dset_id_t, H5T_NATIVE_DOUBLE, data(1,1:Nz,1:nPpts), dims_singleTraj, hdfier, & +! & file_space_id=filespace_t, mem_space_id=memspace_t ), __FILE__, __LINE__ ) +! +! H5CALL( sphdf5, h5sselect_hyperslab_f, (filespace_s, H5S_SELECT_SET_F, int((/0,0,offset/),HSSIZE_T), length, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5dwrite_f, (dset_id_s, H5T_NATIVE_DOUBLE, data(2,1:Nz,1:nPpts), dims_singleTraj, hdfier, & +! & file_space_id=filespace_s, mem_space_id=memspace_s ), __FILE__, __LINE__ ) +! +! H5CALL( sphdf5, h5sselect_hyperslab_f, (filespace_R, H5S_SELECT_SET_F, int((/0,0,offset/),HSSIZE_T), length, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5dwrite_f, (dset_id_R, H5T_NATIVE_DOUBLE, data(3,1:Nz,1:nPpts), dims_singleTraj, hdfier, & +! & file_space_id=filespace_R, mem_space_id=memspace_R ), __FILE__, __LINE__ ) +! +! H5CALL( sphdf5, h5sselect_hyperslab_f, (filespace_Z, H5S_SELECT_SET_F, int((/0,0,offset/),HSSIZE_T), length, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5dwrite_f, (dset_id_Z, H5T_NATIVE_DOUBLE, data(4,1:Nz,1:nPpts), dims_singleTraj, hdfier, & +! & file_space_id=filespace_Z, mem_space_id=memspace_Z ), __FILE__, __LINE__ ) +! +! H5CALL( sphdf5, h5sselect_hyperslab_f, (filespace_success, H5S_SELECT_SET_F, int((/offset/),HSSIZE_T), int((/1/), HSIZE_T), hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5dwrite_f, (dset_id_success, H5T_NATIVE_INTEGER, success, int((/1/), HSIZE_T), hdfier, & +! & file_space_id=filespace_success, mem_space_id=memspace_success ), __FILE__, __LINE__ ) + + endif ! myid.eq.0 + +end subroutine write_poincare + +!> \brief Write the rotational transform output from field line following. +!> \ingroup grp_output +!> +!> @param offset radial offset at which the data belongs +!> @param length length of dataset to write +!> @param lvol nested volume index +!> @param diotadxup derivative of rotational transform (?) +!> @param fiota rotational transform +subroutine write_transform( offset, length, lvol, diotadxup, fiota ) + + +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + integer, intent(in) :: offset, length, lvol + real(wp), intent(in) :: diotadxup(:), fiota(:,:) + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif + + + if (myid.eq.0 .and. .not.skip_write) then + +! H5CALL( sphdf5, h5sselect_hyperslab_f, (filespace_diotadxup, H5S_SELECT_SET_F, int((/0,lvol-1/),HSSIZE_T), int((/2,1/),HSSIZE_T), hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5dwrite_f, (dset_id_diotadxup, H5T_NATIVE_DOUBLE, diotadxup, int((/2,1/),HSSIZE_T), hdfier, & +! & file_space_id=filespace_diotadxup, mem_space_id=memspace_diotadxup ), __FILE__, __LINE__ ) +! +! ! length of fiota piece to write here may change, so open and close memspace each time a new hyperslab is written +! H5CALL( sphdf5, h5screate_simple_f, (rankT, int((/length,2/),HSIZE_T), memspace_fiota , hdfier), __FILE__, __LINE__ ) +! +! H5CALL( sphdf5, h5sselect_hyperslab_f, (filespace_fiota, H5S_SELECT_SET_F, int((/offset,0/),HSSIZE_T), int((/length,2/),HSSIZE_T), hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5dwrite_f, (dset_id_fiota, H5T_NATIVE_DOUBLE, fiota(1:length,1:2), int((/length,2/),HSSIZE_T), hdfier, & +! & file_space_id=filespace_fiota, mem_space_id=memspace_fiota ), __FILE__, __LINE__ ) +! +! H5CALL( sphdf5, h5sclose_f, (memspace_fiota, hdfier), __FILE__, __LINE__ ) + + endif ! myid.eq.0 + +end subroutine write_transform + +!> \brief Finalize Poincare output. +!> \ingroup grp_output +!> +!> This closes the still-open datasets related to field-line tracing, +!> which had to be kept open during the tracing to be able to write +!> the outputs directly when a given worker thread is finished. +subroutine finalize_flt_output + + +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif + + + if (myid.eq.0 .and. .not.skip_write) then +! +! ! close filespaces +! H5CALL( sphdf5, h5sclose_f, (filespace_t, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5sclose_f, (filespace_s, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5sclose_f, (filespace_R, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5sclose_f, (filespace_Z, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5sclose_f, (filespace_success, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5sclose_f, (filespace_diotadxup, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5sclose_f, (filespace_fiota, hdfier), __FILE__, __LINE__ ) +! +! ! close dataspaces +! H5CALL( sphdf5, h5sclose_f, (memspace_t, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5sclose_f, (memspace_s, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5sclose_f, (memspace_R, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5sclose_f, (memspace_Z, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5sclose_f, (memspace_success, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5sclose_f, (memspace_diotadxup, hdfier), __FILE__, __LINE__ ) +! ! memspace_fiota is re-opened/closed in each iteration (see write_transform) +! +! ! close datasets +! H5CALL( sphdf5, h5dclose_f, (dset_id_t, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5dclose_f, (dset_id_s, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5dclose_f, (dset_id_R, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5dclose_f, (dset_id_Z, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5dclose_f, (dset_id_success, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5dclose_f, (dset_id_diotadxup, hdfier), __FILE__, __LINE__ ) +! H5CALL( sphdf5, h5dclose_f, (dset_id_fiota, hdfier), __FILE__, __LINE__ ) +! +! ! close groups +! HCLOSEGRP( grpPoincare ) +! HCLOSEGRP( grpTransform ) + + endif ! myid.eq.0 + +end subroutine finalize_flt_output + +!> \brief Write the magnetic vector potential Fourier harmonics to the output file group \c /vector_potential . +!> \ingroup grp_output +!> +!> The data is stacked in the radial direction over \c Lrad , +!> since \c Lrad can be different in each volume, but HDF5 only supports +!> rectangular arrays. So, one needs to split the \c sumLrad dimension +!> into chunks given by the input \c Lrad array. +!> +!> @param sumLrad total sum over \c Lrad in all nested volumes +!> @param allAte \f$A^{\theta}_\mathrm{even}\f$ for all nested volumes +!> @param allAze \f$A^{\zeta}_\mathrm{even}\f$ for all nested volumes +!> @param allAto \f$A^{\theta}_\mathrm{odd}\f$ for all nested volumes +!> @param allAzo \f$A^{\zeta}_\mathrm{odd}\f$ for all nested volumes +subroutine write_vector_potential(sumLrad, allAte, allAze, allAto, allAzo) + + use allglobal, only : mn + + +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + integer, intent(in) :: sumLrad + real(wp), intent(in) :: allAte(:,:), allAze(:,:), allAto(:,:), allAzo(:,:) + integer(hid_t) :: grpVectorPotential + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif + + + if (myid.eq.0 .and. .not.skip_write) then + +! HDEFGRP( file_id, vector_potential, grpVectorPotential ) +! +! HWRITERA( grpVectorPotential, sumLrad, mn, Ate, allAte(1:sumLrad,1:mn) ) +! HWRITERA( grpVectorPotential, sumLrad, mn, Aze, allAze(1:sumLrad,1:mn) ) +! HWRITERA( grpVectorPotential, sumLrad, mn, Ato, allAto(1:sumLrad,1:mn) ) +! HWRITERA( grpVectorPotential, sumLrad, mn, Azo, allAzo(1:sumLrad,1:mn) ) +! +! HCLOSEGRP( grpVectorPotential ) + + endif ! myid.eq.0 + +end subroutine write_vector_potential + +!> \brief Write the final state of the equilibrium to the output file. +!> \ingroup grp_output +!> +subroutine hdfint + + use fileunits, only : ounit + use inputlist + use allglobal, only : ncpu, cpus, & + Mvol, ForceErr, & + mn, im, in, iRbc, iZbs, iRbs, iZbc, & + mns, ims, ins, & + dRbc, dZbs, dRbs, dZbc, & + vvolume, dvolume, & + Bsupumn, Bsupvmn, & + Btemn, Bzemn, Btomn, Bzomn, & + iVns, iBns, iVnc, iBnc, & + lmns, & + TT, & + beltramierror, & + IPDt, dlambdaout, lmns + + +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + integer :: Mrad + real(wp) :: tvolume + + integer(hid_t) :: grpOutput + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif + + + if (myid.eq.0 .and. .not.skip_write) then +! +! HDEFGRP( file_id, output, grpOutput ) +! +! HWRITERV( grpOutput, mn, Vns, iVns(1:mn) ) ! stellarator symmetric normal field at boundary; vacuum component; +! HWRITERV( grpOutput, mn, Bns, iBns(1:mn) ) ! stellarator symmetric normal field at boundary; plasma component; +! HWRITERV( grpOutput, mn, Vnc, iVnc(1:mn) ) ! non-stellarator symmetric normal field at boundary; vacuum component; +! HWRITERV( grpOutput, mn, Bnc, iBnc(1:mn) ) ! non-stellarator symmetric normal field at boundary; plasma component; +! +! !> +! +! HCLOSEGRP( grpOutput ) + + endif ! myid.eq.0 + +end subroutine hdfint + +!> \brief Close all open HDF5 objects (we know of) and list any remaining still-open objects. +!> \ingroup grp_output +!> +subroutine finish_outfile +! Close all open HDF5 objects (we know of) and list any remaining still-open objects +! The goal should be to close all objects specifically! + + +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + integer(size_t) :: obj_count ! number of open HDF5 objects + integer(size_t) :: num_objs ! number of still-open objects + integer(hid_t),dimension(:),allocatable :: obj_ids ! still-open objects + integer :: iObj + integer(size_t) :: openLength + character(len=:),allocatable :: openName + integer(size_t),parameter :: dummySize=1 + character(len=dummySize+1) :: dummyName + integer :: typeClass + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif + + + if (myid.eq.0 .and. .not.skip_write) then + +! ! close objects related to convergence output +! H5CALL( sphdf5, h5tclose_f, (dt_nDcalls_id, hdfier) , __FILE__, __LINE__) +! H5CALL( sphdf5, h5tclose_f, (dt_Energy_id, hdfier) , __FILE__, __LINE__) +! H5CALL( sphdf5, h5tclose_f, (dt_ForceErr_id, hdfier) , __FILE__, __LINE__) +! H5CALL( sphdf5, h5tclose_f, (dt_iRbc_id, hdfier) , __FILE__, __LINE__) +! H5CALL( sphdf5, h5tclose_f, (dt_iZbs_id, hdfier) , __FILE__, __LINE__) +! H5CALL( sphdf5, h5tclose_f, (dt_iRbs_id, hdfier) , __FILE__, __LINE__) +! H5CALL( sphdf5, h5tclose_f, (dt_iZbc_id, hdfier) , __FILE__, __LINE__) +! H5CALL( sphdf5, h5dclose_f, (iteration_dset_id, hdfier), __FILE__, __LINE__) ! End access to the dataset and release resources used by it. +! H5CALL( sphdf5, h5pclose_f, (plist_id, hdfier) , __FILE__, __LINE__) ! close plist used for 'preserve' flag (does not show up in obj_count below) +! +! ! check whether we forgot to close some resources; only check for group, dataset and datatype (there is only one file and that should be still open...) +! H5CALL( sphdf5, h5fget_obj_count_f, (file_id, ior(H5F_OBJ_GROUP_F, ior(H5F_OBJ_DATASET_F, H5F_OBJ_DATATYPE_F)), obj_count, hdfier), __FILE__, __LINE__ ) +! +! if (obj_count.gt.0) then +! write(*,'("There are still ",i3," hdf5 objects open")') obj_count +! allocate(obj_ids(1:obj_count)) +! +! ! groups +! H5CALL( sphdf5, h5fget_obj_ids_f, (file_id, H5F_OBJ_GROUP_F, obj_count, obj_ids, hdfier, num_objs), __FILE__, __LINE__) ! get for open objects +! if (num_objs.gt.0) then +! write(*,'("There are still ",i3," HDF5 groups open:")') num_objs +! do iObj=1,num_objs +! openLength=0 +! H5CALL( sphdf5, h5iget_name_f, (obj_ids(iObj), dummyName, dummySize, openLength, hdfier), __FILE__, __LINE__) +! allocate(character(len=openLength+1) :: openName) +! H5CALL( sphdf5, h5iget_name_f, (obj_ids(iObj), openName, openLength, openLength, hdfier), __FILE__, __LINE__) +! write(*,*) openName +! deallocate(openName) +! +! H5CALL( sphdf5, h5gclose_f, (obj_ids(iObj), hdfier), __FILE__, __LINE__) +! enddo +! endif +! +! ! datasets +! H5CALL( sphdf5, h5fget_obj_ids_f, (file_id, H5F_OBJ_DATASET_F, obj_count, obj_ids, hdfier, num_objs), __FILE__, __LINE__) ! get for open objects +! if (num_objs.gt.0) then +! write(*,'("There are still ",i3," HDF5 datasets open:")') num_objs +! do iObj=1,num_objs +! openLength=0 +! H5CALL( sphdf5, h5iget_name_f, (obj_ids(iObj), dummyName, dummySize, openLength, hdfier), __FILE__, __LINE__) +! allocate(character(len=openLength+1) :: openName) +! H5CALL( sphdf5, h5iget_name_f, (obj_ids(iObj), openName, openLength, openLength, hdfier), __FILE__, __LINE__) +! write(*,*) openName(1:openLength) +! deallocate(openName) +! +! H5CALL( sphdf5, h5dclose_f, (obj_ids(iObj), hdfier), __FILE__, __LINE__) +! enddo +! endif +! +! ! datatypes +! H5CALL( sphdf5, h5fget_obj_ids_f, (file_id, H5F_OBJ_DATATYPE_F, obj_count, obj_ids, hdfier, num_objs), __FILE__, __LINE__) ! get for open objects +! if (num_objs.gt.0) then +! write(*,'("There are still ",i3," HDF5 datatypes open:")') num_objs +! do iObj=1,num_objs +! H5CALL( sphdf5, h5tget_class_f, (obj_ids(iObj), typeClass, hdfier), __LINE__, __FILE__) ! determine class of open datatype +! if (typeClass.eq.H5T_NO_CLASS_F ) then ; write(*,*) "H5T_NO_CLASS_F" +! else if (typeClass.eq.H5T_INTEGER_F ) then ; write(*,*) "H5T_INTEGER_F" +! else if (typeClass.eq.H5T_FLOAT_F ) then ; write(*,*) "H5T_FLOAT_F" +! else if (typeClass.eq.H5T_STRING_F ) then ; write(*,*) "H5T_STRING_F" +! else if (typeClass.eq.H5T_BITFIELD_F ) then ; write(*,*) "H5T_BITFIELD_F" +! else if (typeClass.eq.H5T_OPAQUE_F ) then ; write(*,*) "H5T_OPAQUE_F" +! else if (typeClass.eq.H5T_COMPOUND_F ) then ; write(*,*) "H5T_COMPOUND_F" +! else if (typeClass.eq.H5T_REFERENCE_F) then ; write(*,*) "H5T_REFERENCE_F" +! else if (typeClass.eq.H5T_ENUM_F ) then ; write(*,*) "H5T_ENUM_F" +! else if (typeClass.eq.H5T_VLEN_F ) then ; write(*,*) "H5T_VLEN_F" +! else if (typeClass.eq.H5T_ARRAY_F ) then ; write(*,*) "H5T_ARRAY_F" +! else ; write(*,*) "UNKNOWN TYPE!" +! endif +! +! H5CALL( sphdf5, h5tclose_f, (obj_ids(iObj), hdfier), __FILE__, __LINE__) +! enddo +! endif +! +! deallocate(obj_ids) +! endif ! (obj_count.gt.0) +! +! H5CALL( sphdf5, h5fclose_f, ( file_id, hdfier ), __FILE__, __LINE__ ) ! terminate access on output file; +! H5CALL( sphdf5, h5close_f, ( hdfier ), __FILE__, __LINE__ ) ! close Fortran interface to the HDF5 library; + + endif ! myid.eq.0 + +end subroutine finish_outfile + +end module sphdf5 diff --git a/src/sphdf5.f90 b/src/sphdf5.f90 deleted file mode 100644 index 06a7a608..00000000 --- a/src/sphdf5.f90 +++ /dev/null @@ -1,1232 +0,0 @@ -!> \file -!> \brief Writes all the output information to \c ext.sp.h5. -!> -!> If the output file already exists, it will be deleted and replaced -!> by an empty one, which gets filled in with the updated data. -!> All calls to the HDF5 API are filtered to only happen from MPI rank-0 -!> to be able to use the serial HDF5 library. -!> Parallel HDF5 was considered in the past, but abandoned due to very -!> subtle and irreproducible errors. - -!> \brief writing the HDF5 output file -!> \ingroup grp_output -module sphdf5 - - use inputlist , only : Wsphdf5, Wmacros - use fileunits , only : ounit - use cputiming , only : Tsphdf5 - use allglobal , only : myid, cpus, MPI_COMM_SPEC, ext, skip_write - use constants , only : version - use hdf5 - - implicit none - - logical, parameter :: hdfDebug = .false. !< global flag to enable verbal diarrhea commenting HDF5 operations - integer, parameter :: internalHdf5Msg = 0 !< 1: print internal HDF5 error messages; 0: only error messages from sphdf5 - - integer :: hdfier !< error flag for HDF5 library - integer :: rank !< rank of data to write using macros - integer(hid_t) :: file_id !< default file ID used in macros - integer(hid_t) :: space_id !< default dataspace ID used in macros - integer(hid_t) :: dset_id !< default dataset ID used in macros - integer(hsize_t) :: onedims(1:1) !< dimension specifier for one-dimensional data used in macros - integer(hsize_t) :: twodims(1:2) !< dimension specifier for two-dimensional data used in macros - integer(hsize_t) :: threedims(1:3) !< dimension specifier for three-dimensional data used in macros - logical :: grp_exists !< flags used to signal if a group already exists - logical :: var_exists !< flags used to signal if a variable already exists - - integer(hid_t) :: iteration_dset_id !< Dataset identifier for "iteration" - integer(hid_t) :: dataspace !< dataspace for extension by 1 iteration object - integer(hid_t) :: memspace !< memspace for extension by 1 iteration object - integer(hsize_t), dimension(1) :: old_data_dims !< current dimensions of "iterations" dataset - integer(hsize_t), dimension(1) :: data_dims !< new dimensions for "iterations" dataset - integer(hsize_t), dimension(1) :: max_dims !< maximum dimensions for "iterations" dataset - integer(hid_t) :: plist_id !< Property list identifier used to activate dataset transfer property - integer(hid_t) :: dt_nDcalls_id !< Memory datatype identifier (for "nDcalls" dataset in "/grid") - integer(hid_t) :: dt_Energy_id !< Memory datatype identifier (for "Energy" dataset in "/grid") - integer(hid_t) :: dt_ForceErr_id !< Memory datatype identifier (for "ForceErr" dataset in "/grid") - integer(hid_t) :: dt_iRbc_id !< Memory datatype identifier (for "iRbc" dataset in "/grid") - integer(hid_t) :: dt_iZbs_id !< Memory datatype identifier (for "iZbs" dataset in "/grid") - integer(hid_t) :: dt_iRbs_id !< Memory datatype identifier (for "iRbs" dataset in "/grid") - integer(hid_t) :: dt_iZbc_id !< Memory datatype identifier (for "iZbc" dataset in "/grid") - - integer, parameter :: rankP=3 !< rank of Poincare data - integer, parameter :: rankT=2 !< rank of rotational transform data - - integer(hid_t) :: grpPoincare !< group for Poincare data - integer(HID_T) :: dset_id_t !< Dataset identifier for \f$\theta\f$ coordinate of field line following - integer(HID_T) :: dset_id_s !< Dataset identifier for \f$s\f$ coordinate of field line following - integer(HID_T) :: dset_id_R !< Dataset identifier for \f$R\f$ coordinate of field line following - integer(HID_T) :: dset_id_Z !< Dataset identifier for \f$Z\f$ coordinate of field line following - integer(HID_T) :: dset_id_success !< Dataset identifier for success flag of trajectories to follow - integer(HID_T) :: filespace_t !< Dataspace identifier in file for \f$\theta\f$ coordinate of field line following - integer(HID_T) :: filespace_s !< Dataspace identifier in file for \f$s\f$ coordinate of field line following - integer(HID_T) :: filespace_R !< Dataspace identifier in file for \f$R\f$ coordinate of field line following - integer(HID_T) :: filespace_Z !< Dataspace identifier in file for \f$Z\f$ coordinate of field line following - integer(HID_T) :: filespace_success !< Dataspace identifier in file for success flag of trajectories to follow - integer(HID_T) :: memspace_t !< Dataspace identifier in memory for \f$\theta\f$ coordinate of field line following - integer(HID_T) :: memspace_s !< Dataspace identifier in memory for \f$s\f$ coordinate of field line following - integer(HID_T) :: memspace_R !< Dataspace identifier in memory for \f$R\f$ coordinate of field line following - integer(HID_T) :: memspace_Z !< Dataspace identifier in memory for \f$Z\f$ coordinate of field line following - integer(HID_T) :: memspace_success !< Dataspace identifier in memory for success flag of trajectories to follow - - integer(hid_t) :: grpTransform !< group for rotational transform data - integer(HID_T) :: dset_id_diotadxup !< Dataset identifier for diotadxup (derivative of rotational transform ?) - integer(HID_T) :: dset_id_fiota !< Dataset identifier for fiota ( rotational transform ?) - integer(HID_T) :: filespace_diotadxup !< Dataspace identifier in file for diotadxup - integer(HID_T) :: filespace_fiota !< Dataspace identifier in file for fiota - integer(HID_T) :: memspace_diotadxup !< Dataspace identifier in memory for diotadxup - integer(HID_T) :: memspace_fiota !< Dataspace identifier in memory for fiota - - - character(LEN=15), parameter :: aname = "description" !< Attribute name for descriptive info - - integer(HID_T) :: attr_id !< Attribute identifier - integer(HID_T) :: aspace_id !< Attribute Dataspace identifier - integer(HID_T) :: atype_id !< Attribute Datatype identifier - - integer, parameter :: arank = 1 !< Attribure rank - integer(HSIZE_T), dimension(arank) :: adims = (/1/) !< Attribute dimension - - integer(SIZE_T) :: attrlen !< Length of the attribute string - character(len=:), allocatable :: attr_data !< Attribute data - -contains - -!> \brief Initialize the interface to the HDF5 library and open the output file. -!> \ingroup grp_output -!> -subroutine init_outfile - - LOCALS - - BEGIN( sphdf5 ) - - if (myid.eq.0 .and. .not.skip_write) then - - ! initialize Fortran interface to the HDF5 library; - H5CALL( sphdf5, h5open_f, (hdfier), __FILE__, __LINE__) - - ! (en/dis)able HDF5 internal error messages; sphdf5 has its own error messages coming from the macros - H5CALL( sphdf5, h5eset_auto_f, (internalHdf5Msg, hdfier), __FILE__, __LINE__) - - ! Create the file - H5CALL( sphdf5, h5fcreate_f, (trim(ext)//".sp.h5", H5F_ACC_TRUNC_F, file_id, hdfier ), __FILE__, __LINE__ ) - - ! write version number - HWRITERV_LO( file_id, 1, version, (/ version /), __FILE__, __LINE__) - H5DESCR_CDSET( /version, version of SPEC, __FILE__, __LINE__) - - endif ! myid.eq.0 - -end subroutine init_outfile - -!> \brief Mirror input variables into output file. -!> \ingroup grp_output -!> -!> The goal of this routine is to have an exact copy of the input file contents -!> that were used to parameterize a given SPEC run. -!> This also serves to check after the run if SPEC correctly understood the text-based input file. -subroutine mirror_input_to_outfile - - use inputlist - use allglobal , only : Mvol - - LOCALS - - integer(hid_t) :: grpInput - integer(hid_t) :: grpInputPhysics, grpInputNumerics, grpInputLocal, grpInputGlobal, grpInputDiagnostics - - BEGIN( sphdf5 ) - - if (myid.eq.0 .and. .not.skip_write) then - - HDEFGRP( file_id, input, grpInput, __FILE__, __LINE__ ) - H5DESCR( grpInput, /input, group for mirrored input data, __FILE__, __LINE__ ) - -! the following variables constitute the namelist/physicslist/; note that all variables in namelist need to be broadcasted in readin; -! they go into ext.h5/input/physics - - ! the calls used here work as follows: - ! step 1. HWRITEIV_LO e.g. write(s an) i(nteger) v(ariable) and l(eaves) o(pen) the dataset, so that in - ! step 2a. an attribute with descr(iptive) information can be attached to the dataset and finally, in - ! step 2b. the attribute is closed and also we c(lose the) d(ata)set. - - HDEFGRP( grpInput, physics, grpInputPhysics, __FILE__, __LINE__) - H5DESCR( grpInputPhysics, /input/physics, physics inputs, __FILE__, __LINE__) - - HWRITEIV_LO( grpInputPhysics, 1, Igeometry , (/ Igeometry /), __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/Igeometry, geometry identifier, __FILE__, __LINE__) - HWRITEIV_LO( grpInputPhysics, 1, Istellsym , (/ Istellsym /), __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/Istellsym, stellarator symmetry flag, __FILE__, __LINE__) - HWRITEIV_LO( grpInputPhysics, 1, Lfreebound , (/ Lfreebound /), __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/Lfreebound, free boundary flag, __FILE__, __LINE__) - HWRITERV_LO( grpInputPhysics, 1, phiedge , (/ phiedge /), __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/phiedge, total enclosed toroidal magnetic flux, __FILE__, __LINE__) - HWRITERV_LO( grpInputPhysics, 1, curtor , (/ curtor /), __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/curtor, total enclosed toroidal current, __FILE__, __LINE__) - HWRITERV_LO( grpInputPhysics, 1, curpol , (/ curpol /), __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/curpol, total enclosed poloidal current, __FILE__, __LINE__) - HWRITERV_LO( grpInputPhysics, 1, gamma , (/ gamma /), __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/gamma, adiabatic index, __FILE__, __LINE__) - HWRITEIV_LO( grpInputPhysics, 1, Nfp , (/ Nfp /), __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/Nfp, number of stellarator field periods, __FILE__, __LINE__) - HWRITEIV_LO( grpInputPhysics, 1, Nvol , (/ Nvol /), __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/Nvol, number of volumes, __FILE__, __LINE__) - HWRITEIV_LO( grpInputPhysics, 1, Mpol , (/ Mpol /), __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/Mpol, maximum poloidal mode number, __FILE__, __LINE__) - HWRITEIV_LO( grpInputPhysics, 1, Ntor , (/ Ntor /), __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/Ntor, maximum toroidal mode number, __FILE__, __LINE__) - HWRITEIV_LO( grpInputPhysics, Mvol, Lrad , Lrad(1:Mvol) , __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/Lrad, degree of radial Chebychev polynomials, __FILE__, __LINE__) - HWRITEIV_LO( grpInputPhysics, 1, Lconstraint, (/ Lconstraint /), __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/Lconstraint, type of constraint to enforce, __FILE__, __LINE__) - HWRITEIV_LO( grpInputPhysics, 1, Lreflect, (/ Lreflect /), __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/Lreflect, whether to reflect the perturbation on both boundaries for slab geometry __FILE__, __LINE__) - HWRITERV_LO( grpInputPhysics, Mvol, tflux , tflux(1:Mvol) , __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/tflux, toroidal magnetic flux in volumes, __FILE__, __LINE__) - HWRITERV_LO( grpInputPhysics, Mvol, pflux , pflux(1:Mvol) , __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/pflux, poloidal magnetic flux in volumes, __FILE__, __LINE__) - HWRITERV_LO( grpInputPhysics, Nvol, helicity , helicity(1:Nvol) , __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/helicity, helicity profile, __FILE__, __LINE__) - HWRITERV_LO( grpInputPhysics, 1, pscale , (/ pscale /), __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/pscale, scaling factor for pressure, __FILE__, __LINE__) - HWRITERV_LO( grpInputPhysics, Nvol, pressure , pressure(1:Nvol) , __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/pressure, pressure profile, __FILE__, __LINE__) - HWRITEIV_LO( grpInputPhysics, 1, Ladiabatic , (/ Ladiabatic /), __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/Ladiabatic, adiabatic flag, __FILE__, __LINE__) - HWRITERV_LO( grpInputPhysics, Mvol, adiabatic , adiabatic(1:Nvol) , __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/adiabatic, adiabatic profile (?), __FILE__, __LINE__) - HWRITERV_LO( grpInputPhysics, (1+Nvol), mu , mu(1:Mvol) , __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/mu, Beltrami parameter{,} parallel current profile, __FILE__, __LINE__) - HWRITERV_LO( grpInputPhysics, (1+Nvol), Ivolume , Ivolume(1:Mvol) , __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/Ivolume, Volume current{,} externally driven, parallel current profile, __FILE__, __LINE__) - HWRITERV_LO( grpInputPhysics, (Mvol ), Isurf , Isurf(1:Mvol ) , __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/mu, Surface current{,} currents that are not volume currents (pressure driven, shielding currents) , __FILE__, __LINE__) - HWRITEIV_LO( grpInputPhysics, (1+Mvol), pl , pl(0:Nvol) , __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/pl, pl ?, __FILE__, __LINE__) - HWRITEIV_LO( grpInputPhysics, (1+Mvol), ql , ql(0:Nvol) , __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/ql, ql ?, __FILE__, __LINE__) - HWRITEIV_LO( grpInputPhysics, (1+Mvol), pr , pr(0:Nvol) , __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/pr, pr ?, __FILE__, __LINE__) - HWRITEIV_LO( grpInputPhysics, (1+Mvol), qr , qr(0:Nvol) , __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/qr, qr ?, __FILE__, __LINE__) - HWRITERV_LO( grpInputPhysics, (1+Nvol), iota , iota(0:Nvol) , __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/iota, rotational transform profile on inside of ideal interfaces, __FILE__, __LINE__) - HWRITEIV_LO( grpInputPhysics, (1+Mvol), lp , lp(0:Nvol) , __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/lp, lp ?, __FILE__, __LINE__) - HWRITEIV_LO( grpInputPhysics, (1+Mvol), lq , lq(0:Nvol) , __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/lq, lq ?, __FILE__, __LINE__) - HWRITEIV_LO( grpInputPhysics, (1+Mvol), rp , rp(0:Nvol) , __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/rp, rp ?, __FILE__, __LINE__) - HWRITEIV_LO( grpInputPhysics, (1+Mvol), rq , rq(0:Nvol) , __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/rq, rq ?, __FILE__, __LINE__) - HWRITERV_LO( grpInputPhysics, (1+Nvol), oita , oita(0:Nvol) , __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/oita, rotational transform profile on outside of ideal interfaces, __FILE__, __LINE__) - HWRITERV_LO( grpInputPhysics, 1, rtor , (/ rtor /), __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/rpol, for aspect ratio in slab, __FILE__, __LINE__) - HWRITERV_LO( grpInputPhysics, 1, rpol , (/ rpol /), __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/rpol, for aspect ratio in slab, __FILE__, __LINE__) - - HWRITERV_LO( grpInputPhysics, (1+Ntor), Rac , Rac(0:Ntor) , __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/Rac, stellarator symmetric coordinate axis R cosine Fourier coefficients, __FILE__, __LINE__) - HWRITERV_LO( grpInputPhysics, (1+Ntor), Zas , Zas(0:Ntor) , __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/Zas, stellarator symmetric coordinate axis Z sine Fourier coefficients, __FILE__, __LINE__) - HWRITERV_LO( grpInputPhysics, (1+Ntor), Ras , Ras(0:Ntor) , __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/Ras, non-stellarator symmetric coordinate axis R sine Fourier coefficients, __FILE__, __LINE__) - HWRITERV_LO( grpInputPhysics, (1+Ntor), Zac , Zac(0:Ntor) , __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/Zac, non-stellarator symmetric coordinate axis Z cosine Fourier coefficients, __FILE__, __LINE__) - - HWRITERA_LO( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Rbc, Rbc(-Ntor:Ntor,-Mpol:Mpol), __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/Rbc, stellarator symmetric boundary R cosine Fourier coefficients, __FILE__, __LINE__) - HWRITERA_LO( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Zbs, Zbs(-Ntor:Ntor,-Mpol:Mpol), __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/Zbs, stellarator symmetric boundary Z sine Fourier coefficients, __FILE__, __LINE__) - HWRITERA_LO( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Rbs, Rbs(-Ntor:Ntor,-Mpol:Mpol), __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/Rbs, non-stellarator symmetric boundary R sine Fourier coefficients, __FILE__, __LINE__) - HWRITERA_LO( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Zbc, Zbc(-Ntor:Ntor,-Mpol:Mpol), __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/Zbc, non-stellarator symmetric boundary Z cosine Fourier coefficients, __FILE__, __LINE__) - - HWRITERA_LO( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Rwc, Rwc(-Ntor:Ntor,-Mpol:Mpol), __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/Rwc, stellarator symmetric boundary R cosine Fourier coefficients of wall, __FILE__, __LINE__) - HWRITERA_LO( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Zws, Zws(-Ntor:Ntor,-Mpol:Mpol), __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/Zws, stellarator symmetric boundary Z sine Fourier coefficients of wall, __FILE__, __LINE__) - HWRITERA_LO( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Rws, Rws(-Ntor:Ntor,-Mpol:Mpol), __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/Rws, non-stellarator symmetric boundary R sine Fourier coefficients of wall, __FILE__, __LINE__) - HWRITERA_LO( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Zwc, Zwc(-Ntor:Ntor,-Mpol:Mpol), __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/Zwc, non-stellarator symmetric boundary Z cosine Fourier coefficients of wall, __FILE__, __LINE__) - - HWRITERA_LO( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Vns, Vns(-Ntor:Ntor,-Mpol:Mpol), __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/Vns, stellarator symmetric normal field sine Fourier coefficients at boundary; vacuum component, __FILE__, __LINE__) - HWRITERA_LO( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Bns, Bns(-Ntor:Ntor,-Mpol:Mpol), __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/Bns, stellarator symmetric normal field sine Fourier coefficients at boundary; plasma component, __FILE__, __LINE__) - HWRITERA_LO( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Vnc, Vnc(-Ntor:Ntor,-Mpol:Mpol), __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/Vnc, non-stellarator symmetric normal field cosine Fourier coefficients at boundary; vacuum component, __FILE__, __LINE__) - HWRITERA_LO( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Bnc, Bnc(-Ntor:Ntor,-Mpol:Mpol), __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/Bnc, non-stellarator symmetric normal field cosine Fourier coefficients at boundary; plasma component, __FILE__, __LINE__) - - HWRITERV_LO( grpInputPhysics, 1, mupftol, (/ mupftol /), __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/mupftol, mupftol , __FILE__, __LINE__) - HWRITEIV_LO( grpInputPhysics, 1, mupfits, (/ mupfits /), __FILE__, __LINE__) - H5DESCR_CDSET( /input/physics/mupfits, mupfits , __FILE__, __LINE__) - - HCLOSEGRP( grpInputPhysics , __FILE__, __LINE__) - -!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - -! the following variables constitute the namelist/numericlist/; note that all variables in namelist need to be broadcasted in readin; -! they go into ext.h5/input/numerics - - HDEFGRP( grpInput, numerics, grpInputNumerics, __FILE__, __LINE__) - - HWRITEIV( grpInputNumerics, 1, Linitialize , (/ Linitialize /)) - HWRITEIV( grpInputNumerics, 1, Lzerovac , (/ Lzerovac /)) - HWRITEIV( grpInputNumerics, 1, Ndiscrete , (/ Ndiscrete /)) - HWRITEIV( grpInputNumerics, 1, Nquad , (/ Nquad /)) - HWRITEIV( grpInputNumerics, 1, iMpol , (/ iMpol /)) - HWRITEIV( grpInputNumerics, 1, iNtor , (/ iNtor /)) - HWRITEIV( grpInputNumerics, 1, Lsparse , (/ Lsparse /)) - HWRITEIV( grpInputNumerics, 1, Lsvdiota , (/ Lsvdiota /)) - HWRITEIV( grpInputNumerics, 1, imethod , (/ imethod /)) - HWRITEIV( grpInputNumerics, 1, iorder , (/ iorder /)) - HWRITEIV( grpInputNumerics, 1, iprecon , (/ iprecon /)) - HWRITERV( grpInputNumerics, 1, iotatol , (/ iotatol /)) - HWRITEIV( grpInputNumerics, 1, Lextrap , (/ Lextrap /)) - HWRITEIV( grpInputNumerics, 1, Mregular , (/ Mregular /)) - HWRITEIV( grpInputNumerics, 1, Lrzaxis , (/ Lrzaxis /)) - HWRITEIV( grpInputNumerics, 1, Ntoraxis , (/ Ntoraxis /)) - - HCLOSEGRP( grpInputNumerics, __FILE__, __LINE__) - -!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - -! the following variables constitute the namelist/locallist/; note that all variables in namelist need to be broadcasted in readin; -! they go into ext.h5/input/local - - HDEFGRP( grpInput, local, grpInputLocal ) - - HWRITEIV( grpInputLocal, 1, LBeltrami , (/ LBeltrami /)) - HWRITEIV( grpInputLocal, 1, Linitgues , (/ Linitgues /)) - HWRITEIV( grpInputLocal, 1, Lposdef , (/ Lposdef /)) ! redundant; - HWRITERV( grpInputLocal, 1, maxrndgues , (/ maxrndgues /)) - HWRITEIV( grpInputLocal, 1, Lmatsolver , (/ Lmatsolver /)) - HWRITEIV( grpInputLocal, 1, LGMRESprec , (/ LGMRESprec /)) - HWRITERV( grpInputLocal, 1, epsGMRES , (/ epsGMRES /)) - HWRITERV( grpInputLocal, 1, epsILU , (/ epsILU /)) - - HCLOSEGRP( grpInputLocal ) - -!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - -! the following variables constitute the namelist/globallist/; note that all variables in namelist need to be broadcasted in readin; -! they go into ext.h5/input/global - - HDEFGRP( grpInput, global, grpInputGlobal ) - - HWRITEIV( grpInputGlobal, 1, Lfindzero , (/ Lfindzero /)) - HWRITERV( grpInputGlobal, 1, escale , (/ escale /)) - HWRITERV( grpInputGlobal, 1, opsilon , (/ opsilon /)) - HWRITERV( grpInputGlobal, 1, pcondense , (/ pcondense /)) - HWRITERV( grpInputGlobal, 1, epsilon , (/ epsilon /)) - HWRITERV( grpInputGlobal, 1, wpoloidal , (/ wpoloidal /)) - HWRITERV( grpInputGlobal, 1, upsilon , (/ upsilon /)) - HWRITERV( grpInputGlobal, 1, forcetol , (/ forcetol /)) - HWRITERV( grpInputGlobal, 1, c05xmax , (/ c05xmax /)) - HWRITERV( grpInputGlobal, 1, c05xtol , (/ c05xtol /)) - HWRITERV( grpInputGlobal, 1, c05factor , (/ c05factor /)) - HWRITELV( grpInputGlobal, 1, LreadGF , (/ LreadGF /)) - HWRITEIV( grpInputGlobal, 1, mfreeits , (/ mfreeits /)) - HWRITERV( grpInputGlobal, 1, bnstol , (/ bnstol /)) ! redundant; - HWRITERV( grpInputGlobal, 1, bnsblend , (/ bnsblend /)) ! redundant; - HWRITERV( grpInputGlobal, 1, gBntol , (/ gBntol /)) - HWRITERV( grpInputGlobal, 1, gBnbld , (/ gBnbld /)) - HWRITERV( grpInputGlobal, 1, vcasingeps , (/ vcasingeps /)) - HWRITERV( grpInputGlobal, 1, vcasingtol , (/ vcasingtol /)) - HWRITEIV( grpInputGlobal, 1, vcasingits , (/ vcasingits /)) - HWRITEIV( grpInputGlobal, 1, vcasingper , (/ vcasingper /)) - HWRITEIV( grpInputGlobal, 1, mcasingcal , (/ mcasingcal /)) ! redundant; - - HCLOSEGRP( grpInputGlobal ) - -!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - -! the following variables constitute the namelist/diagnosticslist/; note that all variables in namelist need to be broadcasted in readin; -! they go into ext.h5/input/diagnostics - - HDEFGRP( grpInput, diagnostics, grpInputDiagnostics ) - - HWRITERV( grpInputDiagnostics, 1, odetol , (/ odetol /)) - HWRITERV( grpInputDiagnostics, 1, absreq , (/ absreq /)) ! redundant; - HWRITERV( grpInputDiagnostics, 1, relreq , (/ relreq /)) ! redundant; - HWRITERV( grpInputDiagnostics, 1, absacc , (/ absacc /)) ! redundant; - HWRITERV( grpInputDiagnostics, 1, epsr , (/ epsr /)) ! redundant; - HWRITEIV( grpInputDiagnostics, 1, nPpts , (/ nPpts /)) - HWRITEIV( grpInputDiagnostics, 1, Ppts , (/ Ppts /)) - HWRITEIV( grpInputDiagnostics, Mvol, nPtrj , nPtrj(1:Mvol) ) - HWRITELV( grpInputDiagnostics, 1, LHevalues , (/ LHevalues /)) - HWRITELV( grpInputDiagnostics, 1, LHevectors , (/ LHevectors /)) - HWRITELV( grpInputDiagnostics, 1, LHmatrix , (/ LHmatrix /)) - HWRITEIV( grpInputDiagnostics, 1, Lperturbed , (/ Lperturbed /)) - HWRITEIV( grpInputDiagnostics, 1, dpp , (/ dpp /)) - HWRITEIV( grpInputDiagnostics, 1, dqq , (/ dqq /)) - HWRITEIV( grpInputDiagnostics, 1, Lcheck , (/ Lcheck /)) - HWRITELV( grpInputDiagnostics, 1, Ltiming , (/ Ltiming /)) - HWRITEIV( grpInputDiagnostics, 1, Lerrortype , (/ Lerrortype /)) - HWRITEIV( grpInputDiagnostics, 1, Ngrid , (/ Ngrid /)) - HWRITERV( grpInputDiagnostics, 1, fudge , (/ fudge /)) ! redundant; - HWRITERV( grpInputDiagnostics, 1, scaling , (/ scaling /)) ! redundant; - - HCLOSEGRP( grpInputDiagnostics ) - - HCLOSEGRP( grpInput ) - - endif ! myid.eq.0 - -end subroutine mirror_input_to_outfile - -!> \brief Prepare convergence evolution output. -!> \ingroup grp_output -!> -!> -subroutine init_convergence_output - - use allglobal, only : mn, Mvol - - LOCALS - - integer(hid_t) :: iteration_dspace_id !< dataspace for "iteration" - integer(hid_t) :: iteration_dtype_id !< Compound datatype for "iteration" - integer(hid_t) :: iRZbscArray_id !< Memory datatype identifier - integer(size_t) :: iteration_dtype_size !< Size of the "iteration" datatype - integer(size_t) :: type_size_i !< Size of the integer datatype - integer(size_t) :: type_size_d !< Size of the double precision datatype - integer(size_t) :: offset !< Member's offset - integer(hid_t) :: crp_list !< Dataset creation property identifier - integer, parameter :: rank = 1 !< logging rank: convergence logging is one-dimensional - integer(hsize_t), dimension(rank) :: maxdims !< convergence logging maximum dimensions => will be unlimited - integer(hsize_t), dimension(rank) :: dims = (/ 0 /) !< current convergence logging dimensions - integer(hsize_t), dimension(rank) :: dimsc = (/ 1 /) !< chunking length ??? - integer(size_t) :: irbc_size_template !< size ofiRbc array in iterations logging - integer(size_t) :: irbc_size !< size ofiRbc array in iterations logging - - BEGIN( sphdf5 ) - - if (myid.eq.0 .and. .not.skip_write) then - - ! Set dataset transfer property to preserve partially initialized fields - ! during write/read to/from dataset with compound datatype. - H5CALL( sphdf5, h5pcreate_f, (H5P_DATASET_XFER_F, plist_id, hdfier)) - - H5CALL( sphdf5, h5pset_preserve_f, (plist_id, .TRUE., hdfier) ) - - maxdims = (/ H5S_UNLIMITED_F /) ! unlimited array size: "converge" until you get bored - H5CALL( sphdf5, h5screate_simple_f, (rank, dims, iteration_dspace_id, hdfier, maxdims) ) ! Create the dataspace with zero initial size and allow it to grow - - H5CALL( sphdf5, h5pcreate_f, (H5P_DATASET_CREATE_F, crp_list, hdfier) ) ! dataset creation property list with chunking - - H5CALL( sphdf5, h5pset_chunk_f, (crp_list, rank, dimsc, hdfier) ) - - ! declare "iteration" compound datatype - ! declare array parts - H5CALL( sphdf5, h5tarray_create_f, (H5T_NATIVE_DOUBLE, 2, int((/mn, Mvol+1/),hsize_t), iRZbscArray_id, hdfier) ) ! create array datatypes for i{R,Z}b{c,s} - H5CALL( sphdf5, h5tget_size_f, (iRZbscArray_id, irbc_size, hdfier) ) - H5CALL( sphdf5, h5tget_size_f, (H5T_NATIVE_INTEGER, type_size_i, hdfier) ) ! size of an integer field - H5CALL( sphdf5, h5tget_size_f, (H5T_NATIVE_DOUBLE, type_size_d, hdfier) ) ! size of a double field - iteration_dtype_size = 2*type_size_i + 2*type_size_d + 4*irbc_size ! wflag, nDcalls, Energy, ForceErr, i{R,Z}b{c,s} - - H5CALL( sphdf5, h5tcreate_f, (H5T_COMPOUND_F, iteration_dtype_size, iteration_dtype_id, hdfier) ) ! create compound datatype - - offset = 0 ! offset for first field starts at 0 - H5CALL( sphdf5, h5tinsert_f, (iteration_dtype_id, "nDcalls", offset, H5T_NATIVE_INTEGER, hdfier) ) ! insert "nDcalls" field in datatype - offset = offset + type_size_i ! increment offset by size of field - H5CALL( sphdf5, h5tinsert_f, (iteration_dtype_id, "Energy", offset, H5T_NATIVE_DOUBLE, hdfier) ) ! insert "Energy" field in datatype - offset = offset + type_size_d ! increment offset by size of field - H5CALL( sphdf5, h5tinsert_f, (iteration_dtype_id, "ForceErr", offset, H5T_NATIVE_DOUBLE, hdfier) ) ! insert "ForceErr" field in datatype - offset = offset + type_size_d ! increment offset by size of field - H5CALL( sphdf5, h5tinsert_f, (iteration_dtype_id, "iRbc", offset, iRZbscArray_id, hdfier) ) ! insert "iRbc" field in datatype - offset = offset + irbc_size ! increment offset by size of field - H5CALL( sphdf5, h5tinsert_f, (iteration_dtype_id, "iZbs", offset, iRZbscArray_id, hdfier) ) ! insert "iZbs" field in datatype - offset = offset + irbc_size ! increment offset by size of field - H5CALL( sphdf5, h5tinsert_f, (iteration_dtype_id, "iRbs", offset, iRZbscArray_id, hdfier) ) ! insert "iRbs" field in datatype - offset = offset + irbc_size ! increment offset by size of field - H5CALL( sphdf5, h5tinsert_f, (iteration_dtype_id, "iZbc", offset, iRZbscArray_id, hdfier) ) ! insert "iZbc" field in datatype - offset = offset + irbc_size ! increment offset by size of field - - H5CALL( sphdf5, h5dcreate_f, (file_id, "iterations", iteration_dtype_id, iteration_dspace_id, & ! create dataset with compound type - & iteration_dset_id, hdfier, crp_list) ) - - H5CALL( sphdf5, h5sclose_f, (iteration_dspace_id, hdfier) ) ! Terminate access to the data space (does not show up in obj_count below) - ! --> only needed for creation of dataset - - ! Create memory types. We have to create a compound datatype - ! for each member we want to write. - offset = 0 - H5CALL( sphdf5, h5tcreate_f, (H5T_COMPOUND_F, type_size_i, dt_nDcalls_id, hdfier) ) - H5CALL( sphdf5, h5tcreate_f, (H5T_COMPOUND_F, type_size_d, dt_Energy_id, hdfier) ) - H5CALL( sphdf5, h5tcreate_f, (H5T_COMPOUND_F, type_size_d, dt_ForceErr_id, hdfier) ) - H5CALL( sphdf5, h5tcreate_f, (H5T_COMPOUND_F, irbc_size, dt_iRbc_id, hdfier) ) - H5CALL( sphdf5, h5tcreate_f, (H5T_COMPOUND_F, irbc_size, dt_iZbs_id, hdfier) ) - H5CALL( sphdf5, h5tcreate_f, (H5T_COMPOUND_F, irbc_size, dt_iRbs_id, hdfier) ) - H5CALL( sphdf5, h5tcreate_f, (H5T_COMPOUND_F, irbc_size, dt_iZbc_id, hdfier) ) - - H5CALL( sphdf5, h5tinsert_f, (dt_nDcalls_id, "nDcalls", offset, H5T_NATIVE_INTEGER, hdfier) ) - H5CALL( sphdf5, h5tinsert_f, (dt_Energy_id, "Energy", offset, H5T_NATIVE_DOUBLE, hdfier) ) - H5CALL( sphdf5, h5tinsert_f, (dt_ForceErr_id, "ForceErr", offset, H5T_NATIVE_DOUBLE, hdfier) ) - H5CALL( sphdf5, h5tinsert_f, (dt_iRbc_id, "iRbc", offset, iRZbscArray_id, hdfier) ) - H5CALL( sphdf5, h5tinsert_f, (dt_iZbs_id, "iZbs", offset, iRZbscArray_id, hdfier) ) - H5CALL( sphdf5, h5tinsert_f, (dt_iRbs_id, "iRbs", offset, iRZbscArray_id, hdfier) ) - H5CALL( sphdf5, h5tinsert_f, (dt_iZbc_id, "iZbc", offset, iRZbscArray_id, hdfier) ) - - ! create memspace with size of compound object to append - dims(1) = 1 ! only append one iteration at a time - H5CALL( sphdf5, h5screate_simple_f, (rank, dims, memspace, hdfier) ) - - H5CALL( sphdf5, h5pclose_f, (crp_list, hdfier) ) - H5CALL( sphdf5, h5tclose_f, (iteration_dtype_id, hdfier) ) ! Terminate access to the datatype - H5CALL( sphdf5, h5tclose_f, (iRZbscArray_id, hdfier) ) ! Terminate access to the datatype - - endif ! myid.eq.0 - -end subroutine init_convergence_output - - -!> \brief Write convergence output (evolution of interface geometry, force, etc). -!> \ingroup grp_output -!> -subroutine write_convergence_output( nDcalls, ForceErr ) - - use allglobal, only : myid, mn, Mvol, Energy, iRbc, iZbs, iRbs, iZbc - - LOCALS - INTEGER, intent(in) :: nDcalls - REAL , intent(in) :: ForceErr - - BEGIN(sphdf5) - - if (myid.eq.0 .and. .not.skip_write) then - - ! append updated values to "iterations" dataset - - ! open dataspace to get current state of dataset - H5CALL( sphdf5, h5dget_space_f, (iteration_dset_id, dataspace, hdfier), __FILE__, __LINE__) - - ! get current size of dataset - call h5sget_simple_extent_dims_f(dataspace, old_data_dims, max_dims, hdfier) - FATAL( sphdf5, hdfier.ne.1, rank of convergence dataspace is not 1 ) - - ! blow up dataset to new size - data_dims = old_data_dims+1 - H5CALL( sphdf5, h5dset_extent_f, (iteration_dset_id, data_dims, hdfier), __FILE__, __LINE__) - - ! get dataspace slab corresponding to region which the iterations dataset was extended by - H5CALL( sphdf5, h5dget_space_f, (iteration_dset_id, dataspace, hdfier), __FILE__, __LINE__) ! re-select dataspace to update size info in HDF5 lib - H5CALL( sphdf5, h5sselect_hyperslab_f, (dataspace, H5S_SELECT_SET_F, old_data_dims, (/ INT(1, HSIZE_T) /), hdfier), __FILE__, __LINE__) ! newly appended slab is at old size and 1 long - - ! write next iteration object - H5CALL( sphdf5, h5dwrite_f, (iteration_dset_id, dt_nDcalls_id, nDcalls, INT((/1/), HSIZE_T), hdfier, & - & mem_space_id=memspace, file_space_id=dataspace, xfer_prp=plist_id), __FILE__, __LINE__) - H5CALL( sphdf5, h5dwrite_f, (iteration_dset_id, dt_Energy_id, Energy, INT((/1/), HSIZE_T), hdfier, & - & mem_space_id=memspace, file_space_id=dataspace, xfer_prp=plist_id), __FILE__, __LINE__) - H5CALL( sphdf5, h5dwrite_f, (iteration_dset_id, dt_ForceErr_id, ForceErr, INT((/1/), HSIZE_T), hdfier, & - & mem_space_id=memspace, file_space_id=dataspace, xfer_prp=plist_id), __FILE__, __LINE__) - H5CALL( sphdf5, h5dwrite_f, (iteration_dset_id, dt_iRbc_id, iRbc, INT((/mn,Mvol+1/), HSIZE_T), hdfier, & - & mem_space_id=memspace, file_space_id=dataspace, xfer_prp=plist_id), __FILE__, __LINE__) - H5CALL( sphdf5, h5dwrite_f, (iteration_dset_id, dt_iZbs_id, iZbs, INT((/mn,Mvol+1/), HSIZE_T), hdfier, & - & mem_space_id=memspace, file_space_id=dataspace, xfer_prp=plist_id), __FILE__, __LINE__) - H5CALL( sphdf5, h5dwrite_f, (iteration_dset_id, dt_iRbs_id, iRbs, INT((/mn,Mvol+1/), HSIZE_T), hdfier, & - & mem_space_id=memspace, file_space_id=dataspace, xfer_prp=plist_id), __FILE__, __LINE__) - H5CALL( sphdf5, h5dwrite_f, (iteration_dset_id, dt_iZbc_id, iZbc, INT((/mn,Mvol+1/), HSIZE_T), hdfier, & - & mem_space_id=memspace, file_space_id=dataspace, xfer_prp=plist_id), __FILE__, __LINE__) - - ! dataspace to appended object should be closed now - ! MAYBE we otherwise keep all the iterations in memory? - H5CALL( sphdf5, h5sclose_f, (dataspace, hdfier), __FILE__, __LINE__) - - endif ! myid.eq.0 - -end subroutine write_convergence_output - -!> \brief Write the magnetic field on a grid. -!> \ingroup grp_output -!> -!> The magnetic field is evaluated on a regular grid in \f$(s, \theta, \zeta)\f$ -!> and the corresponding cylindrical coordinates \f$(R,Z)\f$ -!> as well as the cylindrical components of the magnetic field \f$(B^R, B^\varphi, B^Z)\f$ -!> are written out. -subroutine write_grid - - use constants - use allglobal, only : myid, ijreal, ijimag, jireal, & - & Nt, Nz, Ntz, Mvol, pi2nfp, ivol, mn, Node, gBzeta, & - & Lcoordinatesingularity, Lplasmaregion, Lvacuumregion, & - & Rij, Zij, sg - use inputlist, only : Lrad, Igeometry, Nvol, Ngrid, rtor, rpol - use cputiming, only : Tsphdf5 - - LOCALS - integer(hid_t) :: grpGrid - integer :: sumLrad, alongLrad, Ngrid_local, Ngrid_sum - INTEGER :: vvol, ii, jj, kk, jk, Lcurvature - REAL :: lss, teta, zeta, st(1:Node), Bst(1:Node) - REAL , allocatable :: Rij_grid(:,:), Zij_grid(:,:), sg_grid(:,:), ijreal_grid(:,:), ijimag_grid(:,:), jireal_grid(:,:) - - BEGIN(sphdf5) - - if (myid.eq.0 .and. .not.skip_write) then - - ijreal(1:Ntz) = zero ; ijimag(1:Ntz) = zero ; jireal(1:Ntz) = zero - - HDEFGRP( file_id, grid, grpGrid ) - - ! Igeometry already is in input, Mvol already is in output - HWRITEIV( grpGrid, 1, Nt , (/ Nt /)) - HWRITEIV( grpGrid, 1, Nz , (/ Nz /)) - HWRITEIV( grpGrid, 1, Ntz , (/ Ntz /)) - HWRITERV( grpGrid, 1, pi2nfp , (/ pi2nfp /)) - - ! combine all radial parts into one dimension as Lrad values can be different for different volumes - if (Ngrid .lt. 0) then - sumLrad = sum(Lrad(1:Mvol)+1) - else - sumLrad = (Ngrid + 1) * Mvol - endif - - SALLOCATE( Rij_grid, (1:sumLrad, 1:Ntz), zero ) - SALLOCATE( Zij_grid, (1:sumLrad, 1:Ntz), zero ) - SALLOCATE( sg_grid, (1:sumLrad, 1:Ntz), zero ) - SALLOCATE( ijreal_grid, (1:sumLrad, 1:Ntz), zero ) - SALLOCATE( ijimag_grid, (1:sumLrad, 1:Ntz), zero ) - SALLOCATE( jireal_grid, (1:sumLrad, 1:Ntz), zero ) - - Ngrid_sum = 0 - - do vvol = 1, Mvol ; ivol = vvol - LREGION(vvol) ! sets Lcoordinatesingularity and Lplasmaregion ; - - if (Ngrid .lt. 0) then - Ngrid_local = Lrad(vvol) ! default - else - Ngrid_local = Ngrid - endif - if (Ngrid_local .eq. 0) cycle ! nothing to output - - do ii = 0, Ngrid_local ! sub-grid; - lss = ii * two / Ngrid_local - one - if( Lcoordinatesingularity .and. ii.eq.0 ) then ; Lcurvature = 0 ! Jacobian is not defined; - else ; Lcurvature = 1 ! compute Jacobian ; - endif - - WCALL( sphdf5, coords, ( vvol, lss, Lcurvature, Ntz, mn ) ) ! only Rij(0,:) and Zij(0,:) are required; Rmn & Zmn are available; - - alongLrad = Ngrid_sum+ii+1 - - Rij_grid(alongLrad,1:Ntz) = Rij(1:Ntz,0,0) - Zij_grid(alongLrad,1:Ntz) = Zij(1:Ntz,0,0) - sg_grid (alongLrad,1:Ntz) = sg(1:Ntz,0) - - if( Lcurvature.eq.1 ) then - - select case (Igeometry) - - case (3) - do kk = 0, Nz-1 ; zeta = kk * pi2nfp / Nz - do jj = 0, Nt-1 ; teta = jj * pi2 / Nt ; jk = 1 + jj + kk*Nt ; st(1:2) = (/ lss, teta /) - WCALL( sphdf5, bfield, ( zeta, st(1:Node), Bst(1:Node) ) ) - ijreal(jk) = ( Rij(jk,1,0) * Bst(1) + Rij(jk,2,0) * Bst(2) + Rij(jk,3,0) * one ) * gBzeta / sg(jk,0) ! BR; - ijimag(jk) = ( one ) * gBzeta / sg(jk,0) ! Bp; - jireal(jk) = ( Zij(jk,1,0) * Bst(1) + Zij(jk,2,0) * Bst(2) + Zij(jk,3,0) * one ) * gBzeta / sg(jk,0) ! BZ; - enddo - enddo - - case (1) - do kk = 0, Nz-1 ; zeta = kk * pi2nfp / Nz - do jj = 0, Nt-1 ; teta = jj * pi2 / Nt ; jk = 1 + jj + kk*Nt ; st(1:2) = (/ lss, teta /) - WCALL( sphdf5, bfield, ( zeta, st(1:Node), Bst(1:Node) ) ) - ijreal(jk) = ( Rij(jk,1,0) * Bst(1) + Rij(jk,2,0) * Bst(2) + Rij(jk,3,0) * one ) * gBzeta / sg(jk,0) ! BR; - ijimag(jk) = ( rpol ) * gBzeta / sg(jk,0) ! Bzeta; - jireal(jk) = ( + rtor * Bst(2) ) * gBzeta / sg(jk,0) ! Btheta; - enddo - enddo - - case (2) - do kk = 0, Nz-1 ; zeta = kk * pi2nfp / Nz - do jj = 0, Nt-1 ; teta = jj * pi2 / Nt ; jk = 1 + jj + kk*Nt ; st(1:2) = (/ lss, teta /) - WCALL( sphdf5, bfield, ( zeta, st(1:Node), Bst(1:Node) ) ) - ijreal(jk) = ( Rij(jk,1,0) * Bst(1) + Rij(jk,2,0) * Bst(2) + Rij(jk,3,0) * one ) * gBzeta / sg(jk,0) ! BR; - ijimag(jk) = ( one ) * gBzeta / sg(jk,0) ! Bp; - jireal(jk) = ( Bst(2) ) * gBzeta / sg(jk,0) ! BZ; - enddo - enddo - - end select !Igeometry - endif ! end of if( Lcurvature.eq.1 ) ; - - ijreal_grid(alongLrad,1:Ntz) = ijreal(1:Ntz) - ijimag_grid(alongLrad,1:Ntz) = ijimag(1:Ntz) - jireal_grid(alongLrad,1:Ntz) = jireal(1:Ntz) - - enddo ! end of do ii; - - Ngrid_sum = Ngrid_sum + Ngrid_local + 1 ! offset for storing data - - enddo ! end of do vvol; - - HWRITERA( grpGrid, sumLrad, Ntz, Rij, Rij_grid ) - HWRITERA( grpGrid, sumLrad, Ntz, Zij, Zij_grid ) - HWRITERA( grpGrid, sumLrad, Ntz, sg, sg_grid ) - HWRITERA( grpGrid, sumLrad, Ntz, BR, ijreal_grid ) - HWRITERA( grpGrid, sumLrad, Ntz, Bp, ijimag_grid ) - HWRITERA( grpGrid, sumLrad, Ntz, BZ, jireal_grid ) - - DALLOCATE( Rij_grid ) - DALLOCATE( Zij_grid ) - DALLOCATE( sg_grid ) - DALLOCATE( ijreal_grid ) - DALLOCATE( ijimag_grid ) - DALLOCATE( jireal_grid ) - - HCLOSEGRP( grpGrid ) - - RETURN(sphdf5) - - endif ! myid.eq.0 - -end subroutine write_grid - -!> \brief Initialize field line tracing output group and create array datasets. -!> \ingroup grp_output -!> -!> The field-line tracing diagnostic is parallelized over volumes, -!> where all threads/ranks produce individual output. -!> This is gathered in the output file, stacked over the radial dimension. -!> The \c success flag signals if the integrator was successful in following -!> the fieldline for the derired number of toroidal periods. -!> -!> @param[in] numTrajTotal total number of Poincare trajectories -subroutine init_flt_output( numTrajTotal ) - - use allglobal, only : Nz, Mvol, lmns - use inputlist, only : nPpts - - LOCALS - integer, intent(in) :: numTrajTotal ! total number of trajectories - integer(HSIZE_T), dimension(rankP) :: dims_traj ! Dataset dimensions. - integer(HSIZE_T), dimension(rankP) :: length ! Dataset dimensions. - - BEGIN( sphdf5 ) - - if (myid.eq.0 .and. .not.skip_write) then - - ! create Poincare group in HDF5 file - HDEFGRP( file_id, poincare, grpPoincare ) - - dims_traj = (/ Nz, nPpts, numTrajTotal /) ! dimensions for whole Poincare dataset - length = (/ Nz, nPpts, 1 /) ! which is written in these slice lengths - - ! Create the data space for the dataset. - H5CALL( sphdf5, h5screate_simple_f, (rankP, dims_traj, filespace_t, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5screate_simple_f, (rankP, dims_traj, filespace_s, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5screate_simple_f, (rankP, dims_traj, filespace_R, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5screate_simple_f, (rankP, dims_traj, filespace_Z, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5screate_simple_f, (1, int((/ numTrajTotal /),HSIZE_T), filespace_success, hdfier), __FILE__, __LINE__ ) - - ! Create the dataset with default properties. - H5CALL( sphdf5, h5dcreate_f, (grpPoincare, "t", H5T_NATIVE_DOUBLE, filespace_t, dset_id_t, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5dcreate_f, (grpPoincare, "s", H5T_NATIVE_DOUBLE, filespace_s, dset_id_s, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5dcreate_f, (grpPoincare, "R", H5T_NATIVE_DOUBLE, filespace_R, dset_id_R, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5dcreate_f, (grpPoincare, "Z", H5T_NATIVE_DOUBLE, filespace_Z, dset_id_Z, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5dcreate_f, (grpPoincare, "success", H5T_NATIVE_INTEGER, filespace_success, dset_id_success, hdfier), __FILE__, __LINE__ ) - - ! filespaces can be closed as soon as datasets are created - H5CALL( sphdf5, h5sclose_f, (filespace_t, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5sclose_f, (filespace_s, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5sclose_f, (filespace_R, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5sclose_f, (filespace_Z, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5sclose_f, (filespace_success, hdfier), __FILE__, __LINE__ ) - - ! Select hyperslab in the file. - H5CALL( sphdf5, h5dget_space_f, (dset_id_t, filespace_t, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5dget_space_f, (dset_id_s, filespace_s, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5dget_space_f, (dset_id_R, filespace_R, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5dget_space_f, (dset_id_Z, filespace_Z, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5dget_space_f, (dset_id_success, filespace_success, hdfier), __FILE__, __LINE__ ) - - ! Each process defines dataset in memory and writes it to the hyperslab in the file. - H5CALL( sphdf5, h5screate_simple_f, (rankP, length, memspace_t, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5screate_simple_f, (rankP, length, memspace_s, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5screate_simple_f, (rankP, length, memspace_R, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5screate_simple_f, (rankP, length, memspace_Z, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5screate_simple_f, (1, int((/ 1 /),HSIZE_T), memspace_success, hdfier), __FILE__, __LINE__ ) - - ! create rotational transform group in HDF5 file - HDEFGRP( file_id, transform, grpTransform ) - - ! Create the data space for the dataset. - H5CALL( sphdf5, h5screate_simple_f, (rankT, int((/ 2,Mvol/),HSIZE_T), filespace_diotadxup, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5screate_simple_f, (rankT, int((/numTrajTotal, 2/),HSIZE_T), filespace_fiota , hdfier), __FILE__, __LINE__ ) - - ! Create the dataset with default properties. - H5CALL( sphdf5, h5dcreate_f, (grpTransform, "diotadxup", H5T_NATIVE_DOUBLE, filespace_diotadxup, dset_id_diotadxup, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5dcreate_f, (grpTransform, "fiota", H5T_NATIVE_DOUBLE, filespace_fiota , dset_id_fiota , hdfier), __FILE__, __LINE__ ) - - ! filespaces can be closed as soon as datasets are created - H5CALL( sphdf5, h5sclose_f, (filespace_diotadxup, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5sclose_f, (filespace_fiota , hdfier), __FILE__, __LINE__ ) - - ! Select hyperslab in the file. - H5CALL( sphdf5, h5dget_space_f, (dset_id_diotadxup, filespace_diotadxup, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5dget_space_f, (dset_id_fiota , filespace_fiota , hdfier), __FILE__, __LINE__ ) - - ! Each process defines dataset in memory and writes it to the hyperslab in the file. - H5CALL( sphdf5, h5screate_simple_f, (rankT, int((/2,1/),HSIZE_T), memspace_diotadxup, hdfier), __FILE__, __LINE__ ) - - endif ! myid.eq.0 - -end subroutine init_flt_output - -!> \brief Write a hyperslab of Poincare data corresponding to the output of one parallel worker. -!> \ingroup grp_output -!> -!> @param offset radial offset at which the data belongs -!> @param data output from field-line tracing -!> @param success flags to indicate if integrator was successful -subroutine write_poincare( offset, data, success ) - - use allglobal, only : Nz - use inputlist, only : nPpts - - LOCALS - - integer, intent(in) :: offset, success(:) - REAL, intent(in) :: data(:,:,:) - integer(hsize_t), dimension(3) :: length - integer(HSIZE_T), dimension(2) :: dims_singleTraj ! dimensions of single trajectory data - - BEGIN( sphdf5 ) - - if (myid.eq.0 .and. .not.skip_write) then - - dims_singleTraj = (/ Nz, nPpts /) - length = (/ Nz, nPpts, 1 /) - - ! On entry, Fortran does not know that indexing in data is from 0 to Nz-1. - ! Hence, use default indices 1:Nz in this routine - H5CALL( sphdf5, h5sselect_hyperslab_f, (filespace_t, H5S_SELECT_SET_F, int((/0,0,offset/),HSSIZE_T), length, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5dwrite_f, (dset_id_t, H5T_NATIVE_DOUBLE, data(1,1:Nz,1:nPpts), dims_singleTraj, hdfier, & - & file_space_id=filespace_t, mem_space_id=memspace_t ), __FILE__, __LINE__ ) - - H5CALL( sphdf5, h5sselect_hyperslab_f, (filespace_s, H5S_SELECT_SET_F, int((/0,0,offset/),HSSIZE_T), length, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5dwrite_f, (dset_id_s, H5T_NATIVE_DOUBLE, data(2,1:Nz,1:nPpts), dims_singleTraj, hdfier, & - & file_space_id=filespace_s, mem_space_id=memspace_s ), __FILE__, __LINE__ ) - - H5CALL( sphdf5, h5sselect_hyperslab_f, (filespace_R, H5S_SELECT_SET_F, int((/0,0,offset/),HSSIZE_T), length, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5dwrite_f, (dset_id_R, H5T_NATIVE_DOUBLE, data(3,1:Nz,1:nPpts), dims_singleTraj, hdfier, & - & file_space_id=filespace_R, mem_space_id=memspace_R ), __FILE__, __LINE__ ) - - H5CALL( sphdf5, h5sselect_hyperslab_f, (filespace_Z, H5S_SELECT_SET_F, int((/0,0,offset/),HSSIZE_T), length, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5dwrite_f, (dset_id_Z, H5T_NATIVE_DOUBLE, data(4,1:Nz,1:nPpts), dims_singleTraj, hdfier, & - & file_space_id=filespace_Z, mem_space_id=memspace_Z ), __FILE__, __LINE__ ) - - H5CALL( sphdf5, h5sselect_hyperslab_f, (filespace_success, H5S_SELECT_SET_F, int((/offset/),HSSIZE_T), int((/1/), HSIZE_T), hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5dwrite_f, (dset_id_success, H5T_NATIVE_INTEGER, success, int((/1/), HSIZE_T), hdfier, & - & file_space_id=filespace_success, mem_space_id=memspace_success ), __FILE__, __LINE__ ) - - endif ! myid.eq.0 - -end subroutine write_poincare - -!> \brief Write the rotational transform output from field line following. -!> \ingroup grp_output -!> -!> @param offset radial offset at which the data belongs -!> @param length length of dataset to write -!> @param lvol nested volume index -!> @param diotadxup derivative of rotational transform (?) -!> @param fiota rotational transform -subroutine write_transform( offset, length, lvol, diotadxup, fiota ) - - LOCALS - INTEGER, intent(in) :: offset, length, lvol - REAL, intent(in) :: diotadxup(:), fiota(:,:) - - BEGIN( sphdf5 ) - - if (myid.eq.0 .and. .not.skip_write) then - - H5CALL( sphdf5, h5sselect_hyperslab_f, (filespace_diotadxup, H5S_SELECT_SET_F, int((/0,lvol-1/),HSSIZE_T), int((/2,1/),HSSIZE_T), hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5dwrite_f, (dset_id_diotadxup, H5T_NATIVE_DOUBLE, diotadxup, int((/2,1/),HSSIZE_T), hdfier, & - & file_space_id=filespace_diotadxup, mem_space_id=memspace_diotadxup ), __FILE__, __LINE__ ) - - ! length of fiota piece to write here may change, so open and close memspace each time a new hyperslab is written - H5CALL( sphdf5, h5screate_simple_f, (rankT, int((/length,2/),HSIZE_T), memspace_fiota , hdfier), __FILE__, __LINE__ ) - - H5CALL( sphdf5, h5sselect_hyperslab_f, (filespace_fiota, H5S_SELECT_SET_F, int((/offset,0/),HSSIZE_T), int((/length,2/),HSSIZE_T), hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5dwrite_f, (dset_id_fiota, H5T_NATIVE_DOUBLE, fiota(1:length,1:2), int((/length,2/),HSSIZE_T), hdfier, & - & file_space_id=filespace_fiota, mem_space_id=memspace_fiota ), __FILE__, __LINE__ ) - - H5CALL( sphdf5, h5sclose_f, (memspace_fiota, hdfier), __FILE__, __LINE__ ) - - endif ! myid.eq.0 - -end subroutine write_transform - -!> \brief Finalize Poincare output. -!> \ingroup grp_output -!> -!> This closes the still-open datasets related to field-line tracing, -!> which had to be kept open during the tracing to be able to write -!> the outputs directly when a given worker thread is finished. -subroutine finalize_flt_output - - LOCALS - - BEGIN( sphdf5 ) - - if (myid.eq.0 .and. .not.skip_write) then - - ! close filespaces - H5CALL( sphdf5, h5sclose_f, (filespace_t, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5sclose_f, (filespace_s, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5sclose_f, (filespace_R, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5sclose_f, (filespace_Z, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5sclose_f, (filespace_success, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5sclose_f, (filespace_diotadxup, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5sclose_f, (filespace_fiota, hdfier), __FILE__, __LINE__ ) - - ! close dataspaces - H5CALL( sphdf5, h5sclose_f, (memspace_t, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5sclose_f, (memspace_s, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5sclose_f, (memspace_R, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5sclose_f, (memspace_Z, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5sclose_f, (memspace_success, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5sclose_f, (memspace_diotadxup, hdfier), __FILE__, __LINE__ ) - ! memspace_fiota is re-opened/closed in each iteration (see write_transform) - - ! close datasets - H5CALL( sphdf5, h5dclose_f, (dset_id_t, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5dclose_f, (dset_id_s, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5dclose_f, (dset_id_R, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5dclose_f, (dset_id_Z, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5dclose_f, (dset_id_success, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5dclose_f, (dset_id_diotadxup, hdfier), __FILE__, __LINE__ ) - H5CALL( sphdf5, h5dclose_f, (dset_id_fiota, hdfier), __FILE__, __LINE__ ) - - ! close groups - HCLOSEGRP( grpPoincare ) - HCLOSEGRP( grpTransform ) - - endif ! myid.eq.0 - -end subroutine finalize_flt_output - -!> \brief Write the magnetic vector potential Fourier harmonics to the output file group \c /vector_potential . -!> \ingroup grp_output -!> -!> The data is stacked in the radial direction over \c Lrad , -!> since \c Lrad can be different in each volume, but HDF5 only supports -!> rectangular arrays. So, one needs to split the \c sumLrad dimension -!> into chunks given by the input \c Lrad array. -!> -!> @param sumLrad total sum over \c Lrad in all nested volumes -!> @param allAte \f$A^{\theta}_\mathrm{even}\f$ for all nested volumes -!> @param allAze \f$A^{\zeta}_\mathrm{even}\f$ for all nested volumes -!> @param allAto \f$A^{\theta}_\mathrm{odd}\f$ for all nested volumes -!> @param allAzo \f$A^{\zeta}_\mathrm{odd}\f$ for all nested volumes -subroutine write_vector_potential(sumLrad, allAte, allAze, allAto, allAzo) - - use allglobal, only : mn - - LOCALS - integer, intent(in) :: sumLrad - REAL, intent(in) :: allAte(:,:), allAze(:,:), allAto(:,:), allAzo(:,:) - integer(hid_t) :: grpVectorPotential - - BEGIN( sphdf5 ) - - if (myid.eq.0 .and. .not.skip_write) then - - HDEFGRP( file_id, vector_potential, grpVectorPotential ) - - HWRITERA( grpVectorPotential, sumLrad, mn, Ate, allAte(1:sumLrad,1:mn) ) - HWRITERA( grpVectorPotential, sumLrad, mn, Aze, allAze(1:sumLrad,1:mn) ) - HWRITERA( grpVectorPotential, sumLrad, mn, Ato, allAto(1:sumLrad,1:mn) ) - HWRITERA( grpVectorPotential, sumLrad, mn, Azo, allAzo(1:sumLrad,1:mn) ) - - HCLOSEGRP( grpVectorPotential ) - - endif ! myid.eq.0 - -end subroutine write_vector_potential - -!> \brief Write the final state of the equilibrium to the output file. -!> \ingroup grp_output -!> -subroutine hdfint - - use fileunits, only : ounit - use inputlist - use allglobal, only : ncpu, cpus, & - Mvol, ForceErr, & - mn, im, in, iRbc, iZbs, iRbs, iZbc, & - mns, ims, ins, & - dRbc, dZbs, dRbs, dZbc, & - vvolume, dvolume, & - Bsupumn, Bsupvmn, & - Btemn, Bzemn, Btomn, Bzomn, & - iVns, iBns, iVnc, iBnc, & - lmns, & - TT, & - beltramierror, & - IPDt, dlambdaout, lmns - - LOCALS - - INTEGER :: Mrad - REAL :: tvolume - - integer(hid_t) :: grpOutput - - BEGIN( sphdf5 ) - - if (myid.eq.0 .and. .not.skip_write) then - - HDEFGRP( file_id, output, grpOutput ) - - HWRITERV( grpOutput, mn, Vns, iVns(1:mn) ) ! stellarator symmetric normal field at boundary; vacuum component; - HWRITERV( grpOutput, mn, Bns, iBns(1:mn) ) ! stellarator symmetric normal field at boundary; plasma component; - HWRITERV( grpOutput, mn, Vnc, iVnc(1:mn) ) ! non-stellarator symmetric normal field at boundary; vacuum component; - HWRITERV( grpOutput, mn, Bnc, iBnc(1:mn) ) ! non-stellarator symmetric normal field at boundary; plasma component; - -!> - - HCLOSEGRP( grpOutput ) - - endif ! myid.eq.0 - -end subroutine hdfint - -!> \brief Close all open HDF5 objects (we know of) and list any remaining still-open objects. -!> \ingroup grp_output -!> -subroutine finish_outfile -! Close all open HDF5 objects (we know of) and list any remaining still-open objects -! The goal should be to close all objects specifically! - - LOCALS - integer(size_t) :: obj_count ! number of open HDF5 objects - integer(size_t) :: num_objs ! number of still-open objects - integer(hid_t),dimension(:),allocatable :: obj_ids ! still-open objects - integer :: iObj - integer(size_t) :: openLength - character(len=:),allocatable :: openName - integer(size_t),parameter :: dummySize=1 - character(len=dummySize+1) :: dummyName - integer :: typeClass - - BEGIN( sphdf5 ) - - if (myid.eq.0 .and. .not.skip_write) then - - ! close objects related to convergence output - H5CALL( sphdf5, h5tclose_f, (dt_nDcalls_id, hdfier) , __FILE__, __LINE__) - H5CALL( sphdf5, h5tclose_f, (dt_Energy_id, hdfier) , __FILE__, __LINE__) - H5CALL( sphdf5, h5tclose_f, (dt_ForceErr_id, hdfier) , __FILE__, __LINE__) - H5CALL( sphdf5, h5tclose_f, (dt_iRbc_id, hdfier) , __FILE__, __LINE__) - H5CALL( sphdf5, h5tclose_f, (dt_iZbs_id, hdfier) , __FILE__, __LINE__) - H5CALL( sphdf5, h5tclose_f, (dt_iRbs_id, hdfier) , __FILE__, __LINE__) - H5CALL( sphdf5, h5tclose_f, (dt_iZbc_id, hdfier) , __FILE__, __LINE__) - H5CALL( sphdf5, h5dclose_f, (iteration_dset_id, hdfier), __FILE__, __LINE__) ! End access to the dataset and release resources used by it. - H5CALL( sphdf5, h5pclose_f, (plist_id, hdfier) , __FILE__, __LINE__) ! close plist used for 'preserve' flag (does not show up in obj_count below) - - ! check whether we forgot to close some resources; only check for group, dataset and datatype (there is only one file and that should be still open...) - H5CALL( sphdf5, h5fget_obj_count_f, (file_id, ior(H5F_OBJ_GROUP_F, ior(H5F_OBJ_DATASET_F, H5F_OBJ_DATATYPE_F)), obj_count, hdfier), __FILE__, __LINE__ ) - - if (obj_count.gt.0) then - write(*,'("There are still ",i3," hdf5 objects open")') obj_count - allocate(obj_ids(1:obj_count)) - - ! groups - H5CALL( sphdf5, h5fget_obj_ids_f, (file_id, H5F_OBJ_GROUP_F, obj_count, obj_ids, hdfier, num_objs), __FILE__, __LINE__) ! get for open objects - if (num_objs.gt.0) then - write(*,'("There are still ",i3," HDF5 groups open:")') num_objs - do iObj=1,num_objs - openLength=0 - H5CALL( sphdf5, h5iget_name_f, (obj_ids(iObj), dummyName, dummySize, openLength, hdfier), __FILE__, __LINE__) - allocate(character(len=openLength+1) :: openName) - H5CALL( sphdf5, h5iget_name_f, (obj_ids(iObj), openName, openLength, openLength, hdfier), __FILE__, __LINE__) - write(*,*) openName - deallocate(openName) - - H5CALL( sphdf5, h5gclose_f, (obj_ids(iObj), hdfier), __FILE__, __LINE__) - enddo - endif - - ! datasets - H5CALL( sphdf5, h5fget_obj_ids_f, (file_id, H5F_OBJ_DATASET_F, obj_count, obj_ids, hdfier, num_objs), __FILE__, __LINE__) ! get for open objects - if (num_objs.gt.0) then - write(*,'("There are still ",i3," HDF5 datasets open:")') num_objs - do iObj=1,num_objs - openLength=0 - H5CALL( sphdf5, h5iget_name_f, (obj_ids(iObj), dummyName, dummySize, openLength, hdfier), __FILE__, __LINE__) - allocate(character(len=openLength+1) :: openName) - H5CALL( sphdf5, h5iget_name_f, (obj_ids(iObj), openName, openLength, openLength, hdfier), __FILE__, __LINE__) - write(*,*) openName(1:openLength) - deallocate(openName) - - H5CALL( sphdf5, h5dclose_f, (obj_ids(iObj), hdfier), __FILE__, __LINE__) - enddo - endif - - ! datatypes - H5CALL( sphdf5, h5fget_obj_ids_f, (file_id, H5F_OBJ_DATATYPE_F, obj_count, obj_ids, hdfier, num_objs), __FILE__, __LINE__) ! get for open objects - if (num_objs.gt.0) then - write(*,'("There are still ",i3," HDF5 datatypes open:")') num_objs - do iObj=1,num_objs - H5CALL( sphdf5, h5tget_class_f, (obj_ids(iObj), typeClass, hdfier), __LINE__, __FILE__) ! determine class of open datatype - if (typeClass.eq.H5T_NO_CLASS_F ) then ; write(*,*) "H5T_NO_CLASS_F" - else if (typeClass.eq.H5T_INTEGER_F ) then ; write(*,*) "H5T_INTEGER_F" - else if (typeClass.eq.H5T_FLOAT_F ) then ; write(*,*) "H5T_FLOAT_F" - else if (typeClass.eq.H5T_STRING_F ) then ; write(*,*) "H5T_STRING_F" - else if (typeClass.eq.H5T_BITFIELD_F ) then ; write(*,*) "H5T_BITFIELD_F" - else if (typeClass.eq.H5T_OPAQUE_F ) then ; write(*,*) "H5T_OPAQUE_F" - else if (typeClass.eq.H5T_COMPOUND_F ) then ; write(*,*) "H5T_COMPOUND_F" - else if (typeClass.eq.H5T_REFERENCE_F) then ; write(*,*) "H5T_REFERENCE_F" - else if (typeClass.eq.H5T_ENUM_F ) then ; write(*,*) "H5T_ENUM_F" - else if (typeClass.eq.H5T_VLEN_F ) then ; write(*,*) "H5T_VLEN_F" - else if (typeClass.eq.H5T_ARRAY_F ) then ; write(*,*) "H5T_ARRAY_F" - else ; write(*,*) "UNKNOWN TYPE!" - endif - - H5CALL( sphdf5, h5tclose_f, (obj_ids(iObj), hdfier), __FILE__, __LINE__) - enddo - endif - - deallocate(obj_ids) - endif ! (obj_count.gt.0) - - H5CALL( sphdf5, h5fclose_f, ( file_id, hdfier ), __FILE__, __LINE__ ) ! terminate access on output file; - H5CALL( sphdf5, h5close_f, ( hdfier ), __FILE__, __LINE__ ) ! close Fortran interface to the HDF5 library; - - endif ! myid.eq.0 - -end subroutine finish_outfile - -end module sphdf5 diff --git a/src/spsint.f90 b/src/spsint.F90 similarity index 86% rename from src/spsint.f90 rename to src/spsint.F90 index 1c423eda..95c7998e 100644 --- a/src/spsint.f90 +++ b/src/spsint.F90 @@ -11,7 +11,7 @@ !> @param lvol !> @param lrad subroutine spsint( lquad, mn, lvol, lrad ) - + use mod_kinds, only: wp => dp !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! use constants, only : zero, half, one, two, pi, pi2 @@ -43,31 +43,47 @@ subroutine spsint( lquad, mn, lvol, lrad ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS - INTEGER, intent(in) :: lquad, mn, lvol, lrad +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + integer, intent(in) :: lquad, mn, lvol, lrad - INTEGER :: jquad, ll, pp, ll1, pp1, uv, ii, jj, io, mn2, lp2, mn2_max, lp2_max, nele, mi + integer :: jquad, ll, pp, ll1, pp1, uv, ii, jj, io, mn2, lp2, mn2_max, lp2_max, nele, mi - INTEGER :: kk, kd, kka, kks, kda, kds + integer :: kk, kd, kka, kks, kda, kds - REAL :: lss, jthweight, fee, feo, foe, foo, Tl, Dl, Tp, Dp, TlTp, TlDp, DlTp, DlDp, ikda, ikds, imn2, ilrad, lssm + real(wp) :: lss, jthweight, fee, feo, foe, foo, Tl, Dl, Tp, Dp, TlTp, TlDp, DlTp, DlDp, ikda, ikds, imn2, ilrad, lssm - REAL :: foocc, fooss - REAL :: fsscc, fssss - REAL :: fstcc, fstss - REAL :: fszcc, fszss - REAL :: fttcc, fttss - REAL :: ftzcc, ftzss - REAL :: fzzcc, fzzss + real(wp) :: foocc, fooss + real(wp) :: fsscc, fssss + real(wp) :: fstcc, fstss + real(wp) :: fszcc, fszss + real(wp) :: fttcc, fttss + real(wp) :: ftzcc, ftzss + real(wp) :: fzzcc, fzzss - REAL :: goomne, gssmne, gstmne, gszmne, gttmne, gtzmne, gzzmne + real(wp) :: goomne, gssmne, gstmne, gszmne, gttmne, gtzmne, gzzmne - REAL :: sbar + real(wp) :: sbar - REAL, allocatable :: basis(:,:,:,:) + real(wp), allocatable :: basis(:,:,:,:) + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif - BEGIN( spsint ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! mn2_max = mn*mn @@ -93,7 +109,10 @@ subroutine spsint( lquad, mn, lvol, lrad ) DDzzss = zero endif !NOTstellsym - SALLOCATE(basis, (0:lrad,0:mpol,0:1,lquad), zero) + + allocate( basis(0:lrad,0:mpol,0:1,lquad), stat=astat ) + basis(0:lrad,0:mpol,0:1,lquad) = zero + do jquad = 1, lquad lss = gaussianabscissae(jquad,lvol) ; jthweight = gaussianweight(jquad,lvol) sbar = (lss + one) * half @@ -241,10 +260,17 @@ subroutine spsint( lquad, mn, lvol, lrad ) end if !NOTstellsym - DALLOCATE(basis) + + deallocate(basis,stat=astat) + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - RETURN( spsint ) + +9999 continue + cput = MPI_WTIME() + Tspsint = Tspsint + ( cput-cpuo ) + return + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! diff --git a/src/spsmat.f90 b/src/spsmat.F90 similarity index 90% rename from src/spsmat.f90 rename to src/spsmat.F90 index ff7fbd4e..d27bcf6f 100644 --- a/src/spsmat.f90 +++ b/src/spsmat.F90 @@ -39,7 +39,7 @@ !> @param mn !> @param lrad subroutine spsmat( lvol, mn, lrad ) - + use mod_kinds, only: wp => dp !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! use constants, only : zero, one, two @@ -72,32 +72,48 @@ subroutine spsmat( lvol, mn, lrad ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS + +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - INTEGER, intent(in) :: lvol, mn, lrad + integer, intent(in) :: lvol, mn, lrad !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - INTEGER :: NN, ii, jj, ll, kk, pp, ll1, pp1, mi, ni, mj, nj, mimj, minj, nimj, ninj, mjmi, mjni, njmi, njni, id, jd, idx + integer :: NN, ii, jj, ll, kk, pp, ll1, pp1, mi, ni, mj, nj, mimj, minj, nimj, ninj, mjmi, mjni, njmi, njni, id, jd, idx - REAL :: Wtete, Wteto, Wtote, Wtoto - REAL :: Wteze, Wtezo, Wtoze, Wtozo - REAL :: Wzete, Wzeto, Wzote, Wzoto - REAL :: Wzeze, Wzezo, Wzoze, Wzozo + real(wp) :: Wtete, Wteto, Wtote, Wtoto + real(wp) :: Wteze, Wtezo, Wtoze, Wtozo + real(wp) :: Wzete, Wzeto, Wzote, Wzoto + real(wp) :: Wzeze, Wzezo, Wzoze, Wzozo - REAL :: Htete, Hteto, Htote, Htoto - REAL :: Hteze, Htezo, Htoze, Htozo - REAL :: Hzete, Hzeto, Hzote, Hzoto - REAL :: Hzeze, Hzezo, Hzoze, Hzozo - REAL :: adata, ddata, factorcc, factorss + real(wp) :: Htete, Hteto, Htote, Htoto + real(wp) :: Hteze, Htezo, Htoze, Htozo + real(wp) :: Hzete, Hzeto, Hzote, Hzoto + real(wp) :: Hzeze, Hzezo, Hzoze, Hzozo + real(wp) :: adata, ddata, factorcc, factorss - REAL,allocatable :: dMASqueue(:,:), dMDSqueue(:,:), TTdata(:,:,:), TTMdata(:,:) ! queues to construct sparse matrices - INTEGER,allocatable :: jdMASqueue(:,:) ! indices - INTEGER :: nqueue(4), nrow, ns, nmaxqueue + real(wp),allocatable :: dMASqueue(:,:), dMDSqueue(:,:), TTdata(:,:,:), TTMdata(:,:) ! queues to construct sparse matrices + integer,allocatable :: jdMASqueue(:,:) ! indices + integer :: nqueue(4), nrow, ns, nmaxqueue + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif - BEGIN(spsmat) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -112,12 +128,27 @@ subroutine spsmat( lvol, mn, lrad ) nmaxqueue = 4 * lrad + 10 ! estimate the size of the queue - SALLOCATE( dMASqueue, (1:nmaxqueue, 4), zero) - SALLOCATE( dMDSqueue, (1:nmaxqueue, 4), zero) - SALLOCATE( jdMASqueue, (1:nmaxqueue, 4), zero) - SALLOCATE( TTdata, (0:lrad, 0:mpol, 0:1), zero) - SALLOCATE( TTMdata, (0:lrad, 0:mpol), zero) + allocate( dMASqueue(1:nmaxqueue, 4), stat=astat ) + dMASqueue(1:nmaxqueue, 4) = zero + + + allocate( dMDSqueue(1:nmaxqueue, 4), stat=astat ) + dMDSqueue(1:nmaxqueue, 4) = zero + + + allocate( jdMASqueue(1:nmaxqueue, 4), stat=astat ) + jdMASqueue(1:nmaxqueue, 4) = zero + + + + allocate( TTdata(0:lrad, 0:mpol, 0:1), stat=astat ) + TTdata(0:lrad, 0:mpol, 0:1) = zero + + + allocate( TTMdata(0:lrad, 0:mpol), stat=astat ) + TTMdata(0:lrad, 0:mpol) = zero + ! fill in Zernike/Chebyshev polynomials depending on Lcooridnatesingularity if (Lcoordinatesingularity) then @@ -453,15 +484,30 @@ subroutine spsmat( lvol, mn, lrad ) ! dMB and dMG are constructed elsewhere - DALLOCATE( dMASqueue ) - DALLOCATE( dMDSqueue ) - DALLOCATE( jdMASqueue ) - DALLOCATE( TTdata ) - DALLOCATE( TTMdata ) + deallocate(dMASqueue ,stat=astat) + + + deallocate(dMDSqueue ,stat=astat) + + + deallocate(jdMASqueue ,stat=astat) + + + + deallocate(TTdata ,stat=astat) + + + deallocate(TTMdata ,stat=astat) + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - RETURN(spsmat) + +9999 continue + cput = MPI_WTIME() + Tspsmat = Tspsmat + ( cput-cpuo ) + return + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -483,6 +529,7 @@ end subroutine spsmat !> @param qD !> @param qjA subroutine push_back(iq, nq, NN, vA, vD, vjA, qA, qD, qjA) + use mod_kinds, only: wp => dp ! push a new element at the back of the queue ! INPUTS: ! iq - INTEGER, which queue (1-4) @@ -494,10 +541,10 @@ subroutine push_back(iq, nq, NN, vA, vD, vjA, qA, qD, qjA) use constants, only : zero implicit none - REAL, INTENT(IN) :: vA, vD - INTEGER, INTENT(IN) :: vjA, iq, NN - REAL, INTENT(INOUT) :: qA(NN,4), qD(NN,4) - INTEGER, INTENT(INOUT) :: qjA(NN,4), nq(4) + real(wp), INTENT(IN) :: vA, vD + integer, INTENT(IN) :: vjA, iq, NN + real(wp), INTENT(INOUT) :: qA(NN,4), qD(NN,4) + integer, INTENT(INOUT) :: qjA(NN,4), nq(4) if (abs(vA).gt.zero .or. abs(vD).gt.zero) then @@ -518,13 +565,14 @@ end subroutine push_back !> @param qD !> @param qjA subroutine clean_queue(nq, NN, qA, qD, qjA) + use mod_kinds, only: wp => dp ! clean the queue use constants, only : zero implicit none - INTEGER, INTENT(IN) :: NN - REAL, INTENT(INOUT) :: qA(NN,4), qD(NN,4) - INTEGER, INTENT(INOUT) :: qjA(NN,4), nq(4) + integer, INTENT(IN) :: NN + real(wp), INTENT(INOUT) :: qA(NN,4), qD(NN,4) + integer, INTENT(INOUT) :: qjA(NN,4), nq(4) nq = 0 qA = zero @@ -548,16 +596,17 @@ end subroutine clean_queue !> @param jdMAS !> @param idMAS subroutine addline(nq, NN, qA, qD, qjA, ns, nrow, dMAS, dMDS, jdMAS, idMAS) + use mod_kinds, only: wp => dp ! add the content from the queue to the real matrices implicit none - INTEGER, INTENT(INOUT) :: NN, ns, nrow - REAL, INTENT(INOUT) :: qA(NN,4), qD(NN,4) - INTEGER, INTENT(INOUT) :: qjA(NN,4), nq(4) - REAL :: dMAS(*), dMDS(*) - INTEGER :: jdMAS(*), idMAS(*) + integer, INTENT(INOUT) :: NN, ns, nrow + real(wp), INTENT(INOUT) :: qA(NN,4), qD(NN,4) + integer, INTENT(INOUT) :: qjA(NN,4), nq(4) + real(wp) :: dMAS(*), dMDS(*) + integer :: jdMAS(*), idMAS(*) - INTEGER :: pp + integer :: pp do pp = 1, 4 if (nq(pp) .eq. 0) cycle diff --git a/src/stzxyz.f90 b/src/stzxyz.F90 similarity index 80% rename from src/stzxyz.f90 rename to src/stzxyz.F90 index 9aa5a171..5722e874 100644 --- a/src/stzxyz.f90 +++ b/src/stzxyz.F90 @@ -17,7 +17,7 @@ !> @param[in] stz !> @param[out] RpZ subroutine stzxyz( lvol , stz , RpZ ) - + use mod_kinds, only: wp => dp !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! use constants, only : zero, one, half @@ -33,23 +33,51 @@ subroutine stzxyz( lvol , stz , RpZ ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS - INTEGER, intent(in) :: lvol +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + integer, intent(in) :: lvol - REAL, intent(in) :: stz(1:3) - REAL, intent(out) :: RpZ(1:3) + real(wp), intent(in) :: stz(1:3) + real(wp), intent(out) :: RpZ(1:3) - INTEGER :: ii, mi, ni - REAL :: Remn, Zomn, Romn, Zemn, RR, phi, ZZ, arg, carg, sarg, lss, alss, blss, sbar, sbarhim, fj + integer :: ii, mi, ni + real(wp) :: Remn, Zomn, Romn, Zemn, RR, phi, ZZ, arg, carg, sarg, lss, alss, blss, sbar, sbarhim, fj + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif - BEGIN(stzxyz) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! #ifdef DEBUG - FATAL(stzxyz, lvol.lt.1 .or. lvol.gt.Mvol, invalid interface label ) - FATAL(stzxyz, abs(stz(1)).gt.one, invalid radial coordinate ) + + if( lvol.lt.1 .or. lvol.gt.Mvol ) then + write(6,'("stzxyz : fatal : myid=",i3," ; lvol.lt.1 .or. lvol.gt.Mvol ; invalid interface label ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "stzxyz : lvol.lt.1 .or. lvol.gt.Mvol : invalid interface label ;" + endif + + + if( abs(stz(1)).gt.one ) then + write(6,'("stzxyz : fatal : myid=",i3," ; abs(stz(1)).gt.one ; invalid radial coordinate ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "stzxyz : abs(stz(1)).gt.one : invalid radial coordinate ;" + endif + #endif !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -129,7 +157,12 @@ subroutine stzxyz( lvol , stz , RpZ ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - RETURN(stzxyz) + +9999 continue + cput = MPI_WTIME() + Tstzxyz = Tstzxyz + ( cput-cpuo ) + return + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! diff --git a/src/tr00ab.f90 b/src/tr00ab.F90 similarity index 75% rename from src/tr00ab.f90 rename to src/tr00ab.F90 index 8a6b973b..1e6ab67a 100644 --- a/src/tr00ab.f90 +++ b/src/tr00ab.F90 @@ -68,7 +68,7 @@ !> @param iflag !> @param ldiota subroutine tr00ab( lvol, mn, NN, Nt, Nz, iflag, ldiota ) ! construct straight-field line magnetic coordinates; - + use mod_kinds, only: wp => dp !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! use constants, only : zero, third, half, one, two, pi2, goldenmean @@ -94,17 +94,25 @@ subroutine tr00ab( lvol, mn, NN, Nt, Nz, iflag, ldiota ) ! construct straight-fi !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS - INTEGER, intent(in) :: lvol, mn, NN, Nt, Nz, iflag +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + - REAL, intent(inout) :: ldiota(0:1,-1:2) + integer, intent(in) :: lvol, mn, NN, Nt, Nz, iflag - INTEGER :: innout, ll, ii, jj, kk, jb, kb, mj, nj, ideriv, jderiv, id, MM, ielement, nelements, Lcurvature, idof, icon, mi, ni, imupf + real(wp), intent(inout) :: ldiota(0:1,-1:2) - REAL :: lcpu, mfactor, lss, Dteta, Dzeta, rfac, tol, rnorm, omega, diotaerror!, sparsedenseerror + integer :: innout, ll, ii, jj, kk, jb, kb, mj, nj, ideriv, jderiv, id, MM, ielement, nelements, Lcurvature, idof, icon, mi, ni, imupf - REAL :: lAte(0:mn,-1:2), lAze(0:mn,-1:2), lAto(0:mn,-1:2), lAzo(0:mn,-1:2) + real(wp) :: lcpu, mfactor, lss, Dteta, Dzeta, rfac, tol, rnorm, omega, diotaerror!, sparsedenseerror + + real(wp) :: lAte(0:mn,-1:2), lAze(0:mn,-1:2), lAto(0:mn,-1:2), lAzo(0:mn,-1:2) ! REAL :: lBso(1:mn,-1:2), lBte(1:mn,-1:2), lBze(1:mn,-1:2) ! REAL :: lBse(1:mn,-1:2), lBto(1:mn,-1:2), lBzo(1:mn,-1:2) @@ -112,42 +120,68 @@ subroutine tr00ab( lvol, mn, NN, Nt, Nz, iflag, ldiota ) ! construct straight-fi ! REAL :: gvu(1:Nt*Nz,1:3,1:3) ! local workspace; 13 Sep 13; ! required for Fourier routines; - INTEGER :: IA, if04aaf, idgesvx, ipiv(1:NN), iwork4(1:NN) - REAL , allocatable :: dmatrix(:,:,:), omatrix(:,:), FAA(:,:) - REAL :: drhs(1:NN,-1:2), dlambda(1:NN,-1:2) - REAL :: Rdgesvx(1:NN), Cdgesvx(1:NN), work4(1:4*NN), rcond, ferr(1), berr(1), ferr2(1:2), berr2(1:2) - CHARACTER :: equed + integer :: IA, if04aaf, idgesvx, ipiv(1:NN), iwork4(1:NN) + real(wp) , allocatable :: dmatrix(:,:,:), omatrix(:,:), FAA(:,:) + real(wp) :: drhs(1:NN,-1:2), dlambda(1:NN,-1:2) + real(wp) :: Rdgesvx(1:NN), Cdgesvx(1:NN), work4(1:4*NN), rcond, ferr(1), berr(1), ferr2(1:2), berr2(1:2) + character :: equed ! required for real-space routines; - INTEGER :: maxitn, reqdits, extralength, lrwork, integerwork(1:2*Nt*Nz+2+1), if11def, if11zaf, if11xaf - INTEGER :: IAA, if04atf, if04arf - INTEGER :: Ndof, label(-3:Nt+2,-3:Nz+2), isym + integer :: maxitn, reqdits, extralength, lrwork, integerwork(1:2*Nt*Nz+2+1), if11def, if11zaf, if11xaf + integer :: IAA, if04atf, if04arf + integer :: Ndof, label(-3:Nt+2,-3:Nz+2), isym !required for SVD routines; - INTEGER :: idgelsd, Lwork, Liwork, Irank, nlvl - REAL :: sval(1:NN) - REAL , allocatable :: work(:) + integer :: idgelsd, Lwork, Liwork, Irank, nlvl + real(wp) :: sval(1:NN) + real(wp) , allocatable :: work(:) + + real(wp) :: Bsupt(1:Nt*Nz,-1:2), Bsupz(1:Nt*Nz,-1:2), tdot(1:Nt*Nz) + real(wp) :: Bsubs(1:Nt*Nz,-1:2), Bsubt(1:Nt*Nz,-1:2), Bsubz(1:Nt*Nz,-1:2) - REAL :: Bsupt(1:Nt*Nz,-1:2), Bsupz(1:Nt*Nz,-1:2), tdot(1:Nt*Nz) - REAL :: Bsubs(1:Nt*Nz,-1:2), Bsubt(1:Nt*Nz,-1:2), Bsubz(1:Nt*Nz,-1:2) + real(wp) :: dotteta, dotzeta - REAL :: dotteta, dotzeta + real(wp) , allocatable :: rmatrix(:,:,:), rrhs(:,:), rlambda(:,:), wks1(:), wks2(:), AA(:,:) - REAL , allocatable :: rmatrix(:,:,:), rrhs(:,:), rlambda(:,:), wks1(:), wks2(:), AA(:,:) + integer :: inz(-1:2), lnz + integer, allocatable :: irow(:,:), jcol(:,:), istr(:), iwork(:) + real(wp) , allocatable :: smatrix(:,:), srhs(:,:), slambda(:,:), swork(:) + character :: duplicate*1, zeros*1, method*8, precon*1, trans*1, check*1 ! logical control of sparse routines; 20 Apr 13; - INTEGER :: inz(-1:2), lnz - INTEGER, allocatable :: irow(:,:), jcol(:,:), istr(:), iwork(:) - REAL , allocatable :: smatrix(:,:), srhs(:,:), slambda(:,:), swork(:) - CHARACTER :: duplicate*1, zeros*1, method*8, precon*1, trans*1, check*1 ! logical control of sparse routines; 20 Apr 13; - BEGIN(tr00ab) + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! #ifdef DEBUG - FATAL( tr00ab, mns.le.0, no degrees of freedom in angle transformation ) ! this is only for Fourier; 20 Apr 13; - FATAL( tr00ab, lvol.lt.1 .or. lvol.gt.Mvol, illegal lvol ) - FATAL( tr00ab, iflag.lt.-1 .or. iflag.gt.2, illegal iflag ) + + if( mns.le.0 ) then + write(6,'("tr00ab : fatal : myid=",i3," ; mns.le.0 ; no degrees of freedom in angle transformation ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "tr00ab : mns.le.0 : no degrees of freedom in angle transformation ;" + endif + ! this is only for Fourier; 20 Apr 13; + + if( lvol.lt.1 .or. lvol.gt.Mvol ) then + write(6,'("tr00ab : fatal : myid=",i3," ; lvol.lt.1 .or. lvol.gt.Mvol ; illegal lvol ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "tr00ab : lvol.lt.1 .or. lvol.gt.Mvol : illegal lvol ;" + endif + + + if( iflag.lt.-1 .or. iflag.gt.2 ) then + write(6,'("tr00ab : fatal : myid=",i3," ; iflag.lt.-1 .or. iflag.gt.2 ; illegal iflag ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "tr00ab : iflag.lt.-1 .or. iflag.gt.2 : illegal iflag ;" + endif + #endif !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -215,9 +249,18 @@ subroutine tr00ab( lvol, mn, NN, Nt, Nz, iflag, ldiota ) ! construct straight-fi ! construct real-space, real-space transformation matrix; 20 Apr 13; if( Lsparse.eq.0 .or. Lsparse.eq.3 ) then - SALLOCATE( dmatrix, (1:NN,1:NN,-1:2), zero ) - SALLOCATE( omatrix, (1:NN,1:NN), zero ) - SALLOCATE( FAA, (1:NN,1:NN), zero ) + + allocate( dmatrix(1:NN,1:NN,-1:2), stat=astat ) + dmatrix(1:NN,1:NN,-1:2) = zero + + + allocate( omatrix(1:NN,1:NN), stat=astat ) + omatrix(1:NN,1:NN) = zero + + + allocate( FAA(1:NN,1:NN), stat=astat ) + FAA(1:NN,1:NN) = zero + endif @@ -225,15 +268,33 @@ subroutine tr00ab( lvol, mn, NN, Nt, Nz, iflag, ldiota ) ! construct straight-fi if( Lsparse.gt.0 ) then - FATAL( tr00ab, NOTstellsym, under construction ) - FATAL( tr00ab, Ntor.ne.0 , under construction ) + + if( NOTstellsym ) then + write(6,'("tr00ab : fatal : myid=",i3," ; NOTstellsym ; under construction ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "tr00ab : NOTstellsym : under construction ;" + endif + + + if( Ntor.ne.0 ) then + write(6,'("tr00ab : fatal : myid=",i3," ; Ntor.ne.0 ; under construction ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "tr00ab : Ntor.ne.0 : under construction ;" + endif + select case( iorder ) case( 2 ) ; Dteta = 2 * pi2 / Nt ; Dzeta = pi2nfp / Nz ! real-space grid resolution; 20 Apr 13; case( 4 ) ; Dteta = 12 * pi2 / Nt ; Dzeta = pi2nfp / Nz ! real-space grid resolution; 20 Apr 13; case( 6 ) ; Dteta = 60 * pi2 / Nt ; Dzeta = pi2nfp / Nz ! real-space grid resolution; 20 Apr 13; case default - FATAL( tr00ab, .true., iorder not supported ) + + if( .true. ) then + write(6,'("tr00ab : fatal : myid=",i3," ; .true. ; iorder not supported ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "tr00ab : .true. : iorder not supported ;" + endif + end select tdot(1:Ntz) = Bsupt(1:Ntz,0) / Bsupz(1:Ntz,0) ! shorthand; 24 Apr 13; @@ -265,33 +326,84 @@ subroutine tr00ab( lvol, mn, NN, Nt, Nz, iflag, ldiota ) ! construct straight-fi endif - FATAL( tr00ab, ii.ne.Ndof, counting error ) + + if( ii.ne.Ndof ) then + write(6,'("tr00ab : fatal : myid=",i3," ; ii.ne.Ndof ; counting error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "tr00ab : ii.ne.Ndof : counting error ;" + endif + Ndof = Ndof + 1 ! include rotational-transform as a degree-of-freedom; 23 Apr 13; ! dense arrays; 24 Apr 13; ! these will eventually be redundant; 24 Apr 13; if( Lsparse.eq.1 ) then ! dense transformation; 24 Apr 13; - SALLOCATE( rmatrix, (1:Ndof,1:Ndof,-1:2), zero ) ! real-space angle transformation matrix; dense; 23 Apr 13; - SALLOCATE( rrhs , (1:Ndof, -1:2), zero ) - SALLOCATE( rlambda, (1:Ndof, -1:2), zero ) - SALLOCATE( wks1 , (1:Ndof ), zero ) - SALLOCATE( wks2 , (1:Ndof ), zero ) - SALLOCATE( AA , (1:Ndof,1:Ndof ), zero ) + + allocate( rmatrix(1:Ndof,1:Ndof,-1:2), stat=astat ) + rmatrix(1:Ndof,1:Ndof,-1:2) = zero + ! real-space angle transformation matrix; dense; 23 Apr 13; + + allocate( rrhs (1:Ndof, -1:2), stat=astat ) + rrhs (1:Ndof, -1:2) = zero + + + allocate( rlambda(1:Ndof, -1:2), stat=astat ) + rlambda(1:Ndof, -1:2) = zero + + + allocate( wks1 (1:Ndof ), stat=astat ) + wks1 (1:Ndof ) = zero + + + allocate( wks2 (1:Ndof ), stat=astat ) + wks2 (1:Ndof ) = zero + + + allocate( AA (1:Ndof,1:Ndof ), stat=astat ) + AA (1:Ndof,1:Ndof ) = zero + endif ! end of if( Lsparse.eq.1 ) ; 24 Apr 13; ! sparse arrays; ! all of these can be simply defined (1:Ntz) etc. . . . ; 24 Apr 13; if( Lsparse.ge.2 ) then ! sparse transformation; 24 Apr 13; - SALLOCATE( srhs , (1: Ndof ,-1:2), zero ) - SALLOCATE( istr , (1: Ndof+1 ), 0 ) ! for re-ordering; 24 Apr 13; - SALLOCATE( iwork , (1:2*Ndof+1 ), 0 ) ! for re-ordering & iterative solver; 24 Apr 13; - SALLOCATE( slambda, (1: Ndof ,-1:2), zero ) + + allocate( srhs (1: Ndof ,-1:2), stat=astat ) + srhs (1: Ndof ,-1:2) = zero + + + allocate( istr (1: Ndof+1 ), stat=astat ) + istr (1: Ndof+1 ) = 0 + ! for re-ordering; 24 Apr 13; + + allocate( iwork (1:2*Ndof+1 ), stat=astat ) + iwork (1:2*Ndof+1 ) = 0 + ! for re-ordering & iterative solver; 24 Apr 13; + + allocate( slambda(1: Ndof ,-1:2), stat=astat ) + slambda(1: Ndof ,-1:2) = zero + select case( iorder ) case( 2 ) - SALLOCATE( smatrix, (1:Ndof*5,-1:2), zero) ! real-space angle transformation; sparse; 24 Apr 13; - SALLOCATE( irow , (1:Ndof*5,-1:2), 0 ) - SALLOCATE( jcol , (1:Ndof*5,-1:2), 0 ) + + allocate( smatrix(1:Ndof*5,-1:2), stat=astat ) + smatrix(1:Ndof*5,-1:2) = zero + ! real-space angle transformation; sparse; 24 Apr 13; + + allocate( irow (1:Ndof*5,-1:2), stat=astat ) + irow (1:Ndof*5,-1:2) = 0 + + + allocate( jcol (1:Ndof*5,-1:2), stat=astat ) + jcol (1:Ndof*5,-1:2) = 0 + case default - FATAL( tr00ab, .true., need to estimate length of smatrix irow and jcol ) + + if( .true. ) then + write(6,'("tr00ab : fatal : myid=",i3," ; .true. ; need to estimate length of smatrix irow and jcol ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "tr00ab : .true. : need to estimate length of smatrix irow and jcol ;" + endif + end select endif ! end of if( Lsparse.gt.2 ) ; 24 Apr 13; @@ -350,7 +462,13 @@ subroutine tr00ab( lvol, mn, NN, Nt, Nz, iflag, ldiota ) ! construct straight-fi case( 6 ) ; jb = jj-3 ; kb = kk ; rfac = - 1 * dotteta / Dteta ; isym = +1 end select case default - FATAL( tr00ab, .true., selected value of iorder not supported ) + + if( .true. ) then + write(6,'("tr00ab : fatal : myid=",i3," ; .true. ; selected value of iorder not supported ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "tr00ab : .true. : selected value of iorder not supported ;" + endif + end select ! end of select case( iorder ) ; 24 Apr 13; if ( jb.eq.-3 ) then ; jb = 3 ; isym = -1 @@ -427,7 +545,13 @@ subroutine tr00ab( lvol, mn, NN, Nt, Nz, iflag, ldiota ) ! construct straight-fi endif case default - FATAL( tr00ab, .true., iorder not supported ) + + if( .true. ) then + write(6,'("tr00ab : fatal : myid=",i3," ; .true. ; iorder not supported ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "tr00ab : .true. : iorder not supported ;" + endif + end select rfac= (- 1)*dotzeta @@ -439,21 +563,27 @@ subroutine tr00ab( lvol, mn, NN, Nt, Nz, iflag, ldiota ) ! construct straight-fi inz(id) = lnz ! lnz is short-hand; 24 Apr 13; - lcpu = GETTIME ! record time taken in F11DEF; 20 Apr 13; + lcpu = MPI_WTIME() ! record time taken in F11DEF; 20 Apr 13; duplicate = 'S' ! duplicate = 'R' = remove, 'S' = sum or 'F' = fatal ; 20 Apr 13; zeros = 'K' ! zeros = 'R' = remove, 'K' = keep or 'F' = fatal ; 20 Apr 13; if11zaf = 1 call F11ZAF( Ndof, inz(id), smatrix(1:inz(id),id), irow(1:inz(id),id), jcol(1:inz(id),id), duplicate, zeros, istr(1:Ndof+1), iwork(1:Ndof), if11zaf ) - cput = GETTIME + cput = MPI_WTIME() select case( if11zaf ) !1234567890123456789012 case( 0 ) ; if( Wtr00ab ) write(ounit,1000) myid, lvol, innout, id, if11zaf, cput-lcpu, "success ; " case( 1 ) ; write(ounit,1000) myid, lvol, innout, id, if11zaf, cput-lcpu, "input error ; " case( 2 ) ; write(ounit,1000) myid, lvol, innout, id, if11zaf, cput-lcpu, "row or column error ; " case( 3 ) ; write(ounit,1000) myid, lvol, innout, id, if11zaf, cput-lcpu, "duplicate eq F error ;" case( 4 ) ; write(ounit,1000) myid, lvol, innout, id, if11zaf, cput-lcpu, "zeros eq F error ; " - case default ; FATAL( tr00ab, .true., illegal ifail returned by F11ZAF ) + case default ; + if( .true. ) then + write(6,'("tr00ab : fatal : myid=",i3," ; .true. ; illegal ifail returned by F11ZAF ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "tr00ab : .true. : illegal ifail returned by F11ZAF ;" + endif + end select 1000 format("tr00ab : ", 10x ," : myid=",i3," ; lvol=",i3," ; innout="i2" ; ideriv="i2" ; if11zaf="i2" ; time="f10.4" ; "a22) @@ -473,17 +603,32 @@ subroutine tr00ab( lvol, mn, NN, Nt, Nz, iflag, ldiota ) ! construct straight-fi case( 0 ) ; precon='N' ; extralength = 0 case( 1 ) ; precon='J' ; extralength = Ndof case( 2 ) ; precon='S' ; extralength = Ndof - case default ; FATAL( tr00ab, .true., illegal iprecon ) + case default ; + if( .true. ) then + write(6,'("tr00ab : fatal : myid=",i3," ; .true. ; illegal iprecon ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "tr00ab : .true. : illegal iprecon ;" + endif + end select select case( imethod ) case( 1 ) ; method='RGMRES' ; MM = min( Ndof, 50) ; lrwork = 4 * Ndof + MM * ( MM + Ndof + 4 ) + extralength + 1 case( 2 ) ; method='CGS' ; ; lrwork = 8 * Ndof + extralength case( 3 ) ; method='BICGSTAB' ; MM = min( Ndof, 10) ; lrwork = 2 * Ndof * ( MM + 2) + MM * ( MM + 2 ) + Ndof + 2 * extralength - case default ; FATAL( tr00ab, .true., illegal imethod ) + case default ; + if( .true. ) then + write(6,'("tr00ab : fatal : myid=",i3," ; .true. ; illegal imethod ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "tr00ab : .true. : illegal imethod ;" + endif + end select - SALLOCATE( swork, (1:lrwork), zero ) + + allocate( swork(1:lrwork), stat=astat ) + swork(1:lrwork) = zero + tol = max( iotatol, machprec ) ; maxitn = Ndof**3 ; omega = one @@ -518,24 +663,36 @@ subroutine tr00ab( lvol, mn, NN, Nt, Nz, iflag, ldiota ) ! construct straight-fi case( 1 ) ; write(ounit,1015) myid, lvol, innout, id, if11xaf, "input error ;" case( 2 ) ; write(ounit,1015) myid, lvol, innout, id, if11xaf, "input error ;" case( 3 ) ; write(ounit,1015) myid, lvol, innout, id, if11xaf, "input error ;" - case default ; FATAL( tr00ab, .true., illegal ifail returned from F11XAF ) + case default ; + if( .true. ) then + write(6,'("tr00ab : fatal : myid=",i3," ; .true. ; illegal ifail returned from F11XAF ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "tr00ab : .true. : illegal ifail returned from F11XAF ;" + endif + end select 1015 format("tr00ab : ", 10x ," : myid=",i3," ; lvol=",i3," ; innout="i2" ; ideriv="i2" ; if11xaf="i2" ; "10x" ; "a13) srhs(1:Ndof,id) = srhs(1:Ndof,id) - srhs(1:Ndof,-1) endif ! end of if( Lsparse.ge.2. ) ; 24 Apr 13; case default - FATAL( tr00ab, .true., invalid ideriv ) + + if( .true. ) then + write(6,'("tr00ab : fatal : myid=",i3," ; .true. ; invalid ideriv ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "tr00ab : .true. : invalid ideriv ;" + endif + end select ! end of select case( ideriv ) ; 21 Apr 13; if( Lsparse.ge.2 ) then ! use sparse solver; 24 Apr 13; slambda(1:Ndof,ideriv) = glambda(1:Ndof,ideriv,innout,lvol) ! initial guess provided ; 24 Apr 13; - lcpu = GETTIME ! record time taken in F11DEF; 20 Apr 13; + lcpu = MPI_WTIME() ! record time taken in F11DEF; 20 Apr 13; reqdits = 0 ; rnorm = -one ! sometimes, F11DEF can exit without these being set; 21 Apr 13; if11def = 1 call F11DEF( method, precon, Ndof, inz( 0), smatrix(1:inz( 0), 0), irow(1:inz( 0), 0), jcol(1:inz( 0), 0), omega, srhs(1:Ndof,id), MM, tol, maxitn, & slambda(1:Ndof,id), rnorm, reqdits, swork(1:lrwork), lrwork, iwork(1:2*Ndof+1), if11def) - cput = GETTIME + cput = MPI_WTIME() select case( if11def ) ! !12345678901234567 case( 0 ) ; if( Wtr00ab ) write(ounit,1020) cput-cpus, myid, lvol, innout, id, if11def, cput-lcpu, "solved sparse ; ", slambda(Ndof,id), reqdits, rnorm case( 1 ) ; write(ounit,1020) cput-cpus, myid, lvol, innout, id, if11def, cput-lcpu, "input error ; ", zero , reqdits, rnorm @@ -544,7 +701,13 @@ subroutine tr00ab( lvol, mn, NN, Nt, Nz, iflag, ldiota ) ! construct straight-fi case( 4 ) ; write(ounit,1020) cput-cpus, myid, lvol, innout, id, if11def, cput-lcpu, "reqd acc. fail ; ", zero , reqdits, rnorm case( 5 ) ; write(ounit,1020) cput-cpus, myid, lvol, innout, id, if11def, cput-lcpu, "reqd acc. fail ; ", zero , reqdits, rnorm case( 6 ) ; write(ounit,1020) cput-cpus, myid, lvol, innout, id, if11def, cput-lcpu, "serious error ; ", zero , reqdits, rnorm - case default ; FATAL( tr00ab, .true., illegal ifail returned by f11def ) + case default ; + if( .true. ) then + write(6,'("tr00ab : fatal : myid=",i3," ; .true. ; illegal ifail returned by f11def ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "tr00ab : .true. : illegal ifail returned by f11def ;" + endif + end select 1020 format("tr00ab : ",f10.2," ; myid=",i3," ; lvol=",i3," ; innout="i2" ; ideriv="i2" ; if11def="i2" ; time="f10.4" ; "a17,:" [d]iota="es17.09& " ; its="i6" rnorm="es13.5" ;") @@ -555,16 +718,22 @@ subroutine tr00ab( lvol, mn, NN, Nt, Nz, iflag, ldiota ) ! construct straight-fi if( Lsparse.eq.1 ) then ! use dense-solver; 24 Apr 13; - lcpu = GETTIME + lcpu = MPI_WTIME() if04atf = 1 ; IA = Ndof ; IAA = Ndof call F04ATF( rmatrix(1:Ndof,1:Ndof, 0), IA, rrhs(1:Ndof,id), Ndof, rlambda(1:Ndof,id), AA(1:IAA,1:Ndof), IAA, wks1(1:Ndof), wks2(1:Ndof), if04atf ) - cput = GETTIME + cput = MPI_WTIME() select case( if04atf ) ! !12345678901234567 case( 0 ) ; if( Wtr00ab ) write(ounit,1025) cput-cpus, myid, lvol, innout, id, if04atf, cput-lcpu, "solved real ; ", rlambda(Ndof,id) case( 1 ) ; write(ounit,1025) cput-cpus, myid, lvol, innout, id, if04atf, cput-lcpu, "singular ; " case( 2 ) ; write(ounit,1025) cput-cpus, myid, lvol, innout, id, if04atf, cput-lcpu, "ill-conditioned ;" case( 3 ) ; write(ounit,1025) cput-cpus, myid, lvol, innout, id, if04atf, cput-lcpu, "input error ; " - case default ; FATAL( tr00ab, .true., illegal ifail returned by f04atf ) + case default ; + if( .true. ) then + write(6,'("tr00ab : fatal : myid=",i3," ; .true. ; illegal ifail returned by f04atf ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "tr00ab : .true. : illegal ifail returned by f04atf ;" + endif + end select 1025 format("tr00ab : ",f10.2," ; myid=",i3," ; lvol=",i3," ; innout="i2" ; ideriv="i2" ; if04atf="i2" ; time="f10.4" ; "a17,:" [d]iota="es17.09" ;") ldiota(innout,ideriv) = rlambda(Ndof,id) ! return intent out; 23 Apr 13; @@ -573,7 +742,9 @@ subroutine tr00ab( lvol, mn, NN, Nt, Nz, iflag, ldiota ) ! construct straight-fi enddo ! end of do ideriv; 23 Apr 13; - DALLOCATE(swork) + + deallocate(swork,stat=astat) + endif ! end of if( Lsparse.gt.0 ); @@ -622,7 +793,13 @@ subroutine tr00ab( lvol, mn, NN, Nt, Nz, iflag, ldiota ) ! construct straight-fi !$OMP ATOMIC UPDATE dmatrix(ii ,jj ,ideriv) = dmatrix(ii ,jj ,ideriv) + ( - mj * lAze(kk,ideriv) + nj * lAte(kk,ideriv) ) * half if( NOTstellsym) then - FATAL( tr00ab,ii+mns-1.lt.1 .or. ii+mns-1.gt.NN .or. jj+mns-1.lt.1 .or. jj+mns-1.gt.NN, illegal subscript ) ! THIS CAN BE DELETED EVENTUALLY; + + if( ii+mns-1.lt.1 .or. ii+mns-1.gt.NN .or. jj+mns-1.lt.1 .or. jj+mns-1.gt.NN ) then + write(6,'("tr00ab : fatal : myid=",i3," ; ii+mns-1.lt.1 .or. ii+mns-1.gt.NN .or. jj+mns-1.lt.1 .or. jj+mns-1.gt.NN ; illegal subscript ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "tr00ab : ii+mns-1.lt.1 .or. ii+mns-1.gt.NN .or. jj+mns-1.lt.1 .or. jj+mns-1.gt.NN : illegal subscript ;" + endif + ! THIS CAN BE DELETED EVENTUALLY; !$OMP ATOMIC UPDATE dmatrix(ii+mns-1,jj ,ideriv) = dmatrix(ii+mns-1,jj ,ideriv) + ( - mj * lAzo(kk,ideriv) + nj * lAto(kk,ideriv) ) * half !$OMP ATOMIC UPDATE @@ -640,11 +817,23 @@ subroutine tr00ab( lvol, mn, NN, Nt, Nz, iflag, ldiota ) ! construct straight-fi if( ii.lt.1 ) cycle - FATAL( tr00ab,ii.gt.NN .or. jj.gt.NN, illegal subscript ) ! THIS CAN BE DELETED EVENTUALLY; 02 Sep 14; + + if( ii.gt.NN .or. jj.gt.NN ) then + write(6,'("tr00ab : fatal : myid=",i3," ; ii.gt.NN .or. jj.gt.NN ; illegal subscript ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "tr00ab : ii.gt.NN .or. jj.gt.NN : illegal subscript ;" + endif + ! THIS CAN BE DELETED EVENTUALLY; 02 Sep 14; !$OMP ATOMIC UPDATE dmatrix(ii ,jj ,ideriv) = dmatrix(ii ,jj ,ideriv) + ( - mj * lAze(kk,ideriv) + nj * lAte(kk,ideriv) ) * half if( NOTstellsym) then - FATAL( tr00ab,ii+mns-1.lt.1 .or. ii+mns-1.gt.NN .or. jj+mns-1.lt.1 .or. jj+mns-1.gt.NN, illegal subscript ) ! THIS CAN BE DELETED EVENTUALLY; + + if( ii+mns-1.lt.1 .or. ii+mns-1.gt.NN .or. jj+mns-1.lt.1 .or. jj+mns-1.gt.NN ) then + write(6,'("tr00ab : fatal : myid=",i3," ; ii+mns-1.lt.1 .or. ii+mns-1.gt.NN .or. jj+mns-1.lt.1 .or. jj+mns-1.gt.NN ; illegal subscript ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "tr00ab : ii+mns-1.lt.1 .or. ii+mns-1.gt.NN .or. jj+mns-1.lt.1 .or. jj+mns-1.gt.NN : illegal subscript ;" + endif + ! THIS CAN BE DELETED EVENTUALLY; !$OMP ATOMIC UPDATE dmatrix(ii+mns-1,jj ,ideriv) = dmatrix(ii+mns-1,jj ,ideriv) + ( - mj * lAzo(kk,ideriv) + nj * lAto(kk,ideriv) ) * half * iotaksgn(kk,jj) !$OMP ATOMIC UPDATE @@ -683,10 +872,16 @@ subroutine tr00ab( lvol, mn, NN, Nt, Nz, iflag, ldiota ) ! construct straight-fi if( iflag.eq.-1) then ; call DGEMV('N',NN,NN,-one,dmatrix(1,1,-1),NN,dlambda(1,0),1,one,drhs(1,-1),1) ! BLAS version 21 Jul 19 endif case default - FATAL( tr00ab, .true., invalid jderiv ) + + if( .true. ) then + write(6,'("tr00ab : fatal : myid=",i3," ; .true. ; invalid jderiv ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "tr00ab : .true. : invalid jderiv ;" + endif + end select - lcpu = GETTIME ! record time taken in dgesvx; 09 Nov 17; + lcpu = MPI_WTIME() ! record time taken in dgesvx; 09 Nov 17; select case( Lsvdiota ) @@ -705,7 +900,7 @@ subroutine tr00ab( lvol, mn, NN, Nt, Nz, iflag, ldiota ) ! construct straight-fi NN, rcond, ferr, berr, work4(1:4*NN), iwork4(1:NN), idgesvx ) ; ldiota(innout, 0) = dlambda(1, 0) ! return intent out; 21 Apr 13; - ; dlambdaout(1:NN, lvol, innout) = dlambda(1:NN,0) + ; dlambdaout(1:NN, lvol, innout) = dlambda(1:NN,0) case( 1 ) ! Lsvdiota = 0; jderiv = 1; 02 Sep 14; @@ -726,20 +921,38 @@ subroutine tr00ab( lvol, mn, NN, Nt, Nz, iflag, ldiota ) ! construct straight-fi case default - FATAL( tr00ab, .true., invalid jderiv ) + + if( .true. ) then + write(6,'("tr00ab : fatal : myid=",i3," ; .true. ; invalid jderiv ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "tr00ab : .true. : invalid jderiv ;" + endif + end select ! end of select case jderiv; 02 Sep 14; - cput = GETTIME + cput = MPI_WTIME() select case( idgesvx ) !12345678901234567 case( 0 ) ; if( Wtr00ab ) write(ounit,1030) cput-cpus, myid, lvol, innout, id, "idgesvx", idgesvx, cput-lcpu, "solved Fourier ; ", dlambda(1,0) case( 1: ) ; write(ounit,1030) cput-cpus, myid, lvol, innout, id, "idgesvx", idgesvx, cput-lcpu, "singular ; " case( :-1 ) ; write(ounit,1030) cput-cpus, myid, lvol, innout, id, "idgesvx", idgesvx, cput-lcpu, "input error ; " - case default ; FATAL( tr00ab, .true., illegal ifail returned by dgesvx ) + case default ; + if( .true. ) then + write(6,'("tr00ab : fatal : myid=",i3," ; .true. ; illegal ifail returned by dgesvx ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "tr00ab : .true. : illegal ifail returned by dgesvx ;" + endif + end select - FATAL( tr00ab, idgesvx.ne.0, failed to construct straight-fieldline angle using dgesvx ) + + if( idgesvx.ne.0 ) then + write(6,'("tr00ab : fatal : myid=",i3," ; idgesvx.ne.0 ; failed to construct straight-fieldline angle using dgesvx ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "tr00ab : idgesvx.ne.0 : failed to construct straight-fieldline angle using dgesvx ;" + endif + case( 1 ) ! Lsvdiota = 1; use least-squares to invert linear equations that define the straight fieldline angle; 01 Jul 14; @@ -751,11 +964,19 @@ subroutine tr00ab( lvol, mn, NN, Nt, Nz, iflag, ldiota ) ! construct straight-fi Lwork = (63+8*nlvl)*NN+676 Liwork = max(1,11*NN+3*nlvl*NN) - SALLOCATE( work, (1:Lwork), zero ) + + allocate( work(1:Lwork), stat=astat ) + work(1:Lwork) = zero + if (allocated(iwork)) then - DALLOCATE(iwork) + + deallocate(iwork,stat=astat) + endif - SALLOCATE( iwork, (1:Liwork), zero ) + + allocate( iwork(1:Liwork), stat=astat ) + iwork(1:Liwork) = zero + select case( jderiv ) @@ -789,33 +1010,65 @@ subroutine tr00ab( lvol, mn, NN, Nt, Nz, iflag, ldiota ) ! construct straight-fi ldiota(innout,imupf) = dlambda(1,imupf) enddo else - FATAL( tr00ab, .true., invalid iflag ) + + if( .true. ) then + write(6,'("tr00ab : fatal : myid=",i3," ; .true. ; invalid iflag ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "tr00ab : .true. : invalid iflag ;" + endif + endif case default - FATAL( tr00ab, .true., invalid jderiv ) + + if( .true. ) then + write(6,'("tr00ab : fatal : myid=",i3," ; .true. ; invalid jderiv ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "tr00ab : .true. : invalid jderiv ;" + endif + end select ! end of select case( jderiv) ; 02 Sep 14; - DALLOCATE(work) - cput = GETTIME + deallocate(work,stat=astat) + + + cput = MPI_WTIME() select case( idgelsd ) !12345678901234567 case( 0 ) ; if( Wtr00ab) write(ounit,1030) cput-cpus, myid, lvol, innout, id, "idgelsd", idgelsd, cput-lcpu, "solved Fourier ; ", dlambda(1,0) case( :-1 ) ; write(ounit,1030) cput-cpus, myid, lvol, innout, id, "idgelsd", idgelsd, cput-lcpu, "input error ; " case( 1: ) ; write(ounit,1030) cput-cpus, myid, lvol, innout, id, "idgelsd", idgelsd, cput-lcpu, "QR failed ; " - case default ; FATAL( tr00ab, .true., illegal ifail returned by f04arf ) + case default ; + if( .true. ) then + write(6,'("tr00ab : fatal : myid=",i3," ; .true. ; illegal ifail returned by f04arf ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "tr00ab : .true. : illegal ifail returned by f04arf ;" + endif + end select - FATAL( tr00ab, idgelsd.ne.0, failed to construct straight-fieldline angle using dgelsd ) + + if( idgelsd.ne.0 ) then + write(6,'("tr00ab : fatal : myid=",i3," ; idgelsd.ne.0 ; failed to construct straight-fieldline angle using dgelsd ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "tr00ab : idgelsd.ne.0 : failed to construct straight-fieldline angle using dgelsd ;" + endif + dmatrix(1:NN,1:NN, 0) = omatrix(1:NN,1:NN) ! original "unperturbed" matrix; 30 Jan 13; case default - FATAL( tr00ab, .true., illegal Lsvdiota ) + + if( .true. ) then + write(6,'("tr00ab : fatal : myid=",i3," ; .true. ; illegal Lsvdiota ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "tr00ab : .true. : illegal Lsvdiota ;" + endif + end select ! end of select case( Lsvdiota ) ; 02 Sep 14; @@ -833,7 +1086,7 @@ subroutine tr00ab( lvol, mn, NN, Nt, Nz, iflag, ldiota ) ! construct straight-fi if( Lsparse.eq.3 ) then ! compare estimates for rotational-transform provided by Fourier method and real-space method; - cput = GETTIME + cput = MPI_WTIME() do ideriv = -1, 2 ; id = ideriv @@ -859,30 +1112,62 @@ subroutine tr00ab( lvol, mn, NN, Nt, Nz, iflag, ldiota ) ! construct straight-fi !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! if( Lsparse.eq.1 ) then - DALLOCATE(rmatrix) - DALLOCATE(rrhs) - DALLOCATE(rlambda) - DALLOCATE(wks1) - DALLOCATE(wks2) - DALLOCATE(AA) + + deallocate(rmatrix,stat=astat) + + + deallocate(rrhs,stat=astat) + + + deallocate(rlambda,stat=astat) + + + deallocate(wks1,stat=astat) + + + deallocate(wks2,stat=astat) + + + deallocate(AA,stat=astat) + endif if( Lsparse.ge.2 ) then - DALLOCATE(smatrix) - DALLOCATE(srhs) - DALLOCATE(irow) - DALLOCATE(jcol) - DALLOCATE(slambda) - DALLOCATE(istr) - DALLOCATE(iwork) + + deallocate(smatrix,stat=astat) + + + deallocate(srhs,stat=astat) + + + deallocate(irow,stat=astat) + + + deallocate(jcol,stat=astat) + + + deallocate(slambda,stat=astat) + + + deallocate(istr,stat=astat) + + + deallocate(iwork,stat=astat) + endif #endif if( Lsparse.eq.0 .or. Lsparse.eq.3 ) then - DALLOCATE( dmatrix ) - DALLOCATE( omatrix ) - DALLOCATE( FAA ) + + deallocate(dmatrix ,stat=astat) + + + deallocate(omatrix ,stat=astat) + + + deallocate(FAA ,stat=astat) + endif @@ -892,7 +1177,12 @@ subroutine tr00ab( lvol, mn, NN, Nt, Nz, iflag, ldiota ) ! construct straight-fi !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - RETURN(tr00ab) + +9999 continue + cput = MPI_WTIME() + Ttr00ab = Ttr00ab + ( cput-cpuo ) + return + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! diff --git a/src/volume.f90 b/src/volume.F90 similarity index 85% rename from src/volume.f90 rename to src/volume.F90 index 76581dd1..b3439f5b 100644 --- a/src/volume.f90 +++ b/src/volume.F90 @@ -32,7 +32,7 @@ !> subroutine volume( lvol, vflag ) - + use mod_kinds, only: wp => dp !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! use constants, only : zero, half, one, two, four, third, quart, pi2 @@ -56,26 +56,48 @@ subroutine volume( lvol, vflag ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS - INTEGER, intent(in) :: lvol +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + integer, intent(in) :: lvol - INTEGER :: vflag, Lcurvature + integer :: vflag, Lcurvature - INTEGER :: jvol, ii, jj, kk, mi, ni, mj, nj, mk, nk, innout + integer :: jvol, ii, jj, kk, mi, ni, mj, nj, mk, nk, innout - REAL :: vol(0:1), vint(1:Ntz) + real(wp) :: vol(0:1), vint(1:Ntz) - REAL :: Rei, Roi, Zei, Zoi, Rej, Roj, Zej, Zoj, Rek, Rok, Zek, Zok + real(wp) :: Rei, Roi, Zei, Zoi, Rej, Roj, Zej, Zoj, Rek, Rok, Zek, Zok - REAL :: AA, BB, CC, DD, lss + real(wp) :: AA, BB, CC, DD, lss + + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif - BEGIN(volume) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! #ifdef DEBUG - FATAL( volume, lvol.lt.1 .or. lvol.gt.Mvol, invalid volume ) ! 15 Jan 13; + + if( lvol.lt.1 .or. lvol.gt.Mvol ) then + write(6,'("volume : fatal : myid=",i3," ; lvol.lt.1 .or. lvol.gt.Mvol ; invalid volume ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "volume : lvol.lt.1 .or. lvol.gt.Mvol : invalid volume ;" + endif + ! 15 Jan 13; #endif !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -113,7 +135,13 @@ subroutine volume( lvol, vflag ) vol(innout) = iRbc(1,jvol) ! 20 Jun 14; #ifdef DEBUG - FATAL( volume, dBdX%L .and. dBdX%irz.eq.1, volume does not depend on Z ) + + if( dBdX%L .and. dBdX%irz.eq.1 ) then + write(6,'("volume : fatal : myid=",i3," ; dBdX%L .and. dBdX%irz.eq.1 ; volume does not depend on Z ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "volume : dBdX%L .and. dBdX%irz.eq.1 : volume does not depend on Z ;" + endif + #endif if( dBdX%L .and. dBdX%innout.eq.innout .and. dBdX%ii.eq.1 ) then ! compute derivative of volume; @@ -132,7 +160,13 @@ subroutine volume( lvol, vflag ) !> \f} #ifdef DEBUG - FATAL( volume, dBdX%L .and. dBdX%irz.eq.1, volume does not depend on Z for cylindrical geometry ) + + if( dBdX%L .and. dBdX%irz.eq.1 ) then + write(6,'("volume : fatal : myid=",i3," ; dBdX%L .and. dBdX%irz.eq.1 ; volume does not depend on Z for cylindrical geometry ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "volume : dBdX%L .and. dBdX%irz.eq.1 : volume does not depend on Z for cylindrical geometry ;" + endif + #endif if( YESstellsym ) then @@ -169,7 +203,13 @@ subroutine volume( lvol, vflag ) if( dBdX%issym.eq.0 ) then ! stellarator-symmetric harmonic; dV/dRei ; 13 Sep 13; dvolume = dvolume + iRbc(jj,jvol) * ( djkp(jj,ii) + djkm(jj,ii) + djkp(ii,jj) + djkm(ii,jj) ) else - FATAL( volume, .true., derivatives of volume under construction ) + + if( .true. ) then + write(6,'("volume : fatal : myid=",i3," ; .true. ; derivatives of volume under construction ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "volume : .true. : derivatives of volume under construction ;" + endif + dvolume = dvolume + iRbs(jj,jvol) * ( djkp(jj,ii) - djkm(jj,ii) + djkp(ii,jj) - djkm(ii,jj) ) ! needs to be checked; 02 Sep 14; endif endif @@ -246,7 +286,12 @@ subroutine volume( lvol, vflag ) Lcurvature = 1 lss = innout * two - one - WCALL( volume, coords, ( lvol, lss, Lcurvature, Ntz, mn ) ) + + cput = MPI_WTIME() + Tvolume = Tvolume + ( cput-cpuo ) + call coords( lvol, lss, Lcurvature, Ntz, mn ) + cpuo = MPI_WTIME() + vint = Rij(1:Ntz,0,0) * (Zij(1:Ntz,0,0)*Rij(1:Ntz,2,0) - Zij(1:Ntz,2,0)*Rij(1:Ntz,0,0)) vol(innout) = four * sum(vint) / float(Ntz) @@ -307,7 +352,7 @@ subroutine volume( lvol, vflag ) #ifdef DEBUG if( Wvolume ) then - cput = GETTIME + cput = MPI_WTIME() write(ounit,'("volume : ",f10.2," : myid=",i3," ; lvol=",i3," ; vol=",2f15.10," ;")') cput-cpus, myid, lvol, vol(0:1) endif #endif @@ -317,9 +362,21 @@ subroutine volume( lvol, vflag ) case( 2 ) ; vvolume(lvol) = ( vol(1) - vol(0) ) * pi2pi2nfpquart ; dvolume = dvolume * pi2pi2nfpquart case( 3 ) ; vvolume(lvol) = ( vol(1) - vol(0) ) * pi2pi2nfpquart * third ; dvolume = dvolume * pi2pi2nfpquart * third case( 4 ) ; vvolume(lvol) = one ; dvolume = zero ! this is under construction; 04 Dec 14; - FATAL( volume, abs(pscale).gt.vsmall,need to compute volume ) + + if( abs(pscale).gt.vsmall ) then + write(6,'("volume : fatal : myid=",i3," ; abs(pscale).gt.vsmall ; need to compute volume ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "volume : abs(pscale).gt.vsmall : need to compute volume ;" + endif + case default - FATAL( volume, .true., invalid Igeometry ) + + if( .true. ) then + write(6,'("volume : fatal : myid=",i3," ; .true. ; invalid Igeometry ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "volume : .true. : invalid Igeometry ;" + endif + end select if( dBdX%innout.eq.0 ) dvolume = - dvolume @@ -327,13 +384,19 @@ subroutine volume( lvol, vflag ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! if( Wvolume ) then - cput = GETTIME + cput = MPI_WTIME() write(ounit,'("volume : ",f10.2," : myid=",i3," ; Igeometry=",i2," ; vvolume(",i3," ) =",es23.15" ;")') cput-cpus, myid, Igeometry, lvol, vvolume(lvol) endif !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - FATAL( volume, vflag.eq.0 .and. vvolume(lvol).lt.small, volume cannot be zero or negative ) ! 15 Jan 13; + + if( vflag.eq.0 .and. vvolume(lvol).lt.small ) then + write(6,'("volume : fatal : myid=",i3," ; vflag.eq.0 .and. vvolume(lvol).lt.small ; volume cannot be zero or negative ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "volume : vflag.eq.0 .and. vvolume(lvol).lt.small : volume cannot be zero or negative ;" + endif + ! 15 Jan 13; if( vvolume(lvol).lt.small ) then write(ounit,'("volume : ", 10x ," : myid=",i3," ; lvol=",i3," ; vvolume=",es13.5," ; volume cannot be zero or negative ;")') myid, lvol, vvolume(lvol) @@ -345,7 +408,12 @@ subroutine volume( lvol, vflag ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - RETURN(volume) + +9999 continue + cput = MPI_WTIME() + Tvolume = Tvolume + ( cput-cpuo ) + return + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! diff --git a/src/wa00aa.f90 b/src/wa00aa.F90 similarity index 71% rename from src/wa00aa.f90 rename to src/wa00aa.F90 index d76edf0a..715c34e5 100644 --- a/src/wa00aa.f90 +++ b/src/wa00aa.F90 @@ -5,34 +5,34 @@ !> \brief ...todo... module laplaces - + use mod_kinds, only: wp => dp LOGICAL :: stage1 !< what is this ? LOGICAL :: exterior !< what is this ? LOGICAL :: dorm !< what is this ? - INTEGER :: Nintervals !< what is this ? - INTEGER :: Nsegments !< what is this ? - INTEGER :: IC !< what is this ? - INTEGER :: NP4 !< what is this ? - INTEGER :: NP1 !< what is this ? - INTEGER, allocatable :: icint(:) !< what is this ? - REAL :: originalalpha !< what is this ? - REAL, allocatable :: xpoly(:) !< what is this ? - REAL, allocatable :: ypoly(:) !< what is this ? - REAL, allocatable :: phi(:) !< what is this ? - REAL, allocatable :: phid(:) !< what is this ? - REAL, allocatable :: CC(:,:) !< what is this ? + integer :: Nintervals !< what is this ? + integer :: Nsegments !< what is this ? + integer :: IC !< what is this ? + integer :: NP4 !< what is this ? + integer :: NP1 !< what is this ? + integer, allocatable :: icint(:) !< what is this ? + real(wp) :: originalalpha !< what is this ? + real(wp), allocatable :: xpoly(:) !< what is this ? + real(wp), allocatable :: ypoly(:) !< what is this ? + real(wp), allocatable :: phi(:) !< what is this ? + real(wp), allocatable :: phid(:) !< what is this ? + real(wp), allocatable :: CC(:,:) !< what is this ? - INTEGER :: ilength !< what is this ? - REAL :: totallength !< what is this ? + integer :: ilength !< what is this ? + real(wp) :: totallength !< what is this ? - INTEGER :: niterations !< counter; eventually redundant; 24 Oct 12; + integer :: niterations !< counter; eventually redundant; 24 Oct 12; - INTEGER :: iangle !< angle ; eventually redundant; 24 Oct 12; + integer :: iangle !< angle ; eventually redundant; 24 Oct 12; - REAL :: Rmid !< used to define local polar coordinate; eventually redundant; 24 Oct 12; - REAL :: Zmid !< used to define local polar coordinate; eventually redundant; 24 Oct 12; + real(wp) :: Rmid !< used to define local polar coordinate; eventually redundant; 24 Oct 12; + real(wp) :: Zmid !< used to define local polar coordinate; eventually redundant; 24 Oct 12; - REAL :: alpha !< eventually redundant; 24 Oct 12; + real(wp) :: alpha !< eventually redundant; 24 Oct 12; end module laplaces @@ -47,7 +47,7 @@ end module laplaces !> !> subroutine wa00aa( iwa00aa ) - + use mod_kinds, only: wp => dp !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! use constants, only : zero, half, one, ten, pi2 @@ -71,40 +71,79 @@ subroutine wa00aa( iwa00aa ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS - INTEGER, parameter :: Nconstraints = 1, lengthwork = Nconstraints * ( 3*Nconstraints + 13 ) / 2 ! required for C05NBF; +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + integer, parameter :: Nconstraints = 1, lengthwork = Nconstraints * ( 3*Nconstraints + 13 ) / 2 ! required for C05NBF; - INTEGER :: iwa00aa, Lcurvature, Nwall, iwall, ii, ifail + integer :: iwa00aa, Lcurvature, Nwall, iwall, ii, ifail - REAL :: lss, lRZ(1:2), px, py, Rmin, Rmax, Zmin, Zmax, xtol - REAL :: rho(1:Nconstraints), fvec(1:Nconstraints), realwork(1:lengthwork) + real(wp) :: lss, lRZ(1:2), px, py, Rmin, Rmax, Zmin, Zmax, xtol + real(wp) :: rho(1:Nconstraints), fvec(1:Nconstraints), realwork(1:lengthwork) - REAL, allocatable :: RZwall(:,:) + real(wp), allocatable :: RZwall(:,:) !REAL :: phiwall external :: VacuumPhi - BEGIN(wa00aa) + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! #ifdef DEBUG - FATAL( wa00aa, myid.ne.0, error ) - FATAL( wa00aa, Ntor.gt.0, presently axisymmetry is assumed but this can easily be generalized ) + + if( myid.ne.0 ) then + write(6,'("wa00aa : fatal : myid=",i3," ; myid.ne.0 ; error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "wa00aa : myid.ne.0 : error ;" + endif + + + if( Ntor.gt.0 ) then + write(6,'("wa00aa : fatal : myid=",i3," ; Ntor.gt.0 ; presently axisymmetry is assumed but this can easily be generalized ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "wa00aa : Ntor.gt.0 : presently axisymmetry is assumed but this can easily be generalized ;" + endif + #endif !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! lss = one ; Lcurvature = 0 ; Lcoordinatesingularity = .false. - WCALL( wa00aa, co01aa, ( Nvol, lss, Lcurvature, Ntz, mn ) ) ! get plasma boundary, which serves as inner boundary; 10 Apr 13; + + cput = MPI_WTIME() + Twa00aa = Twa00aa + ( cput-cpuo ) + call co01aa( Nvol, lss, Lcurvature, Ntz, mn ) + cpuo = MPI_WTIME() + ! get plasma boundary, which serves as inner boundary; 10 Apr 13; !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! open(gunit, file="wall.dat", status='old', action='read', iostat=ios ) ! read polygon, which serves as outer boundary; 10 Apr 13; - FATAL( wa00aa, ios.ne.0, error opening wall.dat ) + + if( ios.ne.0 ) then + write(6,'("wa00aa : fatal : myid=",i3," ; ios.ne.0 ; error opening wall.dat ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "wa00aa : ios.ne.0 : error opening wall.dat ;" + endif + Nwall = 0 do @@ -114,13 +153,28 @@ subroutine wa00aa( iwa00aa ) enddo close(gunit) - SALLOCATE( RZwall, (1:2,1:Nwall), zero ) + + allocate( RZwall(1:2,1:Nwall), stat=astat ) + RZwall(1:2,1:Nwall) = zero + open(gunit,file="wall.dat",status='old',action='read',iostat=ios) - FATAL( wa00aa, ios.ne.0,error opening wall.dat ) + + if( ios.ne.0 ) then + write(6,'("wa00aa : fatal : myid=",i3," ; ios.ne.0 ; error opening wall.dat ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "wa00aa : ios.ne.0 : error opening wall.dat ;" + endif + read(gunit,*,iostat=ios) RZwall(1:2,1:Nwall) ! MUST GO ANTI-CLOCKWISE; LAST-POINT = FIRST POINT; - FATAL( wa00aa, ios.ne.0, error reading RZwall from wall.dat ) + + if( ios.ne.0 ) then + write(6,'("wa00aa : fatal : myid=",i3," ; ios.ne.0 ; error reading RZwall from wall.dat ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "wa00aa : ios.ne.0 : error reading RZwall from wall.dat ;" + endif + close(gunit) @@ -140,19 +194,37 @@ subroutine wa00aa( iwa00aa ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - SALLOCATE( xpoly, (1:Nsegments), zero ) - SALLOCATE( ypoly, (1:Nsegments), zero ) - SALLOCATE( phi , (1:Nintervals), zero ) ! must set to boundary value of phi; - SALLOCATE( phid, (1:Nintervals), zero ) ! can leave this as zero; + allocate( xpoly(1:Nsegments), stat=astat ) + xpoly(1:Nsegments) = zero + + + allocate( ypoly(1:Nsegments), stat=astat ) + ypoly(1:Nsegments) = zero + + + + allocate( phi (1:Nintervals), stat=astat ) + phi (1:Nintervals) = zero + ! must set to boundary value of phi; + + allocate( phid(1:Nintervals), stat=astat ) + phid(1:Nintervals) = zero + ! can leave this as zero; IC = Nintervals + 1 NP4 = Nintervals + 4 NP1 = Nintervals + 1 - SALLOCATE( CC , (1:IC,1:NP4), zero ) - SALLOCATE( ICINT, ( 1:NP1), zero ) + + allocate( CC (1:IC,1:NP4), stat=astat ) + CC (1:IC,1:NP4) = zero + + + allocate( ICINT( 1:NP1), stat=astat ) + ICINT( 1:NP1) = zero + iwall = 0 @@ -185,7 +257,7 @@ subroutine wa00aa( iwa00aa ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! if( Wwa00aa ) then - cput = GETTIME + cput = MPI_WTIME() do ii = 1, iwall ; write(ounit,'("wa00aa : ",f10.2," : Nsegments="i9" ; ii="i9" ; R="f15.9" ; Z="f15.9" ;")') cput-cpus, Nsegments, ii, xpoly(ii), ypoly(ii) enddo endif @@ -206,14 +278,20 @@ subroutine wa00aa( iwa00aa ) call D03EAF( stage1, exterior, dorm, Nintervals, px, py, xpoly, ypoly, Nsegments, phi, phid, alpha, CC, IC, NP4, ICINT, NP1, ifail ) - cput = GETTIME + cput = MPI_WTIME() ; ; write(ounit,'("wa00aa : ", 10x ," : ")') select case( ifail ) case( 0 ) ; write(ounit,'("wa00aa : ",f10.2," : prepared vacuum calculation; stage1="L2" ; ifail=",i3," ; success ; ")') cput-cpus, stage1, ifail case( 1 ) ; write(ounit,'("wa00aa : ",f10.2," : prepared vacuum calculation; stage1="L2" ; ifail=",i3," ; invalid tolerance ;")') cput-cpus, stage1, ifail case( 2 ) ; write(ounit,'("wa00aa : ",f10.2," : prepared vacuum calculation; stage1="L2" ; ifail=",i3," ; incorrect rank ; ")') cput-cpus, stage1, ifail case default - FATAL( wa00aa, .true., invalid ifail returned by D03EAF ) + + if( .true. ) then + write(6,'("wa00aa : fatal : myid=",i3," ; .true. ; invalid ifail returned by D03EAF ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "wa00aa : .true. : invalid ifail returned by D03EAF ;" + endif + end select stage1 = .false. ; originalalpha = alpha @@ -238,7 +316,7 @@ subroutine wa00aa( iwa00aa ) call C05NBF( VacuumPhi, Nconstraints, rho(1:Nconstraints), fvec(1:Nconstraints), xtol, realwork(1:lengthwork), lengthwork, ifail ) - cput = GETTIME + cput = MPI_WTIME() select case( ifail ) case( :-1 ) ; write(ounit,'("wa00aa : ",f10.2," : iangle="i6" ; ifail=",i3," ; outside domain ; FAIL ; ")') cput-cpus, iangle, ifail case( 0 ) ; if( Wwa00aa ) write(ounit,'("wa00aa : ",f10.2," : iangle="i6" ; ifail=",i3," ; success ; ")') cput-cpus, iangle, ifail @@ -247,7 +325,13 @@ subroutine wa00aa( iwa00aa ) case( 3 ) ; write(ounit,'("wa00aa : ",f10.2," : iangle="i6" ; ifail=",i3," ; xtol is too small ; FAIL ;")') cput-cpus, iangle, ifail case( 4 ) ; write(ounit,'("wa00aa : ",f10.2," : iangle="i6" ; ifail=",i3," ; bad progress ; FAIL ; ")') cput-cpus, iangle, ifail case default - FATAL( wa00aa, .true., invalid ifail returned by C05NBF ) + + if( .true. ) then + write(6,'("wa00aa : fatal : myid=",i3," ; .true. ; invalid ifail returned by C05NBF ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "wa00aa : .true. : invalid ifail returned by C05NBF ;" + endif + end select if( ifail.ne.0 ) exit @@ -267,7 +351,7 @@ subroutine wa00aa( iwa00aa ) iwa00aa = ifail - cput = GETTIME + cput = MPI_WTIME() write(ounit,'("wa00aa : ",f10.2," : constructed outer boundary; iwa00aa=",i3," ;")') cput-cpus, iwa00aa ! 24 Oct 12; if( ifail.ne.0 ) goto 9999 @@ -282,7 +366,12 @@ subroutine wa00aa( iwa00aa ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - RETURN(wa00aa) + +9999 continue + cput = MPI_WTIME() + Twa00aa = Twa00aa + ( cput-cpuo ) + return + !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -301,7 +390,7 @@ end subroutine wa00aa !> @param fvec !> @param iflag subroutine VacuumPhi( Nconstraints, rho, fvec, iflag ) - + use mod_kinds, only: wp => dp !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! use constants, only : zero, half, one, pi2 @@ -316,14 +405,22 @@ subroutine VacuumPhi( Nconstraints, rho, fvec, iflag ) !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS - INTEGER :: Nconstraints, iflag - REAL :: rho(1:Nconstraints), fvec(1:Nconstraints), angle, px, py +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + integer :: Nconstraints, iflag + real(wp) :: rho(1:Nconstraints), fvec(1:Nconstraints), angle, px, py !REAL :: phiwall - INTEGER :: ifail + integer :: ifail !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -341,14 +438,20 @@ subroutine VacuumPhi( Nconstraints, rho, fvec, iflag ) call D03EAF( stage1, exterior, dorm, Nintervals, px, py, xpoly, ypoly, Nsegments, phi, phid, alpha, CC, IC, NP4, ICINT, NP1, ifail ) - cput = GETTIME + cput = MPI_WTIME() select case( ifail ) case( 0 ) ; if( Wwa00aa ) write(ounit,'("wa00aa : ",f10.2," : stage1="L2" ; ifail=",i3," ; success ; ")') cput-cpus, stage1, ifail case( 1 ) ; write(ounit,'("wa00aa : ",f10.2," : stage1="L2" ; ifail=",i3," ; invalid tolerance ;")') cput-cpus, stage1, ifail case( 2 ) ; write(ounit,'("wa00aa : ",f10.2," : stage1="L2" ; ifail=",i3," ; incorrect rank ; ")') cput-cpus, stage1, ifail case default - FATAL( wa00aa, .true., invalid ifail returned by D03EAF ) + + if( .true. ) then + write(6,'("wa00aa : fatal : myid=",i3," ; .true. ; invalid ifail returned by D03EAF ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "wa00aa : .true. : invalid ifail returned by D03EAF ;" + endif + end select if( rho(1).lt.zero ) iflag = -1 ! could also check that R, Z are within domain; diff --git a/src/xspech.f90 b/src/xspech.F90 similarity index 77% rename from src/xspech.f90 rename to src/xspech.F90 index 902b6fbc..9d61fa09 100644 --- a/src/xspech.f90 +++ b/src/xspech.F90 @@ -20,7 +20,7 @@ end program spec_main !>
  • write the output file(s)
  • !> subroutine xspech - + use mod_kinds, only: wp => dp use numerical use allglobal, only: set_mpi_comm, myid, ncpu, cpus, version, MPI_COMM_SPEC, & wrtend, read_inputlists_from_file, check_inputs, broadcast_inputs, skip_write, & @@ -33,32 +33,48 @@ subroutine xspech hdfint, finish_outfile, write_grid use cputiming, only: Txspech - LOCALS - CHARACTER :: ldate*8, ltime*10, arg*100 +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + character :: ldate*8, ltime*10, arg*100 #ifdef DEBUG character(len=255) :: hostname integer :: iwait, pid, status - INTEGER, external :: getpid, hostnm + integer, external :: getpid, hostnm #endif call MPI_INIT( ierr ) - BEGIN(xspech) + + cpui = MPI_WTIME() + cpuo = cpui +#ifdef OPENMP + nthreads = omp_get_max_threads() +#else + nthreads = 1 +#endif + ! set default communicator to MPI_COMM_WORLD call set_mpi_comm(MPI_COMM_WORLD) ! set initial time - cpus = GETTIME + cpus = MPI_WTIME() cpuo = cpus ! explicitly enable writing of HDF5 output file skip_write = .false. ! print header: version of SPEC, compilation info, current date and time, machine precision - cput = GETTIME + cput = MPI_WTIME() if( myid.eq.0 ) then ! screen output header @@ -175,12 +191,14 @@ subroutine xspech call MPI_Barrier(MPI_COMM_SPEC, ierr) if (myid.eq.0) then - cput = GETTIME + cput = MPI_WTIME() write(ounit,'("xspech : ", 10x ," :")') write(ounit,'("xspech : ",f10.2," : myid=",i3," : time="f8.2"m = "f6.2"h = "f5.2"d ;")') cput-cpus, myid, (cput-cpus) / (/ 60, 60*60, 24*60*60 /) endif - MPIFINALIZE + + call MPI_FINALIZE(ierr) + stop @@ -200,21 +218,29 @@ end subroutine xspech !> !> subroutine read_command_args - + use mod_kinds, only: wp => dp use fileunits, only: ounit use inputlist, only: Wreadin use allglobal, only: cpus, myid, ext, MPI_COMM_SPEC - LOCALS + +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + LOGICAL :: Lspexist - INTEGER :: iargc, iarg, numargs, extlen, sppos + integer :: iargc, iarg, numargs, extlen, sppos - CHARACTER(len=100) :: arg + character(len=255) :: arg if (myid.eq.0) then - cput = GETTIME + cput = MPI_WTIME() ! first command-line argument is likely ext or ext.sp call getarg( 1, arg ) @@ -232,7 +258,13 @@ subroutine read_command_args write(ounit,'("rdcmdl : ", 10x ," : ")') write(ounit,'("rdcmdl : ", 10x ," : the input file ext.sp must contain the input namelists; see global.pdf for description ;")') endif - FATAL( rdcmdl, .true., the input file does not exist) ! if not, abort; + + if( .true. ) then + write(6,'("rdcmdl : fatal : myid=",i3," ; .true. ; the input file does not exist;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "rdcmdl : .true. : the input file does not exist ;" + endif + ! if not, abort; endif write(ounit,'("rdcmdl : ", 10x ," : ")') @@ -267,7 +299,7 @@ end subroutine read_command_args !> and within each Picard iteration, the fixed-boundary problem !> is solved (also iteratively). subroutine spec - + use mod_kinds, only: wp => dp use constants, only : zero, one, pi2, mu0 use numerical, only : vsmall, logtolerance @@ -313,25 +345,42 @@ subroutine spec !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS + +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + LOGICAL :: LComputeDerivatives, LContinueFreeboundaryIterations, exist, LupdateBn, LComputeAxis - INTEGER :: imn, lmn, lNfp, lim, lin, ii, ideriv, stat - INTEGER :: vvol, ifail, wflag, iflag, vflag - REAL :: rflag, lastcpu, bnserr, lRwc, lRws, lZwc, lZws, lItor, lGpol, lgBc, lgBs - REAL, allocatable :: position(:), gradient(:) - CHARACTER :: pack - INTEGER :: Lfindzero_old, mfreeits_old - REAL :: gBnbld_old - INTEGER :: lnPtrj, numTrajTotal + integer :: imn, lmn, lNfp, lim, lin, ii, ideriv, stat + integer :: vvol, ifail, wflag, iflag, vflag + real(wp) :: rflag, lastcpu, bnserr, lRwc, lRws, lZwc, lZws, lItor, lGpol, lgBc, lgBs + real(wp), allocatable :: position(:), gradient(:) + character :: pack + integer :: Lfindzero_old, mfreeits_old + real(wp) :: gBnbld_old + integer :: lnPtrj, numTrajTotal !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - cpuo = GETTIME + cpuo = MPI_WTIME() + + + if( NGdof.lt.0 ) then + write(6,'("xspech : fatal : myid=",i3," ; NGdof.lt.0 ; counting error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "xspech : NGdof.lt.0 : counting error ;" + endif + - FATAL( xspech, NGdof.lt.0, counting error ) - SALLOCATE( position, (0:NGdof), zero ) ! position ; NGdof = #geometrical degrees-of-freedom was computed in preset; + allocate( position(0:NGdof), stat=astat ) + position(0:NGdof) = zero + ! position ; NGdof = #geometrical degrees-of-freedom was computed in preset; !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -374,8 +423,13 @@ subroutine spec pack = 'P' LComputeAxis = .true. - WCALL( xspech, packxi, ( NGdof, position(0:NGdof), Mvol, mn, iRbc(1:mn,0:Mvol), iZbs(1:mn,0:Mvol), & - iRbs(1:mn,0:Mvol), iZbc(1:mn,0:Mvol), pack, .false., LComputeAxis ) ) + + cput = MPI_WTIME() + Txspech = Txspech + ( cput-cpuo ) + call packxi( NGdof, position(0:NGdof), Mvol, mn, iRbc(1:mn,0:Mvol), iZbs(1:mn,0:Mvol), & + iRbs(1:mn,0:Mvol), iZbc(1:mn,0:Mvol), pack, .false., LComputeAxis ) + cpuo = MPI_WTIME() + endif @@ -393,9 +447,24 @@ subroutine spec do vvol = 1, Mvol - LREGION(vvol) + + if( Igeometry.eq.1 .or. vvol.gt.1 ) then ; Lcoordinatesingularity = .false. + else ; Lcoordinatesingularity = .true. + endif + + if( vvol.le.Nvol ) then ; Lplasmaregion = .true. + else ; Lplasmaregion = .false. + endif + + Lvacuumregion = .not.Lplasmaregion + vflag = 0 - WCALL( xspech, volume, ( vvol, vflag ) ) ! compute volume; + + cput = MPI_WTIME() + Txspech = Txspech + ( cput-cpuo ) + call volume( vvol, vflag ) + cpuo = MPI_WTIME() + ! compute volume; if( Ladiabatic.eq.0 ) adiabatic(vvol) = pressure(vvol) * vvolume(vvol)**gamma ! initialize adiabatic constants using supplied pressure profile; @@ -405,7 +474,7 @@ subroutine spec endif if( Wxspech .and. myid.eq.0 ) then - cput = GETTIME + cput = MPI_WTIME() write(ounit,'("xspech : ",f10.2," : myid=",i3," ; adiabatic constants = "999es13.5)') cput-cpus, myid, adiabatic(1:Mvol) endif @@ -438,14 +507,24 @@ subroutine spec ! This is the call to do one fixed-boundary iteration (by a Newton method). ifail = 1 - WCALL( xspech, newton, ( NGdof, position(0:NGdof), ifail ) ) + + cput = MPI_WTIME() + Txspech = Txspech + ( cput-cpuo ) + call newton( NGdof, position(0:NGdof), ifail ) + cpuo = MPI_WTIME() + endif pack = 'U' ! unpack geometrical degrees of freedom; 13 Sep 13; LComputeAxis = .true. - WCALL( xspech, packxi, ( NGdof, position(0:NGdof), Mvol, mn, iRbc(1:mn,0:Mvol), iZbs(1:mn,0:Mvol), & - iRbs(1:mn,0:Mvol), iZbc(1:mn,0:Mvol), pack, .false., LComputeAxis ) ) + + cput = MPI_WTIME() + Txspech = Txspech + ( cput-cpuo ) + call packxi( NGdof, position(0:NGdof), Mvol, mn, iRbc(1:mn,0:Mvol), iZbs(1:mn,0:Mvol), & + iRbs(1:mn,0:Mvol), iZbc(1:mn,0:Mvol), pack, .false., LComputeAxis ) + cpuo = MPI_WTIME() + endif @@ -467,7 +546,13 @@ subroutine spec #ifdef DEBUG do vvol = 1, Mvol - FATAL( xspech, vvolume(vvol).lt.vsmall, error dividing adiabatic by volume ) + + if( vvolume(vvol).lt.vsmall ) then + write(6,'("xspech : fatal : myid=",i3," ; vvolume(vvol).lt.vsmall ; error dividing adiabatic by volume ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "xspech : vvolume(vvol).lt.vsmall : error dividing adiabatic by volume ;" + endif + enddo #endif @@ -475,36 +560,70 @@ subroutine spec !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - SALLOCATE( gradient, (0:NGdof), zero ) - lastcpu = GETTIME + allocate( gradient(0:NGdof), stat=astat ) + gradient(0:NGdof) = zero + + + lastcpu = MPI_WTIME() LComputeDerivatives = .false. LComputeAxis = .true. ! vvol = Mvol ; ideriv = 0 ; ii = 1 ! write(ounit,'("xspech : ", 10x ," : sum(Ate(",i3,",",i2,",",i2,")%s) =",99es23.15)') vvol, ideriv, ii, sum(Ate(vvol,ideriv,ii)%s(0:Lrad(vvol))) - WCALL( xspech, dforce, ( NGdof, position(0:NGdof), gradient(0:NGdof), LComputeDerivatives, LComputeAxis) ) ! (re-)calculate Beltrami fields; - DALLOCATE(gradient) + cput = MPI_WTIME() + Txspech = Txspech + ( cput-cpuo ) + call dforce( NGdof, position(0:NGdof), gradient(0:NGdof), LComputeDerivatives, LComputeAxis) + cpuo = MPI_WTIME() + ! (re-)calculate Beltrami fields; + + + deallocate(gradient,stat=astat) + #ifdef DEBUG do vvol = 1, Mvol-1 - ; FATAL( xspech, BBe(vvol).lt.logtolerance, underflow ) + ; + if( BBe(vvol).lt.logtolerance ) then + write(6,'("xspech : fatal : myid=",i3," ; BBe(vvol).lt.logtolerance ; underflow ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "xspech : BBe(vvol).lt.logtolerance : underflow ;" + endif + if( Igeometry.eq.3 ) then ! include spectral constraints; 04 Dec 14; - ;FATAL( xspech, IIo(vvol).lt.logtolerance, underflow ) + ; + if( IIo(vvol).lt.logtolerance ) then + write(6,'("xspech : fatal : myid=",i3," ; IIo(vvol).lt.logtolerance ; underflow ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "xspech : IIo(vvol).lt.logtolerance : underflow ;" + endif + endif if( NOTstellsym ) then - ;FATAL( xspech, BBo(vvol).lt.logtolerance, underflow ) + ; + if( BBo(vvol).lt.logtolerance ) then + write(6,'("xspech : fatal : myid=",i3," ; BBo(vvol).lt.logtolerance ; underflow ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "xspech : BBo(vvol).lt.logtolerance : underflow ;" + endif + if( Igeometry.eq.3 ) then ! include spectral constraints; 04 Dec 14; - FATAL( xspech, IIe(vvol).lt.logtolerance, underflow ) + + if( IIe(vvol).lt.logtolerance ) then + write(6,'("xspech : fatal : myid=",i3," ; IIe(vvol).lt.logtolerance ; underflow ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "xspech : IIe(vvol).lt.logtolerance : underflow ;" + endif + endif endif enddo #endif if( myid.eq.0 ) then - cput = GETTIME + cput = MPI_WTIME() write(ounit,1000) cput-cpus, nfreeboundaryiterations, ForceErr, cput-lastcpu, "|BB|e", alog10(BBe(1:min(Mvol-1,28))) if( Igeometry.ge.3 ) then ! include spectral constraints; 04 Dec 14; write(ounit,1001) "|II|o", alog10(IIo(1:min(Mvol-1,28))) @@ -525,12 +644,17 @@ subroutine spec if( Lcheck.eq.5 .or. LHevalues .or. LHevectors .or. LHmatrix .or. Lperturbed.eq.1 ) then ! check construction of Hessian; 01 Jul 14; if( myid.eq.0 ) then - cput = GETTIME + cput = MPI_WTIME() write(ounit,'("xspech : ", 10x ," : -------------------Stability Evaluations------------------ ")') write(ounit,'("xspech : ",f10.2," : myid=",i3," ; calling hessian; see .ext.hessian.myid ;")') cput-cpus, myid endif - WCALL( xspech, hesian, ( NGdof, position(0:NGdof), Mvol, mn, LGdof ) ) + + cput = MPI_WTIME() + Txspech = Txspech + ( cput-cpuo ) + call hesian( NGdof, position(0:NGdof), Mvol, mn, LGdof ) + cpuo = MPI_WTIME() + endif ! end of if( Lcheck.eq.5 ) ; 01 Jul 14; @@ -602,9 +726,14 @@ subroutine spec Mvol = Nvol + Lfreebound - lastcpu = GETTIME + lastcpu = MPI_WTIME() - WCALL( xspech, bnorml, ( mn, Ntz, efmn(1:mn), ofmn(1:mn) ) ) ! compute normal field etc. on computational boundary; + + cput = MPI_WTIME() + Txspech = Txspech + ( cput-cpuo ) + call bnorml( mn, Ntz, efmn(1:mn), ofmn(1:mn) ) + cpuo = MPI_WTIME() + ! compute normal field etc. on computational boundary; !FATAL( xspech, mn-1.le.0, divide by zero ) @@ -627,7 +756,13 @@ subroutine spec case( -2 ) ! mfreeits = -2 ; shall set plasma normal field at computational boundary ; 24 Nov 16; inquire( file=trim(ext)//".Vn", exist=exist ) - FATAL( xspech, .not.exist, ext.Vn does not exist : cannot set vacuum field) + + if( .not.exist ) then + write(6,'("xspech : fatal : myid=",i3," ; .not.exist ; ext.Vn does not exist : cannot set vacuum field;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "xspech : .not.exist : ext.Vn does not exist : cannot set vacuum field ;" + endif + if( myid.eq.0 ) then ! only myid = 0 reads in the vacuum field; 04 Jan 17; @@ -651,9 +786,13 @@ subroutine spec endif ! end of if( myid.eq.0 ) ; 07 Dec 16; - ;RlBCAST( iVns(1:mn), mn, 0 ) ! only required for ii > 1 ; + ; + call MPI_BCAST(iVns(1:mn),mn,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + ! only required for ii > 1 ; if( NOTstellsym ) then - RlBCAST( iVnc(1:mn), mn, 0 ) + + call MPI_BCAST(iVnc(1:mn),mn,MPI_DOUBLE_PRECISION,0 ,MPI_COMM_SPEC,ierr) + endif ; iBns(2:mn) = - iBns(2:mn) - iVns(2:mn) ! updated vacuum field ; 24 Nov 16; @@ -679,7 +818,13 @@ subroutine spec case( 0 ) ! mfreeits = 0 ; 09 Mar 17; - FATAL( xspech, .true., illegal mfreeits logic ) + + if( .true. ) then + write(6,'("xspech : fatal : myid=",i3," ; .true. ; illegal mfreeits logic ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "xspech : .true. : illegal mfreeits logic ;" + endif + case( 1: ) ! mfreeits > 0 ; 09 Mar 17; @@ -700,7 +845,13 @@ subroutine spec case default ! Lzerovac; 09 Mar 17; - FATAL( xspech, .true., invalid Lzerovac ) + + if( .true. ) then + write(6,'("xspech : fatal : myid=",i3," ; .true. ; invalid Lzerovac ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "xspech : .true. : invalid Lzerovac ;" + endif + end select ! end select case( Lzerovac ) ; 27 Feb 17; @@ -712,7 +863,7 @@ subroutine spec endif ! end of if( bnserr.gt.gBntol ) ; 24 Nov 16; - cput = GETTIME + cput = MPI_WTIME() if( myid.eq.0 ) then ; write(ounit,1003) ; ; write(ounit,1004) cput-cpus, nfreeboundaryiterations, mfreeits, gBntol, bnserr, cput-lastcpu @@ -732,10 +883,20 @@ subroutine spec !>
  • The vector potential is written to file using ra00aa() .
  • !> - WCALL( xspech, ra00aa, ('W') ) ! this writes vector potential to file; + + cput = MPI_WTIME() + Txspech = Txspech + ( cput-cpuo ) + call ra00aa('W') + cpuo = MPI_WTIME() + ! this writes vector potential to file; if( myid.eq.0 ) then ! write restart file; note that this is inside free-boundary iteration loop; 11 Aug 14; - WCALL( xspech, wrtend ) ! write restart file; save initial input; + + cput = MPI_WTIME() + Txspech = Txspech + ( cput-cpuo ) + call wrtend + cpuo = MPI_WTIME() + ! write restart file; save initial input; endif !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! @@ -760,7 +921,7 @@ end subroutine spec !>
  • pp00aa() is called to construct the Poincare plot by field-line following.
  • !> subroutine final_diagnostics - + use mod_kinds, only: wp => dp use inputlist, only: nPtrj, nPpts, Igeometry, Lcheck, Nvol, odetol, & Isurf, Ivolume, mu, Wmacros, Ltransform use fileunits, only: ounit @@ -775,12 +936,20 @@ subroutine final_diagnostics dlambdaout, diotadxup - LOCALS + +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + integer :: iocons, llmodnp, vvol, iflag, cpu_id real :: sumI - REAL, allocatable :: Bt00(:,:,:) - REAL :: work(0:1,-1:2) + real(wp), allocatable :: Bt00(:,:,:) + real(wp) :: work(0:1,-1:2) @@ -840,10 +1009,26 @@ subroutine final_diagnostics if (IsMyVolumeValue.eq.0) then cycle elseif (IsMyVolumeValue.eq.-1) then - FATAL( xspech, .true., Unassociated volume ) + + if( .true. ) then + write(6,'("xspech : fatal : myid=",i3," ; .true. ; Unassociated volume ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "xspech : .true. : Unassociated volume ;" + endif + endif - LREGION( vvol ) + + if( Igeometry.eq.1 .or. vvol .gt.1 ) then ; Lcoordinatesingularity = .false. + else ; Lcoordinatesingularity = .true. + endif + + if( vvol .le.Nvol ) then ; Lplasmaregion = .true. + else ; Lplasmaregion = .false. + endif + + Lvacuumregion = .not.Lplasmaregion + call tr00ab( vvol, mn, lmns, Nt, Nz, iflag, diotadxup(0:1,-1:2, vvol) ) ! stores lambda in a global variable. enddo @@ -851,8 +1036,12 @@ subroutine final_diagnostics ! Broadcast do vvol = 1, Mvol call WhichCpuID( vvol, cpu_id ) - RlBCAST( diotadxup(0:1,-1:2,vvol), 8, cpu_id ) - RlBCAST( dlambdaout(1:lmns, vvol, 0:1), 2*lmns, cpu_id ) + + call MPI_BCAST(diotadxup(0:1,-1:2,vvol),8,MPI_DOUBLE_PRECISION,cpu_id ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(dlambdaout(1:lmns, vvol, 0:1),2*lmns,MPI_DOUBLE_PRECISION,cpu_id ,MPI_COMM_SPEC,ierr) + enddo endif @@ -861,11 +1050,24 @@ subroutine final_diagnostics !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! ! Computes the surface current at each interface for output - SALLOCATE( Bt00, (1:Mvol, 0:1, -1:2) , zero) + + allocate( Bt00(1:Mvol, 0:1, -1:2) , stat=astat ) + Bt00(1:Mvol, 0:1, -1:2) = zero + do vvol = 1, Mvol - LREGION(vvol) + + if( Igeometry.eq.1 .or. vvol.gt.1 ) then ; Lcoordinatesingularity = .false. + else ; Lcoordinatesingularity = .true. + endif + + if( vvol.le.Nvol ) then ; Lplasmaregion = .true. + else ; Lplasmaregion = .false. + endif + + Lvacuumregion = .not.Lplasmaregion + do iocons = 0, 1 if( ( Lcoordinatesingularity .and. iocons.eq.0 ) .or. ( Lvacuumregion .and. iocons.eq.1 ) ) cycle @@ -885,7 +1087,9 @@ subroutine final_diagnostics IPDt(vvol) = pi2 * (Bt00(vvol+1, 0, 0) - Bt00(vvol, 1, 0)) enddo - DALLOCATE( Bt00 ) + + deallocate(Bt00 ,stat=astat) + ! Evaluate volume current sumI = 0 @@ -896,7 +1100,7 @@ subroutine final_diagnostics ! screen info about diagnostics; 20 Jun 14; if (myid.eq.0) then - cput = GETTIME + cput = MPI_WTIME() if( nPpts.gt.0 ) then write(ounit,'("xspech : ", 10x ," :")') @@ -912,11 +1116,21 @@ subroutine final_diagnostics do vvol = 1, Mvol - LREGION(vvol) + + if( Igeometry.eq.1 .or. vvol.gt.1 ) then ; Lcoordinatesingularity = .false. + else ; Lcoordinatesingularity = .true. + endif + + if( vvol.le.Nvol ) then ; Lplasmaregion = .true. + else ; Lplasmaregion = .false. + endif + + Lvacuumregion = .not.Lplasmaregion + if( myid.eq.modulo(vvol-1,ncpu) .and. myid.lt.Mvol) then ! the following is in parallel; 20 Jun 14; - if( .not.ImagneticOK(vvol) ) then ; cput = GETTIME ; write(ounit,1002) cput-cpus ; write(ounit,1002) cput-cpus, myid, vvol, ImagneticOK(vvol) ; cycle + if( .not.ImagneticOK(vvol) ) then ; cput = MPI_WTIME() ; write(ounit,1002) cput-cpus ; write(ounit,1002) cput-cpus, myid, vvol, ImagneticOK(vvol) ; cycle endif ! No need for sc00aa anymore - this is done in lbpol @@ -940,18 +1154,52 @@ subroutine final_diagnostics do vvol = 1, Mvol ; llmodnp = modulo(vvol-1,ncpu) #ifdef DEBUG - FATAL( xspech, .not.allocated(Btemn), error ) - FATAL( xspech, .not.allocated(Bzemn), error ) - FATAL( xspech, .not.allocated(Btomn), error ) - FATAL( xspech, .not.allocated(Bzomn), error ) + + if( .not.allocated(Btemn) ) then + write(6,'("xspech : fatal : myid=",i3," ; .not.allocated(Btemn) ; error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "xspech : .not.allocated(Btemn) : error ;" + endif + + + if( .not.allocated(Bzemn) ) then + write(6,'("xspech : fatal : myid=",i3," ; .not.allocated(Bzemn) ; error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "xspech : .not.allocated(Bzemn) : error ;" + endif + + + if( .not.allocated(Btomn) ) then + write(6,'("xspech : fatal : myid=",i3," ; .not.allocated(Btomn) ; error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "xspech : .not.allocated(Btomn) : error ;" + endif + + + if( .not.allocated(Bzomn) ) then + write(6,'("xspech : fatal : myid=",i3," ; .not.allocated(Bzomn) ; error ;")') myid + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "xspech : .not.allocated(Bzomn) : error ;" + endif + #endif - RlBCAST( Btemn(1:mn,0:1,vvol), mn*2, llmodnp ) ! this is computed in lbpol; 07 Dec 16; - RlBCAST( Bzemn(1:mn,0:1,vvol), mn*2, llmodnp ) - RlBCAST( Btomn(1:mn,0:1,vvol), mn*2, llmodnp ) - RlBCAST( Bzomn(1:mn,0:1,vvol), mn*2, llmodnp ) - RlBCAST( beltramierror(vvol,1:9), 9, llmodnp ) ! this is computed in jo00aa; 21 Aug 18; + call MPI_BCAST(Btemn(1:mn,0:1,vvol),mn*2,MPI_DOUBLE_PRECISION,llmodnp ,MPI_COMM_SPEC,ierr) + ! this is computed in lbpol; 07 Dec 16; + + call MPI_BCAST(Bzemn(1:mn,0:1,vvol),mn*2,MPI_DOUBLE_PRECISION,llmodnp ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(Btomn(1:mn,0:1,vvol),mn*2,MPI_DOUBLE_PRECISION,llmodnp ,MPI_COMM_SPEC,ierr) + + + call MPI_BCAST(Bzomn(1:mn,0:1,vvol),mn*2,MPI_DOUBLE_PRECISION,llmodnp ,MPI_COMM_SPEC,ierr) + + + + call MPI_BCAST(beltramierror(vvol,1:9),9,MPI_DOUBLE_PRECISION,llmodnp ,MPI_COMM_SPEC,ierr) + ! this is computed in jo00aa; 21 Aug 18; enddo ! end of do vvol = 1, Mvol; 01 Jul 14; @@ -960,7 +1208,7 @@ end subroutine final_diagnostics !> \brief Closes output files, writes screen summary. !> subroutine ending - + use mod_kinds, only: wp => dp use constants, only : zero use fileunits, only : ounit @@ -972,24 +1220,30 @@ subroutine ending use allglobal, only : myid, cpus, mn, MPI_COMM_SPEC, ext !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - LOCALS - REAL :: Ttotal, dcpu, ecpu - CHARACTER :: date*8, time*10 +#ifdef OPENMP + USE OMP_LIB +#endif + use mpi + implicit none + integer :: ierr, astat, ios, nthreads, ithread + real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + + + real(wp) :: Ttotal, dcpu, ecpu + character :: date*8, time*10 !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - cpui = GETTIME ; cpuo = cpui ! see macro expansion for begin; 11 Aug 14; + cpui = MPI_WTIME() ; cpuo = cpui ! see macro expansion for begin; 11 Aug 14; #ifdef DEBUG if( Wxspech ) write(ounit,'("ending : ",f10.2," : myid=",i3," ; start ;")') cpui-cpus, myid #endif - cput = GETTIME - -! SUMTIME ! this is expanded by Makefile, and then again by macros; do not remove; + cput = MPI_WTIME() - cput = GETTIME ; dcpu = cput-cpus + cput = MPI_WTIME() ; dcpu = cput-cpus if( Ltiming .and. myid.eq.0 ) then From dc3adfcd7d4e09d94bd85a37ebab636fc88908af Mon Sep 17 00:00:00 2001 From: Jonathan Schilling Date: Fri, 1 Jul 2022 20:06:26 +0200 Subject: [PATCH 03/15] fix compile errors: converges again --- Makefile | 57 ++++++++++++++++++++++++++++++++++++++++++++++---- SPECfile | 13 ++++++++++-- src/dfp200.F90 | 2 +- src/global.F90 | 2 +- 4 files changed, 66 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index f38f7957..0a1047ed 100644 --- a/Makefile +++ b/Makefile @@ -12,6 +12,9 @@ include SPECfile ROBJS=$(SPECFILES:=_r.o) DOBJS=$(SPECFILES:=_d.o) +ROBJS_IO=$(IOFILES:=_r.o) +DOBJS_IO=$(IOFILES:=_d.o) + ############################################################################################################################################################### date:=$(shell date) @@ -39,19 +42,65 @@ dspec: $(addsuffix _d.o,$(ALLFILES)) Makefile ############################################################################################################################################################### -$(ROBJS): %_r.o: src/%.F90 +mod_kinds_r.o : %_r.o: src/mod_kinds.F90 + $(FC) $(FLAGS) $(CFLAGS) $(RFLAGS) -o mod_kinds_r.o -c src/mod_kinds.F90 $(LIBS) + @wc -l -L -w src/mod_kinds.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' + @echo '' + +mod_kinds_d.o : %_d.o: src/mod_kinds.F90 + $(FC) $(FLAGS) $(CFLAGS) $(DFLAGS) -o mod_kinds_d.o -c src/mod_kinds.F90 $(LIBS) + @wc -l -L -w src/mod_kinds.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' + @echo '' + +inputlist_r.o: %_r.o: mod_kinds_r.o src/inputlist.F90 + $(FC) $(FLAGS) $(CFLAGS) $(RFLAGS) -o inputlist_r.o -c src/inputlist.F90 $(LIBS) + @wc -l -L -w src/inputlist.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' + @echo '' + +inputlist_d.o: %_d.o: mod_kinds_d.o src/inputlist.F90 + $(FC) $(FLAGS) $(CFLAGS) $(DFLAGS) -o inputlist_d.o -c src/inputlist.F90 $(LIBS) + @wc -l -L -w src/inputlist.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' + @echo '' + +############################################################################################################################################################### +# global needs special handling: expansion of CPUVARIABLE, BSCREENLIST and WSCREENLIST using awk (not anymore !!!) + +global_r.o: %_r.o: inputlist_r.o src/global.F90 + $(FC) $(FLAGS) $(CFLAGS) $(RFLAGS) -o global_r.o -c src/global.F90 $(LIBS) + @wc -l -L -w src/global.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' + @echo '' + +global_d.o: %_d.o: inputlist_d.o src/global.F90 + $(FC) $(FLAGS) $(CFLAGS) $(DFLAGS) -o global_d.o -c src/global.F90 $(LIBS) + @wc -l -L -w src/global.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' + @echo '' + +############################################################################################################################################################### + +$(ROBJS_IO): %_r.o: src/%.F90 $(addsuffix _r.o,$(BASEFILES)) + $(FC) $(FLAGS) $(CFLAGS) $(RFLAGS) -o $*_r.o -c src/$*.F90 $(LIBS) + @wc -l -L -w src/$*.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' + @echo '' + +$(DOBJS_IO): %_d.o: src/%.F90 $(addsuffix _d.o,$(BASEFILES)) + $(FC) $(FLAGS) $(CFLAGS) $(DFLAGS) -o $*_d.o -c src/$*.F90 $(LIBS) + @wc -l -L -w src/$*.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' + @echo '' + + +$(ROBJS): %_r.o: src/%.F90 $(addsuffix _r.o,$(BASEFILES)) $(addsuffix _r.o,$(IOFILES)) $(FC) $(FLAGS) $(CFLAGS) $(RFLAGS) -o $*_r.o -c src/$*.F90 $(LIBS) @wc -l -L -w src/$*.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' @echo '' -$(DOBJS): %_d.o: src/%.F90 +$(DOBJS): %_d.o: src/%.F90 $(addsuffix _d.o,$(BASEFILES)) $(addsuffix _d.o,$(IOFILES)) $(FC) $(FLAGS) $(CFLAGS) $(DFLAGS) -o $*_d.o -c src/$*.F90 $(LIBS) @wc -l -L -w src/$*.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' @echo '' ############################################################################################################################################################### -xspech_r.o: src/xspech.F90 $(addsuffix _r.o,$(SPECFILES)) $(addsuffix _r.o,$(sfiles)) +xspech_r.o: src/xspech.F90 global_r.o sphdf5_r.o $(addsuffix _r.o,$(files)) @awk -v date='$(date)' -v pwd='$(PWD)' -v fc='$(FC)' -v flags='$(FLAGS) $(CFLAGS) $(RFLAGS)' -v allfiles='$(ALLFILES)' \ 'BEGIN{nfiles=split(allfiles,files," ")} \ {if($$2=="COMPILATION") {print " write(ounit,*)\" : compiled : date = "date" ; \"" ; \ @@ -63,7 +112,7 @@ xspech_r.o: src/xspech.F90 $(addsuffix _r.o,$(SPECFILES)) $(addsuffix _r.o,$(sfi @wc -l -L -w xspech_m.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' @echo '' -xspech_d.o: src/xspech.F90 $(addsuffix _r.o,$(SPECFILES)) $(addsuffix _r.o,$(sfiles)) +xspech_d.o: src/xspech.F90 global_d.o sphdf5_d.o $(addsuffix _d.o,$(files)) @awk -v date='$(date)' -v pwd='$(PWD)' -v fc='$(FC)' -v flags='$(FLAGS) $(CFLAGS) $(DFLAGS)' -v allfiles='$(ALLFILES)' \ 'BEGIN{nfiles=split(allfiles,files," ")} \ {if($$2=="COMPILATION") {print " write(ounit,*)\" : compiled : date = "date" ; \"" ; \ diff --git a/SPECfile b/SPECfile index e52d39df..24dbb279 100644 --- a/SPECfile +++ b/SPECfile @@ -10,7 +10,13 @@ ############################################################################################################################################################### -afiles=mod_kinds inputlist global sphdf5 preset manual rzaxis packxi volume coords basefn memory +# basis of SPEC: input variables, global workspace, HDF5 output file writing +# these are split off since they require special treatment (needed by all others and/or special macros) +BASEFILES=inputlist global +IOFILES=sphdf5 + +# (most of) physics part of SPEC +afiles=preset manual rzaxis packxi volume coords basefn memory bfiles=metrix ma00aa matrix spsmat spsint mp00ac ma02aa packab tr00ab curent df00ab lforce intghs mtrxhs lbpol cfiles=brcast dfp100 dfp200 dforce newton dfiles=casing bnorml @@ -26,8 +32,11 @@ sfiles=dcuhre minpack iqpack rksuite i1mach d1mach ilut iters # all of SPEC except BASEFILES SPECFILES=$(afiles) $(bfiles) $(cfiles) $(dfiles) $(efiles) $(ffiles) +# all of "our" (vs. contributed) files needed for the "core" of SPEC +ALLSPEC=$(BASEFILES) $(IOFILES) $(SPECFILES) + # *ALL* files needed for the main SPEC executable -ALLFILES=$(sfiles) $(SPECFILES) xspech +ALLFILES=$(sfiles) $(ALLSPEC) xspech mod_kinds ############################################################################################################################################################### diff --git a/src/dfp200.F90 b/src/dfp200.F90 index 15e05e80..2a7dd719 100644 --- a/src/dfp200.F90 +++ b/src/dfp200.F90 @@ -1614,7 +1614,7 @@ subroutine evaluate_dmupfdx(innout, idof, ii, issym, irz) Tdfp200 = Tdfp200 + ( cput-cpuo ) call intghs_workspace_destroy() cpuo = MPI_WTIME() -) + endif do isymdiff = -2, 2 ! symmetric fourth-order, finite-difference used to approximate derivatives; diff --git a/src/global.F90 b/src/global.F90 index ef53fd4b..8013f862 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -246,7 +246,7 @@ module allglobal !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! - character :: ext ! extension of input filename, i.e., "G3V01L1Fi.001" for an input file G3V01L1Fi.001.sp + character(len=255) :: ext ! extension of input filename, i.e., "G3V01L1Fi.001" for an input file G3V01L1Fi.001.sp real(wp) :: ForceErr !< total force-imbalance real(wp) :: Energy !< MHD energy From 022d05c90b76489a6771ac6f88f92f0d15c74cba Mon Sep 17 00:00:00 2001 From: Jonathan Schilling Date: Fri, 1 Jul 2022 20:20:02 +0200 Subject: [PATCH 04/15] include .F90 files in Doxygen --- Doxyfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Doxyfile b/Doxyfile index bc4d1c21..32b87fcc 100644 --- a/Doxyfile +++ b/Doxyfile @@ -919,6 +919,7 @@ FILE_PATTERNS = *.c \ *.py \ *.pyw \ *.f90 \ + *.F90 \ *.f95 \ *.f03 \ *.f08 \ From 16a9fc46dd93aa92f8232e20b1194754261c5625 Mon Sep 17 00:00:00 2001 From: Jonathan Schilling Date: Sun, 3 Jul 2022 16:46:47 +0200 Subject: [PATCH 05/15] started to port macro-based HDF5 utility methods into sphdf5 --- Utilities/python_wrapper/libspec.a | Bin 0 -> 3081800 bytes Utilities/python_wrapper/spec.py | 15046 +++++++++++++++++++++++++++ src/h5utils.f90_tmp | 34 - src/sphdf5.F90 | 104 +- 4 files changed, 15130 insertions(+), 54 deletions(-) create mode 100644 Utilities/python_wrapper/libspec.a create mode 100644 Utilities/python_wrapper/spec.py diff --git a/Utilities/python_wrapper/libspec.a b/Utilities/python_wrapper/libspec.a new file mode 100644 index 0000000000000000000000000000000000000000..54353bfb8179f97740b545f8f1c487646c8d4ede GIT binary patch literal 3081800 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ℜ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 JXhb!CiYMNe=t-5|YykI$3+ZOgP)~5aAWX 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 xG_v8;&_sE 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 z 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

    w6cJGXXeVXt8Ba&dFR{AG)pvgh)$OGc!& zplKw>1x;Bby=Xzp$jDcWBy7sUuqjJ6o3bR*l!f1-ky==^WP~Kh{7CGIELhXhEOaBW zC0C3fThfHud+EZ3O>;*CUEF->qHippf9c5dmNZ?F(i{>wxf6?;VMa!4Z zughVzt*x)S=yK*^(GqZJShT!Jm@IBw+92Uq)Gb@G=n{x`)~u@PxsCIep&HjU_%gq& zZqdc{Bjs&ebOQdCENrZw->@*J7Hy`vscvpcQA~e%)BM^?AkHOo7tUYQU`#`*EknLV zS#-VVo6YkVjF4tAtHkgOH7o<2)_R)hg1Y5R%a$VlEQf_lmo+V$zhth;!}7UxiyNCV zf|{48z`6y)qd@qk=H+$E=PtT<$vEYs|&A;gHS-I>n7t}3OMWS`OSlQ-SrU{k~;auG> zupi`<1ZeT9YF^sN?d%X5Q;+w{9E+@|Mv)}(9Ga~x`LoBm`Ax9OK# zxJ|#x!fpDyE!?Jm!oqF(PqUzKWR@4leFnGb7h1T@pX0b}^tV~KP5&D`-(;|j@9@D- z)>C8BbB=E6d6f^o&K6nA%s^gI<|8YL}bRYa8AN)!m{Kr1{ zoj&+qeel2e;9q9p>3nfX&6LYj3+Gtf;NR5valp7dWbhUXKg`0{S~&NeHuN`IIG5fG zew&5!#W90-SvcIjr0|1Txp7dQ!|^lpB^J&(gTYU>@PD)L(=D7!M25b`!jG`PQ zVmKIV>)}rp9zmFq=Mf9H^YyHS+xZGiL}VP9`O4Ec)3x&z z^1*+iarQ3<;AiCdfnEnD|3fUi!@?QW(Er-P`M$8hZ`C;EvBxb(mH@y({*&-C^b<8s zdV5@PgAe^p7QH?GIdn1@;K<}ZPUGZnk3){JaN7=_Zs9cTM$Vu4@V~{Pr|C8HpH>gN zM#xj5amqtg8TuLvXBG{9wT0W|o3L<-VCbLIIQ76wgMVbv+x_756G4Q7_2EGL4E;Y3Q%lIMbbC;Ro;rM`pRS`{0Mlo7*GlZ}7p7JSjW>n|<&vsRxcD=V(@tueZGbNr-j>m?y~rdvFPu% zaAw``@3U~5{#R2$goEei;%Pjl|i_eTR()4z_ z`)o9gf6AhtVBz*W=mQHcwCH!1;|2%w%b~H6{}*QxRk%GbST-$pEP6X%&->8lOi%N-^SeOfnf#Yq z^tK+J^`S32OYtWkyWjb~h1>OfhY!BT!fm^Ejg#hY^Lg6BZT$~wocgrwb2ygfW0&LM z8YjJNx6iWZOA%(u*R^n)&&3uW+so0e`%cZ+v)DG zaGC_e|3!o^`M#lX_B(kN{nyUM4UWuuwba7xbZ@h8TR%HB zp2`0VH#`4o3%B{VYn=I_sWbUHvMSBTPItP-Gt>ROML)^n^Pq*>=@!h)&i@M<&*cA8 zi++;D|F;%iVBv?%%FchX#xwahTl6;nYb@O6f0u>Z`q|~f|Cs8uJU0JQ3%B`SX5lvf z>olGz|4SCV&HqCSxA~uPPFfzD|2Z1Zx&;M$gzb((T8qdtH8&A{Q@~pIQyMOUCPI*eKbiZ;znvYFC-@?CS z(bsF7d_H60ms|9<9&Yf#Z}GwJ_rYKE!9Vc9KQ$+vFI%4Deekn=@QZ!$HXr<_KKLJe z@W*}dw|(&33)A_s%j;l`XO{0nG)Opj%E!;tw?cwA__$FI8RR}9{}q0azUHae!Vk6Z zh`wh1X^#l5b6?!smB7uTsQ z{$Kr%AU0KXUU%hgrmk?I`6iRo}m$ivj5V{uJ9 zm!NfAl##9p(#2|SW$s0unekh7{M7qmIz}WFQ(c^dQ?~R?{L&2iNXGqS+-J*w|5`=p zXnN-V0Q@rZ9|gwrb@juQI=Vig{N&I0hv|6c)KaUijGhf{(l=*zTiN2T)$udS+uWNo z$r!)HB%se7I{v3JaMJQH=LYLq0`$MzbbK4*wTWl&6}T9UU#9*#b^J`ZOukM0b+{nU z%=iO3KHmqnkIeXM5SXp}i@&F0ZPbxj{PSxf!$xyvRkJwC#tMERSCjY04A< zPdKr(q*Siv9eh=#JAG6j%`uR3`iSyn@~t&#A);~_#XAs(%HHOBWAns^&Uap;Q-}eE zC$`H8d;WUUoFBcnFVRyDKijK^PzV)pl31Rc5>5tB#s~Z3%65d3r=u&;pSxGU?V#gf z(~~%SOR>4a=^gIo;ci+KPLr{DBGNF#+}>M=uvw+rYY5)Gc@cq|@2CmG{*mjEM@<8V znTn=3gQg=*1JB@!#t|AY*eHS0f2QR67RV+$i7D7O<(rZ!d_#T{u7_@yT}mDAL~)X+ zH&t=HuVCMh0+;(hgBM)v89wxbSV8BCt~V22J@L);I&rw}V!tb1Zxkg|o9qzk0tZdG zTZIbcW=%tl54%ZMCbpKh{W(yvYF$w&lqrn3b*4_QQ*(jFi$#`n zVy$wi#EMANVPX}hxiuPYU1@F+a@(Eewn}k}5-yRbhw;)8_*|6u1(K^?;czbUUkxp9 zC~Dg(w zuzH;*)TsNn%eLoIZRwvB?IbKgqj;Go5#gQRgBBrQA%fsik}V1TWmo+P=9|tWW3|tO z+P{jirqiajf5hIE4sSurD3m2kR&*=??;n8I^A;%#Nk)(o$wHg9$^LvRi%KM6EsMZI zPU0CxD3*xa1ZXSwii;2v<rD6DxVjJ1WO%52Ph>7j(GVQwgw%lZiwClU@*F?*VSVECR4$Gkkz&g!fsA zbm}nSfw0|HSeFiy_{rd-xXnp^6+R%ICAT;W3$9DByI!!Dz*IfKY8xS}`KFqt5P)O2HkT2hS53NN^dFyqlhCT^jD zak1JiWU`O@0Y=Dx`#{qcw7rjRV6`-8*4TP5Ef1~R;U06lvRR=`w@WLBBe?)em2I3^ zXaOPijrt6I**4;uz7p4*4-<&JFu;$&PA&GY!oH@wgkMy$=FZ!sCbtUgx`&-cr#wc< zTLH$#Kj5N$QP0@XX9t{_UzKY!iYl07R zKfYXUyN8|jxRrg)j$uKg7&MBJ*E0e5=fQp%V-Hcgm(-5EUZf!VTI>li?r;}-D+cZb ze{2JcZ4k#5ag%!P%!tN)33`tsT<;s$XK*{XhJ&x-e@zgcfL@IOnTAbkA7@TGz>c14 z0)WN@AIDza*nk%b0ep7t#2>icVZ3F2K@bkUB0KKB3tsWyo0K;AX6U+~VaS5K981bP z-v8Sq!1XX-_J;5*{;@ce;a%}L-_GvyWdlz54VI4f$~k;h%pQGB7* zhvI)?Yi0WjO-Ga`^K*86P@dRX-u=o^6@guC&jl*R??SC;!e-0#om7i$G~Rp{zZa0q zaYJu~j$6Qbn~xn7=U~_1P@~`Dmm^=ZV;UR zFqC$Gz^-%k3aOLBAzY!}y zz4jrASm05%4K{pJWa0cb7`mI~!%{{?MW+sh=0me%f=^O9F$TIC)g!yXhe=e;Ald@t zGq@FzIH$y)NN3Edj@t&Byc=XF$96KcN=8K zTvXLGYeS_t4ju@GA?}4jN2t|hsz(YX&%;uO+9QQcR(c-fcZjttuv&FB*#C1g?-8EI zmLIrXwLyfJ0C!OvJ9W79gKg-8a33IpVhKWnJaid6<0zcvpsI z^`TV`v7ae{e=Lj|;BbhQ(Sb3QF@(~B-ohst6ihS$b6!aCz>1X}y_AI26GK=;hqdyo z!y0v17wECC==ir-9BT!{keE!gB_F&HAniB0nGI5R=v+GoAhZPg{VMYscNjuvUiEo&*Q{C%b_M95m{{WAK^; z%RLbm{3V>}g50Zv6~7Q|{%#tRpcv3#mz#JIr4SE3OTHaogu5}pXJK>T<{MfDGOM;| zJ+?XqhtI_VT`5Bm+~#6aY0xm|V#T|K)62r)<hM%-9|qsCFxTklz$xr*m)4IRYQ=!peuf4U-S6RIvqd#ixX-&7ZdV4zU#C%hjcTQt z61!Z}6RREf6G-8}ZJgu=!ntSn+rl?85&s`A>0&-Fjnn2?bw61rmzggu5UmX&ND4 z5W`b#gT?#?9#*9#)|WgbhLjhGpFl>XeudVYBgS`w*c1xku((VrV9bq=Va~xks>I{2 zzT?n6DKjh;iWUGBSg{;*#QL^EI7p|)>NMpjYwTi%X!F3QDoJ1R7%DO~RE}bvF)BfY z>#(bmWEOQoi4lBUwD9=g3rGUK?Bn_a5JrWgJIozAId^bsw;{75=MD}g3@wm(@3i?*nV z#4&2Y1Ci7c0Xn8qd-4!xlF6wDb8GgsV1Qjg*2Fk>=wfd#q3g>NPm$j$1haQ#I-E5i z8g`dg69%}6e2ZaZ!P!Ew%pg#82QLD`J^j$muooR>)r^g%mV+}IkDfPR1KrGd!)QRN z+c80-*u*ezK;cUzl72@IOVLb4P*-^aX14kI4jFT5@`+hL*9w+p)mCm|Mg! zt8h81z$NArG4F`<{33wefWLt*=Cc&4QumP9~!%uu=9Dq9-pkg}8`S1XGAEnL-48 zrw|<8rKb>T&VYHuUuBlSo(M%`&me%aLt>ATnmOpXgq}gj?4bu!f&%2}&CD4DdMWlw zX7<3ghCFotlV=dG>lp;?3bopYvz|fhWr~>2{oTofT5zOB>N$2t;mO>gn27XXXiw|Z zEJF2QJFOnfP*<~#uop;89uAWJOU>k2UcO38i;jmq>}YEBy`GgPZ6&lujaRzeGy2&+m+ji{JRKQ+9)S-Qq(4zgTr zs#bC@yrQP;l%99w>a|`B<|#+Ec}E1e%sWH|STO>$Cxx^&h{!7cNoE&AqyxP&8kjxk z`+6OJK;J6`npuaQFd@BO9nPA-^!oI@>P%LrW*yRDAbh(?M)4eSl6fdns~8UcwG1ij94$p$ppnlsUz|JtR=GgRFFacx;_H2b*l1BuY z4!$2GgUb=F=B21_Qq@=#sCIW_q*Z9_IGXu38EfxJSAWujjuza6h2j{AjgdvJ^^(42 zz@0!hY_})UN|+i$Vxa<7n}eg(GF23-jgibfX{+5`<<-J!PjI@Q!<+&S7Gi-%T<_m# zgDYO7sAxt~{V8n+c&larGbHk_0y0y2jT$T>rG}=MJ91ElDAWhJJgc~<*rDtGru6Vd zlH}ozxyIy&9R*_p2QB#4whI-JVrD?#HvRG$SRYrx3elB=hr98g;$-dJ3@!Q;0{bDMY?Z zAr5A-azC--F@vB&ilGRZK`1*36AXj8LF%Knu4=u8%EV+ssuGMZGKGnR^qzZ2-=$SA zk=aH;5Fcg8W&LJUnmS!jx}t^FoFx`mFL>$->#*S1L33)LtSi%MB+T)JsTkFUPFZ2i zbMSO+CmE+ylc;(&+Qf_lW_6(TQ&me@XjOq&K~yDT83s`oloY`p$$rn^D@Y-2KZfrG z^_|z~(`NvxNI!4vR?i#p;IX`HS7`NIyd6;)+SFSf*flK~#N@O)l)P>%){>LufkY4w z?&RT^>y@}(J?7r}4$o&=aHk(Q#*v5);xiecarpSIB@a&;>p9w_9l+zMs0rmDm3Xh1 zH*)4v8yGef8Dm0+Pu=)f6H}W$Qenu+j=@DNsW6EJT&`XPe4)Kg0r!+EdXL?pw0M0683so52G4rIDb-0%4}MFWz!?jb#Sz)4cpAJBnI8CnY- zncY-0B$O*)alOmqe2@r6pQ7A*g+10Fu>_4gewhWLH(_?Y&p5I!fqhu9gAX5q^0|$A z$c80k*ZVZ7UF5dZ^)80#8pUfAz{Nrsjd^EE;&~uu%oYGLTL}|T`mA8iMY9!%+ra09 zq6|I?m6Z-i#E7y10iMpX z7J_dl3x-b=HCd!})xXO{@Jt|%^)k~Ne%o*wfa8tCUafRSjbv<86a z@}wS^WCybW;(5X(McF5kAg@Yeq>O0F`r(uuVt^+pibX&ct>T@-q5*QhJzvv-h`m8_;C)aGj9|8vIPh7&lMxEZ7R#!DB|!)tr7VfZNZ|w?WQe2(YvqUx*n&Y~C&wab zh>j%4sgwDICwwQFkGVBg94I72=n_5X0VW^H>gUSjgHI>Ik!;jIB*Ium(X#rr(%_-+e z0Z3lrnygQgbs6r8+dLgy%@~rC9w#w`t8MH_;!-wSidq>7;zURdohk}EGW&p3yM;B@ zU_iy3_TxS!G-4Ga7V*72L%MpAPPicU0AnLP;fCysEyn<5t>!kA!L39jR*Q_}%9qWM zni0yZIZ6-`LeSIT1Xby`As|o-aYW6Nk;Imw4kncxD{m^4l08PX5mv)qO&F%cT01DQ zsEB}$mVB|fEKVvIVsGR%vK1z8q$$OMIF9gLA?u~X-XX|i{y|Vp0;T~box((q*+tnh z$?u~W0THv1u`p@FrmI|{p2PPqP|+nGi*GCG^cx1u$!J)9!gTt`3z!+Lg<<)dZbQK z*j>UxKXpn@eFwJ?Rxe~Dxl-YR6`^iC?ZDo@-J(s zovK1$HJTTYrxiKF8tO-C4Hb_iiDM15PZ2`@yh!GkunG-GBowBoV+z(#@kRlzv6a)B z8}N=K*HAG+V(5BWoi1LXY&v;HPoA8j)=$+fwosNyJ~>DzR#!Qw9^?kS>G=TWPk8jU zrHD2OQ-|#k<`mvXNTpxE;3G@SwK1E)gj-&~;B-{p%|O2Z^T)U#VNN7+F(Q*39EE&4 zILpdV`Y9l0m3(19!=p%z?gExc%2>^xWWQs@8;b>+cMAa5!_b81+90O*8;bfFsW!y; zs|bfS-Q(uw7sUd*aQU2@y8ye|U^?$&I$w+lXO&lj7YoM3x?dR0B-SEI46i0|ef3Ed z7aa-abn%Mq2-sz!mH-+9$V~=6ix&~DiFucU4Hl+)Vu|=CF zaL0UB?(~ajfrp*iaX+P4rBztp1rt2N!gJO;e29_UsFkg|mJdF*|Pfr=Qq?g_kJYpOw~NXu$4PD-+b zwFghFx+n>Rrc|ZGl5>!~+Oa>BiXfVElC!yhfFf3}L2wcGL24r(+TfE!z8q0AiAV!7 z6N(=P2)~-snX#!9Y9EkOoVJRh2o^B-Fmy*=42v09KcxK$t-b~=gfBYOC%U;leI)v3 zXV?3It>uZn^6mk=`~m~rwM8501gQuMANY$duCD#UZYIpCmq_mW6x9mM>$>|<#j&18bys2d8S~IQU@bw+%v$IjE|3;*S|EjLt!lE1a3Ecs<9ws8dR!629oe7k)@%LI7Oh zfJ;?v(NFjm4||Q;aen}-hMCDZSk05#Zr7YCOAxxIC!5U_gF&V z%_XU?BtRbzrX+p;6!W>HE08S31QwUEjxbmJ0R#ZcRU= z@B8(AMBfkmf9$;td{ot$Kb}cO9WcvGG}W}yn%dDO4Pv6Gq*9&Wq`iYTfQpi|S>6&N zv;ksB6fL^ZgqG^9w{y;O&e6}q`guq{SLkQqTHr(9m?SCC^JJ4>*F2`5$(pR6WAf|gnfjTm#`l9PC%`@q9>fDi;XS&rt@2Wh zqIfUvCZ2cc_jl;@;$Y(aTK&9RzZbs{>6O=rcGvIs==W5REMK{WImd5Ezo$avd*$%K zed04_N$AprS0#8X+)W!6;bBDdRu57ko0_?%4Glg+_BM{h-7FlY&EaoL@oh|bAMT+O z9f`Fz|*Zt^|KGS137vyGYM5IZXT>K=#_hET{)};ps5q7!bfMwD7x3 zup0O98Otdw{kVr`j@YhALkRB}WR6p*PT-H-86`h*Zmt|)e0w7_DD1=rNNQ8?1q!bc zdM3wf`eXVXGn08mz>Q!Z>q;LQ9R^(-lv@+VicwAx(@>!(k4(Y!=rqfsEV2vOqY>II z&-bWN5M62q-(hZ$=~v+1X*nK#)HaF#M7KG7Z^kWZrw_)MP|QkT&Ksrxe$OWoh~Q%B zYghu(Of~^Iocd{^C$|l#vO$;;b1~~oA<7$jtYA94XA){PN{D3Fw8zZ%@I{K0))&zZb)^r2c$f)hSUuhiMmIJONv*v6QdSV z>|sGqoH3&Js<>^jT&Wezc(;1>cyS#?(-j4P?G!G8-FB9E@_3K$$!=b`Wku zWSoucM<)>$o7Y1L>(Mnf?z)UEq$Fl zLAOacK!gPkQDSC-@04#C5q;DooQ5u(@`{+GF`J}>%8Kc7UXq&SWU_g=Wb9+w#lh)O zPLcLPi0~g60OPslU=|{+j$<`T z6l4TS=)xd9%8{XMb>b_JrzI|8ULdy}#GG~~#G+ejoR%_uzH=P&at;occ9PGqM}bjd zXRA8sc~cF-Vmr|v#sSb>h+d-G!7C;QK!@*r)2T(rch;E&xwBovw+~Qh3nS^4q%L>y8Bbks(y1^^RTKR%zgzcAQeXi zB2)`8)`GT=7Y=MzO$``L2QTKh1NZC>bI}93R?+AAg6nDS;|nD2H;HjSh%*F%+gOLxq$m!j zMI81J)(onZp^mYQxIM~5k9kGtMKa6aL?dwcwz`$s@ac0+Vz*DiywB< zSB9M0ZC#7WXNWUG)=1GcUs3gLgZFR}OjC)|yDs9?zS|Aq#aFvZ5p+*eglIS1i4G5L zPhWu*Ze5rY4;*L+409N;`~n1(hWq{wjFNm>f2jNWGtv{*&qzlfuEENvQ~O9~DJuRk z{*(ku@hxEVWcS{EKOuQn{RqYuIOFX2@almasS{Wnh#@@+7>gjEizvbxP!#KHAQ>Go z7t@tc77!?M4M_A<>P_|8GBAUT<>gcV(<#_=s+Ne=*6LUF0^@Kw*Q zn8P-lj8^>vYtWDm{t+R{iCS>`bR@=7*P`$@c>DrFr)v7yK4_290EkpdRTXh-w|4J$ z;1HrgAX6tvgJ6_Cc(M?3JzJyPDPrx}s)4SE;DOo|?CVi@0f}j_SMnu_qf^@+T@>!S zAGh*7G;!-O1>q9>F<;!LzIdW|=m(q>Mu5}7QW&k^0LB!{FjRq&Gt>*t73#|I*O-Go zN8<(Ys1v^RZ8WA?XRQ6v)Y++mRR_a;KgCBe`=Kl$c7_Z&mX4;D$P5NXkI? z2H)<+gVvZ2DVE7^N-YhWGqeRHbFP46cn^0~S$3n8;iS;qi*i0@)TazYxfQKWRZ#ql z@TwEZ9XD;*gHMd;iz_)gM!X(ruu!6QbNAkixT}hXw7fxbmDI9XCDj|5$7C#!+9)8= zk5o9g6T=h>g!_Jp8i-0`%`$f&%Jf6D*4}46N^1?7*4p$TS}W5)9@7RmGl-s&W;hNz z!m%Igu=5IzTfLk$rf5JjUJq4qkJyOt>aPIqrb?r3atf?)f6acXbF75CI;7)j;U9>| zLV>QkBwcz273h4WI%lNEf4VOG*PCm$*Y_Ria zlkw6#`Cogs?Rb3n{m(X?Hg4-NMJtcbd$#EpxqXw1|J?tD*AKao&ShXlyfD7umVo)-Z9eepeBihEz<=li-{b>-#s~hU54;eB&WHa= zKJY3Z_(eYO%YEQi`M`U8;NSCs|J(=uh!6Y~ANa5jych-}AAQPw;FEmd?0)Afr`ZSI z;REmUfpZWcU-|d=!25mRPx-+2`@oNdhnnxZr~1Ip@qvHI2mTenc?M`?G8h<_=p6jE z_@uwi2j1rc|DF$gtq=Tfec%uJzz2NbPy4|4_`rkcgyf_12|jSYGgUA2Nk0Sdd}oY) z)dzmF2QEDcw95~D;17D>c$90a4}8B5JOFpl#uH*I*T;R}1$y%=b%v>a$ev+ZZC+;~ zxsyw4e9j-m>4zWX#L%NV`qKCO&ymNE<~wRM?~$Z=&hN~3x@K#>13~BKIdb!84+L#r zGXI+S?cJl#&}?6FmEVg6elHgJy;$h?V*aQzCEJ%Q$OFrZU!HV}M!~w4=Q(OM&xxn` zj$fUBl;@Tn?WwBmOIrL0(dzf2&F{tNYPByJeMD#bk~Skcqe!!Ke(N&4J-VY&Xw(JfV_&f{FeuII3-GXD|u`GO*1?RB3N&h1Y zZtoSm(Smc|N0a`51*g3xB2R93vTmOn+3PesOqucG*H( znPtIk{{LGGZu9wG3x0-GPH8zFaIyT);=d{X!g4&|BHWgv-f}_}+?JQ0lnYqW+w!v0 zf>$7kDSr$b2^Y(^<>-71Zp+ct7Q7O9OgZ1T;4I6)w^(qpfPo*e;3T<$f1Hhti)E07 z4g6vYUS+}WB@uBI;=e7A(a8dqa?Zr9Dd+Dsobou)g8#DxKg)u@V8N>`_>d30uoj7M zvHTkRH{bn~hO=HAgE8<|tn}wt@bKsHfQ$7y7XMB9M>U+~+xU#R003Ox??yD-``r!; zZtIPoTIJaIyr|(`d>W?YzH8&NP{aA%N%(K@-}(iWp73)m__r_0!Oyec7sM2t_2L+n zDW}1L+jRb#4}7Hsx7)o}!-)@@)Rg~YE4^L*13vIf9Wvwc;#oLV!C5|=+LZsghBG~z z)WFMe&x>^Ce{*%{8v{4vdi@@_887$4$xqe&$`o z-00s^@Jrgp^t1V?o~iCu>j7@sQhvvbcbDmeR4asQH$X!R3aT#7-j29oTKk%S2bTF! z^ONUTCT*g9RqOAU+d$l#`kP;h6Z2Pl(#_QQX$$Sk;BS5%yfpWAx|XA?e*HKUp;UBCY9rQlTrVA^S3YPSk|7~I{gFp zPCx%#y@`7H(eIu9z{hh)#N;-HbEe1Hd#B&@#vooWA_@Tqn33nqx=fpQj0l2yfQfXF zNehy%#|$$fg~HA*M(|)#@mVLm903*0(Ru&En#!!XS&!c`(OI=0X%YVOYLOF;??dd% z9-@QaL~=v!c2n+lv$>VP2=kE8o4XTOAwW)2%eqydhbSL}O73t*QR82!%0XD=f zaH||d*dVZDM1~pZ;z6gXlWCl)75G8?L+Q`Wp6}@(BCExgyH!`><$2gFfA+NWr0*V~ zRWDF~8&W4Gs=iW<^{CI(U8ZptI>l3nS&=*03|#IQcOeVcH5_ZHQ?U@1tRVhHfxtkh zH-ci)!7-PlgONmFkS$fsCCj}Vs<9(u_||_$yChn$f+$0$5pdR&LuKEHMhIIx@^R61<3iCwyKi_yqw? zx&Zash^kKE&EvX)n_0mN5nmih)DCxVP!&XgP45$|Sl8K30CjlB3B1eT%}uP!<5IOF z!~AjI8_rf|n^fnpRA+MU z5zQ=%QSoktx*ufgA<7wO>a86ETe;n!4z3IgIovuR5d!7n52LlP0RYPZpG)A3NE1lN zg|5&r62>`|%LHHd1 zV^^dtwjOg+$2(OQS0id^0LvP%OivUa2ruYD9bq%xh|yB1YK@M(j8m)WTA8~z6d7Vi zAeh)Y!o1{B2{GuNDUAjM*`1t~f>@)Qy1WCt$~7w&V#`m+c_9R!Itutgy@>|g625gk zx)NM^O^sHEZNz%ZP#c?876x2uN$#Xj?s9*s^aRiYxd>)F{1)te zfps!S%{Z8f8EI_ss+8y*Y%fupebFA?Yt5F8Ig3LpLXSiX`L{SAI^|esj}5$=B=4pK z@%)(9CfGl$Q8Y?cWj@HL!xdbELUbA4t>j7V3h5>XsY2_pd3v~SA(R5@hbVLe5Mq@^ zBsk!vu$qFJbYPfJtZeD$i{b%MJ^-eJN}paFo)cUTU?cRY=pn6EMSTrHxk?;dxNnHH z3> z9-1TYHkGb4W;vqU<3q3?!E>mC1;&LV?odtv%SQh3gR1@qhch=xXnm~UU#V>O{Zzy# zGn-LShzvya5TfY>4oySUVCFq20rmdtxD&?r_8W#SD)`dH7k|FI0*8-Pme*8IJbPj_ z%Ed+hyd3{29(W0VJJ3%UKg%nipXp2U;y4|z!1b3E1Xe@>rxYI-T7$&&l=N_C!C@wT z|5%?djq52a`c7cn>cYZH$E_)xI_{3bY2(%wesSF0g$?8GD=eJP_hSn2ejZ+5iPu-+ z^_TJba=vcE>%zr|?1_)7t{Yb|bzJ$>ab@`8)N!FpjxYQXvaLk6xK-+GX8Sg>5&8GI zSnm%L`@^D&gnAEADmsFeDFpe_*@_OSAF1r z;RFA!5B%?a;6L+$@A84~_ksJx3Y`p6=A*;seBgeuLYMiZr(Vlf{t6#>j}QF2KJdTy zf#2%`XN+$?d^Q4Z$0ksQdF}Rr4}0KcDtW=jARu-*243xfoASTt1E(8omt)dj>wyCe zxo-1;7pP9O3ZaQm8QUe-ENdS%ySlXN`T{+}`$03sbLV;{Yz3WBB`#T7 z(6VecHjWWrCp2XkH%?X8_Muv-;xiwJRflJ=*-LV zrsKTw$as#W*N+Bu6)awQO@q7s)8;_uBX)hPn)?`_-$o!VFZ_Qg@F@7-`oMqg1OK%Te6s}~i+h95HVe*i zIs-qb;SgKF$-skJpoza-&L=gTbl`ZMNq?3Fr_D6*^DMYcw=1pk?YYyhSaAEh%QT#L zvNL4Lzurn8w&35=aNQ{M8!&o9x86_vT;F*)o55S8mewgU-9IIeSvIN^|scwnJ4pBw}(K z1HYEobGCBcbtCFJVv3dvd20IiFpCVjN8~nj3dWyYPWoJ8Am2tZyhBPeV6NV&QFZROfx+~xI_tkXgCM61(?|dvH;vhXe|OnpZgipl zf!J%>W3vM?JZ5ta;g)t<*5s~Wcr*5P3&*_he98}O z?F0^HPhrzUVLvyyQ?~35^dsK{C(S=e>@18~MAhDykt%bsOF?y48Fo5H%`9+or#zTg zh2$QdC2L=(P;yp)71arze-B&NubC1d#Bt05OkmV|nS<9GyjmZX(K?<*o|#|Tkwifn>> z9?Dr%d4FP|j^GefP_)>H3QEP)9AvmsHm)$7plUHvBjjZUQ%A!U*?Oiwh&_&?rs-ge zOmfs!)e@A7(AsRyi4>w8f)|wig;GK~k<3L$%#=Cj!fE8Jx$tlZ0&vp?+QQsK_ZkFV@7Z+?3NUI7%)j z4vk|2MUIqiu1rnYM3BgEXrekdqNF>oo(q+cHg&M6eLaGtWfrDZQGDLM#bseG=(xt0_z90yNF@#8i6^dZbfLM6El*$PP z7jbY@qu0%&Wp#Co7fWO#j1)R$RI^f6IjjX(>F0n~nW!DP{!{34u2d~6-?&*M&D?@G zg)3u1Gd{bi>4;YNhO{GU)B_M}ln(wHe?c0xowG!da1ZRN>EN|li1Oo!7UYC0tI>QF zI9;d1MWh7&V0R;A1Xq4TcmxNlCf`Le(C)?+fFhTQk+WL_r492rA74(xQRc)}7!&M; zjgwE(L>2$Qt?cLPnIWP((wq6H+!yXEhcoN3W?2r*6yc@lm2+ys$!C9m6)dZx?oUF6%76;IvAVmo4r6vV2}=DZfC> zEyo{1_%Gvkk&)wgg!7^@u&?a%e{zhDi;tQZoijO}^8PV8)5fhirl|P1y!+?K{yugc z?0eSd!^hC*fk~?%&I72KEDMNRH3m0k)Yxa4BokI0kwFyCs1enIg3~0GX_Z`-&&utw z1v7IXx#QTT9lIkm1Z)!iqp3$-(|q7p_`tvF1NV!?x!ouI&wbzb9~_10ME?^f1Ou=2(a_{r<#9cznrsqH_0UR2@Ct+Ft3p@ zQTfBh5DGRb@`)vL(s1tbj)mO5Wbx9D?ymO5m_lfn5udxHTlOMZAae?%^0s!hwRf)= z4erq3k!3Af*uJ=Bao2UD(q9A5rF%)9?PL}#SiH1r;Z>b^!p+*}`@d^lysT?}>x%A< zg1J|RQ;jbbkBXj`=NL%LngXDsOcB*GOu%F7CRjqjg0W3iQODwJ*X} zDU0W$;Pz!L*c@o|W-p7E%)e^s!mhj0e-*dD z@zScbt*y0lbfjPFf(5NhMz>4rlJ1VS*3qoFARm1e=cD=Ze83I?W|;~?a&710uF;%J zhuvZ_a^Ui|g`L8MSK(LZ8dcET)@4f2R78{T)gxu(B}WV_(Uq& z3Z-skewXvNCf4E{3(oO)19vq1bNIDma=vWA*^Myims@b!DFg4b;Ork6_*xBzTQOqJ z_8&ZOlm1=}r~R>GZ~jfgi6{F8CjBN2H{~1nvmUs9EZD7YyyXvRILo(VfevZ7xBOyl z*bH1JD=5)$Z~33raF)-ZC4*;$PdO%L(v)w~Pw^?=waT|+)wn+F)>%7c&)l)%%iKX-%*NocVZt!z#z-^E)iK9b358g4;2H zf2ZN38~eZp|9dr@KX$#=TX4Hx=fbb$<*iq}hBKSKm2|ELZt6ALD#xzZVhe89>uL*b z*K37_vtIVTHAxG8D&Cp;a-U6J22TV3sRwRG0{%(EiMNd>_u1sd@0R1gDQD0s$EN22 zEB&Xf^p|OZ@Wzrl08 zhI_v|Xq97s_X(?GW^VD;CHlH$;NP>q2aa-0H|PzZa3cB7t64(33y?@)(n(vu+=GpwV;zhpv)T5~KcU;dcJ|0gD+ z{`Iz1Ygb;adQ@^{WnZ&aWz z3?f@GV$Fga0CL^{gOY!JvYy=||$0jQwoI!Wvf<()odfzJy_Z>m&VUHFZl)KGM$G1hW z$=J3x+rp*Woq^Y|0}l67;(jpLJFIyfx73nT)12B(-5CdmS96=N*8^QRxG54}k6m15 z6=Ih#Yy*ab+Ysi$DzRm-8B7^YnZ5N(z`;pBBzwoX2r(>o)hVT_asX5~={qG?hWYfq zW_wTqf@dVi1)(|;7K?qS8tVb<;(?eaJ1y#4PSKaRMbXU&(*p|i*7i&zh=fesZY%j) zt0@2URwCKo>Hg^bz{it5OJ3~v6xvLL&1w|HKS>45uTI%JxhULsJw!}zafO3A(b6Os zj?pR$-*Pgf*X$se{B7@r0sRoZeO>QxApFCDG1w1JtU&MEf$%T4*CnsOVTX0S3kw3Z z0q2hJ|6XU-ww$DMB3%+&cAexDeKE8-cr#JdloifksBpM%DPnwkhq1?5AtcxYu^Z}Q ze?Bzcoyf=o#~hqH7TA<3{h6CQh+UgV6rCXzzxhw7%zfqyNMK^7vcHNQ!6Ph=7jEyt z57|Z0Pa`LFMCg@Xk)v88+u*4Z#Rx@pzy}*CvGv^~Hgy}(`kvO|H#CTA8@h37p^(5$ z-z7*hDhq6-$ifKcRo7wLFpbYqGf(DUk%?yx>Wsp_266K#i@6wu239sKtUhlzSua3P ztD2<1kH*oN(i}UMZ-7wuvUTb5(!$@pT953j*O)i$OZDU-y{a zm+G4BRLa_jCeit5V>~rM?sq+6J}UQ!22DjELquK4klaB; zZjGa=2($0|UvRqF4*HYAVY#}#AJ$6ejK=&fe9VKn)sR~7v@p2oTcZ6)@22~r%%^ph zaD%60MTpE^gwtz$Sr_6f3No`CdsyL2X&36W+_0xCBp6Hcq8NsHW!1~nvmiRLo7QgQK;w##WFwaa%W>s<@sz0wUu) z2bH@WA5)Tphdbnfd!uTF&NpRD_K;47@bl(q2kXflyC80iI8VNrZ4Owhl?V)NQT8C7 zZVAMbcS&xYgr7}j8j=SZvMca(a3l)GqPi@h0D8l22C2aWd%4Tyjt8NUK9TQwSkvxG{oQ<-2<4 zQ|$2;31SC7(LFejv^lubNlg#&pwB_-ZmjVM{3cQK6^K=nnAwLV$6JZiC9y>6L_!fJ zJAhr`$`J%RsR%3;d^_A%3np?Z2T4IP16vLV@ECb~jhS%lz4|25KNGKQjk@96c*tg! zJzyMG{WY^{y_7;seRg}mR6#r)J5s-@|Hf+@TKap3;aB_&T;wLP(H)!~H|_2W(Xq%F zi#G6LFsEO*pIk5iFJlt6;A`GQFQZWHOghm0GRkmzw_qo|-GQ!8AlQ8@w~hnK&GE;F zS%(!AnnBzO`n{6_T`P67>H26LL@gt1O{dFRLvtlX=cWyG&~PSlZW&F6%%J=qEkP7` z(A6yrubKwUZd0c3HIOQ^0{VusB7$H-cJGO8VGsCDnxW4}BSXL;P3*@~7_%C+_n zY*Ud%S;Qn;g_;QNw5p$`{P&UHP-tYB_e|1GO9&D-;;~*Qw%T4k^8S(Dw@249pS3~@ z!QP)0kXQ~Odw%RVRe99dUG^V`-6Riof}-w+*`er&MOV=Gk42x@)!DspBErtESUP|C z@?|ZH83R?W;<;1|dbSju^z-?WBKG{lf3KxwVTXK;XQh=R(5u|dMHQ)!qq2Fw|Grs) z3@$JQdWlMasZ=j$yKgUzN*OdU|gMZBj&atn2 z>2L6X|D_N7?|t9{K5zT{-5)K$9&+`KIMPKC;f6Cc-jYkmk<1(ec-!%;6py}Kl;E+U_$cI=QP0c#q@u{ z2Y!VIuIy7mL8lL#s|fRz|2IDHejoT#9yr8Yt~Y$(+QB)hH3nRApcWp~m~1}l4ZP9U zvYz0mx19Av&zt1{Bf%?{wY4o@m?!*OHlkg;6rSXA1Uq-P&qs*$=tTpIukN1Tid}H4 ztLM+3i(f=Wui$U>*?jim-@bhQH49tS-mi!`ziQF)xz{f1{MvHF{4bo_x)2kt%dVSS z(7MpX@y}hbupLp`OBT9&TE^yt|W0NAg%Z3AA8YH_4h^d;k(1)#@2< zVIYvK0Ld1VTQQLZ{olnAbIl^91oF^4W(r zaMyy{vFA+|+>Sl}nguVn%K4TB|Fi|?8eU%f?rHdMzWa|F&U$^ug8$q~AGP3*TJX~? z_DT9pr_VX}Fg@_Ws#6o_}tY!}uygp9L1&#&d}eoc$7B{NWgnDd#UOxLwXa zYB=$<`S~56^yA@=^Wtkemh;mV+%Dgo`OWk;{L5B)yPUZe+)m%7;a)uN^+|8m95B6Y z7wr9s?e9M8Q_cY&c#)1VV)-0gHgq0q!8w#};AdEH8=qOLMh%kG>4Ia2D|NB-sc5La- zJ?W(o{P~p!ZpwMsr<@l(=}kF%JaALaJ3i$^LMo@XUMG9trkrvOC*ACN)o3{Rgahm* z{bUP1#e&yc<+Ci4{s9Y4mNf7uta83!!FOA5`@3&iaGM`KrH7`8=Y>`|*IMw4Eci_t zP8@CiTy3Sd^?$~K+jt%~76stqcWr#kS_Cg2+G`PPzCA~mW7>=Pc-4F03W^v%4QD#L zy)M=8&jD`Z^Qe`+4(|;8pVM&jT~q$c9=IlZ!JAe&_IHbpS2>B#RIB{sEqKg=pP=EN z1I)(r;}+cJt8xo|u~kl^h7*5&+tlmVR(hKs9=Fm{g_!iev)~jd1244JD3AsQeu{?k zn{f+%nufDpHlLhjrLVWrpKrmxXu&VE%CY&RLBmaZ8GJ6Y%K4I2&O9qUS=gjsXr*^7 zc)OL}rq8!6I9b4yv(|#!^!b%lzD=Kg4foRLF)O`IpQkOjO`qqia%}qS({L|+hOBaI z`W&{>lLbt@iX=2n@sv%UkOfaz={ITpKz@i>@N(SqB0l_|z5ef-10h9B6U5BZ8TwEs z+ZX#zhPF05LT3TjZrv`7xn>uQyvVCe{S=&mU&3u0&sVO_$9wx?TKk%S2bTF!^V270 zne=Jx%Y5I9hWWnvjUiLM{PT3i_v}J(Z|ZOI`>i>cN9BvlOK;NJzGmZrWpNC_zB+vJ zo9~<7R%FVTzsD!P!N>e|>ipIA$8m4gNO7#fzD&K%@7M9t+}r8?Mt|Ri@!p#@1sLtZ z2pPun-8#P)FH>(Mk?U{pmt}hM@6!1fsbtx|-uyqnn|%B~L`90r@cD;ba}Z+&T!X9} zF4CJS(R|;OOZDdEeSiu=9DKoL`V;DDH2pXxl{bHt%JCDEQU7}Bj}hjxKg^ng^UtoX zJx_LHJo+^UolMkti`I8N?9?2rdJR8{Wo%27`>&FazKf0#}i)EC6AR2sM)e zbd(mJjA0eT_|q%oTX#k|+)(qZ(^B>T09XL=tP^&2Imzdpfme&1aQ%DEz{^25 z@W(y!Ht@WYyi;P@>QiSR!fK@^hm*WVBHQ@w$u<3J>U#ea=ngTW{WQ1;I<6~Tdq($# z3}3D#cKogt2>3c&Z-$&sMl>L)=LrSWYZ0NH_f*+zWPI&LJchoQF=sFzxoO`@JGyEB%W*qdV$yQGWd2|_^iS3Hy?)=%2>`= z1J0{JoZ|h_9^mG*fD2`4z)6+4sYM|~^P+MBLFNdStUL@X%@<}xRd9SR1t4;$@=zAk z1O#;cCgg2GE$0k6tM-R)y%irsaOX_4=rtJgb&`9zB4%3J-6w&oc;bqfmx3lHUSd{{ zQ=6a+3WN^9Ecs<80h*KLJTAEox_QA{9_=6S`~x1TO1$ZrYG#j2McNr zy2-tYe2~c1fZ)02poZwWbBLn=JKd(vgS_2=d)XJALAJO3AVk7Rg1U#;q~x+L+~`nk zH@O=;RT~ocDAc5636nVs{7hN1`XnDg$ zh&(k5WTJRIvR;ocdMr}mmk0Uf)Yv%MYf(e^-Y>@*ioT4{TAmBu!mmtibfGubN~+FK zB6UI{upXz#Uyw*WxLV=y9u69B!0{iq{w1EZfLsDcrXdO0#gZ{Bz$&XblGwI)M!J14 zBvO)YJ`i%#&Fex5kG#acz@=nUF2Kp*>+oOBQ@_CJ-Ha2%-|fcwo@Oq~B5ujwI=xQ> zdS4E7otg-|gGm0#IL{lw@R8u43VUw~z5~fF32rxRs-mq^r^HidX&&tTBjn>7a0%)m z-m5+aEdd3yNUabdwPdNo4jdYu8N#16(20cNUxAXO2Y8$L1>ULi6ts$WQ|)R&gjU~1 zXOGnNqwPS%=zpz;Svo80kb?8t)+qLYzJ&sIlbM{(mxXF?V(}QYFm?TC-48vivuhQM zmZw=!YFAa6&rlgR{JsUE-W$jYM4MqwC*JJzY{gxK6J+T^nAQkJanI#t(0SKO|3 z#R*U(?_#l{NvPg(&-_&WSGTKmR=Kx{)D=({l+@C9bEQm$n4*B-&5*TQWQ%W#TO;bC zmjg<@U4yhJOb8N$rU8jJyQm|dxF$yIOA-IJ9|Ngr+Q?vbu`_P%*6tTw zsLr)W$}B9@#kvrz#jJzOg!}#t{;~^cTI2)F*asjC#ySH$Mg!tn_i#gpEm}bD_#2nCe1lFhZO(RuiBo($`7d zFTXYY+7Hate?lRf2d#4~y?_L2|1w)g3^j65`8OnYC3<%sPNZXn4YljTeP73b0FB2Y zr^rP!q=SJ(x;UU4s8HO7#~{7ZPJPiHlz^sEG{V^^p>W?sbXBBMY$iApkE2Qh(D=6~ zYNX>KETXtYa6mmbtED%i*W3tydE3va9aQbd8VFzQKJ28OLbrBTxbG4yl1O097ZzBM zgShUZLliUCA~gkfU^y6+PH=PPGf1cOCeWB1V0G1sJ5YprHZ=yTlJ6I6Ar`~<67glH z0tBZPPK^P)95;mb^L@)02Ou^K8++B)(HZPLjGIo}=tU)3-rK@&^=ti*bqxXy z)Oq57XWhUE+#UIf_!}^xPz!h#(NM}G^$DKx0S8ol+%0k-H4t#L$LE5pSuf($kaA); z>SM40uiey_VwCpXgop3l;BrZ4>c*Ipx(4oaUzAD<>r`(P&AXCZd|eF2_)kvJbx1c2 z=`MqjMh{KW6;ETmg$c0~N~=0K?n*EbB$MQux>oQ`YAU`y7RYSC0ve}iDjejdDFfmmb9PNDxm_43(#sf?cXLU4 z)?=vJT~SA92XeK=!xg*v=UF<1vMeU;9tLu#?~HVO9a1Yr-jH?&P}@CByAxQRj%pM* z+pq|)>u`v`$GEmhst;);07T&WzSLc!soUzqrLXYMvx)S|KcXbHIEq>~0%Z7RJO6CK zidOt&4~f+Dz7+ufD~?9r zP<-37%nkrJucPSNQ2K^|({hBmXVQ=hd5k!{Z$Zgp5otnPLQt9PbnqG= z)6?++v{?lX8>_%UOz%y{={e-7jn20Ha9*FCmR|W}MEGPzy6X|Rqe}g9-6UBMNseGx zB3KV*(yYo>?7=Hz7pB7A9@hr6O0k%+X+8cwNfto*Cb0MH4eT;r3>_Iv2rF#t27d#? zIEqm+{+`qO>R~rsU+C1n*L5LZb~FUmLEA)vPdWivtmy_eH$cFfFT9g4&(T{u1~?^cLIkKfnl*LwQSn zEl@cV#}8SH2^}zeW%l_3C$${P26mQpEpbyttS%*OEg()2dj3Fc(le}|I$qCd;Zoq< zOkmZsZg>WU4p8mztp`s-{^ZlbF~TN+0pXl&`<-<2A@+Bk)!fo7y`Li%V}LRtGK<(j zwTA}2S&E%BeAogSB7ThCUt>@AV-3k2iQdQI)4ddsZc(`J^S@)2*+_vG5`o{qLHRgp z9YogvG`bjK%I?ud{C_;h4Qkk7UFPuHvUXhj{!Ax4CAGHI^uaYlkRI{$#ewvcQ?QVi zqC*yOp!Xwz@NK)XSTgeq6x6l`CgH}DDb#C7&vdCC&QSdj?RKl}DRi5}wHplcWZd#p z6HMhIv`USG6W_Q!N(4?=hm%UceBLQqFOjNkNTJ_U@2XF=@-L1f0v1bQ?xVC36qC+eG%=C2o&X641 zYNSyK2b@OIeKNYWkB1u4vo--~4&$YwQSl+u?p8R)#&1U>LgXWp#Jwt}?VvpgH*Mlw z6q~9vJqCjSMw+t$l7LY*3pZ(j5Pl|fJ&0_Ex# z%M%6*n~JwNsZtEtx>)5cI(bff9flH1;se8RmGXm%~r-&=Y zl}b${pW^3v_A)p_d=Z?8_!G87_+F!=?pI6@*d#4>!hY;cvQozA!k8;#6JV^MnGS{f zQV6R3Ak07BLqesws^OOG!+tRCW;z%g_UOPX<6zL>O?FaKq7dT!j_wKc08=$W3r^%F z7!cS1n{A5xErtqjvsk|+)z zHta&_K`;drLGe!d2Wb1JF*w9DQN7AvRA^*8Jd@el&21{)O7c}B@oxNo3>M=lm~gs@ zC}|F?%A7}Xru=*Rs5^)X{YG*M8Rc)lIe28_^6>!ta6B5Xa)!v%G0ek0`+fL@e|(p+ zK1FvapC)|o%ov#hER;w-DUEz4zNH)ax8=H#;UjKG6Qa9}AtDFeW|76zgecnlHDtyi z$JvIJ)|T!x+Cg>|7%y_D8gQ0$R@bv-*p_UD1=Ahx`z_;Q5#sPL`r9G}!6-9ScR}b8l+RIJ$(Euvc`_#?pgaJI z+|YKB2{d~f38N|`t?9BDdN&V(-o={UTf6^h6unOdewx-s0LE`8?-yeXn>9PcP2)%Km%Q$HAxnPoAF=(y9oG#mfN9;8)GXyW> z4wPAxNIuD^bp%QC{$?gJ|uhN1?v9LY~kQ5fui9kt&R^lG3f2XI?vUG`rJv5SA$hpc!)bu4uE7ki)# zNhRPdS3pB3)5ZoZrw1u+@o0@{&D0sfsLJ>9o~LnO+cbkpnLhu0)2 z#k&dpfTq`w2m7|*>7ZmJQ#G2nJ9cVzeguTcbL`8#oTOHFE%+6iW+yR~T-jQT&ja`p;g;^5GT)?F%1%NKHM$ zE-IbvwTn>MqMt3B=+V)?%FKRugfIh0mc{y95H_JQ~8ew*5hjOOpKiA-A z#^PvC`pLAh;wS$bBJZ-6lfxA>uk^>L!&khNt;5$41*RJ%PNxNqT~>!rOV5IfN*zw^ z42_U;OtlIZ)qM$Pov8|X@Ci$YE02^qTa4=jiYtbuwCaZM$$o|EYAE#$MV?dNP}|D( z(i^pO_(*T`{dBnTM!)qU9TYg9(90Ft`x*ZTHM*_6UF^U^vkaM$&S~(aOaSa}so%eX zVa{(8EAR#Fj`YY_dCt@CdW4?-YoM(1^mhwAVI4oZO$0f`kyjQEe@kf-K~ImXk7SKU zXAND9q5t?OtYK`oxHWM1;YuoNI35%7+OLm#t>Mc;P^kE0sEO#NGzDcK9)__I8Ykz~ z)4il4Gza4+{I5m^voxyt;OMzTp&ISWR*O0rf|$FaCYeVfC+?wY|lsy^Ap_fq*o4S83cSq27wBho^}V1)*pfv zpjyBnPHuicn%$Zoz&^S8<_E+ZLVw@P44?q9vYz>Y9rT7|egN8d^!z}^-zD0j=Lh}@ z!vYio8UIROjr&<_T~5!@iT;pWOfLunkf^nGZ_IqbDAx$gR}vh`>_A6f#;03ffFGd> z4P^9CDe6S*h{P zH=$?M-7hrBdXOCbYfh(TehKUC^<3bzar#L2pV1e{ja-QrAij1IgW&7L0l4;=tQ?#g zQ4T-^PWo1G+g^?mV$gyEc#|1Eg5aSpya4GOMwEg7H(~G)yr%lhQ_xeU;h`PkSRsZd zBE{&4HPLQkKEWQR5T6XzfJ2B5#*!YS%`syXFaO3Emq{=#>)80?w~7)$N14Or^nNM% zcoEzrooTkASPf#w-c~R>OvE7}C|c{&Xak|hLcG+P;Ti;F ztLk!sf!@$1>8_XH;UJpDNsZ?K+$-Yq=xz;!+r{iY#=kJI1D~m%GRx7%$>`+LA4((# zgkZ%OiIYyMc7r&^;BkZS9*N)uk(@N^{%%lq2!egtA8G52d0%3wXi6M9!hPS`MSg*( zar7iLDM~j;sQU>0AAG17dl$|;;s*LHB4@oIz@id=LHe4WY`6)wouqGu85cTh!)<2M zPLgkq>^ac8CLg*OPRlZ@8csvx+%{>37j|Zwfk%_D87#&euNZSyjxl#D#>^_-JPbOX zE~j)2vy&N$LEmpMEjzKXwfmPglU@k?Ft7s;Xp#(8lcqvK;nXbs5CBGZC&JNg)PS5x zURA?syA5kX`Jj%fmel})hK7DScDxU-{t7QOul8faNIpT&oxF;P=#|?QuNtC&U-!$< zG6WgC34|QsSMsv3sfe`jEEw3svtm_1Jtfo;3{DD9`VJ-=zJ)y@(bW(P9?TF-l`$=xnQ;j0SW{lul89W|8V(>Vsbw!S4Iq;16<0ee|HthoC&B!vx zk~t6qL6os%GBk{eX@~|O@$Xc&V^M@|uAgK2z{Ar=scfkhgl+X8F&@!>T9G1l3Wp-$iRu$7f6-bvGnjFepgiq(E_vv_}nf&`Q zvI6$7>HWxPdhh+P^fnz|MNTzq^=Ovfu#{PvtA6hXlbXSQrsL}|okHpv+e8HcQ5iWf zYDjf@N2(zaYcT+%b`(n9^muXia^{!=6g%zvqW>xeP={*(JS_g5o=3!MI7@nhMxM@RWM%JlS6P)2yW4N1la)?nFq|NUVNdy4z zag&>}4))EDlbMSvIKR0In9-m{rDx7|m9enqD2DnmoWoA|S_6!X$DZz*K@gz?cE&#X z@T()7vqt~~0MAhsW!)KhSqg_IGT|M3Fr+jLBNBU1CXzoTj(mcVTjJVd<^wVld>pT2 zl!)|0I2? zde~mhMJmzZEU<`k$A-_q&uPRu}^* zkS20FW#p1{93zK#U<*=!*mlz>Gc2KpK)l?|UrLj_86i!>`js7S2Bue8Xk|YR0x@6w){iW%GqnD;hkBBs(iEdZg+ORi2Ekj$> z6c7}!IoQ<_EVh^uASGC9@eKC1gsL=(2xbb}b4I2pOAjNYf*rRet|MXK5jyjpuCW;L zMv1;Fr8I40avy0L93f3;QFh_r4VM%TW@bNZ1|Y(S;Zj2p^Dw@u?tYF@S#?(?L+k%7 z(sciptTcU3LaNc%g;z9En%q>Y%x9bq5`$?GI74?XD?=1}JUkMbk#2o0D`LJ&5xs2#2gP>oDL~*oM+a%T_ zTzRL2x}YINVw%;XvTxax#1ln6k;_Z;AV~P*&l#LKkp7&Bf>5!>;ZgtE5A(dHz=`5UdM1L)?cestEt zpc)g<0aUtI-OZGd^rI3gtcTOH3YK?gdv(IH+N-;H zQ&wUM;ZcgPh->F?WDB_NVHAG>nu?Ml-kkQ`cJMP~GCc2v`}MGsL~x?^Qnd|&N5+wJ zGMGr6_;JQ2siic?A;LhzBoZgqsUbOpHG;HS(%LzTC-G$fuSJm~ojfH#CMZFRj_T3l zA$ly|@Jrel0ivXW{=1kglW6ydM9juoB5~FPG0HyN1T%lXpojZc@&9#{!U;F^skM@a z#tH^W0THW*WXj-CdZ5T9F$P$OR0on8gET^Fz$iMb$Oz3zN@!e+?{tV~_lS#eTygGj z4xV=I7}?5(Ye;Uw`B57nL^4KY=3KO=M(L4}zns_S$|Oxzg6I;C7s(;xWQ~%xULCnP zQ+Rjq*d|D*3+>b>7Y}lVv0CloL7AxlKv=MPyA5aISSORL0U5FAaV>t* z5i%ZJEZmPgH)S^=dTk35@4@2|5R8eLpNx$6=kn)+&Q0lHQ6tYynZev?Sx6uy$sZm6 zoK|`vjRo|`s1bF!zUpWZ{R&I}k3p0u+K4KG-jQ_~o#pSH z4~gVcS72Sk<=9Z+rZ>2uK6TM#?6(lq`z^rHB~;TIM+B|v$5=aTbsVcT!_Im+auQ4N zB)#dY0kDbmT1e9a>O}|rhaWxj}F$q?97GpgU#)gEac)Fj#rA$FoRq)ARG&LC{ z%<%Mywlz2nbJa;;JsoKc{SWd8e`7T&435*7!1AsJ#Klj?(!d$%Qm+4t1fSsF<|pJK zx|0t$SqtiQD-;64dn?|+?>cD(63;pl1c3TI>kr{?UWZUqw-T;%WWp2p(}hA1 zy@k7#GVcdRwTZ*Iu)xia{w{o@&=~jVEH)v16JpIJn1HHH>@Sx9LEn^cF{!Mx0KFf; z*HAqruUUFK>HF2GW4fhCe<6;hkYY(|D~>%3XuW9z*%u3+JsWW-x$Pas@tL2+x477+ z@2Ol|RZ7ll{6~}^Q-X%REtspsfIcYOvl<9;U9SV3PbUPi?2U;OR_Aj_C)PolvvmW5 zaAwf2fCnOz3YgAu0?))#A9n(~oXx=9 zTEM)gX2ifnGccrdoKrL-RG&HlhgglFfoLAak*qkU@K$VUgZ7ZGq5amQ{X{vbO)^eH z`!yiW9_wkiJ&Tast$c!pB0h|^oP+dcO;!n(VrtYf3xQ4B8Z8(&A1&NB8_o(U9_qyr zfGybmVvCdHMh4-;Z#cjR*6%{RukueEj2ngT-Q*nF!HL;Fw0lyuzu!NImzT7_V{yKF>){kcYbD zhPE}>b_7$WH3#c@HwC1KMBw@Q+TVA-j{RZO0)0-*MH1oobLL3V8u&a25f}ASu09Ko z2Xm~i7b4l8Gz2weLP^yD%+thNzY}U_HAA(g8COYj)Ic_6z?KV6(Zv|3P`m@CAsk&t z#0B@RMp3J_+<1!9vJDXknAJT9!bUL3tJs}t0zz^>Qc*~Ne~3FPT+GNaW!toBizBwF zQ7K?`KCWqQsJwfSlR7aw4?T z5Bif=6oh}-Uza?tcPLPo3`T4E_btg8l)8h#XrOD1NEa6=3WY?Xu{!}yv!fn$AkVCf zKCNz~Si_4YBBJuye1lI|$OU!Bur(h=dOd^6D}U=&axefRa{Svh7|Q%aCW2r( zX^9|3G^n_nhnrC5?=Z2#^+CF>&}@u^6YA+xeES1f^Q=HP0XP&+*N7Sso{WQ$8^LQR zPFre`#_+A*MmZu>vUsGvWLd81Q=O#s-QoLz=xizkPVPOeyHbxybjM7Xvj$Mqfv)YWbd-wruLbfju&NL{iH z5g+^J;4D`NME7wbY~AhuaWeK7RZ6~oMESaNw0yO3zZ23z_)wkQjGZ4e`_RR$6?Lq<{Mu!06c zG=Rv5n6&{^Mp>!w>OQWVhI(S}(@Cp?cV{}ucXY>KHrIPpo6a;5nJ2_={IagLF4uSu zs3vB!lB@yS`*d`GBHfvO0(4r8(v68Sce05w(n1W(2jQIZQMBzigQ5spmuBc zw(~JSFFt|F1T`=-_o$o&z;uzg>&PrY1U9(zZV-wk>5nP5M|nTAL5b9IoO^qG0uDS- zMEwuLiGLfdKdO6xy>${P<=B@e;LUD=gocjcvdpiB}??o{|hYifsWJ)Ca zslm$iqk|0@@Tfg~`2LTQK>(>}nxpX*_9XG({p(yQ_H+6Upi>8`tViP4|#xL(9gu+ai~kggb5iSFPJwQ;80mXrUU*mJ_=v=;)3etH`#5n&q`Al8!MrF|(0)I*bUZ|_x&;4q|pJYxJEMLyN4R?ms#2#q@b{GY10wxUe zuRCn_J70yn^fLGl3&|>8Lcis7B7}a+@5A5xA==cfWWNO+P3_3CfaoCq!f`@YbSRs! zwV`xCpF=T^!7GriEAI1kKxI~i9Z*bMqBSx%NicvgPnPc_zj5Y;!3=jHMkDht7)hbt zFLTpse;M7^r$#8c9JD>+R4U&nt=4l!FyMF^#=JQr)-RQdoW}dD>ONY?hu!*NDvJ&g zG6aZjNj)@>x;zFVsX{pP0Mw*!0p|mKi^{Durqns%l5!{^Ny=~F5%+h>C&DG;fey-G z>EV*-%*+}rY!l;aL@+xl!Yv$?e$)C)>AlU|JWgsk1Y05>LQT;n4qS4u z72~XT=^@()LV1#}@tK@X7G{Q{QIdMgJC2i3S7vLM09ByINsJ2E(u*cIf@AIJcT$52fV13ZlytC7KR zdF`fP<)p4?#0O(yC|q=1p|_-t1sI zt?mUf)+OAn1xDE!VR6OhTFOu_t)D>?)J+o|h2ry(IQIO3A}cp;A(FNGb;*ADBRrR#jZPl>{d}^j{_QadQ7&q{?*_Jjv<=dEn!)OD16hTY=P$Ov1njT%b zI52PNLZHC#(oIW=oN|RJ+ipIDU1D>^V7QRop9*JlJ-<$!gq-19Zz;rJ)RZVjLw|xh z_(jmjQkonB!#ySt`R??t3t9UZv7a>?b~zi%zK;E@UF>HaTp#Evr9TtgV5_u^Ms|BA zqf@6gM^o-!x*I4HuXO42#H%57Y$7#1l&G2>V=FRLu{@EUGUz0W#puGjLuyvFoRfz5 zorJCr#;s{LFF@*<3AioN_=&3C)hO|+0XN;e6B`9+<5&C*7cL=M$GHpv_k(WoH+8cw z(?fUYnMON=Xio2j@=fvR>?_ohYV}0wq&k@)G;~*<7I&j=gd$lPoei>L)6FkBFdxv= zUyLQV*D#l&yGbW+Pf70=4ld}0ZsO%2nUDt}L@{!mL%Z;UeSMd6F6U-V z5R66~aMDQfRSZmE5P3HL&ck0JCbwWE$<&CA;bTw^BtR2>5ly%fyB>mU;al$&rLb%ZcG4Z%&AtuqF%G2VN%-Uxba!>3h9|%tWQ$A?sg;?(4SO+3{fxe-yE2j7p{4-; z1Wj?%8+Qm}!?SmRd$Xl0uvs}?)$~jDh8FDZp_@6qaA9Id>NHbk1T#=A6^sIaN(ulTMsQEKuTDB;XA*5!&&Oz$k#3JJ zGJ@(RvBGR+v=w+HxI<*UQWA^g`zSY&3S%}xt28Io4Yy=vbe5Z3hY#vRKn%S`_)za? z|LBSsSaKc`z^S`JiKUaey3wh+X*H066jCrTN-b;!`!);Qj&g&LQA-Cx@68f=adv1q zo731}j9G?ny@4X4H7$6x1IDfg#as{qSUU>YhB`#YVi0fn{Zs)y*-;R|ZkzFF*B(Gn z4Knl6}5DR!zKfMAH)hVR7F&y zpkv7Hr7o|4K<)A+=Oj1V{k2F*gUtWW`9F+r^9 z^PJ~A=Q%I;&cvr#7CbVBx40%Qz#>fc76Npln0_t-7}{#uiwKMXRAqM+_i!jS^ zHt=8vf&K~0r?Q$@Lf66fSj(0R6S-j?Ln1r)8q8y)ngGle=3J3QCzgwq+HGQ`aB5vW zjM?%Kyd8A9`8$@8*da4J%2@#{r}8a%t~3!g4HpSG!PCi~6qIF6xmAG?CIrD?=^$Uj z4_D;!{lj=gqp3_Th37|tdp+qQi3YT+X1Z_mfru0jyL;Z{6m$Q23trRCdE=byk6n2& z;sh80LZ&@lw^=&2|^7(E@)Nsh40 z?Bg7BHa0+DS2}h%X7)j}NbyHY;}Fxun6-pCc3vwR%{e2ENFkT~K1PrEVvFvcBS>{-mxl zdpSLlrtXfTSl_=AnSxINUA*VJ>FV*R#b=>p5=pcpiW3F}2#Jm}B*+gqEAX@~-s$m1 zhV;>)n4FuB_!MBB98Ehc<9+%OJ_qDx3(GbheWc(5h%`|-w_+xH*DSmz<_C6kn z#uNcE<_HCA9^h}ps$pM7TWJp71D z>;ukIVukvt^4PI(%zKZVbTvrvYB>0^Cuc?QcOvH&zJHpmAVQuz1Wf7jg-rfI;FpLST(apWPHC7mEWJ4vdzI z9GaLB>>}Nr^jFm9|8FXasvX#os_Q>lQD!`<8TeOJ@_H1suqSz<>}U{|CEJubuNYbZ zpA!Y>{xmi7<9YBu9?kvbR{MXbjB?lw7h=%9>DUsJtvk#9EcO7rkL@)WUE$Hn?O5@D zAH(lXdKkv17!LMeu>dm(ctddU!M3-PGr&oDM=?RMDRymeaPVkwX5!S0k2CYI7(h?8 zw)aESh1vCb1kIxmFK?9AYe#r?a3n0HKQa3&!?6!B4TF6Xk}C&U+t82(46V!$Z%G|T zYKmlxTG0hZw=t9jw-k25h!yO#UJLvA@WCz@Nk4Sj-EFT+p5n%g zyYOtMroak+7(#Dl|C8r*|Mvvs$Z%(~>A!m4IN_Q^=tB_%eHnhL%M9SS43+Z>wk{@| zBb!1GL}I_g%#(DA-j5tbGBA91JKhSm9iWTFEYI)E?yl*HF~XI-V+D3^A(d6m^QrAy zCJq|vj#-f%>W-OyK=_49;M^4-2Q9<98Tq(dffNHLGTTTb-$P2glOl6sHr~s*38_l^ z%4I4HKWoq#T8Y>Z_w?5DHywdn-u!z#wX_MB3mV?4s6~!3Js0hOso|p~>O5iLFD%jk$ zBw%FfoPmAxzdMd#0sj+>l#;eSRk)WMxBg{QY7S3=TKJ%aP$B*T zu~FV?xtZmQP0cLEqksGjlEm83M36WSY;u0Gmvl1ChP^T>%}IRMVm$M16n7qIOJiHD zm=6ssiJN#>vP6kwlwPjN6t2P8y)oqSK_K&FttlX+j8H@zm}kMJvlAJ_b&k(sVMUhW zQNXy3bOA=hAg8!Ia9UzdjX1IAv3OPy+ix^0LO{I~iaGGt(mVwvI_1^=kf0pvVz^oX zg8masAQj+KV%T={|7;KWpddzavu%zLrRy%mv=G|4SS_}je#-7QF&!~I!cf=_CNVNg z@ftY{B92GL2EnQ9hKlo&I@88tP>?VBn; z(Or+)}=mWWcwtbP4mMHMVW2^P|e)=!PioM2{Z=;JZ+ zX*!33v4_BJ)V_`tyu#te;#3#XRpASlJMm)!wG-MSiOdJY9VaHQ=C96e65-fytOFUW zmX%%i_qfmJh#+V?EPe+U>Jt6|a z=_N33Q($+z`F$s@=Vfogm_-=NKWI(t8d;mR;98ZzFlK-fgP+Y-3=Fu?P>Ucs51f|a zlvieL!n#iJ%hU{vp!*wGHL8gH!E|BpPcuLc2b^4n`~CaXU;Yy3r7e3b0h zo&$vjPn47%oi=ZM-DmZ5fXxcW<@H8Lga#npT`+)Ht z;=;X_9&jL5nr-vo6{%Wm7RnQ89fO zfSO9=ulHdQ>RqnmQaA*ek=PEtg+EUSP?7QrfA1eRu@|Qw->|-szjNk&+UYCh`eFIO zvE$~)LKsAvRSPKfe(;AcLJjZ?D+e>^=2zVdorh~OL)25(X;28JQo9^{L#ZqR{!9hG z^&(&Qxg3{#-Dmg4b6I|N(9rlCDqtbmVo-}2AB3%u#P_71VB3auPu}Ns(PlE-^*V0s zc}FkUUiiXWXGk1YiXpUg+_M6yp1TqwohsMt=-UW;Wd>@n>()$cwIA=3NZD?yAj z?04~1f-lJkE*L?){zcMqn$X|6zonQ)$g~dEg_$I;#Sjf~160T&;ZOO4UyXuMQ>0;p)f=kgoZ z%a9=XIb3i*FXdxCY39}a9T}&?aP`kTbbgw}dJwN{9VLRxW{b#v+D;gVy&e$V{vLVI zi{{9LoN$P6vPb+RI;IP8A1&n}S#DtX-)^}$;~okvmwWc%lKvp~LBjo)>jqwOAfoQ} z47@b)vd0p?Cyd)1OjNNHYkKGg{v+r5C#)Np)qA4)16C&I3?#BSMA^YDAd9M_}> z`!Zz&CfD#=RgszxiI( z@Caw#$iTR+h%!iYRRNzTS1wue3Xk((#*hSAgb-pyi}LtOp(}0yP=Wco5(%W%O7C`! z-Pn&O46w!ccT5qE{Tfdic;kDSv^WSN*z|+BYxyXAg#rPO0eOf*Fr6;1ULWFeowRq5*MMX{_v`sOjtxf(c8{q$9B( zQ;_H!WHsDH5bcxNK+L!{B;6H^E`b$d!TMiQ5R#@02k3yAq1w<4GV8i1lD<7<6K=wU zw@_6k^5wx|ZooJCGo}xEM&fh_Fz|T-*_}dF$`v56e~8;pk}) z2T!ee;v~Kf9bqZwCG@N0go%Z-HZckWi?*kv2&UQNzjv4EA~e(|Cp#_c&dpV;BpKNKQqid;SgzihvFK z>*RTOh`s`wvspi8n$Au?vIVRI1)8-K#QXL}N8DYSYT?lWfmH=7~rL-++6$%ZNWIU}5a@w%95!i?DFIZW$CuH7q<1TqFt5?qIGxL3p{!C) zYpeYbBR@~rP+?yLXTkgTMI@P&-S4C9YPmkGXEI_-^P>`WNXzDghpT$pOPRKR_F_Os zYdc^x-{?h%DX*?duEJjDFce}8m^)-rnn7m?MNx{MQ3^BZG%yli5HLgl5V^=qw4n1a z(@lDIWh&kfBVm9iBcxe+QF}5Ml1N92wo-z}gz&R)oVR|gbR+9F62qVvPlk$gbnPYV z5@jJ8@C-@F7#ho@STWs+Mffe$14o)z$JiQ)Judw`X3f1Bsc^^J!L~QCz)$~+WepHA z6I>Kn6);|4dITgNk{Kg$@P8Lm@M!xl8vaO&-!S?GWprbB_c~XO3lE2F5GE7z*p~UB z<&R|>BoO`};)Z!H1>g~S>{2jAOU)P^O3l*SLJx7raPqA?&Xk zKejZ;?lyb#YpnIsUl`-Vk4<74jaKGOrCk-9m!B5md2?ze(6RAcdYETs)-at`HUZXm zLlr72`F-r*Wp2Ofx3Sn}m;^j|7;ebS-A#!_iw2rh818=sYXCBL-S+2uLB=(S9J}}py<-7~YQwtLux}7r`i49x3 z(eM|fVfe*(%|16_ce`-b=K`Q+D3>r{2rm$!nFeA55YZy`z=>6gDzWh)VxI9t6rK}? z;qyU&&0#!qi|2H=xp)K*&)N0v9}&*LkR;w-fE_6AM=v7=Il?y49xq${2O9+SceP>| z;W(cKFj*NP7(gMviW1I9AiLATc#aFXeIid`;_)t<5rZSwWQ1SP#130#1WEk!!q!6< z;U#oTWfrduEr+h0#4(A3(9AGak-KR$#f1>nC&OtFFT?~kRlx_)SKwRJY9yIONtkUxD%)Ae7CUv27ehfWKkmf(BN;9okYPJAWYL)6 zIxjtu34adSQ4|4 z!85e#?)_+_xFK`J($eG%4tUjBcom7L89sp?xvPy2KAIL2KM6C$oitTgEK|^8!G_gj z8myd=&0f5d+Ud&fPup?DFlW^t&-c$%r=vp zjWI3fzv014F-g6;3^h-a=P$l={X}M@CDd1sA4Fnr;nBmzC6V}5c-INkeN~n`2IIy@ z;`eMLH4hmR21#=`xFwSDqZO1YxCOS^y@njIMHau`p2TZ+*s-8b$E2ue);=}^47afP zaUtGOnva^D+$*<}HzIX^KgI$>l|?8L=Ku=uZB_aR?s(edsi?T?0s7a}Y<*V%^qgrY z8~$2r=bgBpd=ujX>O=qba`zG3;e-O69_@^7Ct}Q2vf?Uxe~<<7Bc^KM@yr4|(z1e6 z4sl~>ImBXXW5ea7N{@VRS?&2bZc?xwCZ7(Eb&~QlDF?R@Oz}qt2MeI{5_jkMo$kIY-IMkhzuNgSratq*`f_5d^+ z@fM3knvN>fL9t(&B{#$wSml@gQZ!?oBVL6!pdT4ZzlciHIuPnt##|}=%9QaR)h|L+ zQ}92n-y2h%NGj_a(TUv1P9&^5kLfcd+eMM^UApuvvN?9XNX?@CGZNIz@I4qG3MD#`k$&3R zyBvH-a*$Z6A0$F5X)^lpoXTFT)kn_>pwTjoNN%A+XpQl zI9;o<(EJ{fSz&Kdn6Gu82w0}eBz#Rw;cFyiva)}MGf(p6a<`hO1QF)#{bn~m2MrCC zDmA@{fJ)78a;kb+ho>iwggg=P@Dxpuk50AIoKME@m@%}ZRxo9B4)1x7#38DXDv;RJ z=sdOB0pBgwXC5ix)9A~Y5~SE+klHYAqZlb_%_zJ{r?W}wPhuMv4t$@<_92tn2Fs}O z1Hkbo)z2yy2VQd`mL&LknJFb)jO_vL#_yN|FMuKAO1!Wu5Rg5wv>B!#gK%tH1nU@h z{h>LlaJ#NssYv9$(*U)eFzyt(!#fNEl*(<~UYR z@GQnFK}Leqxv=0<#m$joywe&;G&d5%OPTEx(sC#EtdMbcK#Dh~BaLb)RsZTzytSD( zsAv44+eD-}wIqV((Lgm5<` z_fc~HI-?1KxzZ8xym}JZ*GBd-C)6eL2ZRBry5G#hQlz zQkU+)yJq`1U2)EUo#LI(;OC2m;AVD2rns3I_|#?5K;|U_FU=%4y}}V{?!S;jy1tW3 zeq*KsyN*j=gPu&HA)4E}oMAy?T4HjT3^JDUw%2pv7V}F6z+zy?P-ok+q}+y$OapI! z1coWbKOA)X9-Z%fxGkkp&kK4HhRy#OygXc{IC=msyTA5hI#rM9@DnlF?>3|x8f zspdvh^CeGHZP>tM)=!g5kR1lB$?1486z8i@m3hhI7?Tbxc^a8g3>Ej=w*i=&;ZCJb@@0`ZAy!p3B>skX1i<{e` zd37Y1lqW}^6%=ia)!sG0Kx+|2!Hw31{H|?S(okCmfd&$ue}4Xg>P3sH z$2Tpm8<#g}EVe)gQn~rCyy7omnK$Xrl%H~6SUA36@#3bo=!6B)2^9b!esgO>eRWL~ zx?NmXSKFFb9gWs4jy5zcw$dtjhh}lbA7KIM{#^Z5&u`7It&0v&tyF1VP17ROFRQ$^ zuBBlKYJW*xYhF`*-l8^BVf=qvOEhmmUDKkvXv^&=LtcGDdtGf_w557+YkgD8qEunD z{s(7yg|VW)O_oyl|K;+Zn^)Uh-`Ljve^~xMJInv|^4CVC=zl_>Fm1bfac$nTW*WRS zLDY(}>%YPd{+g^keS{aoIveZq&eI<5ybJQGTbkM+W@E$Ry1a`EE}JMq;vfA}Q%g-< z-W7RcFQ_jpm~b&1(opWH-&xhbCBgj5rj^gU{wg%`Xv3m9+_i~YfkbA(&#~Dz+<^v# z*3R}+9c^i7pOn{7y8z9op6r;_BxGA%SVY$)$DijfCq!G?>LwuZti{!>txYuz)lo=f zoM@UKw4_%IMGB>{M_|;4Ej-650Dd4MFan=Fn;(7Y*w%g?BQ?JO&pLWfxae37KgaUJ)bb0tNCcsU|80;bDr3>2Y z6M^x-!lWF*JFX7|+jD}aXOGBQ4Ppi#*rp`M?@RGDWn|8(VN*utc4w52%u8fW8JWNG zgwl}(UmIRJvZ!Okw2=o#WPCAr(#RrUr6cpFjLZWq(o7kd6*+m>qLD{N%pJKrt8C;7 zd{*OgKR)ZSzKmpd;$C=&dpD5fkAk?{h`To-HBR346gYQz(z8J*W9YAjNkV}Ti*@oda;d=^c zt{^gOA&7>puvCF4L}84_<9t@C)JZw(#HC#21M36|4rZJWKEb&oHw42Y9|@L@>lv1Jw`}Ai zzbvTjgWL#aa_G@s1C z`{J|GDKb)CV&I(&@oWPztPtVI8VKSFkGbK8+$tBt1M9qw z#NND3zE22zK@;QrPK%$PhId$eMj9ToI2IrW9INCC`cKRE9|b=#P%wZx5csymOVaS~ z$o23*L7GYYz~b#`_?$O4_@hmFY&?SKKMEx{C|A# z?LPQRKKLOYd<6W_PC*F(w4XNrcxclh8h``{n?;3vbM z4#od0AN+D3e7X-_>4Pu#!SDCMf8vAp`ryy{;0J(9e=!9P9EZgH_&(}G?_h8@lzuMs z!KeA)e2dvod}jOLO+I+S2mgT&zRL$s`ryZW@DniT9ZLReAN(vIe4Gzn0G#!*+XP5v z+=F^?edurY!CQUsulnE}KKNQ6{Cht5L%_wZzD%pK<0pJ?^`U>&2Y=HCKjed-fY5xX zdf}_2hQcrO!MXT86g^)mIut(D2cPSMFZRJ#`rzw*@ID{>Mc~wbl?jXkGTwy#f9FGg z)CV7lq03O^o#2CCw{(d5;iOv1l83qT097B7!0)zMOQNv*fbQl_>MuD43RG? zBwAk|9jxoth9Ri2ayMAcrrIIEx+Oz^sinz5lGWDN*R~86c>es`>KYa-q{0W*$Ks}F zYqYMhvGw-B`i0@vE@~c>q@ktZD}z8RD>n=R8}1l_a;VfbO|64d50!Y)qUNClnm^e7 z>Y$^>rol>X^-)B0sO)No5*ABAgUeq#RPu(F`K?1JWoU4)8>nq*s%;sRzV;43ba1tk z1JDI<16=T}gcrH3r6D@FS#m{R(V5lZx)!v~Xx##Q+f;)XRn}tpevpXtK(O#dm95Qn zHR6w|=R*Rt4aK0T8RE3Sc_Ddgw7TY&%9@3@RMuBFG%DA*sI9rawtaA;s-0ikJ}BG9 zCDk=;ZHrp!7GT+K(B0aG=z`|j_GojUrmY1F`IQ0ViiTiravj8>vAMAtdmDWDH$|&! z+uH`)C!BUuOKrnqbOzq;i-zd!U_a3JHPYkH=St_GTZ`EtG|tB|ZDjyUkgZDw3*ESA zacdyjQczHh-Ui;arup^&7Aq^8>sq31E%WPYD_gNmgA1BWo0fA+HS-+k85(YF0}2CJ zu&@;zqb=?HPN(viQmkkT2%1ro6oGj+wpGrrYlJZ^YN(VYRBSUD%%ZWidP!aFg0>}S zR*R}pfNFM(TyPyM>7uql64WlL9s;Wk)K<4Q-wt)vG|87N+>#+znA;XNL|diPgt{9B zdqs4tXt*h3O*IGhj)U4l>Tb=#>K3dV_cxa`HQ#1ds})=JsQQCS`JVw(W=bW~D# zi>lizqYIH^?GQR!939-)x&LQie2`Y5t&46qCeO%ZaI0-d-5;dS#nrV<^`0%<*3@!K zE2_B;#cLR%!@C`OiM%eQ77CMnNp(Y6g1YPV`+vkv7Nb@MNp{=9hMI-AF~EJ%Yqcy! zRnZv5|IDwchVN6FPm#1O79wls{bj4IgLi6z0i|0!TJd1)jylPvrLG1|lkTszZgK4p zY42znoHjZbYg|BmlaJ@QO|J!WS=1bbQ2JKeVsjHsd;kuo8f|Mui)&c0xTyuvpiX3N z4tc9#aU~obs&_yF*lA4@lrm(J`AyMi)1rY1s#_K;X{}t`)(D@ab0%)#-`aSe1aLwmy z3fFuR7H7G}seJ$0;{2jao;=SfdZzL4w-i2J;h!izm@-V!56Ap75Ax<3rN`&*EKc4R zDm+i&crkE_e!RjjQn6Xy~2wWzEk1F3g4^nD-`~s#regx zU@u?ptK~u2wSG8%&V#t-b6nwCo{=;T9HgI&kH>$U!nqdf;rwk09;E*wJ{~?x;oMy0 z;rCcPUH-2t`m+`NPZeIG@Rt={s_@qpK1Jb2F+a?Ma%#H@Vt$eb@u~QDa;{dm_8Ywx zr~JD8dJFr+b$dS%^L0GZ=`XN2^VRjm`AHtcwcSovxVDpOg=_n4RJg9+`xLJ2_WKIg zcDq~Qy1jg$aBWvdES_G!#}&Pne>mpxc(A;>zH${_hI?MU^qoZN!Sxli8w$v$93PK9 zOW{{3{8WWcQ~2iZd~CuPgi-g}05u1&(z7C!ErcYyKZwJe~iEX2Xrhulb** zaP3dJEuNn5siTL^cZJ1iZ@M2@WpT=LEk2$ezNzpT3V%T1*C~9x!mn5Ob$AyX5AxUb zTdQzwZ?`C1*ZX+x-@}n!-f?!KHN771w>b0Fd@?^LYzFbkz>BYVq|={qdOxn^FHpFa z|8j-vd?%mL&*ui5dV2n^Gy8GPCzdxf{-MRw^)MmSPd^i<9{=ml?Z;;+{CSI~^I4g1 z=+pK2mc^+bZHH6G_4C)|eS<+24$|v#-C#C&4buOK7Ye!Hy1gt^_;8STDf&9OT2LVNcFc7H4@GdVBb1El&R26X@X~MUSPM6h2PTS1Ejg!mAZNN%7Ho zt5SHjqHj{T*4qk;r|WH%#nbh+R?%y{eNW+9Z~v+IXubX1;^}&ORPoVzdtA{oH1PDf zSJ77~{NgFNz(M(S{9I{qmUk>Z9-jt9U!w3lA*EqOVu@8ii{<-&TBdd4HjB&3~)K zhk-X`^5n@a!vzlFBk}R@>lLp3!(A3wNfcQuKP9yItYB-k(>vuCG@Vey+;*LxpR5sCGewgZeoSA5YG^EYAAMz{fjQDEh?! zJ^F;gHJ|4#PQ7V+dqv@OiqG2?XTFrl<6q5S4hL~R&*L+1IxcXe z+ruv{PW~hC@#ueWHK|RztHHO2Z?Sl~-hOLwPj9@><84K+_4dBPwcciO(1;_wTr~>U z<+{h>>E-&K#na1mRPkv-tSvobu~-dQjnC zQTblU!7vWe>wfk|g*W4#SKj#w*ZuXa3fKMeGK*7hw<Utk*aj$)Ow5XN!ZrQR6t3%Ko5FRyJZ*96r(Tuod4=n8y`uQ&d>`QC2oCbm_WY2=)AjkJqHjVP zPoEPwnSz6STJZ7k3WbLhUSo0cXBv-wwZca#{68#C{p)t|q@o|8=uhC}1rE{|;^Xnp zR(P$#PgVFW3je&qb-w2+T=$y~Se#|j^>QXBJ8)1QZ4c)vyczdAIqy}twuf&jT-(EU zEzW#zReb(K(SJqZxtwIdkuJ}f3fFeBRN-14yqze;N6WL$;^}($fuh&^KhH@79HiHF zdzQs1r>6g^558RS(faRFxaPmohtDr8PW#k$^`Q^_BuJ%~Zx$#2EPT9r z->7g$;V&!vB!$0capwCag&(#!^VRbP8FK*OAiW;{o~&>^{yoLwc`l!OSeiDkm*3TM?r|aiCieBsIhYHvF*`WAn z{XA;%bp1T0_-Os?RrIH*ay_f)wSL}K^jbeB&qZP!>2_71@KbT$)BlwU*Ls^{@pQYY zw0OGS8Wp|PTU6m%Z(mh>wBGKsc)H$JDLz_n4=DQ4s$Bo3=&Ka|bA?wcyw~C^*8o3H zqrpKvjK#;(TcHpBMIZbIAH2rm%r~m|w<^3w;mZ^s?Z>(ly_Wy$7Wec?TjBA2Mc;;N zuUtP-c(KB_S)6)UqVUHRuI1V1gTJZxYdJr%c)FYpofi(~dmBEUoTC-4^DVbH`3zU| z-3r(K{M#0%{&l?ip9*hRd|tFTvGMt zc)EQyrST^}9%~h!J8#fA%>FxJ=h3ocPsqm%X z<>}!oKKyT0^tzocQ@CzNYZR{A?>fc*PL=QX6|T#*-Ur{I@MVh66AIUSp7Oyzws?BG zJBiL62l2b`@$@rB;mZ|%w!-gL`1ux3x3|j`K0?vYv^eYc9))A0ogC?WurW^#(s$tF z$@y!AcPf03!nJ;qiofp1KT-H+6`#*n;Q|Ns(}jH7Sc;-mGsQ_*XEzO3lAK3`Y# zTAv>%daZ|y`ILUJK0^xE{3j}0^Oaxd>-pD;Uh8?kqStzOL(ywJ|6b8+{bbT9<4CvLa}=)mU#f7; zr_AER!0U7PczO;idadW{6t4Arv&E_B<%$m;w~~YS-3o8EIP=X=__q~4LgD{mahCTU zg}QsemJHOcC)Q`6FnHFbxwVmIj z=)Z=0p8R(y`g;}rHAS!O{2vs(w$JbS;EyT%Ud8_@g=;>)wK(fn`;!BTUfcOWg=;%M zs`zNTJ#8Tvi+cWihhNX^Pd&2>+2zl zv%E1y|4WOLf0n|ZQ@GaiTZ)fv7bkrMiE&VGTF;{_p04Lh6}{HOWJRy_99HyNKXZNX zI~1<@-=}cR=btT3J!t>`FN$94`QH_;^_3U;_2o6Sm6s4{V|2>@)mKi3P*aqR9QTo|9y%+fpnhyKUMVk z3hz<4&UaKZb2ar9!neogmkQT*b-?1oKs!d!e~F7aI4EZUJ|3TcRJi8DE4;_z zCj!%UbyU&kDf&)M`ru%`+CRhLY%khxtW)&59)GHE zU5{H8uIuq>h3k5JP2sv8KTx=?#}&6jKpfOt2p_M!`E1NMh>yj`!+))C?e{X-m~o`@ znXPcmr_$ookM?`_D|*fU0fp;&{H4NmJKCghP5*m^e*<}Y3Yb$%Os@yy1p(}xUS#J z6|U*OXmRq_?eQib`g;|w`L9&C=D$bb4}+8#zOM`9f5?ZsU#@F4tK zKKMgE_^*8M-9GrMKKO?|cnK%JaHPwBy$@dNgD>&Hzp8Mp|3?%aLjIoqANRrE^TC7n zi1>r#Kh+06#|OXM2M_z;y$TL z?(EN3^S@5vn!Zutn*JVzYx?^XuIbk*T+@F~;hO#@3fJ_%Qn;pnQsJ8Z3QmIH$izp} zPqX+i;JRM^&4>O!eCS`YIQ^22Z!hJf6%OJIIX!!xtne=@e1^jRMd7m*{;vveSNPcq zUv6=hSN9{|@S%Uv;?zS1K3+faw&J7x{HH#A!uKLEj&weAEKYeepSLZZuD5Tl5H_MW z-EV$2){pD>Do^1$zH$|=;C8|h3o$4HwxGN(SrMs8IE*&SmA>|VR6=rw$I-vT-)aXg=;&1PvP2b z|2;0^46>77S)6jN!^f+a(^d{mf04!0>94go<)5nf+?U434Hg=@R5S9k+>dGfa@yjI~WEPf&|o_h3;TAX^zQ~1bk zT;QOb|A>!AKV9Kk&W9DgP|-iCaP5~q$Dj=d^VR;j$Oo^sc)C2lR=Bp$7ZtAUFsX2D zw*gij4)WLb`3;Mw`?2p@obrDMA5T9=edtHhS>Q;gztG~$SKDW$!v78TJpT0x|E|Ih zSv+0N3_2qm>G{sHcsl(eANv1iamuOX`I*ACJYS@xON%Jc{tMLe9GeK^!qKIF6YOJkCyXP7T)sLa^@*q z%el@6e^udQ!OzqGn--@$dR#D;Lf~MzG<~5DUgCpa>w`D@;CK1p-9GpOKKMgE_%D3$ zcPvglXn%Vum5zh;crHGk-p;dlI{j5Xc%2V^kHx9yYQ_H_ES{e4c15r2Wsl;o>v24T zX&mWt-W)VI^VRnAdfCwU8}o+76ZZ^_=NVY?W!~N~#^y^*@G0ib!)dtpI|&!q#3_0@ zR~$>zaPPhNfeCmGakP3qzN0PXd!cvMQrB2LAzIfS4NR!T&(H=Y%x`TCOu+kXaY6FJ z33v&&zQkL)&87D}p{6yO0(rsLeDgK6co}S90$zk%HvvCZc%i(D)?P1I+%}=PrHSuQ zy&Y^QLfyj3dc4rI&XnZ;-~T)$r|O2Mu_>|Fvu*u*w{yG``+YjTX#*wp+WV?{%$(hS zt@(EF#eCQ{c;uQdX%oaV?6vpxPigsjxUFXIQr;yC?ypm)P{_xR=huISd|wPrCk! zZ2EM$ymEW#SxoXwPruNn-t^vSmWkMe=*k1@hngGw0_2WfLa~cuCq$q`S%^R}BmHa}46mj{R3E<0bv) zC30Enot90h9!gp?P?|$1wn{#6`LkrzlB-HH2qM@n?e(!xb zsNC4b&}w|wy7A0&@&)J&6@k96$E_IwBC3r)a6iZUq4=7B+tuU7HoK0y#qHfc%#HPh zow8#GKnFtnIz22WG4;56KgkSDMmi0DG*l8Caz>SfvgEY1Zv@5O+8MeW+0Qck%#Xt# za^`{RkTWL$`qVGh*W{)|%Jmt8M;?7_so)?K7bjMFCaGmu#sDT1^+_s9u z1&_JKPdZ)MUkC&u@k=TA&zZFw+Z~QCDGA4~al`R1hR0vUWV@)YA~&`)l!dgBM5xa# z{=n%PIT`duI+HfuE;)yxn0Ns>ji1WoPcUT(dALaKCNj5DnOSb}Cr;P-MeLP|*n#5@hgRSMU(503COSjcO4WBt9nZMV zjkC!Gjz^)0_`?Fa@r|J#U`F2^j}^F+=7kEJt^-A2fYTzUYk@s2ak}EfWnn@^*EhJ!P4z33+14uJw-)okSpYY)@zFFSs64_5bk|F!;Q~qcH?vA zL{QB9irA;Dts*yLMix)9a2HCP2PGyhc$ysCc#a!QU~lLUIIC3 z51ygtTAoX#If zLzCv86A9(Gv1i;p?}iggx8~G4qqn=guV)ta)H^wuBi#5((Nw)Nr`H*k8FV{(a@^vB zZLcy($Lq)3#8t!G;zQA~tUx%E92ln?+;phanUnd98($-dX~vrl+S=$S3QFZTou?rh za=TuTE+qC)Cx4HutFm$9QC7P#o!D0S_NqU2NIVz()WgEvP1v*vX@+!YP!fHb zBr|DiRto<|SsT)-irlX4blf?}@?)p_PBeSB_l=B4#AP{UM{JfLC_GF@i<(M|ew@j* zFm9Y2Xgl!$?d2RKcZ+vMFL67PLAS4mFZqVM-sX1n28o~U#$J*vBB*J$Pp9ml@FV}O z7nYrhOvEB1vBMxSS;dlWLi}k3&X6wA8OnsNX3UD9(PiN*93LIhQkBjtt)#zYaI8O8brBNZTtU?05slFl|`4_(*iL8{7s{$lMAum{;~G6%G%L zmXU?ZcRFj}`66+26A&ZzE;W%@YswLO&NY?DR*>r^tP?hsA$kkPo~wu*vF_P5-HexJ z{1g=V6f~7hHl@{xm+$NJxW*;)b%t`GIC?eluK68D&_Bk zowrEWC586%Q)9Al<0rWpQ{Y{$jMRkgE{lCHG#VMZUB{!@!ZF;(=rmB#_1Z7^?Mj;( z29j{!w45v;;n=j?uoM1`)7@IYLQcNPSUOA|HfR)F?=)S=)JRjnW-vW5`gd|28v)3* zw`NdjxXz+&hhvo`Ztrh1Dq;(YO6BF~)D~LAi-={Y!uE>TyW!Z=Fqfu0H}-NQ_9mKB z@GT>B$J@cSH!ETvx^bitUE4Ti#xIzEBw>mv#J1wX@!4+a&v@79HKBWljq%qo%nzp!#VbRc>HWc7w_6UgmaF`B@+9{X5sODM9M#Y znv2|~mAJtn*^9BmKhZo)RK=tb-WvNQPEPRHHX7-2laD0 z+D=Z{heslb%+t`pE<;0wg`9;{Zld|P+i?ud_EcWQ`s$theUU_DPZm_W=e=tZ^Ln%3 z#b5B+?dVI`ZnF#Pow-k<>Fz*XWEY}Gf*(KD_L3Xh>UQi3J{XLi9u6Lad${<}6lZQ` zFWPT5{>?)}9+llYAbw;WKrcQDGZiwRDoo4uuMC*AC<#6pWn7END`OwVsFQI3?9=j- zBaYxK_J-U=b<#7V1MSn-@1be4C*dJDuCwj6=?Nc$FAXQAu_p|gDAT!S6T8LeHC`ts zPQBONlME-K&)6>UmCVAu>=Hlg#@FgD@l>~C6I8i_UE(IU<5jrTJJ2QWj-D+>V7kOe z@Q8GY@PeJDOPqo}@rc(aqVFt;S!*;7%8k7#W~h3(l~N8ju~EwBnWL0Z{&^~VCyMCD zb{*&{XoBpa+<~r-O$e^fL~ZE0y5A&#;Kh2LNaA7f$r1QN4*fa~20Qi#S4dE}l>YEt z$+RN&KKyY69aG9viT|=a7V?GvWK00>Mg7>)AzVvLUaj491b!nI+!zyPvGN#Ab-mzp zR*ne-mc#i5oX(jzbvtk$@j3px9Y-?S_F0w@_zX!e?aED?vO3+9 z;JB>DFaj!a86>3yTgs^0$6?!E!+4)j7{$RANcYiB1?FGEZVko-A>(K8%k=bdajLHQ zvcY7>q@c5A6FZ%M?LBcv$DyF}lf9*}&z5$a8!Rm@4>%9>I6vu$l~e1bvCILTyNj0K z!Zu9ygJred6Rg2dC$ z;yfJdaTCjea5sO)(iLtG?>T@N;%K;czX=ddgp28AWN;$lot#K%Mr-6L{o6Rrsz#HF-V&Rck?`g!FjG`0q z7f0fw7?#JUWU(|^C=F?H`EA6HfLRHXq=uLnRc1xvh;J}j3&;L|v?UDM(8$rug!z;? zJilLOlq(}ns3rn4E5aR^&kQ$yU5Ohn1-3H8xC1@jj0jTZOG+`dl>9PuXePB3LIlKI ziD}uCpXUYravv&la!`7s$vEnVwbB{dE&44jNkpzZ?#3PpZR0iY4U#2Gg0^GMr4T(h zM~?w?pQ;(u0MzoJARJMz2^C4soGmFqx;3F~qN<}4Fu;l`yP zGfcKw=(F=*aO2mDEG7LVBHMjJgVJ#L{!nO+TrNa8O|JWSjd27``|8BJO<92=H!dI*fTGzFL&}^rD9&C&n}A8Y~d)kAaUpM*a2rf0)&n&!RZ*( zl*O~-H6JS5Ffq!YREuu zksHB!hM5ueZgy;j3ngO3xW)5AInfI! z*o|81aYIX_m(AQ2TKzZCs)+$b!)bUi#Iu| zn#Y1u!o_sNo^WiZk@*H-(-V;$SrxJ8=y1abeBg7#!R?R|p<*vWpqamiyWLgqdSpxy=*j}P%YpSaRG4$-a-<3rH-_4sRYyNP zejJtGUbxqKHO!6{cS^Sct7FjPJYYK5o|BA&MqkQK6>d)4LC0Ca7~HfuKZJ9ro5QBA zy-w%$JPOV3f*t$&Slz_n+39>`JmGnm@rAid<9OZ;?t_k|BNo{NCC%NAqW3~c@{J%6 zK_O-c;0rJVur1i}N-%ngSTejo_9paxmj1o%RuBX+7{HvrQY3*^5P@IU1C0bQbJbZP zQi-!*I6Mb)ZEk!jyznJq4&xAAq19|d5rCFpN^c8JQP*WTK{$Y|7-vUfM+Z#Fy;D~F zJ;|xbi~f_9Qi78!J8aG%0%2Gq5blXoS}1oH&6PT;F0>={Y`MdH&@^06$k_+D9guLN%$Jf_5{nktv91SeM83?70*w2Fsh8sv zr2FyZDJ=Go?Ny|Mk?xo}gfg0?0!mPj(N~hsZd`xhER&vu(#?_kk|D)-1o@*uUkcvH zn5xSGQU*r!;H0O3v4g06dSLtoFyH9n@(50O=_V%ThzW%gnQ+(`6EH<$;-|QWl%{2c z6J_Iq7zy+KJ}@@4CV&XnY$n-;e!+}AfJx?R-s#~TwvShiNiPx!q4(b-%?p7e=EbHb zGM_fNtqk?pT-k|$!HWim)q@EZB`RXChhvX%j79nBK*=4M907efbb(|>sd}=K8Opb4lYtui@G_8G*k?} zA{bS%s!&Jn_|DLB(7G9&p>_CSM9Zz`+F&PLu>OkHY0CkgOAVc1O7IGCB)W)u`^R;l$`? zcyqtp+~;=u*3{ElLeqU;KWX4`O%^)Z~4klVN;Zek9cy)h0JcRvZht%$eLc|tq6 zJVlD-@|_Yp_&klFouIh+wV@f7(3S5sp%wVH{Sl-pp;VFB0nB9?69kq=4Bx+5F+Fs3aC!UAX*=ynRA1-jDUW(>c&4m+JmN)BtLhr{yM zZZ`w5CC_P!By_r#V0jpk4DAgg<^7lrw1ZI0#)GN=I2zNKXPmB|U@_ONY2B2MMU=wapqzasw-|u?G zMH6ER*?z<@VCJitB^qAh0;%a-UIJb&@HX;ZCs1c-g+NEx5ZZYPO*|+N+>$L}a0lvk zn2RsE`K6&MyS7^vS_tYRpe~I)#kd`-mbP7#Cgz2XhiiUaiZwuIJ+xX;^9Q%)g-KW} zcRClKkD6q{9H(Earam}iXC(e0F3=fVf#4}~D^4(Jm@|2+ zo5(x~vjdcL0|cJgzSiJjy1t4k(H>k^y}XD{apk z%XYe1TQIL&Smzm#%}tb@f$m{usEFf{ef;+<|NXim5qUa`XIP$|8Jbf8M_7?q`e_yh zDx+U0>_NEyxSa2;NX-0D&bISbkJu{%|LhU`KRST_b9Z8mZHHWD@Dh=2Y+h^l?CMp(1&~ zZrdpi!AGl@-@A?mm}|DGuXIMldbQb}PPwOHp~W z8GIMXHyk;>p>)j9CNW&<;Z@Cc0O+qERRkDKH4^NhGd4cuR;%^ulgJ8DVBz*iV%|q^ zB^cdBf=@t?$Fi(_Q5l&h*E_SfQofToObHkN8dFYa!O+M&r~s>yHf8{Z0n-y^4k{C> zp1nnib*$eHZ5P8^DNZ25zJbN?+#tTC35%HF#KbJ8n~#=QaXTd`L}cEWR*IY!j3j1$ zkQGi$-i4X@%_v6w1h0LI+$ZsW2oq-W9)s|XnJ;^#?YCw@u^2&6^dfH)0h#8z!DDU^ zU0U`e(Tf}0!)EXi>L;^LO0uiJBpK)nQ1C|}AevPH%Hec#_X_wFz=yM=WC8c#J{lxX z11zhv9z88F((v2V$)y|#p=8FHqb=kHQ7*HdH$4&UF&j<1D0Gm2?+P6?&h>ug0WRWo z&?f0fSwwnHTrE}r5=|8RX<+f$TAq6A1&1a?m6cu2$cz*vEIvsh3x#PL)o3Wt*A z1M*rN8{^YnV|3=&W|#aO);z>tI9<=b|rjL2H zQw*tE%v-Q-5;N)DBG|={n2a_1nY7^a?wfX5lwQZlnMnQ!*aedJqX+XcqGDGtlh`KY z`7B(kI}W8qm#T999Fp4BvrmE*Ok>b_%|UxPm=#Hs?S>R^yEL^zILs3INV^6-hD*?! z(QZc2`C(dv?FJJuZZRgQoX%f~-pw2Xczgj$N834S+s(dIyLndH&DLbM(Ax=4XZ;?E zx>||4827EHm-mZWhW zi1?z=PE5V!vc(49XG?_>*o84kWwP5S4s)Dhg5i(YSf8xl~={z4>7fmzu zy4a`KvF_wQEE_#+n=IxSkxKekXe$Ss(N;?E&T_CZ^UhxM@>{*BI|AF$lG*Jd#A5xx zj`SP(>?c@xA5lzJ9_bb`Eq02m+C`f*F>kSnh@)*0P8#Mzi}|kzPtdY%_TwAfCMFP# zlV$ZB0EUhcr5b~7JSTG`{OZeW*#ez}tKZmmK9c<-mwI6L2wNq8ln>udXBa}zKK5Jb z_Tihc#cr#(nTTnog1bzNMz|Se9%kO4wy99tuH;FQT-vHEiD5UJ)BR7sCC@T$N|31) zvmL?g1M?R0xC)=>42{7|qig^&!@qEBD>sB8bdQ8Eor;xFjMCu+F>Yb&&qJGgGK@Bi zU}T4j?;N-H)e+&0(IGcJ9bx(@?nl@HGkM3<_~;*zMQ+EYAjS!jiP;TvfL_Io&q5CH znA{8FtS`r+EhhuO+s&ATU0~5NsJy&Z)81{xFHj- zNMM5$)+=Q`&lzy&IP>}BcrY{`X$cycY@be!f^UK)(C4#2+we{Izyi^T6i-i#8Rd?{IuE*U)A%LE!6f!h zkYk+#yB;qeWpaIx3@}rK#XF`>lwqy{W8ZavBZ-+WhLzT8{I6{bCBE4UNI_M>*S>5BfiP^C%`x%rY2DE`>=<%%F+F zCsMR9TP#;~kTcd&=4J0>pWvkCg z0Ton({XM2y;0T!2J`{>Gb5z>ZT#t)UH96Ub=;^S(ZG8`ow1jMfFOjo!3Ye3~CE4Ud z%*5qg> zG-b#;aTrn|?ckH!}$K;d3R;!{#uawIg5LTaN4_v6l#6lgR!odBJz}fD(bWabH}|5=DZ19mt*TQMhf~*(^Ne z%!+D;4dj0;Ch1uiFWv);V2dV+h3J=ZD8*{9Ao30g$rncY5~3WlA_bEK8OMIs0E3{- z$&~r0!#EW~(}qWD6vLA-4h=7_4HE-t{%$_2Wg$xi8)K%-kCJe_*GzIMDU8r}D%{*o z3F&bcwg-$2dL6D9!%f^Vl=-1X57GKofQhr}A;x21$*VHt^B}(6al5z!zYK2i2#GpR z!Q)C{>@~A)F}2=}rQ4hWwjo;7fCcX`HZ#HaOf(@r@nCe6F+S@>wM#rg@ln`=6kNH) zL9Q_QxmVEXVyYUhoR6Eli$$qW7FM95XUm?q=$Q2VZZF9i!>(lBbL_4ARa9TcNRpsG}us-wr!c-emih7KRSwM;~i5(ncuPrM4ayCqly zoMXaOtZOn-Rnf4Ukt2KuM#RVkVhj-r!>#2rPR(-?=Q2*^(f|!EhZT>8Si)~kTANrj zIr;$Z+v$(rymb7y@lChEB4{=TLCxkHKrbO%BCrb{UcU+kL4S-EE)hW_16ypr3|}>G z7tGHL2gU7TNzX1oV-7FJ>AV9uuvTV}d4Y&zc0OUSj9HG+i23mp190hIQGsi%z*}J} z6U7f#F%H1xJb2qt**lWw3Cm6qHTf-slH4jMVJy9B^5{NOewHNJ^$stLmCVBsq>pCC z&3#=i;>`oRu(!eA>=$H6nUB)Lp7F5{QBa|Ley!FWpD7QtIbCfMuwwlQwC>%H@oBi5 zZpM=bH82hR0VHpxI0-L6jVhkHCn1 zp9o>pTJx~%LJ7yGWpSaHo4b)M7-N5TV%c%_7LgB+gyXlBU=)LWaF-D&`}9afA`_P0 z=Z^ab>(JdDdr=jU__ z5=lgQ5!F63-EIee2eF^bZX*7RB<6jb73T9) z{+K~HHiC~240^->j}~~389<7ryyVMIu-A^_v8k@ZQEV6dNEBVctucA1Meli;)PH9=kNuQFWyvwM>v+1u$1}CJKXyk@_$EmRz^76h=_wv2BEO8;*mNl#(|39>!sNH zR=m0G6|(}tk*yKsdwoh2$t4^g9**Cb6+h8r9uCJB_vecFh`%`3eJWS8i9LC?&Q;ux z-NG5EIV+_YTLnR^?6y~@&;}9aI?Ca)#8w5|@swwGnBpm@Ps(CjBAA8bBPHmU@f@BM zms1}FWmt$0zCne!!JWki+TfG9DnkZFCwFXx>0;-Un`lLSVplXCy>hy{v1)?acUE-a zgf;D~$F2ozta8eZ8s^xU3|H>58*AqRZEkrXx>fVQ7Da1kKpA~mYf|Fdv<);^-(kwS zv#Ru!)pzj48zv=!BeOh_`C2is;7*^LGfZw4n%tz>4`OaUi<6OagI)*oQ%0pN^!YGf zikbmwC;2P*d`B}CH#ueY@pw|AU_5#wh8mfz!9TrnnHT?Wk5;@q@CGb+kQ>c0->AU$Tk_5D zDjLJS?eHpe_kCYQ1xEI4hd@7JL$rZgaMQe(_6~S4N&~LoVe|rWcA=GBQt>Fh9T=ap zYhXDTnuN{kFRLa<7Gvr(u^C$^G~RsSW6@};2|de!qXA{2#4}MK@HP|WWEUlFqIBUk z+`tr#vLX`&mPb=(ItdpEjtJ>2LvLuHbTE<~@5sc%sK*u)>s%Ad-i>3LQ0gMQR~b0f zpsuws8ss3c{j8Gx!8PWU(Z|{+|CCScB>s@5k5( z*~04L13%;YK`T040o?zPOg7WWzSm678=gtL>9}>|EaDZW%NRVL&)X*gd5iKr9bb|6 zccT+Kd3(Hn(Sx~sLOKG^K=~g+7ZdMDm#{(~fqt>+*FRx_@#mpm|5(q%1E-^EV_*%8 z88CRqCpxqKkXuWnwP=26G4B;lvPf*UT~DMD>nye4qV=-ohLa~vYd&t;q}YkEqVCR~ zWD!ozZL96-YOimu?M^ntmbbU`v?foSG#Pv{Tpa1_kw{}FzTfoPl1Qh!J%-hpmNz#f zV_iMXSTL$38Czc4(v$3pHMV!gnvz{z&9!Z@=C)XUZC5hZ-WY3aPPR0}8f%+ddODLa zN;q7;zYA;R$c21e-)Z-$$NlHVM?dy@B|fZ=OuV^c)ErB-_f&T@pW^d8*8-WcvX{FZ z-R@Ii-V9foe>u8nJb3>8NNf%N5Z0Lg!DA$H+T6LbV})1&YjUilxM+Hju>!lkP7K7X z&$tPD$=XaC_BNE|t}%VmgbD7Lwesvp){6YBj~p^KcRh$#0msJ+Cfqs~hdFuq*N&Q( zH}RV6cwVeOXHH(>)uYSvimw_oH*eP3v8Uy&8JE2)D{tMnMS1JTotAgqxU=#$j4RLE zIPQ$Ro5wBY-9~#7^Z6?cr6UxvuiLN6oDBG35T1j+)O$9n@2f(q6ggZ7;`)*QWn6c zI@}dk<}SXwM>r@FGsnTd6U=GuFnNp%1^v=NQggO6 z{5#j2Vn$dXTwt!pMmhrcQgiKV!QjoLIUQ@;jX~I~S8P|K5)h}B@7PFuC>-g*^`TO} z#wLMXfnR=rmY4jNX(W7O2!2xterpK+KnVUq2>zE4JPLyzNzQ^0yfg$~5Q3ihCj`GE1b;RJ9|*xmqfs0w zzej}N#UXe_2wok6w}jxI3BkV>g8w)Kzb^!THUxh?1kXbUVkG^1JOn>61Ya0}CqwYn zA^4X=@E?WXcZcB5hTw07;D@0J97zvTLhw^U@Uuhk#t?jE2>!1j_yxIUmt@1AOznMz|q{8@I(mi9yDs~ z16EODE|#KA%q_v9wfLWI{;?b_&QCD^GtB>S=6|O7FE#%r*7RbYPd9fB;dH~s#Gh_> znJ6dtG$S>qCC;2vo~Su<{`_<1Evi{mJ|{7+CQ?&V+tRYErM<4UrKal4ikenDw?$fk zwbw^lJDO`Q?QU*O)Yx)`^f76}h;VH)mI4l{rJBSGUnnOJip;S=Zjv z)_`K^C@C%;ELyFo64N^Wkg zUDlTDZmw^?WY|3{&D_Z9p?O)d zy*1h0Is8r=jXx+=OGis>S8Hu&av3u`?C$c~`ktOvcek!{wEE!)r)$`w0BIEI5>P5~;R~pvtZg&UGVkZXPK+T_b@Q1*%UbJDJ6y8g@fN!|=;6 zWaLdP7^k7Jv7vM2uqX|!Jspk4*oS8I9bJkYnF6msoX*CUAU#f&C7S0eSpe1QCMx4=rr)f5Ew@|C!+U2tR}0FSyb_;&95taX8Os zK=304|D)h4|6788ROpX)9U$`O7?$VXDR@lqp9+4o;BN@7=@#HQlY#tI&XXNZy-mU| zldj;Zhp!2rj|u&E1lM%AIt2sMEx^z7FUNBr1JgYQKaXGSaMCNEuL}Ngq5q!XpAh`# zf^#g*^Z$dxgX!|?Mh2!k89z_Y=RJlX{TX;ZVIVz!o_>|XNw4@zS*%n)ULko z=&3%6?D^j&d^mRL@y&uO|2G6zdB)@UfgzZ$i4JF;rs3!L*9twqUh()U!HWdH%Hcuz z|5NCX75X1Koat&gZWdhap&HK#45Tl{&&$){aGx$|7*+*vSFDjDy%kKkIqUld%+_uGPNIo=k6*I@cN1LdEEpD&k-9Ujc@ zr-feg`%R&rDtvAbT=Vtcf@{9+75=LKeS)k1Io!<8v$k9+>6SR0`I;^GEQkAY@%cS7 zg#N++y%Qr+=Wyyr{n&p9AHGxd{2vo~)x#d4SAG6P=uZ+p2Lx9>W9$n(Q;w>)V+B81 z_#7|zDT2=toG)*^{FQ>23BFM9a>08Y9<-md&})9bEA(@O&-Vq_{5~XnG{3(Qe6H}B z5XA)o%biWM&)1oPv+48rCWq60Dg=Md;mnuTuQ6@_ko2n0sNf$HK1G77eU=M8Pw1Bj zK40*af~&oKLGaUrexu-V!S52hQgE}*Jg%9q(*=K8=+6+`Oww@l+V4G-lQ$fmz|re@ zp5WR)zf$ljp}$J-1%hu9{7k{O3BFM930P2qf%!TMKQGVef}bt;*$$`uu*=}-FA$t< zj>qc-XOrde&pVvyo+J2YK8Onh@;?|qPk)J-17>l$aF2i6;pC(B`eDJ#g#I^zYdvlH z5Qq@SXAyp$|9ZjC75ov02kn2l;J=$~PsB9Q;V_<270#}c);`jfce>K}Gc2uH8@$M{g; zaOHE3;7b2>hf`ddl9%Vlf~!7%DfmS~|H+xSKnUt>y2FEdD|I;2t-;Ty`{fWmUkl-L z$MH&UCe3@mrzS{)u^b04?cB;`w~>1Y95x*M9g$!D;fI{yD)l-QPQ$ z`5lt(EC2{zZ=TO59nN$a)#K9zSN;ihjuC=#E^;{e^PcDPHKEu1-WY;!a(K{Aekr() zo81+H?-ZOa)64Ta!IjTpbeag1UHxH^;41%Yhf_}FUoLnI_k6nX5d2KRwO%v|u6(X{ zcu>xt39fS9DSTAU`vli?4`t^MA;|w&!Il4s4iA>s9Kp3eRvChyBe=@hEV%O7=L4^fVf z(pNd0`sdH*t0jc~a-p9l^czFyZxi~ZLjU^^`XkFgguwi&oD0i{4#(G(8F(1|PaV!Y zEyd60>*s>2oosiw_iu<|!oy|u=yA_yPXMR93@?|NgONwu-?to2dDQ)@pJL> z{LdGhs`B{1I-Kd%3jQ^rpC$Nrh5laz|AEk}pMOf|rwaXU!IjUO4yS(jDCXrndJZlS zh>yq5PPMELZPo0`lR3ug0~2tV!@M4L-gVwtH+*sJE#5A z7JPhg?;pZ37@yCoLE9&N$65RbANL;5UfI0*a~|0ijud~Plm7=w zjPs!W+me@dx3|6by{l)QaKiiEyL$K2gF=*<)3V41VX@`sSEded?`mS@=T@fvgzc-( z;rGLzd5K?C#_Nyey4Kj3{)|vhs_t5Rnf}VxSenU+m-rt7t9WT_=1=*t`U2u(Y4Nq#E$wqF^N^T*6OT_Ud&wFBr)zMa=GR8t=gxKuws?9*0X{Uu$AMUR z!>w(5wTXwtJhBt`CXx{$b+!@1{MkI<6Wi4v;b++RL>3D>;9KmML5WW=J8YI6DfyCB zJbh9@h7H#;p$cWWlo}&AzYPD(HflbwR*GAz7yB&!CvKiA8Io*TP1)RMmaH)D)8((e z(CNlxE?ttSkNFQ$(`99q{fUAs%E+&s3*)6&n42G&TYk~L&AC+V!nj+B!G2sFz3I{T z)N-?nrrTv3S{!W@;Xkh~!x!%*WHk#cqkWt%j4i$1jSUtr2w_uZ*lZp1p4bfL&*%Z0 z#+1dex`xdgWH4z&`)f;zvb_ag z@+ZGUDJ{f~-*NuQe(P*Y+>|pH9T`J-z=V>z=KAuP6Ga8Tq&!@x(-b z1BHAM%XE~d{)85BaIX!n>GJ~Qt;%}SNL0Zsa-JzStHtff$O|46dZ`t9KA!wCYpXl` znPLgmE9Gv>$i2+SeGx>qdhKt4bYPDSy&$*MtI;z=uH=sI%tGq<^3-e4FPFT*vK|Sy zhce`as;#_(`gQVFTY1x17UKQO+Y*p>iIhe+Pfxmh9xl@-MGcmA+=>27kn)@K6onQtqV#H(@P_;c{OK=Vs)- z3McO(H|mL5dI#;%NOH$S?lLDgmJxdIa%1%)sD#2pIV}(#a#s)BjD_T!+}H-w>-#_8 zpp4vK#YsH%fN%8!h5`<7Nv0=+Jp@LQ8v6=ov<-)Cw2gImtki3a8+xK;NT=-5!Ez}v>sd$IB`UGn@5dvy-9iMx--Y-@>e) zZnKWI1NNs`fA9JJQ=q>x(1JQQEVIx3!!!H;Ryhw`!ul~{5Be-L{=<9FfzGqH?=y`r zvb|sBiA`l1WbVVQ&wQ+ExA=q{K`FQw0*F5uo<|QuC8BcZN z5fqR7`9q%fxwfb49J&qEdmlLrLy|uoyB%#+By!T(Sm_C^?n&oI`zGQ>W)p;Cc=wkL z_)GNPSg;01R9+q!u-087b%R;c9O%tJUIvdu>PE9Zlo7XllOgQejLiirqw!sd{>!m) zoLv~GGBr?{+GRHyTYJY?JO$tmI@xY9E2pX7m?PGP#qOr2Z**6}E_PME3B6{>aHk`9 zgIn5f0OTTGZx<@Z)&Xv)!26{e3wE1`ZkKKk_nLhR(%CG@y&&MQ5q#JUqy?0Z#*xz> zaJmzx3^?6@Lu{NMlW>n46h0V)ICiG9iU`!(#F1OBH1MvoPh)w&J!f=p7(0*& z0MW2;D9qGqdne2?*PV020&1LF&Kh$X1?H@NyKuul@^IB|bGfjLOD*Obl2_wXOorhDR8WS9efEYw^a4eNfag31R&>>my*+DuOU6CUKkhrMR=QAQ$ap7@-B zx#c-A7PJP^&EtdIZ!lP%&c@JLpkCxTRqOzvw;G&+InB%P!?L_h_`}#3tJi>~+ zM`DC}*h;*2n0}Gr;HqhN!769*3A>ya9vv~NU>0x0ez!;i60ou!3875HIIHKKwx&ko zdlLPvsG~M_mFUo?p0IV)Ry$Kov1sHr8+GlSsJNCkk$RSEL$W_Tw2oG$wi{wD9*HrA z4M^Kw+uc{pnv%EM?XzGmtY`@=hrSbJG@n6o=Qr@2x{AAIa@-~12XU!{mq>WS7LJoZxY2{(x86DSTT0}X;`>jdY0)>PdL0U1MUf_=l~`=}QWT|KNEhXZl>&zq9J?Fc}Rp(=)6uaL$anKr6bsD zof^YNWF-pvjo3Rd=x|JC_+<=6w^r-5^ zUVS!yBh;K=Iru@Z)GOxB5Itnf^96`@Gt#MYIoXJFiZu)P8k{ru8f7eC1ArKQ$j1#h z7_I~7VK9Shk-noF`j|})J)M5I=Z(=S$P8y^JdxSx zZArzg)+{==&DCFSc_|Z@=M-{rO-GfL>f_ zl>QU5=zW0EycUJGaMP$7DzsJ}^ks;)ZfKGH(73+}v3Z}V>How`dGWk#nlF!;&cZ%$oME#M6YXV7>IKah_KE+SbjtqDLZ|s(4NSuDXQq;7 z^0GddmvStgoypG0!R+9X&^$9h(d_PM7YOAr}VX7Ykw zo^?3vA%>L8slkk>~b5rC0KhBk4F zfuG@rD13!+bUcNP0PQdepPkK+2;#~}NoFV{-BA{wis>LoH#6EYHD1hU`84O~O^QJR*9@O7gWqa461%WNPEq@Gi#*5SxQ4YSp<@|yjviE||N3L1E@5eXCv1I%P z#v3|7Txg(^@o&AnH8q#|(DvdPmLgI$j~4GHVw`;cJ|c3GxV9lI8*KRCy9sAdb13M{ zla3pWGY<(Fc@d`&MBbwkch-Qj%;We!sMznp4qTZMg>l~CbU37Novj|~41tpRY_To2 z1@rf4g9jyXNxta{*0ex>yQK~91q6+3P=a^X#n=&aarWP&ix~l1GVebsQ;(OQSDAXf z{M@S4{q9AG@pkn`nN2_9c$;1vPd#Hs&ni<-4|y%J1O0Jq2Fv*h*sm#C`4%4KV)iw% z+jWG|-4sYROMKQFe2;5ynBmoYTf}`&tvJc-Y(!%2T=sic^msWemwiulA4YTKyKGE` z#H;@mmREUtUWD@?dw-0)uHBD4ZTF#kIZ5)f^pJy9n;kA#z-Al{=7c;{giSa{&GJM* zSec|}n2XB=hR6H0XWoo-C&3Lb4lhmjS06a6r-#KXsE6jW}vb zPtbq0q4ZMX4(5Z{D4dCa)`)wAB42O;P_+0tt9ER-vw8xC>Yo9B>><1y(}3*DC6_r9 z&CU%)iI7!>3rE;#05Xa5Nz74ZvJ)}PP9q9T;%r=x`I~%U#`&8YkRWpkuQKB}m??P&bB-w-hAP_EY9?O}o5T6=;2ciO zYN1}8C(t>Z=o_G`1(wmib!Mb**c{Fvo7hNf%v8{7!zPKT*CR{?6*gvG->l(m%p6XW zx22i9)#s8M^Jbo@{cH|!8#0Hp%+JEIBmbDu347Uyf-n;}Z}BHw<(m^Ym-1&i%$W(C zkY|-2g8oY=}K+E+o<;&frO@0(N)POGDRKc^SN>C$K)2fl`uFn9Y)7xPubN06G! zNahg{CJYTnFF~klHk+tT5`I-50c$bEu=TUgEpBhDv&{qOub4k1&frmJH z@S20zd=5*aW#zU#825>pqWL75aPZq!Uo%vQ3R1e2fQrGuJwv zod7afGqs(G6jr7`jJ*xH;nnKeczsJj>}O01yCGuo8)gsAxRaOIp|LnC9*qwq`loH> zetTv^wL@Mu_tIvXOadEw;x@q^EZhuMSELW) z8Q#F&F{5K9-kYn!4fo!ho{O41)P>`9!bau*($kgK;T)&r#jdZJo=fvLiE(-^7;p&3 z72ePxb~3V3jnpf#-orgD^K~AzX06$ox8Vlnen{v&r}sBa@i_(60jBh7`Ry#PME!p5 z8eH)_w#RgvpgFOaZK&V+1(VGxn9)N(U7n3qn7O#0G#=Glr*kn%-Itx4(TqVeWlJMO z8{|F+7;HxjOIO(AjCC6S<<#!IRd6nDMf#L^eFs)7@GmQ{Nh4>wo{~u4Sg;0}V=p4X z&G)bs_M^CtVAHq8^{6N2y9~^~wO>$}Jt{GubsJ_}Zs&Z~+Y8o!*vK@n08i5y{w6bF z(xi`1y@5Hb=o~rOtu%`gZrUxI>=k})aJ+w-k;qKDji+8ry)`(Wlbcr#oo|Z?p=N$C zHflsYcGH7bSONb7nHNm(nPt8i@LM(RH!+PpvOw@o zi}M9B&^ilZnO?w|{oSvjqxK>cW~WfzIXGno=4xJQV!o%d7))1%F3q-iln!kJES>B- z2HwVWuLP%xd+E3ngpqEH>2zl%91fSwOgO|R1DJ4V=48EtY<3*^-Q-F5DhV=iV z1-yfNcZ$6=S^17I@^Q*BHU_1=t%n~mCHgs>u#I;1h8ZMlz+Scpb#~|Gy_i;nMS`wH zcR`uiLiQwMeSCjsqH@kLwl}5;V*Z1lpPi|{gZB69MAlo*{#;b>Eu-@%pMekHwMZg; z*`O8D#~Ycyj}wu3a68k%I%3QjuX!6dJpjF!K|5Uawyh(t`#R$65c9cNe>3xnE3=-) z1oW!XKXG0$IY2n@s=)r8$N1@^nJQ@w)Cjkd16`=eseN#X1E-*0BRfDMy5(U=pYfz; zV*2Zg-*6LVvEe)Nmtmbzh>5ZvQOvwlOBGFZa1!ht_#2vvt;r@zu}|erc*TLkd^f^$ zA2_v4dk|ZZGyfe5TbjXXM+x*g*y8#@HWt$kQlxe!Qjb@r&n&B)dRm;XH47`Jo^R$I z?d0v~O9gbBSf`M2CvVZd{opalYT5_vdV-UGWAJqyT2$X`J(^ z&ngMsyp6a(=gv&pxf4x;n@Lw5y=j~4@L|>lB9YESN|f5p2#4VcyFZ95poOt_hPIU~ z@xpq_^I!c)-%G(ak((j#oBs>4Id8;lR^YR%zb2oqhr({qHN#%M zGRtrOFUa!Arps6GYPqS{iTXVzt8Zq$*La5_eM^dT3M|*y^~m#Q;lR&5=QdOCKJyX> zBNO$fa`2l`IGYyVHDFrLs)AWVhL4&+ShBgQ58K(_ZmPE3r8gRX6Pw!ee4%r$tR5T5 zDq8WPw=&i!eD<>!yLe_{X6!agx*a6{#|R2KMx*yI*XXxYzVSG|ff?;xK!%hf=BD<6 zrEQ6AchvH+b&yX_zDo+WJHWR4VDm`TyAscZ?w0=y(ao3z;d+W~SzwY$Ze#RVP-ElM zQwKpc-B1}d0D$TKVG`E=QUEH1>6x|yCZAuvsvBaO*G#fNp)}8 z&+#GV9#UsR+TMa$ND+G*_k033nCRL)S&-uhpg3?>I?-?O;N^CZX71Swr==r#0~zNO z8h3gKPI-j{?dN`e9LeSePoyM{W17cKP{q^ML^))}nC5{Ly_i{uZmq_pWDDHnVgusY za=+Y6GqsHA-r2MlVu#uMu_$HmMn`!0I4khLzncLLyms7f#G~Taq?rPtJ?;Y6=ru2p z%0K&K7voKKr+@<(ioM0OZ1K`9(Q9`j-`LOCw)4?>_WMp&hhoesWq&HSB7MEl@TOd_ zHQ!$Hv1lVMPVYbBPdH$p~_kyn=f;ffd5o>Y((ug6zJCY9BP zqqk>9fZgLn<p@slWtMR@UyV2U=M90F#X2hiLCM@*f z^lg;NZdV5dCz!~-!DImCX~zy(R``$xr~>sk)O;-LP^Ja;*M3oXST8C*mLBK1cSzBM$F76 z>3&1xTTJ&LL(aHtm3kk*3H4Eo>8#zTt=k<5N@@t=U~9^-|BfMA&Qu0I9p5}C*X@JO zl?6a=E@Qz}C{6aRITp+oAutv!wvDMj#{94SI-*Gb6E%A`Qe!aIJ+KVDVE-{f`owtO zf$l@B(81s)CUl^lp~pPQeHt9WYeMDK{P1v;m;Z-G>Anp-&->5Xrnhk5;d zcb7-Mv1K0K{`5~X#ZwK3hCcJv1+N)Obl35WlPTp>;kg{wME?;7l}Eq1IgxsTlbAP? zygolec@&0mDpL=k(-3FRVJQ-P9It-dhX?COUAm<#`pvu8b9gBFjm;GY?SOpyaicu7 zozOL-p^pr|D=SkE#=lzm#-9_VyQ0@`j{bCWc@~7uxgQZC61>K_8}LB`g2`jCQnY7fo1I-a_un(fABM8{K%E%G;ZLVd+7rFiNLJer-+#O82C zeDYr4alphoh%E(RiZhmh{MN&?Tj6(r<(ERH}H^K@_J^t`HcQmGZ7Kc9&m_Y zNN8T^n?1X%7P7#CPPj0udz?vyxq9*IYawiwS0%huSv>2Of;G5xB3{`<`x?;ry@Tzt zp{wSXLi-WJK49j+kfBOr#);@n)|(r9&NQT__fPl<=p$$JA96hUF?_{2XnLnczqu90 zWk%v*pwXW`1Z&CK%1-8%-J|gp5)5Ta$=!Vqg&7J=9756KE={DmFm8bF$hhzcgmT6) z7fsXN3N&o-_#5cgwSSVrz!W(8W=jm#29u$N5|c6F+GUKyP;H;vWG!Rv3VSrh!V*iQ z&cQI$Ik1aMVi@luyzilaB`+u^c*X%;)94#aL9=|@i8<(f|=R8l5N*?OHJIq+%Rjh^b?HWdY zE?G$bf&nr2wm4%mdlTs+P;p@i#$-+=W1382@{U1Mp#!qM1pP)>iZP4H_@L;FYFrwF zNu<8E22qW%Y#;P4+t<<-jKQV8Z9U8xu%ydlRUF~#MR6pucE+)~QGfe^jDN}65l{Uw z(O=+f)_IWris|q+u>OoM$qdJ{PQZ=8JmOhc^k~oOBh9>je(CjF@go@Qt|)zr_S6EM z7-Nd|K50rD-iboKc#E-To(`Od4uSDEnWpzf(^e+>O}%nWEuI9?g~=(fP411_o9t(~HNU@TS)_@qB+{`O(KRHq&s;`PT<|d!C;eiD%~Fklq>74{m{m+=p`L zhS`1}5tC6@ZHByBl8}Ogi@2^xd3pk6_sVbz;KF8@2iA-CA9BCp+h4I2j@)(~D)F}0*LGLcacvug)NO0X&(?1fbA;9V3vB_`J#oVp zyh00MOrsoQhFDOeqV&0*`>Il}LF7bM1D=slrOUFqOHA_2`HSl^-2l2FaLsfB@La%N zXSDB!<~`hzCO4*YAML#lrEg8p_WjX8F;-zeZG|;tN*>^iyDA2=9;+fJyX=2=kDWc@i-(#~*r+E&#Wt&&eW9)?$aPNCT!S^q= zvxUOV#rxL+BmwR)nLEi9&)|3rEqNVJ-zGn|_{ z&o0S|c>kj5n4dBY6$j1*?L=nfC@eyRcPgu2@ZE?MAIE4<)+nq`{YMNSdOFlxa033bf~Z>QzQ7mVGw%IqBHfCRyI_> zZ^WHCoa2-XGY{XUopiHpG7UGljnq<`Mqp@r`3{psa+xyaHj_mPP3|N$jH23P>{u%E zVo8{BHx0>a)OilK6o}DG`h#xWwjoQtG`aU734YSZR^>Xkc+v}%sr%TG%ctEztUEcZ zne!57dJYi`lPS!&R7RY5Df(?a52CH8O1;TPv|_%*j}J;_q%ku`7Me+PRys~i>b?E< zumkB?+4AuPDLt#*kjWLBFRNNW!^&zz)i`zNIw}8abaKtl2Hv9ze*2G9fqiE*!%Y*4 z*Y7g#jDA-+h0P)YaSSz!k7Z zIMZ4C4jeGmVBqi<4jgcPB7v?`##RTr{)p>6jknB2gC!L-P=2_3#}H>?D*Q;kq`M&Y z9z4ki9w#$cXrB^T^ZK^Y%FveVfN1H7c*^VhkwI+L$mLV`_xZ>*-1}ZT8Z_bkC)3lw zYz@~cC(?MQaVRy#_ev#qC$I`zZWY%BgOfZ5`4I=k_@KlMmCKk&!uVfdgM zZN2w3@oYP953kzUo$C2bRca4g_E-g;K+#LcP2g?EM%>|7{CLs$=lFKcqd^Xl3SCg4 zSs=x|C#&i|Cl|@($Lpc_dvJz+Sk86~$|SNeDsJ4|X1-E{VUJ2=Jz2WtiWgHmOdn|~ z+~JAn1w|8E;~4&^%6c%q_LbcJCD~b}uU>H@XUC!o{SxMxd;qd|mwYk$d-gi@1{Y67 ze+)gMt>p_VQ=8Ai$m+uK^Eu0Qh4HHKwc8f@{xkbpvrsvPP0w_?|VhmdLkfZfW`Kkyd>wavfviGS=I*e@UR2mP=A;4V<+Pl zYS))ccP{Wr1^u5+M8fbs9Qe^_hfrDio_h@fqXyz7e7oi1AJ8+8FnE?j2a$tc=9!Mw z6(@L}@t=px%>~2b`6Zjng>iXsbgQuh<$-|@LMQ02zb_APv6*K-=mE_9Yd#+rGpF=) z#RDJzt?Tdld2srwE86!z$e|ez&vc&6!!XCg|AujJ83IS9bJ#?9saSZsDIUVW&SwuC zz!BvaacjA^7R@g$j;xw9XH_z?sdv^BPO zw$^rcCmSN|Ee(;gBj-m7Cs|&x*|AB}VkN~ZV$&w^d~(Pg+`zXvg_9cV+e%_F6RWYL zxM;eK)m%EQ`8b@O7@IVE(yGQ)Cr?Utl}s<1>5%T`*5t{Prnv}Ru@gZRYiVCLsdnb1 zlP67|)p&f-^hvRzq9UYX!jN=Cy3!TXj$7fFLWsvuLw|M5lDf45=&d&Buq&7KX zwKF^BqRf7mC^0q_3{o0Kk`O`K+PjMqP06mV=GwN}mX`MVS`;Y+8x+8@b9Mp=i$;zz z+ePsLytnk5+q;U|l10Ut6x%zJZOv`VVhzd8=H<2B&C8Q9m|17@idbWFOVVh>3Y4+6 z3=1#8yRdKq{+04w+S%Mq`4%j1Z(;Ea>SdT5O6s-pUdtuJ%$I~`=87uT-5yX#xIV(7 zTABVzJ=C|fcm0j!^e!xhms6&?$Aa}~Qtfdi(@98z^v5 zaz(dwW*{025y2bUlU*@bc`Ui2xvSff!SlKJ#t{yQOD@hq#zu;3?%N9GZF4ZSW1VNU z_cN(vr1bZj+v?lfx*$)otvgn^EZN?g?C!kGXJB?@=zWm2v~*q88gf6;*qKb$wfD3& zID$ZYTDOmCj)D7C9q)X9K{vdYhCuuUr!}-U4!s}9f5rTvDmMC$p$QraXL!6?SP_N(c#y3UKW z^|0D`r}j&us9rNAp?Xa;Hn%mbOm?=Ta-)GiF@}CfeX_f~#qj`Q}Pcnwe zno+#*j9on)9qpZ_tKc-1;hL#8?;6zG-D9}*wNG(xvB z7@yBX3}f-*K3VH9Wq2^`J$3Lrp9i_9~p-H$AWNE{Kw&B&-o)@DouG0%87;ApS$m9z;H z+%aqA*^#Uj`B@)1WNhww2+;)m2zPHEH!z!%mw)Z3d3h7B$&Tm6`g7*x6<$5MJg@kw zG39x)){Z?rZ|~^rm01Vp%>q`QS2!mxHYaZ);>^j*O^nO_Y*ya>(HG>c8B>|J4!`wd zD)O$wZ^M{s#ET@rew|C}t%*J@#J?sReEM_d3{C5_yfx#pU&tOYt@&K2nzHY5{HAkr zyFuCKjUfAJkSBZIs1f;{HZJ>1S&+37vR3A8#P4Rvy$Qd~V=hFz$eYkrg)6j!Ci%1i zvR7pEl*qezZ1&f4@-~el zfch$+zBy1Ixm6%vP}SH`FTM}r?61Bb*3QC4KF}m`BCm3IWmw40)W)H=vbo~a2qD{e zp`kZ0#|>Nt=~>4aFs&59ybmyE{?FEBytoU5qs{ebvp=EU`nb6mW9pLPQyo1gS!uBD zXLRH!1#xa(Y(SnN?i2WILpLU}GeB=0tM^WWH!B={%+)o2=X7&2I&zE$+;O49KM}ys zb9hkzU*d4?6RV-lT)2%G1o4FVhiTMI?H@h9)6u?&+d~{@vqw|L~ z=44F7e$3<1NaQMquM6VdI|4YTevwa8z=UpaIG2~!@I8me z1NhAj-xVmYpE`WjDCH7~-0tvo0X|zDzA=FBaQKb@{ws&?3E+=7JU37Uo^*ITfbVuV zT>OymJBM?GT*FHa=W7}b`y5^v;IrT1YX+;ZLEd)w?f{-+_>PH~>A;4@{vGUaF43*MNIESIJ1*hpAs@X?Vg1mo#7j(#DgiD}?$Bl4*Z zxUzqDI8-+zY;gF^0sOlT&ke|Pqr>w9>Hf&!n*#Kk9NrPguX*DOId=r`ZJ<9CEuIgi zPl}6s00nJ?G`mCa7eerTA^2F-pON_Ih2Vz)ACH#b2Y*%+LeEc!M&iF91V1MPZw$dN z55d=m;NJw_I{%i>TMhKpZ z_S@8VrzG=Sh)Q)B@R9U(LI{3F2%ZeVuL!}v7=nK%1pj3S{$vRLN(i2Vc66lt9v*_1 zgy5XBHxi%v5PU@l{`nC6J0bY(A^4-fP5Dl?p3*$05dGWX)tJj+9#IU)2Hgy7vFcz+1~pCR}!L+}?u@B<e=Y?7&k%e^2>w6_{uuD_k$nezp3$tE@Nxi$+cAOtEv5H3ml0Il_cu=t!K(wf z=hGH~r$g{>25>L`&-5B#LO3XEXB|MwXzvK8flYhtaZwCKP;NL9%l~`&+ zRATOx7}^p;Jl(Rf=O)s06Ki@Y;~r-yk24&OGnB^}KF8T~4gGP3=W&KZi9t#XhvV$O z;WNWX>4s*y&9MD9lrwEyn|+h+3?s=* z`)`n$hR^Ya&+#V3<4vsN?Ol`BOvB-L!})l_`2=%*g5h(5;c$ZGV9yPo6AYgd42Kg; ztm7@86U-crnn=xQi8JSvCu+`|KmVM0i)t2?&q>UyiEu2xy*|>~(Oh#WC$-c>+FLtn zmLCO3FMO%07RO+L(9+#0+lU!Lq-mTap}*0lF@ zLmi;vyeTq-c=6o~bQ#!mchxdEsjs+S^#R=CxJ}CJLCW zHv5?Z!}5j+4t|!vuzQ!{)m|IRBba>qFs!+GxIr~H52vGn*SEK}qQH{Y+-vKgepo_A zfnDA09ViQUxMfJDs~e_LQ{Qw+4c{L{j51jnmNgEyo|fPYreR`YKE;rfm`F`avaJTm zwaOh>52ip3N-@-M8ipGVXLKO7fYwE`L+`X?W?l@7)Ml&KQ2JKPv=~l__t?X7=u{wi z$(U*43kysBti1b?NF&wv(0Egi%%P?1GIEtBqEu4{rl0^|nfnc647h^j1%sy_s~H z@toi?x_i2kT{X?i+S)tOlu~U&Z;p7Yxvj=bYaJQ^?Mr=oLkPFJ_U`WX5i-){a)SA= zHn2Z<7JisPZ$d)|-YPgZ4e<0U1n0zSkAGQkez4;4?}XsD34X57?{fGQ9QlsK^LgFj zlwaj}%i*MF9zFdu*I^}nwcuRDn<2>Oe8E+oC4y_ZU4kzLKcDUcf-C)F4yT+K2>mmH ztNi~X_@{*aHNp9=$fr9R<5>*kuk;@e!A}Um&lmhc@bdgG3c**0;NKAZBH_bvJqF6D z_?;p6^McnPj+ckycMRmCI6vQJ2;v_M!DkAt<#MXvs^{enr~NF&&&$Klofv|4^&{a^ zi~FAbPQmL0=V$2*l)oN7Pyd+1gZ#M-83XYK{5<{Zf~y@KL_&lhpL~Z?tr*J4@ZmDh z48-whpTRla$3Qug`1y2~JDi6`!Toze(k~PIn?m0t_;-cB`hgz{eY4P;Z#{5L{;JOh zLg+a@$Pm=??}T3E*)Q}LBc9K16ys$Kysh*faX9scNB#``$Atb8!KXN!^0Wwkvfyfm zmkS^IYA?^11Xp>!D>&Z`d-@*;|8~KDE_jFF_X!`htA~YN_49NHJ;xatsJBn!=jC}# zaOFRaMu|ZEXgxhtaP z&qDA!1Xnp97hL&#l9dx7DCa`KRnB^c2laWe;OhTB9fDsjxXO90;L7J2hX>{KFEWU$ zoE#ry2+H{{f@^zsbO=6GaFz2^!Ie+H!-I1EP;iy=b-}fNwE*L23_(8sCAiX$Ie29H zX2F&I7lNyO9_8M1GF_!#F1XVFP;jMxE(D+G-meDvSB2m!9Ug37z9KkP;{CvP9nNx3 z3VyHfZxsA-;X{>pKEDzAO9cO&@b47-&w{I+9B01Bv*oD%HX(SE@VQ8E^|wifGhga& zdmJ9r&ldz&{d`OKsDAEpILk%#^N{dik$U|+DfFtJXN7;4(7z_Q>St;mh!B`=D}J7T zh2W~6^8{D@)Hyt;hbskFJzV4Ppq>2K;Xyt8Quwf_y`0;HUiI)R;m^5Kp8i?ERSzHG z994v%9%cxxdYCVG8{&EXXFEKohf4)#QF!{R1gB^o|EBO)d-$%ysWgW!B7_4LQO7cR`#O2I!R_~nAv zIXtN6uRENwuM+y739f!}m+;}Km**Lwze4cm1y?@%h0l1QAHxd-%AJ^kl}|CNG&L2ym?w}Pv^4LF?gv#O${NWIMZwUSYW*&j^Yr02<;KvA_MjS8yB8OAY+P+-u@Sq-kEPS+HJSDi= z|I31_o&Q<*A1?A_@dAPQQac|nxbm6k@Syz1gwTIdaIG&h93IT?zXS3fgb=v8m?9nSpn)XTX*=vDvc z39fo;5gBvx=vB^6!Bx(+4rjTn5kCJe zxb|az>hPfc4+wwF*C##-rU=3MRVujVYo5c&pQk=wRYI@%suNuKbcWz71y?KTmzWCJDXfYl`41=ZV5c?W$MkRn8j)S2=$nxXO8t z@Q;a{4+*`>`8%OMTIk0yG6M6Pho8@HK@1lNLBBLLW?C1rGj@koaug6@M|4TK3ZP898Nx3UJ)u0 zfw-2}p@OR(KI(At{}_HgUmq8GEw57@PC51Y@l(P_<-9@osGRo+u5$ibaFz4-!oNV| z+$Z!Z=Qt`IfpYfZ=kxUmhX?i9;qah7uM=G5{GQ+{=T99z3TYlA>Hb3KRnC`%UiEf7 z3j-l2&qac(JRO3oJXboL@_ZaWuZLctS9!i9xbnFn1iw*mtw%c?&U7_jZwh@%PW@ah_)i2+3qGEOfk1k-!&1RjpJxcJdbq&hl=Bn#c{yu@ zUiG<5aMe$j@KOC-CwQUo|4+g51m7(DHDB8uPQBF%{UbuJ`FdJ#mGe2_qyBK8!>I@A z)a&65;iLX=^v6MjK>Eq}dHRDLP9EwHqk^vx`VR@8F@m2cIP>iJpDwuSt={25d$`!) zLA_ln^s2Wj1y{XYC45wG|K{+Z-u_+qsNOaT{Zz@<4}@Oz_Jq)n5&B#jD?%{8#e%E- z&kCMKLXQLJxpfvIcFGe1`owN(R>S4Limk9lO!Br2p2p_eF+Z-O$!w#WW zJ?s=*_3*gxQ9V5C@Sq-kCwx>7uL=Eh$=9ESUiGkSGKdgZzB-P#JOp1OxQ7)V^)nx$;t_}+ho4XP7{Rq1PjPtAp65B72W`L37W!u4 ze}UjyjoK3a}zg?@&lyH4n}9KYyr9?lc`{}OsFuX~05e4*bb^womD zA-MAS5E}^u>Ql?>BZ4daEWsBejxVok1y}knJDka@oZlAwQ^My~!7mVeo8U_X|CQj% z=l3D_{|UiA!o~@Ka$bm^&)1|7d`<{nC-_Cer#S>qh2Z~>;5EYM<`Dd@5d85F{0+fX z&uK~4Exc3h>b|i9A0H^*K<_2)D&odlOx@+S2MN?`W~Uz`qC%#D$iGh{$i2yhavR0I-L5<75c40e~I9C3;!0upB7yG$sz2t zAyCh)_<4OEBe=?sPh(9WeVfpiI-KRwE_kKj9fDU2AGNm{p;!Ghh0w1N{L{j}PjKb` z6^Bz!^|#*;T>boaLhzdeSAE_oxbk_+;nbV@fy1W*Kp?K|_%RL-$~jGNZP)Peu?eJC z{A9sZ&T|A;`mZ}YDCez$tDLV1eiqX9_Hzn5kqALP>jhW(#{^gXyy@_u9HXaB;Ij0D& za<&Mr`u~OC=YpRv$BA^-2;{Hy7YVNPpA%f^e-wiMHUyt|f=PB*x>XLRKjf*G^K7BN zOz?{wPCL=|>k8pBLFmWM!UY2JyBYP(Y*xVAfI39jwVg$@tuVWr>{!RsOAaOzX_@I&FRdbm~i94vgc3cc## zZsFf4^iK<}didaM5FrHhFimjPL#g1ZhcbsVU)ugIba+rdt%9q5RtX=~&$k>Nw38nQ zpK(ar>-i@_ull)N_;(5Y1A?o5-WEP;Cm%i$kr615>Zd?()lZS&D-g%a`QL)8zj{0b ze<1`PbrPkq@+hAPf}f51KHZ}PKS%J7JDlbCCBaJs*XOu|;QuD{=Lr5~!7mW}D}px* zex2Yw4yXOlguVQ$h5oC8UnTS`I#2%vhqJuCAoy2>&%X=)J>f%@dp<{=j0*(HLlTdl zBREez{;z_cBKQV}Q_trK{sY151mEOv%CF`4OQFA5=zkqT|Dw>VKR=SfA&`GHeqR1b zf@``J4yXM3+;NxCs~sM6DhLtCe-VD3|6IY9eyQL}ztZ7Mcct+8g3zm+Uln@I@1F%f zQ~2bT;R1o>OIg|WFw8462ZLwh)XV=xhm-bef`3zRm1m2?DSwa9|4Qhu7yMPh7Ym+U zjtc~)t9Y*9nr_tLOjq?VMd+2!2_bkz2!5U5T8=+)IMe+)eqL`|g4|AoRw+qLr@J_@{PlAix^ z!L@&Nv%@K;_7gSmSNZ49ALOs{eAeMXc}_lUkY44v!r@H! zKk)N<=oMV;@aw`y<>`tK@>h9&;_#q6{gs3CD$h2-)!y!PIOR-=oKHHO{MD|W6}(L7 zr=E@r1eT-P+i`-cz0Gzw`Lhao{ah*Z%I7MFPXX;Rq5px$5h z?T0)k^veJDLa+Uhw?pVhpMk^>rr@XjnZq1Ty(#}Ag#H@b^ZJ=A^xqczM8P#*a|KuZ zuM=GLyk2mn|F+<2pG64>fe@^}iya=c&&sMndbQ8&KLT7RDu zdTp;~FErv9d+W!k*W2X|r##t$e^qei!S`pjJDk`JLjSDbs^2^CjnC=?ERsTO1T=lcf;gm=H+r18_Jah2#`gvY(^?RQrQv}MR_2pEDlfU|<^MzjP z^+iIj{rO9TUh8kC(AOaiFXxpZ^j8Uez0iM6=vAIygy8o$ochTXJ`V}~C4xWUaOy$Z z_vZy~5&9W?m_(pHTk-SxsuEn~Y!SRo=(`-wblU}AD|mzQ zA1w4Q3%%;$HHTB4PN9#pk|PB3TPwKcca7kh-_JQbnBT8BJeaSig^%WIkI;{UTwV`* zgQm_uGXJPkp*~htTg7 z`Z}S1CWQWZ!BziJHXaC+|4aD!bWe9U^`_-=fzWHayg}$`GM>+Q94tWa<#mL;j9e)A zJYb%_QE;X`!O?%-;l#cp^j{WS%kg`{XQt5KB=naF{!@ns^{`#|%oqAYm>2@(QG1vm zxaxVT!>I>$`F(!p2p$)FvEY@0cL;vE;A;e@OkU5Q6I}JYUU1d(Ee;Rr`C*|~|2gpj zB!&>wLxIDYU)E8d-)Taxe&#rbQ~%vU|2d)8_F{wJTEBiNxa$92hf|(2gn$00aDfn% zf1=>ZXPU#wCxM^O*IdEJ2;L-kmEe~Oo+tQvhX>{Pj^OGyejvEYd5goT&mQ4_hr=m9 z)9~`|5I)NVe@y5X2>z7NUn=-tgr0TR^FNuL0|d&WexusqULJ3^HG-?%HVIDoy??mc z;l$KG{6O#(xaZ}$&Eb?s#|OTX1ptA3X!4%^;;BT3ZHB z+^g^E<{cXk7hDXTYZPOPC9Lxr%G^ceg^Fg>n*l$9Gum2N2C*l5*4g7i*N@J}CDX~ZaAcx8e%#^g z^Juu*rAyu#g4eW1@(jjb@8UCE4L*I3mEeSOP4|F1`uJA{aA!Uy4sVs=H&Xoki+C5` z;IQ$K;M4bf7U3SxX^$E_aeAL)A;KS)>R;(w6D5=hJ7k89+dxDV&J`2N}- zeLR1?9w*dGQ2*5-^80-I_#1ITp27I*T>P?tVFu%W8*xV}za6gpmf}7G^~HA9$M@wo zQre{7!NwG!$tij~&S@*b_y++ChzJDb;SB%3NgyGpKk^+ZexY-~Ka#jS4aUd1+guvG zv#9-8v*U8H`L}=e-2NXwV}=2bD=BejOAo$sUSj^JtU-=hkyD28XPSGu`ENs+Ih5g> z_(LP*=a-*Xes1}qbI*x?=A|9T#lC3%De+XIU|~Z%opVefNaLyAf=#$nvN@g}&8YjL z<5v~rf^cE)pi1B(PwJ*B( z2@ozGh^Nmg!^N-S(VKS0v(L(nrw>9BOP-7OPk4}Nt(?gJiy`Zh0p4hV*Z|JX=f#_i z(Zb*IWI{naeHfXO=d(=hQDp950Usr}4=LRpPallL<}lSi#k1#-^KM3anG{=j#=q*F z6#S8WI3d2B`1Zl8=;Cd>|0a+J!N_EcB+o;lC&BTqebKX?0lb1A5YuDZHP~`r5)|N{s^e~GuvnkpSrMoN%@847nRrC5j|=RRpd(PMc(`T2(5t~~y zI*H=xsflz~bs~LvSt7eDw=%t?pt>sSjmp$BmDx)Q5PMa@#6M^ z2S~Kone6zAf_zi0%KjK#ZSJvjdJ76oK92aRFxWpBF*dWc@mhd;rAN^#yxCfIItey)*vCE<(E*XUp!facFKLQ$&rA8I4sy z7g=|Md`BYdorULg4PYdCRGF*r(N_*2 z@2qdV1+B1_T+|w4d!IZN!J0szTi3w zUtO@CC#XcU_3_;WD|ooEV4by#&C<8GB1#$iaSZ}XU7_qC3Dgdu4SW18O5J8(vekPg4JJYuq^W{w^5o+QhlsEuN z8U^tNq~7;BPEn6>iW8TmXuiuN1a@((5Y#?6EP05zey}lm{-T0nTrXxlN9~>$t^NyZ zhq-(Rp5k#rba*ZkEFZ@IJ*$;v0*CZlq)h&!ahLi8d(ZP8x{a;8q&gS>3Y4zM;9~ZW zmX4+R)o5=K+-W>*t6@54Q{U$3x);GN4ngt+`i4-S5%~a4cEB8s(-?clFbkPp)oq)K%)PU$KzXmm*e~ra+;qr z3OUK2ki+vMa!?+NxASkSL9^m(H|IA}bjY~_B!_JVzW8BtiF`i^UkNQ$KN&CG+w)%) zsa*85=#k01=vvwletNujQhl4xBqU8z;X64!ar( zyxqEkwRdF2vsM*UC$euhz9W93^#Reo0X&x?SEg;*#*(@pTFqw>qxf*+En3tQ#H=4c zii_`L5!?@gw|Mdzi{ULKw-w}%F&Y6jsY~9#S@k`cl6{Ee`!d)gdl73FI2hyL z#XXIQ=xUr)-`g0EuD*Yu9lhe{Q7AfN5NR|R=AKdE6n8G5a7Bz1yols3P5R?VCP& z^rk1`>0{&Rn%oL_T~?QPc1?9){6xA8 zh8C&H+O?p+Vlx_mIn|Y^yDHI`!|mr*Zuy;a`?E8VZ1ojF5+zdB_!Ipza{K2Th-d95 zT9rK=mJG@JE3QIYvb`#`7xr=_D-*ry1{}-#=Vc`(KauEfc_vbx+6I(05$0BzdK(uz zNa~zy`GYSF^{-q0CkGyDNdcP)$MkAzR`j}w)Q+mupQDqP6ckscwxhJsg3wEt@lHYx?vA5`@=TV|XmSXI|gkNC@=w%~r?+{4=FafPrlss-Gp}JP5)1YMU>( z%L=$l*gN7gFN+g!^U=k3fE2zAl?OeuC3~amehyZZ>C(z{B`l@55;hg>Jr#8V0zH}N zKjMKz|Afa%(9xRkRP?9{(?!WYBpXJZUojdqi|@sc{Tn(ba)-Zt0-lCa;{av6GEEV))D1Aux}1{JPL)vGe;Lsfc6%H z(PDOgm#||0CB7CVpHsPZJAQZNCbF+KZBZh-*R-~Y(%X$uM*E(8%ebTa>2-dE+}#Nd zwzCd)_XGG10c%h=qx)Zc7q#^(*b)BdM_?BB^4s-+Bg3%dv60@ zS5@Wx=QbA_A@<&4)T&h@Mkj?@(-Nem6_b*}x#b3`)FIJKU+4?1mNvF27VKa#DRRAB z?2OFV=XrQ$IwSLZ_|GtZ7{%vd6q)qB6@l_zke8~wG`xl)5MKNL{?^{-X6Ggs9cTD| z9_PdP_Guq#hCF`NGqEICH5Sg(PvHlJ&DVf=shm`akl z@t8`<=I+EXyd(DCvZ?Ft;a=V!r=9Ze7_d)PvJ4BpVN@7@uWk=;D;tQbs9W{+sF2*% zT$q=T;gf5e+keMFlH>t&|K?2`&Lns8H_b~FmbvLg2QzRi&8bAGFlcg#mrhE3w1*P7 zVw8DQ|76o-$h-k{E~QzyqV>YDtlKP%eX5)+9Q==MiPcEafDi2Rbtqbg`P7JpTK*LGJf)*1%`-}+j?8lP{cZV)Akn7rL4kI z>9o(%#Y%24g|jyHa^YKmTO$Xe{Yl}g=CMJf8y-**;F^ul;C_JAr21<|ukviSB;1Cb zq-~Y20782U7LiLciBE&Z43Z4k#CB?+#yIuICFn%aVyipObwxMU(R(9Irc#|sav5Pk zlgxRe91g3j%`aOEb^EZPTyASE%s7NNYknE!uQYXNEi}F+KyRinaqrSiGMUv!>VI-H z|IN0xZ(o{fGb8J4?jB8)vA#A)VFvfc26wOJPAUPr+_qJ>W$bS>ZQt7O$^J?|TX5!_ z-%5>JrVVs`IZEutAIzdd(bezsmOGQ5+{(0A zpnm;3*qXnvDU<(-LClo|a#X9$>tV5mhx`IOt&Y0d2)8neQZ@Nf;;{g;UhgelbAC!O zacUO5%`#@RVkj9H)O~%H*2*unMT?Hf>N0o$)Awf`s>m0ke0Yts7l;GnZvV0<+Ctd9FE`gR`{L6 z@uvp(39NTl-Lk^h1{W!AFk_z0$LneG7-1^z6{Ao%ORA9Z{8$y8BwZoN0fM#0gdtQ zO6x$`+^azM@nfdAsj){IT#Z$l*xwQ<*7E};Omk~&rp%=3=hs* zfVOW4CaFUv7t~(m#Mo&P+}@92YI|5T8g2NLUI1dPfn^u7AZf@4f-v0oy8HK^|EZ<5BIhB z|2DGInp@PQ-pRdLx|~GZT9~*G&eZJ9Qj+xu5;l<_4?x{T9snMKw7y1zM!Lqv{~4oo zJwt0g?XPgzz7N7}_i-yA%yO4D+7Hm`jypkOiN{~1=lY2kIqx77i)9dEd9v+x+yy&F z)3&Ysu6zLX;uhAf)W=mzRa>=FEnBAbcVQjZ*ELW_Mt=DPew|1)F|VNd(4o`lppU_2 zr!acV(Vh%kfmbM3UINMd>qS1SCbeO%ZnE(s_60Ur!8g@K5(KMC>x3ZdubWQYO!YU* zqG`@2Pi@@$noaB;qJ8y)>rCs-J<+n7tut9C>oOmgt|xP&ij*!lQAsj9Of#hNrjx7_ zLH7}1OHbYHgSvfCDDoR{YixEeda1TYq@{Qf?JBaP-z_&GgqKOXUu#Yefu3|r5@0aU zEOWj(*Ijz-#Qz2SUqOFMja_VOp4>DEcX8b~^`Q#Lth^PWNsiIrR|GgvPdCXUN( zN&sD_D`ST}UK*%>8hn*PD{OVtxMK^zJdM(ls_}+@59#V|TGYgs3-EyY8p zh8+)D*$v>hLSyI4-0WZV)jei@l4PeL%&(UI?5V>%yXfM{M1HiblIG8%E1eSM|Fr5Y zS3@_cPq=kZ^jkL_oRGsGx)OTb;7Vw!=TB6t&5WZ*_C5cks@+t9HP{EkwZeNA3kZLZ zb$Am3zn68;*s77bymhel|KDaGQaz1$;hGVQ!$ut0cOM;ca&O-Wc*vao6dA2B z{AuAIpj^6Iy6>A*H7a1QVReB~m)yHqD&lndC~=>OoDqC3Mgr0=h+D#qKpx=seB~!e z`K?Pvd25x$u#9rgIaqvl%feCN%DSsWs$i&wGWpJ%^~gRdd{#9wko}A2|IO!QU6Ol@ zoyooa#VB{r*-`EVo@XzsR3)-_kcAuSZXkb_7G2MIaTGk;ZUbv_uTiDXHBdA4jOzl5SSxIZQ-PY<=F9_gxKeR2`;bUQWOrQ zj?-}980~mR>b0aCvo!^2nSZRuK6t2_ds)`TAcU6(e?T`ZXb1S{-)Xf2ZvrIQ?i&C0&BPQr( zs%}I=H)-AM^EXwxk+Y$c1-en8y0Hg{YP)VCrEKvxJl^ave@-cFx>4@P`80pE<3s0qDy}= z&5Lk~tkR6}dq~uCDsqX;kJ9n0{B{KQ0$>Fx(BLL-~R9i(SvQ7MK#~g zCSE=KYd;0G=H?D&3x4FzJ(SHo)tY;eXAmsbxt^EJ;ee<+steg*?|US-n`jp{u!R#1 zox^D~KlQuKoWD=uTsCo8kuG+<_i~5q8HLl3j_3_)7OFDpCslTVt_WgH2zx5n9_FU+ zWL`A4Zv4{JDtC`O#AohJku(1ak&1-6-SMA~m_>b_3HdHPSQw`|9{>3U-q1)*xZKSZ z;RO0I_l~N`ds7qKoI%!I1g%c0U;>d}r5UocK&N>usK! zt8Cr)Xcuc4Pgn~*MhdnUM>qHDC zR%$UL^)_FIv(?wwreP6V6cWH z*bVmQdicQbsDU2!h`onIF9uxx3fvJ!_rd09(Y~z%AB~pZ`OO2PFOIgp`pF5~3N`mI zG-?#nm@lLEK8zl>8@P1^xa(-q&;Jb;@P@&~ABZ;Y{WmTvZWJI&WnST>rphSQ!t$JB z@kseS_wi)(;PL*K<=fWWDl(I?)y~fLZ4=l%JNwTcoL^LJgAT-{`pP?l^Z%WLbKksy zw^12hen%O!f`;Gs$1!Yv{-w838D4ou8UCo0p+$==Z`UyK+B?edN2LrW9eNv;;f;5c z;g3ogj_ZFLmErI^%J4^}3?F7$|7{y4^rhE3vxz?*2QvNi+o%kc?Z|0($SlTMq~P;vgkb)8*nYP(jgs$Fyb z!WGlq7vZ(F70XwwSaRON6}4Yoa$ymu#A3pkiLBa`^uyXDBOV_Tfol!eEBt(u2R;^fj{*v0|YiciAvU=5EVqD!BwI>{R<`-K> zN;rS{N*Yv5saVpvX5qPOD5HVmxnaW)-Au1I^BmES8$LqIm#<#J9wDo{Vp z@=wT8`&GD8d;XHoId0)R+fje4V{Prp4!)FqOIC1m{)NjIfA-jk%TJhiZ0+>gNnNYg zE}6u|1(xp?*RMPQz{WYzgg zs73AcW3|mnu{2NeHmpn7aR7JcdZ}F&CIC2%Y7wKh&(rXdD7SWqM zX3OZxXA)zs8GZJc>qpNVbK~fiF}?iuP|`lm`#B%re2{ZLzk$)GQG?aWb@|A(XjU!C zAL384;(1L{@{Cj6UMKIW(Br4@aQCq^22(z4mq!f( z{ME5`w&$Ef(*DHm1~n~CoM;#Ck{S*JV zmcZSE$RjGImGI&3!8<0M#9%)zLDTZQIC<}pC|)AxeUCu z419SR_{C-5e_IBALmBwqGVq7Wzz>yyA2DiVK761Id}0~+=gPoOD+B*>8F*(IcuyJl z<}&bqE(7l^1HY#X{G~GRF$`=Y>CeP6@RQ2GTg$-b0aw51)mXz}V-Dw~W$?dN27YN7 z_}`U*-&6*EUm5trW#EsOfxlh`K9)g#Bz}In4E)S8@UNADUr+{qMH%>Cm4ROcd~C&` z!*N}?wd4Pkf!|&NkH^oa%fLr7G>%07!)4$nmw}&I0;l`iv9t`_JI3?f3};gI)DtTB zH%p4ffxVCR?V-hCA7irx^AWL!WHd+E|cWC)s~T z!AhB8bOJ+0e#i&hjbWW;Re8Hln%a^QJJilW8>DjYpHfQIbb=qlX&zd`bZu89S zETHr8gU?&B>fD7Z=C_{JGT&W(<*Otxy;<9}V)>dbOIRLH35I1^yzat_hM`~JrVLDj zhT*St_(RJ*f8{W|3zw`})3pRI{lfEyr7d55?xJD9rOQ`S*`=$OESZ1qDkeD~3~j?o zW_!bOoj($A;YCY^Auhk@+~JMs>KcZ(uxo_8BQ#-U1skO;S|yr8tGQzJLe+gJgJ|*a z(idK|Y8c|euHi7M4!h1{me;j<;mY}N>FcYPk5Em`9|JrguUWceHTCOSavo=&YZ#&V zi&w22-stl?m(SO3nDf_kE?HEeyM^ac1C%Zxu&R^ltY*hJ8e$t|&R?|btMfHui#wO) z{Cd~&^Owx8Sap8q{PUJ{&1VKTziZj*B?}j?kq!^#pVvM1*esW{ylXhueXcH4M03Mc ziz*f`T1ye4zjXPEC2Lob%en%(wS2hP7j>?MXt8BQ-ciXF!x&dgUATJn!VAkMFIu*6 z^}V$$-J^E+28TvU>Q3HhQ`i_1_ucU4!{ zs`H1IuyFNx7p$4Ta_x#0!{Hu`Wp42H`8dwC{P^0#j@AJFu>h|9;&tGj*dC2BzWin# zqH`?27_JwCbqM}(elh$b0lY4NZ}f1{XUHhxpCAB-=zM}-OlL*_*W4wBe=&e-ju*o_ z0(gA@|9Sw|dQFV~w*g#b$M7Eq@Z$scO#xhU$Qb|G0It_OWB3I85*?yFiC+v~9>6~x zz%TT0kvlSg|5X6j-kmX>e+=kI)-n8OF_!~(ph9!n82&*Kmr-$cMiR;GtZu58xr6?+oA}AD#^0p&UQzmljIpa-N5m z^8cm)9`gUIM~R!m`CMD=;G!cL#C-mShpXI>Z{G^wA>aOI01x@LHGrQG(7!8yhkW~W z01x?=csH3jgd6f_QUGrxEw2B{03Pb|1s-0?x2ppD69YQ82k=ntuLST=jx8xNbCl}y zOYAMAqm<8IJ;uS+F0I|f^TnekpE8w@KBB~2JlY>bdGTg zV8;JYUY`!&Qv&?y0X&pfX8;f7^@9K&%ImHG9?E5mU-(pALb*)#@KX7n8sLZWI_rH9 z;3$>Xoq7>`1o#?u64g;E$G>(9e#7A7{QOn;>f*6{KO4Z+Wn*|YfFBjWmw349c~Ssh z;o;)L)Bt{AfIlsOUlPDi4&avsbfyRJ?|ZoFFB2Zu^QwT3))r&2?=e+^EIe?G%aPg-$fX@%$GXwY~9}zFV(}32l$~L9v9&2GNyB~ zhmQg_CV{*OIe^_d;OcLwmVp7)iZbL7X#%rS~znqN%+1P?Eze`){^+jVvs z_@XlKRUWQ#HAKYaem%fHBY=N1fQS9}`vE)~;9nKMn*#U`JY4c>4dA~D;Gtd}Q3n!- z>KWRx4+rp2ug>;x@h#M=FL}7i4fX0<0e&d2T!0_ix4#bXL;nBI0AHex`T5TtuKI_1 z^|JsT>Q%j*dyXW(P_L#2@UWhtw$t%={HV+qnLix@Q@I(22H^2}1_SXS^DBo)W{E!dV z1^CBOcHFL;JzVt<<$GHI59Kmb&J#zee9sBsVLdPKaM2IxTpYkd`Q94P3FZ6i03NpM zJ9Kie(nzNj}7SD z=i#b$}@K7JVAO>)h>eaacJVScShb|8n{gBQN0(hub`vN+%13Cu+c-XG~GH{zj z`Fe)<)pFK3R3Ev_aXrU*xX7Izz-I*bp?v2C@KC0F zw+8rOyY3F~L-{`H;idBZZ2%ADGGCK1j#Bxq3gBTqFY)kF`CcEuL-{@w&fTO@?9Um!+Ks(hR)9dcqrc|13IC6 zUk%`4yN>#_tEcJ{!arCB{z(s4yEL_pz+S0iCNoyi~sb6wnXl zdsl!T^6h~DKa}qi0e;xtX9N6DzHfSXseH#YP-%`*`CjPZrSi=M@UWi$qYRy&2kv=%oxO6BJ-=npt#8E2W4+ZcP=`kNJ_3%>p{&fHk>v>HX zI`;+eP`=3%tUAN&e@y@n+f`Qv-dG0SYP$c&U6p6yS$^I5xl!zX<%aT|>fxpGjRJVsuC_ApWo6)99pi?wz9$CwAs=Q0_@R8W9$qTnjsPCYcXvQPl<$23 zJd|%=89L+i5Qw8xzOy{MRK8yf;9RqluR#qxDKeL6me&!JQg9m3b| z+kSmqveps9pY!Xg)ec;QrzbdobXZ4>|1rP5P~*Tw_>@mMz_=3lsh@U$@g?xN-fylg zfiLm?SzQVI0zcl@m%zX6#}B`pP^`~pF`J{oor>`9`{zU6jVi*&_yTK7@cnJ^dxe+} z@%z2+#CVQ5;`$#J~x3rQvUkSIXZ1IqPs1&KL*eB z`K6EHv7yP`c{ih&6x)Lsa26LM@qf>1pWhcG{*UHY%Kr{vLOF(Cc-+|J?&5wLr^Wf> z^KueK%74J;_op~}@g4J6kG}5nHxx14MQyV?zo!K5n`31vX#>9)ru+Cf!RL?f<8vwQ zCKAM#QvOf%`Ah2+w>zeH4Hu$Wntz$k-yb9Tb7}q`03S(y6@{465ce6b1=S<$JFHXgqC{n)(6+MFL36NS#s?wtuvw=}1&dj!(k5>FM*INY53U~bQUQwhy4 zpJIh{ZoIRrs`-R57gjb`zHi#0wg2KbP|fC&bme$NFu44cGn|$1DG=ike!PTk{MXzt#fXqmRYF6yd{kt_PHebc2k7fw%1LpVf@qML7gDb@2; z&K_@fvQAacYiDy4-_6`*bBpWJo3zn#I$wnzRf*pPG7&1cZo%Yd;vja8-C2aduGbsL z*qkG<<<6(7EvAjnpSrHPuDN?hq9yUG!q*Px`v2R@(_!tAC!BEMsLJ<<1JRyw^+|BesNmGaZLJ&?W)L3e72{dUw8eE*Yk$z4tV_Tj*RC(XiEN%a`*OW%I>qir zlhNxxGu?*4?A^My;^MCZ&Jw;{`;aOkL%lXxj|$nlsx0c`ozWf7x-hg&?1G(6CW!L5 z4Ov*Y*=X9XwNLthL<3Rxo<#Q(iLQ5B{`i{Igw3B1>=6CTXo?rI( z)4}`P?81!Qpq&%r4MJm(c1Di?+d2QasF3_Nd!)|MevJ#9-gfV3a2JCL94o8#q~3#M zgFUGeV%a4-WNwD+No`z@!+4`kwW!+0RVblXweG1$rZ#R=Gzq`!xmOytPTd5p4v}Sl z*~_?&m9wXA19v)5(4M*;F07(`r$C0?U;EOKH0rP@@-?61f)#x6 zY+@8#gB2WNeK(s~G#*hGY)2bL4P!=Vk#rOP+Kw#tTy^?77?>?Wx(7z3dhY+AHlVLe z^(gXG_W;T}g`r=8B|a<;Ew#WBM1N4wp!WUfvy16QR1_lT5xMhs9m#=o4VJVy|>yr@8(D!Gf&Q zDi+1PB6qK@6zQ12_Nnwy0udy&{t1C!@yL{B@p7Js@<-X0&PqH4^o@wfy=1ZIgzeA5 zpu3dx0HBV?L`uP1EK2ilb*Er`?Ffj-dmucC6;|LG!X~t9`2cnk_UbbDMrU5J6?S** zAgN_57FVGnEusBde?cLs&tu`|5%QTx(nP=6N$j9!AWR5Z#ee~#X3bM&+Ue`;(Qo2D zK56fdq&EKI1J*^P1VI<^F|A{%#^yXP^V;(_EECXSuGoTWwvA51j6|YVWAYJ$218Z(?jZY>amak1fctW z)$ju}+}92P5*m=W$(BR3Ad;HEpc^AQzeo||6a)2netWpyrr4*6hg|@<7l;9OOEzI~ z>-IsL2*CF#8k{U&R2aY8Z;UNaFCYv3*4>+E&h3OJataCa%+-LQyI^t6cRZtT78W*R z0T`LBj}a-3;KT&Xl^u&aZ0b3}lc#487|BQBU@%fdJ}g5PlGlJp`;SX*)_^lrSZa@g z&u&ptYHS=Vbg%TZmb=?NRxOYLK#uCz8 zcf{eKkKlU2+*-4BDp{32Qf`6*^guo(1 zl-=H`TcRZsl}&>gnXnaDqC=wjeCjf}Rdmq|{V$V0DU&~kXsOF;Py$%9o3WpO)71(% ztzc;0PEdNfMsd*6Nkv8@5So6vP3X240TGx}(d{`4_edXcnvtyy`~O}r+V*Fr?Ogj~ zMLUynD*Cq6wPo6#u1{OUX~juRNH&C=J{20jfDiJxXDH${giscXuif^Df|V(}bU$$@mnD-U4n7H&bGLhAG^3Qt)pt(kC};M-q#n$ zTVmcX9wFvEL9DMfjV0ziDiXxJC!YLU1-`G%juiNQw*ueCrdItaTbN<@t(7PH`Nar< z@3$D@2!Zd3|-7$3zjy71*@AYHh7vt>=hyI0(Mbz6pjeUKS+xir71MQa8FXJRu^CwX@k zGa7rT=n&Q)F`)<*)0(C1PKdjxL0mBEL)Q0l%;Gv-?lH?J3%TBc=V58gE@rWdW*+P5 z7F*Q?P;Ly`I@vz;1n#bK<`L}|w)(4-AA??>zbUp!^p7^Qm}0Px3;6GAK_K3Znk>h) z1CQyT#b5LdNwxh-G{?AZN!WYw)Y~>6rX8vl_TG#HhDfej9QVGLI+n)0e-_t6c4&JL z_`bvrRaeTw_~^^@TMN+aBGQ>5x&w1VOu!C>Tr3xRIWuj?+8@ahsSYg|eW^&xwEf-^ z)l?P@(M)LEBdehR*5hS~nE2DjT@0+(qHY9F*!$i5c2#97U0_SurY%s+PIJ+mQX79M zn?$?bgwqe1DM1Y8D@z`JIKzUx3Gs(zr?D9n2?P;Xl+Zzw0?&!$XyXLIC{y)6@7sYD zvH7NK#=o+-^}B6G94MIJ#*45`CV#uP3S^2K+*FBL; zos85kXC1-Mv__=v&{^N=%Z!`H;Vo}9m?;jf$_TI%+jU5UXh<*h8Y|h14 z6QX+5VAy+a2QBRV`nsmyRhoK&}0q2fZB@?A|FU9CpF(og%8U;=bK{6s%{dwO*df z{=s1Pw+{(+F9nE$-S4$v_eK97QyIp*R~Y-ZhboEWl-aNcUR|c9VJeQQ`(O1cE!O;)Y1wi`j~JukN1O_%Mquu`y>l z&f*5@6c}@LB0y%$xzQJ!fCDjC zG@JismF#zYHvjb|8Fr#A6TzO-0&b@(si8Ih<)&iEHrHjMu9)>xeQD96qnh&_#qj|{ zq)wN~e@NNW@o=G=+T!}H28ahVHn2!ZVEgTg)7NDB@t(}q-;9p&5)a5wE3p@n!?R3% zt1J@z@GK2)mF4;ov(yh}$tE69ZLR^Y@TWw$KamUiqKizQ&Ci4HpP5~#`I{g``Vppp zY&{|Oa|P+E*XjV~#>O&qWh~wrBgH;<>3u#pa4+VRF-~9?^gT*En@K#$2tu^_E3J=3 zxt~MqZgL+0Kbv^AHSsj*{YsZHIK#)KuW;7~gI|q zg^9ZcW82RG;)X9D+dcwNeh3@%$JG<|vUn>0b-b--Sf8|!%MW5iIo(1%V4n|RZwnfd z1AKLsfQxIL%bq%J#%3{kg$-+0yGcJL(xTQcHYeVXhAu`mYah!@Jd7Jb%zD{9YUCVc z=*8n2SIWT2EgwiW;Q2KTqfa3;&odLc^{{Kj(|a& zdg+BoJ;gtKfH~F_D(MP3;OYToTGBW;AP-gzBWZE!wH6XrMKEP>aq4{~i}iE0;#S7h zS50#njiTg&No_K{ic>G9QK>dKD>Fs4Vp+0uv;~MlPk#xXi}$_U7X#C~c~&tty$eWJ z3{US?eTot4t67277`;G^-#0i$?}^9gI~DL<8a`x_dtfOe zi(m@C%_M>KWL=S>=?OCf#hB-;yf!|+N`^;t%SxwTpLv8~=N2$oVs5)d(dcb_R=?Bu ztRAWHc|n=+dAyH3k1s)7de$50(6HNd#m46u&q{X)Lth-9?-$p5O(wRw({YyuK8?#w zR+x`3Z{za~#WCAVG~=+1-BhezxQy4b&KjR(eYF6zk8^6{n=Tx^TL2QbwTwe=!rx=@ zM}5ZpLq(6L2ev^=_4A8CT)m-6D^>B4adzjBPtGKv@oRJ_ zo;~2$8^ebz2GMbOX28n*&|vfpAY<(pI47FxI2b(@$MjGQ)&!b_w8B;|xl5~O4F;os zjYJw+MYW4Aa~I|y4o9ziS`}DEo2mKZ{4}oMPp5TqK1|9Y&@%zWs>~6XDv2ZaaNYhC zRewQuJhY(vDqX%#0v@f%G@)@Cm>TQ26~}R5-c-ImA@1%Q`?y6UuO?^((a8UiSuv-} z2yVma^%q@ia;pVmi+vdcX#S87Dz4sx64xK-yH&B%{8EnL+pI<_Zno^UU1azJrjh;b)!UxXM#pBj7`2z5a&H9aLRse&zC-e zyn$X2Z@q{2>@k~0Ro-4XX7i}8 zj@dHm>@nAjI%CZBqoOf4a_${kgIWaS5=`l zgol}!imHm*5Xkk%?Y@eXp+~*l>J6`<$EWO8Z@mpYrr2$jFMlx2y_!3^qH_>rSLW+e zsw-zO@l-CuJ*7=|fStjwv`xyjunc@f8Tch-;PR42qW`yL;CeT0B>dfF;CdBmB>Y2V z;M((VB>ZE`z)vazmt!*$9r*ww!7nHSzoZQOAIiXQDg(d04E)hD@K?&fs~Ma|s{b)% z;1kNg%k6#rg);byfJ;9&`L1X71{s#y`}#X&=x9&Gk?Q}GGVt5Wz<*r^{$?5Yd+^Ce zD!0B2d`21goHFnwW#AW;fq%CQ{O`-a|DQ7Oo6ErOECVmM$MtJv@W=3cawNW$+vEE5 zGWcI8178MQde!+cl!+rAceE$A>01f>BH$zKHLbm`M}q%z3EYhn6%{`(1AnXp&aEA< zm4T0=Ka5oF#1c5&*$$p&4Z)A$6+?VB_LFv7RBLBxx9zlTGF`HdwcG02VNQuDl-X)p z8_2%(Hohf09)Cq!=T`XbY)kh;Ua38&hh}iQ7ng31>zXwTdFAjOd^?vbaltJY|r;*t%WFIZ$7Nwcf8_9HLZwfT==gYgk}03T_q@R7Cv_xp^Ou+(k!Jrp?N zHsx$IUfeFcMA&c3&frCH7PqSY{Wbyro!fk?bF5hP_4yULSlih-bbsgnsykJ?{mx{7 zWzRL9#orLl6p%x3eU}l#GXiqxTTNcgDZ(!lkVE*Ii^TXFxYi+j&6#5Ow*}-7Tw_}d z{~G~01b-jD82%3eatQu@elh%d0XcAQtn3(mmq8uA#SY6znIR4l$k^HKgutL9~;1H1Ngsq zc&T3fEWrO*fZrFuj}71h0X*c7VwLDneLl`Fu1{S6uM6O_JY1(w1aQSL(VX^<4l$k^I3HwE301x?d zv4@M!1b#7{9|!nhzql)ahx+_j0N3ZjF`c9R5{KHQ%NXA5;i{*;%Z%Yy25_xC#PF>F zT-#5@@Or;AA^N(E;Xn0o(bwn5F?>e=ZwTNI1#o@m8RI`4z_sQP!(RyCCj{_U19)Qq zZ}1B)s?Ui5{Oka(Z9roBe-^;CrV_&!2k@|8d?SEQ4e%fKaPdc%F&#Zy*P;5<@r&VU z4;Q{JWB6B&;)X+dGL2shpZ;z^9i5QREde~_^ZWoF@_A_h58Hc501x@|-vW5Zhkps+ zA)k8#c*vh$2k?*&hXZ&h-x+R!&iEF}_W}JmhCLuL0^P<>yHnj5$On>@VN* zaLFs=+kX$>A>V!+z(c;>AHYwBRxHP-0(i)`R|9y+w-3lU;81-+{xk>h>7>Q=&?D}aZ5eldWDe11KEpA^tJT1K2h^$F$p!2ll0<+A}il*^I;9?E5N01xGIO8^h~ zUoE50q56dU|6~9U`_UIYyi~p))u6&rDwl7_X&3>%$HPnIb!M%h50m4*0Is1ame-2` z{HOq)RAV?q|7dHvOTfIl;UuL$510{9vaSG&S-e?vfDrZFz}du8zdM;ZKD^6F5# z^ox(n{Y4Cq*IOSffye7*{Uz{CzP$gWy*Vl-tzNa5@Wzvf5;b`eq0jv7qBUJZZWJL+ z!KRk5urq1ps;(uI2!#77TY&KQ=dD~jsdM!z!a{Xj2$>}-7EW5SjBsHK&tDR^{XcT9 zC3AwGcaMssn*7y2#C-Ah@?FD2GL~*Pg+Q(cG-z{dk}`2U6l|IqxC$t#+&z2Om;?}zbXQe1v~ZX!k3p)Lyfw;$90!S=d4$E)~S z=ZK&3mzHlE2LkWq7alSH;_}ZSQP+N0E28!u>n^<*itsppd|ph-NcsDH{!)3z_wjkP z&tF=Oe^6+1{bJ!BSNC!KzY$yu9v|<~WNU;Y&KD=;xsc0T%Kvdbe`&qqcE|aDz=dd* z=8xj?OA0K_ul0zL^#3yVz_MZi={ltU(xo`RA09_6Tli6({#R7Y@$&)kTdrVfe))uz z{7R3_nnZDY+0U!o-5}rNd%0&LvZpgRZ<3OL>+q&^ly?WM=No8Kw$6bnD8f|@|GD@|)c2H$z7M-H^RqV^~jfbJ7 z6$9H1BT7YY@K)wGRlxNW#K)tR*;LC@+1zuMlQUmN#g`&7j%vmCncObB)C<_EW+t~^ zDA!YDwCHo}>H*c8bi;Xz&XmUcqE^}fbTYYn^u}nK+Nj{x)U2I+>7|V?ie!amG*R;C zWxkcwwjLCxJhbtMVjH!Ig%I~q4~V!b8my&mTnrGxjZorMKQXDWE)gx-P381NhfOJ{ z-%j>Q7{WVc*#K^wrG}<$%hhNPi*o4wCb8{S1>TmTNC3V?rkeShI$kBJqflDMD?yjr zb=3VdFJ~iYRmQ#Z4Rf@3A!w7%g=_2TIrHH^FF)zA(wvCTo3>EBEHCnL!wc|Y4DVV) zv<-wTh;ww#-DfqJy*v3E%H$2f9qw~m^4F41J(G3auN|5CcHadmNPZn(okWY0-{RfB z!w39pQ&c<6aQib+5HGDTK0W~!zgPu$j&29vnQG(qT%ThX28wej>x@U+AJ|dMd7;ElsU5QD^Co1F9NL-oshJ64k(7!ERKg z65=7L`+!u5AgTMgPEEL}?f_|a7B-DkuE~2HJ95wY7VPr``bm^N`8vn-0jl>s$IaUK z%T&(+uI&p#EpbLHR_00nI%=n zbhe1iE^erk9n11jwCvUyg_aMQ5_FnzJ2bnHJU&}UzNq4&m-*lTD~k$e69=P&^@dvM zcy3>myMr&kj?D5U0S2L7z{Eh5IFu!WoPbPjoANf0kSQd`Mui#oh-7PmeKjWX&E>@D z>^zXgrpysW?oc-IT$Fez%3WL6BwE7ZHQ&UYQ6b6Ol{I&%lm$xRV?XHXv3;g+s#9N8 zHQ%B){I9HQBY}_K&MeeCr1JQnBgv<2J9VwE=cXzdUDL3TNzjU`>Z+)1RA__LRdwr( z3EQKs2S@3v|8@+1yjDiHEX@yVP`Ph&~EDU{pC9!qxW9Y&L(j4R5OS7OK#idn23sO>5%8 zD5u>6MBwVW4b~c$K_&F6DY@;@9S2o=z6E)#%8KA?J4D@@`>oor&yduHH?@tA^6fVe z9m*6U`4ORA1MM>k$&Y4o#^lSyhC=c)(w{956-vLd#k#_7Tw;)cPCFcJeQK2MtDp!9 z?eB4~QfpLx!T7iJz!8ErsPTnUO_A3*>}OPK)k`nOM1}FAb-mA+^n%}_NX|%`K^~5} zAAeJ~Q{&s)pmjstHM*s;*Hfdc1Okl#@vAT%t>uGBI#QO8V8*o;YThGh>?e`yN?q^a zI>RTFbW07(wdTE8-W3;bXiBHfg_#5Kz8r!bG}vhax;|jn$y;fi z;WyAcl-SZXTiWS%y-C-DLsps^#96L4j=)P_k9C%<$BoDou}SGJE2EBkU0q+NsQ9Lm zv~juzzTY?nK^v)Vs*61Q002)bHNk%(1$wV9((IJ(h0b_j#)|tr{(iHs;sDim-;$ZH z#9eNHZA7MFSing2{Jd4gxRDBW`g)|R2Y8oQpVk>5HKB(0y!n!*iCZk9+Ap@)&>C@L z)>dT1A;#nQlL)lbns>Q5g^;AIE9;DHD2HR0^JgLDs1!+wVZ66)B|Ca8`6_M0w(;gO zRA)2gv7i{qE7bD*nx-g!bhN1E#wdSk6urDZDtsluN4LA8<4k1hg4x#p(pVCd>yitSNl3VLmiY~_Sf?N-nq2ZS*=xuZ^S)sP+z_nDBd>Vva&aw zv_PV3$-6BsYEHw=n^Cv%aO$!TveZ~aH@DJ#Z$6IgB-(sJmTk!Lv)km|Q_|EZ-`S+W zX9G2M$YAEWaBucDZ6J2VYNn%^?tw&8>aTWZx?jdk0TV_j-vga$<2uO?C( zPtg@Mkkci-x`ryynKV;IH<%F#p5Plz*ARU_zkwu%iP4!t|o;CSSRk~kbM$=lg z$t71RS!w%xT7yrc+q*RE=sF<`c!Z`wgd^h2`+eGisF2*uY;EuxI`v3#vW2P4%M8Qyv(AxmnK`L-I@CC zKf)GvTuj`NyLIa`A5HXi|0*$|4=$&AHj$Fa*Ryra0G*flOg3>33{CcFe?xe~-VgQr z`5oYElXTZxtw4iz(ThleS*KAw^B)W^yuig6iaHG$hI_NCvF?D7)qJq z${eeUw&cm+CQpu_YtnRJIet!EwY1A$^RCcUg@FkgQ+%}%vWA)GOJQ+WJFl=PH zpV|=d%XA;)*T?m)s;GN+Rm7%<>D0!L@l{QxFf);zex>z=RL`mOew@+1@AC!F(23*C zR7XmCqwlWa#E~H;oO=Y5NK)d7hBEIbb8*6i2F*C0-Qi`}s5Is`K0OX$GE+ z*DuCSy0sh@V9d-Ejj_W^O>nj&HnW4)6{+C!#*Q2^tMGG@HVlB!)4KOwBDejr@Yv>F zpS+LzzU9R|F60$C*T&fo^RFXqkD@J#43^C|u!%){7v(7hN8Fc?uPk@Ck;{e zO}3UWDs^e+*{X`%(!zyIOmSS!D0JOh#m;v>(U`b^fi_!cVv7Pi*)t2{H%#u`^g?rL zRio`awZ0|I&Ew?yzqvCofA%maLA%|ydlKmf83}*KesnZ+|Ew6VjXMmDw|rn z68=U+_XRF>}$E0ec1fe#~jjliN{Gj zRtEM&3gkcQcgVlR%OAOS&8i3mKcmITy)BTt$(m2|5&EFK|01i^Elsa*nekjpBtQR@ zK=O1HIdQQDNC0A{F_yXQNm1nu<~mC5nk1n{sDm`&Ewmt(zGnMllk5lWg}?qADAoJ_ z9fHSu+)6oPlea|E@dm#+{ogI{B89t#3%U(KUoq!*3HqTyL2JFQDCmRSuqa9Qjs-n9 zA2E5`o|pgm{e9H$?(c6c|Fd}ODDL^{wCl21tzMKM7QVV7B2FeUg+|vEzl|zbXHWjt zI{UXI;p~g#aApU@O6yX53I8I>)JbQTmAU-ytg|PlWD?Jdda-YRSNj*DOZ0gPIzcKI zCD?cLxauDo={Gb(YEQl%7huFugqEGyFEnBO8CG*uko|s~#K?t!cT;f+>Im(QgVMJO3@EX)-BxR`*Bw#yY7=v7hZS z=}(vRzpIHrCUFSXj8R#Vepch93Z?6OL?YK%@_jvDL>rtfGA)qJvQlPJ`h8%vSKq6$ zf^tj`+OxSw)FKmoCb5-g8nHUZ6;)}b0Y8mPU`yq+sYrX0JzHthU|Wjx*`oflR3G`8 z<8&h}c589k%s#hOk5g^ydY&jAe=&B}u%hG7Y|wMFLiH{2V&d^@NObFpg_<8K(I6dl z%MLRhN>ESN;LXYw#)7Ve4`XjL3f zZKxqE%%4%H?w(zkyAL(@d;PwUT2*}{{~EQmZyMW&BiP4}4d2$>gV=w|#j3|R-=_2~ z`8vPlw)2+^%$xh(c!ldR?YGh858xO<=NuMzI__ulk(oG1<7YYtX&|++MbAyeRa)lUl%8vOS2VVg z?0a>jw20p?v#c)VtG~w+EOVK7GGKf$OH`OqlTAF?oZHiqx=xPIaeJ}_o}=S=oHcMN z0VKLnHm!<$X&@>@wC@}|l@9IcH@5ouXnIy%=6moM-cF{^jExd~>N5GpAH{_?=bnf3 zZN&U&%!@vImA0o;BM56Br4JTq;@ecSFfCJgDghUY)z3HPxg8ZH4mRidp|wl2x~;CN zCSH;e`jR}Q!P@ODYDTO-@|VqmTkB1QE?pSeDwaWFy)iFLep7?fmd3m+f0LN4?j5^N z>Z?wzOr2sqnqhimdNQ&e-Ok2E>remBQlrPc;&?rJ4&pOTM~fcjM@es?MVV>6sg0*u z{0^F`z0jN61tuqQUutSacs4!PUuKexPsw4yJs_`;LZga{mGe+2fHFwoY%j@1yf+kz-q7&cCs36Oex=wqK9=DBuOv^N=vVwgaZdLniEKa8zq%|LVHF5*A^nv-z80byP z^03|pXaX)Z=V$zsa%kFfdt36=KcbA=Q`a39aoIJ^%8p~&)_xQ({-~Iy;;?z2bJR~^ zOskJ6XovPhKlT4nOTMOC^&L`C*&M4Q7jDLI`*3|o^V9|%$ekMKfSv*1?IHKV-|+h73yYm!1^;IM=k8%XnxH2DexpCn|N8S-JH|&$!?^K ztF^vv&MdZ`GTA`nn++0xH>8p_^Z*ht?NG;${h0Un)zw=uAB47@YafvMz-pyW>m&&V_HibFCr7=c4dygpaEw6DBh7&kTnhX zWDT|`6*_BzjO4Q=xADq~d2K8KRim0MJZ~x_;qVBq8*Z6-VomNjuJ52M5W5DfTOb)iUWr}gm9=re_>#1L{o^Eh2hD-wJI3bN+{~k_EgSITYMGc zy76$TnoWD(7v(STPR!WqJ*l1>|75U!s+X%Do3ENo*JD8TmelVkU%yn;y)~Vkwslzj z8m)ep53OI~Hubko`dhI=YAn91{Hd|kD5{$(p#S?;TPx_I@?S@!lmB!+m^( z*jt;7U(Axv*&|;OM}8L-x_9kCJt=hz>!?e2O_qR%GK;sxj9D*h9Y>WCcV2*yt;`U; z$j@rAfS^^}*R-e+dyR!<7cLh_kKR^E$k9IWUk{nj4G@5CTy}3tmM|~ zp?>O$i?qyv4Awz-R8&}1BEnpGwM`Bm8SKmSpv-OSCsu^xD zZ4$d45xZwi6 z@qHQ-@vyG;RR2_da+=kQ)vdKblcjS zqdeVXC{s_t(5Nu4i+f{k;X03<%^Q6Ts?|SK9#gV}#XhUndYQ)RvDK*dFtvQ@la8cQ z%W9^yCZEx^NcbI`k5RE&dIKmzFS%*y$4xa^DKKH|v(k;hxY?K|xv9J#6ZhYk!`L1= z_oY*swfM>+KfF|%G|B`XV4>yBs`7mNh4{FGpPstlowqZg9-D09U$!Y7bC8kGk(OF! zr_EJw{$KRI(ESRU-HTpXvy;~BqJpYN{v39UP43cTgsk<-g?JbAoab20sh%p$vsJLa zR3;;ttEN#d97rosjYMN>mbFDk$Mx(Fi+u@AsMs-E+)I8(+)J8aXNkxgc6*3qPLZs8 z95N@@n<-hsx{!6Nt(oIz%l5`=SJ~swh)q3jo_>cc0R)ph$2mVbVaxN#W0yDWj9YK; ztnprN*Y%n|J;8D)%NF`ngBFCHLeIB2rri zwjGw6s)$v&jg|Wvd*cYH*{TG&q~P}IYtE78IiSiL3~d>sB8)0g1b>4KVT>!hk5*W} z(}ln^m#sEy{me7l2KIOqHKxn`R4B`#tAx32V*l}f>emYIiWdm;?{SNRHr6t~qc&0-OVARXVGZ!Mw=Twms9Xy?<;(b z(ewQXBpwmm=sDMoo^BQ{jg@4I{m$0AyBI%ZznJvAwf&-tFgsT7(>RL#8ZwUl?_(v2 z;y7BgT`=hb@p#IjobNzU!a^Em@1eeCtFt^d7;e25dZMlyD>$mGSIuZQF3_PXW9vo! zn9@CdWc`GhFYCrUy0DS8+6D-Rt8Pdi7-V5=z|d|PuwU~@_~5Y0l%g>AHFHI9!i|X= zDma*=*4ftGU5u+@V-su~ZoaTCurC|4Z|hq2%O5hH{^`e@A`iMDHIrf6Nmz{Ik^$Rr zPW`ewmPC6o^Q!)EzEweOa8x!6j$>0ZTJ~!kI%rgX#A1~qxoNi7o;)O4cR9<&vj3pv zvXRxhBzhT*r-j38etM))b(R=7@@Q)Ifx5_L@&3t(aKG3p|}(1g(eZGUYfoQ*AI9GI-+78I_kpr>@aP5O4eK zsTmIn46XdIc??~+IBaT=RFvR&VL$H13__-XE$H8fd@JvV(9~*;qaB0e=uIPxqxR+( zdL?x%4tkCQ#hxuL@KOPzs@#a8YB3g86E2WmjmB38W9o80rtS^L)aqels`S&3sns^7 z4$^YW{a8^uaS_ccv2nGUk=9L`Mjl&PYWvR}Tsxhm*Xa)%T-_iNo1OQfWY|C(PNMvm zJ7tA=fwSdv2l!hx>T>!bp~bB@?$EWatKlw z|CxxlkgwNuzNtx=8w~RWddQ1aDj$$dR|_2{a)SaWojmS^&0SHVH{z2FsUP-as$Mxx z3}kuhprJMQaKuZ`TMXZgGs3*a?wQP+BF(Lf^oXl9cUQEVXA`Wg9_DqgIi&H2JHkhH ztR&dD&B*IRckv=*C(zd1>zUkh`YK`pcj%_FS-fIxnr88e&wHO5<}1xuWR>CdkH}ZT zy$(%Ie{b(K%X&gkjoo7s;7#_p(*8bfM8Ci9_vxE-k1^cBnU4c*VZQ*IBal4#B|Y{e z2F@Js1nIdmcS>KT>^v~&)H$&;A{-8tFk(E0X>y;K5s61tx}HWV)r#ihDYCh@vH8qJ zNh}HNQ!PN<;8Cp=u>LYj=OY`X+h=RMye$|tuA;^EvCxeGQkQB+5>0hghfJa4UKCH= z1-Xw?9p#XLr%!n5xyMobMW(RgKCozvB{(NWwU8uLVbzW~)Js*Zg}J;g3`F&7Eo61W z!L52zOKDRYBt5_qi!wauOSBS!hKswwvacB2yX|`VHHZ9Sfw+~iDnn)neyh!|l~tw52WT0^=(NqAVXR;wfH1Ee6->I*JP}}RY%>KA z%_Y6~$h1x^mFd(3R$}#-EFr9}(Sj3ORN+9hNV`t7>!B^Y1QB-&=pu@f65o(a?|*@PPCVZ z;G(&nb}9Txs?FV6idHG~lx7~kbR#U}eHcm=&2%*@0;F-(NVy$5bu|%&v_G91JF_1; zw;DuPPxGUN>D31yMO`{>bgo2Wo+B9*)brMH zm(k}#U3#^H&+_z@kov7nnF=)xlKy3O&zBZ>i#wQl-i6(-7ftms)+)~&APPvDxAd?W zj8)zoCG>x!RrRhv!znla0B?0U1vylVRG6>3CeJ_viSut{*PdF2WQ>iN=Bzhy$ z%2ytaY~$VFk5X!lrCtvmpOm~iCN9G!;tpk#?$D!NMJw4VWX=}hNKyXUbURO9baeFk z)-bqP?z>gIY>#E+S%!Jb%qJAX845143&y!vvFNO^F}h#VD}cJmTGV0H@g0SXR*P zNnJicV;Ow}iLOVYTDrhujL~X*VaDxIA^Toq3omGb)C5>%kiaVn{-%zb%iZYVQpX!E zA0Qd-M2J+sN4aW%yYSmSshVM-`WPiOT9Olt}hGEjLYZl|#J`yDk;$b==?2%2hth$2ip3i;C^{PcKLlc#8k(t`+#QojxGSQ~=| z)_BUFJ1wfr<+8l9bXF!kNPgrp==D{1gp zMq_@LeX^9UdD!W!#6`baCd>j4NVF2dhpxIcZBr++PT7d0q_*@g2f+Q(Ej`*djnh@*-HKD{I+9-4;t}Ow2D%S`KuV_NPD+Mre0R*XF64WU^)u6XrP0K& zGrbN|62ORfD`9zgAQ-89Q6@&-WCtr<{d{LsXG+M?iF=N|Vba>C#DaW6(Wrm$^I~BI zUD2{kP>6*fP(wvyZ-94->2iEzq|Ez(>syQ`$cTMdWIM5~=0orh4io1*Fdv>a@roX+ z;(iQBT;^=?gem^mFR>eMOJ6^*s4R~IPi0Of_eQGcAkHFw#)J4k9d%7-6jt2LTG-XD z0=PFS4QJ^#+^3e8_*U_1^PpJ+dxV9s4(CH*pV{Ptn(}u0v*287z6Ji)Zf1=^YILQ2M2Zllm(09bTlIr<4 zzM73Csy-<(vlLK#{$;YX?-h*Q^L7R7-M98vF>9rgj+Jhf(si8lx5!2}Mu=;btX;zZ zS-W{jVxEmn-q-DCW@MOSeD}LpRPuQ=V|kRoZRj3IrZ#pSDt>2@&Ap-SB&oLMo=^ic zp_70$g+sI4?5%rhWvb`sw1nwqs8my*Tx+9+rp)fGni$%w!(cewdMHZ&ViF;8daYkA zOUunEw4BI`G%PM#3a`~u3eTw-BbbIKfnCkWy`uIAni-|2ZoEYm*%>T=tgopwO$gjab9IybKC_*jB$ z=3&F90_LWZ-lKuwHW8HSStPz)H&S)^KIT`9J@TnzQhFXp74R3fr+WU0PiHhH>9K^T zA_t_Scc~*XFUi%Xx39hps`cCDa&Cd%H=8M)Pn9d<=dr3o^=L8@t6jEU@AGzGQm6sjfl1PO#>%P2GG}YV53m z>~xe6^wh?$>ubeW5aH|ennBZR=P(~G#YPW zpHcrDR}n7f|W3%^m1b?t(oS zwDnY~aPG|n#8c2pZQ{UOvNiWOw`?E5tpvi{Uso2d(p_9tcbU7m+BUH%_MNNj({rtj z^N{Isx8qhmYKkh`7+lg3+kfcu>WzQTqd*$bW4qmO!Q8EemvQIqWF7ngUelq(O-6s7 zyvddaFl~g$j3k6Y@-oDT`I^UYI<^LR@KCc}qWu;3*H6aU9>!L^G51n_5}87bakH$^12Lg1zOx5{S3Wy zyD2eq*N4SyUdHN@K4g6undgs;KP~(Yc%bNeRMO)wiw`P0lvZx{+f8ATeD7z}L=YXL zA()kv6p|NCSq@o|e(GR5L&e*s*$6fgaLaHY(+hx;_mY>l+-wz)v-^}!HQqx>u|3=e zX2i;fKB}`?rY3;Mjh4mwIV;0H&Q-KUJL&A_y4bK=s63_6lFM!X6r(_Ea3VnCqS`%* z8*GLDVAJge23Tbq<2{EZ7zx0$`4M$ouJ!$OJ?`&o$x2;AgQxVCNqe2ZCc4WrBOWZ2j|l)IKX$XN2ho~vwY zDKkb?MV(Ja4iClc5EJ(&K6Y=ZYameV75A`LrhgWx1yrGHQ#jQli)-1WrPxlboE}gL z1zb<#HU9X=%__?q3bJFen1LS0x)<+@kf9|H$a+6RJ|t&td^B}MJ*%s}bIzLlOiS+9 zW)@_LvW1)KI_*q%Po|PRd`cBg`Pmp2ZI63KL<}-`# z9SLe3R# zeGy<;lS~mjw&i79olRz%5FKSI(*}P(;P3nW{T_dRnZK8>FZ?r zW#8e$8mAZ;s4sx84N#Y&KdAghkNQ|WsLvKpFRsru{ywfxOh2yA=92ov^^faQ8`dXD zee5-~zNz;gK5U^u`u=YJ;ln?HwH19Y-*@=1IUapi68F_zo%-9uhg+dlWyu{y zpE2H;#h!PpX2{|@8SM-+N>4xBhL45nDeNJ2R1x#!?BH%O7m>p~J5dLS@}#+4UFK+) zmtvY*cqKW?e}yL~tiw=G!@x{d$#4OaBybT1Xee9PTrqz;J6re-U^3kUiPT?hd)KQO zHh<9`F-=vkMvG>!Bg_R_Jnw#k5q5>H3KRSJx^%zDNpQ2=?kd-acZEi}8oE`S9WtF@ zS!Fr0aTxu>oRopXca>uO`9A z8{F}Fy{gEhLGbEc=ND)5r$qUc1FcNBfa;x;{O6+lDwdh+4+_Y_Ek>ek1^yK?98O9A z`jkOg%hDo}Qn&<<&moBF{t@&x0{PLiJ zt@)EP`LC2#aH1AB#!lQGR&U~ainO&})|NclXdhi#wNx9qhhzrg@&e^TIjPjqa@wQr zXE#LM&)G&SneHdK-o|DuTdSh!Np$g_)$`q6^f=escao)EYg+XG z?@m&E|MKHu{hiSx!ju(X8j^1m<=v}0eVsRGMcX}m=)3RVl-VX}5pUq+*HrcW@~(g$ z17=j!*MDySLeth&^?d`=RCJTm!(US9>v$wUfDC!69u~+Kc65~gMpfVFy9M$~a}59L z*Jjf+H|RH=$J%m^5+$D3AXZMq6b#r zii1I&Tsxi&tLdvo-ZQHDPPns(EZ?5=LMuJ2eWhoxGL}x-OS9El^x9!5db-5gmaT)eF~Lpi zwUBmR9@ovh-7+3Fk<7BK!wohMP$9*YtgZH>HC}>|MdW=FDaJC;O)~B|0)5m;~OW=ta4cM^s)*z5;A(j z{j??)!(tZliU!X}$B#<&Y-3&E%tFiFs@aA0cd#^>t((J0#%TfHP2bOIqi3wGeR4B^ z53lLL2D*W`ZM^kdH^$k=_Pm2!!1!^`A(HuU5~a zyG;!^-9<{wWyjnz^$Iro#__BfH#1%R3Lhq=#jfmbCj05+E4og;?AXftPnGP4?3Zqh zZyK~T)U;PKZ5Oxa=~H*FXEM+Ish;nnjS(D~1CQJXPfQ}|1@>G_wTl@-dG^*=9ZYab zs=QM>Z#Ps%YjH?>g8WhombA2_T`hy{!qwM1)vElf>LOu{tt}(g@fPai`iNv|5|uD- zl#Ucy;@%;#$_0@)ZJo2&bDAV&SwLGaw;3|;j7a(g>q*76O7$c94UfG?k~z!8CH-iK z%+-&|3SE8IRV?0)ZYYydJsP%)CYh~8QQay{|&Cs4yD~4;oQ|n3+L4)y_ zH}~OtlNc+8+Up}~Yn4Ps%7UW)h_`UC3~yzThT5oMy!9*bzC+cjcub-d&f1w>Q?HLS}m%61%1?m+4k(#0motAt)Blqy45Q&>s+^T%(QMb(L942jAi1p zWybtcf|vjz@iV~y z`{)Uxf(E6A5E2p%Nt&D>TB@{3DyQ)vZ)>Y}S@jnOXBaduCQ~ciV3U)g{aYZj{Av zeA`A#ScZH~=OPLKa~@@-*UR8!azQ3ajBPtJu`G-A0^||at|Fb&Fc(U9m^dhd=yEnb zH@%W=m#VS4jgJXAV^Q8Z(kt1L-CP1jJRp$v1TL9{X}dy!m>O3o7KcI6e0@oI+Am_c2s1|d`z5NxsG%ki8mIr zXgr1MF;ibaXP7Q)2f3m8Ofw*SI%-A(jH?VKYSm`oA1}IzjUVhaLo4v9*>< z*|cya75nwc+m@=h?Gh7{U8ySPv61i|j*fBZ13t%O?}gMcGL{hd^&1;^$!%L&eBhPC zI!7;iWkklpCu`p_D;V}_o}0g5=#2Grd{|-X!5a-Ym%HT~y;-QnGWUZm_{3H4XnK`< zs$J!-T}v6-^=)?VS$LOEIc|-+5~;^xG8VR3V9GkoB;d(Zz;}W(7C`XZ-PDKgh0!rVvU_s2~&_Ev#CrhgP#(dyxi=dsz z%*Ic|rV!)$9+nD>ZOeP`?v@Y`V-)EH@(owSHKK1R#-3*U#Kk1Ge2^QLLK0Unc!d0E zE*~KyQIJnU@j%m$+D9*VKa{%-D1W_(MBmp%jqj7X!Ol^jNc5qNG)ql;SSl&B`=ln| zyAh;+*+Q<7+tW|w;*)&At^)z$t5Nvvi`w6MV$dCC@yi;rA1!xscIcj&~`rKdyXL08_b zu&$mVn=Pdv#tlJP>LU5@A!{8OrCDA^X@x9pWQ1cp!-0YKimVvcc48SNS>*N>mKL$E z`n@<#p0I$FCAV*T#p`(?GnRa!Xgf!ZI2XsRE|&*T(W-F&2P)bT_|Q?&6DxkA?Kya9 zf8juB`wQX3r@d-yY}o3B-)H@1$I2sC9@8)E8T((5Zh65%avB_iR?LD2Er?5$ zvO=LH-h|BK3*aTvxlBqt77{71FF#0KJ(qvJbYbb|ORp%c?4vk`Y&s*I8`!a;ZDSSd z%Hn0_pF(?0L>kZZ>i)j>u^$>uDOs_&QW|Pm-<%j@MPVC^_EuWmkFkV*68PF$pqB7g zArt??68_=o^XiQ3E=23^cpabV30lWLLAGW)dH4NT7Q#SJIgd#<5U!<@6KB@7u1PU z2S{vJf^1B&FlGTH>d?Lo*hOJF{ltGd+b@2l!a%xL$O#qZEz7?g)(&I%auN<+qxP?t zx`(U9IFtDR2jMdw1tV0YP~YuX&k^P4sE8B&GDr~0|$&g0h%s=@S_3zZ5%1bvTsQ0 z%!zNZ{4q9%7?xX+J#65lv*dnv3}u-I$;Z8(m+)1t{~meSe1kRrB=-F!pOy|46ueG; z2U3S4FtH?-811e!wm{Me%14EG7~dhx;ej|VMdN1%6eN@@E`Wu*`E9~}OaLJ^O{^ew z2+@cqxw}KC(Q#v?jRRpvx`$L*j4WIhdFE<)=5R0KQ^s{UTx*Y{?GloE<)bn}iFM)r5)9M<;uZceYgmANy4Y1n(o^MQ10UGpzX?$phOchS6i{H^!rRp4>qN!C z`{eQ25f`$9!BlSh$({Nnc>hT-PKIU0)UD!}I~CKhA;Lj4FqY5dKSsDBb2{EKr+Z!auxc5uH%Zz7ie32a z0oBB@R`5L!hJebduO#dpp)75;F>%bem zT!%H@&+-!-H%5LC@46oE$D#y%jL&lT`esUOZi9S}t0+5y^@ktfa$z+br68dasIPL= zpsr02|&j`E4#YGf%$Cac4<+*ELz?T}P2=I*R4^+*{uD8S;=Xhw7`EVGO?b zj>bZsOG`y2hBt^57$2^pWIi^!Z;j3;6JorIjVXdh{O32hcm|H3wqxm(-{CT_t=r4M zPH&d;LOHT%zRShA@6>*mV~I_SW$~WGP6ltGzMtLiY%|bJv!FBA`*z-mf-Y@88bJ@! zrsQWq{wsRnL3ZXog^L)lY3H0Bh0|!c5gjqC6>DW6`IgYqk@LIs-~!`@^RuAnZ#_;O zmVgs0W@mRY6U&;-;T7}oiQ!@HxGeckctV}Z{4GN?1CrF(clZ)Z{)R!JAY+RW6pG>C z+Y9C4mrQUO3t7>jgyuzA(2xL7+94o`o{K+1?fcfPoCT{LYN)};V{Fw-o%t4bs?|mg z$Ff{%YOFT$>C9i_Ya5yo3b{aqiVHD9R|>V{SVdcMJEA8NnY!)YMGVQuV##;n$=5N5P>GFa;OjWk z3Z*}81;-?~uNwJmHzPo$Q2%6<8y-fPl#G3oJ0l+8H-s*kSC`@7hu3vsg_p4aCkA$6 zW<1i%$hD5L)8R7sE&>Tk+=W^2-Eni4oF9H3Q)+DD#@%qqZQJ^gFGUY|J-^T7WI8iT zrqqY<&Lm8!A4EmK3Le(!@brqG<&=6``|bl}#kex+RhE)_nT_*mh~C{^ zf%Q|;WL$uPe*tFuyAi_(SYg&(>~+OB&BizJ^p+bt%Vtc!kAj2A|F3OKG5OzWbg0FW z8_id^Y&lJrFP{O-v$ad_r@d&iXdLD5V&J zGGjP2T{w4yR?I9(_WcGNOpX8G_Xq7{^KZ1z@j0{#{repG5d?k4-}OF6yW*vm!Pq{@ z>K8sUbt6|~Rjz-L>+fNo<8L5lx4cLp|6T2K973XMb%uioO4V%+b%O0X96Pp9V{o&K zG(8+-=yg1_Vm&gB$q1*bvuNt_P{nPn?mHQ4&$e5^)kVSwmEg{_vOcb7Sa*23Gyg8g z4i)T0Mv7}A2n5$~7H~ZLp{3(~am)=lZiNSa!w`!{PVlvZIbqiKBI9qAeSMNbOf|h! zhtccF6q6k9>m=nER^h$xer}ye0ZA`3^Vu$TxH^Lv;Xj>8r%D6x-Ln z%U&6p+38$4KzEEy5=QDDD{oNR`PJY)WDR$}qmVE=2WJG@7g0$BdZ%y(R`-=bh6hN= z|0wOlPU|jrDPyuAS@2isA*QrgM<6ZJN^GV8*&OqD_b&G&iEdP2=aMkTq-I!^)`pDC z>%0Djg9mYUBSs^A_w2J-K36t5*{X(lRt1)oz=aw2FzXcT%#=1;zXsIA=NTtm8S%<& zGeM*K*o$~tP0i2S_}C{VL^*65?C`~OyFya5{eepvSn4eNw@bnOLxHnVLRnPp5*yRv zzJYaNxQKFsQMCCMCf~qL;zVQccd*EsckumAzN3N}zn}$u59@mrgc32UrGD9@S;d8+ z*0$>En%35+HKE$7`i7b%?ll^!Z)|Q$L~B}Fnpy~kuCA$HT9=46Ew5>*ZD_jMy8DR?_0+OWK-q5rMEddbo+ z)b_uRt13DbRO3z`7p+>{T3z4TT2&K0Yg}77-ww! zKk%*peO%G0Ad_%RGAWin6OM4Ktx8li3`&qm!lcHUNrgzB6>6d>THVyxnrLaOPDE!{ zwY9d^S2afK8xu84TdETEO^r5rNL^LqlBkQr8RMA5v=lY#)BlUCqh}11+n>uHNFtqG zEmcd@Yw0Dkqcg8qc+pwoYFZ~xnZ(SRNZ>L*&|FuqpfjS0`eij|jjNqLY4W&M$X#-B zKt6u5_>`Ac{9VPz%BNMOUF4JS1J^2GXzBRM`F}}1e^>EYI^&Agf|HBJD+x@D3OJ!? zJjz4&?i!PFCpAKwi{L!RI$s3ubK!hBoo5fHb19r>!}$XEz5vcKI9I@V z*pqZ!U|q?Zu5+wwMs1+yjI1!ZKRj{N=;=sh>F9zPqoYVYq%dQ2*33h#WClN&Pnn@N zZMhlfo{`Q4KaRb)K7;Q_Fo#H9YNx|3t})uj2*6w)Xyl8bD!I;eoLHdSzybDIAkR@g zG!!~nkP)Fep9^#)z>Er&$g}@nu~-iY*ONNBo!caK#T_s74};wC>GwK;Cd7KlT1ZPv=msL&z}!u~CJM}D#LD|4IJ zM}*d~peplyv5yE9`qF!s;KM^ke*GSPWN}#p=!Zi;75j+LR)x_@MN}-$rhLhZ{QH&s zAA!#z{TOYV@H)ri z0RKt=en$YlIRO7d0RB+`egw+FP;xja0G|iu>fLv`;P+#QYa8MUw>=`($GmK>Sah zE_Pu%S(r@`ui_{Sr-;WX;&F=cV}diW5E@}pBut77T

    is+=9aU`A=Y@`72jE}l8B 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

    ;OD}7 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\n'] + ret.append(' mnvol : ') + ret.append(repr(self.mnvol)) + ret.append(',\n mmpol : ') + ret.append(repr(self.mmpol)) + ret.append(',\n mntor : ') + ret.append(repr(self.mntor)) + ret.append(',\n igeometry : ') + ret.append(repr(self.igeometry)) + ret.append(',\n istellsym : ') + ret.append(repr(self.istellsym)) + ret.append(',\n lfreebound : ') + ret.append(repr(self.lfreebound)) + ret.append(',\n phiedge : ') + ret.append(repr(self.phiedge)) + ret.append(',\n curtor : ') + ret.append(repr(self.curtor)) + ret.append(',\n curpol : ') + ret.append(repr(self.curpol)) + ret.append(',\n gamma : ') + ret.append(repr(self.gamma)) + ret.append(',\n nfp : ') + ret.append(repr(self.nfp)) + ret.append(',\n nvol : ') + ret.append(repr(self.nvol)) + ret.append(',\n mpol : ') + ret.append(repr(self.mpol)) + ret.append(',\n ntor : ') + ret.append(repr(self.ntor)) + ret.append(',\n lrad : ') + ret.append(repr(self.lrad)) + ret.append(',\n lconstraint : ') + ret.append(repr(self.lconstraint)) + ret.append(',\n tflux : ') + ret.append(repr(self.tflux)) + ret.append(',\n pflux : ') + ret.append(repr(self.pflux)) + ret.append(',\n helicity : ') + ret.append(repr(self.helicity)) + ret.append(',\n pscale : ') + ret.append(repr(self.pscale)) + ret.append(',\n pressure : ') + ret.append(repr(self.pressure)) + ret.append(',\n ladiabatic : ') + ret.append(repr(self.ladiabatic)) + ret.append(',\n adiabatic : ') + ret.append(repr(self.adiabatic)) + ret.append(',\n mu : ') + ret.append(repr(self.mu)) + ret.append(',\n ivolume : ') + ret.append(repr(self.ivolume)) + ret.append(',\n isurf : ') + ret.append(repr(self.isurf)) + ret.append(',\n pl : ') + ret.append(repr(self.pl)) + ret.append(',\n ql : ') + ret.append(repr(self.ql)) + ret.append(',\n pr : ') + ret.append(repr(self.pr)) + ret.append(',\n qr : ') + ret.append(repr(self.qr)) + ret.append(',\n iota : ') + ret.append(repr(self.iota)) + ret.append(',\n lp : ') + ret.append(repr(self.lp)) + ret.append(',\n lq : ') + ret.append(repr(self.lq)) + ret.append(',\n rp : ') + ret.append(repr(self.rp)) + ret.append(',\n rq : ') + ret.append(repr(self.rq)) + ret.append(',\n oita : ') + ret.append(repr(self.oita)) + ret.append(',\n rpol : ') + ret.append(repr(self.rpol)) + ret.append(',\n rtor : ') + ret.append(repr(self.rtor)) + ret.append(',\n rac : ') + ret.append(repr(self.rac)) + ret.append(',\n zas : ') + ret.append(repr(self.zas)) + ret.append(',\n ras : ') + ret.append(repr(self.ras)) + ret.append(',\n zac : ') + ret.append(repr(self.zac)) + ret.append(',\n rbc : ') + ret.append(repr(self.rbc)) + ret.append(',\n zbs : ') + ret.append(repr(self.zbs)) + ret.append(',\n rbs : ') + ret.append(repr(self.rbs)) + ret.append(',\n zbc : ') + ret.append(repr(self.zbc)) + ret.append(',\n rwc : ') + ret.append(repr(self.rwc)) + ret.append(',\n zws : ') + ret.append(repr(self.zws)) + ret.append(',\n rws : ') + ret.append(repr(self.rws)) + ret.append(',\n zwc : ') + ret.append(repr(self.zwc)) + ret.append(',\n vns : ') + ret.append(repr(self.vns)) + ret.append(',\n bns : ') + ret.append(repr(self.bns)) + ret.append(',\n vnc : ') + ret.append(repr(self.vnc)) + ret.append(',\n bnc : ') + ret.append(repr(self.bnc)) + ret.append(',\n mupftol : ') + ret.append(repr(self.mupftol)) + ret.append(',\n mupfits : ') + ret.append(repr(self.mupfits)) + ret.append(',\n lreflect : ') + ret.append(repr(self.lreflect)) + ret.append(',\n linitialize : ') + ret.append(repr(self.linitialize)) + ret.append(',\n lautoinitbn : ') + ret.append(repr(self.lautoinitbn)) + ret.append(',\n lzerovac : ') + ret.append(repr(self.lzerovac)) + ret.append(',\n ndiscrete : ') + ret.append(repr(self.ndiscrete)) + ret.append(',\n nquad : ') + ret.append(repr(self.nquad)) + ret.append(',\n impol : ') + ret.append(repr(self.impol)) + ret.append(',\n intor : ') + ret.append(repr(self.intor)) + ret.append(',\n lsparse : ') + ret.append(repr(self.lsparse)) + ret.append(',\n lsvdiota : ') + ret.append(repr(self.lsvdiota)) + ret.append(',\n imethod : ') + ret.append(repr(self.imethod)) + ret.append(',\n iorder : ') + ret.append(repr(self.iorder)) + ret.append(',\n iprecon : ') + ret.append(repr(self.iprecon)) + ret.append(',\n iotatol : ') + ret.append(repr(self.iotatol)) + ret.append(',\n lextrap : ') + ret.append(repr(self.lextrap)) + ret.append(',\n mregular : ') + ret.append(repr(self.mregular)) + ret.append(',\n lrzaxis : ') + ret.append(repr(self.lrzaxis)) + ret.append(',\n ntoraxis : ') + ret.append(repr(self.ntoraxis)) + ret.append(',\n lbeltrami : ') + ret.append(repr(self.lbeltrami)) + ret.append(',\n linitgues : ') + ret.append(repr(self.linitgues)) + ret.append(',\n lposdef : ') + ret.append(repr(self.lposdef)) + ret.append(',\n maxrndgues : ') + ret.append(repr(self.maxrndgues)) + ret.append(',\n lmatsolver : ') + ret.append(repr(self.lmatsolver)) + ret.append(',\n nitergmres : ') + ret.append(repr(self.nitergmres)) + ret.append(',\n epsgmres : ') + ret.append(repr(self.epsgmres)) + ret.append(',\n lgmresprec : ') + ret.append(repr(self.lgmresprec)) + ret.append(',\n epsilu : ') + ret.append(repr(self.epsilu)) + ret.append(',\n lfindzero : ') + ret.append(repr(self.lfindzero)) + ret.append(',\n escale : ') + ret.append(repr(self.escale)) + ret.append(',\n opsilon : ') + ret.append(repr(self.opsilon)) + ret.append(',\n pcondense : ') + ret.append(repr(self.pcondense)) + ret.append(',\n epsilon : ') + ret.append(repr(self.epsilon)) + ret.append(',\n wpoloidal : ') + ret.append(repr(self.wpoloidal)) + ret.append(',\n upsilon : ') + ret.append(repr(self.upsilon)) + ret.append(',\n forcetol : ') + ret.append(repr(self.forcetol)) + ret.append(',\n c05xmax : ') + ret.append(repr(self.c05xmax)) + ret.append(',\n c05xtol : ') + ret.append(repr(self.c05xtol)) + ret.append(',\n c05factor : ') + ret.append(repr(self.c05factor)) + ret.append(',\n lreadgf : ') + ret.append(repr(self.lreadgf)) + ret.append(',\n mfreeits : ') + ret.append(repr(self.mfreeits)) + ret.append(',\n bnstol : ') + ret.append(repr(self.bnstol)) + ret.append(',\n bnsblend : ') + ret.append(repr(self.bnsblend)) + ret.append(',\n gbntol : ') + ret.append(repr(self.gbntol)) + ret.append(',\n gbnbld : ') + ret.append(repr(self.gbnbld)) + ret.append(',\n vcasingeps : ') + ret.append(repr(self.vcasingeps)) + ret.append(',\n vcasingtol : ') + ret.append(repr(self.vcasingtol)) + ret.append(',\n vcasingits : ') + ret.append(repr(self.vcasingits)) + ret.append(',\n vcasingper : ') + ret.append(repr(self.vcasingper)) + ret.append(',\n mcasingcal : ') + ret.append(repr(self.mcasingcal)) + ret.append(',\n odetol : ') + ret.append(repr(self.odetol)) + ret.append(',\n absreq : ') + ret.append(repr(self.absreq)) + ret.append(',\n relreq : ') + ret.append(repr(self.relreq)) + ret.append(',\n absacc : ') + ret.append(repr(self.absacc)) + ret.append(',\n epsr : ') + ret.append(repr(self.epsr)) + ret.append(',\n nppts : ') + ret.append(repr(self.nppts)) + ret.append(',\n ppts : ') + ret.append(repr(self.ppts)) + ret.append(',\n nptrj : ') + ret.append(repr(self.nptrj)) + ret.append(',\n lhevalues : ') + ret.append(repr(self.lhevalues)) + ret.append(',\n lhevectors : ') + ret.append(repr(self.lhevectors)) + ret.append(',\n lhmatrix : ') + ret.append(repr(self.lhmatrix)) + ret.append(',\n lperturbed : ') + ret.append(repr(self.lperturbed)) + ret.append(',\n dpp : ') + ret.append(repr(self.dpp)) + ret.append(',\n dqq : ') + ret.append(repr(self.dqq)) + ret.append(',\n lerrortype : ') + ret.append(repr(self.lerrortype)) + ret.append(',\n ngrid : ') + ret.append(repr(self.ngrid)) + ret.append(',\n drz : ') + ret.append(repr(self.drz)) + ret.append(',\n lcheck : ') + ret.append(repr(self.lcheck)) + ret.append(',\n ltiming : ') + ret.append(repr(self.ltiming)) + ret.append(',\n fudge : ') + ret.append(repr(self.fudge)) + ret.append(',\n scaling : ') + ret.append(repr(self.scaling)) + ret.append(',\n wdcuhre : ') + ret.append(repr(self.wdcuhre)) + ret.append(',\n wminpack : ') + ret.append(repr(self.wminpack)) + ret.append(',\n wiqpack : ') + ret.append(repr(self.wiqpack)) + ret.append(',\n wrksuite : ') + ret.append(repr(self.wrksuite)) + ret.append(',\n wi1mach : ') + ret.append(repr(self.wi1mach)) + ret.append(',\n wd1mach : ') + ret.append(repr(self.wd1mach)) + ret.append(',\n wilut : ') + ret.append(repr(self.wilut)) + ret.append(',\n witers : ') + ret.append(repr(self.witers)) + ret.append(',\n winputlist : ') + ret.append(repr(self.winputlist)) + ret.append(',\n wglobal : ') + ret.append(repr(self.wglobal)) + ret.append(',\n wsphdf5 : ') + ret.append(repr(self.wsphdf5)) + ret.append(',\n wpreset : ') + ret.append(repr(self.wpreset)) + ret.append(',\n wmanual : ') + ret.append(repr(self.wmanual)) + ret.append(',\n wrzaxis : ') + ret.append(repr(self.wrzaxis)) + ret.append(',\n wpackxi : ') + ret.append(repr(self.wpackxi)) + ret.append(',\n wvolume : ') + ret.append(repr(self.wvolume)) + ret.append(',\n wcoords : ') + ret.append(repr(self.wcoords)) + ret.append(',\n wbasefn : ') + ret.append(repr(self.wbasefn)) + ret.append(',\n wmemory : ') + ret.append(repr(self.wmemory)) + ret.append(',\n wmetrix : ') + ret.append(repr(self.wmetrix)) + ret.append(',\n wma00aa : ') + ret.append(repr(self.wma00aa)) + ret.append(',\n wmatrix : ') + ret.append(repr(self.wmatrix)) + ret.append(',\n wspsmat : ') + ret.append(repr(self.wspsmat)) + ret.append(',\n wspsint : ') + ret.append(repr(self.wspsint)) + ret.append(',\n wmp00ac : ') + ret.append(repr(self.wmp00ac)) + ret.append(',\n wma02aa : ') + ret.append(repr(self.wma02aa)) + ret.append(',\n wpackab : ') + ret.append(repr(self.wpackab)) + ret.append(',\n wtr00ab : ') + ret.append(repr(self.wtr00ab)) + ret.append(',\n wcurent : ') + ret.append(repr(self.wcurent)) + ret.append(',\n wdf00ab : ') + ret.append(repr(self.wdf00ab)) + ret.append(',\n wlforce : ') + ret.append(repr(self.wlforce)) + ret.append(',\n wintghs : ') + ret.append(repr(self.wintghs)) + ret.append(',\n wmtrxhs : ') + ret.append(repr(self.wmtrxhs)) + ret.append(',\n wlbpol : ') + ret.append(repr(self.wlbpol)) + ret.append(',\n wbrcast : ') + ret.append(repr(self.wbrcast)) + ret.append(',\n wdfp100 : ') + ret.append(repr(self.wdfp100)) + ret.append(',\n wdfp200 : ') + ret.append(repr(self.wdfp200)) + ret.append(',\n wdforce : ') + ret.append(repr(self.wdforce)) + ret.append(',\n wnewton : ') + ret.append(repr(self.wnewton)) + ret.append(',\n wcasing : ') + ret.append(repr(self.wcasing)) + ret.append(',\n wbnorml : ') + ret.append(repr(self.wbnorml)) + ret.append(',\n wjo00aa : ') + ret.append(repr(self.wjo00aa)) + ret.append(',\n wpp00aa : ') + ret.append(repr(self.wpp00aa)) + ret.append(',\n wpp00ab : ') + ret.append(repr(self.wpp00ab)) + ret.append(',\n wbfield : ') + ret.append(repr(self.wbfield)) + ret.append(',\n wstzxyz : ') + ret.append(repr(self.wstzxyz)) + ret.append(',\n whesian : ') + ret.append(repr(self.whesian)) + ret.append(',\n wra00aa : ') + ret.append(repr(self.wra00aa)) + ret.append(',\n wnumrec : ') + ret.append(repr(self.wnumrec)) + ret.append(',\n wxspech : ') + ret.append(repr(self.wxspech)) + ret.append(',\n wbuild_vector_potential : ') + ret.append(repr(self.wbuild_vector_potential)) + ret.append(',\n wreadin : ') + ret.append(repr(self.wreadin)) + ret.append(',\n wwritin : ') + ret.append(repr(self.wwritin)) + ret.append(',\n wwrtend : ') + ret.append(repr(self.wwrtend)) + ret.append(',\n wmacros : ') + ret.append(repr(self.wmacros)) + ret.append('}') + return ''.join(ret) + + _dt_array_initialisers = [] + + +inputlist = Inputlist() + +class Constants(f90wrap.runtime.FortranModule): + """ + Module constants + + + Defined at global.fpp lines 24-51 + + """ + @property + def zero(self): + """ + Element zero ftype=real(8) pytype=float + + + Defined at global.fpp line 26 + + """ + return _spec.f90wrap_constants__get__zero() + + @property + def one(self): + """ + Element one ftype=real(8) pytype=float + + + Defined at global.fpp line 27 + + """ + return _spec.f90wrap_constants__get__one() + + @property + def two(self): + """ + Element two ftype=real(8) pytype=float + + + Defined at global.fpp line 28 + + """ + return _spec.f90wrap_constants__get__two() + + @property + def three(self): + """ + Element three ftype=real(8) pytype=float + + + Defined at global.fpp line 29 + + """ + return _spec.f90wrap_constants__get__three() + + @property + def four(self): + """ + Element four ftype=real(8) pytype=float + + + Defined at global.fpp line 30 + + """ + return _spec.f90wrap_constants__get__four() + + @property + def five(self): + """ + Element five ftype=real(8) pytype=float + + + Defined at global.fpp line 31 + + """ + return _spec.f90wrap_constants__get__five() + + @property + def six(self): + """ + Element six ftype=real(8) pytype=float + + + Defined at global.fpp line 32 + + """ + return _spec.f90wrap_constants__get__six() + + @property + def seven(self): + """ + Element seven ftype=real(8) pytype=float + + + Defined at global.fpp line 33 + + """ + return _spec.f90wrap_constants__get__seven() + + @property + def eight(self): + """ + Element eight ftype=real(8) pytype=float + + + Defined at global.fpp line 34 + + """ + return _spec.f90wrap_constants__get__eight() + + @property + def nine(self): + """ + Element nine ftype=real(8) pytype=float + + + Defined at global.fpp line 35 + + """ + return _spec.f90wrap_constants__get__nine() + + @property + def ten(self): + """ + Element ten ftype=real(8) pytype=float + + + Defined at global.fpp line 36 + + """ + return _spec.f90wrap_constants__get__ten() + + @property + def eleven(self): + """ + Element eleven ftype=real(8) pytype=float + + + Defined at global.fpp line 37 + + """ + return _spec.f90wrap_constants__get__eleven() + + @property + def twelve(self): + """ + Element twelve ftype=real(8) pytype=float + + + Defined at global.fpp line 38 + + """ + return _spec.f90wrap_constants__get__twelve() + + @property + def hundred(self): + """ + Element hundred ftype=real(8) pytype=float + + + Defined at global.fpp line 39 + + """ + return _spec.f90wrap_constants__get__hundred() + + @property + def thousand(self): + """ + Element thousand ftype=real(8) pytype=float + + + Defined at global.fpp line 40 + + """ + return _spec.f90wrap_constants__get__thousand() + + @property + def half(self): + """ + Element half ftype=real(8) pytype=float + + + Defined at global.fpp line 41 + + """ + return _spec.f90wrap_constants__get__half() + + @property + def third(self): + """ + Element third ftype=real(8) pytype=float + + + Defined at global.fpp line 42 + + """ + return _spec.f90wrap_constants__get__third() + + @property + def quart(self): + """ + Element quart ftype=real(8) pytype=float + + + Defined at global.fpp line 43 + + """ + return _spec.f90wrap_constants__get__quart() + + @property + def fifth(self): + """ + Element fifth ftype=real(8) pytype=float + + + Defined at global.fpp line 44 + + """ + return _spec.f90wrap_constants__get__fifth() + + @property + def sixth(self): + """ + Element sixth ftype=real(8) pytype=float + + + Defined at global.fpp line 45 + + """ + return _spec.f90wrap_constants__get__sixth() + + @property + def pi2(self): + """ + Element pi2 ftype=real(8) pytype=float + + + Defined at global.fpp line 46 + + """ + return _spec.f90wrap_constants__get__pi2() + + @property + def pi(self): + """ + Element pi ftype=real(8) pytype=float + + + Defined at global.fpp line 47 + + """ + return _spec.f90wrap_constants__get__pi() + + @property + def mu0(self): + """ + Element mu0 ftype=real(8) pytype=float + + + Defined at global.fpp line 48 + + """ + return _spec.f90wrap_constants__get__mu0() + + @property + def goldenmean(self): + """ + Element goldenmean ftype=real(8) pytype=float + + + Defined at global.fpp line 49 + + """ + return _spec.f90wrap_constants__get__goldenmean() + + @property + def version(self): + """ + Element version ftype=real(8) pytype=float + + + Defined at global.fpp line 51 + + """ + return _spec.f90wrap_constants__get__version() + + def __str__(self): + ret = ['{\n'] + ret.append(' zero : ') + ret.append(repr(self.zero)) + ret.append(',\n one : ') + ret.append(repr(self.one)) + ret.append(',\n two : ') + ret.append(repr(self.two)) + ret.append(',\n three : ') + ret.append(repr(self.three)) + ret.append(',\n four : ') + ret.append(repr(self.four)) + ret.append(',\n five : ') + ret.append(repr(self.five)) + ret.append(',\n six : ') + ret.append(repr(self.six)) + ret.append(',\n seven : ') + ret.append(repr(self.seven)) + ret.append(',\n eight : ') + ret.append(repr(self.eight)) + ret.append(',\n nine : ') + ret.append(repr(self.nine)) + ret.append(',\n ten : ') + ret.append(repr(self.ten)) + ret.append(',\n eleven : ') + ret.append(repr(self.eleven)) + ret.append(',\n twelve : ') + ret.append(repr(self.twelve)) + ret.append(',\n hundred : ') + ret.append(repr(self.hundred)) + ret.append(',\n thousand : ') + ret.append(repr(self.thousand)) + ret.append(',\n half : ') + ret.append(repr(self.half)) + ret.append(',\n third : ') + ret.append(repr(self.third)) + ret.append(',\n quart : ') + ret.append(repr(self.quart)) + ret.append(',\n fifth : ') + ret.append(repr(self.fifth)) + ret.append(',\n sixth : ') + ret.append(repr(self.sixth)) + ret.append(',\n pi2 : ') + ret.append(repr(self.pi2)) + ret.append(',\n pi : ') + ret.append(repr(self.pi)) + ret.append(',\n mu0 : ') + ret.append(repr(self.mu0)) + ret.append(',\n goldenmean : ') + ret.append(repr(self.goldenmean)) + ret.append(',\n version : ') + ret.append(repr(self.version)) + ret.append('}') + return ''.join(ret) + + _dt_array_initialisers = [] + + +constants = Constants() + +class Numerical(f90wrap.runtime.FortranModule): + """ + Module numerical + + + Defined at global.fpp lines 55-65 + + """ + @property + def machprec(self): + """ + Element machprec ftype=real(8) pytype=float + + + Defined at global.fpp line 61 + + """ + return _spec.f90wrap_numerical__get__machprec() + + @property + def vsmall(self): + """ + Element vsmall ftype=real(8) pytype=float + + + Defined at global.fpp line 62 + + """ + return _spec.f90wrap_numerical__get__vsmall() + + @property + def small(self): + """ + Element small ftype=real(8) pytype=float + + + Defined at global.fpp line 63 + + """ + return _spec.f90wrap_numerical__get__small() + + @property + def sqrtmachprec(self): + """ + Element sqrtmachprec ftype=real(8) pytype=float + + + Defined at global.fpp line 64 + + """ + return _spec.f90wrap_numerical__get__sqrtmachprec() + + @property + def logtolerance(self): + """ + Element logtolerance ftype=real(8) pytype=float + + + Defined at global.fpp line 65 + + """ + return _spec.f90wrap_numerical__get__logtolerance() + + def __str__(self): + ret = ['{\n'] + ret.append(' machprec : ') + ret.append(repr(self.machprec)) + ret.append(',\n vsmall : ') + ret.append(repr(self.vsmall)) + ret.append(',\n small : ') + ret.append(repr(self.small)) + ret.append(',\n sqrtmachprec : ') + ret.append(repr(self.sqrtmachprec)) + ret.append(',\n logtolerance : ') + ret.append(repr(self.logtolerance)) + ret.append('}') + return ''.join(ret) + + _dt_array_initialisers = [] + + +numerical = Numerical() + +class Fileunits(f90wrap.runtime.FortranModule): + """ + Module fileunits + + + Defined at global.fpp lines 68-97 + + """ + @staticmethod + def mute(action): + """ + mute(action) + + + Defined at global.fpp lines 81-96 + + Parameters + ---------- + action : int + + """ + _spec.f90wrap_mute(action=action) + + @property + def iunit(self): + """ + Element iunit ftype=integer pytype=int + + + Defined at global.fpp line 70 + + """ + return _spec.f90wrap_fileunits__get__iunit() + + @iunit.setter + def iunit(self, iunit): + _spec.f90wrap_fileunits__set__iunit(iunit) + + @property + def ounit(self): + """ + Element ounit ftype=integer pytype=int + + + Defined at global.fpp line 71 + + """ + return _spec.f90wrap_fileunits__get__ounit() + + @ounit.setter + def ounit(self, ounit): + _spec.f90wrap_fileunits__set__ounit(ounit) + + @property + def gunit(self): + """ + Element gunit ftype=integer pytype=int + + + Defined at global.fpp line 72 + + """ + return _spec.f90wrap_fileunits__get__gunit() + + @gunit.setter + def gunit(self, gunit): + _spec.f90wrap_fileunits__set__gunit(gunit) + + @property + def aunit(self): + """ + Element aunit ftype=integer pytype=int + + + Defined at global.fpp line 73 + + """ + return _spec.f90wrap_fileunits__get__aunit() + + @aunit.setter + def aunit(self, aunit): + _spec.f90wrap_fileunits__set__aunit(aunit) + + @property + def dunit(self): + """ + Element dunit ftype=integer pytype=int + + + Defined at global.fpp line 74 + + """ + return _spec.f90wrap_fileunits__get__dunit() + + @dunit.setter + def dunit(self, dunit): + _spec.f90wrap_fileunits__set__dunit(dunit) + + @property + def hunit(self): + """ + Element hunit ftype=integer pytype=int + + + Defined at global.fpp line 75 + + """ + return _spec.f90wrap_fileunits__get__hunit() + + @hunit.setter + def hunit(self, hunit): + _spec.f90wrap_fileunits__set__hunit(hunit) + + @property + def munit(self): + """ + Element munit ftype=integer pytype=int + + + Defined at global.fpp line 76 + + """ + return _spec.f90wrap_fileunits__get__munit() + + @munit.setter + def munit(self, munit): + _spec.f90wrap_fileunits__set__munit(munit) + + @property + def lunit(self): + """ + Element lunit ftype=integer pytype=int + + + Defined at global.fpp line 77 + + """ + return _spec.f90wrap_fileunits__get__lunit() + + @lunit.setter + def lunit(self, lunit): + _spec.f90wrap_fileunits__set__lunit(lunit) + + @property + def vunit(self): + """ + Element vunit ftype=integer pytype=int + + + Defined at global.fpp line 78 + + """ + return _spec.f90wrap_fileunits__get__vunit() + + @vunit.setter + def vunit(self, vunit): + _spec.f90wrap_fileunits__set__vunit(vunit) + + def __str__(self): + ret = ['{\n'] + ret.append(' iunit : ') + ret.append(repr(self.iunit)) + ret.append(',\n ounit : ') + ret.append(repr(self.ounit)) + ret.append(',\n gunit : ') + ret.append(repr(self.gunit)) + ret.append(',\n aunit : ') + ret.append(repr(self.aunit)) + ret.append(',\n dunit : ') + ret.append(repr(self.dunit)) + ret.append(',\n hunit : ') + ret.append(repr(self.hunit)) + ret.append(',\n munit : ') + ret.append(repr(self.munit)) + ret.append(',\n lunit : ') + ret.append(repr(self.lunit)) + ret.append(',\n vunit : ') + ret.append(repr(self.vunit)) + ret.append('}') + return ''.join(ret) + + _dt_array_initialisers = [] + + +fileunits = Fileunits() + +class Cputiming(f90wrap.runtime.FortranModule): + """ + Module cputiming + + + Defined at global.fpp lines 100-154 + + """ + @property + def tdcuhre(self): + """ + Element tdcuhre ftype=real(8) pytype=float + + + Defined at global.fpp line 101 + + """ + return _spec.f90wrap_cputiming__get__tdcuhre() + + @tdcuhre.setter + def tdcuhre(self, tdcuhre): + _spec.f90wrap_cputiming__set__tdcuhre(tdcuhre) + + @property + def dcuhret(self): + """ + Element dcuhret ftype=real(8) pytype=float + + + Defined at global.fpp line 101 + + """ + return _spec.f90wrap_cputiming__get__dcuhret() + + @dcuhret.setter + def dcuhret(self, dcuhret): + _spec.f90wrap_cputiming__set__dcuhret(dcuhret) + + @property + def tminpack(self): + """ + Element tminpack ftype=real(8) pytype=float + + + Defined at global.fpp line 102 + + """ + return _spec.f90wrap_cputiming__get__tminpack() + + @tminpack.setter + def tminpack(self, tminpack): + _spec.f90wrap_cputiming__set__tminpack(tminpack) + + @property + def minpackt(self): + """ + Element minpackt ftype=real(8) pytype=float + + + Defined at global.fpp line 102 + + """ + return _spec.f90wrap_cputiming__get__minpackt() + + @minpackt.setter + def minpackt(self, minpackt): + _spec.f90wrap_cputiming__set__minpackt(minpackt) + + @property + def tiqpack(self): + """ + Element tiqpack ftype=real(8) pytype=float + + + Defined at global.fpp line 103 + + """ + return _spec.f90wrap_cputiming__get__tiqpack() + + @tiqpack.setter + def tiqpack(self, tiqpack): + _spec.f90wrap_cputiming__set__tiqpack(tiqpack) + + @property + def iqpackt(self): + """ + Element iqpackt ftype=real(8) pytype=float + + + Defined at global.fpp line 103 + + """ + return _spec.f90wrap_cputiming__get__iqpackt() + + @iqpackt.setter + def iqpackt(self, iqpackt): + _spec.f90wrap_cputiming__set__iqpackt(iqpackt) + + @property + def trksuite(self): + """ + Element trksuite ftype=real(8) pytype=float + + + Defined at global.fpp line 104 + + """ + return _spec.f90wrap_cputiming__get__trksuite() + + @trksuite.setter + def trksuite(self, trksuite): + _spec.f90wrap_cputiming__set__trksuite(trksuite) + + @property + def rksuitet(self): + """ + Element rksuitet ftype=real(8) pytype=float + + + Defined at global.fpp line 104 + + """ + return _spec.f90wrap_cputiming__get__rksuitet() + + @rksuitet.setter + def rksuitet(self, rksuitet): + _spec.f90wrap_cputiming__set__rksuitet(rksuitet) + + @property + def ti1mach(self): + """ + Element ti1mach ftype=real(8) pytype=float + + + Defined at global.fpp line 105 + + """ + return _spec.f90wrap_cputiming__get__ti1mach() + + @ti1mach.setter + def ti1mach(self, ti1mach): + _spec.f90wrap_cputiming__set__ti1mach(ti1mach) + + @property + def i1macht(self): + """ + Element i1macht ftype=real(8) pytype=float + + + Defined at global.fpp line 105 + + """ + return _spec.f90wrap_cputiming__get__i1macht() + + @i1macht.setter + def i1macht(self, i1macht): + _spec.f90wrap_cputiming__set__i1macht(i1macht) + + @property + def td1mach(self): + """ + Element td1mach ftype=real(8) pytype=float + + + Defined at global.fpp line 106 + + """ + return _spec.f90wrap_cputiming__get__td1mach() + + @td1mach.setter + def td1mach(self, td1mach): + _spec.f90wrap_cputiming__set__td1mach(td1mach) + + @property + def d1macht(self): + """ + Element d1macht ftype=real(8) pytype=float + + + Defined at global.fpp line 106 + + """ + return _spec.f90wrap_cputiming__get__d1macht() + + @d1macht.setter + def d1macht(self, d1macht): + _spec.f90wrap_cputiming__set__d1macht(d1macht) + + @property + def tilut(self): + """ + Element tilut ftype=real(8) pytype=float + + + Defined at global.fpp line 107 + + """ + return _spec.f90wrap_cputiming__get__tilut() + + @tilut.setter + def tilut(self, tilut): + _spec.f90wrap_cputiming__set__tilut(tilut) + + @property + def ilutt(self): + """ + Element ilutt ftype=real(8) pytype=float + + + Defined at global.fpp line 107 + + """ + return _spec.f90wrap_cputiming__get__ilutt() + + @ilutt.setter + def ilutt(self, ilutt): + _spec.f90wrap_cputiming__set__ilutt(ilutt) + + @property + def titers(self): + """ + Element titers ftype=real(8) pytype=float + + + Defined at global.fpp line 108 + + """ + return _spec.f90wrap_cputiming__get__titers() + + @titers.setter + def titers(self, titers): + _spec.f90wrap_cputiming__set__titers(titers) + + @property + def iterst(self): + """ + Element iterst ftype=real(8) pytype=float + + + Defined at global.fpp line 108 + + """ + return _spec.f90wrap_cputiming__get__iterst() + + @iterst.setter + def iterst(self, iterst): + _spec.f90wrap_cputiming__set__iterst(iterst) + + @property + def tinputlist(self): + """ + Element tinputlist ftype=real(8) pytype=float + + + Defined at global.fpp line 109 + + """ + return _spec.f90wrap_cputiming__get__tinputlist() + + @tinputlist.setter + def tinputlist(self, tinputlist): + _spec.f90wrap_cputiming__set__tinputlist(tinputlist) + + @property + def inputlistt(self): + """ + Element inputlistt ftype=real(8) pytype=float + + + Defined at global.fpp line 109 + + """ + return _spec.f90wrap_cputiming__get__inputlistt() + + @inputlistt.setter + def inputlistt(self, inputlistt): + _spec.f90wrap_cputiming__set__inputlistt(inputlistt) + + @property + def tglobal(self): + """ + Element tglobal ftype=real(8) pytype=float + + + Defined at global.fpp line 110 + + """ + return _spec.f90wrap_cputiming__get__tglobal() + + @tglobal.setter + def tglobal(self, tglobal): + _spec.f90wrap_cputiming__set__tglobal(tglobal) + + @property + def globalt(self): + """ + Element globalt ftype=real(8) pytype=float + + + Defined at global.fpp line 110 + + """ + return _spec.f90wrap_cputiming__get__globalt() + + @globalt.setter + def globalt(self, globalt): + _spec.f90wrap_cputiming__set__globalt(globalt) + + @property + def tsphdf5(self): + """ + Element tsphdf5 ftype=real(8) pytype=float + + + Defined at global.fpp line 111 + + """ + return _spec.f90wrap_cputiming__get__tsphdf5() + + @tsphdf5.setter + def tsphdf5(self, tsphdf5): + _spec.f90wrap_cputiming__set__tsphdf5(tsphdf5) + + @property + def sphdf5t(self): + """ + Element sphdf5t ftype=real(8) pytype=float + + + Defined at global.fpp line 111 + + """ + return _spec.f90wrap_cputiming__get__sphdf5t() + + @sphdf5t.setter + def sphdf5t(self, sphdf5t): + _spec.f90wrap_cputiming__set__sphdf5t(sphdf5t) + + @property + def tpreset(self): + """ + Element tpreset ftype=real(8) pytype=float + + + Defined at global.fpp line 112 + + """ + return _spec.f90wrap_cputiming__get__tpreset() + + @tpreset.setter + def tpreset(self, tpreset): + _spec.f90wrap_cputiming__set__tpreset(tpreset) + + @property + def presett(self): + """ + Element presett ftype=real(8) pytype=float + + + Defined at global.fpp line 112 + + """ + return _spec.f90wrap_cputiming__get__presett() + + @presett.setter + def presett(self, presett): + _spec.f90wrap_cputiming__set__presett(presett) + + @property + def tmanual(self): + """ + Element tmanual ftype=real(8) pytype=float + + + Defined at global.fpp line 113 + + """ + return _spec.f90wrap_cputiming__get__tmanual() + + @tmanual.setter + def tmanual(self, tmanual): + _spec.f90wrap_cputiming__set__tmanual(tmanual) + + @property + def manualt(self): + """ + Element manualt ftype=real(8) pytype=float + + + Defined at global.fpp line 113 + + """ + return _spec.f90wrap_cputiming__get__manualt() + + @manualt.setter + def manualt(self, manualt): + _spec.f90wrap_cputiming__set__manualt(manualt) + + @property + def trzaxis(self): + """ + Element trzaxis ftype=real(8) pytype=float + + + Defined at global.fpp line 114 + + """ + return _spec.f90wrap_cputiming__get__trzaxis() + + @trzaxis.setter + def trzaxis(self, trzaxis): + _spec.f90wrap_cputiming__set__trzaxis(trzaxis) + + @property + def rzaxist(self): + """ + Element rzaxist ftype=real(8) pytype=float + + + Defined at global.fpp line 114 + + """ + return _spec.f90wrap_cputiming__get__rzaxist() + + @rzaxist.setter + def rzaxist(self, rzaxist): + _spec.f90wrap_cputiming__set__rzaxist(rzaxist) + + @property + def tpackxi(self): + """ + Element tpackxi ftype=real(8) pytype=float + + + Defined at global.fpp line 115 + + """ + return _spec.f90wrap_cputiming__get__tpackxi() + + @tpackxi.setter + def tpackxi(self, tpackxi): + _spec.f90wrap_cputiming__set__tpackxi(tpackxi) + + @property + def packxit(self): + """ + Element packxit ftype=real(8) pytype=float + + + Defined at global.fpp line 115 + + """ + return _spec.f90wrap_cputiming__get__packxit() + + @packxit.setter + def packxit(self, packxit): + _spec.f90wrap_cputiming__set__packxit(packxit) + + @property + def tvolume(self): + """ + Element tvolume ftype=real(8) pytype=float + + + Defined at global.fpp line 116 + + """ + return _spec.f90wrap_cputiming__get__tvolume() + + @tvolume.setter + def tvolume(self, tvolume): + _spec.f90wrap_cputiming__set__tvolume(tvolume) + + @property + def volumet(self): + """ + Element volumet ftype=real(8) pytype=float + + + Defined at global.fpp line 116 + + """ + return _spec.f90wrap_cputiming__get__volumet() + + @volumet.setter + def volumet(self, volumet): + _spec.f90wrap_cputiming__set__volumet(volumet) + + @property + def tcoords(self): + """ + Element tcoords ftype=real(8) pytype=float + + + Defined at global.fpp line 117 + + """ + return _spec.f90wrap_cputiming__get__tcoords() + + @tcoords.setter + def tcoords(self, tcoords): + _spec.f90wrap_cputiming__set__tcoords(tcoords) + + @property + def coordst(self): + """ + Element coordst ftype=real(8) pytype=float + + + Defined at global.fpp line 117 + + """ + return _spec.f90wrap_cputiming__get__coordst() + + @coordst.setter + def coordst(self, coordst): + _spec.f90wrap_cputiming__set__coordst(coordst) + + @property + def tbasefn(self): + """ + Element tbasefn ftype=real(8) pytype=float + + + Defined at global.fpp line 118 + + """ + return _spec.f90wrap_cputiming__get__tbasefn() + + @tbasefn.setter + def tbasefn(self, tbasefn): + _spec.f90wrap_cputiming__set__tbasefn(tbasefn) + + @property + def basefnt(self): + """ + Element basefnt ftype=real(8) pytype=float + + + Defined at global.fpp line 118 + + """ + return _spec.f90wrap_cputiming__get__basefnt() + + @basefnt.setter + def basefnt(self, basefnt): + _spec.f90wrap_cputiming__set__basefnt(basefnt) + + @property + def tmemory(self): + """ + Element tmemory ftype=real(8) pytype=float + + + Defined at global.fpp line 119 + + """ + return _spec.f90wrap_cputiming__get__tmemory() + + @tmemory.setter + def tmemory(self, tmemory): + _spec.f90wrap_cputiming__set__tmemory(tmemory) + + @property + def memoryt(self): + """ + Element memoryt ftype=real(8) pytype=float + + + Defined at global.fpp line 119 + + """ + return _spec.f90wrap_cputiming__get__memoryt() + + @memoryt.setter + def memoryt(self, memoryt): + _spec.f90wrap_cputiming__set__memoryt(memoryt) + + @property + def tmetrix(self): + """ + Element tmetrix ftype=real(8) pytype=float + + + Defined at global.fpp line 120 + + """ + return _spec.f90wrap_cputiming__get__tmetrix() + + @tmetrix.setter + def tmetrix(self, tmetrix): + _spec.f90wrap_cputiming__set__tmetrix(tmetrix) + + @property + def metrixt(self): + """ + Element metrixt ftype=real(8) pytype=float + + + Defined at global.fpp line 120 + + """ + return _spec.f90wrap_cputiming__get__metrixt() + + @metrixt.setter + def metrixt(self, metrixt): + _spec.f90wrap_cputiming__set__metrixt(metrixt) + + @property + def tma00aa(self): + """ + Element tma00aa ftype=real(8) pytype=float + + + Defined at global.fpp line 121 + + """ + return _spec.f90wrap_cputiming__get__tma00aa() + + @tma00aa.setter + def tma00aa(self, tma00aa): + _spec.f90wrap_cputiming__set__tma00aa(tma00aa) + + @property + def ma00aat(self): + """ + Element ma00aat ftype=real(8) pytype=float + + + Defined at global.fpp line 121 + + """ + return _spec.f90wrap_cputiming__get__ma00aat() + + @ma00aat.setter + def ma00aat(self, ma00aat): + _spec.f90wrap_cputiming__set__ma00aat(ma00aat) + + @property + def tmatrix(self): + """ + Element tmatrix ftype=real(8) pytype=float + + + Defined at global.fpp line 122 + + """ + return _spec.f90wrap_cputiming__get__tmatrix() + + @tmatrix.setter + def tmatrix(self, tmatrix): + _spec.f90wrap_cputiming__set__tmatrix(tmatrix) + + @property + def matrixt(self): + """ + Element matrixt ftype=real(8) pytype=float + + + Defined at global.fpp line 122 + + """ + return _spec.f90wrap_cputiming__get__matrixt() + + @matrixt.setter + def matrixt(self, matrixt): + _spec.f90wrap_cputiming__set__matrixt(matrixt) + + @property + def tspsmat(self): + """ + Element tspsmat ftype=real(8) pytype=float + + + Defined at global.fpp line 123 + + """ + return _spec.f90wrap_cputiming__get__tspsmat() + + @tspsmat.setter + def tspsmat(self, tspsmat): + _spec.f90wrap_cputiming__set__tspsmat(tspsmat) + + @property + def spsmatt(self): + """ + Element spsmatt ftype=real(8) pytype=float + + + Defined at global.fpp line 123 + + """ + return _spec.f90wrap_cputiming__get__spsmatt() + + @spsmatt.setter + def spsmatt(self, spsmatt): + _spec.f90wrap_cputiming__set__spsmatt(spsmatt) + + @property + def tspsint(self): + """ + Element tspsint ftype=real(8) pytype=float + + + Defined at global.fpp line 124 + + """ + return _spec.f90wrap_cputiming__get__tspsint() + + @tspsint.setter + def tspsint(self, tspsint): + _spec.f90wrap_cputiming__set__tspsint(tspsint) + + @property + def spsintt(self): + """ + Element spsintt ftype=real(8) pytype=float + + + Defined at global.fpp line 124 + + """ + return _spec.f90wrap_cputiming__get__spsintt() + + @spsintt.setter + def spsintt(self, spsintt): + _spec.f90wrap_cputiming__set__spsintt(spsintt) + + @property + def tmp00ac(self): + """ + Element tmp00ac ftype=real(8) pytype=float + + + Defined at global.fpp line 125 + + """ + return _spec.f90wrap_cputiming__get__tmp00ac() + + @tmp00ac.setter + def tmp00ac(self, tmp00ac): + _spec.f90wrap_cputiming__set__tmp00ac(tmp00ac) + + @property + def mp00act(self): + """ + Element mp00act ftype=real(8) pytype=float + + + Defined at global.fpp line 125 + + """ + return _spec.f90wrap_cputiming__get__mp00act() + + @mp00act.setter + def mp00act(self, mp00act): + _spec.f90wrap_cputiming__set__mp00act(mp00act) + + @property + def tma02aa(self): + """ + Element tma02aa ftype=real(8) pytype=float + + + Defined at global.fpp line 126 + + """ + return _spec.f90wrap_cputiming__get__tma02aa() + + @tma02aa.setter + def tma02aa(self, tma02aa): + _spec.f90wrap_cputiming__set__tma02aa(tma02aa) + + @property + def ma02aat(self): + """ + Element ma02aat ftype=real(8) pytype=float + + + Defined at global.fpp line 126 + + """ + return _spec.f90wrap_cputiming__get__ma02aat() + + @ma02aat.setter + def ma02aat(self, ma02aat): + _spec.f90wrap_cputiming__set__ma02aat(ma02aat) + + @property + def tpackab(self): + """ + Element tpackab ftype=real(8) pytype=float + + + Defined at global.fpp line 127 + + """ + return _spec.f90wrap_cputiming__get__tpackab() + + @tpackab.setter + def tpackab(self, tpackab): + _spec.f90wrap_cputiming__set__tpackab(tpackab) + + @property + def packabt(self): + """ + Element packabt ftype=real(8) pytype=float + + + Defined at global.fpp line 127 + + """ + return _spec.f90wrap_cputiming__get__packabt() + + @packabt.setter + def packabt(self, packabt): + _spec.f90wrap_cputiming__set__packabt(packabt) + + @property + def ttr00ab(self): + """ + Element ttr00ab ftype=real(8) pytype=float + + + Defined at global.fpp line 128 + + """ + return _spec.f90wrap_cputiming__get__ttr00ab() + + @ttr00ab.setter + def ttr00ab(self, ttr00ab): + _spec.f90wrap_cputiming__set__ttr00ab(ttr00ab) + + @property + def tr00abt(self): + """ + Element tr00abt ftype=real(8) pytype=float + + + Defined at global.fpp line 128 + + """ + return _spec.f90wrap_cputiming__get__tr00abt() + + @tr00abt.setter + def tr00abt(self, tr00abt): + _spec.f90wrap_cputiming__set__tr00abt(tr00abt) + + @property + def tcurent(self): + """ + Element tcurent ftype=real(8) pytype=float + + + Defined at global.fpp line 129 + + """ + return _spec.f90wrap_cputiming__get__tcurent() + + @tcurent.setter + def tcurent(self, tcurent): + _spec.f90wrap_cputiming__set__tcurent(tcurent) + + @property + def curentt(self): + """ + Element curentt ftype=real(8) pytype=float + + + Defined at global.fpp line 129 + + """ + return _spec.f90wrap_cputiming__get__curentt() + + @curentt.setter + def curentt(self, curentt): + _spec.f90wrap_cputiming__set__curentt(curentt) + + @property + def tdf00ab(self): + """ + Element tdf00ab ftype=real(8) pytype=float + + + Defined at global.fpp line 130 + + """ + return _spec.f90wrap_cputiming__get__tdf00ab() + + @tdf00ab.setter + def tdf00ab(self, tdf00ab): + _spec.f90wrap_cputiming__set__tdf00ab(tdf00ab) + + @property + def df00abt(self): + """ + Element df00abt ftype=real(8) pytype=float + + + Defined at global.fpp line 130 + + """ + return _spec.f90wrap_cputiming__get__df00abt() + + @df00abt.setter + def df00abt(self, df00abt): + _spec.f90wrap_cputiming__set__df00abt(df00abt) + + @property + def tlforce(self): + """ + Element tlforce ftype=real(8) pytype=float + + + Defined at global.fpp line 131 + + """ + return _spec.f90wrap_cputiming__get__tlforce() + + @tlforce.setter + def tlforce(self, tlforce): + _spec.f90wrap_cputiming__set__tlforce(tlforce) + + @property + def lforcet(self): + """ + Element lforcet ftype=real(8) pytype=float + + + Defined at global.fpp line 131 + + """ + return _spec.f90wrap_cputiming__get__lforcet() + + @lforcet.setter + def lforcet(self, lforcet): + _spec.f90wrap_cputiming__set__lforcet(lforcet) + + @property + def tintghs(self): + """ + Element tintghs ftype=real(8) pytype=float + + + Defined at global.fpp line 132 + + """ + return _spec.f90wrap_cputiming__get__tintghs() + + @tintghs.setter + def tintghs(self, tintghs): + _spec.f90wrap_cputiming__set__tintghs(tintghs) + + @property + def intghst(self): + """ + Element intghst ftype=real(8) pytype=float + + + Defined at global.fpp line 132 + + """ + return _spec.f90wrap_cputiming__get__intghst() + + @intghst.setter + def intghst(self, intghst): + _spec.f90wrap_cputiming__set__intghst(intghst) + + @property + def tmtrxhs(self): + """ + Element tmtrxhs ftype=real(8) pytype=float + + + Defined at global.fpp line 133 + + """ + return _spec.f90wrap_cputiming__get__tmtrxhs() + + @tmtrxhs.setter + def tmtrxhs(self, tmtrxhs): + _spec.f90wrap_cputiming__set__tmtrxhs(tmtrxhs) + + @property + def mtrxhst(self): + """ + Element mtrxhst ftype=real(8) pytype=float + + + Defined at global.fpp line 133 + + """ + return _spec.f90wrap_cputiming__get__mtrxhst() + + @mtrxhst.setter + def mtrxhst(self, mtrxhst): + _spec.f90wrap_cputiming__set__mtrxhst(mtrxhst) + + @property + def tlbpol(self): + """ + Element tlbpol ftype=real(8) pytype=float + + + Defined at global.fpp line 134 + + """ + return _spec.f90wrap_cputiming__get__tlbpol() + + @tlbpol.setter + def tlbpol(self, tlbpol): + _spec.f90wrap_cputiming__set__tlbpol(tlbpol) + + @property + def lbpolt(self): + """ + Element lbpolt ftype=real(8) pytype=float + + + Defined at global.fpp line 134 + + """ + return _spec.f90wrap_cputiming__get__lbpolt() + + @lbpolt.setter + def lbpolt(self, lbpolt): + _spec.f90wrap_cputiming__set__lbpolt(lbpolt) + + @property + def tbrcast(self): + """ + Element tbrcast ftype=real(8) pytype=float + + + Defined at global.fpp line 135 + + """ + return _spec.f90wrap_cputiming__get__tbrcast() + + @tbrcast.setter + def tbrcast(self, tbrcast): + _spec.f90wrap_cputiming__set__tbrcast(tbrcast) + + @property + def brcastt(self): + """ + Element brcastt ftype=real(8) pytype=float + + + Defined at global.fpp line 135 + + """ + return _spec.f90wrap_cputiming__get__brcastt() + + @brcastt.setter + def brcastt(self, brcastt): + _spec.f90wrap_cputiming__set__brcastt(brcastt) + + @property + def tdfp100(self): + """ + Element tdfp100 ftype=real(8) pytype=float + + + Defined at global.fpp line 136 + + """ + return _spec.f90wrap_cputiming__get__tdfp100() + + @tdfp100.setter + def tdfp100(self, tdfp100): + _spec.f90wrap_cputiming__set__tdfp100(tdfp100) + + @property + def dfp100t(self): + """ + Element dfp100t ftype=real(8) pytype=float + + + Defined at global.fpp line 136 + + """ + return _spec.f90wrap_cputiming__get__dfp100t() + + @dfp100t.setter + def dfp100t(self, dfp100t): + _spec.f90wrap_cputiming__set__dfp100t(dfp100t) + + @property + def tdfp200(self): + """ + Element tdfp200 ftype=real(8) pytype=float + + + Defined at global.fpp line 137 + + """ + return _spec.f90wrap_cputiming__get__tdfp200() + + @tdfp200.setter + def tdfp200(self, tdfp200): + _spec.f90wrap_cputiming__set__tdfp200(tdfp200) + + @property + def dfp200t(self): + """ + Element dfp200t ftype=real(8) pytype=float + + + Defined at global.fpp line 137 + + """ + return _spec.f90wrap_cputiming__get__dfp200t() + + @dfp200t.setter + def dfp200t(self, dfp200t): + _spec.f90wrap_cputiming__set__dfp200t(dfp200t) + + @property + def tdforce(self): + """ + Element tdforce ftype=real(8) pytype=float + + + Defined at global.fpp line 138 + + """ + return _spec.f90wrap_cputiming__get__tdforce() + + @tdforce.setter + def tdforce(self, tdforce): + _spec.f90wrap_cputiming__set__tdforce(tdforce) + + @property + def dforcet(self): + """ + Element dforcet ftype=real(8) pytype=float + + + Defined at global.fpp line 138 + + """ + return _spec.f90wrap_cputiming__get__dforcet() + + @dforcet.setter + def dforcet(self, dforcet): + _spec.f90wrap_cputiming__set__dforcet(dforcet) + + @property + def tnewton(self): + """ + Element tnewton ftype=real(8) pytype=float + + + Defined at global.fpp line 139 + + """ + return _spec.f90wrap_cputiming__get__tnewton() + + @tnewton.setter + def tnewton(self, tnewton): + _spec.f90wrap_cputiming__set__tnewton(tnewton) + + @property + def newtont(self): + """ + Element newtont ftype=real(8) pytype=float + + + Defined at global.fpp line 139 + + """ + return _spec.f90wrap_cputiming__get__newtont() + + @newtont.setter + def newtont(self, newtont): + _spec.f90wrap_cputiming__set__newtont(newtont) + + @property + def tcasing(self): + """ + Element tcasing ftype=real(8) pytype=float + + + Defined at global.fpp line 140 + + """ + return _spec.f90wrap_cputiming__get__tcasing() + + @tcasing.setter + def tcasing(self, tcasing): + _spec.f90wrap_cputiming__set__tcasing(tcasing) + + @property + def casingt(self): + """ + Element casingt ftype=real(8) pytype=float + + + Defined at global.fpp line 140 + + """ + return _spec.f90wrap_cputiming__get__casingt() + + @casingt.setter + def casingt(self, casingt): + _spec.f90wrap_cputiming__set__casingt(casingt) + + @property + def tbnorml(self): + """ + Element tbnorml ftype=real(8) pytype=float + + + Defined at global.fpp line 141 + + """ + return _spec.f90wrap_cputiming__get__tbnorml() + + @tbnorml.setter + def tbnorml(self, tbnorml): + _spec.f90wrap_cputiming__set__tbnorml(tbnorml) + + @property + def bnormlt(self): + """ + Element bnormlt ftype=real(8) pytype=float + + + Defined at global.fpp line 141 + + """ + return _spec.f90wrap_cputiming__get__bnormlt() + + @bnormlt.setter + def bnormlt(self, bnormlt): + _spec.f90wrap_cputiming__set__bnormlt(bnormlt) + + @property + def tjo00aa(self): + """ + Element tjo00aa ftype=real(8) pytype=float + + + Defined at global.fpp line 142 + + """ + return _spec.f90wrap_cputiming__get__tjo00aa() + + @tjo00aa.setter + def tjo00aa(self, tjo00aa): + _spec.f90wrap_cputiming__set__tjo00aa(tjo00aa) + + @property + def jo00aat(self): + """ + Element jo00aat ftype=real(8) pytype=float + + + Defined at global.fpp line 142 + + """ + return _spec.f90wrap_cputiming__get__jo00aat() + + @jo00aat.setter + def jo00aat(self, jo00aat): + _spec.f90wrap_cputiming__set__jo00aat(jo00aat) + + @property + def tpp00aa(self): + """ + Element tpp00aa ftype=real(8) pytype=float + + + Defined at global.fpp line 143 + + """ + return _spec.f90wrap_cputiming__get__tpp00aa() + + @tpp00aa.setter + def tpp00aa(self, tpp00aa): + _spec.f90wrap_cputiming__set__tpp00aa(tpp00aa) + + @property + def pp00aat(self): + """ + Element pp00aat ftype=real(8) pytype=float + + + Defined at global.fpp line 143 + + """ + return _spec.f90wrap_cputiming__get__pp00aat() + + @pp00aat.setter + def pp00aat(self, pp00aat): + _spec.f90wrap_cputiming__set__pp00aat(pp00aat) + + @property + def tpp00ab(self): + """ + Element tpp00ab ftype=real(8) pytype=float + + + Defined at global.fpp line 144 + + """ + return _spec.f90wrap_cputiming__get__tpp00ab() + + @tpp00ab.setter + def tpp00ab(self, tpp00ab): + _spec.f90wrap_cputiming__set__tpp00ab(tpp00ab) + + @property + def pp00abt(self): + """ + Element pp00abt ftype=real(8) pytype=float + + + Defined at global.fpp line 144 + + """ + return _spec.f90wrap_cputiming__get__pp00abt() + + @pp00abt.setter + def pp00abt(self, pp00abt): + _spec.f90wrap_cputiming__set__pp00abt(pp00abt) + + @property + def tbfield(self): + """ + Element tbfield ftype=real(8) pytype=float + + + Defined at global.fpp line 145 + + """ + return _spec.f90wrap_cputiming__get__tbfield() + + @tbfield.setter + def tbfield(self, tbfield): + _spec.f90wrap_cputiming__set__tbfield(tbfield) + + @property + def bfieldt(self): + """ + Element bfieldt ftype=real(8) pytype=float + + + Defined at global.fpp line 145 + + """ + return _spec.f90wrap_cputiming__get__bfieldt() + + @bfieldt.setter + def bfieldt(self, bfieldt): + _spec.f90wrap_cputiming__set__bfieldt(bfieldt) + + @property + def tstzxyz(self): + """ + Element tstzxyz ftype=real(8) pytype=float + + + Defined at global.fpp line 146 + + """ + return _spec.f90wrap_cputiming__get__tstzxyz() + + @tstzxyz.setter + def tstzxyz(self, tstzxyz): + _spec.f90wrap_cputiming__set__tstzxyz(tstzxyz) + + @property + def stzxyzt(self): + """ + Element stzxyzt ftype=real(8) pytype=float + + + Defined at global.fpp line 146 + + """ + return _spec.f90wrap_cputiming__get__stzxyzt() + + @stzxyzt.setter + def stzxyzt(self, stzxyzt): + _spec.f90wrap_cputiming__set__stzxyzt(stzxyzt) + + @property + def thesian(self): + """ + Element thesian ftype=real(8) pytype=float + + + Defined at global.fpp line 147 + + """ + return _spec.f90wrap_cputiming__get__thesian() + + @thesian.setter + def thesian(self, thesian): + _spec.f90wrap_cputiming__set__thesian(thesian) + + @property + def hesiant(self): + """ + Element hesiant ftype=real(8) pytype=float + + + Defined at global.fpp line 147 + + """ + return _spec.f90wrap_cputiming__get__hesiant() + + @hesiant.setter + def hesiant(self, hesiant): + _spec.f90wrap_cputiming__set__hesiant(hesiant) + + @property + def tra00aa(self): + """ + Element tra00aa ftype=real(8) pytype=float + + + Defined at global.fpp line 148 + + """ + return _spec.f90wrap_cputiming__get__tra00aa() + + @tra00aa.setter + def tra00aa(self, tra00aa): + _spec.f90wrap_cputiming__set__tra00aa(tra00aa) + + @property + def ra00aat(self): + """ + Element ra00aat ftype=real(8) pytype=float + + + Defined at global.fpp line 148 + + """ + return _spec.f90wrap_cputiming__get__ra00aat() + + @ra00aat.setter + def ra00aat(self, ra00aat): + _spec.f90wrap_cputiming__set__ra00aat(ra00aat) + + @property + def tnumrec(self): + """ + Element tnumrec ftype=real(8) pytype=float + + + Defined at global.fpp line 149 + + """ + return _spec.f90wrap_cputiming__get__tnumrec() + + @tnumrec.setter + def tnumrec(self, tnumrec): + _spec.f90wrap_cputiming__set__tnumrec(tnumrec) + + @property + def numrect(self): + """ + Element numrect ftype=real(8) pytype=float + + + Defined at global.fpp line 149 + + """ + return _spec.f90wrap_cputiming__get__numrect() + + @numrect.setter + def numrect(self, numrect): + _spec.f90wrap_cputiming__set__numrect(numrect) + + @property + def txspech(self): + """ + Element txspech ftype=real(8) pytype=float + + + Defined at global.fpp line 150 + + """ + return _spec.f90wrap_cputiming__get__txspech() + + @txspech.setter + def txspech(self, txspech): + _spec.f90wrap_cputiming__set__txspech(txspech) + + @property + def xspecht(self): + """ + Element xspecht ftype=real(8) pytype=float + + + Defined at global.fpp line 150 + + """ + return _spec.f90wrap_cputiming__get__xspecht() + + @xspecht.setter + def xspecht(self, xspecht): + _spec.f90wrap_cputiming__set__xspecht(xspecht) + + @property + def treadin(self): + """ + Element treadin ftype=real(8) pytype=float + + + Defined at global.fpp line 152 + + """ + return _spec.f90wrap_cputiming__get__treadin() + + @treadin.setter + def treadin(self, treadin): + _spec.f90wrap_cputiming__set__treadin(treadin) + + @property + def twritin(self): + """ + Element twritin ftype=real(8) pytype=float + + + Defined at global.fpp line 153 + + """ + return _spec.f90wrap_cputiming__get__twritin() + + @twritin.setter + def twritin(self, twritin): + _spec.f90wrap_cputiming__set__twritin(twritin) + + @property + def twrtend(self): + """ + Element twrtend ftype=real(8) pytype=float + + + Defined at global.fpp line 154 + + """ + return _spec.f90wrap_cputiming__get__twrtend() + + @twrtend.setter + def twrtend(self, twrtend): + _spec.f90wrap_cputiming__set__twrtend(twrtend) + + def __str__(self): + ret = ['{\n'] + ret.append(' tdcuhre : ') + ret.append(repr(self.tdcuhre)) + ret.append(',\n dcuhret : ') + ret.append(repr(self.dcuhret)) + ret.append(',\n tminpack : ') + ret.append(repr(self.tminpack)) + ret.append(',\n minpackt : ') + ret.append(repr(self.minpackt)) + ret.append(',\n tiqpack : ') + ret.append(repr(self.tiqpack)) + ret.append(',\n iqpackt : ') + ret.append(repr(self.iqpackt)) + ret.append(',\n trksuite : ') + ret.append(repr(self.trksuite)) + ret.append(',\n rksuitet : ') + ret.append(repr(self.rksuitet)) + ret.append(',\n ti1mach : ') + ret.append(repr(self.ti1mach)) + ret.append(',\n i1macht : ') + ret.append(repr(self.i1macht)) + ret.append(',\n td1mach : ') + ret.append(repr(self.td1mach)) + ret.append(',\n d1macht : ') + ret.append(repr(self.d1macht)) + ret.append(',\n tilut : ') + ret.append(repr(self.tilut)) + ret.append(',\n ilutt : ') + ret.append(repr(self.ilutt)) + ret.append(',\n titers : ') + ret.append(repr(self.titers)) + ret.append(',\n iterst : ') + ret.append(repr(self.iterst)) + ret.append(',\n tinputlist : ') + ret.append(repr(self.tinputlist)) + ret.append(',\n inputlistt : ') + ret.append(repr(self.inputlistt)) + ret.append(',\n tglobal : ') + ret.append(repr(self.tglobal)) + ret.append(',\n globalt : ') + ret.append(repr(self.globalt)) + ret.append(',\n tsphdf5 : ') + ret.append(repr(self.tsphdf5)) + ret.append(',\n sphdf5t : ') + ret.append(repr(self.sphdf5t)) + ret.append(',\n tpreset : ') + ret.append(repr(self.tpreset)) + ret.append(',\n presett : ') + ret.append(repr(self.presett)) + ret.append(',\n tmanual : ') + ret.append(repr(self.tmanual)) + ret.append(',\n manualt : ') + ret.append(repr(self.manualt)) + ret.append(',\n trzaxis : ') + ret.append(repr(self.trzaxis)) + ret.append(',\n rzaxist : ') + ret.append(repr(self.rzaxist)) + ret.append(',\n tpackxi : ') + ret.append(repr(self.tpackxi)) + ret.append(',\n packxit : ') + ret.append(repr(self.packxit)) + ret.append(',\n tvolume : ') + ret.append(repr(self.tvolume)) + ret.append(',\n volumet : ') + ret.append(repr(self.volumet)) + ret.append(',\n tcoords : ') + ret.append(repr(self.tcoords)) + ret.append(',\n coordst : ') + ret.append(repr(self.coordst)) + ret.append(',\n tbasefn : ') + ret.append(repr(self.tbasefn)) + ret.append(',\n basefnt : ') + ret.append(repr(self.basefnt)) + ret.append(',\n tmemory : ') + ret.append(repr(self.tmemory)) + ret.append(',\n memoryt : ') + ret.append(repr(self.memoryt)) + ret.append(',\n tmetrix : ') + ret.append(repr(self.tmetrix)) + ret.append(',\n metrixt : ') + ret.append(repr(self.metrixt)) + ret.append(',\n tma00aa : ') + ret.append(repr(self.tma00aa)) + ret.append(',\n ma00aat : ') + ret.append(repr(self.ma00aat)) + ret.append(',\n tmatrix : ') + ret.append(repr(self.tmatrix)) + ret.append(',\n matrixt : ') + ret.append(repr(self.matrixt)) + ret.append(',\n tspsmat : ') + ret.append(repr(self.tspsmat)) + ret.append(',\n spsmatt : ') + ret.append(repr(self.spsmatt)) + ret.append(',\n tspsint : ') + ret.append(repr(self.tspsint)) + ret.append(',\n spsintt : ') + ret.append(repr(self.spsintt)) + ret.append(',\n tmp00ac : ') + ret.append(repr(self.tmp00ac)) + ret.append(',\n mp00act : ') + ret.append(repr(self.mp00act)) + ret.append(',\n tma02aa : ') + ret.append(repr(self.tma02aa)) + ret.append(',\n ma02aat : ') + ret.append(repr(self.ma02aat)) + ret.append(',\n tpackab : ') + ret.append(repr(self.tpackab)) + ret.append(',\n packabt : ') + ret.append(repr(self.packabt)) + ret.append(',\n ttr00ab : ') + ret.append(repr(self.ttr00ab)) + ret.append(',\n tr00abt : ') + ret.append(repr(self.tr00abt)) + ret.append(',\n tcurent : ') + ret.append(repr(self.tcurent)) + ret.append(',\n curentt : ') + ret.append(repr(self.curentt)) + ret.append(',\n tdf00ab : ') + ret.append(repr(self.tdf00ab)) + ret.append(',\n df00abt : ') + ret.append(repr(self.df00abt)) + ret.append(',\n tlforce : ') + ret.append(repr(self.tlforce)) + ret.append(',\n lforcet : ') + ret.append(repr(self.lforcet)) + ret.append(',\n tintghs : ') + ret.append(repr(self.tintghs)) + ret.append(',\n intghst : ') + ret.append(repr(self.intghst)) + ret.append(',\n tmtrxhs : ') + ret.append(repr(self.tmtrxhs)) + ret.append(',\n mtrxhst : ') + ret.append(repr(self.mtrxhst)) + ret.append(',\n tlbpol : ') + ret.append(repr(self.tlbpol)) + ret.append(',\n lbpolt : ') + ret.append(repr(self.lbpolt)) + ret.append(',\n tbrcast : ') + ret.append(repr(self.tbrcast)) + ret.append(',\n brcastt : ') + ret.append(repr(self.brcastt)) + ret.append(',\n tdfp100 : ') + ret.append(repr(self.tdfp100)) + ret.append(',\n dfp100t : ') + ret.append(repr(self.dfp100t)) + ret.append(',\n tdfp200 : ') + ret.append(repr(self.tdfp200)) + ret.append(',\n dfp200t : ') + ret.append(repr(self.dfp200t)) + ret.append(',\n tdforce : ') + ret.append(repr(self.tdforce)) + ret.append(',\n dforcet : ') + ret.append(repr(self.dforcet)) + ret.append(',\n tnewton : ') + ret.append(repr(self.tnewton)) + ret.append(',\n newtont : ') + ret.append(repr(self.newtont)) + ret.append(',\n tcasing : ') + ret.append(repr(self.tcasing)) + ret.append(',\n casingt : ') + ret.append(repr(self.casingt)) + ret.append(',\n tbnorml : ') + ret.append(repr(self.tbnorml)) + ret.append(',\n bnormlt : ') + ret.append(repr(self.bnormlt)) + ret.append(',\n tjo00aa : ') + ret.append(repr(self.tjo00aa)) + ret.append(',\n jo00aat : ') + ret.append(repr(self.jo00aat)) + ret.append(',\n tpp00aa : ') + ret.append(repr(self.tpp00aa)) + ret.append(',\n pp00aat : ') + ret.append(repr(self.pp00aat)) + ret.append(',\n tpp00ab : ') + ret.append(repr(self.tpp00ab)) + ret.append(',\n pp00abt : ') + ret.append(repr(self.pp00abt)) + ret.append(',\n tbfield : ') + ret.append(repr(self.tbfield)) + ret.append(',\n bfieldt : ') + ret.append(repr(self.bfieldt)) + ret.append(',\n tstzxyz : ') + ret.append(repr(self.tstzxyz)) + ret.append(',\n stzxyzt : ') + ret.append(repr(self.stzxyzt)) + ret.append(',\n thesian : ') + ret.append(repr(self.thesian)) + ret.append(',\n hesiant : ') + ret.append(repr(self.hesiant)) + ret.append(',\n tra00aa : ') + ret.append(repr(self.tra00aa)) + ret.append(',\n ra00aat : ') + ret.append(repr(self.ra00aat)) + ret.append(',\n tnumrec : ') + ret.append(repr(self.tnumrec)) + ret.append(',\n numrect : ') + ret.append(repr(self.numrect)) + ret.append(',\n txspech : ') + ret.append(repr(self.txspech)) + ret.append(',\n xspecht : ') + ret.append(repr(self.xspecht)) + ret.append(',\n treadin : ') + ret.append(repr(self.treadin)) + ret.append(',\n twritin : ') + ret.append(repr(self.twritin)) + ret.append(',\n twrtend : ') + ret.append(repr(self.twrtend)) + ret.append('}') + return ''.join(ret) + + _dt_array_initialisers = [] + + +cputiming = Cputiming() + +class Typedefns(f90wrap.runtime.FortranModule): + """ + Module typedefns + + + Defined at global.fpp lines 157-173 + + """ + @f90wrap.runtime.register_class("spec.subgrid") + class subgrid(f90wrap.runtime.FortranDerivedType): + """ + Type(name=subgrid) + + + Defined at global.fpp lines 158-160 + + """ + def __init__(self, handle=None): + """ + self = Subgrid() + + + Defined at global.fpp lines 158-160 + + + Returns + ------- + this : Subgrid + Object to be constructed + + + Automatically generated constructor for subgrid + """ + f90wrap.runtime.FortranDerivedType.__init__(self) + result = _spec.f90wrap_subgrid_initialise() + self._handle = result[0] if isinstance(result, tuple) else result + + def __del__(self): + """ + Destructor for class Subgrid + + + Defined at global.fpp lines 158-160 + + Parameters + ---------- + this : Subgrid + Object to be destructed + + + Automatically generated destructor for subgrid + """ + if self._alloc: + _spec.f90wrap_subgrid_finalise(this=self._handle) + + @property + def s(self): + """ + Element s ftype=real(8) pytype=float + + + Defined at global.fpp line 159 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_subgrid__array__s(self._handle) + if array_handle in self._arrays: + s = self._arrays[array_handle] + else: + s = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + self._handle, + _spec.f90wrap_subgrid__array__s) + self._arrays[array_handle] = s + return s + + @s.setter + def s(self, s): + self.s[...] = s + + @property + def i(self): + """ + Element i ftype=integer pytype=int + + + Defined at global.fpp line 160 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_subgrid__array__i(self._handle) + if array_handle in self._arrays: + i = self._arrays[array_handle] + else: + i = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + self._handle, + _spec.f90wrap_subgrid__array__i) + self._arrays[array_handle] = i + return i + + @i.setter + def i(self, i): + self.i[...] = i + + def __str__(self): + ret = ['{\n'] + ret.append(' s : ') + ret.append(repr(self.s)) + ret.append(',\n i : ') + ret.append(repr(self.i)) + ret.append('}') + return ''.join(ret) + + _dt_array_initialisers = [] + + + @f90wrap.runtime.register_class("spec.MatrixLU") + class MatrixLU(f90wrap.runtime.FortranDerivedType): + """ + Type(name=matrixlu) + + + Defined at global.fpp lines 162-164 + + """ + def __init__(self, handle=None): + """ + self = Matrixlu() + + + Defined at global.fpp lines 162-164 + + + Returns + ------- + this : Matrixlu + Object to be constructed + + + Automatically generated constructor for matrixlu + """ + f90wrap.runtime.FortranDerivedType.__init__(self) + result = _spec.f90wrap_matrixlu_initialise() + self._handle = result[0] if isinstance(result, tuple) else result + + def __del__(self): + """ + Destructor for class Matrixlu + + + Defined at global.fpp lines 162-164 + + Parameters + ---------- + this : Matrixlu + Object to be destructed + + + Automatically generated destructor for matrixlu + """ + if self._alloc: + _spec.f90wrap_matrixlu_finalise(this=self._handle) + + @property + def mat(self): + """ + Element mat ftype=real(8) pytype=float + + + Defined at global.fpp line 163 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_matrixlu__array__mat(self._handle) + if array_handle in self._arrays: + mat = self._arrays[array_handle] + else: + mat = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + self._handle, + _spec.f90wrap_matrixlu__array__mat) + self._arrays[array_handle] = mat + return mat + + @mat.setter + def mat(self, mat): + self.mat[...] = mat + + @property + def ipivot(self): + """ + Element ipivot ftype=integer pytype=int + + + Defined at global.fpp line 164 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_matrixlu__array__ipivot(self._handle) + if array_handle in self._arrays: + ipivot = self._arrays[array_handle] + else: + ipivot = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + self._handle, + _spec.f90wrap_matrixlu__array__ipivot) + self._arrays[array_handle] = ipivot + return ipivot + + @ipivot.setter + def ipivot(self, ipivot): + self.ipivot[...] = ipivot + + def __str__(self): + ret = ['{\n'] + ret.append(' mat : ') + ret.append(repr(self.mat)) + ret.append(',\n ipivot : ') + ret.append(repr(self.ipivot)) + ret.append('}') + return ''.join(ret) + + _dt_array_initialisers = [] + + + @f90wrap.runtime.register_class("spec.derivative") + class derivative(f90wrap.runtime.FortranDerivedType): + """ + Type(name=derivative) + + + Defined at global.fpp lines 166-172 + + """ + def __init__(self, handle=None): + """ + self = Derivative() + + + Defined at global.fpp lines 166-172 + + + Returns + ------- + this : Derivative + Object to be constructed + + + Automatically generated constructor for derivative + """ + f90wrap.runtime.FortranDerivedType.__init__(self) + result = _spec.f90wrap_derivative_initialise() + self._handle = result[0] if isinstance(result, tuple) else result + + def __del__(self): + """ + Destructor for class Derivative + + + Defined at global.fpp lines 166-172 + + Parameters + ---------- + this : Derivative + Object to be destructed + + + Automatically generated destructor for derivative + """ + if self._alloc: + _spec.f90wrap_derivative_finalise(this=self._handle) + + @property + def l(self): + """ + Element l ftype=logical pytype=bool + + + Defined at global.fpp line 167 + + """ + return _spec.f90wrap_derivative__get__l(self._handle) + + @l.setter + def l(self, l): + _spec.f90wrap_derivative__set__l(self._handle, l) + + @property + def vol(self): + """ + Element vol ftype=integer pytype=int + + + Defined at global.fpp line 168 + + """ + return _spec.f90wrap_derivative__get__vol(self._handle) + + @vol.setter + def vol(self, vol): + _spec.f90wrap_derivative__set__vol(self._handle, vol) + + @property + def innout(self): + """ + Element innout ftype=integer pytype=int + + + Defined at global.fpp line 169 + + """ + return _spec.f90wrap_derivative__get__innout(self._handle) + + @innout.setter + def innout(self, innout): + _spec.f90wrap_derivative__set__innout(self._handle, innout) + + @property + def ii(self): + """ + Element ii ftype=integer pytype=int + + + Defined at global.fpp line 170 + + """ + return _spec.f90wrap_derivative__get__ii(self._handle) + + @ii.setter + def ii(self, ii): + _spec.f90wrap_derivative__set__ii(self._handle, ii) + + @property + def irz(self): + """ + Element irz ftype=integer pytype=int + + + Defined at global.fpp line 171 + + """ + return _spec.f90wrap_derivative__get__irz(self._handle) + + @irz.setter + def irz(self, irz): + _spec.f90wrap_derivative__set__irz(self._handle, irz) + + @property + def issym(self): + """ + Element issym ftype=integer pytype=int + + + Defined at global.fpp line 172 + + """ + return _spec.f90wrap_derivative__get__issym(self._handle) + + @issym.setter + def issym(self, issym): + _spec.f90wrap_derivative__set__issym(self._handle, issym) + + def __str__(self): + ret = ['{\n'] + ret.append(' l : ') + ret.append(repr(self.l)) + ret.append(',\n vol : ') + ret.append(repr(self.vol)) + ret.append(',\n innout : ') + ret.append(repr(self.innout)) + ret.append(',\n ii : ') + ret.append(repr(self.ii)) + ret.append(',\n irz : ') + ret.append(repr(self.irz)) + ret.append(',\n issym : ') + ret.append(repr(self.issym)) + ret.append('}') + return ''.join(ret) + + _dt_array_initialisers = [] + + + _dt_array_initialisers = [] + + +typedefns = Typedefns() + +class Allglobal(f90wrap.runtime.FortranModule): + """ + Module allglobal + + + Defined at global.fpp lines 176-2271 + + """ + @staticmethod + def build_vector_potential(lvol, iocons, aderiv, tderiv): + """ + build_vector_potential(lvol, iocons, aderiv, tderiv) + + + Defined at global.fpp lines 536-589 + + Parameters + ---------- + lvol : int + iocons : int + aderiv : int + tderiv : int + + """ + _spec.f90wrap_build_vector_potential(lvol=lvol, iocons=iocons, aderiv=aderiv, \ + tderiv=tderiv) + + @staticmethod + def set_mpi_comm(comm): + """ + set_mpi_comm(comm) + + + Defined at global.fpp lines 595-607 + + Parameters + ---------- + comm : int + + """ + _spec.f90wrap_set_mpi_comm(comm=comm) + + @staticmethod + def read_inputlists_from_file(): + """ + read_inputlists_from_file() + + + Defined at global.fpp lines 610-733 + + + """ + _spec.f90wrap_read_inputlists_from_file() + + @staticmethod + def check_inputs(): + """ + check_inputs() + + + Defined at global.fpp lines 737-1126 + + + """ + _spec.f90wrap_check_inputs() + + @staticmethod + def broadcast_inputs(): + """ + broadcast_inputs() + + + Defined at global.fpp lines 1130-1927 + + + """ + _spec.f90wrap_broadcast_inputs() + + @staticmethod + def wrtend(): + """ + wrtend() + + + Defined at global.fpp lines 1931-2235 + + + """ + _spec.f90wrap_wrtend() + + @staticmethod + def ismyvolume(vvol): + """ + ismyvolume(vvol) + + + Defined at global.fpp lines 2238-2255 + + Parameters + ---------- + vvol : int + + """ + _spec.f90wrap_ismyvolume(vvol=vvol) + + @staticmethod + def whichcpuid(vvol, cpu_id): + """ + whichcpuid(vvol, cpu_id) + + + Defined at global.fpp lines 2258-2269 + + Parameters + ---------- + vvol : int + cpu_id : int + + """ + _spec.f90wrap_whichcpuid(vvol=vvol, cpu_id=cpu_id) + + @property + def myid(self): + """ + Element myid ftype=integer pytype=int + + + Defined at global.fpp line 181 + + """ + return _spec.f90wrap_allglobal__get__myid() + + @myid.setter + def myid(self, myid): + _spec.f90wrap_allglobal__set__myid(myid) + + @property + def ncpu(self): + """ + Element ncpu ftype=integer pytype=int + + + Defined at global.fpp line 181 + + """ + return _spec.f90wrap_allglobal__get__ncpu() + + @ncpu.setter + def ncpu(self, ncpu): + _spec.f90wrap_allglobal__set__ncpu(ncpu) + + @property + def mpi_comm_spec(self): + """ + Element mpi_comm_spec ftype=integer pytype=int + + + Defined at global.fpp line 181 + + """ + return _spec.f90wrap_allglobal__get__mpi_comm_spec() + + @mpi_comm_spec.setter + def mpi_comm_spec(self, mpi_comm_spec): + _spec.f90wrap_allglobal__set__mpi_comm_spec(mpi_comm_spec) + + @property + def ismyvolumevalue(self): + """ + Element ismyvolumevalue ftype=integer pytype=int + + + Defined at global.fpp line 182 + + """ + return _spec.f90wrap_allglobal__get__ismyvolumevalue() + + @ismyvolumevalue.setter + def ismyvolumevalue(self, ismyvolumevalue): + _spec.f90wrap_allglobal__set__ismyvolumevalue(ismyvolumevalue) + + @property + def cpus(self): + """ + Element cpus ftype=real(8) pytype=float + + + Defined at global.fpp line 183 + + """ + return _spec.f90wrap_allglobal__get__cpus() + + @cpus.setter + def cpus(self, cpus): + _spec.f90wrap_allglobal__set__cpus(cpus) + + @property + def skip_write(self): + """ + Element skip_write ftype=logical pytype=bool + + + Defined at global.fpp line 184 + + """ + return _spec.f90wrap_allglobal__get__skip_write() + + @skip_write.setter + def skip_write(self, skip_write): + _spec.f90wrap_allglobal__set__skip_write(skip_write) + + @property + def pi2nfp(self): + """ + Element pi2nfp ftype=real(8) pytype=float + + + Defined at global.fpp line 185 + + """ + return _spec.f90wrap_allglobal__get__pi2nfp() + + @pi2nfp.setter + def pi2nfp(self, pi2nfp): + _spec.f90wrap_allglobal__set__pi2nfp(pi2nfp) + + @property + def pi2pi2nfp(self): + """ + Element pi2pi2nfp ftype=real(8) pytype=float + + + Defined at global.fpp line 186 + + """ + return _spec.f90wrap_allglobal__get__pi2pi2nfp() + + @pi2pi2nfp.setter + def pi2pi2nfp(self, pi2pi2nfp): + _spec.f90wrap_allglobal__set__pi2pi2nfp(pi2pi2nfp) + + @property + def pi2pi2nfphalf(self): + """ + Element pi2pi2nfphalf ftype=real(8) pytype=float + + + Defined at global.fpp line 187 + + """ + return _spec.f90wrap_allglobal__get__pi2pi2nfphalf() + + @pi2pi2nfphalf.setter + def pi2pi2nfphalf(self, pi2pi2nfphalf): + _spec.f90wrap_allglobal__set__pi2pi2nfphalf(pi2pi2nfphalf) + + @property + def pi2pi2nfpquart(self): + """ + Element pi2pi2nfpquart ftype=real(8) pytype=float + + + Defined at global.fpp line 188 + + """ + return _spec.f90wrap_allglobal__get__pi2pi2nfpquart() + + @pi2pi2nfpquart.setter + def pi2pi2nfpquart(self, pi2pi2nfpquart): + _spec.f90wrap_allglobal__set__pi2pi2nfpquart(pi2pi2nfpquart) + + @property + def ext(self): + """ + Element ext ftype=character(len=100) pytype=str + + + Defined at global.fpp line 190 + + """ + return _spec.f90wrap_allglobal__get__ext() + + @ext.setter + def ext(self, ext): + _spec.f90wrap_allglobal__set__ext(ext) + + @property + def forceerr(self): + """ + Element forceerr ftype=real(8) pytype=float + + + Defined at global.fpp line 191 + + """ + return _spec.f90wrap_allglobal__get__forceerr() + + @forceerr.setter + def forceerr(self, forceerr): + _spec.f90wrap_allglobal__set__forceerr(forceerr) + + @property + def energy(self): + """ + Element energy ftype=real(8) pytype=float + + + Defined at global.fpp line 191 + + """ + return _spec.f90wrap_allglobal__get__energy() + + @energy.setter + def energy(self, energy): + _spec.f90wrap_allglobal__set__energy(energy) + + @property + def ipdt(self): + """ + Element ipdt ftype=real(8) pytype=float + + + Defined at global.fpp line 192 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__ipdt(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + ipdt = self._arrays[array_handle] + else: + ipdt = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__ipdt) + self._arrays[array_handle] = ipdt + return ipdt + + @ipdt.setter + def ipdt(self, ipdt): + self.ipdt[...] = ipdt + + @property + def ipdtdpf(self): + """ + Element ipdtdpf ftype=real(8) pytype=float + + + Defined at global.fpp line 192 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__ipdtdpf(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + ipdtdpf = self._arrays[array_handle] + else: + ipdtdpf = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__ipdtdpf) + self._arrays[array_handle] = ipdtdpf + return ipdtdpf + + @ipdtdpf.setter + def ipdtdpf(self, ipdtdpf): + self.ipdtdpf[...] = ipdtdpf + + @property + def mvol(self): + """ + Element mvol ftype=integer pytype=int + + + Defined at global.fpp line 193 + + """ + return _spec.f90wrap_allglobal__get__mvol() + + @mvol.setter + def mvol(self, mvol): + _spec.f90wrap_allglobal__set__mvol(mvol) + + @property + def yesstellsym(self): + """ + Element yesstellsym ftype=logical pytype=bool + + + Defined at global.fpp line 194 + + """ + return _spec.f90wrap_allglobal__get__yesstellsym() + + @yesstellsym.setter + def yesstellsym(self, yesstellsym): + _spec.f90wrap_allglobal__set__yesstellsym(yesstellsym) + + @property + def notstellsym(self): + """ + Element notstellsym ftype=logical pytype=bool + + + Defined at global.fpp line 194 + + """ + return _spec.f90wrap_allglobal__get__notstellsym() + + @notstellsym.setter + def notstellsym(self, notstellsym): + _spec.f90wrap_allglobal__set__notstellsym(notstellsym) + + @property + def yesmatrixfree(self): + """ + Element yesmatrixfree ftype=logical pytype=bool + + + Defined at global.fpp line 195 + + """ + return _spec.f90wrap_allglobal__get__yesmatrixfree() + + @yesmatrixfree.setter + def yesmatrixfree(self, yesmatrixfree): + _spec.f90wrap_allglobal__set__yesmatrixfree(yesmatrixfree) + + @property + def notmatrixfree(self): + """ + Element notmatrixfree ftype=logical pytype=bool + + + Defined at global.fpp line 195 + + """ + return _spec.f90wrap_allglobal__get__notmatrixfree() + + @notmatrixfree.setter + def notmatrixfree(self, notmatrixfree): + _spec.f90wrap_allglobal__set__notmatrixfree(notmatrixfree) + + @property + def cheby(self): + """ + Element cheby ftype=real(8) pytype=float + + + Defined at global.fpp line 196 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__cheby(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + cheby = self._arrays[array_handle] + else: + cheby = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__cheby) + self._arrays[array_handle] = cheby + return cheby + + @cheby.setter + def cheby(self, cheby): + self.cheby[...] = cheby + + @property + def zernike(self): + """ + Element zernike ftype=real(8) pytype=float + + + Defined at global.fpp line 196 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__zernike(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + zernike = self._arrays[array_handle] + else: + zernike = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__zernike) + self._arrays[array_handle] = zernike + return zernike + + @zernike.setter + def zernike(self, zernike): + self.zernike[...] = zernike + + @property + def tt(self): + """ + Element tt ftype=real(8) pytype=float + + + Defined at global.fpp line 197 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__tt(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + tt = self._arrays[array_handle] + else: + tt = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__tt) + self._arrays[array_handle] = tt + return tt + + @tt.setter + def tt(self, tt): + self.tt[...] = tt + + @property + def rtt(self): + """ + Element rtt ftype=real(8) pytype=float + + + Defined at global.fpp line 197 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__rtt(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + rtt = self._arrays[array_handle] + else: + rtt = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__rtt) + self._arrays[array_handle] = rtt + return rtt + + @rtt.setter + def rtt(self, rtt): + self.rtt[...] = rtt + + @property + def rtm(self): + """ + Element rtm ftype=real(8) pytype=float + + + Defined at global.fpp line 198 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__rtm(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + rtm = self._arrays[array_handle] + else: + rtm = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__rtm) + self._arrays[array_handle] = rtm + return rtm + + @rtm.setter + def rtm(self, rtm): + self.rtm[...] = rtm + + @property + def zernikedof(self): + """ + Element zernikedof ftype=real(8) pytype=float + + + Defined at global.fpp line 199 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__zernikedof(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + zernikedof = self._arrays[array_handle] + else: + zernikedof = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__zernikedof) + self._arrays[array_handle] = zernikedof + return zernikedof + + @zernikedof.setter + def zernikedof(self, zernikedof): + self.zernikedof[...] = zernikedof + + @property + def imagneticok(self): + """ + Element imagneticok ftype=logical pytype=bool + + + Defined at global.fpp line 200 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__imagneticok(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + imagneticok = self._arrays[array_handle] + else: + imagneticok = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__imagneticok) + self._arrays[array_handle] = imagneticok + return imagneticok + + @imagneticok.setter + def imagneticok(self, imagneticok): + self.imagneticok[...] = imagneticok + + @property + def iconstraintok(self): + """ + Element iconstraintok ftype=logical pytype=bool + + + Defined at global.fpp line 201 + + """ + return _spec.f90wrap_allglobal__get__iconstraintok() + + @iconstraintok.setter + def iconstraintok(self, iconstraintok): + _spec.f90wrap_allglobal__set__iconstraintok(iconstraintok) + + @property + def beltramierror(self): + """ + Element beltramierror ftype=real(8) pytype=float + + + Defined at global.fpp line 202 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__beltramierror(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + beltramierror = self._arrays[array_handle] + else: + beltramierror = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__beltramierror) + self._arrays[array_handle] = beltramierror + return beltramierror + + @beltramierror.setter + def beltramierror(self, beltramierror): + self.beltramierror[...] = beltramierror + + @property + def mn(self): + """ + Element mn ftype=integer pytype=int + + + Defined at global.fpp line 207 + + """ + return _spec.f90wrap_allglobal__get__mn() + + @mn.setter + def mn(self, mn): + _spec.f90wrap_allglobal__set__mn(mn) + + @property + def im(self): + """ + Element im ftype=integer pytype=int + + + Defined at global.fpp line 208 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__im(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + im = self._arrays[array_handle] + else: + im = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__im) + self._arrays[array_handle] = im + return im + + @im.setter + def im(self, im): + self.im[...] = im + + @property + def in_(self): + """ + Element in_ ftype=integer pytype=int + + + Defined at global.fpp line 208 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__in_(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + in_ = self._arrays[array_handle] + else: + in_ = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__in_) + self._arrays[array_handle] = in_ + return in_ + + @in_.setter + def in_(self, in_): + self.in_[...] = in_ + + @property + def halfmm(self): + """ + Element halfmm ftype=real(8) pytype=float + + + Defined at global.fpp line 209 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__halfmm(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + halfmm = self._arrays[array_handle] + else: + halfmm = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__halfmm) + self._arrays[array_handle] = halfmm + return halfmm + + @halfmm.setter + def halfmm(self, halfmm): + self.halfmm[...] = halfmm + + @property + def regumm(self): + """ + Element regumm ftype=real(8) pytype=float + + + Defined at global.fpp line 209 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__regumm(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + regumm = self._arrays[array_handle] + else: + regumm = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__regumm) + self._arrays[array_handle] = regumm + return regumm + + @regumm.setter + def regumm(self, regumm): + self.regumm[...] = regumm + + @property + def rscale(self): + """ + Element rscale ftype=real(8) pytype=float + + + Defined at global.fpp line 210 + + """ + return _spec.f90wrap_allglobal__get__rscale() + + @rscale.setter + def rscale(self, rscale): + _spec.f90wrap_allglobal__set__rscale(rscale) + + @property + def psifactor(self): + """ + Element psifactor ftype=real(8) pytype=float + + + Defined at global.fpp line 211 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__psifactor(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + psifactor = self._arrays[array_handle] + else: + psifactor = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__psifactor) + self._arrays[array_handle] = psifactor + return psifactor + + @psifactor.setter + def psifactor(self, psifactor): + self.psifactor[...] = psifactor + + @property + def inifactor(self): + """ + Element inifactor ftype=real(8) pytype=float + + + Defined at global.fpp line 211 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__inifactor(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + inifactor = self._arrays[array_handle] + else: + inifactor = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__inifactor) + self._arrays[array_handle] = inifactor + return inifactor + + @inifactor.setter + def inifactor(self, inifactor): + self.inifactor[...] = inifactor + + @property + def bbweight(self): + """ + Element bbweight ftype=real(8) pytype=float + + + Defined at global.fpp line 212 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__bbweight(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + bbweight = self._arrays[array_handle] + else: + bbweight = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__bbweight) + self._arrays[array_handle] = bbweight + return bbweight + + @bbweight.setter + def bbweight(self, bbweight): + self.bbweight[...] = bbweight + + @property + def mmpp(self): + """ + Element mmpp ftype=real(8) pytype=float + + + Defined at global.fpp line 213 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__mmpp(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + mmpp = self._arrays[array_handle] + else: + mmpp = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__mmpp) + self._arrays[array_handle] = mmpp + return mmpp + + @mmpp.setter + def mmpp(self, mmpp): + self.mmpp[...] = mmpp + + @property + def mne(self): + """ + Element mne ftype=integer pytype=int + + + Defined at global.fpp line 217 + + """ + return _spec.f90wrap_allglobal__get__mne() + + @mne.setter + def mne(self, mne): + _spec.f90wrap_allglobal__set__mne(mne) + + @property + def ime(self): + """ + Element ime ftype=integer pytype=int + + + Defined at global.fpp line 218 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__ime(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + ime = self._arrays[array_handle] + else: + ime = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__ime) + self._arrays[array_handle] = ime + return ime + + @ime.setter + def ime(self, ime): + self.ime[...] = ime + + @property + def ine(self): + """ + Element ine ftype=integer pytype=int + + + Defined at global.fpp line 218 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__ine(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + ine = self._arrays[array_handle] + else: + ine = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__ine) + self._arrays[array_handle] = ine + return ine + + @ine.setter + def ine(self, ine): + self.ine[...] = ine + + @property + def mns(self): + """ + Element mns ftype=integer pytype=int + + + Defined at global.fpp line 223 + + """ + return _spec.f90wrap_allglobal__get__mns() + + @mns.setter + def mns(self, mns): + _spec.f90wrap_allglobal__set__mns(mns) + + @property + def ims(self): + """ + Element ims ftype=integer pytype=int + + + Defined at global.fpp line 224 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__ims(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + ims = self._arrays[array_handle] + else: + ims = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__ims) + self._arrays[array_handle] = ims + return ims + + @ims.setter + def ims(self, ims): + self.ims[...] = ims + + @property + def ins(self): + """ + Element ins ftype=integer pytype=int + + + Defined at global.fpp line 224 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__ins(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + ins = self._arrays[array_handle] + else: + ins = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__ins) + self._arrays[array_handle] = ins + return ins + + @ins.setter + def ins(self, ins): + self.ins[...] = ins + + @property + def lmpol(self): + """ + Element lmpol ftype=integer pytype=int + + + Defined at global.fpp line 225 + + """ + return _spec.f90wrap_allglobal__get__lmpol() + + @lmpol.setter + def lmpol(self, lmpol): + _spec.f90wrap_allglobal__set__lmpol(lmpol) + + @property + def lntor(self): + """ + Element lntor ftype=integer pytype=int + + + Defined at global.fpp line 225 + + """ + return _spec.f90wrap_allglobal__get__lntor() + + @lntor.setter + def lntor(self, lntor): + _spec.f90wrap_allglobal__set__lntor(lntor) + + @property + def smpol(self): + """ + Element smpol ftype=integer pytype=int + + + Defined at global.fpp line 225 + + """ + return _spec.f90wrap_allglobal__get__smpol() + + @smpol.setter + def smpol(self, smpol): + _spec.f90wrap_allglobal__set__smpol(smpol) + + @property + def sntor(self): + """ + Element sntor ftype=integer pytype=int + + + Defined at global.fpp line 225 + + """ + return _spec.f90wrap_allglobal__get__sntor() + + @sntor.setter + def sntor(self, sntor): + _spec.f90wrap_allglobal__set__sntor(sntor) + + @property + def xoffset(self): + """ + Element xoffset ftype=real(8) pytype=float + + + Defined at global.fpp line 227 + + """ + return _spec.f90wrap_allglobal__get__xoffset() + + @xoffset.setter + def xoffset(self, xoffset): + _spec.f90wrap_allglobal__set__xoffset(xoffset) + + @property + def irbc(self): + """ + Element irbc ftype=real(8) pytype=float + + + Defined at global.fpp line 234 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__irbc(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + irbc = self._arrays[array_handle] + else: + irbc = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__irbc) + self._arrays[array_handle] = irbc + return irbc + + @irbc.setter + def irbc(self, irbc): + self.irbc[...] = irbc + + @property + def izbs(self): + """ + Element izbs ftype=real(8) pytype=float + + + Defined at global.fpp line 234 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__izbs(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + izbs = self._arrays[array_handle] + else: + izbs = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__izbs) + self._arrays[array_handle] = izbs + return izbs + + @izbs.setter + def izbs(self, izbs): + self.izbs[...] = izbs + + @property + def irbs(self): + """ + Element irbs ftype=real(8) pytype=float + + + Defined at global.fpp line 235 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__irbs(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + irbs = self._arrays[array_handle] + else: + irbs = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__irbs) + self._arrays[array_handle] = irbs + return irbs + + @irbs.setter + def irbs(self, irbs): + self.irbs[...] = irbs + + @property + def izbc(self): + """ + Element izbc ftype=real(8) pytype=float + + + Defined at global.fpp line 235 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__izbc(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + izbc = self._arrays[array_handle] + else: + izbc = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__izbc) + self._arrays[array_handle] = izbc + return izbc + + @izbc.setter + def izbc(self, izbc): + self.izbc[...] = izbc + + @property + def drbc(self): + """ + Element drbc ftype=real(8) pytype=float + + + Defined at global.fpp line 236 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__drbc(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + drbc = self._arrays[array_handle] + else: + drbc = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__drbc) + self._arrays[array_handle] = drbc + return drbc + + @drbc.setter + def drbc(self, drbc): + self.drbc[...] = drbc + + @property + def dzbs(self): + """ + Element dzbs ftype=real(8) pytype=float + + + Defined at global.fpp line 236 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__dzbs(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + dzbs = self._arrays[array_handle] + else: + dzbs = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__dzbs) + self._arrays[array_handle] = dzbs + return dzbs + + @dzbs.setter + def dzbs(self, dzbs): + self.dzbs[...] = dzbs + + @property + def drbs(self): + """ + Element drbs ftype=real(8) pytype=float + + + Defined at global.fpp line 237 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__drbs(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + drbs = self._arrays[array_handle] + else: + drbs = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__drbs) + self._arrays[array_handle] = drbs + return drbs + + @drbs.setter + def drbs(self, drbs): + self.drbs[...] = drbs + + @property + def dzbc(self): + """ + Element dzbc ftype=real(8) pytype=float + + + Defined at global.fpp line 237 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__dzbc(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + dzbc = self._arrays[array_handle] + else: + dzbc = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__dzbc) + self._arrays[array_handle] = dzbc + return dzbc + + @dzbc.setter + def dzbc(self, dzbc): + self.dzbc[...] = dzbc + + @property + def irij(self): + """ + Element irij ftype=real(8) pytype=float + + + Defined at global.fpp line 238 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__irij(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + irij = self._arrays[array_handle] + else: + irij = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__irij) + self._arrays[array_handle] = irij + return irij + + @irij.setter + def irij(self, irij): + self.irij[...] = irij + + @property + def izij(self): + """ + Element izij ftype=real(8) pytype=float + + + Defined at global.fpp line 238 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__izij(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + izij = self._arrays[array_handle] + else: + izij = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__izij) + self._arrays[array_handle] = izij + return izij + + @izij.setter + def izij(self, izij): + self.izij[...] = izij + + @property + def drij(self): + """ + Element drij ftype=real(8) pytype=float + + + Defined at global.fpp line 239 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__drij(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + drij = self._arrays[array_handle] + else: + drij = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__drij) + self._arrays[array_handle] = drij + return drij + + @drij.setter + def drij(self, drij): + self.drij[...] = drij + + @property + def dzij(self): + """ + Element dzij ftype=real(8) pytype=float + + + Defined at global.fpp line 239 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__dzij(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + dzij = self._arrays[array_handle] + else: + dzij = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__dzij) + self._arrays[array_handle] = dzij + return dzij + + @dzij.setter + def dzij(self, dzij): + self.dzij[...] = dzij + + @property + def trij(self): + """ + Element trij ftype=real(8) pytype=float + + + Defined at global.fpp line 240 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__trij(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + trij = self._arrays[array_handle] + else: + trij = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__trij) + self._arrays[array_handle] = trij + return trij + + @trij.setter + def trij(self, trij): + self.trij[...] = trij + + @property + def tzij(self): + """ + Element tzij ftype=real(8) pytype=float + + + Defined at global.fpp line 240 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__tzij(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + tzij = self._arrays[array_handle] + else: + tzij = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__tzij) + self._arrays[array_handle] = tzij + return tzij + + @tzij.setter + def tzij(self, tzij): + self.tzij[...] = tzij + + @property + def ivns(self): + """ + Element ivns ftype=real(8) pytype=float + + + Defined at global.fpp line 241 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__ivns(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + ivns = self._arrays[array_handle] + else: + ivns = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__ivns) + self._arrays[array_handle] = ivns + return ivns + + @ivns.setter + def ivns(self, ivns): + self.ivns[...] = ivns + + @property + def ibns(self): + """ + Element ibns ftype=real(8) pytype=float + + + Defined at global.fpp line 242 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__ibns(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + ibns = self._arrays[array_handle] + else: + ibns = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__ibns) + self._arrays[array_handle] = ibns + return ibns + + @ibns.setter + def ibns(self, ibns): + self.ibns[...] = ibns + + @property + def ivnc(self): + """ + Element ivnc ftype=real(8) pytype=float + + + Defined at global.fpp line 243 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__ivnc(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + ivnc = self._arrays[array_handle] + else: + ivnc = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__ivnc) + self._arrays[array_handle] = ivnc + return ivnc + + @ivnc.setter + def ivnc(self, ivnc): + self.ivnc[...] = ivnc + + @property + def ibnc(self): + """ + Element ibnc ftype=real(8) pytype=float + + + Defined at global.fpp line 244 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__ibnc(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + ibnc = self._arrays[array_handle] + else: + ibnc = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__ibnc) + self._arrays[array_handle] = ibnc + return ibnc + + @ibnc.setter + def ibnc(self, ibnc): + self.ibnc[...] = ibnc + + @property + def lrbc(self): + """ + Element lrbc ftype=real(8) pytype=float + + + Defined at global.fpp line 245 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__lrbc(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + lrbc = self._arrays[array_handle] + else: + lrbc = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__lrbc) + self._arrays[array_handle] = lrbc + return lrbc + + @lrbc.setter + def lrbc(self, lrbc): + self.lrbc[...] = lrbc + + @property + def lzbs(self): + """ + Element lzbs ftype=real(8) pytype=float + + + Defined at global.fpp line 245 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__lzbs(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + lzbs = self._arrays[array_handle] + else: + lzbs = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__lzbs) + self._arrays[array_handle] = lzbs + return lzbs + + @lzbs.setter + def lzbs(self, lzbs): + self.lzbs[...] = lzbs + + @property + def lrbs(self): + """ + Element lrbs ftype=real(8) pytype=float + + + Defined at global.fpp line 246 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__lrbs(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + lrbs = self._arrays[array_handle] + else: + lrbs = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__lrbs) + self._arrays[array_handle] = lrbs + return lrbs + + @lrbs.setter + def lrbs(self, lrbs): + self.lrbs[...] = lrbs + + @property + def lzbc(self): + """ + Element lzbc ftype=real(8) pytype=float + + + Defined at global.fpp line 246 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__lzbc(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + lzbc = self._arrays[array_handle] + else: + lzbc = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__lzbc) + self._arrays[array_handle] = lzbc + return lzbc + + @lzbc.setter + def lzbc(self, lzbc): + self.lzbc[...] = lzbc + + @property + def num_modes(self): + """ + Element num_modes ftype=integer pytype=int + + + Defined at global.fpp line 248 + + """ + return _spec.f90wrap_allglobal__get__num_modes() + + @num_modes.setter + def num_modes(self, num_modes): + _spec.f90wrap_allglobal__set__num_modes(num_modes) + + @property + def mmrzrz(self): + """ + Element mmrzrz ftype=integer pytype=int + + + Defined at global.fpp line 249 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__mmrzrz(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + mmrzrz = self._arrays[array_handle] + else: + mmrzrz = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__mmrzrz) + self._arrays[array_handle] = mmrzrz + return mmrzrz + + @mmrzrz.setter + def mmrzrz(self, mmrzrz): + self.mmrzrz[...] = mmrzrz + + @property + def nnrzrz(self): + """ + Element nnrzrz ftype=integer pytype=int + + + Defined at global.fpp line 249 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__nnrzrz(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + nnrzrz = self._arrays[array_handle] + else: + nnrzrz = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__nnrzrz) + self._arrays[array_handle] = nnrzrz + return nnrzrz + + @nnrzrz.setter + def nnrzrz(self, nnrzrz): + self.nnrzrz[...] = nnrzrz + + @property + def allrzrz(self): + """ + Element allrzrz ftype=real(8) pytype=float + + + Defined at global.fpp line 250 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__allrzrz(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + allrzrz = self._arrays[array_handle] + else: + allrzrz = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__allrzrz) + self._arrays[array_handle] = allrzrz + return allrzrz + + @allrzrz.setter + def allrzrz(self, allrzrz): + self.allrzrz[...] = allrzrz + + @property + def nt(self): + """ + Element nt ftype=integer pytype=int + + + Defined at global.fpp line 256 + + """ + return _spec.f90wrap_allglobal__get__nt() + + @nt.setter + def nt(self, nt): + _spec.f90wrap_allglobal__set__nt(nt) + + @property + def nz(self): + """ + Element nz ftype=integer pytype=int + + + Defined at global.fpp line 256 + + """ + return _spec.f90wrap_allglobal__get__nz() + + @nz.setter + def nz(self, nz): + _spec.f90wrap_allglobal__set__nz(nz) + + @property + def ntz(self): + """ + Element ntz ftype=integer pytype=int + + + Defined at global.fpp line 256 + + """ + return _spec.f90wrap_allglobal__get__ntz() + + @ntz.setter + def ntz(self, ntz): + _spec.f90wrap_allglobal__set__ntz(ntz) + + @property + def hnt(self): + """ + Element hnt ftype=integer pytype=int + + + Defined at global.fpp line 256 + + """ + return _spec.f90wrap_allglobal__get__hnt() + + @hnt.setter + def hnt(self, hnt): + _spec.f90wrap_allglobal__set__hnt(hnt) + + @property + def hnz(self): + """ + Element hnz ftype=integer pytype=int + + + Defined at global.fpp line 256 + + """ + return _spec.f90wrap_allglobal__get__hnz() + + @hnz.setter + def hnz(self, hnz): + _spec.f90wrap_allglobal__set__hnz(hnz) + + @property + def sontz(self): + """ + Element sontz ftype=real(8) pytype=float + + + Defined at global.fpp line 257 + + """ + return _spec.f90wrap_allglobal__get__sontz() + + @sontz.setter + def sontz(self, sontz): + _spec.f90wrap_allglobal__set__sontz(sontz) + + @property + def rij(self): + """ + Element rij ftype=real(8) pytype=float + + + Defined at global.fpp line 263 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__rij(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + rij = self._arrays[array_handle] + else: + rij = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__rij) + self._arrays[array_handle] = rij + return rij + + @rij.setter + def rij(self, rij): + self.rij[...] = rij + + @property + def zij(self): + """ + Element zij ftype=real(8) pytype=float + + + Defined at global.fpp line 263 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__zij(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + zij = self._arrays[array_handle] + else: + zij = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__zij) + self._arrays[array_handle] = zij + return zij + + @zij.setter + def zij(self, zij): + self.zij[...] = zij + + @property + def xij(self): + """ + Element xij ftype=real(8) pytype=float + + + Defined at global.fpp line 263 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__xij(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + xij = self._arrays[array_handle] + else: + xij = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__xij) + self._arrays[array_handle] = xij + return xij + + @xij.setter + def xij(self, xij): + self.xij[...] = xij + + @property + def yij(self): + """ + Element yij ftype=real(8) pytype=float + + + Defined at global.fpp line 263 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__yij(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + yij = self._arrays[array_handle] + else: + yij = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__yij) + self._arrays[array_handle] = yij + return yij + + @yij.setter + def yij(self, yij): + self.yij[...] = yij + + @property + def sg(self): + """ + Element sg ftype=real(8) pytype=float + + + Defined at global.fpp line 263 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__sg(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + sg = self._arrays[array_handle] + else: + sg = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__sg) + self._arrays[array_handle] = sg + return sg + + @sg.setter + def sg(self, sg): + self.sg[...] = sg + + @property + def guvij(self): + """ + Element guvij ftype=real(8) pytype=float + + + Defined at global.fpp line 263 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__guvij(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + guvij = self._arrays[array_handle] + else: + guvij = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__guvij) + self._arrays[array_handle] = guvij + return guvij + + @guvij.setter + def guvij(self, guvij): + self.guvij[...] = guvij + + @property + def gvuij(self): + """ + Element gvuij ftype=real(8) pytype=float + + + Defined at global.fpp line 263 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__gvuij(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + gvuij = self._arrays[array_handle] + else: + gvuij = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__gvuij) + self._arrays[array_handle] = gvuij + return gvuij + + @gvuij.setter + def gvuij(self, gvuij): + self.gvuij[...] = gvuij + + @property + def guvijsave(self): + """ + Element guvijsave ftype=real(8) pytype=float + + + Defined at global.fpp line 264 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__guvijsave(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + guvijsave = self._arrays[array_handle] + else: + guvijsave = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__guvijsave) + self._arrays[array_handle] = guvijsave + return guvijsave + + @guvijsave.setter + def guvijsave(self, guvijsave): + self.guvijsave[...] = guvijsave + + @property + def ki(self): + """ + Element ki ftype=integer pytype=int + + + Defined at global.fpp line 265 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__ki(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + ki = self._arrays[array_handle] + else: + ki = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__ki) + self._arrays[array_handle] = ki + return ki + + @ki.setter + def ki(self, ki): + self.ki[...] = ki + + @property + def kijs(self): + """ + Element kijs ftype=integer pytype=int + + + Defined at global.fpp line 265 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__kijs(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + kijs = self._arrays[array_handle] + else: + kijs = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__kijs) + self._arrays[array_handle] = kijs + return kijs + + @kijs.setter + def kijs(self, kijs): + self.kijs[...] = kijs + + @property + def kija(self): + """ + Element kija ftype=integer pytype=int + + + Defined at global.fpp line 265 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__kija(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + kija = self._arrays[array_handle] + else: + kija = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__kija) + self._arrays[array_handle] = kija + return kija + + @kija.setter + def kija(self, kija): + self.kija[...] = kija + + @property + def iotakkii(self): + """ + Element iotakkii ftype=integer pytype=int + + + Defined at global.fpp line 266 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__iotakkii(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + iotakkii = self._arrays[array_handle] + else: + iotakkii = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__iotakkii) + self._arrays[array_handle] = iotakkii + return iotakkii + + @iotakkii.setter + def iotakkii(self, iotakkii): + self.iotakkii[...] = iotakkii + + @property + def iotaksub(self): + """ + Element iotaksub ftype=integer pytype=int + + + Defined at global.fpp line 266 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__iotaksub(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + iotaksub = self._arrays[array_handle] + else: + iotaksub = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__iotaksub) + self._arrays[array_handle] = iotaksub + return iotaksub + + @iotaksub.setter + def iotaksub(self, iotaksub): + self.iotaksub[...] = iotaksub + + @property + def iotakadd(self): + """ + Element iotakadd ftype=integer pytype=int + + + Defined at global.fpp line 266 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__iotakadd(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + iotakadd = self._arrays[array_handle] + else: + iotakadd = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__iotakadd) + self._arrays[array_handle] = iotakadd + return iotakadd + + @iotakadd.setter + def iotakadd(self, iotakadd): + self.iotakadd[...] = iotakadd + + @property + def iotaksgn(self): + """ + Element iotaksgn ftype=integer pytype=int + + + Defined at global.fpp line 266 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__iotaksgn(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + iotaksgn = self._arrays[array_handle] + else: + iotaksgn = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__iotaksgn) + self._arrays[array_handle] = iotaksgn + return iotaksgn + + @iotaksgn.setter + def iotaksgn(self, iotaksgn): + self.iotaksgn[...] = iotaksgn + + @property + def efmn(self): + """ + Element efmn ftype=real(8) pytype=float + + + Defined at global.fpp line 267 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__efmn(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + efmn = self._arrays[array_handle] + else: + efmn = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__efmn) + self._arrays[array_handle] = efmn + return efmn + + @efmn.setter + def efmn(self, efmn): + self.efmn[...] = efmn + + @property + def ofmn(self): + """ + Element ofmn ftype=real(8) pytype=float + + + Defined at global.fpp line 267 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__ofmn(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + ofmn = self._arrays[array_handle] + else: + ofmn = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__ofmn) + self._arrays[array_handle] = ofmn + return ofmn + + @ofmn.setter + def ofmn(self, ofmn): + self.ofmn[...] = ofmn + + @property + def cfmn(self): + """ + Element cfmn ftype=real(8) pytype=float + + + Defined at global.fpp line 267 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__cfmn(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + cfmn = self._arrays[array_handle] + else: + cfmn = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__cfmn) + self._arrays[array_handle] = cfmn + return cfmn + + @cfmn.setter + def cfmn(self, cfmn): + self.cfmn[...] = cfmn + + @property + def sfmn(self): + """ + Element sfmn ftype=real(8) pytype=float + + + Defined at global.fpp line 267 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__sfmn(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + sfmn = self._arrays[array_handle] + else: + sfmn = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__sfmn) + self._arrays[array_handle] = sfmn + return sfmn + + @sfmn.setter + def sfmn(self, sfmn): + self.sfmn[...] = sfmn + + @property + def evmn(self): + """ + Element evmn ftype=real(8) pytype=float + + + Defined at global.fpp line 268 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__evmn(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + evmn = self._arrays[array_handle] + else: + evmn = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__evmn) + self._arrays[array_handle] = evmn + return evmn + + @evmn.setter + def evmn(self, evmn): + self.evmn[...] = evmn + + @property + def odmn(self): + """ + Element odmn ftype=real(8) pytype=float + + + Defined at global.fpp line 268 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__odmn(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + odmn = self._arrays[array_handle] + else: + odmn = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__odmn) + self._arrays[array_handle] = odmn + return odmn + + @odmn.setter + def odmn(self, odmn): + self.odmn[...] = odmn + + @property + def comn(self): + """ + Element comn ftype=real(8) pytype=float + + + Defined at global.fpp line 268 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__comn(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + comn = self._arrays[array_handle] + else: + comn = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__comn) + self._arrays[array_handle] = comn + return comn + + @comn.setter + def comn(self, comn): + self.comn[...] = comn + + @property + def simn(self): + """ + Element simn ftype=real(8) pytype=float + + + Defined at global.fpp line 268 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__simn(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + simn = self._arrays[array_handle] + else: + simn = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__simn) + self._arrays[array_handle] = simn + return simn + + @simn.setter + def simn(self, simn): + self.simn[...] = simn + + @property + def ijreal(self): + """ + Element ijreal ftype=real(8) pytype=float + + + Defined at global.fpp line 269 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__ijreal(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + ijreal = self._arrays[array_handle] + else: + ijreal = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__ijreal) + self._arrays[array_handle] = ijreal + return ijreal + + @ijreal.setter + def ijreal(self, ijreal): + self.ijreal[...] = ijreal + + @property + def ijimag(self): + """ + Element ijimag ftype=real(8) pytype=float + + + Defined at global.fpp line 269 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__ijimag(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + ijimag = self._arrays[array_handle] + else: + ijimag = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__ijimag) + self._arrays[array_handle] = ijimag + return ijimag + + @ijimag.setter + def ijimag(self, ijimag): + self.ijimag[...] = ijimag + + @property + def jireal(self): + """ + Element jireal ftype=real(8) pytype=float + + + Defined at global.fpp line 269 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__jireal(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + jireal = self._arrays[array_handle] + else: + jireal = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__jireal) + self._arrays[array_handle] = jireal + return jireal + + @jireal.setter + def jireal(self, jireal): + self.jireal[...] = jireal + + @property + def jiimag(self): + """ + Element jiimag ftype=real(8) pytype=float + + + Defined at global.fpp line 269 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__jiimag(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + jiimag = self._arrays[array_handle] + else: + jiimag = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__jiimag) + self._arrays[array_handle] = jiimag + return jiimag + + @jiimag.setter + def jiimag(self, jiimag): + self.jiimag[...] = jiimag + + @property + def jkreal(self): + """ + Element jkreal ftype=real(8) pytype=float + + + Defined at global.fpp line 270 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__jkreal(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + jkreal = self._arrays[array_handle] + else: + jkreal = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__jkreal) + self._arrays[array_handle] = jkreal + return jkreal + + @jkreal.setter + def jkreal(self, jkreal): + self.jkreal[...] = jkreal + + @property + def jkimag(self): + """ + Element jkimag ftype=real(8) pytype=float + + + Defined at global.fpp line 270 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__jkimag(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + jkimag = self._arrays[array_handle] + else: + jkimag = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__jkimag) + self._arrays[array_handle] = jkimag + return jkimag + + @jkimag.setter + def jkimag(self, jkimag): + self.jkimag[...] = jkimag + + @property + def kjreal(self): + """ + Element kjreal ftype=real(8) pytype=float + + + Defined at global.fpp line 270 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__kjreal(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + kjreal = self._arrays[array_handle] + else: + kjreal = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__kjreal) + self._arrays[array_handle] = kjreal + return kjreal + + @kjreal.setter + def kjreal(self, kjreal): + self.kjreal[...] = kjreal + + @property + def kjimag(self): + """ + Element kjimag ftype=real(8) pytype=float + + + Defined at global.fpp line 270 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__kjimag(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + kjimag = self._arrays[array_handle] + else: + kjimag = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__kjimag) + self._arrays[array_handle] = kjimag + return kjimag + + @kjimag.setter + def kjimag(self, kjimag): + self.kjimag[...] = kjimag + + @property + def bsupumn(self): + """ + Element bsupumn ftype=real(8) pytype=float + + + Defined at global.fpp line 271 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__bsupumn(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + bsupumn = self._arrays[array_handle] + else: + bsupumn = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__bsupumn) + self._arrays[array_handle] = bsupumn + return bsupumn + + @bsupumn.setter + def bsupumn(self, bsupumn): + self.bsupumn[...] = bsupumn + + @property + def bsupvmn(self): + """ + Element bsupvmn ftype=real(8) pytype=float + + + Defined at global.fpp line 271 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__bsupvmn(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + bsupvmn = self._arrays[array_handle] + else: + bsupvmn = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__bsupvmn) + self._arrays[array_handle] = bsupvmn + return bsupvmn + + @bsupvmn.setter + def bsupvmn(self, bsupvmn): + self.bsupvmn[...] = bsupvmn + + @property + def goomne(self): + """ + Element goomne ftype=real(8) pytype=float + + + Defined at global.fpp line 273 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__goomne(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + goomne = self._arrays[array_handle] + else: + goomne = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__goomne) + self._arrays[array_handle] = goomne + return goomne + + @goomne.setter + def goomne(self, goomne): + self.goomne[...] = goomne + + @property + def goomno(self): + """ + Element goomno ftype=real(8) pytype=float + + + Defined at global.fpp line 273 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__goomno(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + goomno = self._arrays[array_handle] + else: + goomno = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__goomno) + self._arrays[array_handle] = goomno + return goomno + + @goomno.setter + def goomno(self, goomno): + self.goomno[...] = goomno + + @property + def gssmne(self): + """ + Element gssmne ftype=real(8) pytype=float + + + Defined at global.fpp line 274 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__gssmne(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + gssmne = self._arrays[array_handle] + else: + gssmne = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__gssmne) + self._arrays[array_handle] = gssmne + return gssmne + + @gssmne.setter + def gssmne(self, gssmne): + self.gssmne[...] = gssmne + + @property + def gssmno(self): + """ + Element gssmno ftype=real(8) pytype=float + + + Defined at global.fpp line 274 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__gssmno(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + gssmno = self._arrays[array_handle] + else: + gssmno = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__gssmno) + self._arrays[array_handle] = gssmno + return gssmno + + @gssmno.setter + def gssmno(self, gssmno): + self.gssmno[...] = gssmno + + @property + def gstmne(self): + """ + Element gstmne ftype=real(8) pytype=float + + + Defined at global.fpp line 275 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__gstmne(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + gstmne = self._arrays[array_handle] + else: + gstmne = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__gstmne) + self._arrays[array_handle] = gstmne + return gstmne + + @gstmne.setter + def gstmne(self, gstmne): + self.gstmne[...] = gstmne + + @property + def gstmno(self): + """ + Element gstmno ftype=real(8) pytype=float + + + Defined at global.fpp line 275 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__gstmno(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + gstmno = self._arrays[array_handle] + else: + gstmno = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__gstmno) + self._arrays[array_handle] = gstmno + return gstmno + + @gstmno.setter + def gstmno(self, gstmno): + self.gstmno[...] = gstmno + + @property + def gszmne(self): + """ + Element gszmne ftype=real(8) pytype=float + + + Defined at global.fpp line 276 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__gszmne(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + gszmne = self._arrays[array_handle] + else: + gszmne = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__gszmne) + self._arrays[array_handle] = gszmne + return gszmne + + @gszmne.setter + def gszmne(self, gszmne): + self.gszmne[...] = gszmne + + @property + def gszmno(self): + """ + Element gszmno ftype=real(8) pytype=float + + + Defined at global.fpp line 276 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__gszmno(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + gszmno = self._arrays[array_handle] + else: + gszmno = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__gszmno) + self._arrays[array_handle] = gszmno + return gszmno + + @gszmno.setter + def gszmno(self, gszmno): + self.gszmno[...] = gszmno + + @property + def gttmne(self): + """ + Element gttmne ftype=real(8) pytype=float + + + Defined at global.fpp line 277 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__gttmne(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + gttmne = self._arrays[array_handle] + else: + gttmne = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__gttmne) + self._arrays[array_handle] = gttmne + return gttmne + + @gttmne.setter + def gttmne(self, gttmne): + self.gttmne[...] = gttmne + + @property + def gttmno(self): + """ + Element gttmno ftype=real(8) pytype=float + + + Defined at global.fpp line 277 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__gttmno(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + gttmno = self._arrays[array_handle] + else: + gttmno = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__gttmno) + self._arrays[array_handle] = gttmno + return gttmno + + @gttmno.setter + def gttmno(self, gttmno): + self.gttmno[...] = gttmno + + @property + def gtzmne(self): + """ + Element gtzmne ftype=real(8) pytype=float + + + Defined at global.fpp line 278 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__gtzmne(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + gtzmne = self._arrays[array_handle] + else: + gtzmne = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__gtzmne) + self._arrays[array_handle] = gtzmne + return gtzmne + + @gtzmne.setter + def gtzmne(self, gtzmne): + self.gtzmne[...] = gtzmne + + @property + def gtzmno(self): + """ + Element gtzmno ftype=real(8) pytype=float + + + Defined at global.fpp line 278 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__gtzmno(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + gtzmno = self._arrays[array_handle] + else: + gtzmno = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__gtzmno) + self._arrays[array_handle] = gtzmno + return gtzmno + + @gtzmno.setter + def gtzmno(self, gtzmno): + self.gtzmno[...] = gtzmno + + @property + def gzzmne(self): + """ + Element gzzmne ftype=real(8) pytype=float + + + Defined at global.fpp line 279 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__gzzmne(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + gzzmne = self._arrays[array_handle] + else: + gzzmne = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__gzzmne) + self._arrays[array_handle] = gzzmne + return gzzmne + + @gzzmne.setter + def gzzmne(self, gzzmne): + self.gzzmne[...] = gzzmne + + @property + def gzzmno(self): + """ + Element gzzmno ftype=real(8) pytype=float + + + Defined at global.fpp line 279 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__gzzmno(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + gzzmno = self._arrays[array_handle] + else: + gzzmno = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__gzzmno) + self._arrays[array_handle] = gzzmno + return gzzmno + + @gzzmno.setter + def gzzmno(self, gzzmno): + self.gzzmno[...] = gzzmno + + @property + def dtoocc(self): + """ + Element dtoocc ftype=real(8) pytype=float + + + Defined at global.fpp line 291 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__dtoocc(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + dtoocc = self._arrays[array_handle] + else: + dtoocc = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__dtoocc) + self._arrays[array_handle] = dtoocc + return dtoocc + + @dtoocc.setter + def dtoocc(self, dtoocc): + self.dtoocc[...] = dtoocc + + @property + def dtoocs(self): + """ + Element dtoocs ftype=real(8) pytype=float + + + Defined at global.fpp line 291 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__dtoocs(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + dtoocs = self._arrays[array_handle] + else: + dtoocs = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__dtoocs) + self._arrays[array_handle] = dtoocs + return dtoocs + + @dtoocs.setter + def dtoocs(self, dtoocs): + self.dtoocs[...] = dtoocs + + @property + def dtoosc(self): + """ + Element dtoosc ftype=real(8) pytype=float + + + Defined at global.fpp line 291 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__dtoosc(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + dtoosc = self._arrays[array_handle] + else: + dtoosc = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__dtoosc) + self._arrays[array_handle] = dtoosc + return dtoosc + + @dtoosc.setter + def dtoosc(self, dtoosc): + self.dtoosc[...] = dtoosc + + @property + def dtooss(self): + """ + Element dtooss ftype=real(8) pytype=float + + + Defined at global.fpp line 291 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__dtooss(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + dtooss = self._arrays[array_handle] + else: + dtooss = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__dtooss) + self._arrays[array_handle] = dtooss + return dtooss + + @dtooss.setter + def dtooss(self, dtooss): + self.dtooss[...] = dtooss + + @property + def ttsscc(self): + """ + Element ttsscc ftype=real(8) pytype=float + + + Defined at global.fpp line 292 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__ttsscc(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + ttsscc = self._arrays[array_handle] + else: + ttsscc = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__ttsscc) + self._arrays[array_handle] = ttsscc + return ttsscc + + @ttsscc.setter + def ttsscc(self, ttsscc): + self.ttsscc[...] = ttsscc + + @property + def ttsscs(self): + """ + Element ttsscs ftype=real(8) pytype=float + + + Defined at global.fpp line 292 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__ttsscs(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + ttsscs = self._arrays[array_handle] + else: + ttsscs = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__ttsscs) + self._arrays[array_handle] = ttsscs + return ttsscs + + @ttsscs.setter + def ttsscs(self, ttsscs): + self.ttsscs[...] = ttsscs + + @property + def ttsssc(self): + """ + Element ttsssc ftype=real(8) pytype=float + + + Defined at global.fpp line 292 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__ttsssc(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + ttsssc = self._arrays[array_handle] + else: + ttsssc = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__ttsssc) + self._arrays[array_handle] = ttsssc + return ttsssc + + @ttsssc.setter + def ttsssc(self, ttsssc): + self.ttsssc[...] = ttsssc + + @property + def ttssss(self): + """ + Element ttssss ftype=real(8) pytype=float + + + Defined at global.fpp line 292 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__ttssss(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + ttssss = self._arrays[array_handle] + else: + ttssss = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__ttssss) + self._arrays[array_handle] = ttssss + return ttssss + + @ttssss.setter + def ttssss(self, ttssss): + self.ttssss[...] = ttssss + + @property + def tdstcc(self): + """ + Element tdstcc ftype=real(8) pytype=float + + + Defined at global.fpp line 293 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__tdstcc(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + tdstcc = self._arrays[array_handle] + else: + tdstcc = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__tdstcc) + self._arrays[array_handle] = tdstcc + return tdstcc + + @tdstcc.setter + def tdstcc(self, tdstcc): + self.tdstcc[...] = tdstcc + + @property + def tdstcs(self): + """ + Element tdstcs ftype=real(8) pytype=float + + + Defined at global.fpp line 293 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__tdstcs(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + tdstcs = self._arrays[array_handle] + else: + tdstcs = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__tdstcs) + self._arrays[array_handle] = tdstcs + return tdstcs + + @tdstcs.setter + def tdstcs(self, tdstcs): + self.tdstcs[...] = tdstcs + + @property + def tdstsc(self): + """ + Element tdstsc ftype=real(8) pytype=float + + + Defined at global.fpp line 293 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__tdstsc(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + tdstsc = self._arrays[array_handle] + else: + tdstsc = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__tdstsc) + self._arrays[array_handle] = tdstsc + return tdstsc + + @tdstsc.setter + def tdstsc(self, tdstsc): + self.tdstsc[...] = tdstsc + + @property + def tdstss(self): + """ + Element tdstss ftype=real(8) pytype=float + + + Defined at global.fpp line 293 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__tdstss(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + tdstss = self._arrays[array_handle] + else: + tdstss = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__tdstss) + self._arrays[array_handle] = tdstss + return tdstss + + @tdstss.setter + def tdstss(self, tdstss): + self.tdstss[...] = tdstss + + @property + def tdszcc(self): + """ + Element tdszcc ftype=real(8) pytype=float + + + Defined at global.fpp line 294 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__tdszcc(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + tdszcc = self._arrays[array_handle] + else: + tdszcc = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__tdszcc) + self._arrays[array_handle] = tdszcc + return tdszcc + + @tdszcc.setter + def tdszcc(self, tdszcc): + self.tdszcc[...] = tdszcc + + @property + def tdszcs(self): + """ + Element tdszcs ftype=real(8) pytype=float + + + Defined at global.fpp line 294 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__tdszcs(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + tdszcs = self._arrays[array_handle] + else: + tdszcs = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__tdszcs) + self._arrays[array_handle] = tdszcs + return tdszcs + + @tdszcs.setter + def tdszcs(self, tdszcs): + self.tdszcs[...] = tdszcs + + @property + def tdszsc(self): + """ + Element tdszsc ftype=real(8) pytype=float + + + Defined at global.fpp line 294 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__tdszsc(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + tdszsc = self._arrays[array_handle] + else: + tdszsc = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__tdszsc) + self._arrays[array_handle] = tdszsc + return tdszsc + + @tdszsc.setter + def tdszsc(self, tdszsc): + self.tdszsc[...] = tdszsc + + @property + def tdszss(self): + """ + Element tdszss ftype=real(8) pytype=float + + + Defined at global.fpp line 294 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__tdszss(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + tdszss = self._arrays[array_handle] + else: + tdszss = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__tdszss) + self._arrays[array_handle] = tdszss + return tdszss + + @tdszss.setter + def tdszss(self, tdszss): + self.tdszss[...] = tdszss + + @property + def ddttcc(self): + """ + Element ddttcc ftype=real(8) pytype=float + + + Defined at global.fpp line 295 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__ddttcc(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + ddttcc = self._arrays[array_handle] + else: + ddttcc = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__ddttcc) + self._arrays[array_handle] = ddttcc + return ddttcc + + @ddttcc.setter + def ddttcc(self, ddttcc): + self.ddttcc[...] = ddttcc + + @property + def ddttcs(self): + """ + Element ddttcs ftype=real(8) pytype=float + + + Defined at global.fpp line 295 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__ddttcs(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + ddttcs = self._arrays[array_handle] + else: + ddttcs = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__ddttcs) + self._arrays[array_handle] = ddttcs + return ddttcs + + @ddttcs.setter + def ddttcs(self, ddttcs): + self.ddttcs[...] = ddttcs + + @property + def ddttsc(self): + """ + Element ddttsc ftype=real(8) pytype=float + + + Defined at global.fpp line 295 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__ddttsc(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + ddttsc = self._arrays[array_handle] + else: + ddttsc = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__ddttsc) + self._arrays[array_handle] = ddttsc + return ddttsc + + @ddttsc.setter + def ddttsc(self, ddttsc): + self.ddttsc[...] = ddttsc + + @property + def ddttss(self): + """ + Element ddttss ftype=real(8) pytype=float + + + Defined at global.fpp line 295 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__ddttss(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + ddttss = self._arrays[array_handle] + else: + ddttss = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__ddttss) + self._arrays[array_handle] = ddttss + return ddttss + + @ddttss.setter + def ddttss(self, ddttss): + self.ddttss[...] = ddttss + + @property + def ddtzcc(self): + """ + Element ddtzcc ftype=real(8) pytype=float + + + Defined at global.fpp line 296 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__ddtzcc(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + ddtzcc = self._arrays[array_handle] + else: + ddtzcc = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__ddtzcc) + self._arrays[array_handle] = ddtzcc + return ddtzcc + + @ddtzcc.setter + def ddtzcc(self, ddtzcc): + self.ddtzcc[...] = ddtzcc + + @property + def ddtzcs(self): + """ + Element ddtzcs ftype=real(8) pytype=float + + + Defined at global.fpp line 296 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__ddtzcs(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + ddtzcs = self._arrays[array_handle] + else: + ddtzcs = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__ddtzcs) + self._arrays[array_handle] = ddtzcs + return ddtzcs + + @ddtzcs.setter + def ddtzcs(self, ddtzcs): + self.ddtzcs[...] = ddtzcs + + @property + def ddtzsc(self): + """ + Element ddtzsc ftype=real(8) pytype=float + + + Defined at global.fpp line 296 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__ddtzsc(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + ddtzsc = self._arrays[array_handle] + else: + ddtzsc = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__ddtzsc) + self._arrays[array_handle] = ddtzsc + return ddtzsc + + @ddtzsc.setter + def ddtzsc(self, ddtzsc): + self.ddtzsc[...] = ddtzsc + + @property + def ddtzss(self): + """ + Element ddtzss ftype=real(8) pytype=float + + + Defined at global.fpp line 296 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__ddtzss(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + ddtzss = self._arrays[array_handle] + else: + ddtzss = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__ddtzss) + self._arrays[array_handle] = ddtzss + return ddtzss + + @ddtzss.setter + def ddtzss(self, ddtzss): + self.ddtzss[...] = ddtzss + + @property + def ddzzcc(self): + """ + Element ddzzcc ftype=real(8) pytype=float + + + Defined at global.fpp line 297 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__ddzzcc(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + ddzzcc = self._arrays[array_handle] + else: + ddzzcc = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__ddzzcc) + self._arrays[array_handle] = ddzzcc + return ddzzcc + + @ddzzcc.setter + def ddzzcc(self, ddzzcc): + self.ddzzcc[...] = ddzzcc + + @property + def ddzzcs(self): + """ + Element ddzzcs ftype=real(8) pytype=float + + + Defined at global.fpp line 297 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__ddzzcs(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + ddzzcs = self._arrays[array_handle] + else: + ddzzcs = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__ddzzcs) + self._arrays[array_handle] = ddzzcs + return ddzzcs + + @ddzzcs.setter + def ddzzcs(self, ddzzcs): + self.ddzzcs[...] = ddzzcs + + @property + def ddzzsc(self): + """ + Element ddzzsc ftype=real(8) pytype=float + + + Defined at global.fpp line 297 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__ddzzsc(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + ddzzsc = self._arrays[array_handle] + else: + ddzzsc = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__ddzzsc) + self._arrays[array_handle] = ddzzsc + return ddzzsc + + @ddzzsc.setter + def ddzzsc(self, ddzzsc): + self.ddzzsc[...] = ddzzsc + + @property + def ddzzss(self): + """ + Element ddzzss ftype=real(8) pytype=float + + + Defined at global.fpp line 297 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__ddzzss(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + ddzzss = self._arrays[array_handle] + else: + ddzzss = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__ddzzss) + self._arrays[array_handle] = ddzzss + return ddzzss + + @ddzzss.setter + def ddzzss(self, ddzzss): + self.ddzzss[...] = ddzzss + + @property + def tsc(self): + """ + Element tsc ftype=real(8) pytype=float + + + Defined at global.fpp line 299 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__tsc(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + tsc = self._arrays[array_handle] + else: + tsc = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__tsc) + self._arrays[array_handle] = tsc + return tsc + + @tsc.setter + def tsc(self, tsc): + self.tsc[...] = tsc + + @property + def tss(self): + """ + Element tss ftype=real(8) pytype=float + + + Defined at global.fpp line 299 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__tss(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + tss = self._arrays[array_handle] + else: + tss = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__tss) + self._arrays[array_handle] = tss + return tss + + @tss.setter + def tss(self, tss): + self.tss[...] = tss + + @property + def dtc(self): + """ + Element dtc ftype=real(8) pytype=float + + + Defined at global.fpp line 299 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__dtc(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + dtc = self._arrays[array_handle] + else: + dtc = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__dtc) + self._arrays[array_handle] = dtc + return dtc + + @dtc.setter + def dtc(self, dtc): + self.dtc[...] = dtc + + @property + def dts(self): + """ + Element dts ftype=real(8) pytype=float + + + Defined at global.fpp line 299 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__dts(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + dts = self._arrays[array_handle] + else: + dts = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__dts) + self._arrays[array_handle] = dts + return dts + + @dts.setter + def dts(self, dts): + self.dts[...] = dts + + @property + def dzc(self): + """ + Element dzc ftype=real(8) pytype=float + + + Defined at global.fpp line 299 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__dzc(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + dzc = self._arrays[array_handle] + else: + dzc = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__dzc) + self._arrays[array_handle] = dzc + return dzc + + @dzc.setter + def dzc(self, dzc): + self.dzc[...] = dzc + + @property + def dzs(self): + """ + Element dzs ftype=real(8) pytype=float + + + Defined at global.fpp line 299 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__dzs(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + dzs = self._arrays[array_handle] + else: + dzs = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__dzs) + self._arrays[array_handle] = dzs + return dzs + + @dzs.setter + def dzs(self, dzs): + self.dzs[...] = dzs + + @property + def ttc(self): + """ + Element ttc ftype=real(8) pytype=float + + + Defined at global.fpp line 300 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__ttc(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + ttc = self._arrays[array_handle] + else: + ttc = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__ttc) + self._arrays[array_handle] = ttc + return ttc + + @ttc.setter + def ttc(self, ttc): + self.ttc[...] = ttc + + @property + def tzc(self): + """ + Element tzc ftype=real(8) pytype=float + + + Defined at global.fpp line 300 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__tzc(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + tzc = self._arrays[array_handle] + else: + tzc = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__tzc) + self._arrays[array_handle] = tzc + return tzc + + @tzc.setter + def tzc(self, tzc): + self.tzc[...] = tzc + + @property + def tts(self): + """ + Element tts ftype=real(8) pytype=float + + + Defined at global.fpp line 300 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__tts(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + tts = self._arrays[array_handle] + else: + tts = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__tts) + self._arrays[array_handle] = tts + return tts + + @tts.setter + def tts(self, tts): + self.tts[...] = tts + + @property + def tzs(self): + """ + Element tzs ftype=real(8) pytype=float + + + Defined at global.fpp line 300 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__tzs(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + tzs = self._arrays[array_handle] + else: + tzs = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__tzs) + self._arrays[array_handle] = tzs + return tzs + + @tzs.setter + def tzs(self, tzs): + self.tzs[...] = tzs + + @property + def dtflux(self): + """ + Element dtflux ftype=real(8) pytype=float + + + Defined at global.fpp line 302 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__dtflux(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + dtflux = self._arrays[array_handle] + else: + dtflux = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__dtflux) + self._arrays[array_handle] = dtflux + return dtflux + + @dtflux.setter + def dtflux(self, dtflux): + self.dtflux[...] = dtflux + + @property + def dpflux(self): + """ + Element dpflux ftype=real(8) pytype=float + + + Defined at global.fpp line 302 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__dpflux(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + dpflux = self._arrays[array_handle] + else: + dpflux = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__dpflux) + self._arrays[array_handle] = dpflux + return dpflux + + @dpflux.setter + def dpflux(self, dpflux): + self.dpflux[...] = dpflux + + @property + def sweight(self): + """ + Element sweight ftype=real(8) pytype=float + + + Defined at global.fpp line 304 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__sweight(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + sweight = self._arrays[array_handle] + else: + sweight = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__sweight) + self._arrays[array_handle] = sweight + return sweight + + @sweight.setter + def sweight(self, sweight): + self.sweight[...] = sweight + + @property + def nadof(self): + """ + Element nadof ftype=integer pytype=int + + + Defined at global.fpp line 310 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__nadof(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + nadof = self._arrays[array_handle] + else: + nadof = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__nadof) + self._arrays[array_handle] = nadof + return nadof + + @nadof.setter + def nadof(self, nadof): + self.nadof[...] = nadof + + @property + def nfielddof(self): + """ + Element nfielddof ftype=integer pytype=int + + + Defined at global.fpp line 311 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__nfielddof(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + nfielddof = self._arrays[array_handle] + else: + nfielddof = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__nfielddof) + self._arrays[array_handle] = nfielddof + return nfielddof + + @nfielddof.setter + def nfielddof(self, nfielddof): + self.nfielddof[...] = nfielddof + + @property + def lma(self): + """ + Element lma ftype=integer pytype=int + + + Defined at global.fpp line 328 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__lma(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + lma = self._arrays[array_handle] + else: + lma = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__lma) + self._arrays[array_handle] = lma + return lma + + @lma.setter + def lma(self, lma): + self.lma[...] = lma + + @property + def lmb(self): + """ + Element lmb ftype=integer pytype=int + + + Defined at global.fpp line 328 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__lmb(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + lmb = self._arrays[array_handle] + else: + lmb = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__lmb) + self._arrays[array_handle] = lmb + return lmb + + @lmb.setter + def lmb(self, lmb): + self.lmb[...] = lmb + + @property + def lmc(self): + """ + Element lmc ftype=integer pytype=int + + + Defined at global.fpp line 328 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__lmc(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + lmc = self._arrays[array_handle] + else: + lmc = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__lmc) + self._arrays[array_handle] = lmc + return lmc + + @lmc.setter + def lmc(self, lmc): + self.lmc[...] = lmc + + @property + def lmd(self): + """ + Element lmd ftype=integer pytype=int + + + Defined at global.fpp line 328 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__lmd(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + lmd = self._arrays[array_handle] + else: + lmd = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__lmd) + self._arrays[array_handle] = lmd + return lmd + + @lmd.setter + def lmd(self, lmd): + self.lmd[...] = lmd + + @property + def lme(self): + """ + Element lme ftype=integer pytype=int + + + Defined at global.fpp line 328 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__lme(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + lme = self._arrays[array_handle] + else: + lme = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__lme) + self._arrays[array_handle] = lme + return lme + + @lme.setter + def lme(self, lme): + self.lme[...] = lme + + @property + def lmf(self): + """ + Element lmf ftype=integer pytype=int + + + Defined at global.fpp line 328 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__lmf(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + lmf = self._arrays[array_handle] + else: + lmf = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__lmf) + self._arrays[array_handle] = lmf + return lmf + + @lmf.setter + def lmf(self, lmf): + self.lmf[...] = lmf + + @property + def lmg(self): + """ + Element lmg ftype=integer pytype=int + + + Defined at global.fpp line 328 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__lmg(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + lmg = self._arrays[array_handle] + else: + lmg = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__lmg) + self._arrays[array_handle] = lmg + return lmg + + @lmg.setter + def lmg(self, lmg): + self.lmg[...] = lmg + + @property + def lmh(self): + """ + Element lmh ftype=integer pytype=int + + + Defined at global.fpp line 328 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__lmh(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + lmh = self._arrays[array_handle] + else: + lmh = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__lmh) + self._arrays[array_handle] = lmh + return lmh + + @lmh.setter + def lmh(self, lmh): + self.lmh[...] = lmh + + @property + def lmavalue(self): + """ + Element lmavalue ftype=real(8) pytype=float + + + Defined at global.fpp line 329 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__lmavalue(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + lmavalue = self._arrays[array_handle] + else: + lmavalue = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__lmavalue) + self._arrays[array_handle] = lmavalue + return lmavalue + + @lmavalue.setter + def lmavalue(self, lmavalue): + self.lmavalue[...] = lmavalue + + @property + def lmbvalue(self): + """ + Element lmbvalue ftype=real(8) pytype=float + + + Defined at global.fpp line 329 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__lmbvalue(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + lmbvalue = self._arrays[array_handle] + else: + lmbvalue = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__lmbvalue) + self._arrays[array_handle] = lmbvalue + return lmbvalue + + @lmbvalue.setter + def lmbvalue(self, lmbvalue): + self.lmbvalue[...] = lmbvalue + + @property + def lmcvalue(self): + """ + Element lmcvalue ftype=real(8) pytype=float + + + Defined at global.fpp line 329 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__lmcvalue(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + lmcvalue = self._arrays[array_handle] + else: + lmcvalue = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__lmcvalue) + self._arrays[array_handle] = lmcvalue + return lmcvalue + + @lmcvalue.setter + def lmcvalue(self, lmcvalue): + self.lmcvalue[...] = lmcvalue + + @property + def lmdvalue(self): + """ + Element lmdvalue ftype=real(8) pytype=float + + + Defined at global.fpp line 329 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__lmdvalue(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + lmdvalue = self._arrays[array_handle] + else: + lmdvalue = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__lmdvalue) + self._arrays[array_handle] = lmdvalue + return lmdvalue + + @lmdvalue.setter + def lmdvalue(self, lmdvalue): + self.lmdvalue[...] = lmdvalue + + @property + def lmevalue(self): + """ + Element lmevalue ftype=real(8) pytype=float + + + Defined at global.fpp line 329 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__lmevalue(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + lmevalue = self._arrays[array_handle] + else: + lmevalue = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__lmevalue) + self._arrays[array_handle] = lmevalue + return lmevalue + + @lmevalue.setter + def lmevalue(self, lmevalue): + self.lmevalue[...] = lmevalue + + @property + def lmfvalue(self): + """ + Element lmfvalue ftype=real(8) pytype=float + + + Defined at global.fpp line 329 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__lmfvalue(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + lmfvalue = self._arrays[array_handle] + else: + lmfvalue = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__lmfvalue) + self._arrays[array_handle] = lmfvalue + return lmfvalue + + @lmfvalue.setter + def lmfvalue(self, lmfvalue): + self.lmfvalue[...] = lmfvalue + + @property + def lmgvalue(self): + """ + Element lmgvalue ftype=real(8) pytype=float + + + Defined at global.fpp line 330 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__lmgvalue(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + lmgvalue = self._arrays[array_handle] + else: + lmgvalue = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__lmgvalue) + self._arrays[array_handle] = lmgvalue + return lmgvalue + + @lmgvalue.setter + def lmgvalue(self, lmgvalue): + self.lmgvalue[...] = lmgvalue + + @property + def lmhvalue(self): + """ + Element lmhvalue ftype=real(8) pytype=float + + + Defined at global.fpp line 330 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__lmhvalue(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + lmhvalue = self._arrays[array_handle] + else: + lmhvalue = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__lmhvalue) + self._arrays[array_handle] = lmhvalue + return lmhvalue + + @lmhvalue.setter + def lmhvalue(self, lmhvalue): + self.lmhvalue[...] = lmhvalue + + @property + def fso(self): + """ + Element fso ftype=integer pytype=int + + + Defined at global.fpp line 333 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__fso(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + fso = self._arrays[array_handle] + else: + fso = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__fso) + self._arrays[array_handle] = fso + return fso + + @fso.setter + def fso(self, fso): + self.fso[...] = fso + + @property + def fse(self): + """ + Element fse ftype=integer pytype=int + + + Defined at global.fpp line 333 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__fse(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + fse = self._arrays[array_handle] + else: + fse = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__fse) + self._arrays[array_handle] = fse + return fse + + @fse.setter + def fse(self, fse): + self.fse[...] = fse + + @property + def lcoordinatesingularity(self): + """ + Element lcoordinatesingularity ftype=logical pytype=bool + + + Defined at global.fpp line 334 + + """ + return _spec.f90wrap_allglobal__get__lcoordinatesingularity() + + @lcoordinatesingularity.setter + def lcoordinatesingularity(self, lcoordinatesingularity): + _spec.f90wrap_allglobal__set__lcoordinatesingularity(lcoordinatesingularity) + + @property + def lplasmaregion(self): + """ + Element lplasmaregion ftype=logical pytype=bool + + + Defined at global.fpp line 334 + + """ + return _spec.f90wrap_allglobal__get__lplasmaregion() + + @lplasmaregion.setter + def lplasmaregion(self, lplasmaregion): + _spec.f90wrap_allglobal__set__lplasmaregion(lplasmaregion) + + @property + def lvacuumregion(self): + """ + Element lvacuumregion ftype=logical pytype=bool + + + Defined at global.fpp line 334 + + """ + return _spec.f90wrap_allglobal__get__lvacuumregion() + + @lvacuumregion.setter + def lvacuumregion(self, lvacuumregion): + _spec.f90wrap_allglobal__set__lvacuumregion(lvacuumregion) + + @property + def lsavedguvij(self): + """ + Element lsavedguvij ftype=logical pytype=bool + + + Defined at global.fpp line 335 + + """ + return _spec.f90wrap_allglobal__get__lsavedguvij() + + @lsavedguvij.setter + def lsavedguvij(self, lsavedguvij): + _spec.f90wrap_allglobal__set__lsavedguvij(lsavedguvij) + + @property + def localconstraint(self): + """ + Element localconstraint ftype=logical pytype=bool + + + Defined at global.fpp line 336 + + """ + return _spec.f90wrap_allglobal__get__localconstraint() + + @localconstraint.setter + def localconstraint(self, localconstraint): + _spec.f90wrap_allglobal__set__localconstraint(localconstraint) + + @property + def dma(self): + """ + Element dma ftype=real(8) pytype=float + + + Defined at global.fpp line 347 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__dma(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + dma = self._arrays[array_handle] + else: + dma = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__dma) + self._arrays[array_handle] = dma + return dma + + @dma.setter + def dma(self, dma): + self.dma[...] = dma + + @property + def dmb(self): + """ + Element dmb ftype=real(8) pytype=float + + + Defined at global.fpp line 347 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__dmb(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + dmb = self._arrays[array_handle] + else: + dmb = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__dmb) + self._arrays[array_handle] = dmb + return dmb + + @dmb.setter + def dmb(self, dmb): + self.dmb[...] = dmb + + @property + def dmd(self): + """ + Element dmd ftype=real(8) pytype=float + + + Defined at global.fpp line 348 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__dmd(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + dmd = self._arrays[array_handle] + else: + dmd = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__dmd) + self._arrays[array_handle] = dmd + return dmd + + @dmd.setter + def dmd(self, dmd): + self.dmd[...] = dmd + + @property + def dmas(self): + """ + Element dmas ftype=real(8) pytype=float + + + Defined at global.fpp line 349 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__dmas(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + dmas = self._arrays[array_handle] + else: + dmas = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__dmas) + self._arrays[array_handle] = dmas + return dmas + + @dmas.setter + def dmas(self, dmas): + self.dmas[...] = dmas + + @property + def dmds(self): + """ + Element dmds ftype=real(8) pytype=float + + + Defined at global.fpp line 349 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__dmds(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + dmds = self._arrays[array_handle] + else: + dmds = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__dmds) + self._arrays[array_handle] = dmds + return dmds + + @dmds.setter + def dmds(self, dmds): + self.dmds[...] = dmds + + @property + def idmas(self): + """ + Element idmas ftype=integer pytype=int + + + Defined at global.fpp line 350 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__idmas(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + idmas = self._arrays[array_handle] + else: + idmas = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__idmas) + self._arrays[array_handle] = idmas + return idmas + + @idmas.setter + def idmas(self, idmas): + self.idmas[...] = idmas + + @property + def jdmas(self): + """ + Element jdmas ftype=integer pytype=int + + + Defined at global.fpp line 350 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__jdmas(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + jdmas = self._arrays[array_handle] + else: + jdmas = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__jdmas) + self._arrays[array_handle] = jdmas + return jdmas + + @jdmas.setter + def jdmas(self, jdmas): + self.jdmas[...] = jdmas + + @property + def ndmasmax(self): + """ + Element ndmasmax ftype=integer pytype=int + + + Defined at global.fpp line 351 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__ndmasmax(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + ndmasmax = self._arrays[array_handle] + else: + ndmasmax = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__ndmasmax) + self._arrays[array_handle] = ndmasmax + return ndmasmax + + @ndmasmax.setter + def ndmasmax(self, ndmasmax): + self.ndmasmax[...] = ndmasmax + + @property + def ndmas(self): + """ + Element ndmas ftype=integer pytype=int + + + Defined at global.fpp line 351 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__ndmas(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + ndmas = self._arrays[array_handle] + else: + ndmas = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__ndmas) + self._arrays[array_handle] = ndmas + return ndmas + + @ndmas.setter + def ndmas(self, ndmas): + self.ndmas[...] = ndmas + + @property + def dmg(self): + """ + Element dmg ftype=real(8) pytype=float + + + Defined at global.fpp line 352 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__dmg(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + dmg = self._arrays[array_handle] + else: + dmg = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__dmg) + self._arrays[array_handle] = dmg + return dmg + + @dmg.setter + def dmg(self, dmg): + self.dmg[...] = dmg + + @property + def solution(self): + """ + Element solution ftype=real(8) pytype=float + + + Defined at global.fpp line 353 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__solution(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + solution = self._arrays[array_handle] + else: + solution = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__solution) + self._arrays[array_handle] = solution + return solution + + @solution.setter + def solution(self, solution): + self.solution[...] = solution + + @property + def gmreslastsolution(self): + """ + Element gmreslastsolution ftype=real(8) pytype=float + + + Defined at global.fpp line 354 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__gmreslastsolution(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + gmreslastsolution = self._arrays[array_handle] + else: + gmreslastsolution = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__gmreslastsolution) + self._arrays[array_handle] = gmreslastsolution + return gmreslastsolution + + @gmreslastsolution.setter + def gmreslastsolution(self, gmreslastsolution): + self.gmreslastsolution[...] = gmreslastsolution + + @property + def mbpsi(self): + """ + Element mbpsi ftype=real(8) pytype=float + + + Defined at global.fpp line 356 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__mbpsi(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + mbpsi = self._arrays[array_handle] + else: + mbpsi = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__mbpsi) + self._arrays[array_handle] = mbpsi + return mbpsi + + @mbpsi.setter + def mbpsi(self, mbpsi): + self.mbpsi[...] = mbpsi + + @property + def liluprecond(self): + """ + Element liluprecond ftype=logical pytype=bool + + + Defined at global.fpp line 359 + + """ + return _spec.f90wrap_allglobal__get__liluprecond() + + @liluprecond.setter + def liluprecond(self, liluprecond): + _spec.f90wrap_allglobal__set__liluprecond(liluprecond) + + @property + def beltramiinverse(self): + """ + Element beltramiinverse ftype=real(8) pytype=float + + + Defined at global.fpp line 360 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__beltramiinverse(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + beltramiinverse = self._arrays[array_handle] + else: + beltramiinverse = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__beltramiinverse) + self._arrays[array_handle] = beltramiinverse + return beltramiinverse + + @beltramiinverse.setter + def beltramiinverse(self, beltramiinverse): + self.beltramiinverse[...] = beltramiinverse + + @property + def diotadxup(self): + """ + Element diotadxup ftype=real(8) pytype=float + + + Defined at global.fpp line 362 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__diotadxup(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + diotadxup = self._arrays[array_handle] + else: + diotadxup = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__diotadxup) + self._arrays[array_handle] = diotadxup + return diotadxup + + @diotadxup.setter + def diotadxup(self, diotadxup): + self.diotadxup[...] = diotadxup + + @property + def ditgpdxtp(self): + """ + Element ditgpdxtp ftype=real(8) pytype=float + + + Defined at global.fpp line 363 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__ditgpdxtp(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + ditgpdxtp = self._arrays[array_handle] + else: + ditgpdxtp = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__ditgpdxtp) + self._arrays[array_handle] = ditgpdxtp + return ditgpdxtp + + @ditgpdxtp.setter + def ditgpdxtp(self, ditgpdxtp): + self.ditgpdxtp[...] = ditgpdxtp + + @property + def glambda(self): + """ + Element glambda ftype=real(8) pytype=float + + + Defined at global.fpp line 364 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__glambda(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + glambda = self._arrays[array_handle] + else: + glambda = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__glambda) + self._arrays[array_handle] = glambda + return glambda + + @glambda.setter + def glambda(self, glambda): + self.glambda[...] = glambda + + @property + def lmns(self): + """ + Element lmns ftype=integer pytype=int + + + Defined at global.fpp line 365 + + """ + return _spec.f90wrap_allglobal__get__lmns() + + @lmns.setter + def lmns(self, lmns): + _spec.f90wrap_allglobal__set__lmns(lmns) + + @property + def bemn(self): + """ + Element bemn ftype=real(8) pytype=float + + + Defined at global.fpp line 371 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__bemn(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + bemn = self._arrays[array_handle] + else: + bemn = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__bemn) + self._arrays[array_handle] = bemn + return bemn + + @bemn.setter + def bemn(self, bemn): + self.bemn[...] = bemn + + @property + def iomn(self): + """ + Element iomn ftype=real(8) pytype=float + + + Defined at global.fpp line 371 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__iomn(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + iomn = self._arrays[array_handle] + else: + iomn = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__iomn) + self._arrays[array_handle] = iomn + return iomn + + @iomn.setter + def iomn(self, iomn): + self.iomn[...] = iomn + + @property + def somn(self): + """ + Element somn ftype=real(8) pytype=float + + + Defined at global.fpp line 371 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__somn(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + somn = self._arrays[array_handle] + else: + somn = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__somn) + self._arrays[array_handle] = somn + return somn + + @somn.setter + def somn(self, somn): + self.somn[...] = somn + + @property + def pomn(self): + """ + Element pomn ftype=real(8) pytype=float + + + Defined at global.fpp line 371 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__pomn(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + pomn = self._arrays[array_handle] + else: + pomn = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__pomn) + self._arrays[array_handle] = pomn + return pomn + + @pomn.setter + def pomn(self, pomn): + self.pomn[...] = pomn + + @property + def bomn(self): + """ + Element bomn ftype=real(8) pytype=float + + + Defined at global.fpp line 372 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__bomn(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + bomn = self._arrays[array_handle] + else: + bomn = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__bomn) + self._arrays[array_handle] = bomn + return bomn + + @bomn.setter + def bomn(self, bomn): + self.bomn[...] = bomn + + @property + def iemn(self): + """ + Element iemn ftype=real(8) pytype=float + + + Defined at global.fpp line 372 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__iemn(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + iemn = self._arrays[array_handle] + else: + iemn = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__iemn) + self._arrays[array_handle] = iemn + return iemn + + @iemn.setter + def iemn(self, iemn): + self.iemn[...] = iemn + + @property + def semn(self): + """ + Element semn ftype=real(8) pytype=float + + + Defined at global.fpp line 372 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__semn(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + semn = self._arrays[array_handle] + else: + semn = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__semn) + self._arrays[array_handle] = semn + return semn + + @semn.setter + def semn(self, semn): + self.semn[...] = semn + + @property + def pemn(self): + """ + Element pemn ftype=real(8) pytype=float + + + Defined at global.fpp line 372 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__pemn(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + pemn = self._arrays[array_handle] + else: + pemn = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__pemn) + self._arrays[array_handle] = pemn + return pemn + + @pemn.setter + def pemn(self, pemn): + self.pemn[...] = pemn + + @property + def bbe(self): + """ + Element bbe ftype=real(8) pytype=float + + + Defined at global.fpp line 373 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__bbe(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + bbe = self._arrays[array_handle] + else: + bbe = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__bbe) + self._arrays[array_handle] = bbe + return bbe + + @bbe.setter + def bbe(self, bbe): + self.bbe[...] = bbe + + @property + def iio(self): + """ + Element iio ftype=real(8) pytype=float + + + Defined at global.fpp line 373 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__iio(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + iio = self._arrays[array_handle] + else: + iio = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__iio) + self._arrays[array_handle] = iio + return iio + + @iio.setter + def iio(self, iio): + self.iio[...] = iio + + @property + def bbo(self): + """ + Element bbo ftype=real(8) pytype=float + + + Defined at global.fpp line 373 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__bbo(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + bbo = self._arrays[array_handle] + else: + bbo = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__bbo) + self._arrays[array_handle] = bbo + return bbo + + @bbo.setter + def bbo(self, bbo): + self.bbo[...] = bbo + + @property + def iie(self): + """ + Element iie ftype=real(8) pytype=float + + + Defined at global.fpp line 373 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__iie(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + iie = self._arrays[array_handle] + else: + iie = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__iie) + self._arrays[array_handle] = iie + return iie + + @iie.setter + def iie(self, iie): + self.iie[...] = iie + + @property + def btemn(self): + """ + Element btemn ftype=real(8) pytype=float + + + Defined at global.fpp line 379 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__btemn(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + btemn = self._arrays[array_handle] + else: + btemn = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__btemn) + self._arrays[array_handle] = btemn + return btemn + + @btemn.setter + def btemn(self, btemn): + self.btemn[...] = btemn + + @property + def bzemn(self): + """ + Element bzemn ftype=real(8) pytype=float + + + Defined at global.fpp line 379 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__bzemn(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + bzemn = self._arrays[array_handle] + else: + bzemn = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__bzemn) + self._arrays[array_handle] = bzemn + return bzemn + + @bzemn.setter + def bzemn(self, bzemn): + self.bzemn[...] = bzemn + + @property + def btomn(self): + """ + Element btomn ftype=real(8) pytype=float + + + Defined at global.fpp line 379 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__btomn(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + btomn = self._arrays[array_handle] + else: + btomn = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__btomn) + self._arrays[array_handle] = btomn + return btomn + + @btomn.setter + def btomn(self, btomn): + self.btomn[...] = btomn + + @property + def bzomn(self): + """ + Element bzomn ftype=real(8) pytype=float + + + Defined at global.fpp line 379 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__bzomn(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + bzomn = self._arrays[array_handle] + else: + bzomn = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__bzomn) + self._arrays[array_handle] = bzomn + return bzomn + + @bzomn.setter + def bzomn(self, bzomn): + self.bzomn[...] = bzomn + + @property + def bloweremn(self): + """ + Element bloweremn ftype=real(8) pytype=float + + + Defined at global.fpp line 385 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__bloweremn(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + bloweremn = self._arrays[array_handle] + else: + bloweremn = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__bloweremn) + self._arrays[array_handle] = bloweremn + return bloweremn + + @bloweremn.setter + def bloweremn(self, bloweremn): + self.bloweremn[...] = bloweremn + + @property + def bloweromn(self): + """ + Element bloweromn ftype=real(8) pytype=float + + + Defined at global.fpp line 385 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__bloweromn(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + bloweromn = self._arrays[array_handle] + else: + bloweromn = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__bloweromn) + self._arrays[array_handle] = bloweromn + return bloweromn + + @bloweromn.setter + def bloweromn(self, bloweromn): + self.bloweromn[...] = bloweromn + + @property + def lgdof(self): + """ + Element lgdof ftype=integer pytype=int + + + Defined at global.fpp line 391 + + """ + return _spec.f90wrap_allglobal__get__lgdof() + + @lgdof.setter + def lgdof(self, lgdof): + _spec.f90wrap_allglobal__set__lgdof(lgdof) + + @property + def ngdof(self): + """ + Element ngdof ftype=integer pytype=int + + + Defined at global.fpp line 392 + + """ + return _spec.f90wrap_allglobal__get__ngdof() + + @ngdof.setter + def ngdof(self, ngdof): + _spec.f90wrap_allglobal__set__ngdof(ngdof) + + @property + def dbbdrz(self): + """ + Element dbbdrz ftype=real(8) pytype=float + + + Defined at global.fpp line 400 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__dbbdrz(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + dbbdrz = self._arrays[array_handle] + else: + dbbdrz = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__dbbdrz) + self._arrays[array_handle] = dbbdrz + return dbbdrz + + @dbbdrz.setter + def dbbdrz(self, dbbdrz): + self.dbbdrz[...] = dbbdrz + + @property + def diidrz(self): + """ + Element diidrz ftype=real(8) pytype=float + + + Defined at global.fpp line 401 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__diidrz(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + diidrz = self._arrays[array_handle] + else: + diidrz = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__diidrz) + self._arrays[array_handle] = diidrz + return diidrz + + @diidrz.setter + def diidrz(self, diidrz): + self.diidrz[...] = diidrz + + @property + def dffdrz(self): + """ + Element dffdrz ftype=real(8) pytype=float + + + Defined at global.fpp line 402 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__dffdrz(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + dffdrz = self._arrays[array_handle] + else: + dffdrz = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__dffdrz) + self._arrays[array_handle] = dffdrz + return dffdrz + + @dffdrz.setter + def dffdrz(self, dffdrz): + self.dffdrz[...] = dffdrz + + @property + def dbbdmp(self): + """ + Element dbbdmp ftype=real(8) pytype=float + + + Defined at global.fpp line 403 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__dbbdmp(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + dbbdmp = self._arrays[array_handle] + else: + dbbdmp = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__dbbdmp) + self._arrays[array_handle] = dbbdmp + return dbbdmp + + @dbbdmp.setter + def dbbdmp(self, dbbdmp): + self.dbbdmp[...] = dbbdmp + + @property + def dmupfdx(self): + """ + Element dmupfdx ftype=real(8) pytype=float + + + Defined at global.fpp line 445 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__dmupfdx(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + dmupfdx = self._arrays[array_handle] + else: + dmupfdx = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__dmupfdx) + self._arrays[array_handle] = dmupfdx + return dmupfdx + + @dmupfdx.setter + def dmupfdx(self, dmupfdx): + self.dmupfdx[...] = dmupfdx + + @property + def lhessianallocated(self): + """ + Element lhessianallocated ftype=logical pytype=bool + + + Defined at global.fpp line 453 + + """ + return _spec.f90wrap_allglobal__get__lhessianallocated() + + @lhessianallocated.setter + def lhessianallocated(self, lhessianallocated): + _spec.f90wrap_allglobal__set__lhessianallocated(lhessianallocated) + + @property + def hessian(self): + """ + Element hessian ftype=real(8) pytype=float + + + Defined at global.fpp line 454 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__hessian(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + hessian = self._arrays[array_handle] + else: + hessian = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__hessian) + self._arrays[array_handle] = hessian + return hessian + + @hessian.setter + def hessian(self, hessian): + self.hessian[...] = hessian + + @property + def dessian(self): + """ + Element dessian ftype=real(8) pytype=float + + + Defined at global.fpp line 455 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__dessian(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + dessian = self._arrays[array_handle] + else: + dessian = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__dessian) + self._arrays[array_handle] = dessian + return dessian + + @dessian.setter + def dessian(self, dessian): + self.dessian[...] = dessian + + @property + def cosi(self): + """ + Element cosi ftype=real(8) pytype=float + + + Defined at global.fpp line 462 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__cosi(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + cosi = self._arrays[array_handle] + else: + cosi = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__cosi) + self._arrays[array_handle] = cosi + return cosi + + @cosi.setter + def cosi(self, cosi): + self.cosi[...] = cosi + + @property + def sini(self): + """ + Element sini ftype=real(8) pytype=float + + + Defined at global.fpp line 462 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__sini(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + sini = self._arrays[array_handle] + else: + sini = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__sini) + self._arrays[array_handle] = sini + return sini + + @sini.setter + def sini(self, sini): + self.sini[...] = sini + + @property + def gteta(self): + """ + Element gteta ftype=real(8) pytype=float + + + Defined at global.fpp line 462 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__gteta(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + gteta = self._arrays[array_handle] + else: + gteta = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__gteta) + self._arrays[array_handle] = gteta + return gteta + + @gteta.setter + def gteta(self, gteta): + self.gteta[...] = gteta + + @property + def gzeta(self): + """ + Element gzeta ftype=real(8) pytype=float + + + Defined at global.fpp line 462 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__gzeta(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + gzeta = self._arrays[array_handle] + else: + gzeta = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__gzeta) + self._arrays[array_handle] = gzeta + return gzeta + + @gzeta.setter + def gzeta(self, gzeta): + self.gzeta[...] = gzeta + + @property + def ajk(self): + """ + Element ajk ftype=real(8) pytype=float + + + Defined at global.fpp line 463 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__ajk(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + ajk = self._arrays[array_handle] + else: + ajk = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__ajk) + self._arrays[array_handle] = ajk + return ajk + + @ajk.setter + def ajk(self, ajk): + self.ajk[...] = ajk + + @property + def dradr(self): + """ + Element dradr ftype=real(8) pytype=float + + + Defined at global.fpp line 464 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__dradr(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + dradr = self._arrays[array_handle] + else: + dradr = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__dradr) + self._arrays[array_handle] = dradr + return dradr + + @dradr.setter + def dradr(self, dradr): + self.dradr[...] = dradr + + @property + def dradz(self): + """ + Element dradz ftype=real(8) pytype=float + + + Defined at global.fpp line 464 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__dradz(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + dradz = self._arrays[array_handle] + else: + dradz = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__dradz) + self._arrays[array_handle] = dradz + return dradz + + @dradz.setter + def dradz(self, dradz): + self.dradz[...] = dradz + + @property + def dzadr(self): + """ + Element dzadr ftype=real(8) pytype=float + + + Defined at global.fpp line 464 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__dzadr(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + dzadr = self._arrays[array_handle] + else: + dzadr = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__dzadr) + self._arrays[array_handle] = dzadr + return dzadr + + @dzadr.setter + def dzadr(self, dzadr): + self.dzadr[...] = dzadr + + @property + def dzadz(self): + """ + Element dzadz ftype=real(8) pytype=float + + + Defined at global.fpp line 464 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__dzadz(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + dzadz = self._arrays[array_handle] + else: + dzadz = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__dzadz) + self._arrays[array_handle] = dzadz + return dzadz + + @dzadz.setter + def dzadz(self, dzadz): + self.dzadz[...] = dzadz + + @property + def drodr(self): + """ + Element drodr ftype=real(8) pytype=float + + + Defined at global.fpp line 465 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__drodr(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + drodr = self._arrays[array_handle] + else: + drodr = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__drodr) + self._arrays[array_handle] = drodr + return drodr + + @drodr.setter + def drodr(self, drodr): + self.drodr[...] = drodr + + @property + def drodz(self): + """ + Element drodz ftype=real(8) pytype=float + + + Defined at global.fpp line 465 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__drodz(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + drodz = self._arrays[array_handle] + else: + drodz = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__drodz) + self._arrays[array_handle] = drodz + return drodz + + @drodz.setter + def drodz(self, drodz): + self.drodz[...] = drodz + + @property + def dzodr(self): + """ + Element dzodr ftype=real(8) pytype=float + + + Defined at global.fpp line 465 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__dzodr(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + dzodr = self._arrays[array_handle] + else: + dzodr = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__dzodr) + self._arrays[array_handle] = dzodr + return dzodr + + @dzodr.setter + def dzodr(self, dzodr): + self.dzodr[...] = dzodr + + @property + def dzodz(self): + """ + Element dzodz ftype=real(8) pytype=float + + + Defined at global.fpp line 465 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__dzodz(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + dzodz = self._arrays[array_handle] + else: + dzodz = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__dzodz) + self._arrays[array_handle] = dzodz + return dzodz + + @dzodz.setter + def dzodz(self, dzodz): + self.dzodz[...] = dzodz + + @property + def djkp(self): + """ + Element djkp ftype=integer pytype=int + + + Defined at global.fpp line 466 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__djkp(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + djkp = self._arrays[array_handle] + else: + djkp = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__djkp) + self._arrays[array_handle] = djkp + return djkp + + @djkp.setter + def djkp(self, djkp): + self.djkp[...] = djkp + + @property + def djkm(self): + """ + Element djkm ftype=integer pytype=int + + + Defined at global.fpp line 466 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__djkm(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + djkm = self._arrays[array_handle] + else: + djkm = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__djkm) + self._arrays[array_handle] = djkm + return djkm + + @djkm.setter + def djkm(self, djkm): + self.djkm[...] = djkm + + @property + def lbbintegral(self): + """ + Element lbbintegral ftype=real(8) pytype=float + + + Defined at global.fpp line 498 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__lbbintegral(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + lbbintegral = self._arrays[array_handle] + else: + lbbintegral = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__lbbintegral) + self._arrays[array_handle] = lbbintegral + return lbbintegral + + @lbbintegral.setter + def lbbintegral(self, lbbintegral): + self.lbbintegral[...] = lbbintegral + + @property + def labintegral(self): + """ + Element labintegral ftype=real(8) pytype=float + + + Defined at global.fpp line 499 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__labintegral(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + labintegral = self._arrays[array_handle] + else: + labintegral = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__labintegral) + self._arrays[array_handle] = labintegral + return labintegral + + @labintegral.setter + def labintegral(self, labintegral): + self.labintegral[...] = labintegral + + @property + def vvolume(self): + """ + Element vvolume ftype=real(8) pytype=float + + + Defined at global.fpp line 503 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__vvolume(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + vvolume = self._arrays[array_handle] + else: + vvolume = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__vvolume) + self._arrays[array_handle] = vvolume + return vvolume + + @vvolume.setter + def vvolume(self, vvolume): + self.vvolume[...] = vvolume + + @property + def dvolume(self): + """ + Element dvolume ftype=real(8) pytype=float + + + Defined at global.fpp line 504 + + """ + return _spec.f90wrap_allglobal__get__dvolume() + + @dvolume.setter + def dvolume(self, dvolume): + _spec.f90wrap_allglobal__set__dvolume(dvolume) + + @property + def ivol(self): + """ + Element ivol ftype=integer pytype=int + + + Defined at global.fpp line 507 + + """ + return _spec.f90wrap_allglobal__get__ivol() + + @ivol.setter + def ivol(self, ivol): + _spec.f90wrap_allglobal__set__ivol(ivol) + + @property + def gbzeta(self): + """ + Element gbzeta ftype=real(8) pytype=float + + + Defined at global.fpp line 508 + + """ + return _spec.f90wrap_allglobal__get__gbzeta() + + @gbzeta.setter + def gbzeta(self, gbzeta): + _spec.f90wrap_allglobal__set__gbzeta(gbzeta) + + @property + def iquad(self): + """ + Element iquad ftype=integer pytype=int + + + Defined at global.fpp line 509 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__iquad(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + iquad = self._arrays[array_handle] + else: + iquad = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__iquad) + self._arrays[array_handle] = iquad + return iquad + + @iquad.setter + def iquad(self, iquad): + self.iquad[...] = iquad + + @property + def gaussianweight(self): + """ + Element gaussianweight ftype=real(8) pytype=float + + + Defined at global.fpp line 510 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__gaussianweight(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + gaussianweight = self._arrays[array_handle] + else: + gaussianweight = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__gaussianweight) + self._arrays[array_handle] = gaussianweight + return gaussianweight + + @gaussianweight.setter + def gaussianweight(self, gaussianweight): + self.gaussianweight[...] = gaussianweight + + @property + def gaussianabscissae(self): + """ + Element gaussianabscissae ftype=real(8) pytype=float + + + Defined at global.fpp line 510 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__gaussianabscissae(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + gaussianabscissae = self._arrays[array_handle] + else: + gaussianabscissae = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__gaussianabscissae) + self._arrays[array_handle] = gaussianabscissae + return gaussianabscissae + + @gaussianabscissae.setter + def gaussianabscissae(self, gaussianabscissae): + self.gaussianabscissae[...] = gaussianabscissae + + @property + def lblinear(self): + """ + Element lblinear ftype=logical pytype=bool + + + Defined at global.fpp line 511 + + """ + return _spec.f90wrap_allglobal__get__lblinear() + + @lblinear.setter + def lblinear(self, lblinear): + _spec.f90wrap_allglobal__set__lblinear(lblinear) + + @property + def lbnewton(self): + """ + Element lbnewton ftype=logical pytype=bool + + + Defined at global.fpp line 511 + + """ + return _spec.f90wrap_allglobal__get__lbnewton() + + @lbnewton.setter + def lbnewton(self, lbnewton): + _spec.f90wrap_allglobal__set__lbnewton(lbnewton) + + @property + def lbsequad(self): + """ + Element lbsequad ftype=logical pytype=bool + + + Defined at global.fpp line 511 + + """ + return _spec.f90wrap_allglobal__get__lbsequad() + + @lbsequad.setter + def lbsequad(self, lbsequad): + _spec.f90wrap_allglobal__set__lbsequad(lbsequad) + + @property + def orzp(self): + """ + Element orzp ftype=real(8) pytype=float + + + Defined at global.fpp line 512 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__orzp(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + orzp = self._arrays[array_handle] + else: + orzp = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__orzp) + self._arrays[array_handle] = orzp + return orzp + + @orzp.setter + def orzp(self, orzp): + self.orzp[...] = orzp + + @property + def globaljk(self): + """ + Element globaljk ftype=integer pytype=int + + + Defined at global.fpp line 520 + + """ + return _spec.f90wrap_allglobal__get__globaljk() + + @globaljk.setter + def globaljk(self, globaljk): + _spec.f90wrap_allglobal__set__globaljk(globaljk) + + @property + def dxyz(self): + """ + Element dxyz ftype=real(8) pytype=float + + + Defined at global.fpp line 521 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__dxyz(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + dxyz = self._arrays[array_handle] + else: + dxyz = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__dxyz) + self._arrays[array_handle] = dxyz + return dxyz + + @dxyz.setter + def dxyz(self, dxyz): + self.dxyz[...] = dxyz + + @property + def nxyz(self): + """ + Element nxyz ftype=real(8) pytype=float + + + Defined at global.fpp line 522 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__nxyz(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + nxyz = self._arrays[array_handle] + else: + nxyz = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__nxyz) + self._arrays[array_handle] = nxyz + return nxyz + + @nxyz.setter + def nxyz(self, nxyz): + self.nxyz[...] = nxyz + + @property + def jxyz(self): + """ + Element jxyz ftype=real(8) pytype=float + + + Defined at global.fpp line 523 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__jxyz(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + jxyz = self._arrays[array_handle] + else: + jxyz = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__jxyz) + self._arrays[array_handle] = jxyz + return jxyz + + @jxyz.setter + def jxyz(self, jxyz): + self.jxyz[...] = jxyz + + @property + def tetazeta(self): + """ + Element tetazeta ftype=real(8) pytype=float + + + Defined at global.fpp line 524 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_allglobal__array__tetazeta(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + tetazeta = self._arrays[array_handle] + else: + tetazeta = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_allglobal__array__tetazeta) + self._arrays[array_handle] = tetazeta + return tetazeta + + @tetazeta.setter + def tetazeta(self, tetazeta): + self.tetazeta[...] = tetazeta + + @property + def virtualcasingfactor(self): + """ + Element virtualcasingfactor ftype=real(8) pytype=float + + + Defined at global.fpp line 526 + + """ + return _spec.f90wrap_allglobal__get__virtualcasingfactor() + + @virtualcasingfactor.setter + def virtualcasingfactor(self, virtualcasingfactor): + _spec.f90wrap_allglobal__set__virtualcasingfactor(virtualcasingfactor) + + @property + def iberror(self): + """ + Element iberror ftype=integer pytype=int + + + Defined at global.fpp line 527 + + """ + return _spec.f90wrap_allglobal__get__iberror() + + @iberror.setter + def iberror(self, iberror): + _spec.f90wrap_allglobal__set__iberror(iberror) + + @property + def nfreeboundaryiterations(self): + """ + Element nfreeboundaryiterations ftype=integer pytype=int + + + Defined at global.fpp line 528 + + """ + return _spec.f90wrap_allglobal__get__nfreeboundaryiterations() + + @nfreeboundaryiterations.setter + def nfreeboundaryiterations(self, nfreeboundaryiterations): + _spec.f90wrap_allglobal__set__nfreeboundaryiterations(nfreeboundaryiterations) + + @property + def node(self): + """ + Element node ftype=integer pytype=int + + + Defined at global.fpp line 530 + + """ + return _spec.f90wrap_allglobal__get__node() + + @property + def first_free_bound(self): + """ + Element first_free_bound ftype=logical pytype=bool + + + Defined at global.fpp line 532 + + """ + return _spec.f90wrap_allglobal__get__first_free_bound() + + @first_free_bound.setter + def first_free_bound(self, first_free_bound): + _spec.f90wrap_allglobal__set__first_free_bound(first_free_bound) + + def __str__(self): + ret = ['{\n'] + ret.append(' myid : ') + ret.append(repr(self.myid)) + ret.append(',\n ncpu : ') + ret.append(repr(self.ncpu)) + ret.append(',\n mpi_comm_spec : ') + ret.append(repr(self.mpi_comm_spec)) + ret.append(',\n ismyvolumevalue : ') + ret.append(repr(self.ismyvolumevalue)) + ret.append(',\n cpus : ') + ret.append(repr(self.cpus)) + ret.append(',\n skip_write : ') + ret.append(repr(self.skip_write)) + ret.append(',\n pi2nfp : ') + ret.append(repr(self.pi2nfp)) + ret.append(',\n pi2pi2nfp : ') + ret.append(repr(self.pi2pi2nfp)) + ret.append(',\n pi2pi2nfphalf : ') + ret.append(repr(self.pi2pi2nfphalf)) + ret.append(',\n pi2pi2nfpquart : ') + ret.append(repr(self.pi2pi2nfpquart)) + ret.append(',\n ext : ') + ret.append(repr(self.ext)) + ret.append(',\n forceerr : ') + ret.append(repr(self.forceerr)) + ret.append(',\n energy : ') + ret.append(repr(self.energy)) + ret.append(',\n ipdt : ') + ret.append(repr(self.ipdt)) + ret.append(',\n ipdtdpf : ') + ret.append(repr(self.ipdtdpf)) + ret.append(',\n mvol : ') + ret.append(repr(self.mvol)) + ret.append(',\n yesstellsym : ') + ret.append(repr(self.yesstellsym)) + ret.append(',\n notstellsym : ') + ret.append(repr(self.notstellsym)) + ret.append(',\n yesmatrixfree : ') + ret.append(repr(self.yesmatrixfree)) + ret.append(',\n notmatrixfree : ') + ret.append(repr(self.notmatrixfree)) + ret.append(',\n cheby : ') + ret.append(repr(self.cheby)) + ret.append(',\n zernike : ') + ret.append(repr(self.zernike)) + ret.append(',\n tt : ') + ret.append(repr(self.tt)) + ret.append(',\n rtt : ') + ret.append(repr(self.rtt)) + ret.append(',\n rtm : ') + ret.append(repr(self.rtm)) + ret.append(',\n zernikedof : ') + ret.append(repr(self.zernikedof)) + ret.append(',\n imagneticok : ') + ret.append(repr(self.imagneticok)) + ret.append(',\n iconstraintok : ') + ret.append(repr(self.iconstraintok)) + ret.append(',\n beltramierror : ') + ret.append(repr(self.beltramierror)) + ret.append(',\n mn : ') + ret.append(repr(self.mn)) + ret.append(',\n im : ') + ret.append(repr(self.im)) + ret.append(',\n in_ : ') + ret.append(repr(self.in_)) + ret.append(',\n halfmm : ') + ret.append(repr(self.halfmm)) + ret.append(',\n regumm : ') + ret.append(repr(self.regumm)) + ret.append(',\n rscale : ') + ret.append(repr(self.rscale)) + ret.append(',\n psifactor : ') + ret.append(repr(self.psifactor)) + ret.append(',\n inifactor : ') + ret.append(repr(self.inifactor)) + ret.append(',\n bbweight : ') + ret.append(repr(self.bbweight)) + ret.append(',\n mmpp : ') + ret.append(repr(self.mmpp)) + ret.append(',\n mne : ') + ret.append(repr(self.mne)) + ret.append(',\n ime : ') + ret.append(repr(self.ime)) + ret.append(',\n ine : ') + ret.append(repr(self.ine)) + ret.append(',\n mns : ') + ret.append(repr(self.mns)) + ret.append(',\n ims : ') + ret.append(repr(self.ims)) + ret.append(',\n ins : ') + ret.append(repr(self.ins)) + ret.append(',\n lmpol : ') + ret.append(repr(self.lmpol)) + ret.append(',\n lntor : ') + ret.append(repr(self.lntor)) + ret.append(',\n smpol : ') + ret.append(repr(self.smpol)) + ret.append(',\n sntor : ') + ret.append(repr(self.sntor)) + ret.append(',\n xoffset : ') + ret.append(repr(self.xoffset)) + ret.append(',\n irbc : ') + ret.append(repr(self.irbc)) + ret.append(',\n izbs : ') + ret.append(repr(self.izbs)) + ret.append(',\n irbs : ') + ret.append(repr(self.irbs)) + ret.append(',\n izbc : ') + ret.append(repr(self.izbc)) + ret.append(',\n drbc : ') + ret.append(repr(self.drbc)) + ret.append(',\n dzbs : ') + ret.append(repr(self.dzbs)) + ret.append(',\n drbs : ') + ret.append(repr(self.drbs)) + ret.append(',\n dzbc : ') + ret.append(repr(self.dzbc)) + ret.append(',\n irij : ') + ret.append(repr(self.irij)) + ret.append(',\n izij : ') + ret.append(repr(self.izij)) + ret.append(',\n drij : ') + ret.append(repr(self.drij)) + ret.append(',\n dzij : ') + ret.append(repr(self.dzij)) + ret.append(',\n trij : ') + ret.append(repr(self.trij)) + ret.append(',\n tzij : ') + ret.append(repr(self.tzij)) + ret.append(',\n ivns : ') + ret.append(repr(self.ivns)) + ret.append(',\n ibns : ') + ret.append(repr(self.ibns)) + ret.append(',\n ivnc : ') + ret.append(repr(self.ivnc)) + ret.append(',\n ibnc : ') + ret.append(repr(self.ibnc)) + ret.append(',\n lrbc : ') + ret.append(repr(self.lrbc)) + ret.append(',\n lzbs : ') + ret.append(repr(self.lzbs)) + ret.append(',\n lrbs : ') + ret.append(repr(self.lrbs)) + ret.append(',\n lzbc : ') + ret.append(repr(self.lzbc)) + ret.append(',\n num_modes : ') + ret.append(repr(self.num_modes)) + ret.append(',\n mmrzrz : ') + ret.append(repr(self.mmrzrz)) + ret.append(',\n nnrzrz : ') + ret.append(repr(self.nnrzrz)) + ret.append(',\n allrzrz : ') + ret.append(repr(self.allrzrz)) + ret.append(',\n nt : ') + ret.append(repr(self.nt)) + ret.append(',\n nz : ') + ret.append(repr(self.nz)) + ret.append(',\n ntz : ') + ret.append(repr(self.ntz)) + ret.append(',\n hnt : ') + ret.append(repr(self.hnt)) + ret.append(',\n hnz : ') + ret.append(repr(self.hnz)) + ret.append(',\n sontz : ') + ret.append(repr(self.sontz)) + ret.append(',\n rij : ') + ret.append(repr(self.rij)) + ret.append(',\n zij : ') + ret.append(repr(self.zij)) + ret.append(',\n xij : ') + ret.append(repr(self.xij)) + ret.append(',\n yij : ') + ret.append(repr(self.yij)) + ret.append(',\n sg : ') + ret.append(repr(self.sg)) + ret.append(',\n guvij : ') + ret.append(repr(self.guvij)) + ret.append(',\n gvuij : ') + ret.append(repr(self.gvuij)) + ret.append(',\n guvijsave : ') + ret.append(repr(self.guvijsave)) + ret.append(',\n ki : ') + ret.append(repr(self.ki)) + ret.append(',\n kijs : ') + ret.append(repr(self.kijs)) + ret.append(',\n kija : ') + ret.append(repr(self.kija)) + ret.append(',\n iotakkii : ') + ret.append(repr(self.iotakkii)) + ret.append(',\n iotaksub : ') + ret.append(repr(self.iotaksub)) + ret.append(',\n iotakadd : ') + ret.append(repr(self.iotakadd)) + ret.append(',\n iotaksgn : ') + ret.append(repr(self.iotaksgn)) + ret.append(',\n efmn : ') + ret.append(repr(self.efmn)) + ret.append(',\n ofmn : ') + ret.append(repr(self.ofmn)) + ret.append(',\n cfmn : ') + ret.append(repr(self.cfmn)) + ret.append(',\n sfmn : ') + ret.append(repr(self.sfmn)) + ret.append(',\n evmn : ') + ret.append(repr(self.evmn)) + ret.append(',\n odmn : ') + ret.append(repr(self.odmn)) + ret.append(',\n comn : ') + ret.append(repr(self.comn)) + ret.append(',\n simn : ') + ret.append(repr(self.simn)) + ret.append(',\n ijreal : ') + ret.append(repr(self.ijreal)) + ret.append(',\n ijimag : ') + ret.append(repr(self.ijimag)) + ret.append(',\n jireal : ') + ret.append(repr(self.jireal)) + ret.append(',\n jiimag : ') + ret.append(repr(self.jiimag)) + ret.append(',\n jkreal : ') + ret.append(repr(self.jkreal)) + ret.append(',\n jkimag : ') + ret.append(repr(self.jkimag)) + ret.append(',\n kjreal : ') + ret.append(repr(self.kjreal)) + ret.append(',\n kjimag : ') + ret.append(repr(self.kjimag)) + ret.append(',\n bsupumn : ') + ret.append(repr(self.bsupumn)) + ret.append(',\n bsupvmn : ') + ret.append(repr(self.bsupvmn)) + ret.append(',\n goomne : ') + ret.append(repr(self.goomne)) + ret.append(',\n goomno : ') + ret.append(repr(self.goomno)) + ret.append(',\n gssmne : ') + ret.append(repr(self.gssmne)) + ret.append(',\n gssmno : ') + ret.append(repr(self.gssmno)) + ret.append(',\n gstmne : ') + ret.append(repr(self.gstmne)) + ret.append(',\n gstmno : ') + ret.append(repr(self.gstmno)) + ret.append(',\n gszmne : ') + ret.append(repr(self.gszmne)) + ret.append(',\n gszmno : ') + ret.append(repr(self.gszmno)) + ret.append(',\n gttmne : ') + ret.append(repr(self.gttmne)) + ret.append(',\n gttmno : ') + ret.append(repr(self.gttmno)) + ret.append(',\n gtzmne : ') + ret.append(repr(self.gtzmne)) + ret.append(',\n gtzmno : ') + ret.append(repr(self.gtzmno)) + ret.append(',\n gzzmne : ') + ret.append(repr(self.gzzmne)) + ret.append(',\n gzzmno : ') + ret.append(repr(self.gzzmno)) + ret.append(',\n dtoocc : ') + ret.append(repr(self.dtoocc)) + ret.append(',\n dtoocs : ') + ret.append(repr(self.dtoocs)) + ret.append(',\n dtoosc : ') + ret.append(repr(self.dtoosc)) + ret.append(',\n dtooss : ') + ret.append(repr(self.dtooss)) + ret.append(',\n ttsscc : ') + ret.append(repr(self.ttsscc)) + ret.append(',\n ttsscs : ') + ret.append(repr(self.ttsscs)) + ret.append(',\n ttsssc : ') + ret.append(repr(self.ttsssc)) + ret.append(',\n ttssss : ') + ret.append(repr(self.ttssss)) + ret.append(',\n tdstcc : ') + ret.append(repr(self.tdstcc)) + ret.append(',\n tdstcs : ') + ret.append(repr(self.tdstcs)) + ret.append(',\n tdstsc : ') + ret.append(repr(self.tdstsc)) + ret.append(',\n tdstss : ') + ret.append(repr(self.tdstss)) + ret.append(',\n tdszcc : ') + ret.append(repr(self.tdszcc)) + ret.append(',\n tdszcs : ') + ret.append(repr(self.tdszcs)) + ret.append(',\n tdszsc : ') + ret.append(repr(self.tdszsc)) + ret.append(',\n tdszss : ') + ret.append(repr(self.tdszss)) + ret.append(',\n ddttcc : ') + ret.append(repr(self.ddttcc)) + ret.append(',\n ddttcs : ') + ret.append(repr(self.ddttcs)) + ret.append(',\n ddttsc : ') + ret.append(repr(self.ddttsc)) + ret.append(',\n ddttss : ') + ret.append(repr(self.ddttss)) + ret.append(',\n ddtzcc : ') + ret.append(repr(self.ddtzcc)) + ret.append(',\n ddtzcs : ') + ret.append(repr(self.ddtzcs)) + ret.append(',\n ddtzsc : ') + ret.append(repr(self.ddtzsc)) + ret.append(',\n ddtzss : ') + ret.append(repr(self.ddtzss)) + ret.append(',\n ddzzcc : ') + ret.append(repr(self.ddzzcc)) + ret.append(',\n ddzzcs : ') + ret.append(repr(self.ddzzcs)) + ret.append(',\n ddzzsc : ') + ret.append(repr(self.ddzzsc)) + ret.append(',\n ddzzss : ') + ret.append(repr(self.ddzzss)) + ret.append(',\n tsc : ') + ret.append(repr(self.tsc)) + ret.append(',\n tss : ') + ret.append(repr(self.tss)) + ret.append(',\n dtc : ') + ret.append(repr(self.dtc)) + ret.append(',\n dts : ') + ret.append(repr(self.dts)) + ret.append(',\n dzc : ') + ret.append(repr(self.dzc)) + ret.append(',\n dzs : ') + ret.append(repr(self.dzs)) + ret.append(',\n ttc : ') + ret.append(repr(self.ttc)) + ret.append(',\n tzc : ') + ret.append(repr(self.tzc)) + ret.append(',\n tts : ') + ret.append(repr(self.tts)) + ret.append(',\n tzs : ') + ret.append(repr(self.tzs)) + ret.append(',\n dtflux : ') + ret.append(repr(self.dtflux)) + ret.append(',\n dpflux : ') + ret.append(repr(self.dpflux)) + ret.append(',\n sweight : ') + ret.append(repr(self.sweight)) + ret.append(',\n nadof : ') + ret.append(repr(self.nadof)) + ret.append(',\n nfielddof : ') + ret.append(repr(self.nfielddof)) + ret.append(',\n lma : ') + ret.append(repr(self.lma)) + ret.append(',\n lmb : ') + ret.append(repr(self.lmb)) + ret.append(',\n lmc : ') + ret.append(repr(self.lmc)) + ret.append(',\n lmd : ') + ret.append(repr(self.lmd)) + ret.append(',\n lme : ') + ret.append(repr(self.lme)) + ret.append(',\n lmf : ') + ret.append(repr(self.lmf)) + ret.append(',\n lmg : ') + ret.append(repr(self.lmg)) + ret.append(',\n lmh : ') + ret.append(repr(self.lmh)) + ret.append(',\n lmavalue : ') + ret.append(repr(self.lmavalue)) + ret.append(',\n lmbvalue : ') + ret.append(repr(self.lmbvalue)) + ret.append(',\n lmcvalue : ') + ret.append(repr(self.lmcvalue)) + ret.append(',\n lmdvalue : ') + ret.append(repr(self.lmdvalue)) + ret.append(',\n lmevalue : ') + ret.append(repr(self.lmevalue)) + ret.append(',\n lmfvalue : ') + ret.append(repr(self.lmfvalue)) + ret.append(',\n lmgvalue : ') + ret.append(repr(self.lmgvalue)) + ret.append(',\n lmhvalue : ') + ret.append(repr(self.lmhvalue)) + ret.append(',\n fso : ') + ret.append(repr(self.fso)) + ret.append(',\n fse : ') + ret.append(repr(self.fse)) + ret.append(',\n lcoordinatesingularity : ') + ret.append(repr(self.lcoordinatesingularity)) + ret.append(',\n lplasmaregion : ') + ret.append(repr(self.lplasmaregion)) + ret.append(',\n lvacuumregion : ') + ret.append(repr(self.lvacuumregion)) + ret.append(',\n lsavedguvij : ') + ret.append(repr(self.lsavedguvij)) + ret.append(',\n localconstraint : ') + ret.append(repr(self.localconstraint)) + ret.append(',\n dma : ') + ret.append(repr(self.dma)) + ret.append(',\n dmb : ') + ret.append(repr(self.dmb)) + ret.append(',\n dmd : ') + ret.append(repr(self.dmd)) + ret.append(',\n dmas : ') + ret.append(repr(self.dmas)) + ret.append(',\n dmds : ') + ret.append(repr(self.dmds)) + ret.append(',\n idmas : ') + ret.append(repr(self.idmas)) + ret.append(',\n jdmas : ') + ret.append(repr(self.jdmas)) + ret.append(',\n ndmasmax : ') + ret.append(repr(self.ndmasmax)) + ret.append(',\n ndmas : ') + ret.append(repr(self.ndmas)) + ret.append(',\n dmg : ') + ret.append(repr(self.dmg)) + ret.append(',\n solution : ') + ret.append(repr(self.solution)) + ret.append(',\n gmreslastsolution : ') + ret.append(repr(self.gmreslastsolution)) + ret.append(',\n mbpsi : ') + ret.append(repr(self.mbpsi)) + ret.append(',\n liluprecond : ') + ret.append(repr(self.liluprecond)) + ret.append(',\n beltramiinverse : ') + ret.append(repr(self.beltramiinverse)) + ret.append(',\n diotadxup : ') + ret.append(repr(self.diotadxup)) + ret.append(',\n ditgpdxtp : ') + ret.append(repr(self.ditgpdxtp)) + ret.append(',\n glambda : ') + ret.append(repr(self.glambda)) + ret.append(',\n lmns : ') + ret.append(repr(self.lmns)) + ret.append(',\n bemn : ') + ret.append(repr(self.bemn)) + ret.append(',\n iomn : ') + ret.append(repr(self.iomn)) + ret.append(',\n somn : ') + ret.append(repr(self.somn)) + ret.append(',\n pomn : ') + ret.append(repr(self.pomn)) + ret.append(',\n bomn : ') + ret.append(repr(self.bomn)) + ret.append(',\n iemn : ') + ret.append(repr(self.iemn)) + ret.append(',\n semn : ') + ret.append(repr(self.semn)) + ret.append(',\n pemn : ') + ret.append(repr(self.pemn)) + ret.append(',\n bbe : ') + ret.append(repr(self.bbe)) + ret.append(',\n iio : ') + ret.append(repr(self.iio)) + ret.append(',\n bbo : ') + ret.append(repr(self.bbo)) + ret.append(',\n iie : ') + ret.append(repr(self.iie)) + ret.append(',\n btemn : ') + ret.append(repr(self.btemn)) + ret.append(',\n bzemn : ') + ret.append(repr(self.bzemn)) + ret.append(',\n btomn : ') + ret.append(repr(self.btomn)) + ret.append(',\n bzomn : ') + ret.append(repr(self.bzomn)) + ret.append(',\n bloweremn : ') + ret.append(repr(self.bloweremn)) + ret.append(',\n bloweromn : ') + ret.append(repr(self.bloweromn)) + ret.append(',\n lgdof : ') + ret.append(repr(self.lgdof)) + ret.append(',\n ngdof : ') + ret.append(repr(self.ngdof)) + ret.append(',\n dbbdrz : ') + ret.append(repr(self.dbbdrz)) + ret.append(',\n diidrz : ') + ret.append(repr(self.diidrz)) + ret.append(',\n dffdrz : ') + ret.append(repr(self.dffdrz)) + ret.append(',\n dbbdmp : ') + ret.append(repr(self.dbbdmp)) + ret.append(',\n dmupfdx : ') + ret.append(repr(self.dmupfdx)) + ret.append(',\n lhessianallocated : ') + ret.append(repr(self.lhessianallocated)) + ret.append(',\n hessian : ') + ret.append(repr(self.hessian)) + ret.append(',\n dessian : ') + ret.append(repr(self.dessian)) + ret.append(',\n cosi : ') + ret.append(repr(self.cosi)) + ret.append(',\n sini : ') + ret.append(repr(self.sini)) + ret.append(',\n gteta : ') + ret.append(repr(self.gteta)) + ret.append(',\n gzeta : ') + ret.append(repr(self.gzeta)) + ret.append(',\n ajk : ') + ret.append(repr(self.ajk)) + ret.append(',\n dradr : ') + ret.append(repr(self.dradr)) + ret.append(',\n dradz : ') + ret.append(repr(self.dradz)) + ret.append(',\n dzadr : ') + ret.append(repr(self.dzadr)) + ret.append(',\n dzadz : ') + ret.append(repr(self.dzadz)) + ret.append(',\n drodr : ') + ret.append(repr(self.drodr)) + ret.append(',\n drodz : ') + ret.append(repr(self.drodz)) + ret.append(',\n dzodr : ') + ret.append(repr(self.dzodr)) + ret.append(',\n dzodz : ') + ret.append(repr(self.dzodz)) + ret.append(',\n djkp : ') + ret.append(repr(self.djkp)) + ret.append(',\n djkm : ') + ret.append(repr(self.djkm)) + ret.append(',\n lbbintegral : ') + ret.append(repr(self.lbbintegral)) + ret.append(',\n labintegral : ') + ret.append(repr(self.labintegral)) + ret.append(',\n vvolume : ') + ret.append(repr(self.vvolume)) + ret.append(',\n dvolume : ') + ret.append(repr(self.dvolume)) + ret.append(',\n ivol : ') + ret.append(repr(self.ivol)) + ret.append(',\n gbzeta : ') + ret.append(repr(self.gbzeta)) + ret.append(',\n iquad : ') + ret.append(repr(self.iquad)) + ret.append(',\n gaussianweight : ') + ret.append(repr(self.gaussianweight)) + ret.append(',\n gaussianabscissae : ') + ret.append(repr(self.gaussianabscissae)) + ret.append(',\n lblinear : ') + ret.append(repr(self.lblinear)) + ret.append(',\n lbnewton : ') + ret.append(repr(self.lbnewton)) + ret.append(',\n lbsequad : ') + ret.append(repr(self.lbsequad)) + ret.append(',\n orzp : ') + ret.append(repr(self.orzp)) + ret.append(',\n globaljk : ') + ret.append(repr(self.globaljk)) + ret.append(',\n dxyz : ') + ret.append(repr(self.dxyz)) + ret.append(',\n nxyz : ') + ret.append(repr(self.nxyz)) + ret.append(',\n jxyz : ') + ret.append(repr(self.jxyz)) + ret.append(',\n tetazeta : ') + ret.append(repr(self.tetazeta)) + ret.append(',\n virtualcasingfactor : ') + ret.append(repr(self.virtualcasingfactor)) + ret.append(',\n iberror : ') + ret.append(repr(self.iberror)) + ret.append(',\n nfreeboundaryiterations : ') + ret.append(repr(self.nfreeboundaryiterations)) + ret.append(',\n node : ') + ret.append(repr(self.node)) + ret.append(',\n first_free_bound : ') + ret.append(repr(self.first_free_bound)) + ret.append('}') + return ''.join(ret) + + _dt_array_initialisers = [] + + +allglobal = Allglobal() + +class Fftw_Interface(f90wrap.runtime.FortranModule): + """ + Module fftw_interface + + + Defined at global.fpp lines 2274-2279 + + """ + @property + def cplxin(self): + """ + Element cplxin ftype=complex(c_double_complex) pytype=complex + + + Defined at global.fpp line 2279 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_fftw_interface__array__cplxin(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + cplxin = self._arrays[array_handle] + else: + cplxin = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_fftw_interface__array__cplxin) + self._arrays[array_handle] = cplxin + return cplxin + + @cplxin.setter + def cplxin(self, cplxin): + self.cplxin[...] = cplxin + + @property + def cplxout(self): + """ + Element cplxout ftype=complex(c_double_complex) pytype=complex + + + Defined at global.fpp line 2279 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_fftw_interface__array__cplxout(f90wrap.runtime.empty_handle) + if array_handle in self._arrays: + cplxout = self._arrays[array_handle] + else: + cplxout = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + f90wrap.runtime.empty_handle, + _spec.f90wrap_fftw_interface__array__cplxout) + self._arrays[array_handle] = cplxout + return cplxout + + @cplxout.setter + def cplxout(self, cplxout): + self.cplxout[...] = cplxout + + def __str__(self): + ret = ['{\n'] + ret.append(' cplxin : ') + ret.append(repr(self.cplxin)) + ret.append(',\n cplxout : ') + ret.append(repr(self.cplxout)) + ret.append('}') + return ''.join(ret) + + _dt_array_initialisers = [] + + +fftw_interface = Fftw_Interface() + +class Intghs_Module(f90wrap.runtime.FortranModule): + """ + Module intghs_module + + + Defined at intghs.fpp lines 40-49 + + """ + @f90wrap.runtime.register_class("spec.intghs_workspace") + class intghs_workspace(f90wrap.runtime.FortranDerivedType): + """ + Type(name=intghs_workspace) + + + Defined at intghs.fpp lines 41-47 + + """ + def __init__(self, handle=None): + """ + self = Intghs_Workspace() + + + Defined at intghs.fpp lines 41-47 + + + Returns + ------- + this : Intghs_Workspace + Object to be constructed + + + Automatically generated constructor for intghs_workspace + """ + f90wrap.runtime.FortranDerivedType.__init__(self) + result = _spec.f90wrap_intghs_workspace_initialise() + self._handle = result[0] if isinstance(result, tuple) else result + + def __del__(self): + """ + Destructor for class Intghs_Workspace + + + Defined at intghs.fpp lines 41-47 + + Parameters + ---------- + this : Intghs_Workspace + Object to be destructed + + + Automatically generated destructor for intghs_workspace + """ + if self._alloc: + _spec.f90wrap_intghs_workspace_finalise(this=self._handle) + + @property + def efmn(self): + """ + Element efmn ftype=real(8) pytype=float + + + Defined at intghs.fpp line 42 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_intghs_workspace__array__efmn(self._handle) + if array_handle in self._arrays: + efmn = self._arrays[array_handle] + else: + efmn = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + self._handle, + _spec.f90wrap_intghs_workspace__array__efmn) + self._arrays[array_handle] = efmn + return efmn + + @efmn.setter + def efmn(self, efmn): + self.efmn[...] = efmn + + @property + def ofmn(self): + """ + Element ofmn ftype=real(8) pytype=float + + + Defined at intghs.fpp line 42 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_intghs_workspace__array__ofmn(self._handle) + if array_handle in self._arrays: + ofmn = self._arrays[array_handle] + else: + ofmn = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + self._handle, + _spec.f90wrap_intghs_workspace__array__ofmn) + self._arrays[array_handle] = ofmn + return ofmn + + @ofmn.setter + def ofmn(self, ofmn): + self.ofmn[...] = ofmn + + @property + def cfmn(self): + """ + Element cfmn ftype=real(8) pytype=float + + + Defined at intghs.fpp line 42 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_intghs_workspace__array__cfmn(self._handle) + if array_handle in self._arrays: + cfmn = self._arrays[array_handle] + else: + cfmn = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + self._handle, + _spec.f90wrap_intghs_workspace__array__cfmn) + self._arrays[array_handle] = cfmn + return cfmn + + @cfmn.setter + def cfmn(self, cfmn): + self.cfmn[...] = cfmn + + @property + def sfmn(self): + """ + Element sfmn ftype=real(8) pytype=float + + + Defined at intghs.fpp line 42 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_intghs_workspace__array__sfmn(self._handle) + if array_handle in self._arrays: + sfmn = self._arrays[array_handle] + else: + sfmn = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + self._handle, + _spec.f90wrap_intghs_workspace__array__sfmn) + self._arrays[array_handle] = sfmn + return sfmn + + @sfmn.setter + def sfmn(self, sfmn): + self.sfmn[...] = sfmn + + @property + def evmn(self): + """ + Element evmn ftype=real(8) pytype=float + + + Defined at intghs.fpp line 43 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_intghs_workspace__array__evmn(self._handle) + if array_handle in self._arrays: + evmn = self._arrays[array_handle] + else: + evmn = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + self._handle, + _spec.f90wrap_intghs_workspace__array__evmn) + self._arrays[array_handle] = evmn + return evmn + + @evmn.setter + def evmn(self, evmn): + self.evmn[...] = evmn + + @property + def odmn(self): + """ + Element odmn ftype=real(8) pytype=float + + + Defined at intghs.fpp line 43 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_intghs_workspace__array__odmn(self._handle) + if array_handle in self._arrays: + odmn = self._arrays[array_handle] + else: + odmn = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + self._handle, + _spec.f90wrap_intghs_workspace__array__odmn) + self._arrays[array_handle] = odmn + return odmn + + @odmn.setter + def odmn(self, odmn): + self.odmn[...] = odmn + + @property + def ijreal(self): + """ + Element ijreal ftype=real(8) pytype=float + + + Defined at intghs.fpp line 44 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_intghs_workspace__array__ijreal(self._handle) + if array_handle in self._arrays: + ijreal = self._arrays[array_handle] + else: + ijreal = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + self._handle, + _spec.f90wrap_intghs_workspace__array__ijreal) + self._arrays[array_handle] = ijreal + return ijreal + + @ijreal.setter + def ijreal(self, ijreal): + self.ijreal[...] = ijreal + + @property + def jireal(self): + """ + Element jireal ftype=real(8) pytype=float + + + Defined at intghs.fpp line 44 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_intghs_workspace__array__jireal(self._handle) + if array_handle in self._arrays: + jireal = self._arrays[array_handle] + else: + jireal = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + self._handle, + _spec.f90wrap_intghs_workspace__array__jireal) + self._arrays[array_handle] = jireal + return jireal + + @jireal.setter + def jireal(self, jireal): + self.jireal[...] = jireal + + @property + def jkreal(self): + """ + Element jkreal ftype=real(8) pytype=float + + + Defined at intghs.fpp line 44 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_intghs_workspace__array__jkreal(self._handle) + if array_handle in self._arrays: + jkreal = self._arrays[array_handle] + else: + jkreal = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + self._handle, + _spec.f90wrap_intghs_workspace__array__jkreal) + self._arrays[array_handle] = jkreal + return jkreal + + @jkreal.setter + def jkreal(self, jkreal): + self.jkreal[...] = jkreal + + @property + def kjreal(self): + """ + Element kjreal ftype=real(8) pytype=float + + + Defined at intghs.fpp line 44 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_intghs_workspace__array__kjreal(self._handle) + if array_handle in self._arrays: + kjreal = self._arrays[array_handle] + else: + kjreal = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + self._handle, + _spec.f90wrap_intghs_workspace__array__kjreal) + self._arrays[array_handle] = kjreal + return kjreal + + @kjreal.setter + def kjreal(self, kjreal): + self.kjreal[...] = kjreal + + @property + def bloweremn(self): + """ + Element bloweremn ftype=real(8) pytype=float + + + Defined at intghs.fpp line 45 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_intghs_workspace__array__bloweremn(self._handle) + if array_handle in self._arrays: + bloweremn = self._arrays[array_handle] + else: + bloweremn = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + self._handle, + _spec.f90wrap_intghs_workspace__array__bloweremn) + self._arrays[array_handle] = bloweremn + return bloweremn + + @bloweremn.setter + def bloweremn(self, bloweremn): + self.bloweremn[...] = bloweremn + + @property + def bloweromn(self): + """ + Element bloweromn ftype=real(8) pytype=float + + + Defined at intghs.fpp line 45 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_intghs_workspace__array__bloweromn(self._handle) + if array_handle in self._arrays: + bloweromn = self._arrays[array_handle] + else: + bloweromn = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + self._handle, + _spec.f90wrap_intghs_workspace__array__bloweromn) + self._arrays[array_handle] = bloweromn + return bloweromn + + @bloweromn.setter + def bloweromn(self, bloweromn): + self.bloweromn[...] = bloweromn + + @property + def gbupper(self): + """ + Element gbupper ftype=real(8) pytype=float + + + Defined at intghs.fpp line 46 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_intghs_workspace__array__gbupper(self._handle) + if array_handle in self._arrays: + gbupper = self._arrays[array_handle] + else: + gbupper = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + self._handle, + _spec.f90wrap_intghs_workspace__array__gbupper) + self._arrays[array_handle] = gbupper + return gbupper + + @gbupper.setter + def gbupper(self, gbupper): + self.gbupper[...] = gbupper + + @property + def blower(self): + """ + Element blower ftype=real(8) pytype=float + + + Defined at intghs.fpp line 46 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_intghs_workspace__array__blower(self._handle) + if array_handle in self._arrays: + blower = self._arrays[array_handle] + else: + blower = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + self._handle, + _spec.f90wrap_intghs_workspace__array__blower) + self._arrays[array_handle] = blower + return blower + + @blower.setter + def blower(self, blower): + self.blower[...] = blower + + @property + def basis(self): + """ + Element basis ftype=real(8) pytype=float + + + Defined at intghs.fpp line 47 + + """ + array_ndim, array_type, array_shape, array_handle = \ + _spec.f90wrap_intghs_workspace__array__basis(self._handle) + if array_handle in self._arrays: + basis = self._arrays[array_handle] + else: + basis = f90wrap.runtime.get_array(f90wrap.runtime.sizeof_fortran_t, + self._handle, + _spec.f90wrap_intghs_workspace__array__basis) + self._arrays[array_handle] = basis + return basis + + @basis.setter + def basis(self, basis): + self.basis[...] = basis + + def __str__(self): + ret = ['{\n'] + ret.append(' efmn : ') + ret.append(repr(self.efmn)) + ret.append(',\n ofmn : ') + ret.append(repr(self.ofmn)) + ret.append(',\n cfmn : ') + ret.append(repr(self.cfmn)) + ret.append(',\n sfmn : ') + ret.append(repr(self.sfmn)) + ret.append(',\n evmn : ') + ret.append(repr(self.evmn)) + ret.append(',\n odmn : ') + ret.append(repr(self.odmn)) + ret.append(',\n ijreal : ') + ret.append(repr(self.ijreal)) + ret.append(',\n jireal : ') + ret.append(repr(self.jireal)) + ret.append(',\n jkreal : ') + ret.append(repr(self.jkreal)) + ret.append(',\n kjreal : ') + ret.append(repr(self.kjreal)) + ret.append(',\n bloweremn : ') + ret.append(repr(self.bloweremn)) + ret.append(',\n bloweromn : ') + ret.append(repr(self.bloweromn)) + ret.append(',\n gbupper : ') + ret.append(repr(self.gbupper)) + ret.append(',\n blower : ') + ret.append(repr(self.blower)) + ret.append(',\n basis : ') + ret.append(repr(self.basis)) + ret.append('}') + return ''.join(ret) + + _dt_array_initialisers = [] + + + _dt_array_initialisers = [] + + +intghs_module = Intghs_Module() + +class Newtontime(f90wrap.runtime.FortranModule): + """ + Module newtontime + + + Defined at newton.fpp lines 38-40 + + """ + @property + def nfcalls(self): + """ + Element nfcalls ftype=integer pytype=int + + + Defined at newton.fpp line 39 + + """ + return _spec.f90wrap_newtontime__get__nfcalls() + + @nfcalls.setter + def nfcalls(self, nfcalls): + _spec.f90wrap_newtontime__set__nfcalls(nfcalls) + + @property + def ndcalls(self): + """ + Element ndcalls ftype=integer pytype=int + + + Defined at newton.fpp line 39 + + """ + return _spec.f90wrap_newtontime__get__ndcalls() + + @ndcalls.setter + def ndcalls(self, ndcalls): + _spec.f90wrap_newtontime__set__ndcalls(ndcalls) + + @property + def lastcpu(self): + """ + Element lastcpu ftype=real(8) pytype=float + + + Defined at newton.fpp line 40 + + """ + return _spec.f90wrap_newtontime__get__lastcpu() + + @lastcpu.setter + def lastcpu(self, lastcpu): + _spec.f90wrap_newtontime__set__lastcpu(lastcpu) + + def __str__(self): + ret = ['{\n'] + ret.append(' nfcalls : ') + ret.append(repr(self.nfcalls)) + ret.append(',\n ndcalls : ') + ret.append(repr(self.ndcalls)) + ret.append(',\n lastcpu : ') + ret.append(repr(self.lastcpu)) + ret.append('}') + return ''.join(ret) + + _dt_array_initialisers = [] + + +newtontime = Newtontime() + +def preset(): + """ + preset() + + + Defined at preset.fpp lines 16-2667 + + + """ + _spec.f90wrap_preset() + +def manual(): + """ + manual() + + + Defined at manual.fpp lines 198-230 + + + """ + _spec.f90wrap_manual() + +def rzaxis(mvol, mn, inrbc, inzbs, inrbs, inzbc, ivol, lcomputederivatives): + """ + rzaxis(mvol, mn, inrbc, inzbs, inrbs, inzbc, ivol, lcomputederivatives) + + + Defined at rzaxis.fpp lines 60-696 + + Parameters + ---------- + mvol : int + mn : int + inrbc : float array + inzbs : float array + inrbs : float array + inzbc : float array + ivol : int + lcomputederivatives : bool + + """ + _spec.f90wrap_rzaxis(mvol=mvol, mn=mn, inrbc=inrbc, inzbs=inzbs, inrbs=inrbs, \ + inzbc=inzbc, ivol=ivol, lcomputederivatives=lcomputederivatives) + +def packxi(ngdof, position, mvol, mn, irbc, izbs, irbs, izbc, packorunpack, \ + lcomputederivatives, lcomputeaxis): + """ + packxi(ngdof, position, mvol, mn, irbc, izbs, irbs, izbc, packorunpack, \ + lcomputederivatives, lcomputeaxis) + + + Defined at packxi.fpp lines 66-165 + + Parameters + ---------- + ngdof : int + position : float array + mvol : int + mn : int + irbc : float array + izbs : float array + irbs : float array + izbc : float array + packorunpack : str + lcomputederivatives : bool + lcomputeaxis : bool + + """ + _spec.f90wrap_packxi(ngdof=ngdof, position=position, mvol=mvol, mn=mn, \ + irbc=irbc, izbs=izbs, irbs=irbs, izbc=izbc, packorunpack=packorunpack, \ + lcomputederivatives=lcomputederivatives, lcomputeaxis=lcomputeaxis) + +def volume(lvol, vflag): + """ + volume(lvol, vflag) + + + Defined at volume.fpp lines 31-239 + + Parameters + ---------- + lvol : int + vflag : int + + """ + _spec.f90wrap_volume(lvol=lvol, vflag=vflag) + +def coords(lvol, lss, lcurvature, ntz, mn): + """ + coords(lvol, lss, lcurvature, ntz, mn) + + + Defined at coords.fpp lines 115-552 + + Parameters + ---------- + lvol : int + lss : float + lcurvature : int + ntz : int + mn : int + + """ + _spec.f90wrap_coords(lvol=lvol, lss=lss, lcurvature=lcurvature, ntz=ntz, mn=mn) + +def get_cheby(lss, lrad, cheby): + """ + get_cheby(lss, lrad, cheby) + + + Defined at basefn.fpp lines 9-35 + + Parameters + ---------- + lss : float + lrad : int + cheby : float array + + """ + _spec.f90wrap_get_cheby(lss=lss, lrad=lrad, cheby=cheby) + +def get_cheby_d2(lss, lrad, cheby): + """ + get_cheby_d2(lss, lrad, cheby) + + + Defined at basefn.fpp lines 37-65 + + Parameters + ---------- + lss : float + lrad : int + cheby : float array + + """ + _spec.f90wrap_get_cheby_d2(lss=lss, lrad=lrad, cheby=cheby) + +def get_zernike(r, lrad, mpol, zernike): + """ + get_zernike(r, lrad, mpol, zernike) + + + Defined at basefn.fpp lines 67-119 + + Parameters + ---------- + r : float + lrad : int + mpol : int + zernike : float array + + """ + _spec.f90wrap_get_zernike(r=r, lrad=lrad, mpol=mpol, zernike=zernike) + +def get_zernike_d2(r, lrad, mpol, zernike): + """ + get_zernike_d2(r, lrad, mpol, zernike) + + + Defined at basefn.fpp lines 121-181 + + Parameters + ---------- + r : float + lrad : int + mpol : int + zernike : float array + + """ + _spec.f90wrap_get_zernike_d2(r=r, lrad=lrad, mpol=mpol, zernike=zernike) + +def get_zernike_rm(r, lrad, mpol, zernike): + """ + get_zernike_rm(r, lrad, mpol, zernike) + + + Defined at basefn.fpp lines 183-226 + + Parameters + ---------- + r : float + lrad : int + mpol : int + zernike : float array + + """ + _spec.f90wrap_get_zernike_rm(r=r, lrad=lrad, mpol=mpol, zernike=zernike) + +def allocate_beltrami_matrices(vvol, lcomputederivatives): + """ + allocate_beltrami_matrices(vvol, lcomputederivatives) + + + Defined at memory.fpp lines 13-126 + + Parameters + ---------- + vvol : int + lcomputederivatives : bool + + """ + _spec.f90wrap_allocate_beltrami_matrices(vvol=vvol, \ + lcomputederivatives=lcomputederivatives) + +def deallocate_beltrami_matrices(lcomputederivatives): + """ + deallocate_beltrami_matrices(lcomputederivatives) + + + Defined at memory.fpp lines 129-218 + + Parameters + ---------- + lcomputederivatives : bool + + """ + \ + _spec.f90wrap_deallocate_beltrami_matrices(lcomputederivatives=lcomputederivatives) + +def allocate_geometry_matrices(vvol, lcomputederivatives): + """ + allocate_geometry_matrices(vvol, lcomputederivatives) + + + Defined at memory.fpp lines 221-587 + + Parameters + ---------- + vvol : int + lcomputederivatives : bool + + """ + _spec.f90wrap_allocate_geometry_matrices(vvol=vvol, \ + lcomputederivatives=lcomputederivatives) + +def deallocate_geometry_matrices(lcomputederivatives): + """ + deallocate_geometry_matrices(lcomputederivatives) + + + Defined at memory.fpp lines 590-853 + + Parameters + ---------- + lcomputederivatives : bool + + """ + \ + _spec.f90wrap_deallocate_geometry_matrices(lcomputederivatives=lcomputederivatives) + +def metrix(lquad, lvol): + """ + metrix(lquad, lvol) + + + Defined at metrix.fpp lines 35-110 + + Parameters + ---------- + lquad : int + lvol : int + + """ + _spec.f90wrap_metrix(lquad=lquad, lvol=lvol) + +def compute_guvijsave(lquad, vvol, ideriv, lcurvature): + """ + compute_guvijsave(lquad, vvol, ideriv, lcurvature) + + + Defined at metrix.fpp lines 113-129 + + Parameters + ---------- + lquad : int + vvol : int + ideriv : int + lcurvature : int + + """ + _spec.f90wrap_compute_guvijsave(lquad=lquad, vvol=vvol, ideriv=ideriv, \ + lcurvature=lcurvature) + +def ma00aa(lquad, mn, lvol, lrad): + """ + ma00aa(lquad, mn, lvol, lrad) + + + Defined at ma00aa.fpp lines 40-317 + + Parameters + ---------- + lquad : int + mn : int + lvol : int + lrad : int + + """ + _spec.f90wrap_ma00aa(lquad=lquad, mn=mn, lvol=lvol, lrad=lrad) + +def matrix(lvol, mn, lrad): + """ + matrix(lvol, mn, lrad) + + + Defined at matrix.fpp lines 232-499 + + Parameters + ---------- + lvol : int + mn : int + lrad : int + + """ + _spec.f90wrap_matrix(lvol=lvol, mn=mn, lrad=lrad) + +def matrixbg(lvol, mn, lrad): + """ + matrixbg(lvol, mn, lrad) + + + Defined at matrix.fpp lines 502-533 + + Parameters + ---------- + lvol : int + mn : int + lrad : int + + """ + _spec.f90wrap_matrixbg(lvol=lvol, mn=mn, lrad=lrad) + +def spsmat(lvol, mn, lrad): + """ + spsmat(lvol, mn, lrad) + + + Defined at spsmat.fpp lines 12-421 + + Parameters + ---------- + lvol : int + mn : int + lrad : int + + """ + _spec.f90wrap_spsmat(lvol=lvol, mn=mn, lrad=lrad) + +def push_back(iq, nq, nn, va, vd, vja, qa, qd, qja): + """ + push_back(iq, nq, nn, va, vd, vja, qa, qd, qja) + + + Defined at spsmat.fpp lines 425-446 + + Parameters + ---------- + iq : int + nq : int array + nn : int + va : float + vd : float + vja : int + qa : float array + qd : float array + qja : int array + + """ + _spec.f90wrap_push_back(iq=iq, nq=nq, nn=nn, va=va, vd=vd, vja=vja, qa=qa, \ + qd=qd, qja=qja) + +def clean_queue(nq, nn, qa, qd, qja): + """ + clean_queue(nq, nn, qa, qd, qja) + + + Defined at spsmat.fpp lines 448-459 + + Parameters + ---------- + nq : int array + nn : int + qa : float array + qd : float array + qja : int array + + """ + _spec.f90wrap_clean_queue(nq=nq, nn=nn, qa=qa, qd=qd, qja=qja) + +def addline(nq, nn, qa, qd, qja, ns, nrow, dmas, dmds, jdmas, idmas): + """ + addline(nq, nn, qa, qd, qja, ns, nrow, dmas, dmds, jdmas, idmas) + + + Defined at spsmat.fpp lines 461-477 + + Parameters + ---------- + nq : int array + nn : int + qa : float array + qd : float array + qja : int array + ns : int + nrow : int + dmas : float array + dmds : float array + jdmas : int array + idmas : int array + + """ + _spec.f90wrap_addline(nq=nq, nn=nn, qa=qa, qd=qd, qja=qja, ns=ns, nrow=nrow, \ + dmas=dmas, dmds=dmds, jdmas=jdmas, idmas=idmas) + +def spsint(lquad, mn, lvol, lrad): + """ + spsint(lquad, mn, lvol, lrad) + + + Defined at spsint.fpp lines 12-220 + + Parameters + ---------- + lquad : int + mn : int + lvol : int + lrad : int + + """ + _spec.f90wrap_spsint(lquad=lquad, mn=mn, lvol=lvol, lrad=lrad) + +def mp00ac(ndof, xdof, fdof, ddof, ldfjac, iflag): + """ + mp00ac(ndof, xdof, fdof, ddof, ldfjac, iflag) + + + Defined at mp00ac.fpp lines 89-811 + + Parameters + ---------- + ndof : int + xdof : float array + fdof : float array + ddof : float array + ldfjac : int + iflag : int + + """ + _spec.f90wrap_mp00ac(ndof=ndof, xdof=xdof, fdof=fdof, ddof=ddof, ldfjac=ldfjac, \ + iflag=iflag) + +def rungmres(n, nrestart, mu, vvol, rhs, sol, ipar, fpar, wk, nw, guess, a, au, \ + jau, ju, iperm, ierr): + """ + rungmres(n, nrestart, mu, vvol, rhs, sol, ipar, fpar, wk, nw, guess, a, au, jau, \ + ju, iperm, ierr) + + + Defined at mp00ac.fpp lines 814-868 + + Parameters + ---------- + n : int + nrestart : int + mu : float + vvol : int + rhs : float array + sol : float array + ipar : int array + fpar : float array + wk : float array + nw : int + guess : float array + a : float array + au : float array + jau : int array + ju : int array + iperm : int array + ierr : int + + """ + _spec.f90wrap_rungmres(n=n, nrestart=nrestart, mu=mu, vvol=vvol, rhs=rhs, \ + sol=sol, ipar=ipar, fpar=fpar, wk=wk, nw=nw, guess=guess, a=a, au=au, \ + jau=jau, ju=ju, iperm=iperm, ierr=ierr) + +def matvec(n, x, ax, a, mu, vvol): + """ + matvec(n, x, ax, a, mu, vvol) + + + Defined at mp00ac.fpp lines 870-893 + + Parameters + ---------- + n : int + x : float array + ax : float array + a : float array + mu : float + vvol : int + + """ + _spec.f90wrap_matvec(n=n, x=x, ax=ax, a=a, mu=mu, vvol=vvol) + +def prec_solve(n, vecin, vecout, au, jau, ju, iperm): + """ + prec_solve(n, vecin, vecout, au, jau, ju, iperm) + + + Defined at mp00ac.fpp lines 895-907 + + Parameters + ---------- + n : int + vecin : float array + vecout : float array + au : float array + jau : int array + ju : int array + iperm : int array + + """ + _spec.f90wrap_prec_solve(n=n, vecin=vecin, vecout=vecout, au=au, jau=jau, ju=ju, \ + iperm=iperm) + +def ma02aa(lvol, nn): + """ + ma02aa(lvol, nn) + + + Defined at ma02aa.fpp lines 16-673 + + Parameters + ---------- + lvol : int + nn : int + + """ + _spec.f90wrap_ma02aa(lvol=lvol, nn=nn) + +def packab(packorunpack, lvol, nn, solution, ideriv): + """ + packab(packorunpack, lvol, nn, solution, ideriv) + + + Defined at packab.fpp lines 28-197 + + Parameters + ---------- + packorunpack : str + lvol : int + nn : int + solution : float array + ideriv : int + + """ + _spec.f90wrap_packab(packorunpack=packorunpack, lvol=lvol, nn=nn, \ + solution=solution, ideriv=ideriv) + +def tr00ab(lvol, mn, nn, nt, nz, iflag, ldiota): + """ + tr00ab(lvol, mn, nn, nt, nz, iflag, ldiota) + + + Defined at tr00ab.fpp lines 58-503 + + Parameters + ---------- + lvol : int + mn : int + nn : int + nt : int + nz : int + iflag : int + ldiota : float array + + """ + _spec.f90wrap_tr00ab(lvol=lvol, mn=mn, nn=nn, nt=nt, nz=nz, iflag=iflag, \ + ldiota=ldiota) + +def curent(lvol, mn, nt, nz, iflag, lditgp): + """ + curent(lvol, mn, nt, nz, iflag, lditgp) + + + Defined at curent.fpp lines 54-163 + + Parameters + ---------- + lvol : int + mn : int + nt : int + nz : int + iflag : int + lditgp : float array + + """ + _spec.f90wrap_curent(lvol=lvol, mn=mn, nt=nt, nz=nz, iflag=iflag, lditgp=lditgp) + +def df00ab(pnn, xi, fxi, dfxi, ldfjac, iflag): + """ + df00ab(pnn, xi, fxi, dfxi, ldfjac, iflag) + + + Defined at df00ab.fpp lines 16-82 + + Parameters + ---------- + pnn : int + xi : float array + fxi : float array + dfxi : float array + ldfjac : int + iflag : int + + """ + _spec.f90wrap_df00ab(pnn=pnn, xi=xi, fxi=fxi, dfxi=dfxi, ldfjac=ldfjac, \ + iflag=iflag) + +def lforce(lvol, iocons, ideriv, ntz, dbb, xx, yy, length, ddl, mml, iflag): + """ + lforce(lvol, iocons, ideriv, ntz, dbb, xx, yy, length, ddl, mml, iflag) + + + Defined at lforce.fpp lines 125-295 + + Parameters + ---------- + lvol : int + iocons : int + ideriv : int + ntz : int + dbb : float array + xx : float array + yy : float array + length : float array + ddl : float + mml : float + iflag : int + + """ + _spec.f90wrap_lforce(lvol=lvol, iocons=iocons, ideriv=ideriv, ntz=ntz, dbb=dbb, \ + xx=xx, yy=yy, length=length, ddl=ddl, mml=mml, iflag=iflag) + +def intghs(lquad, mn, lvol, lrad, idx): + """ + intghs(lquad, mn, lvol, lrad, idx) + + + Defined at intghs.fpp lines 52-252 + + Parameters + ---------- + lquad : int + mn : int + lvol : int + lrad : int + idx : int + + """ + _spec.f90wrap_intghs(lquad=lquad, mn=mn, lvol=lvol, lrad=lrad, idx=idx) + +def intghs_workspace_init(lvol): + """ + intghs_workspace_init(lvol) + + + Defined at intghs.fpp lines 255-404 + + Parameters + ---------- + lvol : int + + """ + _spec.f90wrap_intghs_workspace_init(lvol=lvol) + +def intghs_workspace_destroy(): + """ + intghs_workspace_destroy() + + + Defined at intghs.fpp lines 406-520 + + + """ + _spec.f90wrap_intghs_workspace_destroy() + +def mtrxhs(lvol, mn, lrad, resulta, resultd, idx): + """ + mtrxhs(lvol, mn, lrad, resulta, resultd, idx) + + + Defined at mtrxhs.fpp lines 12-204 + + Parameters + ---------- + lvol : int + mn : int + lrad : int + resulta : float array + resultd : float array + idx : int + + """ + _spec.f90wrap_mtrxhs(lvol=lvol, mn=mn, lrad=lrad, resulta=resulta, \ + resultd=resultd, idx=idx) + +def lbpol(lvol, bt00, ideriv, iocons): + """ + lbpol(lvol, bt00, ideriv, iocons) + + + Defined at lbpol.fpp lines 28-127 + + Parameters + ---------- + lvol : int + bt00 : float array + ideriv : int + iocons : int + + """ + _spec.f90wrap_lbpol(lvol=lvol, bt00=bt00, ideriv=ideriv, iocons=iocons) + +def brcast(lvol): + """ + brcast(lvol) + + + Defined at brcast.fpp lines 25-228 + + Parameters + ---------- + lvol : int + + """ + _spec.f90wrap_brcast(lvol=lvol) + +def dfp100(ndofgl, x, fvec, lcomputederivatives): + """ + dfp100(ndofgl, x, fvec, lcomputederivatives) + + + Defined at dfp100.fpp lines 31-311 + + Parameters + ---------- + ndofgl : int + x : float array + fvec : float array + lcomputederivatives : bool + + ------ + vvol: loop index on volumes + Ndofgl: Input parameter necessary for the use of hybrd1. Unused otherwise. + iflag: Flag changed by hybrd1 + cpu_send_one, cpu_send_two: CPU IDs, used for MPI communications + status: MPI status + Fvec: Global constraint values + x: Degrees of freedom of hybrd1. For now contains only the poloidal flux + """ + _spec.f90wrap_dfp100(ndofgl=ndofgl, x=x, fvec=fvec, \ + lcomputederivatives=lcomputederivatives) + +def dfp200(lcomputederivatives, vvol): + """ + dfp200(lcomputederivatives, vvol) + + + Defined at dfp200.fpp lines 38-781 + + Parameters + ---------- + lcomputederivatives : bool + vvol : int + + """ + _spec.f90wrap_dfp200(lcomputederivatives=lcomputederivatives, vvol=vvol) + +def get_lu_beltrami_matrices(vvol, obi, nn): + """ + get_lu_beltrami_matrices(vvol, obi, nn) + + + Defined at dfp200.fpp lines 786-891 + + Parameters + ---------- + vvol : int + obi : Matrixlu + nn : int + + """ + _spec.f90wrap_get_lu_beltrami_matrices(vvol=vvol, obi=obi._handle, nn=nn) + +def get_perturbed_solution(vvol, obi, nn): + """ + get_perturbed_solution(vvol, obi, nn) + + + Defined at dfp200.fpp lines 894-961 + + Parameters + ---------- + vvol : int + obi : Matrixlu + nn : int + + ------ + """ + _spec.f90wrap_get_perturbed_solution(vvol=vvol, obi=obi._handle, nn=nn) + +def evaluate_dmupfdx(innout, idof, ii, issym, irz): + """ + evaluate_dmupfdx(innout, idof, ii, issym, irz) + + + Defined at dfp200.fpp lines 964-1303 + + Parameters + ---------- + innout : int + idof : int + ii : int + issym : int + irz : int + + """ + _spec.f90wrap_evaluate_dmupfdx(innout=innout, idof=idof, ii=ii, issym=issym, \ + irz=irz) + +def evaluate_dbb(lvol, idof, innout, issym, irz, ii, dbb, xx, yy, length, drr, \ + dzz, dii, dll, dpp, ntz): + """ + evaluate_dbb(lvol, idof, innout, issym, irz, ii, dbb, xx, yy, length, drr, dzz, \ + dii, dll, dpp, ntz) + + + Defined at dfp200.fpp lines 1306-1615 + + Parameters + ---------- + lvol : int + idof : int + innout : int + issym : int + irz : int + ii : int + dbb : float array + xx : float array + yy : float array + length : float array + drr : float array + dzz : float array + dii : float array + dll : float array + dpp : float array + ntz : int + + ------ + """ + _spec.f90wrap_evaluate_dbb(lvol=lvol, idof=idof, innout=innout, issym=issym, \ + irz=irz, ii=ii, dbb=dbb, xx=xx, yy=yy, length=length, drr=drr, dzz=dzz, \ + dii=dii, dll=dll, dpp=dpp, ntz=ntz) + +def dforce(ngdof, position, force, lcomputederivatives, lcomputeaxis): + """ + dforce(ngdof, position, force, lcomputederivatives, lcomputeaxis) + + + Defined at dforce.fpp lines 80-656 + + Parameters + ---------- + ngdof : int + position : float array + force : float array + lcomputederivatives : bool + lcomputeaxis : bool + + """ + _spec.f90wrap_dforce(ngdof=ngdof, position=position, force=force, \ + lcomputederivatives=lcomputederivatives, lcomputeaxis=lcomputeaxis) + +def newton(ngdof, position): + """ + ihybrd = newton(ngdof, position) + + + Defined at newton.fpp lines 43-356 + + Parameters + ---------- + ngdof : int + position : float array + + Returns + ------- + ihybrd : int + + """ + ihybrd = _spec.f90wrap_newton(ngdof=ngdof, position=position) + return ihybrd + +def writereadgf(readorwrite, ngdof): + """ + ireadhessian = writereadgf(readorwrite, ngdof) + + + Defined at newton.fpp lines 360-485 + + Parameters + ---------- + readorwrite : str + ngdof : int + + Returns + ------- + ireadhessian : int + + """ + ireadhessian = _spec.f90wrap_writereadgf(readorwrite=readorwrite, ngdof=ngdof) + return ireadhessian + +def fcn1(ngdof, xx, fvec, irevcm): + """ + fcn1(ngdof, xx, fvec, irevcm) + + + Defined at newton.fpp lines 489-615 + + Parameters + ---------- + ngdof : int + xx : float array + fvec : float array + irevcm : int + + """ + _spec.f90wrap_fcn1(ngdof=ngdof, xx=xx, fvec=fvec, irevcm=irevcm) + +def fcn2(ngdof, xx, fvec, fjac, ldfjac, irevcm): + """ + fcn2(ngdof, xx, fvec, fjac, ldfjac, irevcm) + + + Defined at newton.fpp lines 619-782 + + Parameters + ---------- + ngdof : int + xx : float array + fvec : float array + fjac : float array + ldfjac : int + irevcm : int + + """ + _spec.f90wrap_fcn2(ngdof=ngdof, xx=xx, fvec=fvec, fjac=fjac, ldfjac=ldfjac, \ + irevcm=irevcm) + +def casing(teta, zeta, icasing): + """ + gbn = casing(teta, zeta, icasing) + + + Defined at casing.fpp lines 77-207 + + Parameters + ---------- + teta : float + zeta : float + icasing : int + + Returns + ------- + gbn : float + + """ + gbn = _spec.f90wrap_casing(teta=teta, zeta=zeta, icasing=icasing) + return gbn + +def dvcfield(ndim, tz, nfun, vcintegrand): + """ + dvcfield(ndim, tz, nfun, vcintegrand) + + + Defined at casing.fpp lines 234-442 + + Parameters + ---------- + ndim : int + tz : float array + nfun : int + vcintegrand : float array + + """ + _spec.f90wrap_dvcfield(ndim=ndim, tz=tz, nfun=nfun, vcintegrand=vcintegrand) + +def bnorml(mn, ntz, efmn, ofmn): + """ + bnorml(mn, ntz, efmn, ofmn) + + + Defined at bnorml.fpp lines 61-289 + + Parameters + ---------- + mn : int + ntz : int + efmn : float array + ofmn : float array + + """ + _spec.f90wrap_bnorml(mn=mn, ntz=ntz, efmn=efmn, ofmn=ofmn) + +def vcintegrand(lteta, lzeta): + """ + vcintegrand = vcintegrand(lteta, lzeta) + + + Defined at bnorml.fpp lines 370-559 + + Parameters + ---------- + lteta : float + lzeta : float + + Returns + ------- + vcintegrand : float + + """ + vcintegrand = _spec.f90wrap_vcintegrand(lteta=lteta, lzeta=lzeta) + return vcintegrand + +def zetalow(teta): + """ + zetalow = zetalow(teta) + + + Defined at bnorml.fpp lines 563-574 + + Parameters + ---------- + teta : float + + Returns + ------- + zetalow : float + + """ + zetalow = _spec.f90wrap_zetalow(teta=teta) + return zetalow + +def zetaupp(teta): + """ + zetaupp = zetaupp(teta) + + + Defined at bnorml.fpp lines 578-589 + + Parameters + ---------- + teta : float + + Returns + ------- + zetaupp : float + + """ + zetaupp = _spec.f90wrap_zetaupp(teta=teta) + return zetaupp + +def jo00aa(lvol, ntz, lquad, mn): + """ + jo00aa(lvol, ntz, lquad, mn) + + + Defined at jo00aa.fpp lines 46-374 + + Parameters + ---------- + lvol : int + ntz : int + lquad : int + mn : int + + """ + _spec.f90wrap_jo00aa(lvol=lvol, ntz=ntz, lquad=lquad, mn=mn) + +def pp00aa(): + """ + pp00aa() + + + Defined at pp00aa.fpp lines 69-306 + + + """ + _spec.f90wrap_pp00aa() + +def pp00ab(lvol, sti, nz, nppts, poincaredata, fittedtransform): + """ + utflag = pp00ab(lvol, sti, nz, nppts, poincaredata, fittedtransform) + + + Defined at pp00ab.fpp lines 33-159 + + Parameters + ---------- + lvol : int + sti : float array + nz : int + nppts : int + poincaredata : float array + fittedtransform : float array + + Returns + ------- + utflag : int + + """ + utflag = _spec.f90wrap_pp00ab(lvol=lvol, sti=sti, nz=nz, nppts=nppts, \ + poincaredata=poincaredata, fittedtransform=fittedtransform) + return utflag + +def bfield(zeta, st, bst): + """ + bfield(zeta, st, bst) + + + Defined at bfield.fpp lines 30-137 + + Parameters + ---------- + zeta : float + st : float array + bst : float array + + """ + _spec.f90wrap_bfield(zeta=zeta, st=st, bst=bst) + +def bfield_tangent(zeta, st, bst): + """ + bfield_tangent(zeta, st, bst) + + + Defined at bfield.fpp lines 140-277 + + Parameters + ---------- + zeta : float + st : float array + bst : float array + + """ + _spec.f90wrap_bfield_tangent(zeta=zeta, st=st, bst=bst) + +def stzxyz(lvol, stz, rpz): + """ + stzxyz(lvol, stz, rpz) + + + Defined at stzxyz.fpp lines 22-119 + + Parameters + ---------- + lvol : int + stz : float array + rpz : float array + + """ + _spec.f90wrap_stzxyz(lvol=lvol, stz=stz, rpz=rpz) + +def hesian(ngdof, position, mvol, mn, lgdof): + """ + hesian(ngdof, position, mvol, mn, lgdof) + + + Defined at hesian.fpp lines 17-556 + + Parameters + ---------- + ngdof : int + position : float array + mvol : int + mn : int + lgdof : int + + """ + _spec.f90wrap_hesian(ngdof=ngdof, position=position, mvol=mvol, mn=mn, \ + lgdof=lgdof) + +def ra00aa(writeorread): + """ + ra00aa(writeorread) + + + Defined at ra00aa.fpp lines 37-282 + + Parameters + ---------- + writeorread : str + + """ + _spec.f90wrap_ra00aa(writeorread=writeorread) + +def gi00ab(mpol, ntor, nfp, mn, im, in_): + """ + gi00ab(mpol, ntor, nfp, mn, im, in_) + + + Defined at numrec.fpp lines 48-64 + + Parameters + ---------- + mpol : int + ntor : int + nfp : int + mn : int + im : int array + in_ : int array + + """ + _spec.f90wrap_gi00ab(mpol=mpol, ntor=ntor, nfp=nfp, mn=mn, im=im, in_=in_) + +def getimn(mpol, ntor, nfp, mi, ni): + """ + idx = getimn(mpol, ntor, nfp, mi, ni) + + + Defined at numrec.fpp lines 67-78 + + Parameters + ---------- + mpol : int + ntor : int + nfp : int + mi : int + ni : int + + Returns + ------- + idx : int + + """ + idx = _spec.f90wrap_getimn(mpol=mpol, ntor=ntor, nfp=nfp, mi=mi, ni=ni) + return idx + +def tfft(nt, nz, ijreal, ijimag, mn, im, in_, efmn, ofmn, cfmn, sfmn, ifail): + """ + tfft(nt, nz, ijreal, ijimag, mn, im, in_, efmn, ofmn, cfmn, sfmn, ifail) + + + Defined at numrec.fpp lines 94-140 + + Parameters + ---------- + nt : int + nz : int + ijreal : float array + ijimag : float array + mn : int + im : int array + in_ : int array + efmn : float array + ofmn : float array + cfmn : float array + sfmn : float array + ifail : int + + """ + _spec.f90wrap_tfft(nt=nt, nz=nz, ijreal=ijreal, ijimag=ijimag, mn=mn, im=im, \ + in_=in_, efmn=efmn, ofmn=ofmn, cfmn=cfmn, sfmn=sfmn, ifail=ifail) + +def invfft(mn, im, in_, efmn, ofmn, cfmn, sfmn, nt, nz, ijreal, ijimag): + """ + invfft(mn, im, in_, efmn, ofmn, cfmn, sfmn, nt, nz, ijreal, ijimag) + + + Defined at numrec.fpp lines 148-176 + + Parameters + ---------- + mn : int + im : int array + in_ : int array + efmn : float array + ofmn : float array + cfmn : float array + sfmn : float array + nt : int + nz : int + ijreal : float array + ijimag : float array + + """ + _spec.f90wrap_invfft(mn=mn, im=im, in_=in_, efmn=efmn, ofmn=ofmn, cfmn=cfmn, \ + sfmn=sfmn, nt=nt, nz=nz, ijreal=ijreal, ijimag=ijimag) + +def gauleg(n, weight, abscis): + """ + ifail = gauleg(n, weight, abscis) + + + Defined at numrec.fpp lines 184-224 + + Parameters + ---------- + n : int + weight : float array + abscis : float array + + Returns + ------- + ifail : int + + """ + ifail = _spec.f90wrap_gauleg(n=n, weight=weight, abscis=abscis) + return ifail + +def read_command_args(): + """ + read_command_args() + + + Defined at xspech.fpp lines 150-206 + + + """ + _spec.f90wrap_read_command_args() + +def spec(): + """ + spec() + + + Defined at xspech.fpp lines 210-671 + + + """ + _spec.f90wrap_spec() + +def final_diagnostics(): + """ + final_diagnostics() + + + Defined at xspech.fpp lines 681-856 + + + """ + _spec.f90wrap_final_diagnostics() + +def ending(): + """ + ending() + + + Defined at xspech.fpp lines 860-1196 + + + """ + _spec.f90wrap_ending() + diff --git a/src/h5utils.f90_tmp b/src/h5utils.f90_tmp index 780a2047..d7c817c9 100644 --- a/src/h5utils.f90_tmp +++ b/src/h5utils.f90_tmp @@ -1,38 +1,4 @@ -m4_define(HDEFGRP,{! macro expansion of hdefgrp; -! define a HDF5 group in _1 with name _2 and save reference into hid_t _3; _4 and _5 should be __FILE__ and __LINE__ - call h5lexists_f($1, "$2", grp_exists, hdfier) - - if (.not.grp_exists) then - ! if group does not exist, create it - call h5gcreate_f($1, "$2", $3, hdfier) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5gcreate_f from hdefgrp at $4:$5 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5gcreate_f from hdefgrp at $4:$5 ;" - endif - else - ! if the group already exists, open it - call h5gopen_f($1, "$2", $3, hdfier) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5gopen_f from hdefgrp at $4:$5 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5gopen_f from hdefgrp at $4:$5 ;" - endif - endif - - ! macro expansion of hdefgrp; end;})m4_dnl -m4_define(HCLOSEGRP,{! macro expansion of hclosegrp; -! close a HDF5 group given in _1 - - call h5gclose_f($1, hdfier) - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5gclose_f from hclosegrp at $4:$5 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5gclose_f from hclosegrp at $4:$5 ;" - endif - - ! macro expansion of hclosegrp; end;})m4_dnl m4_define(H5DESCR,{! macro expansion of h5descr; ! describe an already-open HDF5 object given in _1 at location _2 with text given in _3 and leave it open; _4 and _5 should be __FILE__ and __LINE__ ! also write a LaTeX comment on that output object diff --git a/src/sphdf5.F90 b/src/sphdf5.F90 index 0877012c..041f274d 100644 --- a/src/sphdf5.F90 +++ b/src/sphdf5.F90 @@ -24,7 +24,7 @@ module sphdf5 logical, parameter :: hdfDebug = .false. !< global flag to enable verbal diarrhea commenting HDF5 operations integer, parameter :: internalHdf5Msg = 0 !< 1: print internal HDF5 error messages; 0: only error messages from sphdf5 - integer :: hdfier !< error flag for HDF5 library +! integer :: hdfier !< error flag for HDF5 library integer :: rank !< rank of data to write using macros integer(hid_t) :: file_id !< default file ID used in macros integer(hid_t) :: space_id !< default dataspace ID used in macros @@ -32,7 +32,7 @@ module sphdf5 integer(hsize_t) :: onedims(1:1) !< dimension specifier for one-dimensional data used in macros integer(hsize_t) :: twodims(1:2) !< dimension specifier for two-dimensional data used in macros integer(hsize_t) :: threedims(1:3) !< dimension specifier for three-dimensional data used in macros - logical :: grp_exists !< flags used to signal if a group already exists +! logical :: grp_exists !< flags used to signal if a group already exists logical :: var_exists !< flags used to signal if a variable already exists integer(hid_t) :: iteration_dset_id !< Dataset identifier for "iteration" @@ -91,13 +91,78 @@ module sphdf5 integer(SIZE_T) :: attrlen !< Length of the attribute string character(len=:), allocatable :: attr_data !< Attribute data +private +public init_outfile, & + mirror_input_to_outfile, & + init_convergence_output, & + write_convergence_output, & + write_grid, & + init_flt_output, & + write_poincare, & + write_transform, & + finalize_flt_output, & + write_vector_potential, & + hdfint, & + finish_outfile + contains +!> Define a HDF5 group or opens it if it already exists. +!> +!> @param file_id file in which to define the group +!> @param name name of the new group +!> @param group_id id of the newly-created group +subroutine HDEFGRP(file_id, name, group_id) + integer(hid_t), intent(in) :: file_id + character(len=*), intent(in) :: name + integer(hid_t), intent(out) :: group_id + + logical :: grp_exists !< flags used to signal if a group already exists + integer :: hdfier !< error flag for HDF5 library + + call h5lexists_f(file_id, name, grp_exists, hdfier) + + if (grp_exists) then + ! if the group already exists, open it + call h5gopen_f(file_id, name, group_id, hdfier) + if (hdfier .ne. 0) then + write(6, '("sphdf5 : "10x" : error calling h5gopen_f from hdefgrp")') + call MPI_ABORT(MPI_COMM_SPEC, 1, ierr) + stop "sphdf5 : error calling h5gopen_f from hdefgrp" + endif + else + ! if group does not exist, create it + call h5gcreate_f(file_id, name, group_id, hdfier) + if (hdfier .ne. 0) then + write(6, '("sphdf5 : "10x" : error calling h5gcreate_f from hdefgrp")') + call MPI_ABORT(MPI_COMM_SPEC, 1, ierr) + stop "sphdf5 : error calling h5gcreate_f from hdefgrp" + endif + endif +end subroutine ! HDEFGRP + +!> Close a HDF5 group. +!> +!> @param group_id HDF5 group to close +subroutine HCLOSEGRP(group_id) + integer(hid_t), intent(in) :: group_id + + integer :: hdfier !< error flag for HDF5 library + + call h5gclose_f(group_id, hdfier) + if (hdfier .ne. 0) then + write(6, '("sphdf5 : "10x" : error calling h5gclose_f from hclosegrp")') + call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + stop "sphdf5 : error calling h5gclose_f from hclosegrp" + endif +end subroutine ! HCLOSEGRP + + + !> \brief Initialize the interface to the HDF5 library and open the output file. !> \ingroup grp_output !> -subroutine init_outfile - +subroutine init_outfile() #ifdef OPENMP USE OMP_LIB @@ -107,8 +172,6 @@ subroutine init_outfile integer :: ierr, astat, ios, nthreads, ithread real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; - - cpui = MPI_WTIME() cpuo = cpui #ifdef OPENMP @@ -117,21 +180,22 @@ subroutine init_outfile nthreads = 1 #endif - if (myid.eq.0 .and. .not.skip_write) then -! -! ! initialize Fortran interface to the HDF5 library; -! H5CALL( sphdf5, h5open_f, (hdfier), __FILE__, __LINE__) -! -! ! (en/dis)able HDF5 internal error messages; sphdf5 has its own error messages coming from the macros -! H5CALL( sphdf5, h5eset_auto_f, (internalHdf5Msg, hdfier), __FILE__, __LINE__) -! -! ! Create the file -! H5CALL( sphdf5, h5fcreate_f, (trim(ext)//".sp.h5", H5F_ACC_TRUNC_F, file_id, hdfier ), __FILE__, __LINE__ ) -! -! ! write version number -! HWRITERV_LO( file_id, 1, version, (/ version /), __FILE__, __LINE__) -! H5DESCR_CDSET( /version, version of SPEC, __FILE__, __LINE__) + + ! initialize Fortran interface to the HDF5 library + call h5open_f(hdfier) + + ! (en/dis)able HDF5 internal error messages; + ! sphdf5 has its own error messages coming from the macros + call h5eset_auto_f(internalHdf5Msg, hdfier) + + ! Create the file + call h5fcreate_f(trim(ext)//".sp.h5", H5F_ACC_TRUNC_F, file_id, hdfier ) + + ! write version number + + call HWRITERV_LO(file_id, 1, "version", (/ version /)) + call H5DESCR_CDSET("/version", "version of SPEC") endif ! myid.eq.0 From dea2be55571c84f0d9e86fa420e010b28eb43ac7 Mon Sep 17 00:00:00 2001 From: Jonathan Schilling Date: Sun, 3 Jul 2022 18:27:12 +0200 Subject: [PATCH 06/15] first few output file quantities brought back to life --- SPECfile | 2 +- src/{h5utils.f90_tmp => h5utils.F90} | 785 ++++++++++++++++----------- src/macros | 110 ---- src/sphdf5.F90 | 637 +++++++++------------- 4 files changed, 741 insertions(+), 793 deletions(-) rename src/{h5utils.f90_tmp => h5utils.F90} (50%) delete mode 100644 src/macros diff --git a/SPECfile b/SPECfile index 24dbb279..6cc92494 100644 --- a/SPECfile +++ b/SPECfile @@ -13,7 +13,7 @@ # basis of SPEC: input variables, global workspace, HDF5 output file writing # these are split off since they require special treatment (needed by all others and/or special macros) BASEFILES=inputlist global -IOFILES=sphdf5 +IOFILES=h5utils sphdf5 # (most of) physics part of SPEC afiles=preset manual rzaxis packxi volume coords basefn memory diff --git a/src/h5utils.f90_tmp b/src/h5utils.F90 similarity index 50% rename from src/h5utils.f90_tmp rename to src/h5utils.F90 index d7c817c9..a853a0a1 100644 --- a/src/h5utils.f90_tmp +++ b/src/h5utils.F90 @@ -1,80 +1,195 @@ +module h5utils +use hdf5 +use mod_kinds, only: wp => dp +use allglobal, only: MPI_COMM_SPEC, myid +implicit none + +logical, parameter :: hdfDebug = .false. !< global flag to enable verbal diarrhea commenting HDF5 operations +integer, parameter :: internalHdf5Msg = 0 !< 1: print internal HDF5 error messages; 0: only error messages from sphdf5 + +character(LEN=*), parameter :: aname = "description" !< Attribute name for descriptive info + +! private +! public internalHdf5Msg, & +! HDEFGRP, & +! HCLOSEGRP, & +! H5DESCR, & +! H5DESCR_CDSET, & +! HWRITELV, & +! HWRITELV_LO, & +! HWRITEIV, & +! HWRITEIV_LO, & +! HWRITERV, & +! HWRITERV_LO, & +! HWRITERA, & +! HWRITERA_LO, & +! HWRITERC, & +! HWRITERC_LO + +contains + +!> Define a HDF5 group or opens it if it already exists. +!> +!> @param file_id file in which to define the group +!> @param name name of the new group +!> @param group_id id of the newly-created group +subroutine HDEFGRP(file_id, name, group_id) + integer(hid_t), intent(in) :: file_id + character(len=*), intent(in) :: name + integer(hid_t), intent(out) :: group_id + + logical :: grp_exists !< flags used to signal if a group already exists + integer :: hdfier !< error flag for HDF5 library + + call h5lexists_f(file_id, name, grp_exists, hdfier) + + if (grp_exists) then + ! if the group already exists, open it + call h5gopen_f(file_id, name, group_id, hdfier) + if (hdfier .ne. 0) then + write(6, '("sphdf5 : "10x" : error calling h5gopen_f from hdefgrp")') + call MPI_ABORT(MPI_COMM_SPEC, 1) + stop "sphdf5 : error calling h5gopen_f from hdefgrp" + endif + else + ! if group does not exist, create it + call h5gcreate_f(file_id, name, group_id, hdfier) + if (hdfier .ne. 0) then + write(6, '("sphdf5 : "10x" : error calling h5gcreate_f from hdefgrp")') + call MPI_ABORT(MPI_COMM_SPEC, 1) + stop "sphdf5 : error calling h5gcreate_f from hdefgrp" + endif + endif +end subroutine ! HDEFGRP -m4_define(H5DESCR,{! macro expansion of h5descr; -! describe an already-open HDF5 object given in _1 at location _2 with text given in _3 and leave it open; _4 and _5 should be __FILE__ and __LINE__ -! also write a LaTeX comment on that output object -!latex \item{\verb+$2+} $3 - attr_data = "$3" - attrlen=len(attr_data) +!> Close a HDF5 group. +!> +!> @param group_id HDF5 group to close +subroutine HCLOSEGRP(group_id) + integer(hid_t), intent(in) :: group_id - call h5screate_simple_f(arank, adims, aspace_id, hdfier) ! Create scalar data space for the attribute. - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from h5descr at $4:$5 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5screate_simple_f from h5descr at $4:$5 ;" + integer :: hdfier !< error flag for HDF5 library + + call h5gclose_f(group_id, hdfier) + if (hdfier .ne. 0) then + write(6, '("sphdf5 : "10x" : error calling h5gclose_f from hclosegrp")') + call MPI_ABORT(MPI_COMM_SPEC, 1) + stop "sphdf5 : error calling h5gclose_f from hclosegrp" endif +end subroutine ! HCLOSEGRP - call h5tcopy_f(H5T_NATIVE_CHARACTER, atype_id, hdfier) ! Create datatype for the attribute. - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5tcopy_f from h5descr at $4:$5 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5tcopy_f from h5descr at $4:$5 ;" +!> Describe an already-open HDF5 object identified by group_id +!> with text given in description and leave it open +!> +!> @param group_id ID of group to describe +!> @param description description for group +subroutine H5DESCR(group_id, description) + integer(hid_t), intent(in) :: group_id + character(len=*), intent(in) :: description + + integer :: hdfier !< error flag for HDF5 library + + integer(HID_T) :: attr_id !< Attribute identifier + integer(HID_T) :: aspace_id !< Attribute Dataspace identifier + integer(HID_T) :: atype_id !< Attribute Datatype identifier + + integer, parameter :: arank = 1 !< Attribure rank + integer(HSIZE_T), dimension(arank) :: adims = (/1/) !< Attribute dimension + integer(SIZE_T) :: attr_len !< Length of the attribute string + + attr_len = len(description) + + !> Create scalar data space for the attribute. + call h5screate_simple_f(arank, adims, aspace_id, hdfier) + if (hdfier .ne. 0) then + write(6, '("sphdf5 : "10x" : error calling h5screate_simple_f from h5descr")') + call MPI_ABORT(MPI_COMM_SPEC, 1) + stop "sphdf5 : error calling h5screate_simple_f from h5descr" endif - call h5tset_size_f(atype_id, attrlen, hdfier) ! Create datatype for the attribute. - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5tset_size_f from h5descr at $4:$5 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5tset_size_f from h5descr at $4:$5 ;" + !> Create datatype for the attribute. + call h5tcopy_f(H5T_NATIVE_CHARACTER, atype_id, hdfier) + if (hdfier .ne. 0) then + write(6,'("sphdf5 : "10x" : error calling h5tcopy_f from h5descr")') + call MPI_ABORT(MPI_COMM_SPEC, 1) + stop "sphdf5 : error calling h5tcopy_f from h5descr" endif - call h5acreate_f($1, aname, atype_id, aspace_id, attr_id, hdfier) ! create descriptive attribute - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5acreate_f from h5descr at $4:$5 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5acreate_f from h5descr at $4:$5 ;" + ! set size of datatype for attribute + call h5tset_size_f(atype_id, attr_len, hdfier) + if (hdfier .ne. 0) then + write(6,'("sphdf5 : "10x" : error calling h5tset_size_f from h5descr")') + call MPI_ABORT(MPI_COMM_SPEC, 1) + stop "sphdf5 : error calling h5tset_size_f from h5descr" endif - call h5awrite_f(attr_id, atype_id, attr_data, adims, hdfier) ! Write the attribute data. - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5awrite_f from h5descr at $4:$5 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5awrite_f from h5descr at $4:$5 ;" + !> create descriptive attribute + call h5acreate_f(group_id, aname, atype_id, aspace_id, attr_id, hdfier) + if (hdfier .ne. 0) then + write(6,'("sphdf5 : "10x" : error calling h5acreate_f from h5descr")') + call MPI_ABORT(MPI_COMM_SPEC, 1) + stop "sphdf5 : error calling h5acreate_f from h5descr" endif - call h5aclose_f(attr_id, hdfier) ! Close the attribute. - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5aclose_f from h5descr at $4:$5 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5aclose_f from h5descr at $4:$5 ;" + !> Write the attribute data. + call h5awrite_f(attr_id, atype_id, description, adims, hdfier) + if (hdfier .ne. 0) then + write(6,'("sphdf5 : "10x" : error calling h5awrite_f from h5descr")') + call MPI_ABORT(MPI_COMM_SPEC, 1) + stop "sphdf5 : error calling h5awrite_f from h5descr" endif - call h5tclose_f(atype_id, hdfier) ! Close the attribute datatype. - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5tclose_f from h5descr at $4:$5 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5tclose_f from h5descr at $4:$5 ;" + !> Close the attribute. + call h5aclose_f(attr_id, hdfier) + if (hdfier .ne. 0) then + write(6,'("sphdf5 : "10x" : error calling h5aclose_f from h5descr")') + call MPI_ABORT(MPI_COMM_SPEC, 1) + stop "sphdf5 : error calling h5aclose_f from h5descr" endif - call h5sclose_f(aspace_id, hdfier) ! Terminate access to the data space. - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5sclose_f from h5descr at $4:$5 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5sclose_f from h5descr at $4:$5 ;" + !> Close the attribute datatype. + call h5tclose_f(atype_id, hdfier) + if (hdfier .ne. 0) then + write(6,'("sphdf5 : "10x" : error calling h5tclose_f from h5descr")') + call MPI_ABORT(MPI_COMM_SPEC, 1) + stop "sphdf5 : error calling h5tclose_f from h5descr" + endif + + !> Terminate access to the data space. + call h5sclose_f(aspace_id, hdfier) + if (hdfier .ne. 0) then + write(6,'("sphdf5 : "10x" : error calling h5sclose_f from h5descr")') + call MPI_ABORT(MPI_COMM_SPEC, 1) + stop "sphdf5 : error calling h5sclose_f from h5descr" endif +end subroutine ! H5DESCR + +!> Describe an already-open HDF5 dataset identified by dset_id +!> with text given in _2 and close it at the end +!> +!> @param dset_id ID of dataset to describe +!> @param description description for dataset +subroutine H5DESCR_CDSET(dset_id, description) + integer(hid_t), intent(in) :: dset_id + character(len=*), intent(in) :: description - ! macro expansion of h5descr; end;})m4_dnl - m4_define(H5DESCR_CDSET,{! macro expansion of h5descr_cdset; -! describe an already-open HDF5 dataset identified by dset_id at location _1 with text given in _2 and close it at the end; _3 and _4 should be __FILE__ and __LINE__ -! also write a LaTeX comment on that output object -!latex \item{\verb+$1+} $2 - attr_data = "$2" - attrlen=len(attr_data) + integer :: hdfier !< error flag for HDF5 library + + integer(HID_T) :: aspace_id !< Attribute Dataspace identifier + integer(HID_T) :: atype_id !< Attribute Datatype identifier + integer(HID_T) :: attr_id !< Attribute identifier + + integer(SIZE_T) :: attr_len !< Length of the attribute string + integer, parameter :: arank = 1 !< Attribure rank + integer(HSIZE_T), dimension(arank) :: adims = (/1/) !< Attribute dimension + + attr_len = len(description) ! Create scalar data space for the attribute. call h5screate_simple_f(arank, adims, aspace_id, hdfier) if( hdfier.ne.0 ) then write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from h5descr_cdset at $3:$4 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + call MPI_ABORT( MPI_COMM_SPEC, 1 ) stop "sphdf5 : error calling h5screate_simple_f from h5descr_cdset at $3:$4 ;" endif @@ -82,14 +197,14 @@ call h5tcopy_f(H5T_NATIVE_CHARACTER, atype_id, hdfier) if( hdfier.ne.0 ) then write(6,'("sphdf5 : "10x" : error calling h5tcopy_f from h5descr_cdset at $3:$4 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + call MPI_ABORT( MPI_COMM_SPEC, 1 ) stop "sphdf5 : error calling h5tcopy_f from h5descr_cdset at $3:$4 ;" endif - call h5tset_size_f(atype_id, attrlen, hdfier) + call h5tset_size_f(atype_id, attr_len, hdfier) if( hdfier.ne.0 ) then write(6,'("sphdf5 : "10x" : error calling h5tset_size_f from h5descr_cdset at $3:$4 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + call MPI_ABORT( MPI_COMM_SPEC, 1 ) stop "sphdf5 : error calling h5tset_size_f from h5descr_cdset at $3:$4 ;" endif @@ -97,15 +212,15 @@ call h5acreate_f(dset_id, aname, atype_id, aspace_id, attr_id, hdfier) if( hdfier.ne.0 ) then write(6,'("sphdf5 : "10x" : error calling h5acreate_f from h5descr_cdset at $3:$4 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + call MPI_ABORT( MPI_COMM_SPEC, 1 ) stop "sphdf5 : error calling h5acreate_f from h5descr_cdset at $3:$4 ;" endif ! Write the attribute data. - call h5awrite_f(attr_id, atype_id, attr_data, adims, hdfier) + call h5awrite_f(attr_id, atype_id, description, adims, hdfier) if( hdfier.ne.0 ) then write(6,'("sphdf5 : "10x" : error calling h5awrite_f from h5descr_cdset at $3:$4 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + call MPI_ABORT( MPI_COMM_SPEC, 1 ) stop "sphdf5 : error calling h5awrite_f from h5descr_cdset at $3:$4 ;" endif @@ -113,7 +228,7 @@ call h5aclose_f(attr_id, hdfier) if( hdfier.ne.0 ) then write(6,'("sphdf5 : "10x" : error calling h5aclose_f from h5descr_cdset at $3:$4 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + call MPI_ABORT( MPI_COMM_SPEC, 1 ) stop "sphdf5 : error calling h5aclose_f from h5descr_cdset at $3:$4 ;" endif @@ -121,7 +236,7 @@ call h5tclose_f(atype_id, hdfier) if( hdfier.ne.0 ) then write(6,'("sphdf5 : "10x" : error calling h5tclose_f from h5descr_cdset at $3:$4 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + call MPI_ABORT( MPI_COMM_SPEC, 1 ) stop "sphdf5 : error calling h5tclose_f from h5descr_cdset at $3:$4 ;" endif @@ -129,39 +244,44 @@ call h5sclose_f(aspace_id, hdfier) if( hdfier.ne.0 ) then write(6,'("sphdf5 : "10x" : error calling h5sclose_f from h5descr_cdset at $3:$4 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + call MPI_ABORT( MPI_COMM_SPEC, 1 ) stop "sphdf5 : error calling h5sclose_f from h5descr_cdset at $3:$4 ;" endif call h5dclose_f(dset_id, hdfier) ! terminate dataset; if( hdfier.ne.0 ) then write(6,'("sphdf5 : "10x" : error calling h5dclose_f from h5descr_cdset at $3:$4 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + call MPI_ABORT( MPI_COMM_SPEC, 1 ) stop "sphdf5 : error calling h5dclose_f from h5descr_cdset at $3:$4 ;" endif +end subroutine ! H5DESCR_CDSET - ! macro expansion of h5descr_cdset; end;})m4_dnl -m4_define(HWRITELV,{! macro expansion of hwritelv; -! write logical variable _4 (scalar (_2=1) or rank-1 (_2=length)) into a dataset named _3 into group _1; _5 and _6 should be __FILE__ and __LINE__ -! example: hwritelv( grpInputGlobal, 1, LreadGF, (/ LreadGF /) ) ! scalar -! example: hwritelv( grpInput, 5, success, success(1:5) ) ! rank-1 +!> write logical variable _4 (scalar (_2=1) or rank-1 (_2=length)) into a dataset named _3 into group _1 +!> example: hwritelv( grpInputGlobal, 1, LreadGF, (/ LreadGF /) ) ! scalar +!> example: hwritelv( grpInput, 5, success, success(1:5) ) ! rank-1 +subroutine HWRITELV(group_id, name, num_data, data) + integer(hid_t), intent(in) :: group_id + character(len=*), intent(in) :: name + integer, intent(in) :: num_data + logical, dimension(:), intent(in) :: data -#ifdef DEBUG - if( Wmacros ) write(ounit,'("macros : ", 10x ," : myid=",i3," ; writing $3 ;")') myid -#endif + integer :: hdfier !< error flag for HDF5 library + logical :: var_exists !< flags used to signal if a variable already exists - rank = 1 ; onedims(1) = $2 + integer(hsize_t) :: onedims(1) !< dimension specifier for one-dimensional data used in macros + integer(hid_t) :: space_id !< default dataspace ID used in macros + integer(hid_t) :: dset_id !< default dataset ID used in macros - if( $2.le.0 ) then - - write(6,'("sphdf5 : "10x" : error calling hwriteiv ; $3 : $2.le.0 at $5:$6 ;")') + onedims(1) = num_data + if (num_data .le. 0) then + write(6, '("sphdf5 : "10x" : error calling hwriteiv ; ",a," : ",i1," .le. 0")') name, num_data else - call h5screate_simple_f( rank, onedims, space_id, hdfier ) + call h5screate_simple_f(1, onedims, space_id, hdfier) if( hdfier.ne.0 ) then write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from hwritelv at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + call MPI_ABORT( MPI_COMM_SPEC, 1 ) stop "sphdf5 : error calling h5screate_simple_f from hwritelv at $5:$6 ;" endif @@ -169,19 +289,21 @@ call h5eset_auto_f(0, hdfier) if( hdfier.ne.0 ) then write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwritelv at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + call MPI_ABORT( MPI_COMM_SPEC, 1 ) stop "sphdf5 : error calling h5eset_auto_f from hwritelv at $5:$6 ;" endif ! check if dataset can be opened - call h5dopen_f($1, "$3", dset_id, hdfier) + call h5dopen_f(group_id, name, dset_id, hdfier) if (hdfier.lt.0) then var_exists = .false. - if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $3 does not exist yet, creating it" + if (hdfDebug .and. myid.eq.0) then + write(*,*) "dataset",name,"does not exist yet, creating it" endif else var_exists = .true. - if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $3 exists already, opening it" + if (hdfDebug .and. myid.eq.0) then + write(*,*) "dataset",name,"exists already, opening it" endif endif @@ -189,131 +311,143 @@ call h5eset_auto_f(internalHdf5Msg, hdfier) if( hdfier.ne.0 ) then write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwritelv at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + call MPI_ABORT( MPI_COMM_SPEC, 1 ) stop "sphdf5 : error calling h5eset_auto_f from hwritelv at $5:$6 ;" endif ! if the dataset does not exist already, create it. Otherwise, it should be open already if (.not.var_exists) then - call h5dcreate_f( $1, "$3", H5T_NATIVE_INTEGER, space_id, dset_id, hdfier ) + call h5dcreate_f(group_id, name, H5T_NATIVE_INTEGER, space_id, dset_id, hdfier ) if( hdfier.ne.0 ) then write(6,'("sphdf5 : "10x" : error calling h5dcreate_f from hwritelv at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + call MPI_ABORT( MPI_COMM_SPEC, 1 ) stop "sphdf5 : error calling h5dcreate_f from hwritelv at $5:$6 ;" endif endif - call h5dwrite_f( dset_id, H5T_NATIVE_INTEGER, merge(1,0,$4) , onedims, hdfier ) + call h5dwrite_f( dset_id, H5T_NATIVE_INTEGER, merge(1, 0, data) , onedims, hdfier ) if( hdfier.ne.0 ) then write(6,'("sphdf5 : "10x" : error calling h5dwrite_f from hwritelv at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + call MPI_ABORT( MPI_COMM_SPEC, 1 ) stop "sphdf5 : error calling h5dwrite_f from hwritelv at $5:$6 ;" endif - call h5dclose_f(dset_id, hdfier) ! terminate dataset; + call h5dclose_f(dset_id, hdfier) ! close dataset; if( hdfier.ne.0 ) then write(6,'("sphdf5 : "10x" : error calling h5dclose_f from hwritelv at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + call MPI_ABORT( MPI_COMM_SPEC, 1 ) stop "sphdf5 : error calling h5dclose_f from hwritelv at $5:$6 ;" endif endif +end subroutine ! HWRITELV - ! macro expansion of hwritelv; end;})m4_dnl -m4_define(HWRITELV_LO,{! macro expansion of hwritelv_lo; ! write logical variable _4 (scalar (_2=1) or rank-1 (_2=length)) into a dataset named _3 into group _1 and leave dataset open for e.g. adding an attribute; _5 and _6 should be __FILE__ and __LINE__ ! example: hwritelv_lo( grpInputGlobal, 1, LreadGF, (/ LreadGF /) ) ! scalar ! example: hwritelv_lo( grpInput, 5, success, success(1:5) ) ! rank-1 ! and close it using h5descr_cdset( /input/global/LreadGF, reading flag for GF ) +subroutine HWRITELV_LO(group_id, name, num_data, data, dset_id) + integer(hid_t), intent(in) :: group_id + character(len=*), intent(in) :: name + integer, intent(in) :: num_data + logical, dimension(:), intent(in) :: data + integer(hid_t), intent(out) :: dset_id !< default dataset ID used in macros -#ifdef DEBUG - if( Wmacros ) write(ounit,'("macros : ", 10x ," : myid=",i3," ; writing $3 ;")') myid -#endif - - rank = 1 ; onedims(1) = $2 + integer :: hdfier !< error flag for HDF5 library + logical :: var_exists !< flags used to signal if a variable already exists - if( $2.le.0 ) then + integer(hsize_t) :: onedims(1) !< dimension specifier for one-dimensional data used in macros + integer(hid_t) :: space_id !< default dataspace ID used in macros - write(6,'("sphdf5 : "10x" : error calling hwriteiv ; $3 : $2.le.0 at $5:$6 ;")') + onedims(1) = num_data + if (num_data .le. 0) then + write(6, '("sphdf5 : "10x" : error calling hwriteiv ; ",a," : ",i1," .le. 0")') name, num_data else - call h5screate_simple_f( rank, onedims, space_id, hdfier ) + call h5screate_simple_f(1, onedims, space_id, hdfier) if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from hwritelv_lo at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5screate_simple_f from hwritelv_lo at $5:$6 ;" + write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from hwritelv at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1 ) + stop "sphdf5 : error calling h5screate_simple_f from hwritelv at $5:$6 ;" endif ! temporarily disable error printing to not confuse users call h5eset_auto_f(0, hdfier) if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwritelv_lo at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5eset_auto_f from hwritelv_lo at $5:$6 ;" + write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwritelv at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1 ) + stop "sphdf5 : error calling h5eset_auto_f from hwritelv at $5:$6 ;" endif ! check if dataset can be opened - call h5dopen_f($1, "$3", dset_id, hdfier) + call h5dopen_f(group_id, name, dset_id, hdfier) if (hdfier.lt.0) then var_exists = .false. - if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $3 does not exist yet, creating it" + if (hdfDebug .and. myid.eq.0) then + write(*,*) "dataset",name,"does not exist yet, creating it" endif else var_exists = .true. - if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $3 exists already, opening it" + if (hdfDebug .and. myid.eq.0) then + write(*,*) "dataset",name,"exists already, opening it" endif endif ! re-establish previous state of error printing to be sensitive to "real" errors call h5eset_auto_f(internalHdf5Msg, hdfier) if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwritelv_lo at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5eset_auto_f from hwritelv_lo at $5:$6 ;" + write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwritelv at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1 ) + stop "sphdf5 : error calling h5eset_auto_f from hwritelv at $5:$6 ;" endif ! if the dataset does not exist already, create it. Otherwise, it should be open already if (.not.var_exists) then - call h5dcreate_f( $1, "$3", H5T_NATIVE_INTEGER, space_id, dset_id, hdfier ) + call h5dcreate_f(group_id, name, H5T_NATIVE_INTEGER, space_id, dset_id, hdfier ) if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5dcreate_f from hwritelv_lo at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5dcreate_f from hwritelv_lo at $5:$6 ;" + write(6,'("sphdf5 : "10x" : error calling h5dcreate_f from hwritelv at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1 ) + stop "sphdf5 : error calling h5dcreate_f from hwritelv at $5:$6 ;" endif endif - call h5dwrite_f( dset_id, H5T_NATIVE_INTEGER, merge(1,0,$4) , onedims, hdfier ) + call h5dwrite_f( dset_id, H5T_NATIVE_INTEGER, merge(1, 0, data) , onedims, hdfier ) if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5dwrite_f from hwritelv_lo at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5dwrite_f from hwritelv_lo at $5:$6 ;" + write(6,'("sphdf5 : "10x" : error calling h5dwrite_f from hwritelv at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1 ) + stop "sphdf5 : error calling h5dwrite_f from hwritelv at $5:$6 ;" endif endif +end subroutine ! HWRITELV_LO - ! macro expansion of hwritelv_lo; end;})m4_dnl -m4_define(HWRITEIV,{! macro expansion of hwriteiv; ! write integer variable _4 (scalar (_2=1) or rank-1 (_2=length)) into a dataset named _3 into group _1; _5 and _6 should be __FILE__ and __LINE__ ! example: hwriteiv( grpInputPhysics, 1, Igeometry, (/ Igeometry /) ) ! scalar ! example: hwriteiv( grpInputPhysics, Mvol, Lrad, Lrad(1:Mvol) ) ! rank-1 +subroutine HWRITEIV(group_id, name, num_data, data) + integer(hid_t), intent(in) :: group_id + character(len=*), intent(in) :: name + integer, intent(in) :: num_data + integer, dimension(:), intent(in) :: data -#ifdef DEBUG - if( Wmacros ) write(ounit,'("macros : ", 10x ," : myid=",i3," ; writing $3 ;")') myid -#endif + integer :: hdfier !< error flag for HDF5 library + logical :: var_exists !< flags used to signal if a variable already exists - rank = 1 ; onedims(1) = $2 + integer(hsize_t) :: onedims(1) !< dimension specifier for one-dimensional data used in macros + integer(hid_t) :: space_id !< default dataspace ID used in macros + integer(hid_t) :: dset_id !< default dataset ID used in macros - if( $2.le.0 ) then + onedims(1) = num_data + if (num_data .le. 0) then write(6,'("sphdf5 : "10x" : error calling hwriteiv ; $3 : $2.le.0 at $5:$6 ;")') - else - call h5screate_simple_f( rank, onedims, space_id, hdfier ) + call h5screate_simple_f( 1, onedims, space_id, hdfier ) if( hdfier.ne.0 ) then write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from hwriteiv at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + call MPI_ABORT( MPI_COMM_SPEC, 1 ) stop "sphdf5 : error calling h5screate_simple_f from hwriteiv at $5:$6 ;" endif @@ -321,12 +455,12 @@ call h5eset_auto_f(0, hdfier) if( hdfier.ne.0 ) then write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriteiv at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + call MPI_ABORT( MPI_COMM_SPEC, 1 ) stop "sphdf5 : error calling h5eset_auto_f from hwriteiv at $5:$6 ;" endif ! check if dataset can be opened - call h5dopen_f($1, "$3", dset_id, hdfier) + call h5dopen_f(group_id, name, dset_id, hdfier) if (hdfier.lt.0) then var_exists = .false. if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $3 does not exist yet, creating it" @@ -341,72 +475,77 @@ call h5eset_auto_f(internalHdf5Msg, hdfier) if( hdfier.ne.0 ) then write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriteiv at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + call MPI_ABORT( MPI_COMM_SPEC, 1 ) stop "sphdf5 : error calling h5eset_auto_f from hwriteiv at $5:$6 ;" endif ! if the dataset does not exist already, create it. Otherwise, it should be open already if (.not.var_exists) then - call h5dcreate_f( $1, "$3", H5T_NATIVE_INTEGER, space_id, dset_id, hdfier ) + call h5dcreate_f(group_id, name, H5T_NATIVE_INTEGER, space_id, dset_id, hdfier ) if( hdfier.ne.0 ) then write(6,'("sphdf5 : "10x" : error calling h5dcreate_f from hwriteiv at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + call MPI_ABORT( MPI_COMM_SPEC, 1 ) stop "sphdf5 : error calling h5dcreate_f from hwriteiv at $5:$6 ;" endif endif - call h5dwrite_f( dset_id, H5T_NATIVE_INTEGER, $4, onedims, hdfier ) + call h5dwrite_f( dset_id, H5T_NATIVE_INTEGER, data, onedims, hdfier ) if( hdfier.ne.0 ) then write(6,'("sphdf5 : "10x" : error calling h5dwrite_f from hwriteiv at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + call MPI_ABORT( MPI_COMM_SPEC, 1 ) stop "sphdf5 : error calling h5dwrite_f from hwriteiv at $5:$6 ;" endif call h5dclose_f(dset_id, hdfier) ! terminate dataset; if( hdfier.ne.0 ) then write(6,'("sphdf5 : "10x" : error calling h5dclose_f from hwriteiv at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + call MPI_ABORT( MPI_COMM_SPEC, 1 ) stop "sphdf5 : error calling h5dclose_f from hwriteiv at $5:$6 ;" endif endif +end subroutine ! HWRITEIV - ! macro expansion of hwriteiv; end;})m4_dnl -m4_define(HWRITEIV_LO,{! macro expansion of hwriteiv_lo; ! write integer variable _4 (scalar (_2=1) or rank-1 (_2=length)) into a dataset named _3 into group _1 and leave the dataset open for e.g. adding and attribute ! example: hwriteiv( grpInputPhysics, 1, Igeometry, (/ Igeometry /) ) ! scalar ! example: hwriteiv( grpInputPhysics, Mvol, Lrad, Lrad(1:Mvol) ) ! rank-1 ! and close it using h5descr_cdset( /input/physics/Igeometry, geometry identifier ) +subroutine HWRITEIV_LO(group_id, name, num_data, data, dset_id) + integer(hid_t), intent(in) :: group_id + character(len=*), intent(in) :: name + integer, intent(in) :: num_data + integer, dimension(:), intent(in) :: data + integer(hid_t), intent(out) :: dset_id !< default dataset ID used in macros -#ifdef DEBUG - if( Wmacros ) write(ounit,'("macros : ", 10x ," : myid=",i3," ; writing $3 ;")') myid -#endif - - rank = 1 ; onedims(1) = $2 + integer :: hdfier !< error flag for HDF5 library + logical :: var_exists !< flags used to signal if a variable already exists - if( $2.le.0 ) then + integer(hsize_t) :: onedims(1) !< dimension specifier for one-dimensional data used in macros + integer(hid_t) :: space_id !< default dataspace ID used in macros - write(6,'("sphdf5 : "10x" : error calling hwriteiv_lo ; $3 : $2.le.0 at $5:$6 ;")') + onedims(1) = num_data + if (num_data .le. 0) then + write(6,'("sphdf5 : "10x" : error calling hwriteiv ; $3 : $2.le.0 at $5:$6 ;")') else - call h5screate_simple_f( rank, onedims, space_id, hdfier ) + call h5screate_simple_f( 1, onedims, space_id, hdfier ) if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from hwriteiv_lo at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5screate_simple_f from hwriteiv_lo at $5:$6 ;" + write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from hwriteiv at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1 ) + stop "sphdf5 : error calling h5screate_simple_f from hwriteiv at $5:$6 ;" endif ! temporarily disable error printing to not confuse users call h5eset_auto_f(0, hdfier) if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriteiv_lo at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5eset_auto_f from hwriteiv_lo at $5:$6 ;" + write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriteiv at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1 ) + stop "sphdf5 : error calling h5eset_auto_f from hwriteiv at $5:$6 ;" endif ! check if dataset can be opened - call h5dopen_f($1, "$3", dset_id, hdfier) + call h5dopen_f(group_id, name, dset_id, hdfier) if (hdfier.lt.0) then var_exists = .false. if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $3 does not exist yet, creating it" @@ -420,52 +559,57 @@ ! re-establish previous state of error printing to be sensitive to "real" errors call h5eset_auto_f(internalHdf5Msg, hdfier) if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriteiv_lo at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5eset_auto_f from hwriteiv_lo at $5:$6 ;" + write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriteiv at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1 ) + stop "sphdf5 : error calling h5eset_auto_f from hwriteiv at $5:$6 ;" endif ! if the dataset does not exist already, create it. Otherwise, it should be open already if (.not.var_exists) then - call h5dcreate_f( $1, "$3", H5T_NATIVE_INTEGER, space_id, dset_id, hdfier ) + call h5dcreate_f(group_id, name, H5T_NATIVE_INTEGER, space_id, dset_id, hdfier ) if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5dcreate_f from hwriteiv_lo at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5dcreate_f from hwriteiv_lo at $5:$6 ;" + write(6,'("sphdf5 : "10x" : error calling h5dcreate_f from hwriteiv at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1 ) + stop "sphdf5 : error calling h5dcreate_f from hwriteiv at $5:$6 ;" endif endif - call h5dwrite_f( dset_id, H5T_NATIVE_INTEGER, $4, onedims, hdfier ) + call h5dwrite_f( dset_id, H5T_NATIVE_INTEGER, data, onedims, hdfier ) if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5dwrite_f from hwriteiv_lo at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5dwrite_f from hwriteiv_lo at $5:$6 ;" + write(6,'("sphdf5 : "10x" : error calling h5dwrite_f from hwriteiv at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1 ) + stop "sphdf5 : error calling h5dwrite_f from hwriteiv at $5:$6 ;" endif endif +end subroutine ! HWRITEIV_LO - ! macro expansion of hwriteiv_lo; end;})m4_dnl -m4_define(HWRITERV,{! macro expansion of hwriterv; ! write real variable _4 (scalar (_2=1) or rank-1 (_2=length)) into a dataset named _3 into group _1; _5 and _6 should be __LINE__ and __FILE__ ! example: hwriterv( grpInputPhysics, 1, phiedge, (/ phiedge /) ) ! scalar ! example: hwriterv( grpInputPhysics, Mvol, tflux, tflux(1:Mvol) ) ! rank-1 +subroutine HWRITERV(group_id, name, num_data, data) + integer(hid_t), intent(in) :: group_id + character(len=*), intent(in) :: name + integer, intent(in) :: num_data + real(wp), dimension(:), intent(in) :: data -#ifdef DEBUG - if( Wmacros ) write(ounit,'("macros : ", 10x ," : myid=",i3," ; writing $3 ;")') myid -#endif + integer :: hdfier !< error flag for HDF5 library + logical :: var_exists !< flags used to signal if a variable already exists - rank = 1 ; onedims(1) = $2 + integer(hsize_t) :: onedims(1) !< dimension specifier for one-dimensional data used in macros + integer(hid_t) :: space_id !< default dataspace ID used in macros + integer(hid_t) :: dset_id !< default dataset ID used in macros - if( $2.le.0 ) then + onedims(1) = num_data + if( num_data.le.0 ) then write(6,'("sphdf5 : "10x" : error calling hwriterv ; $3 : $2.le.0 at $5:$6 ;")') - else - call h5screate_simple_f( rank, onedims, space_id, hdfier ) + call h5screate_simple_f( 1, onedims, space_id, hdfier ) if( hdfier.ne.0 ) then write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from hwriterv at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + call MPI_ABORT( MPI_COMM_SPEC, 1 ) stop "sphdf5 : error calling h5screate_simple_f from hwriterv at $5:$6 ;" endif @@ -473,12 +617,12 @@ call h5eset_auto_f(0, hdfier) if( hdfier.ne.0 ) then write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriterv at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + call MPI_ABORT( MPI_COMM_SPEC, 1 ) stop "sphdf5 : error calling h5eset_auto_f from hwriterv at $5:$6 ;" endif ! check if dataset can be opened - call h5dopen_f($1, "$3", dset_id, hdfier) + call h5dopen_f(group_id, name, dset_id, hdfier) if (hdfier.lt.0) then var_exists = .false. if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $3 does not exist yet, creating it" @@ -493,72 +637,77 @@ call h5eset_auto_f(internalHdf5Msg, hdfier) if( hdfier.ne.0 ) then write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriterv at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + call MPI_ABORT( MPI_COMM_SPEC, 1 ) stop "sphdf5 : error calling h5eset_auto_f from hwriterv at $5:$6 ;" endif ! if the dataset does not exist already, create it. Otherwise, it should be open already if (.not.var_exists) then - call h5dcreate_f( $1, "$3", H5T_NATIVE_DOUBLE, space_id, dset_id, hdfier ) + call h5dcreate_f(group_id, name, H5T_NATIVE_DOUBLE, space_id, dset_id, hdfier ) if( hdfier.ne.0 ) then write(6,'("sphdf5 : "10x" : error calling h5dcreate_f from hwriterv at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + call MPI_ABORT( MPI_COMM_SPEC, 1 ) stop "sphdf5 : error calling h5dcreate_f from hwriterv at $5:$6 ;" endif endif - call h5dwrite_f( dset_id, H5T_NATIVE_DOUBLE, $4, onedims, hdfier ) + call h5dwrite_f( dset_id, H5T_NATIVE_DOUBLE, data, onedims, hdfier ) if( hdfier.ne.0 ) then write(6,'("sphdf5 : "10x" : error calling h5dwrite_f from hwriterv at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + call MPI_ABORT( MPI_COMM_SPEC, 1 ) stop "sphdf5 : error calling h5dwrite_f from hwriterv at $5:$6 ;" endif call h5dclose_f(dset_id, hdfier) ! terminate dataset; if( hdfier.ne.0 ) then write(6,'("sphdf5 : "10x" : error calling h5dclose_f from hwriterv at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + call MPI_ABORT( MPI_COMM_SPEC, 1 ) stop "sphdf5 : error calling h5dclose_f from hwriterv at $5:$6 ;" endif endif +end subroutine ! HWRITERV - ! macro expansion of hwriterv; end;})m4_dnl -m4_define(HWRITERV_LO,{! macro expansion of hwriterv_lo; ! write real variable _4 (scalar (_2=1) or rank-1 (_2=length)) into a dataset named _3 into group _1 and leave it open, e.g. for adding an attribute; _5 and _6 should be __FILE__ and __LINE__ ! example: hwriterv( grpInputPhysics, 1, phiedge, (/ phiedge /) ) ! scalar ! example: hwriterv( grpInputPhysics, Mvol, tflux, tflux(1:Mvol) ) ! rank-1 ! and close it with h5descr_cdset( /input/physics/phiedge, total enclosed toroidal flux ) +subroutine HWRITERV_LO(group_id, name, num_data, data, dset_id) + integer(hid_t), intent(in) :: group_id + character(len=*), intent(in) :: name + integer, intent(in) :: num_data + real(wp), dimension(:), intent(in) :: data + integer(hid_t), intent(out) :: dset_id !< default dataset ID used in macros -#ifdef DEBUG - if( Wmacros ) write(ounit,'("macros : ", 10x ," : myid=",i3," ; writing $3 ;")') myid -#endif + integer :: hdfier !< error flag for HDF5 library + logical :: var_exists !< flags used to signal if a variable already exists - rank = 1 ; onedims(1) = $2 + integer(hsize_t) :: onedims(1) !< dimension specifier for one-dimensional data used in macros + integer(hid_t) :: space_id !< default dataspace ID used in macros - if( $2.le.0 ) then + onedims(1) = num_data + if( num_data.le.0 ) then write(6,'("sphdf5 : "10x" : error calling hwriterv ; $3 : $2.le.0 at $5:$6 ;")') - else - call h5screate_simple_f( rank, onedims, space_id, hdfier ) + call h5screate_simple_f( 1, onedims, space_id, hdfier ) if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from hwriterv_lo at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5screate_simple_f from hwriterv_lo at $5:$6 ;" + write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from hwriterv at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1 ) + stop "sphdf5 : error calling h5screate_simple_f from hwriterv at $5:$6 ;" endif ! temporarily disable error printing to not confuse users call h5eset_auto_f(0, hdfier) if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriterv_lo at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5eset_auto_f from hwriterv_lo at $5:$6 ;" + write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriterv at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1 ) + stop "sphdf5 : error calling h5eset_auto_f from hwriterv at $5:$6 ;" endif ! check if dataset can be opened - call h5dopen_f($1, "$3", dset_id, hdfier) + call h5dopen_f(group_id, name, dset_id, hdfier) if (hdfier.lt.0) then var_exists = .false. if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $3 does not exist yet, creating it" @@ -572,51 +721,56 @@ ! re-establish previous state of error printing to be sensitive to "real" errors call h5eset_auto_f(internalHdf5Msg, hdfier) if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriterv_lo at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5eset_auto_f from hwriterv_lo at $5:$6 ;" + write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriterv at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1 ) + stop "sphdf5 : error calling h5eset_auto_f from hwriterv at $5:$6 ;" endif ! if the dataset does not exist already, create it. Otherwise, it should be open already if (.not.var_exists) then - call h5dcreate_f( $1, "$3", H5T_NATIVE_DOUBLE, space_id, dset_id, hdfier ) + call h5dcreate_f(group_id, name, H5T_NATIVE_DOUBLE, space_id, dset_id, hdfier ) if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5dcreate_f from hwriterv_lo at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5dcreate_f from hwriterv_lo at $5:$6 ;" + write(6,'("sphdf5 : "10x" : error calling h5dcreate_f from hwriterv at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1 ) + stop "sphdf5 : error calling h5dcreate_f from hwriterv at $5:$6 ;" endif endif - call h5dwrite_f( dset_id, H5T_NATIVE_DOUBLE, $4, onedims, hdfier ) + call h5dwrite_f( dset_id, H5T_NATIVE_DOUBLE, data, onedims, hdfier ) if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5dwrite_f from hwriterv_lo at $5:$6 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5dwrite_f from hwriterv_lo at $5:$6 ;" + write(6,'("sphdf5 : "10x" : error calling h5dwrite_f from hwriterv at $5:$6 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1 ) + stop "sphdf5 : error calling h5dwrite_f from hwriterv at $5:$6 ;" endif endif +end subroutine ! HWRITERV_LO - ! macro expansion of hwriterv_lo; end;})m4_dnl -m4_define(HWRITERA,{! macro expansion of hwritea; ! write real array _5 (_2 rows, _3 columns) into a dataset named _4 into group _1; _6 and _7 should be __FILE__ and __LINE__ ! example: hwritera( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Rbc, Rbc(-Ntor:Ntor,-Mpol:Mpol) ) +subroutine HWRITERA(group_id, name, num_rows, num_cols, data) + integer(hid_t), intent(in) :: group_id + character(len=*), intent(in) :: name + integer, intent(in) :: num_rows, num_cols + real(wp), dimension(:,:), intent(in) :: data -#ifdef DEBUG - if( Wmacros ) write(ounit,'("macros : ", 10x ," : myid=",i3," ; writing $4 ;")') myid -#endif + integer :: hdfier !< error flag for HDF5 library + logical :: var_exists !< flags used to signal if a variable already exists - rank = 2 ; twodims(1:2) = (/ $2, $3 /) + integer(hsize_t) :: twodims(2) !< dimension specifier for two-dimensional data used in macros + integer(hid_t) :: space_id !< default dataspace ID used in macros + integer(hid_t) :: dset_id !< default dataset ID used in macros - if( $2.le.0 .or. $3.le.0 ) then + twodims(1:2) = (/ num_rows, num_cols /) + if(num_rows .le. 0 .or. num_cols .le. 0) then write(6,'("sphdf5 : "10x" : error calling hwritera ; $4 : $2.le.0 .or. $3.le.0 at $6:$7 ;")') - else - call h5screate_simple_f( rank, twodims, space_id, hdfier ) + call h5screate_simple_f( 2, twodims, space_id, hdfier ) if( hdfier.ne.0 ) then write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from hwritera at $6:$7 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + call MPI_ABORT( MPI_COMM_SPEC, 1 ) stop "sphdf5 : error calling h5screate_simple_f from hwritera at $6:$7 ;" endif @@ -624,12 +778,12 @@ call h5eset_auto_f(0, hdfier) if( hdfier.ne.0 ) then write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwritera at $6:$7 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + call MPI_ABORT( MPI_COMM_SPEC, 1 ) stop "sphdf5 : error calling h5eset_auto_f from hwritera at $6:$7 ;" endif ! check if dataset can be opened - call h5dopen_f($1, "$4", dset_id, hdfier) + call h5dopen_f(group_id, name, dset_id, hdfier) if (hdfier.lt.0) then var_exists = .false. if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $4 does not exist yet, creating it" @@ -644,71 +798,76 @@ call h5eset_auto_f(internalHdf5Msg, hdfier) if( hdfier.ne.0 ) then write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwritera at $6:$7 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + call MPI_ABORT( MPI_COMM_SPEC, 1 ) stop "sphdf5 : error calling h5eset_auto_f from hwritera at $6:$7 ;" endif ! if the dataset does not exist already, create it. Otherwise, it should be open already if (.not.var_exists) then - call h5dcreate_f( $1, "$4", H5T_NATIVE_DOUBLE, space_id, dset_id, hdfier ) + call h5dcreate_f(group_id, name, H5T_NATIVE_DOUBLE, space_id, dset_id, hdfier ) if( hdfier.ne.0 ) then write(6,'("sphdf5 : "10x" : error calling h5dcreate_f from hwritera at $6:$7 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + call MPI_ABORT( MPI_COMM_SPEC, 1 ) stop "sphdf5 : error calling h5dcreate_f from hwritera at $6:$7 ;" endif endif - call h5dwrite_f( dset_id, H5T_NATIVE_DOUBLE, $5, twodims, hdfier ) + call h5dwrite_f( dset_id, H5T_NATIVE_DOUBLE, data, twodims, hdfier ) if( hdfier.ne.0 ) then write(6,'("sphdf5 : "10x" : error calling h5dwrite_f from hwritera at $6:$7 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + call MPI_ABORT( MPI_COMM_SPEC, 1 ) stop "sphdf5 : error calling h5dwrite_f from hwritera at $6:$7 ;" endif call h5dclose_f(dset_id, hdfier) ! terminate dataset; if( hdfier.ne.0 ) then write(6,'("sphdf5 : "10x" : error calling h5dclose_f from hwritera at $6:$7 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + call MPI_ABORT( MPI_COMM_SPEC, 1 ) stop "sphdf5 : error calling h5dclose_f from hwritera at $6:$7 ;" endif endif +end subroutine ! HWRITERA - ! macro expansion of hwritea; end;})m4_dnl -m4_define(HWRITERA_LO,{! macro expansion of hwritea_lo; ! write real array _5 (_2 rows, _3 columns) into a dataset named _4 into group _1 and leave it open, e.g. for adding an attribute; _6 and _7 should be __FILE__ and __LINE__ ! example: hwritera( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Rbc, Rbc(-Ntor:Ntor,-Mpol:Mpol) ) ! and close it then via h5descr_cdset( /input/physics/Rbc, boundary R cosine Fourier coefficients ) +subroutine HWRITERA_LO(group_id, name, num_rows, num_cols, data, dset_id) + integer(hid_t), intent(in) :: group_id + character(len=*), intent(in) :: name + integer, intent(in) :: num_rows, num_cols + real(wp), dimension(:,:), intent(in) :: data + integer(hid_t), intent(out) :: dset_id !< default dataset ID used in macros -#ifdef DEBUG - if( Wmacros ) write(ounit,'("macros : ", 10x ," : myid=",i3," ; writing $4 ;")') myid -#endif + integer :: hdfier !< error flag for HDF5 library + logical :: var_exists !< flags used to signal if a variable already exists - rank = 2 ; twodims(1:2) = (/ $2, $3 /) + integer(hsize_t) :: twodims(2) !< dimension specifier for two-dimensional data used in macros + integer(hid_t) :: space_id !< default dataspace ID used in macros - if( $2.le.0 .or. $3.le.0 ) then + twodims(1:2) = (/ num_rows, num_cols /) + if(num_rows .le. 0 .or. num_cols .le. 0) then write(6,'("sphdf5 : "10x" : error calling hwritera ; $4 : $2.le.0 .or. $3.le.0 at $6:$7 ;")') - else - call h5screate_simple_f( rank, twodims, space_id, hdfier ) + call h5screate_simple_f( 2, twodims, space_id, hdfier ) if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from hwritera_lo at $6:$7 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5screate_simple_f from hwritera_lo at $6:$7 ;" + write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from hwritera at $6:$7 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1 ) + stop "sphdf5 : error calling h5screate_simple_f from hwritera at $6:$7 ;" endif ! temporarily disable error printing to not confuse users call h5eset_auto_f(0, hdfier) if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwritera_lo at $6:$7 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5eset_auto_f from hwritera_lo at $6:$7 ;" + write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwritera at $6:$7 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1 ) + stop "sphdf5 : error calling h5eset_auto_f from hwritera at $6:$7 ;" endif ! check if dataset can be opened - call h5dopen_f($1, "$4", dset_id, hdfier) + call h5dopen_f(group_id, name, dset_id, hdfier) if (hdfier.lt.0) then var_exists = .false. if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $4 does not exist yet, creating it" @@ -722,51 +881,58 @@ ! re-establish previous state of error printing to be sensitive to "real" errors call h5eset_auto_f(internalHdf5Msg, hdfier) if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwritera_lo at $6:$7 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5eset_auto_f from hwritera_lo at $6:$7 ;" + write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwritera at $6:$7 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1 ) + stop "sphdf5 : error calling h5eset_auto_f from hwritera at $6:$7 ;" endif ! if the dataset does not exist already, create it. Otherwise, it should be open already if (.not.var_exists) then - call h5dcreate_f( $1, "$4", H5T_NATIVE_DOUBLE, space_id, dset_id, hdfier ) + call h5dcreate_f(group_id, name, H5T_NATIVE_DOUBLE, space_id, dset_id, hdfier ) if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5dcreate_f from hwritera_lo at $6:$7 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5dcreate_f from hwritera_lo at $6:$7 ;" + write(6,'("sphdf5 : "10x" : error calling h5dcreate_f from hwritera at $6:$7 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1 ) + stop "sphdf5 : error calling h5dcreate_f from hwritera at $6:$7 ;" endif endif - call h5dwrite_f( dset_id, H5T_NATIVE_DOUBLE, $5, twodims, hdfier ) + call h5dwrite_f( dset_id, H5T_NATIVE_DOUBLE, data, twodims, hdfier ) if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5dwrite_f from hwritera_lo at $6:$7 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5dwrite_f from hwritera_lo at $6:$7 ;" + write(6,'("sphdf5 : "10x" : error calling h5dwrite_f from hwritera at $6:$7 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1 ) + stop "sphdf5 : error calling h5dwrite_f from hwritera at $6:$7 ;" endif endif +end subroutine ! HWRITERA_LO - ! macro expansion of hwritea_lo; end;})m4_dnl -m4_define(HWRITERC,{! macro expansion of hwriterc; ! write real cube _6 (_2 rows, _3 columns, _4 pages) into a dataset named _5 into group _1; _7 and _8 should containt __FILE__ and __LINE__ ! example: hwriterc( grpOutput, (Mrad+1), 2, 2, TT, TT(0:Mrad,0:1,0:1) ) +subroutine HWRITERC(group_id, name, num_rows, num_cols, num_pages, data) + integer(hid_t), intent(in) :: group_id + character(len=*), intent(in) :: name + integer, intent(in) :: num_rows, num_cols, num_pages + real(wp), dimension(:,:,:), intent(in) :: data + + integer :: hdfier !< error flag for HDF5 library + logical :: var_exists !< flags used to signal if a variable already exists -#ifdef DEBUG - if( Wmacros ) write(ounit,'("macros : ", 10x ," : myid=",i3," ; writing $5 ;")') myid -#endif + integer(hsize_t) :: threedims(3) !< dimension specifier for three-dimensional data used in macros + integer(hid_t) :: space_id !< default dataspace ID used in macros + integer(hid_t) :: dset_id !< default dataset ID used in macros - rank = 3 ; threedims(1:3) = (/ $2, $3, $4 /) + threedims(1:3) = (/ num_rows, num_cols, num_pages /) - if( $2.le.0 .or. $3.le.0 .or. $4.le.0 ) then + if(num_rows.le.0 .or. num_cols.le.0 .or. num_pages.le.0 ) then write(6,'("sphdf5 : "10x" : error calling hwriterc ; $5 : $2.le.0 .or. $3.le.0 .or. $4.le.0 at $7:$8 ;")') else - call h5screate_simple_f( rank, threedims, space_id, hdfier ) + call h5screate_simple_f( 3, threedims, space_id, hdfier ) if( hdfier.ne.0 ) then write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from hwriterc at $7:$8 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + call MPI_ABORT( MPI_COMM_SPEC, 1 ) stop "sphdf5 : error calling h5screate_simple_f from hwriterc at $7:$8 ;" endif @@ -774,12 +940,12 @@ call h5eset_auto_f(0, hdfier) if( hdfier.ne.0 ) then write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriterc at $7:$8 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + call MPI_ABORT( MPI_COMM_SPEC, 1 ) stop "sphdf5 : error calling h5eset_auto_f from hwriterc at $7:$8 ;" endif ! check if dataset can be opened - call h5dopen_f($1, "$5", dset_id, hdfier) + call h5dopen_f(group_id, name, dset_id, hdfier) if (hdfier.lt.0) then var_exists = .false. if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $5 does not exist yet, creating it" @@ -794,71 +960,78 @@ call h5eset_auto_f(internalHdf5Msg, hdfier) if( hdfier.ne.0 ) then write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriterc at $7:$8 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + call MPI_ABORT( MPI_COMM_SPEC, 1 ) stop "sphdf5 : error calling h5eset_auto_f from hwriterc at $7:$8 ;" endif ! if the dataset does not exist already, create it. Otherwise, it should be open already if (.not.var_exists) then - call h5dcreate_f( $1, "$5", H5T_NATIVE_DOUBLE, space_id, dset_id, hdfier ) + call h5dcreate_f(group_id, name, H5T_NATIVE_DOUBLE, space_id, dset_id, hdfier ) if( hdfier.ne.0 ) then write(6,'("sphdf5 : "10x" : error calling h5dcreate_f from hwriterc at $7:$8 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + call MPI_ABORT( MPI_COMM_SPEC, 1 ) stop "sphdf5 : error calling h5dcreate_f from hwriterc at $7:$8 ;" endif endif - call h5dwrite_f( dset_id, H5T_NATIVE_DOUBLE, $6, threedims, hdfier ) + call h5dwrite_f( dset_id, H5T_NATIVE_DOUBLE, data, threedims, hdfier ) if( hdfier.ne.0 ) then write(6,'("sphdf5 : "10x" : error calling h5dwrite_f from hwriterc at $7:$8 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + call MPI_ABORT( MPI_COMM_SPEC, 1 ) stop "sphdf5 : error calling h5dwrite_f from hwriterc at $7:$8 ;" endif call h5dclose_f(dset_id, hdfier) ! terminate dataset; if( hdfier.ne.0 ) then write(6,'("sphdf5 : "10x" : error calling h5dclose_f from hwriterc at $7:$8 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) + call MPI_ABORT( MPI_COMM_SPEC, 1 ) stop "sphdf5 : error calling h5dclose_f from hwriterc at $7:$8 ;" endif endif +end subroutine ! HWRITERC - ! macro expansion of hwriterc; end;})m4_dnl -m4_define(HWRITERC_LO,{! macro expansion of hwriterc_lo; ! write real cube _6 (_2 rows, _3 columns, _4 pages) into a dataset named _5 into group _1 and leave open for e.g. adding an attribute; _7 and _8 should be __FILE__ and __LINE__ ! example: hwriterc( grpOutput, (Mrad+1), 2, 2, TT, TT(0:Mrad,0:1,0:1) ) ! and close it with h5descr_cdset( /output/TT, something abbreviated by TT ) +subroutine HWRITERC_LO(group_id, name, num_rows, num_cols, num_pages, data, dset_id) + integer(hid_t), intent(in) :: group_id + character(len=*), intent(in) :: name + integer, intent(in) :: num_rows, num_cols, num_pages + real(wp), dimension(:,:,:), intent(in) :: data + integer(hid_t), intent(out) :: dset_id !< default dataset ID used in macros -#ifdef DEBUG - if( Wmacros ) write(ounit,'("macros : ", 10x ," : myid=",i3," ; writing $5 ;")') myid -#endif + integer :: hdfier !< error flag for HDF5 library + logical :: var_exists !< flags used to signal if a variable already exists - rank = 3 ; threedims(1:3) = (/ $2, $3, $4 /) + integer(hsize_t) :: threedims(3) !< dimension specifier for three-dimensional data used in macros + integer(hid_t) :: space_id !< default dataspace ID used in macros - if( $2.le.0 .or. $3.le.0 .or. $4.le.0 ) then + threedims(1:3) = (/ num_rows, num_cols, num_pages /) + + if(num_rows.le.0 .or. num_cols.le.0 .or. num_pages.le.0 ) then write(6,'("sphdf5 : "10x" : error calling hwriterc ; $5 : $2.le.0 .or. $3.le.0 .or. $4.le.0 at $7:$8 ;")') else - call h5screate_simple_f( rank, threedims, space_id, hdfier ) + call h5screate_simple_f( 3, threedims, space_id, hdfier ) if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from hwriterc_lo at $7:$8 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5screate_simple_f from hwriterc_lo at $7:$8 ;" + write(6,'("sphdf5 : "10x" : error calling h5screate_simple_f from hwriterc at $7:$8 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1 ) + stop "sphdf5 : error calling h5screate_simple_f from hwriterc at $7:$8 ;" endif ! temporarily disable error printing to not confuse users call h5eset_auto_f(0, hdfier) if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriterc_lo at $7:$8 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5eset_auto_f from hwriterc_lo at $7:$8 ;" + write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriterc at $7:$8 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1 ) + stop "sphdf5 : error calling h5eset_auto_f from hwriterc at $7:$8 ;" endif ! check if dataset can be opened - call h5dopen_f($1, "$5", dset_id, hdfier) + call h5dopen_f(group_id, name, dset_id, hdfier) if (hdfier.lt.0) then var_exists = .false. if (hdfDebug .and. myid.eq.0) then ; write(*,*) "dataset $5 does not exist yet, creating it" @@ -872,41 +1045,29 @@ ! re-establish previous state of error printing to be sensitive to "real" errors call h5eset_auto_f(internalHdf5Msg, hdfier) if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriterc_lo at $7:$8 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5eset_auto_f from hwriterc_lo at $7:$8 ;" + write(6,'("sphdf5 : "10x" : error calling h5eset_auto_f from hwriterc at $7:$8 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1 ) + stop "sphdf5 : error calling h5eset_auto_f from hwriterc at $7:$8 ;" endif ! if the dataset does not exist already, create it. Otherwise, it should be open already if (.not.var_exists) then - call h5dcreate_f( $1, "$5", H5T_NATIVE_DOUBLE, space_id, dset_id, hdfier ) + call h5dcreate_f(group_id, name, H5T_NATIVE_DOUBLE, space_id, dset_id, hdfier ) if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5dcreate_f from hwriterc_lo at $7:$8 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5dcreate_f from hwriterc_lo at $7:$8 ;" + write(6,'("sphdf5 : "10x" : error calling h5dcreate_f from hwriterc at $7:$8 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1 ) + stop "sphdf5 : error calling h5dcreate_f from hwriterc at $7:$8 ;" endif endif - call h5dwrite_f( dset_id, H5T_NATIVE_DOUBLE, $6, threedims, hdfier ) + call h5dwrite_f( dset_id, H5T_NATIVE_DOUBLE, data, threedims, hdfier ) if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling h5dwrite_f from hwriterc_lo at $7:$8 ;")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5dwrite_f from hwriterc_lo at $7:$8 ;" + write(6,'("sphdf5 : "10x" : error calling h5dwrite_f from hwriterc at $7:$8 ;")') + call MPI_ABORT( MPI_COMM_SPEC, 1 ) + stop "sphdf5 : error calling h5dwrite_f from hwriterc at $7:$8 ;" endif endif +end subroutine ! HWRITERC_LO - ! macro expansion of hwriterc_lo; end;})m4_dnl -m4_define(H5CALL,{! macro expansion of h5call; -! wrapper for HDF5 API calls which checks the hdfier error flag after each call -! and interrupts execution of the program right away if anything goes wrong -! call _2 with arguments _3 from within _1 and write wall time needed for call to screen; _4 and _5 should be __FILE__ and __LINE__ - - call $2$3 - if( hdfier.ne.0 ) then - write(6,'("sphdf5 : "10x" : error calling $2 in process ",i3," from h5call at $4:$5;")') myid - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling $2 from h5call at $4:$5 ;" - endif - - ! macro expansion of h5call; end;})m4_dnl +end module ! h5utils diff --git a/src/macros b/src/macros deleted file mode 100644 index 8d090b58..00000000 --- a/src/macros +++ /dev/null @@ -1,110 +0,0 @@ -m4_changequote({,})m4_dnl -m4_changecom(!)m4_dnl -m4_define(INTEGER,integer)m4_dnl -m4_define(REAL,real(wp))m4_dnl -m4_define(CHARACTER,character)m4_dnl -m4_define(GETTIME,MPI_WTIME())m4_dnl -m4_define(MPISTART,{ - myid = 0 ; ncpu = 1 - call MPI_INIT( ierr ) - call MPI_COMM_RANK( MPI_COMM_WORLD, myid, ierr ) - call MPI_COMM_SIZE( MPI_COMM_WORLD, ncpu, ierr ) -})m4_dnl -m4_define(MPIFINALIZE,{ - call MPI_FINALIZE(ierr) -})m4_dnl -m4_define(LOCALS,{ -#ifdef OPENMP - USE OMP_LIB -#endif - use mpi - implicit none - INTEGER :: ierr, astat, ios, nthreads, ithread - REAL :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; -})m4_dnl -m4_define(GETTHREAD,{ -#ifdef OPENMP - ithread = omp_get_thread_num() + 1 -#else - ithread = 1 -#endif -})m4_dnl -m4_define(SALLOCATE,{ - allocate( $1$2, stat=astat ) - $1$2 = $3 -})m4_dnl -m4_define(NALLOCATE,{ - allocate($1$2,stat=astat) -})m4_dnl -m4_define(DALLOCATE,{ - deallocate($1,stat=astat) -})m4_dnl -m4_define(FATAL,{ - if( $2 ) then - write(6,'("$1 : fatal : myid=",i3," ; $2 ; $3;")') myid - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "$1 : $2 : $3 ;" - endif -})m4_dnl -m4_define(LlBCAST,{ - call MPI_BCAST($1,$2,MPI_LOGICAL,$3,MPI_COMM_SPEC,ierr) -})m4_dnl -m4_define(IlBCAST,{ - call MPI_BCAST( $1, $2, MPI_INTEGER, $3, MPI_COMM_SPEC, ierr ) -})m4_dnl -m4_define(RlBCAST,{ - call MPI_BCAST($1,$2,MPI_DOUBLE_PRECISION,$3,MPI_COMM_SPEC,ierr) -})m4_dnl -m4_define(ClBCAST,{ - call MPI_BCAST($1,$2,MPI_CHARACTER,$3,MPI_COMM_SPEC,ierr) -})m4_dnl -m4_define(CALL,{ - cput = MPI_WTIME() - T$1 = T$1 + ( cput-cpuo ) - call $2$3 - cpuo = MPI_WTIME() -})m4_dnl -m4_define(WCALL,{ - cput = MPI_WTIME() - T$1 = T$1 + ( cput-cpuo ) - call $2$3 - cpuo = MPI_WTIME() -})m4_dnl -m4_define(BEGIN,{ - cpui = MPI_WTIME() - cpuo = cpui -#ifdef OPENMP - nthreads = omp_get_max_threads() -#else - nthreads = 1 -#endif -})m4_dnl -m4_define(LREGION,{ - if( Igeometry.eq.1 .or. $1.gt.1 ) then ; Lcoordinatesingularity = .false. - else ; Lcoordinatesingularity = .true. - endif - - if( $1.le.Nvol ) then ; Lplasmaregion = .true. - else ; Lplasmaregion = .false. - endif - - Lvacuumregion = .not.Lplasmaregion -})m4_dnl -m4_define(RETURN,{ -9999 continue - cput = MPI_WTIME() - T$1 = T$1 + ( cput-cpuo ) - return -})m4_dnl -m4_define(SUMTIME,{ - call MPI_REDUCE(T$1, $1T, 1, MPI_DOUBLE_PRECISION, MPI_SUM, 0, MPI_COMM_SPEC, ierr ) -})m4_dnl -m4_define(PRTTIME,{ - write(ounit,'("finish : ",f10.2," : time spent in $1 =",f10.2," ;")') cput-cpus, $1T ; Ttotal = Ttotal + $1T -})m4_dnl -m4_define(TMPOUT,{ - if( myid .eq. 0) write(ounit,*) "### DEBUG : $1 = ", $1 -})m4_dnl -m4_define(MPIOUT,{ - write(ounit,*) "*** DEBUG : myid = ", myid, " ; $1 = ", $1 -})m4_dnl diff --git a/src/sphdf5.F90 b/src/sphdf5.F90 index 041f274d..4595ba06 100644 --- a/src/sphdf5.F90 +++ b/src/sphdf5.F90 @@ -12,28 +12,24 @@ !> \ingroup grp_output module sphdf5 use mod_kinds, only: wp => dp - use inputlist , only : Wsphdf5, Wmacros - use fileunits , only : ounit - use cputiming , only : Tsphdf5 - use allglobal , only : myid, cpus, MPI_COMM_SPEC, ext, skip_write - use constants , only : version + use fileunits, only: ounit + use allglobal, only: myid, cpus, MPI_COMM_SPEC, ext, skip_write + use constants, only: version use hdf5 + use h5utils implicit none - logical, parameter :: hdfDebug = .false. !< global flag to enable verbal diarrhea commenting HDF5 operations - integer, parameter :: internalHdf5Msg = 0 !< 1: print internal HDF5 error messages; 0: only error messages from sphdf5 - ! integer :: hdfier !< error flag for HDF5 library - integer :: rank !< rank of data to write using macros +! integer :: rank !< rank of data to write using macros integer(hid_t) :: file_id !< default file ID used in macros - integer(hid_t) :: space_id !< default dataspace ID used in macros - integer(hid_t) :: dset_id !< default dataset ID used in macros - integer(hsize_t) :: onedims(1:1) !< dimension specifier for one-dimensional data used in macros - integer(hsize_t) :: twodims(1:2) !< dimension specifier for two-dimensional data used in macros - integer(hsize_t) :: threedims(1:3) !< dimension specifier for three-dimensional data used in macros +! integer(hid_t) :: space_id !< default dataspace ID used in macros +! integer(hid_t) :: dset_id !< default dataset ID used in macros +! integer(hsize_t) :: onedims(1:1) !< dimension specifier for one-dimensional data used in macros +! integer(hsize_t) :: twodims(1:2) !< dimension specifier for two-dimensional data used in macros +! integer(hsize_t) :: threedims(1:3) !< dimension specifier for three-dimensional data used in macros ! logical :: grp_exists !< flags used to signal if a group already exists - logical :: var_exists !< flags used to signal if a variable already exists +! logical :: var_exists !< flags used to signal if a variable already exists integer(hid_t) :: iteration_dset_id !< Dataset identifier for "iteration" integer(hid_t) :: dataspace !< dataspace for extension by 1 iteration object @@ -78,19 +74,6 @@ module sphdf5 integer(HID_T) :: memspace_diotadxup !< Dataspace identifier in memory for diotadxup integer(HID_T) :: memspace_fiota !< Dataspace identifier in memory for fiota - - character(LEN=15), parameter :: aname = "description" !< Attribute name for descriptive info - - integer(HID_T) :: attr_id !< Attribute identifier - integer(HID_T) :: aspace_id !< Attribute Dataspace identifier - integer(HID_T) :: atype_id !< Attribute Datatype identifier - - integer, parameter :: arank = 1 !< Attribure rank - integer(HSIZE_T), dimension(arank) :: adims = (/1/) !< Attribute dimension - - integer(SIZE_T) :: attrlen !< Length of the attribute string - character(len=:), allocatable :: attr_data !< Attribute data - private public init_outfile, & mirror_input_to_outfile, & @@ -107,99 +90,31 @@ module sphdf5 contains -!> Define a HDF5 group or opens it if it already exists. -!> -!> @param file_id file in which to define the group -!> @param name name of the new group -!> @param group_id id of the newly-created group -subroutine HDEFGRP(file_id, name, group_id) - integer(hid_t), intent(in) :: file_id - character(len=*), intent(in) :: name - integer(hid_t), intent(out) :: group_id - - logical :: grp_exists !< flags used to signal if a group already exists - integer :: hdfier !< error flag for HDF5 library - - call h5lexists_f(file_id, name, grp_exists, hdfier) - - if (grp_exists) then - ! if the group already exists, open it - call h5gopen_f(file_id, name, group_id, hdfier) - if (hdfier .ne. 0) then - write(6, '("sphdf5 : "10x" : error calling h5gopen_f from hdefgrp")') - call MPI_ABORT(MPI_COMM_SPEC, 1, ierr) - stop "sphdf5 : error calling h5gopen_f from hdefgrp" - endif - else - ! if group does not exist, create it - call h5gcreate_f(file_id, name, group_id, hdfier) - if (hdfier .ne. 0) then - write(6, '("sphdf5 : "10x" : error calling h5gcreate_f from hdefgrp")') - call MPI_ABORT(MPI_COMM_SPEC, 1, ierr) - stop "sphdf5 : error calling h5gcreate_f from hdefgrp" - endif - endif -end subroutine ! HDEFGRP - -!> Close a HDF5 group. -!> -!> @param group_id HDF5 group to close -subroutine HCLOSEGRP(group_id) - integer(hid_t), intent(in) :: group_id - - integer :: hdfier !< error flag for HDF5 library - - call h5gclose_f(group_id, hdfier) - if (hdfier .ne. 0) then - write(6, '("sphdf5 : "10x" : error calling h5gclose_f from hclosegrp")') - call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) - stop "sphdf5 : error calling h5gclose_f from hclosegrp" - endif -end subroutine ! HCLOSEGRP - - - !> \brief Initialize the interface to the HDF5 library and open the output file. !> \ingroup grp_output !> subroutine init_outfile() + integer :: hdfier !< error flag for HDF5 library + integer(hid_t) :: dset_id -#ifdef OPENMP - USE OMP_LIB -#endif - use mpi - implicit none - integer :: ierr, astat, ios, nthreads, ithread - real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; - - cpui = MPI_WTIME() - cpuo = cpui -#ifdef OPENMP - nthreads = omp_get_max_threads() -#else - nthreads = 1 -#endif - - if (myid.eq.0 .and. .not.skip_write) then - - ! initialize Fortran interface to the HDF5 library - call h5open_f(hdfier) - - ! (en/dis)able HDF5 internal error messages; - ! sphdf5 has its own error messages coming from the macros - call h5eset_auto_f(internalHdf5Msg, hdfier) + if (myid .eq. 0 .and. .not. skip_write) then - ! Create the file - call h5fcreate_f(trim(ext)//".sp.h5", H5F_ACC_TRUNC_F, file_id, hdfier ) + ! initialize Fortran interface to the HDF5 library + call h5open_f(hdfier) - ! write version number + ! (en/dis)able HDF5 internal error messages; + ! sphdf5 has its own error messages coming from the macros + call h5eset_auto_f(internalHdf5Msg, hdfier) - call HWRITERV_LO(file_id, 1, "version", (/ version /)) - call H5DESCR_CDSET("/version", "version of SPEC") + ! Create the file + call h5fcreate_f(trim(ext)//".sp.h5", H5F_ACC_TRUNC_F, file_id, hdfier ) - endif ! myid.eq.0 + ! write version number + call HWRITERV_LO(file_id, "version", 1, (/ version /), dset_id) + call H5DESCR_CDSET(dset_id, "version of SPEC") -end subroutine init_outfile + endif ! myid.eq.0 +end subroutine ! init_outfile !> \brief Mirror input variables into output file. !> \ingroup grp_output @@ -210,270 +125,252 @@ end subroutine init_outfile subroutine mirror_input_to_outfile use inputlist - use allglobal , only : Mvol - - -#ifdef OPENMP - USE OMP_LIB -#endif - use mpi - implicit none - integer :: ierr, astat, ios, nthreads, ithread - real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; - + use allglobal , only : myid, Mvol, skip_write + use h5utils + integer(hid_t) :: dset_id integer(hid_t) :: grpInput integer(hid_t) :: grpInputPhysics, grpInputNumerics, grpInputLocal, grpInputGlobal, grpInputDiagnostics - - cpui = MPI_WTIME() - cpuo = cpui -#ifdef OPENMP - nthreads = omp_get_max_threads() -#else - nthreads = 1 -#endif - - if (myid.eq.0 .and. .not.skip_write) then -! HDEFGRP( file_id, input, grpInput, __FILE__, __LINE__ ) -! H5DESCR( grpInput, /input, group for mirrored input data, __FILE__, __LINE__ ) -! -! ! the following variables constitute the namelist/physicslist/; note that all variables in namelist need to be broadcasted in readin; -! ! they go into ext.h5/input/physics -! -! ! the calls used here work as follows: -! ! step 1. HWRITEIV_LO e.g. write(s an) i(nteger) v(ariable) and l(eaves) o(pen) the dataset, so that in -! ! step 2a. an attribute with descr(iptive) information can be attached to the dataset and finally, in -! ! step 2b. the attribute is closed and also we c(lose the) d(ata)set. -! -! HDEFGRP( grpInput, physics, grpInputPhysics, __FILE__, __LINE__) -! H5DESCR( grpInputPhysics, /input/physics, physics inputs, __FILE__, __LINE__) -! -! HWRITEIV_LO( grpInputPhysics, 1, Igeometry , (/ Igeometry /), __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/Igeometry, geometry identifier, __FILE__, __LINE__) -! HWRITEIV_LO( grpInputPhysics, 1, Istellsym , (/ Istellsym /), __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/Istellsym, stellarator symmetry flag, __FILE__, __LINE__) -! HWRITEIV_LO( grpInputPhysics, 1, Lfreebound , (/ Lfreebound /), __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/Lfreebound, free boundary flag, __FILE__, __LINE__) -! HWRITERV_LO( grpInputPhysics, 1, phiedge , (/ phiedge /), __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/phiedge, total enclosed toroidal magnetic flux, __FILE__, __LINE__) -! HWRITERV_LO( grpInputPhysics, 1, curtor , (/ curtor /), __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/curtor, total enclosed toroidal current, __FILE__, __LINE__) -! HWRITERV_LO( grpInputPhysics, 1, curpol , (/ curpol /), __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/curpol, total enclosed poloidal current, __FILE__, __LINE__) -! HWRITERV_LO( grpInputPhysics, 1, gamma , (/ gamma /), __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/gamma, adiabatic index, __FILE__, __LINE__) -! HWRITEIV_LO( grpInputPhysics, 1, Nfp , (/ Nfp /), __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/Nfp, number of stellarator field periods, __FILE__, __LINE__) -! HWRITEIV_LO( grpInputPhysics, 1, Nvol , (/ Nvol /), __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/Nvol, number of volumes, __FILE__, __LINE__) -! HWRITEIV_LO( grpInputPhysics, 1, Mpol , (/ Mpol /), __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/Mpol, maximum poloidal mode number, __FILE__, __LINE__) -! HWRITEIV_LO( grpInputPhysics, 1, Ntor , (/ Ntor /), __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/Ntor, maximum toroidal mode number, __FILE__, __LINE__) -! HWRITEIV_LO( grpInputPhysics, Mvol, Lrad , Lrad(1:Mvol) , __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/Lrad, degree of radial Chebychev polynomials, __FILE__, __LINE__) -! HWRITEIV_LO( grpInputPhysics, 1, Lconstraint, (/ Lconstraint /), __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/Lconstraint, type of constraint to enforce, __FILE__, __LINE__) -! HWRITEIV_LO( grpInputPhysics, 1, Lreflect, (/ Lreflect /), __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/Lreflect, whether to reflect the perturbation on both boundaries for slab geometry __FILE__, __LINE__) -! HWRITERV_LO( grpInputPhysics, Mvol, tflux , tflux(1:Mvol) , __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/tflux, toroidal magnetic flux in volumes, __FILE__, __LINE__) -! HWRITERV_LO( grpInputPhysics, Mvol, pflux , pflux(1:Mvol) , __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/pflux, poloidal magnetic flux in volumes, __FILE__, __LINE__) -! HWRITERV_LO( grpInputPhysics, Nvol, helicity , helicity(1:Nvol) , __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/helicity, helicity profile, __FILE__, __LINE__) -! HWRITERV_LO( grpInputPhysics, 1, pscale , (/ pscale /), __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/pscale, scaling factor for pressure, __FILE__, __LINE__) -! HWRITERV_LO( grpInputPhysics, Nvol, pressure , pressure(1:Nvol) , __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/pressure, pressure profile, __FILE__, __LINE__) -! HWRITEIV_LO( grpInputPhysics, 1, Ladiabatic , (/ Ladiabatic /), __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/Ladiabatic, adiabatic flag, __FILE__, __LINE__) -! HWRITERV_LO( grpInputPhysics, Mvol, adiabatic , adiabatic(1:Nvol) , __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/adiabatic, adiabatic profile (?), __FILE__, __LINE__) -! HWRITERV_LO( grpInputPhysics, (1+Nvol), mu , mu(1:Mvol) , __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/mu, Beltrami parameter, parallel current profile, __FILE__, __LINE__) -! HWRITERV_LO( grpInputPhysics, (1+Nvol), Ivolume , Ivolume(1:Mvol) , __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/Ivolume, Volume current, externally driven, parallel current profile, __FILE__, __LINE__) -! HWRITERV_LO( grpInputPhysics, (Mvol ), Isurf , Isurf(1:Mvol ) , __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/mu, Surface current, currents that are not volume currents (pressure driven, shielding currents) , __FILE__, __LINE__) -! HWRITEIV_LO( grpInputPhysics, (1+Mvol), pl , pl(0:Nvol) , __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/pl, pl ?, __FILE__, __LINE__) -! HWRITEIV_LO( grpInputPhysics, (1+Mvol), ql , ql(0:Nvol) , __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/ql, ql ?, __FILE__, __LINE__) -! HWRITEIV_LO( grpInputPhysics, (1+Mvol), pr , pr(0:Nvol) , __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/pr, pr ?, __FILE__, __LINE__) -! HWRITEIV_LO( grpInputPhysics, (1+Mvol), qr , qr(0:Nvol) , __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/qr, qr ?, __FILE__, __LINE__) -! HWRITERV_LO( grpInputPhysics, (1+Nvol), iota , iota(0:Nvol) , __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/iota, rotational transform profile on inside of ideal interfaces, __FILE__, __LINE__) -! HWRITEIV_LO( grpInputPhysics, (1+Mvol), lp , lp(0:Nvol) , __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/lp, lp ?, __FILE__, __LINE__) -! HWRITEIV_LO( grpInputPhysics, (1+Mvol), lq , lq(0:Nvol) , __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/lq, lq ?, __FILE__, __LINE__) -! HWRITEIV_LO( grpInputPhysics, (1+Mvol), rp , rp(0:Nvol) , __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/rp, rp ?, __FILE__, __LINE__) -! HWRITEIV_LO( grpInputPhysics, (1+Mvol), rq , rq(0:Nvol) , __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/rq, rq ?, __FILE__, __LINE__) -! HWRITERV_LO( grpInputPhysics, (1+Nvol), oita , oita(0:Nvol) , __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/oita, rotational transform profile on outside of ideal interfaces, __FILE__, __LINE__) -! HWRITERV_LO( grpInputPhysics, 1, rtor , (/ rtor /), __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/rpol, for aspect ratio in slab, __FILE__, __LINE__) -! HWRITERV_LO( grpInputPhysics, 1, rpol , (/ rpol /), __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/rpol, for aspect ratio in slab, __FILE__, __LINE__) -! -! HWRITERV_LO( grpInputPhysics, (1+Ntor), Rac , Rac(0:Ntor) , __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/Rac, stellarator symmetric coordinate axis R cosine Fourier coefficients, __FILE__, __LINE__) -! HWRITERV_LO( grpInputPhysics, (1+Ntor), Zas , Zas(0:Ntor) , __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/Zas, stellarator symmetric coordinate axis Z sine Fourier coefficients, __FILE__, __LINE__) -! HWRITERV_LO( grpInputPhysics, (1+Ntor), Ras , Ras(0:Ntor) , __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/Ras, non-stellarator symmetric coordinate axis R sine Fourier coefficients, __FILE__, __LINE__) -! HWRITERV_LO( grpInputPhysics, (1+Ntor), Zac , Zac(0:Ntor) , __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/Zac, non-stellarator symmetric coordinate axis Z cosine Fourier coefficients, __FILE__, __LINE__) -! -! HWRITERA_LO( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Rbc, Rbc(-Ntor:Ntor,-Mpol:Mpol), __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/Rbc, stellarator symmetric boundary R cosine Fourier coefficients, __FILE__, __LINE__) -! HWRITERA_LO( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Zbs, Zbs(-Ntor:Ntor,-Mpol:Mpol), __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/Zbs, stellarator symmetric boundary Z sine Fourier coefficients, __FILE__, __LINE__) -! HWRITERA_LO( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Rbs, Rbs(-Ntor:Ntor,-Mpol:Mpol), __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/Rbs, non-stellarator symmetric boundary R sine Fourier coefficients, __FILE__, __LINE__) -! HWRITERA_LO( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Zbc, Zbc(-Ntor:Ntor,-Mpol:Mpol), __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/Zbc, non-stellarator symmetric boundary Z cosine Fourier coefficients, __FILE__, __LINE__) -! -! HWRITERA_LO( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Rwc, Rwc(-Ntor:Ntor,-Mpol:Mpol), __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/Rwc, stellarator symmetric boundary R cosine Fourier coefficients of wall, __FILE__, __LINE__) -! HWRITERA_LO( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Zws, Zws(-Ntor:Ntor,-Mpol:Mpol), __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/Zws, stellarator symmetric boundary Z sine Fourier coefficients of wall, __FILE__, __LINE__) -! HWRITERA_LO( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Rws, Rws(-Ntor:Ntor,-Mpol:Mpol), __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/Rws, non-stellarator symmetric boundary R sine Fourier coefficients of wall, __FILE__, __LINE__) -! HWRITERA_LO( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Zwc, Zwc(-Ntor:Ntor,-Mpol:Mpol), __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/Zwc, non-stellarator symmetric boundary Z cosine Fourier coefficients of wall, __FILE__, __LINE__) -! -! HWRITERA_LO( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Vns, Vns(-Ntor:Ntor,-Mpol:Mpol), __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/Vns, stellarator symmetric normal field sine Fourier coefficients at boundary; vacuum component, __FILE__, __LINE__) -! HWRITERA_LO( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Bns, Bns(-Ntor:Ntor,-Mpol:Mpol), __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/Bns, stellarator symmetric normal field sine Fourier coefficients at boundary; plasma component, __FILE__, __LINE__) -! HWRITERA_LO( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Vnc, Vnc(-Ntor:Ntor,-Mpol:Mpol), __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/Vnc, non-stellarator symmetric normal field cosine Fourier coefficients at boundary; vacuum component, __FILE__, __LINE__) -! HWRITERA_LO( grpInputPhysics, (2*Ntor+1), (2*Mpol+1), Bnc, Bnc(-Ntor:Ntor,-Mpol:Mpol), __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/Bnc, non-stellarator symmetric normal field cosine Fourier coefficients at boundary; plasma component, __FILE__, __LINE__) -! -! HWRITERV_LO( grpInputPhysics, 1, mupftol, (/ mupftol /), __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/mupftol, mupftol , __FILE__, __LINE__) -! HWRITEIV_LO( grpInputPhysics, 1, mupfits, (/ mupfits /), __FILE__, __LINE__) -! H5DESCR_CDSET( /input/physics/mupfits, mupfits , __FILE__, __LINE__) -! -! HCLOSEGRP( grpInputPhysics , __FILE__, __LINE__) -! -! !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! -! -! ! the following variables constitute the namelist/numericlist/; note that all variables in namelist need to be broadcasted in readin; -! ! they go into ext.h5/input/numerics -! -! HDEFGRP( grpInput, numerics, grpInputNumerics, __FILE__, __LINE__) -! -! HWRITEIV( grpInputNumerics, 1, Linitialize , (/ Linitialize /)) -! HWRITEIV( grpInputNumerics, 1, Lzerovac , (/ Lzerovac /)) -! HWRITEIV( grpInputNumerics, 1, Ndiscrete , (/ Ndiscrete /)) -! HWRITEIV( grpInputNumerics, 1, Nquad , (/ Nquad /)) -! HWRITEIV( grpInputNumerics, 1, iMpol , (/ iMpol /)) -! HWRITEIV( grpInputNumerics, 1, iNtor , (/ iNtor /)) -! HWRITEIV( grpInputNumerics, 1, Lsparse , (/ Lsparse /)) -! HWRITEIV( grpInputNumerics, 1, Lsvdiota , (/ Lsvdiota /)) -! HWRITEIV( grpInputNumerics, 1, imethod , (/ imethod /)) -! HWRITEIV( grpInputNumerics, 1, iorder , (/ iorder /)) -! HWRITEIV( grpInputNumerics, 1, iprecon , (/ iprecon /)) -! HWRITERV( grpInputNumerics, 1, iotatol , (/ iotatol /)) -! HWRITEIV( grpInputNumerics, 1, Lextrap , (/ Lextrap /)) -! HWRITEIV( grpInputNumerics, 1, Mregular , (/ Mregular /)) -! HWRITEIV( grpInputNumerics, 1, Lrzaxis , (/ Lrzaxis /)) -! HWRITEIV( grpInputNumerics, 1, Ntoraxis , (/ Ntoraxis /)) -! -! HCLOSEGRP( grpInputNumerics, __FILE__, __LINE__) -! -! !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! -! -! ! the following variables constitute the namelist/locallist/; note that all variables in namelist need to be broadcasted in readin; -! ! they go into ext.h5/input/local -! -! HDEFGRP( grpInput, local, grpInputLocal ) -! -! HWRITEIV( grpInputLocal, 1, LBeltrami , (/ LBeltrami /)) -! HWRITEIV( grpInputLocal, 1, Linitgues , (/ Linitgues /)) -! HWRITEIV( grpInputLocal, 1, Lposdef , (/ Lposdef /)) ! redundant; -! HWRITERV( grpInputLocal, 1, maxrndgues , (/ maxrndgues /)) -! HWRITEIV( grpInputLocal, 1, Lmatsolver , (/ Lmatsolver /)) -! HWRITEIV( grpInputLocal, 1, LGMRESprec , (/ LGMRESprec /)) -! HWRITERV( grpInputLocal, 1, epsGMRES , (/ epsGMRES /)) -! HWRITERV( grpInputLocal, 1, epsILU , (/ epsILU /)) -! -! HCLOSEGRP( grpInputLocal ) -! -! !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! -! -! ! the following variables constitute the namelist/globallist/; note that all variables in namelist need to be broadcasted in readin; -! ! they go into ext.h5/input/global -! -! HDEFGRP( grpInput, global, grpInputGlobal ) -! -! HWRITEIV( grpInputGlobal, 1, Lfindzero , (/ Lfindzero /)) -! HWRITERV( grpInputGlobal, 1, escale , (/ escale /)) -! HWRITERV( grpInputGlobal, 1, opsilon , (/ opsilon /)) -! HWRITERV( grpInputGlobal, 1, pcondense , (/ pcondense /)) -! HWRITERV( grpInputGlobal, 1, epsilon , (/ epsilon /)) -! HWRITERV( grpInputGlobal, 1, wpoloidal , (/ wpoloidal /)) -! HWRITERV( grpInputGlobal, 1, upsilon , (/ upsilon /)) -! HWRITERV( grpInputGlobal, 1, forcetol , (/ forcetol /)) -! HWRITERV( grpInputGlobal, 1, c05xmax , (/ c05xmax /)) -! HWRITERV( grpInputGlobal, 1, c05xtol , (/ c05xtol /)) -! HWRITERV( grpInputGlobal, 1, c05factor , (/ c05factor /)) -! HWRITELV( grpInputGlobal, 1, LreadGF , (/ LreadGF /)) -! HWRITEIV( grpInputGlobal, 1, mfreeits , (/ mfreeits /)) -! HWRITERV( grpInputGlobal, 1, bnstol , (/ bnstol /)) ! redundant; -! HWRITERV( grpInputGlobal, 1, bnsblend , (/ bnsblend /)) ! redundant; -! HWRITERV( grpInputGlobal, 1, gBntol , (/ gBntol /)) -! HWRITERV( grpInputGlobal, 1, gBnbld , (/ gBnbld /)) -! HWRITERV( grpInputGlobal, 1, vcasingeps , (/ vcasingeps /)) -! HWRITERV( grpInputGlobal, 1, vcasingtol , (/ vcasingtol /)) -! HWRITEIV( grpInputGlobal, 1, vcasingits , (/ vcasingits /)) -! HWRITEIV( grpInputGlobal, 1, vcasingper , (/ vcasingper /)) -! HWRITEIV( grpInputGlobal, 1, mcasingcal , (/ mcasingcal /)) ! redundant; -! -! HCLOSEGRP( grpInputGlobal ) -! -! !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! -! -! ! the following variables constitute the namelist/diagnosticslist/; note that all variables in namelist need to be broadcasted in readin; -! ! they go into ext.h5/input/diagnostics -! -! HDEFGRP( grpInput, diagnostics, grpInputDiagnostics ) -! -! HWRITERV( grpInputDiagnostics, 1, odetol , (/ odetol /)) -! HWRITERV( grpInputDiagnostics, 1, absreq , (/ absreq /)) ! redundant; -! HWRITERV( grpInputDiagnostics, 1, relreq , (/ relreq /)) ! redundant; -! HWRITERV( grpInputDiagnostics, 1, absacc , (/ absacc /)) ! redundant; -! HWRITERV( grpInputDiagnostics, 1, epsr , (/ epsr /)) ! redundant; -! HWRITEIV( grpInputDiagnostics, 1, nPpts , (/ nPpts /)) -! HWRITEIV( grpInputDiagnostics, 1, Ppts , (/ Ppts /)) -! HWRITEIV( grpInputDiagnostics, Mvol, nPtrj , nPtrj(1:Mvol) ) -! HWRITELV( grpInputDiagnostics, 1, LHevalues , (/ LHevalues /)) -! HWRITELV( grpInputDiagnostics, 1, LHevectors , (/ LHevectors /)) -! HWRITELV( grpInputDiagnostics, 1, LHmatrix , (/ LHmatrix /)) -! HWRITEIV( grpInputDiagnostics, 1, Lperturbed , (/ Lperturbed /)) -! HWRITEIV( grpInputDiagnostics, 1, dpp , (/ dpp /)) -! HWRITEIV( grpInputDiagnostics, 1, dqq , (/ dqq /)) -! HWRITEIV( grpInputDiagnostics, 1, Lcheck , (/ Lcheck /)) -! HWRITELV( grpInputDiagnostics, 1, Ltiming , (/ Ltiming /)) -! HWRITEIV( grpInputDiagnostics, 1, Lerrortype , (/ Lerrortype /)) -! HWRITEIV( grpInputDiagnostics, 1, Ngrid , (/ Ngrid /)) -! HWRITERV( grpInputDiagnostics, 1, fudge , (/ fudge /)) ! redundant; -! HWRITERV( grpInputDiagnostics, 1, scaling , (/ scaling /)) ! redundant; -! -! HCLOSEGRP( grpInputDiagnostics ) -! -! HCLOSEGRP( grpInput ) + call HDEFGRP( file_id, "input", grpInput ) + call H5DESCR( grpInput, "group for mirrored input data") + +! the following variables constitute the namelist/physicslist/; note that all variables in namelist need to be broadcasted in readin; +! they go into ext.h5/input/physics + + ! the calls used here work as follows: + ! step 1. HWRITEIV_LO e.g. write(s an) i(nteger) v(ariable) and l(eaves) o(pen) the dataset, so that in + ! step 2a. an attribute with descr(iptive) information can be attached to the dataset and finally, in + ! step 2b. the attribute is closed and also we c(lose the) d(ata)set. + + call HDEFGRP( grpInput, "physics", grpInputPhysics) + call H5DESCR( grpInputPhysics, "physics inputs") + + call HWRITEIV_LO( grpInputPhysics, "Igeometry" , 1, (/ Igeometry /), dset_id) + call H5DESCR_CDSET(dset_id, "geometry identifier") + call HWRITEIV_LO( grpInputPhysics, "Istellsym" , 1, (/ Istellsym /), dset_id) + call H5DESCR_CDSET( dset_id, "stellarator symmetry flag") + call HWRITEIV_LO( grpInputPhysics, "Lfreebound" , 1, (/ Lfreebound /),dset_id) + call H5DESCR_CDSET( dset_id, "free boundary flag") + call HWRITERV_LO( grpInputPhysics, "phiedge" , 1, (/ phiedge /),dset_id) + call H5DESCR_CDSET( dset_id, "total enclosed toroidal magnetic flux") + call HWRITERV_LO( grpInputPhysics, "curtor" , 1, (/ curtor /),dset_id) + call H5DESCR_CDSET( dset_id, "total enclosed toroidal current") + call HWRITERV_LO( grpInputPhysics, "curpol" , 1,(/ curpol /),dset_id) + call H5DESCR_CDSET( dset_id, "total enclosed poloidal current") + call HWRITERV_LO( grpInputPhysics, "gamma" , 1, (/ gamma /),dset_id) + call H5DESCR_CDSET( dset_id, "adiabatic index") + call HWRITEIV_LO( grpInputPhysics, "Nfp" , 1, (/ Nfp /),dset_id) + call H5DESCR_CDSET( dset_id, "number of stellarator field periods") + call HWRITEIV_LO( grpInputPhysics, "Nvol" , 1, (/ Nvol /),dset_id) + call H5DESCR_CDSET( dset_id, "number of volumes") + call HWRITEIV_LO( grpInputPhysics, "Mpol" , 1, (/ Mpol /),dset_id) + call H5DESCR_CDSET( dset_id, "maximum poloidal mode number") + call HWRITEIV_LO( grpInputPhysics, "Ntor" , 1, (/ Ntor /),dset_id) + call H5DESCR_CDSET( dset_id, "maximum toroidal mode number") + call HWRITEIV_LO( grpInputPhysics, "Lrad" , Mvol, Lrad(1:Mvol) ,dset_id) + call H5DESCR_CDSET( dset_id, "degree of radial Chebychev polynomials") + call HWRITEIV_LO( grpInputPhysics, "Lconstraint", 1, (/ Lconstraint /),dset_id) + call H5DESCR_CDSET( dset_id, "type of constraint to enforce") + call HWRITEIV_LO( grpInputPhysics, "Lreflect", 1, (/ Lreflect /),dset_id) + call H5DESCR_CDSET( dset_id, "whether to reflect the perturbation on both boundaries for slab geometry") + call HWRITERV_LO( grpInputPhysics, "tflux" , Mvol, tflux(1:Mvol) ,dset_id) + call H5DESCR_CDSET( dset_id, "toroidal magnetic flux in volumes") + call HWRITERV_LO( grpInputPhysics, "pflux" , Mvol, pflux(1:Mvol) ,dset_id) + call H5DESCR_CDSET( dset_id, "poloidal magnetic flux in volumes") + call HWRITERV_LO( grpInputPhysics, "helicity" , Nvol, helicity(1:Nvol) ,dset_id) + call H5DESCR_CDSET( dset_id, "helicity profile") + call HWRITERV_LO( grpInputPhysics, "pscale" , 1, (/ pscale /),dset_id) + call H5DESCR_CDSET( dset_id, "scaling factor for pressure") + call HWRITERV_LO( grpInputPhysics, "pressure" , Nvol, pressure(1:Nvol), dset_id) + call H5DESCR_CDSET( dset_id, "pressure profile") + call HWRITEIV_LO( grpInputPhysics, "Ladiabatic" , 1, (/ Ladiabatic /),dset_id) + call H5DESCR_CDSET( dset_id, "adiabatic flag") + call HWRITERV_LO( grpInputPhysics, "adiabatic" , Mvol, adiabatic(1:Nvol) ,dset_id) + call H5DESCR_CDSET( dset_id, "adiabatic profile (?)") + call HWRITERV_LO( grpInputPhysics, "mu" , (1+Nvol), mu(1:Mvol) ,dset_id) + call H5DESCR_CDSET( dset_id, "Beltrami parameter, parallel current profile") + call HWRITERV_LO( grpInputPhysics, "Ivolume" ,(1+Nvol), Ivolume(1:Mvol) ,dset_id) + call H5DESCR_CDSET( dset_id, "Volume current, externally driven, parallel current profile") + call HWRITERV_LO( grpInputPhysics, "Isurf" , (Mvol ), Isurf(1:Mvol ) ,dset_id) + call H5DESCR_CDSET( dset_id, "Surface current, currents that are not volume currents (pressure driven, shielding currents)") + call HWRITEIV_LO( grpInputPhysics, "pl" ,(1+Mvol), pl(0:Nvol) ,dset_id) + call H5DESCR_CDSET( dset_id, "pl ?") + call HWRITEIV_LO( grpInputPhysics, "ql" , (1+Mvol), ql(0:Nvol) ,dset_id) + call H5DESCR_CDSET( dset_id, "ql ?") + call HWRITEIV_LO( grpInputPhysics, "pr" , (1+Mvol), pr(0:Nvol) ,dset_id) + call H5DESCR_CDSET( dset_id, "pr ?") + call HWRITEIV_LO( grpInputPhysics, "qr" , (1+Mvol), qr(0:Nvol) ,dset_id) + call H5DESCR_CDSET( dset_id, "qr ?") + call HWRITERV_LO( grpInputPhysics, "iota" , (1+Nvol), iota(0:Nvol) ,dset_id) + call H5DESCR_CDSET( dset_id, "rotational transform profile on inside of ideal interfaces") + call HWRITEIV_LO( grpInputPhysics, "lp" , (1+Mvol), lp(0:Nvol) , dset_id) + call H5DESCR_CDSET( dset_id, "lp ?") + call HWRITEIV_LO( grpInputPhysics, "lq" , (1+Mvol), lq(0:Nvol) , dset_id) + call H5DESCR_CDSET( dset_id, "lq ?") + call HWRITEIV_LO( grpInputPhysics, "rp" , (1+Mvol), rp(0:Nvol) , dset_id) + call H5DESCR_CDSET( dset_id, "rp ?") + call HWRITEIV_LO( grpInputPhysics, "rq" , (1+Mvol), rq(0:Nvol) , dset_id) + call H5DESCR_CDSET( dset_id, "rq ?") + call HWRITERV_LO( grpInputPhysics, "oita" , (1+Nvol), oita(0:Nvol) , dset_id) + call H5DESCR_CDSET( dset_id, "rotational transform profile on outside of ideal interfaces") + call HWRITERV_LO( grpInputPhysics, "rtor" , 1, (/ rtor /), dset_id) + call H5DESCR_CDSET( dset_id, "for aspect ratio in slab") + call HWRITERV_LO( grpInputPhysics, "rpol" , 1, (/ rpol /), dset_id) + call H5DESCR_CDSET( dset_id, "for aspect ratio in slab") + + call HWRITERV_LO( grpInputPhysics, "Rac" , (1+Ntor), Rac(0:Ntor) , dset_id) + call H5DESCR_CDSET( dset_id, "stellarator symmetric coordinate axis R cosine Fourier coefficients") + call HWRITERV_LO( grpInputPhysics, "Zas" , (1+Ntor), Zas(0:Ntor) , dset_id) + call H5DESCR_CDSET( dset_id, "stellarator symmetric coordinate axis Z sine Fourier coefficients") + call HWRITERV_LO( grpInputPhysics, "Ras" , (1+Ntor), Ras(0:Ntor) , dset_id) + call H5DESCR_CDSET( dset_id, "non-stellarator symmetric coordinate axis R sine Fourier coefficients") + call HWRITERV_LO( grpInputPhysics, "Zac" , (1+Ntor), Zac(0:Ntor) , dset_id) + call H5DESCR_CDSET( dset_id, "non-stellarator symmetric coordinate axis Z cosine Fourier coefficients") + + call HWRITERA_LO( grpInputPhysics, "Rbc", (2*Ntor+1), (2*Mpol+1), Rbc(-Ntor:Ntor,-Mpol:Mpol), dset_id) + call H5DESCR_CDSET( dset_id, "stellarator symmetric boundary R cosine Fourier coefficients") + call HWRITERA_LO( grpInputPhysics, "Zbs", (2*Ntor+1), (2*Mpol+1), Zbs(-Ntor:Ntor,-Mpol:Mpol), dset_id) + call H5DESCR_CDSET( dset_id, "stellarator symmetric boundary Z sine Fourier coefficients") + call HWRITERA_LO( grpInputPhysics, "Rbs", (2*Ntor+1), (2*Mpol+1), Rbs(-Ntor:Ntor,-Mpol:Mpol), dset_id) + call H5DESCR_CDSET( dset_id, "non-stellarator symmetric boundary R sine Fourier coefficients") + call HWRITERA_LO( grpInputPhysics, "Zbc", (2*Ntor+1), (2*Mpol+1), Zbc(-Ntor:Ntor,-Mpol:Mpol), dset_id) + call H5DESCR_CDSET( dset_id, "non-stellarator symmetric boundary Z cosine Fourier coefficients") + + call HWRITERA_LO( grpInputPhysics, "Rwc", (2*Ntor+1), (2*Mpol+1), Rwc(-Ntor:Ntor,-Mpol:Mpol), dset_id) + call H5DESCR_CDSET( dset_id, "stellarator symmetric boundary R cosine Fourier coefficients of wall") + call HWRITERA_LO( grpInputPhysics, "Zws", (2*Ntor+1), (2*Mpol+1), Zws(-Ntor:Ntor,-Mpol:Mpol), dset_id) + call H5DESCR_CDSET( dset_id, "stellarator symmetric boundary Z sine Fourier coefficients of wall") + call HWRITERA_LO( grpInputPhysics, "Rws", (2*Ntor+1), (2*Mpol+1), Rws(-Ntor:Ntor,-Mpol:Mpol), dset_id) + call H5DESCR_CDSET( dset_id, "non-stellarator symmetric boundary R sine Fourier coefficients of wall") + call HWRITERA_LO( grpInputPhysics, "Zwc", (2*Ntor+1), (2*Mpol+1), Zwc(-Ntor:Ntor,-Mpol:Mpol), dset_id) + call H5DESCR_CDSET( dset_id, "non-stellarator symmetric boundary Z cosine Fourier coefficients of wall") + + call HWRITERA_LO( grpInputPhysics, "Vns", (2*Ntor+1), (2*Mpol+1), Vns(-Ntor:Ntor,-Mpol:Mpol), dset_id) + call H5DESCR_CDSET( dset_id, "stellarator symmetric normal field sine Fourier coefficients at boundary; vacuum component") + call HWRITERA_LO( grpInputPhysics, "Bns", (2*Ntor+1), (2*Mpol+1), Bns(-Ntor:Ntor,-Mpol:Mpol), dset_id) + call H5DESCR_CDSET( dset_id, "stellarator symmetric normal field sine Fourier coefficients at boundary; plasma component") + call HWRITERA_LO( grpInputPhysics, "Vnc", (2*Ntor+1), (2*Mpol+1), Vnc(-Ntor:Ntor,-Mpol:Mpol), dset_id) + call H5DESCR_CDSET( dset_id, "non-stellarator symmetric normal field cosine Fourier coefficients at boundary; vacuum component") + call HWRITERA_LO( grpInputPhysics, "Bnc", (2*Ntor+1), (2*Mpol+1), Bnc(-Ntor:Ntor,-Mpol:Mpol), dset_id) + call H5DESCR_CDSET( dset_id, "non-stellarator symmetric normal field cosine Fourier coefficients at boundary; plasma component") + + call HWRITERV_LO( grpInputPhysics, "mupftol", 1, (/ mupftol /), dset_id) + call H5DESCR_CDSET( dset_id, "mupftol") + call HWRITEIV_LO( grpInputPhysics, "mupfits", 1, (/ mupfits /), dset_id) + call H5DESCR_CDSET( dset_id, "mupfits") + + call HCLOSEGRP( grpInputPhysics) + +!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! + +! the following variables constitute the namelist/numericlist/; note that all variables in namelist need to be broadcasted in readin; +! they go into ext.h5/input/numerics + + call HDEFGRP( grpInput, "numerics", grpInputNumerics) + + call HWRITEIV( grpInputNumerics, "Linitialize" , 1, (/ Linitialize /)) + call HWRITEIV( grpInputNumerics, "Lzerovac" , 1, (/ Lzerovac /)) + call HWRITEIV( grpInputNumerics, "Ndiscrete" , 1, (/ Ndiscrete /)) + call HWRITEIV( grpInputNumerics, "Nquad" , 1, (/ Nquad /)) + call HWRITEIV( grpInputNumerics, "iMpol" , 1, (/ iMpol /)) + call HWRITEIV( grpInputNumerics, "iNtor" , 1, (/ iNtor /)) + call HWRITEIV( grpInputNumerics, "Lsparse" , 1, (/ Lsparse /)) + call HWRITEIV( grpInputNumerics, "Lsvdiota" , 1, (/ Lsvdiota /)) + call HWRITEIV( grpInputNumerics, "imethod" , 1, (/ imethod /)) + call HWRITEIV( grpInputNumerics, "iorder" , 1, (/ iorder /)) + call HWRITEIV( grpInputNumerics, "iprecon" , 1, (/ iprecon /)) + call HWRITERV( grpInputNumerics, "iotatol" , 1, (/ iotatol /)) + call HWRITEIV( grpInputNumerics, "Lextrap" , 1, (/ Lextrap /)) + call HWRITEIV( grpInputNumerics, "Mregular" , 1, (/ Mregular /)) + call HWRITEIV( grpInputNumerics, "Lrzaxis" , 1, (/ Lrzaxis /)) + call HWRITEIV( grpInputNumerics, "Ntoraxis" , 1, (/ Ntoraxis /)) + + call HCLOSEGRP( grpInputNumerics) + +!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! + +! the following variables constitute the namelist/locallist/; note that all variables in namelist need to be broadcasted in readin; +! they go into ext.h5/input/local + + call HDEFGRP( grpInput, "local", grpInputLocal ) + + call HWRITEIV( grpInputLocal, "LBeltrami" , 1, (/ LBeltrami /)) + call HWRITEIV( grpInputLocal, "Linitgues" , 1, (/ Linitgues /)) + call HWRITEIV( grpInputLocal, "Lposdef" , 1, (/ Lposdef /)) ! redundant; + call HWRITERV( grpInputLocal, "maxrndgues" , 1, (/ maxrndgues /)) + call HWRITEIV( grpInputLocal, "Lmatsolver" , 1, (/ Lmatsolver /)) + call HWRITEIV( grpInputLocal, "LGMRESprec" , 1, (/ LGMRESprec /)) + call HWRITERV( grpInputLocal, "epsGMRES" , 1, (/ epsGMRES /)) + call HWRITERV( grpInputLocal, "epsILU" , 1, (/ epsILU /)) + + call HCLOSEGRP( grpInputLocal ) + +!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! + +! the following variables constitute the namelist/globallist/; note that all variables in namelist need to be broadcasted in readin; +! they go into ext.h5/input/global + + call HDEFGRP( grpInput, "global", grpInputGlobal ) + + call HWRITEIV( grpInputGlobal, "Lfindzero" , 1, (/ Lfindzero /)) + call HWRITERV( grpInputGlobal, "escale" , 1, (/ escale /)) + call HWRITERV( grpInputGlobal, "opsilon" , 1, (/ opsilon /)) + call HWRITERV( grpInputGlobal, "pcondense" , 1, (/ pcondense /)) + call HWRITERV( grpInputGlobal, "epsilon" , 1, (/ epsilon /)) + call HWRITERV( grpInputGlobal, "wpoloidal" , 1, (/ wpoloidal /)) + call HWRITERV( grpInputGlobal, "upsilon" , 1, (/ upsilon /)) + call HWRITERV( grpInputGlobal, "forcetol" , 1, (/ forcetol /)) + call HWRITERV( grpInputGlobal, "c05xmax" , 1, (/ c05xmax /)) + call HWRITERV( grpInputGlobal, "c05xtol" , 1, (/ c05xtol /)) + call HWRITERV( grpInputGlobal, "c05factor" , 1, (/ c05factor /)) + call HWRITELV( grpInputGlobal, "LreadGF" , 1, (/ LreadGF /)) + call HWRITEIV( grpInputGlobal, "mfreeits" , 1, (/ mfreeits /)) + call HWRITERV( grpInputGlobal, "bnstol" , 1, (/ bnstol /)) ! redundant; + call HWRITERV( grpInputGlobal, "bnsblend" , 1, (/ bnsblend /)) ! redundant; + call HWRITERV( grpInputGlobal, "gBntol" , 1, (/ gBntol /)) + call HWRITERV( grpInputGlobal, "gBnbld" , 1, (/ gBnbld /)) + call HWRITERV( grpInputGlobal, "vcasingeps" , 1, (/ vcasingeps /)) + call HWRITERV( grpInputGlobal, "vcasingtol" , 1, (/ vcasingtol /)) + call HWRITEIV( grpInputGlobal, "vcasingits" , 1, (/ vcasingits /)) + call HWRITEIV( grpInputGlobal, "vcasingper" , 1, (/ vcasingper /)) + call HWRITEIV( grpInputGlobal, "mcasingcal" , 1, (/ mcasingcal /)) ! redundant; + + call HCLOSEGRP( grpInputGlobal ) + +!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! + +! the following variables constitute the namelist/diagnosticslist/; note that all variables in namelist need to be broadcasted in readin; +! they go into ext.h5/input/diagnostics + + call HDEFGRP( grpInput, "diagnostics", grpInputDiagnostics ) + + call HWRITERV( grpInputDiagnostics, "odetol" , 1, (/ odetol /)) + call HWRITERV( grpInputDiagnostics, "absreq" , 1, (/ absreq /)) ! redundant; + call HWRITERV( grpInputDiagnostics, "relreq" , 1, (/ relreq /)) ! redundant; + call HWRITERV( grpInputDiagnostics, "absacc" , 1, (/ absacc /)) ! redundant; + call HWRITERV( grpInputDiagnostics, "epsr" , 1, (/ epsr /)) ! redundant; + call HWRITEIV( grpInputDiagnostics, "nPpts" , 1, (/ nPpts /)) + call HWRITERV( grpInputDiagnostics, "Ppts" , 1, (/ Ppts /)) + call HWRITEIV( grpInputDiagnostics, "nPtrj" , Mvol, nPtrj(1:Mvol) ) + call HWRITELV( grpInputDiagnostics, "LHevalues" , 1, (/ LHevalues /)) + call HWRITELV( grpInputDiagnostics, "LHevectors" , 1, (/ LHevectors /)) + call HWRITELV( grpInputDiagnostics, "LHmatrix" , 1, (/ LHmatrix /)) + call HWRITEIV( grpInputDiagnostics, "Lperturbed" , 1, (/ Lperturbed /)) + call HWRITEIV( grpInputDiagnostics, "dpp" , 1, (/ dpp /)) + call HWRITEIV( grpInputDiagnostics, "dqq" , 1, (/ dqq /)) + call HWRITEIV( grpInputDiagnostics, "Lcheck" , 1, (/ Lcheck /)) + call HWRITELV( grpInputDiagnostics, "Ltiming" , 1, (/ Ltiming /)) + call HWRITEIV( grpInputDiagnostics, "Lerrortype" , 1, (/ Lerrortype /)) + call HWRITEIV( grpInputDiagnostics, "Ngrid" , 1, (/ Ngrid /)) + call HWRITERV( grpInputDiagnostics, "fudge" , 1, (/ fudge /)) ! redundant; + call HWRITERV( grpInputDiagnostics, "scaling" , 1, (/ scaling /)) ! redundant; + + call HCLOSEGRP( grpInputDiagnostics ) + + call HCLOSEGRP( grpInput ) endif ! myid.eq.0 @@ -658,7 +555,7 @@ subroutine write_convergence_output( nDcalls, ForceErr ) ! ! if( hdfier.ne.1 ) then ! write(6,'("sphdf5 : fatal : myid=",i3," ; hdfier.ne.1 ; rank of convergence dataspace is not 1 ;")') myid -! call MPI_ABORT( MPI_COMM_SPEC, 1, ierr ) +! call MPI_ABORT(MPI_COMM_SPEC, 1, ierr) ! stop "sphdf5 : hdfier.ne.1 : rank of convergence dataspace is not 1 ;" ! endif ! From b596e95a0e042bc70d48a642bc09df93fbddc492 Mon Sep 17 00:00:00 2001 From: Jonathan Schilling Date: Sun, 3 Jul 2022 18:52:07 +0200 Subject: [PATCH 07/15] output routines hacked together again --- src/sphdf5.F90 | 1301 +++++++++++++++++++++++------------------------- 1 file changed, 627 insertions(+), 674 deletions(-) diff --git a/src/sphdf5.F90 b/src/sphdf5.F90 index 4595ba06..c84dfcc1 100644 --- a/src/sphdf5.F90 +++ b/src/sphdf5.F90 @@ -400,7 +400,6 @@ subroutine init_convergence_output use allglobal, only : mn, Mvol - #ifdef OPENMP USE OMP_LIB #endif @@ -409,7 +408,6 @@ subroutine init_convergence_output integer :: ierr, astat, ios, nthreads, ithread real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; - integer(hid_t) :: iteration_dspace_id !< dataspace for "iteration" integer(hid_t) :: iteration_dtype_id !< Compound datatype for "iteration" integer(hid_t) :: iRZbscArray_id !< Memory datatype identifier @@ -425,6 +423,7 @@ subroutine init_convergence_output integer(size_t) :: irbc_size_template !< size ofiRbc array in iterations logging integer(size_t) :: irbc_size !< size ofiRbc array in iterations logging + integer :: hdfier !< error flag for HDF5 library cpui = MPI_WTIME() cpuo = cpui @@ -437,77 +436,84 @@ subroutine init_convergence_output if (myid.eq.0 .and. .not.skip_write) then -! ! Set dataset transfer property to preserve partially initialized fields -! ! during write/read to/from dataset with compound datatype. -! H5CALL( sphdf5, h5pcreate_f, (H5P_DATASET_XFER_F, plist_id, hdfier)) -! -! H5CALL( sphdf5, h5pset_preserve_f, (plist_id, .TRUE., hdfier) ) -! -! maxdims = (/ H5S_UNLIMITED_F /) ! unlimited array size: "converge" until you get bored -! H5CALL( sphdf5, h5screate_simple_f, (rank, dims, iteration_dspace_id, hdfier, maxdims) ) ! Create the dataspace with zero initial size and allow it to grow -! -! H5CALL( sphdf5, h5pcreate_f, (H5P_DATASET_CREATE_F, crp_list, hdfier) ) ! dataset creation property list with chunking -! -! H5CALL( sphdf5, h5pset_chunk_f, (crp_list, rank, dimsc, hdfier) ) -! -! ! declare "iteration" compound datatype -! ! declare array parts -! H5CALL( sphdf5, h5tarray_create_f, (H5T_NATIVE_DOUBLE, 2, int((/mn, Mvol+1/),hsize_t), iRZbscArray_id, hdfier) ) ! create array datatypes for i{R,Z}b{c,s} -! H5CALL( sphdf5, h5tget_size_f, (iRZbscArray_id, irbc_size, hdfier) ) -! H5CALL( sphdf5, h5tget_size_f, (H5T_NATIVE_INTEGER, type_size_i, hdfier) ) ! size of an integer field -! H5CALL( sphdf5, h5tget_size_f, (H5T_NATIVE_DOUBLE, type_size_d, hdfier) ) ! size of a double field -! iteration_dtype_size = 2*type_size_i + 2*type_size_d + 4*irbc_size ! wflag, nDcalls, Energy, ForceErr, i{R,Z}b{c,s} -! -! H5CALL( sphdf5, h5tcreate_f, (H5T_COMPOUND_F, iteration_dtype_size, iteration_dtype_id, hdfier) ) ! create compound datatype -! -! offset = 0 ! offset for first field starts at 0 -! H5CALL( sphdf5, h5tinsert_f, (iteration_dtype_id, "nDcalls", offset, H5T_NATIVE_INTEGER, hdfier) ) ! insert "nDcalls" field in datatype -! offset = offset + type_size_i ! increment offset by size of field -! H5CALL( sphdf5, h5tinsert_f, (iteration_dtype_id, "Energy", offset, H5T_NATIVE_DOUBLE, hdfier) ) ! insert "Energy" field in datatype -! offset = offset + type_size_d ! increment offset by size of field -! H5CALL( sphdf5, h5tinsert_f, (iteration_dtype_id, "ForceErr", offset, H5T_NATIVE_DOUBLE, hdfier) ) ! insert "ForceErr" field in datatype -! offset = offset + type_size_d ! increment offset by size of field -! H5CALL( sphdf5, h5tinsert_f, (iteration_dtype_id, "iRbc", offset, iRZbscArray_id, hdfier) ) ! insert "iRbc" field in datatype -! offset = offset + irbc_size ! increment offset by size of field -! H5CALL( sphdf5, h5tinsert_f, (iteration_dtype_id, "iZbs", offset, iRZbscArray_id, hdfier) ) ! insert "iZbs" field in datatype -! offset = offset + irbc_size ! increment offset by size of field -! H5CALL( sphdf5, h5tinsert_f, (iteration_dtype_id, "iRbs", offset, iRZbscArray_id, hdfier) ) ! insert "iRbs" field in datatype -! offset = offset + irbc_size ! increment offset by size of field -! H5CALL( sphdf5, h5tinsert_f, (iteration_dtype_id, "iZbc", offset, iRZbscArray_id, hdfier) ) ! insert "iZbc" field in datatype -! offset = offset + irbc_size ! increment offset by size of field -! -! H5CALL( sphdf5, h5dcreate_f, (file_id, "iterations", iteration_dtype_id, iteration_dspace_id, & ! create dataset with compound type -! & iteration_dset_id, hdfier, crp_list) ) -! -! H5CALL( sphdf5, h5sclose_f, (iteration_dspace_id, hdfier) ) ! Terminate access to the data space (does not show up in obj_count below) -! ! --> only needed for creation of dataset -! -! ! Create memory types. We have to create a compound datatype -! ! for each member we want to write. -! offset = 0 -! H5CALL( sphdf5, h5tcreate_f, (H5T_COMPOUND_F, type_size_i, dt_nDcalls_id, hdfier) ) -! H5CALL( sphdf5, h5tcreate_f, (H5T_COMPOUND_F, type_size_d, dt_Energy_id, hdfier) ) -! H5CALL( sphdf5, h5tcreate_f, (H5T_COMPOUND_F, type_size_d, dt_ForceErr_id, hdfier) ) -! H5CALL( sphdf5, h5tcreate_f, (H5T_COMPOUND_F, irbc_size, dt_iRbc_id, hdfier) ) -! H5CALL( sphdf5, h5tcreate_f, (H5T_COMPOUND_F, irbc_size, dt_iZbs_id, hdfier) ) -! H5CALL( sphdf5, h5tcreate_f, (H5T_COMPOUND_F, irbc_size, dt_iRbs_id, hdfier) ) -! H5CALL( sphdf5, h5tcreate_f, (H5T_COMPOUND_F, irbc_size, dt_iZbc_id, hdfier) ) -! -! H5CALL( sphdf5, h5tinsert_f, (dt_nDcalls_id, "nDcalls", offset, H5T_NATIVE_INTEGER, hdfier) ) -! H5CALL( sphdf5, h5tinsert_f, (dt_Energy_id, "Energy", offset, H5T_NATIVE_DOUBLE, hdfier) ) -! H5CALL( sphdf5, h5tinsert_f, (dt_ForceErr_id, "ForceErr", offset, H5T_NATIVE_DOUBLE, hdfier) ) -! H5CALL( sphdf5, h5tinsert_f, (dt_iRbc_id, "iRbc", offset, iRZbscArray_id, hdfier) ) -! H5CALL( sphdf5, h5tinsert_f, (dt_iZbs_id, "iZbs", offset, iRZbscArray_id, hdfier) ) -! H5CALL( sphdf5, h5tinsert_f, (dt_iRbs_id, "iRbs", offset, iRZbscArray_id, hdfier) ) -! H5CALL( sphdf5, h5tinsert_f, (dt_iZbc_id, "iZbc", offset, iRZbscArray_id, hdfier) ) -! -! ! create memspace with size of compound object to append -! dims(1) = 1 ! only append one iteration at a time -! H5CALL( sphdf5, h5screate_simple_f, (rank, dims, memspace, hdfier) ) -! -! H5CALL( sphdf5, h5pclose_f, (crp_list, hdfier) ) -! H5CALL( sphdf5, h5tclose_f, (iteration_dtype_id, hdfier) ) ! Terminate access to the datatype -! H5CALL( sphdf5, h5tclose_f, (iRZbscArray_id, hdfier) ) ! Terminate access to the datatype + ! Set dataset transfer property to preserve partially initialized fields + ! during write/read to/from dataset with compound datatype. + call h5pcreate_f(H5P_DATASET_XFER_F, plist_id, hdfier) + + call h5pset_preserve_f(plist_id, .TRUE., hdfier) + + maxdims = (/ H5S_UNLIMITED_F /) ! unlimited array size: "converge" until you get bored + call h5screate_simple_f(rank, dims, iteration_dspace_id, hdfier, maxdims) ! Create the dataspace with zero initial size and allow it to grow + + call h5pcreate_f(H5P_DATASET_CREATE_F, crp_list, hdfier) ! dataset creation property list with chunking + + call h5pset_chunk_f(crp_list, rank, dimsc, hdfier) + + ! declare "iteration" compound datatype + ! declare array parts + call h5tarray_create_f(H5T_NATIVE_DOUBLE, 2, int((/mn, Mvol+1/),hsize_t), iRZbscArray_id, hdfier) ! create array datatypes for i{R,Z}b{c,s} + call h5tget_size_f(iRZbscArray_id, irbc_size, hdfier) + call h5tget_size_f(H5T_NATIVE_INTEGER, type_size_i, hdfier) ! size of an integer field + call h5tget_size_f(H5T_NATIVE_DOUBLE, type_size_d, hdfier) ! size of a double field + iteration_dtype_size = 2*type_size_i + 2*type_size_d + 4*irbc_size ! wflag, nDcalls, Energy, ForceErr, i{R,Z}b{c,s} + + call h5tcreate_f(H5T_COMPOUND_F, iteration_dtype_size, iteration_dtype_id, hdfier) ! create compound datatype + + offset = 0 ! offset for first field starts at 0 + + call h5tinsert_f(iteration_dtype_id, "nDcalls", offset, H5T_NATIVE_INTEGER, hdfier) ! insert "nDcalls" field in datatype + offset = offset + type_size_i ! increment offset by size of field + + call h5tinsert_f(iteration_dtype_id, "Energy", offset, H5T_NATIVE_DOUBLE, hdfier) ! insert "Energy" field in datatype + offset = offset + type_size_d ! increment offset by size of field + + call h5tinsert_f(iteration_dtype_id, "ForceErr", offset, H5T_NATIVE_DOUBLE, hdfier) ! insert "ForceErr" field in datatype + offset = offset + type_size_d ! increment offset by size of field + + call h5tinsert_f(iteration_dtype_id, "iRbc", offset, iRZbscArray_id, hdfier) ! insert "iRbc" field in datatype + offset = offset + irbc_size ! increment offset by size of field + + call h5tinsert_f(iteration_dtype_id, "iZbs", offset, iRZbscArray_id, hdfier) ! insert "iZbs" field in datatype + offset = offset + irbc_size ! increment offset by size of field + + call h5tinsert_f(iteration_dtype_id, "iRbs", offset, iRZbscArray_id, hdfier) ! insert "iRbs" field in datatype + offset = offset + irbc_size ! increment offset by size of field + + call h5tinsert_f(iteration_dtype_id, "iZbc", offset, iRZbscArray_id, hdfier) ! insert "iZbc" field in datatype + offset = offset + irbc_size ! increment offset by size of field + + call h5dcreate_f(file_id, "iterations", iteration_dtype_id, iteration_dspace_id, & ! create dataset with compound type + & iteration_dset_id, hdfier, crp_list) + + call h5sclose_f(iteration_dspace_id, hdfier) ! Terminate access to the data space (does not show up in obj_count below) + ! --> only needed for creation of dataset + + ! Create memory types. We have to create a compound datatype + ! for each member we want to write. + call h5tcreate_f(H5T_COMPOUND_F, type_size_i, dt_nDcalls_id, hdfier) + call h5tcreate_f(H5T_COMPOUND_F, type_size_d, dt_Energy_id, hdfier) + call h5tcreate_f(H5T_COMPOUND_F, type_size_d, dt_ForceErr_id, hdfier) + call h5tcreate_f(H5T_COMPOUND_F, irbc_size, dt_iRbc_id, hdfier) + call h5tcreate_f(H5T_COMPOUND_F, irbc_size, dt_iZbs_id, hdfier) + call h5tcreate_f(H5T_COMPOUND_F, irbc_size, dt_iRbs_id, hdfier) + call h5tcreate_f(H5T_COMPOUND_F, irbc_size, dt_iZbc_id, hdfier) + + offset = 0 + call h5tinsert_f(dt_nDcalls_id, "nDcalls", offset, H5T_NATIVE_INTEGER, hdfier) + call h5tinsert_f(dt_Energy_id, "Energy", offset, H5T_NATIVE_DOUBLE, hdfier) + call h5tinsert_f(dt_ForceErr_id, "ForceErr", offset, H5T_NATIVE_DOUBLE, hdfier) + call h5tinsert_f(dt_iRbc_id, "iRbc", offset, iRZbscArray_id, hdfier) + call h5tinsert_f(dt_iZbs_id, "iZbs", offset, iRZbscArray_id, hdfier) + call h5tinsert_f(dt_iRbs_id, "iRbs", offset, iRZbscArray_id, hdfier) + call h5tinsert_f(dt_iZbc_id, "iZbc", offset, iRZbscArray_id, hdfier) + + ! create memspace with size of compound object to append + dims(1) = 1 ! only append one iteration at a time + call h5screate_simple_f(rank, dims, memspace, hdfier) + + call h5pclose_f(crp_list, hdfier) + call h5tclose_f(iteration_dtype_id, hdfier) ! Terminate access to the datatype + call h5tclose_f(iRZbscArray_id, hdfier) ! Terminate access to the datatype endif ! myid.eq.0 @@ -519,8 +525,7 @@ end subroutine init_convergence_output !> subroutine write_convergence_output( nDcalls, ForceErr ) - use allglobal, only : myid, mn, Mvol, Energy, iRbc, iZbs, iRbs, iZbc - + use allglobal, only : myid, mn, Mvol, Energy, iRbc, iZbs, iRbs, iZbc, MPI_COMM_SPEC #ifdef OPENMP USE OMP_LIB @@ -530,6 +535,8 @@ subroutine write_convergence_output( nDcalls, ForceErr ) integer :: ierr, astat, ios, nthreads, ithread real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + integer :: hdfier !< error flag for HDF5 library + integer, intent(in) :: nDcalls real(wp) , intent(in) :: ForceErr @@ -545,48 +552,48 @@ subroutine write_convergence_output( nDcalls, ForceErr ) if (myid.eq.0 .and. .not.skip_write) then -! ! append updated values to "iterations" dataset -! -! ! open dataspace to get current state of dataset -! H5CALL( sphdf5, h5dget_space_f, (iteration_dset_id, dataspace, hdfier), __FILE__, __LINE__) -! -! ! get current size of dataset -! call h5sget_simple_extent_dims_f(dataspace, old_data_dims, max_dims, hdfier) -! -! if( hdfier.ne.1 ) then -! write(6,'("sphdf5 : fatal : myid=",i3," ; hdfier.ne.1 ; rank of convergence dataspace is not 1 ;")') myid -! call MPI_ABORT(MPI_COMM_SPEC, 1, ierr) -! stop "sphdf5 : hdfier.ne.1 : rank of convergence dataspace is not 1 ;" -! endif -! -! -! ! blow up dataset to new size -! data_dims = old_data_dims+1 -! H5CALL( sphdf5, h5dset_extent_f, (iteration_dset_id, data_dims, hdfier), __FILE__, __LINE__) -! -! ! get dataspace slab corresponding to region which the iterations dataset was extended by -! H5CALL( sphdf5, h5dget_space_f, (iteration_dset_id, dataspace, hdfier), __FILE__, __LINE__) ! re-select dataspace to update size info in HDF5 lib -! H5CALL( sphdf5, h5sselect_hyperslab_f, (dataspace, H5S_SELECT_SET_F, old_data_dims, (/ INT(1, HSIZE_T) /), hdfier), __FILE__, __LINE__) ! newly appended slab is at old size and 1 long -! -! ! write next iteration object -! H5CALL( sphdf5, h5dwrite_f, (iteration_dset_id, dt_nDcalls_id, nDcalls, INT((/1/), HSIZE_T), hdfier, & -! & mem_space_id=memspace, file_space_id=dataspace, xfer_prp=plist_id), __FILE__, __LINE__) -! H5CALL( sphdf5, h5dwrite_f, (iteration_dset_id, dt_Energy_id, Energy, INT((/1/), HSIZE_T), hdfier, & -! & mem_space_id=memspace, file_space_id=dataspace, xfer_prp=plist_id), __FILE__, __LINE__) -! H5CALL( sphdf5, h5dwrite_f, (iteration_dset_id, dt_ForceErr_id, ForceErr, INT((/1/), HSIZE_T), hdfier, & -! & mem_space_id=memspace, file_space_id=dataspace, xfer_prp=plist_id), __FILE__, __LINE__) -! H5CALL( sphdf5, h5dwrite_f, (iteration_dset_id, dt_iRbc_id, iRbc, INT((/mn,Mvol+1/), HSIZE_T), hdfier, & -! & mem_space_id=memspace, file_space_id=dataspace, xfer_prp=plist_id), __FILE__, __LINE__) -! H5CALL( sphdf5, h5dwrite_f, (iteration_dset_id, dt_iZbs_id, iZbs, INT((/mn,Mvol+1/), HSIZE_T), hdfier, & -! & mem_space_id=memspace, file_space_id=dataspace, xfer_prp=plist_id), __FILE__, __LINE__) -! H5CALL( sphdf5, h5dwrite_f, (iteration_dset_id, dt_iRbs_id, iRbs, INT((/mn,Mvol+1/), HSIZE_T), hdfier, & -! & mem_space_id=memspace, file_space_id=dataspace, xfer_prp=plist_id), __FILE__, __LINE__) -! H5CALL( sphdf5, h5dwrite_f, (iteration_dset_id, dt_iZbc_id, iZbc, INT((/mn,Mvol+1/), HSIZE_T), hdfier, & -! & mem_space_id=memspace, file_space_id=dataspace, xfer_prp=plist_id), __FILE__, __LINE__) -! -! ! dataspace to appended object should be closed now -! ! MAYBE we otherwise keep all the iterations in memory? -! H5CALL( sphdf5, h5sclose_f, (dataspace, hdfier), __FILE__, __LINE__) + ! append updated values to "iterations" dataset + + ! open dataspace to get current state of dataset + call h5dget_space_f(iteration_dset_id, dataspace, hdfier) + + ! get current size of dataset + call h5sget_simple_extent_dims_f(dataspace, old_data_dims, max_dims, hdfier) + + if( hdfier.ne.1 ) then + write(6,'("sphdf5 : fatal : myid=",i3," ; hdfier.ne.1 ; rank of convergence dataspace is not 1 ;")') myid +! call MPI_ABORT(MPI_COMM_SPEC, 1) ! TODO: get this to compile again... + stop "sphdf5 : hdfier.ne.1 : rank of convergence dataspace is not 1 ;" + endif + + + ! blow up dataset to new size + data_dims = old_data_dims+1 + call h5dset_extent_f(iteration_dset_id, data_dims, hdfier) + + ! get dataspace slab corresponding to region which the iterations dataset was extended by + call h5dget_space_f(iteration_dset_id, dataspace, hdfier) ! re-select dataspace to update size info in HDF5 lib + call h5sselect_hyperslab_f(dataspace, H5S_SELECT_SET_F, old_data_dims, (/ INT(1, HSIZE_T) /), hdfier) ! newly appended slab is at old size and 1 long + + ! write next iteration object + call h5dwrite_f(iteration_dset_id, dt_nDcalls_id, nDcalls, INT((/1/), HSIZE_T), hdfier, & + mem_space_id=memspace, file_space_id=dataspace, xfer_prp=plist_id) + call h5dwrite_f(iteration_dset_id, dt_Energy_id, Energy, INT((/1/), HSIZE_T), hdfier, & + mem_space_id=memspace, file_space_id=dataspace, xfer_prp=plist_id) + call h5dwrite_f(iteration_dset_id, dt_ForceErr_id, ForceErr, INT((/1/), HSIZE_T), hdfier, & + mem_space_id=memspace, file_space_id=dataspace, xfer_prp=plist_id) + call h5dwrite_f(iteration_dset_id, dt_iRbc_id, iRbc, INT((/mn,Mvol+1/), HSIZE_T), hdfier, & + mem_space_id=memspace, file_space_id=dataspace, xfer_prp=plist_id) + call h5dwrite_f(iteration_dset_id, dt_iZbs_id, iZbs, INT((/mn,Mvol+1/), HSIZE_T), hdfier, & + mem_space_id=memspace, file_space_id=dataspace, xfer_prp=plist_id) + call h5dwrite_f(iteration_dset_id, dt_iRbs_id, iRbs, INT((/mn,Mvol+1/), HSIZE_T), hdfier, & + mem_space_id=memspace, file_space_id=dataspace, xfer_prp=plist_id) + call h5dwrite_f(iteration_dset_id, dt_iZbc_id, iZbc, INT((/mn,Mvol+1/), HSIZE_T), hdfier, & + mem_space_id=memspace, file_space_id=dataspace, xfer_prp=plist_id) + + ! dataspace to appended object should be closed now + ! MAYBE we otherwise keep all the iterations in memory? + call h5sclose_f(dataspace, hdfier) endif ! myid.eq.0 @@ -624,7 +631,6 @@ subroutine write_grid real(wp) :: lss, teta, zeta, st(1:Node), Bst(1:Node) real(wp) , allocatable :: Rij_grid(:,:), Zij_grid(:,:), sg_grid(:,:), ijreal_grid(:,:), ijimag_grid(:,:), jireal_grid(:,:) - cpui = MPI_WTIME() cpuo = cpui #ifdef OPENMP @@ -633,192 +639,173 @@ subroutine write_grid nthreads = 1 #endif - if (myid.eq.0 .and. .not.skip_write) then -! ijreal(1:Ntz) = zero ; ijimag(1:Ntz) = zero ; jireal(1:Ntz) = zero -! -! HDEFGRP( file_id, grid, grpGrid ) -! -! ! Igeometry already is in input, Mvol already is in output -! HWRITEIV( grpGrid, 1, Nt , (/ Nt /)) -! HWRITEIV( grpGrid, 1, Nz , (/ Nz /)) -! HWRITEIV( grpGrid, 1, Ntz , (/ Ntz /)) -! HWRITERV( grpGrid, 1, pi2nfp , (/ pi2nfp /)) -! -! ! combine all radial parts into one dimension as Lrad values can be different for different volumes -! if (Ngrid .lt. 0) then -! sumLrad = sum(Lrad(1:Mvol)+1) -! else -! sumLrad = (Ngrid + 1) * Mvol -! endif -! -! -! allocate( Rij_grid(1:sumLrad, 1:Ntz), stat=astat ) -! Rij_grid(1:sumLrad, 1:Ntz) = zero -! -! -! allocate( Zij_grid(1:sumLrad, 1:Ntz), stat=astat ) -! Zij_grid(1:sumLrad, 1:Ntz) = zero -! -! -! allocate( sg_grid(1:sumLrad, 1:Ntz), stat=astat ) -! sg_grid(1:sumLrad, 1:Ntz) = zero -! -! -! allocate( ijreal_grid(1:sumLrad, 1:Ntz), stat=astat ) -! ijreal_grid(1:sumLrad, 1:Ntz) = zero -! -! -! allocate( ijimag_grid(1:sumLrad, 1:Ntz), stat=astat ) -! ijimag_grid(1:sumLrad, 1:Ntz) = zero -! -! -! allocate( jireal_grid(1:sumLrad, 1:Ntz), stat=astat ) -! jireal_grid(1:sumLrad, 1:Ntz) = zero -! -! -! Ngrid_sum = 0 -! -! do vvol = 1, Mvol ; ivol = vvol -! -! if( Igeometry.eq.1 .or. vvol.gt.1 ) then ; Lcoordinatesingularity = .false. -! else ; Lcoordinatesingularity = .true. -! endif -! -! if( vvol.le.Nvol ) then ; Lplasmaregion = .true. -! else ; Lplasmaregion = .false. -! endif -! -! Lvacuumregion = .not.Lplasmaregion -! ! sets Lcoordinatesingularity and Lplasmaregion ; -! -! if (Ngrid .lt. 0) then -! Ngrid_local = Lrad(vvol) ! default -! else -! Ngrid_local = Ngrid -! endif -! if (Ngrid_local .eq. 0) cycle ! nothing to output -! -! do ii = 0, Ngrid_local ! sub-grid; -! lss = ii * two / Ngrid_local - one -! if( Lcoordinatesingularity .and. ii.eq.0 ) then ; Lcurvature = 0 ! Jacobian is not defined; -! else ; Lcurvature = 1 ! compute Jacobian ; -! endif -! -! -! cput = MPI_WTIME() -! Tsphdf5 = Tsphdf5 + ( cput-cpuo ) -! call coords( vvol, lss, Lcurvature, Ntz, mn ) -! cpuo = MPI_WTIME() -! ! only Rij(0,:) and Zij(0,:) are required; Rmn & Zmn are available; -! -! alongLrad = Ngrid_sum+ii+1 -! -! Rij_grid(alongLrad,1:Ntz) = Rij(1:Ntz,0,0) -! Zij_grid(alongLrad,1:Ntz) = Zij(1:Ntz,0,0) -! sg_grid (alongLrad,1:Ntz) = sg(1:Ntz,0) -! -! if( Lcurvature.eq.1 ) then -! -! select case (Igeometry) -! -! case (3) -! do kk = 0, Nz-1 ; zeta = kk * pi2nfp / Nz -! do jj = 0, Nt-1 ; teta = jj * pi2 / Nt ; jk = 1 + jj + kk*Nt ; st(1:2) = (/ lss, teta /) -! -! cput = MPI_WTIME() -! Tsphdf5 = Tsphdf5 + ( cput-cpuo ) -! call bfield( zeta, st(1:Node), Bst(1:Node) ) -! cpuo = MPI_WTIME() -! -! ijreal(jk) = ( Rij(jk,1,0) * Bst(1) + Rij(jk,2,0) * Bst(2) + Rij(jk,3,0) * one ) * gBzeta / sg(jk,0) ! BR; -! ijimag(jk) = ( one ) * gBzeta / sg(jk,0) ! Bp; -! jireal(jk) = ( Zij(jk,1,0) * Bst(1) + Zij(jk,2,0) * Bst(2) + Zij(jk,3,0) * one ) * gBzeta / sg(jk,0) ! BZ; -! enddo -! enddo -! -! case (1) -! do kk = 0, Nz-1 ; zeta = kk * pi2nfp / Nz -! do jj = 0, Nt-1 ; teta = jj * pi2 / Nt ; jk = 1 + jj + kk*Nt ; st(1:2) = (/ lss, teta /) -! -! cput = MPI_WTIME() -! Tsphdf5 = Tsphdf5 + ( cput-cpuo ) -! call bfield( zeta, st(1:Node), Bst(1:Node) ) -! cpuo = MPI_WTIME() -! -! ijreal(jk) = ( Rij(jk,1,0) * Bst(1) + Rij(jk,2,0) * Bst(2) + Rij(jk,3,0) * one ) * gBzeta / sg(jk,0) ! BR; -! ijimag(jk) = ( rpol ) * gBzeta / sg(jk,0) ! Bzeta; -! jireal(jk) = ( + rtor * Bst(2) ) * gBzeta / sg(jk,0) ! Btheta; -! enddo -! enddo -! -! case (2) -! do kk = 0, Nz-1 ; zeta = kk * pi2nfp / Nz -! do jj = 0, Nt-1 ; teta = jj * pi2 / Nt ; jk = 1 + jj + kk*Nt ; st(1:2) = (/ lss, teta /) -! -! cput = MPI_WTIME() -! Tsphdf5 = Tsphdf5 + ( cput-cpuo ) -! call bfield( zeta, st(1:Node), Bst(1:Node) ) -! cpuo = MPI_WTIME() -! -! ijreal(jk) = ( Rij(jk,1,0) * Bst(1) + Rij(jk,2,0) * Bst(2) + Rij(jk,3,0) * one ) * gBzeta / sg(jk,0) ! BR; -! ijimag(jk) = ( one ) * gBzeta / sg(jk,0) ! Bp; -! jireal(jk) = ( Bst(2) ) * gBzeta / sg(jk,0) ! BZ; -! enddo -! enddo -! -! end select !Igeometry -! endif ! end of if( Lcurvature.eq.1 ) ; -! -! ijreal_grid(alongLrad,1:Ntz) = ijreal(1:Ntz) -! ijimag_grid(alongLrad,1:Ntz) = ijimag(1:Ntz) -! jireal_grid(alongLrad,1:Ntz) = jireal(1:Ntz) -! -! enddo ! end of do ii; -! -! Ngrid_sum = Ngrid_sum + Ngrid_local + 1 ! offset for storing data -! -! enddo ! end of do vvol; -! -! HWRITERA( grpGrid, sumLrad, Ntz, Rij, Rij_grid ) -! HWRITERA( grpGrid, sumLrad, Ntz, Zij, Zij_grid ) -! HWRITERA( grpGrid, sumLrad, Ntz, sg, sg_grid ) -! HWRITERA( grpGrid, sumLrad, Ntz, BR, ijreal_grid ) -! HWRITERA( grpGrid, sumLrad, Ntz, Bp, ijimag_grid ) -! HWRITERA( grpGrid, sumLrad, Ntz, BZ, jireal_grid ) -! -! -! deallocate(Rij_grid ,stat=astat) -! -! -! deallocate(Zij_grid ,stat=astat) -! -! -! deallocate(sg_grid ,stat=astat) -! -! -! deallocate(ijreal_grid ,stat=astat) -! -! -! deallocate(ijimag_grid ,stat=astat) -! -! -! deallocate(jireal_grid ,stat=astat) -! -! -! HCLOSEGRP( grpGrid ) - - -9999 continue - cput = MPI_WTIME() - Tsphdf5 = Tsphdf5 + ( cput-cpuo ) - return + ijreal(1:Ntz) = zero + ijimag(1:Ntz) = zero + jireal(1:Ntz) = zero + call HDEFGRP( file_id, "grid", grpGrid ) - endif ! myid.eq.0 + ! Igeometry already is in input, Mvol already is in output + call HWRITEIV( grpGrid, "Nt" , 1, (/ Nt /)) + call HWRITEIV( grpGrid, "Nz" , 1, (/ Nz /)) + call HWRITEIV( grpGrid, "Ntz" , 1, (/ Ntz /)) + call HWRITERV( grpGrid, "pi2nfp" , 1, (/ pi2nfp /)) + + ! combine all radial parts into one dimension as Lrad values can be different for different volumes + if (Ngrid .lt. 0) then + sumLrad = sum(Lrad(1:Mvol)+1) + else + sumLrad = (Ngrid + 1) * Mvol + endif -end subroutine write_grid + + allocate( Rij_grid(1:sumLrad, 1:Ntz), stat=astat ) + Rij_grid(1:sumLrad, 1:Ntz) = zero + + allocate( Zij_grid(1:sumLrad, 1:Ntz), stat=astat ) + Zij_grid(1:sumLrad, 1:Ntz) = zero + + allocate( sg_grid(1:sumLrad, 1:Ntz), stat=astat ) + sg_grid(1:sumLrad, 1:Ntz) = zero + + allocate( ijreal_grid(1:sumLrad, 1:Ntz), stat=astat ) + ijreal_grid(1:sumLrad, 1:Ntz) = zero + + allocate( ijimag_grid(1:sumLrad, 1:Ntz), stat=astat ) + ijimag_grid(1:sumLrad, 1:Ntz) = zero + + allocate( jireal_grid(1:sumLrad, 1:Ntz), stat=astat ) + jireal_grid(1:sumLrad, 1:Ntz) = zero + + Ngrid_sum = 0 + + do vvol = 1, Mvol + ivol = vvol + + if( Igeometry.eq.1 .or. vvol.gt.1 ) then + Lcoordinatesingularity = .false. + else + Lcoordinatesingularity = .true. + endif + + if( vvol.le.Nvol ) then + Lplasmaregion = .true. + else + Lplasmaregion = .false. + endif + + Lvacuumregion = .not.Lplasmaregion + ! sets Lcoordinatesingularity and Lplasmaregion ; + + if (Ngrid .lt. 0) then + Ngrid_local = Lrad(vvol) ! default + else + Ngrid_local = Ngrid + endif + if (Ngrid_local .eq. 0) cycle ! nothing to output + + do ii = 0, Ngrid_local ! sub-grid; + lss = ii * two / Ngrid_local - one + if( Lcoordinatesingularity .and. ii.eq.0 ) then + Lcurvature = 0 ! Jacobian is not defined; + else + Lcurvature = 1 ! compute Jacobian ; + endif + + cput = MPI_WTIME() + Tsphdf5 = Tsphdf5 + ( cput-cpuo ) + call coords( vvol, lss, Lcurvature, Ntz, mn ) + cpuo = MPI_WTIME() + ! only Rij(0,:) and Zij(0,:) are required; Rmn & Zmn are available; + + alongLrad = Ngrid_sum+ii+1 + + Rij_grid(alongLrad,1:Ntz) = Rij(1:Ntz,0,0) + Zij_grid(alongLrad,1:Ntz) = Zij(1:Ntz,0,0) + sg_grid (alongLrad,1:Ntz) = sg(1:Ntz,0) + + if( Lcurvature.eq.1 ) then + + select case (Igeometry) + + case (3) + do kk = 0, Nz-1 ; zeta = kk * pi2nfp / Nz + do jj = 0, Nt-1 ; teta = jj * pi2 / Nt ; jk = 1 + jj + kk*Nt ; st(1:2) = (/ lss, teta /) + + cput = MPI_WTIME() + Tsphdf5 = Tsphdf5 + ( cput-cpuo ) + call bfield( zeta, st(1:Node), Bst(1:Node) ) + cpuo = MPI_WTIME() + + ijreal(jk) = ( Rij(jk,1,0) * Bst(1) + Rij(jk,2,0) * Bst(2) + Rij(jk,3,0) * one ) * gBzeta / sg(jk,0) ! BR; + ijimag(jk) = ( one ) * gBzeta / sg(jk,0) ! Bp; + jireal(jk) = ( Zij(jk,1,0) * Bst(1) + Zij(jk,2,0) * Bst(2) + Zij(jk,3,0) * one ) * gBzeta / sg(jk,0) ! BZ; + enddo + enddo + + case (1) + do kk = 0, Nz-1 ; zeta = kk * pi2nfp / Nz + do jj = 0, Nt-1 ; teta = jj * pi2 / Nt ; jk = 1 + jj + kk*Nt ; st(1:2) = (/ lss, teta /) + + cput = MPI_WTIME() + Tsphdf5 = Tsphdf5 + ( cput-cpuo ) + call bfield( zeta, st(1:Node), Bst(1:Node) ) + cpuo = MPI_WTIME() + + ijreal(jk) = ( Rij(jk,1,0) * Bst(1) + Rij(jk,2,0) * Bst(2) + Rij(jk,3,0) * one ) * gBzeta / sg(jk,0) ! BR; + ijimag(jk) = ( rpol ) * gBzeta / sg(jk,0) ! Bzeta; + jireal(jk) = ( + rtor * Bst(2) ) * gBzeta / sg(jk,0) ! Btheta; + enddo + enddo + + case (2) + do kk = 0, Nz-1 ; zeta = kk * pi2nfp / Nz + do jj = 0, Nt-1 ; teta = jj * pi2 / Nt ; jk = 1 + jj + kk*Nt ; st(1:2) = (/ lss, teta /) + + cput = MPI_WTIME() + Tsphdf5 = Tsphdf5 + ( cput-cpuo ) + call bfield( zeta, st(1:Node), Bst(1:Node) ) + cpuo = MPI_WTIME() + + ijreal(jk) = ( Rij(jk,1,0) * Bst(1) + Rij(jk,2,0) * Bst(2) + Rij(jk,3,0) * one ) * gBzeta / sg(jk,0) ! BR; + ijimag(jk) = ( one ) * gBzeta / sg(jk,0) ! Bp; + jireal(jk) = ( Bst(2) ) * gBzeta / sg(jk,0) ! BZ; + enddo + enddo + + end select !Igeometry + endif ! end of if( Lcurvature.eq.1 ) ; + + ijreal_grid(alongLrad,1:Ntz) = ijreal(1:Ntz) + ijimag_grid(alongLrad,1:Ntz) = ijimag(1:Ntz) + jireal_grid(alongLrad,1:Ntz) = jireal(1:Ntz) + + enddo ! end of do ii; + + Ngrid_sum = Ngrid_sum + Ngrid_local + 1 ! offset for storing data + + enddo ! end of do vvol; + + call HWRITERA( grpGrid, "Rij", sumLrad, Ntz, Rij_grid ) + call HWRITERA( grpGrid, "Zij", sumLrad, Ntz, Zij_grid ) + call HWRITERA( grpGrid, "sg", sumLrad, Ntz, sg_grid ) + call HWRITERA( grpGrid, "BR", sumLrad, Ntz, ijreal_grid ) + call HWRITERA( grpGrid, "Bp", sumLrad, Ntz, ijimag_grid ) + call HWRITERA( grpGrid, "BZ", sumLrad, Ntz, jireal_grid ) + + deallocate(Rij_grid ,stat=astat) + deallocate(Zij_grid ,stat=astat) + deallocate(sg_grid ,stat=astat) + deallocate(ijreal_grid ,stat=astat) + deallocate(ijimag_grid ,stat=astat) + deallocate(jireal_grid ,stat=astat) + + call HCLOSEGRP( grpGrid ) + + endif ! myid.eq.0 +end subroutine ! write_grid !> \brief Initialize field line tracing output group and create array datasets. !> \ingroup grp_output @@ -848,6 +835,7 @@ subroutine init_flt_output( numTrajTotal ) integer(HSIZE_T), dimension(rankP) :: dims_traj ! Dataset dimensions. integer(HSIZE_T), dimension(rankP) :: length ! Dataset dimensions. + integer :: hdfier !< error flag for HDF5 library cpui = MPI_WTIME() cpuo = cpui @@ -857,71 +845,70 @@ subroutine init_flt_output( numTrajTotal ) nthreads = 1 #endif - if (myid.eq.0 .and. .not.skip_write) then -! ! create Poincare group in HDF5 file -! HDEFGRP( file_id, poincare, grpPoincare ) -! -! dims_traj = (/ Nz, nPpts, numTrajTotal /) ! dimensions for whole Poincare dataset -! length = (/ Nz, nPpts, 1 /) ! which is written in these slice lengths -! -! ! Create the data space for the dataset. -! H5CALL( sphdf5, h5screate_simple_f, (rankP, dims_traj, filespace_t, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5screate_simple_f, (rankP, dims_traj, filespace_s, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5screate_simple_f, (rankP, dims_traj, filespace_R, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5screate_simple_f, (rankP, dims_traj, filespace_Z, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5screate_simple_f, (1, int((/ numTrajTotal /),HSIZE_T), filespace_success, hdfier), __FILE__, __LINE__ ) -! -! ! Create the dataset with default properties. -! H5CALL( sphdf5, h5dcreate_f, (grpPoincare, "t", H5T_NATIVE_DOUBLE, filespace_t, dset_id_t, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5dcreate_f, (grpPoincare, "s", H5T_NATIVE_DOUBLE, filespace_s, dset_id_s, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5dcreate_f, (grpPoincare, "R", H5T_NATIVE_DOUBLE, filespace_R, dset_id_R, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5dcreate_f, (grpPoincare, "Z", H5T_NATIVE_DOUBLE, filespace_Z, dset_id_Z, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5dcreate_f, (grpPoincare, "success", H5T_NATIVE_INTEGER, filespace_success, dset_id_success, hdfier), __FILE__, __LINE__ ) -! -! ! filespaces can be closed as soon as datasets are created -! H5CALL( sphdf5, h5sclose_f, (filespace_t, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5sclose_f, (filespace_s, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5sclose_f, (filespace_R, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5sclose_f, (filespace_Z, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5sclose_f, (filespace_success, hdfier), __FILE__, __LINE__ ) -! -! ! Select hyperslab in the file. -! H5CALL( sphdf5, h5dget_space_f, (dset_id_t, filespace_t, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5dget_space_f, (dset_id_s, filespace_s, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5dget_space_f, (dset_id_R, filespace_R, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5dget_space_f, (dset_id_Z, filespace_Z, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5dget_space_f, (dset_id_success, filespace_success, hdfier), __FILE__, __LINE__ ) -! -! ! Each process defines dataset in memory and writes it to the hyperslab in the file. -! H5CALL( sphdf5, h5screate_simple_f, (rankP, length, memspace_t, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5screate_simple_f, (rankP, length, memspace_s, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5screate_simple_f, (rankP, length, memspace_R, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5screate_simple_f, (rankP, length, memspace_Z, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5screate_simple_f, (1, int((/ 1 /),HSIZE_T), memspace_success, hdfier), __FILE__, __LINE__ ) -! -! ! create rotational transform group in HDF5 file -! HDEFGRP( file_id, transform, grpTransform ) -! -! ! Create the data space for the dataset. -! H5CALL( sphdf5, h5screate_simple_f, (rankT, int((/ 2,Mvol/),HSIZE_T), filespace_diotadxup, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5screate_simple_f, (rankT, int((/numTrajTotal, 2/),HSIZE_T), filespace_fiota , hdfier), __FILE__, __LINE__ ) -! -! ! Create the dataset with default properties. -! H5CALL( sphdf5, h5dcreate_f, (grpTransform, "diotadxup", H5T_NATIVE_DOUBLE, filespace_diotadxup, dset_id_diotadxup, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5dcreate_f, (grpTransform, "fiota", H5T_NATIVE_DOUBLE, filespace_fiota , dset_id_fiota , hdfier), __FILE__, __LINE__ ) -! -! ! filespaces can be closed as soon as datasets are created -! H5CALL( sphdf5, h5sclose_f, (filespace_diotadxup, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5sclose_f, (filespace_fiota , hdfier), __FILE__, __LINE__ ) -! -! ! Select hyperslab in the file. -! H5CALL( sphdf5, h5dget_space_f, (dset_id_diotadxup, filespace_diotadxup, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5dget_space_f, (dset_id_fiota , filespace_fiota , hdfier), __FILE__, __LINE__ ) -! -! ! Each process defines dataset in memory and writes it to the hyperslab in the file. -! H5CALL( sphdf5, h5screate_simple_f, (rankT, int((/2,1/),HSIZE_T), memspace_diotadxup, hdfier), __FILE__, __LINE__ ) + ! create Poincare group in HDF5 file + call HDEFGRP( file_id, "poincare", grpPoincare ) + + dims_traj = (/ Nz, nPpts, numTrajTotal /) ! dimensions for whole Poincare dataset + length = (/ Nz, nPpts, 1 /) ! which is written in these slice lengths + + ! Create the data space for the dataset. + call h5screate_simple_f(rankP, dims_traj, filespace_t, hdfier) + call h5screate_simple_f(rankP, dims_traj, filespace_s, hdfier) + call h5screate_simple_f(rankP, dims_traj, filespace_R, hdfier) + call h5screate_simple_f(rankP, dims_traj, filespace_Z, hdfier) + call h5screate_simple_f(1, int((/ numTrajTotal /),HSIZE_T), filespace_success, hdfier) + + ! Create the dataset with default properties. + call h5dcreate_f(grpPoincare, "t", H5T_NATIVE_DOUBLE, filespace_t, dset_id_t, hdfier) + call h5dcreate_f(grpPoincare, "s", H5T_NATIVE_DOUBLE, filespace_s, dset_id_s, hdfier) + call h5dcreate_f(grpPoincare, "R", H5T_NATIVE_DOUBLE, filespace_R, dset_id_R, hdfier) + call h5dcreate_f(grpPoincare, "Z", H5T_NATIVE_DOUBLE, filespace_Z, dset_id_Z, hdfier) + call h5dcreate_f(grpPoincare, "success", H5T_NATIVE_INTEGER, filespace_success, dset_id_success, hdfier) + + ! filespaces can be closed as soon as datasets are created + call h5sclose_f(filespace_t, hdfier) + call h5sclose_f(filespace_s, hdfier) + call h5sclose_f(filespace_R, hdfier) + call h5sclose_f(filespace_Z, hdfier) + call h5sclose_f(filespace_success, hdfier) + + ! Select hyperslab in the file. + call h5dget_space_f(dset_id_t, filespace_t, hdfier) + call h5dget_space_f(dset_id_s, filespace_s, hdfier) + call h5dget_space_f(dset_id_R, filespace_R, hdfier) + call h5dget_space_f(dset_id_Z, filespace_Z, hdfier) + call h5dget_space_f(dset_id_success, filespace_success, hdfier) + + ! Each process defines dataset in memory and writes it to the hyperslab in the file. + call h5screate_simple_f(rankP, length, memspace_t, hdfier) + call h5screate_simple_f(rankP, length, memspace_s, hdfier) + call h5screate_simple_f(rankP, length, memspace_R, hdfier) + call h5screate_simple_f(rankP, length, memspace_Z, hdfier) + call h5screate_simple_f(1, int((/ 1 /),HSIZE_T), memspace_success, hdfier) + + ! create rotational transform group in HDF5 file + call HDEFGRP( file_id, "transform", grpTransform ) + + ! Create the data space for the dataset. + call h5screate_simple_f(rankT, int((/ 2,Mvol/),HSIZE_T), filespace_diotadxup, hdfier) + call h5screate_simple_f(rankT, int((/numTrajTotal, 2/),HSIZE_T), filespace_fiota , hdfier) + + ! Create the dataset with default properties. + call h5dcreate_f(grpTransform, "diotadxup", H5T_NATIVE_DOUBLE, filespace_diotadxup, dset_id_diotadxup, hdfier) + call h5dcreate_f(grpTransform, "fiota", H5T_NATIVE_DOUBLE, filespace_fiota , dset_id_fiota , hdfier) + + ! filespaces can be closed as soon as datasets are created + call h5sclose_f(filespace_diotadxup, hdfier) + call h5sclose_f(filespace_fiota , hdfier) + + ! Select hyperslab in the file. + call h5dget_space_f(dset_id_diotadxup, filespace_diotadxup, hdfier) + call h5dget_space_f(dset_id_fiota , filespace_fiota , hdfier) + + ! Each process defines dataset in memory and writes it to the hyperslab in the file. + call h5screate_simple_f(rankT, int((/2,1/),HSIZE_T), memspace_diotadxup, hdfier) endif ! myid.eq.0 @@ -946,7 +933,7 @@ subroutine write_poincare( offset, data, success ) implicit none integer :: ierr, astat, ios, nthreads, ithread real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; - + integer :: hdfier !< error flag for HDF5 library integer, intent(in) :: offset, success(:) real(wp), intent(in) :: data(:,:,:) @@ -964,31 +951,31 @@ subroutine write_poincare( offset, data, success ) if (myid.eq.0 .and. .not.skip_write) then -! -! dims_singleTraj = (/ Nz, nPpts /) -! length = (/ Nz, nPpts, 1 /) -! -! ! On entry, Fortran does not know that indexing in data is from 0 to Nz-1. -! ! Hence, use default indices 1:Nz in this routine -! H5CALL( sphdf5, h5sselect_hyperslab_f, (filespace_t, H5S_SELECT_SET_F, int((/0,0,offset/),HSSIZE_T), length, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5dwrite_f, (dset_id_t, H5T_NATIVE_DOUBLE, data(1,1:Nz,1:nPpts), dims_singleTraj, hdfier, & -! & file_space_id=filespace_t, mem_space_id=memspace_t ), __FILE__, __LINE__ ) -! -! H5CALL( sphdf5, h5sselect_hyperslab_f, (filespace_s, H5S_SELECT_SET_F, int((/0,0,offset/),HSSIZE_T), length, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5dwrite_f, (dset_id_s, H5T_NATIVE_DOUBLE, data(2,1:Nz,1:nPpts), dims_singleTraj, hdfier, & -! & file_space_id=filespace_s, mem_space_id=memspace_s ), __FILE__, __LINE__ ) -! -! H5CALL( sphdf5, h5sselect_hyperslab_f, (filespace_R, H5S_SELECT_SET_F, int((/0,0,offset/),HSSIZE_T), length, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5dwrite_f, (dset_id_R, H5T_NATIVE_DOUBLE, data(3,1:Nz,1:nPpts), dims_singleTraj, hdfier, & -! & file_space_id=filespace_R, mem_space_id=memspace_R ), __FILE__, __LINE__ ) -! -! H5CALL( sphdf5, h5sselect_hyperslab_f, (filespace_Z, H5S_SELECT_SET_F, int((/0,0,offset/),HSSIZE_T), length, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5dwrite_f, (dset_id_Z, H5T_NATIVE_DOUBLE, data(4,1:Nz,1:nPpts), dims_singleTraj, hdfier, & -! & file_space_id=filespace_Z, mem_space_id=memspace_Z ), __FILE__, __LINE__ ) -! -! H5CALL( sphdf5, h5sselect_hyperslab_f, (filespace_success, H5S_SELECT_SET_F, int((/offset/),HSSIZE_T), int((/1/), HSIZE_T), hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5dwrite_f, (dset_id_success, H5T_NATIVE_INTEGER, success, int((/1/), HSIZE_T), hdfier, & -! & file_space_id=filespace_success, mem_space_id=memspace_success ), __FILE__, __LINE__ ) + + dims_singleTraj = (/ Nz, nPpts /) + length = (/ Nz, nPpts, 1 /) + + ! On entry, Fortran does not know that indexing in data is from 0 to Nz-1. + ! Hence, use default indices 1:Nz in this routine + call h5sselect_hyperslab_f(filespace_t, H5S_SELECT_SET_F, int((/0,0,offset/),HSSIZE_T), length, hdfier) + call h5dwrite_f(dset_id_t, H5T_NATIVE_DOUBLE, data(1,1:Nz,1:nPpts), dims_singleTraj, hdfier, & + file_space_id=filespace_t, mem_space_id=memspace_t ) + + call h5sselect_hyperslab_f(filespace_s, H5S_SELECT_SET_F, int((/0,0,offset/),HSSIZE_T), length, hdfier) + call h5dwrite_f(dset_id_s, H5T_NATIVE_DOUBLE, data(2,1:Nz,1:nPpts), dims_singleTraj, hdfier, & + file_space_id=filespace_s, mem_space_id=memspace_s ) + + call h5sselect_hyperslab_f(filespace_R, H5S_SELECT_SET_F, int((/0,0,offset/),HSSIZE_T), length, hdfier) + call h5dwrite_f(dset_id_R, H5T_NATIVE_DOUBLE, data(3,1:Nz,1:nPpts), dims_singleTraj, hdfier, & + file_space_id=filespace_R, mem_space_id=memspace_R ) + + call h5sselect_hyperslab_f(filespace_Z, H5S_SELECT_SET_F, int((/0,0,offset/),HSSIZE_T), length, hdfier) + call h5dwrite_f(dset_id_Z, H5T_NATIVE_DOUBLE, data(4,1:Nz,1:nPpts), dims_singleTraj, hdfier, & + file_space_id=filespace_Z, mem_space_id=memspace_Z ) + + call h5sselect_hyperslab_f(filespace_success, H5S_SELECT_SET_F, int((/offset/),HSSIZE_T), int((/1/), HSIZE_T), hdfier) + call h5dwrite_f(dset_id_success, H5T_NATIVE_INTEGER, success, int((/1/), HSIZE_T), hdfier, & + file_space_id=filespace_success, mem_space_id=memspace_success ) endif ! myid.eq.0 @@ -1015,7 +1002,7 @@ subroutine write_transform( offset, length, lvol, diotadxup, fiota ) integer, intent(in) :: offset, length, lvol real(wp), intent(in) :: diotadxup(:), fiota(:,:) - + integer :: hdfier !< error flag for HDF5 library cpui = MPI_WTIME() cpuo = cpui @@ -1028,18 +1015,18 @@ subroutine write_transform( offset, length, lvol, diotadxup, fiota ) if (myid.eq.0 .and. .not.skip_write) then -! H5CALL( sphdf5, h5sselect_hyperslab_f, (filespace_diotadxup, H5S_SELECT_SET_F, int((/0,lvol-1/),HSSIZE_T), int((/2,1/),HSSIZE_T), hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5dwrite_f, (dset_id_diotadxup, H5T_NATIVE_DOUBLE, diotadxup, int((/2,1/),HSSIZE_T), hdfier, & -! & file_space_id=filespace_diotadxup, mem_space_id=memspace_diotadxup ), __FILE__, __LINE__ ) -! -! ! length of fiota piece to write here may change, so open and close memspace each time a new hyperslab is written -! H5CALL( sphdf5, h5screate_simple_f, (rankT, int((/length,2/),HSIZE_T), memspace_fiota , hdfier), __FILE__, __LINE__ ) -! -! H5CALL( sphdf5, h5sselect_hyperslab_f, (filespace_fiota, H5S_SELECT_SET_F, int((/offset,0/),HSSIZE_T), int((/length,2/),HSSIZE_T), hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5dwrite_f, (dset_id_fiota, H5T_NATIVE_DOUBLE, fiota(1:length,1:2), int((/length,2/),HSSIZE_T), hdfier, & -! & file_space_id=filespace_fiota, mem_space_id=memspace_fiota ), __FILE__, __LINE__ ) -! -! H5CALL( sphdf5, h5sclose_f, (memspace_fiota, hdfier), __FILE__, __LINE__ ) + call h5sselect_hyperslab_f(filespace_diotadxup, H5S_SELECT_SET_F, int((/0,lvol-1/),HSSIZE_T), int((/2,1/),HSSIZE_T), hdfier) + call h5dwrite_f(dset_id_diotadxup, H5T_NATIVE_DOUBLE, diotadxup, int((/2,1/),HSSIZE_T), hdfier, & + file_space_id=filespace_diotadxup, mem_space_id=memspace_diotadxup ) + + ! length of fiota piece to write here may change, so open and close memspace each time a new hyperslab is written + call h5screate_simple_f(rankT, int((/length,2/),HSIZE_T), memspace_fiota , hdfier) + + call h5sselect_hyperslab_f(filespace_fiota, H5S_SELECT_SET_F, int((/offset,0/),HSSIZE_T), int((/length,2/),HSSIZE_T), hdfier) + call h5dwrite_f(dset_id_fiota, H5T_NATIVE_DOUBLE, fiota(1:length,1:2), int((/length,2/),HSSIZE_T), hdfier, & + file_space_id=filespace_fiota, mem_space_id=memspace_fiota ) + + call h5sclose_f(memspace_fiota, hdfier) endif ! myid.eq.0 @@ -1052,59 +1039,41 @@ end subroutine write_transform !> which had to be kept open during the tracing to be able to write !> the outputs directly when a given worker thread is finished. subroutine finalize_flt_output - - -#ifdef OPENMP - USE OMP_LIB -#endif - use mpi - implicit none - integer :: ierr, astat, ios, nthreads, ithread - real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; - - - - cpui = MPI_WTIME() - cpuo = cpui -#ifdef OPENMP - nthreads = omp_get_max_threads() -#else - nthreads = 1 -#endif - + use allglobal, only: myid, skip_write + integer :: hdfier !< error flag for HDF5 library if (myid.eq.0 .and. .not.skip_write) then -! -! ! close filespaces -! H5CALL( sphdf5, h5sclose_f, (filespace_t, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5sclose_f, (filespace_s, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5sclose_f, (filespace_R, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5sclose_f, (filespace_Z, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5sclose_f, (filespace_success, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5sclose_f, (filespace_diotadxup, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5sclose_f, (filespace_fiota, hdfier), __FILE__, __LINE__ ) -! -! ! close dataspaces -! H5CALL( sphdf5, h5sclose_f, (memspace_t, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5sclose_f, (memspace_s, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5sclose_f, (memspace_R, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5sclose_f, (memspace_Z, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5sclose_f, (memspace_success, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5sclose_f, (memspace_diotadxup, hdfier), __FILE__, __LINE__ ) -! ! memspace_fiota is re-opened/closed in each iteration (see write_transform) -! -! ! close datasets -! H5CALL( sphdf5, h5dclose_f, (dset_id_t, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5dclose_f, (dset_id_s, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5dclose_f, (dset_id_R, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5dclose_f, (dset_id_Z, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5dclose_f, (dset_id_success, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5dclose_f, (dset_id_diotadxup, hdfier), __FILE__, __LINE__ ) -! H5CALL( sphdf5, h5dclose_f, (dset_id_fiota, hdfier), __FILE__, __LINE__ ) -! -! ! close groups -! HCLOSEGRP( grpPoincare ) -! HCLOSEGRP( grpTransform ) + + ! close filespaces + call h5sclose_f(filespace_t, hdfier) + call h5sclose_f(filespace_s, hdfier) + call h5sclose_f(filespace_R, hdfier) + call h5sclose_f(filespace_Z, hdfier) + call h5sclose_f(filespace_success, hdfier) + call h5sclose_f(filespace_diotadxup, hdfier) + call h5sclose_f(filespace_fiota, hdfier) + + ! close dataspaces + call h5sclose_f(memspace_t, hdfier) + call h5sclose_f(memspace_s, hdfier) + call h5sclose_f(memspace_R, hdfier) + call h5sclose_f(memspace_Z, hdfier) + call h5sclose_f(memspace_success, hdfier) + call h5sclose_f(memspace_diotadxup, hdfier) + ! memspace_fiota is re-opened/closed in each iteration (see write_transform) + + ! close datasets + call h5dclose_f(dset_id_t, hdfier) + call h5dclose_f(dset_id_s, hdfier) + call h5dclose_f(dset_id_R, hdfier) + call h5dclose_f(dset_id_Z, hdfier) + call h5dclose_f(dset_id_success, hdfier) + call h5dclose_f(dset_id_diotadxup, hdfier) + call h5dclose_f(dset_id_fiota, hdfier) + + ! close groups + call HCLOSEGRP( grpPoincare ) + call HCLOSEGRP( grpTransform ) endif ! myid.eq.0 @@ -1124,42 +1093,26 @@ end subroutine finalize_flt_output !> @param allAto \f$A^{\theta}_\mathrm{odd}\f$ for all nested volumes !> @param allAzo \f$A^{\zeta}_\mathrm{odd}\f$ for all nested volumes subroutine write_vector_potential(sumLrad, allAte, allAze, allAto, allAzo) - - use allglobal, only : mn - - -#ifdef OPENMP - USE OMP_LIB -#endif - use mpi - implicit none - integer :: ierr, astat, ios, nthreads, ithread - real(wp) :: cput, cpui, cpuo=0 ! cpu time; cpu initial; cpu old; 31 Jan 13; + use allglobal, only : mn, myid, skip_write integer, intent(in) :: sumLrad - real(wp), intent(in) :: allAte(:,:), allAze(:,:), allAto(:,:), allAzo(:,:) - integer(hid_t) :: grpVectorPotential + real(wp), dimension(:,:), intent(in) :: allAte + real(wp), dimension(:,:), intent(in) :: allAze + real(wp), dimension(:,:), intent(in) :: allAto + real(wp), dimension(:,:), intent(in) :: allAzo + integer(hid_t) :: grpVectorPotential - cpui = MPI_WTIME() - cpuo = cpui -#ifdef OPENMP - nthreads = omp_get_max_threads() -#else - nthreads = 1 -#endif + if (myid.eq.0 .and. .not.skip_write) then + call HDEFGRP( file_id, "vector_potential", grpVectorPotential ) - if (myid.eq.0 .and. .not.skip_write) then + call HWRITERA( grpVectorPotential, "Ate", sumLrad, mn, allAte(1:sumLrad,1:mn) ) + call HWRITERA( grpVectorPotential, "Aze", sumLrad, mn, allAze(1:sumLrad,1:mn) ) + call HWRITERA( grpVectorPotential, "Ato", sumLrad, mn, allAto(1:sumLrad,1:mn) ) + call HWRITERA( grpVectorPotential, "Azo", sumLrad, mn, allAzo(1:sumLrad,1:mn) ) -! HDEFGRP( file_id, vector_potential, grpVectorPotential ) -! -! HWRITERA( grpVectorPotential, sumLrad, mn, Ate, allAte(1:sumLrad,1:mn) ) -! HWRITERA( grpVectorPotential, sumLrad, mn, Aze, allAze(1:sumLrad,1:mn) ) -! HWRITERA( grpVectorPotential, sumLrad, mn, Ato, allAto(1:sumLrad,1:mn) ) -! HWRITERA( grpVectorPotential, sumLrad, mn, Azo, allAzo(1:sumLrad,1:mn) ) -! -! HCLOSEGRP( grpVectorPotential ) + call HCLOSEGRP( grpVectorPotential ) endif ! myid.eq.0 @@ -1212,120 +1165,119 @@ subroutine hdfint if (myid.eq.0 .and. .not.skip_write) then -! -! HDEFGRP( file_id, output, grpOutput ) -! -! HWRITERV( grpOutput, mn, Vns, iVns(1:mn) ) ! stellarator symmetric normal field at boundary; vacuum component; -! HWRITERV( grpOutput, mn, Bns, iBns(1:mn) ) ! stellarator symmetric normal field at boundary; plasma component; -! HWRITERV( grpOutput, mn, Vnc, iVnc(1:mn) ) ! non-stellarator symmetric normal field at boundary; vacuum component; -! HWRITERV( grpOutput, mn, Bnc, iBnc(1:mn) ) ! non-stellarator symmetric normal field at boundary; plasma component; -! -! !>

    -! -! HCLOSEGRP( grpOutput ) + + call HDEFGRP( file_id, "output", grpOutput ) + + call HWRITERV( grpOutput, "Vns", mn, iVns(1:mn) ) ! stellarator symmetric normal field at boundary; vacuum component; + call HWRITERV( grpOutput, "Bns", mn, iBns(1:mn) ) ! stellarator symmetric normal field at boundary; plasma component; + call HWRITERV( grpOutput, "Vnc", mn, iVnc(1:mn) ) ! non-stellarator symmetric normal field at boundary; vacuum component; + call HWRITERV( grpOutput, "Bnc", mn, iBnc(1:mn) ) ! non-stellarator symmetric normal field at boundary; plasma component; + +!>
      +!>
    • In addition to the input variables, which are described in global(), the following quantities are written to \c ext.sp.h5 : +!latex +!latex \begin{tabular}{|l|l|l|} \hline + +!latex \type{variable} & type & \pb{description} \\ \hline + +!latex \type{mn} & integer & \pb{number of Fourier modes} \\ + call HWRITEIV( grpOutput, "mn", 1, (/ mn /) ) +!latex \type{im(1:mn)} & integer & \pb{poloidal mode numbers} \\ + call HWRITEIV( grpOutput, "im", mn, im(1:mn) ) +!latex \type{in(1:mn)} & integer & \pb{toroidal mode numbers} \\ + call HWRITEIV( grpOutput, "in", mn, in(1:mn) ) +!latex \type{mns} & integer & \pb{number of Fourier modes} \\ + call HWRITEIV( grpOutput, "mns", 1, (/ mns /) ) +!latex \type{ims(1:mns)} & integer & \pb{poloidal mode numbers} \\ + call HWRITEIV( grpOutput, "ims", mns, ims(1:mns) ) +!latex \type{ins(1:mns)} & integer & \pb{toroidal mode numbers} \\ + call HWRITEIV( grpOutput, "ins", mns, ins(1:mns) ) +!latex \type{Mvol} & integer & \pb{number of interfaces = number of volumes} \\ + call HWRITEIV( grpOutput, "Mvol", 1, (/ Mvol /)) +!latex \type{iRbc(1:mn,0:Mvol)} & real & \pb{Fourier harmonics, $R_{m,n}$, of interfaces} \\ + call HWRITERA( grpOutput, "Rbc", mn, (Mvol+1), iRbc(1:mn,0:Mvol) ) +!latex \type{iZbs(1:mn,0:Mvol)} & real & \pb{Fourier harmonics, $Z_{m,n}$, of interfaces} \\ + call HWRITERA( grpOutput, "Zbs", mn, (Mvol+1), iZbs(1:mn,0:Mvol) ) +!latex \type{iRbs(1:mn,0:Mvol)} & real & \pb{Fourier harmonics, $R_{m,n}$, of interfaces} \\ + call HWRITERA( grpOutput, "Rbs", mn, (Mvol+1), iRbs(1:mn,0:Mvol) ) +!latex \type{iZbc(1:mn,0:Mvol)} & real & \pb{Fourier harmonics, $Z_{m,n}$, of interfaces} \\ + call HWRITERA( grpOutput, "Zbc", mn, (Mvol+1), iZbc(1:mn,0:Mvol) ) +!l tex \type{forcetol} & real & \pb{force-balance error across interfaces} \\ +! HWRITERV( grpOutput, 1, forcetol, (/ forcetol /)) ! already in /input/global +!latex \type{ForceErr} & real & \pb{force-balance error across interfaces} \\ + call HWRITERV( grpOutput, "ForceErr", 1, (/ ForceErr /)) +!latex \type{Ivolume} & real & \pb{Volume current at output (parallel, externally induced)} + call HWRITERV( grpOutput, "Ivolume", Mvol, Ivolume(1:Mvol)) +!latex \type{IPDt} & real & \pb{Surface current at output} + call HWRITERV( grpOutput, "IPDt", Mvol, IPDt(1:Mvol)) + + ! the following quantites can be different from input value + call HWRITERV( grpOutput, "adiabatic" , Mvol, adiabatic(1:Nvol) ) + call HWRITERV( grpOutput, "helicity" , Nvol, helicity(1:Nvol) ) + call HWRITERV( grpOutput, "mu" , Mvol, mu(1:Mvol) ) + call HWRITERV( grpOutput, "tflux" , Mvol, tflux(1:Mvol) ) + call HWRITERV( grpOutput, "pflux" , Mvol, pflux(1:Mvol) ) + + if( Lcheck.eq.1 ) then +!latex \type{beltramierror} & real & \pb{error in beltrami field (volume integral)} \\ + call HWRITERA( grpOutput, "beltramierror", Mvol, 3, beltramierror(1:Mvol,1:3) ) + endif + + if( allocated(vvolume) ) then ! why is it required to confirm that vvolume has been allocated ; 24 Nov 16; + + tvolume = sum(vvolume(1:Nvol) ) +!latex \type{volume} & real & \pb{total volume = $\sum V_v$} \\ + call HWRITERV( grpOutput, "volume", 1, (/ tvolume /)) + + else + + if (Wsphdf5) write(ounit,'("hdfint : ", 10x ," : myid=",i3," ; vvolume is not allocated ;")') myid + + endif ! end of if( allocated(vvolume) ) ; 11 Aug 14; + + Mrad = maxval( Lrad(1:Mvol) ) +!latex \type{Mrad} & integer & \pb{the maximum radial (Chebyshev) resolution} \\ + call HWRITEIV( grpOutput, "Mrad", 1, (/ Mrad /)) +!latex \type{TT(0:Mrad,0:1,0:1)} & real & \pb{the Chebyshev polynomials, $T_l$, and their derivatives, evaluated at $s=\pm 1$} \\ + call HWRITERC( grpOutput, "TT", (Mrad+1), 2, 2, TT(0:Mrad,0:1,0:1) ) +!latex \type{Btemn(1:mn,0:1,1:Mvol)} & real & \pb{the cosine harmonics of the covariant poloidal field, \\ +!latex i.e. $[[B_{\t,j}]]$ evaluated on the inner and outer interface in each volume} \\ + call HWRITERC( grpOutput, "Btemn", mn, 2, Mvol, Btemn(1:mn,0:1,1:Mvol) ) +!latex \type{Bzemn(1:mn,0:1,1:Mvol)} & real & \pb{the cosine harmonics of the covariant toroidal field, \\ +!latex i.e. $[[B_{\z,j}]]$ evaluated on the inner and outer interface in each volume} \\ + call HWRITERC( grpOutput, "Bzemn", mn, 2, Mvol, Bzemn(1:mn,0:1,1:Mvol) ) +!latex \type{Btomn(1:mn,0:1,1:Mvol)} & real & \pb{the sine harmonics of the covariant poloidal field, \\ +!latex i.e. $[[B_{\t,j}]]$ evaluated on the inner and outer interface in each volume} \\ + call HWRITERC( grpOutput, "Btomn", mn, 2, Mvol, Btomn(1:mn,0:1,1:Mvol) ) +!latex \type{Bzomn(1:mn,0:1,1:Mvol)} & real & \pb{the sine harmonics of the covariant toroidal field, \\ +!latex i.e. $[[B_{\z,j}]]$ evaluated on the inner and outer interface in each volume} \\ + call HWRITERC( grpOutput, "Bzomn", mn, 2, Mvol, Bzomn(1:mn,0:1,1:Mvol) ) + +! Write lambda_mn, Fourier harmonics or transformation to straight field line coordinates. + call HWRITERC( grpOutput, "lambdamn", lmns, Mvol, 2, dlambdaout(1:lmns,1:Mvol,0:1) ) + + if( Lperturbed.eq.1 ) then + +!latex \type{dRbc(1:mn,0:Nvol)} & real & \pb{Fourier harmonics, $R_{j}$, of interfaces; linearly perturbed solution} \\ + call HWRITERA( grpOutput, "dRbc", mn, (Nvol+1), dRbc(1:mn,0:Nvol) ) +!latex \type{dZbs(1:mn,0:Nvol)} & real & \pb{Fourier harmonics, $Z_{j}$, of interfaces; linearly perturbed solution} \\ + call HWRITERA( grpOutput, "dZbs", mn, (Nvol+1), dZbs(1:mn,0:Nvol) ) +!latex \type{dRbs(1:mn,0:Nvol)} & real & \pb{Fourier harmonics, $R_{j}$, of interfaces; linearly perturbed solution} \\ + call HWRITERA( grpOutput, "dRbs", mn, (Nvol+1), dRbs(1:mn,0:Nvol) ) +!latex \type{dZbc(1:mn,0:Nvol)} & real & \pb{Fourier harmonics, $Z_{j}$, of interfaces; linearly perturbed solution} \\ + call HWRITERA( grpOutput, "dZbc", mn, (Nvol+1), dZbc(1:mn,0:Nvol) ) + + endif + +!latex \type{lmns} & integer & \pb{resolution of straight fieldline transformation} \\ + call HWRITEIV( grpOutput, "lmns", 1, (/ lmns /)) + +!latex \hline \end{tabular} +!>
    • +!>
    • All quantities marked as real should be treated as double precision.
    • +!>
    + + call HCLOSEGRP( grpOutput ) endif ! myid.eq.0 @@ -1356,6 +1308,7 @@ subroutine finish_outfile integer(size_t),parameter :: dummySize=1 character(len=dummySize+1) :: dummyName integer :: typeClass + integer :: hdfier !< error flag for HDF5 library cpui = MPI_WTIME() @@ -1369,85 +1322,85 @@ subroutine finish_outfile if (myid.eq.0 .and. .not.skip_write) then -! ! close objects related to convergence output -! H5CALL( sphdf5, h5tclose_f, (dt_nDcalls_id, hdfier) , __FILE__, __LINE__) -! H5CALL( sphdf5, h5tclose_f, (dt_Energy_id, hdfier) , __FILE__, __LINE__) -! H5CALL( sphdf5, h5tclose_f, (dt_ForceErr_id, hdfier) , __FILE__, __LINE__) -! H5CALL( sphdf5, h5tclose_f, (dt_iRbc_id, hdfier) , __FILE__, __LINE__) -! H5CALL( sphdf5, h5tclose_f, (dt_iZbs_id, hdfier) , __FILE__, __LINE__) -! H5CALL( sphdf5, h5tclose_f, (dt_iRbs_id, hdfier) , __FILE__, __LINE__) -! H5CALL( sphdf5, h5tclose_f, (dt_iZbc_id, hdfier) , __FILE__, __LINE__) -! H5CALL( sphdf5, h5dclose_f, (iteration_dset_id, hdfier), __FILE__, __LINE__) ! End access to the dataset and release resources used by it. -! H5CALL( sphdf5, h5pclose_f, (plist_id, hdfier) , __FILE__, __LINE__) ! close plist used for 'preserve' flag (does not show up in obj_count below) -! -! ! check whether we forgot to close some resources; only check for group, dataset and datatype (there is only one file and that should be still open...) -! H5CALL( sphdf5, h5fget_obj_count_f, (file_id, ior(H5F_OBJ_GROUP_F, ior(H5F_OBJ_DATASET_F, H5F_OBJ_DATATYPE_F)), obj_count, hdfier), __FILE__, __LINE__ ) -! -! if (obj_count.gt.0) then -! write(*,'("There are still ",i3," hdf5 objects open")') obj_count -! allocate(obj_ids(1:obj_count)) -! -! ! groups -! H5CALL( sphdf5, h5fget_obj_ids_f, (file_id, H5F_OBJ_GROUP_F, obj_count, obj_ids, hdfier, num_objs), __FILE__, __LINE__) ! get for open objects -! if (num_objs.gt.0) then -! write(*,'("There are still ",i3," HDF5 groups open:")') num_objs -! do iObj=1,num_objs -! openLength=0 -! H5CALL( sphdf5, h5iget_name_f, (obj_ids(iObj), dummyName, dummySize, openLength, hdfier), __FILE__, __LINE__) -! allocate(character(len=openLength+1) :: openName) -! H5CALL( sphdf5, h5iget_name_f, (obj_ids(iObj), openName, openLength, openLength, hdfier), __FILE__, __LINE__) -! write(*,*) openName -! deallocate(openName) -! -! H5CALL( sphdf5, h5gclose_f, (obj_ids(iObj), hdfier), __FILE__, __LINE__) -! enddo -! endif -! -! ! datasets -! H5CALL( sphdf5, h5fget_obj_ids_f, (file_id, H5F_OBJ_DATASET_F, obj_count, obj_ids, hdfier, num_objs), __FILE__, __LINE__) ! get for open objects -! if (num_objs.gt.0) then -! write(*,'("There are still ",i3," HDF5 datasets open:")') num_objs -! do iObj=1,num_objs -! openLength=0 -! H5CALL( sphdf5, h5iget_name_f, (obj_ids(iObj), dummyName, dummySize, openLength, hdfier), __FILE__, __LINE__) -! allocate(character(len=openLength+1) :: openName) -! H5CALL( sphdf5, h5iget_name_f, (obj_ids(iObj), openName, openLength, openLength, hdfier), __FILE__, __LINE__) -! write(*,*) openName(1:openLength) -! deallocate(openName) -! -! H5CALL( sphdf5, h5dclose_f, (obj_ids(iObj), hdfier), __FILE__, __LINE__) -! enddo -! endif -! -! ! datatypes -! H5CALL( sphdf5, h5fget_obj_ids_f, (file_id, H5F_OBJ_DATATYPE_F, obj_count, obj_ids, hdfier, num_objs), __FILE__, __LINE__) ! get for open objects -! if (num_objs.gt.0) then -! write(*,'("There are still ",i3," HDF5 datatypes open:")') num_objs -! do iObj=1,num_objs -! H5CALL( sphdf5, h5tget_class_f, (obj_ids(iObj), typeClass, hdfier), __LINE__, __FILE__) ! determine class of open datatype -! if (typeClass.eq.H5T_NO_CLASS_F ) then ; write(*,*) "H5T_NO_CLASS_F" -! else if (typeClass.eq.H5T_INTEGER_F ) then ; write(*,*) "H5T_INTEGER_F" -! else if (typeClass.eq.H5T_FLOAT_F ) then ; write(*,*) "H5T_FLOAT_F" -! else if (typeClass.eq.H5T_STRING_F ) then ; write(*,*) "H5T_STRING_F" -! else if (typeClass.eq.H5T_BITFIELD_F ) then ; write(*,*) "H5T_BITFIELD_F" -! else if (typeClass.eq.H5T_OPAQUE_F ) then ; write(*,*) "H5T_OPAQUE_F" -! else if (typeClass.eq.H5T_COMPOUND_F ) then ; write(*,*) "H5T_COMPOUND_F" -! else if (typeClass.eq.H5T_REFERENCE_F) then ; write(*,*) "H5T_REFERENCE_F" -! else if (typeClass.eq.H5T_ENUM_F ) then ; write(*,*) "H5T_ENUM_F" -! else if (typeClass.eq.H5T_VLEN_F ) then ; write(*,*) "H5T_VLEN_F" -! else if (typeClass.eq.H5T_ARRAY_F ) then ; write(*,*) "H5T_ARRAY_F" -! else ; write(*,*) "UNKNOWN TYPE!" -! endif -! -! H5CALL( sphdf5, h5tclose_f, (obj_ids(iObj), hdfier), __FILE__, __LINE__) -! enddo -! endif -! -! deallocate(obj_ids) -! endif ! (obj_count.gt.0) -! -! H5CALL( sphdf5, h5fclose_f, ( file_id, hdfier ), __FILE__, __LINE__ ) ! terminate access on output file; -! H5CALL( sphdf5, h5close_f, ( hdfier ), __FILE__, __LINE__ ) ! close Fortran interface to the HDF5 library; + ! close objects related to convergence output + call h5tclose_f(dt_nDcalls_id, hdfier) + call h5tclose_f(dt_Energy_id, hdfier) + call h5tclose_f(dt_ForceErr_id, hdfier) + call h5tclose_f(dt_iRbc_id, hdfier) + call h5tclose_f(dt_iZbs_id, hdfier) + call h5tclose_f(dt_iRbs_id, hdfier) + call h5tclose_f(dt_iZbc_id, hdfier) + call h5dclose_f(iteration_dset_id, hdfier) ! End access to the dataset and release resources used by it. + call h5pclose_f(plist_id, hdfier) ! close plist used for 'preserve' flag (does not show up in obj_count below) + + ! check whether we forgot to close some resources; only check for group, dataset and datatype (there is only one file and that should be still open...) + call h5fget_obj_count_f(file_id, ior(H5F_OBJ_GROUP_F, ior(H5F_OBJ_DATASET_F, H5F_OBJ_DATATYPE_F)), obj_count, hdfier) + + if (obj_count.gt.0) then + write(*,'("There are still ",i3," hdf5 objects open")') obj_count + allocate(obj_ids(1:obj_count)) + + ! groups + call h5fget_obj_ids_f(file_id, H5F_OBJ_GROUP_F, obj_count, obj_ids, hdfier, num_objs) ! get for open objects + if (num_objs.gt.0) then + write(*,'("There are still ",i3," HDF5 groups open:")') num_objs + do iObj=1,num_objs + openLength=0 + call h5iget_name_f(obj_ids(iObj), dummyName, dummySize, openLength, hdfier) + allocate(character(len=openLength+1) :: openName) + call h5iget_name_f(obj_ids(iObj), openName, openLength, openLength, hdfier) + write(*,*) openName + deallocate(openName) + + call h5gclose_f(obj_ids(iObj), hdfier) + enddo + endif + + ! datasets + call h5fget_obj_ids_f(file_id, H5F_OBJ_DATASET_F, obj_count, obj_ids, hdfier, num_objs) ! get for open objects + if (num_objs.gt.0) then + write(*,'("There are still ",i3," HDF5 datasets open:")') num_objs + do iObj=1,num_objs + openLength=0 + call h5iget_name_f(obj_ids(iObj), dummyName, dummySize, openLength, hdfier) + allocate(character(len=openLength+1) :: openName) + call h5iget_name_f(obj_ids(iObj), openName, openLength, openLength, hdfier) + write(*,*) openName(1:openLength) + deallocate(openName) + + call h5dclose_f(obj_ids(iObj), hdfier) + enddo + endif + + ! datatypes + call h5fget_obj_ids_f(file_id, H5F_OBJ_DATATYPE_F, obj_count, obj_ids, hdfier, num_objs) ! get for open objects + if (num_objs.gt.0) then + write(*,'("There are still ",i3," HDF5 datatypes open:")') num_objs + do iObj=1,num_objs + call h5tget_class_f(obj_ids(iObj), typeClass, hdfier) ! determine class of open datatype + if (typeClass.eq.H5T_NO_CLASS_F ) then ; write(*,*) "H5T_NO_CLASS_F" + else if (typeClass.eq.H5T_INTEGER_F ) then ; write(*,*) "H5T_INTEGER_F" + else if (typeClass.eq.H5T_FLOAT_F ) then ; write(*,*) "H5T_FLOAT_F" + else if (typeClass.eq.H5T_STRING_F ) then ; write(*,*) "H5T_STRING_F" + else if (typeClass.eq.H5T_BITFIELD_F ) then ; write(*,*) "H5T_BITFIELD_F" + else if (typeClass.eq.H5T_OPAQUE_F ) then ; write(*,*) "H5T_OPAQUE_F" + else if (typeClass.eq.H5T_COMPOUND_F ) then ; write(*,*) "H5T_COMPOUND_F" + else if (typeClass.eq.H5T_REFERENCE_F) then ; write(*,*) "H5T_REFERENCE_F" + else if (typeClass.eq.H5T_ENUM_F ) then ; write(*,*) "H5T_ENUM_F" + else if (typeClass.eq.H5T_VLEN_F ) then ; write(*,*) "H5T_VLEN_F" + else if (typeClass.eq.H5T_ARRAY_F ) then ; write(*,*) "H5T_ARRAY_F" + else ; write(*,*) "UNKNOWN TYPE!" + endif + + call h5tclose_f(obj_ids(iObj), hdfier) + enddo + endif + + deallocate(obj_ids) + endif ! (obj_count.gt.0) + + call h5fclose_f( file_id, hdfier ) ! terminate access on output file; + call h5close_f( hdfier ) ! close Fortran interface to the HDF5 library; endif ! myid.eq.0 From f729a9de63311c64ec7b85fb200b5b9bc3647a36 Mon Sep 17 00:00:00 2001 From: Jonathan Schilling Date: Sun, 3 Jul 2022 19:07:17 +0200 Subject: [PATCH 08/15] fixup of make dependencies --- Makefile | 76 ++++++++++++++++++++++++++++++++++++++++---------------- SPECfile | 7 ++++-- 2 files changed, 60 insertions(+), 23 deletions(-) diff --git a/Makefile b/Makefile index 0a1047ed..13ff4327 100644 --- a/Makefile +++ b/Makefile @@ -12,6 +12,24 @@ include SPECfile ROBJS=$(SPECFILES:=_r.o) DOBJS=$(SPECFILES:=_d.o) +ROBJS_LEVEL_0=$(LEVEL_0:=_r.o) +DOBJS_LEVEL_0=$(LEVEL_0:=_d.o) + +ROBJS_LEVEL_1=$(LEVEL_1:=_r.o) +DOBJS_LEVEL_1=$(LEVEL_1:=_d.o) + +ROBJS_LEVEL_2=$(LEVEL_2:=_r.o) +DOBJS_LEVEL_2=$(LEVEL_2:=_d.o) + +ROBJS_LEVEL_3=$(LEVEL_3:=_r.o) +DOBJS_LEVEL_3=$(LEVEL_3:=_d.o) + +ROBJS_LEVEL_4=$(LEVEL_4:=_r.o) +DOBJS_LEVEL_4=$(LEVEL_4:=_d.o) + +ROBJS_BASE=$(BASEFILES:=_r.o) +DOBJS_BASE=$(BASEFILES:=_d.o) + ROBJS_IO=$(IOFILES:=_r.o) DOBJS_IO=$(IOFILES:=_d.o) @@ -42,37 +60,54 @@ dspec: $(addsuffix _d.o,$(ALLFILES)) Makefile ############################################################################################################################################################### -mod_kinds_r.o : %_r.o: src/mod_kinds.F90 - $(FC) $(FLAGS) $(CFLAGS) $(RFLAGS) -o mod_kinds_r.o -c src/mod_kinds.F90 $(LIBS) - @wc -l -L -w src/mod_kinds.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' +$(ROBJS_LEVEL_0): %_r.o: src/%.F90 + $(FC) $(FLAGS) $(CFLAGS) $(RFLAGS) -o $*_r.o -c src/$*.F90 $(LIBS) + @wc -l -L -w src/$*.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' @echo '' -mod_kinds_d.o : %_d.o: src/mod_kinds.F90 - $(FC) $(FLAGS) $(CFLAGS) $(DFLAGS) -o mod_kinds_d.o -c src/mod_kinds.F90 $(LIBS) - @wc -l -L -w src/mod_kinds.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' +$(DOBJS_LEVEL_0): %_d.o: src/%.F90 + $(FC) $(FLAGS) $(CFLAGS) $(DFLAGS) -o $*_d.o -c src/$*.F90 $(LIBS) + @wc -l -L -w src/$*.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' @echo '' -inputlist_r.o: %_r.o: mod_kinds_r.o src/inputlist.F90 - $(FC) $(FLAGS) $(CFLAGS) $(RFLAGS) -o inputlist_r.o -c src/inputlist.F90 $(LIBS) - @wc -l -L -w src/inputlist.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' +$(ROBJS_LEVEL_1): %_r.o: src/%.F90 $(addsuffix _r.o,$(LEVEL_0)) + $(FC) $(FLAGS) $(CFLAGS) $(RFLAGS) -o $*_r.o -c src/$*.F90 $(LIBS) + @wc -l -L -w src/$*.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' @echo '' -inputlist_d.o: %_d.o: mod_kinds_d.o src/inputlist.F90 - $(FC) $(FLAGS) $(CFLAGS) $(DFLAGS) -o inputlist_d.o -c src/inputlist.F90 $(LIBS) - @wc -l -L -w src/inputlist.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' +$(DOBJS_LEVEL_1): %_d.o: src/%.F90 $(addsuffix _d.o,$(LEVEL_0)) + $(FC) $(FLAGS) $(CFLAGS) $(DFLAGS) -o $*_d.o -c src/$*.F90 $(LIBS) + @wc -l -L -w src/$*.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' @echo '' -############################################################################################################################################################### -# global needs special handling: expansion of CPUVARIABLE, BSCREENLIST and WSCREENLIST using awk (not anymore !!!) +$(ROBJS_LEVEL_2): %_r.o: src/%.F90 mod_kinds_r.o $(addsuffix _r.o,$(LEVEL_0)) $(addsuffix _r.o,$(LEVEL_1)) + $(FC) $(FLAGS) $(CFLAGS) $(RFLAGS) -o $*_r.o -c src/$*.F90 $(LIBS) + @wc -l -L -w src/$*.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' + @echo '' -global_r.o: %_r.o: inputlist_r.o src/global.F90 - $(FC) $(FLAGS) $(CFLAGS) $(RFLAGS) -o global_r.o -c src/global.F90 $(LIBS) - @wc -l -L -w src/global.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' +$(DOBJS_LEVEL_2): %_d.o: src/%.F90 mod_kinds_d.o $(addsuffix _d.o,$(LEVEL_0)) $(addsuffix _d.o,$(LEVEL_1)) + $(FC) $(FLAGS) $(CFLAGS) $(DFLAGS) -o $*_d.o -c src/$*.F90 $(LIBS) + @wc -l -L -w src/$*.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' @echo '' -global_d.o: %_d.o: inputlist_d.o src/global.F90 - $(FC) $(FLAGS) $(CFLAGS) $(DFLAGS) -o global_d.o -c src/global.F90 $(LIBS) - @wc -l -L -w src/global.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' +$(ROBJS_LEVEL_3): %_r.o: src/%.F90 mod_kinds_r.o $(addsuffix _r.o,$(LEVEL_0)) $(addsuffix _r.o,$(LEVEL_1)) $(addsuffix _r.o,$(LEVEL_2)) + $(FC) $(FLAGS) $(CFLAGS) $(RFLAGS) -o $*_r.o -c src/$*.F90 $(LIBS) + @wc -l -L -w src/$*.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' + @echo '' + +$(DOBJS_LEVEL_3): %_d.o: src/%.F90 mod_kinds_d.o $(addsuffix _d.o,$(LEVEL_0)) $(addsuffix _d.o,$(LEVEL_1)) $(addsuffix _d.o,$(LEVEL_2)) + $(FC) $(FLAGS) $(CFLAGS) $(DFLAGS) -o $*_d.o -c src/$*.F90 $(LIBS) + @wc -l -L -w src/$*.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' + @echo '' + +$(ROBJS_LEVEL_4): %_r.o: src/%.F90 mod_kinds_r.o $(addsuffix _r.o,$(LEVEL_0)) $(addsuffix _r.o,$(LEVEL_1)) $(addsuffix _r.o,$(LEVEL_2)) $(addsuffix _r.o,$(LEVEL_3)) + $(FC) $(FLAGS) $(CFLAGS) $(RFLAGS) -o $*_r.o -c src/$*.F90 $(LIBS) + @wc -l -L -w src/$*.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' + @echo '' + +$(DOBJS_LEVEL_4): %_d.o: src/%.F90 mod_kinds_d.o $(addsuffix _d.o,$(LEVEL_0)) $(addsuffix _d.o,$(LEVEL_1)) $(addsuffix _d.o,$(LEVEL_2)) $(addsuffix _d.o,$(LEVEL_3)) + $(FC) $(FLAGS) $(CFLAGS) $(DFLAGS) -o $*_d.o -c src/$*.F90 $(LIBS) + @wc -l -L -w src/$*.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' @echo '' ############################################################################################################################################################### @@ -87,7 +122,6 @@ $(DOBJS_IO): %_d.o: src/%.F90 $(addsuffix _d.o,$(BASEFILES)) @wc -l -L -w src/$*.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' @echo '' - $(ROBJS): %_r.o: src/%.F90 $(addsuffix _r.o,$(BASEFILES)) $(addsuffix _r.o,$(IOFILES)) $(FC) $(FLAGS) $(CFLAGS) $(RFLAGS) -o $*_r.o -c src/$*.F90 $(LIBS) @wc -l -L -w src/$*.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' diff --git a/SPECfile b/SPECfile index 6cc92494..8b097923 100644 --- a/SPECfile +++ b/SPECfile @@ -12,8 +12,11 @@ # basis of SPEC: input variables, global workspace, HDF5 output file writing # these are split off since they require special treatment (needed by all others and/or special macros) -BASEFILES=inputlist global -IOFILES=h5utils sphdf5 +LEVEL_0=mod_kinds +LEVEL_1=inputlist global +LEVEL_3=h5utils +LEVEL_4=sphdf5 +BASEFILES=$(LEVEL_0) $(LEVEL_1) $(LEVEL_2) $(LEVEL_3) $(LEVEL_4) # (most of) physics part of SPEC afiles=preset manual rzaxis packxi volume coords basefn memory From f5de6859cdc640ab38809d4aebd12d5054af0e85 Mon Sep 17 00:00:00 2001 From: Jonathan Schilling Date: Sun, 3 Jul 2022 19:09:31 +0200 Subject: [PATCH 09/15] global onto LEVEL_2 --- SPECfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/SPECfile b/SPECfile index 8b097923..5ed708a0 100644 --- a/SPECfile +++ b/SPECfile @@ -13,7 +13,8 @@ # basis of SPEC: input variables, global workspace, HDF5 output file writing # these are split off since they require special treatment (needed by all others and/or special macros) LEVEL_0=mod_kinds -LEVEL_1=inputlist global +LEVEL_1=inputlist +LEVEL_2=global LEVEL_3=h5utils LEVEL_4=sphdf5 BASEFILES=$(LEVEL_0) $(LEVEL_1) $(LEVEL_2) $(LEVEL_3) $(LEVEL_4) From 19d21cec7bcf85ceb0f5292b31fd3f3a79d3a5a4 Mon Sep 17 00:00:00 2001 From: Jonathan Schilling Date: Sun, 3 Jul 2022 19:37:20 +0200 Subject: [PATCH 10/15] fix: some lines in sphdf5 were disabled due to \ on the lines above them... --- src/sphdf5.F90 | 62 +++++++++++++++++++++++++------------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/src/sphdf5.F90 b/src/sphdf5.F90 index c84dfcc1..14c08572 100644 --- a/src/sphdf5.F90 +++ b/src/sphdf5.F90 @@ -1178,33 +1178,33 @@ subroutine hdfint !latex !latex \begin{tabular}{|l|l|l|} \hline -!latex \type{variable} & type & \pb{description} \\ \hline +!latex \type{variable} & type & \pb{description} \hline -!latex \type{mn} & integer & \pb{number of Fourier modes} \\ +!latex \type{mn} & integer & \pb{number of Fourier modes} call HWRITEIV( grpOutput, "mn", 1, (/ mn /) ) -!latex \type{im(1:mn)} & integer & \pb{poloidal mode numbers} \\ +!latex \type{im(1:mn)} & integer & \pb{poloidal mode numbers} call HWRITEIV( grpOutput, "im", mn, im(1:mn) ) -!latex \type{in(1:mn)} & integer & \pb{toroidal mode numbers} \\ +!latex \type{in(1:mn)} & integer & \pb{toroidal mode numbers} call HWRITEIV( grpOutput, "in", mn, in(1:mn) ) -!latex \type{mns} & integer & \pb{number of Fourier modes} \\ +!latex \type{mns} & integer & \pb{number of Fourier modes} call HWRITEIV( grpOutput, "mns", 1, (/ mns /) ) -!latex \type{ims(1:mns)} & integer & \pb{poloidal mode numbers} \\ +!latex \type{ims(1:mns)} & integer & \pb{poloidal mode numbers} call HWRITEIV( grpOutput, "ims", mns, ims(1:mns) ) -!latex \type{ins(1:mns)} & integer & \pb{toroidal mode numbers} \\ +!latex \type{ins(1:mns)} & integer & \pb{toroidal mode numbers} call HWRITEIV( grpOutput, "ins", mns, ins(1:mns) ) -!latex \type{Mvol} & integer & \pb{number of interfaces = number of volumes} \\ +!latex \type{Mvol} & integer & \pb{number of interfaces = number of volumes} call HWRITEIV( grpOutput, "Mvol", 1, (/ Mvol /)) -!latex \type{iRbc(1:mn,0:Mvol)} & real & \pb{Fourier harmonics, $R_{m,n}$, of interfaces} \\ +!latex \type{iRbc(1:mn,0:Mvol)} & real & \pb{Fourier harmonics, $R_{m,n}$, of interfaces} call HWRITERA( grpOutput, "Rbc", mn, (Mvol+1), iRbc(1:mn,0:Mvol) ) -!latex \type{iZbs(1:mn,0:Mvol)} & real & \pb{Fourier harmonics, $Z_{m,n}$, of interfaces} \\ +!latex \type{iZbs(1:mn,0:Mvol)} & real & \pb{Fourier harmonics, $Z_{m,n}$, of interfaces} call HWRITERA( grpOutput, "Zbs", mn, (Mvol+1), iZbs(1:mn,0:Mvol) ) -!latex \type{iRbs(1:mn,0:Mvol)} & real & \pb{Fourier harmonics, $R_{m,n}$, of interfaces} \\ +!latex \type{iRbs(1:mn,0:Mvol)} & real & \pb{Fourier harmonics, $R_{m,n}$, of interfaces} call HWRITERA( grpOutput, "Rbs", mn, (Mvol+1), iRbs(1:mn,0:Mvol) ) -!latex \type{iZbc(1:mn,0:Mvol)} & real & \pb{Fourier harmonics, $Z_{m,n}$, of interfaces} \\ +!latex \type{iZbc(1:mn,0:Mvol)} & real & \pb{Fourier harmonics, $Z_{m,n}$, of interfaces} call HWRITERA( grpOutput, "Zbc", mn, (Mvol+1), iZbc(1:mn,0:Mvol) ) -!l tex \type{forcetol} & real & \pb{force-balance error across interfaces} \\ +!l tex \type{forcetol} & real & \pb{force-balance error across interfaces} ! HWRITERV( grpOutput, 1, forcetol, (/ forcetol /)) ! already in /input/global -!latex \type{ForceErr} & real & \pb{force-balance error across interfaces} \\ +!latex \type{ForceErr} & real & \pb{force-balance error across interfaces} call HWRITERV( grpOutput, "ForceErr", 1, (/ ForceErr /)) !latex \type{Ivolume} & real & \pb{Volume current at output (parallel, externally induced)} call HWRITERV( grpOutput, "Ivolume", Mvol, Ivolume(1:Mvol)) @@ -1219,14 +1219,14 @@ subroutine hdfint call HWRITERV( grpOutput, "pflux" , Mvol, pflux(1:Mvol) ) if( Lcheck.eq.1 ) then -!latex \type{beltramierror} & real & \pb{error in beltrami field (volume integral)} \\ +!latex \type{beltramierror} & real & \pb{error in beltrami field (volume integral)} call HWRITERA( grpOutput, "beltramierror", Mvol, 3, beltramierror(1:Mvol,1:3) ) endif if( allocated(vvolume) ) then ! why is it required to confirm that vvolume has been allocated ; 24 Nov 16; tvolume = sum(vvolume(1:Nvol) ) -!latex \type{volume} & real & \pb{total volume = $\sum V_v$} \\ +!latex \type{volume} & real & \pb{total volume = $\sum V_v$} call HWRITERV( grpOutput, "volume", 1, (/ tvolume /)) else @@ -1236,21 +1236,21 @@ subroutine hdfint endif ! end of if( allocated(vvolume) ) ; 11 Aug 14; Mrad = maxval( Lrad(1:Mvol) ) -!latex \type{Mrad} & integer & \pb{the maximum radial (Chebyshev) resolution} \\ +!latex \type{Mrad} & integer & \pb{the maximum radial (Chebyshev) resolution} call HWRITEIV( grpOutput, "Mrad", 1, (/ Mrad /)) -!latex \type{TT(0:Mrad,0:1,0:1)} & real & \pb{the Chebyshev polynomials, $T_l$, and their derivatives, evaluated at $s=\pm 1$} \\ +!latex \type{TT(0:Mrad,0:1,0:1)} & real & \pb{the Chebyshev polynomials, $T_l$, and their derivatives, evaluated at $s=\pm 1$} call HWRITERC( grpOutput, "TT", (Mrad+1), 2, 2, TT(0:Mrad,0:1,0:1) ) -!latex \type{Btemn(1:mn,0:1,1:Mvol)} & real & \pb{the cosine harmonics of the covariant poloidal field, \\ -!latex i.e. $[[B_{\t,j}]]$ evaluated on the inner and outer interface in each volume} \\ +!latex \type{Btemn(1:mn,0:1,1:Mvol)} & real & \pb{the cosine harmonics of the covariant poloidal field, +!latex i.e. $[[B_{\t,j}]]$ evaluated on the inner and outer interface in each volume} call HWRITERC( grpOutput, "Btemn", mn, 2, Mvol, Btemn(1:mn,0:1,1:Mvol) ) -!latex \type{Bzemn(1:mn,0:1,1:Mvol)} & real & \pb{the cosine harmonics of the covariant toroidal field, \\ -!latex i.e. $[[B_{\z,j}]]$ evaluated on the inner and outer interface in each volume} \\ +!latex \type{Bzemn(1:mn,0:1,1:Mvol)} & real & \pb{the cosine harmonics of the covariant toroidal field, +!latex i.e. $[[B_{\z,j}]]$ evaluated on the inner and outer interface in each volume} call HWRITERC( grpOutput, "Bzemn", mn, 2, Mvol, Bzemn(1:mn,0:1,1:Mvol) ) -!latex \type{Btomn(1:mn,0:1,1:Mvol)} & real & \pb{the sine harmonics of the covariant poloidal field, \\ -!latex i.e. $[[B_{\t,j}]]$ evaluated on the inner and outer interface in each volume} \\ +!latex \type{Btomn(1:mn,0:1,1:Mvol)} & real & \pb{the sine harmonics of the covariant poloidal field, +!latex i.e. $[[B_{\t,j}]]$ evaluated on the inner and outer interface in each volume} call HWRITERC( grpOutput, "Btomn", mn, 2, Mvol, Btomn(1:mn,0:1,1:Mvol) ) -!latex \type{Bzomn(1:mn,0:1,1:Mvol)} & real & \pb{the sine harmonics of the covariant toroidal field, \\ -!latex i.e. $[[B_{\z,j}]]$ evaluated on the inner and outer interface in each volume} \\ +!latex \type{Bzomn(1:mn,0:1,1:Mvol)} & real & \pb{the sine harmonics of the covariant toroidal field, +!latex i.e. $[[B_{\z,j}]]$ evaluated on the inner and outer interface in each volume} call HWRITERC( grpOutput, "Bzomn", mn, 2, Mvol, Bzomn(1:mn,0:1,1:Mvol) ) ! Write lambda_mn, Fourier harmonics or transformation to straight field line coordinates. @@ -1258,18 +1258,18 @@ subroutine hdfint if( Lperturbed.eq.1 ) then -!latex \type{dRbc(1:mn,0:Nvol)} & real & \pb{Fourier harmonics, $R_{j}$, of interfaces; linearly perturbed solution} \\ +!latex \type{dRbc(1:mn,0:Nvol)} & real & \pb{Fourier harmonics, $R_{j}$, of interfaces; linearly perturbed solution} call HWRITERA( grpOutput, "dRbc", mn, (Nvol+1), dRbc(1:mn,0:Nvol) ) -!latex \type{dZbs(1:mn,0:Nvol)} & real & \pb{Fourier harmonics, $Z_{j}$, of interfaces; linearly perturbed solution} \\ +!latex \type{dZbs(1:mn,0:Nvol)} & real & \pb{Fourier harmonics, $Z_{j}$, of interfaces; linearly perturbed solution} call HWRITERA( grpOutput, "dZbs", mn, (Nvol+1), dZbs(1:mn,0:Nvol) ) -!latex \type{dRbs(1:mn,0:Nvol)} & real & \pb{Fourier harmonics, $R_{j}$, of interfaces; linearly perturbed solution} \\ +!latex \type{dRbs(1:mn,0:Nvol)} & real & \pb{Fourier harmonics, $R_{j}$, of interfaces; linearly perturbed solution} call HWRITERA( grpOutput, "dRbs", mn, (Nvol+1), dRbs(1:mn,0:Nvol) ) -!latex \type{dZbc(1:mn,0:Nvol)} & real & \pb{Fourier harmonics, $Z_{j}$, of interfaces; linearly perturbed solution} \\ +!latex \type{dZbc(1:mn,0:Nvol)} & real & \pb{Fourier harmonics, $Z_{j}$, of interfaces; linearly perturbed solution} call HWRITERA( grpOutput, "dZbc", mn, (Nvol+1), dZbc(1:mn,0:Nvol) ) endif -!latex \type{lmns} & integer & \pb{resolution of straight fieldline transformation} \\ +!latex \type{lmns} & integer & \pb{resolution of straight fieldline transformation} call HWRITEIV( grpOutput, "lmns", 1, (/ lmns /)) !latex \hline \end{tabular} From ccb7179ce67279b8783fae300f481663cc4f5053 Mon Sep 17 00:00:00 2001 From: Jonathan Schilling Date: Thu, 7 Jul 2022 10:52:10 +0200 Subject: [PATCH 11/15] got CMake setup to compile again --- Makefile | 12 +- src/CMakeLists.txt | 275 +++++++++++---------------------------------- 2 files changed, 71 insertions(+), 216 deletions(-) diff --git a/Makefile b/Makefile index 13ff4327..5c6953a4 100644 --- a/Makefile +++ b/Makefile @@ -80,32 +80,32 @@ $(DOBJS_LEVEL_1): %_d.o: src/%.F90 $(addsuffix _d.o,$(LEVEL_0)) @wc -l -L -w src/$*.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' @echo '' -$(ROBJS_LEVEL_2): %_r.o: src/%.F90 mod_kinds_r.o $(addsuffix _r.o,$(LEVEL_0)) $(addsuffix _r.o,$(LEVEL_1)) +$(ROBJS_LEVEL_2): %_r.o: src/%.F90 mod_kinds_r.o $(addsuffix _r.o,$(LEVEL_1)) $(FC) $(FLAGS) $(CFLAGS) $(RFLAGS) -o $*_r.o -c src/$*.F90 $(LIBS) @wc -l -L -w src/$*.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' @echo '' -$(DOBJS_LEVEL_2): %_d.o: src/%.F90 mod_kinds_d.o $(addsuffix _d.o,$(LEVEL_0)) $(addsuffix _d.o,$(LEVEL_1)) +$(DOBJS_LEVEL_2): %_d.o: src/%.F90 mod_kinds_d.o $(addsuffix _d.o,$(LEVEL_1)) $(FC) $(FLAGS) $(CFLAGS) $(DFLAGS) -o $*_d.o -c src/$*.F90 $(LIBS) @wc -l -L -w src/$*.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' @echo '' -$(ROBJS_LEVEL_3): %_r.o: src/%.F90 mod_kinds_r.o $(addsuffix _r.o,$(LEVEL_0)) $(addsuffix _r.o,$(LEVEL_1)) $(addsuffix _r.o,$(LEVEL_2)) +$(ROBJS_LEVEL_3): %_r.o: src/%.F90 mod_kinds_r.o $(addsuffix _r.o,$(LEVEL_2)) $(FC) $(FLAGS) $(CFLAGS) $(RFLAGS) -o $*_r.o -c src/$*.F90 $(LIBS) @wc -l -L -w src/$*.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' @echo '' -$(DOBJS_LEVEL_3): %_d.o: src/%.F90 mod_kinds_d.o $(addsuffix _d.o,$(LEVEL_0)) $(addsuffix _d.o,$(LEVEL_1)) $(addsuffix _d.o,$(LEVEL_2)) +$(DOBJS_LEVEL_3): %_d.o: src/%.F90 mod_kinds_d.o $(addsuffix _d.o,$(LEVEL_2)) $(FC) $(FLAGS) $(CFLAGS) $(DFLAGS) -o $*_d.o -c src/$*.F90 $(LIBS) @wc -l -L -w src/$*.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' @echo '' -$(ROBJS_LEVEL_4): %_r.o: src/%.F90 mod_kinds_r.o $(addsuffix _r.o,$(LEVEL_0)) $(addsuffix _r.o,$(LEVEL_1)) $(addsuffix _r.o,$(LEVEL_2)) $(addsuffix _r.o,$(LEVEL_3)) +$(ROBJS_LEVEL_4): %_r.o: src/%.F90 mod_kinds_r.o $(addsuffix _r.o,$(LEVEL_3)) $(FC) $(FLAGS) $(CFLAGS) $(RFLAGS) -o $*_r.o -c src/$*.F90 $(LIBS) @wc -l -L -w src/$*.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' @echo '' -$(DOBJS_LEVEL_4): %_d.o: src/%.F90 mod_kinds_d.o $(addsuffix _d.o,$(LEVEL_0)) $(addsuffix _d.o,$(LEVEL_1)) $(addsuffix _d.o,$(LEVEL_2)) $(addsuffix _d.o,$(LEVEL_3)) +$(DOBJS_LEVEL_4): %_d.o: src/%.F90 mod_kinds_d.o $(addsuffix _d.o,$(LEVEL_3)) $(FC) $(FLAGS) $(CFLAGS) $(DFLAGS) -o $*_d.o -c src/$*.F90 $(LIBS) @wc -l -L -w src/$*.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' @echo '' diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index fcc9bfb3..6fd6bc2d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,85 +1,6 @@ - -# ATM the sources are added as it is. For some files, preprocessing is required. Use custom command to do preprocessing once it is understood. - -set(MACROS ${CMAKE_CURRENT_SOURCE_DIR}/macros) - -function(preprocess_m4 outvar) - message(STATUS "preprocess_fortran arguments: ${outvar}, followed by ${ARGN}") - set(srcs) - foreach(f ${ARGN}) - message(STATUS "Got file: ${f}") - # construct output filename - if(NOT IS_ABSOLUTE "${f}") - get_filename_component(f "${f}" ABSOLUTE) - endif() - file(RELATIVE_PATH r "${CMAKE_CURRENT_SOURCE_DIR}" "${f}") - get_filename_component(e "${r}" EXT) - get_filename_component(n "${r}" NAME_WE) - get_filename_component(p "${r}" PATH) - string(TOUPPER "${e}" e) - set(of "${CMAKE_CURRENT_BINARY_DIR}/${n}_m${e}") - #set(of "${n}_m${e}") - message(STATUS "Output name: ${of}") - # preprocess the thing - add_custom_command(OUTPUT ${of} - COMMAND m4 - ARGS -P ${MACROS} ${f} > ${of} - DEPENDS ${MACROS} ${f} - COMMENT "Preprocessing ${f}" - VERBATIM - ) - list(APPEND srcs "${of}") - endforeach() - # return the (preprocessed) sources - set(${outvar} "${srcs}" PARENT_SCOPE) -endfunction() - -set(unprocessed_src_files - manual.f90 - rzaxis.f90 - packxi.f90 - volume.f90 - coords.f90 - basefn.f90 - memory.f90 - metrix.f90 - ma00aa.f90 - matrix.f90 - spsmat.f90 - spsint.f90 - mp00ac.f90 - ma02aa.f90 - packab.f90 - tr00ab.f90 - curent.f90 - df00ab.f90 - lforce.f90 - intghs.f90 - mtrxhs.f90 - lbpol.f90 - brcast.f90 - dfp100.f90 - dfp200.f90 - dforce.f90 - newton.f90 - casing.f90 - bnorml.f90 - jo00aa.f90 - pp00aa.f90 - pp00ab.f90 - bfield.f90 - stzxyz.f90 - hesian.f90 - ra00aa.f90 - numrec.f90 - preset.f90 - #sphdf5.f90 - global.f90 - inputlist.f90 - #${CMAKE_CURRENT_SOURCE_DIR}/xspech.f90 -) # below assumes the .f files are double precision; the CFLAGS = -r8 option is not required; - -set(f_src_files +# below assumes the .f files are double precision +# the CFLAGS = -r8 option is not required +set(src_spec_contrib ${CMAKE_CURRENT_SOURCE_DIR}/dcuhre.f ${CMAKE_CURRENT_SOURCE_DIR}/minpack.f ${CMAKE_CURRENT_SOURCE_DIR}/iqpack.f @@ -90,134 +11,68 @@ set(f_src_files ${CMAKE_CURRENT_SOURCE_DIR}/iters.f ) -preprocess_m4(srcs ${unprocessed_src_files}) - -set(SPHDF5_FILE "${CMAKE_CURRENT_SOURCE_DIR}/sphdf5.f90") -set(SPHDF5_AWK_FILE "${CMAKE_CURRENT_SOURCE_DIR}/msphdf5.f90") -message(STATUS "sphdf5_FILE is ${SPHDF5_FILE}") -if(AWK MATCHES ".+-NOTFOUND") - message(FATAL_ERROR "FATAL: awk (and mawk and gawk) could not be found (${AWK}).") -else() - execute_process( - COMMAND /bin/sh -c "\"${AWK}\" -v file=sphdf5.f90 \ - '{ gsub(\"__LINE__\", NR); gsub(\"__FILE__\",file); print }' \ - \"${SPHDF5_FILE}\"" - RESULT_VARIABLE AWK_EXITCODE - OUTPUT_FILE "${SPHDF5_AWK_FILE}" - ) - message(STATUS "Exit code from awk: ${AWK_EXITCODE}") -endif() -preprocess_m4(sphdf5_src ${SPHDF5_AWK_FILE}) -message(STATUS "sphdf5_src is ${sphdf5_src}") - -#set(srcs) -#foreach(f ${unprocessed_src_files}) -# # is it a Fortran file? -# if(f MATCHES "\\.[Ff](9[05])?") -# message(STATUS "Got fortran file: ${f}") -# # construct output filename -# if(NOT IS_ABSOLUTE "${f}") -# get_filename_component(f "${f}" ABSOLUTE) -# endif() -# file(RELATIVE_PATH r "${CMAKE_CURRENT_SOURCE_DIR}" "${f}") -# get_filename_component(e "${r}" EXT) -# get_filename_component(n "${r}" NAME_WE) -# get_filename_component(p "${r}" PATH) -# #set(of1 "${n}_m${e}") -# set(of "${CMAKE_CURRENT_BINARY_DIR}/${n}${e}") -# #set(of "${n}_m${e}") -# message(STATUS "Output name: ${of}") -# # preprocess the thing -# add_custom_command(OUTPUT ${of} -# COMMAND m4 -# ARGS -P ${MACROS} ${f} > ${of} -# DEPENDS ${MACROS} ${f} -# COMMENT "Preprocessing ${f}" -# #VERBATIM -# ) -# list(APPEND srcs "${of}") -# endif() -#endforeach() - - -#set_source_files_properties(${m4_output_files} -#set_source_files_properties(${src} -# PROPERTIES GENERATED true) - -#add_custom_target(m4_process ALL - #DEPENDS ${m4_output_files} -# DEPENDS ${src} -#) -#add_dependencies(spec m4_process) - - -list(APPEND srcs "${sphdf5_src}") - -add_library(spec3p OBJECT ${f_src_files}) -target_compile_options(spec3p - PRIVATE - "-cpp" - $<$:-ffree-line-length-none> +add_library(spec_contrib OBJECT ${src_spec_contrib}) +target_compile_options(spec_contrib + PRIVATE + #"-cpp" + #$<$:-ffree-line-length-none> # $<$:-fdefault-real-8> $<$:-fbounds-check> - # $<$:-std=legacy> + $<$:-std=legacy> $<$:-fexternal-blas> # $<$:-r8> ) -set(ALLFILES manual rzaxis packxi volume coords basefn memory metrix ma00aa matrix spsmat spsint mp00ac ma02aa packab tr00ab curent df00ab lforce intghs mtrxhs lbpol brcast dfp100 dfp200 dforce newton casing bnorml jo00aa pp00aa pp00ab bfield stzxyz hesian ra00aa numrec dcuhre minpack iqpack rksuite i1mach d1mach ilut iters sphdf5 preset global xspech) -string(REPLACE ";" " " ALLFILES_STR "${ALLFILES}") - -# Build spec executable -set(XSPEC_FILE "${CMAKE_CURRENT_SOURCE_DIR}/xspech.f90") -set(XSPEC_AWK_FILE "${CMAKE_CURRENT_SOURCE_DIR}/mxspech.f90") - -if(AWK MATCHES ".+-NOTFOUND") - message(FATAL_ERROR "FATAL: awk (and mawk and gawk) could not be found (${AWK}).") -else() - execute_process( - COMMAND bash -c "date" - OUTPUT_VARIABLE DATE - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - execute_process( - COMMAND /bin/sh -c "\"${AWK}\" -v date=\"${DATE}\" -v pwd=\"$ENV{PWD}\" -v macros=\"${MACROS}\" \ - -v fc=\"${CMAKE_Fortran_COMPILER}\" -v flags=\"${COMP_DEFS}\" -v allfiles=\"${ALLFILES_STR}\" \ - 'BEGIN{nfiles=split(allfiles,files,\" \")} \ - {if($2==\"COMPILATION\") { \ - print \" write(ounit,*)\\\" : compiled : date = \"date\" ; \\\"\" ; \ - print \" write(ounit,*)\\\" : : srcdir = \"pwd\" ; \\\"\" ; \ - print \" write(ounit,*)\\\" : : macros = \"macros\" ; \\\"\" ; \ - print \" write(ounit,*)\\\" : : fc = \"fc\" ; \\\"\" ; \ - print \" write(ounit,*)\\\" : : flags = \"flags\" ; \\\"\" }} \ - {if($2==\"SUMTIME\") {for (i=1;i<=nfiles;i++) print \" SUMTIME(\"files[i]\")\"}}\ - {if($2==\"PRTTIME\") {for (i=1;i<=nfiles;i++) print \" PRTTIME(\"files[i]\")\"}}\ - {print}' \"${XSPEC_FILE}\"" - RESULT_VARIABLE AWK_EXITCODE - OUTPUT_FILE "${XSPEC_AWK_FILE}" - ) - message(STATUS "Exit code from awk: ${AWK_EXITCODE}") -endif() - -preprocess_m4(XSPEC_OUT_FILE ${XSPEC_AWK_FILE}) -message(STATUS "XSPEC_OUT_FILE is ${XSPEC_OUT_FILE}") - -list(APPEND srcs "${XSPEC_OUT_FILE}") -if(SKBUILD) - set(fortran_src_files "${srcs}" PARENT_SCOPE) -endif() -message(STATUS "srcs variable is ${srcs}") - - -add_library(spec - ${srcs} "$" +set(src_spec + basefn.F90 + bfield.F90 + bnorml.F90 + brcast.F90 + casing.F90 + coords.F90 + curent.F90 + df00ab.F90 + dforce.F90 + dfp100.F90 + dfp200.F90 + global.F90 + h5utils.F90 + hesian.F90 + inputlist.F90 + intghs.F90 + jo00aa.F90 + lbpol.F90 + lforce.F90 + ma00aa.F90 + ma02aa.F90 + manual.F90 + matrix.F90 + memory.F90 + metrix.F90 + mod_kinds.F90 + mp00ac.F90 + mtrxhs.F90 + newton.F90 + numrec.F90 + packab.F90 + packxi.F90 + pp00aa.F90 + pp00ab.F90 + preset.F90 + ra00aa.F90 + rzaxis.F90 + sphdf5.F90 + spsint.F90 + spsmat.F90 + stzxyz.F90 + tr00ab.F90 + volume.F90 + #wa00aa.F90 ) - -#target_compile_options(spec PUBLIC "-cpp") -# For gfortran set the -ffree-line-length-none option +add_library(spec ${src_spec} "$") target_compile_options(spec - PUBLIC + PUBLIC "-cpp" $<$:-ffree-line-length-none> $<$:-fdefault-real-8> @@ -239,8 +94,6 @@ endif() if (OpenMP_Fortran_FOUND AND NOT SKBUILD) target_link_libraries(spec PUBLIC OpenMP::OpenMP_Fortran) target_compile_definitions(spec PUBLIC OPENMP) - target_link_libraries(spec3p PUBLIC OpenMP::OpenMP_Fortran) - target_compile_definitions(spec3p PUBLIC OPENMP) endif() # Add threads @@ -260,12 +113,12 @@ target_include_directories(spec PUBLIC ${HDF5_C_INCLUDE_DIRS} ${HDF5_Fortran_INC # Add FFTW, LAPACK and BLAS libraries. # MKL could be used for all the three -target_link_libraries(spec - PUBLIC +target_link_libraries(spec + PUBLIC ${FFTW_LIBRARIES} ${LAPACK_LIBRARIES} ${BLAS_LIBRARIES} ) -target_include_directories(spec - PUBLIC +target_include_directories(spec + PUBLIC ${FFTW_INCLUDE_DIRS} ${LAPACK_INCLUDE_DIRS} ${BLAS_INCLUDE_DIRS} ) @@ -273,7 +126,7 @@ target_include_directories(spec #set_target_properties(spec PROPERTIES POSITION_INDEPENDENT_CODE ON) #endif() -get_property(COMP_DEFS +get_property(COMP_DEFS TARGET spec PROPERTY COMPILE_OPTIONS ) @@ -281,19 +134,21 @@ get_property(COMP_DEFS # Get the spec library linker properties and pass them to python wrapper get_target_property(SPEC_LINK_LIB spec LINK_LIBRARIES) message(STATUS "spec linked libraries are ${SPEC_LINK_LIB}") + get_target_property(SPEC_COMPILE_OPTIONS spec COMPILE_OPTIONS) message(STATUS "spec compile options are ${SPEC_COMPILE_OPTIONS}") + get_target_property(SPEC_COMPILE_DEFS spec COMPILE_DEFINITIONS) message(STATUS "spec compile definitions are ${SPEC_COMPILE_DEFS}") # export linker flags for spec to parent scope # for re-use when building python wrapper -if(SKBUILD) +if(SKBUILD) # get_target_property(SPEC_LINK_LIB spec LINK_LIBRARIES) # redundant from debug out above set(SPEC_LINK_LIB ${SPEC_LINK_LIB} PARENT_SCOPE) endif() -add_executable(xspec ${XSPEC_OUT_FILE}) +add_executable(xspec xspech.F90) target_link_libraries(xspec PUBLIC spec) set_target_properties(xspec PROPERTIES POSITION_INDEPENDENT_CODE ON) From 4b16f17fe1955e1d4b22e8635fc9ffe49b513ab9 Mon Sep 17 00:00:00 2001 From: Jonathan Schilling Date: Thu, 7 Jul 2022 11:15:05 +0200 Subject: [PATCH 12/15] got Makefile Python wrapper to work again --- Utilities/python_wrapper/Makefile | 13 +++++-------- Utilities/python_wrapper/kind_map | 1 + Utilities/python_wrapper/spec/__init__.py | 2 +- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/Utilities/python_wrapper/Makefile b/Utilities/python_wrapper/Makefile index 21b4a35a..6e4ceb81 100644 --- a/Utilities/python_wrapper/Makefile +++ b/Utilities/python_wrapper/Makefile @@ -21,7 +21,7 @@ PYTHON = python3 ifeq ($(F90),gfortran) FPP = $(F90) -E - FPP_F90FLAGS = -x f95-cpp-input -fPIC + FPP_F90FLAGS = -x f95-cpp-input -fPIC endif ifeq ($(F90),ifort) @@ -60,10 +60,7 @@ TMP_FILES := ${ALLSPEC} xspech LIBSRC_WRAP_SOURCES := $(TMP_FILES) # file names -LIBSRC_WRAP_FILES = $(addsuffix .f90,${LIBSRC_WRAP_SOURCES}) - -# macro_explained files -LIBSRC_WRAP_MFILES = $(addsuffix _m.F90,${LIBSRC_WRAP_SOURCES}) +LIBSRC_WRAP_FILES = $(addsuffix .F90,${LIBSRC_WRAP_SOURCES}) # object files LIBSRC_WRAP_OBJECTS = $(addsuffix _r.o,${LIBSRC_WRAP_SOURCES}) @@ -75,7 +72,7 @@ LIBSRC_WRAP_FPP_FILES = $(addsuffix .fpp,${LIBSRC_WRAP_SOURCES}) # Relevant suffixes #======================================================================= -.SUFFIXES: .f90 .fpp +.SUFFIXES: .F90 .f90 .fpp #======================================================================= # @@ -95,7 +92,7 @@ f90wrap_clean: -rm -rf src.*/ .f2py_f2cmap .libs/ __pycache__/ -rm -rf $(LIB_NAME) -$(LIBSRC_WRAP_FPP_FILES): %.fpp: ${SOURCES}/%_m.F90 +$(LIBSRC_WRAP_FPP_FILES): %.fpp: ${SOURCES}/src/%.F90 ${FPP} ${FPP_F90FLAGS} $< -o $@ $(LIB_NAME): @@ -124,4 +121,4 @@ compile_test: @echo "LINKS = ${LINKS}" test: - @${PYTHON} -c "from spec import spec; print('SPEC version: {:}'.format(spec.constants.version))" + @${PYTHON} -c "import spec.spec_f90wrapped as spec; print('SPEC version: {:}'.format(spec.constants.version))" diff --git a/Utilities/python_wrapper/kind_map b/Utilities/python_wrapper/kind_map index 32500b4e..8f2e01f6 100644 --- a/Utilities/python_wrapper/kind_map +++ b/Utilities/python_wrapper/kind_map @@ -4,6 +4,7 @@ 'isp' : 'float', '8' : 'double', 'dp' : 'double', + 'wp' : 'double', 'idp' : 'double'}, 'complex' : { '' : 'complex_float', '8' : 'complex_double', diff --git a/Utilities/python_wrapper/spec/__init__.py b/Utilities/python_wrapper/spec/__init__.py index 183e796b..8249f03e 100644 --- a/Utilities/python_wrapper/spec/__init__.py +++ b/Utilities/python_wrapper/spec/__init__.py @@ -7,4 +7,4 @@ if not path_to_spec_f90wrapped in sys.path: sys.path.append(path_to_spec_f90wrapped) -# import spec_f90wrapped as spec +#import spec_f90wrapped as spec From 60f974c2295f6b9cd6ce850b7474b3a2d37f1219 Mon Sep 17 00:00:00 2001 From: Jonathan Schilling Date: Thu, 7 Jul 2022 12:05:14 +0200 Subject: [PATCH 13/15] trying to get Python/CMake build of python wrapper to work again --- Utilities/python_wrapper/CMakeLists.txt | 21 +++--- src/CMakeLists.txt | 95 +++++++++++++------------ 2 files changed, 61 insertions(+), 55 deletions(-) diff --git a/Utilities/python_wrapper/CMakeLists.txt b/Utilities/python_wrapper/CMakeLists.txt index 96658fe1..25eadfe3 100644 --- a/Utilities/python_wrapper/CMakeLists.txt +++ b/Utilities/python_wrapper/CMakeLists.txt @@ -4,7 +4,7 @@ find_package(NumPy REQUIRED) find_package(F2PY REQUIRED) find_package(F90Wrap REQUIRED) -# Fortran preprocessing compiler +# Fortran preprocessing compiler if(CMAKE_Fortran_COMPILER_ID STREQUAL Intel) set(FPP_COMPILER fpp) set(FPP_COMPILE_FLAGS "") @@ -17,7 +17,6 @@ get_directory_property(COMP_DEFS COMPILE_DEFINITIONS) message(STATUS "Compile definitions for preprocessor are ${COMP_DEFS}") string(REPLACE ";" " " COMP_DEF_STR "${COMPILE_DEFINITIONS}") - function(preprocess_fortran outvar) message(STATUS "preprocess_fortran arguments: ${outvar}, followed by ${ARGN}") set(srcs) @@ -60,14 +59,14 @@ function(preprocess_fortran outvar) set(${outvar} "${srcs}" PARENT_SCOPE) endfunction() -#message(STATUS "fortran_src_files is ${fortran_src_files}") +message(STATUS "fortran_src_files is ${fortran_src_files}") preprocess_fortran(fpp_files ${fortran_src_files}) #message(STATUS "fpp_files is ${fpp_files}") # ---------------------------------------------------------------------------- # NOTE: There is no way to identify the f90wrap---.f90 files ahead of running f90wrap # NOTE: The files produced have no one->one relation with the source files. -# NOTE: So giving the names of f90wrap_---.f90 files manually +# NOTE: So giving the names of f90wrap_---.f90 files manually #----------------------------------------------------------------------------- set(f90wrap_output_files ${CMAKE_CURRENT_BINARY_DIR}/f90wrap_global_m_fpp.f90 ${CMAKE_CURRENT_BINARY_DIR}/f90wrap_inputlist_m_fpp.f90 @@ -94,7 +93,7 @@ add_custom_command(OUTPUT ${python_mod_file} ${f90wrap_output_files} ) #add_custom_target("${python_mod_name}_pymod" -# DEPENDS ${python_mod_file} ${f90wrap_output_files} +# DEPENDS ${python_mod_file} ${f90wrap_output_files} #) set(f2py_module_name "_${python_mod_name}") @@ -111,20 +110,20 @@ add_custom_target(${f2py_module_name} ALL add_custom_command( OUTPUT ${generated_module_file} - COMMAND ${F2PY_EXECUTABLE} - -m ${f2py_module_name} - --build-dir ${CMAKE_CURRENT_BINARY_DIR} + COMMAND ${F2PY_EXECUTABLE} + -m ${f2py_module_name} + --build-dir ${CMAKE_CURRENT_BINARY_DIR} --f90exec=${CMAKE_Fortran_COMPILER} --f77exec=${CMAKE_Fortran_COMPILER} --f90flags="-fopenmp" -lgomp - -c + -c #${SCALAPACK_LIB} ${NETCDF_F} ${NETCDF_C} - ${f90wrap_output_files} + ${f90wrap_output_files} -I${CMAKE_BINARY_DIR}/build/modules/spec_modules -I${HDF5_Fortran_INCLUDE_DIRS} --verbose - ${CMAKE_BINARY_DIR}/build/lib/libspec.a + ${CMAKE_BINARY_DIR}/build/lib/libspec.a ${SPEC_LINK_LIB} #IMPLICIT_DEPENDS Fortran ${f90wrap_output_files} DEPENDS spec ${f90wrap_output_files} diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6fd6bc2d..7541e168 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -24,50 +24,49 @@ target_compile_options(spec_contrib ) set(src_spec - basefn.F90 - bfield.F90 - bnorml.F90 - brcast.F90 - casing.F90 - coords.F90 - curent.F90 - df00ab.F90 - dforce.F90 - dfp100.F90 - dfp200.F90 - global.F90 - h5utils.F90 - hesian.F90 - inputlist.F90 - intghs.F90 - jo00aa.F90 - lbpol.F90 - lforce.F90 - ma00aa.F90 - ma02aa.F90 - manual.F90 - matrix.F90 - memory.F90 - metrix.F90 - mod_kinds.F90 - mp00ac.F90 - mtrxhs.F90 - newton.F90 - numrec.F90 - packab.F90 - packxi.F90 - pp00aa.F90 - pp00ab.F90 - preset.F90 - ra00aa.F90 - rzaxis.F90 - sphdf5.F90 - spsint.F90 - spsmat.F90 - stzxyz.F90 - tr00ab.F90 - volume.F90 - #wa00aa.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/basefn.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/bfield.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/bnorml.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/brcast.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/casing.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/coords.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/curent.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/df00ab.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/dforce.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/dfp100.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/dfp200.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/global.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/h5utils.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/hesian.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/inputlist.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/intghs.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/jo00aa.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/lbpol.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/lforce.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/ma00aa.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/ma02aa.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/manual.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/matrix.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/memory.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/metrix.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/mod_kinds.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/mp00ac.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/mtrxhs.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/newton.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/numrec.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/packab.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/packxi.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/pp00aa.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/pp00ab.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/preset.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/ra00aa.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/rzaxis.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/sphdf5.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/spsint.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/spsmat.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/stzxyz.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/tr00ab.F90 + ${CMAKE_CURRENT_SOURCE_DIR}/volume.F90 ) add_library(spec ${src_spec} "$") @@ -82,6 +81,14 @@ target_compile_options(spec $<$:-r8> ) +set(srcs) +list(APPEND srcs "${src_spec_contrib}") +list(APPEND srcs "${src_spec}") +if(SKBUILD) + set(fortran_src_files "${srcs}" PARENT_SCOPE) +endif() +message(STATUS "srcs variable is ${srcs}") + set_target_properties (spec PROPERTIES Fortran_MODULE_DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}/spec_modules) target_include_directories(spec PUBLIC ${CMAKE_Fortran_MODULE_DIRECTORY}/spec_modules) From ee0ced963713b765dde7673add1a2859e7d0ec8c Mon Sep 17 00:00:00 2001 From: Jonathan Schilling Date: Thu, 7 Jul 2022 14:29:06 +0200 Subject: [PATCH 14/15] try to fix python wrapper --- Makefile | 51 ++++---------- SPECfile | 10 +-- Utilities/python_wrapper/CMakeLists.txt | 94 ++++++++++++------------- setup.py | 1 - src/CMakeLists.txt | 7 +- 5 files changed, 67 insertions(+), 96 deletions(-) diff --git a/Makefile b/Makefile index 5c6953a4..df13c167 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,3 @@ -#!/bin/sh - ############################################ # This is the "classic" Makefile for SPEC. # ############################################ @@ -30,15 +28,13 @@ DOBJS_LEVEL_4=$(LEVEL_4:=_d.o) ROBJS_BASE=$(BASEFILES:=_r.o) DOBJS_BASE=$(BASEFILES:=_d.o) -ROBJS_IO=$(IOFILES:=_r.o) -DOBJS_IO=$(IOFILES:=_d.o) - ############################################################################################################################################################### date:=$(shell date) text:=$(shell date +%F) ############################################################################################################################################################### +# main executables xspec: $(addsuffix _r.o,$(ALLFILES)) Makefile $(FC) $(FLAGS) $(CFLAGS) $(RFLAGS) -o xspec $(addsuffix _r.o,$(ALLFILES)) $(LINKS) @@ -47,6 +43,7 @@ dspec: $(addsuffix _d.o,$(ALLFILES)) Makefile $(FC) $(FLAGS) $(CFLAGS) $(DFLAGS) -o dspec $(addsuffix _d.o,$(ALLFILES)) $(LINKS) ############################################################################################################################################################### +# sfiles: contrib %_r.o: src/%.f $(FC) $(FLAGS) $(RFLAGS) -o $*_r.o -c src/$*.f @@ -59,6 +56,7 @@ dspec: $(addsuffix _d.o,$(ALLFILES)) Makefile @echo '' ############################################################################################################################################################### +# BASEFILES, depending on one another $(ROBJS_LEVEL_0): %_r.o: src/%.F90 $(FC) $(FLAGS) $(CFLAGS) $(RFLAGS) -o $*_r.o -c src/$*.F90 $(LIBS) @@ -111,51 +109,28 @@ $(DOBJS_LEVEL_4): %_d.o: src/%.F90 mod_kinds_d.o $(addsuffix _d.o,$(LEVEL_3)) @echo '' ############################################################################################################################################################### +# SPECFILES: main physics part of SPEC -$(ROBJS_IO): %_r.o: src/%.F90 $(addsuffix _r.o,$(BASEFILES)) +$(ROBJS): %_r.o: src/%.F90 $(addsuffix _r.o,$(BASEFILES)) $(FC) $(FLAGS) $(CFLAGS) $(RFLAGS) -o $*_r.o -c src/$*.F90 $(LIBS) @wc -l -L -w src/$*.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' @echo '' -$(DOBJS_IO): %_d.o: src/%.F90 $(addsuffix _d.o,$(BASEFILES)) +$(DOBJS): %_d.o: src/%.F90 $(addsuffix _d.o,$(BASEFILES)) $(FC) $(FLAGS) $(CFLAGS) $(DFLAGS) -o $*_d.o -c src/$*.F90 $(LIBS) @wc -l -L -w src/$*.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' @echo '' -$(ROBJS): %_r.o: src/%.F90 $(addsuffix _r.o,$(BASEFILES)) $(addsuffix _r.o,$(IOFILES)) - $(FC) $(FLAGS) $(CFLAGS) $(RFLAGS) -o $*_r.o -c src/$*.F90 $(LIBS) - @wc -l -L -w src/$*.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' - @echo '' +############################################################################################################################################################### -$(DOBJS): %_d.o: src/%.F90 $(addsuffix _d.o,$(BASEFILES)) $(addsuffix _d.o,$(IOFILES)) - $(FC) $(FLAGS) $(CFLAGS) $(DFLAGS) -o $*_d.o -c src/$*.F90 $(LIBS) - @wc -l -L -w src/$*.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' +xspech_r.o: src/xspech.F90 $(ROBJS) + $(FC) $(FLAGS) $(CFLAGS) $(RFLAGS) -o xspech_r.o -c src/xspech.F90 $(LIBS) + @wc -l -L -w src/xspech.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' @echo '' -############################################################################################################################################################### - -xspech_r.o: src/xspech.F90 global_r.o sphdf5_r.o $(addsuffix _r.o,$(files)) - @awk -v date='$(date)' -v pwd='$(PWD)' -v fc='$(FC)' -v flags='$(FLAGS) $(CFLAGS) $(RFLAGS)' -v allfiles='$(ALLFILES)' \ - 'BEGIN{nfiles=split(allfiles,files," ")} \ - {if($$2=="COMPILATION") {print " write(ounit,*)\" : compiled : date = "date" ; \"" ; \ - print " write(ounit,*)\" : : srcdir = "pwd" ; \"" ; \ - print " write(ounit,*)\" : : fc = "fc" ; \"" ; \ - print " write(ounit,*)\" : : flags = "flags" ; \"" }} \ - {print}' src/xspech.F90 > xspech_m.F90 - $(FC) $(FLAGS) $(CFLAGS) $(RFLAGS) -o xspech_r.o -c xspech_m.F90 $(LIBS) - @wc -l -L -w xspech_m.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' - @echo '' - -xspech_d.o: src/xspech.F90 global_d.o sphdf5_d.o $(addsuffix _d.o,$(files)) - @awk -v date='$(date)' -v pwd='$(PWD)' -v fc='$(FC)' -v flags='$(FLAGS) $(CFLAGS) $(DFLAGS)' -v allfiles='$(ALLFILES)' \ - 'BEGIN{nfiles=split(allfiles,files," ")} \ - {if($$2=="COMPILATION") {print " write(ounit,*)\" : compiled : date = "date" ; \"" ; \ - print " write(ounit,*)\" : : srcdir = "pwd" ; \"" ; \ - print " write(ounit,*)\" : : fc = "fc" ; \"" ; \ - print " write(ounit,*)\" : : flags = "flags" ; \"" }} \ - {print}' src/xspech.F90 > xspech_m.F90 - $(FC) $(FLAGS) $(CFLAGS) $(DFLAGS) -o xspech_d.o -c xspech_m.F90 $(LIBS) - @wc -l -L -w xspech_m.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' +xspech_d.o: src/xspech.F90 $(DOBJS) + $(FC) $(FLAGS) $(CFLAGS) $(DFLAGS) -o xspech_d.o -c src/xspech.F90 $(LIBS) + @wc -l -L -w src/xspech.F90 | awk '{print $$4" has "$$1" lines, "$$2" words, and the longest line is "$$3" characters ;"}' @echo '' ############################################################################################################################################################### diff --git a/SPECfile b/SPECfile index 5ed708a0..38b5d510 100644 --- a/SPECfile +++ b/SPECfile @@ -17,7 +17,6 @@ LEVEL_1=inputlist LEVEL_2=global LEVEL_3=h5utils LEVEL_4=sphdf5 -BASEFILES=$(LEVEL_0) $(LEVEL_1) $(LEVEL_2) $(LEVEL_3) $(LEVEL_4) # (most of) physics part of SPEC afiles=preset manual rzaxis packxi volume coords basefn memory @@ -28,19 +27,22 @@ efiles=jo00aa pp00aa pp00ab bfield stzxyz ffiles=hesian ra00aa numrec # externally provided libraries -# below assumes the .f files are double precision; the CFLAGS = -r8 option is not required; +# below assumes the .f files are double precision +# the CFLAGS = -r8 option is not required sfiles=dcuhre minpack iqpack rksuite i1mach d1mach ilut iters ############################################################################################################################################################### +BASEFILES=$(LEVEL_0) $(LEVEL_1) $(LEVEL_2) $(LEVEL_3) $(LEVEL_4) + # all of SPEC except BASEFILES SPECFILES=$(afiles) $(bfiles) $(cfiles) $(dfiles) $(efiles) $(ffiles) # all of "our" (vs. contributed) files needed for the "core" of SPEC -ALLSPEC=$(BASEFILES) $(IOFILES) $(SPECFILES) +ALLSPEC=$(BASEFILES) $(SPECFILES) # *ALL* files needed for the main SPEC executable -ALLFILES=$(sfiles) $(ALLSPEC) xspech mod_kinds +ALLFILES=$(sfiles) $(ALLSPEC) xspech ############################################################################################################################################################### diff --git a/Utilities/python_wrapper/CMakeLists.txt b/Utilities/python_wrapper/CMakeLists.txt index 25eadfe3..c7d3582f 100644 --- a/Utilities/python_wrapper/CMakeLists.txt +++ b/Utilities/python_wrapper/CMakeLists.txt @@ -23,37 +23,37 @@ function(preprocess_fortran outvar) foreach(f ${ARGN}) # is it a Fortran file? if(f MATCHES "\\.[Ff](9[05])?") - message(STATUS "Got fortran file: ${f}") - # construct output filename - if(NOT IS_ABSOLUTE "${f}") - get_filename_component(f "${f}" ABSOLUTE) - endif() - file(RELATIVE_PATH r "${CMAKE_CURRENT_SOURCE_DIR}" "${f}") - get_filename_component(e "${r}" EXT) - get_filename_component(n "${r}" NAME_WE) - get_filename_component(p "${r}" PATH) - set(of "${CMAKE_CURRENT_BINARY_DIR}/${n}_fpp${e}") - message(STATUS "Output name: ${of}") - # preprocess the thing - if (CMAKE_Fortran_COMPILER_ID STREQUAL Intel) - add_custom_command(OUTPUT "${of}" - COMMAND ${FPP_COMPILER} ${FPP_COMPILE_FLAGS} ${COMP_DEF_STR} "${f}" "${of}" - IMPLICIT_DEPENDS Fortran "${f}" - COMMENT "Preprocessing ${f}" - VERBATIM - ) - else() - add_custom_command(OUTPUT "${of}" - COMMAND ${FPP_COMPILER} ${FPP_COMPILE_FLAGS} ${COMP_DEF_STR} "${f}" -o "${of}" - IMPLICIT_DEPENDS Fortran "${f}" - COMMENT "Preprocessing ${f}" - VERBATIM - ) - endif() - list(APPEND srcs "${of}") - #else() - # list(APPEND srcs "${f}") - endif() + message(STATUS "Got fortran file: ${f}") + # construct output filename + if(NOT IS_ABSOLUTE "${f}") + get_filename_component(f "${f}" ABSOLUTE) + endif() + file(RELATIVE_PATH r "${CMAKE_CURRENT_SOURCE_DIR}" "${f}") + get_filename_component(e "${r}" EXT) + get_filename_component(n "${r}" NAME_WE) + get_filename_component(p "${r}" PATH) + set(of "${CMAKE_CURRENT_BINARY_DIR}/${n}_fpp${e}") + message(STATUS "Output name: ${of}") + # preprocess the thing + if (CMAKE_Fortran_COMPILER_ID STREQUAL Intel) + add_custom_command(OUTPUT "${of}" + COMMAND ${FPP_COMPILER} ${FPP_COMPILE_FLAGS} ${COMP_DEF_STR} "${f}" "${of}" + IMPLICIT_DEPENDS Fortran "${f}" + COMMENT "Preprocessing ${f}" + VERBATIM + ) + else() + add_custom_command(OUTPUT "${of}" + COMMAND ${FPP_COMPILER} ${FPP_COMPILE_FLAGS} ${COMP_DEF_STR} "${f}" -o "${of}" + IMPLICIT_DEPENDS Fortran "${f}" + COMMENT "Preprocessing ${f}" + VERBATIM + ) + endif() + list(APPEND srcs "${of}") + #else() + # list(APPEND srcs "${f}") + endif() endforeach() # return the (preprocessed) sources set(${outvar} "${srcs}" PARENT_SCOPE) @@ -61,18 +61,20 @@ endfunction() message(STATUS "fortran_src_files is ${fortran_src_files}") preprocess_fortran(fpp_files ${fortran_src_files}) -#message(STATUS "fpp_files is ${fpp_files}") +message(STATUS "fpp_files is ${fpp_files}") # ---------------------------------------------------------------------------- # NOTE: There is no way to identify the f90wrap---.f90 files ahead of running f90wrap # NOTE: The files produced have no one->one relation with the source files. # NOTE: So giving the names of f90wrap_---.f90 files manually #----------------------------------------------------------------------------- -set(f90wrap_output_files ${CMAKE_CURRENT_BINARY_DIR}/f90wrap_global_m_fpp.f90 - ${CMAKE_CURRENT_BINARY_DIR}/f90wrap_inputlist_m_fpp.f90 - ${CMAKE_CURRENT_BINARY_DIR}/f90wrap_intghs_m_fpp.f90 - ${CMAKE_CURRENT_BINARY_DIR}/f90wrap_msphdf5_m_fpp.f90 - ${CMAKE_CURRENT_BINARY_DIR}/f90wrap_newton_m_fpp.f90 +set(f90wrap_output_files ${CMAKE_CURRENT_BINARY_DIR}/f90wrap_global_fpp.f90 + ${CMAKE_CURRENT_BINARY_DIR}/f90wrap_h5utils_fpp.f90 + ${CMAKE_CURRENT_BINARY_DIR}/f90wrap_inputlist_fpp.f90 + ${CMAKE_CURRENT_BINARY_DIR}/f90wrap_intghs_fpp.f90 + ${CMAKE_CURRENT_BINARY_DIR}/f90wrap_mod_kinds_fpp.f90 + ${CMAKE_CURRENT_BINARY_DIR}/f90wrap_newton_fpp.f90 + ${CMAKE_CURRENT_BINARY_DIR}/f90wrap_sphdf5_fpp.f90 ${CMAKE_CURRENT_BINARY_DIR}/f90wrap_toplevel.f90 ) @@ -80,22 +82,18 @@ set(kind_map_file ${CMAKE_CURRENT_SOURCE_DIR}/kind_map) set(python_mod_name spec_f90wrapped) set(python_mod_file ${CMAKE_CURRENT_BINARY_DIR}/${python_mod_name}.py) -add_custom_target(preprocessing ALL - DEPENDS ${fpp_files} -) - -add_custom_command(OUTPUT ${python_mod_file} ${f90wrap_output_files} - COMMAND "${F90Wrap_EXECUTABLE}" -m "${python_mod_name}" ${fpp_files} -k "${kind_map_file}" +add_custom_command( + OUTPUT ${python_mod_file} ${f90wrap_output_files} + COMMAND "${F90Wrap_EXECUTABLE}" + -m "${python_mod_name}" + -k "${kind_map_file}" + ${fpp_files} #IMPLICIT_DEPENDS Fortran ${fpp_files} DEPENDS ${fpp_files} ${kind_map_file} COMMENT "Executing F90Wrap for" ${fpp_files} VERBATIM ) -#add_custom_target("${python_mod_name}_pymod" -# DEPENDS ${python_mod_file} ${f90wrap_output_files} -#) - set(f2py_module_name "_${python_mod_name}") set(generated_module_file ${CMAKE_CURRENT_BINARY_DIR}/${f2py_module_name}${PYTHON_EXTENSION_MODULE_SUFFIX}) message(STATUS "Python exten suffix expansion: ${PYTHON_EXTENSION_MODULE_SUFFIX}") @@ -110,7 +108,7 @@ add_custom_target(${f2py_module_name} ALL add_custom_command( OUTPUT ${generated_module_file} - COMMAND ${F2PY_EXECUTABLE} + COMMAND ${F90Wrap_F2PY_EXECUTABLE} -m ${f2py_module_name} --build-dir ${CMAKE_CURRENT_BINARY_DIR} --f90exec=${CMAKE_Fortran_COMPILER} diff --git a/setup.py b/setup.py index 8af1e4f2..ca2f8982 100644 --- a/setup.py +++ b/setup.py @@ -27,7 +27,6 @@ # Include additional parameters from CMAKE_ARGS environment variable. # This is the way Anaconda tells CMake its specific needs. if 'CMAKE_ARGS' in os.environ: - print("CMAKE_ARGS = '%s'"%(os.environ['CMAKE_ARGS'])) for cmake_arg in os.environ['CMAKE_ARGS'].split(" "): d['cmake_args'].append(cmake_arg) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7541e168..fa094b83 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -81,13 +81,10 @@ target_compile_options(spec $<$:-r8> ) -set(srcs) -list(APPEND srcs "${src_spec_contrib}") -list(APPEND srcs "${src_spec}") if(SKBUILD) - set(fortran_src_files "${srcs}" PARENT_SCOPE) + set(fortran_src_files "${src_spec}" PARENT_SCOPE) endif() -message(STATUS "srcs variable is ${srcs}") +message(STATUS "fortran_src_files variable is ${fortran_src_files}") set_target_properties (spec PROPERTIES Fortran_MODULE_DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}/spec_modules) target_include_directories(spec PUBLIC ${CMAKE_Fortran_MODULE_DIRECTORY}/spec_modules) From 4ee60c8f22ee67ce12bfb76e7fe5dfceeff37d02 Mon Sep 17 00:00:00 2001 From: Jonathan Schilling Date: Thu, 7 Jul 2022 15:09:27 +0200 Subject: [PATCH 15/15] replace macros --- src/global.F90 | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/src/global.F90 b/src/global.F90 index c2df2bbe..1dcc91ad 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -1177,31 +1177,37 @@ subroutine read_inputlists_from_file() !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-! +!> \brief write all the namelists to example.sp subroutine write_spec_namelist() - ! write all the namelists to example.sp + use mpi use constants use fileunits use inputlist - LOCALS - - LOGICAL :: exist - CHARACTER(LEN=100), PARAMETER :: example = 'example.sp' - - if( myid == 0 ) then - inquire(file=trim(example), EXIST=exist) ! inquire if inputfile existed; - FATAL( global, exist, example input file example.sp already existed ) - open(iunit, file=trim(example), status='unknown', action='write') - write(iunit, physicslist) - write(iunit, numericlist) - write(iunit, locallist) - write(iunit, globallist) - write(iunit, diagnosticslist) - write(iunit, screenlist) - close(iunit) + integer :: ierr + logical :: exists + character(len=*), parameter :: example = 'example.sp' + + if (myid .eq. 0) then + ! inquire if inputfile existed; + inquire(file=trim(example), EXIST=exists) + if (exists) then + write(6,'("example input file example.sp already existed")') + call MPI_ABORT(MPI_COMM_SPEC, 1, ierr) + stop "example input file example.sp already existed" + end if + + ! write template input file + open(iunit, file=trim(example), status='unknown', action='write') + write(iunit, physicslist) + write(iunit, numericlist) + write(iunit, locallist) + write(iunit, globallist) + write(iunit, diagnosticslist) + write(iunit, screenlist) + close(iunit) endif - return end subroutine !-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!-!