From ff092578776b9933c88a5373941bbf036d13992a Mon Sep 17 00:00:00 2001 From: Nick Featherstone Date: Sat, 28 Apr 2018 14:24:34 -0600 Subject: [PATCH] Merging devel into master. Several bugs fixes included: * Duplicate quantity codes corrected and output tables have been modified accordingly. Affected code ranges include: 1900--2000 (kinetic energy equation codes) 1400--1600 (thermal energy equation codes) 1600--1800 (magnetic energy equation codes) * Several logical issues that produced seg faults at output time for certain quantity-code combinations have been corrected. * Configure script now accepts the following options: --with-custom -devel (run ./configure --help for details) commit 351a04f395689a6887ee7edba6a787d4fdee370b Author: Nick Featherstone Date: Sat Apr 28 13:58:31 2018 -0600 Squashed commit of the following: commit 0307b3fbd91657c3560e1a498a63d8fbe728f45f Author: Nick Featherstone Date: Sat Apr 28 13:57:38 2018 -0600 Updated copy command for custom directory in Makefile commit 983ea62400d6a563d1b561d752427dbefed55260 Author: Nick Featherstone Date: Sat Apr 28 09:21:30 2018 -0600 removed production_shear_pke from DiagnosticsTurbKE_Budget.F90. It is already calculated in diagnostics_KE_Flux.F90 commit e67ef25e6c71ccb62e4cc4cc364abd495dd82fb5 Author: Nick Featherstone Date: Sat Apr 28 09:06:33 2018 -0600 Fixed logical issue affecting terms involving v' dot grad v' commit 17c5e3bd579e622e47e4d40e7964993bae610139 Author: Nick Featherstone Date: Tue Apr 24 15:34:30 2018 -0600 Using indices.F in the main loop now commit 3f75296e5176b9c1f4226a74148cc95a4a36c1a1 Author: Nick Featherstone Date: Tue Apr 24 15:30:24 2018 -0600 All Diagnostics now include indices.F for their preprocessor-macro definitions. Indices.F is stored in new directory src/Includes Makefile has been updated accordingly. Create dev_build script commit 8b3d556f956434eb26be3db19846f5e19453030a Author: Nick Featherstone Date: Tue Apr 24 08:29:19 2018 -0600 created indices.f (not used yet) commit c5e12124b22b8516d3cc021a6e455270d98baf9c Author: Nick Featherstone Date: Mon Apr 23 15:26:39 2018 -0600 Small modification to Makefile so that build does not fail in the event of specified, but empty custom directory. commit dfc5729abd3daa79539d837a2b13ad361b125990 Author: Ryan Orvedahl Date: Mon Apr 23 15:14:38 2018 -0600 add Custom directory option to configure with the --with-custom=* flag (#9) Incorporating --with-custom flag to configure script (work by Ryan Orvedahl). commit 5bb736b610f4d7efd4e4bd82104b8dfff9b01ea7 Merge: 7541ab1 2a80aa7 Author: Nick Featherstone Date: Mon Apr 9 13:52:47 2018 -0600 Merge branch 'devel' of github.com:geodynamics/Rayleigh into devel commit 7541ab11acdfbcfbe745a6e7cf4557cd8e21e866 Author: Nick Featherstone Date: Mon Apr 9 13:52:28 2018 -0600 Configure now accepts the -devel option. commit 2a80aa7569d6ef9958a58c3d131f5863c5e46752 Author: Nick Featherstone Date: Thu Apr 5 20:14:27 2018 +0000 harmless edit (two carriage returns) commit 1e237e035d9a68624af824de4ac4fc021e591a19 Merge: fa0e45d c141780 Author: Nick Featherstone Date: Wed Apr 4 15:41:15 2018 -0600 Merge pull request #8 from geodynamics/unstable Bug Fixes commit c1417808b43b8ecc1948179814e53fdb31765055 Author: Nick Featherstone Date: Wed Apr 4 14:56:03 2018 -0600 make distclean now removes Makefile and object_list commit 2c74bf135a6e6511c36cba8c46bfcc50d4dfa75e Author: Nick Featherstone Date: Wed Apr 4 14:47:29 2018 -0600 viscous fluxes have been corrected. Rayleigh output quantities updated commit 15cb7e17dd3fb20f9cb37f5bad9e93c01f38a8d3 Author: Nick Featherstone Date: Wed Apr 4 13:33:05 2018 -0600 removed nr_old write commit 6329a71b4f506d51513ad1875bd577ed8f26a0be Author: Nick Featherstone Date: Wed Apr 4 13:26:13 2018 -0600 --Fixed mira instructions in INSTALL --viscous flux code is updated, but quite working commit e5c45d8c597d40c4ed8c84a83446ebe146a9d4f4 Author: Nick Featherstone Date: Tue Mar 27 11:03:14 2018 -0600 -Cleared several double-booked quantity codes. -Added consistency check to build_menu_pdf.py to help catch inconsistencies in the future. -"make distclean" now clears .o and .mod files as well commit 8f5ab103275e9f8592ec4dcf293dcc4838a9c899 Author: Nick Featherstone Date: Tue Mar 27 07:57:44 2018 -0600 The maxq parameter is: (1) now module-wide in rayleigh_diagnostics.py (2) set to 4000 to maintain consistency with Spherical_IO.F90 commit 5570b3907d0caa320818663c20ed6ee2cf5cc91c Author: Nick Featherstone Date: Tue Mar 27 07:17:23 2018 -0600 testing branch synchronization commit 3a35bdf241fc8ff6582b66beef0f724bbdfeb872 Author: Nick Featherstone Date: Tue Mar 27 07:12:46 2018 -0600 removed .unstable file commit 1e4e80cbfdc4612490491bf68adf723b8cea9440 Merge: 961a16e 8449e98 Author: Nick Featherstone Date: Tue Mar 27 07:12:10 2018 -0600 Merge branch 'unstable' of github.com:geodynamics/Rayleigh into unstable commit 961a16e0a2cc2751d2ecfdf79a0bbc0a3d5b9fbc Author: Nick Featherstone Date: Tue Mar 27 07:00:02 2018 -0600 added .unstable file commit fa0e45d231e222868c6f2070c7763a1dd46f6122 Merge: 84d5e37 8449e98 Author: Nick Featherstone Date: Mon Feb 5 14:35:23 2018 -0700 Merging unstable changes into devel: -FFT Renormalization (optimization) -configure script now supports AVX 512 commit 8449e988c6d1c00ec79c532922ebb07247bc6296 Author: Nick Featherstone Date: Mon Feb 5 14:33:35 2018 -0700 Configure script now supports AVX-512 vectorization for Intel processors commit 72f33b73aaf2e293a03c334cca6ea63fd5dced30 Author: Nick Featherstone Date: Tue Jan 30 12:07:21 2018 -0700 FFT renormalization weights are wrapped into Legendre integration weights commit 84d5e3708acb50db2f559b3b27ae7008344e71e2 Author: Nick Featherstone Date: Sat Jan 27 14:49:35 2018 -0700 Devel branch -- initial commit --- .devel | 0 INSTALL | 4 +- Makefile | 14 + README.md | 2 + configure | 57 +- dev_build | 3 + doc/Rayleigh_Output_Variables.pdf | Bin 323670 -> 323636 bytes etc/analysis/rayleigh_diagnostics.py | 20 +- .../Rayleigh_Output_Variables.log | 4 +- .../Rayleigh_Output_Variables.pdf | Bin 323670 -> 323636 bytes etc/diagnostic_codes/build_menu_pdf.py | 16 +- etc/diagnostic_codes/ke_equation_table0.tex | 38 +- etc/diagnostic_codes/ke_equation_table1.tex | 28 +- etc/diagnostic_codes/me_equation_table0.tex | 40 +- etc/diagnostic_codes/me_equation_table1.tex | 10 +- .../thermal_equation_table0.tex | 16 +- .../thermal_equation_table1.tex | 40 +- src/Diagnostics/BACKUP_Diagnostics_Base.F90 | 955 --------- src/Diagnostics/Diagnostics_ADotGradB.F90 | 7 +- .../Diagnostics_Angular_Momentum.F90 | 8 +- src/Diagnostics/Diagnostics_Base.F90 | 8 +- .../Diagnostics_Current_Density.F90 | 8 +- src/Diagnostics/Diagnostics_Custom.F90 | 8 +- src/Diagnostics/Diagnostics_Energies.F90 | 7 +- src/Diagnostics/Diagnostics_Energy_Flux.F90 | 7 +- src/Diagnostics/Diagnostics_Induction.F90 | 8 +- .../Diagnostics_Inertial_Forces.F90 | 7 +- src/Diagnostics/Diagnostics_Interface.F90 | 8 +- src/Diagnostics/Diagnostics_KE_Flux.F90 | 348 ++-- src/Diagnostics/Diagnostics_Linear_Forces.F90 | 8 +- .../Diagnostics_Lorentz_Forces.F90 | 7 +- .../Diagnostics_Magnetic_Field.F90 | 8 +- .../Diagnostics_Mean_Correction.F90 | 20 +- src/Diagnostics/Diagnostics_Miscellaneous.F90 | 7 +- src/Diagnostics/Diagnostics_Poynting_Flux.F90 | 8 +- .../Diagnostics_Second_Derivatives.F90 | 9 +- .../Diagnostics_Thermal_Energies.F90 | 7 +- .../Diagnostics_Thermal_Equation.F90 | 8 +- .../Diagnostics_Thermodynamic_Gradients.F90 | 8 +- src/Diagnostics/Diagnostics_TurbKE_Budget.F90 | 48 +- .../Diagnostics_Velocity_Diffusion.F90 | 8 +- .../Diagnostics_Velocity_Field.F90 | 9 +- .../Diagnostics_Vorticity_Field.F90 | 7 +- src/Diagnostics/ke_equation_codes.F | 66 +- src/Diagnostics/me_equation_codes.F | 60 +- src/Diagnostics/thermal_equation_codes.F | 92 +- src/Include/indices.F | 18 + src/math_layer/Fourier_Transform.F90 | 21 +- src/math_layer/Legendre_Polynomials.F90 | 20 +- src/physics/Checkpointing.F90 | 1794 ++++++++--------- src/physics/Sphere_Hybrid_Space.F90 | 7 +- src/physics/Sphere_Physical_Space.F90 | 11 +- 52 files changed, 1490 insertions(+), 2432 deletions(-) create mode 100644 .devel create mode 100755 dev_build delete mode 100644 src/Diagnostics/BACKUP_Diagnostics_Base.F90 create mode 100644 src/Include/indices.F diff --git a/.devel b/.devel new file mode 100644 index 00000000..e69de29b diff --git a/INSTALL b/INSTALL index 32d09889..6f2b3868 100644 --- a/INSTALL +++ b/INSTALL @@ -187,13 +187,13 @@ The example below shows how to configure the code for Mira, an IBM Blue Gene/Q. export BLAS_LIB=/soft/libraries/alcf/current/xl/BLAS/lib export LAPACK_LIB=/soft/libraries/alcf/current/xl/LAPACK/lib export FFTW_LIB=/soft/libraries/alcf/current/xl/FFTW3/lib -export FFTW_INC=/soft/libraries/alcf/current/xl/FFTW3/inc +export FFTW_INC=/soft/libraries/alcf/current/xl/FFTW3/include ./configure \ --FC=mpixlf2003_r \ --CC=gcc \ --LIBFLAGS="-L$FFTW_LIB -lfftw3 -L$LAPACK_LIB -llapack -L$BLAS_LIB -lblas" \ ---INCLUDE="-I$FFTW_INC" \ +--INCLUDE="-I . -I$FFTW_INC" \ --FFLAGS_OPT="-qfree=f90 -O2" \ --FFLAGS_DBG="-qfree=f90 -O0 -g -traceback -qcheck -C" \ --nodirs diff --git a/Makefile b/Makefile index 66e76966..d0fcaaee 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,10 @@ include make.inc SRC=src BUILD=$(SRC)/build + +# make the CUSTOMROOT variable available to sub-make processes +export CUSTOMROOT + rayleigh: @mkdir -p $(BUILD)/compiled @cp $(SRC)/parallel_framework/*.F90 $(BUILD)/. @@ -14,10 +18,16 @@ rayleigh: @cp $(SRC)/Diagnostics/*.F $(BUILD)/. @cp $(SRC)/Utility/*.F90 $(BUILD)/. @cp $(SRC)/Utility/*.c $(BUILD)/. + @cp $(SRC)/Include/*.F $(BUILD)/. @cp $(SRC)/Makefile $(BUILD)/. @cp $(SRC)/object_list $(BUILD)/. ifeq ($(NODIRS),1) cp $(SRC)/Utility/MakeDir.F90_IBM $(BUILD)/MakeDir.F90 +endif +ifdef CUSTOMROOT + @echo Custom directory specified. + @echo Any files from $(CUSTOMROOT) will overwrite standard Rayleigh source files. + @cp $(CUSTOMROOT)/* $(BUILD)/. 2>/dev/null || : endif @$(MAKE) --no-print-directory --directory=$(BUILD) clean_exec @$(MAKE) --no-print-directory --directory=$(BUILD) all @@ -42,6 +52,10 @@ distclean: rm -f $(BUILD)/*.F rm -f $(BUILD)/*.F90 rm -f $(BUILD)/*.c + rm -f $(BUILD)/*.o + rm -f $(BUILD)/*.mod + rm -f $(BUILD)/object_list + rm -f $(BUILD)/Makefile rm -f $(BUILD)/Machine_Definitions rm -f $(BUILD)/machine.no_comments @rm -f $(PREFIX)/rayleigh.* diff --git a/README.md b/README.md index c7682d39..3b9265c2 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,8 @@ Rayleigh is a 3-D convection code designed for the study of dynamo behavior in spherical geometry. It evolves the incompressible and anelastic MHD equations in spherical geometry using a pseudo-spectral approach. Rayleigh employs spherical harmonics in the horizontal direction and Chebyshev polynomials in the radial direction. The code has undergone extensive accuracy testing using the [Christensen et al. (2001)](http://adsabs.harvard.edu/abs/2001PEPI..128...25C) Boussinesq benchmarks and the [Jones et al. (2011)](http://adsabs.harvard.edu/abs/2011Icar..216..120J) anelastic benchmarks. Rayleigh has been developed with NSF support through the Computational Infrastructure for Geodynamics ([CIG](https://geodynamics.org/cig/news/newsletters/may-2016/)). + + Parallelization ----------------------------- The pseudo-spectral nature of Rayleigh means that its parallelization necessarily relies heavily on *global communication* patterns. That said, Rayleigh's parallelization is based around a 2-D domain decomposition and large-message-size all-to-alls. These features allow the code to overcome many of the obstacles that traditionally limit the scalability of spectral methods. The end result is a pseudo-spectral code optimized for petascale machines. Rayleigh's pure-MPI mode has demonstrated highly efficient strong scaling on 131,000 cores of the Mira Blue Gene/Q supercomputer for problems with approximately 2048^3 grid points (2048 spherical harmonics). Performance numbers from Mira are shown below. A summary of Rayleigh's performance and how it compares against other popular dynamo codes (albeit at at smaller process counts) may be found in the recent performance benchmark results of [Matsui et al. (2016)](http://onlinelibrary.wiley.com/doi/10.1002/2015GC006159/full). diff --git a/configure b/configure index 216d4611..b06de004 100755 --- a/configure +++ b/configure @@ -96,6 +96,11 @@ function displayhelp { echo " The C-compiler command DOES NOT need to be MPI-capable." echo "" + echo " --devel / -devel " + echo " Forces Rayleigh to build with debugging flags and no." + echo " vectorization (useful for quick development builds)." + echo "" + echo " --FC= " echo " Specifies the Fortran compiler command to be invoked by Make." echo " FC must be in your PATH, or else configure will fail. FC must" @@ -233,6 +238,11 @@ function displayhelp { echo " /lib/liblapack.a" echo "" + echo " --with-custom=" + echo " Set this flag to specify the location of custom Rayleigh source files." + echo " These files will be copied to the build directory and override any of" + echo " the standard Rayleigh source files." + echo "" } @@ -245,6 +255,7 @@ RAYLEIGHROOT=$PWD PREFIX=$RAYLEIGHROOT NEED_HELP=no USE_MKL="FALSE" +CUSTOMROOT="none" ############################################################################################### @@ -260,6 +271,10 @@ do exit 0; ;; + --with-custom=*) + CUSTOMROOT=`expr "x$option" : "x-*with-custom=\(.*\)"`; + ;; + -prefix=* | --prefix=*) PREFIX=`expr "x$option" : "x-*prefix=\(.*\)"` ;; @@ -298,6 +313,10 @@ do NODIRS="TRUE"; ;; + --devel | -devel) + DEVELMODE="TRUE"; + ;; + -mkl) if [ ! -z "$MKLROOT" ] then @@ -372,6 +391,12 @@ then then echo "NODIRS = 1" >> make.inc fi + if [[ $CUSTOMROOT == "none" ]] + then + echo "CUSTOMROOT = " >> make.inc + else + echo "CUSTOMROOT = "$CUSTOMROOT >> make.inc + fi exit 0 fi @@ -508,7 +533,18 @@ FFLAGS[1]=$DBG_FLAGS VECLEVEL[1]="" nvers=2 MULTIVEC=FALSE -if [[ $FVERSION == "INTEL" ]] + +if [[ $DEVELMODE == "TRUE" ]] +then + echo "************************************************************************" + echo " Development mode has been activated. Both rayleigh.opt" + echo " and rayleigh.dbg will be compiled with debugging flags " + echo " and no vectorization." + FFLAGS[0]=$DBG_FLAGS +fi + + +if [[ $FVERSION == "INTEL" ]] && [[ $DEVELMODE != "TRUE" ]] then echo "***********************************************************************" @@ -518,8 +554,9 @@ then echo " -- Westmere cores : SSE4.2" echo " -- Sandy Bridge / Ivy Bridge cores : AVX" echo " -- Haswell /Broadwell : AVX2 " + echo " -- SkyLake / Knights Landing : AVX512 " echo "" - OPTIONS="SSE4.2 AVX AVX2 ALL NONE" + OPTIONS="SSE4.2 AVX AVX2 AVX512 ALL NONE" select opt in $OPTIONS; do if [ "$opt" = "SSE4.2" ]; then FFLAGS[0]=$OPT_FLAGS" -xSSE4.2" @@ -530,18 +567,24 @@ then elif [ "$opt" = "AVX2" ]; then FFLAGS[0]=$OPT_FLAGS" -xCORE-AVX2" break + elif [ "$opt" = "AVX512" ]; then + FFLAGS[0]=$OPT_FLAGS" -xCORE-AVX512" + break elif [ "$opt" = "ALL" ]; then DEFAULT='avx2' - nvers=4 + nvers=5 MULTIVEC=TRUE FFLAGS[0]=$OPT_FLAGS" -xCORE-AVX2" FFLAGS[2]=$OPT_FLAGS" -xAVX" FFLAGS[3]=$OPT_FLAGS" -xSSE4.2" + FFLAGS[4]=$OPT_FLAGS" -xCORE-AVX512" RVALUES[0]=$DEFAULT RVALUES[2]=avx RVALUES[3]=sse + RVAKYES[4]=avx512 RVTAGS[2]="AVX" RVTAGS[3]="SSE" + RVTAGS[4]="AVX512" break elif [ "$opt" == "NONE" ]; then FFLAGS[0]=$OPT_FLAGS @@ -552,6 +595,7 @@ then fi done echo "***********************************************************************" + fi @@ -736,6 +780,13 @@ if [[ $NODIRS == "TRUE" ]] then echo "NODIRS = 1" >> make.inc fi +if [[ $CUSTOMROOT == "none" ]] +then + echo "CUSTOMROOT = " >> make.inc +else + echo "CUSTOMROOT = "$CUSTOMROOT >> make.inc +fi + echo " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" echo " Configuration is complete." echo " A Machine_Definitions files has been placed in $RAYLEIGHROOT/src/build." diff --git a/dev_build b/dev_build new file mode 100755 index 00000000..0c7e59f3 --- /dev/null +++ b/dev_build @@ -0,0 +1,3 @@ +make distclean +./configure -devel +make diff --git a/doc/Rayleigh_Output_Variables.pdf b/doc/Rayleigh_Output_Variables.pdf index d1a8326a14191bfc09c78ffdff38f6d3d81edeed..27e373ee5cff09e336e71bc978fbf40d8461d71a 100644 GIT binary patch delta 34894 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 W!kB6gmo4xFAPF`x3MC~)Peuw-vO#VD delta 34913 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 T^p}a)_{% zTWLvQW2o9C;Thzp#l1e7%8%hCGZt*<#eWbgQEp{I^7$!;78LU6-5UW|2n#5mm1S8a z$@%5fjzA>VVZ&jZ>hU9`PNV;U{!Q=Rq5s~yh;}du#;`Dnr@^rLg-i3ZjRFKhvB%nP zOOAg#FF6CXbZg*!V+VzbyI0DAXBHgReRJOa{v!6sGhFV6qq!-!p#<-&cnACtgHnc$ z;LvV@$;kxegRBE!e&dH{(~KhAS`);W?<~415R`i1W{FS5~eyy&H#wX5VcVnO%@WuOAZ=@{fOE=Gv=QFnZA6Zp6}Y z@p+p%TFzQyM-W|&-@QPI20y#EI-yXh7=PQQit^zM>*QsvxNb)2B$3Bt<{QvYb25KN zaPf#TMo&8SUMm06CvlB5I>JmIgg%45X~xut_spab_8NWkc!GRu-xT?g3xEP!^fFlp z6R#-Wa1@@5G-uo}?~hw78%gb@;7?+T4<=ZZ06jk*Nfy^l7;iR}n~wAkyr{~J=)<7mzr>j=DOaz3 z;$|)<7z$+1<$DIYB#_!La3HpseqOtv!-dHHLbXe=-jxld99X?%E@RG@w2CmpK2+qk z5BM1rIuX61_eh>c(ZswL1dd6^&6>G7SIwt*bb}o2t)+NzLG&rC-!seV1n_^7CtMUC zB|Vr%3u)G5s4K7wBX1qgf)9~;SP1a2ONk~*%e2t%zv2Rvcgl_U1Y<5r`^Y& zNPPRzeLT^hQM?7QNc#C|UW%?6KELt0ZDvl{g_7_Gb4)bV?j)u&%=u_}^6ujI-{*ZY z6Q+A#hU>h4G#{&4E!f2xF13G~_Fqfno3zg0Lo!6=nqO`Fnj80$(%`$B&UwbVUAwvu zEu-#WGnV~v>s&=P1um{AT{{qM=L6xnQcSONT8Ifn;b>h#I+ACM|2(OWw`Nd5G+$ps z&Pb|MYAnBv;uR@MAW>MrP#RY%>3uyAKjN;07UMBZf}aOn;t`HupND@TfxMkf6#ge* zjM6k`(wg4!!{i3DN3z@48{g16@u*Q8`B`op8497)Amfj*jrmi#aZGeAJSUFdpz9vd zcWb;L#Fu%o#@5)Gwh|{=CZjQ1l+t#_#>k_-3m;jX1SMK0RzZ&|s1mhp55*{XO+JzC zDv{7cb9}*7bpnRX91(w8fi{$C;pB4uK?U~2!X}@PGHr~$4sQ~2JEuBV!ITkr` zpE0JTU|0wu-iJsa<(6Xv7ICnu7RFaYD!NJ}yg2f$ej0zDnJar*1TpQ7aod`;=X+4s zcQyJFDv-z~*DrdewBn@L8UhsO?(*DL6af#y?dTRo$jwW3BMyJ4W27xy_ZW#fYiAd( z-F)k5(z8*tr2YEZ7xbFvut8FrNw{2xSxyR-a)|HihgfE~<3u5~heq~M(<_PKovGZZ zm@NW0f?=NKn1%`^G^`LQjHuBenhJg3OpO8os${&s6$hcBMiR-H$civ>>Mu7RkwZR| zY5Dn0372T6H=%zpv9;k?M@6Da+8TzJZ_eG4N4EKWIU5Aw?J6Xzl^3c4;3@fvaGs~6 z7$x?+V9vPxUTYVBZo)@!MxR3R<16=)sV$Q>#z%&#GNYVcY(8GiZ>)wr46>C6l1fzE z&O%5aCdq>RrNU7RB!h?YAz9}J)d`q=gZbC;6E?QR8!>;3uutJrr&(eeU14-BWGRCl zRa-wsTf87?SY6?vw$i0FmQH%C^U3$Yd`=M#C`@UN%xsrdHg*Pi(3jROWU*hwxrMlj zT;@;aJ?Y5g(y81J7Qmr*C0YjgU@Yh*t9p3(cvz_hzIc!45$0n+W!#V5=`IVLv#g!`Iot%cf6R*J;UQx;t5SVDpeIeg zL{wh<#J$ylb8@;@8(5)cJ+345+GhdQFBo%39Gi?xlRiAt%l$)MBo%_?d~DV0&R*W8lC9NWi$vKs;n-opsEan{&G znb!@xCeV3>t-VSotDur<_LtC|lAss6R%6xbw24t3fDab?T`AojdDD{j=0Ez=Mq0=7 z3-0tSmKj2rgmSJOqAg6r3koDvZq>~~V4;7kkoWOnd(|$_5{#%Diy{W>tmuZPK&7db z*t;oaycT#9Olq>Iym6SdI@;E^B+GVgU4m_7CXDbm(8q@tU(MWTF)Ln&H-O6_YcSx#GIWoR zN5c34e2ED12dGijS5D>fLU4-7zyead4@}zwA*mkUAsrHwJ+i+LWYizUTJu0O_=*>c z2gc2i`EDS(ez_RIb$)>@_4g`w@g9H2-nE9uvBci{HJ8S0LW;$1DicmX`&6F=w9dQe z&H^K0gC%iN;?#)w+sF8hNa;mvua*l4j`y=Y4$T9dsxIXd7&!~wOyI&E8D-5|(t*mj zrOmGeoUf&7D#mfCl{V|(8;`rs9(qrjDIAH2I0(i7_;6p|yi>x(iC5+~crAbP3RswY zZn>?d`1$MhA9%voL^T4y#!omdE|Vv z3H&S?-r!%|CfK#*)vMS^^{jZ{BNPWDuiEuS)lo7cg$G&3*~m=TDjxo2H0x`j9oQ8+ z!H0#aQAa%Bx0L7DLK|N>J#K#nlTL>=P2-VuyOU4oWMvU@1I0g@zaYk%y~f9oUQ8WK z=jX3uH65I%c~)Ji;KS{C zjWQs41UB?NF67AizpQ`hS#S{`df}^@dp@feBQp|`l#mwDRgqCd*+mr?M?8$Mf)wz| z$QS;j9DY}Scl^ApHXhfIy(U-$wfGa18%W48_@kfdrR93U;4V^Iq*fN49)Y(m*(_WY z@}kKjW;xdPzLG}v)O0;_v_Q-)&ctuLxt{R?^tz%5}wPsk?RfsC?k}Qzp=eQc}uTfa5)fj zZV(iiix*815kBj)jVnlplGV|VwPFe7$6oswpwaFJX<`Mu=8e$6-8y79j6~=lCpJtB z3Q*H@1(gupiEV$$_l=_$dBNRQ+o*r8X0g%R2}~l?T&Qy8Z*amqXuGztw?hk!%;3(Y zS~?~XgeHXiAdLp2?!7Q|?GvD?Ar=xjMEZOL zYc%BslhUfS69oz0PUp_St>`{7ml>!2l?JVsXdg|f4jg~Ht4I@p5}&4g>g7no(rB2Q z{mN!N5$(lIZ(DBtB)-uHQFUqGkh>)luBE|g+xrWAJh~qP2sKsk3*JcLyw4r`Fz>K^S6ZX+`r&ctF5B{#S$ACju5m*%# zpe&&(kp}yLpLS(g-M6`X6U?isR@mmD_*YGQP-mb(JP(O0IH;}GTc z$GPXlCeZSIa6oC6B)7QiWel6z*HpjaUCDE(^BRZ9SWKT=!EEeSVUYE z86YTg*7$x|_>Qz>}RcffCsCVd; z3HDGr$F#zj7{liVSG|s@A}^mz?a_t}T}73RYD=co!Vtbs1Sq5CJ5>wDBB@!Lykl;x z?o~`%D%js*!*9+~ID>QxiZQ@p;+q9QN>YE8@A62pe^6)^BcOo2Hx;NGc&yPG-ofXQ zS@rw1qX~4f&c@8`zv~#om$+u|J;)@!i`XXA&O+8kS4qtZQLn5GGCgvf4$n9Bf_XpC zXJ&H=Yx9ptVD|+M%!mb%zAALr2>HmM8 zQ|U{28B_FJO;_1#!}O-UXlEvKs|$&5e)hJOZl%%!%Oit$A)%OhNypESFfA^M)iho8kF&-?Tp>u*ZJCWEIZ?nVbNER zGvcs=qkGeNJ}tZt`N|b3V*8wEr^b1(P#)7W{Ox-p=~E@RJjOt})oy#02wJjd8+oH$ zC>d{`Np|&o9X;iDl>U%c___qQNJ*-N^Wj!BPYJ-C851??;JnlkujyjYp)iGd+B| zol-_5>YFcf0W}%0*=5%tGgU z(-%?ZJhnX-lg3FF`hen3>Wm9#UrTbJOj9^(JbLdO=Vs`H?mbe(soqwawSD$8pGg(X+a`ZjQyAIzYK$^r zzHOCTpZ?rlE5Fl#D}8`#xnZr{DT71%{3G&opcQGlohD0L?D1uonB6VfrpU7Z_cpUc=yLL#tjD+B|KL!&8D6bm^skrS z++Q??t{or^clY2YPriWjdiRVRmYd4_DseM_tQmiyIk;SRT_G|(;bMWLF`83;A@@qb zBXV6IyM0f)Zft+DVi?{zjKH-`sy1X5Ou&dKFgL%GE;1ejy%}7Zh4nP(`!Q15+`CWh4I?TMshik z-XqLRO5H-FdZWmAGKOV}3cEMoZDz~<8@duzd@YkmRV{zJRvp67Cj?QIQ9<7~6o!kM z+-tXzT+FJ$7C&CCyTQrvp~_w)7#^`<=YN?pP*n|*A*0y%v_ol4OaLqNp~O8_-Vx)S zjAG+uP+q$wm=a?~2@PiEY4eqiw1*_>D4lFq$DgI$J{j^4&)L0f zh=p)&Sp%>kUK5KT&Ft?1)Q}tdP5c$L8ia@WP-6E_?rN?~s)N^9ws0Qik=f~wx`op{ zf*%wUMw)pA@Mn}Li5AALj(9?GF@X%PYg(D=8X zL=JzOTemU+FKL)F6G}7iC6OECy4q*aN-ydxdLLzoPz%XUex1=?Q3}4`8=|;A*QF2)p%yl_)Lw^o>e$!k))@2- zOUiTD4eVK=u{wr~=DLzJZ*Ib$de|!&a>Z8#Y}0?n?Y!lZO8zy6Jq)lKWHPo+9_W95 z(`k<3(QNaB_@w78fb~3L zO_9VZ8%vrLlhjgm)#t@f$AUAp^8Z)p5%bS5F1MMFZ1px)p5n ztn95C$zs!Q@WGtOMG6IFk%NVZ`Vn7I8nt1WQm@jhzRN5B%+7C&`yp|*ksn?VnJA2e zXL1d#B5d7<){8Y>a2;XD;?;}zty z@@U&^1$xcjs5#@teMKux8GPjg`ed2T40yh~v~$_#GgoPCpxDb3@fm^rRx(%Bp&iE{ zIA4dRjakKK*aE7oCt>nJ4UmA}^boRy-mnMAUMKU+&^HhDTIAua8R=vqOiC;0@>;hK zzZX5k(M!pWRq+N5-oo1J%G7`F>OX0P1UJ`Mp2Z@-S9UQAMWA~s5nN>QjP*$h?y5WCjNU$4BPyQ)2 zZAOlYu4i;!jz`z{JZUGXQ|+0OMVf#a_K(vHLRShMRjlW~n&je6a^Un)1f!}DU(A}y z5i~{#huRLkPGxbq#{MV|R01?IS=7i6C$JfV@FC&|b_dFHJI(G0_6fZ;HNWH4bXqJm+k3Am{$eXh5K3eq&r_3xl_PUfd)19C&CZVJH&4uu(~jg zB8%NmV6ys|`BDQ#azjG6B(U`*J)bT2lJB6Ozi(T98>R7qpK~g$}RyGXh9eGEaiWf88rkLZBaGK6h)w= z$qV8T>Mgr4fS_kr2tLWf0qXGi2gz`SljGoDEwXNtUNOL!_tAz(w*p$g@n=PXixb>qM0MtsaLU(@`}hi{QCrxaV^1Y z6?t#YJ@t!rBMzV50qvhi^!JNC`c#2>pWK)8cn=pwP7ED+TQB!n5s{^%iSFn}vZQ?9 zew6`_K>M=QQftwK*hd~V5b_mi!lb|Mc(6AaEqwk!2xx!bK9}pERA4timelRn)4AN; zqbg!>>vx-gUX=G7Z;pxNHOgipIX%D>u)<1-7(EzdwGGi2xil`lMv$zLfjKc^1pQ^? zG)Piq{rUUpaUJmWN>bw5+k<5!(d$%JMCkXhZT8E|^Fino3%jBXfw{ET@k2&y(HWNW zTfGUc%@%)~cW%A|{jVPl(b4tqEq^3;&W^F8{b=@IcrTl^y5U8uy%ppFMfBY=6;O*{ zYRy@gV%_9zDmiw{rfJFi_8uuOksX-yl)8t4_yhUN=n*~X(?AKK~( zm+voPioTrVUYahNT|p5*3KvC_T70+rY9l1OeoCL4N8qqUg|^u+aqyX007|hrz8-de zc;$Z@jaQZZ5!FRu1Bt?DQen^W`nOHoxpa+2ZA+aN?Tgd~+^f0Ap@sR*d&duFuqvVS zjN9U!_u0Ngr_G}&XaYb+#+1}0{jps(JseOJnp~PuO^>*4B1ZaB6GhC8*T(*411fyv zv?1a~{X3j8TABjFx}L!HQLdP`H0^}TBF}$d&8UN?tBy_x&nTI&vkUGob?VF)nriD1 z@X*%vsds+3gOtiq+h*(;EhVNi(3;yriyG_b1W4p5Iaq`Xoj5xMV@}+5gltpJmuj}_ zZI(nLVDOyW^u;yxiR~rg-;;JV-S4Ho{PdkIaSd=LB>#MrWl;LC!nybTZF}$>Zlr%C zow5dIqmSInSHZh5+%5?i@k0(8rOS`3-X)fb)N{Ad732he)5Ld0rYYT5z76YUy80-W zfpHjCBA<%o4qT@ELO+5HP<8FUvDVzi>gf2sdpBW{gEVV}@8vuLGM51Ao`ru*YA>Hresn_sQMA+j8@XDuu%MW@#3IJ(I=FBL z(aZ)rK*e;4NlcXLQ3CM5&FM(P*+8{t6r@b%SvB(0wk&R9}_7}%6-o~o?$}8YA1)C&6Dra_YO$V1J%Uh$!Hp9Gs3?f-# z(g)9!FGpu6v`x?Y&tiD#5Ho+!v5u5v>HK>2^uK%fgu?VNpdwQwFT;-MZ-(rkZ^N#IhMeUD;{ zK5(40CrKQOoF|Ry#0ax4J|ktFVyfw6U`b?w)tuMT>LEn8x#pgkG|{3eO6-1q)1lnYDxZ$c+LP z=RLJ7B#RJ3e3O!+!>@l5k;Sjn5I-ETjp>xN?_Q8@z? z36$KegCC<@{Zi}C6Ne1JkNemtJh9CL$qU`j2$?q=r>2SWR$qU)jG8|s-5n~Oe838U z7Ygmp-E(Uc8)&7*dVjw9_Z3KE)nFI{SSSy1I*twg zELwE7acE7_lUQ7T$y&J-F2~>q8Q%N=@>20L9oc~JZjXPRfSgEErffW!gaHCv1BLt^ zU-8}g5>&!!(Bty(7zv4jxt_OoZ8=Hg2^Q{=4!4D6Ybw%&hmA0ZkL#K?wBQy+?^HBF z2}JhImR`_T$36Hma2bs>dV#3ILB(N4Q!k|zM9EAPzN4sK5viov-$y%O&te6az-Nur z`nvCUBz1pLa^p5sEY+FEQE-MzFCL;s%N;jQa#;Fh9t~MrtlTNGXz2!0roBRcOLP`_ zDMABNU=1_j8h@MQ+Ho_)w7b7fC~(%xo0qwE%!e~%&?zM$WtLu8^035(ebS(Zr4Z!g zSKM6TV$kF~`g~i&pTSwnwBE9s3opY!bKOvzbrOF(f~VRTxA>lbCvyR}hh&gME*IZ5pe z>*_ettuor)&&&_qI6&5=-C!&)KX{S5qsN6i+?XK>u()WBn3YFUch4h*jO^az)=e$k*w}D7_ZyKss+buikC`Wy_a(^%}_RB7GciSh(LUiD1uft=le_% z!Lafn>@B`DnU3S;oJVm*&0KAJB}2LWxBHj}2R_E?i~nET?~L zrPK8HybK5R{xThMGZu03R6lBQu@8=FJ(1XSS&03LG&0v;K2*?+q)y{~vEU+)XIdu~ zJs$9L#9pUUa*e)Kb5*}`9$WZ@K<&_F5rtpzF{~Gh^iIW6H1*68A78iVHCjrZdJaV> z2z8$`q-&qUuXN>hsU_-blviZu66=2pLBrHgr|vtT2~4>2jnZ+;JcBjT*qxhiksQ(5 z9kccEc}A!8bH%(}z&9*@y)ek-IL@+5LCmUidK&`D7oRBPe6QE9u z9XN;-{Z@vhQ@G5jg?$$$s$*i%0I%Hbgu^&&trV(%tU2h=`Ey}l54ZCC7nFZ4#q>ak zYc3^jn*Qg`jJ83yuRXdlo;;HH^F3XVnke)une|8-kcwG4+xkN13u`d$V@oonf!Z6s zQG-JIDw*salAnd*Btfkj6PVv0?!<3#7y$P}fNh}I4wKkwC?c-Ob44$Hc12LBpq7?K zpJcogQI&SukauF#RJ>G^WgjH)BtbjFOfb{kXBTSAtHYQmo1SkIi$zw7Sf1*V*Y-n`Qxp71^D&II-Bj(sRYR_n=1(nu~%Z<@S(R$c`+4HoX zrA{p9h?u8wKG8-TZ6LbF)3}%eZLBdVr6$n$9BdOb?TiKoPaMS91meVmyvJLMG>*39 zqG}?I^I11kwISJtNZLq5BXO2I_0zaaOvgZ5CL)QpsHv0Se{d%Fz2q8aX+4_i9IZ!N zaDnhj#9Aa2iL^_^6k+NzF`sG6nqbSe@y1d=vE&pz6ALc;J*_nHNE^^fH9ipgT7gTN zqG_1V08|k_ion$>5TgWz)~X5CU~nc@HGxWE3!XNrwP`{KaZgigNQ9H7ZG{ZVBw^Yk z4JN>&A&9kce}n)%X<~td>>*6z9cw}CIbkrNlQZO;2?nM1H0eNsP_)%e3Ycz9lQM}@ zlOAN?tDzXmMD!6=m7<4&&}JOhu&qR3Xq&JLtYb-~tRk6dD2ug#0P5ou?NU2h&IM3K zyEj0=(Vr(?(L=SIhyp2+rY&I%Q6X#$MpG?<3T8!Ke*-W?2fzS+j5q{fn>e(fKsDnt zC{WF1P@owpWYDL-YzT1;{xWk!I-@g@234wMllH#-cCUT?_vN%{pHGgbd+o!E^XuvP z^;Ki(*uC6qUrw(sZsteRD>{SRa5()qn;cwxZhlkL5NPW$o8R|n`kdwwCOqsP|6t0G ziCXjRf45Ehn8fDLgDR<2sgkrpsgk^6sir0^8dH-OvmmQQGx5UPX=t7H`TXMO)%3dg zjd*zUxM^QcKVLV$FSf9fIUNSvxvki%80mJ;c4e`Bs;5<~bZl$LX~1D01TsjaO15Py z2#mW80UgzCAXtNMvf6$H21{0Y4AyYeda@dsejU(a&Ve1A z1H0Ziuz7=XP;tGrEqCVjj-A?S$E#JimJWr6cF}Ao##$ksZOyZb1FrmzxEfQrij#`L zf2I1}lM$~5jHF$Or`mmWN=Bqpv%S(O-Iu{Zq~!Hi*1!7f_YBJ_1?+pzE&YWb1Ww-V zUM+k4jbKpox@7RaT;%~*aV@Tb+Q8^_oZNGpVW4S2Z?(agUQ4nhJwmTDm;Y(X4jQ;aKQa3w-2epvr%H7*q~nm0Ru~>a9^4oQ3>Vf6l@h zDRRYCodDN)@oJd1wPtx>mh*aMIj^51-}hou4YU}S_Sf?4(Zk|v>zzYRr~nn-kE*8 zS7G<@wR+mm6xSr~NP!-FQ2WH2()-wA%+!;-+2>a&9JhJBk9P(zCn=^Cf9*c)J7lWI z7-&$`STJR~?pTyM4d-@P;WGgR#kDi^9^JNT1H(Da42kf4fZcl8Io~0pG+eQQmZ*EhO3+(ZL%k+Vf_x)tEK<9G8SE zNyjSCNMJTZFqJ&^K_=dTpuu}3*izOgwGDdg!+FR?%4h?Y-@2@6lBU=t>E1(hc=e{V z+el6ZXHsQAuM}8~tOR&*f!e{U0Z1_#mX2k0B)<984pu-9R~C#5x(ByPQfj*wOJqou6lRb<1-Ez6bUSt~7u$HLg4y-?>;#=w^PUcDRV zTv(Q6g^mW}oh?7e3j zks?k`*q67jU^hif5FJnF1t3ru^aXht!zIOUs+-1TAT97c42Jc(1%yRjU9FZhT5I_S z)oFythUYEEN`H|O`LMaA7at@|+RMjXPl_jGhloW;2-UHYyt>3VBDLOfcYNd( zvy@T`a>JIMF4a0vl{K!I3y(vS2@7MmJE0VlnH?(}f7-py(o5=Qn1JD6E#dXg5?PT+ z(3Xud#XLH*DPb>|GJASe<~p0%eR9;f%G#F?YY~u2S-X{O%9`fT$4WhD7`eouWeS#$ zb!L;`Sb<<3qXFP4Njo1*75IP{ymtyL=)eGC8KPjlQ($LDa=?O_!$G)y1mK{x# zwm==Sf9235vpYc);kn!4O<$OZs_Y}@gowyMA)xof6RAu_tmz$eo+Db1t%%H>az%OY zk}uj3Bw2B4k!?Bbre&De(;JS3EFwG4B6Sj(bL8e}yYSV4Rlo;^NFz>nY+)RS-_9b| zb2*?4nJqD|5W~_Q2E~>(yE58G1xm64x8bd9e?(yj=J6)B=g>=Y#A%pv;9j&OlQ{Rl zo8heRZ29FB^$R(7<@DjD=nekrxp7IMs{yrKY%lyw)SLtu@vAI6j$mVwm=}V;u^|jS zE1t`o6+wFt$B42-OmV0&C0it;-G-@nGH{ zej)VIdRO97CtqxVk+>w@UO_`9IIxD)+5Uj zBaxsf-Ul1XZAzh2moeO?EG*fSaEY04EP zvBW&Ttia)r53t{51sTa@&TKuZ7Rc2$e+wia%NmuMCuwm(@n82Oy;WNTX zx@5YtBg4)rYd!_O%y&kl!1*4(eBUoD8*?dr^c(%vb5nMOLRSlXmJ(aC6rjgRf5Uhq znndJ-lNw6A0+e!s@fI`#pYj|vJ4cBT9J~qNG+0p(%RY$%^2m^hH@1O8E{qHkaj9%M zgosOTg1j3MYvdTVD?4Ny>#sO;!5?=tw1{FG?%Cc4wx7;%v;~>MaS-Y(*`VMntV?n! zVEB5-vgwI@)HA#fhp3Wjuwm2ee{~Z=?Zqt$en5lU8C3#b+`_~!7}Z$y++DIITiELL zr>#Mhi`A`*^=`SD+r#Q$b>&clUwQDzkq{X-h9z0xQbsVVe6d!_YLl`W5q9K5;)@cMUEhl?r{LhrRWg@MJ=W$k)a+Rbc03Y#U#WK|= zx^LUc{H68EY(X>O!8IVle_2XV1-4~^E5|3bvJC1aH>{Mc&U@sjT9NgNC<*jC>D1Km zoO$2nPNhEkT}UR&bhUa^9lrSL@Ni$Xz59lBwH>MxuL2LClUpreiv#C!(CEr3j>r=N9Uc<}=`h{xXd>%jNyTm~@QZu2m2)u_BGCe_lzCTYEA!9gS4q zQ7lKx2+Q{fmNlygr0Ol2ROP6hPSl2zlZo!ip{OyJ#VvElzshZkLoNq~uS=5Lz%L!Q zR(w5A2eotU3#y7!kW|*fXsOks>f_gi1cd@0lFb8-I@rK2%5LRqn@eda;Rc6Cg)cH_ zxdaiB!=cRC9S*${f8F7knZNl7EFOv&@PQ$Tl@+;%F7*@)-+{?p4~<~um4&qy-&2Af zzCdTZWapu(-{#8ug)|o-kR+DKO*?5yYb|3j-nBU^Gnb=fgakB>0~e7^-78p0ol9t# z@pAe&)s)h5_-UQxMAq;n>gp0{nHPPHd{@9TaRnv)WXxdoe<`lBrF}u$@Yf2utSFY$>ItI;)t9d$d_lbu*Oegr7C4eovg4{F;-6ouuzc{G`F9NWYuyvbILqG|FKZ_AeZ#V!e`j!;*MU6|uIkF% zeFWFLKH09+xkR#|{3sB0jJe6 zZ<3KxX1>*_TX55c|9XJM%Ms(SUbhHk$KSZrb;=f?j@6hlSK8T*OAGQty_j3mTkn81!rhD-M??*hEULDP6m)93_d0*n`Fnsi`SIzLTBzaG_4Mp5sq$X?f3D1;Sc8b1Oy+o<;=kHQ?T_vGN&BHa ze`=3r^P`)yPp8w*?Z3MtIUZ2dT)Assb7wt{^SNpH_?>=sM6Wo4z^6JS?uLU$q%M-$B0pUGI{&`i(lXWN-{b8 zVN51uz{N-?m%gCvc3rDyM&)wAdj50!ynR6$4m&Y9y*!z~R$QE&O`zr16H@9wCYP6! z_EdNxtvept_y`fBjFN77BiOGHWkqq~-II3(|DxHz@tp2X7;n@$m5V zv%>=h&#%PJ#sZync}LJ?H3}U#oC{lhrZ#dLPagbqaPTuTHR1;K!f8akBc_tRLm!|C zuy3>WpX>&DvRzB48=3zf-@SPM;5+93VC+a}Um!3#Y-9f`2*{O;dVm8ue-V>~W_Lm+ ztNiaCqhTX+{O0BNhwq*Wqa%{;)K~9_&2Sf&eX)g&4B4}1FW$U=K-|0>6BIW70uy9b716mr@)0-;_ z9sazzxSmRfL=k5**;N-$T%BS&%cx>@`mv5JJ|nsq#us5DbNuM=&HEQWvI>mEZPrQL zmQ&h|2KZ48cuXnD)3)cg7#{?*e=Nh*oZ<0XUO!P$`$&=mZvjg9C(1 zAOQk_?DW9}FL;*Q+NRxp`#rMU28^B5p1vR?S?72D($VoTwJk7#+Ac810qRf?uEdsu zO)YT2wM=js}Avl_06sU_s0-sfXZ5+f07&R$i!Xc4eqei7kt>126fabM;aeL8szEwF#ys&?2~2?FQf3793ms_5B(j^%*(!DK;AoY?y77=(Vp^A7*PUpHv`M(qxzxKXw(KO3YGFN1vow!|fWxBjscgzHTL zmctFAFlz3G;#QGv;%~!cW53=8ID!L{B-qVB;JSIXN^pusHhwe-68M8ONsstZbodsj zS@I?Fm%%ppJNuUnp0?W{A;G_=@TMW;J-5nVcpR7ngHY6llvLkzPAjd3!I!Q!gl8_Vmda0Qe zYewGbOOkfgAc8zU4%7^g;b`3GJ)m+gyT%uLq|#SvleEJqPLzMC*Y|$bp-RnjxJouL z<{h^>zuO$%&u5x%7vP;dUYz4q=LenH)#>f&tlfH6^m&nZY3Avaor`Dm6_4q@GXA+U z>GYp8o)zF(1$>Qvv-g@W&BX%otzz{ek2fz)o}HaMuTG!cjb0WnNFQ_y=~sbA=>`7m z=(((p$GiS8@KU@ipkKuuEe(5CBkVhkzUSSi^n$3j%y;PL+C_DGZ$4TyS}ENt+Ix$= z&1dIFU*pi^W2sE%Csgh59O{I4G;VQ-|Uv=<>k~WO% zCe4|k!x(f1|6IqoPQIXP574z57R_m+s|S#>wsrjy1pPJuOH0rh3O{{yQ{Q)6`>sO( z^c*`qo`-U42yRR%C59PR*?4?;&^@LVeUPrZ!l{VDGxi`On2V5_HK7`h^er zE~*c7?VDR*@7BkUiNo5^hJX5m&-@Qqo}&hr5qtp?moDuDUQb0fLo-A$GdD3cHAOWx zH!ws+LpMY>Mnpz1Loz`{I5R#VJViD`Gej^mH!(FeMKv}zFhoT|H$*o^L`E<}GC@T+ zGd^7kFHB`_XLM*FHJ4#G0V{tc)5~wnQ5*&E@43ILt#S1+MmwrX$D>r0QPrZ<`#Do% zs;GLkO(YUqHrUv8VIdY4($+sf@=I4lEF>04BoYe?EG+1TXe@ySYU0Tv65#V=8gAfcBjRBGiPq}Le6oLlRFNb{<`EA| zz0}-dR-O?mV3{ed1%514!LkL7)Uk4xkbw2&G_sHcSbwiZ(yY90sD>4WwU!_$u4#i> z*r@gkynRT*u76e44N|c24plu&J?vglbqPtsCdaj@>Qd4On|iB}Wuyrfe^6acnqe;@ z)fTb>_A0Hql4M}7^QwQV$tu{#TiU*nwUw-a&9-Y~9a#&To7ITk-+IypBz|dR18E16 zpH(-K4xsh7YL;vQx^-l%+jo-9K+g@0bdfDUu~N00Yy~d2scs`Zz|9ub9b`Lj=Zfl1 z(hEG$U1EMSaTC}2$Sz>I{N#JcZs6Ht)xBgN*-s9TgX9o7Opbq$qvROLkv!=q$4P;l zAVo4jP6F?p&KLxKK2$md{Q0YN8m{ZP(iymGLrOz%_Xm~E!oB&TGz>RWe!J%o)s=TS zkErv9(gj2V4N4agO}|sRgy_?R(g=L?PiYiBlT;dmA9B?tfX psuKT9F@INaGyDv -Output written on Rayleigh_Output_Variables.pdf (33 pages, 323670 bytes). +Output written on Rayleigh_Output_Variables.pdf (33 pages, 323636 bytes). PDF statistics: 187 PDF objects out of 1000 (max. 8388607) 131 compressed objects within 2 object streams diff --git a/etc/diagnostic_codes/Rayleigh_Output_Variables.pdf b/etc/diagnostic_codes/Rayleigh_Output_Variables.pdf index d1a8326a14191bfc09c78ffdff38f6d3d81edeed..27e373ee5cff09e336e71bc978fbf40d8461d71a 100644 GIT binary patch delta 34894 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 W!kB6gmo4xFAPF`x3MC~)Peuw-vO#VD delta 34913 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 T^p}a)_{% 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 psuKT9F@INaGyDv 1): + print("Error in ", infile, ' qcode duplicated: ', ecvi) + tfcnt=0 ofile=inpref[0]+'_table'+str(tfcnt)+'.tex' myfile= open(ofile,"w") @@ -172,3 +181,8 @@ def parse_offset_line(codeline): myfile= open(ofile,"w") #print(len(varnames)) myfile.close() + +#Finally, perform a consistency check across all quantity codes parsed +for ecvi, ecv in enumerate(glob_echecks): + if (ecv > 1): + print('Global Error -- qcode duplicated: ', ecvi) diff --git a/etc/diagnostic_codes/ke_equation_table0.tex b/etc/diagnostic_codes/ke_equation_table0.tex index fe866145..c147a0bd 100644 --- a/etc/diagnostic_codes/ke_equation_table0.tex +++ b/etc/diagnostic_codes/ke_equation_table0.tex @@ -1,20 +1,20 @@ $-c_3\mathrm{f}_1\boldsymbol{v}\cdot\boldsymbol{\nabla}\left(\frac{P}{\mathrm{f}_1}\right)$ & 1901 & press\_work & $c_4\overline{\boldsymbol{v}}\cdot\left[\left(\boldsymbol{\nabla}\times\overline{\boldsymbol{B}}\right)\times\overline{\boldsymbol{B}}\right] $ & 1922 & mag\_work\_mmm \\[10pt] - $-c_3\mathrm{f}_1\boldsymbol{v'}\cdot\boldsymbol{\nabla}\left(\frac{P'}{\mathrm{f}_1}\right)$ & 1902 & press\_work\_pp & $\frac{1}{2}\mathrm{f}_1v_r\,v^2$ & 1922 & ke\_flux\_radial \\[10pt] - $-c_3\mathrm{f}_1\overline{\boldsymbol{v}}\cdot\boldsymbol{\nabla}\left(\frac{\overline{P}}{\mathrm{f}_1}\right)$ & 1903 & press\_work\_mm & $\frac{1}{2}\mathrm{f}_1v_\theta\,v^2 $ & 1923 & ke\_flux\_theta \\[10pt] - $c_2v_r\mathrm{f}_2\Theta$ & 1904 & buoy\_work & $\frac{1}{2}\mathrm{f}_1v_\phi\,v^2$ & 1924 & ke\_flux\_phi \\[10pt] - $c_2v'_r\mathrm{f}_2\Theta'$ & 1905 & buoy\_work\_pp & $\frac{1}{2}\mathrm{f}_1\,\overline{v_r}\,\overline{v}^2 $ & 1925 & mke\_mflux\_radial \\[10pt] - $c_2\overline{v_r}\mathrm{f}_2\overline{\Theta}$ & 1906 & buoy\_work\_mm & $\frac{1}{2}\mathrm{f}_1\,\overline{v_\theta}\,\overline{v}^2$ & 1926 & mke\_mflux\_theta \\[10pt] - $c_5\boldsymbol{v}\cdot\left[\boldsymbol{\nabla}\cdot\boldsymbol{\mathcal{D}}\right]$ & 1907 & visc\_work & $\frac{1}{2}\mathrm{f}_1\,\overline{v_\phi}\,\overline{v}^2$ & 1927 & mke\_mflux\_phi \\[10pt] - $c_5\boldsymbol{v'}\cdot\left[\boldsymbol{\nabla}\cdot\boldsymbol{\mathcal{D'}}\right]$ & 1908 & visc\_work\_pp & $\frac{1}{2}\mathrm{f}_1\,\overline{v_r}\,{v'}^2 $ & 1928 & pke\_mflux\_radial \\[10pt] - $c_5\overline{\boldsymbol{v}}\cdot\left[\boldsymbol{\nabla}\cdot\overline{\boldsymbol{\mathcal{D}}}\right]$ & 1909 & visc\_work\_mm & $\frac{1}{2}\mathrm{f}_1\,\overline{v_\theta}\,{v'}^2 $ & 1929 & pke\_mflux\_theta \\[10pt] - $\mathrm{f}_1\boldsymbol{v}\cdot\left[\boldsymbol{v}\cdot\boldsymbol{\nabla}\boldsymbol{v}\right]$ & 1910 & advec\_work & $\frac{1}{2}\mathrm{f}_1\,\overline{v_\phi}\,{v'}^2 $ & 1930 & pke\_mflux\_phi \\[10pt] - $\mathrm{f}_1\boldsymbol{v'}\cdot\left[\boldsymbol{v'}\cdot\boldsymbol{\nabla}\boldsymbol{v'}\right]$ & 1911 & advec\_work\_ppp & $\frac{1}{2}\mathrm{f}_1\,v'_r\,{v'}^2 $ & 1931 & pke\_pflux\_radial \\[10pt] - $\mathrm{f}_1\overline{\boldsymbol{v}}\cdot\left[\boldsymbol{v'}\cdot\boldsymbol{\nabla}\boldsymbol{v'}\right]$ & 1912 & advec\_work\_mpp & $\frac{1}{2}\mathrm{f}_1\,v'_\theta\,{v'}^2 $ & 1932 & pke\_pflux\_theta \\[10pt] - $\mathrm{f}_1\boldsymbol{v'}\cdot\left[\overline{\boldsymbol{v}}\cdot\boldsymbol{\nabla}\boldsymbol{v'}\right]$ & 1913 & advec\_work\_pmp & $\frac{1}{2}\mathrm{f}_1\,v'_\phi\,{v'}^2 $ & 1933 & pke\_pflux\_phi \\[10pt] - $\mathrm{f}_1\boldsymbol{v'}\cdot\left[\boldsymbol{v'}\cdot\boldsymbol{\nabla}\overline{\boldsymbol{v}}\right]$ & 1914 & advec\_work\_ppm & $c_5\left[\boldsymbol{v}\cdot\boldsymbol{\mathcal{D}} \right]_r$ & 1934 & visc\_flux\_r \\[10pt] - $\mathrm{f}_1\overline{\boldsymbol{v}}\cdot\left[\overline{\boldsymbol{v}}\cdot\boldsymbol{\nabla}\overline{\boldsymbol{v}}\right]$ & 1915 & advec\_work\_mmm & $c_5\left[\boldsymbol{v}\cdot\boldsymbol{\mathcal{D}} \right]_\theta $ & 1935 & visc\_flux\_theta \\[10pt] - $c_4\boldsymbol{v}\cdot\left[\left(\boldsymbol{\nabla}\times\boldsymbol{B}\right)\times\boldsymbol{B}\right]$ & 1916 & mag\_work & $c_5\left[\boldsymbol{v}\cdot\boldsymbol{\mathcal{D}} \right]_\phi$ & 1936 & visc\_flux\_phi \\[10pt] - $c_4\boldsymbol{v'}\cdot\left[\left(\boldsymbol{\nabla}\times\boldsymbol{B'}\right)\times\boldsymbol{B'}\right]$ & 1918 & mag\_work\_ppp & $c_5\left[\boldsymbol{v'}\cdot\boldsymbol{\mathcal{D'}} \right]_r$ & 1937 & visc\_fluxpp\_r \\[10pt] - $c_4\overline{\boldsymbol{v}}\cdot\left[\left(\boldsymbol{\nabla}\times\boldsymbol{B'}\right)\times\boldsymbol{B'}\right] $ & 1919 & mag\_work\_mpp & $c_5\left[\boldsymbol{v'}\cdot\boldsymbol{\mathcal{D'}} \right]_\theta$ & 1938 & visc\_fluxpp\_theta \\[10pt] - $c_4\boldsymbol{v'}\cdot\left[\left(\boldsymbol{\nabla}\times\overline{\boldsymbol{B}}\right)\times\boldsymbol{B'}\right] $ & 1920 & mag\_work\_pmp & $c_5\left[\boldsymbol{v'}\cdot\boldsymbol{\mathcal{D'}} \right]_\phi$ & 1939 & visc\_fluxpp\_phi \\[10pt] - $c_4\boldsymbol{v'}\cdot\left[\left(\boldsymbol{\nabla}\times\boldsymbol{B'}\right)\times\overline{\boldsymbol{B}}\right]$ & 1921 & mag\_work\_ppm & $c_5\left[\boldsymbol{\overline{v}}\cdot\boldsymbol{\overline{\mathcal{D}}} \right]_r$ & 1940 & visc\_fluxmm\_r \\[10pt] + $-c_3\mathrm{f}_1\boldsymbol{v'}\cdot\boldsymbol{\nabla}\left(\frac{P'}{\mathrm{f}_1}\right)$ & 1902 & press\_work\_pp & $\frac{1}{2}\mathrm{f}_1v_r\,v^2$ & 1923 & ke\_flux\_radial \\[10pt] + $-c_3\mathrm{f}_1\overline{\boldsymbol{v}}\cdot\boldsymbol{\nabla}\left(\frac{\overline{P}}{\mathrm{f}_1}\right)$ & 1903 & press\_work\_mm & $\frac{1}{2}\mathrm{f}_1v_\theta\,v^2 $ & 1924 & ke\_flux\_theta \\[10pt] + $c_2v_r\mathrm{f}_2\Theta$ & 1904 & buoy\_work & $\frac{1}{2}\mathrm{f}_1v_\phi\,v^2$ & 1925 & ke\_flux\_phi \\[10pt] + $c_2v'_r\mathrm{f}_2\Theta'$ & 1905 & buoy\_work\_pp & $\frac{1}{2}\mathrm{f}_1\,\overline{v_r}\,\overline{v}^2 $ & 1926 & mke\_mflux\_radial \\[10pt] + $c_2\overline{v_r}\mathrm{f}_2\overline{\Theta}$ & 1906 & buoy\_work\_mm & $\frac{1}{2}\mathrm{f}_1\,\overline{v_\theta}\,\overline{v}^2$ & 1927 & mke\_mflux\_theta \\[10pt] + $c_5\boldsymbol{v}\cdot\left[\boldsymbol{\nabla}\cdot\boldsymbol{\mathcal{D}}\right]$ & 1907 & visc\_work & $\frac{1}{2}\mathrm{f}_1\,\overline{v_\phi}\,\overline{v}^2$ & 1928 & mke\_mflux\_phi \\[10pt] + $c_5\boldsymbol{v'}\cdot\left[\boldsymbol{\nabla}\cdot\boldsymbol{\mathcal{D'}}\right]$ & 1908 & visc\_work\_pp & $\frac{1}{2}\mathrm{f}_1\,\overline{v_r}\,{v'}^2 $ & 1929 & pke\_mflux\_radial \\[10pt] + $c_5\overline{\boldsymbol{v}}\cdot\left[\boldsymbol{\nabla}\cdot\overline{\boldsymbol{\mathcal{D}}}\right]$ & 1909 & visc\_work\_mm & $\frac{1}{2}\mathrm{f}_1\,\overline{v_\theta}\,{v'}^2 $ & 1930 & pke\_mflux\_theta \\[10pt] + $\mathrm{f}_1\boldsymbol{v}\cdot\left[\boldsymbol{v}\cdot\boldsymbol{\nabla}\boldsymbol{v}\right]$ & 1910 & advec\_work & $\frac{1}{2}\mathrm{f}_1\,\overline{v_\phi}\,{v'}^2 $ & 1931 & pke\_mflux\_phi \\[10pt] + $\mathrm{f}_1\boldsymbol{v'}\cdot\left[\boldsymbol{v'}\cdot\boldsymbol{\nabla}\boldsymbol{v'}\right]$ & 1911 & advec\_work\_ppp & $\frac{1}{2}\mathrm{f}_1\,v'_r\,{v'}^2 $ & 1932 & pke\_pflux\_radial \\[10pt] + $\mathrm{f}_1\overline{\boldsymbol{v}}\cdot\left[\boldsymbol{v'}\cdot\boldsymbol{\nabla}\boldsymbol{v'}\right]$ & 1912 & advec\_work\_mpp & $\frac{1}{2}\mathrm{f}_1\,v'_\theta\,{v'}^2 $ & 1933 & pke\_pflux\_theta \\[10pt] + $\mathrm{f}_1\boldsymbol{v'}\cdot\left[\overline{\boldsymbol{v}}\cdot\boldsymbol{\nabla}\boldsymbol{v'}\right]$ & 1913 & advec\_work\_pmp & $\frac{1}{2}\mathrm{f}_1\,v'_\phi\,{v'}^2 $ & 1934 & pke\_pflux\_phi \\[10pt] + $\mathrm{f}_1\boldsymbol{v'}\cdot\left[\boldsymbol{v'}\cdot\boldsymbol{\nabla}\overline{\boldsymbol{v}}\right]$ & 1914 & advec\_work\_ppm & $c_5\left[\boldsymbol{v}\cdot\boldsymbol{\mathcal{D}} \right]_r$ & 1935 & visc\_flux\_r \\[10pt] + $\mathrm{f}_1\overline{\boldsymbol{v}}\cdot\left[\overline{\boldsymbol{v}}\cdot\boldsymbol{\nabla}\overline{\boldsymbol{v}}\right]$ & 1915 & advec\_work\_mmm & $c_5\left[\boldsymbol{v}\cdot\boldsymbol{\mathcal{D}} \right]_\theta $ & 1936 & visc\_flux\_theta \\[10pt] + $c_4\boldsymbol{v}\cdot\left[\left(\boldsymbol{\nabla}\times\boldsymbol{B}\right)\times\boldsymbol{B}\right]$ & 1916 & mag\_work & $c_5\left[\boldsymbol{v}\cdot\boldsymbol{\mathcal{D}} \right]_\phi$ & 1937 & visc\_flux\_phi \\[10pt] + $c_4\boldsymbol{v'}\cdot\left[\left(\boldsymbol{\nabla}\times\boldsymbol{B'}\right)\times\boldsymbol{B'}\right]$ & 1918 & mag\_work\_ppp & $c_5\left[\boldsymbol{v'}\cdot\boldsymbol{\mathcal{D'}} \right]_r$ & 1938 & visc\_fluxpp\_r \\[10pt] + $c_4\overline{\boldsymbol{v}}\cdot\left[\left(\boldsymbol{\nabla}\times\boldsymbol{B'}\right)\times\boldsymbol{B'}\right] $ & 1919 & mag\_work\_mpp & $c_5\left[\boldsymbol{v'}\cdot\boldsymbol{\mathcal{D'}} \right]_\theta$ & 1939 & visc\_fluxpp\_theta \\[10pt] + $c_4\boldsymbol{v'}\cdot\left[\left(\boldsymbol{\nabla}\times\overline{\boldsymbol{B}}\right)\times\boldsymbol{B'}\right] $ & 1920 & mag\_work\_pmp & $c_5\left[\boldsymbol{v'}\cdot\boldsymbol{\mathcal{D'}} \right]_\phi$ & 1940 & visc\_fluxpp\_phi \\[10pt] + $c_4\boldsymbol{v'}\cdot\left[\left(\boldsymbol{\nabla}\times\boldsymbol{B'}\right)\times\overline{\boldsymbol{B}}\right]$ & 1921 & mag\_work\_ppm & $c_5\left[\boldsymbol{\overline{v}}\cdot\boldsymbol{\overline{\mathcal{D}}} \right]_r$ & 1941 & visc\_fluxmm\_r \\[10pt] diff --git a/etc/diagnostic_codes/ke_equation_table1.tex b/etc/diagnostic_codes/ke_equation_table1.tex index 056a69d3..bfe8cbe0 100644 --- a/etc/diagnostic_codes/ke_equation_table1.tex +++ b/etc/diagnostic_codes/ke_equation_table1.tex @@ -1,14 +1,14 @@ - $c_5\left[\boldsymbol{\overline{v}}\cdot\boldsymbol{\overline{\mathcal{D}}} \right]_\theta$ & 1941 & visc\_fluxmm\_theta \\[10pt] - $c_5\left[\boldsymbol{\overline{v}}\cdot\boldsymbol{\overline{\mathcal{D}}} \right]_\phi$ & 1942 & visc\_fluxmm\_phi \\[10pt] - $-c_3v_r P$ & 1943 & press\_flux\_r \\[10pt] - $-c_3v_\theta P$ & 1944 & press\_flux\_theta \\[10pt] - $-c_3v_\phi P$ & 1945 & press\_flux\_phi \\[10pt] - $-c_3v'_r P'$ & 1943 & press\_fluxpp\_r \\[10pt] - $-c_3v'_\theta P'$ & 1944 & press\_fluxpp\_theta \\[10pt] - $-c_3v'_\phi P'$ & 1945 & press\_fluxpp\_phi \\[10pt] - $-c_3\overline{v_r}\, \overline{P}$ & 1943 & press\_fluxmm\_r \\[10pt] - $-c_3\overline{v_\theta}\, \overline{P}$ & 1944 & press\_fluxmm\_theta \\[10pt] - $-c_3\overline{v_\phi}\, \overline{P}$ & 1945 & press\_fluxmm\_phi \\[10pt] - $ -- $ & 1946 & production\_shear\_ke \\[10pt] - $ -- $ & 1947 & production\_shear\_pke \\[10pt] - $ -- $ & 1948 & production\_shear\_mke \\[10pt] + $c_5\left[\boldsymbol{\overline{v}}\cdot\boldsymbol{\overline{\mathcal{D}}} \right]_\theta$ & 1942 & visc\_fluxmm\_theta \\[10pt] + $c_5\left[\boldsymbol{\overline{v}}\cdot\boldsymbol{\overline{\mathcal{D}}} \right]_\phi$ & 1943 & visc\_fluxmm\_phi \\[10pt] + $-c_3v_r P$ & 1944 & press\_flux\_r \\[10pt] + $-c_3v_\theta P$ & 1945 & press\_flux\_theta \\[10pt] + $-c_3v_\phi P$ & 1946 & press\_flux\_phi \\[10pt] + $-c_3v'_r P'$ & 1947 & press\_fluxpp\_r \\[10pt] + $-c_3v'_\theta P'$ & 1948 & press\_fluxpp\_theta \\[10pt] + $-c_3v'_\phi P'$ & 1949 & press\_fluxpp\_phi \\[10pt] + $-c_3\overline{v_r}\, \overline{P}$ & 1950 & press\_fluxmm\_r \\[10pt] + $-c_3\overline{v_\theta}\, \overline{P}$ & 1951 & press\_fluxmm\_theta \\[10pt] + $-c_3\overline{v_\phi}\, \overline{P}$ & 1952 & press\_fluxmm\_phi \\[10pt] + $ -- $ & 1953 & production\_shear\_ke \\[10pt] + $ -- $ & 1954 & production\_shear\_pke \\[10pt] + $ -- $ & 1955 & production\_shear\_mke \\[10pt] diff --git a/etc/diagnostic_codes/me_equation_table0.tex b/etc/diagnostic_codes/me_equation_table0.tex index b82b078e..f0fb3b2a 100644 --- a/etc/diagnostic_codes/me_equation_table0.tex +++ b/etc/diagnostic_codes/me_equation_table0.tex @@ -1,20 +1,20 @@ - $\left[\left(\boldsymbol{v}\times\boldsymbol{B}-\eta\boldsymbol{\mathcal{J}}\right)\times\boldsymbol{B}\right]_r$ & 2001 & ecrossb\_r & $\boldsymbol{B'}\cdot\left[\boldsymbol{\nabla}\times\left(\boldsymbol{v'}\times\boldsymbol{\overline{B}}\right)\right] $ & 2018 & induct\_work\_ppm \\[10pt] - $\left[\left(\boldsymbol{v}\times\boldsymbol{B}-\eta\boldsymbol{\mathcal{J}}\right)\times\boldsymbol{B}\right]_\theta$ & 2002 & ecrossb\_theta & $\boldsymbol{B'}\cdot\left[\boldsymbol{\nabla}\times\left(\boldsymbol{\overline{v}}\times\boldsymbol{B'}\right)\right] $ & 2019 & induct\_work\_pmp \\[10pt] - $\left[\left(\boldsymbol{v}\times\boldsymbol{B}-\eta\boldsymbol{\mathcal{J}}\right)\times\boldsymbol{B}\right]_\phi $ & 2003 & ecrossb\_phi & $\boldsymbol{\overline{B}}\cdot\left[\boldsymbol{\nabla}\times\left(\boldsymbol{v'}\times\boldsymbol{B'}\right)\right] $ & 2020 & induct\_work\_mpp \\[10pt] - $\left[\left(\boldsymbol{v'}\times\boldsymbol{B'}-\eta\boldsymbol{\mathcal{J'}}\right)\times\boldsymbol{B'}\right]_r $ & 2004 & ecrossb\_ppp\_r & $\boldsymbol{\overline{B}}\cdot\left[\boldsymbol{\nabla}\times\left(\boldsymbol{\overline{v}}\times\boldsymbol{\overline{B}}\right)\right] $ & 2021 & induct\_work\_mmm \\[10pt] - $\left[\left(\boldsymbol{v'}\times\boldsymbol{B'}-\eta\boldsymbol{\mathcal{J'}}\right)\times\boldsymbol{B'}\right]_\theta $ & 2005 & ecrossb\_ppp\_theta & $\boldsymbol{B}\cdot\left[\boldsymbol{B}\cdot\boldsymbol{\nabla}\boldsymbol{v}\right] $ & 2022 & ishear\_work \\[10pt] - $\left[\left(\boldsymbol{v'}\times\boldsymbol{B'}-\eta\boldsymbol{\mathcal{J'}}\right)\times\boldsymbol{B'}\right]_\phi$ & 2006 & ecrossb\_ppp\_phi & $-\boldsymbol{B}\cdot\left[\boldsymbol{v}\cdot\boldsymbol{\nabla}\boldsymbol{B}\right] $ & 2023 & iadvec\_work \\[10pt] - $\left[\left(\boldsymbol{\overline{v}}\times\boldsymbol{\overline{B}}-\eta\boldsymbol{\mathcal{\overline{J}}}\right)\times\boldsymbol{\overline{B}}\right]_r $ & 2007 & ecrossb\_mmm\_r & $-\boldsymbol{B}\cdot\left(\boldsymbol{\nabla}\cdot\boldsymbol{v} \right)\boldsymbol{B}$ & 2024 & icomp\_work \\[10pt] - $\left[\left(\boldsymbol{\overline{v}}\times\boldsymbol{\overline{B}}-\eta\boldsymbol{\mathcal{\overline{J}}}\right)\times\boldsymbol{\overline{B}}\right]_\theta $ & 2008 & ecrossb\_mmm\_theta & $\boldsymbol{B'}\cdot\left[\boldsymbol{\overline{B}}\cdot\boldsymbol{\nabla}\boldsymbol{v'}\right] $ & 2025 & ishear\_work\_pmp \\[10pt] - $\left[\left(\boldsymbol{\overline{v}}\times\boldsymbol{\overline{B}}-\eta\boldsymbol{\mathcal{\overline{J}}}\right)\times\boldsymbol{\overline{B}}\right]_\phi $ & 2009 & ecrossb\_mmm\_phi & $-\boldsymbol{B'}\cdot\left[\boldsymbol{\overline{v}}\cdot\boldsymbol{\nabla}\boldsymbol{B'}\right] $ & 2026 & iadvec\_work\_pmp \\[10pt] - $\left[\left(\boldsymbol{v'}\times\boldsymbol{B'}\right)\times\boldsymbol{\overline{B}}\right]_r $ & 2010 & ecrossb\_ppm\_r & $-\boldsymbol{B'}\cdot\left(\boldsymbol{\nabla}\cdot\boldsymbol{\overline{v}} \right)\boldsymbol{B'} $ & 2027 & icomp\_work\_pmp \\[10pt] - $\left[\left(\boldsymbol{v'}\times\boldsymbol{B'}\right)\times\boldsymbol{\overline{B}}\right]_\theta $ & 2011 & ecrossb\_ppm\_theta & $\boldsymbol{B'}\cdot\left[\boldsymbol{B'}\cdot\boldsymbol{\nabla}\boldsymbol{\overline{v}}\right] $ & 2025 & ishear\_work\_ppm \\[10pt] - $\left[\left(\boldsymbol{v'}\times\boldsymbol{B'}\right)\times\boldsymbol{\overline{B}}\right]_\phi $ & 2012 & ecrossb\_ppm\_phi & $-\boldsymbol{B'}\cdot\left[\boldsymbol{v'}\cdot\boldsymbol{\nabla}\boldsymbol{\overline{B}}\right] $ & 2026 & iadvec\_work\_ppm \\[10pt] - $\left[\left(\boldsymbol{v'}\times\boldsymbol{\overline{B}}\right)\times\boldsymbol{B'}\right]_r $ & 2013 & ecrossb\_pmp\_r & $-\boldsymbol{B'}\cdot\left(\boldsymbol{\nabla}\cdot\boldsymbol{v'} \right)\boldsymbol{\overline{B}} $ & 2027 & icomp\_work\_ppm \\[10pt] - $\left[\left(\boldsymbol{v'}\times\boldsymbol{\overline{B}}\right)\times\boldsymbol{B'}\right]_\theta $ & 2014 & ecrossb\_pmp\_theta & $\boldsymbol{\overline{B}}\cdot\left[\boldsymbol{\overline{B}}\cdot\boldsymbol{\nabla}\,\boldsymbol{\overline{v}}\right] $ & 2028 & ishear\_work\_mmm \\[10pt] - $\left[\left(\boldsymbol{v'}\times\boldsymbol{\overline{B}}\right)\times\boldsymbol{B'}\right]_\phi $ & 2015 & ecrossb\_pmp\_phi & $-\boldsymbol{\overline{B}}\cdot\left[\boldsymbol{\overline{v}}\cdot\boldsymbol{\nabla}\boldsymbol{\overline{B}}\right] $ & 2029 & iadvec\_work\_mmm \\[10pt] - $\left[\left(\boldsymbol{\overline{v}}\times\boldsymbol{B'}\right)\times\boldsymbol{B'}\right]_r $ & 2013 & ecrossb\_mpp\_r & $-\boldsymbol{\overline{B}}\cdot\left(\boldsymbol{\nabla}\cdot\boldsymbol{\overline{v}} \right)\boldsymbol{\overline{B}} $ & 2030 & icomp\_work\_mmm \\[10pt] - $\left[\left(\boldsymbol{\overline{v}}\times\boldsymbol{B'}\right)\times\boldsymbol{B'}\right]_\theta $ & 2014 & ecrossb\_mpp\_theta & $\boldsymbol{\overline{B}}\cdot\left[\boldsymbol{B'}\cdot\boldsymbol{\nabla}\boldsymbol{v'}\right] $ & 2031 & ishear\_work\_mpp \\[10pt] - $\left[\left(\boldsymbol{\overline{v}}\times\boldsymbol{B'}\right)\times\boldsymbol{B'}\right]_\phi $ & 2015 & ecrossb\_mpp\_phi & $-\boldsymbol{\overline{B}}\cdot\left[\boldsymbol{v'}\cdot\boldsymbol{\nabla}\boldsymbol{B'}\right] $ & 2032 & iadvec\_work\_mpp \\[10pt] - $\boldsymbol{B}\cdot\left[\boldsymbol{\nabla}\times\left(\boldsymbol{v}\times\boldsymbol{B}\right)\right] $ & 2016 & induct\_work & $-\boldsymbol{\overline{B}}\cdot\left(\boldsymbol{\nabla}\cdot\boldsymbol{v'} \right)\boldsymbol{B'} $ & 2033 & icomp\_work\_mpp \\[10pt] - $\boldsymbol{B'}\cdot\left[\boldsymbol{\nabla}\times\left(\boldsymbol{v'}\times\boldsymbol{B'}\right)\right] $ & 2017 & induct\_work\_ppp & $\boldsymbol{B'}\cdot\left[\boldsymbol{B'}\cdot\boldsymbol{\nabla}\boldsymbol{v'}\right] $ & 2034 & ishear\_work\_ppp \\[10pt] + $\left[\left(\boldsymbol{v}\times\boldsymbol{B}-\eta\boldsymbol{\mathcal{J}}\right)\times\boldsymbol{B}\right]_r$ & 2001 & ecrossb\_r & $\boldsymbol{B'}\cdot\left[\boldsymbol{\nabla}\times\left(\boldsymbol{v'}\times\boldsymbol{\overline{B}}\right)\right] $ & 2021 & induct\_work\_ppm \\[10pt] + $\left[\left(\boldsymbol{v}\times\boldsymbol{B}-\eta\boldsymbol{\mathcal{J}}\right)\times\boldsymbol{B}\right]_\theta$ & 2002 & ecrossb\_theta & $\boldsymbol{B'}\cdot\left[\boldsymbol{\nabla}\times\left(\boldsymbol{\overline{v}}\times\boldsymbol{B'}\right)\right] $ & 2022 & induct\_work\_pmp \\[10pt] + $\left[\left(\boldsymbol{v}\times\boldsymbol{B}-\eta\boldsymbol{\mathcal{J}}\right)\times\boldsymbol{B}\right]_\phi $ & 2003 & ecrossb\_phi & $\boldsymbol{\overline{B}}\cdot\left[\boldsymbol{\nabla}\times\left(\boldsymbol{v'}\times\boldsymbol{B'}\right)\right] $ & 2023 & induct\_work\_mpp \\[10pt] + $\left[\left(\boldsymbol{v'}\times\boldsymbol{B'}-\eta\boldsymbol{\mathcal{J'}}\right)\times\boldsymbol{B'}\right]_r $ & 2004 & ecrossb\_ppp\_r & $\boldsymbol{\overline{B}}\cdot\left[\boldsymbol{\nabla}\times\left(\boldsymbol{\overline{v}}\times\boldsymbol{\overline{B}}\right)\right] $ & 2024 & induct\_work\_mmm \\[10pt] + $\left[\left(\boldsymbol{v'}\times\boldsymbol{B'}-\eta\boldsymbol{\mathcal{J'}}\right)\times\boldsymbol{B'}\right]_\theta $ & 2005 & ecrossb\_ppp\_theta & $\boldsymbol{B}\cdot\left[\boldsymbol{B}\cdot\boldsymbol{\nabla}\boldsymbol{v}\right] $ & 2025 & ishear\_work \\[10pt] + $\left[\left(\boldsymbol{v'}\times\boldsymbol{B'}-\eta\boldsymbol{\mathcal{J'}}\right)\times\boldsymbol{B'}\right]_\phi$ & 2006 & ecrossb\_ppp\_phi & $-\boldsymbol{B}\cdot\left[\boldsymbol{v}\cdot\boldsymbol{\nabla}\boldsymbol{B}\right] $ & 2026 & iadvec\_work \\[10pt] + $\left[\left(\boldsymbol{\overline{v}}\times\boldsymbol{\overline{B}}-\eta\boldsymbol{\mathcal{\overline{J}}}\right)\times\boldsymbol{\overline{B}}\right]_r $ & 2007 & ecrossb\_mmm\_r & $-\boldsymbol{B}\cdot\left(\boldsymbol{\nabla}\cdot\boldsymbol{v} \right)\boldsymbol{B}$ & 2027 & icomp\_work \\[10pt] + $\left[\left(\boldsymbol{\overline{v}}\times\boldsymbol{\overline{B}}-\eta\boldsymbol{\mathcal{\overline{J}}}\right)\times\boldsymbol{\overline{B}}\right]_\theta $ & 2008 & ecrossb\_mmm\_theta & $\boldsymbol{B'}\cdot\left[\boldsymbol{\overline{B}}\cdot\boldsymbol{\nabla}\boldsymbol{v'}\right] $ & 2028 & ishear\_work\_pmp \\[10pt] + $\left[\left(\boldsymbol{\overline{v}}\times\boldsymbol{\overline{B}}-\eta\boldsymbol{\mathcal{\overline{J}}}\right)\times\boldsymbol{\overline{B}}\right]_\phi $ & 2009 & ecrossb\_mmm\_phi & $-\boldsymbol{B'}\cdot\left[\boldsymbol{\overline{v}}\cdot\boldsymbol{\nabla}\boldsymbol{B'}\right] $ & 2029 & iadvec\_work\_pmp \\[10pt] + $\left[\left(\boldsymbol{v'}\times\boldsymbol{B'}\right)\times\boldsymbol{\overline{B}}\right]_r $ & 2010 & ecrossb\_ppm\_r & $-\boldsymbol{B'}\cdot\left(\boldsymbol{\nabla}\cdot\boldsymbol{\overline{v}} \right)\boldsymbol{B'} $ & 2030 & icomp\_work\_pmp \\[10pt] + $\left[\left(\boldsymbol{v'}\times\boldsymbol{B'}\right)\times\boldsymbol{\overline{B}}\right]_\theta $ & 2011 & ecrossb\_ppm\_theta & $\boldsymbol{B'}\cdot\left[\boldsymbol{B'}\cdot\boldsymbol{\nabla}\boldsymbol{\overline{v}}\right] $ & 2031 & ishear\_work\_ppm \\[10pt] + $\left[\left(\boldsymbol{v'}\times\boldsymbol{B'}\right)\times\boldsymbol{\overline{B}}\right]_\phi $ & 2012 & ecrossb\_ppm\_phi & $-\boldsymbol{B'}\cdot\left[\boldsymbol{v'}\cdot\boldsymbol{\nabla}\boldsymbol{\overline{B}}\right] $ & 2032 & iadvec\_work\_ppm \\[10pt] + $\left[\left(\boldsymbol{v'}\times\boldsymbol{\overline{B}}\right)\times\boldsymbol{B'}\right]_r $ & 2013 & ecrossb\_pmp\_r & $-\boldsymbol{B'}\cdot\left(\boldsymbol{\nabla}\cdot\boldsymbol{v'} \right)\boldsymbol{\overline{B}} $ & 2033 & icomp\_work\_ppm \\[10pt] + $\left[\left(\boldsymbol{v'}\times\boldsymbol{\overline{B}}\right)\times\boldsymbol{B'}\right]_\theta $ & 2014 & ecrossb\_pmp\_theta & $\boldsymbol{\overline{B}}\cdot\left[\boldsymbol{\overline{B}}\cdot\boldsymbol{\nabla}\,\boldsymbol{\overline{v}}\right] $ & 2034 & ishear\_work\_mmm \\[10pt] + $\left[\left(\boldsymbol{v'}\times\boldsymbol{\overline{B}}\right)\times\boldsymbol{B'}\right]_\phi $ & 2015 & ecrossb\_pmp\_phi & $-\boldsymbol{\overline{B}}\cdot\left[\boldsymbol{\overline{v}}\cdot\boldsymbol{\nabla}\boldsymbol{\overline{B}}\right] $ & 2035 & iadvec\_work\_mmm \\[10pt] + $\left[\left(\boldsymbol{\overline{v}}\times\boldsymbol{B'}\right)\times\boldsymbol{B'}\right]_r $ & 2016 & ecrossb\_mpp\_r & $-\boldsymbol{\overline{B}}\cdot\left(\boldsymbol{\nabla}\cdot\boldsymbol{\overline{v}} \right)\boldsymbol{\overline{B}} $ & 2036 & icomp\_work\_mmm \\[10pt] + $\left[\left(\boldsymbol{\overline{v}}\times\boldsymbol{B'}\right)\times\boldsymbol{B'}\right]_\theta $ & 2017 & ecrossb\_mpp\_theta & $\boldsymbol{\overline{B}}\cdot\left[\boldsymbol{B'}\cdot\boldsymbol{\nabla}\boldsymbol{v'}\right] $ & 2037 & ishear\_work\_mpp \\[10pt] + $\left[\left(\boldsymbol{\overline{v}}\times\boldsymbol{B'}\right)\times\boldsymbol{B'}\right]_\phi $ & 2018 & ecrossb\_mpp\_phi & $-\boldsymbol{\overline{B}}\cdot\left[\boldsymbol{v'}\cdot\boldsymbol{\nabla}\boldsymbol{B'}\right] $ & 2038 & iadvec\_work\_mpp \\[10pt] + $\boldsymbol{B}\cdot\left[\boldsymbol{\nabla}\times\left(\boldsymbol{v}\times\boldsymbol{B}\right)\right] $ & 2019 & induct\_work & $-\boldsymbol{\overline{B}}\cdot\left(\boldsymbol{\nabla}\cdot\boldsymbol{v'} \right)\boldsymbol{B'} $ & 2039 & icomp\_work\_mpp \\[10pt] + $\boldsymbol{B'}\cdot\left[\boldsymbol{\nabla}\times\left(\boldsymbol{v'}\times\boldsymbol{B'}\right)\right] $ & 2020 & induct\_work\_ppp & $\boldsymbol{B'}\cdot\left[\boldsymbol{B'}\cdot\boldsymbol{\nabla}\boldsymbol{v'}\right] $ & 2040 & ishear\_work\_ppp \\[10pt] diff --git a/etc/diagnostic_codes/me_equation_table1.tex b/etc/diagnostic_codes/me_equation_table1.tex index 1bc6deca..655bfd3e 100644 --- a/etc/diagnostic_codes/me_equation_table1.tex +++ b/etc/diagnostic_codes/me_equation_table1.tex @@ -1,5 +1,5 @@ - $-\boldsymbol{B'}\cdot\left[\boldsymbol{v'}\cdot\boldsymbol{\nabla}\boldsymbol{B'}\right] $ & 2035 & iadvec\_work\_ppp \\[10pt] - $-\boldsymbol{B'}\cdot\left(\boldsymbol{\nabla}\cdot\boldsymbol{v'} \right)\boldsymbol{B'} $ & 2036 & icomp\_work\_ppp \\[10pt] - $-c_7\boldsymbol{B}\cdot\left[ \boldsymbol{\nabla}\times\left(\mathrm{f}_7\boldsymbol{\nabla}\times\boldsymbol{B}\right)\right] $ & 2037 & idiff\_work \\[10pt] - $-c_7\boldsymbol{B'}\cdot\left[ \boldsymbol{\nabla}\times\left(\mathrm{f}_7\boldsymbol{\nabla}\times\boldsymbol{B'}\right)\right] $ & 2038 & idiff\_work\_pp \\[10pt] - $-c_7\boldsymbol{\overline{B}}\cdot\left[ \boldsymbol{\nabla}\times\left(\mathrm{f}_7\boldsymbol{\nabla}\times\boldsymbol{\overline{B}}\right)\right] $ & 2039 & idiff\_work\_mm \\[10pt] + $-\boldsymbol{B'}\cdot\left[\boldsymbol{v'}\cdot\boldsymbol{\nabla}\boldsymbol{B'}\right] $ & 2041 & iadvec\_work\_ppp \\[10pt] + $-\boldsymbol{B'}\cdot\left(\boldsymbol{\nabla}\cdot\boldsymbol{v'} \right)\boldsymbol{B'} $ & 2042 & icomp\_work\_ppp \\[10pt] + $-c_7\boldsymbol{B}\cdot\left[ \boldsymbol{\nabla}\times\left(\mathrm{f}_7\boldsymbol{\nabla}\times\boldsymbol{B}\right)\right] $ & 2043 & idiff\_work \\[10pt] + $-c_7\boldsymbol{B'}\cdot\left[ \boldsymbol{\nabla}\times\left(\mathrm{f}_7\boldsymbol{\nabla}\times\boldsymbol{B'}\right)\right] $ & 2044 & idiff\_work\_pp \\[10pt] + $-c_7\boldsymbol{\overline{B}}\cdot\left[ \boldsymbol{\nabla}\times\left(\mathrm{f}_7\boldsymbol{\nabla}\times\boldsymbol{\overline{B}}\right)\right] $ & 2045 & idiff\_work\_mm \\[10pt] diff --git a/etc/diagnostic_codes/thermal_equation_table0.tex b/etc/diagnostic_codes/thermal_equation_table0.tex index 28e9a2b4..e210e1f2 100644 --- a/etc/diagnostic_codes/thermal_equation_table0.tex +++ b/etc/diagnostic_codes/thermal_equation_table0.tex @@ -10,11 +10,11 @@ $\mathrm{f}_1\mathrm{f}_4\overline{v_r}\frac{\partial \Theta'}{\partial r}$ & 1410 & rhotvmr\_grad\_sp & $c_6\frac{\mathrm{f}_1\mathrm{f}_4\mathrm{f}_5}{r^2\mathrm{sin^2}\theta}\frac{\partial^2 \Theta}{\partial \phi^2}$ & 1430 & s\_diff\_phi \\[10pt] $\mathrm{f}_1\mathrm{f}_4\frac{v_\theta}{r}\frac{\partial \Theta}{\partial \theta}$ & 1411 & rhotvt\_grad\_s & $c_6\frac{\mathrm{f}_1\mathrm{f}_4\mathrm{f}_5}{r^2\mathrm{sin^2}\theta}\frac{\partial^2 \Theta'}{\partial \phi^2}$ & 1431 & sp\_diff\_phi \\[10pt] $\mathrm{f}_1\mathrm{f}_4\frac{v_\theta'}{r}\frac{\partial \Theta'}{\partial \theta}$ & 1412 & rhotvpt\_grad\_sp & $c_6\frac{\mathrm{f}_1\mathrm{f}_4\mathrm{f}_5}{r^2\mathrm{sin^2}\theta}\frac{\partial^2 \overline{\Theta}}{\partial \phi^2}$ & 1432 & sm\_diff\_phi \\[10pt] - $\mathrm{f}_1\mathrm{f}_4\frac{v_\theta'}{r}\frac{\partial \overline{\Theta}}{\partial \theta}$ & 1413 & rhotvpt\_grad\_sm & $F_Q(r)$ & 1431 & vol\_heat\_flux \\[10pt] - $\mathrm{f}_1\mathrm{f}_4\frac{\overline{v_\theta}}{r}\frac{\partial \overline{\Theta}}{\partial \theta}$ & 1414 & rhotvmt\_grad\_sm & $\mathrm{f}_6(r)$ & 1432 & vol\_heating \\[10pt] - $\mathrm{f}_1\mathrm{f}_4\frac{\overline{v_\theta}}{r}\frac{\partial \Theta'}{\partial \theta}$ & 1415 & rhotvmt\_grad\_sp & $c_5\Phi(r,\theta,\phi)$ & 1433 & visc\_heating \\[10pt] - $\mathrm{f}_1\mathrm{f}_4\frac{v_\phi}{r \mathrm{sin}\theta}\frac{\partial \Theta}{\partial \phi}$ & 1416 & rhotvp\_grad\_s & $ \mathrm{f}_7c_4\left( {\boldsymbol{\mathcal{J}'}}\cdot{\boldsymbol{\mathcal{J}'}} \right)$ & 1434 & ohmic\_heat \\[10pt] - $\mathrm{f}_1\mathrm{f}_4\frac{v_\phi'}{r \mathrm{sin}\theta}\frac{\partial \Theta'}{\partial \phi}$ & 1417 & rhotvpp\_grad\_sp & $ \mathrm{f}_7c_4\left( {\boldsymbol{\mathcal{J}'}}\cdot{\boldsymbol{\mathcal{J}'}} \right)$ & 1435 & ohmic\_heat\_pp \\[10pt] - $\mathrm{f}_1\mathrm{f}_4\frac{v_\phi'}{r \mathrm{sin}\theta}\frac{\partial \overline{\Theta}}{\partial \phi}$ & 1418 & rhotvpp\_grad\_sm & $\mathrm{f}_7c_4\left( \overline{\boldsymbol{\mathcal{J}}}\cdot\overline{\boldsymbol{\mathcal{J}}} \right)$ & 1436 & ohmic\_heat\_pm \\[10pt] - $\mathrm{f}_1\mathrm{f}_4\frac{\overline{v_\phi}}{r \mathrm{sin}\theta}\frac{\partial \overline{\Theta}}{\partial \phi}$ & 1419 & rhotvmp\_grad\_sm & $\mathrm{f}_7c_4\left( \overline{\boldsymbol{\mathcal{J}}}\cdot{\boldsymbol{\mathcal{J}'}} \right)$ & 1437 & ohmic\_heat\_mm \\[10pt] - $\mathrm{f}_1\mathrm{f}_4\frac{\overline{v_\phi}}{r \mathrm{sin}\theta}\frac{\partial \Theta'}{\partial \phi}$ & 1420 & rhotvmp\_grad\_sp & $\mathrm{f}_1\mathrm{f}_4v_r\Theta$ & 1438 & rhot\_vr\_s \\[10pt] + $\mathrm{f}_1\mathrm{f}_4\frac{v_\theta'}{r}\frac{\partial \overline{\Theta}}{\partial \theta}$ & 1413 & rhotvpt\_grad\_sm & $F_Q(r)$ & 1433 & vol\_heat\_flux \\[10pt] + $\mathrm{f}_1\mathrm{f}_4\frac{\overline{v_\theta}}{r}\frac{\partial \overline{\Theta}}{\partial \theta}$ & 1414 & rhotvmt\_grad\_sm & $\mathrm{f}_6(r)$ & 1434 & vol\_heating \\[10pt] + $\mathrm{f}_1\mathrm{f}_4\frac{\overline{v_\theta}}{r}\frac{\partial \Theta'}{\partial \theta}$ & 1415 & rhotvmt\_grad\_sp & $c_5\Phi(r,\theta,\phi)$ & 1435 & visc\_heating \\[10pt] + $\mathrm{f}_1\mathrm{f}_4\frac{v_\phi}{r \mathrm{sin}\theta}\frac{\partial \Theta}{\partial \phi}$ & 1416 & rhotvp\_grad\_s & $ \mathrm{f}_7c_4\left( {\boldsymbol{\mathcal{J}'}}\cdot{\boldsymbol{\mathcal{J}'}} \right)$ & 1436 & ohmic\_heat \\[10pt] + $\mathrm{f}_1\mathrm{f}_4\frac{v_\phi'}{r \mathrm{sin}\theta}\frac{\partial \Theta'}{\partial \phi}$ & 1417 & rhotvpp\_grad\_sp & $ \mathrm{f}_7c_4\left( {\boldsymbol{\mathcal{J}'}}\cdot{\boldsymbol{\mathcal{J}'}} \right)$ & 1437 & ohmic\_heat\_pp \\[10pt] + $\mathrm{f}_1\mathrm{f}_4\frac{v_\phi'}{r \mathrm{sin}\theta}\frac{\partial \overline{\Theta}}{\partial \phi}$ & 1418 & rhotvpp\_grad\_sm & $\mathrm{f}_7c_4\left( \overline{\boldsymbol{\mathcal{J}}}\cdot\overline{\boldsymbol{\mathcal{J}}} \right)$ & 1438 & ohmic\_heat\_pm \\[10pt] + $\mathrm{f}_1\mathrm{f}_4\frac{\overline{v_\phi}}{r \mathrm{sin}\theta}\frac{\partial \overline{\Theta}}{\partial \phi}$ & 1419 & rhotvmp\_grad\_sm & $\mathrm{f}_7c_4\left( \overline{\boldsymbol{\mathcal{J}}}\cdot{\boldsymbol{\mathcal{J}'}} \right)$ & 1439 & ohmic\_heat\_mm \\[10pt] + $\mathrm{f}_1\mathrm{f}_4\frac{\overline{v_\phi}}{r \mathrm{sin}\theta}\frac{\partial \Theta'}{\partial \phi}$ & 1420 & rhotvmp\_grad\_sp & $\mathrm{f}_1\mathrm{f}_4v_r\Theta$ & 1440 & rhot\_vr\_s \\[10pt] diff --git a/etc/diagnostic_codes/thermal_equation_table1.tex b/etc/diagnostic_codes/thermal_equation_table1.tex index 6a811fb9..d551a3d9 100644 --- a/etc/diagnostic_codes/thermal_equation_table1.tex +++ b/etc/diagnostic_codes/thermal_equation_table1.tex @@ -1,20 +1,20 @@ - $\mathrm{f}_1\mathrm{f}_4v_r'\Theta'$ & 1439 & rhot\_vrp\_sp & $c_P \mathrm{f}_1 v_r'\, \overline{T}$ & 1459 & enth\_flux\_rpm \\[10pt] - $\mathrm{f}_1\mathrm{f}_4v_r'\overline{\Theta}$ & 1440 & rhot\_vrp\_sm & $c_P \mathrm{f}_1 v_\theta'\, \overline{T}$ & 1460 & enth\_flux\_thetapm \\[10pt] - $\mathrm{f}_1\mathrm{f}_4\,\overline{v_r}\Theta'$ & 1441 & rhot\_vrm\_sp & $c_P \mathrm{f}_1 v_\phi'\, \overline{T}$ & 1461 & enth\_flux\_phipm \\[10pt] - $\mathrm{f}_1\mathrm{f}_4\,\overline{v_r}\,\overline{\Theta}$ & 1442 & rhot\_vrm\_sm & $c_P \mathrm{f}_1\, \overline{v_r}\, T'$ & 1462 & enth\_flux\_rmp \\[10pt] - $\mathrm{f}_1\mathrm{f}_4v_\theta \Theta$ & 1443 & rhot\_vt\_s & $c_P \mathrm{f}_1\, \overline{v_\theta}\, T'$ & 1463 & enth\_flux\_thetamp \\[10pt] - $\mathrm{f}_1\mathrm{f}_4v_\theta'\Theta'$ & 1444 & rhot\_vtp\_sp & $c_P \mathrm{f}_1\, \overline{v_\phi}\, T'$ & 1464 & enth\_flux\_phimp \\[10pt] - $\mathrm{f}_1\mathrm{f}_4v_\theta'\overline{\Theta}$ & 1445 & rhot\_vtp\_sm & $c_P \mathrm{f}_1\, \overline{v_r}\, \overline{T}$ & 1465 & enth\_flux\_rmm \\[10pt] - $\mathrm{f}_1\mathrm{f}_4\,\overline{v_\theta}\Theta'$ & 1446 & rhot\_vtm\_sp & $c_P \mathrm{f}_1\, \overline{v_\theta}\, \overline{T}$ & 1466 & enth\_flux\_thetamm \\[10pt] - $\mathrm{f}_1\mathrm{f}_4\,\overline{v_\theta}\,\overline{\Theta}$ & 1447 & rhot\_vtm\_sm & $c_P \mathrm{f}_1\, \overline{v_\phi}\, \overline{T}$ & 1467 & enth\_flux\_phimm \\[10pt] - $\mathrm{f}_1\mathrm{f}_4v_\phi \Theta$ & 1448 & rhot\_vp\_s & $-c_6\mathrm{f}_1\mathrm{f}_4\mathrm{f}_5\frac{\partial \Theta}{\partial r}$ & 1468 & cond\_flux\_r \\[10pt] - $\mathrm{f}_1\mathrm{f}_4v_\phi'\Theta'$ & 1449 & rhot\_vpp\_sp & $-c_6\mathrm{f}_1\mathrm{f}_4\mathrm{f}_5\frac{1}{r}\frac{\partial \Theta}{\partial \theta}$ & 1469 & cond\_flux\_theta \\[10pt] - $\mathrm{f}_1\mathrm{f}_4v_\phi'\overline{\Theta}$ & 1450 & rhot\_vpp\_sm & $-c_6\mathrm{f}_1\mathrm{f}_4\mathrm{f}_5\frac{1}{r \mathrm{sin}\theta}\frac{\partial \Theta}{\partial \phi}$ & 1470 & cond\_flux\_phi \\[10pt] - $\mathrm{f}_1\mathrm{f}_4\,\overline{v_\phi}\Theta'$ & 1451 & rhot\_vpm\_sp & $-c_6\mathrm{f}_1\mathrm{f}_4\mathrm{f}_5\frac{\partial \Theta'}{\partial r}$ & 1471 & cond\_fluxp\_r \\[10pt] - $\mathrm{f}_1\mathrm{f}_4\,\overline{v_\phi}\,\overline{\Theta}$ & 1452 & rhot\_vpm\_sm & $-c_6\mathrm{f}_1\mathrm{f}_4\mathrm{f}_5\frac{1}{r}\frac{\partial \Theta'}{\partial \theta}$ & 1472 & cond\_fluxp\_theta \\[10pt] - $c_P \mathrm{f}_1 v_r T$ & 1453 & enth\_flux\_r & $-c_6\mathrm{f}_1\mathrm{f}_4\mathrm{f}_5\frac{1}{r \mathrm{sin}\theta}\frac{\partial \Theta'}{\partial \phi}$ & 1473 & cond\_fluxp\_phi \\[10pt] - $c_P \mathrm{f}_1 v_\theta T$ & 1454 & enth\_flux\_theta & $-c_6\mathrm{f}_1\mathrm{f}_4\mathrm{f}_5\frac{\partial \overline{\Theta}}{\partial r}$ & 1474 & cond\_fluxm\_r \\[10pt] - $c_P \mathrm{f}_1 v_\phi T$ & 1455 & enth\_flux\_phi & $-c_6\mathrm{f}_1\mathrm{f}_4\mathrm{f}_5\frac{1}{r}\frac{\partial \overline{\Theta}}{\partial \theta}$ & 1475 & cond\_fluxm\_theta \\[10pt] - $c_P \mathrm{f}_1 v_r' T'$ & 1456 & enth\_flux\_rpp & $-c_6\mathrm{f}_1\mathrm{f}_4\mathrm{f}_5\frac{1}{r \mathrm{sin}\theta}\frac{\partial \overline{\Theta}}{\partial \phi}$ & 1476 & cond\_fluxm\_phi \\[10pt] - $c_P \mathrm{f}_1 v_\theta' T'$ & 1457 & enth\_flux\_thetapp \\[10pt] - $c_P \mathrm{f}_1 v_\phi' T'$ & 1458 & enth\_flux\_phipp \\[10pt] + $\mathrm{f}_1\mathrm{f}_4v_r'\Theta'$ & 1441 & rhot\_vrp\_sp & $c_P \mathrm{f}_1 v_r'\, \overline{T}$ & 1461 & enth\_flux\_rpm \\[10pt] + $\mathrm{f}_1\mathrm{f}_4v_r'\overline{\Theta}$ & 1442 & rhot\_vrp\_sm & $c_P \mathrm{f}_1 v_\theta'\, \overline{T}$ & 1462 & enth\_flux\_thetapm \\[10pt] + $\mathrm{f}_1\mathrm{f}_4\,\overline{v_r}\Theta'$ & 1443 & rhot\_vrm\_sp & $c_P \mathrm{f}_1 v_\phi'\, \overline{T}$ & 1463 & enth\_flux\_phipm \\[10pt] + $\mathrm{f}_1\mathrm{f}_4\,\overline{v_r}\,\overline{\Theta}$ & 1444 & rhot\_vrm\_sm & $c_P \mathrm{f}_1\, \overline{v_r}\, T'$ & 1464 & enth\_flux\_rmp \\[10pt] + $\mathrm{f}_1\mathrm{f}_4v_\theta \Theta$ & 1445 & rhot\_vt\_s & $c_P \mathrm{f}_1\, \overline{v_\theta}\, T'$ & 1465 & enth\_flux\_thetamp \\[10pt] + $\mathrm{f}_1\mathrm{f}_4v_\theta'\Theta'$ & 1446 & rhot\_vtp\_sp & $c_P \mathrm{f}_1\, \overline{v_\phi}\, T'$ & 1466 & enth\_flux\_phimp \\[10pt] + $\mathrm{f}_1\mathrm{f}_4v_\theta'\overline{\Theta}$ & 1447 & rhot\_vtp\_sm & $c_P \mathrm{f}_1\, \overline{v_r}\, \overline{T}$ & 1467 & enth\_flux\_rmm \\[10pt] + $\mathrm{f}_1\mathrm{f}_4\,\overline{v_\theta}\Theta'$ & 1448 & rhot\_vtm\_sp & $c_P \mathrm{f}_1\, \overline{v_\theta}\, \overline{T}$ & 1468 & enth\_flux\_thetamm \\[10pt] + $\mathrm{f}_1\mathrm{f}_4\,\overline{v_\theta}\,\overline{\Theta}$ & 1449 & rhot\_vtm\_sm & $c_P \mathrm{f}_1\, \overline{v_\phi}\, \overline{T}$ & 1469 & enth\_flux\_phimm \\[10pt] + $\mathrm{f}_1\mathrm{f}_4v_\phi \Theta$ & 1450 & rhot\_vp\_s & $-c_6\mathrm{f}_1\mathrm{f}_4\mathrm{f}_5\frac{\partial \Theta}{\partial r}$ & 1470 & cond\_flux\_r \\[10pt] + $\mathrm{f}_1\mathrm{f}_4v_\phi'\Theta'$ & 1451 & rhot\_vpp\_sp & $-c_6\mathrm{f}_1\mathrm{f}_4\mathrm{f}_5\frac{1}{r}\frac{\partial \Theta}{\partial \theta}$ & 1471 & cond\_flux\_theta \\[10pt] + $\mathrm{f}_1\mathrm{f}_4v_\phi'\overline{\Theta}$ & 1452 & rhot\_vpp\_sm & $-c_6\mathrm{f}_1\mathrm{f}_4\mathrm{f}_5\frac{1}{r \mathrm{sin}\theta}\frac{\partial \Theta}{\partial \phi}$ & 1472 & cond\_flux\_phi \\[10pt] + $\mathrm{f}_1\mathrm{f}_4\,\overline{v_\phi}\Theta'$ & 1453 & rhot\_vpm\_sp & $-c_6\mathrm{f}_1\mathrm{f}_4\mathrm{f}_5\frac{\partial \Theta'}{\partial r}$ & 1473 & cond\_fluxp\_r \\[10pt] + $\mathrm{f}_1\mathrm{f}_4\,\overline{v_\phi}\,\overline{\Theta}$ & 1454 & rhot\_vpm\_sm & $-c_6\mathrm{f}_1\mathrm{f}_4\mathrm{f}_5\frac{1}{r}\frac{\partial \Theta'}{\partial \theta}$ & 1474 & cond\_fluxp\_theta \\[10pt] + $c_P \mathrm{f}_1 v_r T$ & 1455 & enth\_flux\_r & $-c_6\mathrm{f}_1\mathrm{f}_4\mathrm{f}_5\frac{1}{r \mathrm{sin}\theta}\frac{\partial \Theta'}{\partial \phi}$ & 1475 & cond\_fluxp\_phi \\[10pt] + $c_P \mathrm{f}_1 v_\theta T$ & 1456 & enth\_flux\_theta & $-c_6\mathrm{f}_1\mathrm{f}_4\mathrm{f}_5\frac{\partial \overline{\Theta}}{\partial r}$ & 1476 & cond\_fluxm\_r \\[10pt] + $c_P \mathrm{f}_1 v_\phi T$ & 1457 & enth\_flux\_phi & $-c_6\mathrm{f}_1\mathrm{f}_4\mathrm{f}_5\frac{1}{r}\frac{\partial \overline{\Theta}}{\partial \theta}$ & 1477 & cond\_fluxm\_theta \\[10pt] + $c_P \mathrm{f}_1 v_r' T'$ & 1458 & enth\_flux\_rpp & $-c_6\mathrm{f}_1\mathrm{f}_4\mathrm{f}_5\frac{1}{r \mathrm{sin}\theta}\frac{\partial \overline{\Theta}}{\partial \phi}$ & 1478 & cond\_fluxm\_phi \\[10pt] + $c_P \mathrm{f}_1 v_\theta' T'$ & 1459 & enth\_flux\_thetapp \\[10pt] + $c_P \mathrm{f}_1 v_\phi' T'$ & 1460 & enth\_flux\_phipp \\[10pt] diff --git a/src/Diagnostics/BACKUP_Diagnostics_Base.F90 b/src/Diagnostics/BACKUP_Diagnostics_Base.F90 deleted file mode 100644 index d130152a..00000000 --- a/src/Diagnostics/BACKUP_Diagnostics_Base.F90 +++ /dev/null @@ -1,955 +0,0 @@ -#define DO_PSI Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max ;Do k = 1, n_phi -#define DO_PSI2 Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max -#define END_DO2 enddo; enddo -#define END_DO enddo; enddo; enddo -#define PSI k,r,t -#define PSI2 r,t -Module Diagnostics_Base - !////////////////////////////////////////////////////////// - ! This module holds common variables that may be accessed - ! by any diagnostics routine. These variables are primarily - ! temporary, allocatable arrays and the output menu codes. - Use ProblemSize - Use Spherical_IO - Use Fields - Use Math_Constants - Use ReferenceState - Use TransportCoefficients - - Implicit None - - !///////////////////////////////////////////////////////// - ! Diagnostic Quantity Codes - ! Reynolds decompositions are often used in the outputs. - ! As a result, some shorthand is used as follows: - ! "m" and "< >" denote the azimuthal OR spherical mean. - ! "p" and " ' " denote perturbations about that mean - - !//////////////////////////////////////////////////////// - ! Velocity field components and it's derivatives - - Integer, Parameter :: voffset = 0 - - !------------ Field Components ----------! - ! Full - Integer, Parameter :: v_r = voffset+1 ! :tex: $v_r$ - Integer, Parameter :: v_theta = voffset+2 ! :tex: $v_\theta$ - Integer, Parameter :: v_phi = voffset+3 ! :tex: $v_\phi$ - - ! Fluctuating - Integer, Parameter :: vp_r = voffset+4 - Integer, Parameter :: vp_theta = voffset+5 - Integer, Parameter :: vp_phi = voffset+6 - - ! Mean - Integer, Parameter :: vm_r = voffset+7 - Integer, Parameter :: vm_theta = voffset+8 - Integer, Parameter :: vm_phi = voffset+9 - - !------------ Radial Derivatives -------------! - ! Full - Integer, Parameter :: dv_r_dr = voffset+10 ! :tex: $\frac{\partial v_r}{\partial r}$ - Integer, Parameter :: dv_theta_dr = voffset+11 ! :tex: $\frac{\partial v_\theta}{\partial r}$ - Integer, Parameter :: dv_phi_dr = voffset+12 ! :tex: $\frac{\partial v_\phi}{\partial r}$ - - Integer, Parameter :: dvp_r_dr = voffset+13 ! Fluctuating - Integer, Parameter :: dvp_theta_dr = voffset+14 - Integer, Parameter :: dvp_phi_dr = voffset+15 - - Integer, Parameter :: dvm_r_dr = voffset+16 ! Mean - Integer, Parameter :: dvm_theta_dr = voffset+17 - Integer, Parameter :: dvm_phi_dr = voffset+18 - - !------------ Theta Derivatives --------------! - Integer, Parameter :: dv_r_dt = voffset+19 ! Full - Integer, Parameter :: dv_theta_dt = voffset+20 - Integer, Parameter :: dv_phi_dt = voffset+21 - - Integer, Parameter :: dvp_r_dt = voffset+22 ! Fluctuating - Integer, Parameter :: dvp_theta_dt = voffset+23 - Integer, Parameter :: dvp_phi_dt = voffset+24 - - Integer, Parameter :: dvm_r_dt = voffset+25 ! Mean - Integer, Parameter :: dvm_theta_dt = voffset+26 - Integer, Parameter :: dvm_phi_dt = voffset+27 - - !------------ Phi Derivatives ----------------! - Integer, Parameter :: dv_r_dp = voffset+28 ! Full - Integer, Parameter :: dv_theta_dp = voffset+29 - Integer, Parameter :: dv_phi_dp = voffset+30 - - Integer, Parameter :: dvp_r_dp = voffset+31 ! Fluctuating - Integer, Parameter :: dvp_theta_dp = voffset+32 ! (same as full if - Integer, Parameter :: dvp_phi_dp = voffset+33 ! mean is azimuthal) - - Integer, Parameter :: dvm_r_dp = voffset+34 ! We keep the phi derivatives of the mean - Integer, Parameter :: dvm_theta_dp = voffset+35 ! here, even though they are zero. - Integer, Parameter :: dvm_phi_dp = voffset+36 ! Somewhat useful placeholders... - - !------------ (1/r) * Theta Derivatives -------! - Integer, Parameter :: dv_r_dtr = voffset+37 ! Full - Integer, Parameter :: dv_theta_dtr = voffset+38 - Integer, Parameter :: dv_phi_dtr = voffset+39 - - Integer, Parameter :: dvp_r_dtr = voffset+40 ! Fluctuating - Integer, Parameter :: dvp_theta_dtr = voffset+41 - Integer, Parameter :: dvp_phi_dtr = voffset+42 - - Integer, Parameter :: dvm_r_dtr = voffset+43 ! Mean - Integer, Parameter :: dvm_theta_dtr = voffset+44 - Integer, Parameter :: dvm_phi_dtr = voffset+45 - - - !------(1/{r sintheta})* Phi Derivatives ---! - - Integer, Parameter :: dv_r_dprs = voffset+46 ! Full - Integer, Parameter :: dv_theta_dprs = voffset+47 - Integer, Parameter :: dv_phi_dprs = voffset+48 - - Integer, Parameter :: dvp_r_dprs = voffset+49 ! Fluctuating - Integer, Parameter :: dvp_theta_dprs = voffset+50 - Integer, Parameter :: dvp_phi_dprs = voffset+51 - - Integer, Parameter :: dvm_r_dprs = voffset+52 ! Mean - Integer, Parameter :: dvm_theta_dprs = voffset+53 - Integer, Parameter :: dvm_phi_dprs = voffset+54 - - - !--------- Radial Second Derivatives -------- - Integer, Parameter :: dv_r_d2r = voffset+55 ! Full - Integer, Parameter :: dv_theta_d2r = voffset+56 - Integer, Parameter :: dv_phi_d2r = voffset+57 - - Integer, Parameter :: dvp_r_d2r = voffset+58 ! Fluctuating - Integer, Parameter :: dvp_theta_d2r = voffset+59 - Integer, Parameter :: dvp_phi_d2r = voffset+60 - - Integer, Parameter :: dvm_r_d2r = voffset+61 ! Mean - Integer, Parameter :: dvm_theta_d2r = voffset+62 - Integer, Parameter :: dvm_phi_d2r = voffset+63 - - !--------- Theta Second Derivatives -------- - Integer, Parameter :: dv_r_d2t = voffset+64 ! Full - Integer, Parameter :: dv_theta_d2t = voffset+65 - Integer, Parameter :: dv_phi_d2t = voffset+66 - - Integer, Parameter :: dvp_r_d2t = voffset+67 ! Fluctuating - Integer, Parameter :: dvp_theta_d2t = voffset+68 - Integer, Parameter :: dvp_phi_d2t = voffset+69 - - Integer, Parameter :: dvm_r_d2t = voffset+70 ! Mean - Integer, Parameter :: dvm_theta_d2t = voffset+71 - Integer, Parameter :: dvm_phi_d2t = voffset+72 - - !--------- Phi Second Derivatives -------- - Integer, Parameter :: dv_r_d2p = voffset+73 ! Full - Integer, Parameter :: dv_theta_d2p = voffset+74 - Integer, Parameter :: dv_phi_d2p = voffset+75 - - Integer, Parameter :: dvp_r_d2p = voffset+76 ! Fluctuating - Integer, Parameter :: dvp_theta_d2p = voffset+77 - Integer, Parameter :: dvp_phi_d2p = voffset+78 - - Integer, Parameter :: dvm_r_d2p = voffset+79 ! Mean - Integer, Parameter :: dvm_theta_d2p = voffset+80 - Integer, Parameter :: dvm_phi_d2p = voffset+81 - - !--------- Radial-Theta Second Derivatives -------- - Integer, Parameter :: dv_r_d2rt = voffset+82 ! Full - Integer, Parameter :: dv_theta_d2rt = voffset+83 - Integer, Parameter :: dv_phi_d2rt = voffset+84 - - Integer, Parameter :: dvp_r_d2rt = voffset+85 ! Fluctuating - Integer, Parameter :: dvp_theta_d2rt = voffset+86 - Integer, Parameter :: dvp_phi_d2rt = voffset+87 - - Integer, Parameter :: dvm_r_d2rt = voffset+88 ! Mean - Integer, Parameter :: dvm_theta_d2rt = voffset+89 - Integer, Parameter :: dvm_phi_d2rt = voffset+90 - - !--------- Radial-phi Second Derivatives -------- - Integer, Parameter :: dv_r_d2rp = voffset+91 ! Full - Integer, Parameter :: dv_theta_d2rp = voffset+92 - Integer, Parameter :: dv_phi_d2rp = voffset+93 - - Integer, Parameter :: dvp_r_d2rp = voffset+94 ! Fluctuating - Integer, Parameter :: dvp_theta_d2rp = voffset+95 - Integer, Parameter :: dvp_phi_d2rp = voffset+96 - - Integer, Parameter :: dvm_r_d2rp = voffset+97 ! Mean - Integer, Parameter :: dvm_theta_d2rp = voffset+98 - Integer, Parameter :: dvm_phi_d2rp = voffset+99 - - !--------- theta-phi Second Derivatives -------- - Integer, Parameter :: dv_r_d2tp = voffset+100 ! Full - Integer, Parameter :: dv_theta_d2tp = voffset+101 - Integer, Parameter :: dv_phi_d2tp = voffset+102 - - Integer, Parameter :: dvp_r_d2tp = voffset+103 ! Fluctuating - Integer, Parameter :: dvp_theta_d2tp = voffset+104 - Integer, Parameter :: dvp_phi_d2tp = voffset+105 - - Integer, Parameter :: dvm_r_d2tp = voffset+106 ! Mean - Integer, Parameter :: dvm_theta_d2tp = voffset+107 - Integer, Parameter :: dvm_phi_d2tp = voffset+108 - - !------------ Mass Flux ---------------------! - Integer, Parameter :: rhov_r = voffset+109 ! Full - Integer, Parameter :: rhov_theta = voffset+110 - Integer, Parameter :: rhov_phi = voffset+111 - - Integer, Parameter :: rhovp_r = voffset+112 ! Fluctuating - Integer, Parameter :: rhovp_theta = voffset+113 - Integer, Parameter :: rhovp_phi = voffset+114 - - Integer, Parameter :: rhovm_r = voffset+115 ! Mean - Integer, Parameter :: rhovm_theta = voffset+116 - Integer, Parameter :: rhovm_phi = voffset+117 - - - !////////////////////////////////////////////////////////////////// - ! Pressure, Entropy or Temperature, and Their Derivatives - ! Note: In Boussinesq Mode, Temperature is Output Instead of Entropy - Integer, Parameter :: pt_off = voffset+117 ! = 117 - - !------------ Fields ---------------------! - Integer, Parameter :: entropy = pt_off+1 ! Full - Integer, Parameter :: pressure = pt_off+2 - - Integer, Parameter :: entropy_p = pt_off+3 ! Fluctuating - Integer, Parameter :: pressure_p = pt_off+4 - - Integer, Parameter :: entropy_m = pt_off+5 ! Mean - Integer, Parameter :: pressure_m = pt_off+6 - - !------------ Radial Derivatives --------------! - Integer, Parameter :: entropy_dr = pt_off+7 ! Full - Integer, Parameter :: pressure_dr = pt_off+8 - - Integer, Parameter :: entropy_p_dr = pt_off+9 ! Fluctuating - Integer, Parameter :: pressure_p_dr = pt_off+10 - - Integer, Parameter :: entropy_m_dr = pt_off+11 ! Mean - Integer, Parameter :: pressure_m_dr = pt_off+12 - - !------------ Theta Derivatives ---------------! - Integer, Parameter :: entropy_dtheta = pt_off+13 ! Full - Integer, Parameter :: pressure_dtheta = pt_off+14 - - Integer, Parameter :: entropy_p_dtheta = pt_off+15 ! Fluctuating - Integer, Parameter :: pressure_p_dtheta = pt_off+16 - - Integer, Parameter :: entropy_m_dtheta = pt_off+17 ! Mean - Integer, Parameter :: pressure_m_dtheta = pt_off+18 - - !------------ Phi Derivatives -----------------! - Integer, Parameter :: entropy_dphi = pt_off+19 ! Full - Integer, Parameter :: pressure_dphi = pt_off+20 - - Integer, Parameter :: entropy_p_dphi = pt_off+21 ! Fluctuating - Integer, Parameter :: pressure_p_dphi = pt_off+22 - - Integer, Parameter :: entropy_m_dphi = pt_off+23 ! Mean - Integer, Parameter :: pressure_m_dphi = pt_off+24 - - !------------ (1/r) * Theta Derivatives --------! - Integer, Parameter :: entropy_dtr = pt_off+25 ! Full - Integer, Parameter :: pressure_dtr = pt_off+26 - - Integer, Parameter :: entropy_p_dtr = pt_off+27 ! Fluctuating - Integer, Parameter :: pressure_p_dtr = pt_off+28 - - Integer, Parameter :: entropy_m_dtr = pt_off+29 ! Mean - Integer, Parameter :: pressure_m_dtr = pt_off+30 - - !--- (1/{r sintheta}) * Phi Derivatives ---------! - Integer, Parameter :: entropy_dprs = pt_off+31 ! Full - Integer, Parameter :: pressure_dprs = pt_off+32 - - Integer, Parameter :: entropy_p_dprs = pt_off+33 ! Fluctuating - Integer, Parameter :: pressure_p_dprs = pt_off+34 - - Integer, Parameter :: entropy_m_dprs = pt_off+35 ! Mean - Integer, Parameter :: pressure_m_dprs = pt_off+36 - - !------------ Radial Second Derivatives --------------! - Integer, Parameter :: entropy_d2r = pt_off+37 ! Full - Integer, Parameter :: pressure_d2r = pt_off+38 - - Integer, Parameter :: entropy_p_d2r = pt_off+39 ! Fluctuating - Integer, Parameter :: pressure_p_d2r = pt_off+40 - - Integer, Parameter :: entropy_m_d2r = pt_off+41 ! Mean - Integer, Parameter :: pressure_m_d2r = pt_off+42 - - !------------ Theta Second Derivatives --------------! - Integer, Parameter :: entropy_d2t = pt_off+43 ! Full - Integer, Parameter :: pressure_d2t = pt_off+44 - - Integer, Parameter :: entropy_p_d2t = pt_off+45 ! Fluctuating - Integer, Parameter :: pressure_p_d2t = pt_off+46 - - Integer, Parameter :: entropy_m_d2t = pt_off+47 ! Mean - Integer, Parameter :: pressure_m_d2t = pt_off+48 - - !------------ Phi Second Derivatives --------------! - Integer, Parameter :: entropy_d2p = pt_off+49 ! Full - Integer, Parameter :: pressure_d2p = pt_off+50 - - Integer, Parameter :: entropy_p_d2p = pt_off+51 ! Fluctuating - Integer, Parameter :: pressure_p_d2p = pt_off+52 - - Integer, Parameter :: entropy_m_d2p = pt_off+53 ! Mean - Integer, Parameter :: pressure_m_d2p = pt_off+54 - - !------------ Radial-Theta Second Derivatives --------------! - Integer, Parameter :: entropy_d2rt = pt_off+55 ! Full - Integer, Parameter :: pressure_d2rt = pt_off+56 - - Integer, Parameter :: entropy_p_d2rt = pt_off+57 ! Fluctuating - Integer, Parameter :: pressure_p_d2rt = pt_off+58 - - Integer, Parameter :: entropy_m_d2rt = pt_off+59 ! Mean - Integer, Parameter :: pressure_m_d2rt = pt_off+60 - - !------------ Radial-Phi Derivatives --------------! - Integer, Parameter :: entropy_d2rp = pt_off+61 ! Full - Integer, Parameter :: pressure_d2rp = pt_off+62 - - Integer, Parameter :: entropy_p_d2rp = pt_off+63 ! Fluctuating - Integer, Parameter :: pressure_p_d2rp = pt_off+64 - - Integer, Parameter :: entropy_m_d2rp = pt_off+65 ! Mean - Integer, Parameter :: pressure_m_d2rp = pt_off+66 - - !------------ Theta-Phi Derivatives --------------! - Integer, Parameter :: entropy_d2tp = pt_off+67 ! Full - Integer, Parameter :: pressure_d2tp = pt_off+68 - - Integer, Parameter :: entropy_p_d2tp = pt_off+69 ! Fluctuating - Integer, Parameter :: pressure_p_d2tp = pt_off+70 - - Integer, Parameter :: entropy_m_d2tp = pt_off+71 ! Mean - Integer, Parameter :: pressure_m_d2tp = pt_off+72 - - !--------- Also compute terms of the form rho_bar d_by_dr(P/rho_bar) - Integer, Parameter :: rhopressure_dr = pt_off+73 - Integer, Parameter :: rhopressurep_dr = pt_off+74 - Integer, Parameter :: rhopressurem_dr = pt_off+75 - - !////////////////////////////////////////////////////////////////////////// - !/////////////////////////////////////////////////// - ! Vorticity Outputs - Integer, Parameter :: vort_off = pt_off+75 ! = 192 - - Integer, Parameter :: vort_r = vort_off+1 ! Full - Integer, Parameter :: vort_theta = vort_off+2 - Integer, Parameter :: vort_phi = vort_off+3 - - Integer, Parameter :: vortp_r = vort_off+4 ! Fluctuating - Integer, Parameter :: vortp_theta = vort_off+5 - Integer, Parameter :: vortp_phi = vort_off+6 - - Integer, Parameter :: vortm_r = vort_off+7 ! Mean - Integer, Parameter :: vortm_theta = vort_off+8 - Integer, Parameter :: vortm_phi = vort_off+9 - - Integer, Parameter :: enstrophy = vort_off+10 ! Enstrophy - Integer, Parameter :: enstrophy_pm = vort_off+11 ! (fluctuating-mean) - Integer, Parameter :: enstrophy_mm = vort_off+12 ! (mean-mean) - Integer, Parameter :: enstrophy_pp = vort_off+13 ! (fluct-fluct) - - - !////////////////////////////////////////////////////////// - ! Radial Energy Fluxes - Integer, Parameter :: eoffset = vort_off+ 13 ! =205 - Integer, Parameter :: ecrossb_r = eoffset+1 ! [ExB]_r (un-normalized Poynting flux) - Integer, Parameter :: ke_flux_radial = eoffset+2 ! vr*KE - Integer, Parameter :: thermalE_flux_radial = eoffset+3 ! vr*rho_bar*T_bar*S OR vr*T - Integer, Parameter :: enth_flux_radial = eoffset+4 ! vr*cp*rho_bar*T - Integer, Parameter :: visc_flux_r = eoffset+5 ! -[Div dot D]_r - Integer, Parameter :: vol_heat_flux = eoffset+6 ! "Flux" associated with volumetric heating - Integer, Parameter :: cond_flux_r = eoffset+7 ! Thermal conductive flux - Integer, Parameter :: vol_heating = eoffset+8 ! Volumetric Heating Function - Integer, Parameter :: visc_heating = eoffset+9 ! Viscous Heating - - - !/////////////////////////////////////////////////////////// - ! Kinetic Energies - Integer, Parameter :: keoffset = eoffset+9 ! = 214 - Integer, Parameter :: kinetic_energy = keoffset+1 ! 1/2 rho_bar v^2 - Integer, Parameter :: radial_ke = keoffset+2 ! 1/2 rho_bar {v_r}^2 - Integer, Parameter :: theta_ke = keoffset+3 ! 1/2 rho_bar {v_theta}^2 - Integer, Parameter :: phi_ke = keoffset+4 ! 1/2 rho_bar {v_phi}^2 - - Integer, Parameter :: mkinetic_energy = keoffset+5 ! 1/2 rho_bar ^2 - Integer, Parameter :: radial_mke = keoffset+6 ! 1/2 rho_bar ^2 - Integer, Parameter :: theta_mke = keoffset+7 ! 1/2 rho_bar ^2 - Integer, Parameter :: phi_mke = keoffset+8 ! 1/2 rho_bar ^2 - - Integer, Parameter :: pkinetic_energy = keoffset+9 ! 1/2 rho_bar {v'}^2 - Integer, Parameter :: radial_pke = keoffset+10 ! 1/2 rho_bar {v_r'}^2 - Integer, Parameter :: theta_pke = keoffset+11 ! 1/2 rho_bar {v_theta'}^2 - Integer, Parameter :: phi_pke = keoffset+12 ! 1/2 rho_bar {v_phi'}^2 - - !--- Since density varies with radius, it can be useful to output the - !--- squared fields, sans density, as well. - Integer, Parameter :: vsq = keoffset+13 ! v^2 - Integer, Parameter :: radial_vsq = keoffset+14 ! {v_r}^2 - Integer, Parameter :: theta_vsq = keoffset+15 ! {v_theta}^2 - Integer, Parameter :: phi_vsq = keoffset+16 ! {v_phi}^2 - - Integer, Parameter :: mvsq = keoffset+17 ! ^2 - Integer, Parameter :: radial_mvsq = keoffset+18 ! ^2 - Integer, Parameter :: theta_mvsq = keoffset+19 ! ^2 - Integer, Parameter :: phi_mvsq = keoffset+20 ! ^2 - - Integer, Parameter :: pvsq = keoffset+21 ! {v'}^2 - Integer, Parameter :: radial_pvsq = keoffset+22 ! {v_r'}^2 - Integer, Parameter :: theta_pvsq = keoffset+23 ! {v_theta'}^2 - Integer, Parameter :: phi_pvsq = keoffset+24 ! {v_phi'}^2 - - - !--- Thermal Energies - Integer, Parameter :: teoffset=keoffset+24 ! 238 - Integer, Parameter :: thermal_energy_full = teoffset+1 ! rho_bar T_bar S - Integer, Parameter :: thermal_energy_p = teoffset+2 ! rho_bar T_bar S' - Integer, Parameter :: thermal_energy_m = teoffset+3 ! rho_bar T_bar - - - !//////////////////////////////////////////////////////////////////////////////////////// - ! Momentum Equation ... - - - !//////////////////////// Advection Terms //////////////////// - ! Reynolds decomposition about the azimuthal mean may also be output - ! NOTE: ADVECTION TERMS ARE SCALED BY DENSITY (so that they represent a force density) - - Integer, Parameter :: mom_eq_off = teoffset+3 ! = 241 ! Output offset for advection terms - Integer, Parameter :: v_grad_v_r = mom_eq_off+1 ! radial component of v dot grad v - Integer, Parameter :: v_grad_v_theta = mom_eq_off+2 ! theta component of v dot grad v - Integer, Parameter :: v_grad_v_phi = mom_eq_off+3 ! phi component of v dot grad v - - Integer, Parameter :: vp_grad_vm_r = mom_eq_off+4 ! radial component of v' dot grad - Integer, Parameter :: vp_grad_vm_theta = mom_eq_off+5 ! theta component of v' dot grad - Integer, Parameter :: vp_grad_vm_phi = mom_eq_off+6 ! phi component of v' dot grad - - Integer, Parameter :: vm_grad_vp_r = mom_eq_off+7 ! radial component of dot grad v' - Integer, Parameter :: vm_grad_vp_theta = mom_eq_off+8 ! theta component of dot grad v' - Integer, Parameter :: vm_grad_vp_phi = mom_eq_off+9 ! phi component of dot grad v' - - Integer, Parameter :: vp_grad_vp_r = mom_eq_off+10 ! radial component of v' dot grad v' - Integer, Parameter :: vp_grad_vp_theta = mom_eq_off+11 ! theta component of v' dot grad v' - Integer, Parameter :: vp_grad_vp_phi = mom_eq_off+12 ! phi component of v' dot grad v' - - Integer, Parameter :: vm_grad_vm_r = mom_eq_off+13 ! radial component of dot grad - Integer, Parameter :: vm_grad_vm_theta = mom_eq_off+14 ! theta component of dot grad - Integer, Parameter :: vm_grad_vm_phi = mom_eq_off+15 ! phi component of dot grad - - !///////////////////////////////////////////////////////////// - ! Linear Forces - ! Note: the pressure gradient diagnostic codes are above - - Integer, Parameter :: buoyancy_force = mom_eq_off+16 - Integer, Parameter :: buoyancy_pforce = mom_eq_off+17 - Integer, Parameter :: buoyancy_mforce = mom_eq_off+18 - - Integer, Parameter :: Coriolis_Force_r = mom_eq_off+19 - Integer, Parameter :: Coriolis_Force_theta = mom_eq_off+20 - Integer, Parameter :: Coriolis_Force_phi = mom_eq_off+21 - - Integer, Parameter :: Coriolis_pForce_r = mom_eq_off+22 - Integer, Parameter :: Coriolis_pForce_theta = mom_eq_off+23 - Integer, Parameter :: Coriolis_pForce_phi = mom_eq_off+24 - - Integer, Parameter :: Coriolis_mForce_r = mom_eq_off+25 - Integer, Parameter :: Coriolis_mForce_theta = mom_eq_off+26 - Integer, Parameter :: Coriolis_mForce_phi = mom_eq_off+27 - - ! Viscous forces - Integer, Parameter :: viscous_Force_r = mom_eq_off+28 - Integer, Parameter :: viscous_Force_theta = mom_eq_off+29 - Integer, Parameter :: viscous_Force_phi = mom_eq_off+30 - - Integer, Parameter :: viscous_pForce_r = mom_eq_off+31 - Integer, Parameter :: viscous_pForce_theta = mom_eq_off+32 - Integer, Parameter :: viscous_pForce_phi = mom_eq_off+33 - - Integer, Parameter :: viscous_mForce_r = mom_eq_off+34 - Integer, Parameter :: viscous_mForce_theta = mom_eq_off+35 - Integer, Parameter :: viscous_mForce_phi = mom_eq_off+36 - - ! Pressure forces - Integer, Parameter :: pressure_Force_r = mom_eq_off+37 - Integer, Parameter :: pressure_Force_theta = mom_eq_off+38 - Integer, Parameter :: pressure_Force_phi = mom_eq_off+39 - - Integer, Parameter :: pressure_pForce_r = mom_eq_off+40 - Integer, Parameter :: pressure_pForce_theta = mom_eq_off+41 - Integer, Parameter :: pressure_pForce_phi = mom_eq_off+42 - - Integer, Parameter :: pressure_mForce_r = mom_eq_off+43 - Integer, Parameter :: pressure_mForce_theta = mom_eq_off+44 - Integer, Parameter :: pressure_mForce_phi = mom_eq_off+45 - - ! ell=0 pressure and buoyancy forces (r-direction only) - ! These are substracted out from the radial terms above - ! for obvious reasons. - Integer, Parameter :: buoyancy_force_ell0 = mom_eq_off+46 - Integer, Parameter :: pressure_force_ell0_r = mom_eq_off+47 - - - !//////////////////////////////////////////////////////////////////////// - ! Thermal Energy Equation - Integer, Parameter :: thrm_eq_off = mom_eq_off+32 ! 169 - - ! Advection terms (all terms are scaled by rho_bar T_bar in anelastic mode) - Integer, Parameter :: v_grad_s_r = thrm_eq_off+1 ! radial component of v dot grad S - Integer, Parameter :: v_grad_s_theta = thrm_eq_off+2 ! theta component of v dot grad S - Integer, Parameter :: v_grad_s_phi = thrm_eq_off+3 ! phi component of v dot grad S - - Integer, Parameter :: vp_grad_sm_r = thrm_eq_off+4 ! radial component of v' dot grad - Integer, Parameter :: vp_grad_sm_theta = thrm_eq_off+5 ! theta component of v' dot grad - Integer, Parameter :: vp_grad_sm_phi = thrm_eq_off+6 ! phi component of v' dot grad - - Integer, Parameter :: vm_grad_sp_r = thrm_eq_off+7 ! radial component of dot grad S' - Integer, Parameter :: vm_grad_sp_theta = thrm_eq_off+8 ! theta component of dot grad S' - Integer, Parameter :: vm_grad_sp_phi = thrm_eq_off+9 ! phi component of dot grad S' - - Integer, Parameter :: vp_grad_sp_r = thrm_eq_off+10 ! radial component of v' dot grad S' - Integer, Parameter :: vp_grad_sp_theta = thrm_eq_off+11 ! theta component of v' dot grad S' - Integer, Parameter :: vp_grad_sp_phi = thrm_eq_off+12 ! phi component of v' dot grad S' - - Integer, Parameter :: vm_grad_sm_r = thrm_eq_off+13 ! radial component of dot grad - Integer, Parameter :: vm_grad_sm_theta = thrm_eq_off+14 ! theta component of dot grad - Integer, Parameter :: vm_grad_sm_phi = thrm_eq_off+15 ! phi component of dot grad - - - - - !/////////////////////////////////////////////////////////////////////////////////// - !Angular Momentum Transport Diagnostics - ! Reynolds decomposition of the azimuthally-averaged angular momentum fluxes. - Integer, Parameter :: amoff = thrm_eq_off+ 15 ! = 238 - Integer, Parameter :: amom_fluct_r = amoff+1 ! rho_bar * r * sintheta * {v_r'} * {v_phi'} - Integer, Parameter :: amom_fluct_theta = amoff+2 ! rho_bar * r * sintheta * {v_theta'} * {v_phi'} - Integer, Parameter :: amom_dr_r = amoff+3 ! rho_bar * r * sintheta * * - Integer, Parameter :: amom_dr_theta = amoff+4 ! rho_bar * r * sintheta * * - Integer, Parameter :: amom_mean_r = amoff+5 ! rho_bar * r^2 * sintheta^2 * * Omega - Integer, Parameter :: amom_mean_theta = amoff+6 ! rho_bar * r^2 * sintheta^2 * * Omega - - ! Quantity codes for magnetic torques are defined with the Lorentz Forces - - - - !////////////////////////////////////////////////////////// - ! Turbulent kinetic energy generation - Integer, Parameter :: turbke_offset = amoff+6 ! 201 - - - Integer, Parameter :: production_buoyant_pKE = turbke_offset + 1 ! Buoyant Production of turbulent kinetic energy - Integer, Parameter :: production_shear_pKE = turbke_offset + 2 ! Shear Production of turbulent kinetic energy - Integer, Parameter :: dissipation_viscous_pKE = turbke_offset + 3 ! Viscous Dissipation of turbulent kinetic energy - Integer, Parameter :: transport_pressure_pKE = turbke_offset + 4 ! Pressure Transport of turbulent kinetic energy - Integer, Parameter :: transport_viscous_pKE = turbke_offset + 5 ! Viscous Transport of turbulent kinetic energy - Integer, Parameter :: transport_turbadvect_pKE = turbke_offset + 6 ! Turbulent Advective Transport of turbulent kinetic energy - Integer, Parameter :: transport_meanadvect_pKE = turbke_offset + 7 ! Mean Advective Transport of turbulent kinetic energy - Integer, Parameter :: rflux_pressure_pKE = turbke_offset + 8 ! Radial Pressure Flux of turbulent kinetic energy - Integer, Parameter :: rflux_viscous_pKE = turbke_offset + 9 ! Radial Viscous Flux of turbulent kinetic energy - Integer, Parameter :: rflux_turbadvect_pKE = turbke_offset + 10 ! Radial Turbulent Advective Flux of turbulent kinetic energy - Integer, Parameter :: rflux_meanadvect_pKE = turbke_offset + 11 ! Radial Mean Advective Flux of turbulent kinetic energy - Integer, Parameter :: thetaflux_pressure_pKE = turbke_offset + 12 ! Colatitudinal Pressure Flux of turbulent kinetic energy - Integer, Parameter :: thetaflux_viscous_pKE = turbke_offset + 13 ! Colatitudinal Viscous Flux of turbulent kinetic energy - Integer, Parameter :: thetaflux_turbadvect_pKE = turbke_offset + 14 ! Colatitudinal Turbulent Advective Flux of turbulent kinetic energy - Integer, Parameter :: thetaflux_meanadvect_pKE = turbke_offset + 15 ! Colatitudinal Mean Advective Flux of turbulent kinetic energy - - ! We have some "known" outputs as well that allow us to verify that - ! the spherical_io interface is functional - Integer, Parameter :: dcheck_off = turbke_offset+ 15 ! 216 - Integer, Parameter :: diagnostic1 = dcheck_off+1 - Integer, Parameter :: diagnostic2 = dcheck_off+2 - Integer, Parameter :: test_y11 = dcheck_off+3 - Integer, Parameter :: test_y22 = dcheck_off+4 - Integer, Parameter :: test_y22_sq = dcheck_off+5 - - Integer, Parameter :: test_dvrdrdr = dcheck_off+6 - Integer, Parameter :: test_dvrdtdt = dcheck_off+7 - Integer, Parameter :: test_dvrdpdp = dcheck_off+8 - - Integer, Parameter :: test_dvtdrdr = dcheck_off+9 - Integer, Parameter :: test_dvpdpdp = dcheck_off+10 - !////////////////////////////////////////////////////////// - ! Custom Hydo Outputs: range from 301 through 400 - Integer, Parameter :: custom_hydro_offset = 300 - !Integer, Parameter :: v_grad_s = custom_hydro_offset + 1 ! {Entropy or T} advection - - - !////////////////////////////////////////////////////////// - ! Magnetic Outputs. - ! Start at 400 to leave ample room for additional hydro - - - !////////////////////////////////////////////////// - ! Magnetic field components. - ! Fluctuations (denoted by "p") and azimuthal means - ! (denoted by "m") may also be output. - Integer, Parameter :: boffset = 400 - - !------------ Field Components ----------! - Integer, Parameter :: b_r = boffset+1 ! Full - Integer, Parameter :: b_theta = boffset+2 - Integer, Parameter :: b_phi = boffset+3 - - Integer, Parameter :: bp_r = boffset+4 ! Fluctuating - Integer, Parameter :: bp_theta = boffset+5 - Integer, Parameter :: bp_phi = boffset+6 - - - Integer, Parameter :: bm_r = boffset+7 ! Mean - Integer, Parameter :: bm_theta = boffset+8 - Integer, Parameter :: bm_phi = boffset+9 - - !------------ Radial Derivatives -------------! - Integer, Parameter :: db_r_dr = boffset+10 ! Full - Integer, Parameter :: db_theta_dr = boffset+11 - Integer, Parameter :: db_phi_dr = boffset+12 - - Integer, Parameter :: dbp_r_dr = boffset+13 ! Fluctuating - Integer, Parameter :: dbp_theta_dr = boffset+14 - Integer, Parameter :: dbp_phi_dr = boffset+15 - - Integer, Parameter :: dbm_r_dr = boffset+16 ! Mean - Integer, Parameter :: dbm_theta_dr = boffset+17 - Integer, Parameter :: dbm_phi_dr = boffset+18 - - !------------ Theta Derivatives --------------! - Integer, Parameter :: db_r_dt = boffset+19 ! Full - Integer, Parameter :: db_theta_dt = boffset+20 - Integer, Parameter :: db_phi_dt = boffset+21 - - Integer, Parameter :: dbp_r_dt = boffset+22 ! Fluctuating - Integer, Parameter :: dbp_theta_dt = boffset+23 - Integer, Parameter :: dbp_phi_dt = boffset+24 - - Integer, Parameter :: dbm_r_dt = boffset+25 ! Mean - Integer, Parameter :: dbm_theta_dt = boffset+26 - Integer, Parameter :: dbm_phi_dt = boffset+27 - - !------------ Phi Derivatives ----------------! - Integer, Parameter :: db_r_dp = boffset+28 ! Full - Integer, Parameter :: db_theta_dp = boffset+29 - Integer, Parameter :: db_phi_dp = boffset+30 - - Integer, Parameter :: dbp_r_dp = boffset+31 ! Fluctuating - Integer, Parameter :: dbp_theta_dp = boffset+32 ! (same as full if - Integer, Parameter :: dbp_phi_dp = boffset+33 ! mean is azimuthal) - - Integer, Parameter :: dbm_r_dp = boffset+34 ! Mean - Integer, Parameter :: dbm_theta_dp = boffset+35 ! (nonzero only when mean is - Integer, Parameter :: dbm_phi_dp = boffset+36 ! spherical, not azimuthal) - - !------------ (1/r) * Theta Derivatives -------! - Integer, Parameter :: db_r_dtr = boffset+37 ! Full - Integer, Parameter :: db_theta_dtr = boffset+38 - Integer, Parameter :: db_phi_dtr = boffset+39 - - Integer, Parameter :: dbp_r_dtr = boffset+40 ! Fluctuating - Integer, Parameter :: dbp_theta_dtr = boffset+41 - Integer, Parameter :: dbp_phi_dtr = boffset+42 - - Integer, Parameter :: dbm_r_dtr = boffset+43 ! Mean - Integer, Parameter :: dbm_theta_dtr = boffset+44 - Integer, Parameter :: dbm_phi_dtr = boffset+45 - - - !------(1/{r sintheta})* Phi Derivatives ---! - - Integer, Parameter :: db_r_dprs = boffset+46 ! Full - Integer, Parameter :: db_theta_dprs = boffset+47 - Integer, Parameter :: db_phi_dprs = boffset+48 - - Integer, Parameter :: dbp_r_dprs = boffset+49 ! Fluctuating - Integer, Parameter :: dbp_theta_dprs = boffset+50 - Integer, Parameter :: dbp_phi_dprs = boffset+51 - - Integer, Parameter :: dbm_r_dprs = boffset+52 ! Mean - Integer, Parameter :: dbm_theta_dprs = boffset+53 - Integer, Parameter :: dbm_phi_dprs = boffset+54 - - - !/////////////////////////////////////////////////// - ! Current Density Outputs (Including Ohmic Heating) - ! This is Curl B -- rename accordingly - Integer, Parameter :: joffset = boffset+54 ! = 454 - - Integer, Parameter :: j_r = joffset+1 ! Radial Current Density - Integer, Parameter :: jp_r = joffset+2 - Integer, Parameter :: jm_r = joffset+3 - - Integer, Parameter :: j_theta = joffset+4 ! Theta Current Density - Integer, Parameter :: jp_theta = joffset+5 - Integer, Parameter :: jm_theta = joffset+6 - - Integer, Parameter :: j_phi = joffset+7 ! Phi Current Density - Integer, Parameter :: jp_phi = joffset+8 - Integer, Parameter :: jm_phi = joffset+9 - - Integer, Parameter :: j_r_sq = joffset+10 ! (j_r)^2 - Integer, Parameter :: jp_r_sq = joffset+11 ! (jp_r)^2 - Integer, Parameter :: j_theta_sq = joffset+12 ! (j_theta)^2 - Integer, Parameter :: jp_theta_sq = joffset+13 ! (jp_theta)^2 - Integer, Parameter :: j_phi_sq = joffset+14 ! (j_theta)^2 - Integer, Parameter :: jp_phi_sq = joffset+15 ! (jp_theta)^2 - Integer, Parameter :: j_sq = joffset+16 ! j dot j - Integer, Parameter :: jp_sq = joffset+17 ! j' dot j' - Integer, Parameter :: ohmic_heat = joffset+18 ! eta{ j dot j} - Integer, Parameter :: ohmic_heat_pp = joffset+19 ! eta{ j' dot j'} - Integer, Parameter :: ohmic_heat_mm = joffset+20 ! eta{ dot } - - !/////////////////////////////////////////////////////////// - ! Magnetic Energies - Integer, Parameter :: meoffset = joffset+20 ! = 474 - - Integer, Parameter :: magnetic_energy = meoffset+1 ! B^2 - Integer, Parameter :: radial_me = meoffset+2 ! {B_r}^2 - Integer, Parameter :: theta_me = meoffset+3 ! {B_theta}^2 - Integer, Parameter :: phi_me = meoffset+4 ! {B_phi}^2 - - Integer, Parameter :: mmagnetic_energy = meoffset+5 ! ^2 - Integer, Parameter :: radial_mme = meoffset+6 ! ^2 - Integer, Parameter :: theta_mme = meoffset+7 ! ^2 - Integer, Parameter :: phi_mme = meoffset+8 ! ^2 - - Integer, Parameter :: pmagnetic_energy = meoffset+9 ! {B'}^2 - Integer, Parameter :: radial_pme = meoffset+10 ! {B_r'}^2 - Integer, Parameter :: theta_pme = meoffset+11 ! {B_theta'}^2 - Integer, Parameter :: phi_pme = meoffset+12 ! {B_phi'}^2 - - - - !/////////////////////////// Lorentz Forces /////////////////////////////// - ! ref%Lorentz_Coeff * (del x B) x B - ! ref%Lorentz_Coeff = 1/4pi when dimensional, Pr/(Pr_m E) when nondimesional - ! j (below) is shorthand for ref%Lorentz_Coeff*delxB (not quite the current density) - Integer, Parameter :: loff = meoffset+12 ! =486 - Integer, Parameter :: j_cross_b_r = loff+1 ! radial component of j x B - Integer, Parameter :: j_cross_b_theta = loff+2 ! theta component of j x B - Integer, Parameter :: j_cross_b_phi = loff+3 ! phi component of j x B - - Integer, Parameter :: jp_cross_bm_r = loff+4 ! radial component of j' x - Integer, Parameter :: jp_cross_bm_theta = loff+5 ! theta component of j' x - Integer, Parameter :: jp_cross_bm_phi = loff+6 ! phi component of j' x - - Integer, Parameter :: jm_cross_bp_r = loff+7 ! radial component of x B' - Integer, Parameter :: jm_cross_bp_theta = loff+8 ! theta component of x B' - Integer, Parameter :: jm_cross_bp_phi = loff+9 ! phi component of x B' - - Integer, Parameter :: jm_cross_bm_r = loff+10 ! radial component of x - Integer, Parameter :: jm_cross_bm_theta = loff+11 ! theta component of x - Integer, Parameter :: jm_cross_bm_phi = loff+12 ! phi component of x - - Integer, Parameter :: jp_cross_bp_r = loff+13 ! radial component of j' x B' - Integer, Parameter :: jp_cross_bp_theta = loff+14 ! theta component of j' x B' - Integer, Parameter :: jp_cross_bp_phi = loff+15 ! phi component of j' x B' - - - Integer, Parameter :: maxwell_stress_r = loff+16 ! -rsintheta {B_r'}{B_phi'}*Lorentz_Coeff - Integer, Parameter :: maxwell_stress_theta = loff+17 ! -rsintheta {B_theta'}{B_phi'}*Lorentz_Coeff - - Integer, Parameter :: magnetic_torque_r = loff+18 ! -rsintheta *Lorentz_Coeff - Integer, Parameter :: magnetic_torque_theta = loff+19 ! -rsintheta *Lorentz_Coeff - - !////////////////////////////// Induction Terms /////////////////////////// - Integer, Parameter :: indoff = loff + 19 ! = 505 - - !--------------- Terms involving v x B (full) - Integer, Parameter :: induction_shear_r = indoff+1 ! radial component of {B dot grad v} - Integer, Parameter :: induction_comp_r = indoff+2 ! radial component of -{div dot v}B - Integer, Parameter :: induction_advec_r = indoff+3 ! radial component of -{v dot grad B} - Integer, Parameter :: induction_r = indoff+4 ! radial component of del cros {v x B} - Integer, Parameter :: induction_diff_r = indoff+5 ! radial component of -del x (eta {del x B}) - - Integer, Parameter :: induction_shear_theta = indoff+6 ! theta component of {B dot grad v} - Integer, Parameter :: induction_comp_theta = indoff+7 ! theta component of -{div dot v}B - Integer, Parameter :: induction_advec_theta = indoff+8 ! theta component of -{v dot grad B} - Integer, Parameter :: induction_theta = indoff+9 ! theta component of del cros {v x B} - Integer, Parameter :: induction_diff_theta = indoff+10 ! theta component of -del x (eta {del x B}) - - Integer, Parameter :: induction_shear_phi = indoff+11 ! phi component of {B dot grad v} - Integer, Parameter :: induction_comp_phi = indoff+12 ! phi component of -{div dot v}B - Integer, Parameter :: induction_advec_phi = indoff+13 ! phi component of -{v dot grad B} - Integer, Parameter :: induction_phi = indoff+14 ! phi component of del cros {v x B} - Integer, Parameter :: induction_diff_phi = indoff+15 ! phi component of -del x (eta {del x B}) - - !--------------- Terms involving x - Integer, Parameter :: induction_shear_vmbm_r = indoff+16 ! radial component of { dot grad } - Integer, Parameter :: induction_comp_vmbm_r = indoff+17 ! radial component of -{div dot } - Integer, Parameter :: induction_advec_vmbm_r = indoff+18 ! radial component of -{ dot grad } - Integer, Parameter :: induction_vmbm_r = indoff+19 ! radial component of del cros { x } - Integer, Parameter :: induction_diff_bm_r = indoff+20 ! radial component of -del x (eta {del x }) - - Integer, Parameter :: induction_shear_vmbm_theta = indoff+21 ! theta component of { dot grad } - Integer, Parameter :: induction_comp_vmbm_theta = indoff+22 ! theta component of -{div dot } - Integer, Parameter :: induction_advec_vmbm_theta = indoff+23 ! theta component of -{ dot grad } - Integer, Parameter :: induction_vmbm_theta = indoff+24 ! theta component of del cros { x } - Integer, Parameter :: induction_diff_bm_theta = indoff+25 ! theta component of -del x (eta {del x }) - - Integer, Parameter :: induction_shear_vmbm_phi = indoff+26 ! phi component of { dot grad } - Integer, Parameter :: induction_comp_vmbm_phi = indoff+27 ! phi component of -{div dot } - Integer, Parameter :: induction_advec_vmbm_phi = indoff+28 ! phi component of -{ dot grad } - Integer, Parameter :: induction_vmbm_phi = indoff+29 ! phi component of del cros { x } - Integer, Parameter :: induction_diff_bm_phi = indoff+30 ! phi component of -del x (eta {del x }) - - !--------------- Terms involving x B' - Integer, Parameter :: induction_shear_vmbp_r = indoff+31 ! radial component of {B' dot grad } - Integer, Parameter :: induction_comp_vmbp_r = indoff+32 ! radial component of -{div dot }B' - Integer, Parameter :: induction_advec_vmbp_r = indoff+33 ! radial component of -{ dot grad B'} - Integer, Parameter :: induction_vmbp_r = indoff+34 ! radial component of del cros { x B'} - Integer, Parameter :: induction_diff_bp_r = indoff+35 ! radial component of -del x (eta {del x B'}) - - Integer, Parameter :: induction_shear_vmbp_theta = indoff+36 ! theta component of {B' dot grad } - Integer, Parameter :: induction_comp_vmbp_theta = indoff+37 ! theta component of -{div dot }B' - Integer, Parameter :: induction_advec_vmbp_theta = indoff+38 ! theta component of -{ dot grad B'} - Integer, Parameter :: induction_vmbp_theta = indoff+39 ! theta component of del cros { x B'} - Integer, Parameter :: induction_diff_bp_theta = indoff+40 ! theta component of -del x (eta {del x B'}) - - Integer, Parameter :: induction_shear_vmbp_phi = indoff+41 ! phi component of {B' dot grad } - Integer, Parameter :: induction_comp_vmbp_phi = indoff+42 ! phi component of -{div dot }B' - Integer, Parameter :: induction_advec_vmbp_phi = indoff+43 ! phi component of -{ dot grad B'} - Integer, Parameter :: induction_vmbp_phi = indoff+44 ! phi component of del cros { x B'} - Integer, Parameter :: induction_diff_bp_phi = indoff+45 ! phi component of -del x (eta {del x B'}) - - !--------------- Terms involving v' x - Integer, Parameter :: induction_shear_vpbm_r = indoff+46 ! radial component of { dot grad v'} - Integer, Parameter :: induction_comp_vpbm_r = indoff+47 ! radial component of -{div dot v'} - Integer, Parameter :: induction_advec_vpbm_r = indoff+48 ! radial component of -{v' dot grad } - Integer, Parameter :: induction_vpbm_r = indoff+49 ! radial component of del cros {v' x } - - Integer, Parameter :: induction_shear_vpbm_theta = indoff+50 ! theta component of { dot grad v'} - Integer, Parameter :: induction_comp_vpbm_theta = indoff+51 ! theta component of -{div dot v'} - Integer, Parameter :: induction_advec_vpbm_theta = indoff+52 ! theta component of -{v' dot grad } - Integer, Parameter :: induction_vpbm_theta = indoff+53 ! theta component of del cros {v' x } - - Integer, Parameter :: induction_shear_vpbm_phi = indoff+54 ! phi component of { dot grad v'} - Integer, Parameter :: induction_comp_vpbm_phi = indoff+55 ! phi component of -{div dot v'} - Integer, Parameter :: induction_advec_vpbm_phi = indoff+56 ! phi component of -{v' dot grad } - Integer, Parameter :: induction_vpbm_phi = indoff+57 ! phi component of del cros {v' x } - - !--------------- Terms involving v' x B' - Integer, Parameter :: induction_shear_vpbp_r = indoff+58 ! radial component of {B' dot grad v'} - Integer, Parameter :: induction_comp_vpbp_r = indoff+59 ! radial component of -{div dot v'}B' - Integer, Parameter :: induction_advec_vpbp_r = indoff+60 ! radial component of -{v' dot grad B'} - Integer, Parameter :: induction_vpbp_r = indoff+61 ! radial component of del cros {v' x B'} - - Integer, Parameter :: induction_shear_vpbp_theta = indoff+62 ! theta component of {B' dot grad v'} - Integer, Parameter :: induction_comp_vpbp_theta = indoff+63 ! theta component of -{div dot v'}B' - Integer, Parameter :: induction_advec_vpbp_theta = indoff+64 ! theta component of -{v' dot grad B'} - Integer, Parameter :: induction_vpbp_theta = indoff+65 ! theta component of del cros {v' x B'} - - Integer, Parameter :: induction_shear_vpbp_phi = indoff+66 ! phi component of {B' dot grad v'} - Integer, Parameter :: induction_comp_vpbp_phi = indoff+67 ! phi component of -{div dot v'}B' - Integer, Parameter :: induction_advec_vpbp_phi = indoff+68 ! phi component of -{v' dot grad B'} - Integer, Parameter :: induction_vpbp_phi = indoff+69 ! phi component of del cros {v' x B'} - - - !/////////////////////////////////////////////////////////////////////////////////////////////// - ! Magnetic Diffusion Terms -- To Be Implemented - - !///////////////////////////////////////////////////////////////////////////////////////////// - - - !////////////////////////////////////////////////////////////////////////////////////////////// - ! User custom magnetic outputs: Numbers range from 701 to 800 - - Integer, Parameter :: custom_mag_offset = 700 - Integer, Parameter :: cross_helicity = custom_mag_offset + 1 ! v dot B - Integer, Parameter :: turb_cross_helicity = custom_mag_offset+2 - !Integer, Parameter :: vB_angle = ??? ! {v dot B}/{|v||B|} - cosine of angle between v and B - - - - !/////////////////////////////////// - Real*8, Allocatable :: qty(:,:,:) ! This variable holds each quantity that we output - Real*8, Allocatable :: tmp1(:,:,:) ! A work array - Real*8, Allocatable :: rweights(:), tweights(:), tmp1d(:) - - !////////////////////////////////// - ! The ell0 and m0 _ values arrays contain, yes, the ell = 0 and m = 0 values of - ! everything in buffer at output time. - Real*8, Allocatable :: ell0_values(:,:), m0_values(:,:,:) - - ! This array will hold fluctuating quantities from the buffer { q - } - Real*8, Allocatable :: fbuffer(:,:,:,:) - - Logical :: azimuthal_mean = .true. ! when false, the m0_values are overwritten with the ell0_values - - !/////////////////////////////////////////////////////////////////////////// - ! A special buffer used for holding second derivatives at output time - Type(SphericalBuffer) :: d2buffer - ! ell0 and m0 values of those variables stored in d2buffer - Real*8, Allocatable :: d2_ell0(:,:), d2_m0(:,:,:) - - ! This array will hold fluctuating quantities from the d2buffer { q - } - Real*8, Allocatable :: d2_fbuffer(:,:,:,:) - - - ! Indices within the d2buffer - Integer :: dvrdrdr, dvrdtdt, dvrdpdp, dvrdrdt, dvrdrdp, dvrdtdp - Integer :: dvtdrdr, dvtdtdt, dvtdpdp, dvtdrdt, dvtdrdp, dvtdtdp - Integer :: dvpdrdr, dvpdtdt, dvpdpdp, dvpdrdt, dvpdrdp, dvpdtdp - - Integer :: dtdrdr, dtdtdt, dtdpdp, dtdrdt, dtdrdp, dtdtdp - Integer :: dpdrdr, dpdtdt, dpdpdp, dpdrdt, dpdrdp, dpdtdp - - Integer :: dbrdrdr, dbrdtdt, dbrdpdp, dbrdrdt, dbrdrdp, dbrdtdp - Integer :: dbtdrdr, dbtdtdt, dbtdpdp, dbtdrdt, dbtdrdp, dbtdtdp - Integer :: dbpdrdr, dbpdtdt, dbpdpdp, dbpdrdt, dbpdrdp, dbpdtdp - - Logical :: need_second_derivatives = .false. -Contains - - Subroutine Generate_Diagnostic_Labels() - ! Define labels for our quantity codes - Write(6,*)'A line of code.' - !Call Load_Label(v_r,'V_r') - !Call Load_Label(v_theta,'V_theta') - !Call Load_Label(v_phi, 'V_phi') - End Subroutine Generate_Diagnostic_Labels - - Subroutine Initialize_Diagnostics_Buffer() - Logical :: dbtrans, dbconfig - Logical :: test_reduce - - dbtrans = .false. - dbconfig = .false. - test_reduce = .false. - - Call cobuffer%init(field_count = cbfcount, config = 'p1a', & - dynamic_transpose =dbtrans, dynamic_config = dbconfig, & - hold_cargo = test_reduce, padding = pad_alltoall) - End Subroutine Initialize_Diagnostics_Buffer - - - Subroutine Compute_Fluctuations(buffer) - Implicit None - Integer :: r,k, t, j,jmax - Real*8, Intent(InOut) :: buffer(1:,my_r%min:,my_theta%min:,1:) - jmax = size(buffer,4) - Allocate(fbuffer(1:n_phi,my_r%min:my_r%max,my_theta%min:my_theta%max,1:jmax)) - - - Do j = 1, jmax - DO_PSI - fbuffer(PSI,j) = buffer(PSI,j) - m0_values(PSI2,j) - END_DO - Enddo - - End Subroutine Compute_Fluctuations - - Subroutine DeAllocate_Fluctuations() - Implicit None - DeAllocate(fbuffer) - End Subroutine DeAllocate_Fluctuations - - -End Module Diagnostics_Base diff --git a/src/Diagnostics/Diagnostics_ADotGradB.F90 b/src/Diagnostics/Diagnostics_ADotGradB.F90 index da1c4790..55fb4dd4 100644 --- a/src/Diagnostics/Diagnostics_ADotGradB.F90 +++ b/src/Diagnostics/Diagnostics_ADotGradB.F90 @@ -1,9 +1,4 @@ -#define DO_PSI Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max ;Do k = 1, n_phi -#define DO_PSI2 Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max -#define END_DO2 enddo; enddo -#define END_DO enddo; enddo; enddo -#define PSI k,r,t -#define PSI2 r,t +#include "indices.F" Module Diagnostics_ADotGradB Use Diagnostics_Base diff --git a/src/Diagnostics/Diagnostics_Angular_Momentum.F90 b/src/Diagnostics/Diagnostics_Angular_Momentum.F90 index 31ac3d1e..ef099366 100644 --- a/src/Diagnostics/Diagnostics_Angular_Momentum.F90 +++ b/src/Diagnostics/Diagnostics_Angular_Momentum.F90 @@ -1,10 +1,4 @@ -#define DO_PSI Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max ;Do k = 1, n_phi -#define DO_PSI2 Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max -#define END_DO2 enddo; enddo -#define END_DO enddo; enddo; enddo -#define PSI k,r,t -#define PSI2 r,t -#define DDBUFF d2buffer%p3a +#include "indices.F" Module Diagnostics_Angular_Momentum Use Diagnostics_Base Implicit None diff --git a/src/Diagnostics/Diagnostics_Base.F90 b/src/Diagnostics/Diagnostics_Base.F90 index 92c8b2eb..4ed17214 100644 --- a/src/Diagnostics/Diagnostics_Base.F90 +++ b/src/Diagnostics/Diagnostics_Base.F90 @@ -1,9 +1,5 @@ -#define DO_PSI Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max ;Do k = 1, n_phi -#define DO_PSI2 Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max -#define END_DO2 enddo; enddo -#define END_DO enddo; enddo; enddo -#define PSI k,r,t -#define PSI2 r,t + +#include "indices.F" Module Diagnostics_Base !////////////////////////////////////////////////////////// ! This module holds common variables that may be accessed diff --git a/src/Diagnostics/Diagnostics_Current_Density.F90 b/src/Diagnostics/Diagnostics_Current_Density.F90 index 87f55ba9..57639471 100644 --- a/src/Diagnostics/Diagnostics_Current_Density.F90 +++ b/src/Diagnostics/Diagnostics_Current_Density.F90 @@ -1,10 +1,4 @@ -#define DO_PSI Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max ;Do k = 1, n_phi -#define DO_PSI2 Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max -#define END_DO2 enddo; enddo -#define END_DO enddo; enddo; enddo -#define PSI k,r,t -#define PSI2 r,t - +#include "indices.F" !/////////////////////////////////////////////////////////////////// ! DIAGNOSTICS_CURRENT_DENSITY ! This module computes the components of del x B. diff --git a/src/Diagnostics/Diagnostics_Custom.F90 b/src/Diagnostics/Diagnostics_Custom.F90 index 8eaba8dd..60412714 100644 --- a/src/Diagnostics/Diagnostics_Custom.F90 +++ b/src/Diagnostics/Diagnostics_Custom.F90 @@ -1,10 +1,4 @@ -#define DO_PSI Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max ;Do k = 1, n_phi -#define DO_PSI2 Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max -#define END_DO2 enddo; enddo -#define END_DO enddo; enddo; enddo -#define PSI k,r,t -#define PSI2 r,t - +#include "indices.F" !/////////////////////////////////////////////////////////////////// ! DIAGNOSTICS_CUSTOM ! This is where users can implement their own diagnostics diff --git a/src/Diagnostics/Diagnostics_Energies.F90 b/src/Diagnostics/Diagnostics_Energies.F90 index b0c0eb04..85a4fe29 100644 --- a/src/Diagnostics/Diagnostics_Energies.F90 +++ b/src/Diagnostics/Diagnostics_Energies.F90 @@ -1,9 +1,4 @@ -#define DO_PSI Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max ;Do k = 1, n_phi -#define DO_PSI2 Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max -#define END_DO2 enddo; enddo -#define END_DO enddo; enddo; enddo -#define PSI k,r,t -#define PSI2 r,t +#include "indices.F" Module Diagnostics_Energies Use Diagnostics_Base Implicit None diff --git a/src/Diagnostics/Diagnostics_Energy_Flux.F90 b/src/Diagnostics/Diagnostics_Energy_Flux.F90 index 55ca45f5..a683def2 100644 --- a/src/Diagnostics/Diagnostics_Energy_Flux.F90 +++ b/src/Diagnostics/Diagnostics_Energy_Flux.F90 @@ -1,9 +1,4 @@ -#define DO_PSI Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max ;Do k = 1, n_phi -#define DO_PSI2 Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max -#define END_DO2 enddo; enddo -#define END_DO enddo; enddo; enddo -#define PSI k,r,t -#define PSI2 r,t +#include "indices.F" !////////////////////// Diagnostics Energy Flux /////////////////////// ! ! This module handles calculation of terms comprising diff --git a/src/Diagnostics/Diagnostics_Induction.F90 b/src/Diagnostics/Diagnostics_Induction.F90 index 2951895c..eb6e1487 100644 --- a/src/Diagnostics/Diagnostics_Induction.F90 +++ b/src/Diagnostics/Diagnostics_Induction.F90 @@ -1,10 +1,4 @@ -#define DO_PSI Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max ;Do k = 1, n_phi -#define DO_PSI2 Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max -#define END_DO2 enddo; enddo -#define END_DO enddo; enddo; enddo -#define PSI k,r,t -#define PSI2 r,t -#define DDBUFF d2buffer%p3a +#include "indices.F" !/////////////////////////////////////////////////////////////////// ! DIAGNOSTICS_INDUCTION ! This module computes del x (vxB), its diff --git a/src/Diagnostics/Diagnostics_Inertial_Forces.F90 b/src/Diagnostics/Diagnostics_Inertial_Forces.F90 index c84ff688..547180d8 100644 --- a/src/Diagnostics/Diagnostics_Inertial_Forces.F90 +++ b/src/Diagnostics/Diagnostics_Inertial_Forces.F90 @@ -1,9 +1,4 @@ -#define DO_PSI Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max ;Do k = 1, n_phi -#define DO_PSI2 Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max -#define END_DO2 enddo; enddo -#define END_DO enddo; enddo; enddo -#define PSI k,r,t -#define PSI2 r,t +#include "indices.F" Module Diagnostics_Inertial_Forces diff --git a/src/Diagnostics/Diagnostics_Interface.F90 b/src/Diagnostics/Diagnostics_Interface.F90 index 635b1f60..62164466 100755 --- a/src/Diagnostics/Diagnostics_Interface.F90 +++ b/src/Diagnostics/Diagnostics_Interface.F90 @@ -1,9 +1,4 @@ -#define DO_PSI Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max ;Do k = 1, n_phi -#define DO_PSI2 Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max -#define END_DO2 enddo; enddo -#define END_DO enddo; enddo; enddo -#define PSI k,r,t -#define PSI2 r,t +#include "indices.F" Module Diagnostics_Interface Use ProblemSize Use Controls @@ -227,6 +222,7 @@ Subroutine PS_Output(buffer,iteration, current_time) If (pass_num .eq. 1) Call Finalize_Averages() Enddo + DeAllocate(qty,tmp1,tmp1d,tmp4) Call Complete_Output(iteration, current_time) diff --git a/src/Diagnostics/Diagnostics_KE_Flux.F90 b/src/Diagnostics/Diagnostics_KE_Flux.F90 index 1ce2320f..f73fa437 100644 --- a/src/Diagnostics/Diagnostics_KE_Flux.F90 +++ b/src/Diagnostics/Diagnostics_KE_Flux.F90 @@ -1,9 +1,4 @@ -#define DO_PSI Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max ;Do k = 1, n_phi -#define DO_PSI2 Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max -#define END_DO2 enddo; enddo -#define END_DO enddo; enddo; enddo -#define PSI k,r,t -#define PSI2 r,t +#include "indices.F" !////////////////////// Diagnostics KE Flux /////////////////////// ! ! This module handles calculation of terms associated with the kinetic energy flux @@ -152,165 +147,266 @@ Subroutine Compute_KE_Flux(buffer) !///////////////////////////////////////////////////////////////// ! Now move on to the viscous fluxes - !First, the radial viscous flux of energy + !First, the full fluxes - !Note: We use tmp to store v dot D_ij modulo the diagonal terms involving div dot v - !Store that in tmp1 and then set qty_i = v_j(vr*dlnrhodr+D_ij) + If (compute_quantity(visc_flux_r)) Then + DO_PSI + tmp1(PSI) = 2*buffer(PSI,vr) * buffer(PSI,dvrdr) ! 2 vr dot e_r_r + END_DO + + DO_PSI + tmp1(PSI) = tmp1(PSI)+buffer(PSI,vtheta) * & ! 2 vtheta dot e_r_theta + ( buffer(PSI,dvtdr) -one_over_r(r)*(buffer(PSI,vtheta) - buffer(PSI,dvrdt)) ) + END_DO - If (compute_quantity(visc_flux_r) .or. compute_quantity(visc_flux_theta) & - .or. compute_quantity(visc_flux_phi)) Then - !Radial contribution (mod rho*nu) - DO_PSI - tmp1(PSI) = buffer(PSI,dvrdr)*buffer(PSI,vr)*2.0d0 + DO_PSI + tmp1(PSI) = tmp1(PSI)+buffer(PSI,vphi) * & ! 2 vphi dot e_r_phi + ( buffer(PSI,dvpdr) -one_over_r(r)*(buffer(PSI,vphi) - csctheta(t)*buffer(PSI,dvrdp)) ) END_DO - !Theta contribution (mod rho*nu) - DO_PSI - tmp1(PSI) = tmp1(PSI)+(2.0d0/3.0d0)*buffer(PSI,vr)*ref%dlnrho(r) - tmp1(PSI) = tmp1(PSI)+buffer(PSI,dvtdr)-buffer(PSI,vtheta)/radius(r) - tmp1(PSI) = tmp1(PSI)+buffer(PSI,dvrdt)/radius(r) - tmp1(PSI) = tmp1(PSI)*buffer(PSI,vtheta) - END_DO + DO_PSI ! -2 vr dot div(v)/3 + tmp1(PSI) = tmp1(PSI)+2*buffer(PSI,vr)*(buffer(PSI,vr)*ref%dlnrho(r)*one_third ) + END_DO - !phi contribution (mod rho*nu) DO_PSI - tmp1(PSI) = tmp1(PSI)+(2.0d0/3.0d0)*buffer(PSI,vr)*ref%dlnrho(r) - tmp1(PSI) = tmp1(PSI)+buffer(PSI,dvpdr)-buffer(PSI,vphi)/radius(r) - tmp1(PSI) = tmp1(PSI)+buffer(PSI,dvrdp)/radius(r)/sintheta(t) - tmp1(PSI) = tmp1(PSI)*buffer(PSI,vphi) - END_DO + qty(PSI) = tmp1(PSI)*nu(r)*ref%density(r) + END_DO + + Call Add_Quantity(qty) + Endif + + If (compute_quantity(visc_flux_theta)) Then + DO_PSI + tmp1(PSI) = buffer(PSI,vr) * & ! 2 vr dot e_r_theta + ( buffer(PSI,dvtdr) -one_over_r(r)*(buffer(PSI,vtheta) - buffer(PSI,dvrdt)) ) + END_DO + + DO_PSI + tmp1(PSI) = tmp1(PSI)+2*buffer(PSI,vtheta) * & ! 2 vtheta dot e_theta_theta + one_over_r(r)*(buffer(PSI,vr) + buffer(PSI,dvtdt)) + END_DO + + DO_PSI + tmp1(PSI) = tmp1(PSI)+buffer(PSI,vphi) * & ! 2 vphi dot e_theta_phi + one_over_r(r)*(csctheta(t)*buffer(PSI,dvtdp) + buffer(PSI,dvpdt) - buffer(PSI,vphi)*cottheta(t) ) + END_DO + + DO_PSI ! -2 vtheta dot div(v)/3 + tmp1(PSI) = tmp1(PSI)+2*buffer(PSI,vtheta)*(buffer(PSI,vr)*ref%dlnrho(r)*one_third ) + END_DO - !Multiply by rho and nu DO_PSI - tmp1(PSI) = tmp1(PSI)*nu(r)*ref%density(r) - END_DO + qty(PSI) = tmp1(PSI)*nu(r)*ref%density(r) + END_DO + Call Add_Quantity(qty) - If (compute_quantity(visc_flux_r)) Then - DO_PSI - qty(PSI) = tmp1(PSI)+buffer(PSI,vr)*(buffer(PSI,vr)*ref%dlnrho(r)*one_third ) - END_DO - Call Add_Quantity(qty) - Endif - If (compute_quantity(visc_flux_theta)) Then - DO_PSI - qty(PSI) = tmp1(PSI)+buffer(PSI,vtheta)*(buffer(PSI,vr)*ref%dlnrho(r)*one_third ) - END_DO - Call Add_Quantity(qty) - Endif - If (compute_quantity(visc_flux_phi)) Then - DO_PSI - qty(PSI) = tmp1(PSI)+buffer(PSI,vphi)*(buffer(PSI,vr)*ref%dlnrho(r)*one_third ) - END_DO - Call Add_Quantity(qty) - Endif + Endif + + If (compute_quantity(visc_flux_phi)) Then + DO_PSI + tmp1(PSI) = buffer(PSI,vr) * & ! 2 vr dot e_r_phi + ( buffer(PSI,dvpdr) -one_over_r(r)*(buffer(PSI,vphi) - csctheta(t)*buffer(PSI,dvrdp)) ) + END_DO + + DO_PSI + tmp1(PSI) = tmp1(PSI)+buffer(PSI,vtheta) * & ! 2 vtheta dot e_theta_phi + one_over_r(r)*(csctheta(t)*buffer(PSI,dvtdp) + buffer(PSI,dvpdt) - buffer(PSI,vphi)*cottheta(t) ) + END_DO + + DO_PSI + tmp1(PSI) = tmp1(PSI)+buffer(PSI,vphi) * & ! 2 vphi dot e_phi_phi + Two_Over_R(r)*(buffer(PSI,vr) + cottheta(t)*buffer(PSI,vtheta) + csctheta(t)*buffer(PSI,dvpdp)) + END_DO + + DO_PSI ! -2 vphi dot div(v)/3 + tmp1(PSI) = tmp1(PSI)+2*buffer(PSI,vphi)*(buffer(PSI,vr)*ref%dlnrho(r)*one_third ) + END_DO + + DO_PSI + qty(PSI) = tmp1(PSI)*nu(r)*ref%density(r) + END_DO + + Call Add_Quantity(qty) Endif + !---- + If (compute_quantity(visc_fluxpp_r)) Then + DO_PSI + tmp1(PSI) = 2*fbuffer(PSI,vr) * fbuffer(PSI,dvrdr) ! 2 vr dot e_r_r + END_DO - If (compute_quantity(visc_fluxpp_r) .or. compute_quantity(visc_fluxpp_theta) & - .or. compute_quantity(visc_fluxpp_phi)) Then - !Radial contribution (mod rho*nu) - DO_PSI - tmp1(PSI) = fbuffer(PSI,dvrdr)*fbuffer(PSI,vr)*2.0d0 + DO_PSI + tmp1(PSI) = tmp1(PSI)+fbuffer(PSI,vtheta) * & ! 2 vtheta dot e_r_theta + ( fbuffer(PSI,dvtdr) -one_over_r(r)*(fbuffer(PSI,vtheta) - fbuffer(PSI,dvrdt)) ) END_DO - !Theta contribution (mod rho*nu) - DO_PSI - tmp1(PSI) = tmp1(PSI)+(2.0d0/3.0d0)*fbuffer(PSI,vr)*ref%dlnrho(r) - tmp1(PSI) = tmp1(PSI)+fbuffer(PSI,dvtdr)-fbuffer(PSI,vtheta)/radius(r) - tmp1(PSI) = tmp1(PSI)+fbuffer(PSI,dvrdt)/radius(r) - tmp1(PSI) = tmp1(PSI)*fbuffer(PSI,vtheta) - END_DO + DO_PSI + tmp1(PSI) = tmp1(PSI)+fbuffer(PSI,vphi) * & ! 2 vphi dot e_r_phi + ( fbuffer(PSI,dvpdr) -one_over_r(r)*(fbuffer(PSI,vphi) - csctheta(t)*fbuffer(PSI,dvrdp)) ) + END_DO + + DO_PSI ! -2 vr dot div(v)/3 + tmp1(PSI) = tmp1(PSI)+2*fbuffer(PSI,vr)*(fbuffer(PSI,vr)*ref%dlnrho(r)*one_third ) + END_DO - !phi contribution (mod rho*nu) DO_PSI - tmp1(PSI) = tmp1(PSI)+(2.0d0/3.0d0)*fbuffer(PSI,vr)*ref%dlnrho(r) - tmp1(PSI) = tmp1(PSI)+fbuffer(PSI,dvpdr)-fbuffer(PSI,vphi)/radius(r) - tmp1(PSI) = tmp1(PSI)+fbuffer(PSI,dvrdp)/radius(r)/sintheta(t) - tmp1(PSI) = tmp1(PSI)*fbuffer(PSI,vphi) - END_DO + qty(PSI) = tmp1(PSI)*nu(r)*ref%density(r) + END_DO + + Call Add_Quantity(qty) + Endif + + If (compute_quantity(visc_fluxpp_theta)) Then + DO_PSI + tmp1(PSI) = fbuffer(PSI,vr) * & ! 2 vr dot e_r_theta + ( fbuffer(PSI,dvtdr) -one_over_r(r)*(fbuffer(PSI,vtheta) - fbuffer(PSI,dvrdt)) ) + END_DO + + DO_PSI + tmp1(PSI) = tmp1(PSI)+2*fbuffer(PSI,vtheta) * & ! 2 vtheta dot e_theta_theta + one_over_r(r)*(fbuffer(PSI,vr) + fbuffer(PSI,dvtdt)) + END_DO + + DO_PSI + tmp1(PSI) = tmp1(PSI)+fbuffer(PSI,vphi) * & ! 2 vphi dot e_theta_phi + one_over_r(r)*(csctheta(t)*fbuffer(PSI,dvtdp) + fbuffer(PSI,dvpdt) - fbuffer(PSI,vphi)*cottheta(t) ) + END_DO + + DO_PSI ! -2 vtheta dot div(v)/3 + tmp1(PSI) = tmp1(PSI)+2*fbuffer(PSI,vtheta)*(fbuffer(PSI,vr)*ref%dlnrho(r)*one_third ) + END_DO - !Multiply by rho and nu DO_PSI - tmp1(PSI) = tmp1(PSI)*nu(r)*ref%density(r) - END_DO + qty(PSI) = tmp1(PSI)*nu(r)*ref%density(r) + END_DO + Call Add_Quantity(qty) - If (compute_quantity(visc_fluxpp_r)) Then - DO_PSI - qty(PSI) = tmp1(PSI)+fbuffer(PSI,vr)*(fbuffer(PSI,vr)*ref%dlnrho(r)*one_third ) - END_DO - Call Add_Quantity(qty) - Endif - If (compute_quantity(visc_fluxpp_theta)) Then - DO_PSI - qty(PSI) = tmp1(PSI)+fbuffer(PSI,vtheta)*(fbuffer(PSI,vr)*ref%dlnrho(r)*one_third ) - END_DO - Call Add_Quantity(qty) - Endif - If (compute_quantity(visc_fluxpp_phi)) Then - DO_PSI - qty(PSI) = tmp1(PSI)+fbuffer(PSI,vphi)*(fbuffer(PSI,vr)*ref%dlnrho(r)*one_third ) - END_DO - Call Add_Quantity(qty) - Endif + Endif + + If (compute_quantity(visc_fluxpp_phi)) Then + DO_PSI + tmp1(PSI) = fbuffer(PSI,vr) * & ! 2 vr dot e_r_phi + ( fbuffer(PSI,dvpdr) -one_over_r(r)*(fbuffer(PSI,vphi) - csctheta(t)*fbuffer(PSI,dvrdp)) ) + END_DO + + DO_PSI + tmp1(PSI) = tmp1(PSI)+fbuffer(PSI,vtheta) * & ! 2 vtheta dot e_theta_phi + one_over_r(r)*(csctheta(t)*fbuffer(PSI,dvtdp) + fbuffer(PSI,dvpdt) - fbuffer(PSI,vphi)*cottheta(t) ) + END_DO + + DO_PSI + tmp1(PSI) = tmp1(PSI)+fbuffer(PSI,vphi) * & ! 2 vphi dot e_phi_phi + Two_Over_R(r)*(fbuffer(PSI,vr) + cottheta(t)*fbuffer(PSI,vtheta) + csctheta(t)*fbuffer(PSI,dvpdp)) + END_DO + + DO_PSI ! -2 vphi dot div(v)/3 + tmp1(PSI) = tmp1(PSI)+2*fbuffer(PSI,vphi)*(fbuffer(PSI,vr)*ref%dlnrho(r)*one_third ) + END_DO + + DO_PSI + qty(PSI) = tmp1(PSI)*nu(r)*ref%density(r) + END_DO + + Call Add_Quantity(qty) Endif - If (compute_quantity(visc_fluxmm_r) .or. compute_quantity(visc_fluxmm_theta) & - .or. compute_quantity(visc_fluxmm_phi)) Then - !Radial contribution (mod rho*nu) - DO_PSI - tmp1(PSI) = m0_values(PSI2,dvrdr)*m0_values(PSI2,vr)*2.0d0 + + + !---- + If (compute_quantity(visc_fluxmm_r)) Then + DO_PSI + tmp1(PSI) = 2*m0_values(PSI2,vr) * m0_values(PSI2,dvrdr) ! 2 vr dot e_r_r + END_DO + + DO_PSI + tmp1(PSI) = tmp1(PSI)+m0_values(PSI2,vtheta) * & ! 2 vtheta dot e_r_theta + ( m0_values(PSI2,dvtdr) -one_over_r(r)*(m0_values(PSI2,vtheta) - m0_values(PSI2,dvrdt)) ) + END_DO + + DO_PSI + tmp1(PSI) = tmp1(PSI)+m0_values(PSI2,vphi) * & ! 2 vphi dot e_r_phi + ( m0_values(PSI2,dvpdr) -one_over_r(r)*(m0_values(PSI2,vphi) - csctheta(t)*m0_values(PSI2,dvrdp)) ) END_DO - !Theta contribution (mod rho*nu) - DO_PSI - tmp1(PSI) = tmp1(PSI)+(2.0d0/3.0d0)*m0_values(PSI2,vr)*ref%dlnrho(r) - tmp1(PSI) = tmp1(PSI)+m0_values(PSI2,dvtdr)-m0_values(PSI2,vtheta)/radius(r) - tmp1(PSI) = tmp1(PSI)+m0_values(PSI2,dvrdt)/radius(r) - tmp1(PSI) = tmp1(PSI)*m0_values(PSI2,vtheta) - END_DO + DO_PSI ! -2 vr dot div(v)/3 + tmp1(PSI) = tmp1(PSI)+2*m0_values(PSI2,vr)*(m0_values(PSI2,vr)*ref%dlnrho(r)*one_third ) + END_DO - !phi contribution (mod rho*nu) DO_PSI - tmp1(PSI) = tmp1(PSI)+(2.0d0/3.0d0)*m0_values(PSI2,vr)*ref%dlnrho(r) - tmp1(PSI) = tmp1(PSI)+m0_values(PSI2,dvpdr)-m0_values(PSI2,vphi)/radius(r) - tmp1(PSI) = tmp1(PSI)+m0_values(PSI2,dvrdp)/radius(r)/sintheta(t) - tmp1(PSI) = tmp1(PSI)*m0_values(PSI2,vphi) - END_DO + qty(PSI) = tmp1(PSI)*nu(r)*ref%density(r) + END_DO + + Call Add_Quantity(qty) + Endif + + If (compute_quantity(visc_fluxmm_theta)) Then + DO_PSI + tmp1(PSI) = m0_values(PSI2,vr) * & ! 2 vr dot e_r_theta + ( m0_values(PSI2,dvtdr) -one_over_r(r)*(m0_values(PSI2,vtheta) - m0_values(PSI2,dvrdt)) ) + END_DO + + DO_PSI + tmp1(PSI) = tmp1(PSI)+2*m0_values(PSI2,vtheta) * & ! 2 vtheta dot e_theta_theta + one_over_r(r)*(m0_values(PSI2,vr) + m0_values(PSI2,dvtdt)) + END_DO + + DO_PSI + tmp1(PSI) = tmp1(PSI)+m0_values(PSI2,vphi) * & ! 2 vphi dot e_theta_phi + one_over_r(r)*(csctheta(t)*m0_values(PSI2,dvtdp) + m0_values(PSI2,dvpdt) - m0_values(PSI2,vphi)*cottheta(t) ) + END_DO + + DO_PSI ! -2 vtheta dot div(v)/3 + tmp1(PSI) = tmp1(PSI)+2*m0_values(PSI2,vtheta)*(m0_values(PSI2,vr)*ref%dlnrho(r)*one_third ) + END_DO - !Multiply by rho and nu DO_PSI - tmp1(PSI) = tmp1(PSI)*nu(r)*ref%density(r) - END_DO + qty(PSI) = tmp1(PSI)*nu(r)*ref%density(r) + END_DO + Call Add_Quantity(qty) - If (compute_quantity(visc_fluxmm_r)) Then - DO_PSI - qty(PSI) = tmp1(PSI)+m0_values(PSI2,vr)*(m0_values(PSI2,vr)*ref%dlnrho(r)*one_third ) - END_DO - Call Add_Quantity(qty) - Endif - If (compute_quantity(visc_fluxmm_theta)) Then - DO_PSI - qty(PSI) = tmp1(PSI)+m0_values(PSI2,vtheta)*(m0_values(PSI2,vr)*ref%dlnrho(r)*one_third ) - END_DO - Call Add_Quantity(qty) - Endif - If (compute_quantity(visc_fluxmm_phi)) Then - DO_PSI - qty(PSI) = tmp1(PSI)+m0_values(PSI2,vphi)*(m0_values(PSI2,vr)*ref%dlnrho(r)*one_third ) - END_DO - Call Add_Quantity(qty) - Endif + Endif + + If (compute_quantity(visc_fluxmm_phi)) Then + DO_PSI + tmp1(PSI) = m0_values(PSI2,vr) * & ! 2 vr dot e_r_phi + ( m0_values(PSI2,dvpdr) -one_over_r(r)*(m0_values(PSI2,vphi) - csctheta(t)*m0_values(PSI2,dvrdp)) ) + END_DO + + DO_PSI + tmp1(PSI) = tmp1(PSI)+m0_values(PSI2,vtheta) * & ! 2 vtheta dot e_theta_phi + one_over_r(r)*(csctheta(t)*m0_values(PSI2,dvtdp) + m0_values(PSI2,dvpdt) - m0_values(PSI2,vphi)*cottheta(t) ) + END_DO + + DO_PSI + tmp1(PSI) = tmp1(PSI)+m0_values(PSI2,vphi) * & ! 2 vphi dot e_phi_phi + Two_Over_R(r)*(m0_values(PSI2,vr) + cottheta(t)*m0_values(PSI2,vtheta) + csctheta(t)*m0_values(PSI2,dvpdp)) + END_DO + + DO_PSI ! -2 vphi dot div(v)/3 + tmp1(PSI) = tmp1(PSI)+2*m0_values(PSI2,vphi)*(m0_values(PSI2,vr)*ref%dlnrho(r)*one_third ) + END_DO + + DO_PSI + qty(PSI) = tmp1(PSI)*nu(r)*ref%density(r) + END_DO + + Call Add_Quantity(qty) Endif + + !---- + + + ! Pressure transport terms If (compute_quantity(press_flux_r)) Then DO_PSI diff --git a/src/Diagnostics/Diagnostics_Linear_Forces.F90 b/src/Diagnostics/Diagnostics_Linear_Forces.F90 index 421e3086..ed4a22ac 100644 --- a/src/Diagnostics/Diagnostics_Linear_Forces.F90 +++ b/src/Diagnostics/Diagnostics_Linear_Forces.F90 @@ -1,10 +1,4 @@ -#define DO_PSI Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max ;Do k = 1, n_phi -#define DO_PSI2 Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max -#define END_DO2 enddo; enddo -#define END_DO enddo; enddo; enddo -#define PSI k,r,t -#define PSI2 r,t -#define DDBUFF d2buffer%p3a +#include "indices.F" Module Diagnostics_Linear_Forces Use Diagnostics_Base Implicit None diff --git a/src/Diagnostics/Diagnostics_Lorentz_Forces.F90 b/src/Diagnostics/Diagnostics_Lorentz_Forces.F90 index 28f0ab9f..5e0247d1 100644 --- a/src/Diagnostics/Diagnostics_Lorentz_Forces.F90 +++ b/src/Diagnostics/Diagnostics_Lorentz_Forces.F90 @@ -1,9 +1,4 @@ -#define DO_PSI Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max ;Do k = 1, n_phi -#define DO_PSI2 Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max -#define END_DO2 enddo; enddo -#define END_DO enddo; enddo; enddo -#define PSI k,r,t -#define PSI2 r,t +#include "indices.F" Module Diagnostics_Lorentz_Forces diff --git a/src/Diagnostics/Diagnostics_Magnetic_Field.F90 b/src/Diagnostics/Diagnostics_Magnetic_Field.F90 index 263b9c08..d8a279bc 100644 --- a/src/Diagnostics/Diagnostics_Magnetic_Field.F90 +++ b/src/Diagnostics/Diagnostics_Magnetic_Field.F90 @@ -1,10 +1,4 @@ -#define DO_PSI Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max ;Do k = 1, n_phi -#define DO_PSI2 Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max -#define END_DO2 enddo; enddo -#define END_DO enddo; enddo; enddo -#define PSI k,r,t -#define PSI2 r,t -#define DDBUFF d2buffer%p3a +#include "indices.F" !/////////////////////////////////////////////////////////////////// ! DIAGNOSTICS_Magnetic_FIELD diff --git a/src/Diagnostics/Diagnostics_Mean_Correction.F90 b/src/Diagnostics/Diagnostics_Mean_Correction.F90 index 8469b83f..c5366c4e 100644 --- a/src/Diagnostics/Diagnostics_Mean_Correction.F90 +++ b/src/Diagnostics/Diagnostics_Mean_Correction.F90 @@ -1,10 +1,6 @@ -#define DO_PSI Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max ;Do k = 1, n_phi -#define DO_PSI2 Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max -#define END_DO2 enddo; enddo -#define END_DO enddo; enddo; enddo -#define PSI k,r,t -#define PSI2 r,t -#define DDBUFF d2buffer%p3a +#include "indices.F" + + Module Diagnostics_Mean_Correction Use Diagnostics_Base Use Spherical_IO @@ -79,11 +75,11 @@ Subroutine Initialize_Mean_Correction() ! ---- v' v' compute_fluct_fluct = .false. - If (compute_quantity(vp_grad_vp_r)) compute_full_full = .true. - If (compute_quantity(vp_grad_vp_theta)) compute_full_full = .true. - If (compute_quantity(vp_grad_vp_phi)) compute_full_full = .true. - If (compute_quantity(advec_work_ppp)) compute_full_full = .true. - If (compute_quantity(advec_work_mpp)) compute_full_full = .true. + If (compute_quantity(vp_grad_vp_r)) compute_fluct_fluct = .true. + If (compute_quantity(vp_grad_vp_theta)) compute_fluct_fluct = .true. + If (compute_quantity(vp_grad_vp_phi)) compute_fluct_fluct = .true. + If (compute_quantity(advec_work_ppp)) compute_fluct_fluct = .true. + If (compute_quantity(advec_work_mpp)) compute_fluct_fluct = .true. If (compute_fluct_fluct) Then diff --git a/src/Diagnostics/Diagnostics_Miscellaneous.F90 b/src/Diagnostics/Diagnostics_Miscellaneous.F90 index 944f0831..2cfbe808 100644 --- a/src/Diagnostics/Diagnostics_Miscellaneous.F90 +++ b/src/Diagnostics/Diagnostics_Miscellaneous.F90 @@ -1,9 +1,4 @@ -#define DO_PSI Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max ;Do k = 1, n_phi -#define DO_PSI2 Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max -#define END_DO2 enddo; enddo -#define END_DO enddo; enddo; enddo -#define PSI k,r,t -#define PSI2 r,t +#include "indices.F" Module Diagnostics_Miscellaneous Use Diagnostics_Base diff --git a/src/Diagnostics/Diagnostics_Poynting_Flux.F90 b/src/Diagnostics/Diagnostics_Poynting_Flux.F90 index a053a2ac..b28bd33d 100644 --- a/src/Diagnostics/Diagnostics_Poynting_Flux.F90 +++ b/src/Diagnostics/Diagnostics_Poynting_Flux.F90 @@ -1,10 +1,4 @@ -#define DO_PSI Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max ;Do k = 1, n_phi -#define DO_PSI2 Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max -#define END_DO2 enddo; enddo -#define END_DO enddo; enddo; enddo -#define PSI k,r,t -#define PSI2 r,t -#define DDBUFF d2buffer%p3a +#include "indices.F" Module Diagnostics_Poynting_Flux Use Diagnostics_Base Implicit None diff --git a/src/Diagnostics/Diagnostics_Second_Derivatives.F90 b/src/Diagnostics/Diagnostics_Second_Derivatives.F90 index 7886c5cc..1006ae14 100644 --- a/src/Diagnostics/Diagnostics_Second_Derivatives.F90 +++ b/src/Diagnostics/Diagnostics_Second_Derivatives.F90 @@ -1,11 +1,4 @@ -#define DO_PSI Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max ;Do k = 1, n_phi -#define DO_PSI2 Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max -#define END_DO2 enddo; enddo -#define END_DO enddo; enddo; enddo -#define PSI k,r,t -#define PSI2 r,t -#define DO_IDX2 Do mp = my_mp%min, my_mp%max; m = m_values(mp); Do imi = 1, 2; Do r = my_r%min, my_r%max -#define IDX2 m:l_max,r,imi +#include "indices.F" !/////////////////////////////////////////////////////////////////// ! DIAGNOSTICS_SECOND_DERIVATIVES !/////////////////////////////////////////////////////////////////// diff --git a/src/Diagnostics/Diagnostics_Thermal_Energies.F90 b/src/Diagnostics/Diagnostics_Thermal_Energies.F90 index 4d6837f4..a4c5e5e0 100644 --- a/src/Diagnostics/Diagnostics_Thermal_Energies.F90 +++ b/src/Diagnostics/Diagnostics_Thermal_Energies.F90 @@ -1,9 +1,4 @@ -#define DO_PSI Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max ;Do k = 1, n_phi -#define DO_PSI2 Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max -#define END_DO2 enddo; enddo -#define END_DO enddo; enddo; enddo -#define PSI k,r,t -#define PSI2 r,t +#include "indices.F" !////////////////////// Diagnostics Thermal Energies /////////////////////// ! diff --git a/src/Diagnostics/Diagnostics_Thermal_Equation.F90 b/src/Diagnostics/Diagnostics_Thermal_Equation.F90 index e2c68412..06302a6e 100644 --- a/src/Diagnostics/Diagnostics_Thermal_Equation.F90 +++ b/src/Diagnostics/Diagnostics_Thermal_Equation.F90 @@ -1,10 +1,4 @@ -#define DO_PSI Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max ;Do k = 1, n_phi -#define DO_PSI2 Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max -#define END_DO2 enddo; enddo -#define END_DO enddo; enddo; enddo -#define PSI k,r,t -#define PSI2 r,t -#define DDBUFF d2buffer%p3a +#include "indices.F" Module Diagnostics_Thermal_Equation Use Diagnostics_Base diff --git a/src/Diagnostics/Diagnostics_Thermodynamic_Gradients.F90 b/src/Diagnostics/Diagnostics_Thermodynamic_Gradients.F90 index 0d5de4b1..ec03fa10 100644 --- a/src/Diagnostics/Diagnostics_Thermodynamic_Gradients.F90 +++ b/src/Diagnostics/Diagnostics_Thermodynamic_Gradients.F90 @@ -1,10 +1,4 @@ -#define DO_PSI Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max ;Do k = 1, n_phi -#define DO_PSI2 Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max -#define END_DO2 enddo; enddo -#define END_DO enddo; enddo; enddo -#define PSI k,r,t -#define PSI2 r,t -#define DDBUFF d2buffer%p3a +#include "indices.F" Module Diagnostics_Thermodynamic_Gradients Use Diagnostics_Base Implicit None diff --git a/src/Diagnostics/Diagnostics_TurbKE_Budget.F90 b/src/Diagnostics/Diagnostics_TurbKE_Budget.F90 index 4bdbe928..078ab3e9 100644 --- a/src/Diagnostics/Diagnostics_TurbKE_Budget.F90 +++ b/src/Diagnostics/Diagnostics_TurbKE_Budget.F90 @@ -1,10 +1,4 @@ -#define DO_PSI Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max ;Do k = 1, n_phi -#define DO_PSI2 Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max -#define END_DO2 enddo; enddo -#define END_DO enddo; enddo; enddo -#define PSI k,r,t -#define PSI2 r,t -#define DDBUFF d2buffer%p3a +#include "indices.F" Module Diagnostics_TurbKE_Budget Use Diagnostics_Base Implicit None @@ -82,46 +76,6 @@ Subroutine Compute_TurbulentKE_Budget(buffer) Endif - ! Shear Production of turbulent kinetic energy. - ! P_T = -rho_bar u'u' : E - If (compute_quantity(production_shear_pKE)) Then - DO_PSI2 - one_over_rsin = one_over_r(r) * csctheta(t) - ctn_over_r = one_over_r(r) * cottheta(t) - - ! Compute elements of the mean rate of strain tensor E_ij - Err = m0_values(PSI2,dvrdr) - Ett = one_over_r(r) * (m0_values(PSI2,dvtdt) + m0_values(PSI2,vr)) - Epp = one_over_rsin * m0_values(PSI2,dvpdp) + ctn_over_r*m0_values(PSI2,vtheta) & - + one_over_r(r) * m0_values(PSI2,vr) - - ! Twice the diagonal elements, e.g., Ert = 2 * E_rt - Ert = one_over_r(r) * (m0_values(PSI2,dvrdt) - m0_values(PSI2,vtheta)) & - + m0_values(PSI2,dvtdr) - Erp = m0_values(PSI2,dvpdr) + one_over_rsin * m0_values(PSI2,dvrdp) & - - one_over_r(r) * m0_values(PSI2,vphi) - Etp = one_over_rsin * m0_values(PSI2,dvtdp) - ctn_over_r * m0_values(PSI2,vphi) & - + one_over_r(r) * m0_values(PSI2,dvpdt) - - ! Compute u'_i u'_j E_ij - DO k = 1, n_phi - ! Compute diagonal elements of the double contraction - htmp1 = fbuffer(PSI,vr)**2 * Err - htmp2 = fbuffer(PSI,vtheta)**2 * Ett - htmp3 = fbuffer(PSI,vphi)**2 * Epp - qty(PSI) = htmp1 + htmp2 + htmp3 - - ! Compute off-diagonal elements - htmp1 = fbuffer(PSI,vr)*fbuffer(PSI,vtheta)*Ert - htmp2 = fbuffer(PSI,vr)*fbuffer(PSI,vphi)*Erp - htmp3 = fbuffer(PSI,vtheta)*fbuffer(PSI,vphi)*Etp - qty(PSI) = qty(PSI) + htmp1 + htmp2 + htmp3 - - qty(PSI) = -ref%density(r) * qty(PSI) - ENDDO ! End of phi loop - END_DO2 ! End of theta & r loop - Call Add_Quantity(qty) - Endif !Viscous Dissipation of turbulent kinetic energy. diff --git a/src/Diagnostics/Diagnostics_Velocity_Diffusion.F90 b/src/Diagnostics/Diagnostics_Velocity_Diffusion.F90 index 42761d11..d808f156 100644 --- a/src/Diagnostics/Diagnostics_Velocity_Diffusion.F90 +++ b/src/Diagnostics/Diagnostics_Velocity_Diffusion.F90 @@ -1,10 +1,4 @@ -#define DO_PSI Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max ;Do k = 1, n_phi -#define DO_PSI2 Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max -#define END_DO2 enddo; enddo -#define END_DO enddo; enddo; enddo -#define PSI k,r,t -#define PSI2 r,t -#define DDBUFF d2buffer%p3a +#include "indices.F" Module Diagnostics_Velocity_Diffusion Use Diagnostics_Base Implicit None diff --git a/src/Diagnostics/Diagnostics_Velocity_Field.F90 b/src/Diagnostics/Diagnostics_Velocity_Field.F90 index b1e03217..0e0a5ab6 100644 --- a/src/Diagnostics/Diagnostics_Velocity_Field.F90 +++ b/src/Diagnostics/Diagnostics_Velocity_Field.F90 @@ -1,11 +1,4 @@ -#define DO_PSI Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max ;Do k = 1, n_phi -#define DO_PSI2 Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max -#define END_DO2 enddo; enddo -#define END_DO enddo; enddo; enddo -#define PSI k,r,t -#define PSI2 r,t -#define DDBUFF d2buffer%p3a - +#include "indices.F" !/////////////////////////////////////////////////////////////////// ! DIAGNOSTICS_VELOCITY_FIELD ! This module computes the components of the velocity field diff --git a/src/Diagnostics/Diagnostics_Vorticity_Field.F90 b/src/Diagnostics/Diagnostics_Vorticity_Field.F90 index f29bce01..ba113d57 100644 --- a/src/Diagnostics/Diagnostics_Vorticity_Field.F90 +++ b/src/Diagnostics/Diagnostics_Vorticity_Field.F90 @@ -1,9 +1,4 @@ -#define DO_PSI Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max ;Do k = 1, n_phi -#define DO_PSI2 Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max -#define END_DO2 enddo; enddo -#define END_DO enddo; enddo; enddo -#define PSI k,r,t -#define PSI2 r,t +#include "indices.F" !/////////////////////////////////////////////////////////////////// ! DIAGNOSTICS_CURRENT_DENSITY diff --git a/src/Diagnostics/ke_equation_codes.F b/src/Diagnostics/ke_equation_codes.F index cf726699..f374a222 100644 --- a/src/Diagnostics/ke_equation_codes.F +++ b/src/Diagnostics/ke_equation_codes.F @@ -34,47 +34,47 @@ Integer, Parameter :: mag_work_mmm = keq_off+22 ! :tex: $c_4\overline{\boldsymbol{v}}\cdot\left[\left(\boldsymbol{\nabla}\times\overline{\boldsymbol{B}}\right)\times\overline{\boldsymbol{B}}\right] $ ! Now the fluxes - Integer, Parameter :: ke_flux_radial = keq_off+22 ! :tex: $\frac{1}{2}\mathrm{f}_1v_r\,v^2$ - Integer, Parameter :: ke_flux_theta = keq_off+23 ! :tex: $\frac{1}{2}\mathrm{f}_1v_\theta\,v^2 $ - Integer, Parameter :: ke_flux_phi = keq_off+24 ! :tex: $\frac{1}{2}\mathrm{f}_1v_\phi\,v^2$ + Integer, Parameter :: ke_flux_radial = keq_off+23 ! :tex: $\frac{1}{2}\mathrm{f}_1v_r\,v^2$ + Integer, Parameter :: ke_flux_theta = keq_off+24 ! :tex: $\frac{1}{2}\mathrm{f}_1v_\theta\,v^2 $ + Integer, Parameter :: ke_flux_phi = keq_off+25 ! :tex: $\frac{1}{2}\mathrm{f}_1v_\phi\,v^2$ - Integer, Parameter :: mke_mflux_radial = keq_off+25 ! :tex: $\frac{1}{2}\mathrm{f}_1\,\overline{v_r}\,\overline{v}^2 $ - Integer, Parameter :: mke_mflux_theta = keq_off+26 ! :tex: $\frac{1}{2}\mathrm{f}_1\,\overline{v_\theta}\,\overline{v}^2$ - Integer, Parameter :: mke_mflux_phi = keq_off+27 ! :tex: $\frac{1}{2}\mathrm{f}_1\,\overline{v_\phi}\,\overline{v}^2$ + Integer, Parameter :: mke_mflux_radial = keq_off+26 ! :tex: $\frac{1}{2}\mathrm{f}_1\,\overline{v_r}\,\overline{v}^2 $ + Integer, Parameter :: mke_mflux_theta = keq_off+27 ! :tex: $\frac{1}{2}\mathrm{f}_1\,\overline{v_\theta}\,\overline{v}^2$ + Integer, Parameter :: mke_mflux_phi = keq_off+28 ! :tex: $\frac{1}{2}\mathrm{f}_1\,\overline{v_\phi}\,\overline{v}^2$ - Integer, Parameter :: pke_mflux_radial = keq_off+28 ! :tex: $\frac{1}{2}\mathrm{f}_1\,\overline{v_r}\,{v'}^2 $ - Integer, Parameter :: pke_mflux_theta = keq_off+29 ! :tex: $\frac{1}{2}\mathrm{f}_1\,\overline{v_\theta}\,{v'}^2 $ - Integer, Parameter :: pke_mflux_phi = keq_off+30 ! :tex: $\frac{1}{2}\mathrm{f}_1\,\overline{v_\phi}\,{v'}^2 $ + Integer, Parameter :: pke_mflux_radial = keq_off+29 ! :tex: $\frac{1}{2}\mathrm{f}_1\,\overline{v_r}\,{v'}^2 $ + Integer, Parameter :: pke_mflux_theta = keq_off+30 ! :tex: $\frac{1}{2}\mathrm{f}_1\,\overline{v_\theta}\,{v'}^2 $ + Integer, Parameter :: pke_mflux_phi = keq_off+31 ! :tex: $\frac{1}{2}\mathrm{f}_1\,\overline{v_\phi}\,{v'}^2 $ - Integer, Parameter :: pke_pflux_radial = keq_off+31 ! :tex: $\frac{1}{2}\mathrm{f}_1\,v'_r\,{v'}^2 $ - Integer, Parameter :: pke_pflux_theta = keq_off+32 ! :tex: $\frac{1}{2}\mathrm{f}_1\,v'_\theta\,{v'}^2 $ - Integer, Parameter :: pke_pflux_phi = keq_off+33 ! :tex: $\frac{1}{2}\mathrm{f}_1\,v'_\phi\,{v'}^2 $ + Integer, Parameter :: pke_pflux_radial = keq_off+32 ! :tex: $\frac{1}{2}\mathrm{f}_1\,v'_r\,{v'}^2 $ + Integer, Parameter :: pke_pflux_theta = keq_off+33 ! :tex: $\frac{1}{2}\mathrm{f}_1\,v'_\theta\,{v'}^2 $ + Integer, Parameter :: pke_pflux_phi = keq_off+34 ! :tex: $\frac{1}{2}\mathrm{f}_1\,v'_\phi\,{v'}^2 $ - Integer, Parameter :: visc_flux_r = keq_off+34 ! :tex: $c_5\left[\boldsymbol{v}\cdot\boldsymbol{\mathcal{D}} \right]_r$ - Integer, Parameter :: visc_flux_theta = keq_off+35 ! :tex: $c_5\left[\boldsymbol{v}\cdot\boldsymbol{\mathcal{D}} \right]_\theta $ - Integer, Parameter :: visc_flux_phi = keq_off+36 ! :tex: $c_5\left[\boldsymbol{v}\cdot\boldsymbol{\mathcal{D}} \right]_\phi$ + Integer, Parameter :: visc_flux_r = keq_off+35 ! :tex: $c_5\left[\boldsymbol{v}\cdot\boldsymbol{\mathcal{D}} \right]_r$ + Integer, Parameter :: visc_flux_theta = keq_off+36 ! :tex: $c_5\left[\boldsymbol{v}\cdot\boldsymbol{\mathcal{D}} \right]_\theta $ + Integer, Parameter :: visc_flux_phi = keq_off+37 ! :tex: $c_5\left[\boldsymbol{v}\cdot\boldsymbol{\mathcal{D}} \right]_\phi$ - Integer, Parameter :: visc_fluxpp_r = keq_off+37 ! :tex: $c_5\left[\boldsymbol{v'}\cdot\boldsymbol{\mathcal{D'}} \right]_r$ - Integer, Parameter :: visc_fluxpp_theta = keq_off+38 ! :tex: $c_5\left[\boldsymbol{v'}\cdot\boldsymbol{\mathcal{D'}} \right]_\theta$ - Integer, Parameter :: visc_fluxpp_phi = keq_off+39 ! :tex: $c_5\left[\boldsymbol{v'}\cdot\boldsymbol{\mathcal{D'}} \right]_\phi$ + Integer, Parameter :: visc_fluxpp_r = keq_off+38 ! :tex: $c_5\left[\boldsymbol{v'}\cdot\boldsymbol{\mathcal{D'}} \right]_r$ + Integer, Parameter :: visc_fluxpp_theta = keq_off+39 ! :tex: $c_5\left[\boldsymbol{v'}\cdot\boldsymbol{\mathcal{D'}} \right]_\theta$ + Integer, Parameter :: visc_fluxpp_phi = keq_off+40 ! :tex: $c_5\left[\boldsymbol{v'}\cdot\boldsymbol{\mathcal{D'}} \right]_\phi$ - Integer, Parameter :: visc_fluxmm_r = keq_off+40 ! :tex: $c_5\left[\boldsymbol{\overline{v}}\cdot\boldsymbol{\overline{\mathcal{D}}} \right]_r$ - Integer, Parameter :: visc_fluxmm_theta = keq_off+41 ! :tex: $c_5\left[\boldsymbol{\overline{v}}\cdot\boldsymbol{\overline{\mathcal{D}}} \right]_\theta$ - Integer, Parameter :: visc_fluxmm_phi = keq_off+42 ! :tex: $c_5\left[\boldsymbol{\overline{v}}\cdot\boldsymbol{\overline{\mathcal{D}}} \right]_\phi$ + Integer, Parameter :: visc_fluxmm_r = keq_off+41 ! :tex: $c_5\left[\boldsymbol{\overline{v}}\cdot\boldsymbol{\overline{\mathcal{D}}} \right]_r$ + Integer, Parameter :: visc_fluxmm_theta = keq_off+42 ! :tex: $c_5\left[\boldsymbol{\overline{v}}\cdot\boldsymbol{\overline{\mathcal{D}}} \right]_\theta$ + Integer, Parameter :: visc_fluxmm_phi = keq_off+43 ! :tex: $c_5\left[\boldsymbol{\overline{v}}\cdot\boldsymbol{\overline{\mathcal{D}}} \right]_\phi$ - Integer, Parameter :: press_flux_r = keq_off+43 ! :tex: $-c_3v_r P$ - Integer, Parameter :: press_flux_theta = keq_off+44 ! :tex: $-c_3v_\theta P$ - Integer, Parameter :: press_flux_phi = keq_off+45 ! :tex: $-c_3v_\phi P$ + Integer, Parameter :: press_flux_r = keq_off+44 ! :tex: $-c_3v_r P$ + Integer, Parameter :: press_flux_theta = keq_off+45 ! :tex: $-c_3v_\theta P$ + Integer, Parameter :: press_flux_phi = keq_off+46 ! :tex: $-c_3v_\phi P$ - Integer, Parameter :: press_fluxpp_r = keq_off+43 ! :tex: $-c_3v'_r P'$ - Integer, Parameter :: press_fluxpp_theta = keq_off+44 ! :tex: $-c_3v'_\theta P'$ - Integer, Parameter :: press_fluxpp_phi = keq_off+45 ! :tex: $-c_3v'_\phi P'$ + Integer, Parameter :: press_fluxpp_r = keq_off+47 ! :tex: $-c_3v'_r P'$ + Integer, Parameter :: press_fluxpp_theta = keq_off+48 ! :tex: $-c_3v'_\theta P'$ + Integer, Parameter :: press_fluxpp_phi = keq_off+49 ! :tex: $-c_3v'_\phi P'$ - Integer, Parameter :: press_fluxmm_r = keq_off+43 ! :tex: $-c_3\overline{v_r}\, \overline{P}$ - Integer, Parameter :: press_fluxmm_theta = keq_off+44 ! :tex: $-c_3\overline{v_\theta}\, \overline{P}$ - Integer, Parameter :: press_fluxmm_phi = keq_off+45 ! :tex: $-c_3\overline{v_\phi}\, \overline{P}$ + Integer, Parameter :: press_fluxmm_r = keq_off+50 ! :tex: $-c_3\overline{v_r}\, \overline{P}$ + Integer, Parameter :: press_fluxmm_theta = keq_off+51 ! :tex: $-c_3\overline{v_\theta}\, \overline{P}$ + Integer, Parameter :: press_fluxmm_phi = keq_off+52 ! :tex: $-c_3\overline{v_\phi}\, \overline{P}$ - Integer, Parameter :: production_shear_ke = keq_off+46 ! :tex: $ -- $ - Integer, Parameter :: production_shear_pke = keq_off+47 ! :tex: $ -- $ - Integer, Parameter :: production_shear_mke = keq_off+48 ! :tex: $ -- $ + Integer, Parameter :: production_shear_ke = keq_off+53 ! :tex: $ -- $ + Integer, Parameter :: production_shear_pke = keq_off+54 ! :tex: $ -- $ + Integer, Parameter :: production_shear_mke = keq_off+55 ! :tex: $ -- $ diff --git a/src/Diagnostics/me_equation_codes.F b/src/Diagnostics/me_equation_codes.F index 8b5a49ca..2c1cb241 100644 --- a/src/Diagnostics/me_equation_codes.F +++ b/src/Diagnostics/me_equation_codes.F @@ -27,43 +27,43 @@ Integer, Parameter :: ecrossb_pmp_theta = meq_off+14 ! :tex: $\left[\left(\boldsymbol{v'}\times\boldsymbol{\overline{B}}\right)\times\boldsymbol{B'}\right]_\theta $ Integer, Parameter :: ecrossb_pmp_phi = meq_off+15 ! :tex: $\left[\left(\boldsymbol{v'}\times\boldsymbol{\overline{B}}\right)\times\boldsymbol{B'}\right]_\phi $ - Integer, Parameter :: ecrossb_mpp_r = meq_off+13 ! :tex: $\left[\left(\boldsymbol{\overline{v}}\times\boldsymbol{B'}\right)\times\boldsymbol{B'}\right]_r $ - Integer, Parameter :: ecrossb_mpp_theta = meq_off+14 ! :tex: $\left[\left(\boldsymbol{\overline{v}}\times\boldsymbol{B'}\right)\times\boldsymbol{B'}\right]_\theta $ - Integer, Parameter :: ecrossb_mpp_phi = meq_off+15 ! :tex: $\left[\left(\boldsymbol{\overline{v}}\times\boldsymbol{B'}\right)\times\boldsymbol{B'}\right]_\phi $ + Integer, Parameter :: ecrossb_mpp_r = meq_off+16 ! :tex: $\left[\left(\boldsymbol{\overline{v}}\times\boldsymbol{B'}\right)\times\boldsymbol{B'}\right]_r $ + Integer, Parameter :: ecrossb_mpp_theta = meq_off+17 ! :tex: $\left[\left(\boldsymbol{\overline{v}}\times\boldsymbol{B'}\right)\times\boldsymbol{B'}\right]_\theta $ + Integer, Parameter :: ecrossb_mpp_phi = meq_off+18 ! :tex: $\left[\left(\boldsymbol{\overline{v}}\times\boldsymbol{B'}\right)\times\boldsymbol{B'}\right]_\phi $ !Next, the source terms (ppp etc. order => b dot del cross (v x b) - Integer, Parameter :: induct_work = meq_off+16 ! :tex: $\boldsymbol{B}\cdot\left[\boldsymbol{\nabla}\times\left(\boldsymbol{v}\times\boldsymbol{B}\right)\right] $ - Integer, Parameter :: induct_work_ppp = meq_off+17 ! :tex: $\boldsymbol{B'}\cdot\left[\boldsymbol{\nabla}\times\left(\boldsymbol{v'}\times\boldsymbol{B'}\right)\right] $ - Integer, Parameter :: induct_work_ppm = meq_off+18 ! :tex: $\boldsymbol{B'}\cdot\left[\boldsymbol{\nabla}\times\left(\boldsymbol{v'}\times\boldsymbol{\overline{B}}\right)\right] $ - Integer, Parameter :: induct_work_pmp = meq_off+19 ! :tex: $\boldsymbol{B'}\cdot\left[\boldsymbol{\nabla}\times\left(\boldsymbol{\overline{v}}\times\boldsymbol{B'}\right)\right] $ - Integer, Parameter :: induct_work_mpp = meq_off+20 ! :tex: $\boldsymbol{\overline{B}}\cdot\left[\boldsymbol{\nabla}\times\left(\boldsymbol{v'}\times\boldsymbol{B'}\right)\right] $ - Integer, Parameter :: induct_work_mmm = meq_off+21 ! :tex: $\boldsymbol{\overline{B}}\cdot\left[\boldsymbol{\nabla}\times\left(\boldsymbol{\overline{v}}\times\boldsymbol{\overline{B}}\right)\right] $ + Integer, Parameter :: induct_work = meq_off+19 ! :tex: $\boldsymbol{B}\cdot\left[\boldsymbol{\nabla}\times\left(\boldsymbol{v}\times\boldsymbol{B}\right)\right] $ + Integer, Parameter :: induct_work_ppp = meq_off+20 ! :tex: $\boldsymbol{B'}\cdot\left[\boldsymbol{\nabla}\times\left(\boldsymbol{v'}\times\boldsymbol{B'}\right)\right] $ + Integer, Parameter :: induct_work_ppm = meq_off+21 ! :tex: $\boldsymbol{B'}\cdot\left[\boldsymbol{\nabla}\times\left(\boldsymbol{v'}\times\boldsymbol{\overline{B}}\right)\right] $ + Integer, Parameter :: induct_work_pmp = meq_off+22 ! :tex: $\boldsymbol{B'}\cdot\left[\boldsymbol{\nabla}\times\left(\boldsymbol{\overline{v}}\times\boldsymbol{B'}\right)\right] $ + Integer, Parameter :: induct_work_mpp = meq_off+23 ! :tex: $\boldsymbol{\overline{B}}\cdot\left[\boldsymbol{\nabla}\times\left(\boldsymbol{v'}\times\boldsymbol{B'}\right)\right] $ + Integer, Parameter :: induct_work_mmm = meq_off+24 ! :tex: $\boldsymbol{\overline{B}}\cdot\left[\boldsymbol{\nabla}\times\left(\boldsymbol{\overline{v}}\times\boldsymbol{\overline{B}}\right)\right] $ - Integer, Parameter :: ishear_work = meq_off+22 ! :tex: $\boldsymbol{B}\cdot\left[\boldsymbol{B}\cdot\boldsymbol{\nabla}\boldsymbol{v}\right] $ - Integer, Parameter :: iadvec_work = meq_off+23 ! :tex: $-\boldsymbol{B}\cdot\left[\boldsymbol{v}\cdot\boldsymbol{\nabla}\boldsymbol{B}\right] $ - Integer, Parameter :: icomp_work = meq_off+24 ! :tex: $-\boldsymbol{B}\cdot\left(\boldsymbol{\nabla}\cdot\boldsymbol{v} \right)\boldsymbol{B}$ + Integer, Parameter :: ishear_work = meq_off+25 ! :tex: $\boldsymbol{B}\cdot\left[\boldsymbol{B}\cdot\boldsymbol{\nabla}\boldsymbol{v}\right] $ + Integer, Parameter :: iadvec_work = meq_off+26 ! :tex: $-\boldsymbol{B}\cdot\left[\boldsymbol{v}\cdot\boldsymbol{\nabla}\boldsymbol{B}\right] $ + Integer, Parameter :: icomp_work = meq_off+27 ! :tex: $-\boldsymbol{B}\cdot\left(\boldsymbol{\nabla}\cdot\boldsymbol{v} \right)\boldsymbol{B}$ - Integer, Parameter :: ishear_work_pmp = meq_off+25 ! :tex: $\boldsymbol{B'}\cdot\left[\boldsymbol{\overline{B}}\cdot\boldsymbol{\nabla}\boldsymbol{v'}\right] $ - Integer, Parameter :: iadvec_work_pmp = meq_off+26 ! :tex: $-\boldsymbol{B'}\cdot\left[\boldsymbol{\overline{v}}\cdot\boldsymbol{\nabla}\boldsymbol{B'}\right] $ - Integer, Parameter :: icomp_work_pmp = meq_off+27 ! :tex: $-\boldsymbol{B'}\cdot\left(\boldsymbol{\nabla}\cdot\boldsymbol{\overline{v}} \right)\boldsymbol{B'} $ + Integer, Parameter :: ishear_work_pmp = meq_off+28 ! :tex: $\boldsymbol{B'}\cdot\left[\boldsymbol{\overline{B}}\cdot\boldsymbol{\nabla}\boldsymbol{v'}\right] $ + Integer, Parameter :: iadvec_work_pmp = meq_off+29 ! :tex: $-\boldsymbol{B'}\cdot\left[\boldsymbol{\overline{v}}\cdot\boldsymbol{\nabla}\boldsymbol{B'}\right] $ + Integer, Parameter :: icomp_work_pmp = meq_off+30 ! :tex: $-\boldsymbol{B'}\cdot\left(\boldsymbol{\nabla}\cdot\boldsymbol{\overline{v}} \right)\boldsymbol{B'} $ - Integer, Parameter :: ishear_work_ppm = meq_off+25 ! :tex: $\boldsymbol{B'}\cdot\left[\boldsymbol{B'}\cdot\boldsymbol{\nabla}\boldsymbol{\overline{v}}\right] $ - Integer, Parameter :: iadvec_work_ppm = meq_off+26 ! :tex: $-\boldsymbol{B'}\cdot\left[\boldsymbol{v'}\cdot\boldsymbol{\nabla}\boldsymbol{\overline{B}}\right] $ - Integer, Parameter :: icomp_work_ppm = meq_off+27 ! :tex: $-\boldsymbol{B'}\cdot\left(\boldsymbol{\nabla}\cdot\boldsymbol{v'} \right)\boldsymbol{\overline{B}} $ + Integer, Parameter :: ishear_work_ppm = meq_off+31 ! :tex: $\boldsymbol{B'}\cdot\left[\boldsymbol{B'}\cdot\boldsymbol{\nabla}\boldsymbol{\overline{v}}\right] $ + Integer, Parameter :: iadvec_work_ppm = meq_off+32 ! :tex: $-\boldsymbol{B'}\cdot\left[\boldsymbol{v'}\cdot\boldsymbol{\nabla}\boldsymbol{\overline{B}}\right] $ + Integer, Parameter :: icomp_work_ppm = meq_off+33 ! :tex: $-\boldsymbol{B'}\cdot\left(\boldsymbol{\nabla}\cdot\boldsymbol{v'} \right)\boldsymbol{\overline{B}} $ - Integer, Parameter :: ishear_work_mmm = meq_off+28 ! :tex: $\boldsymbol{\overline{B}}\cdot\left[\boldsymbol{\overline{B}}\cdot\boldsymbol{\nabla}\,\boldsymbol{\overline{v}}\right] $ - Integer, Parameter :: iadvec_work_mmm = meq_off+29 ! :tex: $-\boldsymbol{\overline{B}}\cdot\left[\boldsymbol{\overline{v}}\cdot\boldsymbol{\nabla}\boldsymbol{\overline{B}}\right] $ - Integer, Parameter :: icomp_work_mmm = meq_off+30 ! :tex: $-\boldsymbol{\overline{B}}\cdot\left(\boldsymbol{\nabla}\cdot\boldsymbol{\overline{v}} \right)\boldsymbol{\overline{B}} $ + Integer, Parameter :: ishear_work_mmm = meq_off+34 ! :tex: $\boldsymbol{\overline{B}}\cdot\left[\boldsymbol{\overline{B}}\cdot\boldsymbol{\nabla}\,\boldsymbol{\overline{v}}\right] $ + Integer, Parameter :: iadvec_work_mmm = meq_off+35 ! :tex: $-\boldsymbol{\overline{B}}\cdot\left[\boldsymbol{\overline{v}}\cdot\boldsymbol{\nabla}\boldsymbol{\overline{B}}\right] $ + Integer, Parameter :: icomp_work_mmm = meq_off+36 ! :tex: $-\boldsymbol{\overline{B}}\cdot\left(\boldsymbol{\nabla}\cdot\boldsymbol{\overline{v}} \right)\boldsymbol{\overline{B}} $ - Integer, Parameter :: ishear_work_mpp = meq_off+31 ! :tex: $\boldsymbol{\overline{B}}\cdot\left[\boldsymbol{B'}\cdot\boldsymbol{\nabla}\boldsymbol{v'}\right] $ - Integer, Parameter :: iadvec_work_mpp = meq_off+32 ! :tex: $-\boldsymbol{\overline{B}}\cdot\left[\boldsymbol{v'}\cdot\boldsymbol{\nabla}\boldsymbol{B'}\right] $ - Integer, Parameter :: icomp_work_mpp = meq_off+33 ! :tex: $-\boldsymbol{\overline{B}}\cdot\left(\boldsymbol{\nabla}\cdot\boldsymbol{v'} \right)\boldsymbol{B'} $ + Integer, Parameter :: ishear_work_mpp = meq_off+37 ! :tex: $\boldsymbol{\overline{B}}\cdot\left[\boldsymbol{B'}\cdot\boldsymbol{\nabla}\boldsymbol{v'}\right] $ + Integer, Parameter :: iadvec_work_mpp = meq_off+38 ! :tex: $-\boldsymbol{\overline{B}}\cdot\left[\boldsymbol{v'}\cdot\boldsymbol{\nabla}\boldsymbol{B'}\right] $ + Integer, Parameter :: icomp_work_mpp = meq_off+39 ! :tex: $-\boldsymbol{\overline{B}}\cdot\left(\boldsymbol{\nabla}\cdot\boldsymbol{v'} \right)\boldsymbol{B'} $ - Integer, Parameter :: ishear_work_ppp = meq_off+34 ! :tex: $\boldsymbol{B'}\cdot\left[\boldsymbol{B'}\cdot\boldsymbol{\nabla}\boldsymbol{v'}\right] $ - Integer, Parameter :: iadvec_work_ppp = meq_off+35 ! :tex: $-\boldsymbol{B'}\cdot\left[\boldsymbol{v'}\cdot\boldsymbol{\nabla}\boldsymbol{B'}\right] $ - Integer, Parameter :: icomp_work_ppp = meq_off+36 ! :tex: $-\boldsymbol{B'}\cdot\left(\boldsymbol{\nabla}\cdot\boldsymbol{v'} \right)\boldsymbol{B'} $ + Integer, Parameter :: ishear_work_ppp = meq_off+40 ! :tex: $\boldsymbol{B'}\cdot\left[\boldsymbol{B'}\cdot\boldsymbol{\nabla}\boldsymbol{v'}\right] $ + Integer, Parameter :: iadvec_work_ppp = meq_off+41 ! :tex: $-\boldsymbol{B'}\cdot\left[\boldsymbol{v'}\cdot\boldsymbol{\nabla}\boldsymbol{B'}\right] $ + Integer, Parameter :: icomp_work_ppp = meq_off+42 ! :tex: $-\boldsymbol{B'}\cdot\left(\boldsymbol{\nabla}\cdot\boldsymbol{v'} \right)\boldsymbol{B'} $ - Integer, Parameter :: idiff_work = meq_off+37 ! :tex: $-c_7\boldsymbol{B}\cdot\left[ \boldsymbol{\nabla}\times\left(\mathrm{f}_7\boldsymbol{\nabla}\times\boldsymbol{B}\right)\right] $ - Integer, Parameter :: idiff_work_pp = meq_off+38 ! :tex: $-c_7\boldsymbol{B'}\cdot\left[ \boldsymbol{\nabla}\times\left(\mathrm{f}_7\boldsymbol{\nabla}\times\boldsymbol{B'}\right)\right] $ - Integer, Parameter :: idiff_work_mm = meq_off+39 ! :tex: $-c_7\boldsymbol{\overline{B}}\cdot\left[ \boldsymbol{\nabla}\times\left(\mathrm{f}_7\boldsymbol{\nabla}\times\boldsymbol{\overline{B}}\right)\right] $ + Integer, Parameter :: idiff_work = meq_off+43 ! :tex: $-c_7\boldsymbol{B}\cdot\left[ \boldsymbol{\nabla}\times\left(\mathrm{f}_7\boldsymbol{\nabla}\times\boldsymbol{B}\right)\right] $ + Integer, Parameter :: idiff_work_pp = meq_off+44 ! :tex: $-c_7\boldsymbol{B'}\cdot\left[ \boldsymbol{\nabla}\times\left(\mathrm{f}_7\boldsymbol{\nabla}\times\boldsymbol{B'}\right)\right] $ + Integer, Parameter :: idiff_work_mm = meq_off+45 ! :tex: $-c_7\boldsymbol{\overline{B}}\cdot\left[ \boldsymbol{\nabla}\times\left(\mathrm{f}_7\boldsymbol{\nabla}\times\boldsymbol{\overline{B}}\right)\right] $ diff --git a/src/Diagnostics/thermal_equation_codes.F b/src/Diagnostics/thermal_equation_codes.F index 8336f6cb..e06d25b7 100644 --- a/src/Diagnostics/thermal_equation_codes.F +++ b/src/Diagnostics/thermal_equation_codes.F @@ -44,72 +44,72 @@ ! Heat sources... ! Q - Integer, Parameter :: vol_heat_flux = te_eq_off+31 ! :tex: $F_Q(r)$ - Integer, Parameter :: vol_heating = te_eq_off+32 ! :tex: $\mathrm{f}_6(r)$ + Integer, Parameter :: vol_heat_flux = te_eq_off+33 ! :tex: $F_Q(r)$ + Integer, Parameter :: vol_heating = te_eq_off+34 ! :tex: $\mathrm{f}_6(r)$ ! Viscous Heating - Integer, Parameter :: visc_heating = te_eq_off+33 ! :tex: $c_5\Phi(r,\theta,\phi)$ + Integer, Parameter :: visc_heating = te_eq_off+35 ! :tex: $c_5\Phi(r,\theta,\phi)$ ! Ohmic Heating - Integer, Parameter :: ohmic_heat = te_eq_off+34 ! :tex: $ \mathrm{f}_7c_4\left( {\boldsymbol{\mathcal{J}'}}\cdot{\boldsymbol{\mathcal{J}'}} \right)$ - Integer, Parameter :: ohmic_heat_pp = te_eq_off+35 ! :tex: $ \mathrm{f}_7c_4\left( {\boldsymbol{\mathcal{J}'}}\cdot{\boldsymbol{\mathcal{J}'}} \right)$ - Integer, Parameter :: ohmic_heat_pm = te_eq_off+36 ! :tex: $\mathrm{f}_7c_4\left( \overline{\boldsymbol{\mathcal{J}}}\cdot\overline{\boldsymbol{\mathcal{J}}} \right)$ - Integer, Parameter :: ohmic_heat_mm = te_eq_off+37 ! :tex: $\mathrm{f}_7c_4\left( \overline{\boldsymbol{\mathcal{J}}}\cdot{\boldsymbol{\mathcal{J}'}} \right)$ + Integer, Parameter :: ohmic_heat = te_eq_off+36 ! :tex: $ \mathrm{f}_7c_4\left( {\boldsymbol{\mathcal{J}'}}\cdot{\boldsymbol{\mathcal{J}'}} \right)$ + Integer, Parameter :: ohmic_heat_pp = te_eq_off+37 ! :tex: $ \mathrm{f}_7c_4\left( {\boldsymbol{\mathcal{J}'}}\cdot{\boldsymbol{\mathcal{J}'}} \right)$ + Integer, Parameter :: ohmic_heat_pm = te_eq_off+38 ! :tex: $\mathrm{f}_7c_4\left( \overline{\boldsymbol{\mathcal{J}}}\cdot\overline{\boldsymbol{\mathcal{J}}} \right)$ + Integer, Parameter :: ohmic_heat_mm = te_eq_off+39 ! :tex: $\mathrm{f}_7c_4\left( \overline{\boldsymbol{\mathcal{J}}}\cdot{\boldsymbol{\mathcal{J}'}} \right)$ ! Advective Fluxes (heat) - Integer, Parameter :: rhot_vr_s = te_eq_off+38 ! :tex: $\mathrm{f}_1\mathrm{f}_4v_r\Theta$ - Integer, Parameter :: rhot_vrp_sp = te_eq_off+39 ! :tex: $\mathrm{f}_1\mathrm{f}_4v_r'\Theta'$ - Integer, Parameter :: rhot_vrp_sm = te_eq_off+40 ! :tex: $\mathrm{f}_1\mathrm{f}_4v_r'\overline{\Theta}$ - Integer, Parameter :: rhot_vrm_sp = te_eq_off+41 ! :tex: $\mathrm{f}_1\mathrm{f}_4\,\overline{v_r}\Theta'$ - Integer, Parameter :: rhot_vrm_sm = te_eq_off+42 ! :tex: $\mathrm{f}_1\mathrm{f}_4\,\overline{v_r}\,\overline{\Theta}$ + Integer, Parameter :: rhot_vr_s = te_eq_off+40 ! :tex: $\mathrm{f}_1\mathrm{f}_4v_r\Theta$ + Integer, Parameter :: rhot_vrp_sp = te_eq_off+41 ! :tex: $\mathrm{f}_1\mathrm{f}_4v_r'\Theta'$ + Integer, Parameter :: rhot_vrp_sm = te_eq_off+42 ! :tex: $\mathrm{f}_1\mathrm{f}_4v_r'\overline{\Theta}$ + Integer, Parameter :: rhot_vrm_sp = te_eq_off+43 ! :tex: $\mathrm{f}_1\mathrm{f}_4\,\overline{v_r}\Theta'$ + Integer, Parameter :: rhot_vrm_sm = te_eq_off+44 ! :tex: $\mathrm{f}_1\mathrm{f}_4\,\overline{v_r}\,\overline{\Theta}$ - Integer, Parameter :: rhot_vt_s = te_eq_off+43 ! :tex: $\mathrm{f}_1\mathrm{f}_4v_\theta \Theta$ - Integer, Parameter :: rhot_vtp_sp = te_eq_off+44 ! :tex: $\mathrm{f}_1\mathrm{f}_4v_\theta'\Theta'$ - Integer, Parameter :: rhot_vtp_sm = te_eq_off+45 ! :tex: $\mathrm{f}_1\mathrm{f}_4v_\theta'\overline{\Theta}$ - Integer, Parameter :: rhot_vtm_sp = te_eq_off+46 ! :tex: $\mathrm{f}_1\mathrm{f}_4\,\overline{v_\theta}\Theta'$ - Integer, Parameter :: rhot_vtm_sm = te_eq_off+47 ! :tex: $\mathrm{f}_1\mathrm{f}_4\,\overline{v_\theta}\,\overline{\Theta}$ + Integer, Parameter :: rhot_vt_s = te_eq_off+45 ! :tex: $\mathrm{f}_1\mathrm{f}_4v_\theta \Theta$ + Integer, Parameter :: rhot_vtp_sp = te_eq_off+46 ! :tex: $\mathrm{f}_1\mathrm{f}_4v_\theta'\Theta'$ + Integer, Parameter :: rhot_vtp_sm = te_eq_off+47 ! :tex: $\mathrm{f}_1\mathrm{f}_4v_\theta'\overline{\Theta}$ + Integer, Parameter :: rhot_vtm_sp = te_eq_off+48 ! :tex: $\mathrm{f}_1\mathrm{f}_4\,\overline{v_\theta}\Theta'$ + Integer, Parameter :: rhot_vtm_sm = te_eq_off+49 ! :tex: $\mathrm{f}_1\mathrm{f}_4\,\overline{v_\theta}\,\overline{\Theta}$ - Integer, Parameter :: rhot_vp_s = te_eq_off+48 ! :tex: $\mathrm{f}_1\mathrm{f}_4v_\phi \Theta$ - Integer, Parameter :: rhot_vpp_sp = te_eq_off+49 ! :tex: $\mathrm{f}_1\mathrm{f}_4v_\phi'\Theta'$ - Integer, Parameter :: rhot_vpp_sm = te_eq_off+50 ! :tex: $\mathrm{f}_1\mathrm{f}_4v_\phi'\overline{\Theta}$ - Integer, Parameter :: rhot_vpm_sp = te_eq_off+51 ! :tex: $\mathrm{f}_1\mathrm{f}_4\,\overline{v_\phi}\Theta'$ - Integer, Parameter :: rhot_vpm_sm = te_eq_off+52 ! :tex: $\mathrm{f}_1\mathrm{f}_4\,\overline{v_\phi}\,\overline{\Theta}$ + Integer, Parameter :: rhot_vp_s = te_eq_off+50 ! :tex: $\mathrm{f}_1\mathrm{f}_4v_\phi \Theta$ + Integer, Parameter :: rhot_vpp_sp = te_eq_off+51 ! :tex: $\mathrm{f}_1\mathrm{f}_4v_\phi'\Theta'$ + Integer, Parameter :: rhot_vpp_sm = te_eq_off+52 ! :tex: $\mathrm{f}_1\mathrm{f}_4v_\phi'\overline{\Theta}$ + Integer, Parameter :: rhot_vpm_sp = te_eq_off+53 ! :tex: $\mathrm{f}_1\mathrm{f}_4\,\overline{v_\phi}\Theta'$ + Integer, Parameter :: rhot_vpm_sm = te_eq_off+54 ! :tex: $\mathrm{f}_1\mathrm{f}_4\,\overline{v_\phi}\,\overline{\Theta}$ ! Advective Fluxes (enthalpy -- thermo-mechanical) - Integer, Parameter :: enth_flux_r = te_eq_off+53 ! :tex: $c_P \mathrm{f}_1 v_r T$ - Integer, Parameter :: enth_flux_theta = te_eq_off+54 ! :tex: $c_P \mathrm{f}_1 v_\theta T$ - Integer, Parameter :: enth_flux_phi = te_eq_off+55 ! :tex: $c_P \mathrm{f}_1 v_\phi T$ + Integer, Parameter :: enth_flux_r = te_eq_off+55 ! :tex: $c_P \mathrm{f}_1 v_r T$ + Integer, Parameter :: enth_flux_theta = te_eq_off+56 ! :tex: $c_P \mathrm{f}_1 v_\theta T$ + Integer, Parameter :: enth_flux_phi = te_eq_off+57 ! :tex: $c_P \mathrm{f}_1 v_\phi T$ - Integer, Parameter :: enth_flux_rpp = te_eq_off+56 ! :tex: $c_P \mathrm{f}_1 v_r' T'$ - Integer, Parameter :: enth_flux_thetapp = te_eq_off+57 ! :tex: $c_P \mathrm{f}_1 v_\theta' T'$ - Integer, Parameter :: enth_flux_phipp = te_eq_off+58 ! :tex: $c_P \mathrm{f}_1 v_\phi' T'$ + Integer, Parameter :: enth_flux_rpp = te_eq_off+58 ! :tex: $c_P \mathrm{f}_1 v_r' T'$ + Integer, Parameter :: enth_flux_thetapp = te_eq_off+59 ! :tex: $c_P \mathrm{f}_1 v_\theta' T'$ + Integer, Parameter :: enth_flux_phipp = te_eq_off+60 ! :tex: $c_P \mathrm{f}_1 v_\phi' T'$ - Integer, Parameter :: enth_flux_rpm = te_eq_off+59 ! :tex: $c_P \mathrm{f}_1 v_r'\, \overline{T}$ - Integer, Parameter :: enth_flux_thetapm = te_eq_off+60 ! :tex: $c_P \mathrm{f}_1 v_\theta'\, \overline{T}$ - Integer, Parameter :: enth_flux_phipm = te_eq_off+61 ! :tex: $c_P \mathrm{f}_1 v_\phi'\, \overline{T}$ + Integer, Parameter :: enth_flux_rpm = te_eq_off+61 ! :tex: $c_P \mathrm{f}_1 v_r'\, \overline{T}$ + Integer, Parameter :: enth_flux_thetapm = te_eq_off+62 ! :tex: $c_P \mathrm{f}_1 v_\theta'\, \overline{T}$ + Integer, Parameter :: enth_flux_phipm = te_eq_off+63 ! :tex: $c_P \mathrm{f}_1 v_\phi'\, \overline{T}$ - Integer, Parameter :: enth_flux_rmp = te_eq_off+62 ! :tex: $c_P \mathrm{f}_1\, \overline{v_r}\, T'$ - Integer, Parameter :: enth_flux_thetamp = te_eq_off+63 ! :tex: $c_P \mathrm{f}_1\, \overline{v_\theta}\, T'$ - Integer, Parameter :: enth_flux_phimp = te_eq_off+64 ! :tex: $c_P \mathrm{f}_1\, \overline{v_\phi}\, T'$ + Integer, Parameter :: enth_flux_rmp = te_eq_off+64 ! :tex: $c_P \mathrm{f}_1\, \overline{v_r}\, T'$ + Integer, Parameter :: enth_flux_thetamp = te_eq_off+65 ! :tex: $c_P \mathrm{f}_1\, \overline{v_\theta}\, T'$ + Integer, Parameter :: enth_flux_phimp = te_eq_off+66 ! :tex: $c_P \mathrm{f}_1\, \overline{v_\phi}\, T'$ - Integer, Parameter :: enth_flux_rmm = te_eq_off+65 ! :tex: $c_P \mathrm{f}_1\, \overline{v_r}\, \overline{T}$ - Integer, Parameter :: enth_flux_thetamm = te_eq_off+66 ! :tex: $c_P \mathrm{f}_1\, \overline{v_\theta}\, \overline{T}$ - Integer, Parameter :: enth_flux_phimm = te_eq_off+67 ! :tex: $c_P \mathrm{f}_1\, \overline{v_\phi}\, \overline{T}$ + Integer, Parameter :: enth_flux_rmm = te_eq_off+67 ! :tex: $c_P \mathrm{f}_1\, \overline{v_r}\, \overline{T}$ + Integer, Parameter :: enth_flux_thetamm = te_eq_off+68 ! :tex: $c_P \mathrm{f}_1\, \overline{v_\theta}\, \overline{T}$ + Integer, Parameter :: enth_flux_phimm = te_eq_off+69 ! :tex: $c_P \mathrm{f}_1\, \overline{v_\phi}\, \overline{T}$ ! Diffusive Fluxes - Integer, Parameter :: cond_flux_r = te_eq_off+68 ! :tex: $-c_6\mathrm{f}_1\mathrm{f}_4\mathrm{f}_5\frac{\partial \Theta}{\partial r}$ - Integer, Parameter :: cond_flux_theta = te_eq_off+69 ! :tex: $-c_6\mathrm{f}_1\mathrm{f}_4\mathrm{f}_5\frac{1}{r}\frac{\partial \Theta}{\partial \theta}$ - Integer, Parameter :: cond_flux_phi = te_eq_off+70 ! :tex: $-c_6\mathrm{f}_1\mathrm{f}_4\mathrm{f}_5\frac{1}{r \mathrm{sin}\theta}\frac{\partial \Theta}{\partial \phi}$ + Integer, Parameter :: cond_flux_r = te_eq_off+70 ! :tex: $-c_6\mathrm{f}_1\mathrm{f}_4\mathrm{f}_5\frac{\partial \Theta}{\partial r}$ + Integer, Parameter :: cond_flux_theta = te_eq_off+71 ! :tex: $-c_6\mathrm{f}_1\mathrm{f}_4\mathrm{f}_5\frac{1}{r}\frac{\partial \Theta}{\partial \theta}$ + Integer, Parameter :: cond_flux_phi = te_eq_off+72 ! :tex: $-c_6\mathrm{f}_1\mathrm{f}_4\mathrm{f}_5\frac{1}{r \mathrm{sin}\theta}\frac{\partial \Theta}{\partial \phi}$ - Integer, Parameter :: cond_fluxp_r = te_eq_off+71 ! :tex: $-c_6\mathrm{f}_1\mathrm{f}_4\mathrm{f}_5\frac{\partial \Theta'}{\partial r}$ - Integer, Parameter :: cond_fluxp_theta = te_eq_off+72 ! :tex: $-c_6\mathrm{f}_1\mathrm{f}_4\mathrm{f}_5\frac{1}{r}\frac{\partial \Theta'}{\partial \theta}$ - Integer, Parameter :: cond_fluxp_phi = te_eq_off+73 ! :tex: $-c_6\mathrm{f}_1\mathrm{f}_4\mathrm{f}_5\frac{1}{r \mathrm{sin}\theta}\frac{\partial \Theta'}{\partial \phi}$ + Integer, Parameter :: cond_fluxp_r = te_eq_off+73 ! :tex: $-c_6\mathrm{f}_1\mathrm{f}_4\mathrm{f}_5\frac{\partial \Theta'}{\partial r}$ + Integer, Parameter :: cond_fluxp_theta = te_eq_off+74 ! :tex: $-c_6\mathrm{f}_1\mathrm{f}_4\mathrm{f}_5\frac{1}{r}\frac{\partial \Theta'}{\partial \theta}$ + Integer, Parameter :: cond_fluxp_phi = te_eq_off+75 ! :tex: $-c_6\mathrm{f}_1\mathrm{f}_4\mathrm{f}_5\frac{1}{r \mathrm{sin}\theta}\frac{\partial \Theta'}{\partial \phi}$ - Integer, Parameter :: cond_fluxm_r = te_eq_off+74 ! :tex: $-c_6\mathrm{f}_1\mathrm{f}_4\mathrm{f}_5\frac{\partial \overline{\Theta}}{\partial r}$ - Integer, Parameter :: cond_fluxm_theta = te_eq_off+75 ! :tex: $-c_6\mathrm{f}_1\mathrm{f}_4\mathrm{f}_5\frac{1}{r}\frac{\partial \overline{\Theta}}{\partial \theta}$ - Integer, Parameter :: cond_fluxm_phi = te_eq_off+76 ! :tex: $-c_6\mathrm{f}_1\mathrm{f}_4\mathrm{f}_5\frac{1}{r \mathrm{sin}\theta}\frac{\partial \overline{\Theta}}{\partial \phi}$ + Integer, Parameter :: cond_fluxm_r = te_eq_off+76 ! :tex: $-c_6\mathrm{f}_1\mathrm{f}_4\mathrm{f}_5\frac{\partial \overline{\Theta}}{\partial r}$ + Integer, Parameter :: cond_fluxm_theta = te_eq_off+77 ! :tex: $-c_6\mathrm{f}_1\mathrm{f}_4\mathrm{f}_5\frac{1}{r}\frac{\partial \overline{\Theta}}{\partial \theta}$ + Integer, Parameter :: cond_fluxm_phi = te_eq_off+78 ! :tex: $-c_6\mathrm{f}_1\mathrm{f}_4\mathrm{f}_5\frac{1}{r \mathrm{sin}\theta}\frac{\partial \overline{\Theta}}{\partial \phi}$ diff --git a/src/Include/indices.F b/src/Include/indices.F new file mode 100644 index 00000000..aa9fae7e --- /dev/null +++ b/src/Include/indices.F @@ -0,0 +1,18 @@ +#define RHSP wsp%p3b +#define DO_IDX Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max ;Do k = 1, n_phi +#define END_DO enddo; enddo; enddo +#define IDX k,r,t +#define FIELDSP wsp%p3a +#define IDXM r,t +#define DO_IDX2 Do mp = my_mp%min, my_mp%max; m = m_values(mp); Do imi = 1, 2; Do r = my_r%min, my_r%max +#define IDX2 m:l_max,r,imi +#define SBUFFA wsp%s2a(mp)%data +#define SBUFFB wsp%s2b(mp)%data +#define ASBUFFA cobuffer%s2a(mp)%data +#define DO_PSI Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max ;Do k = 1, n_phi +#define DO_PSI2 Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max +#define END_DO2 enddo; enddo +#define PSI k,r,t +#define PSI2 r,t +#define DDBUFF d2buffer%p3a + diff --git a/src/math_layer/Fourier_Transform.F90 b/src/math_layer/Fourier_Transform.F90 index 674580a1..df8fe3c0 100755 --- a/src/math_layer/Fourier_Transform.F90 +++ b/src/math_layer/Fourier_Transform.F90 @@ -23,7 +23,7 @@ Subroutine Initialize_FFTs() !iret = 0 means an error when using normal FFTW, but for MKL ! This routine is a wrapper that does nothing. !write(6,*)"iret is: ", iret - + ! comment !write(6,*)"FFTW planning with nthreads: ", nthread call dfftw_plan_with_nthreads(nthread) Endif @@ -69,15 +69,7 @@ Subroutine r2c_ip4D_fftw(x,plan,rsc) call dfftw_execute(fresh_plan) call dfftw_destroy_plan(fresh_plan) Endif - If (present(rsc)) Then - ! FUTURE OPTIMIZATION: wrap this weighting into the legendre polynomial arrays - ! This ensures that Asin(mx) in physical space gives power A for m in spectral space - ! Scaling is based on size of array & m = zero mode gets adjusted scaling since the fft is in place - If(rsc) Then - x(3:,:,:,:) = x(3:,:,:,:)/(n/2) - x(1,:,:,:) = x(1,:,:,:)/n - Endif - Endif + End Subroutine r2c_ip4D_fftw Subroutine c2r_ip4D_fftw(x,plan,rsc) @@ -92,10 +84,7 @@ Subroutine c2r_ip4D_fftw(x,plan,rsc) Integer :: inembed, istride, idist Integer :: onembed, ostride, odist Integer :: xshape(4) - If (present(rsc)) Then - ! rescale m = 0 before going in - again, should wrap this into legendre weights at some point - If(rsc) x(1,:,:,:) = x(1,:,:,:)*2 - Endif + If (present(plan)) Then ! Plan exists - x assumed to keep memory location call dfftw_execute(plan) @@ -123,8 +112,6 @@ Subroutine c2r_ip4D_fftw(x,plan,rsc) call dfftw_execute(fresh_plan) call dfftw_destroy_plan(fresh_plan) Endif - If (present(rsc)) Then - If(rsc) x = x/2 - Endif + End Subroutine c2r_ip4D_fftw End Module Fourier_Transform diff --git a/src/math_layer/Legendre_Polynomials.F90 b/src/math_layer/Legendre_Polynomials.F90 index 6e68b2da..69047a0a 100755 --- a/src/math_layer/Legendre_Polynomials.F90 +++ b/src/math_layer/Legendre_Polynomials.F90 @@ -243,9 +243,18 @@ Subroutine Parity_Resort(m) Integer, Intent(In) :: m Integer :: l, indeven, indodd,partest, i Real*16 :: renorm, tmp + Real*16 :: PTS_normalization, STP_normalization ! Resort the p_lms into even and odd arrays - + ! We wrap a normalization factor, related to the FFT + ! into the Legendre weights. + If (m_values(m) .eq. 0) Then + PTS_normalization = 1.0d0/(2.0d0*n_theta) + STP_normalization = 1.0d0 + Else + PTS_normalization = 1.0d0/(n_theta) + STP_normalization = 0.5d0 + Endif n_l_even(m) = 0 n_l_odd(m) = 0 Do l = m_values(m), l_max @@ -280,8 +289,8 @@ Subroutine Parity_Resort(m) Do i = 1, n_theta/2 renorm = 2.0q0*PiQuad*gl_weights(i) tmp = p_lmq(m)%data(i,l)*renorm - ip_lm_odd(m)%data(i,indodd) = tmp - p_lm_odd(m)%data(indodd,i) = p_lmq(m)%data(i,l) + ip_lm_odd(m)%data(i,indodd) = tmp*PTS_normalization + p_lm_odd(m)%data(indodd,i) = p_lmq(m)%data(i,l)*STP_normalization Enddo indodd = indodd +1 @@ -291,8 +300,8 @@ Subroutine Parity_Resort(m) Do i = 1, n_theta/2 renorm = 2.0q0*PiQuad*gl_weights(i) tmp = p_lmq(m)%data(i,l)*renorm - ip_lm_even(m)%data(i,indeven) = tmp - p_lm_even(m)%data(indeven,i) = p_lmq(m)%data(i,l) + ip_lm_even(m)%data(i,indeven) = tmp*PTS_normalization + p_lm_even(m)%data(indeven,i) = p_lmq(m)%data(i,l)*STP_normalization Enddo indeven = indeven+1 Endif @@ -386,3 +395,4 @@ Subroutine compute_factorial_ratio(m,ratio) Enddo End Subroutine compute_factorial_ratio End Module Legendre_Polynomials + diff --git a/src/physics/Checkpointing.F90 b/src/physics/Checkpointing.F90 index 00a2b305..63229567 100755 --- a/src/physics/Checkpointing.F90 +++ b/src/physics/Checkpointing.F90 @@ -1,39 +1,39 @@ Module Checkpointing Use Timers, Only : stopwatch - Use ProblemSize - Use Parallel_Framework + Use ProblemSize + Use Parallel_Framework Use Spherical_Buffer - Use Linear_Solve, Only : get_all_rhs - Use SendReceive - Use ISendReceive - Use Controls - Use MPI_BASE + Use Linear_Solve, Only : get_all_rhs + Use SendReceive + Use ISendReceive + Use Controls + Use MPI_BASE Use Chebyshev_Polynomials_Alt Use BufferedOutput - ! Simple Checkpointing Module - ! Uses MPI-IO to split writing of files amongst rank zero processes from each row - Implicit None - Type(SphericalBuffer) :: chktmp, chktmp2 - Integer, private :: numfields = 4 ! 6 for MHD - Integer,private,Allocatable :: mode_count(:) - Integer,private :: nlm_total, checkpoint_tag = 425 - Integer, Allocatable, Private :: lmstart(:) - Integer :: buffsize, buffsize2 ! These cannot be long (8 byte) - MPI-IO goes haywire. - Integer*8, Private :: my_check_disp,full_disp ! These need to be long ! for writing checkpoints - Integer*8, Private :: my_check_disp2 - Integer*8, Private :: my_in_disp, full_in_disp ! for reading checkpoints - Character*3 :: wchar = 'W', pchar = 'P', tchar = 'T', zchar = 'Z', achar = 'A', cchar = 'C' + ! Simple Checkpointing Module + ! Uses MPI-IO to split writing of files amongst rank zero processes from each row + Implicit None + Type(SphericalBuffer) :: chktmp, chktmp2 + Integer, private :: numfields = 4 ! 6 for MHD + Integer,private,Allocatable :: mode_count(:) + Integer,private :: nlm_total, checkpoint_tag = 425 + Integer, Allocatable, Private :: lmstart(:) + Integer :: buffsize, buffsize2 ! These cannot be long (8 byte) - MPI-IO goes haywire. + Integer*8, Private :: my_check_disp,full_disp ! These need to be long ! for writing checkpoints + Integer*8, Private :: my_check_disp2 + Integer*8, Private :: my_in_disp, full_in_disp ! for reading checkpoints + Character*3 :: wchar = 'W', pchar = 'P', tchar = 'T', zchar = 'Z', achar = 'A', cchar = 'C' Character*120 :: checkpoint_prefix ='nothing' - Integer :: checkpoint_iter = 0 - Real*8 :: checkpoint_dt, checkpoint_newdt + Integer :: checkpoint_iter = 0 + Real*8 :: checkpoint_dt, checkpoint_newdt Real*8 :: checkpoint_time - !////////////////////////// - ! New variables for new checkpointing style - Integer :: Noutputs_per_row, Nradii_per_output - Integer, Allocatable :: Nradii_at_rank(:), Rstart_at_rank(:) - Logical :: I_Will_Output = .False. + !////////////////////////// + ! New variables for new checkpointing style + Integer :: Noutputs_per_row, Nradii_per_output + Integer, Allocatable :: Nradii_at_rank(:), Rstart_at_rank(:) + Logical :: I_Will_Output = .False. !/////////////////////////////////////////////////////////// ! These variables are used for determining if it's time for a checkpoint @@ -47,12 +47,12 @@ Module Checkpointing Type(Cheby_Transform_Interface) :: cheby_info Contains - !////////////////////////////////////////////////////////// - ! Modifications related to the new Memory-Friendly Checkpointing Style - Subroutine Initialize_Checkpointing() - Implicit None - Integer :: nfs(6) - Integer :: p, np, nl, m, mp, rextra + !////////////////////////////////////////////////////////// + ! Modifications related to the new Memory-Friendly Checkpointing Style + Subroutine Initialize_Checkpointing() + Implicit None + Integer :: nfs(6) + Integer :: p, np, nl, m, mp, rextra checkpoint_t0 = stopwatch(walltime)%elapsed If (check_frequency .gt. 0) Then !this is for backwards compatibility @@ -70,163 +70,163 @@ Subroutine Initialize_Checkpointing() quicksave_interval = -1 Endif - if (magnetism) Then - numfields = 6 - Endif - nfs(:) = numfields*2 - Call chktmp%init(field_count = nfs, config = 'p1a') ! This structure hangs around through the entire run - - !//////////////////////// - - !////////////////////////////////////////////////// - ! Revisions for mem-friendly I/O - - !Write(6,*)'NPOUT: ', npout - Noutputs_per_row = npout! # of processors outputting within row - If (Noutputs_per_row .gt. my_r%delta) Then - Noutputs_per_row = my_r%delta - Endif - If (Noutputs_per_row .gt. nprow) Then - Noutputs_per_row = nprow - Endif - Nradii_per_output = my_r%delta/Noutputs_per_row ! Number of radii each processor outputs - rextra = Mod(my_r%delta,Noutputs_per_row) ! Remainder - Allocate(nradii_at_rank(0:Noutputs_per_row-1)) ! Number of radii output by each rank - Allocate(rstart_at_rank(0:Noutputs_per_row-1)) ! First radial index (local) this rank receives - Do p = 0, Noutputs_per_row -1 - Nradii_at_rank(p) = Nradii_per_output - If (rextra .gt. 0) Then - If (p .lt. rextra) Then - Nradii_at_rank(p) = Nradii_at_rank(p)+1 - Endif - Endif - Enddo - rstart_at_rank(0) = 1 - Do p = 1, Noutputs_per_row-1 - rstart_at_rank(p) = rstart_at_rank(p-1)+nradii_at_rank(p-1) - Enddo - ! Determine if each rank will output - If (my_row_rank .lt. Noutputs_per_row) Then - I_Will_Output = .true. - Endif - - - np = pfi%rcomm%np - Allocate(mode_count(0:np-1)) - mode_count(:) = 0 ! This is how many total l-m combinations rank p of a row owns - - - - nlm_total = 0 ! This is the total number of l-m combinations - Do p = 0, np -1 - Do mp = pfi%all_3s(p)%min, pfi%all_3s(p)%max - m = m_values(mp) - nl = l_max-m+1 - mode_count(p) = mode_count(p)+nl - nlm_total = nlm_total+nl - Enddo - Enddo - if (I_Will_Output) Then - Allocate(lmstart(0:l_max)) - lmstart(0) = 1 - do m = 0, l_max-1 - nl = l_max-m+1 - lmstart(m+1) = lmstart(m)+nl - enddo - np = pfi%ccomm%np - my_check_disp = 0 - Do p = 1, my_column_rank - my_check_disp = my_check_disp+pfi%all_1p(p-1)%delta - enddo - my_check_disp2 = (my_check_disp+rstart_at_rank(my_row_rank)-1)*nlm_total ! for new checkpointing style - my_check_disp = my_check_disp*nlm_total ! for old Checkpointing style - buffsize2 = nlm_total*nradii_at_rank(my_row_rank) ! for new - buffsize = nlm_total*my_r%delta ! for old - full_disp = N_r - full_disp = full_disp*nlm_total - Endif - - End Subroutine Initialize_Checkpointing - - - - Subroutine Write_Checkpoint(abterms,iteration,dt,new_dt,elapsed_time) - Implicit None - Real*8, Intent(In) :: abterms(:,:,:,:) - Real*8, Intent(In) :: dt, new_dt - Integer, Intent(In) :: iteration - Integer :: mp, m, offset,nl,p,np, f, imi, r, ind - Integer :: dim2, lstart, i, offset_index - Real*8, Allocatable :: myarr(:,:), rowstrip(:,:) + if (magnetism) Then + numfields = 6 + Endif + nfs(:) = numfields*2 + Call chktmp%init(field_count = nfs, config = 'p1a') ! This structure hangs around through the entire run + + !//////////////////////// + + !////////////////////////////////////////////////// + ! Revisions for mem-friendly I/O + + !Write(6,*)'NPOUT: ', npout + Noutputs_per_row = npout! # of processors outputting within row + If (Noutputs_per_row .gt. my_r%delta) Then + Noutputs_per_row = my_r%delta + Endif + If (Noutputs_per_row .gt. nprow) Then + Noutputs_per_row = nprow + Endif + Nradii_per_output = my_r%delta/Noutputs_per_row ! Number of radii each processor outputs + rextra = Mod(my_r%delta,Noutputs_per_row) ! Remainder + Allocate(nradii_at_rank(0:Noutputs_per_row-1)) ! Number of radii output by each rank + Allocate(rstart_at_rank(0:Noutputs_per_row-1)) ! First radial index (local) this rank receives + Do p = 0, Noutputs_per_row -1 + Nradii_at_rank(p) = Nradii_per_output + If (rextra .gt. 0) Then + If (p .lt. rextra) Then + Nradii_at_rank(p) = Nradii_at_rank(p)+1 + Endif + Endif + Enddo + rstart_at_rank(0) = 1 + Do p = 1, Noutputs_per_row-1 + rstart_at_rank(p) = rstart_at_rank(p-1)+nradii_at_rank(p-1) + Enddo + ! Determine if each rank will output + If (my_row_rank .lt. Noutputs_per_row) Then + I_Will_Output = .true. + Endif + + + np = pfi%rcomm%np + Allocate(mode_count(0:np-1)) + mode_count(:) = 0 ! This is how many total l-m combinations rank p of a row owns + + + + nlm_total = 0 ! This is the total number of l-m combinations + Do p = 0, np -1 + Do mp = pfi%all_3s(p)%min, pfi%all_3s(p)%max + m = m_values(mp) + nl = l_max-m+1 + mode_count(p) = mode_count(p)+nl + nlm_total = nlm_total+nl + Enddo + Enddo + if (I_Will_Output) Then + Allocate(lmstart(0:l_max)) + lmstart(0) = 1 + do m = 0, l_max-1 + nl = l_max-m+1 + lmstart(m+1) = lmstart(m)+nl + enddo + np = pfi%ccomm%np + my_check_disp = 0 + Do p = 1, my_column_rank + my_check_disp = my_check_disp+pfi%all_1p(p-1)%delta + enddo + my_check_disp2 = (my_check_disp+rstart_at_rank(my_row_rank)-1)*nlm_total ! for new checkpointing style + my_check_disp = my_check_disp*nlm_total ! for old Checkpointing style + buffsize2 = nlm_total*nradii_at_rank(my_row_rank) ! for new + buffsize = nlm_total*my_r%delta ! for old + full_disp = N_r + full_disp = full_disp*nlm_total + Endif + + End Subroutine Initialize_Checkpointing + + + + Subroutine Write_Checkpoint(abterms,iteration,dt,new_dt,elapsed_time) + Implicit None + Real*8, Intent(In) :: abterms(:,:,:,:) + Real*8, Intent(In) :: dt, new_dt + Integer, Intent(In) :: iteration + Integer :: mp, m, offset,nl,p,np, f, imi, r, ind + Integer :: dim2, lstart, i, offset_index + Real*8, Allocatable :: myarr(:,:), rowstrip(:,:) Real*8, Intent(In) :: elapsed_time Character*2 :: autostring - Character*8 :: iterstring - Character*120 :: cfile - np = pfi%rcomm%np - - Call chktmp%construct('p1a') - chktmp%config = 'p1a' - !Copy the RHS into chtkmp - Call Get_All_RHS(chktmp%p1a) - chktmp%p1a(:,:,:,numfields+1:numfields*2) = abterms(:,:,:,1:numfields) - !Now we want to move from p1a to s2a (rlm space) - Call chktmp%reform() - - ! Next, each process stripes their s2a array into a true 2-D array - dim2 = tnr*numfields*2 - Allocate(myarr(1:mode_count(my_row_rank),1:dim2)) - offset =1 - Do mp = my_mp%min, my_mp%max - m = m_values(mp) - nl = l_max-m+1 + Character*8 :: iterstring + Character*120 :: cfile + np = pfi%rcomm%np + + Call chktmp%construct('p1a') + chktmp%config = 'p1a' + !Copy the RHS into chtkmp + Call Get_All_RHS(chktmp%p1a) + chktmp%p1a(:,:,:,numfields+1:numfields*2) = abterms(:,:,:,1:numfields) + !Now we want to move from p1a to s2a (rlm space) + Call chktmp%reform() + + ! Next, each process stripes their s2a array into a true 2-D array + dim2 = tnr*numfields*2 + Allocate(myarr(1:mode_count(my_row_rank),1:dim2)) + offset =1 + Do mp = my_mp%min, my_mp%max + m = m_values(mp) + nl = l_max-m+1 ind = 1 Do f = 1, numfields*2 Do imi = 1, 2 Do r = my_r%min, my_r%max - myarr(offset:offset+nl-1,ind) = chktmp%s2a(mp)%data(m:l_max,r,imi,f) + myarr(offset:offset+nl-1,ind) = chktmp%s2a(mp)%data(m:l_max,r,imi,f) ind = ind+1 Enddo Enddo Enddo - offset = offset+nl - Enddo - Call chktmp%deconstruct('s2a') + offset = offset+nl + Enddo + Call chktmp%deconstruct('s2a') - ! Everyone sends to then 0 process of each row, who organizes the data into one large strip for output. + ! Everyone sends to then 0 process of each row, who organizes the data into one large strip for output. - If (my_row_rank .ne. 0) Then - ! Send myarr + If (my_row_rank .ne. 0) Then + ! Send myarr Call Send(myarr, dest = 0, tag = checkpoint_tag, grp = pfi%rcomm) - DeAllocate(myarr) - Else - Allocate( rowstrip(1:nlm_total, 1:tnr*numfields*2)) - ! first, copy myarr into the larger array - offset = 1 - Do mp = my_mp%min, my_mp%max - m = m_values(mp) - nl = l_max-m+1 - lstart = lmstart(m) - rowstrip(lstart:lstart+nl-1,:) = myarr(offset:offset+nl-1,:) - offset = offset+nl - Enddo - DeAllocate(myarr) - Do p = 1, np -1 - Allocate(myarr(1:mode_count(p),1:dim2)) - ! Receive + DeAllocate(myarr) + Else + Allocate( rowstrip(1:nlm_total, 1:tnr*numfields*2)) + ! first, copy myarr into the larger array + offset = 1 + Do mp = my_mp%min, my_mp%max + m = m_values(mp) + nl = l_max-m+1 + lstart = lmstart(m) + rowstrip(lstart:lstart+nl-1,:) = myarr(offset:offset+nl-1,:) + offset = offset+nl + Enddo + DeAllocate(myarr) + Do p = 1, np -1 + Allocate(myarr(1:mode_count(p),1:dim2)) + ! Receive Call receive(myarr, source= p,tag=checkpoint_tag,grp = pfi%rcomm) - offset = 1 - Do mp = pfi%all_3s(p)%min, pfi%all_3s(p)%max - m = m_values(mp) - nl = l_max-m+1 - lstart = lmstart(m) - rowstrip(lstart:lstart+nl-1,:) = myarr(offset:offset+nl-1,:) - offset = offset+nl - Enddo - DeAllocate(myarr) - Enddo + offset = 1 + Do mp = pfi%all_3s(p)%min, pfi%all_3s(p)%max + m = m_values(mp) + nl = l_max-m+1 + lstart = lmstart(m) + rowstrip(lstart:lstart+nl-1,:) = myarr(offset:offset+nl-1,:) + offset = offset+nl + Enddo + DeAllocate(myarr) + Enddo If (ItIsTimeForAQuickSave) Then write(autostring,'(i2.2)') (quicksave_num+1) !quick save number starts at 1 checkpoint_prefix = 'Checkpoints/quicksave_'//trim(autostring) @@ -235,25 +235,25 @@ Subroutine Write_Checkpoint(abterms,iteration,dt,new_dt,elapsed_time) checkpoint_prefix = 'Checkpoints/'//trim(iterstring) Endif - Call Write_Field(rowstrip,1,wchar, iteration) - Call Write_Field(rowstrip,2,pchar, iteration) - Call Write_Field(rowstrip,3,tchar, iteration) - Call Write_Field(rowstrip,4,zchar, iteration) - offset_index = 4 - If (magnetism) Then - Call Write_Field(rowstrip,5,cchar, iteration) - Call Write_Field(rowstrip,6,achar, iteration) - offset_index = 6 - Endif - - Call Write_Field(rowstrip,offset_index+1,'WAB', iteration) - Call Write_Field(rowstrip,offset_index+2,'PAB', iteration) - Call Write_Field(rowstrip,offset_index+3,'TAB', iteration) - Call Write_Field(rowstrip,offset_index+4,'ZAB', iteration) - If (magnetism) Then - Call Write_Field(rowstrip,offset_index+5,'CAB', iteration) - Call Write_Field(rowstrip,offset_index+6,'AAB', iteration) - Endif + Call Write_Field(rowstrip,1,wchar, iteration) + Call Write_Field(rowstrip,2,pchar, iteration) + Call Write_Field(rowstrip,3,tchar, iteration) + Call Write_Field(rowstrip,4,zchar, iteration) + offset_index = 4 + If (magnetism) Then + Call Write_Field(rowstrip,5,cchar, iteration) + Call Write_Field(rowstrip,6,achar, iteration) + offset_index = 6 + Endif + + Call Write_Field(rowstrip,offset_index+1,'WAB', iteration) + Call Write_Field(rowstrip,offset_index+2,'PAB', iteration) + Call Write_Field(rowstrip,offset_index+3,'TAB', iteration) + Call Write_Field(rowstrip,offset_index+4,'ZAB', iteration) + If (magnetism) Then + Call Write_Field(rowstrip,offset_index+5,'CAB', iteration) + Call Write_Field(rowstrip,offset_index+6,'AAB', iteration) + Endif DeAllocate(rowstrip) If (my_column_rank .eq. 0) Then ! row/column 0 writes out a file with the grid, etc. @@ -300,29 +300,29 @@ Subroutine Write_Checkpoint(abterms,iteration,dt,new_dt,elapsed_time) Close(15) Endif - Endif - - - End Subroutine Write_Checkpoint - - Subroutine Read_Checkpoint(fields, abterms,iteration,read_pars) - Implicit None - Integer, Intent(In) :: iteration, read_pars(1:2) - Real*8, Intent(InOut) :: fields(:,:,:,:), abterms(:,:,:,:) - Integer :: n_r_old, l_max_old, grid_type_old, nr_read - Integer :: i, ierr, nlm_total_old, m, nl,p, np, mxread - Integer :: maxl, dim2,offset, nl_load,lstart,mp, offset_index - Integer :: old_pars(5) - Integer, Allocatable :: lmstart_old(:) - Real*8, Allocatable :: old_radius(:), radius_old(:) - Real*8, Allocatable :: rowstrip(:,:), myarr(:,:), sendarr(:,:) - Real*8 :: dt_pars(3),dt,new_dt + Endif + + + End Subroutine Write_Checkpoint + + Subroutine Read_Checkpoint(fields, abterms,iteration,read_pars) + Implicit None + Integer, Intent(In) :: iteration, read_pars(1:2) + Real*8, Intent(InOut) :: fields(:,:,:,:), abterms(:,:,:,:) + Integer :: n_r_old, l_max_old, grid_type_old, nr_read + Integer :: i, ierr, nlm_total_old, m, nl,p, np, mxread + Integer :: maxl, dim2,offset, nl_load,lstart,mp, offset_index + Integer :: old_pars(5) + Integer, Allocatable :: lmstart_old(:) + Real*8, Allocatable :: old_radius(:), radius_old(:) + Real*8, Allocatable :: rowstrip(:,:), myarr(:,:), sendarr(:,:) + Real*8 :: dt_pars(3),dt,new_dt Real*8, Allocatable :: tempfield1(:,:,:,:), tempfield2(:,:,:,:) - Character*8 :: iterstring + Character*8 :: iterstring Character*2 :: autostring Character*12 :: dstring - Character*8 :: dofmt = '(ES12.5)' - Character*120 :: cfile + Character*8 :: dofmt = '(ES12.5)' + Character*120 :: cfile Integer :: fcount(3,2) Integer :: lb,ub, f, imi, r, ind Integer :: last_iter, last_auto @@ -332,9 +332,9 @@ Subroutine Read_Checkpoint(fields, abterms,iteration,read_pars) read_hydro = read_pars(1) read_magnetism = read_pars(2) - dim2 = tnr*numfields*2 - checkpoint_iter = iteration - !Write(iterstring,'(i8.8)') iteration + dim2 = tnr*numfields*2 + checkpoint_iter = iteration + !Write(iterstring,'(i8.8)') iteration If (my_rank .eq. 0) Then old_pars(4) = checkpoint_iter old_pars(5) = -1 @@ -385,8 +385,8 @@ Subroutine Read_Checkpoint(fields, abterms,iteration,read_pars) Read(15)Checkpoint_iter old_pars(4) = Checkpoint_iter Endif - Close(15) - + Close(15) + write(dstring,dofmt)checkpoint_time call stdout%print(' ------ Checkpoint time is: '//trim(dstring)) old_pars(1) = n_r_old @@ -396,42 +396,42 @@ Subroutine Read_Checkpoint(fields, abterms,iteration,read_pars) dt_pars(2) = new_dt dt_pars(3) = checkpoint_time - If (l_max_old .lt. l_max) Then - Write(6,*)' ' - Write(6,*)'#####################################################################' - Write(6,*)'# ' - Write(6,*)'# Checkpoint horizontal resolution is lower than current resolution.' - Write(6,*)'# The old solution will be interpolated onto horizontal grid with ' - Write(6,*)'# higher resolution corresponding to the new l_max.' - Write(6,*)'# Old l_max: ', l_max_old - Write(6,*)'# New l_max: ', l_max - Write(6,*)'# ' - Write(6,*)'#####################################################################' - Write(6,*)' ' - Endif - If (l_max_old .gt. l_max) Then - Write(6,*)' ' - Write(6,*)'#####################################################################' - Write(6,*)'# ' - Write(6,*)'# Checkpoint horizontal resolution is higher than current resolution.' - Write(6,*)'# The old SPH expansion will be truncated at the new l_max.' - Write(6,*)'# This might not be a good idea.' - Write(6,*)'# Old l_max: ', l_max_old - Write(6,*)'# New l_max: ', l_max - Write(6,*)'# ' - Write(6,*)'#####################################################################' - Write(6,*)' ' - Endif - Endif + If (l_max_old .lt. l_max) Then + Write(6,*)' ' + Write(6,*)'#####################################################################' + Write(6,*)'# ' + Write(6,*)'# Checkpoint horizontal resolution is lower than current resolution.' + Write(6,*)'# The old solution will be interpolated onto horizontal grid with ' + Write(6,*)'# higher resolution corresponding to the new l_max.' + Write(6,*)'# Old l_max: ', l_max_old + Write(6,*)'# New l_max: ', l_max + Write(6,*)'# ' + Write(6,*)'#####################################################################' + Write(6,*)' ' + Endif + If (l_max_old .gt. l_max) Then + Write(6,*)' ' + Write(6,*)'#####################################################################' + Write(6,*)'# ' + Write(6,*)'# Checkpoint horizontal resolution is higher than current resolution.' + Write(6,*)'# The old SPH expansion will be truncated at the new l_max.' + Write(6,*)'# This might not be a good idea.' + Write(6,*)'# Old l_max: ', l_max_old + Write(6,*)'# New l_max: ', l_max + Write(6,*)'# ' + Write(6,*)'#####################################################################' + Write(6,*)' ' + Endif + Endif If (my_row_rank .eq. 0) Then !2-D broadcast pattern - Call MPI_Bcast(old_pars,5, MPI_INTEGER, 0, pfi%ccomm%comm, ierr) + Call MPI_Bcast(old_pars,5, MPI_INTEGER, 0, pfi%ccomm%comm, ierr) Endif Call MPI_Bcast(old_pars,5, MPI_INTEGER, 0, pfi%rcomm%comm, ierr) - n_r_old = old_pars(1) - grid_type_old = old_pars(2) - l_max_old = old_pars(3) + n_r_old = old_pars(1) + grid_type_old = old_pars(2) + l_max_old = old_pars(3) checkpoint_iter = old_pars(4) last_auto = old_pars(5) @@ -446,209 +446,209 @@ Subroutine Read_Checkpoint(fields, abterms,iteration,read_pars) Endif - !///////// Later we only want to do this if the grid is actually different - If (my_rank .ne. 0) Then - Allocate(old_radius(1:n_r_old)) - Endif + !///////// Later we only want to do this if the grid is actually different + If (my_rank .ne. 0) Then + Allocate(old_radius(1:n_r_old)) + Endif If (my_row_rank .eq. 0) Then - Call MPI_Bcast(old_radius,n_r_old, MPI_DOUBLE_PRECISION, 0, pfi%ccomm%comm, ierr) + Call MPI_Bcast(old_radius,n_r_old, MPI_DOUBLE_PRECISION, 0, pfi%ccomm%comm, ierr) Endif - Call MPI_Bcast(old_radius,n_r_old, MPI_DOUBLE_PRECISION, 0, pfi%rcomm%comm, ierr) + Call MPI_Bcast(old_radius,n_r_old, MPI_DOUBLE_PRECISION, 0, pfi%rcomm%comm, ierr) If (my_row_rank .eq. 0) Then - Call MPI_Bcast(dt_pars,2, MPI_DOUBLE_PRECISION, 0, pfi%ccomm%comm, ierr) + Call MPI_Bcast(dt_pars,2, MPI_DOUBLE_PRECISION, 0, pfi%ccomm%comm, ierr) Endif - Call MPI_Bcast(dt_pars,2, MPI_DOUBLE_PRECISION, 0, pfi%rcomm%comm, ierr) + Call MPI_Bcast(dt_pars,2, MPI_DOUBLE_PRECISION, 0, pfi%rcomm%comm, ierr) - checkpoint_dt = dt_pars(1) - checkpoint_newdt = dt_pars(2) + checkpoint_dt = dt_pars(1) + checkpoint_newdt = dt_pars(2) checkpoint_Time = dt_pars(3) - Call chktmp%construct('s2b') - chktmp%config = 's2b' - Do mp = my_mp%min, my_mp%max + Call chktmp%construct('s2b') + chktmp%config = 's2b' + Do mp = my_mp%min, my_mp%max chktmp%s2b(mp)%data(:,:,:,:) = 0.0d0 - Enddo + Enddo !////////////////////////////////// ! Determine if we actually read anything ! The old nr might be lower than the current nr ! (currently does not support old nr being larger...) - mxread = n_r_old-my_r%min+1 - nr_read = min(my_r%delta,mxread) ! Was tnr, not nr.... - if(my_r%min .gt. n_r_old) nr_read = 0 + mxread = n_r_old-my_r%min+1 + nr_read = min(my_r%delta,mxread) ! Was tnr, not nr.... + if(my_r%min .gt. n_r_old) nr_read = 0 - ! Rank zero from each row participates in the read - If (my_row_rank .eq. 0) Then + ! Rank zero from each row participates in the read + If (my_row_rank .eq. 0) Then !If (nr_read .gt. 0) Then ! SMALL BUG HERE RELATED TO MPI_IO Logic... -- Revist this - ! Column zero reads in the old checkpoint no matter what - ! the old dimensions are. We'll broadcast back to all members of the row later + ! Column zero reads in the old checkpoint no matter what + ! the old dimensions are. We'll broadcast back to all members of the row later - ! Interpolation/truncation of the old spherical harmonic basis is easy - ! Interpolation up in radius is easy, but down is more difficult to program - ! and unlikely to be used. I will write a serial version of the input - ! for those cases where interpolation down is required. + ! Interpolation/truncation of the old spherical harmonic basis is easy + ! Interpolation up in radius is easy, but down is more difficult to program + ! and unlikely to be used. I will write a serial version of the input + ! for those cases where interpolation down is required. - nlm_total_old = 0 ! This is the total number of l-m combinations in the CHECKPOINT FILE - Do m = 0, l_max_old - nl = l_max_old-m+1 - nlm_total_old = nlm_total_old+nl - Enddo + nlm_total_old = 0 ! This is the total number of l-m combinations in the CHECKPOINT FILE + Do m = 0, l_max_old + nl = l_max_old-m+1 + nlm_total_old = nlm_total_old+nl + Enddo - np = pfi%ccomm%np - my_in_disp = 0 - Do p = 1, my_column_rank - my_in_disp = my_in_disp+pfi%all_1p(p-1)%delta - enddo + np = pfi%ccomm%np + my_in_disp = 0 + Do p = 1, my_column_rank + my_in_disp = my_in_disp+pfi%all_1p(p-1)%delta + enddo - my_in_disp = my_in_disp*nlm_total_old - full_in_disp = nlm_total_old*n_r_old + my_in_disp = my_in_disp*nlm_total_old + full_in_disp = nlm_total_old*n_r_old - Allocate( rowstrip(1:nlm_total_old, 1:tnr*numfields*2)) - rowstrip(:,:) = 0 + Allocate( rowstrip(1:nlm_total_old, 1:tnr*numfields*2)) + rowstrip(:,:) = 0 If (read_hydro .eq. 1) Then - Call Read_Field(rowstrip,1,wchar, iteration,nr_read,nlm_total_old) - Call Read_Field(rowstrip,2,pchar, iteration,nr_read,nlm_total_old) - Call Read_Field(rowstrip,3,tchar, iteration,nr_read,nlm_total_old) - Call Read_Field(rowstrip,4,zchar, iteration,nr_read,nlm_total_old) + Call Read_Field(rowstrip,1,wchar, iteration,nr_read,nlm_total_old) + Call Read_Field(rowstrip,2,pchar, iteration,nr_read,nlm_total_old) + Call Read_Field(rowstrip,3,tchar, iteration,nr_read,nlm_total_old) + Call Read_Field(rowstrip,4,zchar, iteration,nr_read,nlm_total_old) Endif - offset_index = 4 - If (magnetism) Then + offset_index = 4 + If (magnetism) Then If (read_magnetism .eq. 1) Then - Call Read_Field(rowstrip,5,cchar, iteration,nr_read,nlm_total_old) - Call Read_Field(rowstrip,6,achar, iteration,nr_read,nlm_total_old) + Call Read_Field(rowstrip,5,cchar, iteration,nr_read,nlm_total_old) + Call Read_Field(rowstrip,6,achar, iteration,nr_read,nlm_total_old) Endif - offset_index = 6 - Endif + offset_index = 6 + Endif If (read_hydro .eq. 1) Then - Call Read_Field(rowstrip,offset_index+1,'WAB', iteration,nr_read,nlm_total_old) - Call Read_Field(rowstrip,offset_index+2,'PAB', iteration,nr_read,nlm_total_old) - Call Read_Field(rowstrip,offset_index+3,'TAB', iteration,nr_read,nlm_total_old) - Call Read_Field(rowstrip,offset_index+4,'ZAB', iteration,nr_read,nlm_total_old) + Call Read_Field(rowstrip,offset_index+1,'WAB', iteration,nr_read,nlm_total_old) + Call Read_Field(rowstrip,offset_index+2,'PAB', iteration,nr_read,nlm_total_old) + Call Read_Field(rowstrip,offset_index+3,'TAB', iteration,nr_read,nlm_total_old) + Call Read_Field(rowstrip,offset_index+4,'ZAB', iteration,nr_read,nlm_total_old) Endif - If (magnetism) Then + If (magnetism) Then If (read_magnetism .eq. 1) Then - Call Read_Field(rowstrip,offset_index+5,'CAB', iteration,nr_read,nlm_total_old) - Call Read_Field(rowstrip,offset_index+6,'AAB', iteration,nr_read,nlm_total_old) + Call Read_Field(rowstrip,offset_index+5,'CAB', iteration,nr_read,nlm_total_old) + Call Read_Field(rowstrip,offset_index+6,'AAB', iteration,nr_read,nlm_total_old) Endif - Endif - - ! Now the head of each row owns all modes of each field at the - ! radii owned by that row. The different modes now need to be - ! distributed to their respect owners. - ! This is where horizontal interpolation or truncation is done (implicitly) - ! by only loading appropriate modes into the send arrays - - !///////////////////////////// - ! Do some book-keeping related to the old l_max - ! This array tells us where in the first dimension of rowstrip, ell values for mode m start - np = pfi%rcomm%np - - Allocate(lmstart_old(0:l_max_old)) - lmstart_old(0) = 1 - do m = 0, l_max_old-1 - nl = l_max_old-m+1 - lmstart_old(m+1) = lmstart_old(m)+nl - enddo - - maxl = min(l_max,l_max_old) ! Take care to only read in modes that are common - ! to the checkpoint & and the current simulation - - ! First, each row-head pulls out their own modes - Do mp = my_mp%min, my_mp%max - m = m_values(mp) - chktmp%s2b(mp)%data(:,:,:,:) = 0.0d0 - If (m .le. l_max_old) Then - nl = maxl-m+1 - lstart = lmstart_old(m) + Endif + + ! Now the head of each row owns all modes of each field at the + ! radii owned by that row. The different modes now need to be + ! distributed to their respect owners. + ! This is where horizontal interpolation or truncation is done (implicitly) + ! by only loading appropriate modes into the send arrays + + !///////////////////////////// + ! Do some book-keeping related to the old l_max + ! This array tells us where in the first dimension of rowstrip, ell values for mode m start + np = pfi%rcomm%np + + Allocate(lmstart_old(0:l_max_old)) + lmstart_old(0) = 1 + do m = 0, l_max_old-1 + nl = l_max_old-m+1 + lmstart_old(m+1) = lmstart_old(m)+nl + enddo + + maxl = min(l_max,l_max_old) ! Take care to only read in modes that are common + ! to the checkpoint & and the current simulation + + ! First, each row-head pulls out their own modes + Do mp = my_mp%min, my_mp%max + m = m_values(mp) + chktmp%s2b(mp)%data(:,:,:,:) = 0.0d0 + If (m .le. l_max_old) Then + nl = maxl-m+1 + lstart = lmstart_old(m) ind = 1 Do f = 1, numfields*2 Do imi = 1, 2 Do r = my_r%min, my_r%max - chktmp%s2b(mp)%data(m:maxl,r,imi,f) = rowstrip(lstart:lstart+nl-1,ind) + chktmp%s2b(mp)%data(m:maxl,r,imi,f) = rowstrip(lstart:lstart+nl-1,ind) ind = ind+1 Enddo Enddo Enddo - Endif - Enddo - - - !///////////////////////////////////////////////////////////// - ! Next send each of the other processors in the row their information - Do p = 1, np -1 - Allocate(sendarr(1:mode_count(p),1:dim2)) - sendarr(:,:) = 0.0d0 - offset = 1 - Do mp = pfi%all_3s(p)%min, pfi%all_3s(p)%max - m = m_values(mp) - nl = l_max-m+1 - If (m .le. l_max_old) Then - nl_load = maxl-m+1 - lstart = lmstart_old(m) - sendarr(offset:offset+nl_load-1,:) = rowstrip(lstart:lstart+nl_load-1,:) - Endif - offset = offset+nl - Enddo + Endif + Enddo + + + !///////////////////////////////////////////////////////////// + ! Next send each of the other processors in the row their information + Do p = 1, np -1 + Allocate(sendarr(1:mode_count(p),1:dim2)) + sendarr(:,:) = 0.0d0 + offset = 1 + Do mp = pfi%all_3s(p)%min, pfi%all_3s(p)%max + m = m_values(mp) + nl = l_max-m+1 + If (m .le. l_max_old) Then + nl_load = maxl-m+1 + lstart = lmstart_old(m) + sendarr(offset:offset+nl_load-1,:) = rowstrip(lstart:lstart+nl_load-1,:) + Endif + offset = offset+nl + Enddo Call send(sendarr, dest= p,tag=checkpoint_tag,grp = pfi%rcomm) - DeAllocate(sendarr) - Enddo - !///////// + DeAllocate(sendarr) + Enddo + !///////// - DeAllocate(lmstart_old) - DeAllocate(rowstrip) + DeAllocate(lmstart_old) + DeAllocate(rowstrip) !Endif - Else - ! Receive my modes - !If (nr_read .gt. 0) Then - Allocate(myarr(1:mode_count(my_row_rank),1:dim2)) - Call receive(myarr, source= 0,tag=checkpoint_tag,grp = pfi%rcomm) - offset =1 - Do mp = my_mp%min, my_mp%max - m = m_values(mp) - nl = l_max-m+1 + Else + ! Receive my modes + !If (nr_read .gt. 0) Then + Allocate(myarr(1:mode_count(my_row_rank),1:dim2)) + Call receive(myarr, source= 0,tag=checkpoint_tag,grp = pfi%rcomm) + offset =1 + Do mp = my_mp%min, my_mp%max + m = m_values(mp) + nl = l_max-m+1 ind = 1 Do f = 1, numfields*2 Do imi = 1, 2 Do r = my_r%min, my_r%max - chktmp%s2b(mp)%data(m:l_max,r,imi,f) = myarr(offset:offset+nl-1,ind) - ind = ind+1 + chktmp%s2b(mp)%data(m:l_max,r,imi,f) = myarr(offset:offset+nl-1,ind) + ind = ind+1 Enddo Enddo Enddo offset = offset+nl - Enddo - DeAllocate(myarr) + Enddo + DeAllocate(myarr) !Endif - Endif + Endif - Call chktmp%reform() ! move to p1b + Call chktmp%reform() ! move to p1b - ! NOW, if n_r_old and grid_type_old are the same, we can copy chtkmp%p1b into abterms and - ! fields. Otherwise, we need to interpolate onto the current grid - If ((n_r_old .ne. n_r) .or. (grid_type_old .ne. grid_type) ) Then - ! Interpolate - ! We will assume the user kept the same radial domain bounds. - ! If they have not, this will end badly. - If (my_rank .eq. 0) Then - Write(6,*)'Grid has changed. Interpolating onto new grid.' - Write(6,*)'Old grid_type: ', grid_type_old - Write(6,*)'Current grid_type: ', grid_type - Write(6,*)'Old N_R: ', n_r_old - Write(6,*)'Current N_R: ', n_r - Endif + ! NOW, if n_r_old and grid_type_old are the same, we can copy chtkmp%p1b into abterms and + ! fields. Otherwise, we need to interpolate onto the current grid + If ((n_r_old .ne. n_r) .or. (grid_type_old .ne. grid_type) ) Then + ! Interpolate + ! We will assume the user kept the same radial domain bounds. + ! If they have not, this will end badly. + If (my_rank .eq. 0) Then + Write(6,*)'Grid has changed. Interpolating onto new grid.' + Write(6,*)'Old grid_type: ', grid_type_old + Write(6,*)'Current grid_type: ', grid_type + Write(6,*)'Old N_R: ', n_r_old + Write(6,*)'Current N_R: ', n_r + Endif If (chebyshev) Then If (n_r_old .lt. n_r) Then @@ -693,58 +693,58 @@ Subroutine Read_Checkpoint(fields, abterms,iteration,read_pars) Else Write(6,*)'Interpolation for FD not supported yet' Endif - Else - - ! Interpolation is complete, now we just copy into the other arrays - fields(:,:,:,1:numfields) = chktmp%p1b(:,:,:,1:numfields) - abterms(:,:,:,1:numfields) = chktmp%p1b(:,:,:,numfields+1:numfields*2) + Else + + ! Interpolation is complete, now we just copy into the other arrays + fields(:,:,:,1:numfields) = chktmp%p1b(:,:,:,1:numfields) + abterms(:,:,:,1:numfields) = chktmp%p1b(:,:,:,numfields+1:numfields*2) Endif - Call chktmp%deconstruct('p1b') - DeAllocate(old_radius) + Call chktmp%deconstruct('p1b') + DeAllocate(old_radius) - End Subroutine Read_Checkpoint + End Subroutine Read_Checkpoint - Subroutine Write_Field(arr,ind,tag,iter) - Implicit None - Integer, Intent(In) :: ind, iter - Real*8, Intent(In) :: arr(1:,1:) + Subroutine Write_Field(arr,ind,tag,iter) + Implicit None + Integer, Intent(In) :: ind, iter + Real*8, Intent(In) :: arr(1:,1:) Character*2 :: autostring - Character*8 :: iterstring - Character*3, Intent(In) :: tag - Character*120 :: cfile + Character*8 :: iterstring + Character*3, Intent(In) :: tag + Character*120 :: cfile - integer ierr, funit , v_offset1, v_offset2 - integer(kind=MPI_OFFSET_KIND) disp1,disp2 - Integer :: mstatus(MPI_STATUS_SIZE) + integer ierr, funit , v_offset1, v_offset2 + integer(kind=MPI_OFFSET_KIND) disp1,disp2 + Integer :: mstatus(MPI_STATUS_SIZE) cfile = Trim(my_path)//Trim(checkpoint_prefix)//'_'//Trim(tag) - ! We have to be careful here. Each processor does TWO writes. - ! The first write places the real part of the field into the file. - ! The view then changes and advances to the appropriate location of the - ! imaginary part. This step is crucial for checkpoints to work with - ! Different processor configurations. - v_offset1 = (ind-1)*tnr+1 - v_offset2 = v_offset1+my_r%delta - - call MPI_FILE_OPEN(pfi%ccomm%comm, cfile, & + ! We have to be careful here. Each processor does TWO writes. + ! The first write places the real part of the field into the file. + ! The view then changes and advances to the appropriate location of the + ! imaginary part. This step is crucial for checkpoints to work with + ! Different processor configurations. + v_offset1 = (ind-1)*tnr+1 + v_offset2 = v_offset1+my_r%delta + + call MPI_FILE_OPEN(pfi%ccomm%comm, cfile, & MPI_MODE_WRONLY + MPI_MODE_CREATE, & MPI_INFO_NULL, funit, ierr) if (ierr .ne. 0) Then Write(6,*)'Error Opening File: ', pfi%ccomm%rank Endif - disp1 = my_check_disp*8 - disp2 = (my_check_disp+full_disp)*8 + disp1 = my_check_disp*8 + disp2 = (my_check_disp+full_disp)*8 Call MPI_File_Seek(funit,disp1,MPI_SEEK_SET,ierr) If (ierr .ne. 0) Write(6,*)'Error Seeking 1: ', pfi%ccomm%rank - Call MPI_FILE_WRITE(funit, arr(1,v_offset1), buffsize, MPI_DOUBLE_PRECISION, & + Call MPI_FILE_WRITE(funit, arr(1,v_offset1), buffsize, MPI_DOUBLE_PRECISION, & mstatus, ierr) If (ierr .ne. 0) Write(6,*)'Error Writing 1: ', pfi%ccomm%rank @@ -753,19 +753,19 @@ Subroutine Write_Field(arr,ind,tag,iter) If (ierr .ne. 0) Write(6,*)'Error Seeking 2: ', pfi%ccomm%rank - Call MPI_FILE_WRITE(funit, arr(1,v_offset2), buffsize, MPI_DOUBLE_PRECISION, & + Call MPI_FILE_WRITE(funit, arr(1,v_offset2), buffsize, MPI_DOUBLE_PRECISION, & mstatus, ierr) If (ierr .ne. 0) Write(6,*)'Error Writing 2: ', pfi%ccomm%rank - Call MPI_FILE_CLOSE(funit, ierr) + Call MPI_FILE_CLOSE(funit, ierr) if (ierr .ne. 0) Write(6,*)'Error Closing File: ', pfi%ccomm%rank - + - End Subroutine Write_Field + End Subroutine Write_Field @@ -837,7 +837,7 @@ Subroutine Read_Field(arr,ind,tag,iter,nread,nlm) if (ierr .ne. 0) Then Write(6,*)'Error closing file: ', pfi%ccomm%rank Endif - End Subroutine Read_Field + End Subroutine Read_Field Subroutine IsItTimeForACheckpoint(iter) @@ -884,218 +884,218 @@ Subroutine IsItTimeForACheckpoint(iter) Endif End Subroutine - Subroutine Write_Spectral_Field3D(arrin,ind,tag) - ! Parallel Writing Routine For Fields in Spectral rlm configuration - ! ISends and IReceives are used - Implicit None - Integer :: var_offset, offset, new_off + Subroutine Write_Spectral_Field3D(arrin,ind,tag) + ! Parallel Writing Routine For Fields in Spectral rlm configuration + ! ISends and IReceives are used + Implicit None + Integer :: var_offset, offset, new_off - Integer :: nrirq, nsirq, irq_ind, rtag, stag - Integer, Allocatable :: rirqs(:), sirqs(:) - Integer :: rone, rtwo, my_nrad, num_el - Integer :: i, mp, m, lstart, nl,p,r - Integer :: indstart(2) - Real*8, Intent(In) :: arrin(1:,1:) - Real*8, Allocatable :: arr(:,:,:), tarr(:) + Integer :: nrirq, nsirq, irq_ind, rtag, stag + Integer, Allocatable :: rirqs(:), sirqs(:) + Integer :: rone, rtwo, my_nrad, num_el + Integer :: i, mp, m, lstart, nl,p,r + Integer :: indstart(2) + Real*8, Intent(In) :: arrin(1:,1:) + Real*8, Allocatable :: arr(:,:,:), tarr(:) - Integer, Intent(In) :: ind - Character*8 :: iterstring - Character*3, Intent(In) :: tag - Character*120 :: cfile + Integer, Intent(In) :: ind + Character*8 :: iterstring + Character*3, Intent(In) :: tag + Character*120 :: cfile - integer ierr, funit - integer(kind=MPI_OFFSET_KIND) disp1,disp2 - Integer :: mstatus(MPI_STATUS_SIZE) + integer ierr, funit + integer(kind=MPI_OFFSET_KIND) disp1,disp2 + Integer :: mstatus(MPI_STATUS_SIZE) cfile = Trim(checkpoint_prefix)//'_'//trim(tag) - var_offset = (ind-1)*tnr - If (I_Will_Output) Then - my_nrad = nradii_at_rank(my_row_rank) - Allocate( arr(1:nlm_total,1:my_nrad,2)) - Allocate(tarr(1:nlm_total*my_nrad)) - - nrirq = nprow-1 - Allocate(rirqs(1:nrirq)) - nsirq = Noutputs_per_row-1 - Allocate(sirqs(1:nsirq)) - - Do i = 1, 2 ! 2 passess. Real and imaginary. Could do one, but worried about Memory. - rone = var_offset+rstart_at_rank(my_row_rank)+(i-1)*my_r%delta - rtwo = rone+my_nrad-1 - ! Post receives for everyone in my row - ! tag depends on i & p - offset = 1 - irq_ind = 1 - Do p = 0, nprow-1 - If (p .ne. my_row_rank) Then - rtag = p*(i+1) - num_el = mode_count(p)*my_nrad - Call IReceive(tarr, rirqs(irq_ind),num_el, offset,p, rtag, pfi%rcomm) - irq_ind = irq_ind+1 - Else - ! File my stuff into tarr here - new_off = offset - Do r = rone, rtwo - Do m = 1, mode_count(p) - tarr(new_off) = arrin(m,r) - new_off = new_off+1 - Enddo - Enddo - Endif - - offset = offset+mode_count(p)*my_nrad - Enddo - - - ! Post sends to all output processes in my row - irq_ind = 1 - Do p = 0, Noutputs_per_Row-1 - If (p .ne. my_row_rank) Then - num_el = mode_count(my_row_rank)*nradii_at_rank(p) - stag = my_row_rank*(i+1) - indstart(1) = 1 - indstart(2) = var_offset+rstart_at_rank(p)+(i-1)*my_r%delta - Call ISend(arrin, sirqs(irq_ind),num_el, p, stag, pfi%rcomm, indstart) - irq_ind = irq_ind+1 - Endif - Enddo - - ! Block and wait on receive irqs - - Call IWaitAll(nrirq, rirqs) - - ! File Data into Main Array - offset = 1 - Do p = 0, nprow-1 - Do r = 1, my_nrad - Do mp = pfi%all_3s(p)%min, pfi%all_3s(p)%max - m = m_values(mp) - nl = l_max-m+1 - lstart = lmstart(m) - arr(lstart:lstart+nl-1,r,i) = tarr(offset:offset+nl-1) - offset = offset+nl - Enddo - Enddo - Enddo - - Call IWaitAll(nsirq, sirqs) - - - Enddo - DeAllocate(sirqs) - DeAllocate(tarr) - DeAllocate(rirqs) - !////////////////////////////// - ! MPI Write - - - - - ! We have to be careful here. Each processor does TWO writes. - ! The first write places the real part of the field into the file. - ! The view then changes and advances to the appropriate location of the - ! imaginary part. This step is crucial for checkpoints to work with - ! Different processor configurations. The Real stuff sits at the - ! Beginning of the file. The imaginary stuff sits at the end. - - - !///// NEED TO SET THESE DISPLACEMENTS - - Call MPI_FILE_OPEN(pfi%ccomm%comm, cfile, & - MPI_MODE_WRONLY + MPI_MODE_CREATE, & + var_offset = (ind-1)*tnr + If (I_Will_Output) Then + my_nrad = nradii_at_rank(my_row_rank) + Allocate( arr(1:nlm_total,1:my_nrad,2)) + Allocate(tarr(1:nlm_total*my_nrad)) + + nrirq = nprow-1 + Allocate(rirqs(1:nrirq)) + nsirq = Noutputs_per_row-1 + Allocate(sirqs(1:nsirq)) + + Do i = 1, 2 ! 2 passess. Real and imaginary. Could do one, but worried about Memory. + rone = var_offset+rstart_at_rank(my_row_rank)+(i-1)*my_r%delta + rtwo = rone+my_nrad-1 + ! Post receives for everyone in my row + ! tag depends on i & p + offset = 1 + irq_ind = 1 + Do p = 0, nprow-1 + If (p .ne. my_row_rank) Then + rtag = p*(i+1) + num_el = mode_count(p)*my_nrad + Call IReceive(tarr, rirqs(irq_ind),num_el, offset,p, rtag, pfi%rcomm) + irq_ind = irq_ind+1 + Else + ! File my stuff into tarr here + new_off = offset + Do r = rone, rtwo + Do m = 1, mode_count(p) + tarr(new_off) = arrin(m,r) + new_off = new_off+1 + Enddo + Enddo + Endif + + offset = offset+mode_count(p)*my_nrad + Enddo + + + ! Post sends to all output processes in my row + irq_ind = 1 + Do p = 0, Noutputs_per_Row-1 + If (p .ne. my_row_rank) Then + num_el = mode_count(my_row_rank)*nradii_at_rank(p) + stag = my_row_rank*(i+1) + indstart(1) = 1 + indstart(2) = var_offset+rstart_at_rank(p)+(i-1)*my_r%delta + Call ISend(arrin, sirqs(irq_ind),num_el, p, stag, pfi%rcomm, indstart) + irq_ind = irq_ind+1 + Endif + Enddo + + ! Block and wait on receive irqs + + Call IWaitAll(nrirq, rirqs) + + ! File Data into Main Array + offset = 1 + Do p = 0, nprow-1 + Do r = 1, my_nrad + Do mp = pfi%all_3s(p)%min, pfi%all_3s(p)%max + m = m_values(mp) + nl = l_max-m+1 + lstart = lmstart(m) + arr(lstart:lstart+nl-1,r,i) = tarr(offset:offset+nl-1) + offset = offset+nl + Enddo + Enddo + Enddo + + Call IWaitAll(nsirq, sirqs) + + + Enddo + DeAllocate(sirqs) + DeAllocate(tarr) + DeAllocate(rirqs) + !////////////////////////////// + ! MPI Write + + + + + ! We have to be careful here. Each processor does TWO writes. + ! The first write places the real part of the field into the file. + ! The view then changes and advances to the appropriate location of the + ! imaginary part. This step is crucial for checkpoints to work with + ! Different processor configurations. The Real stuff sits at the + ! Beginning of the file. The imaginary stuff sits at the end. + + + !///// NEED TO SET THESE DISPLACEMENTS + + Call MPI_FILE_OPEN(pfi%ccomm%comm, cfile, & + MPI_MODE_WRONLY + MPI_MODE_CREATE, & MPI_INFO_NULL, funit, ierr) - disp1 = my_check_disp2*8 - disp2 = (my_check_disp2+full_disp)*8 + disp1 = my_check_disp2*8 + disp2 = (my_check_disp2+full_disp)*8 - Call MPI_FILE_SET_VIEW(funit, disp1, MPI_DOUBLE_PRECISION, & ! Real part + Call MPI_FILE_SET_VIEW(funit, disp1, MPI_DOUBLE_PRECISION, & ! Real part MPI_DOUBLE_PRECISION, 'native', & MPI_INFO_NULL, ierr) - Call MPI_FILE_WRITE(funit, arr(1,1,1), buffsize2, MPI_DOUBLE_PRECISION, & + Call MPI_FILE_WRITE(funit, arr(1,1,1), buffsize2, MPI_DOUBLE_PRECISION, & mstatus, ierr) - Call MPI_FILE_SET_VIEW(funit, disp2, MPI_DOUBLE_PRECISION, & ! Imaginary part + Call MPI_FILE_SET_VIEW(funit, disp2, MPI_DOUBLE_PRECISION, & ! Imaginary part MPI_DOUBLE_PRECISION, 'native', & MPI_INFO_NULL, ierr) - Call MPI_FILE_WRITE(funit, arr(1,1,2), buffsize2, MPI_DOUBLE_PRECISION, & + Call MPI_FILE_WRITE(funit, arr(1,1,2), buffsize2, MPI_DOUBLE_PRECISION, & mstatus, ierr) - Call MPI_FILE_CLOSE(funit, ierr) - + Call MPI_FILE_CLOSE(funit, ierr) - !//////////////////////////////// - DeAllocate(arr) - Else - ! This rank does not output - ! Post sends to all output processes in my row - nsirq = Noutputs_per_row - Allocate(sirqs(1:nsirq)) - Do i = 1, 2 - irq_ind = 1 - Do p = 0, Noutputs_per_Row-1 - num_el = mode_count(my_row_rank)*nradii_at_rank(p) - stag = my_row_rank*(i+1) - indstart(1) = 1 - indstart(2) = var_offset+rstart_at_rank(p)+(i-1)*my_r%delta - Call ISend(arrin, sirqs(irq_ind),num_el, p, stag, pfi%rcomm, indstart) - irq_ind = irq_ind+1 - Enddo + !//////////////////////////////// + DeAllocate(arr) + Else + ! This rank does not output + ! Post sends to all output processes in my row + nsirq = Noutputs_per_row + Allocate(sirqs(1:nsirq)) + + Do i = 1, 2 + irq_ind = 1 + Do p = 0, Noutputs_per_Row-1 + num_el = mode_count(my_row_rank)*nradii_at_rank(p) + stag = my_row_rank*(i+1) + indstart(1) = 1 + indstart(2) = var_offset+rstart_at_rank(p)+(i-1)*my_r%delta + Call ISend(arrin, sirqs(irq_ind),num_el, p, stag, pfi%rcomm, indstart) + irq_ind = irq_ind+1 + Enddo - Call IWaitAll(nsirq, sirqs) + Call IWaitAll(nsirq, sirqs) - - Enddo - DeAllocate(sirqs) - Endif + + Enddo + DeAllocate(sirqs) + Endif - End Subroutine Write_Spectral_Field3D + End Subroutine Write_Spectral_Field3D - Subroutine Write_Checkpoint_Alt(abterms,iteration,dt,new_dt,elapsed_time) - ! This uses the memory friendly framework - Implicit None - Real*8, Intent(In) :: abterms(:,:,:,:) - Real*8, Intent(In) :: dt, new_dt, elapsed_time - Integer, Intent(In) :: iteration - Integer :: mp, m, offset,nl,np - Integer :: dim2, i, offset_index, r, imi,f,ind - Real*8, Allocatable :: myarr(:,:) + Subroutine Write_Checkpoint_Alt(abterms,iteration,dt,new_dt,elapsed_time) + ! This uses the memory friendly framework + Implicit None + Real*8, Intent(In) :: abterms(:,:,:,:) + Real*8, Intent(In) :: dt, new_dt, elapsed_time + Integer, Intent(In) :: iteration + Integer :: mp, m, offset,nl,np + Integer :: dim2, i, offset_index, r, imi,f,ind + Real*8, Allocatable :: myarr(:,:) Character*2 :: autostring - Character*8 :: iterstring - Character*120 :: cfile - np = pfi%rcomm%np - - Call chktmp%construct('p1a') - chktmp%config = 'p1a' - !Copy the RHS into chtkmp - Call Get_All_RHS(chktmp%p1a) - chktmp%p1a(:,:,:,numfields+1:numfields*2) = abterms(:,:,:,1:numfields) - !Now we want to move from p1a to s2a (rlm space) - Call chktmp%reform() - - ! Next, each process stripes their s2a array into a true 2-D array - dim2 = tnr*numfields*2 - Allocate(myarr(1:mode_count(my_row_rank),1:dim2)) - offset =1 - Do mp = my_mp%min, my_mp%max - m = m_values(mp) - nl = l_max-m+1 + Character*8 :: iterstring + Character*120 :: cfile + np = pfi%rcomm%np + + Call chktmp%construct('p1a') + chktmp%config = 'p1a' + !Copy the RHS into chtkmp + Call Get_All_RHS(chktmp%p1a) + chktmp%p1a(:,:,:,numfields+1:numfields*2) = abterms(:,:,:,1:numfields) + !Now we want to move from p1a to s2a (rlm space) + Call chktmp%reform() + + ! Next, each process stripes their s2a array into a true 2-D array + dim2 = tnr*numfields*2 + Allocate(myarr(1:mode_count(my_row_rank),1:dim2)) + offset =1 + Do mp = my_mp%min, my_mp%max + m = m_values(mp) + nl = l_max-m+1 ind = 1 Do f = 1, numfields*2 Do imi = 1, 2 Do r = my_r%min, my_r%max - myarr(offset:offset+nl-1,ind) = chktmp%s2a(mp)%data(m:l_max,r,imi,f) + myarr(offset:offset+nl-1,ind) = chktmp%s2a(mp)%data(m:l_max,r,imi,f) ind = ind+1 Enddo Enddo Enddo - offset = offset+nl - Enddo - Call chktmp%deconstruct('s2a') + offset = offset+nl + Enddo + Call chktmp%deconstruct('s2a') If (ItIsTimeForAQuickSave) Then write(autostring,'(i2.2)') (quicksave_num+1) !quick save number starts at 1 checkpoint_prefix = trim(my_path)//'Checkpoints/quicksave_'//trim(autostring) @@ -1104,25 +1104,25 @@ Subroutine Write_Checkpoint_Alt(abterms,iteration,dt,new_dt,elapsed_time) checkpoint_prefix = trim(my_path)//'Checkpoints/'//trim(iterstring) Endif - Call Write_Spectral_Field3D(myarr,1,wchar) - Call Write_Spectral_Field3D(myarr,2,pchar) - Call Write_Spectral_Field3D(myarr,3,tchar) - Call Write_Spectral_Field3D(myarr,4,zchar) - offset_index = 4 - If (magnetism) Then - Call Write_Spectral_Field3D(myarr,5,cchar) - Call Write_Spectral_Field3D(myarr,6,achar) - offset_index = 6 - Endif - - Call Write_Spectral_Field3D(myarr,offset_index+1,'WAB') - Call Write_Spectral_Field3D(myarr,offset_index+2,'PAB') - Call Write_Spectral_Field3D(myarr,offset_index+3,'TAB') - Call Write_Spectral_Field3D(myarr,offset_index+4,'ZAB') - If (magnetism) Then - Call Write_Spectral_Field3D(myarr,offset_index+5,'CAB') - Call Write_Spectral_Field3D(myarr,offset_index+6,'AAB') - Endif + Call Write_Spectral_Field3D(myarr,1,wchar) + Call Write_Spectral_Field3D(myarr,2,pchar) + Call Write_Spectral_Field3D(myarr,3,tchar) + Call Write_Spectral_Field3D(myarr,4,zchar) + offset_index = 4 + If (magnetism) Then + Call Write_Spectral_Field3D(myarr,5,cchar) + Call Write_Spectral_Field3D(myarr,6,achar) + offset_index = 6 + Endif + + Call Write_Spectral_Field3D(myarr,offset_index+1,'WAB') + Call Write_Spectral_Field3D(myarr,offset_index+2,'PAB') + Call Write_Spectral_Field3D(myarr,offset_index+3,'TAB') + Call Write_Spectral_Field3D(myarr,offset_index+4,'ZAB') + If (magnetism) Then + Call Write_Spectral_Field3D(myarr,offset_index+5,'CAB') + Call Write_Spectral_Field3D(myarr,offset_index+6,'AAB') + Endif DeAllocate(myarr) If (my_column_rank .eq. 0) Then @@ -1167,164 +1167,164 @@ Subroutine Write_Checkpoint_Alt(abterms,iteration,dt,new_dt,elapsed_time) Close(15) - Endif - Endif + Endif + Endif - - End Subroutine Write_Checkpoint_Alt + + End Subroutine Write_Checkpoint_Alt - Subroutine Read_Spectral_Field3D(arrin,ind,tag) - ! Parallel Reading Routine For Fields in Spectral rlm configuration - ! ISends and IReceives are used - ! DOES NOT SUPPORT CHANGES IN PROBLEM SIZE (LMAX OR NR) CURRENTLY - ! IN A HURRY FOR INCITE PROFILING >>>> WILL FIX THIS IN JULY + Subroutine Read_Spectral_Field3D(arrin,ind,tag) + ! Parallel Reading Routine For Fields in Spectral rlm configuration + ! ISends and IReceives are used + ! DOES NOT SUPPORT CHANGES IN PROBLEM SIZE (LMAX OR NR) CURRENTLY + ! IN A HURRY FOR INCITE PROFILING >>>> WILL FIX THIS IN JULY - ! NOTE - MAY NEED TO CHECK MPI GROUP FOR FILE READ AND WRITE. - ! SHOULD PROBABLY BE GCOMM NOW - + ! NOTE - MAY NEED TO CHECK MPI GROUP FOR FILE READ AND WRITE. + ! SHOULD PROBABLY BE GCOMM NOW - - Implicit None - Integer :: var_offset, offset, new_off + Implicit None + Integer :: var_offset, offset, new_off - Integer :: nrirq, nsirq, irq_ind, rtag, stag - Integer, Allocatable :: rirqs(:), sirqs(:) - Integer :: rone, rtwo, my_nrad, num_el - Integer :: i, mp, m, lstart, nl,p,r - Integer :: indstart(2) - Real*8, Intent(InOut) :: arrin(1:,1:) - Real*8, Allocatable :: arr(:,:,:), tarr(:) + Integer :: nrirq, nsirq, irq_ind, rtag, stag + Integer, Allocatable :: rirqs(:), sirqs(:) + Integer :: rone, rtwo, my_nrad, num_el + Integer :: i, mp, m, lstart, nl,p,r + Integer :: indstart(2) + Real*8, Intent(InOut) :: arrin(1:,1:) + Real*8, Allocatable :: arr(:,:,:), tarr(:) - Integer, Intent(In) :: ind - Character*8 :: iterstring - Character*3, Intent(In) :: tag - Character*120 :: cfile + Integer, Intent(In) :: ind + Character*8 :: iterstring + Character*3, Intent(In) :: tag + Character*120 :: cfile - integer ierr, funit - integer(kind=MPI_OFFSET_KIND) disp1,disp2 - Integer :: mstatus(MPI_STATUS_SIZE) + integer ierr, funit + integer(kind=MPI_OFFSET_KIND) disp1,disp2 + Integer :: mstatus(MPI_STATUS_SIZE) !write(iterstring,'(i8.8)') iter cfile = trim(checkpoint_prefix)//'_'//trim(tag) - var_offset = (ind-1)*tnr - If (I_Will_Output) Then - my_nrad = nradii_at_rank(my_row_rank) - Allocate( arr(1:nlm_total,1:my_nrad,2)) - Allocate(tarr(1:nlm_total*my_nrad)) + var_offset = (ind-1)*tnr + If (I_Will_Output) Then + my_nrad = nradii_at_rank(my_row_rank) + Allocate( arr(1:nlm_total,1:my_nrad,2)) + Allocate(tarr(1:nlm_total*my_nrad)) - Call MPI_FILE_OPEN(pfi%ccomm%comm, cfile, & - MPI_MODE_RDONLY, & + Call MPI_FILE_OPEN(pfi%ccomm%comm, cfile, & + MPI_MODE_RDONLY, & MPI_INFO_NULL, funit, ierr) - disp1 = my_check_disp2*8 - disp2 = (my_check_disp2+full_disp)*8 + disp1 = my_check_disp2*8 + disp2 = (my_check_disp2+full_disp)*8 - Call MPI_FILE_SET_VIEW(funit, disp1, MPI_DOUBLE_PRECISION, & ! Real part + Call MPI_FILE_SET_VIEW(funit, disp1, MPI_DOUBLE_PRECISION, & ! Real part MPI_DOUBLE_PRECISION, 'native', & MPI_INFO_NULL, ierr) - Call MPI_FILE_READ(funit, arr(1,1,1), buffsize2, MPI_DOUBLE_PRECISION, & + Call MPI_FILE_READ(funit, arr(1,1,1), buffsize2, MPI_DOUBLE_PRECISION, & mstatus, ierr) - Call MPI_FILE_SET_VIEW(funit, disp2, MPI_DOUBLE_PRECISION, & ! Imaginary part + Call MPI_FILE_SET_VIEW(funit, disp2, MPI_DOUBLE_PRECISION, & ! Imaginary part MPI_DOUBLE_PRECISION, 'native', & MPI_INFO_NULL, ierr) - Call MPI_FILE_READ(funit, arr(1,1,2), buffsize2, MPI_DOUBLE_PRECISION, & + Call MPI_FILE_READ(funit, arr(1,1,2), buffsize2, MPI_DOUBLE_PRECISION, & mstatus, ierr) - Call MPI_FILE_CLOSE(funit, ierr) - - - !//////////////////////////////// - nrirq = Noutputs_per_Row-1 - Allocate(rirqs(1:nrirq)) - nsirq = nprow-1 - Allocate(sirqs(1:nsirq)) - Do i = 1, 2 - rone = var_offset+rstart_at_rank(my_row_rank)+(i-1)*my_r%delta - rtwo = rone+my_nrad-1 - ! File Data into Temporary Array - offset = 1 - Do p = 0, nprow-1 - Do r = 1, my_nrad - Do mp = pfi%all_3s(p)%min, pfi%all_3s(p)%max - m = m_values(mp) - nl = l_max-m+1 - lstart = lmstart(m) - !arr(lstart:lstart+nl-1,r,i) = tarr(offset:offset+nl-1) - tarr(offset:offset+nl-1) = arr(lstart:lstart+nl-1,r,i) - offset = offset+nl - Enddo - Enddo - Enddo - ! Post receives - irq_ind = 1 - Do p = 0, Noutputs_per_Row-1 - If (p .ne. my_row_rank) Then - rtag = p*(i+1) - num_el = mode_count(my_row_rank)*nradii_at_rank(p) - indstart(1) = 1 - indstart(2) = var_offset+rstart_at_rank(p)+(i-1)*my_r%delta - Call IReceive(arrin, rirqs(irq_ind),num_el, p, rtag, pfi%rcomm, indstart) - irq_ind = irq_ind+1 - Endif - Enddo - - - - ! Post sends - offset = 1 - irq_ind = 1 - Do p = 0, nprow-1 - If (p .ne. my_row_rank) Then - stag = my_row_rank*(i+1) - num_el = mode_count(p)*my_nrad - Call ISend(tarr, sirqs(irq_ind),num_el, offset,p, stag, pfi%rcomm) - irq_ind = irq_ind+1 - Else - new_off = offset - Do r = rone, rtwo - Do m = 1, mode_count(p) - !tarr(new_off) = arrin(m,r) - arrin(m,r) = tarr(new_off) - new_off = new_off+1 - Enddo - Enddo - Endif - offset = offset+mode_count(p)*my_nrad - Enddo - Call IWaitAll(nsirq, sirqs) - Call IWaitAll(nrirq, rirqs) - Enddo - DeAllocate(rirqs,sirqs) - DeAllocate(tarr) - DeAllocate(arr) - Else - ! This rank does not output - ! Post sends to all output processes in my row - nrirq = Noutputs_per_row - Allocate(rirqs(1:nrirq)) - - Do i = 1, 2 - irq_ind = 1 - Do p = 0, Noutputs_per_Row-1 - num_el = mode_count(my_row_rank)*nradii_at_rank(p) - rtag = p*(i+1) - indstart(1) = 1 - indstart(2) = var_offset+rstart_at_rank(p)+(i-1)*my_r%delta - Call IReceive(arrin, rirqs(irq_ind),num_el, p, rtag, pfi%rcomm, indstart) - irq_ind = irq_ind+1 - Enddo - - - Call IWaitAll(nrirq, rirqs) - - - Enddo - DeAllocate(rirqs) - Endif - - End Subroutine Read_Spectral_Field3D + Call MPI_FILE_CLOSE(funit, ierr) + + + !//////////////////////////////// + nrirq = Noutputs_per_Row-1 + Allocate(rirqs(1:nrirq)) + nsirq = nprow-1 + Allocate(sirqs(1:nsirq)) + Do i = 1, 2 + rone = var_offset+rstart_at_rank(my_row_rank)+(i-1)*my_r%delta + rtwo = rone+my_nrad-1 + ! File Data into Temporary Array + offset = 1 + Do p = 0, nprow-1 + Do r = 1, my_nrad + Do mp = pfi%all_3s(p)%min, pfi%all_3s(p)%max + m = m_values(mp) + nl = l_max-m+1 + lstart = lmstart(m) + !arr(lstart:lstart+nl-1,r,i) = tarr(offset:offset+nl-1) + tarr(offset:offset+nl-1) = arr(lstart:lstart+nl-1,r,i) + offset = offset+nl + Enddo + Enddo + Enddo + ! Post receives + irq_ind = 1 + Do p = 0, Noutputs_per_Row-1 + If (p .ne. my_row_rank) Then + rtag = p*(i+1) + num_el = mode_count(my_row_rank)*nradii_at_rank(p) + indstart(1) = 1 + indstart(2) = var_offset+rstart_at_rank(p)+(i-1)*my_r%delta + Call IReceive(arrin, rirqs(irq_ind),num_el, p, rtag, pfi%rcomm, indstart) + irq_ind = irq_ind+1 + Endif + Enddo + + + + ! Post sends + offset = 1 + irq_ind = 1 + Do p = 0, nprow-1 + If (p .ne. my_row_rank) Then + stag = my_row_rank*(i+1) + num_el = mode_count(p)*my_nrad + Call ISend(tarr, sirqs(irq_ind),num_el, offset,p, stag, pfi%rcomm) + irq_ind = irq_ind+1 + Else + new_off = offset + Do r = rone, rtwo + Do m = 1, mode_count(p) + !tarr(new_off) = arrin(m,r) + arrin(m,r) = tarr(new_off) + new_off = new_off+1 + Enddo + Enddo + Endif + offset = offset+mode_count(p)*my_nrad + Enddo + Call IWaitAll(nsirq, sirqs) + Call IWaitAll(nrirq, rirqs) + Enddo + DeAllocate(rirqs,sirqs) + DeAllocate(tarr) + DeAllocate(arr) + Else + ! This rank does not output + ! Post sends to all output processes in my row + nrirq = Noutputs_per_row + Allocate(rirqs(1:nrirq)) + + Do i = 1, 2 + irq_ind = 1 + Do p = 0, Noutputs_per_Row-1 + num_el = mode_count(my_row_rank)*nradii_at_rank(p) + rtag = p*(i+1) + indstart(1) = 1 + indstart(2) = var_offset+rstart_at_rank(p)+(i-1)*my_r%delta + Call IReceive(arrin, rirqs(irq_ind),num_el, p, rtag, pfi%rcomm, indstart) + irq_ind = irq_ind+1 + Enddo + + + Call IWaitAll(nrirq, rirqs) + + + Enddo + DeAllocate(rirqs) + Endif + + End Subroutine Read_Spectral_Field3D Subroutine Read_Checkpoint_Alt(fields, abterms,iteration,read_pars) Implicit None @@ -1404,7 +1404,7 @@ Subroutine Read_Checkpoint_Alt(fields, abterms,iteration,read_pars) old_pars(4) = Checkpoint_iter Endif - Close(15) + Close(15) old_pars(1) = n_r_old old_pars(2) = grid_type_old old_pars(3) = l_max_old @@ -1437,12 +1437,12 @@ Subroutine Read_Checkpoint_Alt(fields, abterms,iteration,read_pars) Write(6,*)'#####################################################################' Write(6,*)' ' Endif - Endif - Call MPI_Bcast(old_pars,5, MPI_INTEGER, 0, pfi%gcomm%comm, ierr) + Endif + Call MPI_Bcast(old_pars,5, MPI_INTEGER, 0, pfi%gcomm%comm, ierr) - n_r_old = old_pars(1) - grid_type_old = old_pars(2) - l_max_old = old_pars(3) + n_r_old = old_pars(1) + grid_type_old = old_pars(2) + l_max_old = old_pars(3) checkpoint_iter = old_pars(4) last_auto = old_pars(5) If (last_auto .ne. -1) Then @@ -1456,207 +1456,207 @@ Subroutine Read_Checkpoint_Alt(fields, abterms,iteration,read_pars) Endif - !///////// Later we only want to do this if the grid is actually different - If (my_rank .ne. 0) Then - Allocate(old_radius(1:n_r_old)) - Endif - Call MPI_Bcast(old_radius,n_r_old, MPI_DOUBLE_PRECISION, 0, pfi%gcomm%comm, ierr) - Call MPI_Bcast(dt_pars,2, MPI_DOUBLE_PRECISION, 0, pfi%gcomm%comm, ierr) - checkpoint_dt = dt_pars(1) - checkpoint_newdt = dt_pars(2) + !///////// Later we only want to do this if the grid is actually different + If (my_rank .ne. 0) Then + Allocate(old_radius(1:n_r_old)) + Endif + Call MPI_Bcast(old_radius,n_r_old, MPI_DOUBLE_PRECISION, 0, pfi%gcomm%comm, ierr) + Call MPI_Bcast(dt_pars,2, MPI_DOUBLE_PRECISION, 0, pfi%gcomm%comm, ierr) + checkpoint_dt = dt_pars(1) + checkpoint_newdt = dt_pars(2) - !//////////////////////////// - ! Next, each process stripes their s2a array into a true 2-D array - dim2 = tnr*numfields*2 - Allocate(myarr(1:mode_count(my_row_rank),1:dim2)) + !//////////////////////////// + ! Next, each process stripes their s2a array into a true 2-D array + dim2 = tnr*numfields*2 + Allocate(myarr(1:mode_count(my_row_rank),1:dim2)) myarr(:,:) = 0.0d0 If (read_hydro .eq. 1) Then - Call Read_Spectral_Field3D(myarr,1,wchar) - Call Read_Spectral_Field3D(myarr,2,pchar) - Call Read_Spectral_Field3D(myarr,3,tchar) - Call Read_Spectral_Field3D(myarr,4,zchar) + Call Read_Spectral_Field3D(myarr,1,wchar) + Call Read_Spectral_Field3D(myarr,2,pchar) + Call Read_Spectral_Field3D(myarr,3,tchar) + Call Read_Spectral_Field3D(myarr,4,zchar) Endif - offset_index = 4 - If (magnetism) Then + offset_index = 4 + If (magnetism) Then If (read_magnetism .eq. 1) Then - Call Read_Spectral_Field3D(myarr,5,cchar) - Call Read_Spectral_Field3D(myarr,6,achar) + Call Read_Spectral_Field3D(myarr,5,cchar) + Call Read_Spectral_Field3D(myarr,6,achar) Endif - offset_index = 6 - Endif + offset_index = 6 + Endif If (read_hydro .eq. 1) Then - Call Read_Spectral_Field3D(myarr,offset_index+1,'WAB') - Call Read_Spectral_Field3D(myarr,offset_index+2,'PAB') - Call Read_Spectral_Field3D(myarr,offset_index+3,'TAB') - Call Read_Spectral_Field3D(myarr,offset_index+4,'ZAB') + Call Read_Spectral_Field3D(myarr,offset_index+1,'WAB') + Call Read_Spectral_Field3D(myarr,offset_index+2,'PAB') + Call Read_Spectral_Field3D(myarr,offset_index+3,'TAB') + Call Read_Spectral_Field3D(myarr,offset_index+4,'ZAB') Endif - If (magnetism) Then + If (magnetism) Then If (read_magnetism .eq. 1) Then - Call Read_Spectral_Field3D(myarr,offset_index+5,'CAB') - Call Read_Spectral_Field3D(myarr,offset_index+6,'AAB') + Call Read_Spectral_Field3D(myarr,offset_index+5,'CAB') + Call Read_Spectral_Field3D(myarr,offset_index+6,'AAB') Endif - Endif + Endif - Call chktmp%construct('s2b') - chktmp%config = 's2b' - offset =1 - Do mp = my_mp%min, my_mp%max - m = m_values(mp) - nl = l_max-m+1 + Call chktmp%construct('s2b') + chktmp%config = 's2b' + offset =1 + Do mp = my_mp%min, my_mp%max + m = m_values(mp) + nl = l_max-m+1 ind = 1 Do f = 1, numfields*2 Do imi = 1, 2 Do r = my_r%min, my_r%max - chktmp%s2b(mp)%data(m:l_max,r,imi,f) = myarr(offset:offset+nl-1,ind) + chktmp%s2b(mp)%data(m:l_max,r,imi,f) = myarr(offset:offset+nl-1,ind) ind = ind+1 Enddo Enddo Enddo - offset = offset+nl - Enddo + offset = offset+nl + Enddo DeAllocate(myarr) - !////////////////////////// - Call chktmp%reform() ! move to p1b - - ! NOW, if n_r_old and grid_type_old are the same, we can copy chtkmp%p1b into abterms and - ! fields. Otherwise, we need to interpolate onto the current grid - If ((n_r_old .ne. n_r) .or. (grid_type_old .ne. grid_type) ) Then - ! Interpolate - ! We will assume the user kept the same radial domain bounds. - ! If they have not, this will end badly. - If (my_rank .eq. 0) Then - Write(6,*)'Grid has changed. Interpolating onto new grid.' - Write(6,*)'Old grid_type: ', grid_type_old - Write(6,*)'Current grid_type: ', grid_type - Write(6,*)'Old N_R: ', n_r_old - Write(6,*)'Current N_R: ', n_r - Endif - Endif - - ! Interpolation is complete, now we just copy into the other arrays - fields(:,:,:,1:numfields) = chktmp%p1b(:,:,:,1:numfields) - abterms(:,:,:,1:numfields) = chktmp%p1b(:,:,:,numfields+1:numfields*2) - - Call chktmp%deconstruct('p1b') - DeAllocate(old_radius) - - End Subroutine Read_Checkpoint_Alt + !////////////////////////// + Call chktmp%reform() ! move to p1b + + ! NOW, if n_r_old and grid_type_old are the same, we can copy chtkmp%p1b into abterms and + ! fields. Otherwise, we need to interpolate onto the current grid + If ((n_r_old .ne. n_r) .or. (grid_type_old .ne. grid_type) ) Then + ! Interpolate + ! We will assume the user kept the same radial domain bounds. + ! If they have not, this will end badly. + If (my_rank .eq. 0) Then + Write(6,*)'Grid has changed. Interpolating onto new grid.' + Write(6,*)'Old grid_type: ', grid_type_old + Write(6,*)'Current grid_type: ', grid_type + Write(6,*)'Old N_R: ', n_r_old + Write(6,*)'Current N_R: ', n_r + Endif + Endif + + ! Interpolation is complete, now we just copy into the other arrays + fields(:,:,:,1:numfields) = chktmp%p1b(:,:,:,1:numfields) + abterms(:,:,:,1:numfields) = chktmp%p1b(:,:,:,numfields+1:numfields*2) + + Call chktmp%deconstruct('p1b') + DeAllocate(old_radius) + + End Subroutine Read_Checkpoint_Alt !/////////////////////////////////////////////////////////// ! Routines below the dashed-double line are "staged" for deletion !================================================================== - Subroutine Initialize_Checkpointing_old() - Implicit None - Integer :: nfs(6) - Integer :: p, np, nl, m, mp - if (magnetism) Then - numfields = 6 - Endif - nfs(:) = numfields*2 - Call chktmp%init(field_count = nfs, config = 'p1a') ! This structure hangs around through the entire run - - !//////////////////////// - np = pfi%rcomm%np - Allocate(mode_count(0:np-1)) - mode_count(:) = 0 ! This is how many total l-m combinations rank p of a row owns - - - - nlm_total = 0 ! This is the total number of l-m combinations - Do p = 0, np -1 - Do mp = pfi%all_3s(p)%min, pfi%all_3s(p)%max - m = m_values(mp) - nl = l_max-m+1 - mode_count(p) = mode_count(p)+nl - nlm_total = nlm_total+nl - Enddo - Enddo - if (my_row_rank .eq. 0) Then - Allocate(lmstart(0:l_max)) - lmstart(0) = 1 - do m = 0, l_max-1 - nl = l_max-m+1 - lmstart(m+1) = lmstart(m)+nl - enddo - np = pfi%ccomm%np - my_check_disp = 0 - Do p = 1, my_column_rank - my_check_disp = my_check_disp+pfi%all_1p(p-1)%delta - enddo - my_check_disp = my_check_disp*nlm_total !*2 - buffsize = nlm_total*my_r%delta - full_disp = N_r - full_disp = full_disp*nlm_total - Endif - End Subroutine Initialize_Checkpointing_old - - Subroutine Write_Field_Orig(arr,ind,tag,iter) - Implicit None - Integer, Intent(In) :: ind, iter - Real*8, Intent(In) :: arr(1:,1:) - Character*8 :: iterstring - Character*3, Intent(In) :: tag - Character*120 :: cfile - - integer ierr, funit , v_offset1, v_offset2 - integer(kind=MPI_OFFSET_KIND) disp1,disp2 - Integer :: mstatus(MPI_STATUS_SIZE) - write(iterstring,'(i8.8)') iter + Subroutine Initialize_Checkpointing_old() + Implicit None + Integer :: nfs(6) + Integer :: p, np, nl, m, mp + if (magnetism) Then + numfields = 6 + Endif + nfs(:) = numfields*2 + Call chktmp%init(field_count = nfs, config = 'p1a') ! This structure hangs around through the entire run + + !//////////////////////// + np = pfi%rcomm%np + Allocate(mode_count(0:np-1)) + mode_count(:) = 0 ! This is how many total l-m combinations rank p of a row owns + + + + nlm_total = 0 ! This is the total number of l-m combinations + Do p = 0, np -1 + Do mp = pfi%all_3s(p)%min, pfi%all_3s(p)%max + m = m_values(mp) + nl = l_max-m+1 + mode_count(p) = mode_count(p)+nl + nlm_total = nlm_total+nl + Enddo + Enddo + if (my_row_rank .eq. 0) Then + Allocate(lmstart(0:l_max)) + lmstart(0) = 1 + do m = 0, l_max-1 + nl = l_max-m+1 + lmstart(m+1) = lmstart(m)+nl + enddo + np = pfi%ccomm%np + my_check_disp = 0 + Do p = 1, my_column_rank + my_check_disp = my_check_disp+pfi%all_1p(p-1)%delta + enddo + my_check_disp = my_check_disp*nlm_total !*2 + buffsize = nlm_total*my_r%delta + full_disp = N_r + full_disp = full_disp*nlm_total + Endif + End Subroutine Initialize_Checkpointing_old + + Subroutine Write_Field_Orig(arr,ind,tag,iter) + Implicit None + Integer, Intent(In) :: ind, iter + Real*8, Intent(In) :: arr(1:,1:) + Character*8 :: iterstring + Character*3, Intent(In) :: tag + Character*120 :: cfile + + integer ierr, funit , v_offset1, v_offset2 + integer(kind=MPI_OFFSET_KIND) disp1,disp2 + Integer :: mstatus(MPI_STATUS_SIZE) + write(iterstring,'(i8.8)') iter cfile = Trim(my_path)//'Checkpoints/'//trim(iterstring)//'_'//trim(tag) - ! We have to be careful here. Each processor does TWO writes. - ! The first write places the real part of the field into the file. - ! The view then changes and advances to the appropriate location of the - ! imaginary part. This step is crucial for checkpoints to work with - ! Different processor configurations. - v_offset1 = (ind-1)*tnr+1 - v_offset2 = v_offset1+my_r%delta + ! We have to be careful here. Each processor does TWO writes. + ! The first write places the real part of the field into the file. + ! The view then changes and advances to the appropriate location of the + ! imaginary part. This step is crucial for checkpoints to work with + ! Different processor configurations. + v_offset1 = (ind-1)*tnr+1 + v_offset2 = v_offset1+my_r%delta - call MPI_FILE_OPEN(pfi%ccomm%comm, cfile, & + call MPI_FILE_OPEN(pfi%ccomm%comm, cfile, & MPI_MODE_WRONLY + MPI_MODE_CREATE, & MPI_INFO_NULL, funit, ierr) if (ierr .ne. 0) Then Write(6,*)'Error Opening File: ', pfi%ccomm%rank Endif - disp1 = my_check_disp*8 - disp2 = (my_check_disp+full_disp)*8 + disp1 = my_check_disp*8 + disp2 = (my_check_disp+full_disp)*8 - call MPI_FILE_SET_VIEW(funit, disp1, MPI_DOUBLE_PRECISION, & ! Real part + call MPI_FILE_SET_VIEW(funit, disp1, MPI_DOUBLE_PRECISION, & ! Real part MPI_DOUBLE_PRECISION, 'native', & MPI_INFO_NULL, ierr) if (ierr .ne. 0) Then Write(6,*)'Error Setting View 1: ', pfi%ccomm%rank Endif - call MPI_FILE_WRITE(funit, arr(1,v_offset1), buffsize, MPI_DOUBLE_PRECISION, & + call MPI_FILE_WRITE(funit, arr(1,v_offset1), buffsize, MPI_DOUBLE_PRECISION, & mstatus, ierr) if (ierr .ne. 0) Then Write(6,*)'Error Writing 1: ', pfi%ccomm%rank Endif - call MPI_FILE_SET_VIEW(funit, disp2, MPI_DOUBLE_PRECISION, & ! Imaginary part + call MPI_FILE_SET_VIEW(funit, disp2, MPI_DOUBLE_PRECISION, & ! Imaginary part MPI_DOUBLE_PRECISION, 'native', & MPI_INFO_NULL, ierr) if (ierr .ne. 0) Then Write(6,*)'Error Setting View 2: ', pfi%ccomm%rank Endif - call MPI_FILE_WRITE(funit, arr(1,v_offset2), buffsize, MPI_DOUBLE_PRECISION, & + call MPI_FILE_WRITE(funit, arr(1,v_offset2), buffsize, MPI_DOUBLE_PRECISION, & mstatus, ierr) if (ierr .ne. 0) Then Write(6,*)'Error Writing 2: ', pfi%ccomm%rank Endif - call MPI_FILE_CLOSE(funit, ierr) + call MPI_FILE_CLOSE(funit, ierr) if (ierr .ne. 0) Then Write(6,*)'Error Closing File: ', pfi%ccomm%rank Endif - + - End Subroutine Write_Field_Orig + End Subroutine Write_Field_Orig End Module Checkpointing diff --git a/src/physics/Sphere_Hybrid_Space.F90 b/src/physics/Sphere_Hybrid_Space.F90 index df2d9dbb..1a723519 100755 --- a/src/physics/Sphere_Hybrid_Space.F90 +++ b/src/physics/Sphere_Hybrid_Space.F90 @@ -1,9 +1,4 @@ -#define DO_IDX2 Do mp = my_mp%min, my_mp%max; m = m_values(mp); Do imi = 1, 2; Do r = my_r%min, my_r%max -#define END_DO enddo; enddo; enddo -#define IDX2 m:l_max,r,imi -#define SBUFFA wsp%s2a(mp)%data -#define SBUFFB wsp%s2b(mp)%data -#define ASBUFFA cobuffer%s2a(mp)%data +#include "indices.F" Module Sphere_Hybrid_Space ! NOTE: WE NEED a 1/density variable diff --git a/src/physics/Sphere_Physical_Space.F90 b/src/physics/Sphere_Physical_Space.F90 index 6fb4af38..a1598ec9 100755 --- a/src/physics/Sphere_Physical_Space.F90 +++ b/src/physics/Sphere_Physical_Space.F90 @@ -1,11 +1,6 @@ -#define RHSP wsp%p3b -#define DO_IDX Do t = my_theta%min, my_theta%max; Do r = my_r%min, my_r%max ;Do k = 1, n_phi -#define END_DO enddo; enddo; enddo -#define IDX k,r,t -#define FIELDSP wsp%p3a -#define IDXM r,t - -!NOTE STABLE MACRO ABOVE! + +#include "indices.F" + Module Sphere_Physical_Space Use Parallel_Framework Use Controls